异步重置警告问题



此设计包含一个或多个带活动寄存器或锁存器 异步设置和异步重置。虽然可以构建该电路, 它在面积、功率和 性能。

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

请帮忙

首选解决方案是将重置值设为常量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,这可能不起作用;因为它们往往对具有异步设置/重置的flops的支持有限。您确实用面向 FPGA 的 xilinx 标记了这个问题。你真的需要弄清楚为什么你需要异步设置/重置。尝试让您的代码仅使用同步翻牌(无异步设置/重置)。如果您需要异步设置/重置,请花费额外的精力来弄清楚如何使参数方法工作。

由于这是最后的手段,因此默认情况下不会显示它。

使用单独的异步设置和重置信号统一每个翻牌。

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
逻辑将添加面积。额外的路由和时间,以影响性能稳定。稳定时间也会影响功率。如果initsrc_rst高时切换具有中间值的 a,则功率和性能会变得更糟。

最新更新