End of Best.
by WeiLin
在FPGA里应避免使用锁存器,这是因为Latch会加大时序分析的难度,而且会占用较大资源。所以应遵循一些书写规范以避免锁存器的产生。
一般在非时序逻辑中的不完整条件会产生Latch:
不带else字句的if语句
不带default的case语句
为了避免产生Latch,所有的输出在所有的条件下都需要被驱动,所以需要补全所有的条件:
always@(*)begin
if(sel)
...
else
...
end
但只是补全所有的条件还不够,还须让所有的输出被驱动,如下代码就会产生Latch:
always@(*)begin
if(sel)
a=in1;
b=in2;
else
a=in3;//b没有在该条件分支里被赋值
end
由于b在else条件没有被赋值,所以也是会综合成Latch。所以需保证所有的输出在所有的条件分支里均被赋值。
一个简单的办法是:在always块内部开始时为变量分配默认值。
如下示例所示(示例来自HDLbits),在always块开始时为所有输出分配默认值。这种书写方式可以保证输出总是被默认值驱动,除非case分支有被赋值。这样就没有必要在case的所有分支里为4个输出全部赋值,简化了代码书写。
module top_module (
input [15:0] scancode,
output reg left,
output reg down,
output reg right,
output reg up );
always@(*)begin
left=0;down=0;right=0;up=0;//设置默认值
case(scancode)
16'he06b:left=1;
16'he072:down=1;
16'he074:right=1;
16'he075:up=1;
endcase
end
endmodule