为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

海绵宝宝撒 2019-09-24 16:22:05

对于绘制硬件图时如何解释阻塞和非阻塞分配,我有些困惑。我们是否必须推断出非阻塞分配会给我们一个寄存器?那么根据此陈述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


查看完整描述

3 回答

?
翻阅古今

最初了解阻塞和非阻塞分配之间的区别肯定有点棘手。但不用担心-有一个方便的经验法则:


如果要always使用块来推断组合逻辑,请使用块分配(=)。如果需要顺序逻辑,请使用always带有非阻塞分配的时钟块(<=)。并不要将两者混为一谈。


您上面的代码可能不是最佳示例。如果不知道您要构建哪种加法器/触发器结构,则存在具有组合反馈路径(很糟糕)的危险。而且,由于你没有输入总线,你基本上要建a,b与c凭空!


但是要回答您的问题,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

遵循经验法则而不在always块内混合阻塞和非阻塞分配的一个重要原因是,混合分配会导致RTL Sims与Gate-sims /真实硬件操作之间的严重仿真失配。Verilog模拟器对待方式=和<=完全不同。阻塞分配意味着“立即将值分配给变量”。非阻塞分配意味着“找出要分配给该变量的内容,并存储起来以备将来使用”。可以阅读以更好地理解它的好论文是:另请参见:http : //www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf


查看完整回答
反对 回复 2019-09-24
?
慕森王

传统的Verilog智慧全都错了。使用阻塞分配给局部变量没有问题。但是,切勿将阻塞分配用于同步通信,因为这是不确定的。

时钟总是块内的非阻塞分配将始终根据语义来推断触发器。

时钟内的阻塞分配是否始终阻塞会触发触发器,这完全取决于其使用方式。如果可以在分配变量之前读取该变量,则将推断出一个触发器。否则,这就像一个临时变量,它将导致一些组合逻辑。


查看完整回答
反对 回复 2019-09-24
?
HUH函数

只想添加到Jan Decaluwe的答案中。尽管绝对正确,但似乎很少有代码实际上使用了Jan Decaluwe的描述。由于Mr.Cummings的原因,混合使用阻塞式和非阻塞式语句现在已成为禁忌。

麻烦的是,大多数地方都避免对局部变量使用阻塞语句,并且Google的即时搜索空间中很少有代码提供了如何完成此操作的示例。我发现Jan提到的唯一编码样式的地方是本文中的获奖代码。而这,我偶然遇到


查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 130 浏览
我要回答
慕课专栏
更多

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信