聚焦 RISC-V / CPU / SoC 验证实践。
所有结论,默认都------得验。
很多人第一次接触 UVM TLM(Transaction-Level Modeling),都会把它理解成一句话:
"就是
put/get、analysis_port那一套通信接口。"
但当你真正开始读 UVM 源码,会发现一个反直觉的事实:
TLM 在 UVM 里,解决的从来不是"怎么传数据",而是"哪些模块不该互相知道彼此的存在"。
这篇文章,我们从源码视角重新理解 TLM:
它到底是通信机制,还是一种强约束的架构边界设计?
一、如果只是通信,SystemVerilog 本身已经够了
先问一个简单的问题:
如果我只是想把一个 transaction 从 A 传到 B,需要 UVM TLM 吗?
答案是:完全不需要。
你可以用:
-
mailbox
-
queue
-
event
-
function/task 直接调用
甚至一个全局变量都能"跑起来"。
那为什么 UVM 还要引入一整套:
-
uvm_port -
uvm_export -
uvm_imp -
uvm_tlm_if_base -
uvm_analysis_port
这不是复杂化问题吗?
二、读源码你会发现:TLM 的第一目标不是"传输",而是"解耦"
我们从最核心的类开始看:
systemverilog
class uvm_port_base extends uvm_object;
注意两点:
1️⃣ port 不是 component
2️⃣ port 本身不包含任何"行为实现"
它的职责只有一个:
描述"我需要什么接口",而不是"我连的是谁"。
port / export / imp 的真实分工
| 角色 | 源码层面真正的含义 |
|---|---|
| port | 发起方的"能力声明" |
| export | 中转 / 聚合 |
| imp | 实际实现 |
这和软件工程里的一个概念高度一致:
依赖倒置(Dependency Inversion)
高层模块:
-
依赖的是 接口
-
而不是 具体实现
三、TLM 在 UVM 中的真正定位:架构边界
一个关键事实
在 UVM 里,component 是有层级的,但 transaction 流动不应该依赖层级。
TLM 的设计目标是:
让"数据流向"独立于"结构层级"。
这也是为什么你会看到:
-
monitor 可以把数据送到 scoreboards
-
scoreboards 可以不在同一个 hierarchy 分支
-
env 不需要知道 agent 内部细节
这些全部是 TLM 强制出来的结果,而不是"写代码的人自觉"。
四、为什么 analysis_port 是单向、广播的?
看 uvm_analysis_port 的源码,你会发现:
-
没有 return
-
没有阻塞
-
支持 multiple subscribers
这不是偶然,而是一个非常明确的架构选择:
监控 ≠ 控制
analysis port 在设计上就禁止你:
-
依赖下游返回值
-
用 monitor 驱动 DUT 行为
这相当于在方法学层面,把"观察者模式"写进了框架。
五、从源码看:TLM 是如何限制"坏架构"的?
一个常被忽略的点:
UVM TLM 的复杂度,很大一部分是"防止你写烂架构"。
举几个被强制禁止的事情:
-
❌ 上层 component 直接调用下层具体方法
-
❌ monitor 依赖 driver 的内部状态
-
❌ scoreboard 反向控制 stimulus
这些在"裸 SV"里完全合法,
但在 TLM 体系下,会变得非常别扭、甚至写不出来。
这不是缺点,这是设计哲学。
六、所以:TLM 是通信机制,还是架构边界?
答案是:
TLM 是以"通信接口"为表象的架构约束系统。
-
通信,只是它最浅的一层用途
-
解耦、边界、职责分离,才是它的核心价值
当你觉得:
"TLM 好麻烦,不如直接 call 函数"
其实说明一件事:
当前这个验证环境,还没有复杂到需要被强制约束。
七、回到源码解读的视角
如果你继续往下读源码,建议顺序是:
1️⃣ uvm_tlm_if_base ------ 接口抽象
2️⃣ uvm_port_base::connect() ------ 连接合法性
3️⃣ uvm_analysis_port::write() ------ 广播机制
4️⃣ export / imp 的多态绑定过程
你会越来越清晰地看到一句话:
UVM 从来不信任工程师的"自觉",它选择用框架约束行为。
写在最后
如果你把 UVM 当成:
-
"一堆语法糖"
-
"老旧但不得不用的工具"
那 TLM 确实很烦。
但如果你开始从源码 + 架构的角度看它,你会发现:
UVM 本质上是一套"为大规模协作验证而生的软件架构规范"。