引言
在數(shù)字IC/FPGA設(shè)計的過程中,對PPA的優(yōu)化是無處不在的,也是芯片設(shè)計工程師的使命所在。此節(jié)主要將介紹performance性能的優(yōu)化,如何對時序路徑進行優(yōu)化,提高工作時鐘頻率。
好的優(yōu)化就應(yīng)該是在代碼書寫之前或書寫時進行考慮,設(shè)計完成再進行優(yōu)化,只能是修改代碼。即便如此,修改代碼優(yōu)化設(shè)計速度也是值得提倡的。本文討論了如何減少關(guān)鍵路徑延時、邏輯復(fù)制、插入寄存器增加流水、寄存器平衡、使用并行結(jié)構(gòu)以及消除代碼中的優(yōu)先級等優(yōu)化設(shè)計速度的方法。
一. 組合邏輯中插入寄存器(Pipeline) + 重定時(retiming)
在FPGA或者是數(shù)字IC設(shè)計中,優(yōu)化時序最常用且效果最明顯的方法就是在組合邏輯中插入寄存器,也叫做插入流水線。如下圖所示。

該方法額外插入寄存器增加的時鐘周期延時并不會違反整個設(shè)計的規(guī)范要求,從而不會影響設(shè)計的總體功能性實現(xiàn),也即額外插入的寄存器在保持吞吐量不變的情況下改善了設(shè)計的時序性能,隨之帶來的是面積的增加,因此需要權(quán)衡好面積和時序要求。
很多同學(xué)可能會疑惑,我應(yīng)該在哪里插入寄存器比較好呢?插入寄存器的方法我認為有兩種,一種是人為評估組合邏輯的長度后在組合邏輯中插入寄存器,另外一種就是直接在組合邏輯的輸出直接插入寄存器再由EDA工具自動retiming重定時,如下圖。

什么是retiming重定時并且它的作用是什么呢?retiming就是人為或者是工具在不增加寄存器個數(shù)的前提下,通過改變寄存器的位置來優(yōu)化關(guān)鍵路徑,起到了平衡寄存器件的組合邏輯長度的作用。
注意的是有時候并不需要插入寄存器直接進行retiming也能一定程度上優(yōu)化時序路徑。

DC如何啟動retiming
方法1 自適應(yīng)retiming(Adaptive retiming)
Adaptive retiming一般是處理常規(guī)設(shè)計,關(guān)鍵路徑的組合邏輯基本上是只會移動到相鄰的寄存器。
compile_ultra -retime
方法2 流水線retiming(pipelined retiming)
Pipelined retiming主要處理pipelined設(shè)計,當(dāng)關(guān)鍵路徑比較長時,路徑多打幾拍。綜合時,采用pipelined retiming,會將路徑分攤到多個寄存器中,進而提升頻率。Pipelined retiming一般針對某個模塊進行retiming。相應(yīng)的DC指令如下所示。
# set_optimize_registers 設(shè)置需要retiming的designs模塊,可以使用通配符*set_optimize_registerstrue-design [get_designs piped_adder*] compile_ultra
NOTE:對于retiming對設(shè)計的變動比較大,需要特別關(guān)注formality是否通過,同時在設(shè)計前期比較推薦只對模塊進行retiming,確保設(shè)計的一致性。
二、組合邏輯平衡(操作符平衡)
操作符平衡就是通過合理使用括號來對邏輯進行分組,通過這種技術(shù)可以增加設(shè)計性能,平衡所有輸入到輸出的延時,而整個設(shè)計的功能并不會改變,代價是可能增加部分面積。如下圖所示,通過合理使用括號,平衡乘法操作符,使得輸入到輸出的延時從三級乘法操作減少到兩級。

三、適當(dāng)進行邏輯復(fù)制以優(yōu)化設(shè)計速度
邏輯復(fù)制用于當(dāng)某個信號的扇出比較大時,會造成該信號到各個目的邏輯節(jié)點的路徑變得過長,從而成為設(shè)計中的關(guān)鍵路徑,為了解決這個問題,可以通過在書寫代碼的時候?qū)υ撔盘栠M行復(fù)制,以達到“分擔(dān)”信號扇出過多的目的。邏輯復(fù)制的時候也分為組合邏輯復(fù)制和寄存器復(fù)制,下面例子是將對組合邏輯復(fù)制。
原電路
module ...
wire temp;
assign temp = a & b & c;
always @(posedge clk)begin
q1 <= temp;
if(en)
q2 <= temp;
end
endmodule

邏輯復(fù)制后電路
module ...
wire temp1;
wire temp2;
assign temp1 = a & b & c;
assign temp2 = a & b & c;
always @(posedge clk)begin
q1 <= temp1;
if(en)
q2 <= temp2;
end
endmodule

可以看到邏輯復(fù)制后,組合邏輯的扇出由2變成了1,能夠降低組合邏輯的延遲。當(dāng)然寄存器復(fù)制也是類似的。
四、通過消除代碼中的優(yōu)先級優(yōu)化速度
根據(jù) Altera器件的特點,一般if-else 嵌套長度不要超過7級。那如何通過消除代碼中的優(yōu)先級來優(yōu)化設(shè)計的速度?所謂消除優(yōu)先級,就是說設(shè)計功能可以通過無優(yōu)先級方式來實現(xiàn),對于那些對優(yōu)先級有要求的功能模塊無法使用這個技巧。
有優(yōu)先級的寫法
module ...
always @(posedge clk)begin
if(sel=4'b0001)
sig_out <= 4'b0001;
else if(sel=4'b0010)
sig_out <= 4'b0011;
else if(sel=4'b0100)
sig_out <= 4'b0101;
else if(sel=4'b1000)
sig_out <= 4'b0111;
else
sig_out <= 4'b1001;
end
endmodule

無優(yōu)先級的寫法
假如說上述代碼無優(yōu)先級要求,可以使用并行的case語句將代碼修改為:
module ...
always @(posedge clk)begin
case(sel)
4'b0001: sig_out <= 4'b0001;
4'b0010: sig_out <= 4'b0011;
4'b0100: sig_out <= 4'b0101;
4'b1000: sig_out <= 4'b0111;
default: sig_out <= 4'b1001;
endcase
end
endmodule

-
FPGA
+關(guān)注
關(guān)注
1664文章
22509瀏覽量
639543 -
寄存器
+關(guān)注
關(guān)注
31文章
5620瀏覽量
130455 -
時序
+關(guān)注
關(guān)注
5文章
411瀏覽量
39020
原文標(biāo)題:FPPA優(yōu)化之時序優(yōu)化
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
FPGA高級時序綜合教程
FPGA中的I_O時序優(yōu)化設(shè)計
FPGA時序約束的幾種方法
FPGA時序約束的幾種方法
靜態(tài)時序優(yōu)化策略有哪些?
如何有效的管理FPGA設(shè)計中的時序問題
靜態(tài)時序分析在IC設(shè)計中的應(yīng)用
FPGA設(shè)計:時序是關(guān)鍵
在FPGA設(shè)計中,時序就是全部
FPGA中的時序約束設(shè)計
數(shù)字IC/FPGA設(shè)計中的時序優(yōu)化方法
評論