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.datatr.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 个时钟周期

🏃 操作步骤

  1. 阅读代码: 先阅读 env/my_driver.svenv/my_monitor.sv 中的注释
  2. 补全 Driver: 在 drive_one_pkt 任务中实现驱动逻辑
  3. 补全 Monitor: 在 collect_one_pkt 任务中实现采样逻辑
  4. 编译: make compile
  5. 仿真: make sim
  6. 检查结果: 查看 sim.log,确认输出 "TEST PASSED"

✅ 验收标准

  • VCS + UVM 编译无错误
  • 仿真日志显示 "TEST PASSED"
  • Scoreboard 比对全部成功(无 "Compare FAILED" 信息)