版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、學習vivado第7章Lab1設(shè)計優(yōu)化概述創(chuàng)建高質(zhì)量RTL設(shè)計的一個關(guān)鍵部分是采用高層次綜合擁有優(yōu)化C代碼的能力。高層次綜合經(jīng)常嘗試減少循環(huán)和函數(shù)的延遲。在循環(huán)和函數(shù)中為了獲得這種目的,高層次綜合嘗試執(zhí)行盡可能多的并行操作。在函數(shù)層,高層次綜合經(jīng)常嘗試執(zhí)行并行函數(shù)。除了這些自動優(yōu)化,指令用于:并行執(zhí)行多個任務(wù),例如,相同的函數(shù)多次執(zhí)行或相同的循環(huán)多次迭代。采用流水線。調(diào)整數(shù)組(塊RAM),,函數(shù),循環(huán)和端口的物理實現(xiàn)用以提高數(shù)據(jù)的利用率和幫助數(shù)據(jù)流盡快通過設(shè)計。提供的數(shù)據(jù)相依性的信息,或缺少這些信息,從而可進行更多優(yōu)化。最終的優(yōu)化技術(shù)是修改的C源代碼,以刪除非預期依賴關(guān)系的代碼,這種代碼可能限
2、制了硬件的性能教程是由兩個實驗練習組成。你可以在這些實驗練習中用Analysis perspective來執(zhí)行分析。前提條件是完成了本教程的Design Analysis教程Lab1參照循環(huán)和函數(shù)流水線的使用來創(chuàng)建的設(shè)計能夠在一個時鐘處理一個樣本。這個實驗包括一些例子,這些例子給您機會去分析兩個通常引起不能滿足性能要求導致設(shè)計失敗的原因:循環(huán)依賴關(guān)系和數(shù)據(jù)流限制或瓶頸。Lab2這個實驗展示了怎么從lab1中修改代碼來幫助克服一些在代碼中無意識存在的內(nèi)在的性能限制。教程設(shè)計描述從xilinx網(wǎng)站下載教程設(shè)計文件,在教程設(shè)計中查看信息。教程所用的設(shè)計文件在教程目錄vivado_HLS_Tutori
3、alDesign_Optimization你在實驗練習中使用的樣本設(shè)計是一個矩陣乘法功能。設(shè)計目標是在每個時鐘周期處理一個新的采樣,實現(xiàn)的接口作為數(shù)據(jù)流傳輸接口。Lab1:優(yōu)化矩陣乘法器這個練習使用矩陣乘法器設(shè)計用以展示你如何全面優(yōu)化設(shè)計重點是在循環(huán)設(shè)計上,設(shè)計的目標是用FIFO接口在每個時鐘周期讀一個樣本,同時使用最少資源。這個分析包括了在使用函數(shù)級優(yōu)化的循環(huán)級優(yōu)化方法的比較。這個練習解釋了用戶分析界面視角的基本操作,還有你如何用這個界面來驅(qū)動設(shè)計優(yōu)化。重要:在教程中的圖片和命令假設(shè)教程數(shù)據(jù)路徑vivado_HLS_Tutorial被解壓放置在c:vivado_HLS_Tutorial中。如
4、果教程數(shù)據(jù)目錄解壓縮到不同的位置,或者在Linux系統(tǒng)上,調(diào)整一些路徑名引用到的位置您選擇放置Vivado_HLS_Tutorial目錄。步驟1:創(chuàng)建并打開工程1.打開Vivado HLS 命令提示符a.在windows系統(tǒng)中,采用Start>All Programs>Xilinx Design Tools>Vivado2014.2>Vivado HLS>Vivado HLS 2014.2 Command Prompt,如下圖b.在linux系統(tǒng)下,打開新的shell,2. 用命令提示符窗口,如圖142,從lab1中將目錄切換到RTL Verification教程
5、。3. 執(zhí)行TCL并建立vivado HLS Project,采用的是vivado_hlsf run_hls.tcl如圖142所示4. 當vivado HLS 完成,在用戶界面里打開工程。用vivado_hlsp matrixmul_prj命令打開,如圖1435. 在資源管理器中打開Source文件夾,并雙擊matrixmul.cpp文件如圖144的源代碼向下滾動文件,查看源代碼有兩個輸入數(shù)組a和b,并輸出數(shù)組。將鼠標停在宏(如圖144),看看每個是3×3共9個元素。步驟2:綜合分析設(shè)計1. 在工具欄中點擊Run C Synthesis按鈕,并把設(shè)計綜合成RTL。當綜合完成,綜合報告
6、打開圖145,性能估計顯示:間隔是80個時鐘,因為在每個輸入數(shù)組中有九個元素,設(shè)計在輸入讀時大約花費9時鐘。間隔比延遲時間的長一個周期,因此在這一點上的硬件不是對應(yīng)的。延遲/間隔是由于內(nèi)嵌的循環(huán):l 內(nèi)部循環(huán)調(diào)用- 2時鐘的延遲- 所有的迭代花費6個時鐘周期l Col循環(huán)- 要求1個時鐘周期輸入循環(huán)積和1個時鐘的推出- 每次迭代花費8個時鐘。- 所有迭代完成花費24個周期l 頂層循環(huán)每次迭代要延遲26個時鐘周期,這個循環(huán)所有迭代要花費78時鐘周期你可以做兩件事情來提高啟動間隔:循環(huán)流水線或?qū)瘮?shù)整體進行流水線操作。你開始于循環(huán)流水線化的結(jié)果和函數(shù)整體流水線化的結(jié)果進行比較。當循環(huán)流水線化,循環(huán)
7、的啟動間隔是重要的監(jiān)控標準。在這個練習中可以看到,即使當設(shè)計達到了該循環(huán)在每個時鐘周期可處理一個樣品的階段,該函數(shù)的啟動間隔仍被報告,因為它需要對包含在函數(shù)內(nèi)的循環(huán)完成處理所有函數(shù)數(shù)據(jù)的時間進行報告。步驟3:乘積循環(huán)流水線1 在工具欄上選擇New Solution按鈕,或者用菜單Project>New Solution來創(chuàng)建一個新的方案solution22 點擊Finish,接受默認創(chuàng)建solution2。3 保證能在信息窗口中看見C源代碼當流水線嵌套循環(huán)時,你會發(fā)現(xiàn)嵌套在流水線里用以處理樣本數(shù)據(jù)的循環(huán)有較大的好處。高層次綜合會自動把循環(huán)打平,打平嵌套循環(huán),消除循環(huán)轉(zhuǎn)換(基本上是在一個循
8、環(huán)內(nèi)創(chuàng)造更多地迭代,但整體用較少的時鐘周期)4 在指令標簽中。a. 選擇Product循環(huán)b. 右擊,并選擇Insert Directivec. 在Directives Editor對話框中,在對話框的上部激活Directives下拉菜單,并選擇PIPELINE。d. 點擊OK,默認選項,以1為初始間隔被默認,(每個時鐘一次新循環(huán)迭代)指令窗口展示了如下的優(yōu)化指令(新指令是高亮的)5. 在工具欄中點擊Run C Synthesis按鈕,并把設(shè)計綜合成RTL。在綜合過程中,在控制臺中的信息報告展示了循環(huán)打平是指對ROW循環(huán)執(zhí)行,默認初始內(nèi)部目標為1,不能在Product循環(huán)內(nèi)實現(xiàn),由于依賴關(guān)系。
9、綜合報告如圖147,Product循環(huán)是流水線,間隔為2,頂層循環(huán)的間隔不是流水線的。頂層循環(huán)不是流水線的原因是循環(huán)打平發(fā)生在Row循環(huán)。沒有對Product循環(huán)內(nèi)的Col循環(huán)進行打平。要理解為什么循環(huán)打平?jīng)]有打平所有內(nèi)嵌的循環(huán),使用Analysis視圖。6. 打開Analysis視圖7. 在性能窗中(performance View),展開Row_Col和Product循環(huán)8. 選擇write operation in state C19. 右擊并選擇Goto Source 查看圖148在C1狀態(tài)的寫操作是由于代碼設(shè)置res為0在Product循環(huán)前。因為res是頂層函數(shù)參數(shù),往RTL端口寫
10、:這個操作必須發(fā)生在 Product循環(huán)操作執(zhí)行前。因為它不是一個內(nèi)部操作,但影響I/O行為,這個操作不能被移除或優(yōu)化。這個操作阻止在Col循環(huán)內(nèi)的Product循環(huán) 被打平。更重要的是,值得探尋的是為什么對Product循環(huán)來說僅間隔為2是可能的。消息SCHED-68告訴你這個問題表明是有依賴關(guān)系的。依賴關(guān)系是在一個循環(huán)的一次迭代的操作和在相同循環(huán)不同的迭代的操作之間。例如,當k=1時和當k=2時的操作(k是循環(huán)索引)。在60行進行第一次操作,存儲(存儲器讀操作)到數(shù)組res中在60行進行第二次操作從數(shù)組res中加載(內(nèi)存寫操作)。從圖148可以看到第60行是從數(shù)組內(nèi)存中讀(由于+ =運算符
11、),并寫入數(shù)組內(nèi)存中。數(shù)組被映射到一個默認的塊RAM和性能視圖的細節(jié)可以說明為什么發(fā)生這種沖突。性能視圖顯示了在其中規(guī)定的操作安排。圖149顯示了許多的Product循環(huán)安排操作的副本,高亮顯示這個問題是如何被理解的。關(guān)于res數(shù)組的操作突出顯示了兩個周期的讀取和寫入。在成功的調(diào)度中,Product循環(huán)的下一次迭代顯示如下。在這樣的調(diào)度中,初始化間隔=2,并且循環(huán)操作每兩個周期重啟。在一些塊Ram接口中沒有沖突。(沒有高亮顯示單元格,關(guān)于各次迭代的重疊)不成功的調(diào)度顯示了為什么循環(huán)不能在間隔II=1下流水線化。在這種情況下,下一次迭代需要啟動在1個時鐘周期以后。當?shù)诙蔚囍鴱牡刂分虚_始進行
12、讀時,第一次迭代中往塊RAM中寫的動作依然在進行。這些地址不一樣。在同一時間不能被同時施加到RAM塊上。在初始間隔為1時,不能使Product循環(huán)流水線化。下一個實驗練習展示了如何重寫代碼來消除這種限制。(一些技術(shù)不讓回寫到同一個數(shù)組或ram塊中)。在這個實驗練習中,你可以優(yōu)化代碼來這樣做。下一步是把上層循環(huán)流水線化。Col循環(huán)。自動展開Product循環(huán)并創(chuàng)建更多的操作。因此使用更多地硬件資源,但是能保證在Product循環(huán)的不同迭代之間沒有依賴性。10. 返回綜合視窗步驟4:Col 循環(huán)流水線化1. 在工具欄上選擇New Solution按鈕,或者用菜單Project>New Sol
13、ution來創(chuàng)建一個新的方案solution32. 因為solution2已經(jīng)添加指令。用下拉菜單選擇select solution1作為源,(solution1沒有添加指令和約束)。3. 點擊Finish,接受默認創(chuàng)建solution3。4. 打開C源代碼matrixmul.cpp讓它在信息窗口中顯示。5. 在指令標簽中a. 選擇Col循環(huán)(loop Col)b. 右擊并選擇Insert Directivec. 在Directives Editor對話框中,激活Directives下拉菜單選擇PIPELINEd. 點擊OK,默認選項。初始間隔為1為默認的,(每個時鐘一次新的循環(huán)迭代)指令窗口
14、展示了如下的優(yōu)化指令(新指令是高亮的)6. 在工具欄中點擊Run C Synthesis按鈕,并把設(shè)計綜合成RTL在綜合過程中,信息報告在控制臺窗口展示,可以看到Product循環(huán)被展開,在Row循環(huán)上循環(huán)被打平。默認的初始間隔目標沒有在Row_Col循環(huán)上達到由于在內(nèi)存數(shù)組a的資源限制。重新查看綜合報告,注意以上,循環(huán)Row_Col循環(huán)的間隔僅有兩個:目標是一個周期處理一個樣本。再次,你可以用分析視圖來突出為什么開始的目標沒有實現(xiàn)。7. 打開Analysis視圖8. 在Performance View中,擴展Row_Col循環(huán)數(shù)組操作時高亮的在圖151中(在SCHED-69消息中),對于數(shù)組
15、a有3個讀操作。2個操作在C1啟動。第三個讀操作在C2啟動。數(shù)組作為一個RAM塊被實現(xiàn)。參數(shù)傳遞給函數(shù)的數(shù)組被實現(xiàn)為塊RAM的端口。在這兩種情況下,RAM塊只能有一個最大的兩個端口(用于雙端口RAM塊)。通過一個單獨的塊RAM接口訪問陣列的,沒有足夠的端口,以便在一個時鐘周期能夠讀出三個所有值。另一種方法是查看該資源的限制是使用的資源窗格9. 點擊Resource tab10. 擴展內(nèi)存如圖152在圖152中,在狀態(tài)1中2周期讀操作,與那些在狀態(tài)C2開始有重疊。因此僅表現(xiàn)出一個單周期。然而,很顯然,該資源被用在多個狀態(tài)。在看這個觀點,很顯然,即使該端口的問題得到解決了,b口出現(xiàn)了同樣的問題:它
16、也有執(zhí)行3次讀。高層綜合一次只能報告一個計劃錯誤或警告,因為一旦出現(xiàn)第一個問題,創(chuàng)建一個可實現(xiàn)調(diào)度的行動無效,其他調(diào)度就不能安排了。高層綜合允許數(shù)組進行分區(qū),映射在一起,重新塑造。這些技術(shù)允許在不改變源代碼被修改的訪問數(shù)組。11. 返回綜合窗口步驟5 :數(shù)組變換1. 在工具欄上選擇New Solution按鈕,或者用菜單Project>New Solution來創(chuàng)建一個新的方案solution42. 點擊Finish,接受默認創(chuàng)建solution4。因為Product循環(huán)的循環(huán)序號是k,兩個數(shù)組必須分開由于各自的K維度:設(shè)計在每個時鐘需要獲取超過兩個的k值。對于數(shù)組a,維度為2,因為它使
17、用的模式是aik;對于數(shù)組b,維度是1,因為它使用的模式是bkj。分開這兩個數(shù)組,創(chuàng)建一個k數(shù)組,在這種情況下,k序號端口。作為一種選擇,我們能夠用重塑替代分區(qū),容許創(chuàng)建一個寬度的數(shù)組來替代k端口。在這次轉(zhuǎn)化后,在這個模塊以外的在塊RAM中的數(shù)據(jù)必須以相同的方式重塑:如果HLS不完整這個過程,數(shù)據(jù)必須被重置:對數(shù)組a:i元素,k次每個寬度data_word_size對數(shù)組b:j元素,k次每個寬度data_word_size3. 打開C源代碼matrixmul.cpp讓它在信息窗口中顯示。4. 在指令標簽中a. 選擇variable ab. 右擊并選擇Insert Directivec. 在Di
18、rectives Editor對話框中,激活Directives下拉菜單選擇ARRAY_RESHAPEd. 設(shè)置維度為2e. 點擊OK5. 對變量b重復這個過程,并設(shè)置維度為1 圖153指令窗口展示了如下的優(yōu)化指令(新指令是高亮的)6. 在工具欄中點擊Run C Synthesis按鈕,并把設(shè)計綜合成RTL綜合報告展示了頂層Row_Col循環(huán)是在每個時鐘周期處理一個樣本數(shù)據(jù)。圖154頂層模塊完成花費12時鐘。Row_Col循環(huán)輸出一個樣本在3個周期后(迭代延遲)每個周期讀取一個樣本(初始間隔)9次迭代后完成所有的樣本(經(jīng)過9次迭代/樣品(行程數(shù)),它完成所有樣品)3+9=12周期該函數(shù)完成,并
19、返回到開始處理下一組數(shù)據(jù)?,F(xiàn)在,為了實現(xiàn)數(shù)據(jù)流,改變的塊RAM接口為FIFO接口。步驟6 :應(yīng)用FIFO接口1. 在工具欄上選擇New Solution按鈕,或者用菜單Project>New Solution來創(chuàng)建一個新的方案solution52. 點擊Finish,接受默認創(chuàng)建solution5。3. 打開C源代碼matrixmul.cpp讓它在信息窗口中顯示。4. 在指令標簽中a. 選擇variable ab. 右擊并選擇Insert Directivec. 在Directives Editor對話框中,激活Directives下拉菜單選擇INTERFACEd. 點擊Mode下拉菜單
20、選擇ap_fifoe. 點擊OK5 對b和變量res重復上述過程。指令窗口展示了如下的優(yōu)化指令(新指令是高亮的)圖1556 在工具欄中點擊Run C Synthesis按鈕,并把設(shè)計綜合成RTL圖156在綜合運行后控制臺顯示如下在圖157中從代碼中,數(shù)組res執(zhí)行寫按照以下順序(MAT_B_COLS=MAT_B_ROWS=3)在57行寫00在60行寫00在60行寫00在60行寫00在57行寫01(序號J)在60行寫01Etc連續(xù)四次往地址0 0寫入,不構(gòu)成流式訪問的模式;這是隨機存取如圖157檢查代碼可以發(fā)現(xiàn)讀數(shù)組a和b類似的問題。它不可能使用一個FIFO接口用于與代碼數(shù)據(jù)訪問作為寫入。要使用
21、FIFO接口,在Vivado高層次綜合中用優(yōu)化指令是不夠的,因為當前的代碼強制了一定的讀寫順序。進一步優(yōu)化需要重新編寫代碼,這在實驗2完成。修改代碼之前,但是,用流水線的功能取代循環(huán)這是值得,并對比這兩種方法的區(qū)別。步驟7 :函數(shù)流水線化1. 在工具欄上選擇New Solution按鈕,或者用菜單Project>New Solution來創(chuàng)建一個新的方案solution6重點:在這一布,從solution4復制指令作為這個解決方案,這個解決方案沒有制定FIFO接口。2. 從下拉菜單選擇solution4在Options部分中。解決方案顯示如1583. 點擊Finish,接受默認創(chuàng)建sol
22、ution6。4. 打開C源代碼matrixmul.cpp讓它在信息窗口中顯示。5. 在指令標簽中a. 在循環(huán)Col上選擇pipeline指令b. 右擊并選擇Remove Directivec. 選擇頂層函數(shù)matrixmuld. 右擊并選擇Insert Directivee. 在Directives Editor對話框中激活Directives下拉菜單并選擇PIPELINWf. 點擊OK指令標簽顯示如下圖1596. 在工具欄中點擊Run C Synthesis按鈕,并把設(shè)計綜合成RTL7. 點擊Compare Reports 工具欄按鈕a. 添加solution4b. 添加solution6
23、c. 點擊ok方案4和6比較如160設(shè)計現(xiàn)在完成用少量的時鐘,并能在5個時鐘上能啟動一次新的事物。但是面積和資源都增加因為所有的循環(huán)都展開了流水線循環(huán)使得循環(huán)以保持不展開,從而提供了控制資源的良好手段。當流水線的功能,包含在該函數(shù)的所有循環(huán)被展開,這是流水線的要求。流水線功能設(shè)計可以處理一組新的9個樣品,每5個時鐘周期。這超過每秒1樣品的要求,因為高層次綜合的默認行為是產(chǎn)生具有最高性能的設(shè)計。流水線功能可獲得最佳性能。然而,如果它超過了所需的性能,但可能需要多個附加指令以減緩設(shè)計了下來。流水線循環(huán)給你一個簡單的方法來控制資源,以部分地展開設(shè)計,以滿足性能的選項。學習vivado第7章Lab2C代碼為了I/O訪問的優(yōu)化在lab1中,你不能使用流接口。C代碼指定同一地址多訪問的本質(zhì)防止了流接口的應(yīng)用。在流接口中,值必須按順序進行訪問。在代碼中,訪問也指端口的訪問,高層次綜合不能刪除和優(yōu)化。C代碼規(guī)定了在每次product循環(huán)啟動時,往端口res寫0值。這可能是預期的行為的一部分。HLS不能簡單地決定改變該算法的規(guī)范。代碼直觀捕獲到矩陣乘法的行為,但這樣就阻止了在硬件上流訪問行為要求。這個實驗練習使用了C代碼更新的版本。在lab1中,你也工作在這個版本下。下面介紹了C代碼如何更新的。圖161展示了I/O訪問模式對在lab1中的代碼。出于需要地址值顯示用小的字體。當變量I,j,和k從0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年音視頻線供貨3篇
- 步行街花崗巖安裝協(xié)議
- 兒童玩具業(yè)務(wù)員招聘協(xié)議
- 汽車配件租賃合同
- 食品召回的企業(yè)文化塑造
- 通信保障臨時用電管理辦法
- 摩托車店大門地彈門施工合同
- 動物福利愛心基金管理辦法
- 室內(nèi)裝修安裝合同樣本
- 交通設(shè)備租賃合同樣本
- 資產(chǎn)管理基礎(chǔ)知識
- 醫(yī)院采購遴選方案
- GB/T 7260.1-2023不間斷電源系統(tǒng)(UPS)第1部分:安全要求
- 對外開放與國際合作概述
- 2024屆四川省成都市高中數(shù)學高一下期末學業(yè)質(zhì)量監(jiān)測模擬試題含解析
- 2023年青協(xié)活動總結(jié)報告
- 提升供應(yīng)鏈效率:年度運營計劃
- 展覽館維修維護投標方案
- 陳赫賈玲小品《歡喜密探》臺詞劇本
- 2023招聘專員個人年終總結(jié)
- 機房搬遷服務(wù)投標方案(技術(shù)標)
評論
0/150
提交評論