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,也可以在保留基础框架的情况下,快速的扩展原有环境,实现新增功能的测试。