exe_mem_reg
本模块完结EXE和MEM两个阶段之间的信号流水。本模块的时序图如下。
图 22 exe_mem_reg时序图
mem_stage
本模块完结对数据Cache的读写。模块的对外接口契合Wishbone总线规范。本模块的首要时序如下图。
图 23 mem_stage时序图
mem_wb_reg
本模块完结MEM和WB两个阶段之间的信号流水。本模块的时序图如下。
图 24 mem_wb_reg时序图
wb_stage
本模块完结写回指令的寄存器堆修正操作。本模块的时序图如下。
图 25 wb_stage时序图
except
本模块完结流水线中的中止及反常处理。为了完结准确中止,即发生反常的指令前已经在流水线中的指令完结履行,而在反常指令后的指令不允许完结履行(不修正CPU状况),才干呼应反常。因而,在完结准确中止时,需求对流水线中的指令进行盯梢,一切的反常或中止信号将延迟到流水线的特定阶段(Writeback)进行呼应,而且对不同类型的反常信号,中止程序的回来地址不同。本模块的首要时序图如下。
图 26 except时序图
4.1.2.2Cache模块具体规划方案
功用描绘
本模块完结指令Cache和数据Cache。其间,指令Cache和数据Cache的映射战略都选用直接映射办法。指令Cache只读,数据Cache的写战略为写经过(主存和Cache里的数据时钟保持共同)。
- 子模块列表
|
|
|
Instruction Cache top |
|
Data Cache top |
具体规划
ic_top
本模块的时序图如下。
图 27 ic_top时序图
4.1.2.3动态翻译硬件模块具体规划方案
功用描绘
为了进步动态翻译功率,咱们在CPU中增加了硬件加速模块。动态翻译硬件加速包括以下部分:
在QS-I CPU的ALU模块中增加x86 flag寄存器(MIPS架构中没有flag标志寄存器),软件可经过mtc0,mfc0两条指令来拜访flag寄存器。这样x86的算术逻辑或比较指令(如add, sub, cmp等),以及条件跳转指令(如ja, jb, jg等)有效地得到了硬件支撑,使得软件的翻译功率大大进步。
在QS-I CPU外增加了JLUT(Jump address Lookup Table),即跳转地址查表。经过CAM(Content Address Memory)的硬件支撑,跳转指令的翻译功率将比彻底根据软件的翻译办法进步一个数量级。在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.动态翻译具体规划方案
二进制翻译技能能够把一种体系结构的二进制程序翻译成另一种体系结构的二进制程序,以在新的体系结构下运转。二进制翻译首要有三类:解说履行、静态翻译及动态翻译。
在体系整体结构图中,二进制翻译层可运转不同的翻译程序,以在不同的体系之间进行转化,如x86到MIPS、ARM到MIPS、x86到ARM等。本部分挑选了8086到MIPS的动态翻译作为完结原型。
4.2.1.二进制翻译介绍
二进制翻译能够分为三大类:解说履行、静态翻译和动态翻译。
解说履行的流程是:取指、解析、履行。它对源机器代码进行实时解说并履行,然后持续下一条指令。体系不对已解说的指令进行保存或缓存。在这个结构下,不能对代码进行优化。这种翻译技能能获得高度兼容性,但履行功率很低。
静态翻译是先将源可履行文件转化成方针机器可履行文件,然后运转在方针机器上。这是离线翻译,因而有足够的时刻对代码进行优化,以进步代码的履行功率。但静态翻译很难做到正确性,如代码的自修正问题,履行进程中有些跳转值只能在运转时才干获悉等问题。
解说履行是实时翻译,静态翻译是离线翻译,动态翻译就像是两者的折中。它不像解说履行那样对每条指令进行翻译并立刻履行,也不像静态翻译那样将指令彻底翻译好之后才履行。它每次对一个基本块进行翻译并履行,然后取另一个块。一个基本块一般包括多条算术类型指令,最终是一条操控流(Control Flow)类型指令。已翻译的块可进行缓存或保存。动态翻译只对即将履行的代码进行翻译,且能很好地处理代码自修正问题。
4.2.2.二进制翻译战略挑选
本项目采纳的是软硬协同动态翻译战略,将源二进制代码进行翻译,当遇到操控流类型指令,如跳转指令,体系调用等,翻译进程挂起,将已翻译的指令序列作为一个基本块,然后运转基本块。当基本块履行完今后,会跳到下一处履行。若下一处已翻译过,则持续履行,不然暂停履行以进行翻译,如此进程循环。完好的流程如下图所示。
图 29 x86程序翻译履行流程
基本块履行时有硬件模块辅佐,如图 12所示。硬件模块办理跳转缓存,缓存的基本项为对。程序履行到跳转指令时,程序向跳转缓存发送SPC,得到相应的TPC,再跳至TPC持续履行生成块。简略的示例如图 30所示。源程序从块A开端履行,到结尾时,需求跳转到块C。翻译后履行,履行完块A’后即将跳转,此刻的跳转地址是SMEM中地址,即SPC,要转化成相应的TPC,该TPC就由跳转缓存中寻觅。
图 30 SMEM与TMEM的映射
4.2.3.8086程序的载入
首要,由体系向服务器发送指令,指令格局为x86 *.com,它包括在自定义传输协议中,类型码为86,要求.com文件仅运用一个段,巨细限制为64KB。服务器找到所指定的文件,并将其传送给体系,体系将其寄存在内存中。至此,完结8086可履行程序的载入。
4.2.4.标志寄存器处理
8086中有个标志寄存器FLAGS,而MIPS中没有与之相对应的标志寄存器,处理办法有二,软件模仿完结或硬件供给支撑。
软件模仿指的是,当一条8086指令履行后,会影响哪些标志位,然后用软件办法将其模仿出来,使两者的成果共同。如履行add ax, bx对溢出位的影响。模仿时,将ax移到MIPS的$t0寄存器的低16位,将bx移到MIPS的$t1寄存器的低16位,然后对$t0和$t1做加法,成果放到$t0,相对应的指令为add $t0, $t0, $t1。成果是否溢出则要检查$t0的第16位。最终,还要将溢出位寄存至标志寄存器的对应位。这中心还要触及移位运算、位运算等,所需价值很大,但有个优点是无需对硬件渠道做改动,使硬件渠道更为朴实。
若选用供给硬件支撑,那么硬件渠道需稍做修正,增加一个类FLAGS寄存器。仍以上面的add ax, bx为例。将ax、bx别离放到$t0、$t1的高16位,然后进行相加,是否溢出的成果会主动保存到新增加的类FLAGS寄存器里,因而软件层面无需再做处理。此种做法,增加了硬件作业,但大大简化了软件的操作。8086的FLAGS有多个标志位,若要彻底完结,那么对自身的硬件渠道改动会比较大,因而,咱们只挑选了其间几个进行完结,如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的寄存器数量比8086的寄存器多,能够选用直接映射,一个8086寄存器对应一个MIPS寄存器,而不需求对寄存器进行置换,简化了寄存器的办理。