无法将条件中的操作数与始终构造的封闭事件控件中的相应边相匹配

nam*_*o00 5 verilog

此代码无法编译并给出“if(overflow)”行标题中的错误。

always @(posedge clk or negedge overflow) begin
    if(overflow)
        count_posedge = count_posedge + 1;
    else
        count_posedge = 0;
end
Run Code Online (Sandbox Code Playgroud)

我在互联网上的某个地方必须像这样更改它:

always @(posedge clk or negedge overflow) begin
    if(~overflow)
        count_posedge = 0;
    else
        count_posedge = count_posedge + 1;
end
Run Code Online (Sandbox Code Playgroud)

...而且效果很好。

根据我的理解,这两个代码应该表现相同。第一个有什么问题吗?

Gre*_*reg 3

这更有可能是您的合成器的问题,而不是模拟器的问题。可能的问题是第一个代码与具有异步复位的同步触发器的任何模板都不匹配。

常见的编码实践是在任何其他逻辑之前分配重置逻辑。这种编码实践已经存在了几十年。我认为这种特定编码实践背后的合理性源于:

  • 复位逻辑对于许多设计都至关重要;尤其是当设计变得更大、更复杂时。它被放在顶部是因为它的重要性以及它通常比同步逻辑更少的代码行。
  • 早期的合成器非常有限,只能合成特定的代码结构。
  • 编码风格已成为优先事项。除非你能说服并证明其他东西更优越或具有特定优势,否则没有人会改变它。

就您而言,您的合成器正在进行 lint 检查,并确定您的代码不遵循传统的编码实践。合成器的创建者已决定仅支持通用编码结构,并且几乎没有动力进行更改。


仅供参考:您应该使用非阻塞分配来分配同步逻辑(<=)。阻塞赋值 ( =) 应用于组合逻辑。如果您不遵循正确的编码实践,则会增加引入竞争条件、RTL 与门不匹配以及其他错误的风险。