Вы можете сделать только одно присваивание переменной 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
переменные внутри процедурного кода. Вы должны переместить их за пределы блока начала / конца или добавить явное время жизни, используя ключевые слова static
или automatic
.
b bo = new();
initial begin
static c co = new();
$display(bo.i, co.i);
end
Это делает большую разницу в объявлении, заключенном внутри процедурной l oop.