龍芯LS232使用者手冊晶片資料介紹

SZX511發表於2019-05-17

龍芯LS232核是一款實現 MIPS32相容且支援DSP擴充套件和EJTAG除錯的雙發射處理器,透過採用轉移預測、暫存器重新命名、亂序發射、路預測的指令CACHE、非阻塞的資料CACHE、寫合併收集等技術來提高流水線的效率,形成了一款具有突出的效能價格比及效能功耗比的32位嵌入式處理器IP 。


整體結構概述:

LS232核是一款實現 MIPS32相容且支援 DSP 擴充套件和 EJTAG除錯的雙發射處理器,透過採用轉移預測、暫存器重新命名、亂序發射、路預測的指令CACHE、非阻塞的資料CACHE、寫合併收集等技術來提高流水線的效率。


LS232核還可實現微體系結構的靈活配置,包括是否需要浮點功能部件,是否需要 TLB 和 CACHE部件,以及指令 CACHE和資料 CACHE分別的4KB 、 8KB 、 16KB大小配置。 LS232核的微體系結構如圖 1-1所示,各部分引數說明如表 1-1。處理器採用 5 級流水線實現,下面按照流水線的順序介紹 LS232核的處理過程及各個部件的功能。


LS232 核微體系結構圖:

LS232 微體系結構引數:


1) 取指流水級

LS232核的指令執行從取指開始,每拍可以同時取兩條指令。根據 PC的值,訪問 ITLB 將虛地址轉換成實體地址,如果發生 ITLB 查詢不命中,則需要 1 拍的延遲從 JTLB中選擇相應項填充 ITLB 。同時根據路預測的結果訪問指令 CACHE,讀取相應 CACHE行的所有 TAG 和相應預測的路的指令,將 TAG 和轉換後的實體地址高位比較,如果路預測正確,則將指令送往譯碼部件,否則需要 1 拍延遲讀取正確的路的指令,同時修正路預測。如果發生 CACHE不命中,則發出記憶體訪問請求。取指流水線還檢查 PC 的合法性,例如核心態、使用者態、地址錯等,還有是否是 EJTAG 所設的指令斷點,以及TLB 例外等。


2) 譯碼流水級

取來的指令經過譯碼部件,翻譯成 32 位 LS232核的內部操作。這主要是將原先不完全相同格式的指令,翻譯成完全相同的規整格式的內部操作,方便內部的各個部分識別處理相應的操作。譯碼好的內部操作將送往操作佇列QUEUE,在進入操作佇列的同時,查詢之前的操作是否與當前操作存在資料相關,如果存在資料相關,則將原運算元指向操作佇列中對應的操作,並記錄相應資訊,此過程是為了將來的亂序執行的重新命名。


譯碼流水線還進行轉移預測處理。當譯碼時遇到條件轉移指令,LS232核採用 Gshare 演算法透過 BHT 進行轉移預測,並且計算出跳轉的目標地址,修改 PC 的值。動態轉移預測還可以進行配置,透過控制暫存器 config6可配置不同的轉移預測策略,包括總是跳轉、總是不跳轉、總是向前跳轉、總是向後跳轉、轉移歷史表( BHT )動態預測、 Gshare動態預測等六種策略,預設的是 Gshare。對於 likely的條件轉移,LS232中總是預測 taken。當譯碼時遇到 BLINK 類指令(此為函式呼叫指令),則把 PC + 8 壓入地址返回棧 RAS 中。當譯碼時遇到 JR31指令(此為函式返回指令),則將RAS 棧頂的值彈出用於預測該指令的跳轉目標地址。


譯碼後的指令進入 QUEUE時,如果是一個基本塊的開始,則需要同時佔用 BRQ 的一項,並且記錄該指令的 PC 。如果是一條轉移指令,則與轉移預測相關的資訊記錄到對應基本塊的 BRQ 中,並且記錄轉移指令相對基本塊的開始指令的偏移。


3) 發射流水級

LS232核採用亂序發射策略,將運算元準備好的指令送往功能部件,其中訪存指令間仍維持原有的順序發射執行。每拍可以同時發射兩條指令,不過這兩條指令中包含的定點( /DSP )乘除法指令、訪存指令、浮點指令只能有一條。發射的指令從 GR 和 FR 中讀取相應的源運算元,送往各個功能部件的 BUFFER,等待執行。發射策略是, issue_bus0優先發射準備好的訪存指令, issue_bus1 優先發射準備好的第一條 alu 指令(包括轉移),另外再找一條準備好的浮點指令,選擇空閒的匯流排發射,最後找一條準備好的乘法類( acc)指令或第二條 alu 指令(不包括轉移),選擇空閒的匯流排發射。其中的訪存指令和乘法類指令都是順序發射,乘法類指令包括乘除指令和所有訪問 hi/lo暫存器的指令。LS232中還將一些指令定義為 wait issue指令和s t a l l i s s u e 指 令 , w a i t i s s u e指 令需要 等到隊 列頭才能 發 射 , s t a l l i s s u e指令將阻塞其後的所有指令的發射。


4) 執行流水級

各個功能部件根據指令執行相應的操作並且把結果寫回操作佇列。定點( /DSP )加減、移位、邏輯運算、轉移指令一拍即執行寫回,乘法指令需要 3 拍執行寫回,除法指令 3 - 35 拍。訪問 hi/lo 暫存器的指令也走乘法流水線,也要 3 拍寫回。


浮點指令乘法 4 拍,除法單精度 24 拍、雙精度 56 拍,加減 3 拍,定浮點轉換 3 拍,單雙精度轉換 2 拍,分支 2 拍,取負、絕對值等 2 拍。


訪存指令執行寫回需要 3 拍。第一拍透過 ADDR 模組計算虛地址。第二拍,訪問 DTLB將虛地址轉換成實體地址,如果發生 DTLB查詢不命中,則需要從 JTLB 中選擇相應項填充 DTLB。這級流水線也檢查各種例外,還有EJTAG的資料斷點。同時訪問資料 CACHE,讀取相應 CACHE行的 TAG和資料,將 TAG 和轉換後的實體地址高位比較,選擇正確的資料送往LOAD/STORE 佇列。第三拍,如果在資料 CACHE中命中,則 LOAD 結果寫回 QUEUE, STORE操作寫入資料 CACHE。如果發生資料CACHE不命中,則實體地址送往 MISS佇列,訪問記憶體,填充資料 CACHE。 


LS232核還支援寫合併的收集技術,即當 STORE操作發生資料 CACHE不命中後,STORE操作進入 MISS佇列時,不會立即發起訪存,會在 MISS佇列中繼續收集相同 CACHE行的 STORE操作,如果可以收集滿完整的 CACHE行,則不需要訪問記憶體,直接將這行收集好的資料填充資料 CACHE,以此節約訪存頻寬。 LS232的寫合併只要一項會在 MISS佇列中等待合併,當發生兩項寫miss ,則較早的那項將結束等待,開始發起記憶體請求。透過以上技術和各個訪存佇列, LS232核最多可以容忍 5 條不同 CACHE行的 STORE指令不命中(相同 CACHE行的 STORE指令不論多少條都能接收)和 4 條在 3 個CACHE行內的 LOAD 指令不命中。


LS232的功能部件,除了有結果匯流排 resbus ,還有 forward匯流排來表示下一拍寫回的指令。這樣,在發射時,選擇準備好的指令,可以透過上一拍的forward匯流排來確定本拍要寫回的指令,這種指令也可以發射。


乘法類指令、存數指令、 mtc0 類指令由於都是在執行時修改暫存器或記憶體,所以這些指令的執行需要確保不會被取消,即這些指令前沒有未執行的轉移指令、會引起例外的指令等。因此這些指令的執行都需要等待一個store_ok ,或 acc_write_ok等這樣的訊號。


轉移指令經過功能部件計算後,先寫回 brq,由 brq進行預測錯的轉移取消後,再寫回 queue中。轉移指令的target地址存在 queue的 imm 域中,而轉移指令的地址則根據基本塊的起始地址和轉移指令相對基本塊的偏移計算所得,或者根據 queue第一條指令的 pc 和轉移指令相對queue_head的偏移計算所得。


5) 提交流水級

指令提交就是將操作佇列中已經執行完的指令的運算結果寫入到定點暫存器堆中,同時將相應的操作佇列項釋放,每拍可以提交兩條指令。如果指令發生異常,則置異常訊號,取消處理器中所有指令的執行,並且到相應的異常入口地址取指執行。如果發生轉移預測錯誤,同樣取消後續指令的執行,重新開始取指。


2 指令集概述

MIPS公司開發的 MIPS體系結構( ISA)已經發展了 6 個版本,依次分別為 MIPS I, MIPS II, MIPS III, MIPS IV , MIPS V和 MIPS32/64,版本之間向前相容。目前最新的是 MIPS 32/64體系結構的 Release2版本,其中, MIPS32體系結構基於 MIPSII體系結構的指令集,並補充了MIPS III , IV 和 V中的部分指令增強其生成程式碼和移動資料的效率;MIPS64體系結構基於 MIPS V體系結構的指令集,相容 MIPS 32 體系結構。


MIPS32是 MIPS公司為了統一 MIPS指令系統的不同版本,在 MIPS II的基礎上進行擴充,並對系統態的指令進行規範而定義的。 MIPS32指令系統的使用者態指令融合了不同指令系統的優點,系統態指令也更加規範。


LS232處理器相容 MIPS32的 Release2體系結構。 MIPS32主要包括I S A( I n s t r u c t i o n S e t A r c h i t e c t u r e ) 、 P R A( P r i v i l e g e d R e s o u r c e A r c h i t e c t u r e ) 、 A S E s ( A p p l i c a t i o n S p e c i f i c

Extensions)和 UDI ( User Defined Instructions)四個部分, LS232處理器實現了 ISA、 PRA ,以及 DSP ASE。並且 LS232還實現了龍芯多媒體擴充套件。


本章從 CPU , PRA 兩個方面描述LS232指令結構系統,並分別給出指令列表,以及LS232實現的 CP0 暫存器的定義,關於 DSP 、浮點和多媒體部分可以參見 LS232 DSP 擴充套件手冊、 LS232浮點擴充套件手冊、LS232多媒體擴充套件手冊等。 LS232與 MIPS32 Release2相容,具體的指令說明以及暫存器描述可以參見 MIPS32使用者手冊。

2.1 CPU 暫存器

MIPS32體系結構定義瞭如下 CPU 暫存器:

( 1 ) 32 個 32 位的通用暫存器。 GPRs( general purpose registers)。其中有兩個被賦予了特殊含義: R0 , 0 號通用暫存器,值永 遠 為 0 ; R 3 1, 3 1 號 通 用 寄 存 器 , 被JAL, BLTZAL , BLTZALL, BGEZAL ,和 BGEZALL指令隱式的用作目標暫存器,存放返回地址。


( 2 )一對用於儲存乘法、除法和乘加操作的結果的特殊暫存器。 HI和 LO 。 HI 暫存器用於存放乘或者除運算結果的高位; LO 暫存器用於存放乘或者除運算結果的低位。


( 3 )一個特殊的程式計數器( PC )。這個暫存器程式不可直接訪問。


2.2 CPU 指令集

MIPS32體系結構的定義把 CPU 指令集按照功能劃分為以下幾組:存取、計算、跳轉分支、協處理器和雜項指令。

① Load 和 Store 訪存指令在主存和通用暫存器之間移動資料。訪存指令都是立即數指令( I 型),因為該指令模式所支援的唯一訪存模式就是基址暫存器加上 16 位的對齊的偏移量。

② Computational 計算型指令完成暫存器值的算術、邏輯、移位、乘法和除法操作。計算型指令包含了暫存器指令格式( R型,運算元和運算結果均儲存在暫存器中)和立即數指令格式( I 型,其中一個運算元為一個 16 位的立即數)。

③ Jump and Branch 跳轉和分支指令改變程式的控制流。絕對地址跳轉被稱為“ Jump(跳轉)”( J 型或者 R型), PC (指令計數器)相關的跳轉 指 令被稱為“ B r a n c h( 分 支 )”( I 型 ) 。

④ C opr o c e s s o r協處理器指令完成協處理器內部的操作。協處理器的訪存操作是 I 型指令。在MIPS32定義了 0 號協處理器(系統處理器)和 1 號協處理器(浮點協處理器),使用者可以自定義 2 號協處理器的功能。

⑤ Special 特殊指令完成系統呼叫和斷點操作。這些指令通常是 R型的。

⑥ Exception 異常指令引起跳轉,根據異常號比較結果跳轉到通用異常處理向量。這些指令包括 R型和 I型指令格式。


LS232 IP 雖然與 MIPS32 Release2版本相容,從功能上實現了 MIPS32體系結構規定的所有 CPU 指令,但是有些指令在實現了有細微的並不影響相容性的差別,以下值得程式設計人員注意。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31529038/viewspace-2644768/,如需轉載,請註明出處,否則將追究法律責任。

相關文章