三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

从Monitor到Scoreboard:一个芯片验证VIP的‘养成’全流程拆解(基于UVM)

从Monitor到Scoreboard:一个芯片验证VIP的‘养成’全流程拆解(基于UVM)

从Monitor到Scoreboard:一个芯片验证VIP的‘养成’全流程拆解(基于UVM)

在芯片验证领域,验证IP(VIP)已经成为现代SoC验证不可或缺的核心组件。作为一名深耕验证技术多年的工程师,我见证了VIP从简单的协议检查器演变为如今功能完备的验证解决方案的全过程。本文将带您深入VIP开发的完整生命周期,揭示如何从零开始构建一个基于UVM的、工业级可用的验证IP。

1. VIP开发的基础架构设计

1.1 协议特性提取与需求定义

任何VIP开发的第一步都是深入理解目标协议规范。以AXI总线协议为例,我们需要提取以下核心特性:

  • 通道分离特性:独立的地址、写数据、读数据通道
  • 突发传输机制:INCR/WRAP/FIXED模式的支持
  • 事务ID管理:多事务并行处理能力
  • 响应类型:OKAY/EXOKAY/SLVERR/DECERR

这些特性需要转化为可验证的属性,形成如下验证计划表格:

特性类别验证点描述优先级覆盖类型
通道握手各通道valid/ready时序关系P0断言覆盖
突发传输WRAP模式地址边界检查P1功能覆盖率
事务IDID唯一性检查P2交叉覆盖率

1.2 UVM组件架构设计

基于UVM的VIP需要精心设计组件层次结构。一个典型的Master Agent架构如下:

class axi_master_agent extends uvm_agent; `uvm_component_utils(axi_master_agent) axi_master_driver driver; axi_sequencer sequencer; axi_master_monitor monitor; axi_cov_collector cov_collector; function void build_phase(uvm_phase phase); if(get_is_active() == UVM_ACTIVE) begin driver = axi_master_driver::type_id::create("driver", this); sequencer = axi_sequencer::type_id::create("sequencer", this); end monitor = axi_master_monitor::type_id::create("monitor", this); cov_collector = axi_cov_collector::type_id::create("cov_collector", this); endfunction endclass

注意:Agent的active/passive模式配置应通过uvm_config_db实现,确保运行时灵活性

2. 核心验证组件的实现

2.1 Monitor的实现策略

Monitor作为VIP的"眼睛",需要处理三大核心任务:

  1. 协议检查:实时监测信号行为是否符合协议规范
  2. 事务提取:将信号级活动转换为事务级对象
  3. 覆盖率收集:标记已观测到的协议场景

以下是一个简化的AXI读事务监测代码片段:

task axi_monitor::run_phase(uvm_phase phase); forever begin @(posedge vif.clk); if(vif.ar_valid && vif.ar_ready) begin axi_transaction trans = axi_transaction::type_id::create("trans"); trans.trans_type = AXI_READ; trans.addr = vif.ar_addr; trans.burst_type = vif.ar_burst; // 其他字段提取... analysis_port.write(trans); end end endtask

2.2 Scoreboard的设计模式

Scoreboard验证数据完整性的常见模式包括:

  • 数据比对:比较发送与接收的数据一致性
  • 顺序检查:验证事务顺序是否符合预期
  • 延时分析:统计各类事务的延迟分布

推荐采用UVM TLM FIFO实现高效的事务比对:

class axi_scoreboard extends uvm_scoreboard; uvm_tlm_analysis_fifo #(axi_transaction) exp_fifo; uvm_tlm_analysis_fifo #(axi_transaction) act_fifo; task run_phase(uvm_phase phase); axi_transaction exp_trans, act_trans; forever begin exp_fifo.get(exp_trans); act_fifo.get(act_trans); if(!exp_trans.compare(act_trans)) begin `uvm_error("MISMATCH", "Transaction comparison failed") end end endtask endclass

3. 验证环境的深度构建

3.1 断言与功能覆盖率的协同设计

高效的VIP需要断言(assertion)和功能覆盖率(functional coverage)的紧密配合:

  • 断言:确保协议规则不被违反(安全性)
  • 功能覆盖率:确保所有场景都被验证(完备性)

以下是一个AXI协议的并发断言示例:

property axi_valid_ready_handshake; @(posedge clk) disable iff(!resetn) $rose(valid) |-> ##[0:MAX_WAIT] ready; endproperty assert_valid_ready: assert property(axi_valid_ready_handshake) else `uvm_error("ASSERT", "Valid-ready handshake violation")

对应的功能覆盖率组定义:

covergroup axi_burst_cg; burst_type: coverpoint trans.burst_type { bins incr = {AXI_INCR}; bins wrap = {AXI_WRAP}; bins fixed = {AXI_FIXED}; } burst_length: coverpoint trans.burst_len { bins len_1 = {0}; bins len_2_4 = {[1:3]}; bins len_8 = {7}; } cross burst_type, burst_length; endgroup

3.2 回归测试框架的构建

成熟的VIP需要建立自动化回归测试系统,关键组件包括:

  1. 测试套件组织:

    • 基础功能测试
    • 边界条件测试
    • 错误注入测试
    • 性能压力测试
  2. 结果分析机制:

    • 通过/失败统计
    • 覆盖率收敛趋势
    • 运行时间监控
  3. 持续集成支持:

    • 与Jenkins/GitLab CI集成
    • 夜间回归测试
    • 覆盖率自动合并

4. 商用VIP的协同验证策略

4.1 黄金参考模型验证法

利用商用VIP验证自研VIP的典型流程:

  1. 环境配置阶段:

    • 商用VIP设为ACTIVE模式
    • 自研VIP设为PASSIVE模式
  2. 验证执行阶段:

    • 商用VIP生成激励
    • 自研VIP监测并比对行为
  3. 结果分析阶段:

    • 比对监测结果差异
    • 分析覆盖率缺口

4.2 混合模式验证技巧

当同时验证Master和Slave组件时,可采用以下配置:

验证目标商用VIP模式自研VIP模式
Master验证Slave ACTIVEMaster PASSIVE
Slave验证Master ACTIVESlave PASSIVE
端到端验证全PASSIVE全ACTIVE

这种配置可以最大化利用商用VIP的验证能力,同时确保自研VIP的每个组件都得到充分验证。

← 返回列表