一、UVM及sequence机制简介
UVM(Universal Verification Methodology)是一种基于SystemVerilog的验证方法学,旨在为集成电路验证提供标准化的框架。UVM的核心组件包括测试平台的层次结构,如environment、sequence、transaction等。其中,环境由多个组件构成,如接口agent、sequencer、driver、monitor、scoreboard等。这些组件协同工作,支持随机测试激励的生成、数据收集及验证覆盖率的统计。典型的UVM平台如下:
相较于testbench的验证方法,UVM搭建了独立且稳定的验证环境,具体的业务验证通过test case实现。同时UVM引入sequence机制负责激励的产生,driver组件仅发送激励,这样做的优势在于,每个验证场景不需要修改driver内容,通过sequence产生不同的激励以满足不同场景的验证需求。
二、base sequence构建方法
对于较大规模的DUT,例如DPU、RDMA等大型设计,在进行具体业务之前往往需要初始化操作,包括寄存器配置、地址分配、控制信息下发等操作,初始化操作对应大部分验证场景都是重复的。因此需要在验证过程中创建一个base sequence类,将重复的操作集中在类里,后续test case的sequence类均为base sequence子类。
1、base sequence的创建
如图示,UVM规定sequence类需要从uvm_sequence派生,对于sequence类而言每个sequence类都应该具有一个body()任务,每个sequence启动的时候都会自动执行该方法
对于base sequence而言,在body任务中加入初始化操作,由于后续所有test case的sequence都从base sequence继承,因此所有sequence均会自动执行初始化操作,大大节省重复的编码工作,同时UVM也提供了pre_body()和post_body()方法,分别对应在执行body任务前后自动执行,用于参数配置等操作,基础的base sequence如下图所示,new函数为语法要求。
2、base sequence的扩展
如上述,base sequence作用在于消除sequence之间的重复操作,步骤1仅是一个基础的base sequence,通过在base sequence中扩展任务,避免test case之间的重复任务。
通常,在base sequence中常采用virtual类型任务,相较于普通任务,virtual类型任务有如下优势:
(1)多态(Polymorphism):通过 virtual 方法,可以实现多态性。即子类可以覆写父类中的 virtual 方法,提供自己的实现版本。这样,在运行时可以根据特定的激励需求改写父类中的方法,提高灵活性;
(2)动态绑定:当一个对象调用一个 virtual 方法时,即使父类的对象引用指向的是一个子类的对象,实际调用的也是子类中覆写的那个方法。
最终base sequence呈现如下图
3、base sequence的使用
base sequence构建完毕后,在case里通过继承base sequence编写测试场景适配的sequence,构建测试场景需要的激励,如下图所示
子类data_tx_sequence继承base sequence,改写了body方法,在body方法中首先调用base sequence的body(),完成DUT初始化操作,并加入调用base sequence中的rand_tx_process()完成一个tx方向的激励构建,同理,将调用方法改为rand_rx_process(),即可完成一个rx方向的激励构建。base sequence的使用极大的降低了test case激励构建的复杂度,模仿body方法的重载方式,对base sequence中的rand_tx_process()加入更为特定的行为,具有很大的灵活性。