Verilog阻塞与非阻塞赋值详解

news2024/11/25 2:46:11

基本概念

        关于阻塞赋值(=)和非阻塞赋值(<=), 阻塞赋值(=)是顺序敏感的,非阻塞赋值(<=)是顺序独立的。阻塞赋值按它们在程序块中列出的顺序顺序执行。当它们被执行时,它们会立即对抽象 reg 的内容产生影响,阻塞必须在执行下一个赋值之前执行。非阻塞赋值在对左侧抽象 reg 进行赋值之前,评估程序块中每个语句右侧的表达式,并同时执行。
                                                顺序敏感和顺序独立示例

// Blocking assignment executes sequentially .
initial begin
a=#12 1;
b=#3  0;
c=#2  3;

// Non-blocking assignment executes in parallel.
initial begin
d <=#12 1;
e <=#3  0;
f <=#2  3;
end

        阻塞赋值是顺序敏感,而非阻塞赋值是顺序独立的。从两份代码所仿真的时序图所示,abc是顺序执行的,而非阻塞赋值def则是同时执行。这也意味着,如果改变阻塞赋值语句顺序,那么会得到不同的结果。如下面2段代码改变阻塞赋值顺序综合出结果不同,前面代码综合出1个DFF,而第二段代码综合出2个DFF。

always @(posedge clk) 
begin
  rega = data;
  regb = rega;
end
always @(posedge clk) 
begin
  regb = rega;
  rega = data;
end

而对于非阻塞赋值,仅改变语句的顺序并不会改变结果,如下面2段代码综合出的结果是一样的。

reg qa,qb,qc;
always @(posedge clk) 
begin
    qa <= a;
    qb <= qa;
    qc <= qb;
end
reg qa,qb,qc;
always @(posedge clk) 
begin
    qc <= qb;
    qb <= qa;
    qa <= a;
end

为什么always块组合逻辑使用阻塞赋值?

always @(a or b or c or d)     
          begin
               t1 = a & b;
               t2 = c | d;
               out = t1 & t2;
          end
always @(a or b or c or d or t1 or t2)   
       begin
            t1 <= a & b;
            t2 <= c | d;
            out <= t1 & t2;
       end

        上面2段代码综合出的结果都是一致的,区别就是当使用非阻塞赋值时,敏感列表需要加上t1t2。对于具有阻塞分配的 always 块,always 块的敏感列表包含组合电路的所有输入 abc 和 d。每次输入改变时,总是阻塞,因此输出结果,必须重新评估。此时 always 块中的语句是按顺序执行的,输入的最新值用于确定 t1 和 t2,最后使用新的 t1 和 t2 计算出。

        在具有非阻塞赋值的 always 块中,语句是同时执行的。因此,当敏感列表中信号改变触发always块执行时,out 将使用 t1 和 t2 的旧值,因为它们的新值尚不可用。为确保在组合电路中具有相同的行为,除了电路的输入信号之外,还应将电路的内部信号 t1 和 t2 放入敏感列表中。每次更新 t1 和 t2 的值时,这将重新触发(重新进入)always 块,使输出最终能够计算其新值。然而,这个模型相对复杂并且可能会造成混淆,所以always模块组合电路的描述应该使用阻塞赋值。

为什么always模块描述时序使用非阻塞?

always @(posedge clk)     
          begin
               t1 = a & b;
               t2 = t1 & c;
               out = t1 & t2;
          end
always @(posedge clk)   
       begin
            t1 <= a & b;
            t2 <= t1 & c;
            out <= t1 & t2;
       end


        对于具有阻塞赋值的always块,在clk的每一个上升沿,三个赋值顺序执行。因此,t1 使用 clk 的上升沿处的 a 和 b 的值更新,然后 t2clk上升沿使用 t1 的新值和c的值更新自己的值。最后,使用 t1 和 t2 的新值评估 out。可以看出,t1t2只是用于临时存储,方便对复杂表达式进行分区;它们不代表真正的硬件寄存器输出,甚至可能被优化掉。值得注意的是,组合电路已经优化为 out = t1&t2 = (a&b)&(t1&c) = (a&b)&(a&b&c) = a&b&c = t1&c = t2。

        对于具有非阻塞赋值的 always 块,在clk的每个上升沿处,同时执行三个赋值:(1)t1 在 clk 的上升沿处由 和 b 的值更新(2)同时t2使用旧t1的值(其新值此时不可用)和 在 clk 的上升沿更新值,以及(3)同时使用 t1的旧值和t2的旧值(它们的新值此时不可用)更新 out

        如图所示,阻塞和非阻塞分配描述了完全不同的时序电路。根据阻塞和非阻塞分配的行为,它们分别表示一个和三个触发器。也就是说,当 t1 和 t2 使用阻塞赋值来描述时,它们是组合输出而不是时序输出。因此,该模型可能会非常混乱,所以时序的always模块仅使用非阻塞赋值。

总结:

本文主要介绍阻塞赋值和非阻塞赋值的基本概念和运行机理,以及分析不同always块应该使用阻塞还是非阻塞,在记住相关规则的情况下,能理解原因也是非常重要的。亦安以Clifford E. Cummings的论文中关于阻塞和非阻塞所描述的原则结束本篇文章:

  1. 在时序的模块中使用非阻塞赋值。

  2. 当使用always块来描述组合逻辑时,使用阻塞赋值。

  3. 当在同一个always块中描述时序和组合逻辑时,使用非阻塞赋值。

  4. 在同一个always块中不要混合使用阻塞和非阻塞赋值。

摘自“亦安的数字小站”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/460193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分库分表,shardingJdbc和Mycat区别

shardingJdbc和Mycat都可以用来分库分表 MyCatshardingJdbc本质第三方应用,中间件代理层jar包是否需要修改代码否是可跨数据库否是是否跨语言是否性能下架&#xff0c;因为多了一层好 sharding-jdbc后续发展为Sharding-Sphere&#xff0c;包含sharding-jdbc、Sharding-Proxy、…

C. Painting the Fence(思维 + 前缀和)

Problem - C - Codeforces You需要油漆一个由n个部分组成的长围栏。不幸的是&#xff0c;它没有被涂漆&#xff0c;所以你决定雇用q名画家来完成这项工作。第i名画家将会油漆所有满足lisxsri的部分x. 不幸的是&#xff0c;你的预算很紧&#xff0c;所以你只能雇用q-2名画家。显…

Java线程池详解,内含实战演练~

本文是向大家介绍线程池的使用和一些注意事项&#xff0c;它能够实现高并发下快速处理业务&#xff0c;能够帮助开发人员深入理解线程池的价值。 1. 简介 线程池是使用池化技术管理和使用线程的一种机制。池化技术&#xff1a;提前准备一些资源&#xff0c;在需要时可以重复使…

200颗卫星!武大“东方慧眼”星座项目发布

本文转自武汉大学官微 4月24日&#xff0c;是“中国航天日”&#xff0c;“东方慧眼”智能遥感星座项目在武汉大学宣布正式启动。 针对当前我国卫星遥感存在“成本高、效率低、不稳定、应用少”等诸多问题&#xff0c;“东方慧眼”智能遥感卫星星座计划通过卫星星座组网观测、…

【环境配置】Window上Git clone 如何提高速度

步骤一&#xff1a;得到ip 在下列网站上 https://www.ipaddress.com/ 分别搜索&#xff1a; github.global.ssl.fastly.netgithub.com然后记录得到的IP地址 步骤二&#xff1a; 修改host 在Windows中&#xff0c;先进入&#xff1a;C:\Windows\System32\drivers\etc 目录 …

MySQL: 数据类型之整数型、浮点数、时间日期

目录 前言&#xff1a; 数据类型&#xff1a; 整数型&#xff1a; 浮点数与定点数&#xff1a; 浮点数&#xff1a; 定点数&#xff1a; 日期与时间&#xff1a; DATATIME: DATE&#xff1a; TIMESTAMP: ​编辑 YEAR: TIME: 前言&#xff1a; 前面的几篇写了如何创…

css-设置单行文本溢出省略号,使用overflow:hidden属性之后的出现的问题几解决办法。

1 设置单行文本溢出后出现省略号 必要&#xff1a;需要设置固定宽度&#xff0c;不允许换行 width: 200px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; 2 设置N行文本…

每天一道大厂SQL题【Day24】华泰证券真题实战(六)

文章目录 每天一道大厂SQL题【Day24】华泰证券真题实战(六)每日语录第24题&#xff1a;需求列表 思路分析答案获取加技术群讨论文末SQL小技巧 后记 每天一道大厂SQL题【Day24】华泰证券真题实战(六) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦…

如何生成以及校验token

1️⃣ What is token&#xff1f; token是令牌的意思&#xff0c;作用就像“通关令牌”一样&#xff0c;持有token的请求会被“放行”&#xff0c;不持有token的请求可以被拦截&#xff08;可以设置白名单使不被拦截&#xff0c;例如登陆请求&#xff09;。 token是由…

Dockere-Compose迁移Gitea部署

Dockere-Compose迁移Gitea部署 ps: 江湖不是打打杀杀&#xff0c;江湖是人情事故。 解释&#xff1a; Gitea&#xff1a;类似于Git的代码版本管理工具。Docker&#xff1a;Docker-Compose&#xff1a; Docker命令&#xff1a; 查看镜像&#xff1a;docker images 删除镜像…

web自动化测试入门篇07 ——— 用例编写技巧

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

idea中导入spring源码错误during working with external system: java.lang.AssertionError

标题:idea中导入spring源码错误during working with external system: java.lang.AssertionError 1.Spring源码编译环境 spring 5.3.1 JDK环境:1.8 Spring版本:5.3.1版本 开发工具:IntelliJ IDEA 2019.10 编译工具:Gradle-6.4-bin 操作系统:windows 10 注&#xff1a; sprin…

分支和循环语句(2)

文章目录 3.2 for循环3.2.1 for语句的语法3.2.2 for循环中的break和continue3.2.3 for语句的循环控制变量3.2.4 一些for循环的变种3.2.5 一道笔试题 3.3 do while循环3.3.1 do语句的语法3.3.2 do语句的特点3.3.3 do while循环中的break和continue 3.4 练习3.4.1 计算 n的阶乘3.…

数据可视化工具汇总:数字孪生产品的得力助手

数字孪生技术是一项快速发展的新兴技术&#xff0c;已经在许多领域得到广泛应用。数字孪生技术不仅可以提供完整的虚拟模型&#xff0c;还可以模拟物理系统的行为。在数字孪生技术的推动下&#xff0c;越来越多的数字孪生产品开始涌现出来&#xff0c;为不同的领域提供支持和解…

2023年保理产品研究报告

第一章 行业概况 1.1 概述 保理&#xff08;Factoring&#xff09;&#xff0c;全称保付代理&#xff0c;又称托收保付&#xff0c;是一种通过将企业的应收账款出售给专业金融机构&#xff08;保理公司&#xff09;来获得资金的融资方式。保理业务通常包括两种类型&#xff1…

数据治理:解决一物多码,多品牌食品集团主数据管理实践

浙江顶誉集团是一家知名的食品加工集团&#xff0c;拥有久久丫、留夫鸭等多个品牌。一直重视企业信息化建设&#xff0c;更是把数字化作为集团的一大发展方向&#xff0c;立志不断加大数字化投入和建设&#xff0c;成为一个数字化的企业。因此&#xff0c;该企业与亿信华辰合作…

如何通过FAQ页面减轻客户支持压力,提高工作效率?

作为现代企业不可或缺的一部分&#xff0c;客户支持服务是为客户提供解决方案、回答问题和解决技术难题的关键部分。无论是产品管理还是销售环节&#xff0c;客户支持都是重要的一环。然而&#xff0c;有效地处理技术支持问题和客户请求并不容易。卓越的客户支持需要组织结构&a…

CCFC22102B 时钟分析

CCFC2012BC基于国芯科技自主PowerPC架构C*Core CPU内核研发&#xff0c;是一款汽车电子中高端车身及网关控制芯片&#xff0c;可广泛应用于车身控制和网关以及新能源车的整车控制&#xff0c;实现对国外产品如NXP&#xff08;恩智浦&#xff09;MPC5604BC、MPC5607B系列以及ST的…

Seurat -- variable features select

brief seurat提供的教学里面包含了Standard pre-processing workflow,workflow包括QC&#xff0c;normalization&#xff0c;scale data &#xff0c;detection of highly variable features。其中 normalization就有蛮多方法的&#xff0c;seurat自己就提供了两种&#xff0c…

OpenGL入门教程之 坐标系统

原文文章 原文链接  本文仅对有代码的地方做讨论。 投影矩阵 创建一个正射投影矩阵 glm::ortho(0.0f, 800.0f, 0.0f, 600.0f, 0.1f, 100.0f);第一二个参数指定了平截头体的左右坐标&#xff0c;第三四个参数指定了平截头体的底部和上部&#xff0c;第五六个参数指定了近平面…