uvm 过程编译1

关键词:import;
package (包)
import uvm_pkg::;(引用,导入)防止重复编译,先导入才可以用。
编译过程中.
import uvm_pkg::
;
include "uvm_macros.svh" (三大厂商编译共同执行) 第一种 启动uvm平台 全局task 仿真方法: vlib 一下创建 vlib work(work 库) / vlog -sv +文件 编译看: vlog 版本include “uvm_macos.svh”
+incdir (默认添加include 宏命令的搜索命令路径)在调用vsm下面,如果没有其他命令。+使用的目录 qustasim 自带的uvm库。
comp 编译指令看:
如何找到uvm_macros.svh
compiling package :
编译好的库: importing package(版本,内嵌build-in);作为编译单元
二/ vism -do run all
uvm FATAL 仿真不成功 :指定组件run_test (“hello_uvm”)或者命令行 指定vsim test +UVM_TESTNAME= hello_uvm -c -do "run -all "
(instantiate 具体例子)

跑的log:
g sim.log

  1. loading +库
  2. questa_ 自带
  3. UVM _INFO :打印的语句
  4. test_case名字:内部字符串:uvm_test_top。每一个test case 都是相同的。
  5. @0 仿真时间,ID
  6. report 总结报告:
  7. severity分类打印,安全等级按照严重等级,如果有FATAL 仿真有问题需要debug。
  8. 或者ID 号统计。
  9. 警告
<think>我们正在处理一个关于UVM的问题:如何在UVM环境中获取编译过程中传递的参数。 在UVM中,编译参数通常是通过命令行传递的,例如使用`+define+`来定义宏,或者使用`+parameter+`来传递参数。UVM提供了一些机制来访问这些参数。 步骤: 1. 使用`uvm_cmdline_processor`类来获取命令行参数。 2. 通过`get_arg_values`方法获取特定参数的值。 例如,假设我们在编译时通过命令行传递了一个参数`+MY_PARAM=value`,我们可以在UVM环境中获取它。 示例代码: ```systemverilog import uvm_pkg::*; `include "uvm_macros.svh" class my_test extends uvm_test; `uvm_component_utils(my_test) function new(string name, uvm_component parent); super.new(name, parent); endfunction virtual function void build_phase(uvm_phase phase); super.build_phase(phase); string my_param_value; uvm_cmdline_processor cmdline_processor = uvm_cmdline_processor::get_inst(); if (cmdline_processor.get_arg_value("+MY_PARAM=", my_param_value)) begin `uvm_info("TEST", $sformatf("MY_PARAM value is %s", my_param_value), UVM_LOW) end else begin `uvm_error("TEST", "MY_PARAM not found") end endfunction endclass ``` 在这个例子中,我们在`build_phase`中使用`uvm_cmdline_processor`来获取命令行中`+MY_PARAM=`后面的值,并打印出来。 另外,如果参数是通过`+define+`传递的宏定义,我们可以使用`ifdef`来获取,例如: ```systemverilog `ifdef MY_MACRO string my_macro_value = `"MY_MACRO`"; // 注意:这里获取的是宏的字符串形式,如果宏有值则需要用其他方式 `endif ``` 但是,如果宏被定义为字符串,我们可以直接使用。 注意:`uvm_cmdline_processor`也可以用来获取其他类型的参数,例如整数,但需要转换。 对于整数参数,我们可以这样处理: ```systemverilog int int_value; if (cmdline_processor.get_arg_value("+INT_PARAM=", my_param_value)) begin if (sscanf(my_param_value, "%d", int_value) == 1) begin // 成功转换 end end ``` 另外,UVM还提供了一种更直接的方法来获取整数参数,使用`get_arg_int`: ```systemverilog int int_value; if (cmdline_processor.get_arg_int("+INT_PARAM=", int_value)) begin `uvm_info("TEST", $sformatf("INT_PARAM value is %0d", int_value), UVM_LOW) end ``` 但是注意,`get_arg_int`只能用于整数参数,并且参数格式必须是`+INT_PARAM=<整数>`。 总结:在UVM中获取编译参数,主要使用`uvm_cmdline_processor`类,它可以处理字符串、整数等类型的参数。 注意:编译参数和仿真参数通常是在命令行中传递的,所以这些方法在仿真运行时有效。 如果问题中的“编译参数”指的是在编译时确定的宏定义(例如通过`+define+`),那么除了使用`ifdef`之外,我们还可以通过`uvm_cmdline_processor`来获取宏定义,因为`+define+`实际上也是命令行参数的一部分。但是,`uvm_cmdline_processor`并不直接区分`+define+`和其他参数,所以我们需要自己处理。 例如,我们可以获取所有`+define+`的参数: ```systemverilog string defines[$]; cmdline_processor.get_arg_values("+define+", defines); foreach(defines[i]) begin `uvm_info("DEFINE", $sformatf("Define: %s", defines[i]), UVM_LOW) end ``` 这样,所有通过`+define+`定义的宏都会被收集到队列`defines`中。 因此,根据参数传递的方式,我们可以选择不同的方法。 现在,我们来生成相关问题。</think>### 如何在UVM中获取编译参数 在UVM环境中获取编译参数主要通过**命令行参数解析**实现,UVM提供了`uvm_cmdline_processor`类来访问仿真时传递的参数。以下是具体方法和示例: #### 方法步骤 1. **获取命令行处理器实例** 使用静态方法获取全局实例: ```systemverilog uvm_cmdline_processor cmd = uvm_cmdline_processor::get_inst(); ``` 2. **提取参数值** 根据参数类型选择方法: - **字符串参数**:`get_arg_value("+PARAM=", value)` - **整型参数**:`get_arg_int("+PARAM=", int_value)` - **开关参数**:`get_arg_match("+ENABLE_FLAG")` 3. **错误处理** 检查方法返回值确认参数是否存在: ```systemverilog if (!cmd.get_arg_value("+MY_PARAM=", str_val)) `uvm_error("PARAM_ERR", "Parameter not found") ``` #### 完整示例 ```systemverilog class my_test extends uvm_test; `uvm_component_utils(my_test) function void build_phase(uvm_phase phase); uvm_cmdline_processor cmd; string config_path; int debug_level; cmd = uvm_cmdline_processor::get_inst(); // 获取字符串参数 (e.g. +CFG_PATH=/path/to/config) if (!cmd.get_arg_value("+CFG_PATH=", config_path)) config_path = "default.cfg"; // 获取整型参数 (e.g. +DEBUG_LEVEL=3) if (!cmd.get_arg_int("+DEBUG_LEVEL=", debug_level)) debug_level = 1; // 检查开关参数 (e.g. +ENABLE_TRACE) bit trace_en = cmd.get_arg_match("+ENABLE_TRACE"); `uvm_info("CFG", $sformatf("Config: %s, Debug: %0d, Trace: %b", config_path, debug_level, trace_en), UVM_LOW) endfunction endclass ``` #### 关键注意事项 1. **参数格式** 命令行参数需以`+`开头(如`+PARAM=value`),这是SystemVerilog的标准格式[^1]。 2. **参数作用域** 编译参数在全局有效,建议在`build_phase`中获取,确保组件初始化前完成配置。 3. **默认值处理** 始终检查返回值并设置安全默认值,避免仿真因参数缺失失败。 4. **参数类型限制** 浮点数等复杂类型需先作为字符串获取,再手动转换: ```systemverilog string tmp; real freq; if (cmd.get_arg_value("+FREQ=", tmp)) freq = tmp.atoreal(); ``` 5. **多值参数** 使用`get_argv()`获取所有参数列表,实现自定义解析逻辑: ```systemverilog string args[$]; cmd.get_argv(args); ``` [^1]: IEEE Standard 1800.2-2020, Universal Verification Methodology Specification
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值