UVM中断处理机制
1. 中断处理概述
在SoC系统中,中断作为IP模块的边带信号,通常通过中断控制器传递至CPU。主要应用场景包括:
graph TDA[中断源] --> B[中断控制器]B --> C[CPU响应]C --> D[执行ISR]
2. UVM实现方案
2.1 核心机制
- 使用
grab()
/ungrab()
实现序列抢占 - ISR序列优先获得sequencer控制权
- 支持多级中断嵌套处理
2.2 架构设计
class top_level_seq extends uvm_sequence #(transaction);// 主序列与中断监测并行执行forkMAIN_SEQ.start();forever beginforkwait_for_IRQ0();wait_for_IRQ1();wait_for_IRQ2();wait_for_IRQ3();join_anydisable fork;ISR.start(); // 触发中断服务endjoin_any
endclass
3. 关键代码实现
3.1 顶层序列结构
class top_level_seq extends uvm_sequence #(transaction);`uvm_object_utils(top_level_seq)task body;fork// 主业务流main_seq.start(m_sequencer);// 中断监控流beginforever beginforkINT_CONF.wait_for_IRQ0();INT_CONF.wait_for_IRQ1();INT_CONF.wait_for_IRQ2();INT_CONF.wait_for_IRQ3();join_anydisable fork;isr.start(m_sequencer);endendjoin_anyendtask
endclass
3.2 中断服务例程(ISR)
class isr extends uvm_sequence #(transaction);`uvm_object_utils(isr)task body;m_sequencer.grab(this); // 抢占sequencer// 读取中断状态寄存器read_status_reg(32'h0010_0000);// 根据中断位清除状态if (status[0]) clear_irq(0);if (status[1]) clear_irq(1);if (status[2]) clear_irq(2);if (status[3]) clear_irq(3);m_sequencer.ungrab(this); // 释放sequencerendtask
endclass
4. 关键技术点
4.1 序列抢占机制
方法 | 作用描述 | 使用场景 |
---|---|---|
grab() | 独占sequencer资源 | ISR开始前 |
ungrab() | 释放sequencer控制权 | ISR完成后 |
lock() | 排队等待sequencer(非抢占) | 优先级较低的中断 |
unlock() | 释放lock获得的sequencer控制权 | 顺序任务处理 |
4.2 中断优先级处理
graph LRIRQ3-->IRQ2IRQ2-->IRQ1IRQ1-->IRQ0style IRQ3 fill:#f96style IRQ2 fill:#f96style IRQ1 fill:#f96style IRQ0 fill:#f96
5. 验证注意事项
- 中断竞争条件测试
- 嵌套中断处理验证
- 中断屏蔽功能检查
- 中断响应时间测量
- 多核场景下的中断路由
6. 典型调试场景
`uvm_info("ISR_DEBUG", $sformatf("检测到IRQ[%0d]触发", irq_id), UVM_LOW)
`uvm_info("ISR_DEBUG", "开始清除中断状态", UVM_MEDIUM)
`uvm_info("ISR_DEBUG", "sequencer控制权已释放", UVM_HIGH)
7. 最佳实践
- 为不同中断源创建独立ISR序列
- 在virtual sequence中协调多个中断
- 使用config_db动态配置中断优先级
- 添加覆盖率收集点:
covergroup interrupt_cg;coverpoint irq_id {bins irq0 = {0};bins irq1 = {1};bins irq2 = {2};bins irq3 = {3};}
endgroup
重要提示:
- grab/ungrab需成对使用以避免资源锁死
- ISR执行时间应短于中断间隔
- 建议结合uvm_event实现跨组件同步