For loop verilog生成for循环中的十六进制值
我在systemverilog中有这段代码,我必须在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
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;igenerate
块在细化时进行评估(预模拟)。您可以在其中包含始终
块、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