Verilog 组合块中“悬挂”闩锁的使用

Verilog 组合块中“悬挂”闩锁的使用,verilog,system-verilog,Verilog,System Verilog,我们这里有一个设计器,它将临时结果分配给组合always块中的变量,以提高可读性。他的代码与此类似: logic second_condition; always_comb begin if (condition) begin second_condition = long_statement; if (second_condition) begin (...) end end end 这里的问题是,第二个_条件可以说描述了一个锁存器,但由于该锁存

我们这里有一个设计器,它将临时结果分配给组合always块中的变量,以提高可读性。他的代码与此类似:

logic second_condition;

always_comb begin
  if (condition) begin
    second_condition = long_statement;
    if (second_condition) begin
      (...)
    end
  end
end
这里的问题是,第二个_条件可以说描述了一个锁存器,但由于该锁存器没有负载,因此它没有用于任何其他always块中,它被优化了,并且在合成过程中没有关于正在推断的锁存器的警告。一些工具供应商似乎将其称为悬挂闩锁。值得注意的是,循环迭代器也可以被视为挂起的闩锁


这是使用所有工具都是完全安全的吗,还是值得有一个永远不这样做的编码指南?在这种情况下,您可以在always_comb块的顶部添加一个赋值到零,以移除挂起的闩锁。

在您的代码中,您正在使用condition&second_condition创建闩锁。这些都没有定义闩锁负载。负载被施加到内部某处。。。你忘了具体说明

always_comb是与system verilog签订的合同,它应该保证块中没有闩锁。如果任何SV编译器看到此代码,都会出错。检查日志文件,可能会出现警告。这应该是一个错误

如果您需要闩锁,请改用always_-latch


如果您担心temp变量,合成器应该优化它,如果它是一个好的合成器:-.

在您的代码中,您正在创建一个带条件和第二个条件的锁存器。这些都没有定义闩锁负载。负载被施加到内部某处。。。你忘了具体说明

always_comb是与system verilog签订的合同,它应该保证块中没有闩锁。如果任何SV编译器看到此代码,都会出错。检查日志文件,可能会出现警告。这应该是一个错误

如果您需要闩锁,请改用always_-latch


如果您担心温度变量,合成器应该优化它,如果它是一个好的合成器:-.

因为第二个条件是一个中间信号,完全包含在always\u comb块中,所以在always\u comb块中声明它

always_comb begin
  logic second_condition;

  if (condition) begin
    second_condition = long_statement;
    if (second_condition) begin
      (...)
    end
  end
end

普雷斯托!无需担心任何讨厌的挂锁。

因为第二个条件是完全包含在always\u comb块中的中间信号,所以在always\u comb块中声明它

always_comb begin
  logic second_condition;

  if (condition) begin
    second_condition = long_statement;
    if (second_condition) begin
      (...)
    end
  end
end

普雷斯托!无需担心任何讨厌的悬挂闩锁。

我在ASIC设计中使用过它,尽管很少,但没有任何负面影响。如今,我更喜欢将其作为一个独立的“分配”在“始终”之外,它以同样的方式工作,但没有隐含的“闩锁威胁”。对我来说,这似乎是一场赌博。即使今天是“安全的”。。。但这并不意味着随着工具的更新、新工具的出现等,某一天不会出现问题。为了维护性,如果不完全清楚合成引擎将生成什么,我建议不要使用代码。If语句之前没有else语句或输出值的默认声明的If语句描述锁存。依靠合成引擎来覆盖基于always_梳编写的内容是一个坏主意。另外,如果有人需要在某个时刻将此代码转换回常规Verilog,会发生什么情况?例如,Xilinx的Vivado工具仍然不能将SV用于顶级定制IP块。我在ASIC设计中使用过SV,尽管很少,但没有任何负面影响。如今,我更喜欢将其作为一个独立的“分配”在“始终”之外,它以同样的方式工作,但没有隐含的“闩锁威胁”。对我来说,这似乎是一场赌博。即使今天是“安全的”。。。但这并不意味着随着工具的更新、新工具的出现等,某一天不会出现问题。为了维护性,如果不完全清楚合成引擎将生成什么,我建议不要使用代码。If语句之前没有else语句或输出值的默认声明的If语句描述锁存。依靠合成引擎来覆盖基于always_梳编写的内容是一个坏主意。另外,如果有人需要在某个时刻将此代码转换回常规Verilog,会发生什么情况?例如,Xilinx的Vivado工具仍然无法将SV用于顶级定制IP块。我相信您误解了这个问题。所讨论的悬挂闩锁是第二个_条件变量本身。变量内部的赋值。。。部分总是以某种方式被驱动,例如,通过外部if语句的else子句,即使我在代码示例中没有显示这一点。问题是关于组合always块中变量的临时结果。这首先是一个错误的概念。应该根本没有门闩。然后,您可能需要问一个不同的问题。如果您关闭优化,设计编译器会生成一个无负载锁存器和一个锁存推断警告。它没有
ot使用默认设置生成任何警告。我们担心的是,我们的客户可能会使用其他一些工具。听起来你的观点是,这不应该是一个问题,那么?这应该是一个问题,因为由于不正确使用always_comb,某些工具无法编译此代码。我相信你误解了这个问题。所讨论的悬挂闩锁是第二个_条件变量本身。变量内部的赋值。。。部分总是以某种方式被驱动,例如,通过外部if语句的else子句,即使我在代码示例中没有显示这一点。问题是关于组合always块中变量的临时结果。这首先是一个错误的概念。应该根本没有门闩。然后,您可能需要问一个不同的问题。如果您关闭优化,设计编译器会生成一个无负载锁存器和一个锁存推断警告。它不会使用默认设置生成任何警告。我们担心的是,我们的客户可能会使用其他一些工具。听起来你的观点是,这不应该是一个问题,那么?这应该是一个问题,因为某些工具无法编译此代码,因为不正确使用always_comb。问题不是信号的声明,但是事实上,second_条件的行为描述了一个锁存,因为一个值并不总是分配给second if语句中的任何内容。嗨,Barry。请注意,在Serge的回答中,OP指出,该always_comb块中感兴趣的输出总是为所有输入组合驱动,因此它正确地描述了组合逻辑。问题在于,由于第二个_条件是在always_comb块之外声明的,并且也是从always_comb块内部驱动的,因此它最初将被视为一个锁存器,以进行优化。通过在always_comb块中声明第二个_条件,可以消除任何合成警告,这是一个很好的示例,可以声明接近使用位置的变量。@Lesin我认为Barry可能是对的,这没有任何区别,但我没有机会测试它。它所做的肯定是防止任何其他块读取信号,因此以这种方式它确保没有引入真正的锁存器。但我确实认为,如果您指示工具保留第二个条件或保留所有内容,它仍然会生成闩锁。问题不是信号的声明,而是第二个条件的行为描述闩锁的事实,因为在第二个if语句中,值并不总是分配给任何内容。嗨,Barry。请注意,在Serge的回答中,OP指出,该always_comb块中感兴趣的输出总是为所有输入组合驱动,因此它正确地描述了组合逻辑。问题在于,由于第二个_条件是在always_comb块之外声明的,并且也是从always_comb块内部驱动的,因此它最初将被视为一个锁存器,以进行优化。通过在always_comb块中声明第二个_条件,可以消除任何合成警告,这是一个很好的示例,可以声明接近使用位置的变量。@Lesin我认为Barry可能是对的,这没有任何区别,但我没有机会测试它。它所做的肯定是防止任何其他块读取信号,因此以这种方式它确保没有引入真正的锁存器。但我确实认为,如果您指示工具保留第二个条件或保留所有内容,它仍然会生成闩锁。