SystemVerilog是否支持向下转型?

Vic*_*sky 6 casting system-verilog

SystemVerilog是否支持向下转换(将基础对象转换为派生对象)?如果是这样,怎么样?

以下向下转换示例不起作用:

class base;
  int a = 5;
endclass

class extend extends base;
  int b = 1;
endclass

module test;

  initial begin
    base m_base;
    extend m_extend;

    m_base = new();
    m_extend = new();
    $cast(m_extend, m_base);
    $display(m_extend.a);
  end
endmodule
Run Code Online (Sandbox Code Playgroud)

修改并重新运行EDA Playground上的示例:http://www.edaplayground.com/s/4/581

dwi*_*kle 9

是的,你可以垂头丧气.您的示例是正确的语法,它实际上是编译.但是,由于转换失败,您将收到运行时错误.

您的示例中的强制转换失败,因为如果基础对象的句柄实际引用派生类型的对象,则只能成功转发.您可以$cast作为函数调用它将返回一个布尔值,指示转换是否成功.

这是一个例子:

class animal;
  function void eat();
  endfunction
endclass

class dog extends animal;
  function void bark();
    $display("woof");
  endfunction
endclass

class cat extends animal;
  function void meow();
    $display("meow");
  endfunction
endclass

module test;

  initial begin
    dog a_dog = new();
    cat a_cat = new();

    animal animals[$];
    animals.push_back(a_dog);
    animals.push_back(a_cat);

    foreach (animals[i]) begin
      dog another_dog;
      animals[i].eat();
      if ($cast(another_dog, animals[i])) begin
        $display("Found a dog!");
        another_dog.bark();
      end
    end

  end
endmodule
Run Code Online (Sandbox Code Playgroud)

输出:

# Found a dog!
# woof
Run Code Online (Sandbox Code Playgroud)

http://www.edaplayground.com/s/474/586