UVM-1.1学习(二)——uvm_cmdline_processor
在由systemverilog搭建的驗證環(huán)境中,我們可以使用系統(tǒng)函數(shù)$value$plusargs來獲取仿真時的仿真參數(shù)。而在基于UVM的驗證環(huán)境中,我們可以使用另一種方式來獲取仿真參數(shù):uvm_cmdline_processor。
uvm_cmdline_processor本質上是一個class,它的繼承關系如下:
在這個類中,實現(xiàn)了以下兩大類的功能(本文只關注第一類的功能):
- 獲取仿真參數(shù)并存儲
- 獲取仿真參數(shù)來設定部分UVM變量的值(比如verbosities)
實際上,在uvm_cmdline_processor這個類里面定義了一些string隊列,用于存儲相關的仿真參數(shù),這些隊列如下:
protected string m_argv[$]; protected string m_plus_argv[$]; protected string m_uvm_argv[$];- m_argv[$]
用于存儲仿真時所有的仿真參數(shù),其中m_argv[0]比較特殊,存儲的是仿真時可執(zhí)行文件的名稱。 - m_plus_argv[$]
用于存儲仿真時帶’+'號的仿真參數(shù)。 - m_uvm_argv[$]
用于存儲和UVM相關的仿真參數(shù),判斷標準是檢測仿真參數(shù)是否以’+uvm’、’-uvm’、’+UVM’、’-UVM’作為前綴。
雖然知道了在這些隊列中存儲了相關的仿真參數(shù),但是由于這些隊列都是protected的,我們只能通過對應的函數(shù)來進行訪問,這些函數(shù)的原型如下:
function void get_args (output string args[$]); function void get_plusargs (output string args[$]); function void get_uvm_args (output string args[$]);另一個令人比較感興趣的問題是,這些隊列在什么時候被初始化。閱讀對應的源碼,可以看到這件事情發(fā)生在class的構造函數(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!="");細心的你可能已經(jīng)發(fā)現(xiàn)了,對仿真參數(shù)的處理采用的是dpi+字符串的手段,而不是調用系統(tǒng)函數(shù)$value$plusargs。那么問題又來了,既然是在構造函數(shù)中完成隊列初始化的,那么我們是不是還需要構造一個uvm_cmdline_processor類的實例?其實這一步也是不需要的,因為在源碼中,已經(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();因此,在實際的驗證環(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那么仿真的結果如下:
************************************************************* 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 *************************************************************事實上,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甚至于還支持正則表達式。
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ù)允許我們獲取仿真工具的名稱和版本,實際上,這部分的實現(xiàn)已經(jīng)通過dpi交還給了EDA vender。
總結
以上是生活随笔為你收集整理的UVM-1.1学习(二)——uvm_cmdline_processor的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在sqlexpress上安装norw
- 下一篇: 竣工测量心得体会_修改中