解讀uvm_config_db中的set和get方法

2023-03-07 06:00:48

一、uvm_config_db簡介

uvm_config_db的全稱是configuration database,它是建立在 uvm_resource_db 之上的便利層,resource database儲存的是與scope字串相關聯的name-value對(如下圖所示) 。
uvm_config_db可以將scope字串與元件層次結構中的完整層次結構名稱相關聯,這樣就可以通過元件層次來更加方便地存取資料庫的條目(儲存的資訊)。

config_db 是引數化的,它的型別可以是標量、類控制程式碼、佇列、列表,甚至是虛擬介面。通過uvm_config_db::set 和 uvm_config_db::get 函數進行全域性儲存和檢索資料庫中的資訊。

二、set和get函數

1、set函數

set函數的原型為

static function void set(uvm_component cntxt,
                           string inst_name,
                           string field_name,
                           T value);
  • 第一個引數cntxt是一個元件,它是存取資料庫條目的層級起點;
  • 第二個引數inst_name是限制資料庫條目可存取性的分層路徑;

簡單來說,前兩個引數可以組成一個層次化路徑,這個路徑指定了我們只能從哪個城市出發,走哪條公路達到我們想去的目的地。

  • 第三個引數field_name是用作查詢資料庫條目的標籤;
  • 第四個引數value是要儲存在資料庫中的值,T是他的型別,如前文所述,可以是標量、類控制程式碼、佇列、列表、虛擬介面等;

field_name就像是一個做過特殊標記的盒子,裡面放的東西就是value,這個特殊標記只有兩個「人」知道,因此才能保證盒子的傳送不會出錯。

2、get函數

get函數的原型為:

static function bit get(uvm_component cntxt,
                          string inst_name,
                          string field_name,
                          inout T value);

它的四個引數的定義與set大致一樣,不同的是

  • 前兩個引數:就像是兩個要去見面的朋友一樣,比如一個人(set)從洛陽去另一個人(get)所在的西安。從洛陽到西安的路線(由cntxt和inst_name構成的層級路線)是絕對的,但是對洛陽的朋友來說是要走很遠的遠方,對西安的朋友來說是家門口,因此以他們各自作為參考系來說,ntxt和inst_name是不同的。
  • 第三個引數:field_name必須要和set函數中的相同,特殊標記的暗號不一樣,裝有重要物資(value)的盒子就不能保證交到正確的接收方手上了。
  • 第四個引數:和set不同,此時的value是那個要從資料庫檢索值(也就是要從盒子裡取得value)的變數。
  • get 如果成功返回 1 ,如果資料庫中沒有找到此類資源則返回 0;set是空函數沒有返回值。

3、其他說明

  • inst_name和field_name都可以包含萬用字元或正規表示式。
  • cntxt可以為null,這時inst_name提供完整的層次資訊,cntxt為null和uvm_root::get是等價的,他們都表示uvm_top
  • cntxt可以為this,表示cntxt為當前層次。
  • inst_name可以為空。
  • 如果在build前進行set,則使用 cntxt 層次結構來確定優先順序,層次結構越高,優先順序越高; 同一層次結構的set後面的設定會覆蓋前面的設定。如果在build後set,所有設定都使用預設優先順序,後面的設定會覆蓋前面的設定。因此建議在其相關設定元件建立前呼叫set,確保得到期望的值。
  • set和get方法是靜態的,所以必須使用 ::

三、一個範例

在test中set:

class my_test extends uvm_test;
    my_config cfg;
    ...
    function void bulid_phase(uvm_phase phase);
        ...
        uvm_config_db#(my_config)::set(this,"env","cfg",cfg);
        ...
    endfunction
endclass

在test.env中get:

class my_env extends uvm_env;
    my_config cfg;
    ...
    function void bulid_phase(uvm_phase phase);
        ...
        if(!uvm_config_db#(my_config)::get(this,"","cfg",cfg))
        begin
            `uvm_fatal(" get config object failed")
        end
        ...
    endfunction
endclass

參考資料

  1. https://verificationguide.com/uvm/uvm-configuration-database/