|
以下内容摘自《步步惊芯——软核处理器内部设计分析》一书
OpenRISC项目包括OpenRISC 1000、OpenRISC 2000两个子项目,OpenRISC 1000项目产生了OpenRISC 1000架构,OR1200就是符合OpenRISC1000架构的处理器,本小节将简单介绍OpenRISC 1000架构。
图1.1 OpenRISC项目
OpenRISC 1000架构是一个开放的架构,其目标是使用在中、高性能的网络和嵌入式计算环境,因此强调通过多种措施改善性能,同时力求简单、低功耗。OpenRISC 1000架构的特点如下:
OR1200处理器中实现了OpenRISC 1000架构的部分,而不是全部,作为一本剖析OR1200的书,笔者本着够用就行的原则不对OpenRISC 1000着过多的笔墨,只对OR1200做详细介绍。
OR1200是一个采用Harvard结构的32位RISC处理器,其基于OpenRISC1000架构,具有5级流水线(需要探讨)、支持MMU、Cache以及基本的DSP功能。其总体结构如图1.2所示。
图1.2 OR1200总体结构
OR1200具有32个通用寄存器,没有影子寄存器,所以不支持上下文快速切换。默认配置中有8KB的直接映射数据缓存、8KB直接映射指令缓存,缓存行大小为16字节。默认配置中数据MMU含有64项的直接映射数据快表(DTLB:DataTranslation Lookaside Buffers),指令MMU含有64项的直接映射指令快表(ITLB:Instruction Translation LookasideBuffers)。采用WishboneB3版本的总线接口。支持电源管理、计时器、调试、外部中断。
需要注意的是虽然在OR1200的代码中包括FPU,但这里的FPU实际并不是OR1200的一部分,是一个独立的项目,所以本书不会分析FPU的实现代码。
下面简单介绍OR1200的寻址模式、位和字节次序、寄存器集、指令集、异常模型,图1.2中的MMU、Cache、可编程中断控制器(PIC)、计时器单元(TT)、电源管理模块(PM)、Wishbone总线单元将在本书的后续章节分别独立分析。
OR1200的寻址模式有寄存器寻址、立即数寻址、寄存器相对寻址和PC相对寻址四种。其中寄存器相对寻址、PC相对寻址介绍如下。
(1)寄存器相对寻址
这种寻址模式主要是加载/存储指令使用,其将一个16位的立即数做符号扩展,然后与指定通用寄存器的值相加,从而得到有效地址,如图1.3所示。
图1.3 寄存器相对寻址
(2)PC相对寻址
这种寻址模式主要是转移指令使用,在转移指令中有一个26位的立即数,将其符号扩展,然后与程序计数寄存器(PC:ProgramCounter)的值相加,从而得到有效地址。如图1.4所示。
图1.4 PC相对寻址
数据在存储器中是按照字节存放的,OR1200也是按照字节访问存储器中的指令或数据,但是如果需要读出一个字,也就是4个字节,比如读出的是mem[n]、mem[n+1]、mem[n+2]、mem[n+3]这四个字节,那最终交给处理器的是{mem[n],mem[n+1],mem[n+2],mem[n+3]},还是{mem[n+3],mem[n+2],mem[n+1],mem[n]}就有所区分了,前者称之为大端模式(Big-Endian),也称之为MSB(MostSignificant Byte),后者称之为小端模式(Little-Endian),也称之为LSB(Least Significant Byte)。在大端模式下,数据的高位保存在存储器的低地址中,而数据的低位保存在存储器的高地址中。图1.5给出0x12345678在两种模式下的存储情况。OR1200采用的是大端模式(Big-Endian)。
图1.5 大、小端模式下存储0x12345678的区别
在介绍RISC的特点时提到一点:大量使用寄存器。这是因为寄存器的存取可以在一个时钟周期内完成,同时也简化了寻址方式。OR1200的指令中除加载/存储指令外,都是使用寄存器或立即数作为操作数的。OR1200中的寄存器分为两类:通用寄存器(GPR:General Purpose Register)、特殊寄存器(SPR:Special Purpose Register)。
通用寄存器有32个,分别以r0、r1……r31表示,都是32位。其中r0一般用做常量0。
特殊寄存器被分为11组,如表1.2所示。
可见大部分SPR都是与图1.2中特定的硬件模块有关,所以在后续章节分析相关模块的时候再对该模块中相应的特殊寄存器进行介绍。这里只需要知道一点:在第0组寄存器中有一个SR(Supervisor Register)寄存器,SR中有一个SM位,该位决定了OR1200所处的两种模式:当SR[SM]为0时,OR1200处于用户模式,当SR[SM]为1时,OR1200处于特权模式,在用户模式下OR1200可以访问的特殊寄存器受限,在特权模式下可以访问所有的特殊寄存器。
OpenRISC 1000架构指令集中的指令分为三种:基本指令集、向量/DSP扩展指令、浮点扩展指令,其指令助记符分别以“l.”、“lv.”、“lf.”开始。OR1200主要实现了OpenRISC 1000架构中基本指令集(ORBIS32/64)中的一部分指令,而不是全部,共有76条指令,本书将其分为6类,分别是:数据处理类指令(含算术、逻辑、移位、比较、数据传送)、特殊寄存器访问类指令、转移类指令、异常处理类指令、乘法除法类指令、加载存储类指令。
1、数据处理类指令
包含有算术、逻辑、移位、比较、数据传送等指令,算术指令如:加法指令l.add、减法指令l.sub;逻辑指令如:寄存器相与指令l.and、寄存器相或指令l.or;移位指令如:带立即数循环右移指令l.rori、逻辑左移指令l.sll;比较指令如:比较寄存器是否相等指令l.sfeq;数据传送指令如:l.movhi,表示将16位立即数左移16位,然后存储到目标寄存器。本书将在第4章对数据处理类指令进行详细介绍,同时分析其执行过程。
2、特殊寄存器访问类指令
有两个:特殊寄存器读指令l.mfspr、特殊寄存器写指令l.mtspr。本书将在第5章对特殊寄存器访问类指令进行详细介绍,同时分析其执行过程。
3、转移类指令
包括条件转移、无条件转移、绝对转移、相对转移等指令。本书将在第6章对转移类指令进行详细介绍,同时分析其执行过程。
4、异常处理类指令
包括系统调用l.sys、自陷l.trap、异常返回l.rfe等指令,本书将在第7章对异常处理类指令进行详细介绍,同时分析其执行过程。
5、乘法除法类指令
包括乘法指令、乘累加指令、除法指令等。本书将在第8章对乘法除法类指令进行详细介绍,同时分析其执行过程。
6、加载存储类指令
包括加载指令、存储指令。加载指令如:加载一个字到寄存器的指令l.lwz;存储指令如:存储一个字到指定地址的指令l.sw。本书将在第9章对加载存储类指令进行详细介绍,同时分析其执行过程。
在指令的执行过程中由于外部信号、错误或指令本身的一些原因会导致处理器进入异常处理过程。异常处理过程偏离了原程序的执行流程,对OR1200而言将跳转到一个指定的地址,从那里读取指令,开始异常处理,这个指定的地址称之为异常处理例程入口地址。OR1200定义的异常类型及其处理例程入口地址如表1.3所示。异常处理过程涉及到几个特殊寄存器的使用,以及延迟槽的知识,所以本书将在第7章再详细介绍OR1200的异常处理过程。