此代码无法编译,并给出错误,如标题“ 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个代码应具有相同的行为。第一个是什么问题?
答案 0 :(得分:0)
与您的模拟器相比,这更可能是您的合成器出现问题。可能的问题是,对于带有异步复位的同步触发器,第一个代码与它的任何模板都不匹配。
常见的编码实践是在其他任何逻辑之前分配复位逻辑。这种编码实践已经存在了数十年。我认为这种特殊编码实践的背后原因是:
在您的情况下,您的合成器正在做一次皮棉检查,并确定您的代码未遵循常规的编码惯例。合成器的创建者决定仅支持通用的编码结构,并且几乎没有改变的动力。
仅供参考:您应该分配具有无阻塞分配(<=
)的同步逻辑。组合逻辑应使用块分配(=
)。如果您未遵循正确的编码习惯,则会增加引入竞争条件,RTL与门不匹配以及其他错误的风险。