色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

UVM中uvm_config_db機制背后的大功臣

冬至子 ? 來源:CSDN ? 作者:谷公子 ? 2023-06-29 16:57 ? 次閱讀

1.前言

本次講一下UVM中的uvm_config_db,在UVM中提供了一個內(nèi)部數(shù)據(jù)庫,可以在其中存儲給定名稱下的值,之后可以由其它TB組件去檢索。這樣的數(shù)據(jù)庫允許我們以不同的名稱存儲不同的配置設(shè)置,這些配置可以在需要時潛在地配置TB組件,而無需修改實際的TB代碼。比如說,我們需要TB打開某個checker,我們只需要提供這個checker的路徑并將數(shù)據(jù)庫中的變量設(shè)置為1,checker就可以檢查這個變量值,如果它打開了,就開始檢查DUT功能。uvm_config_db提供了訪問這個數(shù)據(jù)庫的接口,最常見的就是get()和set()函數(shù),函數(shù)定義如下:

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

這兩個函數(shù)如何使用我想大家都清楚,調(diào)用一次set()就是往數(shù)據(jù)庫內(nèi)設(shè)置1個scope為{cntxt,”.”, inst_name},匹配符為field_name,值為value的配置。其中inst_name和field_name是支持正則匹配或glob類型匹配的。調(diào)用一次get()就是用scope為{cntxt,”.”, inst_name},匹配符為field_name的訪問方式在數(shù)據(jù)庫里檢索是否有匹配的設(shè)置,注意,這里的inst_name和field_name不支持正則匹配或glob類型匹配的,下面會具體說明。如果get()返回1就是找到了,返回0就算沒有找到。上述兩個函數(shù)中,如果cntxt傳遞的是null,那么UVM自動會使用uvm_root::get()替換它。大家如果需要調(diào)試uvm_config_db的話,可以使用+UVM_CONFIG_DB_TRACE或uvm_config_db_options類內(nèi)的turn_on_tracing()/turn_off_tracing()/is_tracing()函數(shù)來進行。

多啰嗦一下,如果uvm_config_db::set()對同1個配置在不同時間或不同地點設(shè)置了多次,那么uvm_config_db::get()的時候?qū)捎媚囊淮蔚哪兀縐VM會給它們指定不同的優(yōu)先級,結(jié)論就是:如果是在build_phase指定的話,是按UVM hierarchy來的,層次越高優(yōu)先級越高,也就是uvm_test的優(yōu)先級會高于uvm_env,以此類推。但如果兩個組件是同一個UVM hierarchy的話,就是按時間順序來的,越往后set優(yōu)先級越高。在build_phase之后,就不在于UVM hierarchy了,都是按照時間順序來的,越往后set優(yōu)先級越高。

那么UVM中是如何做到uvm_config_db::set()和uvm_config_db::get()的匹配呢?這就涉及到了本文的主題了。簡單說就是字符串的正則匹配,在UVM內(nèi)部是通過uvm_glob_to_re()和uvm_re_match()這兩個函數(shù)來實現(xiàn)的,它們是在uvm_config_db背后默默工作的功臣。

在TB調(diào)用uvm_config_db::set()的時候,set函數(shù)會將參數(shù)cntxt和inst_name拼接起來后,調(diào)用用uvm_glob_to_re()轉(zhuǎn)換格式,再存到uvm_resource類里的scope字符串變量,set()的值也是放在uvm_resource類里。當(dāng)TB調(diào)用uvm_config_db::get()的時候,get函數(shù)也會將參數(shù)cntxt和inst_name拼接起來,再調(diào)用uvm_re_match()與uvm_resource_base類里的scope字符串進行匹配,如果匹配成功,就返回這個uvm_resource類的值。這就完成了set()設(shè)置值和get()查找值的過程了。uvm_glob_to_re()和uvm_re_match()在其中扮演重要的角色,我們就來看看這兩個函數(shù)

這兩個函數(shù)都支持C版本和SV版本,兩個版本的功能有點差別,默認是使用C版本,功能更強大點。如果TB沒有定義了UVM_REGEX_NO_DPI或UVM_NO_DPI宏的話,那么用的是DPI-C import進來的C版本,反之是Systemverilog版本的。

2. uvm_glob_to_re()函數(shù)

C版本的uvm_glob_to_re()函數(shù)定義如下:

const char * uvm_glob_to_re(const char *glob)
import "DPI-C" function string uvm_glob_to_re(string glob);

它會將輸入的glob字符串(glob類型匹配格式)轉(zhuǎn)成真正的正則表達式格式(POSIX regular expression)。也就是把輸入字符串中g(shù)lob元字符替換為正則元字符,并在開頭和結(jié)尾分別加上/^和$/。glob類型匹配和正則匹配區(qū)別,大家可以自行查找資料下。

SV版本的uvm_glob_to_re()函數(shù)定義如下:

function string uvm_glob_to_re(string glob);
  return glob;
endfunction

從這個函數(shù)內(nèi)容就可以看出,它不對輸入的字符串做任何處理。

3. uvm_re_match()函數(shù)

C版本的uvm_re_match()函數(shù)定義如下:

int uvm_re_match(const char * re, const char *str)
import "DPI-C" function int uvm_re_match(string re, string str);

可以看到它有兩個參數(shù),第一個參數(shù)(re)是匹配的正則表達式,第二個參數(shù)(str)匹配的字符串,如果re在str里找到它要匹配的字符串,就返回0,反之返回1。

SV版本的uvm_re_match()函數(shù)定義如下:

function int uvm_re_match(string re, string str);

它的參數(shù)和返回值與C版本定義一樣,不過它是支持glob類型匹配,也就是re必須是glob類型格式的。

對于uvm_config_db來說,在調(diào)用get()函數(shù)檢索數(shù)據(jù)庫的時候,get()函數(shù)傳遞的{cntxt,”.”, inst_name}會作為uvm_re_match()的str的實參,set()函數(shù)設(shè)置的{cntxt,”.”, inst_name}在經(jīng)過uvm_glob_to_re()處理后作為uvm_re_match()的實參,這也就是為什么set()參數(shù)的inst_name支持正則格式,而get()參數(shù)的inst_name只是簡單字符而已。

4. 例子分析

測試源代碼如下:

str_re = "uvm_test_top.*monitor";
$display("uvm_glob_to_re() converts %s to %s", str_re, uvm_glob_to_re(str_re));
str = "uvm_test_top.a.b.c.monitor";
$display("%s and %s, match result is: %s", str_re, str, 
         uvm_re_match(uvm_glob_to_re(str_re), str)==1'b0 ? "MATCH" : "MISMATCH");
uvm_config_db #(bit)::set(null, str_re, "test_var", 1'b1);
if ( uvm_config_db #(bit)::get(null, str, "test_var", test_var) )
    $display("Get the test_var from path: %s", str);
else
    $display("Not get the test_var from path: %s", str);
str = "uvm_test.*.monitor";
$display("%s and %s, match result is: %s", str_re, str,
         uvm_re_match(uvm_glob_to_re(str_re), str)==1'b0 ? "MATCH" : "MISMATCH");
uvm_config_db #(bit)::set(null, str_re, "test_var", 1'b1);
if ( uvm_config_db #(bit)::get(null, str, "test_var", test_var) )
    $display("Get the test_var from path: %s", str);
else
    $display("Not get the test_var from path: %s", str);
str_re = "zhuanxinzhizhier";
str = "yes_zhuanxinzhizhier_yes";
$display("%s and %s, match result is: %s", str_re, str,
         uvm_re_match(str_re, str)==1'b0 ? "MATCH" : "MISMATCH");

當(dāng)TB沒有定義UVM_REGEX_NO_DPI或UVM_NO_DPI宏時,也就是函數(shù)采用C版本函數(shù),Questasim輸出的結(jié)果為:

# uvm_glob_to_re() converts uvm_test_top.*monitor to /^uvm_test_top\\..*monitor$/
# uvm_test_top.*monitor and uvm_test_top.a.b.c.monitor, match result is: MATCH
# Get the test_var from path: uvm_test_top.a.b.c.monitor
# uvm_test_top.*monitor and uvm_test.*.monitor, match result is: MISMATCH
# Not get the test_var from path: uvm_test.*.monitor
# zhuanxinzhizhier and yes_zhuanxinzhizhier_yes, match result is: MATCH

當(dāng)TB有定義UVM_REGEX_NO_DPI或UVM_NO_DPI宏時,也就是函數(shù)采用SV版本,Questasim輸出的結(jié)果為:

# uvm_glob_to_re() converts uvm_test_top.*monitor to uvm_test_top.*monitor
# uvm_test_top.*monitor and uvm_test_top.a.b.c.monitor, match result is: MATCH
# Get the test_var from path: uvm_test_top.a.b.c.monitor
# uvm_test_top.*monitor and uvm_test.*.monitor, match result is: MISMATCH
# Not get the test_var from path: uvm_test.*.monitor
# zhuanxinzhizhier and yes_zhuanxinzhizhier_yes, match result is: MISMATCH

從上述兩個log的最后一行打印我們可以看出C版本函數(shù)功能還是更加強大。大家使用uvm_config_db::set()和uvm_config_db::get()時,要牢記set()的參數(shù)inst_name是支持正則匹配的,而get()的參數(shù)inst_name是不支持正則匹配的也就是get()的參數(shù)inst_name里就算包含*/?/+等特殊字符,也是會當(dāng)作普通字符而已,而不會被處理成正則匹配里的元字符。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • UVM
    UVM
    +關(guān)注

    關(guān)注

    0

    文章

    182

    瀏覽量

    19167
  • DUT
    DUT
    +關(guān)注

    關(guān)注

    0

    文章

    189

    瀏覽量

    12373
收藏 人收藏

    評論

    相關(guān)推薦

    UVM的field automation機制有哪些用途

    不知道UVM的field automation機制怎么翻譯,不管了,反正就是**機制,理解它能干啥就行了。
    的頭像 發(fā)表于 07-19 09:45 ?2080次閱讀

    IC驗證"為什么要學(xué)習(xí)UVM呢"

    Synopsys在VMM的寄存器解決方案RAL。同時,UVM還吸收了VMM的 一些優(yōu)秀的實現(xiàn)方式。可以說,UVM繼承了VMM和OVM的優(yōu)點,克服了各自的缺點,代表了驗證方法學(xué)的發(fā)展
    發(fā)表于 12-01 15:09

    IC驗證"UVM驗證平臺加入factory機制"(六)

      加入factory機制 上一節(jié)《IC驗證"一個簡單的UVM驗證平臺"是如何搭建的(五)》給出了一個只有driver、使用UVM搭建的驗證平臺。嚴(yán)格來說這根本就不算是UVM驗證
    發(fā)表于 12-08 12:07

    IC驗證“UVM驗證平臺加入objection機制和virtual interface機制“(七)

    在上一節(jié),**《IC驗證"UVM驗證平臺加入factory機制"(六)》**雖然輸出了“main_phase is called”,但是“data is drived”并沒有
    發(fā)表于 12-09 18:28

    什么是UVM Report機制

    UVM Report機制概述
    發(fā)表于 12-21 06:55

    數(shù)字IC驗證之“什么是UVM”“UVM的特點”“UVM提供哪些資源”(2)連載...

    。可以在不改變平臺代碼的基礎(chǔ)上改變平臺的行為,以產(chǎn)生不同類型的激勵。平臺可以在不同的驗證工程之間進行移植,善于利用uvm提供的各種機制。可以使驗證平臺具有極強的可重用性。uvm為用戶提供了哪些資源
    發(fā)表于 01-21 16:00

    什么是uvmuvm的特點有哪些呢

    直觀的印象,就是uvm驗證平臺,它是分層的結(jié)構(gòu)。圖中的每一個巨型框都代表著平臺的一個構(gòu)成元素。這些元素呢,我們稱為平臺組建,下面來簡單的分析一下。從最底層上來看,agent 包含了driver,monitor和sequencer,其中driver ,monitor
    發(fā)表于 02-14 06:46

    談?wù)?b class='flag-5'>UVMuvm_info打印

    uvm_report_enabled(xxx),會分析傳過來的severity和id的配置verbosity要大于傳過來的verbosity,(get_report_verbosity_level(severity, id
    發(fā)表于 03-17 16:41

    UVMseq.start()和default_sequence執(zhí)行順序

    /uvm_sequencer_base.svh文件。示意截圖如下:  在start_phase_sequence(xxx)函數(shù)里會先使用uvm_config_db獲取到defaultsequence,然后在最后
    發(fā)表于 04-04 17:15

    UVM實戰(zhàn)卷1 PDF電子書免費下載

    讀者思考UVM為什么要引入這些機制,從而使讀者知其然,更知其所以然。本書以一個完整的示例開篇,使得讀者一開始就對如何使用UVM搭建驗證平臺有總體的概念。針對沒有面向?qū)ο缶幊袒A(chǔ)的用戶,本書在附錄
    發(fā)表于 11-29 08:00 ?34次下載
    <b class='flag-5'>UVM</b>實戰(zhàn)卷1 PDF電子書免費下載

    UVM sequence機制response的簡單使用

    sequence作為UVM幾個核心機制之一,它有效地將transaction的產(chǎn)生從driver剝離出來,并且通過和sequencer相互配合,成功地將driver的負擔(dān)降低至僅聚焦于根據(jù)協(xié)議將
    的頭像 發(fā)表于 09-22 09:26 ?2397次閱讀

    淺析UVM不同機制的調(diào)試功能

    作為UVM的用戶,我們需要相信在絕大部分情況下這些機制本身是沒有問題的。因此,從頂層獲得有效的調(diào)試信息就非常關(guān)鍵,比起潛入到內(nèi)部要高效得多。 這也是本文的目的,盤點UVM針對不同機制
    的頭像 發(fā)表于 02-14 16:23 ?1304次閱讀
    淺析<b class='flag-5'>UVM</b>不同<b class='flag-5'>機制</b>的調(diào)試功能

    UVM學(xué)習(xí)筆記(一)

    driver應(yīng)該派生自uvm_driver,而uvm_driver派生自uvm_component。
    的頭像 發(fā)表于 05-26 14:38 ?1385次閱讀
    <b class='flag-5'>UVM</b>學(xué)習(xí)筆記(一)

    UVMuvm_config_db機制背后大功臣

    本次講一下UVMuvm_config_db,在UVM中提供了一個內(nèi)部數(shù)據(jù)庫,可以在其中存儲給定名稱下的值,之后可以由其它TB組件去檢索。
    的頭像 發(fā)表于 06-20 17:28 ?1411次閱讀

    一文詳解UVM設(shè)計模式

    本篇是對UVM設(shè)計模式 ( 二 ) 參數(shù)化類、靜態(tài)變量/方法/類、單例模式、UVM_ROOT、工廠模式、UVM_FACTORY[1]單例模式的補充,分析靜態(tài)類的使用,
    的頭像 發(fā)表于 08-06 10:38 ?1785次閱讀
    一文詳解<b class='flag-5'>UVM</b>設(shè)計模式
    主站蜘蛛池模板: 久久夜色噜噜噜亚洲AV0000| 国产亚洲综合视频| 高清欧美videos sexo| 国产精品久久久久久免费播放 | 国产精品第3页| 国产亚洲精品AV片在线观看播放| 韩国免费啪啪漫画无遮拦健身教练| 京香在线观看| 暖暖高清视频免费| 手机毛片免费看| 亚洲看片网站| 18日本人XXXXXX18| 成人手机在线| 国产伦子沙发午休系列资源曝光 | 扒开美女下面粉嫩粉嫩冒白浆| 共妻肉多荤文高h一女n男| 国产一区二区三区国产精品| 理论片87福利理论电影| 人妻天天爽夜夜爽三区麻豆A片| 香蕉久久av一区二区三区| 一品道门免费高清视频| jk制服喷水| 国产永不无码精品AV永久| 毛片网站在线观看| 天天干夜夜曰| 在线视频 亚洲| 高H高肉强J短篇NP| 久久精品日本免费线| 日本久久和电影| 亚洲日韩精品AV中文字幕| JIZZ幻女大全| 国产在线观看成人| 欧美videqsdesex0| 亚洲精品国偷拍电影自产在线| 99精品中文字幕在线观看| 国产网红主播精品福利大秀专区| 美女岔开腿露出粉嫩花苞| 午夜伦理电影在线观免费| 99国产强伦姧在线看RAPE| 国产精品美女WWW爽爽爽视频| 美女被强奷到抽搐的动态图|