gpt4 book ai didi

inheritance - 为什么在 systemverilog 中继承常量变量不起作用

转载 作者:行者123 更新时间:2023-12-02 10:53:03 24 4
gpt4 key购买 nike

以下代码有什么问题。

program test;

class a;
const int i;
endclass : a

class b extends a;
function new();
i = 10;
endfunction : new
endclass : b

class c extends a;
function new();
i = 100;
endfunction : new
endclass : c

initial begin
b bo = new();
c co = new();
$display(bo.i, co.i);
end

endprogram : test

我收到以下编译错误

Invalid initialization of instance constant: 'i' cannot be initialized

more than once in constructor. There is a potential re-initialization

at statement : this.i = 10; Previous at: test.sv,9 Source info:

this.i = 10;

最佳答案

您只能对 const 进行一项分配。在构造类对象期间变量。这必须作为其声明的一部分,或在其相应的构造函数方法期间分配。即使您没有在 class a 中编写显式构造方法, SystemVerilog 为您创建一个隐含的。您都没有这样做,因此它的初始值为 0。覆盖实例常量值的唯一方法是将其作为构造函数参数或参数化传递。

class a;
const int i;
function new(int aa = 10);
i = aa;
endfunction
endclass : a

class b extends a;
function new(int aa=100);
super.new(aa); // super.new(); is implicitly added if you don't
endfunction : new
endclass : b
class c extends b;
function new();
super.new(500); // super.new(); is implicitly added if you don't
endfunction : new
endclass : b

另请注意,当变量被隐式声明为 static 时,现在初始化变量是非法的。程序代码中的变量。您应该将它们移到开始/结束 block 之外,或者使用 static 添加显式生命周期。或 automatic关键词。
b bo = new();

initial begin
static c co = new();
$display(bo.i, co.i);
end

声明在程序循环内有很大的不同。

关于inheritance - 为什么在 systemverilog 中继承常量变量不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60802400/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com