你選對儲存結構了嗎?你會玩UVM配置資料庫了嗎?

路科驗證發表於2020-09-25

 

摘要:來自Chris Spear五月份的部落格

 

 

20200528 使用SystemVerilog中的陣列進行組織化

 

SystemVerilog有許多儲存資料的方法。向量、陣列、結構、類以及我可能不記得的其他幾種方法。擠進前10個部落格文章的主題選擇太多了,因此我舉辦了一個網路研討會,實際上是其中的兩個,以幫助你更好的組織起來。

 

第一個網路研討會著重於向量、固定大小的陣列、動態陣列、佇列、關聯陣列和字串 (是的,我忘記了)。這裡先偷瞄一下這個圖示,它可以幫助你在這些不同型別之間進行選擇。

 

 

 

是否曾經偶然發現過類似下面程式碼並想知道它的作用?

 

q = array.find(x) with (x>5);

 

看起來它試圖查詢大於5的東西,但是“ x”的含義是什麼?為什麼搜尋陣列會產生佇列?報名參加帶有完整說明的網路研討會,於太平洋夏令時間6月5日(星期五)上午8:15。我稍等片刻再開始,這樣你就可以在加入之前再喝杯咖啡,或者給你的在家學習的孩子做些早餐。如果這你都做不到,那就沒問題了,因為它們都被記錄下來了。

 

 

20200507 UVM配置資料庫準則

 

前言

我前幾篇博文在討論靜態和引數化類,是為了這場重頭戲–UVM配置資料庫或uvm_config_db–做好準備。如果使用得當,這是一個元件與另一個元件共享某個數值的好方法。如果測試或環境知道代理的路徑,則資料庫是有效的。如果使用不當,將會使你的模擬陷入困境。

 

 

過多的選項

資料庫是基於帶有字串索引的關聯陣列。因此,每個條目都是一個“名稱/值”對。如果儲存100,000個值,則資料庫必須搜尋這些值以找到特定值。如果將陣列索引值組織成樹形結構,則搜尋可能需要多達20次字串比較。這是具有100,000個條目的資料庫。

由於這是一個引數化的類,因此每個具有不同型別的例項都會劃分資料庫的大小。可能你的配置值的一半是32bit整數,另一半是64bit數值。現在,每個資料庫訪問都在瀏覽一半的值。

 

 

更普遍的問題

資料庫通過向每個名稱新增範圍來進一步組織“名稱/值”對。與處理器相比,“速度”值對儲存器的含義可能非常不同。

 

元件如何在整個測試平臺上共享數值呢?我看到了一個儲存元件,無論在什麼位置,它都希望與每個元件共享“記憶體速度”這個數值。因此,它發出了以下通訊:

 

uvm_config_db#(int)::set(null, “*”, “mem_speed”, mem_speed);

 

問題是,當你呼叫get(),並且資料庫包含具有萬用字元範圍的條目時,資料庫必須執行正規表示式匹配,這比直接字串匹配的效率低得多。更糟糕的是,資料庫無法進行樹狀搜尋,而不得不比較每個條目。如果你的資料庫僅包含幾百個條目,那沒問題。但是如果有成千上萬個,且都帶有萬用字元,則執行非常緩慢。多麼糟糕?這些為“記憶體速度”而設定的萬用字元範圍將導致UVM build_phase()花費24小時,儘管其餘的模擬花費了不到一個小時。如果你的測試平臺規模越來越大,請留意這個問題!

 

 

 

本地化操作

如網路研討會所述,一種解決方案是將配置變數組合在一起成為“配置物件”。例如,某個代理配置具有其本地引數,例如主動/被動列舉引數,各種地址和資料值以及虛擬介面。如果每個配置物件僅包含10個值,則資料庫大小將減少10倍。每個代理的build_phase有一個資料庫呼叫即可獲取其config物件的控制程式碼。當代理想要單個值時,它僅使用控制程式碼在其本地物件中獲取值。在配置物件中快取數值比在另一個資料庫中訪問要快得多。

 

 

放眼全域性

萬用字元問題的另一種解決方案是“全域性範圍”。請記住,資料庫中的範圍不必與你的測試平臺層次結構匹配。記憶體元件可以將其值寫入資料庫頂部的唯一名稱空間中,例如此處顯示的“ mem”。

 

uvm_config_db#(int)::set(null, “mem”, “speed”, memory_speed);

 

如果有多個記憶體元件怎麼辦?在“ mem”的全域性範圍內,您可以為每個例項儲存一個單獨的配置物件控制程式碼,假設“ speed”是mem_cfg類中的一個屬性。

 

foreach (mem_cfg[i])

  uvm_config_db#(mem_cfg)::set(null, “mem”, $sformatf(“mem[%0d]”, i), mem_cfgs[i]);

 

 

更多小技巧

 

對於直接從UVM元件類派生的元件(例如uvm_component,uvm_test,uvm_env,uvm_agent等),請勿呼叫super.build_phase()。這樣可以避免使用代價高昂的apply_config_settings()。

 

範圍字串末尾的萬用字元(例如“agt *”)比前面的萬用字元(例如“*”)具有更少的匹配項和更好的效能。

 

 

 

結論

帶有萬用字元作用域和許多條目的純uvm_config_db可能會降低效能。通過將值分組到配置物件中,將資料庫劃分為較小的域。你可以在範圍字串中使用萬用字元,但將它們限制在字串的末尾以提高效能。

 

 

原文連結:

https://blogs.sw.siemens.com/verificationhorizons/?s=Chris+Spear&submit=Search

 

掃描上圖二維碼可直達課程頁面,馬上試聽

 

往期精彩:

V2Pro 2020秋M1 我對你的迷惑和選擇都深以為然

V2Pro春季班普遍學撐了,秋季班7月報名你還敢來麼

30w+還送股送房?60+IC企業2019薪資全面攀升!

UVM RAL模型:用法和應用

我們準備做第二期線下培訓,依舊認真且嚴肅

如果你突然被裁員了,你的Plan B是什麼?

[彩虹糖帶你入門UVM]

理解UVM-1.2到IEEE1800.2的變化,掌握這3點就夠

相關文章