设计时序逻辑时采用阻塞赋值与非阻塞赋值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
时序逻辑设计
‐‐‐‐‐‐‐‐‐阻塞赋值与非阻塞赋值区别
阻塞式
`timescale 1ps/1ps
module blocking(b,c,a,clk);
output [3:0] b,c;
input [3:0] a;
input clk;
reg [3:0] b,c;
always @(posedge clk)
begin
b = a;
c = b;
$display("Blocking: a = %d, b = %d, c = %d.",a,b,c);
end
endmodule
非阻塞式
`timescale 1ps/1ps
module non_blocking(clk,a,b,c);
output [3:0] b,c;
input [3:0] a;
input clk;
reg [3:0] b,c;
always @(posedge clk)
begin
b <= a;
c <= b;
$display("Non_Blocking: a = %d, b = %d, c = %d.",a,b,c); end
endmodule
Testbench
`timescale 1ps/1ps
module test_tp();
wire [3:0] b1,c1,b2,c2;
reg [3:0] a;
reg clk;
initial
begin
clk = 0;
forever #50 clk = ~clk;
end
initial
begin
a = 4'h3;
$display("____________________________");
# 100 a = 4'h7;
$display("____________________________");
# 100 a = 4'hf;
$display("____________________________");
# 100 a = 4'ha;
$display("____________________________");
# 100 a = 4'h2;
$display("____________________________");
# 100 $display("____________________________");
$stop;
end
non_blocking non_blocking1(.clk(clk),.a(a),.b(b2),.c(c2)); blocking blocking1(.clk(clk),.a(a),.b(b1),.c(c1)); endmodule
Transcript
# ____________________________
# Blocking: a = 3, b = 3, c = 3.
# Non_Blocking: a = 3, b = x, c = x.
# ____________________________
# Non_Blocking: a = 7, b = 3, c = x.
# Blocking: a = 7, b = 7, c = 7.
run
# ____________________________
# Non_Blocking: a = 15, b = 7, c = 3.
# Blocking: a = 15, b = 15, c = 15.
run
# ____________________________
# Non_Blocking: a = 10, b = 15, c = 7.
# Blocking: a = 10, b = 10, c = 10.
run
# ____________________________
# Non_Blocking: a = 2, b = 10, c = 15.
# Blocking: a = 2, b = 2, c = 2.
run
# ____________________________
Author: Apple Cai
Data: 31 Aug 2010