Verilog学习笔记基本语法篇(三)·········赋值语句(待补充)
在Verilog HDL语言中,信号有两种赋值方式。
A)非阻塞赋值(Non-Blocking)方式(如:b<=a;)
(1)在语句块中,上面语句所赋值的变量不能立即为下面的语句所用;
(2)块结束后才能完成这次赋值操作,赋值的职位上次赋值得到的;
(3)在编写可综合的时序逻辑模块时,这是最常用的复制方法。
B)阻塞赋值(Blocking)方式(如:b=a;)
(1)赋值语句完成后,块才结束;
(2)b的值在赋值语句执行完后立刻改变。
(3)在时序逻辑中使用时,可能会产生意想不到的结果。
补充:
首先规定两个缩写:
RHS--赋值等号右边的表达式或变量可以写作RHS表达式或RHS变量;
LHS--赋值等号左边的表达式或变量可以写作LHS表达式或LHS变量。
B)阻塞赋值
阻塞赋值的详细过程是先计算等号右手方向的RHS的值,这是赋值语句不允许别的任何Verilog语句的干扰,直到它的赋值完成,即把RHS赋给LHS的时刻,才允许别的赋值语句执行。一般可以综合的阻塞赋值不能在RHS设置延迟(零延迟也不可以)。阻塞赋值的执行可以认为是只有一个步骤的操作,即计算RHS的值并更新LHS,此时不允许任何其他语句的干扰,所谓的阻塞的概念就是值在同一个always块中,其后面的赋值语句从概念上来讲是在前面一条语句赋值完成后才执行的。
如果在一个过程块中阻塞赋值的变量RHS正好是另一个always块中阻塞赋值的LHS变量,这两个过程又通过同一个时钟沿触发,这是阻塞赋值会出现问题,有可能出现竞争。如果这两个赋值语句操作由同一个时钟沿触发,则执行的顺序是无法确定的。
module fbosc(y1,y2,clk,rst);
input clk,rst;
output y1,y2;
reg y1,y2;
always @(posedge clk or posedge rst)
begin
if(rst) y1=;
else y1=y2;
end
always @(posedge clk or posedge rst)
begin
if(rst) y2=;
else y2=y1;
end
endmodule
如果清零信号已经从1到0(已经reset过),并且上面的always块比下面的always块的时钟沿早几个皮秒到达,那么最后y1=1,y2=1;但是如果下面的always块的时钟沿先到达,那么输出y1=0,y2=0;这就说明折个模块是不稳定的,肯定会产生竞争和冒险。
A)非阻塞赋值
非阻塞赋值在赋值开始的时刻就开始计算RHS的值,但是到赋值结束的时刻才更新LHS。在计算RHS和更新LHS的时刻其他的Verilog语句,包括其他非阻塞赋值语句都能同时进行计算RHS和更新LHS。非阻塞赋值允许其他的Verilog语句同时进行操作。非阻塞赋值只能用于对存储器型变量进行赋值,因此只能用在initial块和always块中,并且不允许用assign赋值。
非阻塞赋值可以看做两个步骤:
1)在赋值开始时刻,计算非阻塞赋值RHS表达式;
2)在赋值结束时刻,更新非阻塞赋值LHS的值。
module fbosc(y1,y2,clk,rst);
input clk,rst;
output y1,y2;
reg y1,y2;
always @(posedge clk or posedge rst)
begin
if(rst) y1<=;
else y1<=y2;
end
always @(posedge clk or posedge rst)
begin
if(rst) y2<=;
else y2<=y1;
end
endmodule
按照IEEE的标准,两个always块是并行执行的。在复位后,无论哪一个always的有效沿先到达,两个always块中的非阻塞赋值都在赋值开始计算RHS的表达式,而在结束时刻才更新LHS。所以复位之后,无论哪个边沿先到达,y1=1;y2=0是确定的,因为实质上y1被赋值的是信号沿上升时刻的y2的值,此时y2还没有改变,而y2被赋的值是信号上升沿时y1的值;若以后保持rst为零的话,每一个时钟沿到来之后,y1和y2被赋值的都是上一个周期的y2和y1,从结果来看两个赋值语句是并行执行的。
在使用阻塞赋值和非阻塞赋值时的八大原则:
1)时序电路建模时,采用非阻塞赋值;
2)锁存器电路建模时,采用非阻塞赋值;
3)用always块建立组合逻辑模型时,采用阻塞赋值;
4)用always块建立时序和组合逻辑混合电路时,采用非阻塞赋值;
5)不要在同一个always块中同时使用非阻塞赋值和阻塞赋值;
6)不要在一个以上的always块中为同一个变量赋值;
7)用$strobe系统任务来显示用非阻塞赋值的变量值;
8)在赋值时,不要用#0延迟;
Verilog学习笔记基本语法篇(三)·········赋值语句(待补充)的更多相关文章
- Verilog学习笔记基本语法篇(十二)········ 编译预处理
h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应 ...
- Verilog学习笔记基本语法篇(九)········ 任务和函数
task 和 function 说明语句分别用来定义任务和函数,利用任务和函数可以把函数模块分成许多小的任务和函数便于理解和调试.任务和函数往往还是大的程序模块在不同地点多次用到的相同的程序段.输入. ...
- Verilog学习笔记基本语法篇(一)·········数据类型
Verilog中共有19种数据类型. 基本的四种类型: reg型.wire型.integer型.parameter型. 其他类型:large型.medium型.small型.scalared型.tim ...
- Verilog学习笔记基本语法篇(十)········ 常用系统函数
$display 和 $write 任务 格式: $display (p1,p2,...,pn); $write (p1,p2,..,pn); 这两个函数和系统的任务作用是用来输出信息,即将参数p2到 ...
- Verilog学习笔记基本语法篇(七)········ 生成块
生成块可以动态的生成Verilog代码.可以用于对矢量中的多个位进行重复操作.多个模块的实例引用的重复操作.根据参数确定程序中是否包含某段代码.生成语句可以控制变量的声明.任务和函数的调用.还能对实例 ...
- Verilog学习笔记基本语法篇(八)········ 结构说明语句
Verilog中的任何过程都可以属于以下四种结构的说明语句; 1) initial; 2) always; 3) task; 4) function; 1) initial说明语句: 一个程序 ...
- Verilog学习笔记基本语法篇(六)········ 循环语句
在Verilog中存在着4种类型的循环语句,用来控制执行语句的执行次数. 1)forever语句: 连续执行的语句. 2)repeat语句: 连续执行n次的语句. 3)while语句: 执行语 ...
- Verilog学习笔记基本语法篇(四)·········块语句
块语句是指将两条或者两条以上的语句组合在一起,使其在格式上更像一条语句.块语句分为两种: 1)用begin_end语句,通常用来标识顺序执行的语句,用它标识的块称作顺序块: 2)用fork_join语 ...
- Verilog学习笔记基本语法篇(二)·········运算符
Verilog HDL的语言的运算符的范围很广,按照其功能大概可以分为以下几类: (1)算术运算符 +,-,*,/,% 优先顺序 !~ * / % + - << > ...
随机推荐
- centos设置ssh免密码登陆
准备工作: 1.确认本机sshd的配置文件(需要root权限) $ gedit /etc/ssh/sshd_config 找到以下内容,并去掉注释符”#“ RSAAuthentication y ...
- js 正则验证url
var reg = '[a-zA-z]+://[^\s]*';//正则var url = $('#add [name=notice_url]').val();if(url.length >0){ ...
- Mvc 多级控制器 路由重写 及 多级Views目录 的寻找视图的规则
1.那么我们再来看我们需要的访问方式,如下图 如果我们要访问Admin下的TestController里面的Index页面,那么我们输入Test/Index,这个肯定不行的.因为TestControl ...
- How To Install and Secure phpMyAdmin on Ubuntu 12.04(MySQL图形管理)
原文参考链接:https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-phpmyadmin-on-ubun ...
- Java语言中自动生成随机数
参考原文:http://zhidao.baidu.com/link?url=nB3BT69wmUAiSPfKGgK5Q7HOFFP9AIE04AthreRd9yYcwKhUQsQRWlMdMhW1Qm ...
- javascript 流程控制及函数
回顾 基本语法 在html的使用 <script></script> 注释 ///* */ 指令结束符 ;换行 输出 console.log()document.write() ...
- 微信支付v3开发(5) 扫码并输入金额支付
关键字:微信支付 微信支付v3 动态native支付 统一支付 Native支付 prepay_id 作者:方倍工作室 本文介绍微信支付下的扫描二维码并输入自定义金额的支付的开发过程. 注意 微信支付 ...
- 连接MongoDB数据库的配置说明
- win7 x64和win10 x64 windbg 本地调试记录
今天看CSDN和某文档看了win7 64位 和win10 64位 的windbg本地调试内核的办法 win7 x64 Step1:kdbgctrl –db Step2:kdbgctrl –e Step ...
- HDU 1520 Anniversary party (树形DP,入门)
题意:给一棵树,每个节点都有权值,要求选择部分节点出来,使得权值之和最大,但是每对(父亲,儿子)中最多只能挑一个. 思路: 比较入门的题,每个节点可以选也可以不选.若当前节点选的话,孩子必须全部不选: ...