記得Long long time ago,特權(quán)同學(xué)寫過一篇簡(jiǎn)短的博文《M4K使用率》,文章中提到了Cyclone器件的內(nèi)嵌存儲(chǔ)塊M4K的配置問題。文中提到了這個(gè)M4K塊除了存儲(chǔ)大小是有限的4Kbit,它的可配置的Port數(shù)量也是有限的,通常為最大36個(gè)可用port。 當(dāng)時(shí)只是簡(jiǎn)單的提到有這么回事,提醒使用者注意,也沒有具體的談到如何解決或者確切的說應(yīng)該是避免這樣的狀況出現(xiàn)。因此,本文將結(jié)合特權(quán)同學(xué)近期在使用FPGA時(shí),配置片內(nèi)存儲(chǔ)器遇到的一些片內(nèi)資源無法得到充分利用的問題,更深入的探討如何在既有的基礎(chǔ)上優(yōu)化我們的配置,也就是標(biāo)題所言,我們的目標(biāo)是“榨干FPGA的片上存儲(chǔ)資源”。 關(guān)于如何在綜合或布局布線后查看FPGA的片上存儲(chǔ)資源的使用情況,就Quartus II軟件,這里要先教大家?guī)渍校尨蠹以谙到y(tǒng)設(shè)計(jì)完后對(duì)自己的存儲(chǔ)資源情況做到明明白白、心中有數(shù),這對(duì)將來的產(chǎn)品維護(hù)、升級(jí)乃至完全推到重來都是有助益的。很好,想必您已經(jīng)等不及了,那么就ReadyàGo! 在一個(gè)工程完全編譯后,Quartus II會(huì)彈出一個(gè)全新的Compilation Report,首先映入設(shè)計(jì)者眼簾的是Flow Summary頁面。當(dāng)然設(shè)計(jì)者也可以如圖1所示,直接找到菜單欄點(diǎn)擊ProcessingàCompilation Report選項(xiàng)查看。 ![]() 再看Flow Summary頁面,如圖2所示,其他選項(xiàng)這里不說了,就看Total memory bits后圈出來的部分:103,264/165,888(62%)。這里意思也很明白,特權(quán)使用的器件EP2C8Q208C8的片內(nèi)存儲(chǔ)器總大小是 165,888bit,而在該工程中使用了103,264bit,使用率是62%。 ![]() OK,那么我們?cè)賮砜纯丛敿?xì)的存儲(chǔ)資源都用在哪里了。如圖3所示,點(diǎn)開編譯報(bào)告的Analysis&SynthesisàRAM Summary。 ![]() 同時(shí)在頁面右側(cè)就彈出如圖4所示的詳細(xì)的存儲(chǔ)資源分配情況。在這個(gè)頁面的報(bào)告中,我們只能簡(jiǎn)單的看到存儲(chǔ)資源的詳細(xì)使用位置、存儲(chǔ)資源類型(即是使用了專用的片內(nèi)存儲(chǔ)資源還是用邏輯資源構(gòu)造的,顯然用邏輯資源是很浪費(fèi)甚至說不現(xiàn)實(shí)的)、存儲(chǔ)器類型(即RAM/ROM/FIFO等)、存儲(chǔ)器的位寬和深度信息以及存儲(chǔ)量大小,還有就是是否有初始化文件映射。 ![]() 因?yàn)槭蔷C合報(bào)告的一部分,所以不針對(duì)特定的器件給出一些信息,如這里我們可能還會(huì)關(guān)心文章開頭就提到的M4K塊使用數(shù)量甚至是我們所例化的存儲(chǔ)器具體都使用了哪些M4K塊。不用擔(dān)心,咱的這點(diǎn)好奇心開發(fā)商還是能夠滿足的。下面我們就接著打開編譯報(bào)告里的FitteràResource SectionàRAM Summary選項(xiàng)(方法同圖3)。我們可以看到如圖5所示的,哦,很抱歉由于頁寬有限,所以name一欄沒有完全顯示,Location一欄也只是“小荷才露尖尖角”,但是不要緊,只要你領(lǐng)會(huì)精神。先說這個(gè)Location一欄,它就是前面提到設(shè)計(jì)者可能關(guān)心的具體的M4K塊都是哪些,而M4Ks一欄就是使用的M4K塊的數(shù)量,其他選項(xiàng)類同,讀者可以自己分析。看到這些,估計(jì)已經(jīng)是一目了然了,設(shè)計(jì)者對(duì)自己例化的每一個(gè)片內(nèi)存儲(chǔ)器的具體的使用情況都應(yīng)該有所了解。 ![]() 但是,估計(jì)細(xì)心的讀者會(huì)問,我知道了我所例化的每個(gè)存儲(chǔ)器的M4K塊使用數(shù)量,那么我怎么知道是否超出了器件所有的數(shù)量,難道非要等到編譯出 error才行嗎?或者自己在這個(gè)頁面掐指算算再找來handbook比對(duì)一下嗎?非也,其實(shí)用戶只要點(diǎn)開FitteràResource SectionàResource Usage Summary,如圖6所示,里面羅列了非常詳細(xì)的FPGA所有片上資源的使用情況,圈出來的部分也是這里我們需要重點(diǎn)關(guān)注的地方。M4Ks里指明器件的 36個(gè)M4K塊使用了26個(gè),占用率72%;而Total block memory bits和前面綜合報(bào)告里是一樣的,嚴(yán)格的說,這個(gè)數(shù)據(jù)應(yīng)該算是片內(nèi)存儲(chǔ)資源的絕對(duì)使用情況;最后說Total block memory implementation bits選項(xiàng),它是最終實(shí)現(xiàn)到FPGA器件上的片上資源占用情況(注意這里只能是占用而非使用,漢語文字真是博大精深,也許有些時(shí)候兩個(gè)詞怎么用都差不多,但是這里特權(quán)同學(xué)想?yún)^(qū)分這個(gè)概念,所以刻意要提醒大家注意,因?yàn)椋涉及本文的主題,哈哈,不好意思,有點(diǎn)班門弄斧了),它的占用率和M4Ks是一致的,并且必須是一致的。 ![]() 那么好,“工欲善其事,必先利其器”,我們利完器,就來說正事。特權(quán)同學(xué)提出一個(gè)概念,就是FPGA片上資源的利用率,他的公式為:(Total block memory bits/Total block memory implementation bits),對(duì)于該設(shè)計(jì)就是(62% / 72%) = 86.11%,應(yīng)該說是個(gè)不錯(cuò)的數(shù)據(jù)(呵呵,悄悄的告訴你,這個(gè)實(shí)例可是被特權(quán)同學(xué)優(yōu)化過了)。 說完這些概念,我們可以真刀真槍的玩一玩了,理論永遠(yuǎn)只是理論,要提高必須靠實(shí)踐。其實(shí)可以把這個(gè)工程打回原形,退回優(yōu)化前的情況。由于篇幅關(guān)系,這里只討論它優(yōu)化過程中的一個(gè)最顯著的例子。 在這個(gè)工程中,有一連串的8bit數(shù)據(jù)流,第1個(gè)數(shù)據(jù)要和第1280個(gè)數(shù)據(jù)做一些處理。因此,最簡(jiǎn)單的想法就是例化一個(gè)1280*8bit的移位寄存器。并且這個(gè)移位寄存器在第一個(gè)移入的數(shù)據(jù)移出時(shí),要和此時(shí)要正要移入的數(shù)據(jù)做一些處理。但是,在配置移位寄存器的時(shí)候遇到了一些麻煩,如圖8所示,移位寄存器的深度一般是用配置的taps數(shù)量乘以distance值(建議對(duì)移位寄存器配置的相關(guān)知識(shí)還不熟悉的朋友參考特權(quán)同學(xué)的另一篇博文《Cyclone M4K移位寄存器使用》)。而這里distance值最大只能配置為256,需要1280個(gè)寄存器,并且只用一個(gè)taps的想法破滅了,于是思考了下:發(fā)現(xiàn)256*5/128*10/64*20都是可行的辦法。 ![]() 剛開始配置的時(shí)候沒有太多考慮,就選擇了64*20的方案,即配置taps = 24(因?yàn)閠aps值只能為可選的1/2/3/4/5/6/7/8/12/16/24/32/48/64/96/128,這里配置為24個(gè)taps,而使用的時(shí)候取taps輸出的bit159-152,實(shí)際綜合的時(shí)候其實(shí)會(huì)把4個(gè)不用的taps優(yōu)化掉),distance = 64。 如圖8所示。如果你夠細(xì)心,你應(yīng)該發(fā)現(xiàn)了左下角的Resource Usage是6 M4K。 ![]() 然后就著這樣的配置,在編譯后可以使用前面提到的方法查看一下存儲(chǔ)器資源的使用情況。因?yàn)槲覀冎攸c(diǎn)要算FPGA片上資源的利用率,所以還是查看 FitteràResource SectionàResource Usage Summary這個(gè)報(bào)告吧。如圖9所示,這個(gè)報(bào)告中的Total block memory bits和之前沒有變,都是62%,而M4Ks占用多了2個(gè),相應(yīng)的M4Ks占用率和Total block memory implementation bits占用率增加到了78%。計(jì)算一下,(62% / 78%) = 79.5%,下降了近7個(gè)百分點(diǎn)。也許這個(gè)參數(shù)說明不了問題,但是在資源緊張的時(shí)候,這個(gè)問題就是最撓人的問題。 ![]() 再提特權(quán)同學(xué)發(fā)現(xiàn)問題后,如何處置優(yōu)化提高了這里的利用率(實(shí)際上,如果真用EP2C8Q完成這個(gè)工程,也不是非得做這個(gè)優(yōu)化的工作,只不過最終的設(shè)計(jì)是要實(shí)現(xiàn)在向下兼容的EP2C5Q上,所以,就誕生了這篇文章的故事……)?很簡(jiǎn)單,前面其實(shí)都已經(jīng)給了大家暗示,移位寄存器的存儲(chǔ)資源利用率不高不是因?yàn)楸旧泶鎯?chǔ)量大(只有1280*8bit=10Kbit,需要3個(gè)M4K足夠),而是因?yàn)樯傻膖aps占用的port過多,前面配置24個(gè)taps就占用了6個(gè)M4K塊,那么如果配置成12個(gè)taps,distance值為128會(huì)怎樣呢?6個(gè)taps,distance值為256會(huì)怎樣呢?答案馬上揭曉,如圖10所示。其實(shí)兩者都是占用了3個(gè)M4K。這里做的變化就是最終優(yōu)化成功的玄機(jī)。 ![]() 如圖11所示,其實(shí)這個(gè)工程最終實(shí)現(xiàn)到EP2C5Q上是沒有問題的,但是如果沒有類似移位寄存器例子中的一些優(yōu)化,存儲(chǔ)器資源還是很緊張的。 ![]() 說到這里,雖然已經(jīng)洋洋灑灑圖文并茂好長(zhǎng)一篇文章了。但是,還是很想再提一些和FPGA片上存儲(chǔ)資源相關(guān)的問題。關(guān)于Cyclone/Cyclone II的M4K到Cyclone III的M9K,可能還有一些M512,將來不知道會(huì)不會(huì)有什么M32K/M128K/M1M云云的概念出來。但是就特權(quán)同學(xué)對(duì)目前器件使用的一點(diǎn)經(jīng)驗(yàn)上來看,這個(gè)MXX的塊存儲(chǔ)量越大,雖然總的存儲(chǔ)量也會(huì)越來越大(不能否定它能夠滿足片內(nèi)大存儲(chǔ)量應(yīng)用的需求),但是相應(yīng)的在工程需要的很多小存儲(chǔ)應(yīng)用中對(duì)存儲(chǔ)塊的利用率也會(huì)越來越低。因?yàn)椋瑢?duì)于用戶例化的任何一個(gè)存儲(chǔ)器,如果使用M4K塊實(shí)現(xiàn)一個(gè)8bit的512B/256B/128B/64B甚至哪怕只有1B的應(yīng)用,其實(shí)他們都需要占用1個(gè)M4K塊。打一個(gè)更形象更極端的例子,我的設(shè)計(jì)中需要兩個(gè)1*8bit的FIFO(當(dāng)然實(shí)際應(yīng)用中沒有人這么傻,^o^),那么例化完編譯后,我的M4K資源別占用了2個(gè),這就是問題。這也是制約著極大多數(shù)的應(yīng)用中,特權(quán)同學(xué)提到的FPGA片內(nèi)存儲(chǔ)資源利用率無法100%的原因。其實(shí),這也是最近特權(quán)同學(xué)的另一個(gè)項(xiàng)目中搭建的NIOS2平臺(tái),如圖12所示,各種簡(jiǎn)單的外設(shè)都分別要占用一點(diǎn)片內(nèi)存儲(chǔ)器(沒有充分的利用M9K的資源),直接導(dǎo)致整個(gè)利用率很低的原因。針對(duì)與這種情況,不知道器件廠商是否有所考慮,也許對(duì)他們而言,也是處在一種魚和熊掌不可兼得的矛盾之中。 ![]() |