划分verilog genvar
所以我正在用Verilog建立一棵树。该树将i级的元素j分配给i+1级的[j,j+1]中的较小者 这里的问题是,我不确定verilog如何处理genvar的除法运算符:划分verilog genvar,verilog,system-verilog,Verilog,System Verilog,所以我正在用Verilog建立一棵树。该树将i级的元素j分配给i+1级的[j,j+1]中的较小者 这里的问题是,我不确定verilog如何处理genvar的除法运算符: genvar i,j; generate for(i = LEVELS; i > 0; i--) begin for(j = 0; j < 2**i; j = j + 2) begin // 0..7 for level 3, 0..3 for level 2, 0..1 for level 1 and
genvar i,j;
generate
for(i = LEVELS; i > 0; i--) begin
for(j = 0; j < 2**i; j = j + 2) begin // 0..7 for level 3, 0..3 for level 2, 0..1 for level 1 and 0 for level 0
assign tree[i-1][j/2] = tree[i][j] <operator> tree[i][j+1];
end
end
endgenerate
genvari,j;
生成
对于(i=LEVELS;i>0;i--)开始
对于(j=0;j<2**i;j=j+2),开始//0..7表示级别3,0..3表示级别2,0..1表示级别1,0表示级别0
分配树[i-1][j/2]=树[i][j]树[i][j+1];
结束
结束
最终生成
这里的问题是,我不确定上面的
j/2
是否会被设置为1/2==0。有人知道这是不是真的吗?这个模拟表明,如果j
是奇数,那么j/2
将被忽略:
module tb;
wire [7:0] tree [4];
genvar j;
generate
for (j=1; j<8; j=j+2) begin
assign tree[j/2] = j;
end
endgenerate
initial begin
#1;
for (int k=0; k<4; k++) $display("tree[%0d] = %0d", k, tree[k]);
end
endmodule
在此代码中,j
只有奇数值:1、3、5、7
因此j/2
解析为偶数值:0、1、2、3
顺便说一句:在代码中,不能有1/2<代码>j只能是0,2,4,6。。。因此,
j/2
只能是0,1,2,3…此模拟表明,如果j
为奇数,则j/2
将被覆盖:
module tb;
wire [7:0] tree [4];
genvar j;
generate
for (j=1; j<8; j=j+2) begin
assign tree[j/2] = j;
end
endgenerate
initial begin
#1;
for (int k=0; k<4; k++) $display("tree[%0d] = %0d", k, tree[k]);
end
endmodule
在此代码中,j
只有奇数值:1、3、5、7
因此j/2
解析为偶数值:0、1、2、3
顺便说一句:在代码中,不能有1/2<代码>j只能是0,2,4,6。。。因此,
j/2
只能是0,1,2,3…整数除法始终为零:
IEEE 1800-2017:11.4.2:整数除法应将任何小数部分截断为零
整型除法始终为零: IEEE 1800-2017:11.4.2:整数除法应将任何小数部分截断为零
如果您只需要j/2,为什么不用(j>>1)替换它呢?这样做的机会就少了 工具误解了它。
LRM不是刻在石头上的,我见过很多CAD工具把它带到非常不合理的地方。如果你只需要j/2,为什么不直接用(j>>1)替换它呢?这样做的机会就少了 工具误解了它。
LRM不是刻在石头上的,我见过很多CAD工具把它带到非常不合理的地方。我其实不知道你可以用比特变换genvars。因为我不确定他们到底是哪种类型的人。实际上我不知道你能改变genvars。因为我不确定他们最终会是什么类型。