UVM 寄存器模型中的概念
文章目录
- 寄存器模型中的概念
- 通道分类先搞清楚(**两大类、四小类**):
- 一、设置通道(从reg_model“流出”)
- 二、反馈通道(从DUT“流入”)
- 🧩 通道总结结构图:
- ✅ 回到你最初的问题:
- 带寄存器模型的数据流图
- 选择哪条反馈通道
- 🚨 解释:
- 🔄 但是,如果你设置了:
- ✅ 总结:
寄存器模型中的概念
- 两条回馈通道:
driver反馈
vsmonitor反馈
和一条设置通道 - 三类值:期望值 (desired)、镜像值 (mirror)、实际值 (actual/DUT)
- 六个常用接口函数:read / write / peek / poke / get / set / update
通道分类先搞清楚(两大类、四小类):
我们可以将所有与值有关的通道分为两大类:
一、设置通道(从reg_model“流出”)
用于向 DUT 发起事务:
通道编号 | 通道名称 | 简述 |
---|---|---|
① | reg_model → adapter → sequencer | 将 uvm_reg_item 变成 bus_request,发到 sequencer |
② | sequencer → driver | 传送 bus_request 给 driver |
二、反馈通道(从DUT“流入”)
用于更新 reg_model 的镜像值:
通道编号 | 通道名称 | 简述 |
---|---|---|
③ | driver → item_done() | 操作完成后将实际值反馈给 reg_model(回传 rw) |
④ | monitor → predictor | DUT 主动发起事务时同步更新镜像 |
💡 备注:
driver → item_done()
和monitor → predictor
是两种不同的反馈方式。- 一个是 主动反馈(driver 驱动过程),一个是 被动预测(monitor监听后处理)。
- adapter 也算一种内部转化的“微通道”,但我们在这里统一认为它是设置通道的一部分。
🧩 通道总结结构图:
设置通道:reg_model│▼adapter (reg2bus)│▼sequencer│▼driver反馈通道①:driver│▼item_done(rw) → reg_model (更新 mirror)反馈通道②:monitor│▼reg_predictor│▼reg_model (更新 mirror)
✅ 回到你最初的问题:
你说:“函数依靠通道拿到了值”,请列出统一汇总表格:函数、通道、值
函数 | 访问目标 | 是否后门 | 通道(设置) | 通道(反馈) | 得到的值 | mirror 更新 | desired 更新 | actual | 该行是否检查 |
---|---|---|---|---|---|---|---|---|---|
read() | DUT (经总线) | 否 | reg2bus → sequencer → driver | monitor/predictor → reg_predictor(或 driver) | actual | ✅ | ✅ | ✅ | ✅ |
write() | DUT (经总线) | 否 | reg2bus → sequencer → driver | monitor/predictor → reg_predictor(或 driver) | ✅ | ✅ | ✅ | ✅ | |
peek() | DUT (不经总线) | 是 | 直接内部访问设计 | 无 | actual | ✅ | ✅ | ✅ | ✅ |
poke() | DUT (不经总线) | 是 | 直接内部访问设计 | 无 | ✅ | ✅ | ✅ | ✅ | |
get() | 寄存器模型本身 | - | 无 | 无 | desired | ❌ | ❌ | ❌ | ✅ |
set() | 寄存器模型本身 | - | 无 | 无 | ❌ | ✅ | ❌ | ✅ | |
update() | DUT (经总线) | 否 | reg2bus → sequencer → driver | monitor/predictor → reg_predictor(或 driver) | ✅ | ❌ | ✅ | ✅ | |
— | |||||||||
mirror() | DUT (经总线/后门) | 否/是¹ | 有:如果为 frontdoor | monitor/predictor | ✅ | ❌ | ✅ | ❌ | |
predict() | 只影响寄存器模型 | - | 无 | 手动预测路径 | ✅ | ✅ | ✅ | ❌ | |
reset() | 寄存器模型本身 | - | 无 | 无 | ✅ | ✅ | ❌ | ❌ |
带寄存器模型的数据流图
选择哪条反馈通道
Driver 是 “设置通道”,而不是“反馈通道”**,但是:
有一个例外:如果你关闭了 predictor,或者没有使用 monitor 来更新 mirror 值,就可能退化为 “driver feedback” 的形式。
🚨 解释:
- 在 UVM 的寄存器模型标准用法中:
driver
是用来驱动 DUT 的(write、read 请求)。monitor
是用来观测 DUT 的响应。reg_predictor
使用monitor
的数据回馈更新mirror
和actual
值。
✅ 所以 标准路径是 monitor → predictor → 寄存器模型。
🔄 但是,如果你设置了:
rm.default_map.set_auto_predict(1);
就会跳过 reg_predictor
,让 driver
执行完之后就直接更新 mirror
—— 相当于:
driver.item_done() → adapter.bus2reg() → reg_model.mirror
所以此时:
场景 | 设置通道 | 反馈通道 |
---|---|---|
使用 reg_predictor | driver | monitor |
使用 auto_predict=1 | driver | driver |
✅ 总结:
- 默认 feedback 是 monitor → predictor。
- 开启
set_auto_predict(1)
后,会 绕开 monitor,直接让 driver 的响应更新寄存器模型。 - 所以,在某些配置下,确实存在 “反馈通道为 driver” 的情况。