基于FPGA的M2M異構虛擬化系統(tǒng)(二)
exe_mem_reg
本文引用地址:http://2s4d.com/article/201808/388222.htm本模塊完成EXE和MEM兩個階段之間的信號流水。本模塊的時序圖如下。
圖 22 exe_mem_reg時序圖
mem_stage
本模塊完成對數(shù)據(jù)Cache的讀寫。模塊的對外接口符合Wishbone總線標準。本模塊的主要時序如下圖。
圖 23 mem_stage時序圖
mem_wb_reg
本模塊完成MEM和WB兩個階段之間的信號流水。本模塊的時序圖如下。
圖 24 mem_wb_reg時序圖
wb_stage
本模塊完成寫回指令的寄存器堆修改操作。本模塊的時序圖如下。
圖 25 wb_stage時序圖
except
本模塊完成流水線中的中斷及異常處理。為了完成精確中斷,即產(chǎn)生異常的指令前已經(jīng)在流水線中的指令完成執(zhí)行,而在異常指令后的指令不允許完成執(zhí)行(不修改CPU狀態(tài)),才能響應異常。因此,在實現(xiàn)精確中斷時,需要對流水線中的指令進行跟蹤,所有的異?;蛑袛嘈盘枌⒀舆t到流水線的特定階段(Writeback)進行響應,并且對不同類型的異常信號,中斷程序的返回地址不同。本模塊的主要時序圖如下。
圖 26 except時序圖
4.1.2.2Cache模塊詳細設計方案
功能描述
本模塊實現(xiàn)指令Cache和數(shù)據(jù)Cache。其中,指令Cache和數(shù)據(jù)Cache的映射策略都采用直接映射方式。指令Cache只讀,數(shù)據(jù)Cache的寫策略為寫通過(主存和Cache里的數(shù)據(jù)時鐘保持一致)。
- 子模塊列表
Instruction Cache top | |
Data Cache top |
詳細設計
ic_top
本模塊的時序圖如下。
圖 27 ic_top時序圖
4.1.2.3動態(tài)翻譯硬件模塊詳細設計方案
功能描述
為了提高動態(tài)翻譯效率,我們在CPU中增加了硬件加速模塊。動態(tài)翻譯硬件加速包括以下部分:
在QS-I CPU的ALU模塊中增加x86 flag寄存器(MIPS架構中沒有flag標志寄存器),軟件可通過mtc0,mfc0兩條指令來訪問flag寄存器。這樣x86的算術邏輯或比較指令(如add, sub, cmp等),以及條件跳轉(zhuǎn)指令(如ja, jb, jg等)有效地得到了硬件支持,使得軟件的翻譯效率大大提高。
在QS-I CPU外增加了JLUT(Jump address Lookup Table),即跳轉(zhuǎn)地址查表。通過CAM(Content Address Memory)的硬件支持,跳轉(zhuǎn)指令的翻譯效率將比完全基于軟件的翻譯方式提高一個數(shù)量級。在QS-I中將新增4條用戶指令campi, ramri, camwi, camwi用于軟件對JLUT的訪問。
- 子模塊列表
JLUT top | ||
SPC is stored in CAMs, and it will take less than two clock cycles to get address of the CAMs content specified. | ||
TPC is stored in ubiquitous RAMs. |
詳細設計
如下方的JLUT詳細設計圖所示,JLUT模塊與QS-I CPU之間通過campi, camwi, ramwi, ramwi四條指令進行交互。
campi用于CAM的查表,camwi用于CAM的寫操作,ramwi用于RAM的寫操作,RAMRI用于RAM的讀操作。
4條指令的格式如下。
Instruction | Format | Usage |
campi | opcode, rs, 5’h0, rd, 5’h0, func | campi rd, rs |
camwi | opcode, rs, rt, 5’h0, 5’h0, func | camwi rt, rs |
ramwi | opcode, rs, rt, 5’h0, 5’h0, func | ramwi rt, rs |
ramri | opcode, rs, 5’h0, rd, 5’h0, func | ramri rd, rs |
圖 28 JLUT詳細設計圖
4.2.動態(tài)翻譯詳細設計方案
二進制翻譯技術能夠把一種體系結(jié)構的二進制程序翻譯成另一種體系結(jié)構的二進制程序,以在新的體系結(jié)構下運行。二進制翻譯主要有三類:解釋執(zhí)行、靜態(tài)翻譯及動態(tài)翻譯。
在系統(tǒng)總體框架圖中,二進制翻譯層可運行不同的翻譯程序,以在不同的體系之間進行轉(zhuǎn)換,如x86到MIPS、ARM到MIPS、x86到ARM等。本部分挑選了8086到MIPS的動態(tài)翻譯作為實現(xiàn)原型。
4.2.1.二進制翻譯介紹
二進制翻譯可以分為三大類:解釋執(zhí)行、靜態(tài)翻譯和動態(tài)翻譯。
解釋執(zhí)行的流程是:取指、解析、執(zhí)行。它對源機器代碼進行實時解釋并執(zhí)行,然后繼續(xù)下一條指令。系統(tǒng)不對已解釋的指令進行保存或緩存。在這個框架下,不能對代碼進行優(yōu)化。這種翻譯技術能取得高度兼容性,但執(zhí)行效率很低。
靜態(tài)翻譯是先將源可執(zhí)行文件轉(zhuǎn)換成目標機器可執(zhí)行文件,然后運行在目標機器上。這是離線翻譯,因此有充足的時間對代碼進行優(yōu)化,以提高代碼的執(zhí)行效率。但靜態(tài)翻譯很難做到正確性,如代碼的自修改問題,執(zhí)行過程中有些跳轉(zhuǎn)值只能在運行時才能獲知等問題。
解釋執(zhí)行是實時翻譯,靜態(tài)翻譯是離線翻譯,動態(tài)翻譯就像是兩者的折中。它不像解釋執(zhí)行那樣對每條指令進行翻譯并馬上執(zhí)行,也不像靜態(tài)翻譯那樣將指令完全翻譯好之后才執(zhí)行。它每次對一個基本塊進行翻譯并執(zhí)行,然后取另一個塊。一個基本塊一般包含多條算術類型指令,最后是一條控制流(Control Flow)類型指令。已翻譯的塊可進行緩存或保存。動態(tài)翻譯只對將要執(zhí)行的代碼進行翻譯,且能很好地解決代碼自修改問題。
4.2.2.二進制翻譯策略選擇
本項目采取的是軟硬協(xié)同動態(tài)翻譯策略,將源二進制代碼進行翻譯,當遇到控制流類型指令,如跳轉(zhuǎn)指令,系統(tǒng)調(diào)用等,翻譯過程掛起,將已翻譯的指令序列作為一個基本塊,然后運行基本塊。當基本塊執(zhí)行完以后,會跳到下一處執(zhí)行。若下一處已翻譯過,則繼續(xù)執(zhí)行,否則暫停執(zhí)行以進行翻譯,如此過程循環(huán)。完整的流程如下圖所示。
圖 29 x86程序翻譯執(zhí)行流程
基本塊執(zhí)行時有硬件模塊輔助,如圖 12所示。硬件模塊管理跳轉(zhuǎn)緩存,緩存的基本項為對。程序執(zhí)行到跳轉(zhuǎn)指令時,程序向跳轉(zhuǎn)緩存發(fā)送SPC,得到相應的TPC,再跳至TPC繼續(xù)執(zhí)行生成塊。簡單的示例如圖 30所示。源程序從塊A開始執(zhí)行,到末尾時,需要跳轉(zhuǎn)到塊C。翻譯后執(zhí)行,執(zhí)行完塊A’后將要跳轉(zhuǎn),此時的跳轉(zhuǎn)地址是SMEM中地址,即SPC,要轉(zhuǎn)換成相應的TPC,該TPC就由跳轉(zhuǎn)緩存中尋找。
圖 30 SMEM與TMEM的映射
4.2.3.8086程序的載入
首先,由系統(tǒng)向服務器發(fā)送命令,命令格式為x86 *.com,它包含在自定義傳輸協(xié)議中,類型碼為86,要求.com文件僅使用一個段,大小限制為64KB。服務器找到所指定的文件,并將其傳送給系統(tǒng),系統(tǒng)將其存放在內(nèi)存中。至此,完成8086可執(zhí)行程序的載入。
4.2.4.標志寄存器處理
8086中有個標志寄存器FLAGS,而MIPS中沒有與之相對應的標志寄存器,解決辦法有二,軟件模擬實現(xiàn)或硬件提供支持。
軟件模擬指的是,當一條8086指令執(zhí)行后,會影響哪些標志位,然后用軟件方法將其模擬出來,使兩者的結(jié)果一致。如執(zhí)行add ax, bx對溢出位的影響。模擬時,將ax移到MIPS的$t0寄存器的低16位,將bx移到MIPS的$t1寄存器的低16位,然后對$t0和$t1做加法,結(jié)果放到$t0,相對應的指令為add $t0, $t0, $t1。結(jié)果是否溢出則要查看$t0的第16位。最后,還要將溢出位存放至標志寄存器的對應位。這中間還要涉及移位運算、位運算等,所需代價很大,但有個好處是無需對硬件平臺做改動,使硬件平臺更為純粹。
若采用提供硬件支持,那么硬件平臺需稍做修改,增加一個類FLAGS寄存器。仍以上面的add ax, bx為例。將ax、bx分別放到$t0、$t1的高16位,然后進行相加,是否溢出的結(jié)果會自動保存到新添加的類FLAGS寄存器里,因而軟件層面無需再做處理。此種做法,增加了硬件工作,但大大簡化了軟件的操作。8086的FLAGS有多個標志位,若要完全實現(xiàn),那么對本身的硬件平臺改動會比較大,因此,我們只選擇了其中幾個進行實現(xiàn),如Z、O、C、S等。
4.2.5.寄存器映射
MIPS有32個通用寄存器,從0號到31號,每個寄存器為32位。8086的通用寄存器有8個:AX、CX、DX、BX、SP、BP、SI和DI。這8個通用寄存器都是16位,AX、CX、DX和BX還可以分成兩個8位寄存器,高8位和低8位,如AX可分為AH和AL。此外,段寄存器有CS、DS、ES和SS,都是16位。還有IP寄存器和FLAGS寄存器,也都是16位。
因為MIPS的寄存器數(shù)量比8086的寄存器多,可以采用直接映射,一個8086寄存器對應一個MIPS寄存器,而不需要對寄存器進行置換,簡化了寄存器的管理。
評論