- 片上系統(tǒng)設(shè)計(jì)思想與源代碼分析
- 陳曦 黃毅
- 5388字
- 2018-12-27 17:52:45
2.2 OR1200
2.2.1 OR1200的基本特點(diǎn)
OpenRISC1200處理器(簡稱OR1200或OR32)是OpenCores組織提供了基于GPL、屬于OpenRISC 1000序列中的一款RISC處理器。OR1200是32位標(biāo)量RISC,它具有哈佛結(jié)構(gòu)、5級整數(shù)流水線,支持虛擬內(nèi)存(MMU),帶有基本的DSP功能。外部數(shù)據(jù)和地址總線接口符合WISHBONE標(biāo)準(zhǔn)。
OR1200默認(rèn)的Cache配置是:一條通道直接映射的8KB數(shù)據(jù)高速緩存(Cache),一條通道直接映射的8KB指令高速緩存。每條通道是16字節(jié)的線尺寸。兩個Cache都是實(shí)體標(biāo)記的。
默認(rèn)配置時使用MMU,MMU由基于一條通道直接映射的數(shù)據(jù)TLB和指令TLB的64條目Hash表組成。
默認(rèn)配置的輔助功能有用于實(shí)時調(diào)試的調(diào)試單元、高分辨率的Ticker定時器、可編程中斷控制器和電源管理單元。
典型應(yīng)用的情況是,在使用0.18μm、6層金屬工藝時,OR1200的主頻運(yùn)行在300MHz,可以提供300Dhrystone和2.1MIPS和300次的32×32的DSP乘加操作。OR1200默認(rèn)配置時有一百萬個晶體管。
OR1200基于ORBIS32指令集。ORBIS32指令集包括32位整數(shù)指令、基本的DSP指令、32位的Load和Store指令、程序流程控制指令和特殊指令。
OR1200主要用于嵌入、便攜和網(wǎng)絡(luò)設(shè)備應(yīng)用中,并可以運(yùn)行任何一種現(xiàn)代操作系統(tǒng)。它的主要競爭者有ARM10、ARC等RISC處理器。
OR1200通用框架由CPU/DSP核心、直接映射的數(shù)據(jù)Cache、直接映射的指令Cache、基于DTLB的Hash表的數(shù)據(jù)MMU和指令MMU、電源管理單元及接口、Tick定時器,調(diào)試單元及開發(fā)接口、中斷控制器和中斷接口、指令及數(shù)據(jù)WISHBONE主機(jī)接口。OR1200通用框架如圖2-7所示。

圖2-7 OR1200通用框架
下面分別介紹OR1200的各個部分。
2.2.2 CPU/DSP核心
CPU/DSP是OR1200 RISC處理器的核心,OR1200僅應(yīng)用了OpenRISC 1000構(gòu)架的32bit部分,這個構(gòu)架的64bit部分和浮點(diǎn)及向量操作部分沒有被應(yīng)用到OR1200處理器上。CPU/DSP核心的結(jié)構(gòu)圖如圖2-8所示。

圖2-8 CPU/DSP結(jié)構(gòu)圖
1.指令單元(Instruction Unit)
指令單元應(yīng)用基本指令流水線,從內(nèi)存子系統(tǒng)取指令,把指令分發(fā)到可用的執(zhí)行單元,并保存一個狀態(tài)歷史記錄確保可實(shí)現(xiàn)精確的例外模型和確保指令按次序執(zhí)行。它還執(zhí)行條件分支和非條件跳轉(zhuǎn)指令。如果合適的執(zhí)行單元可用,序列發(fā)生器能在每個時鐘上分發(fā)一個有順序的指令。執(zhí)行單元必須辨別源數(shù)據(jù)是否可用,并確保沒有其他的指令使用同一個目的地寄存器。指令單元僅處理ORBIS32指令類,當(dāng)前OR1200不支持ORFPX32/64和ORVDX64指令類。
2.通用寄存器(GPRs,General-Purpose Registers)
OpenRISC 1200使用了32個通用32bit寄存器。OpenRISC 1000構(gòu)架還提供了寄存器文件的映像復(fù)制,用來在工作上下文之間快速切換,但目前OR1200沒有提供這個。OR1200把通用寄存器文件作為兩個帶有32個32bit字能力同步雙端口內(nèi)存使用。
3.Load/Store單元(LSU)
Load/Store單元在GPRs和CPU內(nèi)部總線之間傳輸所有的數(shù)據(jù)。它被用做一個獨(dú)立的執(zhí)行單元,安裝在內(nèi)存子系統(tǒng)里,如果有數(shù)據(jù)依賴性時僅影響主流水線。
LSU的主要特征如下:
● 所有的Load/Store指令通過硬件實(shí)現(xiàn)(包括原子指令);
● 具有地址條目緩沖;
● 執(zhí)行流水線操作;
● 快速內(nèi)存訪問的對齊。
當(dāng)Load和Store指令被發(fā)出時,LSU決定所有的操作數(shù)是否可用。操作數(shù)包括地址寄存器操作數(shù)、源數(shù)據(jù)寄存器操作數(shù)(對于Store指令來說)、目的地?cái)?shù)據(jù)寄存器操作數(shù)(對于Load指令來說)。
假定Load指令在數(shù)據(jù)高速緩存中有一個命中,LSU執(zhí)行一個Load操作需要2個時鐘周期。執(zhí)行Store指令花費(fèi)一個時鐘周期。有效地址EA被DMMU翻譯成物理地址。Load/Store的有效地址和數(shù)據(jù)也能被開發(fā)接口訪問。
4.整數(shù)執(zhí)行流水線(Integer Execution Pipeline)
OR1200通過流水線使大多數(shù)整數(shù)指令能在一個周期中執(zhí)行。它使用的32bit整數(shù)指令的類型如下:
● 算術(shù)指令
● 比較指令
● 邏輯指令
● 循環(huán)移位和移位指令
表2-27列出了通過流水線執(zhí)行整數(shù)指令的執(zhí)行時間,大多數(shù)時鐘在一個時鐘周期中執(zhí)行。
表2-27 整數(shù)指令的執(zhí)行時間

5.MAC單元
MAC單元執(zhí)行DSP MAC操作。MAC操作是32×32的48-bit累加器。MAC單元是全流水線的,并且在每個新的時鐘周期能接受新的MAC操作。
6.系統(tǒng)單元(System Unit)
系統(tǒng)單元連接CPU/DSP的所有其他沒有被指令和數(shù)據(jù)接口連接的信號,它還實(shí)現(xiàn)了系統(tǒng)特定寄存器(如supervisor寄存器),執(zhí)行所有的l.mtspr/l.mfspr指令。
7.例外(Exceptions)
當(dāng)一個例外條件出現(xiàn)時,將產(chǎn)生例外并進(jìn)入例外處理程序。例外的產(chǎn)生源有下面幾種。
● 外部中斷。
● 某一內(nèi)存訪問條件。
● 內(nèi)部錯誤,如嘗試執(zhí)行設(shè)有使用的操作碼。
● 系統(tǒng)調(diào)用。
● 內(nèi)部例外,如斷點(diǎn)例外。
例外處理被傳送到用戶軟件,當(dāng)一個例外發(fā)生時,控制被傳送到一個例外處理句柄,它由例外類型定義了例外處理例程偏移指針,例外在supervisor模式處理。
OR1200核心使用了精確的例外模式。這意味著當(dāng)一個例外發(fā)生時,下面的條件滿足。
● 程序流中隨后的指令被丟棄。
● 以前的指令完成并寫回了它們的結(jié)果。
● 錯誤指令的地址被存在EPCR寄存器中,并且機(jī)器狀態(tài)被存在ESR寄存器中。
OR1200例外不支持快速上下文切換。OR1200使用的例外說明如表2-28所示。
表2-28 OR1200使用的例外說明

2.2.3 數(shù)據(jù)和指令高速緩存
OR1200數(shù)據(jù)高速緩存與指令高速緩存的機(jī)制一樣,下面僅說明數(shù)據(jù)高速緩存。
OR1200數(shù)據(jù)高速緩存默認(rèn)配置是一條8-Kbyte通道直接映射的數(shù)據(jù)高速緩存,它允許核心快速訪問數(shù)據(jù)。數(shù)據(jù)高速緩存還可被配置成1KB、2KB、4KB和8KB形式。它的特征如下:
● 數(shù)據(jù)高速緩存與指令高速緩存分開(Harvard構(gòu)架)。
● 每個數(shù)據(jù)高速緩存應(yīng)用最少最近使用替換算法(LRU,Least-Recently Used)。
● 高速緩存目錄是物理地址,物理地址標(biāo)記存在高速緩存目錄中。
● 可全寫操作。
● 通過寫高速緩存特殊用途寄存器可取消高速緩存或使高速緩存失效。
當(dāng)發(fā)生一次失靶(Cache Miss),高速緩存被猝發(fā)(Burst)填充入一行。通常一行4個定,其16字節(jié)。猝發(fā)填充被作為一種臨界字優(yōu)先操作,臨界的字被同時寫入到高速緩存和請求的單元,這樣,減小了由于高速緩存填充時延造成的延遲。數(shù)據(jù)高速緩存與外部接口成對,允許對系統(tǒng)內(nèi)存控制器有效率地訪問。
數(shù)據(jù)高速緩存以32bit接口、通過Load/Store單元供應(yīng)數(shù)據(jù)到GPRs。LSU提供了計(jì)算有效地址及與數(shù)據(jù)高速緩存數(shù)據(jù)對齊的邏輯,還提供Load/Store操作序列。對數(shù)據(jù)高速緩存的寫操作以一個字節(jié)、半個字或字的形式進(jìn)行。
數(shù)據(jù)高速緩存用512行組織。每行由16字節(jié)、狀態(tài)位和地址標(biāo)記組成。每行從內(nèi)存裝入4個連續(xù)的字,從內(nèi)存4個字對齊的邊界裝載,這樣,高速緩存行與頁邊界對齊了。
1.?dāng)?shù)據(jù)高速緩存Load/Store訪問
Load/Store單元從數(shù)據(jù)高速緩存請求數(shù)據(jù),并把它們存儲在通用寄存器文件里轉(zhuǎn)發(fā)到執(zhí)行單元。因此,LSU與數(shù)據(jù)高速緩存是緊密耦合的。
如果沒有數(shù)據(jù)高速緩存行失靶也沒有DTLB失靶,Load操作花費(fèi)2個時鐘周期執(zhí)行,Store操作花費(fèi)1個時鐘周期執(zhí)行。LSU處理所有的數(shù)據(jù)對齊工作。
數(shù)據(jù)以字或半個字或字節(jié)的形式被寫入到數(shù)據(jù)高速緩存。因?yàn)閿?shù)據(jù)高速緩存僅以write-through(全寫)模式操作,所有的寫立即被寫回到主存中或下一級高速緩存中。
2.?dāng)?shù)據(jù)高速緩存行填充操作
當(dāng)執(zhí)行Load指令并且一個高速緩存失靶發(fā)生時,一個帶有前面是臨界字的4個有順序的讀猝發(fā)被執(zhí)行。由于高速緩存的失靶,臨界字轉(zhuǎn)發(fā)到Load/Store單元以減小執(zhí)行損失。
3.高速緩存/內(nèi)存一致
OR1200中數(shù)據(jù)高速緩存僅以全寫的方式執(zhí)行,而且OR1200不期望使用在多個處理器環(huán)境。因此不支持本地?cái)?shù)據(jù)高速緩存和其他處理器的高速緩存或主存之間的數(shù)據(jù)一致性。
4.?dāng)?shù)據(jù)高速緩存的激活/禁止
數(shù)據(jù)高速緩存在啟動時被禁止。整個數(shù)據(jù)高速緩存通過設(shè)置bit位SR[DCE]激活。在數(shù)據(jù)高速緩存被激活之前,它必須是無效的。
5.?dāng)?shù)據(jù)高速緩存無效
OR1200的數(shù)據(jù)高速緩存不支持整個數(shù)據(jù)高速緩存的無效。正常的使整個數(shù)據(jù)高速緩存失效的程序是循環(huán)所有的數(shù)據(jù)高速緩存行并單獨(dú)使每行失效。
6.鎖數(shù)據(jù)高速緩存
數(shù)據(jù)高速緩存使用在數(shù)據(jù)高速緩存控制寄存器DCCR的通道鎖bit位。LWx的位被設(shè)置為1時,鎖住單個通道。
7.?dāng)?shù)據(jù)高速緩存行預(yù)取
數(shù)據(jù)高速緩存行預(yù)取在OpenRISC 1000構(gòu)架中是可選的,在OR1200中不支持。
8.?dāng)?shù)據(jù)高速緩存行刷新
因?yàn)閿?shù)據(jù)高速緩存僅以全寫操作,數(shù)據(jù)高速緩存行刷新僅執(zhí)行行無效。操作通過寫有效的地址到DCBFR寄存器而被執(zhí)行。在數(shù)據(jù)高速緩存行上刷新操作和數(shù)據(jù)的行失效操作沒有區(qū)別。
9.?dāng)?shù)據(jù)高速緩存行失效
數(shù)據(jù)高速緩存行失效是使一個單獨(dú)的數(shù)據(jù)高速緩存行失效。操作通過寫有效的地址到DCBIR寄存器中被執(zhí)行。
10.?dāng)?shù)據(jù)高速緩存行回寫
數(shù)據(jù)高速緩存行回寫操作不做任何事情,因?yàn)閿?shù)據(jù)高速緩存僅以全寫模式進(jìn)行操作。
11.鎖數(shù)據(jù)高速緩存行
單個數(shù)據(jù)高速緩存行加鎖在OR1200中沒被實(shí)現(xiàn)。
2.2.4 數(shù)據(jù)與指令MMU
OR1200的數(shù)據(jù)MMU與指令MMU機(jī)制一樣,下面僅說明數(shù)據(jù)MMU。
OR1200使用MMU提供內(nèi)存訪問保護(hù)和有效的虛擬內(nèi)存到物理地址的轉(zhuǎn)換。保護(hù)顆粒由OpenRISC 1000構(gòu)架定義,一般為8KB或16MB頁。MMU硬件支持二級軟件表遍歷。OR1200的TLB配置如表2-29所示。
表2-29 OR1200可能的數(shù)據(jù)TLB(簡稱DTLB)配置

數(shù)據(jù)MMU特征如下:
● 數(shù)據(jù)MMU與指令MMU分開。
● 頁尺寸為8-KB。
● 便于理解的頁保護(hù)機(jī)制。
● 基于翻譯查找緩沖(TLB translation lookaside buffer)的直接映射哈希表,默認(rèn)1條通道并有下面的特征。
■ 失靶和錯誤例外。
■ 軟件可遍歷表。
■ 因基于哈希設(shè)計(jì)而有高效率。
■ 數(shù)量可變的DTLB條目,默認(rèn)時是每通道64條目。
下面說明數(shù)據(jù)MMU的機(jī)制。
1.禁止翻譯
可通過清除bit位SR[DME]禁止Load/Store地址翻譯,如果禁止翻譯,那么物理地址用來訪問數(shù)據(jù)高速緩存,物理地址可選信號提供在dwb_ADDR_O線上,這個物理地址將與Load/Store有效地址一致。
2.翻譯激活
Load/Store地址翻譯可通過設(shè)置bit位SR[DME]而被禁止,如果翻譯被激活,它提供了有效的地址到物理地址翻譯和內(nèi)存訪問的頁保護(hù)。在OR1200中,操作系統(tǒng)的虛擬內(nèi)存管理子系統(tǒng)管理頁表。
3.DMMUCR和整個DTLB的刷新
DMMUCR在OR1200中沒有被使用。因此頁表基指針(PTBP)必須被存在軟件變量中。整個DTLB的刷新必須通過將每個DTLB條目獨(dú)立進(jìn)行軟件刷新來完成。軟件刷新由軟件從TLB條目寫數(shù)據(jù)到PTE。
4.頁保護(hù)
內(nèi)存訪問時,虛擬地址如果是PTE覆蓋的有效頁,內(nèi)存保護(hù)機(jī)制將確定訪問為有效。如果保護(hù)機(jī)制禁止訪問,將產(chǎn)生一個數(shù)據(jù)頁錯誤例外。
內(nèi)存保護(hù)機(jī)制允許給超級管理者(supervisor)和用戶(user)模式選擇讀和寫訪問。頁保護(hù)機(jī)制提供了所有頁顆粒上的保護(hù)。
5.DTLB條目重裝載
OR1200沒有使用DTLB條目在硬件上進(jìn)行重載,而是使用軟件例程搜索頁表中正確的頁表?xiàng)l目(PTE),并且復(fù)制頁表?xiàng)l目到DTLB。軟件負(fù)責(zé)維護(hù)頁表里的訪問和dirty(臟)位。
當(dāng)LSU操作的Load/Store有效地址沒有被DTLB緩存時,一個DTLB失靶例外發(fā)生。DTLB重載例程必須裝載正確的PTE。
6.DTLB條目無效
必須用有效的地址寫特殊寄存器DTLBEIR,并且相應(yīng)的DTLB條目在本地的DTLB中置為無效。
7.鎖DTLB條目
因?yàn)樗械腄TLB條目重載在軟件里執(zhí)行,所以沒有DTLB條目的硬件鎖。
8.頁屬性—Dirty(D)
在OR1200 DTLB中沒有使用Dirty屬性,操作系統(tǒng)使用頁保護(hù)機(jī)制產(chǎn)生Dirty屬性位。
9.頁屬性—Accessed(A)
在OR1200 DTLB中沒有使用Accessed屬性,操作系統(tǒng)使用頁保護(hù)機(jī)制產(chǎn)生Accessed屬性位。
10.頁屬性—Weakly Ordered Memory(WOM弱次序內(nèi)存)
在OR1200中不需要使用WOM屬性,因?yàn)樗性L問已被串行化。
11.頁屬性—Write-Back Cache(WBC回寫高速緩存)
在OR1200中WBC屬性是不需要的,因?yàn)閿?shù)據(jù)高速緩存僅以全寫方式操作。
12.頁屬性—Caching-Inhibited(CI高速緩存禁止)
OR1200 DTLB沒有使用CI屬性,高速緩存和非高速緩存區(qū)域被數(shù)據(jù)有效地址的bit30位分開。高速緩存和非高速緩存區(qū)域的劃分如表2-30所示。
表2-30 高速緩存和非高速緩存區(qū)域的劃分

當(dāng)I/O寄存器是內(nèi)存映射的,并且所有的讀和寫直接對外接口而不是對數(shù)據(jù)高速緩存執(zhí)行時,非高速緩存的訪問必須執(zhí)行
13.頁屬性—Cache Coherency(CC高速緩存的一致性)
在OR1200中,CC屬性是不需要的,因?yàn)樗恢С侄鄠€處理器環(huán)境,還因?yàn)閿?shù)據(jù)高速緩存僅在全寫方式操作。
2.2.5 可編程的中斷控制器
可編程的中斷控制器(Programmable Interrupt Controller)從外部的源接收中斷并將這些中斷作為低或高優(yōu)先級中斷例外轉(zhuǎn)發(fā)給CPU核心。中斷控制器的組成如圖2-9所示。

圖2-9 中斷控制器的組成
可編程中斷控制器有三個特殊用途寄存器和32個中斷輸入。中斷輸入0和1總是被激活的,并連接到高和低的優(yōu)先級中斷輸入,相應(yīng)其他30個中斷輸入可以通過可編程的特殊用途寄存器屏蔽,并指定低或高優(yōu)先級。
2.2.6 Tick定時器
OR1200使用了Tick定時器(Tick Timer)設(shè)備。它是由RISC時鐘給出時間的定時器,被操作系統(tǒng)用來精確測量時間和調(diào)度系統(tǒng)任務(wù)。OR1200遵循框架Tick定時器設(shè)備的定義,具體如下:
● 232時鐘周期的最大定時計(jì)數(shù)。
● 在中斷之間最大228 時鐘周期的時間間隔。
● 可屏蔽的Tick定時器中斷。
● 單個運(yùn)行,可重新啟動或繼續(xù)定時。
Tick定時器使用獨(dú)立的時鐘源進(jìn)行操作,以便于在電源管理的睡眠時時鐘還是可用的。
2.2.7 電源管理支持
為了優(yōu)化電源管理,OR1200提供了低電源模式,它能動態(tài)激活或使某一內(nèi)部模塊失效。OR1200有三個主要特征來最小化電源消耗,具體如下:
● 慢速(Slow)和空閑(Idle)模式(慢速模式控制時鐘頻率降低)。
● 睡眠模式Doze(淺睡眠)和Sleep(深度睡眠),睡眠后通過中斷喚醒。
各種電源管理模式下的電源消耗如表2-31所示。
表2-31 電源消耗降低倍數(shù)

慢速模式將得益于外部時鐘產(chǎn)生電路的低電源除法器,將時鐘頻率整除后的低頻率送給CPU,頻率的降低導(dǎo)致功耗的降低。
當(dāng)軟件初始化為Doze模式,軟件在核心掛起下運(yùn)行。到RISC內(nèi)部模塊的時鐘除了Tick定時器外都被禁止。但任何在芯片上的其他功能塊可以運(yùn)行正常的功能。當(dāng)一個中斷發(fā)生時,OR1200將離開Doze模式并進(jìn)入正常模式。
在Sleep模式,所有的OR1200內(nèi)部單元被禁止,并且由時鐘門控。當(dāng)一個中斷發(fā)生時,OR1200將離開Doze模式并進(jìn)入正常模式。
2.2.8 調(diào)試單元
調(diào)試單元(Debug Unit)幫助軟件開發(fā)者調(diào)試系統(tǒng)。它提供了基本調(diào)試的支持,但不支持OpenRISC 1000構(gòu)架中諸如Watchpoints,Breakpoints和程序流控制寄存器這樣先進(jìn)的調(diào)試特征。OR1200調(diào)試單元的框圖如圖2-10所示。

圖2-10 調(diào)試單元的結(jié)構(gòu)
Watchpoints和Breakpoints是匹配在調(diào)試寄存器中條件的程序語句或數(shù)據(jù)流觸發(fā)的事件。Breakpoints不像Watchpoints,它還掛起當(dāng)前程序流的執(zhí)行,并開始斷點(diǎn)例外處理。
2.2.9 時鐘與復(fù)位
OR1200核心有幾個時鐘輸入。時鐘輸入clk_cpu是CPU/DSP模塊的時鐘,并且還是RISC其他沒有單獨(dú)時鐘的部分的時鐘。數(shù)據(jù)高速緩存的時鐘是clk_dc,指令高速緩存的時鐘是clk_ic,數(shù)據(jù)MMU的時鐘是clk_dmmu,指令MMU的時鐘是clk_immu,Tick定時器的時鐘是clk_tt。所有的時鐘必須有同一相位和盡可能低的時鐘脈沖相位差。
OR1200有異步復(fù)位信號。復(fù)位信號rst為高時,立即復(fù)位OR1200中的所有觸發(fā)器。
2.2.10 WISHBONE接口
兩個WISHBONE接口連接OR1200核心到外圍或外部的內(nèi)存子系統(tǒng)。它們遵循規(guī)范《WISHBONE SoC Interconnection specification Rev. B》,即WISHBONE片上系統(tǒng)內(nèi)部連接規(guī)范。OR1200使用32bit寬度總線,不支持其他的總線寬度。
- Mastering Ext JS(Second Edition)
- 演進(jìn)式架構(gòu)(原書第2版)
- Java EE 6 企業(yè)級應(yīng)用開發(fā)教程
- JavaScript高效圖形編程
- Java 9 Programming Blueprints
- Java技術(shù)手冊(原書第7版)
- 營銷數(shù)據(jù)科學(xué):用R和Python進(jìn)行預(yù)測分析的建模技術(shù)
- C語言程序設(shè)計(jì)
- Python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)
- Effective Python Penetration Testing
- SQL基礎(chǔ)教程(第2版)
- 微服務(wù)架構(gòu)深度解析:原理、實(shí)踐與進(jìn)階
- Distributed Computing in Java 9
- 從零開始:C語言快速入門教程
- Visual Basic程序設(shè)計(jì)基礎(chǔ)