在本文中,我們將介紹五個廣泛使用的特殊寄存器,即;別名、影子、間接、鎖定和觸發緩沖區寄存器。
在當今的SoC中,我們已經看到了系統架構、節點大小、互連、安全性、編程語言和開發工具領域的許多創新。有時,我們低估了我們在日常工作中使用的簡單創新的重要性和影響,這些創新是我們作為 SoC 架構師、驗證工程師、硬件設計師或軟件/固件開發人員。
特別是,讓我們研究與硬件/軟件接口層相關的創新 - 軟件應用程序與硬件外設通信。具體來說,在寄存器空間中,硬件外圍設備(如視頻編解碼器、藍牙或 Wi-Fi)從處理器上執行的軟件應用程序接收配置、控制和功能。十年前,在設計寄存器時,我們只需要RO、WO、RW、RC、RS、WS等的組合。但是今天的SoC已經變得如此復雜,以至于我們不得不進行創新,并思考更具創造性的方式來設計寄存器。在本文中,我們將介紹五個廣泛使用的特殊寄存器,即;別名、影子、間接、鎖定和觸發緩沖區寄存器。
別名寄存器
這是一種可從同一地址映射中的多個地址訪問的寄存器類型,但實際上它是一個寄存器。別名寄存器中的字段根據用于訪問它們的地址具有不同的行為。如圖 1 所示的示例,RegA 中的字段在使用0x1000地址訪問時是可讀和可寫的,但在從0x2000地址訪問時是寫 1 到清除的。創建別名寄存器時應應用的一些準則:別名寄存器的硬件訪問為 NA;字段不能是已別名字段的別名;并且別名字段的父寄存器不能是外部的。
影子寄存器
當您的軟件應用程序需要覆蓋所有寄存器但稍后需要恢復數據時,解決方案是使用影子寄存器。通過寄存器總線寫入寄存器的數據應自動復制或隱藏到地址映射中的另一個寄存器。如圖 2 中的示例所示,OriginalReg 中的數據被復制到 ShadowReg。可以從總線訪問ShadowReg,但對原始寄存器沒有影響。多個影子寄存器可以影子單個原始寄存器。
間接寄存器
某些寄存器或存儲器位置不能通過專用地址直接訪問,它們被稱為間接尋址寄存器或簡稱間接寄存器。兩個寄存器用于訪問間接寄存器。
若要將值存儲到間接寄存器數組中,請使用基本寄存器來保存實際地址。該指令檢查基本寄存器,將其值解釋為寄存器數組中的地址位置,并將數據寄存器中的值放入該位置。要從間接寄存器數組加載值,還使用了基本寄存器。此基本寄存器保存實際地址。該指令檢查基本寄存器,將其值解釋為地址,獲取存儲在該位置的值,然后將其加載到數據寄存器中。
如圖 3 中的示例所示,Reg1 指定內存數組中的索引。Reg2 指定要寫入的數據或存儲從內存中讀取的值。Reg2 需要一個間接寄存器大小的“深度”屬性。
鎖定寄存器
如果狀態機受保護在寄存器后面,而該狀態機只能由存儲在另一個寄存器中的密鑰啟動,則 Lock 寄存器可能是解決方案。任何可寫寄存器或字段都可以根據其他寄存器的字段值進行保護/鎖定。此類寄存器稱為鎖定寄存器。鎖定寄存器和保護/密鑰寄存器可以位于不同的寄存器組中,但不能位于不同的塊中。如圖 4 中的示例所示,由屬性 “lock” 指定的 Lock 寄存器由一個簡單的表達式lock=RegA.f1 定義,這意味著寄存器 Lockreg 被鎖定,具體取決于寄存器“RegA”(密鑰寄存器)的字段“f1”的值。鎖定機制也可以通過更復雜的表達式來定義,例如 lock = regA.FldA || regB.Lock_fld == 8‘b00000001&& regA.FldA == 4’b0011。此復雜表達式由不同的寄存器字段組成。在這種情況下,如果鎖定表達式中的每個條件在運行時計算結果為 true,則寄存器的軟件寫訪問權限將被鎖定。
觸發緩沖寄存器
有時需要從硬件端將大小大于總線寬度的寄存器作為一個原子單元寫入和讀取。這種寄存器從軟件端按順序寫入/讀取。這可以通過在與觸發事件關聯的內存空間中創建 N 寄存器緩沖區來實現。當觸發事件發生時,寫入/讀取發生在緩沖區到硬件端可用的實際寄存器。觸發事件可以是對最低有效位或最高有效位寄存器的讀/寫。例如,如圖5所示,RegA是寬硬件寄存器,寬寄存器Reg.A1的MSB是觸發器。Reg.A2 和 Reg.A3 是對應于寬硬件寄存器字段的緩沖區。
下一步是學習如何在IP-XACT或SystemRDL中定義這些特殊寄存器。還需要學習如何在RTL中對它們進行編碼,并創建UVM寄存器模型和完整的UVM測試平臺以進行驗證。我們將在點播網絡研討會 5 對當今 SoC 有用的特殊寄存器中詳細介紹后續步驟。在本次網絡研討會中,我們將提供這五個特殊寄存器的詳細信息、它們的優勢、用例和示例。我們還提供有關如何自動驗證它們的最佳實踐,以實現 100% 的功能覆蓋率。
審核編輯:郭婷
-
寄存器
+關注
關注
31文章
5361瀏覽量
120873 -
soc
+關注
關注
38文章
4193瀏覽量
218694
發布評論請先 登錄
相關推薦
評論