專題成果報告書 ARM 的 Binary code 轉 Verilog code 之翻譯器 元智大學資訊工程學系 組員︰張立蓉、李佳珉 指導教授︰楊正仁教授
摘要 利用 FPGA (Field Programmable Gate Array) 增 強電腦計算效能中,將程式移 植到 FPGA 平台的過程 – 耗費人力 – 耗費時間
Cont. 在此專題計畫中,我們將設計 一個程式碼翻譯器 – 針對沒有任何輔助資訊的二元碼, 轉換成 FPGA 上的硬體描述語言。 – 幫助系統開發工程師能夠迅速地 將一些現有的應用軟體轉換到 FPGA 平台上,獲得可重組態硬 體加速的效能提昇。
研究動機 若直接使用硬體描述語言撰寫 FPGA 的 bitstream – 開發人員必須要有不短的撰寫經驗 – 其程式設計概念迴異於一般所熟知的程 式設計語言,其學習門檻不低 為了加速系統開發,會使用一些軟 體工具,將高階語言所撰寫的軟體 轉譯成硬體描述語言來進行移植。 系統開發者沒有軟體原來的高階語 言程式碼,在軟體移植上,必須將 其執行檔先進行反組譯,再由開發 人員針對這些組合語言進行分析與 轉譯。
Cont. 開發者的兩個挑戰 – 需對二元碼的計算架構非常熟悉 – 能夠完全地掌握二元碼的演算法 流程 這兩個挑戰將使得系統開發耗 費人力與時間,同時所移植的 應用程式,也存在許多潛在的 錯誤。
研究問題 探討如何針對沒有任何輔助資 訊或 metadata 的二元碼,來 進行 FPGA 上硬體描述語言的 轉譯工作。 同時為了充分利用 FPGA 的硬 體特性,這個轉譯器將對所分 析出來的二元程式碼執行緒, 做效能最佳化的平行設計。使 轉譯後之 FPGA 運算核心,能 夠得到很高的執行效能。
系統軟硬體平台 硬體平台 –Altera 公司的 DE2 開發實驗板 軟體平台 –Quartus II –Metrowerks CodeWarrior for ARM Developer Suite
系統實作流程 Binary Code Parsing Find basic block Verilog code generator Remove data dependency Parallel Analyzer Verilog Code Part 1 Part 2 Part 3
實作範例 範例 FIR 濾波器的 C 程式碼︰ float FIR( int N, float c[], float x[] ) { int i=0; float f=0; while(i<N){ f = f + c[i]*x[i]; i++;} return f; }
實作:第一部份 編譯完 FIR 濾波器程式碼產生執行檔後, 將執行檔反組譯,出現下列二元程式碼︰ 依迴圈判斷結果將其分割成基本區塊。 … 0x c: e T. CMP r4,r6 0x : aa BGE {pc} + 0x28 ; 0x x : eafffff4.... B {pc} - 0x28 ; 0x1c … 10x c0x x x c 巢狀迴圈所屬層級終止位址開始位址 基本區塊對照表 依照基本區塊分割,並做第一次的 Verilog 程式碼翻譯動作。
實作:第二部份. 繼續第二階段的 Verilog 程式碼翻 譯,流程如下: 1. 對最外層主程式.tmp 檔之程式碼進行 指令的切割,並逐行放進已定義之陣 列。 2. 每讀進一行即進行指令之分析。 3. 當遇到指令碼 “call funcation: tmpX ” 之內容時,即跳入遞迴函式對 X.tmp 檔進行程式碼轉換。 4. 步驟2、步驟3持續進行直到未遇到 要翻之.tmp 檔即跳出遞迴 5. 跳回最外層主程式.tmp 檔後,再繼續 分析,直到翻完中途可能遇到之其 餘.tmp 檔,當外層主程式亦翻畢後, 即完成 Verilog 程式碼的翻譯。
實作:第三部份 完成第二部份的翻譯後,所面臨的問題是資料相依所造成的傳 遞延遲問題。為了解決此問題,因此我們必須將不必要的程式 碼移除。 for(i=0; i<50; i=i+1 ) begin t0 <= r8[r4]; t1 <= r7[r4]; t3 <= t1 * t0; r9 <= t3; t2 <= r5; t4 <= t2 + r9; r5 <= t4; r4 <= r4+1; End 移除前 for(i=0; i<50; i=i+1 ) begin t0 <= r8[r4]; t1 <= r7[r4]; t3 <= t1 * t0; t4 <= t4 + t3; r4 <= r4 + 1; End 移除後
Cont. 將不必要的部份去除後,最後即是 Loop unrolling 的動作。 for(i=0; i<50; i=i+1 ) begin t0 <= r8[r4]; t1 <= r7[r4]; t3 <= t1 * t0; tmp0_t0 <= r8[ r4 + 1 ]; tmp0_t1 <= r7[ r4 + 1 ]; tmp0_t3 <= tmp0_t1 * tmp0_t0; t4 <= t4 + t3 + tmp0_t3; r4 <= r4+2; end
實作:測試結果 做 Loop unrolling 前 做完 Loop unrolling 後
Cont. 實作測試結果 Test case Unrolling 展開數 FIR 濾波器 矩陣 Inner Product
謝謝指教 !