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)算术运算符 +,-,*,/,% 优先顺序 !~ * / % + - << > ...
随机推荐
- AKOJ-1265-输出二叉树
链接:https://oj.ahstu.cc/JudgeOnline/problem.php?id=1265 题意: 我们知道二叉树的先序序列和中序序列或者是中序和后序能够唯一确定一颗二叉树.现在给一 ...
- BZOJ1415(期望dp)
解法: 首先bfs预处理go数组:可可在j点时聪聪在点i是怎样贪心走的,这是为了之后O(1)获取转移线路. 然后dfs记忆化一下f[i][j],代表从i到j的期望,对于每层:将所有情况的期望值相加.边 ...
- 洛谷 P2623 物品选取
https://www.luogu.org/problemnew/show/P2623 https://www.luogu.org/blog/test-1/solution-p2623 重点就是甲类物 ...
- python之 __getattr__、__getattr__、__getitem__、__setitem__ 使用
python之 __getattr__.__getattr__.__getitem__.__setitem__ 使用 __getattr__内置使用点号获取实例属性属性如 s.name,自调用__ge ...
- 关于Chrome和Opera中draw Image()方法无法在canvas画布中绘制图片的问题
var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); var img=d ...
- hdu4419Colourful Rectangle
链接 分别求出7种颜色覆盖的面积. 做法:每种颜色设定一个标号,以二进制表示R:100 G:010 B:001 .这样很明显可以知道RG:110 GB:011 以此类推. 求解时,需要开一个二维标记数 ...
- vs2013修改为双击打开文件
vs2012和vs2013默认是单击打开文件,让人突然就不习惯了,各种不爽. 修改方法: 工具-选项-环境-选项卡和窗口-不勾选允许在预览选项卡中打开新文件.
- 最长上升子序列 O(nlogn)
题意:求一个序列中的最长上升子序列. 平常我用的是N*N做法,但是一遇到需要nlogn时,就被卡的无地自容了. 所以下定决心要学习nlogn做法. 如何实现nlongn哪? 这里要用到一个栈B,记录按 ...
- springBoot + mybatis实现执行多条sql语句出错解决方法
在Idea中执行多条sql语句的修改(mybatis默认的是执行sql语句是执行单条,所以要执行多条的时候需要进行配置) 需要在连接字符串中添加上&allowMultiQueries=true ...
- MQTT进阶篇
我们介绍了最流行的物联网协议MQTT的背景以及基本使用方法.在这篇文章中,我们会继续考察MQTT的高级玩法——与网页应用的交互.MQTT是基于TCP协议实现,基于HTTP的网页应用便无 ...