我完全搞不懂这四个术语:always_ff
,always_comb
,always_latch
和always
。这些可以如何使用以及用于什么目的?
发布于 2014-04-16 15:37:09
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 @
对应物,并且可能会改变一些模拟行为。
https://stackoverflow.com/questions/23101717
复制相似问题