<think>我们正在讨论如何在VCS仿真器中控制UVM打印信息的显示设置。用户的问题是如何在VCS中设置UVM打印信息的级别和显示选项。
根据UVM机制,控制打印信息主要有两种方式:通过命令行参数(全局控制)和通过代码设置(精细控制)。在VCS中,我们主要使用命令行参数,但也可以结合代码设置。
重点:VCS中控制UVM打印信息的命令行参数
1. 设置全局冗余级别(verbosity):
+UVM_VERBOSITY=<level>
其中<level>可以是:UVM_NONE, UVM_LOW, UVM_MEDIUM, UVM_HIGH, UVM_FULL, UVM_DEBUG
例如:+UVM_VERBOSITY=UVM_HIGH # 将只显示HIGH及以上级别的消息
2. 设置特定文件的日志输出:
- 通常,VCS会将所有消息同时输出到标准输出和日志文件(默认的日志文件名为simv.log)。如果希望将UVM消息单独输出到另一个文件,可以使用:
+UVM_LOG_FILE=<filename>
例如:+UVM_LOG_FILE=uvm_messages.log
3. 设置是否将消息同时输出到标准输出和日志文件(默认是同时输出):
+UVM_DUMP_CMDLINE_ARGS # 这个选项并不直接控制输出,实际上控制输出重定向的是:
- 如果希望只输出到日志文件而不输出到标准输出,可以使用:
+UVM_NO_TERMINAL # 这样消息就不会在终端显示,只写入日志文件
4. 控制特定ID或消息类型的显示:
+uvm_set_action=<comp>,<id>,<severity>,<action>
其中:
<comp>:组件路径,可以使用通配符(*),例如"uvm_test_top.*"
<id>:消息ID,也可以使用通配符(*)
<severity>:严重性(UVM_INFO, UVM_WARNING, UVM_ERROR, UVM_FATAL)
<action>:采取的动作(UVM_DISPLAY, UVM_LOG, UVM_COUNT, UVM_EXIT等),多个动作可以用或运算(如UVM_DISPLAY|UVM_LOG)
例如:+uvm_set_action="uvm_test_top.env.agent*","monitor_id",UVM_INFO,UVM_NO_ACTION" # 关闭特定组件的特定ID的INFO消息
5. 设置特定ID或组件的冗余级别:
+uvm_set_verbosity=<comp>,<id>,<verbosity>,<phase>
其中:
<comp>:组件路径(支持通配符)
<id>:消息ID(支持通配符)
<verbosity>:冗余级别(UVM_LOW, UVM_MEDIUM, UVM_HIGH等)
<phase>:在哪个phase生效(例如:build, run, main, etc.),也可以使用"*"表示所有phase
例如:+uvm_set_verbosity="uvm_test_top.env",*,UVM_HIGH,build # 在build阶段,将env及其子组件中所有消息的冗余级别设置为HIGH(这样只有高于HIGH的才会显示,而原来为MEDIUM的就不会显示)
6. 设置超时警告:UVM默认在仿真超时时会报告警告,可以通过以下命令关闭超时警告:
+UVM_TIMEOUT=<timeout_value> # 设置超时时间(单位时间单位),如果设置为0则禁用超时检测
或者禁用超时警告消息(但超时检测仍然进行):
+uvm_set_action="uvm_test_top",UVM_TIMEOUT,UVM_WARNING,UVM_NO_ACTION
7. 控制消息显示格式:
UVM默认的消息格式是固定的,但可以通过重载uvm_report_server来改变。在命令行中,没有直接改变格式的选项,但可以通过以下方式设置:
+UVM_CONFIG_DB_SET=uvm_report_server,default_report_server,<class_name>
其中<class_name>是你自定义的report server类名(需要继承自uvm_report_server)。但这种方法相对复杂,通常更推荐在代码中设置。
示例:在VCS中运行一个测试,并控制打印信息
vcs -sverilog ... [编译选项] ...
./simv +UVM_TESTNAME=my_test +UVM_VERBOSITY=UVM_HIGH +uvm_set_verbosity="uvm_test_top.env.*",*,UVM_FULL,build +UVM_LOG_FILE=uvm.log
解释:
- 全局冗余级别设置为UVM_HIGH,所以只有HIGH和FULL级别的消息会显示(注意:在build阶段,通常使用MEDIUM级别,所以这些消息会被过滤掉)。
- 对于env及其子组件,在build阶段,将所有消息的冗余级别设置为UVM_FULL(这样,这些组件中原来使用MEDIUM或HIGH级别的消息,因为被设置为FULL,而全局级别是HIGH,所以FULL级别的消息不会被显示,除非全局级别改为FULL或更高?)
注意:设置特定组件的冗余级别会覆盖消息本身的冗余级别。例如,一条消息原本是UVM_MEDIUM,通过+uvm_set_verbosity设置为UVM_FULL,那么这条消息的级别就变成了UVM_FULL。而全局设置的冗余级别是UVM_HIGH,那么UVM_FULL低于UVM_HIGH(因为UVM_FULL的整数值比UVM_HIGH高,但比较时是数值越大越详细),所以不会显示。因此,要显示更多消息,需要将全局冗余级别设置为较低(数值较大)的级别。
重要:UVM冗余级别的数值定义(在uvm_globals.svh中):
UVM_NONE = 0;
UVM_LOW = 100;
UVM_MEDIUM = 200;
UVM_HIGH = 300;
UVM_FULL = 400;
UVM_DEBUG = 500;
所以,数值越大,冗余度越高。当设置全局冗余级别为UVM_HIGH(300)时,只有冗余度大于等于300(即UVM_HIGH, UVM_FULL, UVM_DEBUG)的消息才会显示。
因此,上面的例子中,我们将env及其子组件在build阶段的消息都设置为UVM_FULL(400),那么这些消息在全局级别为UVM_HIGH(300)时,因为400>300,所以会显示。而其他组件的消息如果级别为UVM_MEDIUM(200)则不会显示。
如果希望完全关闭某个组件的所有消息,可以将该组件的冗余级别设置为UVM_NONE(0):
+uvm_set_verbosity="uvm_test_top.agent1",*,UVM_NONE,*
或者使用set_action来关闭显示:
+uvm_set_action="uvm_test_top.agent1",*,UVM_INFO,UVM_NO_ACTION"
注意:uvm_set_action不仅可以控制UVM_INFO,还可以控制UVM_WARNING等。
总结:在VCS中,主要通过以下命令行参数控制UVM打印:
+UVM_VERBOSITY
+UVM_LOG_FILE
+UVM_NO_TERMINAL
+uvm_set_verbosity
+uvm_set_action
另外,UVM还支持通过配置文件(.ini)来设置,但VCS可能不支持直接读取.ini文件,所以通常使用命令行参数。
最后,生成相关问题。</think>### 在 VCS 中控制 UVM 打印信息的配置方法
在 VCS 仿真器中控制 UVM 打印信息,主要通过**命令行参数**实现。以下是核心配置方法:
---
#### 1. **全局冗余级别控制**(常用)
通过 `+UVM_VERBOSITY` 参数设置全局消息过滤级别:
```bash
# 只显示 HIGH 及以上级别消息(屏蔽 MEDIUM/LOW)
./simv +UVM_VERBOSITY=UVM_HIGH
# 显示所有消息(包括 DEBUG)
./simv +UVM_VERBOSITY=UVM_DEBUG
```
**级别说明**:
| 级别 | 数值 | 说明 |
|------------|------|-------------------------|
| `UVM_NONE` | 0 | 完全关闭 |
| `UVM_LOW` | 100 | 关键信息(默认最低级别) |
| `UVM_MEDIUM`| 200 | 常规信息(build_phase 默认)|
| `UVM_HIGH` | 300 | 详细调试信息 |
| `UVM_FULL` | 400 | 完整跟踪信息 |
| `UVM_DEBUG`| 500 | 最详细调试信息 |
---
#### 2. **精准组件级控制**
使用 `+uvm_set_verbosity` 控制特定组件的消息:
```bash
# 关闭 test_top.env 下所有组件的 MEDIUM 消息
./simv +uvm_set_verbosity="test_top.env.*",_,UVM_NONE,build
# 仅开启 agent 组件的 DEBUG 消息
./simv +uvm_set_verbosity="test_top.env.agent*",_,UVM_DEBUG,*
```
参数格式:
`+uvm_set_verbosity="<组件路径>",<消息ID>,<级别>,<阶段>`
- 通配符 `*` 匹配任意字符
- `_` 表示所有消息 ID
- `*` 表示所有阶段
---
#### 3. **消息输出重定向**
控制消息输出位置:
```bash
# 将 UVM 消息重定向到文件(不显示在终端)
./simv +UVM_LOG_FILE=uvm_messages.log
# 禁用终端输出(只写日志)
./simv +UVM_NO_TERMINAL
```
---
#### 4. **特定消息类型过滤**
使用 `+uvm_set_action` 拦截指定消息:
```bash
# 关闭所有 BUILD 阶段的消息
./simv +uvm_set_action="*","BUILD",UVM_INFO,UVM_NO_ACTION
# 关闭特定组件的警告
./simv +uvm_set_action="test_top.env.agent","CFGERR",UVM_WARNING,UVM_NO_ACTION
```
参数格式:
`+uvm_set_action="<组件>",<消息ID>,<消息类型>,<动作>`
动作选项:`UVM_DISPLAY` (显示), `UVM_LOG` (写日志), `UVM_NO_ACTION` (屏蔽)
---
### 配置示例
**场景**:关闭 build_phase 所有消息,只保留 agent 的警告:
```bash
./simv \
+UVM_VERBOSITY=UVM_HIGH \ # 全局屏蔽MEDIUM及以下
+uvm_set_verbosity="*",_,UVM_NONE,build \ # 强制关闭build阶段消息
+uvm_set_action="test_top.env.agent*",_,UVM_WARNING,UVM_DISPLAY
```
---
### 验证配置效果
在测试代码中添加检查:
```systemverilog
// 在 build_phase 中验证
`uvm_info("VERB_TEST", "MEDIUM消息应被屏蔽", UVM_MEDIUM)
`uvm_info("VERB_TEST", "HIGH消息应显示", UVM_HIGH)
```
> ⚠️ 注意:命令行参数优先级高于代码中的 `set_report_verbosity_level()` 设置[^1]。
---
### 常用 VCS 调试命令组合
| **目的** | **命令** |
|---------------------------|-------------------------------------------------------------------------|
| 仅显示错误/警告 | `./simv +UVM_VERBOSITY=UVM_NONE` |
| 调试特定组件 | `./simv +uvm_set_verbosity="top.env.dut*",_,UVM_DEBUG,*` |
| 捕获消息到文件 | `./simv +UVM_LOG_FILE=debug.log +UVM_NO_TERMINAL` |
| 关闭超时警告 | `./simv +uvm_set_action="*",UVM_TIMEOUT,UVM_WARNING,UVM_NO_ACTION` |
[^1]: UVM 命令行参数优先级规则参考 IEEE 1800.2-2020 标准第 15.3 节。