verilog中写case语句时经常犯错,至少身为菜鸟的我经常这样,写下来,免得下次又忘记了。代码隔段时间不写就容易生疏啊。。。
例子:
always@(a)
begin
case(a)
1'b1: d = 0;
1'b0: d = d+1;
endcase
end
1'b0: d = d+1;
这样写是不对的,会产生组合环(Combinational Loop)。尤其在写状态机的组合逻辑时,阻塞赋值右边最好不要写成一个计算的等式,而写成一个实际的变量。
网上查找了下关于组合环:通过开发工具综合后RTL视图观察,可以看到有组合电路的输出管脚又反过来驱动某一个输入,这样可能会存在竞争,导致未定义的行为,建议对有反馈的输出进行同步化。另外还有一种可能就是always 语句块没有事件触发。
文章评论(0条评论)
登录后参与讨论