SystemVerilog:always_ff,always_comb,always_latch

简介: SystemVerilog:always_ff,always_comb,always_latch


一、简介

Verilog中只有一个通用的always过程块,SystemVerilog中追加了3个具有更明确目的专用always块。

  • always_ff
  • always_comb
  • always_latch

always_ff, always_comb, always_latch分别是用于寄存器(flip-flop,代表时序逻辑sequential logic), 组合逻辑以及锁存器的建模。

事实上,always_ff, always_comb, always_latch能实现的,always都能够实现。

新增的always语句具有如下的特点:

  1. always_comb用于可综合组合逻辑的建模,不需要明确地定义敏感列表。
    always_combalways @(*)在表达组合逻辑时几乎是等价的。
  2. always_ff用于可综合时序逻辑的建模,必须带由posedge或者negedge所定义的敏感列表。

可综合设计规则

  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. 组合逻辑和时序逻辑尽量不要在一个过程块中描述。

二、示例

时序逻辑

always_ff @(posedge clk_in or negedge rst_n_in) begin
    if( !rst_n_in ) begin
        d <= 'b0;
    end else begin
        d <= (a & b) | c;
    end
end

组合逻辑

always_comb begin
    case(curr_state)
    s0: begin
        out1 = 1'b1;
        out2 = 1'b0;
    end
    s1: begin
        out1 = in1;   
        out2 = 1'b1;
    end
    s2: begin
        out1 = 1'b1;
        out2 = in2;
    end
    default: begin
        out1 = 1'b0;   
        out2 = 1'b0;
    end
    endcase
end
相关文章
|
10月前
|
存储 程序员
【汇编】“转移”综述、操作符offset、jmp指令
【汇编】“转移”综述、操作符offset、jmp指令
464 1
|
7月前
|
安全 Java API
Java多线程编程:使用Atomic类实现原子操作
在Java多线程环境中,共享资源的并发访问可能导致数据不一致。传统的同步机制如`synchronized`关键字或显式锁虽能保障数据一致性,但在高并发场景下可能导致线程阻塞和性能下降。为此,Java提供了`java.util.concurrent.atomic`包下的原子类,利用底层硬件的原子操作确保变量更新的原子性,实现无锁线程安全。
65 0
|
10月前
|
C++
c++ std::lock与std::scoped_lock底层实现原理源码剖析
std::lock用于同时获取多把锁(两把及两把以上)std::scoped_lock定义于c++ 17标准,是std::lock的RAII封装类以下代码纯来自msvc实现。
211 0
c++ std::lock与std::scoped_lock底层实现原理源码剖析
lock和synchtonized的区别
lock和synchtonized的区别
C++11/14/17中提供的mutex系列区别
C++11/14/17中提供的mutex系列类型如下:
140 0
|
存储 安全 Java
Java || 线程 || 大一新生 || 一篇synchronized锁的知识点总结
Java || 线程 || 大一新生 || 一篇synchronized锁的知识点总结
1021 1
Java || 线程 || 大一新生 || 一篇synchronized锁的知识点总结
|
Java
【自省】Thread的理论很简单吧,实战中什么情况要用setDaemon、 interrupt 和 join ?
【自省】Thread的理论很简单吧,实战中什么情况要用setDaemon、 interrupt 和 join ?
130 0
|
Oracle NoSQL JavaScript
gdb调试之---当update时第一个持有的Latch是什么Latch锁?
Latch是管理内存结构的锁,非常底层,作机制很简单,执行效率很高,我们要去跟踪调试latch的行为用一般的手段很难捕获到它的过程,GDB是不错的选择。

热门文章

最新文章