我对这4个术语完全感到困惑: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 @
计数器部分100%等效,并且可能会更改某些模拟行为。关于system-verilog - always_ff,always_comb,always_latch和Always之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23101717/