160 likes | 549 Views
專題成果報告書 ARM 的 Binary code 轉 Verilog code 之翻譯器. 元智大學資訊工程學系 組員 ︰ 張立蓉、李佳珉 指導教授 ︰ 楊正仁教授. 摘要. 利用 FPGA (Field Programmable Gate Array) 增強電腦計算效能中,將程式移植到 FPGA 平台的過程 耗費人力 耗費時間. Cont. 在此專題計畫中,我們將設計一個程式碼翻譯器 針對沒有任何輔助資訊的二元碼,轉換成 FPGA 上的硬體描述語言。
E N D
專題成果報告書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 Part 1 Find basic block Part 2 Verilog code generator Remove data dependency Part 3 Parallel Analyzer Verilog Code 系統實作流程
實作範例 • 範例 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; }
開始位址 終止位址 巢狀迴圈所屬層級 0x0000001c 0x00000044 2 0x00000000 0x0000004c 1 基本區塊對照表 實作:第一部份 • 編譯完 FIR 濾波器程式碼產生執行檔後,將執行檔反組譯,出現下列二元程式碼︰ • 依迴圈判斷結果將其分割成基本區塊。 • … • 0x0000001c: e1540006 ..T. CMP r4,r6 • 0x00000020: aa000008 .... BGE {pc} + 0x28 ; 0x48 • ... • 0x00000044: eafffff4 .... B {pc} - 0x28 ; 0x1c • … • 依照基本區塊分割,並做第一次的Verilog程式碼翻譯動作。
實作:第二部份. • 繼續第二階段的 Verilog 程式碼翻譯,流程如下: • 對最外層主程式 .tmp 檔之程式碼進行指令的切割,並逐行放進已定義之陣列。 • 每讀進一行即進行指令之分析。 • 當遇到指令碼 “call funcation: tmpX ”之內容時,即跳入遞迴函式對 X.tmp 檔進行程式碼轉換。 • 步驟2、步驟3持續進行直到未遇到要翻之 .tmp 檔即跳出遞迴 • 跳回最外層主程式 .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. • 實作測試結果