真实面经题目 · 原创解析

UVM 哪些类是虚类,哪些不是虚类?

这题考 UVM 类层次和 SystemVerilog virtual class 规则。稳妥回答要先限定库版本,再给 virtual 与非 virtual 的例子,并区分库类声明和项目里的具体派生类。

出现于:TI · IC 验证

60 秒回答模板

我会先限定版本:精确名单以当前项目使用的 UVM 源码为准。以常见 UVM 1.2 声明为例,virtual class 通常包括 uvm_void、uvm_object、uvm_transaction、uvm_component、uvm_test、uvm_env、uvm_agent、uvm_monitor、uvm_scoreboard、uvm_sequence、uvm_port_base 等,它们不能直接 new,主要作为抽象接口或组件基类。常见非 virtual class 示例包括 uvm_report_object、uvm_sequence_item、uvm_sequence_base、uvm_driver 等,但项目里通常仍会派生 my_driver、my_item、my_config、my_sequence 这类具体类再注册 factory。回答重点不是背死名单,而是看 class 声明是否 virtual 或含 pure virtual 方法,并说明 factory 最终只能创建可实例化的具体类型。

考点 版本限定
难度 真实面经题
回答目标 让面试官看到你能按源码版本判断 UVM 类是否 virtual,并能清楚区分抽象库基类、非 virtual 库类和项目具体派生类。

深入解析

01

先限定版本和判断规则

SystemVerilog 里声明为 virtual class 或含 pure virtual 方法的类不能直接构造实例。UVM 不同版本、厂商补丁和项目封装可能有差异,所以面试中要先说明“以下以常见 UVM 1.2 源码为例,最终以项目源码声明为准”。

02

UVM 1.2 常见 virtual class 例子

常见 virtual class 可举 uvm_void、uvm_object、uvm_transaction、uvm_component、uvm_test、uvm_env、uvm_agent、uvm_monitor、uvm_scoreboard、uvm_sequence、uvm_port_base 等。它们更多用于抽象接口、组件层级、多态句柄和 factory 体系,不应被直接 new 成最终对象。

03

UVM 1.2 常见非 virtual class 例子

常见非 virtual class 可举 uvm_report_object、uvm_sequence_item、uvm_sequence_base、uvm_driver 等。注意“非 virtual”只表示语言上不是 virtual class,不等于项目里就一定直接用库基类;工程中仍常写自己的 my_driver、my_item、my_config 或 my_sequence。

04

项目具体类要单独说

用户项目里的 my_test、my_env、my_agent、my_monitor、my_scoreboard、my_driver、my_sequence、my_item、my_config 通常是具体可实例化类,并通过 type_id::create 或 factory override 创建。它们和 UVM 库基类的 virtual 声明不是同一个维度。

05

factory 只能落到具体类型

factory 可以用抽象基类句柄承接多态对象,也可以做 override,但最终 create 的类型必须是可实例化的具体类。若 override 到仍不可实例化的 virtual class,运行时创建会失败或根本无法作为合法目标。

易错点

  • 不限定 UVM 版本,直接把某个名单说成所有项目绝对一致。
  • 把 uvm_report_object、uvm_sequence_base、uvm_sequence 这类容易混淆的类放在同一组,不区分源码声明。
  • 把“库类是否 virtual”和“项目中是否会派生具体类”混为一谈。
  • 认为非 virtual class 就一定应该直接实例化库基类,忽略项目协议通常需要自己的派生类。
  • 尝试让 factory 最终创建抽象 virtual class,而不是具体可实例化类型。

面试官追问

uvm_sequence_base 和 uvm_sequence 在回答里怎么区分?

以常见 UVM 1.2 为例,uvm_sequence_base 可作为非 virtual class 示例,而 uvm_sequence 是 virtual class;但最终仍要看当前源码声明,不要把所有 sequence 相关类混成一类。

uvm_driver 为什么是非 virtual 还经常要派生?

非 virtual 只是语言声明,表示基类本身不是 virtual class;工程上仍需要派生具体 driver 实现协议、item 类型和 pin-level 驱动逻辑。

虚类能不能有普通方法和成员变量?

可以。虚类不能直接实例化,但可以包含普通方法、虚方法、成员变量和公共实现,供派生类复用。

factory 能创建虚类吗?

factory 最终必须创建具体可实例化类型。抽象基类可以作为句柄类型或 override 基类,但不能作为最终被 create 的 virtual class。