异步重置警告问题

时间:2019-06-15 16:31:57

标签: verilog xilinx

该设计包含一个或多个带有效位的寄存器或锁存器    异步设置和异步重置。虽然可以建立此电路,    它在面积,功率和功耗方面创建了次优的实现方式    性能。

Initial_LFSR2 initial_value(RNTI,NCELL_ID,nss,nf,init) ;



always@(posedge scr_clk or posedge scr_rst) begin // Asynchronous Reset 

if(scr_rst) begin
                      LFSR1 <= 31'b1000000000000000000000000000000 ;  
                      LFSR2 <= init ;                     
                      counter <= 0 ; // reinitialized the initialzation steps counter 
                      input_counter <= 0 ; 
            end

请帮助

1 个答案:

答案 0 :(得分:1)

首选解决方案是使LFSR2重设值是一个常数。参数可以是常数/参数的表达式,也可以是将常数/参数作为输入的函数。更改代码可能需要一些努力,但这是获得“ 在面积,功率和性能方面的最佳实现”所需要完成的工作。

parameter LFSR2_INIT = initial_LFSR2_func(RNTI,NCELL_ID,nss,nf);

always @(posedge scr_clk or posedge scr_rst) begin
  if (scr_rst) begin
    LFSR2 <= LFSR2_INIT;
  end
  else begin
    LFSR2 <= next_LFSR2;
  end
end

如果绝对必须由组合逻辑确定复位值,那么有最后一种选择。与参数解决方案相比,它在面积,功耗和性能方面都是“ 次佳的实现方式” ,但可能会比您目前拥有的更好。请注意,init上的逻辑越复杂,“ 次优”就越多。

如果您以FPGA为目标,则可能无法使用;因为他们倾向于通过异步设置/重置对触发器提供有限的支持。您确实使用标记了问题,该问题是针对FPGA的。您确实需要弄清楚为什么根本需要异步设置/重置。尝试使您的代码仅适用于同步触发器(不设置/重置异步)。如果需要异步设置/重置,请花额外的精力来弄清楚如何使参数方法起作用。

由于这是不得已的选择,因此默认情况下不会显示。

  

用独立的异步设置和复位信号统一每个触发器。

wire [LFSR2_WIDTH-1:0] lfsr2_set = {LFSR2_WIDTH{src_rst}} & init;
wire [LFSR2_WIDTH-1:0] lfsr2_rst = {LFSR2_WIDTH{src_rst}} & ~init;
genvar gidx;
generate
  for(gidx=0; gidx<LFSR2_WIDTH; gidx=gidx+1) begin : LFSR2_genblk
    always @(posedge src_clk, posedge lfsr2_rst[gidx], posedge lfsr2_set[gidx]) begin
      if (lfsr2_rst[gidx]) begin
        LFSR2[gidx] <= 1'b0;
      end
      else if (lfsr2_set[gidx]) begin
        LFSR2[gidx] <= 1'b1;
      end
      else begin
        LFSR2[gidx] <= next_LFSR2[gidx];
      end
    end
  end
endgenerate
 逻辑将添加区域。额外的走线和时间,以稳定冲击性能。稳定时间也会影响功率。如果在init为高的情况下src_rst用中间值切换a,则功率和性能会变差。