UVM暫存器篇之二:暫存器模型概覽(下)
本文轉自:http://www.eetop.cn/blog/html/28/1561828-6266219.html
暫存器模型構建
在構建UVM暫存器模型的過程中,讀者需要了解下面這些與模型構建相關的類和它們的功能:
簡化後的MCDF暫存器模型定義如下:
從上面的定義中,讀者可以整理出關於暫存器建模的基本要點和順序:
在定義單個暫存器時,需要將暫存器中的各個域整理出來,在建立之後還應當通過uvm_ref_field::configure()函式來進一步配置各自屬性。考慮到uvm_reg_field::configure函式自身的引數較多,且都要求指定出來,需要讀者保證引數的一一對應。
在定義uvm_reg_block時,讀者需要注意reg_block與uvm_mem、uvm_reg以及uvm_reg_map的包含關係。首先uvm_reg和uvm_mem都分別對應著硬體中獨立的暫存器或者儲存,而一個uvm_reg_block可以用來模擬一個功能模組對應的暫存器模型,因此其中可以容納多個uvm_reg和uvm_mem的例項;其次map的作用一方面用來表示暫存器和儲存對應的偏移地址,同時由於一個reg_block可以包含多個map,各個map可以分別對應不同匯流排或者master訪問uvm_reg_block時的地址段。在reg_block中建立了各個uvm_reg之後,需要呼叫uvm_reg::configure()去配置各個uvm_reg例項的屬性。
考慮到uvm_reg_map也會在uvm_reg_block中例化,在例化之後需要通過uvm_reg_map::add_reg()函式來新增各個uvm_reg對應的偏移地址和訪問屬性等。只有規定了這些屬性,才可以在稍後的前門訪問(frontdoor)中給出正確的地址。
一個uvm_reg_block可以用來對更大的子系統或者晶片系統的暫存器建模,這意味著uvm_reg_block之間也可以存在包含關係構成層次,同時上層的uvm_reg_map也可以新增子一級uvm_reg_block的uvm_reg_map,用來構建更全域性的“版圖”。繼而通過uvm_reg_block與uvm_reg_map之間的層次關係來構建更上層的暫存器模型整合。
上面的暫存器模型mcdf_rgm在構建時暫時沒有考慮功能覆蓋率收集和後門訪問路徑指定,這些特性的新增我們將在後面的具體環節中進一步新增。那麼當一旦擁有一個暫存器模型之後,它接下來的使用步驟是什麼呢?實際上對於不同的角色,他們對暫存器模型也有著不同的關注,譬如VIP開發者主要關注實現匯流排介面卡,TB開發者關係如何將匯流排介面卡與暫存器模型的連線等。但暫存器模型從一開始的暫存器描述文件到最後的功能檢查,都需要貫穿如下的生命週期:
對於不同的驗證過程中的角色,他們可能會參與上述的部分流程:
-
對於系統工程師需要提供暫存器描述檔案。
-
對於模組驗證人員需要生成暫存器模型。
-
對於VIP開發人員需要提供匯流排介面卡。
-
對於TB構建人員(與模組驗證人員有時候不是同一個人)需要整合暫存器模型。
-
對於模組驗證人員還需要完成後續的暫存器模型檢查和功能覆蓋率收集。
但對於暫存器模型的生命週期,接下來的環節中我們除了已經介紹的生成暫存器模型以外,將逐一將暫存器模型的整合和匯流排介面卡、暫存器模型的常用方法以及暫存器模型檢查和功能覆蓋率收集介紹給讀者。