此代码无法编译,并在标题中的"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
...and它工作得很完美。
据我所知,这两个代码的行为应该是一样的。第一个有什么问题?
发布于 2018-09-12 08:19:04
这更可能是合成器的问题,而不是模拟器的问题。可能的问题是,第一个代码与其用于异步复位的同步触发器的任何模板都不匹配。
常见的编码实践是在分配任何其他逻辑之前分配您的重置逻辑。这种编码实践已经存在了几十年。我假设这种特殊的编码实践背后的理性源于:
在许多设计中,
在您的例子中,您的合成器正在进行lint检查,并已确定您的代码没有遵循传统的编码实践。你的合成器的创建者已经决定只支持通用的编码结构,几乎没有改变的动机。
仅供参考:您应该使用非阻塞分配(<=
)来分配同步逻辑。组合逻辑应该使用阻塞赋值(=
)。如果您不遵循适当的编码实践,则会增加引入竞争条件、RTL与gate不匹配以及其他错误的风险。
https://stackoverflow.com/questions/52232515
复制相似问题