【MIPS32指令集兼容的CPU模拟器设计】连载二:

4 存储系统设计

在MIPS32 体系结构中,只有Load/Store 型的指令可访问存储器,包括字节(byte)访问、半字(half word) 访问和字(word)访问。主存储器和Cache 的数据结构如下·

UINT8 mem[512*1024]; //512 KB 主存
#d巳fine SET NUM 64
#define WAY NUM 2
#defin巳BYTE NUM 16
typ巳def struct (
struct (
struct (
UINT8 valid; //有效位
UINT32 tag; //标签
UINT8 data[BYTE_NUM];// 数据
)way[WAY NUM];// 通道数目
)set[SET_NUM]; //行数目
) CACHE; //2 KB Cache

处理器对存储器的读写操作通过如下2 个接口函数完成:

UINT32 read cach巳
(UINT32 addr, UINT8 typ巳);
void write cache
(UINT32 addr, UINT32 din, UINT8 type);

在读操作中, CPU 给出存储器的地址(addr)和访问类型(type) ,存储系统负责检测Cache 是否命中,如命中,则从Cach巳读取数据(返回值) ,否则从主存储器读取数据并更新Cache; 在写操作中, CPU 不仅给出地址(addr)和访问类型,还给出要写入的数据(din) ,存储系统负责检测Cache 是否命中,如命中,则同时更新Cache 和主存,否则只更新主存而不更新Cache ,并将数据写入相应的地址中去。CPU 读写操作的流程如图3 所示。

图3 CPU 读写操作流程

图3 CPU 读写操作流程

其中,箭头指向表示数据方向,并非控制信号的方向。addr 为地址, type 为访问类型, we 为读写指示, ce 为Cache使能, hit 为命中, din 为读入CPU 的数据, dout 为从CPU写出的数据, cdout 为从Cache 读出的数据, mdin 为写入主存的数据, mdout 为从主存读出的数据。

5 分支预测系统设计

在高阶流水线处理器设计中,分支预测器可有效提高CPU 的指令执行效率。对软件模拟器而言,由于不存在流水线,实现分支预测器不会对系统性能有任何提升。实现分支预测器是为了得到各种分支预测方案的比对数据,对比其对面积的要求和命中率的高低,并为设计FPGA 硬件模型提供参考和依据。

本文实现的分支预测器为静态预测、双向预测、局部预测、全局预测、索引全局预测和索引共享全局预测I510 相对而言,静态预测器最简单。其他预测器都含有一个分支形式缓冲器(BPB) ,每个BPB 入口都是一个二位饱和计数器。局部预测器稍有不同,它不但有一个BPB ,还有一个分支历史表(BHT) ,用于记录分支的历史形式。局部测器可由如下结构体实现:

#define BPB LEN 256
#define BHT LEN 1024
typedef struct BHT {
UINT32 bpb_entry;
} BHT;
BHT bht[BHT LEN];
typedef struct BPB {
U1NT8 counter;
} BPB;
BPB bpb[BPB_LEN];

在具体实现上,各种类型的分支预测器基本相同,以局部预测器和索引共享全局预测器为例,流程如图4 所示。

图4 局部预测器和索引共享全局预测器

图4 局部预测器和索引共享全局预测器

对于局部预测器,处理器给出PC 指针,对BHT 深度取模后得到BHT 的入口地址BHT_entry ,跟据该索引, BHT 即可得到BPB 的入口地址BPB_entry ,索引BPB 得到二位饱和计数器的值Counter , 若Counter 大于等于2 ,则预测跳转(PredicCTaken = 1),否则预测不跳转(Predict_Taken = 0) ,之后根据Taken 的值更新饱和计数器,如Taken==I , 则饱和计数器加1 ,如Taken==O , 贝,Ij饱和计数器减1 。对索引共享全局预测器,首先GR 清0 ,处理器给出PC 指针, PC 和GR
相或(对不同大小的预测器, PC 和GR 相或的位数可能不同)得出BPB 的入口地址BPB_entry ,根据该索引, BPB 得到二位饱和计数器的值Counter , 其他与局部预测器相同。

6 应用示例

利用软件模型,可方便地得到Cache 和分支预测器的统计信息,如Cach巳的大小、Cache 和各种分支预测器的命中率等,为硬件设计提供依据。表2 为利用模拟器得到的各类型分支预测器[匀的命中率比较。

表2

其中, sort 算法实现了50 个数据的冒泡排序算法; pi 算法用于求一个精确到小数点后16 位的圆周率hanoi 算法用MIPS 汇编实现了一个汉诺塔的小游戏[6J 。

7 结束语

通过该模拟器的前期工作,笔者设计一个针对FPGA 的嵌入式CPU 软核,命名为OCMIPS[IJ 。目前该软核包括软件模拟器实现的所有功能,实验室也组建了基于OCMIPS 的SOC 仿真与验证平台。下一步研究方向将在模拟器中加入对DMA、MMU、中断控制器、串口和网口等CPU 外设和通信设备以及RSA , ECC, AES, DES 等安全算法的软件模拟,用于辅助下一阶段的硬件设计工作。

参考文献
[1] Xue Bo. OCMIPS Processor[EBIOL]. (2007-09-01). http://www.
opencores.orglprojects.cgi/web/ocmips/overview.
[2] MIPS Technologies Inc.. MIPS32 Architecture for Programmers,
Volume 11: The MIPS32 Instruction Set, Revision 0.95[Z]. 2001.
[3] TIS Committee. Too1 Interface Standard(TIS), Executable and
LinkingFo口nat (ELF) Specification, Version 1.2[Z]. 1995.
[4] Rhoads S. P1asma Processor[EBIOL]. (2007-09-01). http://www.
opencores.orglprojects.cgi/web/mips/overview.
[5] Mcfar1ing S. Combining Branch Predictors[R]. Pa10 A1to, Califomia,
USA, Tech. Rep.: TN-36, Westem Research Laboratory, 1993.
[6] Baray M. CS224 Hom巳Page[EBIOL]. (2007-09-12). http://www.
cs.bilkent.edu.tr/-wi11/courses/CS224/MlPS_Programs.htm.

--电子创新网--
粤ICP备12070055号