此设计包含一个或多个带活动寄存器或锁存器 异步设置和异步重置。虽然可以构建该电路, 它在面积、功率和 性能。
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
init
在src_rst
高时切换具有中间值的 a,则功率和性能会变得更糟。