我对这四个术语感到困惑:always_ff
,always_comb
,always_latch
和always
。这些如何以及用于何种目的?
答案 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_ff
,always_latch
和always_comb
对触发它们的时间有更严格的标准,这意味着降低了RTL到门级(合成后)不匹配的可能性。它确实意味着它不是100%等同于always @
计数器部分,并且可能会改变一些模拟行为。