always_ff、always_comb、always_latch 和 always

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相关的可综合设计规则

  1. 使用always_comb进行组合逻辑建模,always_comb中使用阻塞赋值;
  2. 使用always_ff进行时序逻辑建模,always_ff中只能使用非阻塞赋值。只有非阻塞赋值才能正确描述时钟沿触发的同步逻辑行为。
  3. 同步设计中一般不允许使用latch,因此不要使用always_latch;
  4. 通用的always只用于testbench的设计;
  5. 在always_comb/always_ff/always_latch不允许使用时间和事件控制语句;
  6. 绝对不允许在同一个过程块内混合使用阻塞(=)和非阻塞(<=)两种赋值。
  7. 组合逻辑和时序逻辑尽量不要在一个过程块中描述。

 

posted @ 2022-09-27 10:13  VarForrest  阅读(1289)  评论(0编辑  收藏  举报