UVM复位处理指南

如何在UVM中处理复位

1. 简介

在电子设计中,通过专用信号"复位"将设计置入已知状态是基本要求。复位信号的工作流程:

  1. 上电后断言(Assert)复位信号
  2. 保持指定时钟周期数(通常)
  3. 取消断言(De-assert)使设计退出复位状态
  4. 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));  // 复位有效时禁用断言

关键点总结

  1. 利用UVM阶段机制实现系统级复位同步
  2. 通过phase_ready_to_end实现多复位场景
  3. 各验证组件需实现阶段感知的复位处理
  4. 数据存储结构需在pre_reset阶段清空
  5. 使用disable iff简化断言管理
posted @ 2025-03-03 21:43  LeslieQ  阅读(110)  评论(0)    收藏  举报