-
2021-05-25 09:47:45
1、阻塞赋值
是顺序执行的,上面一条语句执行完之后,再执行下一行语句,如下图所示:
2、非阻塞赋值
第一行语句执行的时候,并不阻止下面语句的执行,并行执行。如下图所示:
3、使用方法
更多相关内容 -
Verilog中阻塞赋值和非阻塞赋值的正确使用
2020-07-26 00:00:04文章主要介绍Verilog中阻塞赋值和非阻塞赋值的正确使用方法。 -
阻塞赋值和非阻塞赋值的深度理解
2021-05-10 22:55:141.1简单叙述阻塞赋值和非阻塞赋值的区别: (1)阻塞赋值(=)必须是阻塞赋值完成后,才进行下一条语句的执行;赋值一旦完成,等号左边的变量值立即变化。在同一个块中,非阻塞赋值表达式的书写顺序不影响赋值的结果。...1、先看看常问的问题
1.1简单叙述阻塞赋值和非阻塞赋值的区别:
(1)阻塞赋值(=)必须是阻塞赋值完成后,才进行下一条语句的执行;赋值一旦完成,等号左边的变量值立即变化。在同一个块中,非阻塞赋值表达式的书写顺序不影响赋值的结果。硬件没有对应的电路。(要点为串行,立即生效)
(2)非阻塞赋值(<=),在赋值开始时计算表达式右边的值,在本次仿真周期结束时才更新被赋值变量,即赋值不是立即生效的;非阻塞赋值允许块中其他语句同时执行。在同一个块中,非阻塞赋值表达式的书写顺序不影响赋值的结果。硬件有对应的电路。
(要点:并行,不是立即生效,同时执行)
1.2具体例子:移位寄存器
(1)阻塞赋值按照下面的写法生成的并非移位寄存器module pipe( input d, input clk, output q3 ); reg q1,q2,q3; always@(posedge clk) begin q1=d; q2=q1; q3=q2; end endmodule
综合效果如下图所示:
用阻塞赋值实现移位寄存器的代码:
module pipe(
input d,
input clk,
output q3
);
reg q1,q2,q3;
always@(posedge clk)
begin
q3=q2;
q2=q1;
q1=d;
end
endmodule
也就是说,在阻塞赋值的块中,各个语句的顺序不一样,综合出来的结果是不同的。
(2)将上面两个换成非阻塞赋值后,综合出来的结果都是移位寄存器且结果相同。
第一种情况的代码及对应电路module pipe( input d, input clk, output q3 ); reg q1,q2,q3; always@(posedge clk) begin q1<=d; q2<=q1; q3<=q2; end endmodule
第二种情况的代码和对应的电路module pipe( input d, input clk, output q3 ); reg q1,q2,q3; always@(posedge clk) begin q3<=q2; q2<=q1; q1<=d; end endmodule
2、两个多选题
第一个题:ABD
分析原因:不选C的原因,非阻塞赋值也可描述组合逻辑电路,只是这样的代码风格不好。
这个题我也不能确定是不是这样理解,如果您发现有不对的,望您能指点我一下。我不选C是来源于下面:
第二个题:ABD
3、看夏宇闻老师《Verilog数字系统设计教程》的读书笔记
阻塞赋值对应的电路结构往往与触发沿没有关系,只与输入的电平变化有关系;非阻塞赋值对应的电路结构往往与触发沿有关系,只有在触发沿时才有可能发生赋值的情况。
阻塞赋值操作符是“=”,非阻塞赋值操作符是“<=”。
阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上是前一句赋值语句结束后再开始赋值的。
非阻塞赋值的概念是指在赋值操作开始时刻计算RHS表达式,赋值操作结束时刻更新LHS。关键来了,always块里的其他语句是同时进行计算RHS表达式和更新LHS的。非阻塞赋值操作只能对寄存器类型变量进行赋值,因此只能用在“initial”块和“always”块等过程块中,非阻塞赋值不能用于连续赋值(assign语句)。
个人理解:阻塞赋值是指过程块中的语句是串行执行的(即一条语句执行完成才能执行下一条语句);非阻塞赋值是指过程块中的语句是并行执行的,即所有的语句都可以在赋值操作开始时刻同时计算RHS,在赋值操作结束时刻同时更新LHS。8个要点:
(1) 时序电路建模时,用非阻塞赋值(<=)。
(2) 锁存器电路建模时,用非阻塞赋值(<=)。
(3) 用always块建立组合逻辑时,用阻塞赋值(=)。
(4) 在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。
(5) 在同一个always块中不要既用非阻塞赋值又用阻塞赋值。
(6) 不要在一个以上的always块中为同一个变量赋值。
(7) 用$strobe系统任务来显示用非阻塞赋值的变量值。
(8) 在赋值时不要使用#0延迟。4、希望加强记忆的部分内容
(1)KaTeX parse error: Expected 'EOF', got '#' at position 322: …FFFFFF,t_70)(2)#̲0延时赋值:在非阻塞赋值操作前…strobe
(4)verilog层次化事件队列
5、思考题
思考题:
(1) 用电平敏感列表触发条件的always块表示组合逻辑时,应该用哪一种赋值。
阻塞赋值
(2) 用带时钟沿触发条件的always块表示时序电路时,应该使用哪一种赋值?
非阻塞赋值(3) 为什么不能在多个always块中为同一个变量赋值?
可能会导致竞争冒险,即使使用非阻塞赋值也可能产生竞争冒险。因为always块的执行顺序其实是随机的,所以仿真的时候会产生竞争冒险。(4) 为什么不能用$display系统任务来显示用阻塞赋值的变量值?
也就是display命令的执行在非阻塞赋值之前执行
(5) s t o r e 和 store和 store和display这两个显示用系统任务有什么不同?各用于什么场合?
简言之: s t o r e 是 显 示 在 非 阻 塞 赋 值 结 束 后 的 值 。 store是显示在非阻塞赋值结束后的值。 store是显示在非阻塞赋值结束后的值。display是显示在非阻塞赋值操作之前的值。
细节如下:
s t r o b e 和 strobe和 strobe和monitor显示命令是排列在监控事件队列中。在仿真的每一步结束时刻,当该仿真步骤内所有的赋值都完成以后, s t r o b e 和 strobe和 strobe和monitor显示出所有要求显示的变量值的变化。
(6) 仿真器在处理阻塞和非阻塞赋值操作队列过程中有什么不同?
阻塞赋值是由动态事件队列调度的,而非阻塞赋值不是由动态事件队列调度的。
(7) 为什么在可综合verilog模块的设计中,必须注意并遵守本章的8条原则?关键词:避免出现冒险和竞争的现象;保证综合前仿真和综合后仿真一致。
-
IC学习笔记16——阻塞赋值和非阻塞赋值
2022-06-04 10:35:56非阻塞赋值用于时序逻辑,阻塞赋值是用于组合逻辑一、阻塞赋值和非阻塞赋值
1.1 非阻塞赋值
通常非阻塞赋值用于时序逻辑,阻塞赋值是用于组合逻辑。非阻塞赋值语句是并行执行的,等到一个时钟完成后才完成赋值,而阻塞赋值是顺序执行的**,下一条赋值语句要等到上一条赋值语句完成后才能赋值**,并且阻塞赋值是立即完成的;
非阻塞赋值代码如下所示:
always@(posedge clk or negedge rst_n) begin if(rst_n==1'b0) begin b<=1'b0; c<=1'b0; end else begin b<=a; c<=b; end end
电路如下所示:
仿真波形如下所示
在45秒到55秒这个时间内,即使输入信号a发生改变了,信号b和c都不会发生改变,只有在下一个时钟上升沿来之后,b和c的信号才会改变。
图中的红色虚线表示的就是下一个时钟上升沿,在这个时钟上升沿之前,a的值是从1变化为0,在时钟沿之前值是为0。所以这个时钟上升沿之后b的值为0。
同理c的值也是如此,b的值在时钟沿之前值是为1,所以这个时钟上升沿之后c的值为0。可见b,c的值分别是由时钟上升沿之前a,b的值决定。
所以非阻塞赋值是要等到一下一个时钟上升沿发生之后,信号才会发生变化,同时信号的变化是并行的,只受到上升沿之前对应信号的值影响。1.2 阻塞赋值
阻塞赋值代码如下所示:
always@(*) begin b=a+1; c=b+1; end
电路图如下所示:
仿真波形如下所示
因为阻塞赋值是用于组合逻辑,就不涉及时钟信号。
当输入信号a,从0变为1时,b的值立马变成2,而不是1。
同理c的值变为3,是b变化后的值2,再加上1的结果。
由此可见,阻塞赋值当输入信号改变时,输出信号也立即随着改变。而且下一条赋值语句要等到上一条赋值语句完成后才能赋值,上面的例子就是c=b+1,是等待b=a+1的赋值语句完成才赋值的。所以总结一下:
1.非阻塞赋值用于时序逻辑
2.非阻塞赋值所赋值的变化一般是时钟上升沿之后变化
3.变化的值是用时钟上升沿之前的值赋值,不是用时钟上升沿后的值进行赋值
非阻塞赋值第2点和第3点对应到电路上体现出来的特征就是综合出来的电路有触发器。1.阻塞赋值用于组合逻辑
2.输入信号变化时,阻塞赋值所赋值就立刻发生变化
3.变化的值是用之前赋值语句完成后的值赋值,这一点是与非阻塞赋值最大的区别
因为阻塞赋值综合出的电路没有触发器所以没有非阻塞赋值滞后一拍赋值的特性 -
【Verilog 基础】阻塞赋值和非阻塞赋值的区别
2022-03-20 21:53:32非阻塞赋值 实际工程仿真 阻塞赋值仿真 编写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) begin if (rst_n == 1'b0) begin in_reg = 2'b0; out = 2'b0; end else begin in_reg = in; out = in_reg; end end endmodule
编写测试文件代码
`timescale 1ns / 1ns module tb_blocking(); reg clk; reg rst_n; reg [1:0] in; wire [1:0] out; initial begin clk = 1'b1; rst_n <= 1'b0; in <= 2'b0; #20 rst_n <= 1'b1; end always #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) begin if (rst_n == 1'b0) begin in_reg <= 2'b0; out <= 2'b0; end else begin in_reg <= in; out <= in_reg; end end endmodule
编写测试文件代码
和阻塞赋值的测试文件一样
`timescale 1ns / 1ns module tb_blocking(); reg clk; reg rst_n; reg [1:0] in; wire [1:0] out; initial begin clk = 1'b1; rst_n <= 1'b0; in <= 2'b0; #20 rst_n <= 1'b1; end always #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中阻塞赋值和非阻塞赋值的区别
2022-07-05 18:11:09verilog中阻塞赋值和非阻塞赋值的区别 -
Verilog基本语法之阻塞赋值和非阻塞赋值
2021-07-16 10:50:431.阻塞赋值(Blocking) 阻塞赋值,顾名思义即在一个 always 块中,后面的语句会受到前语句的影响,...)阻塞赋值“=”在 begin 和 end 之间的语句是顺序执行,属于串行语句。 在时序逻辑下使用阻塞赋值为例来... -
阻塞赋值和非阻塞赋值
2019-05-11 19:17:06一、阻塞赋值 阻塞赋值的操作符为=; 阻塞赋值的执行可以认为是只有一个步骤的操作:所谓阻塞的...二、非阻塞赋值 非阻塞赋值的操作符为<=; 非阻塞赋值的操作可以看作为两个步骤的过程: 1)在赋值时刻开始时,计... -
Verilog阻塞与非阻塞赋值的区别
2020-08-05 19:14:44本文介绍了Verilog阻塞与非阻塞赋值的区别 -
Verilog中阻塞赋值和非阻塞赋值的区别?
2022-02-12 11:21:35第一种:在时序逻辑电路中使用阻塞赋值,通过综合后的电路可以看出非阻塞赋值综合出来的电路时立即执行赋值操作,和组合逻辑电路特性一致,无缓存功能,out_o直接被优化掉了。 always@(posedge clk or negedge rst... -
FPGA学习 -通过波形图来看阻塞赋值和非阻塞赋值的区别
2021-12-05 21:31:07本文章采用阻塞赋值和非阻塞赋值对比的方式来讨论二者的区别,利用简单的例程+波形图直观查看细小差别。 1.模块文件: module block_nonblock(clk50M,rst_n,a,b,c,out); input clk50M; input rst_n; input a; ... -
阻塞赋值与非阻塞赋值的区别
2020-08-27 10:05:35阻塞赋值的执行可以认为是只有一个步骤的操作,即计算RHS并更新LHS,且不允许其他语句的干扰。 -
verilog中的阻塞赋值和非阻塞赋值的仿真
2021-09-29 23:20:12Verilog中的赋值语句类型主要分为两类,阻塞赋值语句和非阻塞赋值语句,关于赋值赋值语句和非阻塞赋值语句的区别,下面我们将通过实际代码以及仿真结果来进行形象的讲解。 一、阻塞赋值语句 阻塞赋值操作实质... -
verilog语法 — 阻塞赋值和非阻塞赋值
2021-03-22 23:15:58过程赋值语句,又分为阻塞赋值和非阻塞赋值语句。 1. 阻塞赋值 阻塞赋值的语法如下: 寄存器变量 = 表达式 ; 右边表达式的逻辑计算和对左边寄存器变量的赋值是一个统一操作中的两个小操作,这两个小操作之间... -
FPGA(五) 阻塞赋值和非阻塞赋值
2022-04-17 20:14:41一、阻塞赋值 阻塞赋值"=",顾名思义即一条阻塞赋值的语句如果没有执行结束,则会导致后边的语句不能执行,用赋值表达式右边的值去更新左边表达式的值,有一种顺序执行的意思。 always @(posedge clk or negedge ... -
Verilog语法之阻塞赋值和非阻塞赋值
2020-02-07 14:32:06本文转自知乎罗成的文章Verilog语法之六:阻塞赋值与非阻塞赋值 总的文章小白如何快速入门Verilog 本文首发于微信公众号“花蚂蚁”,想要学习FPGA及Verilog的同学可以关注一下。 一、初步理解阻塞赋值与非阻塞赋值 ... -
阻塞赋值和非阻塞赋值的区别--读书总结
2021-07-06 08:43:43非阻塞赋值往往与触发沿有关系,只有在触发沿时才有可能发生赋值的变化; 两个要点 在描述组合逻辑的always块中使用阻塞赋值; 在描述时序逻辑的always块中使用非阻塞赋值; 阻塞的概念:同一个always块中。其... -
阻塞赋值和非阻塞赋值的区别?
2020-03-03 17:00:51阻塞赋值:前面语句执行完,才可执行下一条语句;即:前面语句的执行(b=a)阻塞了后面语句的执行(c=b)。...非阻塞赋值:always块内,2条语句同时执行。即:前面语句的执行(b=a)不会阻塞后面语句的执行(c=... -
阻塞赋值和非阻塞赋值三条黄金使用原则 3 golden rules
2019-11-17 08:59:18阻塞赋值和非阻塞赋值三条黄金使用原则 3 golden rules 1、时序逻辑一定用非阻塞赋值”<=”,一旦看到敏感列表有 posedge 就用”<=”。 2、组合逻辑一定用”=” ,一旦敏感列表没有 posedge 就用”=”,一旦... -
Verilog中阻塞赋值和非阻塞赋值的区别
2019-09-08 17:24:59Verilog中阻塞赋值(=)和非阻塞赋值(<=)的区别 **阻塞赋值:**前面语句执行完,才可执行下一条语句;即:前面语句的执行(b=a)阻塞了后面语句的执行(c=b)。即:always块内,2条语句顺序执行。 **非阻塞赋值:... -
FPGA学习一:阻塞赋值和非阻塞赋值的理解
2018-07-17 21:57:46赋值语句共有两种,即非阻塞赋值,和阻塞赋值。 (1)非阻塞赋值 非阻塞赋值方式所赋值的变量不能立即就为下面语句所用,只有当块结束后才能得到上一次所附的值,这种赋值方式是编写可综合的时序逻辑时常用的赋值... -
【转载】Verilog中阻塞赋值和非阻塞赋值的区别
2020-02-03 20:45:32Verilog中阻塞赋值(=)和非阻塞赋值(<=)的区别 **阻塞赋值:**前面语句执行完,才可执行下一条语句;即:前面语句的执行(b=a)阻塞了后面语句的执行(c=b)。即:always块内,2条语句顺序执行。 **非阻塞赋值:... -
关于阻塞赋值和非阻塞赋值的浅析
2018-01-22 17:16:55原文地址:关于阻塞赋值和非阻塞赋值的浅析作者:SUN_403阻塞和非阻塞语句作为verilog HDL语言的最大难点之一,一直困扰着FPGA设计者,即使是一个颇富经验的设计工程师,也很容易在这个点上犯下一些不必要的错误。... -
verilog仿真中阻塞赋值和非阻塞赋值的先后问题
2020-07-20 16:08:10总是在阻塞赋值和非阻塞赋值这里困惑,今天有空做了个小的仿真实验,终于弄明白了这verilog仿真器中赋值时的规律,有过verilog仿真经验的直接看底部图即可。 首先引起我迷惑的是在verilog仿真的时候,总会设计到一... -
12.28-阻塞赋值和非阻塞赋值
2019-12-28 17:23:358. 请简要描述阻塞赋值和非阻塞赋值的区别? 答:赋值主要由2部分组成,一是右值的计算,二是左值的更新。首先阻塞赋值在完成右值计算之后,立刻完成左值更新,之后才执行下一条语句;而非阻塞赋值会在完成语句块内... -
Verilog中阻塞赋值和非阻塞赋值区别
2016-06-01 17:33:531、阻塞赋值操作符用等号(即 = )表示。“阻塞”是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行。而且阻塞赋值可以看成是一步...