Verilog,截断genvar宽度大小

Verilog, truncate genvar width size

如何截断 genvar 变量的宽度?例如,如果我有:

parameter LENGTH = 8;

genvar i;
for(i = 0; i < LENGTH; i = i + 2) begin
   somemodule #(WIDTH($clog2(LENGTH))
               )
               tmp (.a(i)
                   ,.b(i+1)
                   ,.c(output)
                   );
end
endgenerate

当我在 ModelSim 中进行仿真时,我会得到端口大小与连接大小不匹配。我知道问题出在 genvar 是 32 位宽,而我的模块宽度不同。

我试过了

genvar [$clog2(LENGTH)-1:0] i;

.a(i[$clog2(LENGTH)-1:0])

但它们在语法上不正确。

如何解决这个问题?

您可以为此使用声明了数据类型的中间参数

parameter int LENGTH = 8;
parameter int WIDTH  = $clog2(LENGTH);
for(genvar i = 0; i < LENGTH; i = i + 2) begin

   parameter bit [WIDTH-1:0] A = i;
   somemodule #(.WIDTH(WIDTH))
               )
               tmp (.a(A)
                   ,.b(A+1'b1)
                   ,.c(output)
                   );
end