阻塞与非阻塞(blocking and non-blocking)
2015-01-07 16:21
441 查看
稍微接触过Verilog HDL的都对阻塞与非阻塞赋值略知一二,也是我们经常强调的重点之一,在课堂上还是有学员问什么不一样呢,为什么我用阻塞赋值也能得出正确的结果呢?
在编写可综合代码的时候,建议大家不要忘了打开RTL网表查看器看看我们自己综合出来的电路是不是自己想要的逻辑。
我就阻塞与非阻塞赋值这个问题详细说明一下。
1、连续赋值
连续赋值语句的硬件实现是:从赋值语句(=)右边提取出的逻辑,用于驱动赋值语句左边的线网(net)
连续赋值语句
module continousassignment(a,b,c);
input a,b;
output c;
assign c=a&b;
endmodule
综合以后,通过网表查看器为上图的结果,线网c由赋值语句的右边的逻辑是组合逻辑a&b简单驱动
2、过程赋值
过程赋值语句的硬件实现是,从赋值语句的(=或<=)右边提取出的逻辑用于驱动赋值语句左边的变量(必需是reg类型)。必须注意的是虽然过程赋值语句是可以出现在initial语句中(仅用于仿真),也可以出现在“always”块语句中,但是只有“always”中的过程赋值语句才能被综合
有两种类型的过程赋值语句:阻塞赋值语句(Blocking Assignment statement)、非阻塞赋值语句(non-Blocking Assignment statement)
2.1、阻塞赋值语句
阻塞赋值语句可以简单描述为,在一个always块中,语句按照从上到下的顺序执行
module blockingassignment (clk ,q1,q2);
input clk;
output [2:0] q1,q2;
reg[2:0] q1,q2;
always @ (posedge clk)
begin
q1=q1+3'b1;
q2=q1;
end
endmodule
综合后的RTL视图如上图所示,每个时钟上升沿触发后,变量q2、q1的值是同步的,q2被赋予了q1更新后的值
2.2、非阻塞赋值语句
非阻塞赋值语句简述为:在一个always 块中,语句是并行执行的
module nonblockingassignment (clk ,q1,q2);
input clk;
output [2:0] q1,q2;
reg[2:0] q1,q2;
always @ (posedge clk)
begin
q1<=q1+3'b1;
q2<=q1;
end
endmodule
从综合结果的RTL查看器可以看到如上图所示,每个时钟触发后,q2被赋予的q1值时上个时钟周期生成的值
从上面可以看出,第一条语句综合出来的结果是一样的,阻塞与非阻塞不同在于它们会影响到后面引用该条语句的逻辑
3、阻塞与非阻塞建模建模原则
1)、组合逻辑使用阻塞语句、时序逻辑使用非阻塞语句;
2)、在同一个模块里,同一个变量不能既有阻塞赋值,又有非阻塞赋值
在编写可综合代码的时候,建议大家不要忘了打开RTL网表查看器看看我们自己综合出来的电路是不是自己想要的逻辑。
我就阻塞与非阻塞赋值这个问题详细说明一下。
1、连续赋值
连续赋值语句的硬件实现是:从赋值语句(=)右边提取出的逻辑,用于驱动赋值语句左边的线网(net)
连续赋值语句
module continousassignment(a,b,c);
input a,b;
output c;
assign c=a&b;
endmodule
综合以后,通过网表查看器为上图的结果,线网c由赋值语句的右边的逻辑是组合逻辑a&b简单驱动
2、过程赋值
过程赋值语句的硬件实现是,从赋值语句的(=或<=)右边提取出的逻辑用于驱动赋值语句左边的变量(必需是reg类型)。必须注意的是虽然过程赋值语句是可以出现在initial语句中(仅用于仿真),也可以出现在“always”块语句中,但是只有“always”中的过程赋值语句才能被综合
有两种类型的过程赋值语句:阻塞赋值语句(Blocking Assignment statement)、非阻塞赋值语句(non-Blocking Assignment statement)
2.1、阻塞赋值语句
阻塞赋值语句可以简单描述为,在一个always块中,语句按照从上到下的顺序执行
module blockingassignment (clk ,q1,q2);
input clk;
output [2:0] q1,q2;
reg[2:0] q1,q2;
always @ (posedge clk)
begin
q1=q1+3'b1;
q2=q1;
end
endmodule
综合后的RTL视图如上图所示,每个时钟上升沿触发后,变量q2、q1的值是同步的,q2被赋予了q1更新后的值
2.2、非阻塞赋值语句
非阻塞赋值语句简述为:在一个always 块中,语句是并行执行的
module nonblockingassignment (clk ,q1,q2);
input clk;
output [2:0] q1,q2;
reg[2:0] q1,q2;
always @ (posedge clk)
begin
q1<=q1+3'b1;
q2<=q1;
end
endmodule
从综合结果的RTL查看器可以看到如上图所示,每个时钟触发后,q2被赋予的q1值时上个时钟周期生成的值
从上面可以看出,第一条语句综合出来的结果是一样的,阻塞与非阻塞不同在于它们会影响到后面引用该条语句的逻辑
3、阻塞与非阻塞建模建模原则
1)、组合逻辑使用阻塞语句、时序逻辑使用非阻塞语句;
2)、在同一个模块里,同一个变量不能既有阻塞赋值,又有非阻塞赋值
相关文章推荐
- 异步与非阻塞的区别(Difference between asynchronous and non-blocking)
- SSIS 阻塞,半阻塞和全阻塞 (Non-blocking, semi-blocking and Fully-blocking) transformations清单
- Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms
- Blocking/Non-Blocking IO and SYN/ASYN IO
- 非阻塞套接字(Nonblocking Sockets) 概述
- Verilog非阻塞赋值的仿真/综合问题 (Nonblocking Assignments in Verilog Synthesis)-上-
- 阻塞(Blocking)和非阻塞(Non-Blocking)
- Verilog非阻塞赋值的仿真/综合问题(Nonblocking Assignments in Verilog Synthesis) -下-
- ISE verilog 综合错误提示:ERROR:Xst:880 - "Johnson_source.v" line 45: Cannot mix blocking and non blocking
- 非阻塞套接字(Nonblocking Sockets) 概述
- non-blocking and blocking mode
- 非阻塞套接字(Nonblocking Sockets) 概述
- verilog behavioral modeling--blocking and nonblocking
- High Performance Ruby Part 3: non-blocking IO and web application scalability
- Mix of blocking and non-blocking assignments to variable <en> is not a recommended coding practice.
- 同步(Synchronous)异步(Asynchronous) 阻塞(Blocking)和非阻塞(Non-blocking)的概念
- 将socket设置为非阻塞(non-blocking)(
- 非阻塞套接字(Nonblocking Sockets) 概述
- Java并发编程实践笔记之—阻塞和中断方法(Blocking and Interruptible Methods)
- Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms