本發(fā)明涉及計(jì)算機(jī)程序編譯技術(shù)領(lǐng)域,更具體的說(shuō)是涉及一種程序編譯方法和程序編譯器。
背景技術(shù):
本部分旨在為權(quán)利要求書(shū)中陳述的本發(fā)明的實(shí)施方式提供背景或上下文。此處的描述可包括可以探究的概念,但不一定是之前已經(jīng)想到或者已經(jīng)探究的概念。因此,除非在此指出,否則在本部分中描述的內(nèi)容對(duì)于本申請(qǐng)的說(shuō)明書(shū)和權(quán)利要求書(shū)而言不是現(xiàn)有技術(shù),并且并不因?yàn)榘ㄔ诒静糠种芯统姓J(rèn)是現(xiàn)有技術(shù)。
近年來(lái),現(xiàn)場(chǎng)可編程門陣列(Field-Programmable Gate Array,F(xiàn)PGA)發(fā)展迅速,在某些計(jì)算應(yīng)用中可以取得比CPU快數(shù)十倍的計(jì)算能力。在傳統(tǒng)計(jì)算中引入FPGA作為加速部件的可重構(gòu)計(jì)算(Reconfigurable Computing)也隨之繁榮,作為研究機(jī)構(gòu)和廠商制造了多種結(jié)構(gòu)各異的可重構(gòu)計(jì)算機(jī)。但是,針對(duì)這些可重構(gòu)計(jì)算機(jī)的編譯器開(kāi)發(fā),一直是可重構(gòu)技術(shù)發(fā)展的瓶頸之一。
技術(shù)實(shí)現(xiàn)要素:
發(fā)明人在實(shí)施本發(fā)明創(chuàng)造過(guò)程中,對(duì)相關(guān)技術(shù)進(jìn)行了研究和分析:
軟件編程模型依靠典型的串行指令流描述問(wèn)題,符合人們處理問(wèn)題的思維,但無(wú)法有效描述系統(tǒng)的并行行為;而硬件系統(tǒng)具有天然的并行特性,不易于被人們所理解,也沒(méi)有有效的形式化方法加以描述。所以,硬件設(shè)計(jì)在很長(zhǎng)時(shí)間內(nèi),不是通過(guò)程序設(shè)計(jì)方式來(lái)完成的,而是通過(guò)對(duì)物理器件間的直接組合的方式進(jìn)行。
硬件設(shè)計(jì)語(yǔ)言(Hardware Design Language,HDL)的出現(xiàn)很大程度上改善了硬件設(shè)計(jì)方式。它具有和高級(jí)語(yǔ)言相似的基本特性,又具有一定的靈活 性和抽象性,而且也能有效地描述硬件行為。但是,其抽象程度不高,編程模型與軟件模型相比差距較大。因此,對(duì)于一般的應(yīng)用程序開(kāi)發(fā)者,很難入門和使用,并且,HDL語(yǔ)言只能描述硬件行為,不能描述軟件程序,所以不能用其進(jìn)行軟硬件協(xié)同開(kāi)發(fā)。
為了高效、簡(jiǎn)便地使用可重構(gòu)計(jì)算機(jī),目前高層次綜合(High-Level Synthesis,HLS)成為新的研究熱點(diǎn)。HLS是指使用高級(jí)程序設(shè)計(jì)語(yǔ)言協(xié)同進(jìn)行軟硬件設(shè)計(jì),編譯器使用高級(jí)語(yǔ)言程序綜合處可配置的硬件邏輯。將高級(jí)語(yǔ)言綜合導(dǎo)入現(xiàn)有設(shè)計(jì)流程。開(kāi)發(fā)者能夠迅速地試驗(yàn)多種設(shè)計(jì)理念,創(chuàng)制工作模型,例如SystemC、Handle-C或Impulse C。
其中:
SystemC是開(kāi)放SystemC組織(Open SystemC Initiative,OSCI)組織制定并維護(hù)的一種建模平臺(tái),編程語(yǔ)言為C++,該平臺(tái)可以實(shí)現(xiàn)通信模塊、功能模塊、硬件模塊和軟件模塊在門級(jí)、寄存器傳輸級(jí)(Register-Transfer Level,RTL)、系統(tǒng)級(jí)等層次上的抽象,引進(jìn)了端口、信號(hào)等數(shù)據(jù)類型描述及時(shí)鐘、延時(shí)等概念。
Handle-C由Celoxica公司開(kāi)發(fā)(現(xiàn)已被Mentor Graphics公司收購(gòu)),編譯器包含在DK設(shè)計(jì)套件中,基于標(biāo)準(zhǔn)C語(yǔ)言,為支持硬件設(shè)計(jì)增加了一些附帶的特征,同時(shí)提供了用于并行處理的額外聲明和并行程序間通信的結(jié)構(gòu)。其圍繞簡(jiǎn)單的時(shí)間模式進(jìn)行設(shè)計(jì),每個(gè)分配指令花費(fèi)一個(gè)時(shí)鐘周期,在設(shè)計(jì)中,開(kāi)發(fā)者可以充分控制在任何時(shí)間點(diǎn)發(fā)生的任何事件,軟件運(yùn)行結(jié)構(gòu)可預(yù)測(cè)且可控。
Streams-C是美國(guó)洛斯阿拉莫斯國(guó)家實(shí)驗(yàn)室(Los Alamos National Laboratory,LANL)開(kāi)發(fā)的編程語(yǔ)言,為C語(yǔ)言的一個(gè)子集。配套的編譯器開(kāi)放源代碼,將用戶輸入的C程序轉(zhuǎn)換為可綜合的超高速集成電路硬件描述語(yǔ)言(Very-High-Speed Integrated Circuit Hardware Description Language,VHDL)代碼。
Impulse C由Impulse Accelerated Technologies公司開(kāi)發(fā),參考了Streams-C的編程模型和部分設(shè)計(jì)思想。其配套編譯器為CoDeveloper,可以針對(duì)嵌入式處理器平臺(tái)生成必要的軟硬件接口。
在對(duì)相關(guān)技術(shù)進(jìn)行了研究和分析后,發(fā)明人發(fā)現(xiàn)上述編譯器無(wú)法直接應(yīng)用于PRCA計(jì)算平臺(tái)中,并且上述編譯器僅關(guān)注C語(yǔ)言向HDL語(yǔ)言的轉(zhuǎn)化步驟,而對(duì)后續(xù)步驟的自動(dòng)化支持不夠。以CoDeveloper為例,得到HDL代碼后,用戶還需手動(dòng)調(diào)用Xilinx ISE套件中的XPS軟件建立工程,并經(jīng)過(guò)一系列復(fù)雜的操作之后才能最終得到可下載的硬件配置文件。
有鑒于此,本發(fā)明的目的在于提供一種程序編譯方法和程序編譯器。
本發(fā)明的一方面,公開(kāi)了一種程序編譯方法,包括:
響應(yīng)于用戶的程序選擇操作,確定屬于C語(yǔ)言源程序的待處理應(yīng)用程序;
將所述應(yīng)用程序處理成HDL程序和C語(yǔ)言軟件程序;
依據(jù)HDL程序生成硬件編譯程序腳本,以及,依據(jù)C語(yǔ)言軟件程序生成軟件編譯程序腳本;
應(yīng)用戶操作,執(zhí)行硬件編譯腳本以將HDL程序處理得到硬件配置文件,以及,應(yīng)用戶操作,執(zhí)行軟件編譯腳本以將C語(yǔ)言軟件程序處理得到ELF格式的可執(zhí)行文件。
從上述技術(shù)方案可以看出,本發(fā)明提供的方案針對(duì)PRCA計(jì)算平臺(tái)的特點(diǎn)或特性,將C語(yǔ)言源文件自動(dòng)轉(zhuǎn)換成可以應(yīng)用在PRCA計(jì)算平臺(tái)的硬件配置文件和ELF文件。并且,在開(kāi)發(fā)過(guò)程中,用戶不需要編寫(xiě)HDL程序,也不需要建立ISE工程,甚至可以完全不具備FPGA編程基礎(chǔ)。這樣不僅減輕了硬件程序編寫(xiě)的工作量,而且擴(kuò)大了PRCA計(jì)算平臺(tái)的使用范圍。
在一些優(yōu)選實(shí)施例中,上述將所述應(yīng)用程序處理成HDL程序這個(gè)過(guò)程可以包括以下步驟:
預(yù)處理,包括依次對(duì)所述應(yīng)用程序進(jìn)行語(yǔ)法檢查,宏替換和內(nèi)聯(lián)函數(shù)展開(kāi),及代碼改寫(xiě)以增加臨時(shí)變量的方式簡(jiǎn)化較長(zhǎng)的語(yǔ)句;
對(duì)于所述應(yīng)用程序中的臨時(shí)變量及用戶定義變量,以寄存器定義,對(duì)于數(shù)組,則對(duì)應(yīng)Block RAM模塊,然后對(duì)所述應(yīng)用程序進(jìn)行模塊劃分,將劃分 的塊轉(zhuǎn)換為數(shù)據(jù)流圖,所述模塊劃分的順序按照從大到小的順序進(jìn)行,直到劃分成基本塊為止;
創(chuàng)建一個(gè)有限狀態(tài)自動(dòng)機(jī),將每個(gè)基本塊作為狀態(tài)機(jī)的一個(gè)狀態(tài),依據(jù)基本塊之間的連接關(guān)系確定狀態(tài)機(jī)之間的轉(zhuǎn)換關(guān)系,利用所述狀態(tài)自動(dòng)機(jī)及所述數(shù)據(jù)流圖,生成HDL程序和C語(yǔ)言軟件程序。
優(yōu)選的,所述將所述應(yīng)用程序處理成HDL程序還包括:
生成編譯報(bào)告,所述編譯報(bào)告為編譯概要或數(shù)據(jù)流圖信息,所述編譯概要用于指示編譯參數(shù)及編譯過(guò)程中出現(xiàn)的錯(cuò)誤或警告。
優(yōu)選的,所述硬件編譯程序腳本由批處理文件和腳本文件組成,所述依據(jù)HDL程序生成硬件編譯腳本包括:調(diào)用批處理文件,由批處理文件調(diào)用腳本文件,然后由腳本文件調(diào)用ISE,完成編譯過(guò)程。
優(yōu)選的,依據(jù)C語(yǔ)言軟件程序生成軟件編譯腳本的過(guò)程包括:
預(yù)先編寫(xiě)一個(gè)標(biāo)準(zhǔn)的Makefile文件,并拷貝至預(yù)定目錄下;
在UNIX或Linux環(huán)境下調(diào)用Make命令,調(diào)用軟件編譯腳本。(這個(gè)地方有些混亂。Make命令是用戶調(diào)用的,目的是通過(guò)該命令調(diào)用軟件編譯腳本,這個(gè)腳本就是指Makefile文件。)
優(yōu)選的,按照以下步驟將HDL程序處理得到硬件配置文件:
硬件編譯腳本在執(zhí)行時(shí)調(diào)用ISE建立工程,利用所述HDL程序及預(yù)設(shè)的硬件模塊庫(kù),經(jīng)綜合、實(shí)現(xiàn)過(guò)程得到硬件配置文件。
優(yōu)選的,所述將C語(yǔ)言軟件程序處理得到ELF格式的可執(zhí)行文件包括:
軟件編譯腳本調(diào)用GCC進(jìn)行編譯,利用所述C語(yǔ)言軟件程序和預(yù)設(shè)的軟件函數(shù)庫(kù),處理得到ELF格式的可執(zhí)行文件。
本發(fā)明的另一方面,記載了一種程序編譯器,其包括編譯模塊和腳本生成器,其中:
所述編譯模塊用于將用戶選定的屬于C語(yǔ)言源程序的待處理應(yīng)用程序處理成HDL程序和C語(yǔ)言軟件程序;
所述腳本生成器用于依據(jù)HDL程序生成硬件編譯程序腳本,以及,依據(jù)C語(yǔ)言軟件程序生成軟件編譯程序腳本,其中,所述硬件編譯程序腳本在被執(zhí) 行時(shí),將HDL程序處理得到硬件配置文件,所述軟件編譯腳本在被執(zhí)行時(shí),將C語(yǔ)言軟件程序處理得到ELF格式的可執(zhí)行文件。
優(yōu)選的,上述程序編譯器還包括用于對(duì)待處理應(yīng)用程序進(jìn)行預(yù)處理的部件,所述預(yù)處理包括依次對(duì)所述應(yīng)用程序進(jìn)行語(yǔ)法檢查,宏替換和內(nèi)聯(lián)函數(shù)展開(kāi),及代碼改寫(xiě)以增加臨時(shí)變量的方式簡(jiǎn)化較長(zhǎng)的語(yǔ)句;
所述編譯模塊包括:
定義模塊,用于對(duì)于所述應(yīng)用程序中的臨時(shí)變量及用戶定義變量,以寄存器定義,對(duì)于數(shù)組,則對(duì)應(yīng)Block RAM模塊;
劃分模塊,用于對(duì)所述應(yīng)用程序進(jìn)行模塊劃分,劃分的順序按照從大到小的順序進(jìn)行,直到劃分成基本塊為止;
數(shù)據(jù)流圖單元,用于將劃分的塊轉(zhuǎn)換為數(shù)據(jù)流圖;
代碼生成單元,用于創(chuàng)建一個(gè)有限狀態(tài)自動(dòng)機(jī),將每個(gè)基本塊作為狀態(tài)機(jī)的一個(gè)狀態(tài),依據(jù)基本塊之間的連接關(guān)系確定狀態(tài)機(jī)之間的轉(zhuǎn)換關(guān)系,利用所述狀態(tài)自動(dòng)機(jī)及所述數(shù)據(jù)流圖,生成HDL程序和C語(yǔ)言軟件程序。
優(yōu)選的,上述程序編譯器中,所述編譯模塊還包括生成編譯報(bào)告的編譯報(bào)告生成單元,所述編譯報(bào)告為編譯概要或數(shù)據(jù)流圖信息,所述編譯概要用于指示編譯參數(shù)及編譯過(guò)程中出現(xiàn)的錯(cuò)誤或警告。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
圖1示意性地示出了根據(jù)本發(fā)明實(shí)施方式在實(shí)際應(yīng)用中的一個(gè)應(yīng)用場(chǎng)景的框架示意圖;
圖2示意性地示出了根據(jù)本發(fā)明方法一實(shí)施方式的流程圖;
圖3圖4示意性地示出了本發(fā)明實(shí)施方式中,核心編譯模塊將所述應(yīng)用程序處理成HDL程序和C語(yǔ)言軟件程序的流程圖;
圖5示意性地加法器的流圖示意圖;
圖6示意性地示出了本發(fā)明裝置一實(shí)施例方式的結(jié)構(gòu)示意圖;
圖7示意性地示出了本發(fā)明裝置另一實(shí)施例方式的結(jié)構(gòu)示意圖;
圖8示意性地示出了本發(fā)明裝置又一實(shí)施例方式的結(jié)構(gòu)示意圖;
圖9示意性地示出了本發(fā)明裝置另外一實(shí)施例方式的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面將參照本發(fā)明實(shí)施方式的方法的流程圖和設(shè)備(或系統(tǒng))的框圖描述本發(fā)明的實(shí)施方式。應(yīng)當(dāng)理解,流程圖和/或框圖的每個(gè)方框以及流程圖和/或框圖中各方框的組合都可以由計(jì)算機(jī)程序指令實(shí)現(xiàn)。這些計(jì)算機(jī)程序指令可以提供給通用計(jì)算機(jī)、專用計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置的處理器,從而生產(chǎn)出一種機(jī)器,這些計(jì)算機(jī)程序指令通過(guò)計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置執(zhí)行,產(chǎn)生了實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的裝置。
也可以把這些計(jì)算機(jī)程序指令存儲(chǔ)在能使得計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置以特定方式工作的計(jì)算機(jī)可讀介質(zhì)中,這樣,存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)中的指令就產(chǎn)生出一個(gè)包括實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的指令裝置的產(chǎn)品。
也可以把計(jì)算機(jī)程序指令加載到計(jì)算機(jī)、其它可編程數(shù)據(jù)處理裝置、或其它設(shè)備上,使得在計(jì)算機(jī)、其它可編程數(shù)據(jù)處理裝置或其它設(shè)備上執(zhí)行一系列操作步驟,以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的過(guò)程,從而使得在計(jì)算機(jī)或其它可編程裝置上執(zhí)行的指令能夠提供實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的過(guò)程。
根據(jù)本發(fā)明的實(shí)施方式,提出了一種程序編譯方法和程序編譯器。附圖中的任何元素?cái)?shù)量均用于示例而非限制,以及任何命名都僅用于區(qū)分,而不具有任何限制含義。
為了方便技術(shù)人員理解,下面先對(duì)PRCA進(jìn)行簡(jiǎn)單介紹:
2012年10月10日,一種新概念高效能計(jì)算機(jī)體系―基于認(rèn)知的主動(dòng)重構(gòu)計(jì)算體系(簡(jiǎn)稱為PRCA)被發(fā)布。
PRCA與普通計(jì)算體系相比,以下方面存在較大區(qū)別:
一、通信方式,PRCA的硬件程序運(yùn)行在專用的FPGA服務(wù)器上,軟件程序運(yùn)行在通用服務(wù)器上。發(fā)明人經(jīng)過(guò)研究發(fā)現(xiàn),在PRCA平臺(tái)中,兩類服務(wù)器之間最方便的連接方式是千兆以太網(wǎng),即千兆以太網(wǎng)被選定作為軟硬件程序間的通信方式。這與采用PCI接口、PLB總線、InfiniBand作為通信方式的其他可重構(gòu)系統(tǒng)明顯不同。相應(yīng)的,通信方式不同,軟硬件程序就會(huì)有很大差異。
二、硬件結(jié)構(gòu),F(xiàn)PGA與相關(guān)外設(shè)的連接方式在不同的計(jì)算平臺(tái)下總是存在一些差異。單就FPGA與內(nèi)存的連接而言,可能存在的差異包括:內(nèi)存的種類(DDR2或DDR3)、容量(2G或32G)、管腳接口類型。具體例如:PRCA平臺(tái)為每個(gè)FPGA配備3條8GB DDR3內(nèi)存,接口為204針。作為對(duì)比,另一種BEE3型可重構(gòu)計(jì)算機(jī)為每個(gè)FPGA配備2條4GB DDR2內(nèi)存,接口也為204針。
下面參考本發(fā)明的若干代表性實(shí)施方式,詳細(xì)闡釋本發(fā)明的原理和精神。
發(fā)明概述
發(fā)明人在研究過(guò)程中,針對(duì)PRCA計(jì)算平臺(tái)的特點(diǎn)或特性,將C語(yǔ)言源文件轉(zhuǎn)換成可以應(yīng)用在PRCA計(jì)算平臺(tái)的硬件配置文件(bit文件)和ELF文件,軟硬件之間的底層通信過(guò)程對(duì)用戶透明。并且,在開(kāi)發(fā)過(guò)程中,用戶不需要編寫(xiě)HDL程序,也不需要建立ISE工程,甚至可以完全不具備FPGA編程基礎(chǔ)。這樣不僅減輕了硬件程序編寫(xiě)的工作量,而且擴(kuò)大了PRCA計(jì)算平臺(tái)的使用范圍,使更多的應(yīng)用能夠通過(guò)可重構(gòu)計(jì)算的方式快速實(shí)現(xiàn),一些現(xiàn)有代碼也能夠以比較簡(jiǎn)單的方式進(jìn)行復(fù)用。
并且,本方案中,軟硬件之間的底層通信過(guò)程對(duì)用戶是透明的,即用戶在編程時(shí)不需了解底層通信的具體細(xì)節(jié),具體通信的時(shí)候,底層模塊會(huì)對(duì)用戶數(shù)據(jù)進(jìn)行封裝,添加MAC地址、幀類型、序號(hào)等內(nèi)容,用戶看不到這些工作,也無(wú)法進(jìn)行控制,就像透明一樣。用戶甚至可能不知道我們?cè)谑褂靡蕴? 網(wǎng)進(jìn)行通信。如此,用戶只需專注數(shù)據(jù)本身,不必在意底層細(xì)節(jié),有利于提高開(kāi)發(fā)效率,和保證程序的可靠性。還有一個(gè)優(yōu)點(diǎn)是,如果PRCA平臺(tái)和編譯器做出了改進(jìn),已經(jīng)寫(xiě)好的用戶代碼不需要修改,因?yàn)檫@些代碼中不包含實(shí)現(xiàn)細(xì)節(jié)。
此外,通過(guò)本方案,一些現(xiàn)有代碼也能夠以比較簡(jiǎn)單的方式進(jìn)行復(fù)用,例如,針對(duì)一個(gè)使用MPI寫(xiě)好的計(jì)算π的程序,傳統(tǒng)的可重構(gòu)系統(tǒng)開(kāi)發(fā)方式,需要開(kāi)發(fā)人員讀懂原有的MPI程序后用HDL語(yǔ)言重寫(xiě),而由于HDL語(yǔ)言的編寫(xiě)思路與C語(yǔ)言有很大不同,因此重寫(xiě)過(guò)程需要開(kāi)發(fā)人員耗費(fèi)較多的精力和時(shí)間。而如果采用本方案,則可以進(jìn)行簡(jiǎn)單修改(例如將MPI_Init換成初始化函數(shù),將MPI_Send和MPI_Recv換成定義的通信函數(shù)等),即可在PRCA平臺(tái)上使用,關(guān)鍵的程序段都可以保留(例如計(jì)算π的算法),較大地節(jié)約了開(kāi)發(fā)人員的時(shí)間和精力。
在介紹了本發(fā)明的基本原理之后,下面具體介紹本發(fā)明的各種非限制性實(shí)施方式。
應(yīng)用場(chǎng)景總覽
參考圖1,為本發(fā)明實(shí)施方式的一個(gè)示例性應(yīng)用場(chǎng)景的框架示意圖。其中,用戶通過(guò)輸入輸出設(shè)備11與計(jì)算機(jī)12交互。本領(lǐng)域技術(shù)人員可以理解,圖1所示的框架示意圖僅是本發(fā)明的實(shí)施方式可以在其中得以實(shí)現(xiàn)的一個(gè)示例。本發(fā)明實(shí)施方式的適用范圍不受到該框架任何方面的限制。
所述輸入輸出設(shè)備11可以是鍵盤和顯示器的組合,也可以是觸摸屏或者其他具有輸入輸出功能的設(shè)備。
在圖1所示的示例性應(yīng)用場(chǎng)景中,計(jì)算機(jī)12響應(yīng)于用戶輸入的指令,進(jìn)行相應(yīng)操作,包括調(diào)用內(nèi)部計(jì)算或處理模塊對(duì)指定的程序或數(shù)據(jù)進(jìn)行處理。
示例性方法
下面結(jié)合圖1的應(yīng)用場(chǎng)景,參考圖2來(lái)描述根據(jù)本發(fā)明示例性實(shí)施方式的程序編譯方法。需要注意的是,上述應(yīng)用場(chǎng)景僅是為了便于理解本發(fā)明的精神和原理而示出,本發(fā)明的實(shí)施方式在此方面不受任何限制。相反,本發(fā)明的實(shí)施方式可以應(yīng)用于適用的任何場(chǎng)景。
參考圖2所示,為本發(fā)明提供的程序編譯方法一實(shí)施方式的流程圖,本實(shí)施方式可以包括以下步驟:
步驟S21、響應(yīng)于用戶的程序選擇操作,確定屬于C語(yǔ)言源程序的待處理應(yīng)用程序。
用戶可以通過(guò)輸入輸出設(shè)備11選擇待處理應(yīng)用程序,所述待處理應(yīng)用程序可以是預(yù)先傳輸?shù)接?jì)算機(jī)12中的,也可以是在用戶從與計(jì)算機(jī)12連接的外部設(shè)備(例如U盤)中選擇。
所述待處理應(yīng)用程序分為軟件部分和硬件部分,軟件部分和硬件部分之間通過(guò)設(shè)定的函數(shù)(即通信函數(shù))進(jìn)行相互關(guān)聯(lián)。
步驟S22、調(diào)用核心編譯模塊,將所述應(yīng)用程序處理成HDL程序和C語(yǔ)言軟件程序。
步驟S23、調(diào)用腳本生成器,依據(jù)所述HDL程序和C語(yǔ)言軟件程序,生成軟硬件程序編譯腳本。
腳本的生成過(guò)程如下:
針對(duì)軟件程序腳本,則預(yù)先編寫(xiě)一個(gè)標(biāo)準(zhǔn)的Makefile文件,并將其拷貝到預(yù)定目錄下。于是,在生成軟件程序時(shí),在UNIX/Linux環(huán)境下調(diào)用make命令即可。
針對(duì)硬件程序腳本,硬件編譯程序腳本由一個(gè)批處理文件(.bat)和一個(gè)腳本文件(.tcl)組成,在生成硬件編譯程序腳本時(shí),用戶直接調(diào)用批處理文件,批處理文件再調(diào)用腳本文件,腳本文件最終調(diào)用ISE完成編譯。
所述批處理文件內(nèi)容是固定的,預(yù)先拷貝到預(yù)定目錄下。
所述腳本文件大部分內(nèi)容是固定的,但是其余內(nèi)容是可變的。在主程序中,可以使用一個(gè)函數(shù)來(lái)調(diào)用一個(gè)腳本,從而生成這個(gè)腳本。該函數(shù)調(diào)用的腳本是固定的且預(yù)先寫(xiě)好的。該腳本的作用至少包括兩點(diǎn):一是將固定內(nèi)容從自身逐行拷貝到新生成的腳本中,二是根據(jù)函數(shù)調(diào)用時(shí)傳遞的參數(shù),生成一部分新內(nèi)容,寫(xiě)到新生成的腳本中。函數(shù)傳遞的參數(shù)主要包括設(shè)計(jì)名稱、用到的外設(shè)(比如,有沒(méi)有用到DDR)等。
步驟S24、應(yīng)用戶操作,執(zhí)行硬件編譯腳本,將HDL程序處理得到硬件配置文件。
用戶執(zhí)行硬件編譯腳本,腳本調(diào)用ISE建立工程,引進(jìn)剛剛生成的HDL程序和硬件模塊庫(kù),經(jīng)綜合、實(shí)現(xiàn)等步驟后,最終得到硬件配置文件(可配置的Bit文件)。
所述硬件模塊庫(kù)是一些預(yù)定義的、與應(yīng)用無(wú)關(guān)的HDL文件,主要定義了兩類硬件模塊:一是與PRCA系統(tǒng)相關(guān)的接口模塊,比如以太網(wǎng)接口、DDR接口等;二是與系統(tǒng)無(wú)關(guān)的IP模塊,比如Xilinx浮點(diǎn)數(shù)計(jì)算模塊。
所述ISE是Xilinx公司針對(duì)其FPGA產(chǎn)品提供的開(kāi)發(fā)軟件,具備TCL語(yǔ)言的調(diào)用接口。調(diào)用ISE建立工程就是通過(guò)TCL語(yǔ)言的命令實(shí)現(xiàn)的,包括以下步驟:
A、建立一個(gè)空的ISE工程,初始化相關(guān)變量。
B、選擇FPGA的系列、型號(hào)、封裝、速度等級(jí)。這些需要同PRCA平臺(tái)使用的FPGA一致,是在編譯器中預(yù)先設(shè)定好的。
C、設(shè)定工程基本設(shè)置。比如,選擇頂層模塊輸入方式為HDL、默認(rèn)HDL語(yǔ)言為Verilog、綜合工具為XST(Xilinx公司的綜合器),等等。這部分內(nèi)容也是確定的。
D、加入工程文件。將剛剛生成的HDL文件和用到的庫(kù)文件逐個(gè)添加到ISE工程中,包括HDL源文件(.v,.vhd)、網(wǎng)表文件(.ngc)和約束文件(.ucf)等。這里有一部分內(nèi)容是可變的,需要上文提到的函數(shù)傳遞的信息,比如工程名稱、用到的外設(shè)等。
E、建立庫(kù)。部分Xilinx的IP核屬于XilinxCoreLib庫(kù),而不是默認(rèn)的Work庫(kù),所以需要新建XilinxCoreLib庫(kù),并將相關(guān)文件移到該庫(kù)中。
F、設(shè)定綜合選項(xiàng)。這些選項(xiàng)會(huì)對(duì)生成的bit文件產(chǎn)生影響,所以要正確設(shè)置。設(shè)置的方式是固定的,預(yù)先定義在編譯器中。
在建立ISE工程以后,就可以進(jìn)行綜合、實(shí)現(xiàn)過(guò)程,該過(guò)程包括以下步驟:
①綜合(Synthesize)。在腳本中調(diào)用ISE的綜合命令即可?!熬C合”一詞大致有廣義和狹義兩種用法,這里取狹義,指根據(jù)FPGA源文件生成網(wǎng)表文 件(.ngc)的過(guò)程;廣義則可指代整個(gè)硬件配置文件的生成過(guò)程,相當(dāng)于軟件的“編譯”。
②實(shí)現(xiàn)(Implement)。也是在腳本中調(diào)用一條ISE命令即可。但該命令在執(zhí)行時(shí),實(shí)際上包括轉(zhuǎn)換(Translate)、映射(Map)和布線(Place&Route)等步驟,是整個(gè)硬件配置文件生成過(guò)程中最耗時(shí)的步驟。
③生成配置文件(Generate Programming File)。產(chǎn)生一條ISE命令以執(zhí)行生成配置文件的步驟。
bit文件也可稱為“配置文件”,其常用的一種格式的后綴是.bit(還有其他格式,對(duì)應(yīng)有其他后綴,如.mcs)。
該配置文件對(duì)于硬件而言,相當(dāng)于的可執(zhí)行文件。
將配置文件“配置”(program,中文也常說(shuō)“下載”、“燒寫(xiě)”等)到FPGA中,就可改變其內(nèi)部邏輯,使其完成預(yù)定的功能。反過(guò)來(lái)講,如果想使用FPGA,就需要用配置文件對(duì)其進(jìn)行配置或“編程”。
步驟S25、應(yīng)用戶操作,執(zhí)行軟件編譯腳本,將C語(yǔ)言軟件程序處理得到ELF格式的可執(zhí)行文件。
用戶執(zhí)行軟件編譯腳本,腳本調(diào)用GCC進(jìn)行編譯,引進(jìn)剛剛生成的C語(yǔ)言軟件程序和軟件函數(shù)庫(kù),最終得到ELF格式的可執(zhí)行文件。
針對(duì)在程序設(shè)計(jì)中經(jīng)常用到的功能,預(yù)先編譯一些庫(kù)(例如用于以太網(wǎng)通信的libpcap庫(kù)),存放在計(jì)算機(jī)的特定位置(比如/usr/local),在程序設(shè)計(jì)過(guò)程中,需要實(shí)現(xiàn)這些功能時(shí),即可通過(guò)特定位置查找這些相應(yīng)的庫(kù)即可使用。
具體過(guò)程如下:
用戶執(zhí)行軟件編譯腳本,通過(guò)Make調(diào)用預(yù)先準(zhǔn)備的Makefile,所述Makefile中寫(xiě)有一條GCC命令,該命令中包含生成C語(yǔ)言源程序文件標(biāo)識(shí)、軟件函數(shù)庫(kù)標(biāo)識(shí)和生成文件標(biāo)識(shí)等信息;于是,調(diào)用Makefile時(shí),依據(jù)GCC命令中的標(biāo)識(shí)查找相應(yīng)的庫(kù),確定所需數(shù)據(jù),然后再將C語(yǔ)言軟件程序和所述所需數(shù)據(jù)進(jìn)行編譯,形成ELF格式的可執(zhí)行文件。
此外,本實(shí)施例中,預(yù)先將待處理應(yīng)用程序生成腳本,腳本可以使軟硬件程序的生成更方便,生成的過(guò)程只需一條簡(jiǎn)單的命令即可,無(wú)需手工書(shū)寫(xiě)相關(guān)命令(例如)GCC命令、手工添加編譯所需的庫(kù),及在編譯硬件程序時(shí)手工建立ISE工程(建立ISE工程需要大量的鼠標(biāo)操作,需要添加文件,更改工程選項(xiàng)等),節(jié)省了大量的人工,減少了出錯(cuò)的幾率。
當(dāng)然,在其他實(shí)施例中,也可以不需要生成腳本,而是直接通過(guò)手工方式書(shū)寫(xiě)相關(guān)命令(例如GCC命令),并在需要時(shí)添加編譯所需的庫(kù),編譯硬件程序時(shí)手工建立ISE工程,甚至也可以手工書(shū)寫(xiě)腳本。
在執(zhí)行上述各步驟后,就可以應(yīng)用戶操作,將Bit文件和ELF文件加載到PRCA計(jì)算平臺(tái),即調(diào)用PRCA下載工具將Bit文件和ELF文件加載到PRCA計(jì)算平臺(tái),得到用戶所需的計(jì)算結(jié)果。比如用戶想計(jì)算N-Body問(wèn)題,他輸入的數(shù)據(jù)是某一時(shí)刻各個(gè)天體的質(zhì)量、位置和速度,經(jīng)PRCA計(jì)算后將返回下一時(shí)刻各個(gè)天體的位置和速度。再比如用戶想進(jìn)行圖像識(shí)別,輸入的數(shù)據(jù)是兩幅圖片的像素信息,經(jīng)計(jì)算后得到的結(jié)果是表示這兩幅圖片間相似程度的一個(gè)數(shù)值等。
可以看出,用戶在C語(yǔ)言源碼中使用流結(jié)構(gòu)體(stream)代表軟硬件之間的連接關(guān)系,使用流讀寫(xiě)函數(shù)(stream_write、stream_read)進(jìn)行通信,這些結(jié)構(gòu)體和函數(shù)在編譯時(shí)被替換為具有實(shí)際通信功能的模塊或函數(shù)。具體來(lái)講,在硬件程序中,流被例化為具有收發(fā)包功能的stream模塊,流讀寫(xiě)函數(shù)被轉(zhuǎn)化為對(duì)stream模塊的讀寫(xiě)操作;在軟件程序中,流被例化為libpcap中的pcap_t結(jié)構(gòu),流讀寫(xiě)函數(shù)被轉(zhuǎn)化為收發(fā)包操作。這個(gè)過(guò)程中,用戶在編寫(xiě)源碼時(shí)使用的僅僅是抽象的結(jié)構(gòu)體或函數(shù)。硬件方面的stream模塊及相關(guān)硬件讀寫(xiě)操作、軟件方面調(diào)用libpcap收發(fā)包的過(guò)程等等都是定義在編譯器中,由預(yù)先定義好的代碼具體實(shí)施收發(fā)包的功能。綜上,軟硬件之間的底層通信過(guò)程是對(duì)用戶透明的。
并且,因?yàn)橥ㄐ胚^(guò)程透明,用戶只需調(diào)用簡(jiǎn)單的函數(shù)就可以實(shí)現(xiàn)軟硬件之間的通信。在基于消息傳遞的編程模型中,用于通信的函數(shù)都是比較類似 的,只要替換這些函數(shù)就能將其移植到PRCA平臺(tái)上。比如上面所舉關(guān)于MPI的例子。這個(gè)過(guò)程的“簡(jiǎn)單”是指相對(duì)于HDL方式重新代碼而言,修改代碼較少、難度較低,仍需開(kāi)發(fā)人員手工修改,軟件無(wú)法自動(dòng)完成。
上述步驟S22中生成HDL程序的具體實(shí)現(xiàn)流程如圖3所示,包括以下步驟:
步驟S31、預(yù)處理。
在轉(zhuǎn)換工作開(kāi)始時(shí),核心編譯模塊首先對(duì)C語(yǔ)言源文件的硬件部分程序進(jìn)行檢查和預(yù)處理,為后面的轉(zhuǎn)換工作做準(zhǔn)備。先進(jìn)行語(yǔ)法檢查,在語(yǔ)法檢查沒(méi)問(wèn)題后,進(jìn)行宏替換和內(nèi)聯(lián)函數(shù)展開(kāi),最后進(jìn)行代碼改寫(xiě),以增加臨時(shí)變量的方式簡(jiǎn)化較長(zhǎng)的語(yǔ)句。建立輸出文件,打印頭部信息。
所述宏替換操作類似于文本編輯工具(如記事本)的“替換”功能。在源文件中宏的定義方式為:
#define PI 3.1416
在進(jìn)行宏替換的時(shí)候,編譯器就會(huì)遍歷源代碼,將所有出現(xiàn)的“PI”換成“3.1416”。
所述內(nèi)聯(lián)函數(shù)展開(kāi)道理類似。
假設(shè)內(nèi)聯(lián)函數(shù)定義為:
inline int bigger(int a,int b){return a>b?a:b;}
編譯器遍歷源代碼,將所有形如bigger(a,b)的字符串替換為(a>b?a:b),其中a和b代表兩個(gè)不同的變量,可以寫(xiě)作其他形式。
內(nèi)聯(lián)函數(shù)與宏的區(qū)別是內(nèi)聯(lián)函數(shù)會(huì)進(jìn)行語(yǔ)法檢查,此外宏也可以帶參數(shù),與內(nèi)聯(lián)函數(shù)的替換方式類似。
需要說(shuō)明的是,為了方便數(shù)據(jù)流圖的生成,需要先對(duì)源代碼進(jìn)行化簡(jiǎn),使每一行語(yǔ)句僅包含一個(gè)運(yùn)算符或一個(gè)函數(shù)。對(duì)于包含多個(gè)運(yùn)算符和函數(shù)的語(yǔ)句,添加臨時(shí)變量將其改寫(xiě),添加臨時(shí)變量的順序與算式的優(yōu)先級(jí)一致。比如對(duì)下面一行源代碼:
square=x*x+y*y+z*z;
可以簡(jiǎn)化為
temp1=x*x;
temp2=y(tǒng)*y;
temp3=temp1+temp2;
temp4=z*z;
square=temp3+temp4。
從而實(shí)現(xiàn)對(duì)較長(zhǎng)的語(yǔ)句的簡(jiǎn)化。
步驟S32、資源分配與數(shù)據(jù)流圖生成。
對(duì)于用戶定義變量和臨時(shí)變量,在HDL文件中用寄存器定義;對(duì)于數(shù)組,生成對(duì)應(yīng)的Block RAM模塊。
根據(jù)C語(yǔ)言源程序生成數(shù)據(jù)流圖(Data Flow Graph,DFG)。首先對(duì)C語(yǔ)言源程序進(jìn)行模塊劃分,先分為較大的語(yǔ)法塊,再將其逐步劃分成更小的塊,直到基本塊為止。基本塊是不再劃分的語(yǔ)法塊,已經(jīng)可以被后續(xù)步驟直接分析。
所述語(yǔ)法塊分為串行、循環(huán)、流水三種語(yǔ)法塊,每種語(yǔ)法塊均對(duì)應(yīng)不同的處理方式。
其中:
語(yǔ)法塊(Block)指一段關(guān)系比較緊密的代碼,可以包括一行或多行。語(yǔ)法塊可以嵌套,即較大的語(yǔ)法塊可以進(jìn)一步劃分為較小的語(yǔ)法塊。對(duì)于劃分方法和語(yǔ)法塊的邊界(究竟包括哪些行),一般沒(méi)有嚴(yán)格要求,以便于代碼生成為準(zhǔn)?;緣K是不再劃分的語(yǔ)法塊,已經(jīng)可以被后續(xù)步驟直接分析。
循環(huán)語(yǔ)法塊(Loop)指可能被多次執(zhí)行的語(yǔ)法塊,在C語(yǔ)言源代碼中用關(guān)鍵字顯式標(biāo)出,共有while、for、do-while三種形式。這種語(yǔ)法塊有確切的邊界,由C語(yǔ)言語(yǔ)法決定。
串行語(yǔ)法塊(Serial)指順序執(zhí)行的語(yǔ)法塊,其中的代碼都只被執(zhí)行一次。流水語(yǔ)法塊(Pipeline)是在以上兩種語(yǔ)法塊上添加了流水編譯宏的語(yǔ)法塊,該編譯宏寫(xiě)作“#PIPELINE”。定義流水語(yǔ)法塊時(shí),需用大括號(hào)指定代碼范圍,在頭部添加編譯宏。流水語(yǔ)法塊編譯后的代碼采用流水線方式運(yùn)行, 比串行方式具有更高的效率,但會(huì)耗費(fèi)更多的資源。一般來(lái)講,流水語(yǔ)法塊在循環(huán)語(yǔ)法塊的基礎(chǔ)上進(jìn)行定義,這樣易于提高系統(tǒng)性能。
下面介紹對(duì)于上述幾種語(yǔ)法塊的處理方式。
為了方便本領(lǐng)域技術(shù)人員更好理解本方案,下面先介紹相關(guān)基礎(chǔ)知識(shí):
數(shù)據(jù)流圖是一種有向圖(“有向圖”是一種常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),具有頂點(diǎn)和弧兩種元素。每個(gè)弧從一個(gè)頂點(diǎn)指向其自身或另一個(gè)頂點(diǎn),每個(gè)頂點(diǎn)通過(guò)弧可以與一個(gè)或多個(gè)頂點(diǎn)相連。圖可以嵌套,即圖的一部分仍可以稱之為圖,叫做原圖的子圖),每個(gè)頂點(diǎn)代表一種運(yùn)算符或一個(gè)函數(shù),每個(gè)弧代表一個(gè)變量。頂點(diǎn)和弧都具有延遲屬性,其數(shù)值為整數(shù)。頂點(diǎn)的延遲表示輸入信號(hào)變化到輸出信號(hào)變化需要經(jīng)過(guò)多少個(gè)時(shí)鐘周期;弧的延遲表示信號(hào)從一端傳遞到另一端需要經(jīng)過(guò)多少時(shí)鐘周期。
時(shí)鐘周期即時(shí)鐘信號(hào)的周期。時(shí)鐘信號(hào)是一種方波,一般由專門的晶振產(chǎn)生,具有固定的頻率。它是硬件程序設(shè)計(jì)的基礎(chǔ),絕大多數(shù)模塊都由時(shí)鐘觸發(fā)操作。時(shí)鐘信號(hào)控制著整個(gè)系統(tǒng)的“節(jié)拍”,使得各部分可以協(xié)調(diào)工作。所以上文提到的延遲屬性非常重要,影響到計(jì)算結(jié)果的正確性。
轉(zhuǎn)換表是一個(gè)xml文檔,存儲(chǔ)在編譯器所指定的目錄中。這個(gè)文檔記錄了PRCA平臺(tái)下硬件程序使用的模塊的特性,包括其與C語(yǔ)言函數(shù)或操作符對(duì)應(yīng)關(guān)系、延時(shí)特性、模塊定義文件等等。
下面開(kāi)始說(shuō)明三種語(yǔ)法塊的處理方式,每個(gè)語(yǔ)法塊都轉(zhuǎn)化為一個(gè)數(shù)據(jù)流圖。
對(duì)于串行語(yǔ)法塊,編譯器逐行掃描源碼。在掃描一行源碼時(shí),編譯器根據(jù)源碼中使用的函數(shù)或操作符,在轉(zhuǎn)換表中找到其對(duì)應(yīng)的硬件模塊。然后遍歷已生成的數(shù)據(jù)流圖,查看是否該種模塊已經(jīng)被使用過(guò);如果已經(jīng)使用過(guò),根據(jù)圖中的延遲信息,判斷該模塊在當(dāng)前時(shí)間能否被復(fù)用;如果不能復(fù)用或者模塊是第一次出現(xiàn),則創(chuàng)建一個(gè)新的頂點(diǎn)。找到或創(chuàng)建所需的頂點(diǎn)后,根據(jù)輸入輸出變量名創(chuàng)建弧,并通過(guò)這些弧使該頂點(diǎn)同其他頂點(diǎn)相連。這樣就將一行代碼中包含的信息添加到了數(shù)據(jù)流圖中。
循環(huán)語(yǔ)法塊可細(xì)分為兩個(gè)部分,即循環(huán)條件和循環(huán)體。循環(huán)體就是一段串行程序,因此可以先采用和上文相同的辦法生成一個(gè)單獨(dú)的數(shù)據(jù)流圖,然后對(duì)循環(huán)條件進(jìn)行特殊處理。根據(jù)循環(huán)條件創(chuàng)建一個(gè)頂點(diǎn),通過(guò)其連接循環(huán)體生成數(shù)據(jù)流圖和其他語(yǔ)法塊生成的數(shù)據(jù)流圖。對(duì)于while循環(huán)和for循環(huán),循環(huán)條件對(duì)應(yīng)的頂點(diǎn)位于循環(huán)體之前;對(duì)于do-while循環(huán),則位于循環(huán)體之后。循環(huán)體對(duì)應(yīng)的數(shù)據(jù)流圖原理循環(huán)條件的那端,不直接與其他數(shù)據(jù)流圖相連,而是連接至循環(huán)條件,從而形成一個(gè)回路。圖4為一個(gè)while循環(huán)或for循環(huán)的示意圖,其中每個(gè)矩形都代表一個(gè)數(shù)據(jù)流圖,內(nèi)部可能具有很復(fù)雜的結(jié)構(gòu)。
對(duì)于流水語(yǔ)法塊,首先要生成一種前述數(shù)據(jù)流圖,然后在其基礎(chǔ)上進(jìn)行修改。流水線操作是硬件設(shè)計(jì)中一種常見(jiàn)的加速方式,其實(shí)施的基礎(chǔ)為硬件模塊的流水特性。有的硬件模塊處理數(shù)據(jù)需要的延時(shí)很長(zhǎng),但在處理結(jié)束之前有可以接收新的數(shù)據(jù),比如一種浮點(diǎn)數(shù)開(kāi)方模塊,輸入一個(gè)數(shù)據(jù)后需要27個(gè)時(shí)鐘周期才能得到計(jì)算結(jié)果,但每個(gè)時(shí)鐘周期都能輸入一個(gè)新的數(shù)據(jù),彼此不會(huì)產(chǎn)生沖突。這是由于模塊內(nèi)部具有大量寄存器可以存儲(chǔ)中間結(jié)果,使每步計(jì)算可以像車間的流水線一樣連續(xù)進(jìn)行。這種流水特性反應(yīng)為模塊的Rate屬性,表示每幾個(gè)時(shí)鐘周期可以輸入一個(gè)數(shù)據(jù)。Rate值最高為1,表示每個(gè)時(shí)鐘周期都能輸入一個(gè)新的數(shù)據(jù)。Rate屬性也記載在前文所述的轉(zhuǎn)換表中。串行語(yǔ)法塊和循環(huán)語(yǔ)法塊在生成數(shù)據(jù)流圖的時(shí)候都不考慮流水特性,只有一個(gè)模塊將計(jì)算結(jié)果輸出之后,才會(huì)輸入新的數(shù)據(jù)。對(duì)于流水語(yǔ)法塊,在生成上述數(shù)據(jù)流圖之后,編譯器會(huì)遍歷生成的數(shù)據(jù)流圖,查找其中各個(gè)模塊的最低Rate值,將其作為整個(gè)語(yǔ)法塊的Rate;然后按這個(gè)值重新調(diào)整數(shù)據(jù)流圖的延遲屬性,提高其執(zhí)行效率。
上述用戶定義變量和臨時(shí)變量用于存儲(chǔ)中間處理結(jié)果。
例如,在C語(yǔ)言源文件中用戶定義一個(gè)變量:
int a;
則在HDL文件中(以Verilog為例)對(duì)應(yīng)定義為
reg[31:0]r_a;
或
wire[31:0]w_a;
具體替換為哪個(gè)取決于該變量是否需要緩存。轉(zhuǎn)換后寄存器的寬度為32位,是因?yàn)樵谲浖绦蛑幸粋€(gè)int型變量也占32位(4個(gè)字節(jié))。
而數(shù)組指的是一組相同類型的變量,比如
int a[32];
編譯器需要將其轉(zhuǎn)變?yōu)橐粋€(gè)映射到Block RAM的存儲(chǔ)器
其中地址寬度為5位,剛好可以表示32個(gè)數(shù)據(jù);每個(gè)數(shù)據(jù)寬度是32位,代表一個(gè)int。在軟件程序中單個(gè)變量和數(shù)組沒(méi)有本質(zhì)區(qū)別,但硬件程序中不同。一般地,單個(gè)變量存儲(chǔ)在Slice Register中,這種資源較少;數(shù)組存儲(chǔ)在Block RAM中,這種資源較多,但使用起來(lái)受一些限制。為了映射到Block RAM,數(shù)組就需轉(zhuǎn)換成上面的模塊,較為繁瑣。
步驟S33:代碼生成。
創(chuàng)建一個(gè)有限狀態(tài)自動(dòng)機(jī),將每個(gè)基本塊作為狀態(tài)機(jī)的一個(gè)狀態(tài);根據(jù)基本塊之間的連接關(guān)系,確定狀態(tài)機(jī)之間的轉(zhuǎn)換關(guān)系。
根據(jù)步驟S32得到的數(shù)據(jù)流圖生成HDL代碼。對(duì)每個(gè)頂點(diǎn),例化一個(gè)其代表的模塊,將與頂點(diǎn)相連的弧映射為例化的模塊的端口。根據(jù)頂點(diǎn)和弧具有的延時(shí)屬性,添加一系列中間寄存器,使數(shù)據(jù)協(xié)調(diào)流動(dòng)。比如附圖5中的加法頂點(diǎn)及其相連的弧。
可以轉(zhuǎn)化為下面的HDL代碼(以Verilog HDL為例):
add add4(
.clock(clk),
.reset(rst),
.a(a),
.b(b),
.result(c)
);
“例化”是硬件設(shè)計(jì)中的術(shù)語(yǔ)。像上面的例子就是一個(gè)例化語(yǔ)句,表明向設(shè)計(jì)中添加一個(gè)add類型的模塊,取名為add4。add類型的定義在文件的其他位置或是其他文件中?!?”后面跟的是端口映射表,表明add模塊和本設(shè)計(jì) 其他部分的連接關(guān)系。比如上面的例子中,本設(shè)計(jì)中的總線c和add模塊的result端口相連。
步驟S34:生成頂層模塊和編譯報(bào)告。
生成頂層模塊,引入上述生成的模塊及外圍接口模塊,如以太網(wǎng)收發(fā)模塊、DDR接口模塊等。最后結(jié)束生成并給出編譯報(bào)告。
所述編譯報(bào)告主要有兩種。一是編譯概要信息,為文本文檔,主要報(bào)告編譯過(guò)程中出現(xiàn)的錯(cuò)誤和警告、編譯過(guò)程中劃分語(yǔ)法塊的數(shù)量、硬件設(shè)計(jì)整體延時(shí)、使用資源(Block RAM、DSP等)的大致估計(jì)等等。
另一為數(shù)據(jù)流圖信息,為xml文檔,記錄了步驟S32生成的數(shù)據(jù)流圖。該文檔可以用編譯器配套的DFG Browser工具查看。
通過(guò)查看編譯報(bào)告,用戶可以對(duì)程序的執(zhí)行性能有大致的估計(jì),并且可以進(jìn)一步分析限制性能的瓶頸,從而有利于對(duì)設(shè)計(jì)進(jìn)行改進(jìn)。
上述步驟S22中生成C語(yǔ)言程序的具體實(shí)現(xiàn)方法為:將軟件部分的源文件和軟件庫(kù)文件共同復(fù)制到目標(biāo)文件夾,即完成了C語(yǔ)言程序的生成。所述軟件庫(kù)文件主要為與PRCA系統(tǒng)相關(guān)的接口函數(shù)的具體實(shí)現(xiàn),比如stream讀寫(xiě)函數(shù)。
示例性設(shè)備
在介紹了本發(fā)明示例性實(shí)施方式的方法之后,接下來(lái),參考圖6所示,為本發(fā)明示例性實(shí)施方式的、程序編譯器一實(shí)施方式,本實(shí)施方式例如具體可以包括:編譯模塊61和腳本生成器62,其中:
所述編譯模塊61用于將用戶選定的屬于C語(yǔ)言源程序的待處理應(yīng)用程序處理成HDL程序和C語(yǔ)言軟件程序。
所述腳本生成器62用于依據(jù)HDL程序生成硬件編譯程序腳本,以及,依據(jù)C語(yǔ)言軟件程序生成軟件編譯程序腳本,其中,所述硬件編譯程序腳本在被執(zhí)行時(shí),將HDL程序處理得到硬件配置文件,所述軟件編譯腳本在被執(zhí)行時(shí),將C語(yǔ)言軟件程序處理得到ELF格式的可執(zhí)行文件。
一般的,還可以進(jìn)一步包括預(yù)先設(shè)置的軟件庫(kù)和硬件庫(kù),以配合所述硬件編譯腳本和軟件編譯腳本在被執(zhí)行時(shí),將對(duì)應(yīng)程序(HDL程序和C語(yǔ)言軟件程序)的處理。關(guān)于軟件庫(kù)和硬件庫(kù)的內(nèi)容,可參考前文方法部分的描述。
圖7為程序編譯器的另一個(gè)實(shí)施方式,在圖6的基礎(chǔ)上,進(jìn)一步包括預(yù)處理工具63,所述預(yù)處理工具63用于對(duì)待處理應(yīng)用程序進(jìn)行預(yù)處理,具體的,依次對(duì)所述應(yīng)用程序進(jìn)行語(yǔ)法檢查,宏替換和內(nèi)聯(lián)函數(shù)展開(kāi),及代碼改寫(xiě)以增加臨時(shí)變量的方式簡(jiǎn)化較長(zhǎng)的語(yǔ)句。
圖8為程序編譯器的又一種實(shí)施方式,該實(shí)施方式中,所述編譯模塊61可以包括定義模塊611、劃分模塊612、數(shù)據(jù)流圖單元613和代碼生成單元614,其中:
定義模塊611,用于對(duì)于所述應(yīng)用程序中的臨時(shí)變量及用戶定義變量,以寄存器定義,對(duì)于數(shù)組,則對(duì)應(yīng)Block RAM模塊。
劃分模塊612,用于對(duì)所述應(yīng)用程序進(jìn)行模塊劃分,劃分的順序按照從大到小的順序進(jìn)行,直到劃分成基本塊為止。
數(shù)據(jù)流圖單元613,用于將劃分的塊轉(zhuǎn)換為數(shù)據(jù)流圖。
代碼生成單元614,與定義模塊611、劃分模塊612和數(shù)據(jù)流圖單元613單元相連,用于創(chuàng)建一個(gè)有限狀態(tài)自動(dòng)機(jī),將每個(gè)基本塊作為狀態(tài)機(jī)的一個(gè)狀態(tài),依據(jù)基本塊之間的連接關(guān)系確定狀態(tài)機(jī)之間的轉(zhuǎn)換關(guān)系,利用所述狀態(tài)自動(dòng)機(jī)及所述數(shù)據(jù)流圖,生成HDL程序和C語(yǔ)言軟件程序。
在另外的實(shí)施方式中,所述編譯模塊61還包括生成編譯報(bào)告的編譯報(bào)告生成單元615,如圖9所示,所述編譯報(bào)告為編譯概要或數(shù)據(jù)流圖信息,所述編譯概要用于指示編譯參數(shù)及編譯過(guò)程中出現(xiàn)的錯(cuò)誤或警告。
需要說(shuō)明的是,本說(shuō)明書(shū)中各個(gè)實(shí)施例可相互補(bǔ)充,每個(gè)實(shí)施例重點(diǎn)說(shuō)明的都是與其他實(shí)施例的不同之處,各個(gè)實(shí)施例之間相同相似部分互相參見(jiàn)即可。
另外,還需要說(shuō)明的是,本說(shuō)明書(shū)中程序編譯器與程序編譯方法是相對(duì)應(yīng)的,相互之間可以互相借鑒和補(bǔ)充,例如,上述程序編譯器中各模塊的具體工作過(guò)程,例如編譯模塊的工作過(guò)程,腳本生成器生成腳本的過(guò)程,仿真器預(yù)處理的過(guò)程,及各細(xì)分單元工作過(guò)程,均可參照前文程序編譯方法部分的內(nèi)容。
另外,在本文中,術(shù)語(yǔ)“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過(guò)程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒(méi)有明確列出的其他要素,或者是還包括為這種過(guò)程、方法、物品或者設(shè)備所固有的要素。在沒(méi)有更多限制的情況下,由語(yǔ)句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過(guò)程、方法、物品或者設(shè)備中還存在另外的相同要素。
對(duì)所公開(kāi)的實(shí)施例的上述說(shuō)明,使本領(lǐng)域?qū)I(yè)技術(shù)人員能夠?qū)崿F(xiàn)或使用本發(fā)明。對(duì)這些實(shí)施例的多種修改對(duì)本領(lǐng)域的專業(yè)技術(shù)人員來(lái)說(shuō)將是顯而易見(jiàn)的,本文中所定義的一般原理可以在不脫離本發(fā)明的精神或范圍的情況下,在其它實(shí)施例中實(shí)現(xiàn)。因此,本發(fā)明將不會(huì)被限制于本文所示的這些實(shí)施例,而是要符合與本文所公開(kāi)的原理和新穎特點(diǎn)相一致的最寬的范圍。