真实面经题目 · 原创解析
UVM 哪些类是虚类,哪些不是虚类?
这题考 UVM 类层次和 SystemVerilog virtual class 规则。稳妥回答要先限定库版本,再给 virtual 与非 virtual 的例子,并区分库类声明和项目里的具体派生类。
真实面经题目 · 原创解析
这题考 UVM 类层次和 SystemVerilog virtual class 规则。稳妥回答要先限定库版本,再给 virtual 与非 virtual 的例子,并区分库类声明和项目里的具体派生类。
我会先限定版本:精确名单以当前项目使用的 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 最终只能创建可实例化的具体类型。
SystemVerilog 里声明为 virtual class 或含 pure virtual 方法的类不能直接构造实例。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 等。它们更多用于抽象接口、组件层级、多态句柄和 factory 体系,不应被直接 new 成最终对象。
常见非 virtual class 可举 uvm_report_object、uvm_sequence_item、uvm_sequence_base、uvm_driver 等。注意“非 virtual”只表示语言上不是 virtual class,不等于项目里就一定直接用库基类;工程中仍常写自己的 my_driver、my_item、my_config 或 my_sequence。
用户项目里的 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 声明不是同一个维度。
factory 可以用抽象基类句柄承接多态对象,也可以做 override,但最终 create 的类型必须是可实例化的具体类。若 override 到仍不可实例化的 virtual class,运行时创建会失败或根本无法作为合法目标。
以常见 UVM 1.2 为例,uvm_sequence_base 可作为非 virtual class 示例,而 uvm_sequence 是 virtual class;但最终仍要看当前源码声明,不要把所有 sequence 相关类混成一类。
非 virtual 只是语言声明,表示基类本身不是 virtual class;工程上仍需要派生具体 driver 实现协议、item 类型和 pin-level 驱动逻辑。
可以。虚类不能直接实例化,但可以包含普通方法、虚方法、成员变量和公共实现,供派生类复用。
factory 最终必须创建具体可实例化类型。抽象基类可以作为句柄类型或 override 基类,但不能作为最终被 create 的 virtual class。