我对这四个术语感到非常困惑:always_ff
、always_comb
、always_latch
和 always
。它们可以如何使用,以及用于什么目的?
我对这四个术语感到非常困惑:always_ff
、always_comb
、always_latch
和 always
。它们可以如何使用,以及用于什么目的?
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_ff
、always_latch
和 always_comb
,它们在被触发时有更严格的标准,这意味着 RTL 到门级(后合成)不匹配的可能性降低了。这也意味着它们与其 always @
对应部分并非完全等效,可能会改变一些模拟行为。
always_comb
和always @*
并不等同,你不应该再使用always @*
。最大的原因是当逻辑中涉及常量或参数时,always @*
无法工作。它们不会生成事件来触发块的执行。而使用always_comb
可以保证在时间0执行。 - dave_59always @*
。考虑到有多少初学者发布手动灵敏度列表的问题,我认为在always_comb
成为常态之前我们还有很长的路要走。 - Morgan//synthesis translate on
)转向使用需要多长时间。自从25年前将
ifdef`添加到Verilog以来,已经过去了这么久。 - dave_59always_latch
与非阻塞赋值。您在回复中使用阻塞式赋值的特定原因是什么? - Arialways_latch
是always @*
的扩展。<=
模拟了锁存器的行为,当锁存器打开时是透明的,所以我认为=
更加合适。我之前没有注意到他们在 LRM 中使用非阻塞 (<=
)。 - Morgan