Почему наследование постоянной переменной в systemverilog не работает - PullRequest
0 голосов
/ 22 марта 2020

Что не так со следующим кодом.

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

Я получаю следующую ошибку компиляции

Неправильная инициализация константы экземпляра: 'i' не может быть инициализирован

более одного раза в конструкторе. Существует потенциальная реинициализация

в операторе: this.i = 10; Предыдущая на: test.sv, 9 Информация об источнике:

this.i = 10;

1 Ответ

1 голос
/ 22 марта 2020

Вы можете сделать только одно присваивание переменной 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.

...