在之前的文章中,我们分别讨论了Verilog HDL里面的“非阻塞赋值”和“阻塞赋值”。用实例分析了如果在一个always块内等式右边的表达式或者变量,是另一个always块内等式左边的表达式或者变量,仿真器在同一个时间(同一个时钟的边沿)内同时执行两个等式,这就会导致竞争产生。并且我们详细分析了在同一个always块里面,如果混合使用“非阻塞赋值”和“阻塞赋值”,所可能出现的结果,并且给出了建议的编码方式。
今天我们继续探讨如何使用Verilog HDL 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@(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(多驱动)的错误,也是必须要进行修改。
今天我们分享了两种情况,都是经常见到的一些问题,很多朋友使用“非阻塞赋值”和“阻塞赋值”进行混合描述的方式,看到仿真没有功能问题的时候,就认为可以了,但是,我们还是要看综合工具能不能支持,能不能得到我们想要的电路,毕竟最终RTL都是要经过综合的,所以希望能大家加深对“非阻塞赋值”和“阻塞赋值”的理解,多使用我们推荐的描述方式。
页面更新:2024-05-20
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号