【问题标题】:SystemVerilog, if-statements order inside an always_comb blockSystemVerilog,always_comb 块内的 if 语句顺序
【发布时间】:2020-12-10 18:09:53
【问题描述】:

我是 SystemVerilog 的新手,我想知道如何在 always_comb 块中处理对同一信号的多个分配。

我正在分析某人编写的 FSM,如果所有 if 语句都为真,我不明白哪个是下一个状态(名为“ctrl_fsm_ns”的信号)。在google上搜索,我发现这里使用了阻塞分配,所以我希望最后一个if语句将决定下一个状态(所以就像为每个if语句分配了一定的优先级)。但是,如果在每个 if 块中断言不同的信号怎么办?例如,即使下一个状态是最后一个状态,它们也会被断言?

这是一段我看不懂的代码。

always_comb
begin
  ...
  unique case (ctrl_fsm_cs)
   ...
   FIRST_FETCH:
   begin
    is_decoding_o = 1'b0;
    // Stall because of IF miss
    if ((id_ready_i == 1'b1) )
    begin
      ctrl_fsm_ns = DECODE;
    end

    // handle interrupts
    if (irq_req_ctrl_i & irq_enable_int) begin
      // This assumes that the pipeline is always flushed before
      // going to sleep.
      ctrl_fsm_ns = IRQ_TAKEN_IF;
      halt_if_o   = 1'b1;
      halt_id_o   = 1'b1;
    end

    if ((debug_req_pending || trigger_match_i) & (~debug_mode_q))
    begin
      ctrl_fsm_ns = DBG_TAKEN_IF;
      halt_if_o   = 1'b1;
      halt_id_o   = 1'b1;
    end

   end

【问题讨论】:

  • 我没有运行模拟,我暂时没有模拟器。

标签: if-statement system-verilog fsm


【解决方案1】:

您对上述代码的问题是一般编程问题,而不是特定于 Verilog 的问题。因为只使用了阻塞赋值,所以代码完全是程序化的。

由于代码没有使用“if-else-if”序列,而只是使用“if-if-if”,所有“if”条件都将按顺序进行计算,所有赋值都将按顺序进行,因此最终的任务将胜出(正如戴夫所说)。

在您上面的 cmets 中,您问过 if (A_expr,B_expr,C_expr) where all tr​​ue 怎么办?然后 (A,B,C) 将全部设置为 1。

A_expr=1; B_expr=1; C_expr=1;

if (A_expr) A = 1;
if (B_expr) B = 1;
if (C_expr) C = 1;

【讨论】:

    【解决方案2】:

    对于 always_comb 块中的每个变量,最后的赋值是最终的值。该工具分析程序流程以确保分配的每个变量在代码的每个可能流程中至少有一个分配。如果变量有可能被读取而不被写入,这被认为是闩锁行为,并且对于 always_comb 块来说是非法的。

    您需要查看 case 语句之前或之后的代码,看看是否还有其他对 halt_ 变量的赋值。


    基于您的 cmets 的示例:

    always_comb begin
      A = 0; B = 1; C = 2;
      if (I) A = X;
      if (J) B = Y;
      if (K) begin B = Z; C = Z; end
    end
    

    相当于这三个连续赋值:

    assign A = I ? X : 0;
    assign B = K ? Z : (J ? Y : 1 );
    assign C = K ? Z : 2;
    

    每个if 语句都成为一个多路复用器,后面的语句优先级更高。

    【讨论】:

    • 是的,所有的变量都有在case语句之前赋值的默认值。现在我有一个问题,例如,如果第一个 if 块包含“my_signal = 1'b1”并且所有 if 条件都为真,那么最后信号 my_signal 将具有值 1'b1 或默认值,因为它没有在最后一个 if 块中分配?
    • 我觉得你想多了。对于每个变量,您需要跟踪always_comb 块中的整个过程代码流。最后的分配获胜。
    • 是的,我明白了。很难解释我的疑问,抱歉。我的意思是,我有 3 个信号(名为 A、B 和 C)和一个 always_comb 块,其中有 3 个不相关的 if-statemnt
    • 我的回答还是一样。转到edaplayground.com 并尝试一些代码。
    • 是的,我明白了。很难解释我的疑问,抱歉。我的意思是,我有 3 个信号(命名为 A、B 和 C)和一个 always_comb 块,其中有 3 个不相关的 if-stmnt,它们可以同时为真。假设在每个 if 块中,A、B 和 C 分别被断言为 1。因此,如果只有第一个 if-stmnt 为真,那么只有 A 被断言;如果只有最后一个 if-stmnt 为真,那么只有 C 被断言为 1。那么所有 3 个 if 语句都为真的场景呢(假设在 always_comb 的开头,分配了信号 A、B 和 C默认为0)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多