專利名稱:一種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法及映射裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及的是一種將高級(jí)語言轉(zhuǎn)換成硬件電路的方法。具體地說是一種面向 計(jì)數(shù)類循環(huán)的C-to-VHDL綜合優(yōu)化方法,即將C語言實(shí)現(xiàn)的循環(huán)程序自動(dòng)轉(zhuǎn)換成可綜合的 VHDL程序,最終移植到Xilinx系列FPGA上運(yùn)行的方法。本發(fā)明還涉及適用于該方法的裝置。
背景技術(shù):
將高級(jí)語言轉(zhuǎn)換成硬件電路主要采用兩種方法一種是起步較早的類C語言,即 設(shè)計(jì)一種新的軟/硬件描述語言或程序設(shè)計(jì)模型,將其綜合為網(wǎng)表文件,再使用專門的硬 件綜合工具實(shí)現(xiàn)布局布線;另外一種方法是直接將高級(jí)語言(C, C++, Matlab)程序綜合成 VHDL硬件描述語言,再使用現(xiàn)有的商用工具對(duì)VHDL文件進(jìn)行綜合、布線。
由于類C語言是一種可以同時(shí)實(shí)現(xiàn)軟/硬件描述的語言,然而,軟件設(shè)計(jì)思想和 硬件設(shè)計(jì)思想存在根本性的不同,軟件結(jié)構(gòu)(馮諾依曼結(jié)構(gòu))是一種時(shí)間計(jì)算模型(time computing model),其本質(zhì)是程序的串行化;而硬件結(jié)構(gòu)是一種空間計(jì)算模型(spatial computing model),其本質(zhì)是程序的并行化。所以,在C這樣的軟件語言基礎(chǔ)上設(shè)計(jì)出來的 類C語言,在硬件描述的性能上都存在著無法克服的缺陷,其執(zhí)行效果不能與Verilog或 VHDL這樣的硬件描述語言相媲美, 一些執(zhí)行效果較好的類C語言,其實(shí)已經(jīng)將ANSI C擴(kuò)充 修改得面目全非,程序開發(fā)人員相當(dāng)于又要學(xué)習(xí)一種新的軟/硬件描述語言,因此,近幾年 開始關(guān)注直接將高級(jí)語言綜合為VHDL硬件描述語言的方法。 目前,實(shí)現(xiàn)C語言到VHDL語言轉(zhuǎn)換的工具很多,如SPARK, R0CCC, DWARV等。 SPARK[1]以ANSI-C作為輸入,產(chǎn)生可綜合的寄存器傳輸級(jí)VHDL程序。SPARK基于SPARK intermediate ^presentation(IR)開發(fā),生成的VHDL程序采用FSM(有窮自動(dòng)機(jī))的控 制形式。SPARK雖然通過脈動(dòng)陣列[2]實(shí)現(xiàn)了對(duì)計(jì)數(shù)類循環(huán)和非計(jì)數(shù)類循環(huán)的支持,但不支 持循環(huán)體里的break、conti皿e以及goto控制結(jié)構(gòu)[3]。 R0CCC[4]以高級(jí)語言如C,C++作為 輸入,其生成VHDL程序也是通過FSM控制。R0CCC采用SUIF和Machine-SUIF作為映射前 端,適合運(yùn)算密集型的算法加速,可作為硬件代碼加速器。R0CCC只支持標(biāo)準(zhǔn)形式的計(jì)數(shù)類
循環(huán),如for(i = 0 ;i <b ;i++);對(duì)循環(huán)嵌套的支持要求很嚴(yán)格,不能支持任意形式的循環(huán)
嵌套;不支持循環(huán)初值、終值及步進(jìn)值不確定的非計(jì)數(shù)類循環(huán),這導(dǎo)致R0CCC能處理的循環(huán) 類型有限。同時(shí),ROCCC對(duì)于循環(huán)體內(nèi)的語句也有要求,如循環(huán)體內(nèi)語句間不能存在數(shù)據(jù)依 賴等。DWARV[幻(Delf workbenchAutomated reconfigurable V亂generator) :DWARV采用 FSM的控制形式,利用數(shù)據(jù)流圖實(shí)現(xiàn)for循環(huán)的轉(zhuǎn)換[6]。 DWARV只支持計(jì)數(shù)類循環(huán),不支持 非計(jì)數(shù)類循環(huán),同時(shí),DWARV在循環(huán)控制上不支持跳轉(zhuǎn)。
與本發(fā)明相關(guān)的公開報(bào)道有 [1] R. K. Gupta, A. Nicolau, S. Gupta and N. D. D u 11 , " S P ARK :
A high_leve1synthesis framework for applying parallelizing compilertransformations. ,,, Int. Conference on VLSI Design 2003, January 2003
[2]Jae-Jin Lee, Gi-Yong Song. "High-Level Synthesis Using SPARK andSystolic Array", ARC 2006,LNCS 3985,pp.455-4602006 [3]UserManual for the SPARK Parallelizing High-Level Synthesis FrameworkVersionl. 1 [4]W. Najjar, B.A.Buyukkurt and Z.Guo, "Compiler optimization forconfigurable accelerators", Int.Workshop On applied ReconfigurableComputing(ARC 2006),Delft, The Netherlands,2006
[5]Y. D. Yankova, G. K. K體a麗,K. L. M. Bertels, G. N. Gaydadjiev, J. Lu andS. Vassiliadis, DWARV :Delft Workbench Automated Recongurable VHDLGenerator, In Proceedings of the 17th International Conference on FieldProgrammable Logic and Applications (FPL07) , Delft, TheNetherlands, 2007 [6]Yana Yankova, Georgi Kuzmanov, Keon Bertels,Georgi Gaydadjiev,YiUi, Stamatis Vassliiadis. "DWARV :DELFTWORKBENCH AUT0MATEDREC0NFIGURABLE VHDL GENERATOR'', Computer Engineering Laboratory, DelftUniversity of Technology。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種通過分離循環(huán)的控制信號(hào)與使能輸出信號(hào),實(shí)現(xiàn)高頻 的循環(huán)基本模塊;通過組合這兩組信號(hào)可實(shí)現(xiàn)任意形式的循環(huán);在循環(huán)路徑的任意節(jié)點(diǎn)處
可以加入運(yùn)算模塊,擴(kuò)展循環(huán)功能的一種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法。本發(fā)明
的目的還在于提供一種與本發(fā)明的方法相關(guān)的映射裝置。 本發(fā)明的目的是這樣實(shí)現(xiàn)的 本發(fā)明的一種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法為 通過分析模塊跳轉(zhuǎn)關(guān)系后,找到循環(huán)入口模塊;進(jìn)入循環(huán)入口模塊后,尋找循環(huán)關(guān) 鍵變量;找到循環(huán)關(guān)鍵變量后,將循環(huán)關(guān)鍵的自加操作由循環(huán)體執(zhí)行模塊提前到循環(huán)入口 模塊,使得循環(huán)的控制操作與循環(huán)體的運(yùn)算操作分開;最終分離了循環(huán)的控制信號(hào)與使能 輸出信號(hào)。在循環(huán)控制信號(hào)和使能輸出信號(hào)的作用下,完成循環(huán)里的運(yùn)算操作。
本發(fā)明的一種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法實(shí)現(xiàn)高頻循環(huán)基本模塊步 驟如下 S301 :當(dāng)重啟信號(hào)有效時(shí),首次進(jìn)入循環(huán)判斷;利用比較器比較循環(huán)關(guān)鍵變量值 與n值;根據(jù)比較器結(jié)果對(duì)循環(huán)進(jìn)行判斷,若循環(huán)有效,則進(jìn)入循環(huán)體內(nèi)進(jìn)行相應(yīng)運(yùn)算,運(yùn) 算器開始工作; S302:當(dāng)重啟信號(hào)失效后,進(jìn)入循環(huán)控制變量自加判斷,不自加則重新回到重啟判 斷部分;否則利用計(jì)數(shù)器對(duì)循環(huán)關(guān)鍵變量進(jìn)行計(jì)數(shù)操作; S303 :自加或重啟后,選擇器對(duì)關(guān)鍵變量以及運(yùn)算器的運(yùn)算結(jié)果進(jìn)行選擇;然后 再次利用比較器比較選擇器對(duì)關(guān)鍵變量的選擇結(jié)果與n值的大小關(guān)系,根據(jù)比較器產(chǎn)生結(jié) 果判斷是否滿足循環(huán)有效的條件,滿足再次進(jìn)入循環(huán);不滿足則完成整個(gè)循環(huán);
S304 :完成本次循環(huán)操作。 本發(fā)明的一種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法實(shí)現(xiàn)循環(huán)的具體處理步驟 如下
(1)分析模塊跳轉(zhuǎn)關(guān)系找到LoopEntry ; (2)處理PHI指令,完成對(duì)循環(huán)關(guān)鍵變量的特殊處理;通過LLVM中的dyn_CaSt指 令對(duì)PHI指令中的各個(gè)操作數(shù)進(jìn)行指令類型轉(zhuǎn)換;如果操作數(shù)能轉(zhuǎn)換為指令,并且轉(zhuǎn)換成 的指令類型為加法或者減法則該操作數(shù)為關(guān)鍵變量;同時(shí)將該操作數(shù)所在的加法或減法運(yùn) 算提前到PHI指令所在模塊內(nèi)進(jìn)行運(yùn)算; (3)判斷關(guān)鍵變量,產(chǎn)生循環(huán)控制信號(hào);根據(jù)循環(huán)控制信號(hào),進(jìn)入或跳出循環(huán)體操 作;若進(jìn)入循環(huán)體,則循環(huán)地進(jìn)行循環(huán)體內(nèi)的相關(guān)運(yùn)算操作,直到循環(huán)關(guān)鍵變量不滿足循環(huán) 有效的條件,此時(shí)產(chǎn)生循環(huán)無效信號(hào),從而跳出循環(huán),進(jìn)行循環(huán)體外的相關(guān)運(yùn)算操作;
(4)No_exit模塊轉(zhuǎn)換;將No_exit這個(gè)模塊號(hào)作為循環(huán)體操作模塊的使能信號(hào), 為高電平時(shí)表示循環(huán)繼續(xù)進(jìn)行;No—exit模塊內(nèi)的所有運(yùn)算操作轉(zhuǎn)換為VHDL語言里對(duì)應(yīng)的 基本操作;步驟(2)中被提前的加法或減法運(yùn)行在No—exit模塊內(nèi)不再運(yùn)算;
(5)Loop_eXit模塊轉(zhuǎn)換;將Loop_eXit這個(gè)模塊號(hào)作為循環(huán)結(jié)束使能信號(hào),為高 電平時(shí)表示循環(huán)結(jié)束;L00p_eXit模塊內(nèi)的所有運(yùn)算操作轉(zhuǎn)換為VHDL語言里對(duì)應(yīng)的基本操 作。 本發(fā)明的一種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法還可以處理由兩組循環(huán)所 形成的并列結(jié)構(gòu)。具體方法為若兩次循環(huán)之間沒有中間運(yùn)算,則No—exitJ)模塊只是進(jìn)行 簡單的跳轉(zhuǎn),直接進(jìn)入新的循環(huán);否則,在No—exitJ)模塊中做相應(yīng)的中間運(yùn)算,然后再跳 轉(zhuǎn)到新的循環(huán);兩次循環(huán)之間使能信號(hào)傳遞方式如下 當(dāng)完成第一個(gè)循環(huán)基本模塊后,根據(jù)循環(huán)結(jié)束模塊里的br指令,將循環(huán)結(jié)束使能
信號(hào)Loop_eXit傳遞給跳轉(zhuǎn)到的模塊若兩次循環(huán)之間無中間運(yùn)算,則分析模塊跳轉(zhuǎn)關(guān)系
找到下一個(gè)BLoopentryJ,將Loop—exit使能信號(hào)按照邏輯傳遞給BLoopentryJ ;否則,將
Loop_eXit使能信號(hào)按照邏輯傳遞給運(yùn)算模塊使能信號(hào),最后再分析模塊跳轉(zhuǎn)關(guān)系找到下
一個(gè)BLoopentryj,將運(yùn)算模塊使能信號(hào)按照邏輯傳遞給BLoopentryJ 。 本發(fā)明的一種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法還可以處理循環(huán)嵌套結(jié)構(gòu)。
具體方法為在NO_exit_0模塊嵌有循環(huán)基本結(jié)構(gòu);如果外層循環(huán)的循環(huán)體No—exitJ)中
無其他運(yùn)算,直接進(jìn)入內(nèi)層循環(huán),則外層循環(huán)的BLoopentryJ)使能信號(hào)按照邏輯直接傳遞
給內(nèi)層循環(huán)的BLoopentryJ ;否則,將外層循環(huán)的BLoopentryJ)使能信號(hào)按照邏輯傳遞
給外層循環(huán)體模塊使能信號(hào)No—exitJ),最后再將NO_exit_0按照邏輯傳遞給內(nèi)層循環(huán)的
BLoopentryj,從而完成外層循環(huán)與內(nèi)層循環(huán)間模塊使能信號(hào)的傳遞。 本發(fā)明的一種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法的映射裝置,由產(chǎn)生循環(huán)關(guān)
鍵變量的計(jì)數(shù)器,根據(jù)比較運(yùn)算結(jié)果決定是否進(jìn)行循環(huán)體內(nèi)運(yùn)算的比較器,根據(jù)選擇開關(guān)
值獲取循環(huán)體外的數(shù)據(jù)值或循環(huán)體內(nèi)運(yùn)算結(jié)果反饋值的選擇器,執(zhí)行循環(huán)體內(nèi)的運(yùn)算操作
的運(yùn)算器組成。 計(jì)數(shù)器,根據(jù)循環(huán)中對(duì)關(guān)鍵變量的操作類型,為循環(huán)關(guān)鍵變量進(jìn)行加法計(jì)數(shù)或減 法計(jì)數(shù)。 比較器,比較循環(huán)關(guān)鍵變量值與循環(huán)的總次數(shù),滿足循環(huán)進(jìn)行條件時(shí),進(jìn)入循環(huán)體 進(jìn)行運(yùn)算;不滿足循環(huán)進(jìn)行條件時(shí),跳出循環(huán),完成循環(huán)運(yùn)算。 選擇器,當(dāng)首次進(jìn)入循環(huán)時(shí),選擇循環(huán)體外數(shù)據(jù)對(duì)循環(huán)體內(nèi)數(shù)據(jù)輸入進(jìn)行初始化; 否則,選擇循環(huán)體內(nèi)運(yùn)算結(jié)果反饋值,對(duì)循環(huán)體內(nèi)輸入數(shù)據(jù)進(jìn)行更新。
運(yùn)算器,進(jìn)入循環(huán)體后,根據(jù)循環(huán)體內(nèi)各種運(yùn)算操作進(jìn)行相應(yīng)運(yùn)算。 本發(fā)明提供了一種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法。讓軟件的核心結(jié)
構(gòu)for循環(huán)移到硬件上執(zhí)行,從而加快其執(zhí)行效率,達(dá)到硬件加速實(shí)現(xiàn)循環(huán)的目的。本發(fā)
明通過對(duì)循環(huán)的控制信號(hào)與使能輸出信號(hào)進(jìn)行明確的分離,實(shí)現(xiàn)高頻的循環(huán)基本模塊;同
時(shí),通過對(duì)這兩組信號(hào)進(jìn)行組合,可以實(shí)現(xiàn)任意形式的循環(huán)。本發(fā)明允許在循環(huán)路徑的任
意處靈活地加入各種運(yùn)算模塊,并且對(duì)循環(huán)輸入沒有任何要求,支持循環(huán)體的break以及
continue控制。這些特點(diǎn)使得本發(fā)明有別于其他實(shí)現(xiàn)循環(huán)的設(shè)計(jì)方案。 本發(fā)明還提供了使用上述映射方法的映射裝置,用于解決實(shí)際應(yīng)用中使用到本發(fā)
明上述方法的問題。 C語言與VHDL語言有相似的功能,但也有較大的不同。VHDL中雖然有循環(huán)結(jié)構(gòu),但 只能實(shí)現(xiàn)固定次數(shù)的循環(huán)即循環(huán)的初值、步長、終值都是靜態(tài)數(shù)據(jù)。固定次數(shù)的循環(huán)與C語 言的循環(huán)在功能上無法進(jìn)行匹配,因此要實(shí)現(xiàn)循環(huán)就要將循環(huán)的結(jié)構(gòu)打散,采用分支判斷 語句(IF)用時(shí)序設(shè)計(jì)完成循環(huán)的運(yùn)算。每次時(shí)鐘到來時(shí)都對(duì)循環(huán)關(guān)鍵變量進(jìn)行判斷,從而 決定是否進(jìn)行循環(huán)體的操作。循環(huán)關(guān)鍵變量是指形如for(i = 0 ;i < b ;i++)中表示循環(huán) 初值、終值等的變量i。循環(huán)的操作流程類似于計(jì)數(shù)器,擴(kuò)充的部分為根據(jù)計(jì)數(shù)器的值生 成相應(yīng)的使能信號(hào),其基本實(shí)現(xiàn)流程見錯(cuò)誤!未找到引用源。。但是錯(cuò)誤!未找到引用源。 所示流程中S202沒有將循環(huán)關(guān)鍵變量的"變量自加"與"循環(huán)有效"分開,每次判斷是否進(jìn) 行循環(huán)體的操作將直接受循環(huán)體內(nèi)操作影響。這種實(shí)現(xiàn)方式層次結(jié)構(gòu)不清晰,控制復(fù)雜,無 法靈活的實(shí)現(xiàn)多個(gè)循環(huán)的多種組合。 本發(fā)明通過提前循環(huán)關(guān)鍵變量的自加操作,將循環(huán)控制與循環(huán)體內(nèi)運(yùn)算分開,從 而分離了循環(huán)的控制信號(hào)與使能輸出信號(hào),使得循環(huán)控制簡潔,其實(shí)現(xiàn)流程如錯(cuò)誤!未找 到引用源。所示。S301和S302中的重啟與自加分別是循環(huán)重啟(初始化)與步進(jìn)的控制 信號(hào),S303中的循環(huán)有效與循環(huán)完成是控制相應(yīng)執(zhí)行模塊的控制信號(hào)。由于要進(jìn)行模塊的 級(jí)聯(lián),因此所有的使能信號(hào)都為一個(gè)周期的高電平。使能信號(hào)在模塊之間按照邏輯進(jìn)行傳 遞,從而完成循環(huán)對(duì)應(yīng)的計(jì)算。使能信號(hào)的基本特征是只有一個(gè)周期的高電平。 一個(gè)周期 的高電平指的是模塊的使能信號(hào)為一個(gè)周期高電平,同時(shí)如果控制從該模塊轉(zhuǎn)移到下一級(jí) 模塊,則該模塊為相應(yīng)的下一級(jí)生成一個(gè)周期高電平使能信號(hào)。 一個(gè)周期的高電平保證了 當(dāng)循環(huán)體執(zhí)行需要多個(gè)時(shí)鐘節(jié)拍時(shí),循環(huán)體相對(duì)應(yīng)的模塊只被使能一個(gè)周期。該特性對(duì)其 它相應(yīng)的模塊也有效。 本發(fā)明設(shè)計(jì)的循環(huán)基本模塊將各種信號(hào)進(jìn)行了明確的定義,對(duì)循環(huán)基本模塊的自 由組合起到了決定性作用。若將循環(huán)有效與自身的自加相接,則實(shí)現(xiàn)了一個(gè)沒有循環(huán)體的 循環(huán);若將循環(huán)有效與一個(gè)運(yùn)算模塊相接,運(yùn)算模塊與自加相接,則實(shí)現(xiàn)了一個(gè)基本的循 環(huán)。若將基本循環(huán)的循環(huán)完成信號(hào)與另一個(gè)循環(huán)的重啟信號(hào)相接,則實(shí)現(xiàn)了 2個(gè)循環(huán)的并
列;若將循環(huán)的循環(huán)有效信號(hào)與另一個(gè)基本循環(huán)的重啟信號(hào)相接,基本循環(huán)的循環(huán)完成信 號(hào)與循環(huán)的自加信號(hào)相接,則實(shí)現(xiàn)了 2個(gè)循環(huán)的嵌套。按照實(shí)現(xiàn)循環(huán)并列和循環(huán)嵌套的原 理以此類推,便可實(shí)現(xiàn)任意形式的循環(huán)。 本發(fā)明的優(yōu)點(diǎn)在于將循環(huán)控制提前,同時(shí)分離了循環(huán)控制信號(hào)與數(shù)據(jù)運(yùn)算使能信 號(hào),從而使得循環(huán)控制變得簡潔,循環(huán)基本模塊最大時(shí)鐘頻率高。同時(shí),更利于以后對(duì)循環(huán) 進(jìn)行優(yōu)化,如循環(huán)流水化等。
圖1是循環(huán)基本模塊原理圖;圖2是循環(huán)的常規(guī)實(shí)現(xiàn)流程示意圖;圖3是模塊化 處理流程示意圖;圖4是運(yùn)算單元處理流程示意圖;圖5是循環(huán)基本模塊結(jié)構(gòu)圖;圖6是循 環(huán)的并列結(jié)構(gòu)圖;圖7是循環(huán)的嵌套結(jié)構(gòu)圖;圖8是PHI處理流程示意圖;圖9是單個(gè)循環(huán) (循環(huán)次數(shù)為3)波形圖;圖10是2個(gè)循環(huán)(循環(huán)次數(shù)都為3)順次波形圖;圖11是2個(gè)循 環(huán)(循環(huán)次數(shù)都為3)嵌套波形圖。
具體實(shí)施例方式
下面結(jié)合附圖舉例對(duì)本發(fā)明做更詳細(xì)地描述
1高頻的循環(huán)基本模塊
1. 1循環(huán)IR結(jié)構(gòu)分析 本發(fā)明可以基于LLVM架構(gòu),利用LLVM作為前端將C語言中的for循環(huán)轉(zhuǎn)換成LLVM IR,然后對(duì)for循環(huán)的LLVM IR進(jìn)行轉(zhuǎn)換處理。LLVM IR是一種獨(dú)立于機(jī)器架構(gòu)的中間表達(dá) 式。 —個(gè)循環(huán)的BasicBlock(基本模塊)主要由LoopEntry (循環(huán)入口模塊),Loop_ exit(循環(huán)跳出模塊)及No—exit(循環(huán)執(zhí)行模塊)三部分組成,其中LoopEntry主要完成 數(shù)據(jù)的選擇、公共操作(循環(huán)可提前部分)及分支通路的選擇,No—exit完成循環(huán)體內(nèi)的操 作,Loop—exit完成循環(huán)完成后的操作。這些循環(huán)模塊間的關(guān)系如錯(cuò)誤!未找到引用源。所 示。 錯(cuò)誤!未找到引用源。中,通過PHI指令來進(jìn)行數(shù)據(jù)選擇。PHI指令表示變量 在模塊使能信號(hào)有效時(shí)選擇相應(yīng)的值。如% indvar = phi i32
, [% nextindvar, % Loop],這條PHI指令表示indvar變量在LoopHeader模塊使能信號(hào)有效時(shí) 取'0'值,而在Loop模塊使能信號(hào)有效時(shí)取next indvar這個(gè)變量的值。
錯(cuò)誤!未找到引用源。中,BLoopentry通過br指令進(jìn)行分支跳轉(zhuǎn),根據(jù)跳轉(zhuǎn)結(jié) 果進(jìn)入循環(huán)體或跳出循環(huán)。br指令表示根據(jù)比較指令結(jié)果,進(jìn)行分支選擇,跳轉(zhuǎn)到相應(yīng) 模塊。如br bool % tmp_19, label % BNo_exit, label % Loop_exit,這條br指令表示 BLoopentry根據(jù)tmp_19的值,進(jìn)行分支選擇,若tmp_19為真,跳轉(zhuǎn)到BNo_exit ;否則跳轉(zhuǎn) 至lj Loop—exit。 1. 2循環(huán)關(guān)鍵變量處理 本發(fā)明通過分析模塊間的跳轉(zhuǎn)關(guān)系來識(shí)別循環(huán),找到BLoopentry ,然后處理
BLoopentry中循環(huán)關(guān)鍵變量。LLVM IR通過PHI指令對(duì)循環(huán)關(guān)鍵變量進(jìn)行數(shù)據(jù)選擇,其數(shù)
據(jù)選擇流程如錯(cuò)誤!未找到引用源。所示。
S801 :識(shí)別關(guān)鍵變量,初始化關(guān)鍵變量i ; S802 :對(duì)關(guān)鍵變量進(jìn)行自加操作,更新關(guān)鍵變量i值, S803 :循環(huán)繼續(xù)時(shí),執(zhí)行循環(huán)體運(yùn)算操作; S804 :本次循環(huán)結(jié)束。 本發(fā)明的關(guān)鍵在于對(duì)循環(huán)關(guān)鍵變量的特殊處理方式
(1)識(shí)別循環(huán)關(guān)鍵變量
通過對(duì)模塊間的跳轉(zhuǎn)關(guān)系找到循環(huán)入口模塊判定是否進(jìn)行循環(huán)的條件變量,通 過條件變量找到對(duì)應(yīng)的比較指令,然后由比較指令的操作數(shù)得到關(guān)鍵變量,最后將關(guān)鍵變 量加入到KeyVariable數(shù)組中。
(2)將關(guān)鍵變量自加操作指令提前 讀取PHI指令,若該指令在KeyVariable中,則讀取其操作數(shù),然后將No_exit 模塊中對(duì)關(guān)鍵變量自加操作指令提前到LoopEntry模塊,并將自加操作指令加入到 KeyOperation數(shù)組中。
(3)忽略關(guān)鍵變量自加操作 在進(jìn)行指令的翻譯時(shí),如果該指令在KeyOpeartion數(shù)組中,則直接跳過。 經(jīng)過上述對(duì)PHI指令的特殊處理后,分離了循環(huán)的控制信號(hào)與使能輸出信號(hào),從
而使得轉(zhuǎn)換后的循環(huán)基本模塊最大時(shí)鐘頻率高。同時(shí),更有利于實(shí)現(xiàn)各種形式的for循環(huán),
增強(qiáng)了循環(huán)功能。 1. 3循環(huán)基本模塊的實(shí)現(xiàn) 本發(fā)明主要以循環(huán)關(guān)鍵變量為對(duì)象進(jìn)行循環(huán)基本模塊的設(shè)計(jì)。將循環(huán)控制信號(hào)與 運(yùn)算信號(hào)分開,其處理流程如錯(cuò)誤!未找到引用源。所示。 S301 :當(dāng)重啟信號(hào)有效時(shí),首次進(jìn)入循環(huán)判斷。利用圖l所示裝置中的比較器比較 循環(huán)關(guān)鍵變量值與n值。根據(jù)比較器結(jié)果對(duì)循環(huán)進(jìn)行判斷,若循環(huán)有效,則進(jìn)入循環(huán)體內(nèi)進(jìn) 行相應(yīng)運(yùn)算,此時(shí)裝置內(nèi)的運(yùn)算器開始工作,運(yùn)算器處理流程如圖4所示;
S302:當(dāng)重啟信號(hào)失效后,進(jìn)入循環(huán)控制變量自加判斷,不自加則重新回到重啟判 斷部分;否則利用裝置中的計(jì)數(shù)器對(duì)循環(huán)關(guān)鍵變量進(jìn)行計(jì)數(shù)操作。 S303 :自加或重啟后,裝置中的選擇器對(duì)關(guān)鍵變量以及運(yùn)算器的運(yùn)算結(jié)果進(jìn)行選
擇。然后再次利用比較器比較選擇器對(duì)關(guān)鍵變量的選擇結(jié)果與n值的大小關(guān)系,根據(jù)比較
器產(chǎn)生結(jié)果判斷是否滿足循環(huán)有效的條件,滿足再次進(jìn)入循環(huán);不滿足則完成整個(gè)循環(huán)。 S304 :完成本次循環(huán)操作。 實(shí)現(xiàn)循環(huán)基本模塊轉(zhuǎn)換處理步驟如下。 (1)分析模塊跳轉(zhuǎn)關(guān)系找到LoopEntry。 (2)處理PHI指令,完成對(duì)循環(huán)關(guān)鍵變量的特殊處理。通過LLVM中的dyn—cast指 令對(duì)PHI指令中的各個(gè)操作數(shù)進(jìn)行指令類型轉(zhuǎn)換。如果操作數(shù)能轉(zhuǎn)換為指令,并且轉(zhuǎn)換成 的指令類型為加法或者減法則該操作數(shù)為關(guān)鍵變量。同時(shí)將該操作數(shù)所在的加法或減法運(yùn) 算提前到PHI指令所在模塊內(nèi)進(jìn)行運(yùn)算。 (3)判斷關(guān)鍵變量,產(chǎn)生循環(huán)控制信號(hào)。根據(jù)循環(huán)控制信號(hào),進(jìn)入或跳出循環(huán)體操
作。若進(jìn)入循環(huán)體,則循環(huán)地進(jìn)行循環(huán)體內(nèi)的相關(guān)運(yùn)算操作,直到循環(huán)關(guān)鍵變量不滿足循環(huán)
有效的條件,此時(shí)產(chǎn)生循環(huán)無效信號(hào),從而跳出循環(huán),進(jìn)行循環(huán)體外的相關(guān)運(yùn)算操作。 (4)No_exit模塊轉(zhuǎn)換。將No_exit這個(gè)模塊號(hào)作為循環(huán)體操作模塊的使能信號(hào),
為高電平時(shí)表示循環(huán)繼續(xù)進(jìn)行。No—exit模塊內(nèi)的所有運(yùn)算操作轉(zhuǎn)換為VHDL語言里對(duì)應(yīng)的
基本操作。步驟(2)中被提前的加法或減法運(yùn)行在No—exit模塊內(nèi)不再運(yùn)算。 (5)Loop—exit模塊轉(zhuǎn)換。將Loop—exit這個(gè)模塊號(hào)作為循環(huán)結(jié)束使能信號(hào),為高
電平時(shí)表示循環(huán)結(jié)束。Loop—exit模塊內(nèi)的所有運(yùn)算操作轉(zhuǎn)換為VHDL語言里對(duì)應(yīng)的基本操作。
錯(cuò)誤!未找到引用源。為循環(huán)基本塊的硬件裝置圖,由計(jì)數(shù)器、比較器、選擇器、運(yùn) 算器四部分組成。計(jì)數(shù)器用于處理循環(huán)關(guān)鍵變量i ;比較器為BLoopentry中,br指令進(jìn)行 分支選擇依據(jù);選擇器用于PHI指令的數(shù)據(jù)選擇;運(yùn)算器則用于進(jìn)行循環(huán)體內(nèi)的運(yùn)算,這四 部分的具體內(nèi)容由實(shí)際進(jìn)行轉(zhuǎn)換的C代碼的結(jié)構(gòu)來決定。
2循環(huán)組合的實(shí)現(xiàn) 本發(fā)明實(shí)現(xiàn)循環(huán)組合的原理是通過多個(gè)高頻的循環(huán)基本模塊進(jìn)行相應(yīng)的組合實(shí)
現(xiàn)任意形式的循環(huán)組合。 2. 1循環(huán)并列 錯(cuò)誤!未找到引用源。為兩組循環(huán)所形成的并列結(jié)構(gòu)。若兩次循環(huán)之間沒有中間 運(yùn)算,則錯(cuò)誤!未找到引用源。中的No—exitJ)模塊只是進(jìn)行簡單的跳轉(zhuǎn),直接進(jìn)入新的循 環(huán);否則,在No—exitJ)模塊中做相應(yīng)的中間運(yùn)算,然后再跳轉(zhuǎn)到新的循環(huán)。利用實(shí)現(xiàn)循環(huán) 基本模塊的方法順序?qū)崿F(xiàn)兩個(gè)循環(huán)基本模塊,從而實(shí)現(xiàn)循環(huán)并列。兩次循環(huán)之間使能信號(hào) 傳遞方式如下 當(dāng)完成第一個(gè)循環(huán)基本模塊后,根據(jù)循環(huán)結(jié)束模塊里的br指令,將循環(huán)結(jié)束使能 信號(hào)Loop_eXit傳遞給跳轉(zhuǎn)到的模塊若兩次循環(huán)之間無中間運(yùn)算,則分析模塊跳轉(zhuǎn)關(guān)系 找到下一個(gè)BLoopentryJ,將Loop—exit使能信號(hào)按照邏輯傳遞給BLoopentryJ ;否則,將 Loop_eXit使能信號(hào)按照邏輯傳遞給運(yùn)算模塊使能信號(hào),最后再分析模塊跳轉(zhuǎn)關(guān)系找到下 一個(gè)BLoopentryj,將運(yùn)算模塊使能信號(hào)按照邏輯傳遞給BLoopentryJ 。
2.2循環(huán)嵌套 錯(cuò)誤!未找到引用源。為嵌套結(jié)構(gòu),在No—exitJ)模塊(循環(huán)體)內(nèi)又有圖5所 示的循環(huán)基本結(jié)構(gòu)。實(shí)現(xiàn)循環(huán)嵌套結(jié)構(gòu)里的各個(gè)循環(huán)基本模塊的方法同實(shí)現(xiàn)單個(gè)循環(huán)基 本模塊的方法相同。實(shí)現(xiàn)循環(huán)嵌套結(jié)構(gòu)的關(guān)鍵在于內(nèi)外層循環(huán)模塊之間模塊使能信號(hào)如 何傳遞。錯(cuò)誤!未找到引用源。中,如果外層循環(huán)的循環(huán)體No—exitJ)中無其他運(yùn)算,直 接進(jìn)入內(nèi)層循環(huán),則外層循環(huán)的BLoopentryJ)使能信號(hào)按照邏輯直接傳遞給內(nèi)層循環(huán)的 BLoopentryJ ;否則,將外層循環(huán)的BLoopentryJ)使能信號(hào)按照邏輯傳遞給外層循環(huán)體模 塊使能信號(hào)NO_exit_0,最后再將NO_exit_0按照邏輯傳遞給內(nèi)層循環(huán)的BLoopentryj,從 而完成外層循環(huán)與內(nèi)層循環(huán)間模塊使能信號(hào)的傳遞。
3循環(huán)實(shí)現(xiàn)結(jié)果 利用面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法與裝置,分別處理單個(gè)循環(huán)、并列循 環(huán)以及嵌套循環(huán)。將處理得到的VHDL程序利用Xilinx ISE工具仿真綜合,可得到圖9、圖 10以及圖ll所示的仿真結(jié)果。 錯(cuò)誤!未找到引用源。為l個(gè)循環(huán)的波形圖,循環(huán)次數(shù)為3。從圖中看出,該示例 中循環(huán)體執(zhí)行時(shí)間為1個(gè)時(shí)鐘節(jié)拍,即EN與No_exit的相位差為1個(gè)周期。在實(shí)際的應(yīng)用 中,循環(huán)體可能要執(zhí)行多個(gè)時(shí)鐘節(jié)拍,則EN在相應(yīng)的節(jié)拍數(shù)完成之后才變?yōu)楦唠娖健ee(cuò)誤! 未找到引用源。為2個(gè)循環(huán)順次連接的波形圖,2個(gè)循環(huán)的循環(huán)次數(shù)都為3。錯(cuò)誤!未找到 引用源。為2個(gè)循環(huán)嵌套連接的波形圖,內(nèi)外循環(huán)的循環(huán)次數(shù)都為3。在錯(cuò)誤!未找到引用 源。中,外層循環(huán)的EN與No—exit相差9個(gè)周期。因?yàn)樵趦?nèi)層循環(huán)完成全部運(yùn)算(循環(huán)) 之后,外層循環(huán)才步進(jìn)一次。
權(quán)利要求
一種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法,其特征是提前循環(huán)關(guān)鍵變量的自加操作,將循環(huán)控制與循環(huán)體內(nèi)運(yùn)算分開,從而分離了循環(huán)的控制信號(hào)與使能輸出信號(hào);提前循環(huán)關(guān)鍵變量的自加操作的方法如下通過分析模塊跳轉(zhuǎn)關(guān)系后,找到循環(huán)入口模塊;進(jìn)入循環(huán)入口模塊后,尋找循環(huán)關(guān)鍵變量;找到循環(huán)關(guān)鍵變量后,將循環(huán)關(guān)鍵的自加操作由循環(huán)體執(zhí)行模塊提前到循環(huán)入口模塊,使得循環(huán)的控制操作與循環(huán)體的運(yùn)算操作分開;最終分離了循環(huán)的控制信號(hào)與使能輸出信號(hào)。
2. 根據(jù)權(quán)利要求1所述的一種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法,其特征是實(shí)現(xiàn) 循環(huán)的具體處理步驟如下(1) 分析模塊跳轉(zhuǎn)關(guān)系找到LoopEntry ;(2) 處理PHI指令,提前循環(huán)關(guān)鍵變量的自加操作;通過LLVM中的dyn—cast指令對(duì)rai 指令中的各個(gè)操作數(shù)進(jìn)行指令類型轉(zhuǎn)換;如果操作數(shù)能轉(zhuǎn)換為指令,并且轉(zhuǎn)換成的指令類 型為加法或者減法則該操作數(shù)為關(guān)鍵變量;同時(shí)將該操作數(shù)所在的加法或減法運(yùn)算由循環(huán) 體執(zhí)行模塊(No_exit)提前到PHI指令所在模塊內(nèi)進(jìn)行運(yùn)算;(3) 判斷關(guān)鍵變量,產(chǎn)生循環(huán)控制信號(hào);根據(jù)循環(huán)控制信號(hào),進(jìn)入或跳出循環(huán)體操作; 若進(jìn)入循環(huán)體,則進(jìn)行循環(huán)體內(nèi)的相關(guān)運(yùn)算操作,直到循環(huán)關(guān)鍵變量不滿足循環(huán)有效的條 件,此時(shí)產(chǎn)生循環(huán)無效信號(hào),從而跳出循環(huán),進(jìn)行循環(huán)體外的相關(guān)運(yùn)算操作;(4) No_exit模塊轉(zhuǎn)換;將No_exit這個(gè)模塊號(hào)作為循環(huán)體操作模塊的使能信號(hào),為高 電平時(shí)表示循環(huán)繼續(xù)進(jìn)行;No_eXit模塊內(nèi)的所有運(yùn)算操作轉(zhuǎn)換為VHDL語言里對(duì)應(yīng)的基本 操作;步驟(2)中被提前的加法或減法運(yùn)行在No—exit模塊內(nèi)不再運(yùn)算;(5) Loop_eXit模塊轉(zhuǎn)換;將Loop_eXit這個(gè)模塊號(hào)作為循環(huán)結(jié)束使能信號(hào),為高電平 時(shí)表示循環(huán)結(jié)束;L00p_eXit模塊內(nèi)的所有運(yùn)算操作轉(zhuǎn)換為VHDL語言里對(duì)應(yīng)的基本操作。
3. 根據(jù)權(quán)利要求2所述的一種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法,其特征是實(shí)現(xiàn) 循環(huán)基本模塊的處理步驟如下5301 :當(dāng)重啟信號(hào)有效時(shí),首次進(jìn)入循環(huán)判斷;利用比較器比較循環(huán)關(guān)鍵變量值與n 值;根據(jù)比較器結(jié)果對(duì)循環(huán)進(jìn)行判斷,若循環(huán)有效,則進(jìn)入循環(huán)體內(nèi)進(jìn)行相應(yīng)運(yùn)算,運(yùn)算器 開始工作;5302 :當(dāng)重啟信號(hào)失效后,進(jìn)入循環(huán)控制變量自加判斷,不自加則重新回到重啟判斷部 分;否則利用計(jì)數(shù)器對(duì)循環(huán)關(guān)鍵變量進(jìn)行計(jì)數(shù)操作;5303 :自加或重啟后,選擇器對(duì)關(guān)鍵變量以及運(yùn)算器的運(yùn)算結(jié)果進(jìn)行選擇;然后再次 利用比較器比較選擇器對(duì)關(guān)鍵變量的選擇結(jié)果與n值的大小關(guān)系,根據(jù)比較器產(chǎn)生結(jié)果判 斷是否滿足循環(huán)有效的條件,滿足再次進(jìn)入循環(huán);不滿足則完成整個(gè)循環(huán);S304:完成本次循環(huán)操作。
4. 根據(jù)權(quán)利要求2所述的一種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法,其特征是能 夠處理由兩組循環(huán)所形成的并列循環(huán)結(jié)構(gòu);處理并列循環(huán)結(jié)構(gòu)的方法如下若兩次循環(huán)之 間沒有中間運(yùn)算,則NO_exit_0模塊只是進(jìn)行簡單的跳轉(zhuǎn),直接進(jìn)入新的循環(huán);否則,在No_ exit_0模塊中做相應(yīng)的中間運(yùn)算,然后再跳轉(zhuǎn)到新的循環(huán);兩次循環(huán)之間使能信號(hào)傳遞方 式如下當(dāng)完成第一個(gè)循環(huán)基本模塊后,根據(jù)循環(huán)結(jié)束模塊里的br指令,將循環(huán)結(jié)束使能信號(hào)Loop—exit傳遞給跳轉(zhuǎn)到的模塊若兩次循環(huán)之間無中間運(yùn)算,則分析模塊跳轉(zhuǎn)關(guān)系找 到下一個(gè)BLoopentry_l,將Loop_exit使能信號(hào)按照邏輯傳遞給BLoopentry_l ;否則,將 Loop_eXit使能信號(hào)按照邏輯傳遞給運(yùn)算模塊使能信號(hào),最后再分析模塊跳轉(zhuǎn)關(guān)系找到下 一個(gè)BLoopentryJ ,將運(yùn)算模塊使能信號(hào)按照邏輯傳遞給BLoopentryJ 。
5. 根據(jù)權(quán)利要求2所述的一種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法,其特征是能 夠處理由兩組循環(huán)所形成的嵌套循環(huán)結(jié)構(gòu);處理嵌套循環(huán)結(jié)構(gòu)的方法如下如果外層循環(huán)的循環(huán)體No—exitJ)中無其他運(yùn)算,直接進(jìn)入內(nèi)層循環(huán),則外層循環(huán)的 BLoopentryJ)使能信號(hào)按照邏輯直接傳遞給內(nèi)層循環(huán)的BLoopentryJ ;否則,將外層循環(huán) 的BLoopentryJ)使能信號(hào)按照邏輯傳遞給外層循環(huán)體模塊使能信號(hào)NO_exit_0,最后再將 No—exitJ)按照邏輯傳遞給內(nèi)層循環(huán)的BLoopentryJ,從而完成外層循環(huán)與內(nèi)層循環(huán)間模 塊使能信號(hào)的傳遞。
6. —種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法的映射裝置,其特征是由產(chǎn)生循環(huán)關(guān) 鍵變量的計(jì)數(shù)器,根據(jù)比較運(yùn)算結(jié)果決定是否進(jìn)行循環(huán)體內(nèi)運(yùn)算的比較器,根據(jù)選擇開關(guān) 值獲取循環(huán)體外的數(shù)據(jù)值或循環(huán)體內(nèi)運(yùn)算結(jié)果反饋值的選擇器,執(zhí)行循環(huán)體內(nèi)的運(yùn)算操作 的運(yùn)算器組成。
全文摘要
本發(fā)明提供的是一種面向計(jì)數(shù)類循環(huán)的C-to-VHDL映射方法及映射裝置。裝置由產(chǎn)生循環(huán)關(guān)鍵變量的計(jì)數(shù)器,根據(jù)比較運(yùn)算結(jié)果決定是否進(jìn)行循環(huán)體內(nèi)運(yùn)算的比較器,根據(jù)選擇開關(guān)值獲取循環(huán)體外的數(shù)據(jù)值或循環(huán)體內(nèi)運(yùn)算結(jié)果反饋值的選擇器,執(zhí)行循環(huán)體內(nèi)的運(yùn)算操作的運(yùn)算器組成。將C語言實(shí)現(xiàn)的計(jì)數(shù)類循環(huán)程序自動(dòng)轉(zhuǎn)換成能在Xilinx系列FPGA上實(shí)現(xiàn)的VHDL程序。該方法以時(shí)序電路為基礎(chǔ),通過分離循環(huán)的控制信號(hào)與使能輸出信號(hào),提前循環(huán)控制,將C語言中的計(jì)數(shù)類循環(huán)分解為一種時(shí)鐘頻率較高的循環(huán)基本模塊。通過對(duì)多個(gè)高頻的循環(huán)基本模塊的組合,可實(shí)現(xiàn)多種形式的C語言循環(huán)。
文檔編號(hào)G06F9/44GK101719068SQ20101003242
公開日2010年6月2日 申請(qǐng)日期2010年1月6日 優(yōu)先權(quán)日2010年1月6日
發(fā)明者吳艷霞, 孫延騰, 楊敏, 楊杰, 牛曉霞, 顧國昌 申請(qǐng)人:哈爾濱工程大學(xué)