划分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

所以我正在用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 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。因为我不确定他们最终会是什么类型。