使用always块描述电路,这两大错误可不要犯了

在之前的文章中,我们分别讨论了Verilog HDL里面的“非阻塞赋值”和“阻塞赋值”。用实例分析了如果在一个always块内等式右边的表达式或者变量,是另一个always块内等式左边的表达式或者变量,仿真器在同一个时间(同一个时钟的边沿)内同时执行两个等式,这就会导致竞争产生。并且我们详细分析了在同一个always块里面,如果混合使用“非阻塞赋值”和“阻塞赋值”,所可能出现的结果,并且给出了建议的编码方式。

今天我们继续探讨如何使用Verilog HDL always块来描述电路的情况。

使用always块描述电路,这两大错误可不要犯了

同一个变量的“非阻塞赋值”和“阻塞赋值”描述

有的时候,我们看到在一些RTL中,针对同一个变量,出现了如下所示的描述:

input clk, rst_n;

input in1, in2;

output out;

reg out;

reg out1;

always@(posedge clk or negedge rst_n) begin

if(!rst_n)

out = 1'b0;

else

begin

out1 = in1 ^ in2;

out <=out1;

end

end

在上面的描述中,我们看到对同一个变量out,既有“非阻塞赋值”,又有“阻塞赋值”描述。在很多仿真case和仿真工具里面,上面的描述功能仿真是正确的,但是如果用Synopsys的综合工具Design Compiler进行综合的话,工具会报出错误,必须修改,才能完成综合。

使用always块描述电路,这两大错误可不要犯了

同一个变量在多个always块内描述

有的时候我们还会看到,对同一个变量在多个always块内部进行描述的情况,请看下面的例子:

always@(posedge clk or negedge rst_n) begin

if(!rst_n)

out <= 1'b0;

else

out <= in1;

end

always@(posedge clk or negedge rst_n) begin

if(!rst_n)

out <= 1'b0;

else

out <= in2;

end

Synopsys的综合工具Design Compiler进行综合的话,工具会报出multi-drive(多驱动)的错误,也是必须要进行修改。

使用always块描述电路,这两大错误可不要犯了

小结

今天我们分享了两种情况,都是经常见到的一些问题,很多朋友使用“非阻塞赋值”和“阻塞赋值”进行混合描述的方式,看到仿真没有功能问题的时候,就认为可以了,但是,我们还是要看综合工具能不能支持,能不能得到我们想要的电路,毕竟最终RTL都是要经过综合的,所以希望能大家加深对“非阻塞赋值”和“阻塞赋值”的理解,多使用我们推荐的描述方式。

展开阅读全文

页面更新:2024-05-20

标签:会报   电路   错误   仿真器   边沿   等式   赋值   表达式   小结   变量   时钟   情况   功能   方式   工具   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top