提示:文章完成后,目录可以自动生成,如何生成可以参考右边的帮助文档
前言
一、模块源代码
1.1 程序语句:
1.2 testbench语句:
二、模拟波形
编辑
三、思考题3
(1)模拟波形如下:
(2)模拟波形如下:
总结
前言
通过使用阻塞赋值语句和非阻塞赋值语句来编写两个模块实例,并比较它们之间的区别。
一、模块源代码
1.1 程序语句:
//blocking.v 阻塞赋值模块 module 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("blocking: a = %d, b = %d, c = %d." ,a,b,c); end endmodule //non_blocking.v 非阻塞赋值模块 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
1.2 testbench语句:
`timescale 1 ns/ 100 ps `include "blocking.v" `include "non_blocking.v" module blocking_vlg_tst(); reg [3:0] a; reg clk; wire [3:0] b1, c1, b2, c2; non_blocking non_blocking(clk,a,b2,c2); blocking blocking(clk,a,b1,c1); initial begin clk = 0; forever #50 clk = ~clk; end initial begin a = 4'h3; $display("blocking: a = %d, b1 = %d, c1 = %d, b2 = %d, c2 = %d." ,a,b1,c1,b2,c2); #100 a = 4'h7; $display("blocking: a = %d, b1 = %d, c1 = %d, b2 = %d, c2 = %d." ,a,b1,c1,b2,c2); #100 a = 4'hf; $display("blocking: a = %d, b1 = %d, c1 = %d, b2 = %d, c2 = %d." ,a,b1,c1,b2,c2); #100 a = 4'ha; $display("blocking: a = %d, b1 = %d, c1 = %d, b2 = %d, c2 = %d." ,a,b1,c1,b2,c2); #100 a = 4'h2; $display("blocking: a = %d, b1 = %d, c1 = %d, b2 = %d, c2 = %d." ,a,b1,c1,b2,c2); #100 $display("blocking: a = %d, b1 = %d, c1 = %d, b2 = %d, c2 = %d." ,a,b1,c1,b2,c2); $stop; end endmodule
二、模拟波形
三、思考题3
(1)模拟波形如下:
与non_blocking模块相同,相当于非阻塞赋值。
(2)模拟波形如下:
与blocking相同的模块相当于阻塞赋值。
总结
阻塞赋值和非阻塞赋值的使用原则如下:
(1)时序电路建模时,用非阻塞赋值;
(3)用always写组合逻辑时,使用阻塞赋值;
(4)在同一个always在块中同时建立时序和组合逻辑电路时,使用非阻塞赋值;
(5)在同一个always非阻塞赋值和阻塞赋值不得同时用于块中;
(6)不要在多个always块中赋值相同的变量;
(7)用$strobe用非阻塞赋值显示系统任务的变量值;
(8)赋值时不要使用 #0 延迟。