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
是的,你可以垂头丧气.您的示例是正确的语法,它实际上是编译.但是,由于转换失败,您将收到运行时错误.
您的示例中的强制转换失败,因为如果基础对象的句柄实际引用派生类型的对象,则只能成功转发.您可以$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
| 归档时间: |
|
| 查看次数: |
7016 次 |
| 最近记录: |