【问题标题】:Verilog generate statement with always@(*) block带有 always@(*) 块的 Verilog 生成语句
【发布时间】:2015-08-28 21:34:10
【问题描述】:

我有这个生成块,我认为它应该可以工作,但我发现else 块下的always @(*) 部分存在问题。使用 VCS 时,temp_in[i+1][j] 始终分配为“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

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    always @* 一直等待,直到推断的敏感度列表中的信号发生变化。 i 和 j 是常量(从 always @* 评估时的模拟时间的角度来看),因此您的 always 块在灵敏度列表中没有信号。

    如果使用 SystemVerilog,请将 always @* 更改为 always_comb,这将在时间 0 运行。对于 Verilog,添加一个 initial 块。

    参考:IEEE Std 1800-2012 § 9.2.2.2.2 always_comb 与 always @* 相比

    【讨论】:

    • 感谢您的解释,格雷格。我需要能够合成的代码,所以我将使用 always_comb。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多