【问题标题】:What's included in a verilog always @* sensitivity list?verilog always @* 敏感度列表中包含什么?
【发布时间】:2012-03-11 21:27:26
【问题描述】:

当您在始终阻止敏感度列表中使用通配符 @* 时,我对将什么视为输入感到有些困惑。例如,在以下示例中,哪些信号被解释为导致重新评估 always 块的输入?据我了解,不包括 clkreset,因为它们不会出现在 always 块中任何程序语句的右侧。 ab 被包括在内,因为它们都出现在 always 块中程序语句的右侧。但我真正感到困惑的是 enmux。因为它们被用作 ifcase 语句中的测试条件,它们是否被视为输入?每次 enmux 更改值时,always 块是否都会重新评估?我几乎是个菜鸟,在我拥有的 3 本书中,我还没有找到令人满意的解释。我一直觉得这里的解释很有帮助。谢谢

module example
( 
    input wire clk, reset, en, a, b,
    input wire [1:0] mux,
    output reg x,y, z
);

always @*    
begin  
 x = a & b;    
  if (en)
    y= a | b;
  case(mux)
    2'b00: z = 0;
    2'b01: z = 1;
    2'b10: z = 1;
    2'b11: z = 0;
  endcase
end
endmodule

【问题讨论】:

    标签: verilog digital-logic


    【解决方案1】:

    在块内读取的任何信号,如果其值发生变化,可能会导致块的结果发生变化,将包含在@* 中。所用读取信号的任何变化必须导致模块被重新评估,因为它可能导致模块的输出发生变化。我相信您知道,如果您没有使用@*,您将手动列出这些信号。

    就您提供的代码而言,它是任何信号:

    • 在作业的右侧评估(ab
    • 作为条件的一部分进行评估(enmux

    ...但它是任何出于任何原因都会被评估的信号。 (我现在想不出任何其他原因,但也许其他人可以)

    clkreset 不在敏感度列表中,因为它们未被使用。就那么简单。它们没有什么特别之处。它们和其他信号一样。

    【讨论】:

    • 不添加嵌套事件表达式中的标识符。
    【解决方案2】:

    在您的示例中,隐式敏感度列表中包含以下信号:

    a
    b
    en
    mux
    

    clkreset 不属于敏感度列表。

    这在 IEEE Std for Verilog(例如 1800-2009)中有完整的描述。 IEEE 规范是有关 Verilog 的详细信息的最佳来源。您的模拟器的文档也可能会描述 @* 的工作原理。

    【讨论】:

      【解决方案3】:

      最简单的答案取决于您是在编写 RTL 还是测试平台。如果您正在编写 RTL,那么您应该尝试忘记敏感度列表的概念,因为它们实际上并不存在。没有仅在触发列表中的项目时更新的逻辑。 RTL 中的所有灵敏度列表都会导致您的模拟和实际电路有所不同,它们没有任何好处。

      因此,请始终使用“always @*”或更好的“always_comb”,忘记敏感度列表的概念。如果代码中的项目被评估,它将触发该过程。就那么简单。如果项目在 if/else、case、分配给变量或其他任何内容中,它将被“评估”并因此导致流程被触发。

      但是,请记住,在数字电路中,没有敏感度列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2021-03-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        相关资源
        最近更新 更多