4.3 阻塞赋值与非阻塞赋值

news/2024/7/8 11:40:19

一.Golden Rule

编码原则很多,就阻塞非阻塞赋值而言,新手最需要牢记的是其中三条:

1)      时序逻辑一定用非阻塞赋值”<=”,一旦看到敏感列表有posedge就用”<=”。

2)      组合逻辑一定用”=”,一旦敏感列表没有posedge就用”=”,一旦看到assign就用”=”。

3)      时序逻辑和组合逻辑分成不同的模块即一个always模块里面只能出现非阻塞赋值”<=”或者”=”。如果发现两种赋值并存,一个字”改”,心存侥幸可能会给后续工作带来更多麻烦。

以上三条,对新手而言不必追求为什么,需要的就是条件反射的照章办事。最后说一句,新手可能记不住哪个符号是阻塞赋值,哪个是非阻塞赋值,大家可以数数,”非阻塞赋值”一共5个字,“阻塞赋值“4个字,所以非阻塞用的符号”<=”比阻塞赋值用的符号”=”长。

 

二.电路行为逻辑

第一节给出了三条最基本的编码原则,有个朋友可能会想,按照这三条编码原则写出来的代码会按怎样的逻辑工作呢?这一节就是回答这个问题。首先解释一下阻塞赋值与非阻塞赋值的含义。

阻塞赋值”=”就是说,在这个语句没有执行完之前,后面的语句是不执行的这里执行的含义是指完成变量值的更新

非阻塞赋值”<=”是指,所有的语句可以并发执行,而前面的值是否执行完毕不会影响后面的语句,换句话说,语句的顺序是无关紧要的。

举个例子,假设一个模块,有2个寄存器,b和c,初值都是1。a为输入信号线。在某个时刻,因为某种原因,模块被触发执行。对于组合逻辑而言,一般是输入信号值变了,对于时序逻辑而言,一般是时钟沿到了。首先看组合逻辑:

//    假设输入 : a = 2; b和c初值 = 1
always@(a)
begin
       b = a;     // after run : b = 2
       c = b;     // after run : c = 2
end

由于是阻塞赋值,所以首先执行完第一句b=a,执行完成之后b=2。接着执行c=b,执行完成后c=2,一次仿真结束后 b=c=2;

对于时序逻辑而言,

//    依然假设:  a =2 ;    b和c初值 = 1
always@(posedge clk)
begin
       b <= a;    //  after run : b = 2 
       c <= b;    //  after run : c = 1
end

由于是非阻塞赋值,首先执行第一句b<=a,这时候a = 2,但是还没有执行完第一句的时候,第二句c<=b也执行了,由于第一句没有执行完,b的值还是1,这时候赋值给c的值也是1。执行完毕的结果就是c=1,b=2.等到模块再次被触发的时候c的值更新为2。有个朋友可能就会问了,凭啥第一句执行到一半就该第二句执行呢?到底是第一句先完成赋值呢还是第二句先完成赋值?答案是,谁先完成赋值都没关系,结果是一样的。(在博文4.3Verilog练习4中有一个程序可参考)

为什么说结果一样呢?因为两种赋值方式分别是按照下面的顺序执行的。阻塞赋值,就跟C语言一样,严格按照代码书写的先后顺序执行,所有值都是立即更新,并且在下面的语句中按照新值执行。而时序电路就不一样了,大家可以这么理解时序逻辑的代码行为,一次执行分为两轮:第一轮是所有的左值都先赋给临时变量,第二轮用输入值以及和右值同名的临时变量值去更新左值。比如上面的例子,第一轮,赋给临时变量:tempc=c;tempb=b。第二轮,临时变量更新左值,b = a;c = tempb;output = tempc。从上面的分析也可以看出,组合逻辑的结果与代码顺序直接相关,而时序逻辑与代码顺序没有关系。这就是所谓的顺序执行(组合逻辑)与并发执行(时序逻辑)。

 

三. 总结

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

     • 阻塞(blocking) 赋值语句(b = a):    

       - 完成该赋值语句后才能做下一句的操作;    

       - b的值立刻被赋成新值a;    

       - 硬件没有对应的电路,因而综合结果未知。

 

非阻塞:当前语句的执行不会阻塞下一语句的执行。

    • 非阻塞(non-blocking) 赋值语句(b<= a):     

       - 块内的赋值语句同时赋值;    

       - b的值被赋成新值a的操作, 是与块内其他赋值语句同时完成的;    

       - 建议在可综合风格的模块中使用非阻塞赋值。

 

阻塞赋值和非阻塞赋值如果使用不当会存在冒险和竞争现象,必须按照下面两条准则:

     1)在描述组合逻辑的always块中使用阻塞赋值,则综合组合逻辑的电路结构;

     2)在描述时序逻辑的always块中使用非阻塞赋值,则综合时序逻辑的电路结构。

     

在时钟沿触发的always块中,如果用非阻塞赋值语句对reg型变量赋值;或者当reg型变量经过多次循环其值仍保持不变,则会在综合中生成触发器。若不想生成触发器,而希望用reg型变量生成组合逻辑,则应使用电平触发。

在组合逻辑中,阻塞赋值只与电平有关,往往和触发沿没有关系,可以将其看成并行执行的;在时序逻辑中,非阻塞赋值是并行执行的;因此,优秀的HDL设计,其内部语句也是并行执行的。

转载于:https://www.cnblogs.com/l20902/p/10610906.html


http://www.niftyadmin.cn/n/629176.html

相关文章

laravel mysql 队列_Laravel 基于redis队列的解析

为什么使用队列使用队列的目的一般是:异步执行出错重试解释一下:异步执行: 部分代码执行很耗时, 为了提高响应速度及避免占用过多连接资源, 可以将这部分代码放到队列中异步执行.Eg. 网站新用户注册后, 需要发送欢迎的邮件, 涉及到网络IO无法控制耗时的这一类就很适合放到队列中…

html中偏移量和坐标,页面元素坐标和偏移

鼠标事件1. 客户区坐标位置(clientX/clientY)通过event事件对象的clientX/clientY属性,获得事件发生时鼠标指针在视口的水平垂直坐标2. 屏幕坐标位置(screenX/screenY)通过event事件对象的clientX/clientY属性,获得事件发生时鼠标指针相对于整个屏幕的坐标信息function showCoo…

git连接华为云DevCloud

华为云DevCloud官网华为云DevCloud在代码托管方面的个github很类似&#xff0c;引入了代码仓库的概念&#xff0c;同时需要本地安装git客户端&#xff0c;且只能与git进行连接&#xff0c;从这个角度上讲&#xff0c;DevCloud的代码管理部分就是github的功能&#xff0c;下面对…

html双人游戏,百行HTML 5代码实现四种双人对弈游戏(2)

处理事件绘制完棋盘和棋子&#xff0c;我们来分析一下用户的动作。用户的动作无非就是两种&#xff0c;一种是点击棋盘 table&#xff0c;另外一种就是点击棋子 DIV。难点在点击 table 这里&#xff0c;我们要获知用户点击 table 的位置。传统思路可能是这样&#xff0c;使用 e…

mysql 5.7 python 2 7_Django2.* + Mysql5.7开发环境整合

环境:MAC_OS 10.12python 3.6mysql 5.7.25django 2.2.3前提:python django mysql都已经安装成功可单独运行 DATABASES{default:{ENGINE:django.db.backends.mysql,"USER":"user name","PASSWORD":"your password","NAME":&q…

【PHP 每日函数】第 01 周期

2019 - 02 - 20 array_change_key_case() array_change_key_case(array $arr, [, int $case CASE_LOWER]) : array 说明&#xff1a;将所有键名改为全大写或者小写 $arr [name > 张三,Age > 18,gender > 男, ];// case upper print_r(array_change_key_case($arr, C…

mysql 错误日志和监控日志分离_Oracle监控系统错误日志过程

--创建临时表用来存放系统错误信息create table superflow(cust_id number(10),cust_name varchar2(100),d varchar(50),error_in--创建临时表用来存放系统错误信息create table superflow(cust_id number(10),cust_name varchar2(100),d varchar(50),error_info varchar2(500)…

html基础知识选择题,HTML笔试题目(附答案)HTML基础知识笔试题目(附答案).pdf

1、{HTML 题目 } 在 HTML页面中制作一个图像&#xff0c;想要在鼠标指向这个图像时浮出一条提示信息&#xff0c;应该使用的参数是 :( C ) ( 选择 1 项 )A) POP B) SRC C) ALT D) MSG2、{HTML题目 } 在页面中看不见的表单元素是那种&#xff1f; ( C ) (选择 1 项)A) B )C) D )…