基于FPGA的M2M異構(gòu)虛擬化系統(tǒng)(一)
本項(xiàng)目基于Digilent Nexys3 FPGA開發(fā)平臺(tái)構(gòu)建了基于自主軟核QS-I的RISC SoC平臺(tái)。
3.總體設(shè)計(jì)方案說明
3.1.1.系統(tǒng)總體框架及關(guān)鍵技術(shù)分析
本項(xiàng)目的總體框架如圖 9,實(shí)現(xiàn)時(shí)采用V5-MIPS core和N3-MIPS core構(gòu)成異構(gòu)原型。
圖 9 項(xiàng)目總體框架圖
項(xiàng)目的關(guān)鍵技術(shù)包括:
多核異構(gòu)層
32位RISC處理器的結(jié)構(gòu)競(jìng)爭(zhēng)、控制競(jìng)爭(zhēng)、數(shù)據(jù)競(jìng)爭(zhēng)三大競(jìng)爭(zhēng)的解決以及擴(kuò)展CPU指令集,支持GNU的mips_elf_gcc編譯器等開源工具鏈
流水線中的精確中斷及異常的實(shí)現(xiàn)
CPU的Cache設(shè)計(jì):
Cache的映射策略
Cache的寫策略
CPU和各個(gè)外設(shè)模塊對(duì)Wishbone總線的集成:
CPU的對(duì)外接口設(shè)計(jì)
各個(gè)外設(shè)符合Wishbone協(xié)議的接口設(shè)計(jì)
各個(gè)模塊與總線的集成
基于不同F(xiàn)PGA的RISC SoC平臺(tái)(分別在XUP Vritex-5和Digilent Nexys3上基于自主軟核QS-I搭建了RISC SoC平臺(tái)),構(gòu)建多核異構(gòu)層?;趩蝹€(gè)核的可擴(kuò)展SoC框架核心如圖 10
圖 10 RISC SoC
虛擬化管理層
對(duì)多核異構(gòu)層的資源管理策略;
對(duì)應(yīng)用層程序的調(diào)度分配策略
二進(jìn)制翻譯層
以基本塊為翻譯單位的動(dòng)態(tài)翻譯實(shí)現(xiàn)
寄存器的映射
Big endian(MIPS)與little endian(x86)
X86標(biāo)志位處理
x86中斷及系統(tǒng)調(diào)用的模擬
轉(zhuǎn)移分發(fā)器
翻譯塊管理
軟件應(yīng)用層
SoC系統(tǒng)軟件模塊
各個(gè)外設(shè)模塊的驅(qū)動(dòng)程序
3.1.2.RISC CPU(QS-I)結(jié)構(gòu)
RISC CPU(QS-I)的總體框架如圖 11所示。QS-I中的整數(shù)流水線采用Fetch à Decode à Execute à Memory à Writeback的五級(jí)流水線結(jié)構(gòu)。QS-I中采用哈佛結(jié)構(gòu)的指令Cache和數(shù)據(jù)Cache。此外,為了加速ISA層虛擬化的動(dòng)態(tài)翻譯實(shí)現(xiàn),QS-I中含有專門的硬件模塊以加速動(dòng)態(tài)翻譯。
圖 11 RISC CPU(QS-I)總體框架圖
3.1.3.動(dòng)態(tài)翻譯策略與方案
圖 12 動(dòng)態(tài)翻譯及執(zhí)行架構(gòu)圖
二進(jìn)制動(dòng)態(tài)翻譯及執(zhí)行架構(gòu)如圖 12所示,主要有翻譯及執(zhí)行兩個(gè)過程。翻譯過程將源體系的程序進(jìn)行翻譯,生成新體系的程序。執(zhí)行過程負(fù)責(zé)生成塊在新體系下的運(yùn)行。以8086轉(zhuǎn)MIPS為例,源體系為8086,新體系為MIPS。圖中SMEM代表的是源內(nèi)存,保存的是8086可執(zhí)行程序,TMEM代表的是目標(biāo)內(nèi)存,保存的是8086程序塊翻譯后得到的相應(yīng)MIPS程序塊。翻譯過程是在MIPS環(huán)境中,翻譯塊的執(zhí)行在虛擬環(huán)境中。兩種環(huán)境的轉(zhuǎn)換需要經(jīng)過上下文切換。切換時(shí),先保存當(dāng)前狀態(tài),包括它自己的一套寄存器組,再載入新的狀態(tài)。
跳轉(zhuǎn)緩存為硬件模塊,加速生成塊的執(zhí)行。跳轉(zhuǎn)緩存保存的是對(duì),SPC為某指令在SMEM中的地址,TPC則是在TMEM中相應(yīng)的地址。在執(zhí)行生成塊遇到轉(zhuǎn)移跳轉(zhuǎn)指令時(shí),根據(jù)SPC在跳轉(zhuǎn)緩存中找對(duì)應(yīng)的TPC,以繼續(xù)執(zhí)行生成塊。
3.1.4.Wishbone總線及基本外設(shè)
Wishbone 總線最先是由Silicon公司提出,現(xiàn)在己被移交給OpenCores組織維護(hù),它通過在IP核之間建立一個(gè)通用接口完成互聯(lián)??梢杂糜谠谲浐恕⒐毯艘约坝埠酥g進(jìn)行互聯(lián)。
Wishbone規(guī)范具有如下特點(diǎn):
簡(jiǎn)單、緊湊,需要很少的邏輯門
完整的普通數(shù)據(jù)據(jù)傳輸總線協(xié)議,包括單個(gè)讀寫傳輸周期和事件周期
支持大端數(shù)據(jù)和小端數(shù)據(jù),接口自動(dòng)完成兩者之間的轉(zhuǎn)換
支持存儲(chǔ)器映射、FIFO存儲(chǔ)器、交叉互聯(lián)
采用握手協(xié)議,允許速率控制,可以達(dá)到每個(gè)時(shí)鐘周期進(jìn)行一次數(shù)據(jù)傳輸
支持普通周期結(jié)束、重試結(jié)束、錯(cuò)誤結(jié)束等總線周期形式,支持用戶自定義的標(biāo)志
采用MASTER/SLAVE體系結(jié)構(gòu),支持多點(diǎn)進(jìn)程(Multi-MASTER)
支持各種各樣的IP核互聯(lián),包括USB、雙向總線、復(fù)用器互聯(lián)等
相對(duì)于其他的IP核接口規(guī)范來說,Wishbone接口規(guī)范具有簡(jiǎn)單、開放、高效、利于實(shí)現(xiàn)等特點(diǎn)而且完全免費(fèi),并沒有專利保護(hù)?;谏鲜鰞?yōu)點(diǎn),因此采用Wishbone總線進(jìn)行接口設(shè)計(jì)。
QS-I 硬件系統(tǒng)在團(tuán)隊(duì)自主研發(fā)的MIPS體系結(jié)構(gòu)5級(jí)流水CPU的基礎(chǔ)上,采用Wishbone開源總線,將主存、顯示器、鍵盤、RS232等外部設(shè)備與CPU進(jìn)行互聯(lián)。CPU作為Wishbone開源總線MASTER/SLAVE體系結(jié)構(gòu)中的MASTER設(shè)備,向總線發(fā)起訪問外設(shè)的請(qǐng)求;Wishbone總線接收來自CPU的訪問請(qǐng)求和訪問命令,向外設(shè)發(fā)起訪問請(qǐng)求;外設(shè)相應(yīng)請(qǐng)求后,數(shù)據(jù)通過Wishbone總線傳給CPU。采用Wishbone總線后,系統(tǒng)能夠高效的訪問各種外設(shè),而且具有較好的可擴(kuò)展性,比如在Wishbone開源總線MASTER/SLAVE體系結(jié)構(gòu)中,MASTER設(shè)備和SLAVE設(shè)備都是可已同時(shí)聯(lián)接多個(gè)的,總線會(huì)解決相關(guān)的訪問沖突。
下文將介紹Wishbone開源總線的相關(guān)信號(hào)的定義及作用。
圖 13 Wishbone總線規(guī)范中使用的主要信號(hào)
所有的Wishbone接口信號(hào)都是高電平有效,設(shè)計(jì)成高電平有效的主要原因是由于低電平有效信號(hào)的書寫問題,不同的設(shè)計(jì)者表達(dá)低電平有效信號(hào)的方式不同,拿最常見的低電平有效的復(fù)位信號(hào)來說,其表示方法就有_RST_I、N_RST_I、#RST_I和/RST_I,而高電平有效的信號(hào)其表達(dá)方式通常只有一種。所有的Wishbone接口信號(hào)都以_I或者_(dá)O結(jié)束。_I表示輸入,_O表示輸出。()表示該信號(hào)為總線信號(hào),總線的寬度可以為1,也可以為大于1的任何值。
在圖7中,主設(shè)備具有遵守Wishbone規(guī)范的主設(shè)備接口,從設(shè)備具有遵守Wishbone規(guī)范的從設(shè)備接口,INTERCON模塊將主設(shè)備和從設(shè)備的對(duì)應(yīng)數(shù)據(jù)、地址和控制線連接起來,SYSCON模塊提供時(shí)鐘和復(fù)位信號(hào),這兩個(gè)信號(hào)被送入主設(shè)備和從設(shè)備。圖7給出了Wishbone接口的常見信號(hào),這些信號(hào)有些是必須的,有些是可選的。這些信號(hào)的基本功能描述如下:
CLK_O/CLK_I:時(shí)鐘信號(hào)。時(shí)鐘信號(hào)由SYSCON模塊產(chǎn)生,并送入各個(gè)主設(shè)備和從設(shè)備。SYSCON通常內(nèi)部存在一個(gè)鎖相環(huán),將來源于芯片外的晶體振蕩器或者時(shí)鐘輸入信號(hào)整形、分頻或者倍頻為芯片內(nèi)所需要的時(shí)鐘信號(hào)。所有Wishbone信號(hào)都同步到時(shí)鐘信號(hào)上,包括復(fù)位信號(hào)。
RST_O/RST_I:同步復(fù)位信號(hào),高電平有效。復(fù)位信號(hào)由SYSCON模塊產(chǎn)生,并送入各主設(shè)備及從設(shè)備。
DAT_O()/DAT_I():主設(shè)備和從設(shè)備的之間的數(shù)據(jù)信號(hào),數(shù)據(jù)可以由主設(shè)備傳送給從設(shè)備,也可以由從設(shè)備傳送給主設(shè)備。一對(duì)主設(shè)備和從設(shè)備之間最多存在兩條數(shù)據(jù)總線,一條用于主設(shè)備向從設(shè)備傳輸數(shù)據(jù),另外一條用于從設(shè)備向主設(shè)備傳輸數(shù)據(jù)。Wishbone規(guī)定數(shù)據(jù)總線的最大寬度為64位,這一規(guī)定實(shí)際上是考慮到目前商用處理器的最大位數(shù)為64,實(shí)際上數(shù)據(jù)總線的寬度可以是任意值。就筆者看來,在64位處理器以后,處理器將向多核方向發(fā)展,總線將向高速串行方向發(fā)展。
ADR_O(n…m)/ADR_I(n…m):地址信號(hào),主設(shè)備輸出地址到從設(shè)備。n取決于IP核的地址寬度,m取決于數(shù)據(jù)總線DAT_O()/DAT_I()的寬度和粒度。數(shù)據(jù)總線的粒度指的是數(shù)據(jù)總線能夠一次傳送的最小比特?cái)?shù),很多處理器如ARM的數(shù)據(jù)總線的粒度為1個(gè)字節(jié),但是也有一些處理器如CEVA TeakLite DSP的數(shù)據(jù)總線粒度為2個(gè)字節(jié)。一個(gè)位寬為32比特、粒度為1個(gè)字節(jié)的數(shù)據(jù)總線的地址信號(hào)應(yīng)定義為ADR_O(n…2)/ADR_I(n…2)。在傳送數(shù)據(jù)時(shí),具體哪些字節(jié)有效通過SEL_O()/SEL_I()信號(hào)(見下文)控制。
TGD_O/TGD_I()、TGA_O()/TGA_I():TGD_O/TGD_I()為數(shù)據(jù)標(biāo)簽,具體講是附加于在數(shù)據(jù)總線DAT_O()/DAT_I()的標(biāo)簽,該標(biāo)簽可以用于傳送關(guān)于數(shù)據(jù)總線的額外信息如奇偶校驗(yàn)信息、時(shí)間戳信息等。TGA_O/TGA_I()為地址標(biāo)簽,具體講是附加于在地址總線ADR_O()/ADR_I()的標(biāo)簽,該標(biāo)簽可以用于傳送關(guān)于地址總線的額外信息如地址總線奇偶校驗(yàn)信息、存儲(chǔ)器保護(hù)信息等。Wishbone只規(guī)定了TGD_O/TGD_I和TGA_O()/TGA_I()的接口時(shí)序,用戶可以定義TGD_O/TGD_I的具體含義。
TGC_O/TGC_I():TGC_O/TGC_I()為總線周期標(biāo)簽,該標(biāo)簽可以用于傳送關(guān)于當(dāng)前總線周期所進(jìn)行操作的描述如操作類型(包括單次操作、塊操作、RMW操作)、中斷應(yīng)答類型、緩存操作類型等。類似的,Wishbone只規(guī)定了TGC_O/TGC_I()的接口時(shí)序,用戶可以定義TGD_O/TGD_I的具體含義。
ACK_O/ACK_I、ERR_O/ERR_I、RTY_O/RTY_I:主從設(shè)備間的操作結(jié)束方式信號(hào)。ACK表示成功,ERR表示錯(cuò)誤,RTY表示重試(Retry)。操作總是在某一總線周期內(nèi)完成的,因此操作結(jié)束方式也稱為總線周期結(jié)束方式。成功是操作的正常結(jié)束方式,錯(cuò)誤表示操作失敗,造成失敗的原因可能是地址或者數(shù)據(jù)校驗(yàn)錯(cuò)誤,寫操作或者讀操作不支持等。重試表示從設(shè)備當(dāng)前忙,不能及時(shí)處理該操作,該操作可以稍后重新發(fā)起。接收到操作失敗或者重試后,主設(shè)備如何響應(yīng)取決于主設(shè)備的設(shè)計(jì)者。
SEL_O()/SEL_I():有效數(shù)據(jù)總線選擇信號(hào),標(biāo)識(shí)當(dāng)前操作中數(shù)據(jù)總線上哪些比特是有效的,以總線粒度為單位。SEL_O()/SEL_I()的寬度為數(shù)據(jù)總線寬度除以數(shù)據(jù)總線粒度。比如一個(gè)具有32位寬、粒度為1個(gè)字節(jié)的數(shù)據(jù)總線的選擇信號(hào)應(yīng)定義為SEL_O(3:0)/ SEL_I(3:0),SEL(4’b1001)代表當(dāng)前操作中數(shù)據(jù)總線的最高和最低字節(jié)有效。
CYC_O/CYC_I、LOCK_O/LOCK_I、GNT_O()/GNT_I:總線周期信號(hào)CYC_O/CYC_I有效代表一個(gè)主設(shè)備請(qǐng)求總線使用權(quán)或者正在占有總線,但是不一定正在進(jìn)行總線操作(是否正在進(jìn)行總線操作取決于選通信號(hào)STB_O/STB_I是否有效)。只有該信號(hào)有效,Wishbone主設(shè)備和從設(shè)備接口的其它信號(hào)才有意義。CYC_O/CYC_I信號(hào)在一次總線操作過程中必須持續(xù)有效,比如一次塊讀操作可能需要多個(gè)時(shí)鐘周期,CYC_O/CYC_I信號(hào)必須保持持續(xù)有效。實(shí)際上,該信號(hào)的實(shí)際作用等同于其他總線標(biāo)準(zhǔn)中的仲裁申請(qǐng)信號(hào)。當(dāng)存在多個(gè)主設(shè)備時(shí),它們可能希望同時(shí)進(jìn)行總線操作,主設(shè)備通過仲裁申請(qǐng)信號(hào)向仲裁器申請(qǐng)總線占有權(quán),仲裁器通過一定的仲裁優(yōu)先級(jí)邏輯向其中一個(gè)選定的主設(shè)備發(fā)送總線允許信號(hào)GNT_O()/GNT_I,表示該主設(shè)備可以占用總線。GNT_O()是仲裁器輸出的允許信號(hào),一般有多個(gè);而對(duì)于一個(gè)主設(shè)備,其允許信號(hào)輸入GNT_I卻只有一個(gè)。一次總線操作可能需要多個(gè)時(shí)鐘周期,比如一次塊操作。在操作過程中,仲裁器可能會(huì)提前將總線占用權(quán)收回并分配給其他主設(shè)備從而打斷當(dāng)前主設(shè)備的操作,LOCK_O/LOCK_I有效代表本次總線操作是不可打斷的。仲裁器收到LOCK_I信號(hào),就不會(huì)提前收回總線使用權(quán)。圖 13中只有一個(gè)主設(shè)備和一個(gè)從設(shè)備,因此沒畫出仲裁器模塊,該模塊可以視為是INTERCON的一部分,見本章最后給出的例子。
STB_O/STB_I:選通信號(hào)。選通有效代表主設(shè)備發(fā)起一次總線操作。只有選通信號(hào)有效(此時(shí)CYC_O/CYC_I也必須為高),ADR_O/ADR_I()、DAT_O()/DAT_I()、SEL_O()/SEL_I()才有意義。在Wishbone總線規(guī)范中,CYC_O/CYC_I是最高層的控制信號(hào),只有該信號(hào)有效,STB_O/STB_I信號(hào)才有意義。一個(gè)信號(hào)有意義是指該信號(hào)的當(dāng)前值是需要主設(shè)備或者從設(shè)備解釋的,0為無效,1為有效,而一個(gè)信號(hào)沒有意義是指該信號(hào)的當(dāng)前值主設(shè)備和從設(shè)備不必關(guān)心,是0還是1都無效。
WE_O/WE_I:寫使能信號(hào),代表當(dāng)前周期中進(jìn)行的操作是寫操作還是讀操作。1代表寫,0代表讀。
3.1.5.系統(tǒng)庫及應(yīng)用程序設(shè)計(jì)
為了能夠更好地發(fā)揮系統(tǒng)功能,擴(kuò)大系統(tǒng)的應(yīng)用范圍,充分利用系統(tǒng)的各種硬件資源以及外圍設(shè)備,包括鍵盤、串口、顯示器,項(xiàng)目團(tuán)隊(duì)開發(fā)出了供應(yīng)用程序調(diào)用的系統(tǒng)庫。根據(jù)外設(shè),可以將系統(tǒng)庫函數(shù)分為四部分:系統(tǒng)宏定義和端口常量、鍵盤接口函數(shù)、顯示器接口函數(shù)和串口接口函數(shù)。
圖 14 系統(tǒng)庫及應(yīng)用程序總體結(jié)構(gòu)
評(píng)論