verilog阻塞与非阻塞的综合


http://blog.chinaunix.net/uid-24203478-id-3031286.html


关于阻塞和非阻塞语句的5大原则:

原则1: 时序电路建模时,用非阻塞赋值。
原则2: 用always块写组合逻辑时,采用阻塞赋值。
原则3: 在同一个always块中不要同时使用非阻塞赋值和阻塞赋值。
原则4: 锁存器电路建模时,用非阻塞赋值。
原则5: 在同一个always块中同时建立时序和组合逻辑电路时,用非阻塞赋值。

最好按照这些原则去做,以免综合出的电路不合要求。

例如:
always@(posedge clk)
begin
    a=a+1;
    b=a-c;
end

always@(posedge clk)
begin
    c=a;
end

endmodule 

b的结果为2。因为b取a赋值后的值,但取c赋值之前的值。
打开Tool->Netlist Viewer->RTL Viever查看综合出的电路如图:

实际上a、b、c触发器的赋值仍然是同时进行的,只不过b会与a同时赋a+1的值。
如改为非阻塞语句:
always@(posedge clk)
begin
    a<=a+1;
    b<=a-c;
end

always@(posedge clk)
 
begin
    c<=a;
end

endmodule 

结果b=1,则综合出电路如下:

区别仅在于b赋a而上面是b赋a+1。

如果是组合逻辑中的阻塞语句:
always@(posedge clk)
begin
    a<=a+1;
end

always@(a)
begin
    b=a+3;
    c=b+7;
end

则综合结束如下:

b、c全由组合逻辑电路实现。
若使用非阻塞语句:
always@(posedge clk)
begin
    a<=a+1;
end

always@(a)
 
begin
    b<=a+3;
    c<=b+7;
end
则综合出的电路和上面一样。因此似乎在组合逻辑中使用非阻塞语句没有意义。因此一般的在组合逻辑中就直接使用阻塞语句。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值