带有始终@(*)块的Verilog生成语句

带有始终@(*)块的Verilog生成语句,verilog,system-verilog,Verilog,System Verilog,我在下面有一个生成块,我认为它应该可以工作,但是我发现always@(*)块下的部分存在问题。使用VCS时,[i+1][j]中的temp_始终指定为“x”。我希望它被设置为“0”。如果我实例化一个模块/门,而不是像我对If部分所做的那样总是阻塞,那么它就可以正常工作。在单个块中搜索foreach、generate、always和if的正确语法不会产生任何有用的结果。我知道修复只是一个小改动,但我对所有的语言结构都不太熟悉,因此我将非常感谢您的帮助 ceil()是一个返回整数的函数。它只使用编译时

我在下面有一个生成块,我认为它应该可以工作,但是我发现
always@(*)
块下的
部分存在问题。使用VCS时,[i+1][j]
中的
temp_始终指定为“x”。我希望它被设置为“0”。如果我实例化一个模块/门,而不是像我对
If
部分所做的那样总是阻塞,那么它就可以正常工作。在单个块中搜索foreach、generate、always和if的正确语法不会产生任何有用的结果。我知道修复只是一个小改动,但我对所有的语言结构都不太熟悉,因此我将非常感谢您的帮助

ceil()
是一个返回整数的函数。它只使用编译时固定的参数,因此我希望循环展开能够正确进行

  genvar i, j, k;
  generate
    for (i = 0; i < NUM_STAGES; i = i + 1) begin:gen_stage
      for (j = 0; j < (TOTAL_LENGTH/(2**(i+1))); j = j + 1) begin:gen_or
        if(j < ceil(i)) begin
          for (k = 0; k < CPU_DATA_WIDTH; k = k + 1) begin:gen_bit
            msw_mem_out_mux_bit_or U_msw_mem_out_mux_bit_or (
              .in_1 (temp_in[i][2*j][k]),
              .in_2 (temp_in[i][(2*j)+1][k]),
              .out  (temp_in[i+1][j][k])
            );
          end
        end else begin
          always @(*) begin
            temp_in[i+1][j] = {CPU_DATA_WIDTH{1'b0}};
          end
        end
      end
    end
  endgenerate
genvari,j,k;
生成
对于(i=0;i
一个
总是@*
等待,直到推断灵敏度列表中的信号发生变化
i
j
是常数(从模拟时间的角度来看,
always@*
正在计算),因此您的always块在灵敏度列表中没有信号

如果使用SystemVerilog,请将
always@*
更改为
always\u comb
,它将在时间0运行。对于Verilog,添加一个
初始


参考资料:§9.2.2.2与
始终*

相比,格雷格,感谢您的解释。我需要的代码是合成能力,所以我会使用总是梳。