2.2 OR1200
2.2.1 OR1200的基本特点
OpenRISC1200处理器(简称OR1200或OR32)是OpenCores组织提供了基于GPL、属于OpenRISC 1000序列中的一款RISC处理器。OR1200是32位标量RISC,它具有哈佛结构、5级整数流水线,支持虚拟内存(MMU),带有基本的DSP功能。外部数据和地址总线接口符合WISHBONE标准。
OR1200默认的Cache配置是:一条通道直接映射的8KB数据高速缓存(Cache),一条通道直接映射的8KB指令高速缓存。每条通道是16字节的线尺寸。两个Cache都是实体标记的。
默认配置时使用MMU,MMU由基于一条通道直接映射的数据TLB和指令TLB的64条目Hash表组成。
默认配置的辅助功能有用于实时调试的调试单元、高分辨率的Ticker定时器、可编程中断控制器和电源管理单元。
典型应用的情况是,在使用0.18μm、6层金属工艺时,OR1200的主频运行在300MHz,可以提供300Dhrystone和2.1MIPS和300次的32×32的DSP乘加操作。OR1200默认配置时有一百万个晶体管。
OR1200基于ORBIS32指令集。ORBIS32指令集包括32位整数指令、基本的DSP指令、32位的Load和Store指令、程序流程控制指令和特殊指令。
OR1200主要用于嵌入、便携和网络设备应用中,并可以运行任何一种现代操作系统。它的主要竞争者有ARM10、ARC等RISC处理器。
OR1200通用框架由CPU/DSP核心、直接映射的数据Cache、直接映射的指令Cache、基于DTLB的Hash表的数据MMU和指令MMU、电源管理单元及接口、Tick定时器,调试单元及开发接口、中断控制器和中断接口、指令及数据WISHBONE主机接口。OR1200通用框架如图2-7所示。
图2-7 OR1200通用框架
下面分别介绍OR1200的各个部分。
2.2.2 CPU/DSP核心
CPU/DSP是OR1200 RISC处理器的核心,OR1200仅应用了OpenRISC 1000构架的32bit部分,这个构架的64bit部分和浮点及向量操作部分没有被应用到OR1200处理器上。CPU/DSP核心的结构图如图2-8所示。
图2-8 CPU/DSP结构图
1.指令单元(Instruction Unit)
指令单元应用基本指令流水线,从内存子系统取指令,把指令分发到可用的执行单元,并保存一个状态历史记录确保可实现精确的例外模型和确保指令按次序执行。它还执行条件分支和非条件跳转指令。如果合适的执行单元可用,序列发生器能在每个时钟上分发一个有顺序的指令。执行单元必须辨别源数据是否可用,并确保没有其他的指令使用同一个目的地寄存器。指令单元仅处理ORBIS32指令类,当前OR1200不支持ORFPX32/64和ORVDX64指令类。
2.通用寄存器(GPRs,General-Purpose Registers)
OpenRISC 1200使用了32个通用32bit寄存器。OpenRISC 1000构架还提供了寄存器文件的映像复制,用来在工作上下文之间快速切换,但目前OR1200没有提供这个。OR1200把通用寄存器文件作为两个带有32个32bit字能力同步双端口内存使用。
3.Load/Store单元(LSU)
Load/Store单元在GPRs和CPU内部总线之间传输所有的数据。它被用做一个独立的执行单元,安装在内存子系统里,如果有数据依赖性时仅影响主流水线。
LSU的主要特征如下:
● 所有的Load/Store指令通过硬件实现(包括原子指令);
● 具有地址条目缓冲;
● 执行流水线操作;
● 快速内存访问的对齐。
当Load和Store指令被发出时,LSU决定所有的操作数是否可用。操作数包括地址寄存器操作数、源数据寄存器操作数(对于Store指令来说)、目的地数据寄存器操作数(对于Load指令来说)。
假定Load指令在数据高速缓存中有一个命中,LSU执行一个Load操作需要2个时钟周期。执行Store指令花费一个时钟周期。有效地址EA被DMMU翻译成物理地址。Load/Store的有效地址和数据也能被开发接口访问。
4.整数执行流水线(Integer Execution Pipeline)
OR1200通过流水线使大多数整数指令能在一个周期中执行。它使用的32bit整数指令的类型如下:
● 算术指令
● 比较指令
● 逻辑指令
● 循环移位和移位指令
表2-27列出了通过流水线执行整数指令的执行时间,大多数时钟在一个时钟周期中执行。
表2-27 整数指令的执行时间
5.MAC单元
MAC单元执行DSP MAC操作。MAC操作是32×32的48-bit累加器。MAC单元是全流水线的,并且在每个新的时钟周期能接受新的MAC操作。
6.系统单元(System Unit)
系统单元连接CPU/DSP的所有其他没有被指令和数据接口连接的信号,它还实现了系统特定寄存器(如supervisor寄存器),执行所有的l.mtspr/l.mfspr指令。
7.例外(Exceptions)
当一个例外条件出现时,将产生例外并进入例外处理程序。例外的产生源有下面几种。
● 外部中断。
● 某一内存访问条件。
● 内部错误,如尝试执行设有使用的操作码。
● 系统调用。
● 内部例外,如断点例外。
例外处理被传送到用户软件,当一个例外发生时,控制被传送到一个例外处理句柄,它由例外类型定义了例外处理例程偏移指针,例外在supervisor模式处理。
OR1200核心使用了精确的例外模式。这意味着当一个例外发生时,下面的条件满足。
● 程序流中随后的指令被丢弃。
● 以前的指令完成并写回了它们的结果。
● 错误指令的地址被存在EPCR寄存器中,并且机器状态被存在ESR寄存器中。
OR1200例外不支持快速上下文切换。OR1200使用的例外说明如表2-28所示。
表2-28 OR1200使用的例外说明
2.2.3 数据和指令高速缓存
OR1200数据高速缓存与指令高速缓存的机制一样,下面仅说明数据高速缓存。
OR1200数据高速缓存默认配置是一条8-Kbyte通道直接映射的数据高速缓存,它允许核心快速访问数据。数据高速缓存还可被配置成1KB、2KB、4KB和8KB形式。它的特征如下:
● 数据高速缓存与指令高速缓存分开(Harvard构架)。
● 每个数据高速缓存应用最少最近使用替换算法(LRU,Least-Recently Used)。
● 高速缓存目录是物理地址,物理地址标记存在高速缓存目录中。
● 可全写操作。
● 通过写高速缓存特殊用途寄存器可取消高速缓存或使高速缓存失效。
当发生一次失靶(Cache Miss),高速缓存被猝发(Burst)填充入一行。通常一行4个定,其16字节。猝发填充被作为一种临界字优先操作,临界的字被同时写入到高速缓存和请求的单元,这样,减小了由于高速缓存填充时延造成的延迟。数据高速缓存与外部接口成对,允许对系统内存控制器有效率地访问。
数据高速缓存以32bit接口、通过Load/Store单元供应数据到GPRs。LSU提供了计算有效地址及与数据高速缓存数据对齐的逻辑,还提供Load/Store操作序列。对数据高速缓存的写操作以一个字节、半个字或字的形式进行。
数据高速缓存用512行组织。每行由16字节、状态位和地址标记组成。每行从内存装入4个连续的字,从内存4个字对齐的边界装载,这样,高速缓存行与页边界对齐了。
1.数据高速缓存Load/Store访问
Load/Store单元从数据高速缓存请求数据,并把它们存储在通用寄存器文件里转发到执行单元。因此,LSU与数据高速缓存是紧密耦合的。
如果没有数据高速缓存行失靶也没有DTLB失靶,Load操作花费2个时钟周期执行,Store操作花费1个时钟周期执行。LSU处理所有的数据对齐工作。
数据以字或半个字或字节的形式被写入到数据高速缓存。因为数据高速缓存仅以write-through(全写)模式操作,所有的写立即被写回到主存中或下一级高速缓存中。
2.数据高速缓存行填充操作
当执行Load指令并且一个高速缓存失靶发生时,一个带有前面是临界字的4个有顺序的读猝发被执行。由于高速缓存的失靶,临界字转发到Load/Store单元以减小执行损失。
3.高速缓存/内存一致
OR1200中数据高速缓存仅以全写的方式执行,而且OR1200不期望使用在多个处理器环境。因此不支持本地数据高速缓存和其他处理器的高速缓存或主存之间的数据一致性。
4.数据高速缓存的激活/禁止
数据高速缓存在启动时被禁止。整个数据高速缓存通过设置bit位SR[DCE]激活。在数据高速缓存被激活之前,它必须是无效的。
5.数据高速缓存无效
OR1200的数据高速缓存不支持整个数据高速缓存的无效。正常的使整个数据高速缓存失效的程序是循环所有的数据高速缓存行并单独使每行失效。
6.锁数据高速缓存
数据高速缓存使用在数据高速缓存控制寄存器DCCR的通道锁bit位。LWx的位被设置为1时,锁住单个通道。
7.数据高速缓存行预取
数据高速缓存行预取在OpenRISC 1000构架中是可选的,在OR1200中不支持。
8.数据高速缓存行刷新
因为数据高速缓存仅以全写操作,数据高速缓存行刷新仅执行行无效。操作通过写有效的地址到DCBFR寄存器而被执行。在数据高速缓存行上刷新操作和数据的行失效操作没有区别。
9.数据高速缓存行失效
数据高速缓存行失效是使一个单独的数据高速缓存行失效。操作通过写有效的地址到DCBIR寄存器中被执行。
10.数据高速缓存行回写
数据高速缓存行回写操作不做任何事情,因为数据高速缓存仅以全写模式进行操作。
11.锁数据高速缓存行
单个数据高速缓存行加锁在OR1200中没被实现。
2.2.4 数据与指令MMU
OR1200的数据MMU与指令MMU机制一样,下面仅说明数据MMU。
OR1200使用MMU提供内存访问保护和有效的虚拟内存到物理地址的转换。保护颗粒由OpenRISC 1000构架定义,一般为8KB或16MB页。MMU硬件支持二级软件表遍历。OR1200的TLB配置如表2-29所示。
表2-29 OR1200可能的数据TLB(简称DTLB)配置
数据MMU特征如下:
● 数据MMU与指令MMU分开。
● 页尺寸为8-KB。
● 便于理解的页保护机制。
● 基于翻译查找缓冲(TLB translation lookaside buffer)的直接映射哈希表,默认1条通道并有下面的特征。
■ 失靶和错误例外。
■ 软件可遍历表。
■ 因基于哈希设计而有高效率。
■ 数量可变的DTLB条目,默认时是每通道64条目。
下面说明数据MMU的机制。
1.禁止翻译
可通过清除bit位SR[DME]禁止Load/Store地址翻译,如果禁止翻译,那么物理地址用来访问数据高速缓存,物理地址可选信号提供在dwb_ADDR_O线上,这个物理地址将与Load/Store有效地址一致。
2.翻译激活
Load/Store地址翻译可通过设置bit位SR[DME]而被禁止,如果翻译被激活,它提供了有效的地址到物理地址翻译和内存访问的页保护。在OR1200中,操作系统的虚拟内存管理子系统管理页表。
3.DMMUCR和整个DTLB的刷新
DMMUCR在OR1200中没有被使用。因此页表基指针(PTBP)必须被存在软件变量中。整个DTLB的刷新必须通过将每个DTLB条目独立进行软件刷新来完成。软件刷新由软件从TLB条目写数据到PTE。
4.页保护
内存访问时,虚拟地址如果是PTE覆盖的有效页,内存保护机制将确定访问为有效。如果保护机制禁止访问,将产生一个数据页错误例外。
内存保护机制允许给超级管理者(supervisor)和用户(user)模式选择读和写访问。页保护机制提供了所有页颗粒上的保护。
5.DTLB条目重装载
OR1200没有使用DTLB条目在硬件上进行重载,而是使用软件例程搜索页表中正确的页表条目(PTE),并且复制页表条目到DTLB。软件负责维护页表里的访问和dirty(脏)位。
当LSU操作的Load/Store有效地址没有被DTLB缓存时,一个DTLB失靶例外发生。DTLB重载例程必须装载正确的PTE。
6.DTLB条目无效
必须用有效的地址写特殊寄存器DTLBEIR,并且相应的DTLB条目在本地的DTLB中置为无效。
7.锁DTLB条目
因为所有的DTLB条目重载在软件里执行,所以没有DTLB条目的硬件锁。
8.页属性—Dirty(D)
在OR1200 DTLB中没有使用Dirty属性,操作系统使用页保护机制产生Dirty属性位。
9.页属性—Accessed(A)
在OR1200 DTLB中没有使用Accessed属性,操作系统使用页保护机制产生Accessed属性位。
10.页属性—Weakly Ordered Memory(WOM弱次序内存)
在OR1200中不需要使用WOM属性,因为所有访问已被串行化。
11.页属性—Write-Back Cache(WBC回写高速缓存)
在OR1200中WBC属性是不需要的,因为数据高速缓存仅以全写方式操作。
12.页属性—Caching-Inhibited(CI高速缓存禁止)
OR1200 DTLB没有使用CI属性,高速缓存和非高速缓存区域被数据有效地址的bit30位分开。高速缓存和非高速缓存区域的划分如表2-30所示。
表2-30 高速缓存和非高速缓存区域的划分
当I/O寄存器是内存映射的,并且所有的读和写直接对外接口而不是对数据高速缓存执行时,非高速缓存的访问必须执行
13.页属性—Cache Coherency(CC高速缓存的一致性)
在OR1200中,CC属性是不需要的,因为它不支持多个处理器环境,还因为数据高速缓存仅在全写方式操作。
2.2.5 可编程的中断控制器
可编程的中断控制器(Programmable Interrupt Controller)从外部的源接收中断并将这些中断作为低或高优先级中断例外转发给CPU核心。中断控制器的组成如图2-9所示。
图2-9 中断控制器的组成
可编程中断控制器有三个特殊用途寄存器和32个中断输入。中断输入0和1总是被激活的,并连接到高和低的优先级中断输入,相应其他30个中断输入可以通过可编程的特殊用途寄存器屏蔽,并指定低或高优先级。
2.2.6 Tick定时器
OR1200使用了Tick定时器(Tick Timer)设备。它是由RISC时钟给出时间的定时器,被操作系统用来精确测量时间和调度系统任务。OR1200遵循框架Tick定时器设备的定义,具体如下:
● 232时钟周期的最大定时计数。
● 在中断之间最大228 时钟周期的时间间隔。
● 可屏蔽的Tick定时器中断。
● 单个运行,可重新启动或继续定时。
Tick定时器使用独立的时钟源进行操作,以便于在电源管理的睡眠时时钟还是可用的。
2.2.7 电源管理支持
为了优化电源管理,OR1200提供了低电源模式,它能动态激活或使某一内部模块失效。OR1200有三个主要特征来最小化电源消耗,具体如下:
● 慢速(Slow)和空闲(Idle)模式(慢速模式控制时钟频率降低)。
● 睡眠模式Doze(浅睡眠)和Sleep(深度睡眠),睡眠后通过中断唤醒。
各种电源管理模式下的电源消耗如表2-31所示。
表2-31 电源消耗降低倍数
慢速模式将得益于外部时钟产生电路的低电源除法器,将时钟频率整除后的低频率送给CPU,频率的降低导致功耗的降低。
当软件初始化为Doze模式,软件在核心挂起下运行。到RISC内部模块的时钟除了Tick定时器外都被禁止。但任何在芯片上的其他功能块可以运行正常的功能。当一个中断发生时,OR1200将离开Doze模式并进入正常模式。
在Sleep模式,所有的OR1200内部单元被禁止,并且由时钟门控。当一个中断发生时,OR1200将离开Doze模式并进入正常模式。
2.2.8 调试单元
调试单元(Debug Unit)帮助软件开发者调试系统。它提供了基本调试的支持,但不支持OpenRISC 1000构架中诸如Watchpoints,Breakpoints和程序流控制寄存器这样先进的调试特征。OR1200调试单元的框图如图2-10所示。
图2-10 调试单元的结构
Watchpoints和Breakpoints是匹配在调试寄存器中条件的程序语句或数据流触发的事件。Breakpoints不像Watchpoints,它还挂起当前程序流的执行,并开始断点例外处理。
2.2.9 时钟与复位
OR1200核心有几个时钟输入。时钟输入clk_cpu是CPU/DSP模块的时钟,并且还是RISC其他没有单独时钟的部分的时钟。数据高速缓存的时钟是clk_dc,指令高速缓存的时钟是clk_ic,数据MMU的时钟是clk_dmmu,指令MMU的时钟是clk_immu,Tick定时器的时钟是clk_tt。所有的时钟必须有同一相位和尽可能低的时钟脉冲相位差。
OR1200有异步复位信号。复位信号rst为高时,立即复位OR1200中的所有触发器。
2.2.10 WISHBONE接口
两个WISHBONE接口连接OR1200核心到外围或外部的内存子系统。它们遵循规范《WISHBONE SoC Interconnection specification Rev. B》,即WISHBONE片上系统内部连接规范。OR1200使用32bit宽度总线,不支持其他的总线宽度。