阻塞与非阻塞赋值

时间:2009-07-13

  作者:李秋凤,华清远见嵌入式学院讲师。

  稍微接触过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)、在同一个模块里,同一个变量不能既有阻塞赋值,又有非阻塞赋值
  “本文由华清远见https://www.embedu.org/index.htm提供”


  
上一篇:在uboot里添加yaffs镜像的支持
下一篇:linux-2.6.26内核中ARM中断实现详解(3)

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料