SystemVerilog не распознает константу: Ошибка: диапазон должен быть ограничен константным выражением - PullRequest
2 голосов
/ 21 апреля 2020

В этом коротком примере я хочу упростить запись ширины сигнала. С одним сигналом это действительно не нужно, но в моем реальном коде у меня есть много таких сигналов, и объявление их с более длинным стилем не подходит.

Не могли бы вы объяснить мне, почему я получаю ошибку для signal_2?

module sample #(parameter BYTE_WIDTH = 4);
    const int BIT_WIDTH = BYTE_WIDTH * 8;

    logic [BYTE_WIDTH * 8 -1 : 0] signal_1; // works
    logic [BIT_WIDTH -1 : 0] signal_2; // ** Error: Range must be bounded by constant expressions.
endmodule

1 Ответ

3 голосов
/ 21 апреля 2020

переменной const присваивается ее значение при времени выполнения . Что слишком поздно: ширина вашей переменной signal_2 должна быть зафиксирована на время компиляции . Итак, вам нужен localparam, который (например, parameter) фиксируется во время компиляции, но (в отличие от parameter) не может быть переопределен извне:

module sample #(parameter BYTE_WIDTH = 4);
    localparam BIT_WIDTH = BYTE_WIDTH * 8;

    logic [BYTE_WIDTH * 8 -1 : 0] signal_1; 
    logic [BIT_WIDTH -1 : 0] signal_2; 
endmodule

https://www.edaplayground.com/x/2fKU

...