针对Lx5280 GUN 模拟器的正确性测试
2012-08-23夏兴昇
夏兴昇
(江苏经贸职业技术学院 江苏 南京 211168)
在移植之后产生的针对Lx5280的模拟器是否符合需求,我采用联合测试的方法,和汇编器as、调试器insight(gdb窗口形式)共同测试。综合考虑对新增寄存器和对新增指令的测试,由于添加的寄存器和指令结合紧密,我采用对Lx5280各个新增功能分模块测试。
被测指令程序的装载,我通过两种方式:
(1)通过汇编程序汇编指令后通过insight装入。
(2)在Lx5280汇编没有移植好前通过手动汇编方式。在insight寄存器窗口给寄存器赋值及指令memory窗口在当前指令地址处写入手动汇编指令的的机器指令码。这种方式也适用于在汇编、调试、模拟器联合调试时确认错误范围。同时可以增加测试的灵活性。
采用单步测试方法,测试结果通过insight寄存器窗口和memory窗口观察。
详细测试如下:
1 对Circular Buffers功能的测试
这里涉及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)测试有符号和无符号扩展存取操作
在取字节和半字操作中,会把它们扩展到32位存入通用寄存器。这里有带符号扩展和无符号扩展。
首先通过memory窗口对($10)赋值0xff
(4)测试 point的自加,即 point+=stride
执行后由于上溢发生,$10被赋值0xbfc00384,实现了存取数据buffer循环功能。
2 对Zero Overhead Loop功能的测试
这里涉及lpc0、lps0、lpe0三个寄存器,无相关新增指令。
基本功能:当PC值和LPE0匹配时,且LPC0不等于0,则PC被赋值为LPS0,同时LPC0减1,用硬件实现了的程序循环功能。
测试步骤:
(2)观察结果
在单步方式下,程序运行到lpe0(0xbfc003dc)后,就自动跳转到lps0(0xbfc00384),同时lpc0减 1,这样循环 5次后结束循环,顺序执行0xbfc003dc后面程序。
3 对DMAC单元的测试
这里涉及 m0l、m0h、m1l、m1h、m2l、m2h、m3l、m3h、mmd 9 个寄存器,涉及指令有七类,分别是
CMULTA
复数乘法
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)测试复数乘法CMULTA
(4)测试乘加指令 MULTA(U)、MULTA2、MADDA(U)、MADDA2[.S]
(5)测试乘减指令 MSUBA(U)、MSUBA2[.S]、MULNA2
(6)测试累加器加减指令 SUBMA[.s]、ADDMA[.s]
(7)测试累加器取整指令RNDA2
(8)测试与mmd相关指令
mmd寄存器含有三个域,
MF选择乘法的算数模式
0:整数模式
1:小数模式
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 的测试,即整数模式,40 位饱和,不截断,最接近取整。
在小数模式状态下,乘法操作结果会主动左移一位。相关指令有
MULTA(U)、MULTA2、MADDA(U)、MADDA2[.S]、MSUBA(U)、MSUBA2[.S]、MULNA2
小数模式测试代码为:
饱和模式影响的指令是带有[.s]的指令,MADDA2[.S]、MSUBA2[.S]、SUBMA[.s]、ADDMA[.s]
32位饱和模式测试代码如下:
截断模式在32位乘法下,会截断rS[15:0]*rT[15:0]结果,相关32位乘法 MULTA(U)、MADDA(U)、MSUBA(U)
RND取整模式相关指令是RNDA2,向上取整模式测试代码:
4 对双字读写指令测试
这里新增了两条指令LT、ST,是对原MIPS体系读写指令的扩充,不涉及Lx5280的新增寄存器。
这两条指令的作用从memory读写双字(64位)到一对偶数开始的通用寄存器中。测试如下:
通过insight寄存器窗口观察$2,$3及$4,$5和memory窗口观察0xbfc00394和0xbfc00398内容是否相同。
5 对新增寄存器读写指令测试
这里有六条新增指令
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不测试,测试代码如下:
6 对新增算数操作指令测试
这里新增的指令也是对MIPS算数指令的扩充,也不涉及新增寄存器, 相关指令有:ADDR2、SUBR2、SLTR2、SLLV2、SRLV2、SRAV2、MIN、MAX、ABSR、MUX、CLS、BITREV,测试代码:
7 对条件移动指令测试
这里新增的指令也是对MIPS算数指令的扩充,也不涉及新增寄存器,相关指令有:CMVEQZ[.H][.L]、CMVNEZ[.H][.L],
指令形式:CMVEQZ[.H][.L]rD,rS,rT
CMVNEZ[.H][.L]rD,rS,rT
基本功能:CMVEQZ指令是当rT==0时,rD=rS CMVNEZ指令是当rT!=0时,rD=rS
测试代码为:
8 测试总结
经调试、修改后的模拟器通过了上述详细测试,证明模拟器能够可靠使用,表明移植成功,实现了模拟器的移植目标。