一.项目框图
二.项目概述
DUT是一个同向运算放大器,有三种不同的工作状态,分别为idle、设置放大倍数以及放大。为了验证DUT的完备性,在DUT设计代码中故意设置了bug。通过三个测试用例生成随机激励去验证DUT的三种工作状态。在放大的功能测试中,reference_model调用了DPI接口完成。
三.文件内容
1.DUT
输入信号
en 写入状态使能(1为写入有效,0为idle)
set_scaler 设置放大倍数使能(1为设置放大倍数,0为放大)
data_in 输入数据
clk 时钟
rst_n 复位
输出信号
valid 放大状态输出有效标志
data_out 输出数据
scaler 当前放大倍数
三种工作状态
1.idle
en为0,则进入idle状态。
输出valid、data_out均为0。scaler保持不变。
2.设置放大倍数
en为1,set_scaler为1,进入设置放大倍数状态。
输出valid、data_out均为0。scaler=data_in。
3.放大
en为1,set_scaler为0,进入放大状态。
输出valid为1,data_out=data_in * scaler。scaler保持不变。
4.bug
1.设置放大倍数状态,data_in=5时,scaler=55;
2.放大状态,data_in=123时,data_out=12300;
2.object
1.transaction
声明了随机变量,设定约束(例如idle设定在0~2,通过dist设定占比)
域的自动化
2.base_sequence
设置基本方法
例如取一个非bug的随机数(min,max,bug)
3.config
将is_active等配置参数放在一起
在component的build_phase中实例化,然后赋值;
4.sequence_lib
集合了三种工作模式对应的seq;
3.component
1.sqr
new和build,打印创建信息;
(基本没有多余代码)
2.dri
声明了虚接口vif;
根据收到的seq不同,进行对vif不同操作;
在forever或while(1)中进行get_next_item;
3.mon
声明了虚接口vif;
声明了TLM端口ap;
收集trans并计数(若seq是wr_base_num,i_mon计数;valid为1,o_mon计数)
4.agent
只有一个成员变量is_active;
根据cfg传递的is_active的值例化dri\mon\sqr;
将dri和sqr的端口相连
5.reference_model
实例化两个端口(在env连接过了);
import DPI接口;
做运算并把结果复制后发给scoreboard;
6.scoreboard
从两个端口获取数据并比较计数
7.env
实例化i_agt、o_agt、reference_model、scoreboard以及3个fifo端口;
连接fifo的六个端口;
比较i_agt和o_agt的数量
8.base_test
实例化env;
在report_phase中定义了err_num统计UVM_ERROR的值;
9.test_case
继承于base_test(所以不需要额外例化env);
使用uvm_config_db将sqr的default seq设置为配套case的seq;
4.interface
设置时钟块;
覆盖率收集(也可以放到mon);