Verilog中阻塞(=)与非阻塞语句(<=)…

阻塞赋值语句(=)与非阻塞赋值语句(<=)
区别叙述如下:
       1、在串行语句中, 阻塞赋值语句按照排列顺序依次执行; 非阻塞赋值语句没有先后之分,并行执行,排在前面语句不影响后面语句( 实质是通过每级之间加一个D触发器实现)。
       2、赋值语句执行时, 阻塞的先计算右端表达式的值,然后立刻将值赋给左边变量; 非阻塞的也是先计算右端表达式的值, 但是要等待延时后再将值赋给左边(同样因为D触发器)。文字叙述起来不直观,我们看例子。
例:下面代码实现一个寄存器
**********************************************************
module resist(din,clk,out1,out2,out3);
  input din,clk;
  output out1,out2,out3;
  reg out1,out2,out3;
  always@(posedge clk)   //上升沿触发
    begin
      out1=din;                   // 使用阻塞赋值语句
      out2=out1;
      out3=out2;
    end
endmodule
**********************************************************
测试代码如下:
**********************************************************
module resist_tb;
  reg din,clk;
  wire out1,out2,out3;
  resist U1(din,clk,out1,out2,out3);
  always #100 clk=~clk;    //时钟周期为200
  initial
  begin
    clk=0;              // clk开始为0
    din=1;
    #350 din=0;    // 传递的数据
    #400 din=1;
    #400 din=0;
    #2000 $finish;
  end
endmodule
**********************************************************
仿真wave图像:
Verilog中阻塞(=)与非阻塞语句(<=)区别 <wbr>-- <wbr>测试代码wave       我们从wave图形上看到 out1、out2、out3是完全相同的。
所以 实际电路是:
Verilog中阻塞(=)与非阻塞语句(<=)区别 <wbr>-- <wbr>测试代码wave明显电路为一寄存器,不过可以同时输出到 out1、out2、out3。
而如若将模型中阻塞赋值语句改为非阻塞赋值语句:
out1=din;                           out1<=din;  
out2=out1;      ---->         out2<=out1;
out3=out2;                       out3<=out2;
测试代码不变,仿真后wave图形为:
Verilog中阻塞(=)与非阻塞语句(<=)区别 <wbr>-- <wbr>测试代码wave
       我们发现out3落后out2一个时钟周期,out2落后out1一个时钟周期;这正是因为非阻塞赋值语句要等待时钟的效果。具体是在一个上升沿到来时,数据din,out1',out2'( '表示上个时钟时的数据), 数据平行(并行)向右移动, out2得到的并不是当前out1,而是上个时钟D触发器存储out1'(=d'),当前out1=d,这样out2要得到din就比out1落后一个时钟周期,同样out3与out2相比,这其中就是由于各个 D触发器的作用
      实际电路即为:
      这两个实质差别就在于非阻塞会引入D触发器, 各个数据必须按时钟节拍从左向右传递,而阻塞赋值语句代码从左往右顺序写不会引入多级D触发器。

你可能感兴趣的:(未分类)