For loop verilog生成for循环中的十六进制值

For loop verilog生成for循环中的十六进制值,for-loop,verilog,system-verilog,For Loop,Verilog,System Verilog,我在systemverilog中有这段代码,我必须在for循环中使用十六进制数。我正在尝试下面的语法和代码 genvar i,j; localparam int i_d = 1; localparam int j_d = 134; generate for (i = 8'h01; i <= MAX1; i = i + INCR) begin add_bit[i_d] = (creg_add == i); i_d = i_d + 1; end for (j

我在systemverilog中有这段代码,我必须在for循环中使用十六进制数。我正在尝试下面的语法和代码

genvar i,j;

localparam int i_d = 1;

localparam int j_d = 134;

generate

for (i = 8'h01; i <= MAX1; i = i + INCR)

begin

    add_bit[i_d] = (creg_add == i);

    i_d = i_d + 1;

end

for (j = 8'h86; j <= MAX2; j = j + INCR)

begin

    add_bit[j_d] = (creg_add == j);

    j_d = j_d + 1;

end

endgenerate

这应该可以解决问题

genvar i,j;

localparam int i_d = 1;

localparam int j_d = 134;

generate

for (i = 8'h01; i <= MAX1; i = i + INCR)

begin

    assign add_bit[i_d] = (creg_add == i);

    i_d = i_d + 1;

end

for (j = 8'h86; j <= MAX2; j = j + INCR)

begin

    assign add_bit[j_d] = (creg_add == j);

    j_d = j_d + 1;

end

endgenerate
genvari,j;
localparam int i_d=1;
localparam int j_d=134;
生成

对于(i=8'h01;i
generate
块在细化时进行评估(预模拟)。您可以在其中包含
始终
块、
assign
语句、模块实例和局部作用域变量去缩放。不允许直接分配将在
始终
块或
assign
语句外部持续更新的值

localparam
s是常量,因此行
i_d=i_d+1
是非法的

一个更简单的解决方案是在组合always块中使用过程赋值

int i,j;
int i_d, j_d;
logic [WIDTH:0] add_bit;

always_comb begin
  i_d = 1;
  j_d = 134;
  add_bit = '0; // fill zeros in case of gap between last i_d and first j_d
  for (i = 8'h01; i <= MAX1; i = i + INCR)
  begin
    add_bit[i_d] = (creg_add == i);
    i_d = i_d + 1;
  end
  for (j = 8'h86; j <= MAX2; j = j + INCR)
  begin
    add_bit[j_d] = (creg_add == j);
    j_d = j_d + 1;
  end
end
inti,j;
int i_d,j_d;
逻辑[宽度:0]添加\u位;
总是从梳子开始
i_d=1;
j_d=134;
add_bit='0;//如果最后一个i_d和第一个j_d之间有间隙,则填充零

对于(i=8'h01;i什么是
add\u bit
?您可能需要
分配ad\u bit[i\d]=..
。我认为这是一个重复:您将
添加位
定义为什么?添加位定义为逻辑这将不会编译,因为
I\u d
/
j\u d
是递增的。添加
分配
将不起作用,因为它们是本地参数(也称为常量)。感谢帮助,而不是使用添加位[I\d],我可以使用add_bit[i]吗?这能理解索引中的十六进制值吗?基数不重要(十六进制、十二进制、二进制、十进制).使用更容易使用的基数。
134
8'h86
是等效的,并且大部分是可互换的。我猜
INCR
大于1,这可以解释为什么
I
I_d
不是同一个变量。
int i,j;
int i_d, j_d;
logic [WIDTH:0] add_bit;

always_comb begin
  i_d = 1;
  j_d = 134;
  add_bit = '0; // fill zeros in case of gap between last i_d and first j_d
  for (i = 8'h01; i <= MAX1; i = i + INCR)
  begin
    add_bit[i_d] = (creg_add == i);
    i_d = i_d + 1;
  end
  for (j = 8'h86; j <= MAX2; j = j + INCR)
  begin
    add_bit[j_d] = (creg_add == j);
    j_d = j_d + 1;
  end
end