真实面经题目 · 原创解析
UVM 的 run_test("name") 传入字符串后如何创建测试对象?
这题考 factory 注册和按类型名创建对象的机制,重点是说明 test 类通过宏或注册表进入 factory,run_test 根据名字创建顶层 test。
真实面经题目 · 原创解析
这题考 factory 注册和按类型名创建对象的机制,重点是说明 test 类通过宏或注册表进入 factory,run_test 根据名字创建顶层 test。
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 和组件替换成为可能。
自定义 test 通常继承自 uvm_test,并使用注册宏把类型信息放进 factory。注册后,factory 知道某个字符串类型名对应哪个 wrapper,以及如何调用 create 创建组件实例。
run_test 可以显式传入名字,也可以从命令行参数获取测试名。若两者都没有,通常会报错或使用环境定义的默认行为。关键是 test name 是类型名或 factory 可识别的别名。
UVM 通过 factory 的按名创建接口生成 test component,并将其放在顶层层级下。之后 test 的 build_phase 会继续创建 env、agent、scoreboard 等组件。
因为创建经过 factory,所以可以用 type override 或 instance override 替换组件实现。run_test 的字符串入口让同一个仿真可执行文件通过命令行选择不同测试,而不用重新编译全部 testbench。
不同版本和调用方式细节要以所用库为准,但工程上不要同时给两个不一致的 test 名。面试重点是说明 test name 会被传给 factory 创建顶层 test。
注册宏会把类型包装器和创建函数登记到 factory。没有这些信息,factory 只有字符串,无法知道该实例化哪个类。
要看断言、功能覆盖、代码覆盖、错误注入和回归日志是否对应题目里的关键路径;如果只是组件能跑起来,但没有覆盖目标状态和异常分支,验证价值是不够的。