practice_templates/basic_02/uvm_minimal/README.md
UVM 基础实践 (1/3): 实现 UVM Driver 和 Monitor
📚 知识点
| 知识点 | 说明 |
|---|---|
| uvm_driver | 将 transaction 转换为 DUT 接口时序信号的组件 |
| uvm_monitor | 被动采样 DUT 接口信号并构造 transaction 的组件 |
| virtual interface | 通过 uvm_config_db 传递的 SystemVerilog 接口句柄 |
| seq_item_port | Driver 与 Sequencer 之间的 TLM 端口 |
| analysis_port | Monitor 广播 transaction 的 TLM 端口 |
🎯 任务目标
你需要补全两个文件:
1. env/my_driver.sv — 补全 drive_one_pkt 任务
Driver 负责将 transaction 的数据通过 virtual interface 驱动到 DUT 输入端口。
需要实现的逻辑:
- 等待时钟上升沿
- 将 tr.data 驱动到 vif.data
- 将 vif.valid 拉高一个时钟周期
- 再将 vif.valid 拉低
2. env/my_monitor.sv — 补全 collect_one_pkt 任务
Monitor 负责在 DUT 接口上采样数据,构造 transaction 对象。
需要实现的逻辑:
- 循环等待 vif.valid 变高
- 采样 vif.data 到 tr.data
- 打印日志
📁 文件结构
├── rtl/
│ └── dut.sv ← DUT: 数据取反器 (完整,无需修改)
├── env/
│ ├── my_if.sv ← 接口定义 (完整)
│ ├── my_transaction.sv ← Transaction 类 (完整)
│ ├── my_driver.sv ← ⭐ 需要补全 drive_one_pkt
│ ├── my_monitor.sv ← ⭐ 需要补全 collect_one_pkt
│ ├── my_sequencer.sv ← Sequencer (完整)
│ ├── my_agent.sv ← Agent (完整)
│ ├── my_model.sv ← 参考模型 (完整)
│ ├── my_scoreboard.sv ← 记分牌 (完整)
│ └── my_env.sv ← 顶层环境 (完整)
├── tests/
│ ├── base_test.sv ← 测试基类 (完整)
│ └── my_case0.sv ← 测试用例 (完整)
├── top_tb.sv ← Testbench 顶层 (完整)
├── Makefile ← 编译/仿真脚本
└── README.md ← 本文件
🏗️ DUT 说明
数据处理器 (Data Processor):
- 输入: rxd[7:0] + rx_dv (数据 + 有效信号)
- 输出: txd[7:0] + tx_en (数据 + 有效信号)
- 功能: txd = ~rxd (数据按位取反)
- 延迟: 1 个时钟周期
🏃 操作步骤
- 阅读代码: 先阅读
env/my_driver.sv和env/my_monitor.sv中的注释 - 补全 Driver: 在
drive_one_pkt任务中实现驱动逻辑 - 补全 Monitor: 在
collect_one_pkt任务中实现采样逻辑 - 编译:
make compile - 仿真:
make sim - 检查结果: 查看 sim.log,确认输出 "TEST PASSED"
✅ 验收标准
- VCS + UVM 编译无错误
- 仿真日志显示 "TEST PASSED"
- Scoreboard 比对全部成功(无 "Compare FAILED" 信息)