做FPGA項(xiàng)目,最怕啥?
資源爆表!Timing炸裂!布線卡死!
今天我給大家總結(jié)10個(gè)實(shí)戰(zhàn)級優(yōu)化技巧,每條都有具體案例,助你從根源上搞定資源問題!
技巧一:減少不必要的總線寬度
問題實(shí)例:
原代碼:
reg [255:0] data_bus;
實(shí)際上每次只用前32位。
優(yōu)化做法,改成需要的實(shí)際位寬:
改成:
reg [31:0] data_bus;
LUT減少了90%,走線壓力降低!
技巧二:移位替代小乘法
問題實(shí)例:
assign out =in* 4;
優(yōu)化做法:
assign out =in<< 2;
完全用LUT實(shí)現(xiàn),DSP零占用!
技巧三:啟用資源共享
設(shè)置方法(Vivado):
在opt_design階段加參數(shù):
opt_design -resource_sharing on
如果你只想對某些模塊資源共享,可以在Verilog代碼里加屬性控制:
(* use_dsp ="yes", resource_sharing ="yes"*) module your_compute_block (...);
這樣可以更精細(xì)地控制哪些邏輯共享,哪些不共享。
好處LUT/FF/DSP資源大幅節(jié)省,特別適合大面積重復(fù)運(yùn)算設(shè)計(jì)。
風(fēng)險(xiǎn)可能帶來額外MUX切換邏輯,使得時(shí)序(Timing)稍微惡化。
禁用場景極限高速設(shè)計(jì)(>400MHz以上)、低延遲關(guān)鍵路徑模塊,建議慎用或局部使用。
驗(yàn)證需要配合Report(比如report_utilization和report_timing_summary)檢查,確保資源節(jié)省大于時(shí)序代價(jià)。
適用于大量重復(fù)的加法、乘法邏輯,資源利用率直接提升20%以上。
技巧四:優(yōu)化狀態(tài)機(jī)編碼
問題實(shí)例:
默認(rèn)綜合大狀態(tài)機(jī),導(dǎo)致占用大量觸發(fā)器。
優(yōu)化做法: 在Verilog中加指令:
(* fsm_encoding ="onehot"*) reg [7:0] state;
One-Hot編碼,時(shí)序更好,LUT使用下降!
技巧五:降低組合邏輯深度
問題實(shí)例:
大量if-else嵌套:
if(a) begin if(b) begin if(c) begin ...
導(dǎo)致綜合出的LUT鏈超長,Timing很難收斂。
優(yōu)化做法:
拆分成多個(gè)小模塊,每層只管一件事。
技巧六:充分利用Block RAM和UltraRAM
問題實(shí)例:
有些人用reg數(shù)組實(shí)現(xiàn)大規(guī)模存儲,比如:
reg [31:0] mem_array [0:1023];
Vivado可能默認(rèn)推成觸發(fā)器堆棧,嚴(yán)重浪費(fèi)LUT/FF資源。
優(yōu)化做法:
強(qiáng)制指示綜合器用Block RAM:
(* ram_style ="block"*) reg [31:0] mem_array [0:1023];
或者寫成標(biāo)準(zhǔn)雙端口RAM結(jié)構(gòu),Vivado自然推導(dǎo)。
存儲轉(zhuǎn)BRAM/URAM,節(jié)省90%以上的邏輯資源!
技巧七:精簡控制邏輯,少寫“變態(tài)大if-else”
問題實(shí)例:
復(fù)雜判斷邏輯:
if(mode1 &&enable) begin ... endelseif(mode2 && ~enable&& ready) begin ... endelseif(...)
導(dǎo)致大量LUT拼接、布線惡化。
優(yōu)化做法:
改成干凈的case語句或者簡單解碼器方式處理:
case(current_mode) MODE1:if(enable) ...; MODE2:if(ready) ...; ... endcase
邏輯清晰,綜合優(yōu)化空間大,減少綜合時(shí)間!
技巧八:審查Reset邏輯,減少全局復(fù)位
問題實(shí)例:
always @(posedge clk or posedge rst) begin if(rst) q <= 0; ??else ? ? q <= d; end
Vivado需要為每個(gè)復(fù)位信號單獨(dú)布線,增加布線擁堵和時(shí)序壓力。
優(yōu)化做法:
不重要的寄存器(如數(shù)據(jù)路徑暫存器)去掉Reset
重要控制信號保持Reset
可以考慮使用異步小范圍復(fù)位,減少全局影響
減少Reset數(shù)量,布線更容易,F(xiàn)max提高明顯!
技巧九:保持同步設(shè)計(jì),避免異步邏輯污染
問題實(shí)例:
寫異步模塊,比如:
always @(posedge clk1) begin data1 <= input; end always @(posedge clk2) begin ? output <= data1; end
不同Clock域硬懟在一起,沒有同步器,極易出錯(cuò),而且Vivado綜合器無法優(yōu)化,資源浪費(fèi)嚴(yán)重。
優(yōu)化做法:
用標(biāo)準(zhǔn)兩級同步器跨Clock域
控制時(shí)序收斂,明確時(shí)鐘區(qū)域分界
同步跨域例子:
always @(posedge clk2) begin sync_stage1 <= data1; ? sync_stage2 <= sync_stage1; end
避免隱性時(shí)序錯(cuò)誤,同時(shí)資源更可控。
技巧十:及早加約束,及時(shí)做時(shí)序仿真
問題實(shí)例:
很多項(xiàng)目前期只堆代碼,不加任何XDC/SDC約束,最后實(shí)現(xiàn)時(shí)才發(fā)現(xiàn):
WNS(Worst Negative Slack)嚴(yán)重
TNS(Total Negative Slack)爆表
布線卡住,資源亂用
優(yōu)化做法:
每新增模塊,立刻補(bǔ)充基本時(shí)序約束(比如create_clock、set_input_delay、set_output_delay)
每次綜合后跑一次時(shí)序仿真(Functional/Timing仿真)
早發(fā)現(xiàn)邏輯、早調(diào)整設(shè)計(jì)架構(gòu)!
綜合收斂早、實(shí)現(xiàn)時(shí)間短、避免后期爆炸性加班!
本文轉(zhuǎn)載自O(shè)PENFPGA公眾號
-
FPGA
+關(guān)注
關(guān)注
1646文章
22059瀏覽量
619238 -
總線
+關(guān)注
關(guān)注
10文章
2961瀏覽量
89841 -
RTL
+關(guān)注
關(guān)注
1文章
390瀏覽量
61199
原文標(biāo)題:FPGA資源爆表了?10個(gè)RTL優(yōu)化實(shí)戰(zhàn)技巧
文章出處:【微信號:FPGA研究院,微信公眾號:FPGA研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
優(yōu)化 FPGA HLS 設(shè)計(jì)
PCB設(shè)計(jì)中EMI控制原理與實(shí)戰(zhàn)技巧
2013(北京)高性能電源技術(shù)分享與實(shí)戰(zhàn)技術(shù)研討會
FPGA應(yīng)用開發(fā)實(shí)戰(zhàn)技巧精粹
無線充電實(shí)戰(zhàn)技術(shù)交流 坐標(biāo)深圳
怎么利用Synphony HLS為ASIC和FPGA架構(gòu)生成最優(yōu)化RTL代碼?
華碩Realtek RTL8111b/10/100/1000
RTL功耗優(yōu)化

湖南公安機(jī)關(guān)舉行警用無人機(jī)實(shí)戰(zhàn)技能比武演練活動(dòng)
用Elaborated Design優(yōu)化RTL的代碼

RTOS應(yīng)用程序設(shè)計(jì)的五個(gè)實(shí)戰(zhàn)技巧
擺脫自建庫的繁瑣,EDA元件庫轉(zhuǎn)cadence原理圖封裝庫實(shí)戰(zhàn)技巧

英諾達(dá)推出RTL功耗優(yōu)化工具
提升AI訓(xùn)練性能:GPU資源優(yōu)化的12個(gè)實(shí)戰(zhàn)技巧

評論