【Verilog 基础】阻塞赋值和非阻塞赋值的区别
目录
阻塞赋值
非阻塞赋值
实际工程仿真
阻塞赋值仿真
编写Verilog代码
编写测试文件代码
综合看RTL图
进行实际仿真
非阻塞赋值仿真
编写Verilog代码
编写测试文件代码
综合看RTL图
实际仿真图
总结
阻塞赋值
阻塞赋值的赋值号用 “=” 表示,对应的电路结构往往于触发闫妮没有关系,只与输入电平的变化有关系。它的操作可以认为是只有一个步骤的操作,即计算赋值号右边的语句并更新赋值号左边的语句,此时不允许有来自任何其他Verilog语句的干扰,直到现行的赋值完成,才允许下一条的赋值语句的执行。
串行块也就是begin end,各条阻塞赋值语句将以它们在顺序块中的排列次序依次执行。
非阻塞赋值
非阻塞赋值的赋值号用 “<=” 表示,对应的电路结构往往与触发沿有关系,只有在触发沿的时刻才能进行非阻塞赋值。
它的操作可以看作为两个步骤的过程:在赋值结束时刻,更新赋值号左边的语句。
在计算非阻塞语句赋值号右边的语句更新赋值号左边的语句期间,允许其他的Verilog语句同时进行操作。
非阻塞左槽只能用于对寄存器类型变量(reg)进行赋值,因此只能用于 “initial” 和 "always" 块中,不允许用于连续赋值 “assign” 。
实际工程仿真
阻塞赋值仿真
编写Verilog代码
首先是阻塞赋值仿真(blocking),利用 “=” 进行赋值,表示阻塞赋值。
module blocking
( input wire clk,input wire rst_n,input wire [1:0] in,output reg [1:0] out);reg [1:0] in_reg;always @(posedge clk or negedge rst_n) beginif (rst_n == 1'b0) beginin_reg = 2'b0;out = 2'b0;endelse beginin_reg = in;out = in_reg;end
end
endmodule
编写测试文件代码
`timescale 1ns / 1nsmodule tb_blocking();reg clk;reg rst_n;reg [1:0] in;wire [1:0] out;initial beginclk = 1'b1;rst_n <= 1'b0;in <= 2'b0;#20rst_n <= 1'b1;endalways #10 clk = ~clk;always #10 in <= {$random} % 4;blocking tb_blocking(.clk(clk),.rst_n(rst_n),.in(in),.out(out));
endmodule
综合看RTL图
可以看到只有一个寄存器,因此在实际的仿真图显示的应该是in_reg和out信号应该同时变化,并且两路信号都延时in信号一拍。
进行实际仿真
与预想的一致
非阻塞赋值仿真
编写Verilog代码
如下:只需要将阻塞赋值的代码将 “=” 改成 “
module blocking
( input wire clk,input wire rst_n,input wire [1:0] in,output reg [1:0] out);reg [1:0] in_reg;always @(posedge clk or negedge rst_n) beginif (rst_n == 1'b0) beginin_reg <= 2'b0;out <= 2'b0;endelse beginin_reg <= in;out <= in_reg;end
end
endmodule
编写测试文件代码
和阻塞赋值的测试文件一样
`timescale 1ns / 1nsmodule tb_blocking();reg clk;reg rst_n;reg [1:0] in;wire [1:0] out;initial beginclk = 1'b1;rst_n <= 1'b0;in <= 2'b0;#20rst_n <= 1'b1;endalways #10 clk = ~clk;always #10 in <= {$random} % 4;blocking tb_blocking(.clk(clk),.rst_n(rst_n),.in(in),.out(out));
endmodule
综合看RTL图
可以看到有两个寄存器,从in信号赋值给in_reg信号中有一个寄存器,再从in_reg信号赋值给out信号中也有一个寄存器,因此在实际的仿真图显示的应该是in_reg信号相对于in信号延时一拍,而out信号相对于in_reg延时一拍,也就是相对于in信号延时两拍。
实际仿真图
与观察RTL图后设想的一致。
总结
阻塞赋值和非阻塞赋值在实际使用上不能随意乱用,否则可能会出现难以预估的后果,根据官方给出的建议,在编写组合逻辑电路时,使用阻塞赋值;在编写时序逻辑时,使用非阻塞赋值。
【Verilog 基础】阻塞赋值和非阻塞赋值的区别相关推荐
- verilog中阻塞赋值与 非阻塞赋值的区别
非阻塞(Non_Blocking)赋值方式( 如 b <= a; ), 块结束后才完成赋值操作,值并不是立刻就改变的, 这是一种比较常用的赋值方法.(特别在编写可综合模块时). 阻塞(Block ...
- verilog reg赋初值_Verilog语法之六:阻塞赋值与非阻塞赋值
本文首发于微信公众号"花蚂蚁",想要学习FPGA及Verilog的同学可以关注一下. 一.初步理解阻塞赋值与非阻塞赋值 在Verilog HDL语言中,信号有两种赋值方式: (1) ...
- Verilog中阻塞赋值和非阻塞赋值的区别
Verilog中阻塞赋值(=)和非阻塞赋值(<=)的区别 **阻塞赋值:**前面语句执行完,才可执行下一条语句:即:前面语句的执行(b=a)阻塞了后面语句的执行(c=b).即:always块内, ...
- 通过举例谈谈阻塞赋值与非阻塞赋值的区别
这篇博客,通过举例说明:非阻塞赋值和阻塞赋值的区别? 一般非阻塞赋值用于时序逻辑,而阻塞赋值用于组合逻辑: 非阻塞赋值语句是并行执行的,等到一个时钟完成后才完成赋值,而阻塞赋值是顺序执行的,下一条赋值 ...
- 07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档...
芯航线--普利斯队长精心奉献 实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理: 阻塞赋值,操作符为"=","阻塞"是指在进程语句(initia ...
- 查询框赋值后不可编辑_【技巧分享】阻塞赋值与非阻塞赋值
原创 小黑同学 明德扬FPGA科教 关于阻塞赋值和非阻塞赋值的问题,明德扬的学员提得比较多,今天小黑老师专门给大家普及一下阻塞赋值和非阻塞赋值的相关知识. 一.概述 1.阻塞赋值对应的电路往往与触发沿 ...
- (13)FPGA面试题阻塞赋值与非阻塞赋值
1.1 FPGA面试题阻塞赋值与非阻塞赋值 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题阻塞赋值与非阻塞赋值: 5)结束语. 1.1.2 本节引言 &q ...
- FPGA阻塞赋值与非阻塞赋值用法
1.1 FPGA阻塞赋值与非阻塞赋值用法 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA阻塞赋值与非阻塞赋值用法: 5)结束语. 1.1.2 本节引言 &quo ...
- 把变量赋值给寄存器_阻塞赋值和非阻塞赋值的区别与记忆
罗成:Verilog语法之六:阻塞赋值与非阻塞赋值zhuanlan.zhihu.com 通过上面的文章先了解下,阻塞赋值和非阻塞赋值的区别. b<=a; c<=b; 非阻塞赋值 b=a; ...
最新文章
- HDFS_API基本应用
- windows 2012 r2 x64 安装IIS注意事项
- 线性时间复杂度求数组中第K大数
- ubuntu-11.10-server-i386学习笔记-SVN版本服务器安装
- 泽西岛的RESTful Web服务
- jquery 获取键值对中最大值_jQuery的AJAX发送数据键值对
- linux 打zip gz tar,linux把文件压缩成.tar.gz的命令 | PT Ubuntu Blog
- spring 标注 详解
- nginx php上传大小设置
- ES2021 更新的内容!
- hive表存储格式的转化
- 平板电脑办公软件_办公软件便签电脑版免费下载
- Docker 持续推动创新,三款应用为您指引未来趋势
- 软件包管理器前端工具yum的使用
- qt 程序运行终端报错 D:\Program Files\SogouInput\Components\程序异常结束。
- CAD看图软件_CAD图纸管理软件
- 团队分享心得体会_团队合作心得体会总结
- java公众号图片上传_调用微信公众号接口上传图片素材
- 自动化学科前沿讲座分享,作业,自动化与人工智能
- 支持生僻字且自动识别utf-8编码的php汉字转拼音类,支持生僻字且自动识别utf-8编码的php汉字转拼音类_php技巧...