考虑到我有一个通用的 verilog 模块,我想将其导出到 2 种不同类型的设计 - 一种用于同步重置,另一种用于异步重置。
在这个通用模块中编码一个 always 块的正确方法是什么,以便它在两种设计中都能正常工作?我想我们可以像这样使用异步重置块 -
always @(posedge clk or negedge reset_) begin
if(!reset_) temp <= 'd0;
else <do something>
end
如果我使用同步重置,那么在异步重置设计中,如果时钟开始比重置断言-取消断言晚得多,那么我会遇到问题,因此可能会完全错过所需的重置。
在同步重置中,我们知道 clk 的poseedge 和reset_ 的negedge 总是重合的,那么这有什么问题吗?
你可以这样做:
always @(posedge clk or negedge async_reset) begin
if(!async_reset)
temp <= 'd0;
else
if (!sync_reset)
temp <= 'd0;
else
<do something>
end
然后将一个或另一个重置绑定到 INACTIVE(1'b1
在这种情况下)。如果您要综合到 FPGA,我想它不会在面积或速度上花费您任何代价。如果您要合成到 IC,那么我会检查合成器如何处理它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句