真实面经题目 · 原创解析

UVM 的 run_test("name") 传入字符串后如何创建测试对象?

这题考 factory 注册和按类型名创建对象的机制,重点是说明 test 类通过宏或注册表进入 factory,run_test 根据名字创建顶层 test。

出现于:乐鑫科技 · IC 验证

60 秒回答模板

run_test 传入的是字符串,但它不是用字符串直接 new 类,而是借助 factory。测试类继承自 uvm_test,并通过 `uvm_component_utils` 或相关注册机制把类型名、type_id 和创建函数注册到全局 factory。run_test 会确定 test name:优先使用显式参数或命令行 `+UVM_TESTNAME`,再通过 factory 按名字创建这个 test component,挂在 `uvm_test_top` 位置。创建完成后,UVM 启动 build、connect、run 等 phase。这个机制让命令行切换 test、factory override 和组件替换成为可能。

考点 字符串不是 new
难度 真实面经题
回答目标 讲清 run_test 如何从 test name 经过 factory 注册表创建 uvm_test,并启动后续 phase。

深入解析

01

test 类先注册

自定义 test 通常继承自 uvm_test,并使用注册宏把类型信息放进 factory。注册后,factory 知道某个字符串类型名对应哪个 wrapper,以及如何调用 create 创建组件实例。

02

run_test 确定名字

run_test 可以显式传入名字,也可以从命令行参数获取测试名。若两者都没有,通常会报错或使用环境定义的默认行为。关键是 test name 是类型名或 factory 可识别的别名。

03

factory 创建顶层 test

UVM 通过 factory 的按名创建接口生成 test component,并将其放在顶层层级下。之后 test 的 build_phase 会继续创建 env、agent、scoreboard 等组件。

04

机制支持替换和复用

因为创建经过 factory,所以可以用 type override 或 instance override 替换组件实现。run_test 的字符串入口让同一个仿真可执行文件通过命令行选择不同测试,而不用重新编译全部 testbench。

易错点

  • 说 run_test 用字符串直接调用 new,忽略 factory 注册和 wrapper。
  • test 类没有注册,却期待命令行能创建。
  • 把 component 和 object 的创建机制混在一起,不说明父节点和层级名。
  • 只背 factory override,不会解释 run_test 创建顶层 test 的路径。

面试官追问

+UVM_TESTNAME 和 run_test 参数谁优先?

不同版本和调用方式细节要以所用库为准,但工程上不要同时给两个不一致的 test 名。面试重点是说明 test name 会被传给 factory 创建顶层 test。

为什么必须用注册宏?

注册宏会把类型包装器和创建函数登记到 factory。没有这些信息,factory 只有字符串,无法知道该实例化哪个类。

怎样证明这个验证写法真的覆盖到了目标场景?

要看断言、功能覆盖、代码覆盖、错误注入和回归日志是否对应题目里的关键路径;如果只是组件能跑起来,但没有覆盖目标状态和异常分支,验证价值是不够的。