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)算术运算符 +,-,*,/,% 优先顺序 !~ * / % + - << > ...
随机推荐
- Codeforces 1119E(贪心)
题目传送 贪心方法 按边从小到大扫,先凑3个,没凑足的记录一下数量,后面大的优先跟这些凑,俩带走一个,多余的再凑3个,再--就这样走到最后即可. const int maxn = 3e5 + 5; i ...
- 洛谷P4095||bzoj3163 [HEOI2013]Eden 的新背包问题
https://www.luogu.org/problemnew/show/P4095 不太会.. 网上有神奇的做法: 第一种其实是暴力(复杂度3e8...)然而可以A.考虑多重背包,发现没有办法快速 ...
- 将GitLab上面的代码克隆到本地
1.安装GitLab客户端 2.去GitLab服务端找项目路径 3.去GitLab客户端去克隆代码 右键-->git Clone 4.最后结果
- if __FILE__ == $0 end
if __FILE__ == $0 end __FILE__是一个“具有魔力”的变量,它代表了当前文件名.$0是用于启动程序的文件名.那么代码“if __FILE__ == $0”便意味着检查此文件是 ...
- 几款LINUX下的CHM查看器
转帖地址:http://blog.csdn.net/aking21alinjuju/article/details/4436440 本文旨在介绍linux下的常见chm阅读软件及其安装,并针对一些问题 ...
- php后端程序开发学习网站梳理
博主只列举自己经常用到的: 看教学视频:慕课网,网易云课堂,百度传课 看博文和知识点:csdn 看源码:github 刷题:codewars 学习框架:thinkphp官网 下载相关资源:csdn 看 ...
- 导入maven的java web项目运行报错找不到Spring监听器
本地成功运行的一个maven项目,在另一台机器复制下来并导入,运行时报错: java.lang.ClassNotFoundException: org.springframework.web.cont ...
- Chisel语言
1 What is Chisel? Chisel(Constructing Hardware In a Scala Embedded Language)是一种嵌入在高级编程语言Scala的硬 ...
- Selenium私房菜系列10 -- 我遇到的问题及解决问题的方法
Selenium私房菜系列10 -- 我遇到的问题及解决问题的方法
- C# 一维数组 冒泡排序
假设有个三个杯子 一个杯子中有一个紫色的乒乓球 一个没有 一个有红色乒乓球 杯子不能动 怎么把紫色和红色的调换呢 主要是先把紫色的放到空的杯子 在把红的放到紫色原来的杯子 再把 ...