Verilog 如果将异步重置块与同步重置一起使用,会发生什么情况?

Verilog 如果将异步重置块与同步重置一起使用,会发生什么情况?,verilog,Verilog,假设我有一个通用的verilog模块,我想将它导出到两种不同的设计中——一种是同步重置,另一种是异步重置 在这个通用模块中编写always块的正确方法是什么,以便它在这两种设计中都能正常工作?我想我们可以像这样使用异步重置块- always @(posedge clk or negedge reset_) begin if(!reset_) temp <= 'd0; else <do something> end 始终@(posedge clk或negedge重置)开

假设我有一个通用的verilog模块,我想将它导出到两种不同的设计中——一种是同步重置,另一种是异步重置

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

always @(posedge clk or negedge reset_) begin
  if(!reset_) temp <= 'd0;
  else <do something>
end
始终@(posedge clk或negedge重置)开始
如果(!reset_)temp您可以执行以下操作:

always @(posedge clk or negedge async_reset) begin
  if(!async_reset) 
    temp <= 'd0;
  else 
    if (!sync_reset)
      temp <= 'd0;
    else
      <do something> 
end
始终@(posedge clk或negedge async_reset)开始
如果(!async_reset)
温度您可以这样做:

always @(posedge clk or negedge async_reset) begin
  if(!async_reset) 
    temp <= 'd0;
  else 
    if (!sync_reset)
      temp <= 'd0;
    else
      <do something> 
end
始终@(posedge clk或negedge async_reset)开始
如果(!async_reset)

temp A合成工具应该为该触发器的D输入创建一个类似于mux的结构,并且sync_reset是select,它基本上是一个sync_reset结构。然而,它仍然可以创建一个基于负边缘的触发器,或者它可以创建一个没有设置/复位的触发器。这可能取决于合成水平。我个人更喜欢在实例化中使用一个参数来生成类似的内容,该参数将其设置为async/sync。(虽然我基本上属于异步重置阵营,并且我在重置结构的开头使用了重置同步器:))好吧,我仍然不清楚如果我在同步重置时仍然使用异步重置块,并且没有添加如您所示的额外代码,可能会出现什么问题?正如我所说,在FPGA中,我怀疑已经不存在问题触发器;它将已经有一个异步复位;不使用它只会使其处于非活动状态。在一个IC中(你不说你要合成哪个),正如@I Steveo I所说,你可能最终会得到一个触发器,异步复位被合成,这将浪费面积。(有异步复位的触发器比没有异步复位的触发器略大-~15%?)合成工具应该为该触发器的D输入创建一个类似于mux的结构,并且选择同步复位,这基本上是一个同步复位结构。然而,它仍然可以创建一个基于负边缘的触发器,或者它可以创建一个没有设置/复位的触发器。这可能取决于合成水平。我个人更喜欢在实例化中使用一个参数来生成类似的内容,该参数将其设置为async/sync。(虽然我基本上属于异步重置阵营,并且我在重置结构的开头使用了重置同步器:))好吧,我仍然不清楚如果我在同步重置时仍然使用异步重置块,并且没有添加如您所示的额外代码,可能会出现什么问题?正如我所说,在FPGA中,我怀疑已经不存在问题触发器;它将已经有一个异步复位;不使用它只会使其处于非活动状态。在一个IC中(你不说你要合成哪个),正如@I Steveo I所说,你可能最终会得到一个触发器,异步复位被合成,这将浪费面积。(具有异步复位的触发器比不具有异步复位的触发器略大—大约大15%?)