夏興昇
(江蘇經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院 江蘇 南京 211168)
在移植之后產(chǎn)生的針對Lx5280的模擬器是否符合需求,我采用聯(lián)合測試的方法,和匯編器as、調(diào)試器insight(gdb窗口形式)共同測試。綜合考慮對新增寄存器和對新增指令的測試,由于添加的寄存器和指令結(jié)合緊密,我采用對Lx5280各個新增功能分模塊測試。
被測指令程序的裝載,我通過兩種方式:
(1)通過匯編程序匯編指令后通過insight裝入。
(2)在Lx5280匯編沒有移植好前通過手動匯編方式。在insight寄存器窗口給寄存器賦值及指令memory窗口在當(dāng)前指令地址處寫入手動匯編指令的的機器指令碼。這種方式也適用于在匯編、調(diào)試、模擬器聯(lián)合調(diào)試時確認(rèn)錯誤范圍。同時可以增加測試的靈活性。
采用單步測試方法,測試結(jié)果通過insight寄存器窗口和memory窗口觀察。
詳細(xì)測試如下:
這里涉及cbs[0-2]、cbe[0-2]六個寄存器,涉及指令有LBP[.Cn]、LBPU[.Cn]、LHP[.Cn]、 LHPU[.Cn]、 LWP[.Cn]、 LTP[.Cn]、 SBP[.Cn]、SHP[.Cn]、 SWP[.Cn]、STP[.Cn]
指令格式:×××[.Cn]rT,(pointer)stride
如lbp.1 $5,($10)1
基本功能是:對point寄存器間接尋址后賦值給rT寄存器,即rT=[point]。同時對point寄存器加上stride,即point+=stride。Cn值為0-2,決定采用三個Circular Buffers中那一個,0可省略。
測試步驟:
(1)測試 cbs[0-2]、cbe[0-2]賦值,如對 cbs0 賦值
li $2,0xbfc00384
mtru $2,cbs0
通過insight寄存器窗口觀察,觀察賦值是否正確。
(2)測試存取字長正確性,如以下指令
(3)測試有符號和無符號擴(kuò)展存取操作
在取字節(jié)和半字操作中,會把它們擴(kuò)展到32位存入通用寄存器。這里有帶符號擴(kuò)展和無符號擴(kuò)展。
首先通過memory窗口對($10)賦值0xff
(4)測試 point的自加,即 point+=stride
執(zhí)行后由于上溢發(fā)生,$10被賦值0xbfc00384,實現(xiàn)了存取數(shù)據(jù)buffer循環(huán)功能。
這里涉及l(fā)pc0、lps0、lpe0三個寄存器,無相關(guān)新增指令。
基本功能:當(dāng)PC值和LPE0匹配時,且LPC0不等于0,則PC被賦值為LPS0,同時LPC0減1,用硬件實現(xiàn)了的程序循環(huán)功能。
測試步驟:
(2)觀察結(jié)果
在單步方式下,程序運行到lpe0(0xbfc003dc)后,就自動跳轉(zhuǎn)到lps0(0xbfc00384),同時lpc0減 1,這樣循環(huán) 5次后結(jié)束循環(huán),順序執(zhí)行0xbfc003dc后面程序。
這里涉及 m0l、m0h、m1l、m1h、m2l、m2h、m3l、m3h、mmd 9 個寄存器,涉及指令有七類,分別是
CMULTA
復(fù)數(shù)乘法
DIVA(U)
除法指令
MULTA(U)、MULTA2、MADDA(U)、MADDA2[.S]
乘法及乘加指令
MSUBA(U)、MSUBA2[.S]、MULNA2乘減指令
SUBMA[.s]、ADDMA[.s]
累加器加減指令
MTA2[.G]、MFA、MFA2
存取累加器到通用寄存器指令
RNDA2
累加器取整指令
測試步驟:
(1)測試 m0l、m0h、m1l、m1h、m2l、m2h、m3l、m3h、mmd 9 個寄存器的讀寫操作及MTA2[.G]、MFA、MFA2指令。
(2)測試除法指令DIVA(U)
(3)測試復(fù)數(shù)乘法CMULTA
(4)測試乘加指令 MULTA(U)、MULTA2、MADDA(U)、MADDA2[.S]
(5)測試乘減指令 MSUBA(U)、MSUBA2[.S]、MULNA2
(6)測試?yán)奂悠骷訙p指令 SUBMA[.s]、ADDMA[.s]
(7)測試?yán)奂悠魅≌噶頡NDA2
(8)測試與mmd相關(guān)指令
mmd寄存器含有三個域,
MF選擇乘法的算數(shù)模式
0:整數(shù)模式
1:小數(shù)模式
MS選擇飽和溢出邊界
0:40位飽和
1:32位飽和
MT在32×32位乘法操作中截斷選擇
0:不截斷
1:在32×32位乘法中截斷 rS[15:00]x rT[15:00]乘積.
RND在RNDA2指令中的舍入取整選擇.
00:最接近(或偶)舍入取整
01:向正方向(大值)舍入
1x:保留
測試(2)-(7)都是在 mmd=0 的測試,即整數(shù)模式,40 位飽和,不截斷,最接近取整。
在小數(shù)模式狀態(tài)下,乘法操作結(jié)果會主動左移一位。相關(guān)指令有
MULTA(U)、MULTA2、MADDA(U)、MADDA2[.S]、MSUBA(U)、MSUBA2[.S]、MULNA2
小數(shù)模式測試代碼為:
飽和模式影響的指令是帶有[.s]的指令,MADDA2[.S]、MSUBA2[.S]、SUBMA[.s]、ADDMA[.s]
32位飽和模式測試代碼如下:
截斷模式在32位乘法下,會截斷rS[15:0]*rT[15:0]結(jié)果,相關(guān)32位乘法 MULTA(U)、MADDA(U)、MSUBA(U)
RND取整模式相關(guān)指令是RNDA2,向上取整模式測試代碼:
這里新增了兩條指令LT、ST,是對原MIPS體系讀寫指令的擴(kuò)充,不涉及Lx5280的新增寄存器。
這兩條指令的作用從memory讀寫雙字(64位)到一對偶數(shù)開始的通用寄存器中。測試如下:
通過insight寄存器窗口觀察$2,$3及$4,$5和memory窗口觀察0xbfc00394和0xbfc00398內(nèi)容是否相同。
這里有六條新增指令
MFRU、MTRU
讀寫 cbe[0-2]、cbs[0-2]、lpc0、lps0、lpe0、mmd
MFRK、MTRK
(目前保留)
MFLXC0、MTLXC0
讀寫 ESTATUS、ECAUSE、INTVEC
對MFRU、MTRU和MFLXC0、MTLXC0四條指令測試,而對保留的MFRK、MTRK不測試,測試代碼如下:
這里新增的指令也是對MIPS算數(shù)指令的擴(kuò)充,也不涉及新增寄存器, 相關(guān)指令有:ADDR2、SUBR2、SLTR2、SLLV2、SRLV2、SRAV2、MIN、MAX、ABSR、MUX、CLS、BITREV,測試代碼:
這里新增的指令也是對MIPS算數(shù)指令的擴(kuò)充,也不涉及新增寄存器,相關(guān)指令有:CMVEQZ[.H][.L]、CMVNEZ[.H][.L],
指令形式:CMVEQZ[.H][.L]rD,rS,rT
CMVNEZ[.H][.L]rD,rS,rT
基本功能:CMVEQZ指令是當(dāng)rT==0時,rD=rS CMVNEZ指令是當(dāng)rT?。?時,rD=rS
測試代碼為:
經(jīng)調(diào)試、修改后的模擬器通過了上述詳細(xì)測試,證明模擬器能夠可靠使用,表明移植成功,實現(xiàn)了模擬器的移植目標(biāo)。