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

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

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

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

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

邏輯復制后電路
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

可以看到邏輯復制后,組合邏輯的扇出由2變成了1,能夠降低組合邏輯的延遲。當然寄存器復制也是類似的。
四、通過消除代碼中的優(yōu)先級優(yōu)化速度
根據(jù) Altera器件的特點,一般if-else 嵌套長度不要超過7級。那如何通過消除代碼中的優(yōu)先級來優(yōu)化設計的速度?所謂消除優(yōu)先級,就是說設計功能可以通過無優(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
+關注
關注
1660文章
22412瀏覽量
636288 -
寄存器
+關注
關注
31文章
5608瀏覽量
129970 -
時序
+關注
關注
5文章
406瀏覽量
38856
原文標題:FPPA優(yōu)化之時序優(yōu)化
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
FPGA高級時序綜合教程
FPGA中的I_O時序優(yōu)化設計
FPGA時序約束的幾種方法
FPGA時序約束的幾種方法
靜態(tài)時序優(yōu)化策略有哪些?
如何有效的管理FPGA設計中的時序問題
靜態(tài)時序分析在IC設計中的應用
FPGA設計:時序是關鍵
在FPGA設計中,時序就是全部
FPGA中的時序約束設計
數(shù)字IC/FPGA設計中的時序優(yōu)化方法
評論