日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UVM-1.1学习(二)——uvm_cmdline_processor

發(fā)布時(shí)間:2023/12/29 编程问答 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVM-1.1学习(二)——uvm_cmdline_processor 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在由systemverilog搭建的驗(yàn)證環(huán)境中,我們可以使用系統(tǒng)函數(shù)$value$plusargs來獲取仿真時(shí)的仿真參數(shù)。而在基于UVM的驗(yàn)證環(huán)境中,我們可以使用另一種方式來獲取仿真參數(shù):uvm_cmdline_processor。
uvm_cmdline_processor本質(zhì)上是一個class,它的繼承關(guān)系如下:

在這個類中,實(shí)現(xiàn)了以下兩大類的功能(本文只關(guān)注第一類的功能):

  • 獲取仿真參數(shù)并存儲
  • 獲取仿真參數(shù)來設(shè)定部分UVM變量的值(比如verbosities)

實(shí)際上,在uvm_cmdline_processor這個類里面定義了一些string隊(duì)列,用于存儲相關(guān)的仿真參數(shù),這些隊(duì)列如下:

protected string m_argv[$]; protected string m_plus_argv[$]; protected string m_uvm_argv[$];
  • m_argv[$]
    用于存儲仿真時(shí)所有的仿真參數(shù),其中m_argv[0]比較特殊,存儲的是仿真時(shí)可執(zhí)行文件的名稱。
  • m_plus_argv[$]
    用于存儲仿真時(shí)帶’+'號的仿真參數(shù)。
  • m_uvm_argv[$]
    用于存儲和UVM相關(guān)的仿真參數(shù),判斷標(biāo)準(zhǔn)是檢測仿真參數(shù)是否以’+uvm’、’-uvm’、’+UVM’、’-UVM’作為前綴。

雖然知道了在這些隊(duì)列中存儲了相關(guān)的仿真參數(shù),但是由于這些隊(duì)列都是protected的,我們只能通過對應(yīng)的函數(shù)來進(jìn)行訪問,這些函數(shù)的原型如下:

function void get_args (output string args[$]); function void get_plusargs (output string args[$]); function void get_uvm_args (output string args[$]);

另一個令人比較感興趣的問題是,這些隊(duì)列在什么時(shí)候被初始化。閱讀對應(yīng)的源碼,可以看到這件事情發(fā)生在class的構(gòu)造函數(shù)中:

function new(string name = "");string s;string sub;super.new(name);do begins = uvm_dpi_get_next_arg();if(s!="") beginm_argv.push_back(s);if(s[0] == "+") beginm_plus_argv.push_back(s);end if(s.len() >= 4 && (s[0]=="-" || s[0]=="+")) beginsub = s.substr(1,3);sub = sub.toupper();if(sub == "UVM")m_uvm_argv.push_back(s);end endend while(s!="");

細(xì)心的你可能已經(jīng)發(fā)現(xiàn)了,對仿真參數(shù)的處理采用的是dpi+字符串的手段,而不是調(diào)用系統(tǒng)函數(shù)$value$plusargs。那么問題又來了,既然是在構(gòu)造函數(shù)中完成隊(duì)列初始化的,那么我們是不是還需要構(gòu)造一個uvm_cmdline_processor類的實(shí)例?其實(shí)這一步也是不需要的,因?yàn)樵谠创a中,已經(jīng)幫我們做好了。

static function uvm_cmdline_processor get_inst();if(m_inst == null)m_inst = new("uvm_cmdline_proc");return m_inst;endfunctionconst uvm_cmdline_processor uvm_cmdline_proc = uvm_cmdline_processor::get_inst();

因此,在實(shí)際的驗(yàn)證環(huán)境中,我們的使用可以非常簡單:

`timescale 1ns/1ps `include "uvm_macros.svh"import uvm_pkg::*;program testcase();string cmdline_argv[$]; string cmdline_plus_argv[$]; string cmdline_uvm_argv[$];initial begin$display("*************************************************************");uvm_cmdline_proc.get_args(cmdline_argv);uvm_cmdline_proc.get_plusargs(cmdline_plus_argv);uvm_cmdline_proc.get_uvm_args(cmdline_uvm_argv);foreach(cmdline_argv[i]) $display("cmdline_argv[%0d] =%s", i, cmdline_argv [i]);foreach(cmdline_plus_argv[i]) $display("cmdline_plus_argv[%0d]=%s", i, cmdline_plus_argv[i]);foreach(cmdline_uvm_argv[i]) $display("cmdline_uvm_argv[%0d] =%s", i, cmdline_uvm_argv [i]);$display("*************************************************************");$finish(); endendprogram

假如Makefile中的仿真參數(shù)如下:

./simv -l run_ver.log +plus_argv_test1 -plus_argv_test2 +UVM_argv_test1 -uvm_argv_test2=2

那么仿真的結(jié)果如下:

************************************************************* cmdline_argv[0] =./simv cmdline_argv[1] =-l cmdline_argv[2] =run_ver.log cmdline_argv[3] =+plus_argv_test1 cmdline_argv[4] =-plus_argv_test2 cmdline_argv[5] =+UVM_argv_test1 cmdline_argv[6] =-uvm_argv_test2=2 cmdline_plus_argv[0]=+plus_argv_test1 cmdline_plus_argv[1]=+UVM_argv_test1 cmdline_uvm_argv[0] =+UVM_argv_test1 cmdline_uvm_argv[1] =-uvm_argv_test2=2 *************************************************************

事實(shí)上,uvm還提供了更豐富的函數(shù)庫:

function int get_arg_matches (string match, ref string args[$]);//| void'(uvm_cmdline_proc.get_arg_matches("+foo",myargs)); //matches +foo, +foobar//| //doesn't match +barfoo//| void'(uvm_cmdline_proc.get_arg_matches("/foo/",myargs)); //matches +foo, +foobar,//| //foo.sv, barfoo, etc.//| void'(uvm_cmdline_proc.get_arg_matches("/^foo.*\.sv",myargs)); //matches foo.sv//| //and foo123.sv,//| //not barfoo.sv.

get_arg_matches允許我們搜索并返回滿足條件的仿真參數(shù)。match是搜索條件,args[$]是滿足搜索條件的仿真參數(shù),function返回的int值則是滿足搜索條件的仿真參數(shù)個數(shù)。由于使用了dpi接口,match甚至于還支持正則表達(dá)式。

function int get_arg_value (string match, ref string value);function int get_arg_values (string match, ref string values[$]);// For example if '+foo=1,yes,on +foo=5,no,off' was provided on the command// line and the following code was executed://| void'(uvm_cmdline_proc.get_arg_values("+foo=",foo_values));// The foo_values queue would contain two entries. These entries are shown// here:// 0 - "1,yes,on"// 1 - "5,no,off"

get_arg_value和get_arg_values函數(shù)允許我們搜索以match字符串為開頭的仿真參數(shù)。兩個函數(shù)的區(qū)別在于一個只返回搜索到的第一個值,一個返回搜索到的所有滿足條件的值。

function string get_tool_name ();function string get_tool_version ();

get_tool_name和get_tool_version函數(shù)允許我們獲取仿真工具的名稱和版本,實(shí)際上,這部分的實(shí)現(xiàn)已經(jīng)通過dpi交還給了EDA vender。

總結(jié)

以上是生活随笔為你收集整理的UVM-1.1学习(二)——uvm_cmdline_processor的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。