在组合总是块中使用“悬挂”闩锁

时间:2019-01-02 17:49:28

标签: verilog system-verilog

我们在这里有一个设计师,为组合的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块的顶部添加一个分配为零的位置即可删除“挂锁”。

2 个答案:

答案 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!无需担心任何令人讨厌的“挂锁”。