目錄
一、模塊運(yùn)行時鐘頻率
二、HDL代碼
1、HDL代碼風(fēng)格
2、HDL代碼邏輯優(yōu)化
三、組合邏輯層數(shù)
1、插入寄存器
2、邏輯展平設(shè)計
3、防止變量被優(yōu)化
四、高扇出
1、使用max_fanout
2、復(fù)位信號高扇出
五、資源消耗
1、優(yōu)化代碼邏輯,減少資源消耗。
2、使用替代資源實(shí)現(xiàn)
六、總結(jié)
前面幾篇文章介紹了“如何寫時序約束”和“如何看懂時序約束報告”,這些知識點(diǎn)都是基礎(chǔ),可以知道設(shè)計的HDL代碼不收斂的位置,但解決時序收斂問題更關(guān)鍵。
FPGA時序不收斂,會出現(xiàn)很多隨機(jī)性問題,上板測試大概率各種跑飛,而且不好調(diào)試定位原因,所以在上板測試前,先優(yōu)化時序,再上板。
今天我們就來嘮一嘮解決時序不收斂的問題,分享常用的解決辦法。
一、模塊運(yùn)行時鐘頻率
設(shè)計模塊前,需明確模塊運(yùn)行的最大時鐘頻率。
不同時鐘頻率下,對應(yīng)的時序約束最大延時是不一樣的。
比如100MHz時鐘下運(yùn)行的HDL邏輯,比200MHz時鐘下的HDL邏輯,支持的組合邏輯層數(shù)多。
根據(jù)最大時鐘頻率,來設(shè)計HDL代碼的層級,時鐘頻率越高,插入寄存器要更多,增加流水線級數(shù),減少過長的組合邏輯。
二、HDL代碼
1、HDL代碼風(fēng)格
優(yōu)先參考FPGA開發(fā)軟件提供的HDL Template,比如Vivado的language template。

?
2、HDL代碼邏輯優(yōu)化
對于復(fù)雜的算法代碼邏輯,需要結(jié)合FPGA并行計算和最小處理單位為bit的特性,對邏輯代碼進(jìn)行優(yōu)化實(shí)現(xiàn)。
明確變量最大的數(shù)據(jù)位寬。
邏輯代碼中,一些軟件邏輯實(shí)現(xiàn)起來較復(fù)雜,盡量簡化,刪除掉一些不可能出現(xiàn)的情況。
這部分代碼邏輯,可能需要重復(fù)迭代幾遍實(shí)現(xiàn)才行。
三、組合邏輯層數(shù)
1、插入寄存器
將計算邏輯分成多個時鐘周期實(shí)現(xiàn),這是常用的時序優(yōu)化方法,可以減少過多的組合邏輯層數(shù),但會增加延時。
這里以一個多路輸入求和計算為例
module sum(
input clk,
input [15:0] data_A,
input [15:0] data_B,
input [15:0] data_C,
input [15:0] data_D,
output [17:0] sum_o);
always @(posedge clk) begin
sum_o <= data_A + data_B + data_C + data_D;
end
endmodule
增加寄存器后,改為
module sum(
input clk,
input [15:0] data_A,
input [15:0] data_B,
input [15:0] data_C,
input [15:0] data_D,
output [17:0] sum_o);
reg [16:0] sum0, sum1;
always @(posedge clk) begin
sum0 <= data_A + data_B;
sum1 <= data_C + data_D;
end
always @(posedge clk) begin
sum_o <= sum0 + sum1;
end
endmodule
2、邏輯展平設(shè)計
優(yōu)化代碼中優(yōu)先級譯碼電路邏輯,主要出現(xiàn)在IF/ELSE結(jié)構(gòu)語句中,這樣邏輯結(jié)構(gòu)被展平,路徑延遲得以縮短。
IF ELSE結(jié)構(gòu)語句存在明顯的優(yōu)先級,建議盡量用CASE語句來替代。
3、防止變量被優(yōu)化
HDL綜合布線軟件會根據(jù)實(shí)際情況,自動優(yōu)化代碼邏輯,可能存在將多個不同寄存器變量合并成一個寄存器變量的情況。
對于不希望被優(yōu)化的變量,可以在變量定義前,添加(* keep = "ture" *)
四、高扇出
高扇出問題,原因是一個寄存器驅(qū)動后級數(shù)超過了它本身的驅(qū)動能力,導(dǎo)致延遲時間過大,不滿足時序。
1、使用max_fanout
在變量定義前,可以添加(* max_fanout = n *),來設(shè)置變量的最大扇出數(shù)n,超過這個扇出數(shù),綜合軟件會自動復(fù)制多份變量。
2、復(fù)位信號高扇出
復(fù)位信號是常見的高扇出問題,主要解決辦法有:
(1)減少復(fù)位信號的使用,能使用使能信號控制的,就用使能信號。
(2)對于大型模塊,復(fù)位信號可以使用BUFG來驅(qū)動復(fù)位信號,可以增加復(fù)位信號的驅(qū)動能力
五、資源消耗
FPGA器件的整個工程資源消耗,不管是LUT還是BRAM等資源,建議不超過80%。
一旦資源消耗超過80%,在布線綜合時,就出現(xiàn)布線資源不夠,導(dǎo)致出現(xiàn)布線擁塞,從而出現(xiàn)了時序不收斂的情況。
布線擁塞也分為全局擁塞和局部擁塞,可能是高扇出信號過多,也可能是局部布線資源不夠用,導(dǎo)致時序路徑過長。
1、優(yōu)化代碼邏輯,減少資源消耗。
在資源不夠用的情況下,建議檢查代碼是否可優(yōu)化,設(shè)置的RAM大小是否過大等等。
2、使用替代資源實(shí)現(xiàn)
在FPGA中實(shí)現(xiàn)RAM時,可以根據(jù)整個資源的使用情況,考慮使用Distributed RAM、URAM等資源來減少BRAM的消耗。
六、總結(jié)
本文分享了時序收斂的一些方法和思路,希望可以給大家?guī)硪稽c(diǎn)啟發(fā)。
本文將不斷定期更新中,碼字不易,點(diǎn)??贊,收??藏一下,不走丟哦
本文由FPGA入門到精通原創(chuàng),有任何問題,都可以在評論區(qū)和我交流哦文章來源:http://www.zghlxwxcb.cn/news/detail-515435.html
您的支持是我持續(xù)創(chuàng)作的最大動力!如果本文對您有幫助,請給一個鼓勵,謝謝。文章來源地址http://www.zghlxwxcb.cn/news/detail-515435.html
到了這里,關(guān)于FPGA時序約束--實(shí)戰(zhàn)篇(時序收斂優(yōu)化)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!