轉載:UVM RAL模型:用法和應用_寄存器 (sohu.com)
在系統設計中通常會面臨兩大挑戰:縮小技術節點的規模和上市時間(TTM,Time to Market)。為了適應激烈的市場競爭,大多數系統都是以通用方式設計的,這意味着同一設計可以通過不同的配置實現不同的應用方式。配置數量越多,設計中的寄存器數量越多。最重要的是,由於當前市場對數據存儲的大量需求,存儲大小也越來越大。為了訪問和驗證大量寄存器和巨大的存儲,需要一些創新的方法。因此,UVM提供了用於寄存器管理及訪問的基類庫,稱為UVM RAL(Register Abstraction Layer,寄存器抽象層)。
顧名思義,UVM RAL是訪問設計寄存器的高級面向對象抽象層。RAL模型模仿了設計寄存器,並且整個模型是完全可配置的。由於其抽象行為,RAL模型可以 輕松地從模塊級別遷移到系統級別。
本文提供了有關UVM RAL的不同級別的相關內容,包括:如何將同一個RAL模型用於多個接口,RAL模型內部的存儲實現及其訪問方法,預測器模型的信息以及根據其操作預測寄存器值等。它還有一個現成的UVM寄存器序列列表。僅通過配置這些序列,用戶就可以訪問和驗證所有設計寄存器和存儲的功能。
介紹:
任何設計驗證的首要步驟是其寄存器驗證,即檢查寄存器的可訪問性及其功能。執行此寄存器驗證,並不一定需要使用UVM RAL模型,但是在不使用它進行驗證時,用戶必須注意每個寄存器的屬性和復位值。同樣,用戶必須確保使用所有可能的值來驗證每個寄存器域。在整個寄存器范圍內手動執行這些檢查是一項很耗時的任務,因此使用UVM RAL模型是一種非常有效的方法。
UVM RAL是面向設計內部寄存器的模型。要訪問這些設計寄存器,UVM RAL提供了現成的基類和API。RAL模型的一些特性包括:
- 就像寄存器的設計一樣,它支持不同的寄存器屬性,例如R / W,RO,WO,W1C等。
- 支持兩種不同的寄存器訪問路徑,前門訪問和后門訪問。
- 同一模型可以通過多條總線訪問。
- 它的抽象性質允許在模塊級別以及系統級別使用相同的模型。
- 內置比較方法,可將寄存器值與其預測值進行比較。
每個RAL模型主要具有以下三個結構層次:
- uvm_reg_block是最頂層的層次結構,通常,uvm_reg_block具有所有寄存器(uvm_reg)的一個實例,或者可能具有其他uvm_reg_block的實例。
- uvm_reg模擬設計內部的寄存器。根據其定義,每個寄存器可以具有一個或多個uvm_reg_field。
- uvm_reg_field代表寄存器的域。
圖1 RAL層次圖解
RAL模型模仿設計寄存器,更新設計寄存器的值,同時更新RAL模型寄存器的值。為此,UVM具有通用的API,可以同時更新設計和RAL模型寄存器。除寄存器外,RAL模型也可以用來對存儲建模,其優點之一是burst 操作。本文的后半部分中,給出了一個存儲burst操作的示例,同時提供了有關預測器模型,寄存器覆蓋率和UVM預定義寄存器序列的一些信息。
RAL寄存器映射和適配器
RAL模型集成的基本步驟之一是適配器(adapter)類的實現。此類具有兩個基本的函數:bus2reg用於將總線sequence items轉換為uvm_reg_bus_op(RAL模型中已知),和reg2bus實現相反的功能。用戶定義的適配器類應通過擴展uvm_reg_adapter基類來實現。這意味着所有前門寄存器的讀/寫操作都通過此適配器類進行。由於適配器類的實現取決於總線,因此,每個總線都必須具有自己的適配器類。
每個前門寄存器的寫/讀操作都通過reg2bus和bus2reg API進行。對於不同的總線,例如APB和AXI,如果它們訪問相同的RAL模型,則需要為每條總線創建適配器類。因此,對於每個寄存器映射,必須按如下所示設置RAL模型sequencer:
使用特定寄存器map訪問RAL模型寄存器的示例:
UVM存儲器
UVM RAL模型也可以用來對存儲建模,稱為uvm_mem。像uvm_reg一樣,uvm_mem的目的在於模仿設計內部的存儲器。下面的代碼顯示了如何在RAL模型中實現存儲建模:
該存儲器的優點之一是其burst讀/寫操作,如下所示:
像寄存器一樣,存儲器訪問也可以通過前門和后門進行。uvm_mem沒有空間來存儲期望的數據,這意味着該uvm_mem的缺點之一是它不支持內置數據比較。
UVM預測器
如前所述,寄存器模型具有內置的自檢機制。每當訪問寄存器時,uvm_reg都會更新為相同的值,並且該值會變為其預測值。這種預測可以通過三種不同的方式進行:
- 隱式預測
- 顯式預測
- 被動預測
隱式預測
隱式預測是最簡單、最常見的預測方法。每當發生寄存器寫/讀操作時,UVMRAL模型基類都會調用該特定uvm_reg類的predict方法。要啟用此功能,用戶必須調用uvm_reg_map的set_auto_predict(1)方法,如下所示。默認情況下,該方法是禁用的。
圖2 隱式預測流程
如上圖所示,啟用自動預測后,寄存器模型會在每次寫/讀操作時預測該值。在這里,期望用戶必須通過調用uvm_reg的write或read方法來啟動寄存器操作。
顯式預測
使用顯式預測,用戶必須創建uvm_reg_predictor類的句柄,該類是RAL模型的基類。該預測器類需要與監視器類相連。監視器對發生在接口上的寄存器寫/讀操作進行采樣,並將捕捉到的事務傳遞給預測器。Predictor類借助適配器將總線事務轉換為寄存器事務,然后調用該寄存器的predict方法。
在編碼方面,利用三個基本步驟可以實現顯式預測:創建,配置和連接。
-
創建
-
配置
-
連接
這種預測方法的優勢在於,因為預測是基於接口上驅動的數據進行的,所以寄存器模型總是與實際數據保持同步。
被動預測
當未通過寄存器模型進行寄存器讀/寫操作時,此方法很有用。被動預測根據在總線接口上觀察到的操作來預測寄存器值,與顯式預測非常相似。
寄存器覆蓋率
UVM RAL提供了一個API來采樣用戶定義的覆蓋組。為了對這些覆蓋組進行采樣,用戶必須覆蓋(override)uvm_reg/uvm_reg_block類的sample方法。對於RAL模型覆蓋,用戶必須使能寄存器預測。
以下代碼顯示了擴展uvm_reg_block內部的covergroup實現,其中涵蓋了寄存器及其操作。
下面的uvm_reg類內部的covergroup實現示例顯示,其意圖是覆蓋訪問寄存器所用的不同值。
選擇性覆蓋組采樣也是可能的,為此,用戶必須提供適當的功能覆蓋類型標識符。
UVM RAL預定義序列
UVM軟件包提供了一組現成的序列,以測試寄存器的功能,例如其訪問或復位值。所有這些序列在操作上都是唯一的,其中有幾個寄存器序列的描述如下表所示:
序列名稱 |
功能 |
uvm_reg_hw_reset_seq |
檢查每個寄存器的復位值是否與硬件復位值匹配。 |
uvm_reg_bit_bash_seq |
檢查所有支持讀寫訪問的域,依次寫入1和0,並讀出后做比較,用於檢查寄存器域屬性的有效性。 |
uvm_reg_access_seq |
用前門訪問方式寫入每個寄存器,從后門讀回數值進行比較。然后執行反向操作,即通過后門進行寫操作,並通過前門進行檢查。 |
uvm_mem_walk_seq |
在目標存儲的指定地址范圍的每個地址寫入數據,並將其與讀取值進行比較。 |
uvm_mem_access_seq |
對於存儲器的每個位置,通過前門寫入,從后門讀回數值進行比較。然后,執行反向操作,即通過后門進行寫操作,並通過前門進行驗證。 |
uvm_reg_shared_access_seq |
通過每個地址映射寫入所有寄存器,並通過讀取所有地址映射來確認其寫入值。 |
uvm_mem_shared_access_seq |
通過每個地址映射寫入所有內存位置,並通過讀取所有地址映射確定其寫入值。 |
uvm_reg_mem_shared_access_seq |
執行uvm_reg_shared_access_seq,然后執行uvm_mem_shared_access_seq |
uvm_reg_mem_built_in_seq |
執行所選/所有上述預定義序列。 |
uvm_reg_mem_hdl_paths_seq |
檢查指定的HDL路徑是否可訪問。 |
上述每個測試都有一個禁用屬性,用戶可以通過該屬性跳過任何寄存器/存儲器的特定測試。通過設置屬性:“NO_REG_TEST”或“NO_MEM_TEST”,用戶可以從上述所有測試中排除特定的寄存器/存儲器。
總結
UVM RAL是訪問和驗證設計寄存器和存儲器的簡單方法。與實際設計一樣,uvm_mem支持burst寫入和讀取操作。除了訪問寄存器之外,UVM還有現成的API,可用於對寄存器覆蓋率進行采樣。此外,由於不同UVM寄存器預定義序列的多個場景,寄存器驗證的任務也變得簡單。由於其分層結構和大量可用的API,RAL模型具有足夠的靈活性。除了以標准方式訪問API外,用戶還可以使用這些API進行其他一系列操作,例如,通過其地址訪問寄存器或更新任何特定的寄存器域。總體而言,UVM RAL是功能強大的抽象層,它支持寄存器驗證所需的所有功能,並且由於其組織結構,強烈建議在基於UVM的測試平台中利用RAL模型進行寄存器驗證。
原文來自:
https://www.design-reuse.com/articles/46675/uvm-ral-model-usage-and-application.html