我目前正在使用 LFSR 在 SystemVerilog 中实现 PRNG,如此处所述。宽度应该使用参数可变。我达到了一个结构:
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
有没有解决这个错误的简单方法,没有例如。移位逻辑只是为了索引第 n 位?