扩展中的系统 verilog 变量 class
system verilog variables in extended class
当我在下面的例子中 运行 时,disp() 函数正在显示“来自 class1 的值”。我想明白
为什么它不显示“来自 class2 的值”。谁能帮我理解这里的概念。
class class1;
string reg_name = "value from class1";
function new(string name="class1");
endfunction
function void disp();
$display("disp: reg_name=%p", reg_name);
endfunction
endclass
class class2 extends class1;
string reg_name = "modified value";
function new(string name="class2");
reg_name = "value from class2";
endfunction
endclass
program if_p;
class2 c2;
initial
begin
c2 = new();
c2.disp();
end
endprogram
您看到示例显示 "来自 class1" 的值" 的行为的原因是因为两个原则
- 当在扩展 class 中声明与基 class 中的变量同名的变量时,您从扩展 class 中隐藏了基 class 变量.如果必须从扩展 class 中引用
super.reg_name
来访问基础 class 变量。
- 除了虚拟方法之外,基础 classes 对扩展 classes 中的任何内容一无所知。
class1
中对 reg_name
的所有引用都将指向 class1
中的变量
即使语言允许,一般规则是永远不要在基本和扩展中使用相同的名称来命名变量 class。我从未见过这样做的充分理由。
当我在下面的例子中 运行 时,disp() 函数正在显示“来自 class1 的值”。我想明白 为什么它不显示“来自 class2 的值”。谁能帮我理解这里的概念。
class class1;
string reg_name = "value from class1";
function new(string name="class1");
endfunction
function void disp();
$display("disp: reg_name=%p", reg_name);
endfunction
endclass
class class2 extends class1;
string reg_name = "modified value";
function new(string name="class2");
reg_name = "value from class2";
endfunction
endclass
program if_p;
class2 c2;
initial
begin
c2 = new();
c2.disp();
end
endprogram
您看到示例显示 "来自 class1" 的值" 的行为的原因是因为两个原则
- 当在扩展 class 中声明与基 class 中的变量同名的变量时,您从扩展 class 中隐藏了基 class 变量.如果必须从扩展 class 中引用
super.reg_name
来访问基础 class 变量。 - 除了虚拟方法之外,基础 classes 对扩展 classes 中的任何内容一无所知。
class1
中对reg_name
的所有引用都将指向class1
中的变量
即使语言允许,一般规则是永远不要在基本和扩展中使用相同的名称来命名变量 class。我从未见过这样做的充分理由。