以下内容摘自《步步惊芯——软核处理器内部设计分析》一书
OR1200中的寄存器分为两类:通用寄存器r0-r31、特殊寄存器。特殊寄存器又分为11组,在本书第1.3.3节简单地列出了所有的特殊寄存器组。从列表中可以发现除第0组外的其余特殊寄存器组都是与具体的硬件模块相关联的,比如:第2组特殊寄存器与指令MMU有关、第4组特殊寄存器与指令缓存ICache有关、第9组特殊寄存器与中断控制单元PIC有关。
OR1200有两种工作模式:用户模式、特权模式,在这两种模式下对特殊寄存器的访问权限不同,第0组特殊寄存器中的SR寄存器的SM位(即SR[SM])决定了OR1200当前处于何种模式,其值为1表示OR1200处于特权模式,其值为0表示OR1200处于用户模式。表5.1列出了每一组特殊寄存器中具体的寄存器,以及在两种模式下的访问权限。
有如下几点说明:
(1)其中的读写权限是OR1200手册中描述的,也是OpenRISC 1000架构所设计的,但在OR1200的实现中没有按照设计实现,比如在表5.1中有的特殊寄存器在用户模式下是不能读取的,在OR1200中并没有考虑到这一点,所有的特殊寄存器都可以在用户模式下读取。我们在分析SPRS模块的时候会发现这一点。
(2)在用户模式下,对TTCR的操作权限是“R*”,原本表示当SR[SUMRA]为1时,用户模式才可以读取TTCR,这一点在OR1200中也没有实现,用户模式可以读取TTCR的值,而不用考虑SR[SUMRA]的值。
(3)对比表1.2可知与性能计数单元有关的第7组特殊寄存器在OR1200中没有实现,所以OR1200中的特殊寄存器组只有10组。
(4)所有的特殊寄存器都是可寻址的,其地址是16位,高5位存放的是组号,低11位存放的是特殊寄存器在组中的索引。比如:TTCR对应的地址是(0xA<<11)+0x1,即0x5001。
第0组特殊寄存器
除第0组特殊寄存器外的其余特殊寄存器都与特定硬件模块有关,本书在分析具体硬件模块的时候再探讨该模块内部是如何响应特殊寄存器访问类指令。本章将只介绍第0组特殊寄存器,第0组特殊寄存器一共有12个,此外NPC、PPC、通用寄存器r0-r31也可以映射到第0组特殊寄存器的地址空间,从而可以使用特殊寄存器访问类指令访问NPC、PPC、通用寄存器。本小节给出第0组特殊寄存器中VR、UPR、NPC、SR、PPC、EPCR0、EEAR0、ESR0的内容及功能描述。
1、VR
Version Register(VR)是一个32位只读寄存器,其中存放了处理器的版本信息。其格式如表5.2所示。
各标志位含义如下:
- Revision:处理器的修订版本号
- CFG:没有作用,默认为0
- VER:处理器的版本,对OR1200处理器而言,固定为0x12
2、UPR
UnitPresent Register(UPR)是一个32位只读寄存器,其中的标志位表示当前处理器具有的功能单元信息,其格式如表5.3所示。
各标志位含义如下:
- UP:表示UPR寄存器是否存在,为1表示存在,为0表示不存在
- DCP:表示数据缓存是否存在,为1表示存在,为0表示不存在
- ICP:表示指令缓存是否存在,为1表示存在,为0表示不存在
- DMP:表示数据MMU是否存在,为1表示存在,为0表示不存在
- IMP:表示指令MMU是否存在,为1表示存在,为0表示不存在
- MP:表示MAC单元是否存在,为1表示存在,为0表示不存在
- DUP:表示调试单元是否存在,为1表示存在,为0表示不存在
- PCUP:表示性能计数单元是否存在,为1表示存在,为0表示不存在
- PMP:表示电源管理单元是否存在,为1表示存在,为0表示不存在
- PICP:表示可编程中断控制单元是否存在,为1表示存在,为0表示不存在
- TTP:表示计时器单元是否存在,为1表示存在,为0表示不存在
- FPP:表示浮点处理单元是否存在,为1表示存在,为0表示不存在
- CUP:表示用户自定义单元存在与否
3、NPC
NPC是一个32位只读寄存器,存储的是当前处于流水线执行阶段的指令地址,如果当前处于流水线执行阶段的指令是填充指令(如:0x1461000、0x1441000),那么NPC存储的将是当前处于流水线译码阶段的指令地址。
4、SR
监管模式寄存器SR在本书之前已多次提及,读者朋友应该还记得算术处理类指令中有些指令(如:l.add)就会在执行过程中改写SR的CY、OV、F标志位。用户模式只能读SR,特权模式则可以读、修改SR寄存器。其格式如表5.4所示。
各标志位含义如下:
- SM:表示是否处于特权模式,为1表示处于特权模式,为0表示处于用户模式,复位的时候OR1200处于特权模式
- TEE:计时器中断使能标志位,为1表示允许计时器中断,为0表示不允许计时器中断
- IEE:外部中断使能标志位,为1表示允许外部中断,为0表示不允许外部中断
- DCE:数据缓存(DCache)使能标志位,为1表示使能数据缓存,为0表示禁止数据缓存
- ICE:指令缓存(ICache)使能标志位,为1表示使能指令缓存,为0表示禁止指令缓存
- DME:数据MMU(DMMU)使能标志位,为1表示使能DMMU,为0表示禁止DMMU
- IME:指令MMU(IMMU)使能标志位,为1表示使能IMMU,为0表示禁止IMMU
- LEE:小端模式(Little-Endian)使能标志位,为1表示使用小端模式,为0表示使用大端模式
- CE:CID(Context ID)有效标志位,为1表示CID有效,处理器使用影子寄存器组,为0表示CID无效,处理器不使用影子寄存器组
- F:标记,一般通过上一章介绍的比较指令l.sfxx设置F的值
- CY:进位标记,为1表示最后一次算术运算产生进位,为0表示最后一次算术运算没有产生进位
- OV:溢出标记,为1表示最后一次算术运算产生溢出,为0表示最后一次算术运算没有产生溢出
- OVE:溢出异常使能标志位,为1表示溢出会引起异常,为0表示溢出不会引起异常
- DSX:引起异常的指令或者异常发生时正在执行的指令是否位于延迟槽中,为1表示该指令位于延迟槽中,为0表示该指令不在延迟槽中
- EPH:异常处理例程地址选择标志位,为1表示异常处理例程的地址位于内存0xF0000000开始的空间,为0表示异常处理例程的地址位于内存0x0开始的空间
- FO:该位固定为1
- SUMRA:为1表示某些特殊寄存器可以在用户模式下读取,为0表示所有的特殊寄存器都不可以在用户模式下读取
- CID:上下文ID(Context ID),取指范围是0-15,代表的是当前处理器的上下文。OpenRISC架构设计中允许存在多组通用寄存器,也就是实现影子寄存器组,这样当异常发生时,可以迅速切换到另一组通用寄存器,而不用花费时间保存当前的通用寄存器到堆栈,异常处理完毕后再切换回当前的通用寄存器,从而实现对异常的快速响应,CID代表当前使用的是哪一个通用寄存器组。OR1200没有实现影子寄存器组,所以CID没有意义
5、PPC
PPC(Previous Program Counter)是一个32位只读寄存器,保存上一条执行完毕的指令地址。
6、EPCR0
EPCR0(Exception Program Counter Register)是一个32位寄存器,在特权模式下可读可写。当异常发生时,依据不同的异常类型,EPCR0会保存不同的数据,可能是引起异常的指令的地址,也可能是引起异常的指令的下一条指令地址。具体情况在分析异常处理类指令时会介绍。
7、EEAR0
EEAR0(Exception Effective AddressRegister)是一个32位寄存器,在特权模式下可读可写。当异常发生时,EEAR0保存引起异常的指令产生的有效地址EA(Effective Address)。在OR1200中存在有效地址、物理地址PA(Physical Address),当没有MMU时,有效地址等于物理地址,当有MMU时,需要MMU将CPU输出的有效地址转为物理地址,然后访问该物理地址。
8、ESR0
ESR0(Exception SR)是一个32位寄存器,在特权模式下可读可写。当异常发生时,会将当前SR寄存器的值保存到ESR0中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)