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)算术运算符 +,-,*,/,% 优先顺序 !~ * / % + - << > ...
随机推荐
- JAVA常用知识总结(十二)——数据库(二)
MySQL主从热备份工作原理 简单的说:就是主服务器上执行过的sql语句会保存在binLog里面,别的从服务器把他同步过来,然后重复执行一遍,那么它们就能一直同步啦. 整体上来说,复制有3个步骤: 作 ...
- 111 Minimum Depth of Binary Tree 二叉树的最小深度
给定一个二叉树,找出其最小深度.最小深度是从根节点到最近叶节点的最短路径的节点数量.详见:https://leetcode.com/problems/minimum-depth-of-binary-t ...
- 关于yii2自带验证码功能不显示问题
1,验证码不显示: 首先保证你的controler 里面的captcha方法是可访问的,被分配的权限的,这个在rule里面设置. 第二,保证你的PHP GD插件已经被启用, 第三如果这样还是不显示,那 ...
- 《javascript设计模式》笔记之第七章:工厂模式
在读了这章之后,根据我个人现在的理解,工厂模式就是:将一个类或者一个方法称为一个工厂,然后再将一些模块交给这个工厂,让这个工厂按照给它的不同模块产出不同的实例. 下面为正文: 一:简单工厂: 例子: ...
- 如何在asp.net mvc中添加自定义的HTML辅助种方法
很久没在博客园发表文章了,今天来总结一下如何在asp.net mvc中添加自定义的HTML辅助方法.我们现在设计这么一个目前,利用自定义的HTML方法来渲染一个普通的img标记.直接进入主题吧: 首先 ...
- JS的文本框验证以及form表单的提交阻止
js: 1.只能输入数字 只能输入数字:<input type="text" onkeyup="javascript:ReNumber(this)" /& ...
- 【algorithm】二叉树的遍历
二叉树的遍历 二叉树用例 代码解析: public class BinaryTree { static class TreeNode { Integer val; TreeNode left; Tre ...
- kafka基础四
消费者消费过程(二) 消费组状态机:消息的产生存储消费看似是杂乱无章的,但万物都会遵循一定的规则成长,任何事物的发展都是有迹可循的. 开始消费组初始状态为Stable,经过第一次Rebalance之后 ...
- java面试题(基础部分)
1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.Java有 ...
- MoveWindow和SetWindowPos
SetWindowPos即使里面使用的是一样的矩形参数,有时候SetWindowPos还是会改变窗口的大小,真是坑爹!!! MoveWindow就不会改变 mark一下