这个问题很简单,前面的很多博文也多多少少提到了这个问题,(如:Verilog HDL 使用规范(一)),今天就系统地理一遍。
Verilog HDL设计中容易犯的一个通病就是不正确使用语言,生成了并不想要的锁存器。下面给出两种情形:
情形一:
不恰当地使用 if 语句
1.1 有锁存器的代码:
always @(al or b)
begin
if(al) q <= b;
end
这个“always”块中,if语句保证了只有al = 1时, q才取 d 的值。这段程序没有写出al = 0时的结果,那么当al = 0时会怎么样呢?变量q保持原来的值。
1.2 无锁存器的代码:
always @(al or b)
begin
if(al) q <= b;
else q <= 0;
end
这个“always”块中,相对于上一段代码的不同之处在于当al = 0 时,给了q一个值0。
总结上面的两段代码,如果在给定的条件下变量没有赋值,这个变量就会保持原值,也就是会生成一个锁存器。
如果设计人员希望当al = 0时,q值为0,else项就必不可少了,注意1.2的代码中的“always”块,整个Verilog HDL程序模块被综合