0%

IP验证环境及水平复用


1 IP环境结构

UVM验证的核心思想是复用,分为水平复用和垂直复用,以及跨平台复用。针对IP的验证环境,需要做到水平复用。

可复用的ip环境结构如图所示:

basetest中主要包括base_test_cfg,reg_model,ddr_mem和env四个部分。

base_test_cfg作为整个testcase的最顶层的配置,其内部包含了env_cfg和一些配置变量

reg_model在basetest中例化配置连接,并将其发送到env_cfg中

amba_vip中涉及到ddr_mem的,ddr_mem在basetest中创建,并将发送到env_cfg中

环境的env中有以下几个部分:

  • virtual sequencer:所有sequencer的句柄都在virtual sequencer中
  • reference model:参考模型
  • scoreboard:用于比较参考模型和DUT输出的数据
  • 各个agent:分别用于发送和收集transaction
  • amba env:amba vip的顶层环境包括axi,ahb,apb,其配置在env_cfg中例化
  • env cfg:严格来说不属于env的组件,它是环境的配置文件。包含各个agent的配置以及amba vip的配置。env cfg会被virtual sequencer,reference model,scoreboard所共用
  • virtual sequence严格来说不属于env的组件,它是在basetest中启动在virtual sequencer上的顶层sequence,在其中需要根据需求在对应的sequencer上启动所需的sequence(包括agent seuqence和amba vip sequence)

2 IP环境目录

2.1 config文件夹

constraint_common.sv中主要包括一个constraint和一个post_common_randomize函数,都在system_cfg class中

coverage_common.sv文件是system_cfg class中的覆盖组的定义

include文件夹下都是根据寄存器列表直接生成的文件,不需要手动修改

config.f是所有config的filelist,其中包括将当前文件夹加入incdir和config_pkg.sv

config_pkg.sv定义了config_pkg,其中主要的是三个类:uvm_reg_config_base,system_cfg和amba的配置类。根据环境的层级,是否有寄存器以及是否有amba vip来选择性地将这三个类加入到pkg中

coverage.cfg 覆盖率配置文件,产生代码覆盖率需要用到

cust_svt_amba_system_configuration.sv是vip的配置类,主要包括四个set_amba_sys_config,set_axi_system_configuration,set_ahb_system_configuration,set_apb_system_configuration,都是配置各个vip的具体配置,详情请阅读该文件,模板中给出的是1个axi system两个ahb system和两个apb system的配置

optconfigfile.cfg设置covergroup不会自动生成cross的coverpoint

system_cfg.sv继承自uvm_reg_config_base,拥有所有寄存器列表的参数作为变量。class的外面包含了两个全局变量,用于记录寄存器的值和与cmodel做交互的cmodel_struct。class内部包含了constraint_common.sv(约束)和coverage_common.sv(覆盖组)。在pre_randomize函数中通过clp获取或有的寄存器的值。save_config_to_file函数会将所有的配置打印成文件方便debug

2.2 doc文件夹

README.yaml 描述环境的一些常见使用方法

2.3 env文件夹

env.f 环境的filelist,其中包括用户自定义的宏定义、整个dut的接口、如果是soc环境还有子环境的env的filelist、各个agent的filelist、config的filelist、transaction的filelist、env_pkg、equence的filelist以及宏定义的undef

env.sv 包含子环境,vip环境各个agent 与agent相关的fifo的声明例化和连接。并且环境中也做了cfg配置和ddr_mem的逐层传递。reset_phase中做了所有fifo的清空

env_cfg.sv 如果是soc环境,该env_cfg中会包含子环境的env_cfg,而soc和ip的env中都会有agent的cfg,amba_vip的cfg(根据选项产生)。gen_one_frame函数用于生成一帧的寄存器配置并将配置放入到一个队列中。save_config_amd_sample_cov函数用于保存配置文件,并做覆盖率的sample

env_cov.sv 没有用到的覆盖组件,现阶段覆盖率都在coverage_common.sv中实现

env_pkg.sv包含所有的env的calss:寄存器模型,env_cfg,env_cov,virtual_sequencer,scoreboard,reference_model和env

reference_model.sv中有所有的agent进来的port,port进来后存储的queue,以及自动将port中的数据放到queue的task。整个reference model的流程是从port中拿tr,处理tr并生成输出的tr,将tr发送到对应的port上给scoreborad

scoreboard.sv用于将从dut和reference model过来的数据做对比,或者将cmodel输出的文件和ddr_mem中的数据做对比

uvm_reg_block.sv 寄存器模型,顶层环境的寄存器模型会集成底层环境的寄存器模型,最底层的ip环境的寄存器模型用脚本自动生成

virtual_sequencer.s包括是所有agent的sequencer,amba_vip的sequencer,以及子环境的virtual_sequener

2.4 param_def文件夹

defines.sv中是agent的数量定义的宏以及用户自定义的宏

svt_amba_user_defines.sv中是amba_vip的一些常用宏定义,但是都是注释掉的,需要根据项目需求手动打开

undefines.sv用于解除defines.sv中的所有宏定义防止多个环境复用的时候宏定义重复

2.5 sequence文件夹

amba各个协议的master和slave sequence

reg_csr_sequence.sv中如果是soc就调用子环境的reg_csr_sequence,如果是IP环境就会做脚本自动生成的九步法测试

reg_init_sequence.sv中是调用脚本自动生成的task用于配置寄存器

reg_isr_sequence.sv中通过配置ip启动寄存器后等待中断的流程

reg_sequence_base.sv init和isr sequence的基类,包含了所有需要用到的task

sequence.f filelist

sequence_pkg.sv sequence的package

virtual_sequence.sv 环境的virtual sequence在testcase中的main_phase中运行。所有的子sequence包括寄存器相关的sequence,vip相关的sequence以及agent上的sequence都在这个sequence中统一调用。如果是soc的环境还会自动调用子环境的virtual sequence

2.6 sim文件夹

clean.sh运行清理脚本,会删除除了波形和回归文件夹外的其他所有运行过程中生成的文件

gen_reg.sh 生成寄存器相关的文件脚本,需要手动更改部分配置,该脚本可以通过dvsim脚本调用

gen_so.sh 生成so的脚本,dvsim调用这个文件时需要加-cmodelgen选项

load 波形加载脚本执行后可以打开波形

sim_run_options 运行过程的option配置,已经添加了最基本的选项

SourceMe 环境变量设置,在运行仿真之前都需要source这个

vcs_build_options vcs编译时需要用到的所有选项

2.7 testcase文件夹

base_test.sv里面的功能包括:

  • ddr_mem的例化
  • amba vip transaction的重载
  • env_cfg的传递到env
  • 配置所有的时钟和reset
  • 调用gen_one_frame和save_config_and_sample_cov
  • 创建寄存器模型
  • 将寄存器模型句柄传递到env_cfg
  • 将ddr_mem传递到env_cfg
  • 将ddr_mem传递给vip实际使用的slave
  • connect phase做寄存器adapter的连接
  • end_of_elaboration_phase中提供了一些常用功能的代码
  • run_phase一般不用
  • reset_phase中对ddr_mem做随机初始化,并在时钟复位接口上输出reset信号
  • main_phase中调用virtual_sequence

base_test_cfg.sv包含一些调节vip响应的变量,所有agent的配置文件,如果是soc环境还需要手动配置所有子环境的agent的模式和子环境中vip的模式

csr_test.sv 寄存器测试专用case,case中调用csr_test_sequence

random_dist.sv 随机分布专用case用于统计随机值的分布

test_pkg.sv包含所有的testcase文件夹下的calss

tescase.f testcase filelist incdir和test_pkg

2.8 top_tb文件夹

all_so.f 所有需要用到的so库文件都要写在这里,名称不带后缀”.so”

dump.sv dumpfsdb的代码,会被include到top_tb中

if.sv 整个dut的interface

rtl.f rtl的filelist,需要自己添加filelist

run.f 验证环境的filelist基本不需要修改

top_tb.sv top_tb 包括所有interface dut的例化连接和configdb传递到env中

2.9 transaction文件夹

cmodel_transaction.sv 用于cmodel的transaction,做reference和scoreboard之间的传递

amba vip的transaction 主要做重载用,修改transaction的约束,修改概率分布

transaction.f filelist

transaction_pkg.sv 封装成package

user_defined_transaction.sv 冗余transaction,类似callback的作用,有需要再用,没需要留空

2.10 yaml文件夹

包含所有测试阶段的yaml文件

生成的文件夹中会自带两个yaml文件,一个用于寄存器测试,一个是写yaml的例子


3 水平复用

Environment, Agent, Configuration, Sequence, Register model都能够水平复用,组件需要具有以下特点:

  • 结构的通用性
  • 功能的完备性
  • 配置的可扩展性

3.1 ENV复用

为保证复用性,所有Env具有通用的结构,且所有组件均从dv base env继承而来。包括以下:

dv_base_env:所有组件的例化,fifo的连接

dv_base_env_cfg:

  • 各种环境配置和lantency配置
  • 寄存器模型的句柄ral

dv_base_ref_model

dv_base_scoreboard

dv_base_virtual_sequencer

dv_base_test

dv_base_pkg:将所有的dv_base类打包到dv_base_pkg中

3.2 AGENT复用

为保证复用性,所有Agent具有通用的结构,且所有组件均从dv base agent继承而来。包括以下:

dv_agent: 所有agent内部组件的例化连接

dv_agent_cfg: agent的配置文件

dv_driver: 复位和驱动

dv_monitor

dv_sequencer:mon2sqr_port,req_port和rsp_port的例化

dv_agent_pkg:将所有的dv_agent类打包到dv_agent_pkg中

3.3 Sequence复用

Sequence通用结构如下图所示,主要分成三个组件:

  • Atomic sequence : 完成基础操作
  • BFM sequence : 基于atomic seuqnce,实现总线行为
  • Scenario sequence : 基于BFM sequence,实现具体场景
3.3.1 Atomic Sequence

原子sequence仅实现最基本的操作,比如发送trans,接收rsp。

3.3.2 BFM sequence

BFM sequence实现跟总线行为相关的操作,这一部分应该根据标准协议来实现,然后调用Atomic sequence完成发送和接收。

3.3.3 Scenario sequence

场景sequence就是特性的测试场景,调用BFM sequence来实现。这种结构可以完全复用Atomic Sequence和BFM sequence。对于新增的场景测试,也能方便的调用BFM来实现。


4 总结

基于特定框架的Agent,Env和Sequence结构,在不同项目之间,能够复用绝大部分代码和sequence测试场景。对于新增的feature,也可以在保留基础框架的情况下,快速的扩展原有环境,实现新增功能的测试。