在使用高層次綜合,創(chuàng)造高質(zhì)量的RTL設計時,一個重要部分就是對C代碼進行優(yōu)化。Vivado Hls總是試圖最小化loop和function的latency,為了實現(xiàn)這一點,它在loop和function上并行執(zhí)行盡可能多的操作。比如說,在function級別上,高級綜合總是試圖并行執(zhí)行function。
除了這些自動優(yōu)化,directive是用來:
(1) 并行執(zhí)行多個tasks,例如,同一個function的多次執(zhí)行或同一loop的多次迭代。這是流水線結構。
(2) 調(diào)整數(shù)組的物理實現(xiàn)((block RAM),函數(shù),循環(huán)和端口,以提高數(shù)據(jù)的可用性,并幫助數(shù)據(jù)流更快地通過設計。
(3) 提供關于數(shù)據(jù)dependency的信息,或者缺乏數(shù)據(jù)dependency,允許執(zhí)行更多的優(yōu)化。最終的優(yōu)化是修改C源代碼,以消除在代碼中意外的dependency,但是這可能會限制硬件的性能。
本文使用的sample設計是一個matrix multiplier函數(shù)。目標是在每一個時鐘周期處理一個新的sample,并實現(xiàn)數(shù)據(jù)流接口。
優(yōu)化matrix multiplier
solution1
這里使用矩陣乘法器設計,來顯示如何可以完全優(yōu)化基于loop的設計。設計目標是在每個時鐘周期讀取一個使用FIFO接口的sample,同時最大限度地減少了面積。此分析包括一個比較在loop級優(yōu)化和在function級優(yōu)化的方法。
對比loops和function pipeline的使用,創(chuàng)建一個可以處理采樣時鐘的設計。分析設計不符合性能要求的兩個最常見的原因:loops dependency和數(shù)據(jù)流的限制(或瓶頸)。
Step 1:創(chuàng)建并打開Project
找到Design_Optimization lab1文件夾,依次在Command Prompt 窗口輸入vivado_hls –f run_hls.tcl和vivado_hls –p matrixmul_prj
Step 2:綜合分析設計
綜合后的結果:
?
(1)圖中,總的interval為80個時鐘周期。因為每個輸入數(shù)組中都有九個元素,所以設計每輸入讀取需要約九個周期。
(2)interval比latency多一個時鐘周期,所以沒有在硬件上并行執(zhí)行。
(3)interval/latency是由于嵌套loops
I.Product inner loop:
-有一個2個時鐘周期的延遲。
-總的迭代有6個時鐘周期。
II.COL loop:
-它需要1個時鐘輸入和1個時鐘退出。
-它需要8個時鐘周期為每個迭代(1 + 6 + 1)。
-總的有24個周期完成所有迭代。
III.頂層loops每次迭代需要26個時鐘周期,總的loops迭代共78時鐘周期。
為了改善initiation interval,則需要:pipeline loops或pipeline整個function,并比較這兩種結果。當pipelining loops時,loops的initiation interval是監(jiān)控的重要度量指標。即使設計達到loop可以在每個時鐘周期處理一個sample,函數(shù)的initiation interval仍然需要包含函數(shù)內(nèi)的loops來完成所有數(shù)據(jù)的處理。
solution2: Pipeline the Product Loop
Step 1創(chuàng)建solution2,在Product loop下面插入pipeline directive(這里在Directive Editor下選擇pipeline)
?
注意:當pipeline嵌套loop時,通過pipeline最內(nèi)部Loop最大的好處就是,即有利于處理數(shù)據(jù)的sample。高級綜合自動應用loop flattening,折疊嵌套loop,刪除loop轉(zhuǎn)換(本質(zhì)上是創(chuàng)建一個更多迭代的單循環(huán),但時鐘周期整體較少)。
Step 2 綜合設計到RTL級
在綜合過程中,我們得到Console pane中報告的信息,顯示loop flattening是loop Row上執(zhí)行,默認內(nèi)部Interval target為1由于依賴關系不能在loop Product上完成。
?
圖中表明,雖然Product loop已經(jīng)被pipeline,interval為2,但是頂層loop沒有被pipeline。頂層loop不能pipeline的原因是,loop flattening只發(fā)生在loop Row,在loop Col 到Product loop上沒有l(wèi)oop flattening。下面解釋loop flattening不能flatten所有nested loop的原因。
評論