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

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

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

uvm命令行傳遞參數(shù)的小技巧

我快閉嘴 ? 來源:杰瑞IC驗(yàn)證 ? 作者:Q哥 ? 2022-08-19 11:53 ? 次閱讀

當(dāng)我們?cè)趧?chuàng)建動(dòng)態(tài)仿真case時(shí),使用命令行參數(shù)可以非常方便地控制DUT和TB的行為,比如配置寄存器、控制激勵(lì)的發(fā)送數(shù)量、打開或關(guān)閉某些scoreboard等。

當(dāng)面對(duì)很多驗(yàn)證組件,并且有很多命令行參數(shù)需要傳遞的時(shí)候,如何才能簡(jiǎn)單地實(shí)現(xiàn)給這些組件傳遞命令行參數(shù)呢?

大家首先想到的可能是plusargs。

沒錯(cuò),plusargs的確是一個(gè)非常簡(jiǎn)單易用的機(jī)制。對(duì)于規(guī)模小的項(xiàng)目,完全夠用。但是對(duì)于像包含了100個(gè)agent、涉及多個(gè)工程師共同開發(fā)的復(fù)雜大項(xiàng)目,plusargs的缺陷就暴露出來了。

1plusargs的缺陷

首先,plusargs使用的位置太隨意了,可以在module、class、interface等等任何能使用begin/end塊的地方解析命令行參數(shù)。這就埋下了彼此影響的坑。看過jerry之前文章“$test$plusargs(),$value$plusargs()怎么用?有什么坑?”的朋友們還記得,plusargs不僅僅認(rèn)為“張三”和“張三”同名,連“張三”和“張三豐”也算同名!使用的時(shí)候,稍有不慎,可能會(huì)因?yàn)橥`傷了其他組件。

其次,plusargs使用的時(shí)候,命令行參數(shù)的格式必須跟解析的格式一樣,否則會(huì)傳遞失敗,甚至傳遞錯(cuò)誤的值。比如:按照16進(jìn)制解析的參數(shù),如果按10進(jìn)制傳遞,就會(huì)傳遞錯(cuò)誤的值。即使傳遞16進(jìn)制,到底是按照+data=‘hff00傳遞,還是按照+data=32’hff00傳遞,又或者按照+data=ff00傳遞,也需要提前約定并統(tǒng)一風(fēng)格。這在大型項(xiàng)目里,直接增加了溝通成本。

另外,plusargs不支持?jǐn)?shù)組和枚舉類型的數(shù)據(jù)。用戶必須自己編寫額外代碼進(jìn)行解析。

2uvm命令行參數(shù)簡(jiǎn)介

uvm定義了一套自己的命令行參數(shù)規(guī)則,可以非常方便地從命令行傳遞常用類型數(shù)據(jù)到tb里,完美地解決了上面提到的幾個(gè)缺陷。下面逐一舉例說明。

2.1 傳遞int類型參數(shù)

圖1 代碼片段1

如圖1代碼片段所示,32和33行定義了40-bit變量data和int變量data_vld,為了讓uvm命令行參數(shù)可以傳遞值給它們,需要添加36和37行的聲明。

這里需要注意下,uvm_field_int只是聲明這個(gè)變量按照整數(shù)數(shù)據(jù)類型解析(而不是real浮點(diǎn)數(shù)、string字符串、enum枚舉或者數(shù)組等類型), 大家不用擔(dān)心40比特data的高位會(huì)丟失。

然后使用下面的命令行參數(shù)就可以分別傳遞參數(shù)值給data和data_vld。

圖2 uvm命令行傳遞int參數(shù)

眼尖的朋友們有沒有發(fā)現(xiàn),這個(gè)命令行參數(shù)是不是有些眼熟?沒錯(cuò),之前我們聊uvm_info高級(jí)技巧的時(shí)候,用到的也是類似的命令行參數(shù)。(uvm_info高級(jí)技巧(1) ---如何屏蔽某些刷屏的啰嗦調(diào)試信息

1. 等號(hào)后面第一個(gè)參數(shù)就是component的路徑,也就是當(dāng)你調(diào)用get_full_name所返回的完整路徑名。因?yàn)橛新窂较拗?,可以避免不同component的同名問題。類似之前講過的,這里的路徑可以使用星號(hào)通配符。

2. 第二個(gè)參數(shù)就是要賦值的變量名字,不用再擔(dān)心plusargs誤把“張三”和“張三豐”當(dāng)作同名的問題了。

3. 第三個(gè)參數(shù)是傳遞的數(shù)值,這個(gè)值可以是10進(jìn)制也可以是16進(jìn)制、2進(jìn)制、8進(jìn)制,只要符合verilog語法就可以了,uvm會(huì)自動(dòng)解析的。因?yàn)橐蟰erilog語法,所以16進(jìn)制不能只寫ff00,可以寫32’hff00, ‘hff00, ‘shff00。除此之外,寫成0xff00也是可以的。

2.2 傳遞string類型參數(shù)

對(duì)于string類型的數(shù)據(jù),使用方法跟int類似。定義方法如圖3所示,命令行參數(shù)如圖4所示。

圖3 定義string類型參數(shù)

圖4 傳遞string類型參數(shù)

2.3 傳遞enum類型參數(shù)

對(duì)于plusargs傳參數(shù),如果要處理enum變量,要么放棄可讀性按照int傳遞,要么先按照string傳遞然后再另外寫case語句解析enum。

對(duì)于uvm命令行參數(shù),處理enum就簡(jiǎn)單多了。閑言少敘,直接上代碼,如圖5所示。

圖5 定義枚舉類型變量

82行定義了fruit_e這個(gè)枚舉類型,85行定義了fruit_e類型的枚舉變量m_frt。88行聲明枚舉變量的時(shí)候,相比int或string類型,多了第一個(gè)參數(shù),就是枚舉變量具體的枚舉類型。

命令行參數(shù)如圖6所示,直接按照枚舉進(jìn)行傳遞就好了,uvm會(huì)自動(dòng)解析??闭`,下圖參數(shù)enum當(dāng)為string

圖6 傳遞枚舉類型參數(shù)

2.4 傳遞int數(shù)組參數(shù)

除了單個(gè)的變量,uvm也支持命令行傳遞數(shù)組類型的參數(shù)。如圖7所示。

圖7 聲明數(shù)組類型變量

那么問題來了,對(duì)于這100個(gè)參數(shù),如果傳遞的大部分參數(shù)都是同樣的值,只有少數(shù)值不一樣,難道還要寫100個(gè)命令行參數(shù)嗎?

答案當(dāng)然是否定的。uvm命令行參數(shù)不僅支持component路徑使用通配符,傳遞數(shù)組的時(shí)候,也可以通配。

圖8 使用通配符給數(shù)組傳遞參數(shù)

如圖8所示。先給所有的data元素賦值’hff, 然后單獨(dú)給data[88]賦值1。因?yàn)槊钚袇?shù)后面賦值會(huì)覆蓋掉前面的賦值,所以data[88]最終傳遞的是1.

這里大家注意下,數(shù)組類型聲明的是uvm_field_sarray_int, 傳遞參數(shù)的時(shí)候還是按照int的方式傳遞,只不過變量名字帶了數(shù)組元素下表,并且支持星號(hào)通配符。

2.5 傳遞string數(shù)組和enum數(shù)組

string數(shù)組、enum數(shù)組的使用方法和int數(shù)組類似,沒什么可說的。參照?qǐng)D9的聲明方法和圖10的命令行參數(shù)。

圖9 聲明string數(shù)組和enum數(shù)組

圖10 傳遞參數(shù)給string數(shù)組和enum數(shù)組

除了上面提到的這些簡(jiǎn)單常用的參數(shù)類型,還有類似real浮點(diǎn)數(shù)、動(dòng)態(tài)數(shù)組、關(guān)聯(lián)數(shù)組等類型。大家如果有需求,可以自行參考uvm官方文檔學(xué)習(xí)使用。限于篇幅,不再贅述。

2.6 uvm命令行參數(shù)什么時(shí)候生效的?

善于思考的朋友們,有沒有想到一個(gè)問題:既然uvm會(huì)自動(dòng)解析uvm_set_config命令行參數(shù),那么這些參數(shù)值是什么時(shí)候傳遞給tb里面的變量的?會(huì)不會(huì)跟我們初始化的值沖突?

圖11的示例代碼,我們加上變量初始化和打印語句。

圖11 調(diào)試uvm命令行參數(shù)生效時(shí)間

傳遞命令行參數(shù)+uvm_set_config_int = uvm_test_top.env.agt[0],data,’hdeadbeef,根據(jù)圖12的測(cè)試結(jié)果可以看到,40行打印出的data值是32行初始化的,45行打印的data值是uvm_set_config_int命令行參數(shù)傳遞的,41行的賦值被命令行參數(shù)給覆蓋掉。

也就是說,uvm_set_config_int是在new之后,build_phase之前完成的。大家在使用的時(shí)候一定要注意這個(gè)失效時(shí)間,避免多次賦值互相干擾。

圖12 uvm_set_config參數(shù)生效時(shí)間測(cè)試結(jié)果

3uvm命令行參數(shù)的限制

1. uvm命令行參數(shù)目前只能給component傳遞,不能給object傳遞。不過大家可以換一個(gè)思路,比如sequence里面要用參數(shù)mydata的話,可以傳遞到對(duì)應(yīng)的sequencer,在sequence里面通過調(diào)用p_sequencer.mydata就可以了。

圖13 間接傳遞uvm命令行參數(shù)給sequence

2. uvm命令行參數(shù)指定component路徑的時(shí)候,如果要使用星號(hào)通配符,需要格外注意。因?yàn)閡vm會(huì)把env*.sequencer匹配成env.sequencer、env0.sequencer、env0.agent.sequencer、env1.sequencer、env1.agent.sequencer等等(精通正則表達(dá)式的朋友們可以繼續(xù)發(fā)散)。

3. uvm命令行參數(shù)會(huì)自動(dòng)在new之后,build phase之前解析。使用的時(shí)候注意不要被覆蓋了。

總結(jié)

Q哥今天給大家安利了uvm命令行傳遞參數(shù)的小技巧。相比plusargs,uvm命令行參數(shù)當(dāng)然不是完美的,但是用到恰當(dāng)?shù)膱?chǎng)景下,還是可以事半功倍的。大家在使用的時(shí)候,注意下上面的提到的幾個(gè)問題。

審核編輯:湯梓紅


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

    關(guān)注

    11

    文章

    1728

    瀏覽量

    31980
  • UVM
    UVM
    +關(guān)注

    關(guān)注

    0

    文章

    181

    瀏覽量

    19109
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4694

    瀏覽量

    68075
  • 命令行
    +關(guān)注

    關(guān)注

    0

    文章

    77

    瀏覽量

    10369

原文標(biāo)題:你還在用plusargs傳遞參數(shù)嗎?來試試這個(gè)玩法~

文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    支持命令行傳遞參數(shù)嗎?

    的每一個(gè)。要手動(dòng)嘗試在Makefile中設(shè)置CFLAGS??梢栽陬A(yù)處理器宏部分訪問命令行傳遞參數(shù)嗎?如果這是在命令行值不是構(gòu)建的一部分的IDE中構(gòu)建的,那么我還需要能夠支持默認(rèn)值。
    發(fā)表于 03-17 06:03

    cmd網(wǎng)絡(luò)經(jīng)典命令行

    cmd網(wǎng)絡(luò)經(jīng)典命令行:
    發(fā)表于 06-11 15:17 ?36次下載
    cmd網(wǎng)絡(luò)經(jīng)典<b class='flag-5'>命令行</b>

    如何獲取其它程序的命令行參數(shù)

    開發(fā)環(huán)境:VC6 Windows XP 測(cè)試環(huán)境:WindowsXP 我們都知道,在程序里獲取命令行參數(shù)很簡(jiǎn)單,WinMain函數(shù)會(huì)以參數(shù)的形式傳遞給我們,或者可以調(diào)用API Ge
    發(fā)表于 10-14 09:24 ?1次下載

    C語言入門教程-命令行參數(shù)

    命令行參數(shù) 在C中,獲取用戶輸入的命令行參數(shù)是很方便的。程序的主函數(shù)會(huì)接受一個(gè)argv參數(shù)。有許多高級(jí)的庫函數(shù)都會(huì)用到argv結(jié)構(gòu),所以了
    發(fā)表于 07-29 14:22 ?2591次閱讀

    caxa命令行中的應(yīng)用

    caxa命令行中的應(yīng)用 命令行對(duì)于大多用戶來說往往只是輸入數(shù)據(jù)的作用,但是其中的奧妙還有很多,下面就給大家
    發(fā)表于 10-18 18:18 ?2266次閱讀

    博達(dá)環(huán)網(wǎng)配置命令行

    博達(dá)工業(yè)交換要環(huán)網(wǎng)配置命令行
    發(fā)表于 12-27 16:24 ?0次下載

    CMD的命令行高級(jí)教程

    CMD的命令行高級(jí)教程
    發(fā)表于 10-24 08:31 ?30次下載
    CMD的<b class='flag-5'>命令行</b>高級(jí)教程

    C語言中一個(gè)簡(jiǎn)單的實(shí)例,檢查命令行是否有提供參數(shù)

    多個(gè)命令行參數(shù)之間用空格分隔,但是如果參數(shù)本身帶有空格,那么傳遞參數(shù)的時(shí)候應(yīng)把參數(shù)放置在雙引號(hào)
    的頭像 發(fā)表于 11-12 14:49 ?3401次閱讀

    如何從命令行獲取和解析參數(shù)

    這是一篇技術(shù)干貨快文,能夠快速閱讀完。文章內(nèi)容是關(guān)于如何從命令行獲取和解析參數(shù),包括SystemVerilog本身支持的系統(tǒng)函數(shù)和UVM提供的函數(shù)封裝,并給出示例代碼和仿真結(jié)果。
    的頭像 發(fā)表于 05-30 14:05 ?2703次閱讀

    Linux命令行與shell腳本編寫

    Linux命令行與shell腳本編寫
    發(fā)表于 01-11 16:50 ?4次下載

    LabVIEW命令行調(diào)用exe傳入的參數(shù)如何獲取

    有些場(chǎng)景下,我們用LabVIEW開發(fā)的應(yīng)用程序,需要通過命令行來調(diào)用,并向該應(yīng)用程序傳遞參數(shù),那么在程序中如何才能獲取這些參數(shù)呢?
    發(fā)表于 10-11 09:28 ?2119次閱讀
    LabVIEW<b class='flag-5'>命令行</b>調(diào)用exe傳入的<b class='flag-5'>參數(shù)</b>如何獲取

    linux虛擬機(jī)怎么調(diào)出命令行

    在Linux虛擬機(jī)中調(diào)出命令行界面,可以通過以下步驟實(shí)現(xiàn): 打開虛擬機(jī),進(jìn)入到Linux系統(tǒng)。 在桌面或應(yīng)用菜單中找到終端或命令行圖標(biāo),點(diǎn)擊打開。 輸入命令行指令,執(zhí)行相應(yīng)的操作。 另外,也可以通過
    的頭像 發(fā)表于 11-08 11:28 ?2781次閱讀

    linux切換到命令行模式

    在Linux中,可以通過以下步驟切換到命令行模式: 打開終端。可以在應(yīng)用菜單中找到終端或命令行終端。 在終端中輸入命令“exit”或“l(fā)ogout”,然后按回車鍵。 系統(tǒng)會(huì)提示您輸入管理員密碼。輸入
    的頭像 發(fā)表于 11-13 16:47 ?1602次閱讀

    eclipse怎么使用命令行

    命令行中使用Eclipse來完成一些特定的任務(wù)。本文將詳細(xì)介紹如何在命令行中使用Eclipse。 首先,我們需要確保已經(jīng)正確安裝了JDK(Java Development Kit)和Eclipse
    的頭像 發(fā)表于 12-06 11:26 ?2197次閱讀

    idea如何輸入命令行參數(shù)

    在許多軟件開發(fā)和系統(tǒng)管理的任務(wù)中,我們經(jīng)常需要向應(yīng)用程序傳遞命令行參數(shù)。命令行參數(shù)是在運(yùn)行時(shí)傳遞
    的頭像 發(fā)表于 12-06 15:01 ?933次閱讀