【问题标题】:Verilog Always block using (*) symbolVerilog 始终使用 (*) 符号阻止
【发布时间】:2011-05-15 17:22:58
【问题描述】:

我有一个关于如何在 Verilog 模块中编写 always 块的简单问题。
如果我的 Verilog 模块中有以下输入:

input        [31:0] PCplus4 ;       // Value of PC + 4
input        [31:0] A;          // Value A, i.e. RSbus (Use Forwarded Value)
input        [31:0] B;          // Value B, i.e. RTbus (Use Forwarded Value)
input        [31:0] IMM;            // Extended Immediate Value
input        [25:0] TARGET;         // Target Address for Jumps
input         [3:0] BR;         // Branch Selector Input

如果我用有什么区别

always @ (*)  

而不是

always @ (PCplus4  or A or B or IMM or TARGET or BR)  

always @ (*) 语法对所有版本的 Verilog 都有效吗?

【问题讨论】:

  • 值得一提的是,SystemVerilog 引入了always_comb(和always_ff/always_latch),它使工具链能够对设计者意图进行一些额外的检查。

标签: verilog


【解决方案1】:

always @(*) 语法于 2001 年添加到 IEEE Verilog 标准中。所有现代 Verilog 工具(模拟器、综合等)都支持此语法。

这是来自 LRM (1800-2009) 的引述:

一个不完整的 event_expression 列表 事件控件是常见的来源 寄存器传输级别 (RTL) 中的错误 模拟。隐含的 event_expression,@*,是一个方便的 消除这些的速记 通过添加所有网络和 读取的变量 声明(可以是声明 组)的一个procedural_timing_ control_statement 到 事件表达式。

因此,您的两行代码可能是等效的(这取决于您的 always 块主体中的代码)。但是,@* 语法更易于维护。

【讨论】:

    【解决方案2】:

    always @(*) 是 2001 年标准修订版中对语言的补充。所有最新版本的质量工具都支持它。我不担心在用于任意重用的代码中使用该构造,但是,有可能遇到不支持always @(*) 的旧工具,尤其是在涉及内部实用程序时。

    【讨论】:

      【解决方案3】:

      虽然两者是等价的,但使用always@(*) 可以避免任何模拟综合不匹配。 假设您在灵敏度列表中有 15 个信号,如下所示:

      always@( a1 or a2 or ... or a15)
      

      现在假设设计师错误地错过了在此列表中的 a14。综合工具忽略这一事实并综合代码,假设此块内 RHS 上的所有信号都在灵敏度列表中。而模拟工具的行为不同,因为它取决于敏感度列表。

      【讨论】:

        【解决方案4】:

        它只是列出 always 块所依赖的所有线的快捷方式。这些电线是“敏感列表”。使用它的一个优点是合成代码不太可能关心您在敏感度列表中放置的内容(除了posedge和negedge),因为电线将“物理”连接在一起。模拟器可能依赖列表来选择哪些事件应该导致块执行。如果您更改了模块并忘记更新列表,您的模拟可能会与实际的合成行为不同。

        【讨论】:

          【解决方案5】:

          对于第一个问题....我会说,这取决于在第二种情况下,这些是您认为可以更改的唯一输入,这将导致触发输出。理想情况下使用 * 会更好,因为它表示“输入的任何更改”,它还有助于避免冗长的代码。

          第二个问题.....它是在verilog -2001中引入的,从那时起它就被广泛使用了。

          【讨论】:

            【解决方案6】:

            * 表示包含所有输入,因此相当于写入所有输入。 如果您希望您的模块是组合电路而不是顺序的,则使用 * 符号也很有用,因为每当任何输入发生变化时总会有一些变化。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-09-26
              • 1970-01-01
              • 2015-04-21
              • 1970-01-01
              相关资源
              最近更新 更多