always
是来自 Verilog 的主要进程类型,另一个是 initial
在模拟开始时运行一次.
always_ff @(posedge clk)
:
代表一个触发器(ff),该过程在时钟的每个上升沿被触发(执行).这替换了 always @(posedge clk)
.这是唯一应该使用非阻塞 (<=
) 赋值的类型,因为它模仿了触发器传输数据的方式.
always_latch
:用于表示锁存器.由于在一般的同步设计中是不允许(或至少不推荐)使用latch式设计,在一般的设计中不用它了。
always_comb
:
用于组合逻辑,当您不需要锁存器时,它会替换 always @*
.现在我们可以区分我们想要和不想要锁存器的设计意图.
与原始的always块一样,这三个新的东西也是无限循环过程块—即每一个仿真周期都执行,与之相对的是initial块,在一次仿真中只执行一次。
但是与原始的always块不一样的是,三个新的always块是专门针对可综合性RTL逻辑建模而定义的,而原始always块则是万金油。事实上,always_ff, always_comb, always_latch能实现的,always都能够实现。
always相关的可综合设计规则
- 使用always_comb进行组合逻辑建模,always_comb中使用阻塞赋值;
- 使用always_ff进行时序逻辑建模,always_ff中只能使用非阻塞赋值。只有非阻塞赋值才能正确描述时钟沿触发的同步逻辑行为。
- 同步设计中一般不允许使用latch,因此不要使用always_latch;
- 通用的always只用于testbench的设计;
- 在always_comb/always_ff/always_latch不允许使用时间和事件控制语句;
- 绝对不允许在同一个过程块内混合使用阻塞(=)和非阻塞(<=)两种赋值。
- 组合逻辑和时序逻辑尽量不要在一个过程块中描述。
标签:逻辑,latch,always,阻塞,ff,comb From: https://www.cnblogs.com/VARForrest/p/16733577.html