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

薛勃,周玉拮
(上海交通大学芯片与系统研究中心,上海200240)

摘要:描述一个与MIPS32 指令集兼容的CPU 模拟器设计方案,该方案用C 语言描述处理器的硬件行为,模拟CPU 指令的执行过程,实现MIPS32 除浮点运算指令以外的所有指令,有大小可配的主存储器、指令和数据统一的二相关高速缓存Cache ,内置类型可配的分支预测器和ELF 文件解析器,并给出设计的应用实例。

关键词MIPS 处理器;模拟器;高速缓存;分支预测

Design of CPU Simulator Compatible with MIPS32 Instruction Set

XUE Bo, ZHOU Yu-jie

(VLSI & System Research Center, Shanghai Jiaotong University, Shanghai 200240)

【Abstract】 A design scheme of a CPU simulator which is compatible with MIPS32 instruction set is pr巳sented. It simulates hardware b巳havior of CPU by using C language, and it can implement all the MIPS32 instructions excluding floating-point instructio口, such as parameterize main memory,unifies 2-way set associativ巳instruction and data cache, embeding reconfigurable branch predictor and ELF int巳rpreter. An application example is glven

【Key words】 MIPS processor; simulator; cache; branch prediction

1 概述

软件形式的CPU 模拟器是现代桌面处理器和嵌入式处理器设计的重要前期步骤,它在硬件处理器的设计流程中的作用有2 个方面: (1)在设计初期,探索处理器体系结构的设计形式,并分析其对处理器性能的影响j (2)辅助硬件设计,用和底层硬件结构类似的软件语法描述硬件行为,能有效简化硬件设计的复杂度。本文设计一个与MIPS32 指令集兼容的CPU 模拟器,它是开源FPGACPU[ll 的重要前期成果。

2 MIPS32 指令集筒介
MIPS 是最典型的RISC 架构,指令格式十分简单,按指令格式可划分为3 类:寄存器类型(R句pe) ,立即数类型(1句pe)和跳转类型(J句pe)指令,如图1 所示。

图1 指令格式

图1 指令格式

寄存器类型(R-typ巳): opcode 是指令的操作码, rs 是源寄存器的标号, rt 是目标寄存器的标号, rd 是目的寄存器的标号, sm 是移位指令的移位数目。寄存器类型指令的opcode统一为0 ,因此, func 用来协助区分寄存器类型的指令,如add, sub, xor 等。

立即数类型(1句pe): opcode, rs 和rt 的含义同上,imm16 是16 位的带符号立即数,如addi , ori, Iw 等。跳转类型(J句pe): opcode 含义同上, imm26 是26 位的符号立即数,如j , jaI 等。

本设计实现MIPS32 指令集中除浮点运算指令以外的所有指令,每条指令的具体含义参考文献[2] 。

3 模拟器的整体框架

模拟器的输入是链接器所产生的Elf 可执行文件,经解析器解析后得到的程序和数据用于初始化内存。仿真器执行指令并处理数据,并将结果打印在输出控制台。如图2 所示。

图2 仿真棒的体系结构

Elf 文件的格式和解析原理参考文献[3]0 Elf 文件经解析
后返回如下信息:

typed巳f struct (
UINT32 entry; //入口地址
UINT32 sp; //堆核指针
UINT32 gp; //全局指针
UINT32 bss_start; //bss 段起始地址
UINT32 bss e时//bss 段结束地址
UINT32 code_length; //程序段长度
UINT32 data_Iength; //数据段长度
) ELFRE1飞,

其中, entry 是程序的入口地址sp 中是堆核指针的初始{直gp 返回全局指针的值,它被用来寻址sbss(小bss 段)、sdata(小data 段)j bss 段的起始地址和bss 段的结束地址用来指出bss 段的位置,用于系统在复位后请零bss 段;程序段和数据段中所含的数据是通过指针形式返回的,是解析函数的形式参数,其长度作为解析函数的返回值返回。UINT32 表示32 位无符号整数, SINT32 表示32 位有符号整数。

用程序和数据初始化存储器后,模拟器开始以entry 为入口地址从存储器读取第l 条指令,然后进行译码、执行、更新处理器的状态。在软件模型中,处理器的状态表现为如下的数据结构:
typ巳def struct (
SINT32 R[32]; 1132 个32 位GPR
UINT32 PC,NPC; /lPC 和NPC 指针
SINT32 HI; //HI 寄存器
SINT32 LO; //LO 寄存器
) STATE;

根据指令类型,指令执行的过程有2 种: (1)寄存器操作,大部分的R句pe 指令属于这一类,源和目的均为寄存器,如add, xor 和sIl等; (2)寄存器和立即数混合操作,目的是寄存器,而源是寄存器或者立即数,如addi , xori 和andi 等;(3)存储器操作,该类指令更新或读取存储器的值,如Iw 和sw 等; (4)跳转和分支操作,该类指令改变PC 指针的值,如j, b巳q 和jalr 等。

在单步执行的过程中,仿真器须在控制台同步显示指令,因此,在仿真器内部需要一个反汇编器将十六进制的程序代码翻译成助记符形式的指令。反汇编器在软件层面很容易实现,只要对指令进行译码并打印即可。

命令解析实际上是一个wh iIe 循环,利用分支语句响应各种不同的命令。如对go 命令,仿真器将一直执行到程序执行完成;对st叩单步执行命令,命令解析模块则每次运行一条指令,并等待用户再次输入命令。同理,仿真器能打印处理器的状态或某一段存储空间的值。命令解析模块实现的功能如表l 所示。

3.jpg

本文设计的CPU 模拟器基于文献[4] 中使用的简单模拟器,主要在以下几方面进行优化和功能增加:优化处理器的状态结构;重新设计指令的单周期执行函数;优化命令解析
模块;集成并设计EIf 文件解析模块;集成可配置的二相关指令和数据统一Cache ,重新设计存储系统;集成类型可配的分支预测器。

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