你選對儲存結構了嗎?你會玩UVM配置資料庫了嗎?
摘要:來自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
掃描上圖二維碼可直達課程頁面,馬上試聽
往期精彩:
相關文章
- 常用資料庫選型!你做對了嗎?資料庫
- Python操作MySQL儲存,這些你都會了嗎?PythonMySql
- Laravel 2018使用資料分析——Laravel你用對了嗎?學對了嗎?Laravel
- 資料倉儲分層你清楚了嗎
- 合適的meta,你選對了嗎?
- 你對@synthesize混淆了嗎?
- createContext 你用對了嗎?Context
- ActiveMQ你學會了嗎MQ
- 年底了,你的資料庫密碼安全嗎資料庫密碼
- AsyncTask你真的用對了嗎?
- Redis系列總結--這幾點你會了嗎?Redis
- 你的ES資料備份了嗎?
- async await 你真的用對了嗎?AI
- 堆排序你真的學會了嗎?排序
- Python協程你學會了嗎?Python
- 陣列模擬單連結串列你會了嗎?陣列
- 學習Python的發展方向,你選擇對了嗎?Python
- 真正完全免費的OA系統,你選對了嗎?
- [譯] 你用對圖片格式了嗎?
- 你走對Linux學習之路了嗎?Linux
- 學習Linux,你找對方法了嗎Linux
- Myabtis動態SQL,你真的會了嗎?SQL
- 動態規劃你學會了嗎?動態規劃
- 排序演算法你學會了嗎?排序演算法
- 你真的會使用資料庫的索引嗎?資料庫索引
- iOS12的捷徑你玩過了嗎iOS
- 杉巖:雲原生時代,容器持久化儲存方案選對了嗎?持久化
- 你的企業把資料當資產了嗎?
- flex 方式的佈局你用對了嗎?Flex
- mybatis-plus批次插入你用對了嗎MyBatis
- 你的安全預算花對地方了嗎?
- Java列舉類,你們用對了嗎?Java
- 訪問修飾符你用對了嗎
- 你真的理解 getLocationInWindow 了嗎?
- 今天你過節了嗎?
- 今年你退稅了嗎?
- 今天你進步了嗎?
- RabbitMQ的 RPC 訊息模式你會了嗎?MQRPC模式