【问题标题】:What happens if we use async reset block with sync reset?如果我们将异步重置块与同步重置一起使用会发生什么?
【发布时间】:2018-10-29 05:12:56
【问题描述】:

假设我有一个通用的 verilog 模块,我想将它导出到 2 种不同的设计 - 一种用于同步重置,另一种用于异步重置。

在这个通用模块中编写 always 块的正确方法是什么,以便它在两种设计中都能正常工作?我在想我们可以像这样使用异步重置块 -

always @(posedge clk or negedge reset_) begin
  if(!reset_) temp <= 'd0;
  else <do something>
end

如果我使用同步重置,那么在异步重置设计中,如果时钟开始比重置断言-取消断言晚得多,那么可能会完全错过所需的重置。

在同步重置中,我们知道 clk 的 posedge 和 reset_ 的 negedge 总是重合的,那有什么问题吗?

【问题讨论】:

    标签: verilog


    【解决方案1】:

    你可以这样做:

    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,那么我会检查合成器对它的作用。

    【讨论】:

    • 综合工具应该为此触发器的 D 输入创建一个类似 mux 的结构,而 sync_reset 是 select,它基本上是一个 sync_reset 结构。然而,它仍然可以创建一个基于 negedge 的翻牌,或者它可以创建一个没有设置/重置的翻牌。这可能取决于综合水平。我个人更喜欢使用实例化参数生成类似的东西,将其设置为异步/同步。 (虽然我基本上属于异步重置阵营,并且我在重置结构的开头使用了重置同步器:))
    • 好吧,如果我仍然在同步重置时使用异步重置块并且不添加您显示的额外代码,我仍然不清楚可能的问题是什么?
    • 正如我所说,在 FPGA 中,我怀疑触发器不存在问题;它已经有一个异步复位;不使用它只会使其处于非活动状态。正如@I Steveo I 所说,在IC 中(你没有说要合成哪个),你最终可能会得到合成异步复位的触发器,这会浪费面积。 (带有异步复位的触发器比没有的略大 - 大约 15%?。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2015-08-20
    • 2019-12-04
    • 2019-11-10
    • 1970-01-01
    • 2012-06-23
    • 2018-12-28
    相关资源
    最近更新 更多