4.7 学习UVM中的阶段机制,应用到具体示例分为几步?
文章目录
- 前言
- 示例一:AXI总线验证环境
-
- 1. 环境结构
- 2. 阶段执行顺序与依赖实现
- 3. 关键阶段代码详解
- 4. 执行顺序验证
- 5. 设计要点
- 附:阶段依赖关系示意图
- 示例二:AXI-Lite寄存器控制验证环境
-
- 1. 验证组件结构
- 2. 阶段执行流程详解
-
- Phase 1: build_phase
- Phase 2: connect_phase
- Phase 3: run_phase
- Phase 4: extract_phase
- Phase 5: check_phase
- Phase 6: report_phase
- 3. 阶段依赖关系实现
- 4. 关键设计要点
前言
UVM 阶段按照严格的顺序执行,确保验证环境的正确初始化、运行和结果分析。以下是主要阶段的执行顺序:
Build → Connect → Run → Extract → Check → Report
依赖关系:
Build 阶段必须在 Connect 阶段之前完成,因为需要先实例化组件才能连接它们。
Run 阶段依赖于 Connect 阶段,确保所有通信通道已建立。
Extract 和 Check 阶段依赖于 Run 阶段,因为它们需要仿真结果进行分析。
Report 阶段是最后一个阶段,依赖于所有其他阶段的结果。
以下是一个基于UVM阶段执行顺序的完整验证项目示例,结合阶段依赖关系与典型应用场景:
示例一:AXI总线验证环境
1. 环境结构
class axi_test extends uvm_test;
`uvm_component_utils(axi_test)
axi_env env; // 验证环境
axi_vseq vseq; // 虚拟序列
function void build_phase(uvm_phase phase);
super.build_phase(phase);
env = axi_env::type_id::create("env", this); // 实例化环境
endfunction
task run_phase(uvm_phase phase);
phase.raise_objection(this);
vseq = axi_vseq::type_id::create("vseq");
vseq.start(null); // 启动虚拟序列
phase.drop_objection(this);
endtask
endclass
class axi_env extends uvm_env;
`uvm_component_utils(axi_env)
axi_agent master_agent; // AXI主设备代理
axi_scoreboard scb; // 计分板
function void build_phase(uvm_phase phase);
super.build_phase(phase);
master_agent = axi_agent::type_id::create("master_agent", this); // 实例化组件
scb = axi_scoreboard::type_id::create("scb", this);
endfunction
function void connect_phase(uvm_phase phase);
super.connect_phase(phase);
master_agent.monitor.item_port.connect(scb.imp); // 连接监视器到计分板
endfunction
endclass
2. 阶段执行顺序与依赖实现
阶段 | 代码实现 | 依赖关系说明 |
---|---|---|
Build | 实例化axi_env 、axi_agent 等组件 |
必须优先完成组件创建 |
Connect | 连接monitor 与scoreboard 的TLM端口 |
依赖Build阶段的组件实例化 |
Run | 启动虚拟序列生成AXI事务并驱动到DUT | 依赖Connect阶段的端口连接 |
Extract | 在计分板中收集事务统计信息 | 依赖Run阶段的仿真结果 |
Check | 比较DUT输出与预期值 | 依赖Extract阶段的数据收集 |
Report | 输出覆盖率报告和错误统计 | 汇总所有阶段结果 |
3. 关键阶段代码详解
Extract阶段(数据提取)
class axi_scoreboard extends uvm_scoreboard;
int