扩展中的系统 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" 的值" 的行为的原因是因为两个原则

  1. 当在扩展 class 中声明与基 class 中的变量同名的变量时,您从扩展 class 中隐藏了基 class 变量.如果必须从扩展 class 中引用 super.reg_name 来访问基础 class 变量。
  2. 除了虚拟方法之外,基础 classes 对扩展 classes 中的任何内容一无所知。 class1 中对 reg_name 的所有引用都将指向 class1
  3. 中的变量

即使语言允许,一般规则是永远不要在基本和扩展中使用相同的名称来命名变量 class。我从未见过这样做的充分理由。