UVM命令行传参uvm_cmdline_processor

UVM中的uvm_cmdline_processor类用于处理命令行参数,它从uvm_object和uvm_report_object继承,提供get_inst()方法获取唯一实例。该类维护了三个参数队列:m_argv, m_plus_argv和m_uvm_argv,分别存储所有参数、以+开头的参数和以+UVM*开头的参数。此外,类中包含获取这些队列元素的方法以及获取仿真器信息的方法。尽管可以使用SV内置命令行传参方式,但推荐使用uvm_cmdline_processor以实现更好的复用和集成。" 120652290,5676126,Docker网络模式详解与容器通信,"['Docker网络', '容器网络', 'Docker教程']
AI助手已提取文章相关产品:

在UVM中环境中,在我们执行simulation的过程中,会在命令行添加一些simulation args。比如
./simv –l vcs_run.log +UVM_TESTNAME=my_test

在UVM世界中,有一个class专门来处理这些参数。这个类就是uvm_cmdline_processor

类的继承关系是:
uvm_object->uvm_report_object->uvm_cmdline_processor,这个类与factory相似,均是single模式的类,静态方法get_inst拿到唯一的对象。比如uvm_cmdline_processor cpl= uvm_cmdline_processor::get_inst();

在这个类中有3个重要的变量(队列)

1:string
m_argv[$] //存放所有cmdline参数,m_argv[0]=./simv

2:string
m_plus_argv[$]//存放所有cmdline参数中以+为开头的参数

3:string
m_uvm_argv[$]//存放所有cmdline参数中以+UVM*,+uvm或者-UVM*,-uvm为开头的参数

比如./simv –l vcs_run.log +UVM_TESTNAME=my_test

m_argv[$]有4个参数

m_plus_argv[$]有1个参数

m_uvm_argv[$]有1个参数

这个类中封装了相应的方法来获取上述3个队列的元素,(由于上述3个队列的protected属性)

get_args(output string args[$])

get_plusargs(output string plusargs[$])

get_uvm_args(output string uvm_args[$])

这个类中还有方法

get_tool_name//获取仿真器的名字

get_tool_version//获取仿真器的版本

方法:

get_arg_matches(string match,ref string args[$])//获取m_argv与string
match匹配的参数个数

get_arg_value(string match,ref string args)// 获取m_argv与string
match 最先匹配的参数个数

get_arg_values(string match,ref string args)// 获取m_argv与string
match 所有匹配的参数个数

其实uvm_cmdline_procesor只是一种实现方式,用户也可以直接使用SV自带的方法,比如valuepluson等命令行传参的方式,但是基于复用性以及集成性的角度,还是使用已经封装好的uvm_cmdline_processor来实现命令行参数的传递,这样也便于命令行传参的集中管理。

uvm_cmdline_processor的架构图
在这里插入图片描述

您可能感兴趣的与本文相关内容

<think>我们是在UVM环境中使用uvm_cmdline_processor来获取命令行参数。注意,这些参数是在仿真运行时通过命令行传递的,而不是在编译时。Makefile中通常会在运行仿真命令时传递参数,例如: vsim -c -do "run -all" +MY_PARAM=value ... 在UVM中,我们可以通过以下步骤获取并打印这些参数: 1. 创建uvm_cmdline_processor的实例。 2. 使用该实例的方法(如`get_arg_value`)来获取特定参数的值。 3. 打印获取到的值。 注意:命令行参数通常以`+`开头,例如`+MY_PARAM=value`。在uvm_cmdline_processor中,我们可以使用`get_plusargs`来获取所有以`+`开头的参数,或者使用`get_arg_value`来获取特定参数的值。 下面是一个示例代码,展示如何在UVM测试中获取并打印一个名为`MY_PARAM`的参数: ```systemverilog class my_test extends uvm_test; `uvm_component_utils(my_test) function new(string name = "my_test", uvm_component parent = null); super.new(name, parent); endfunction virtual task run_phase(uvm_phase phase); uvm_cmdline_processor cmdline_processor; string param_value; cmdline_processor = uvm_cmdline_processor::get_inst(); // 获取单例实例 // 尝试获取参数MY_PARAM的值 if (cmdline_processor.get_arg_value("+MY_PARAM=", param_value)) begin `uvm_info("MY_TEST", $sformatf("Got MY_PARAM = %s", param_value), UVM_LOW) end else begin `uvm_info("MY_TEST", "MY_PARAM not provided", UVM_LOW) end endtask endclass ``` 说明: - 使用`uvm_cmdline_processor::get_inst()`获取uvm_cmdline_processor的单例实例。 - 使用`get_arg_value`方法,传入字符串`"+MY_PARAM="`(注意包含等号),这样它会匹配命令行中`+MY_PARAM=value`的参数,并将`value`部分赋值给`param_value`。 - 如果命令行中没有提供该参数,则`get_arg_value`返回0,并打印未提供参数的信息。 在Makefile中运行仿真时,需要传递该参数,例如: ```makefile run: vsim -c -do "run -all" +MY_PARAM=hello_world ... ``` 这样,在UVM测试中就会打印出:Got MY_PARAM = hello_world 注意:`get_arg_value`方法只能获取第一个匹配的参数值。如果有多个同名参数,它只会返回第一个。如果需要获取所有值,可以使用`get_arg_values`方法,它会返回一个字符串队列。 另外,也可以使用`get_plusargs`方法获取所有以`+`开头的参数,然后自行解析。但使用`get_arg_value`更为直接。 参考文献: [^1]: [UVM]UVM命令行参数解析工具:uvm_cmdline_processor [^2]: 【UVM源码学习】uvm_cmdline_processor [^3]: UVM命令行传参uvm_cmdline_processor</think>在UVM中通过`uvm_cmdline_processor`获取Makefile传递的参数并打印,需遵循以下步骤: ### 步骤1:创建cmdline处理器实例 在测试环境(如uvm_test)的build_phase中创建处理器实例: ```systemverilog class my_test extends uvm_test; uvm_cmdline_processor cmdline; string param_value; virtual function void build_phase(uvm_phase phase); super.build_phase(phase); cmdline = uvm_cmdline_processor::get_inst(); // 获取单例实例[^1] endfunction endclass ``` ### 步骤2:获取并解析参数值 在run_phase使用匹配方法获取参数值: ```systemverilog virtual task run_phase(uvm_phase phase); if (cmdline.get_arg_value("+MY_PARAM=", param_value)) begin // 匹配+MY_PARAM格式[^2] `uvm_info("PRINT_PARAM", $sformatf("Got param: %s", param_value), UVM_LOW) end else begin `uvm_warning("PARAM_ERR", "MY_PARAM not found in command line") end endtask ``` ### 步骤3:Makefile传递参数 在Makefile中添加`+`前缀的参数传递: ```makefile run_sim: vsim -c -do "run -all" +MY_PARAM=config_value # +前缀是关键[^3] ``` ### 关键说明: 1. **参数格式**:Makefile传递参数需以`+`开头(如`+MY_PARAM=value`),这是UVM识别命令行参数的约定[^3] 2. **匹配语法**:`get_arg_value("+MY_PARAM=")`中的等号必须包含,用于区分参数名和值 3. **多值处理**:若需获取多个值,使用`get_arg_values`返回字符串队列: ```systemverilog string values[$]; if (cmdline.get_arg_values("+CFG_", values)) // 通配符匹配多个参数 ``` ### 输出示例: 当Makefile传递`+MY_PARAM=debug_mode`时: ``` UVM_INFO @ 0: reporter [PRINT_PARAM] Got param: debug_mode ``` > ⚠️ 注意:参数在仿真启动时传入(`vsim/simv`命令),非编译阶段。确保参数传递到UVM环境前未被其他进程过滤[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值