UVM复位处理指南
如何在UVM中处理复位
1. 简介
在电子设计中,通过专用信号"复位"将设计置入已知状态是基本要求。复位信号的工作流程:
- 上电后断言(Assert)复位信号
- 保持指定时钟周期数(通常)
- 取消断言(De-assert)使设计退出复位状态
- DUT进入规范定义的已知状态
2. 使用UVC生成模块验证的复位信号
2.1 验证环境要求
- 复位过程需同时作用于DUT和测试平台组件
- 需支持初始复位和序列执行中的中间复位
- 必须处理多次复位场景
2.2 UVM阶段机制
使用UVM阶段机制实现复位信号的生成与控制
3. UVM阶段
3.1 阶段分类
类别 | 包含阶段 |
---|---|
构建阶段 | build_phase, connect_phase等 |
运行阶段 | 12个子阶段(含复位相关阶段) |
清理阶段 | extract_phase, check_phase等 |
3.2 复位相关子阶段
graph TD
A[run_phase] --> B[pre_reset_phase]
B --> C[reset_phase]
C --> D[post_reset_phase]
D --> E[其他阶段...]
4. 使用reset_phase生成复位信号
4.1 驱动代码示例
class my_driver extends uvm_driver #(my_transaction);
// pre_reset阶段
task pre_reset_phase(uvm_phase phase);
phase.raise_objection(this);
dut_vi.reset = 1'b1; // 复位准备
#1;
phase.drop_objection(this);
endtask
// reset阶段(低电平有效)
task reset_phase(uvm_phase phase);
phase.raise_objection(this);
dut_vi.reset = 1'b0; // 断言复位
#13;
dut_vi.reset = 1'b1; // 取消复位
phase.drop_objection(this);
endtask
endclass
5. 多复位生成实现
5.1 测试类实现
class my_test extends uvm_test;
int run_count = 0;
function void phase_ready_to_end(uvm_phase phase);
super.phase_ready_to_end(phase);
if(phase.get_imp() == uvm_shutdown_phase::get()) begin
if (run_count <= `no_of_runs) begin
phase.jump(uvm_pre_reset_phase::get()); // 跳转回预复位阶段
run_count++;
end
end
endfunction
endclass
6. 测试平台组件的复位处理
6.1 各组件处理策略
组件 | 处理方式 |
---|---|
Monitor | 复位时停止数据采集,使用fork/disable控制流程 |
Sequencer | 利用UVM阶段跳转自动清除FIFO和进行中事务 |
Scoreboard | 在pre_reset阶段清空队列和数据存储结构 |
Sequence | 通过阶段跳转自动重启序列 |
Assertion | 使用disable iff条件在复位期间禁用断言 |
6.2 Monitor实现示例
class my_monitor extends uvm_monitor #(my_transaction);
task run_phase(uvm_phase phase);
forever begin
@(posedge dut_vi.reset); // 等待复位取消
fork
monitor_items(); // 启动监控任务
join_none
@(negedge dut_vi.reset); // 检测复位断言
disable fork; // 终止监控任务
end
endtask
endclass
6.3 Scoreboard实现示例
class my_scoreboard extends uvm_scoreboard;
my_transaction scb_q[$];
my_transaction scb_q_o[$];
task pre_reset_phase(uvm_phase phase);
scb_q.delete(); // 清空输入队列
scb_q_o.delete(); // 清空输出队列
endtask
endclass
7. 断言处理示例
// 复位期间禁用断言检查
assert property (@(posedge clk)
disable iff (~reset) !(grant0 & grant1)); // 复位有效时禁用断言
关键点总结:
- 利用UVM阶段机制实现系统级复位同步
- 通过phase_ready_to_end实现多复位场景
- 各验证组件需实现阶段感知的复位处理
- 数据存储结构需在pre_reset阶段清空
- 使用disable iff简化断言管理