Как правильно обрабатывать регистр с нулевой битной шириной? - PullRequest
2 голосов
/ 28 мая 2019

Когда я пишу универсальный модуль, я часто сталкиваюсь с регистром ширины 0 бит.

module test #(
    parameter WIDTH
) (
    input logic [31 : 0] x,
    output logic [31 : 0] y
);
    always_comb begin
        y = x[WIDTH - 1 : 0];
    end
endmodule

Например, вышеупомянутый модуль извлекает младшие биты WIDTH из x. Когда WIDTH равен 0, вывод не имеет значения. Однако, когда модуль создается с WIDTH 0, я получаю следующую ошибку в Modelsim:

# ** Fatal: (vsim-3373) test.sv(8): Range of part-select [-1:0] into 'x' [31:0] is reversed.

Я попробовал следующий код, надеясь оптимизировать плохую часть во время компиляции, но ошибка остается.

if (WIDTH == 0) y = 0;
else y = x[WIDTH - 1 : 0];

Есть ли какое-нибудь средство от этой ситуации?

1 Ответ

2 голосов
/ 28 мая 2019

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

module test #(
    parameter WIDTH
) (
    input logic [31 : 0] x,
    output logic [31 : 0] y
);
    always_comb
       if (WIDTH == 0) y = 'x;
       else y = x[WIDTH - 1 + (WIDTH==0): 0];
endmodule

Вы могли бы также сделать

module test #(
    parameter WIDTH
) (
    input logic [31 : 0] x,
    output logic [31 : 0] y
);
if (WIDTH==0)
  assign y = 'x;
else
  assign  y = x[WIDTH - 1: 0];
endmodule
...