UVM 基础
UVM 组件、TLM 通信、Sequence 与 Factory 机制。
- 01UVM 入门:它到底解决了什么问题?从零理解 UVM 为何存在、testbench 的分层结构,以及 uvm_component 的基本写法。
- 02UVM 组件树与 Phase 机制uvm_component 如何在 class/extends 之上搭出一套标准化的类层次结构,UVM 按固定顺序执行 build_phase/connect_phase/run_phase 的机制,控制测试何时结束的 objection 机制,以及 UVM 的报告宏。
- 03搭建并跑通你的第一个 UVM Test复用 SV 基础系列 capstone 里的 mux2 DUT,把它包进一个最简 UVM 骨架并真正跑起来——一个近乎空的 driver、一个 test,以及把虚接口从 module 世界交接到 UVM 世界的 config_db 握手。
- 04uvm_object 与事务(Transaction)uvm_object 与 uvm_component 之间真正的关系(不只是它们的区别),每个 transaction 实际继承的 uvm_sequence_item 基类,以及手写 do_copy/do_compare/convert2string 而不是用 field 宏。
- 05config_db 与虚接口传递为什么 uvm_component 固定的 factory 构造函数签名排除了把虚接口作为构造函数参数传递的可能,以及 uvm_config_db::set()/get() 解决这个问题的完整机制——context、实例路径、通配符,还有为什么第 2 章 build_phase 的执行顺序正是它能生效的关键。
- 06Factory 机制:注册、create() 与替换`uvm_component_utils`/`uvm_object_utils` 到底注册了什么,为什么 type_id::create() 是一次查找而不是单纯构造一个对象,以及 set_type_override() 如何在不碰结构代码的情况下替换实现——补上第 3 章埋下的那笔最早的欠条。
- 07Sequence 与 Sequenceruvm_sequence 的 body() task,以及和 sequencer 之间 start_item/finish_item 的握手协议;用 SV 第 12 章的方式随机化 transaction;把 driver 改造成第 1 章第一个例子早就用过的 uvm_driver#(REQ)/seq_item_port 形态。
- 08Driver 与 Monitor:TLM 端口实战monitor 那种 push 风格的 analysis_port,相对 sequencer 那种 pull 风格 seq_item_port 的区别;为什么它取代了 SV 第 14 章手写的 mailbox;给 mux_transaction 加上一个观测到的输出字段;以及把 sequencer/driver/monitor 打包成一个可配置的 uvm_agent。
- 09Scoreboard 与 Analysis 端口analysis_port 的接收端——uvm_analysis_imp 与 write()——作为和 SV 第 15 章断言并列的第二种、基于软件的检查策略;以及把 agent 和 scoreboard 打包成一个 uvm_env。
- 10综合实战:搭建完整的 UVM 验证环境用第二个 test 兑现第 1 章第四条承诺——测试一个新场景只需要一个新类和一次 factory 替换,不需要重写;用 +UVM_TESTNAME 在命令行切换 test;把整个环境整理进一个 package;以及 uvm-advanced 与 dv-methodology 两个系列接下来要讲什么。