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

时间:2018-09-08 06:02:40

标签: verilog

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

always @(posedge clk or negedge overflow) begin
    if(overflow)
        count_posedge = count_posedge + 1;
    else
        count_posedge = 0;
end

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

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

...而且效果很好。

据我了解,这2个代码应具有相同的行为。第一个是什么问题?

1 个答案:

答案 0 :(得分:0)

与您的模拟器相比,这更可能是您的合成器出现问题。可能的问题是,对于带有异步复位的同步触发器,第一个代码与它的任何模板都不匹配。

常见的编码实践是在其他任何逻辑之前分配复位逻辑。这种编码实践已经存在了数十年。我认为这种特殊编码实践的背后原因是:

  • 在许多设计中,复位逻辑至关重要。特别是随着设计变得越来越大,越来越复杂。它的重要性以及它通常比同步逻辑更少的代码行而被放在顶部。
  • 早期的合成器非常有限,只能合成特定的代码结构。
  • 编码风格已成为一种优先。除非您可以说服并证明其他优势或优势,否则没有人会改变它。

在您的情况下,您的合成器正在做一次皮棉检查,并确定您的代码未遵循常规的编码惯例。合成器的创建者决定仅支持通用的编码结构,并且几乎没有改变的动力。


仅供参考:您应该分配具有无阻塞分配(<=)的同步逻辑。组合逻辑应使用块分配(=)。如果您未遵循正确的编码习惯,则会增加引入竞争条件,RTL与门不匹配以及其他错误的风险。