Verilog延迟语句的运用

转自:https://blog.****.net/changhaizhang/article/details/6933810

module full_adder(a,b,sum);

input a,b;

output reg sum;

always @(a,b) #13 sum = (a & b) ;   或者   always @(a,b) sum = #13 (a & b) ;

endmodule

注意到两个always语句的延迟语句的位置不同,后一个语句称为内部指定延迟

第一个always语句说明在a或b变化后,先阻塞运行,延迟13ns,再根据当前的a,b的值,计算sum的值。这就导致计算得到的sum值可能与13ns之前的不一样。

第二个always语句表示的是a或b变化后,立即计算当前的sum值,13ns后将该值赋给sum,得到的是13ns之前的值。

在相同的Testbench下仿真

module test_fulladder;

// Inputs

reg a;

reg b;

// Outputs

wire sum;

// Instantiate the Unit Under Test (UUT)

full_adder uut (.a(a), .b(b), .sum(sum)    );

      initial begin

           // Initialize Inputs

           a = 0;

           b = 0;

           // Wait 100 ns for global reset to finish

           #10 a =1;

           #11 b =1;

           #11 a =0;

           #25 a = 1;

               // Add stimulus here

end

endmodule

结果如下:

Verilog延迟语句的运用

第一个always语句对应的图

Verilog延迟语句的运用

第二个always语句对应的图

由图可知,在21ns时刻,b变化,此时a=1,b=1,sum=a&b=1,,而第一个图的结果在13ns后即34ns时刻的值却是0,第二个图则是1,。说明第一图是将34ns的计算结果值赋给了sum,而第二图是将21ns的sum计算结果延迟13ns到34ns时刻再赋给sum。因此,两种延迟结构的特点很显而易见了。