描述
一般描述:
当在HDL综合期间发现锁存推断时,XST报告以下HDL顾问消息:
“警告:XST:737 -发现N位锁存器的信号和名称;
“n”的列表是锁存器的宽度。
如果打算使用闩锁推断,则可以安全地忽略此消息。然而,一些低效的编码风格可能导致意外锁存推断。你应该分析你的代码,看看这个结果是否是有意的。下面的例子说明了如何避免闩锁推理。
解决方案
在case语句中包含所有可能的情况。
Verilog
总是@(SEL或DIN或DIN)
开始
案例(SEL)
2’B00:Dout<=DI1+DIN;
2’B01:DUT&Lt= DIN 1-DIN;
2’B10:DUT&Lt= DIN1;
端部病例
结束
VHDL语言
进程(SEL,DIN,DIN 2)
开始
案例SEL
当“00”=DUT1+DIN;
当“01”=dU& lt=DIN1-DIN;
当“10”=dU& lt=DIN1时;
结束情况;
结束过程;
这两个示例创建锁存器,因为当SEL=“11”消除锁存器时,没有任何规定,添加另一个条目来处理这种可能性。
Verilog
2’B11: DUT & lt;= DIN 2;
VHDL语言
当“11”=dU& lt=DIN 2时;
使用“默认”(Verilog)或“当别人”(VHDL)子句总是有效的,但这可以创建无关的逻辑。这总是最安全的方法,但可能产生更大和更慢的设计,因为任何未知的状态都有需要将其带到已知状态的逻辑。
在每种情况下分配给所有相同的输出。
Verilog
总是@(SEL或DIN或DIN)
开始
案例(SEL)
2’B00:Dout<=DI1+DIN;
2’B01:DUT&Lt= DIN 1-DIN;
2’B10:DUT&Lt= DIN1;
2’B11:
开始
DON2;
温度=DIN1;
结束
端部病例
结束
VHDL语言
进程(SEL,DIN,DIN 2)
开始
案例SEL
当“00”=DUT1+DIN;
当“01”=dU& lt=DIN1-DIN;
当“10”=dU& lt=DIN1时;
当“11”=gt;
DON2;
温度=DIN1;
结束情况;
结束过程;
这些例子推断锁存器,因为“11”的情况分配两个输出,而其他的只分配一个。从TEMP的角度来看,只有四个可能的案例中有一个是指定的,所以它是不完整的。您可以通过将值分配给每一种情况的完全相同的输出列表来避免这种情况。
确保任何“如果/否则”语句有结论性的“其他”条款:
VHDL:
&代码;
进程(GE,DIN)开始
如果(Ge=‘1’)然后
Duutha & lt;
其他的
Dutua<=“0”;这是一个总结的“否则”语句。
如果结束;
结束过程;
&代码/代码;
Verilog:
&代码;
总是@(GE或DIN)
如果(GE)dutua & lt;= din;
否则dutua<=1’b0;;//这是一个总结的“否则”语句。
&代码/代码;
没有回复内容