practice_templates/basic_02/uvm_agent/README.md
UVM 基础实践 (2/3): 实现 UVM Agent 结构
📚 知识点
| 知识点 | 说明 |
|---|---|
| uvm_agent | 封装 Driver/Monitor/Sequencer 的容器组件 |
| is_active 属性 | UVM_ACTIVE (驱动+观察) vs UVM_PASSIVE (只观察) |
| type_id::create | UVM Factory 创建组件的标准方法 |
| seq_item_port 连接 | Driver 与 Sequencer 之间的 TLM 端口连接 |
| analysis_port 转发 | 将子组件端口暴露到上层 |
🎯 任务目标
你需要补全一个文件:
env/my_agent.sv — 补全 build_phase 和 connect_phase
build_phase 要求:
- 判断
is_active属性 - 如果是
UVM_ACTIVE,用type_id::create创建sqr(sequencer) 和drv(driver) - 无论哪种模式,都创建
mon(monitor)
connect_phase 要求:
- 如果是
UVM_ACTIVE,连接drv.seq_item_port到sqr.seq_item_export - 将
mon.ap转发给 Agent 的ap
📁 文件结构
├── rtl/
│ └── dut.sv ← DUT: 数据取反器 (完整)
├── env/
│ ├── my_if.sv ← 接口定义 (完整)
│ ├── my_transaction.sv ← Transaction (完整)
│ ├── my_driver.sv ← Driver (完整)
│ ├── my_monitor.sv ← Monitor (完整)
│ ├── my_sequencer.sv ← Sequencer (完整)
│ ├── my_agent.sv ← ⭐ 需要补全 build_phase + connect_phase
│ ├── my_model.sv ← 参考模型 (完整)
│ ├── my_scoreboard.sv ← 记分牌 (完整)
│ └── my_env.sv ← 顶层环境 (完整)
├── tests/
│ ├── base_test.sv ← 测试基类 (完整)
│ └── my_case0.sv ← 测试用例 (完整)
├── top_tb.sv ← Testbench 顶层 (完整)
├── Makefile
└── README.md
🏗️ UVM Agent 结构图
┌──────────────────────────────┐
│ my_agent │
│ │
│ ┌────────────┐ │
│ │ sequencer │ ◄── Sequence│
│ └──────┬─────┘ │
│ │ seq_item_export │
│ │ │
│ ┌──────▼─────┐ │
│ │ driver │ ──→ DUT │
│ └────────────┘ │
│ │
│ ┌────────────┐ │
│ │ monitor │ ◄── DUT │
│ └──────┬─────┘ │
│ │ ap │
│ ▼ │
│ ┌────────────┐ │
│ │ agent.ap │ ──→ 外部连接│
│ └────────────┘ │
└──────────────────────────────┘
🏃 操作步骤
- 阅读代码: 先阅读
env/my_env.sv了解 Agent 是如何被使用的 - 补全 build_phase: 创建子组件 (注意 is_active 判断)
- 补全 connect_phase: 连接端口
- 编译:
make compile - 仿真:
make sim
✅ 验收标准
- VCS + UVM 编译无错误
- 仿真日志显示 "TEST PASSED"