0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简述Verilog HDL中阻塞语句和非阻塞语句的区别

FPGA设计论坛 来源:博客园 作者: elegang 2021-12-02 18:24 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Verilog中有两种类型的赋值语句:阻塞赋值语句(“=”)和非阻塞赋值语句(“<=”)。正确地使用这两种赋值语句对于Verilog的设计和仿真非常重要。

Verilog语言中讲的阻塞赋值与非阻塞赋值,但从字面意思来看,阻塞就是执行的时候在某个地方卡住了,等这个操作执行完在继续执行下面的语句,而非阻塞就是不管执行完没有,我不管执行的结果是什么,反正我继续下面的事情。而Verilog中的阻塞赋值与非阻塞赋值正好也是这个意思,通过执行一个例子,就可以简单地明白了:
1、阻塞赋值可以理解为语句的顺序执行,因此语句的执行顺序很重要
2、非阻塞赋值可以理解为语句的并行执行,所以语句的执行不考虑顺序
3、在assign的结构中,必须使用的是阻塞赋值

也就是说:

阻塞:在本语句中“右式计算”和“左式更新”完全完成之后,才开始执行下一条语句;
非阻塞:当前语句的执行不会阻塞下一语句的执行。

下面给出实例来说明:

给出相应的案例来帮助理解:

module prj1(in,b,c,d,clk,rst_n);

input in;
input clk;
input rst_n;
output b,c,d;
reg b,c,d;

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        b <=0;
        c <=0;
        d <=0;
    end
    else begin
        b <=in;
        c <=b;
        d <=c;
        end
    end
endmodule

这个目的是为了展示非阻塞赋值过程中的时序变化,对应的RTL电路图和仿真波形如下图:

65318f7e-417c-11ec-b939-dac502259ad0.jpg

从仿真图可以看书,b,c,d是在每个时钟后依次传递的,如果采用阻塞赋值,如果in改变,那么b,c,d立刻改变,这个就在这里不给出仿真。

阻塞赋值和非阻塞赋值的另外一个区别在于综合的时候,如果输出只有d,bc作为中间变量,阻塞赋值在综合的过程中会自动省略掉中间过程。给出如下仿真,理解更为清楚

module prj1(in,b,c,clk,rst_n);

input in;
input clk;
input rst_n;
output b,c;
reg b,c, e,f, m,n;
/* <= */
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) b <=0;
    else begin
        e <=in;
        f <=e;
        b <=f;
        end
    end
/* = */
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) c=0;
    else begin
        m = in;
        n = m;
        c = n;
        end
    end    
endmodule

综合后结果如图,可以看出,采用阻塞赋值,综合后的逻辑单元只有一个,中间变量m,n直接省去了。

65b31b3e-417c-11ec-b939-dac502259ad0.jpg

下面我们来看看两者代码之间到底是怎么运行的。

(1)对于阻塞赋值的情况:

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) c=0;
    else begin
        m = in;
        n = m;
        c = n;
        end
    end

always语句块对Clk的上升沿敏感,当发生Clk 0~1的跳变时,执行该always语句。

在begin...end语句块中所有语句是顺序执行的,而且最关键的是,阻塞赋值是在本语句中“右式计算”和“左式更新”完全完成之后,才开始执行下一条语句的。

在本例中,in的值赋给m以后,再执行n = m;同样在n的值更新以后,才执行c = n。这样,最终的计算结果就是in = c。也就是说时钟上升沿到来的时候,整个语句块执行完后,in,m,n,c的值都是一样的,这也就是我们前面说的,in变化之后,m,n,c都跟着变化。所有的语句执行完以后,该always语句等待Clk的上升沿,从而再一次触发begin...end语句。

总结

完成阻塞赋值的过程为:首先计算等号右边表达式的结果;接着这个结果存入仿真系统的内部临时寄存器中,这个寄存器也称为赋值事件队列和调度的临时寄存器。如果赋值时没有延迟信息,则这个事件立即被调度执行。

(2)对于非阻塞赋值的情况

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) b <=0;
    else begin
        e <=in;
        f <=e;
        b <=f;
        end
    end

首先执行e <= in,产生一个更新事件,将in的当前值赋给e,但是这个赋值过程并没有立刻执行,而是在事件队列中处于等待状态。

然后执行f <= e,同样产生一个更新事件,将e的当前值(注意上一语句中将in值赋给e的过程并没有完成,e还是旧值)赋给f,这个赋值事件也将在事件队列中处于等待状态。

再执行b <= f,产生一个更新事件,将f的当前值赋给b,这个赋值事件也将在事件队列中等待执行。

这时always语句块执行完成,开始对下一个Clk上升沿敏感。也就是说,使用非阻塞赋值方式进行赋值时,各个赋值语句同步执行;因此,通常在一个时钟沿对临时变量进行赋值,而在另一个时钟沿对其进行采样。

那么什么时候才执行那3个在事件队列中等待的事件呢?只有当当前仿真时间内的所有活跃事件和非活跃事件都执行完成后,才开始执行这些非阻塞赋值的更新事件。这样就相当于将in、e和f的值同时赋给了e、f和b。

注:

*仿真器首先按照仿真时间对事件进行排序,然后再在当前仿真时间里按照事件的优先级顺序进行排序。

*活跃事件是优先级最高的事件。在活跃事件之间,它们的执行顺序是随机的。阻塞赋值(=)、连续赋值(assign)以及非阻塞赋值的右式计算等都属于活跃事件。

总结 :

非阻塞语句的执行过程为:首先,它会把非阻塞赋值放入调度队列中;接着,仿真工具开始执行下一条语句而不等待当前这条语句执行完毕。也就是说,先计算出等号右边表达式的结果,再把这个结果的赋值操作保存在事件队列中,等轮到事件被调度的时候,把这个结果赋值给等号左边。如果没有指定等号右边的延迟,赋值的操作会发生在当前时间单位的最后时刻。

知道了阻塞赋值和非阻塞赋值的区别之后,大家肯定就会关心什么时候该用阻塞赋值什么时候该用非阻塞赋值,下面我简单的说几句:

赋值的类型的选择取决于建模的逻辑类型。一般情况是这样的(也有特殊情况):
(1)在时序逻辑电路中一般使用非阻塞赋值。
非阻塞赋值在块结束后才完成赋值操作,此赋值方式可以避免在仿真出现冒险和竞争现象。
(2)在组合逻辑电路中一般使用阻塞赋值。
使用阻塞方式对一个变量进行赋值时,此变量的值在在赋值语句执行完后就立即改变。
(3)在assign语句中必须使用阻塞赋值语句


希望大家在懂得了阻塞和非阻塞语句的区别之后,能够很好的在自己的项目中灵活地运用,这也是大家面试的时候,必须会面对的一个问题,希望大家能够掌握

编辑:jq


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    30

    文章

    1370

    浏览量

    114138
  • HDL
    HDL
    +关注

    关注

    8

    文章

    331

    浏览量

    48811
  • 阻塞
    +关注

    关注

    0

    文章

    24

    浏览量

    8390

原文标题:Verilog HDL中阻塞语句和非阻塞语句的区别

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    飞凌嵌入式ElfBoard-文件I/O的深入学习之阻塞I/O与阻塞I/O

    可能会使程序阻塞等待,直到有数据可读时才会被唤醒返回。 普通文件的读写操作是不会阻塞的,不管读写多少个字节数据,read或 write一定会在有限的时间内返回,所以普通文件一定是以阻塞
    发表于 12-01 13:07

    如何利用Verilog HDL在FPGA上实现SRAM的读写测试

    本篇将详细介绍如何利用Verilog HDL在FPGA上实现SRAM的读写测试。SRAM是一种非易失性存储器,具有高速读取和写入的特点。在FPGA实现SRAM读写测试,包括设计SRAM接口模块
    的头像 发表于 10-22 17:21 3954次阅读
    如何利用<b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>在FPGA上实现SRAM的读写测试

    CH32V307 串口发送阻塞的原因?怎么解决?

    */ modbus_set_rx_mode(master); modbus发送,不知为何阻塞在rt_device_write,初始化 find open 正常
    发表于 09-18 06:06

    人工智能行业如何使用for循环语句进行循环

    : 支持range()函数生成数字序列 可结合else语句使用 Java的for循环: 传统结构:for(初始化; 条件; 增量) 增强for循环:for(类型 变量 : 集合) 主要用于数组和集合
    的头像 发表于 09-10 12:55 393次阅读

    Unicore标准NEMA语句GSA及说明

    本文介绍和芯星通的NEMA语句说明。
    的头像 发表于 07-16 11:39 484次阅读
    Unicore标准NEMA<b class='flag-5'>语句</b>GSA及说明

    基础篇3:掌握Python的条件语句与循环

    在Python编程语言中,条件语句和循环是构成复杂逻辑和数据处理的基石。本篇基础教程将帮助您深入了解Python的条件语句和循环结构,让您能够更好地控制程序流程。 条件语句 条件
    发表于 07-03 16:13

    详解TIA Portal SCL编程语言中的IF语句

    IF 语句是编程中最基本和最重要的控制结构之一,它的主要作用是根据条件决定程序的执行路径,IF 语句是编程实现逻辑判断和决策的基础。
    的头像 发表于 05-24 15:01 1438次阅读
    详解TIA Portal SCL编程语言中的IF<b class='flag-5'>语句</b>

    在testbench如何使用阻塞赋值和阻塞赋值

    本文详细阐述了在一个testbench,应该如何使用阻塞赋值与阻塞赋值。首先说结论,建议在testbench,对时钟信号(包括分频时钟
    的头像 发表于 04-15 09:34 1003次阅读
    在testbench<b class='flag-5'>中</b>如何使用<b class='flag-5'>阻塞</b>赋值和<b class='flag-5'>非</b><b class='flag-5'>阻塞</b>赋值

    在S32DS上使用JLINK调试S32K341,被阻塞了,怎么处理?

    我正在尝试使用 S32K341 在新板上刷写程序,但在 S32K3X4EVB 上运行并为 S32K341配置的相同代码出现错误。具体来说,当我使用 S32DS 的 J-Link 探针运行调试时,它在此地址被阻塞,并且不会将其闪存到内存。有人遇到同样的问题或可以帮助我吗?
    发表于 04-03 08:13

    FPGA Verilog HDL语法之编译预处理

    语句)。Verilog HDL编译系统通常先对这些特殊的命令进行“预处理”,然后将预处理的结果和源程序一起在进行通常的编译处理。
    的头像 发表于 03-27 13:30 1088次阅读
    FPGA <b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>语法之编译预处理

    一文详解Verilog HDL

    Verilog HDL(Hardware Description Language)是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。现实生活多用于专用集成电路
    的头像 发表于 03-17 15:17 3777次阅读
    一文详解<b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>

    浅谈Verilog和VHDL的区别

    Verilog和VHDL是两种广泛使用的硬件描述语言(HDL),它们用于描述和模拟数字电路系统的行为和结构。这两种语言的主要作用是帮助工程师设计、仿真和验证集成电路(IC)和系统级芯片(SoC)的硬件模块。
    的头像 发表于 02-17 14:20 2627次阅读
    浅谈<b class='flag-5'>Verilog</b>和VHDL的<b class='flag-5'>区别</b>

    “串口阻塞”你真的会用吗?

    导读在串口通信开发,数据错乱是常见问题。本文将快速介绍串口标志位的作用及配置方法,帮助解决数据传输错误。这是一个真实案例,用户反馈“串口向另外的设备发送数据,发现运行一段时间后,发送的消息会阻塞
    的头像 发表于 02-13 11:42 1199次阅读
    “串口<b class='flag-5'>阻塞</b>”你真的会用吗?

    Verilog与VHDL的比较 Verilog HDL编程技巧

    Verilog 与 VHDL 比较 1. 语法和风格 VerilogVerilog 的语法更接近于 C 语言,对于有 C 语言背景的工程师来说,学习曲线较平缓。它支持结构化编程,代码更直观,易于
    的头像 发表于 12-17 09:44 2689次阅读

    深入理解C语言:循环语句的应用与优化技巧

    在程序设计,我们常常需要重复执行某一段代码。为了提高效率和简化代码,循环语句应运而生。C语言作为一门经典的编程语言,提供了多种循环控制结构,帮助程序员高效地实现重复操作。掌握循环语句的使用,不仅
    的头像 发表于 12-07 01:11 1065次阅读
    深入理解C语言:循环<b class='flag-5'>语句</b>的应用与优化技巧