always_ff,always_comb,always_latch和always之间的区别

时间:2014-04-16 06:30:35

标签: system-verilog

我对这四个术语感到困惑:always_ffalways_combalways_latchalways。这些如何以及用于何种目的?

1 个答案:

答案 0 :(得分:21)

always 是来自Verilog的主要流程类型,另一个是initial,它在模拟开始时运行一次。

always_ff @(posedge clk)
表示触发器(ff),在时钟的每个上升沿触发(执行)该过程。这取代了always @(posedge clk)。这是唯一应该使用非阻塞(<=)赋值的类型,因为这模仿了触发器传输数据的方式。

always_ff @(posedge clk) begin
  a <= b;
end

always_latch :用于表示锁存器。

用法是:

always_latch begin
  if (enable) begin
     a_latch = something;
  end
  //No else clause so a_latch's value
  //is not always defined, so it holds its value
end

取代:

always @* begin
  if (enable) begin
     a_latch = something;
  end
  //No else clause so a_latch's value
  //is not always defined, so it holds its value
end

<强> always_comb
对于组合逻辑,当您不需要锁存时,它是always @*的替代。现在,我们现在可以在我们想要和不想要锁存器之间区分我们的设计意图。

SystemVerilog名称always_ffalways_latchalways_comb对触发它们的时间有更严格的标准,这意味着降低了RTL到门级(合成后)不匹配的可能性。它确实意味着它不是100%等同于always @计数器部分,并且可能会改变一些模拟行为。