我们在这里有一个设计师,为组合的always块中的变量分配了临时结果,以提高可读性。他的代码与此类似:
logic second_condition;
always_comb begin
if (condition) begin
second_condition = long_statement;
if (second_condition) begin
(...)
end
end
end
这里的问题是second_condition
可以描述一个锁存器,但是由于该锁存器没有负载(在任何其他always块中均未使用),因此已对其进行了优化,并且没有关于锁存器被推断的警告在合成过程中。一些工具供应商似乎将其称为“悬挂式锁”。值得注意的是,循环迭代器也可以视为悬挂式闩锁。
这对所有工具来说都是完全安全的吗,还是值得制定编码准则以免这样做?在这种情况下,您只需在always_comb块的顶部添加一个分配为零的位置即可删除“挂锁”。
答案 0 :(得分:1)
在您的代码中,您正在使用condition & second_condition
创建一个闩锁。这些都没有定义锁存器负载。负载将施加到(...)
内部您忘记指定的位置。
always_comb
是与系统Verilog签订的合同,应保证该块中没有锁存器。如果看到此代码,则任何SV编译器都应出错。检查您的日志文件,可能会有警告。应该是一个错误。
如果需要闩锁,请改用always_latch
。
如果您担心temp变量,则合成器应该对其进行优化(如果它是一个很好的合成器:-))。
答案 1 :(得分:-2)
由于second_condition是一个完全包含在always_comb块中的中间信号,因此请在always_comb块中声明它。
always_comb begin
logic second_condition;
if (condition) begin
second_condition = long_statement;
if (second_condition) begin
(...)
end
end
end
Presto!无需担心任何令人讨厌的“挂锁”。