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)算术运算符 +,-,*,/,% 优先顺序 !~ * / % + - << > ...
随机推荐
- 简单了解junit的使用
普通使用: 在没有用测试框架之前,我们要用一个main方法来跑代码,而有了像junit这样的测试框架后,就可以不用次次写个main方法了. 直接上代码,注释里有说明: package com.stuP ...
- L. Right Build bfs
http://codeforces.com/gym/101149/problem/L 给出一个有向图,从0开始,<u, v>表示要学会v,必须掌握u,现在要学会a和b,最小需要经过多少个点 ...
- 求N之下的所有素数
No.1 f=lambda n: [x for x in range(1,n) if not [y for y in range(2,x) if x%y ==0 ]] No.2 def prime(n ...
- BundleConfig包含js,css失败
今天在做mvc项目的时候,引入了bootstrap样式.但是包含css和js的时候出错了 于是我查阅资料,好多人都说后缀名前面不能包含".",于是我把min前面的".&q ...
- [转]SqlServer索引的原理与应用
索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录 ...
- Java中的数据类型——通过示例学习Java编程(5)
作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=15 数据类型用来定义变量可以采用的值,例如,如果变 ...
- 集成SpringMVC, Spring, Mybatis环境
web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app version=" ...
- 将centos6的php5.3升级为5.6
在阿里云主机上,操作系统是Centos6,php版本是5.3.因为安装Yii2.0的需要,我要升级php为5.4.因为还有5.5和5.6,当然要升到高版本了.我决定升到5.6. 首先,按照这里的步 ...
- maven打包错误:No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
[INFO] Scanning for projects...[INFO] ...
- 程序windows上可以上传附件,部署到 linux服务器后出现 “上传目录 不可写” 怎么解决?
这样的问题一般都是linux 下文件读写权限引起的,用 shell 命名到上传附件的目录(如 cd /data/www/project/upload/),然后执行 shell 文件权限设置: 例如 ...