В настоящее время я внедряю PRNG в SystemVerilog, используя LFSR, как описано здесь . Ширина должна быть переменной с использованием параметра. Я достигаю конструкции:
module PRNG
#(
parameter WIDTH = 32,
parameter SEED = 1
)
(
input clk,
input update,
output reg [WIDTH-1:0] prng
);
reg [WIDTH-1:0] lastRng = WIDTH'(SEED);
always_comb begin
var tap;
case (WIDTH)
default: tap = 0;
3: tap = lastRng[2] ^~ lastRng[1];
[...]
168: tap = lastRng[167] ^~ lastRng[165] ^~ lastRng[152] ^~ lastRng[150];
endcase
if (update) begin
prng = {lastRng[WIDTH-2:0], tap};
end else begin
prng = lastRng;
end
end
always_ff @(posedge clk) begin
lastRng <= prng;
end
endmodule
Теперь, моделируя этот модуль с помощью Verilator, он жалуется на то, что индексы выбора выходят за пределы диапазона для каждого случая > WIDTH-1
, хотя (я думаю, что) эти случаи явно должны быть оптимизирован, поскольку WIDTH является константой:
Selection index out of range: 167:167 outside 31:0
Есть ли простой способ обойти эту ошибку, например, без. Логика сдвига битов c только для индексации n-го бита?