如何解释Verilog中的阻塞与非阻塞分配?

inf*_*oop 24 verilog system-verilog

在绘制硬件图时,我对如何解释阻塞和非阻塞分配感到有些困惑.我们是否必须推断非阻塞分配给我们一个寄存器?然后根据这个陈述c <= a+b ,c将是一个注册权,但不是a和b?

module add (input logic clock,  
output logic[7:0] f);   

logic[7:0] a, b, c;  

always_ff @(posedge clock)  
begin   
  a = b + c;   
  b = c + a;   
  c <= a + b;  
end   

assign f = c;  

endmodule
Run Code Online (Sandbox Code Playgroud)

Jan*_*uwe 43

传统的Verilog智慧完全错了.对局部变量使用阻塞分配没有问题.但是,您不应该使用阻塞分配进行同步通信,因为这是不确定的.

时钟始终块内的非阻塞分配将始终推断触发器,如语义所指示的那样.

时钟总是块内的阻塞分配是否推断触发器取决于它是如何使用的.如果有可能在分配之前读取变量,则将推断出触发器.否则,这就像一个临时变量,它将导致一些组合逻辑.

  • 仍然觉得这个答案很有启发性! (7认同)

Mar*_*rty 28

最初了解阻塞和非阻塞分配之间的差异肯定有点棘手.但没有恐惧 - 有一个方便的经验法则:

如果要always使用块推断组合逻辑,请使用阻塞赋值(=).如果需要顺序逻辑,请使用always带有非阻塞分配的时钟模块(<=).并尽量不要混淆两者.

您上面的代码可能不是最好的例子.在不知道你试图构建什么加法器/触发器结构的情况下,存在组合反馈路径的危险(这很糟糕).而且,由于你没有输入总线,你基本上要建a,bc凭空!

但是要回答你的问题,分配给时钟always块内的任何变量都会推断触发器,除非使用阻塞运算符(=)分配并用作一种局部变量.

module add
  (
   input clock,
   input [7:0] in1,
   input [7:0] in2,
   output logic [7:0] f1, f2, f3, f4, f5
   );   


   // f1 will be a flipflop
   always_ff @(posedge clock) begin
      f1 = in1 + in2;
   end


   // f2 will be a flipflop
   always_ff @(posedge clock) begin
      f2 <= in1 + in2;
   end


   // f3 will be a flipflop
   // c1 will be a flipflop
   logic [7:0] c1;
   always_ff @(posedge clock) begin
      c1 <= in1 + in2;
      f3 <= c1 + in1;
   end


   // f4 will be a flipflop
   // c2 is used only within the always block and so is treated
   // as a tmp variable and won't be inferred as a flipflop
   logic [7:0] c2;
   always_ff @(posedge clock) begin
      c2 = in1 + in2;
      f4 = c2 + in1;
   end


   // c3 will be a flipflop, as it's used outside the always block
   logic [7:0] c3;
   always_ff @(posedge clock) begin
      c3 = in1 + in2;
   end

   assign f5 = c3 + in1;

endmodule
Run Code Online (Sandbox Code Playgroud)

遵循经验法则而不是在always块内混合阻塞和非阻塞分配的一个重要原因是,混合分配会导致RTL sims与gate-sims /实际硬件操作之间严重的模拟不匹配.verilog模拟器对待=<=完全不同.阻止分配意味着"立即将值赋值给变量".非阻塞分配意味着"弄清楚要分配给这个变量的内容,并将其存储起来以便在将来某个时间分配".阅读更好地了解这一点的好文章是:另见:http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf

  • 无论Cummings先生和其他人对此有何评论,混合阻塞和非阻塞分配都会导致模拟/合成不匹配.唯一真正的问题是使用阻塞分配进行通信,这是不确定的.但这严格来说是一个与合成无关的建模/模拟问题. (13认同)