UVM搭建简单加法器
参考: 博客https://blog.csdn.net/qq_38113006/article/details/126686692?spm=1001.2014.3001.5502
1. 项目文件结构
##一个八位加法器的uvm验证实例
uvm_adder
├── rtl
│ └── adder.v
└── sim
├── run
| ├── makefile
| └── runlist
│
└── tb
├── env
│ ├── agent_in.sv
│ ├── agent_out.sv
│ ├── env.sv
│ ├── driver_dut.sv
│ ├── driver_in.sv
│ ├── ref_model.sv
│ ├── monitor_in.sv
│ ├── monitor_out.sv
│ ├── scoreboard.sv
│ ├── sequencer.sv
│ ├── virtual_sqr.sv
│ ├── transaction_in.sv
│ └── transaction_out.sv
|
├── seq
│ └── add_base_sequence.sv
|
├── interface
│ └── interface.sv
|
├── tests
| ├── base_test.sv
| ├── order_data_add_test.sv
| └── random_data_add_test.sv
|
└── top
├── tb_top.sv
├── rtl.f
└── test_top.sv
##创建完这个结构可以直接喂给ChatGPT 调教它写一个shell脚本直接生成对应的目录
2. uvm框架
3. 设计描述
- input:reg [7:0] data0, data1 ; in_valid
output:reg [8:0] data ; out_valid
4. 验证中遇到的问题
4.1 用Verdi打开波形文件出现错误, 错误信息如下:
- 提示找不到.fsdb文件。查看对应的makefile文件
verdi:
verdi -ssf tb.fsdb -simflow -simBin ./simv &
- 原因是.fsdb 文件的路径有问题,按照文件生成的.fsdb文件的路径进行更改如下
verdi:
verdi -ssf /home/lzc/practice/uvm_adder/sim/run/order_data_add_test_sim_dir/${TESTNAME}.fsdb -simflow -simBin ./simv &
- 经过上面的更改可以正常的打开Verdi。但是, 是不是可以用相对路径呢?
- 查询相关的Makefile语法:可以通过 $(CURDIR)获取当前工作目录的路径
- 所以上面还可以这样修改:
FSDB_DIR = $(CURDIR)/order_data_add_test_sim_di
verdi -ssf $(FSDB_DIR)/$(TESTNAME).fsdb -simflow -simBin ./simv &
### 先声明一个变量保存.fsdb的前缀路径。在-ssf 后面进行路径拼接即可
4.2 randc变量报错
randc int data0 = -1;
randc int data1 = -1;
randc int ntrans = 10;
- 原因:
由于randc变量的值是由系统时钟和其他因素决定的,因此无法添加软约束。如果需要对randc变量进行约束,可以考虑使用其他随机变量类型,如rand或randc数组。
4.3 用Verdi打开覆盖率报错
COV?=0
ifeq (${COV},1)
COV_COMP_OPT= -cm line+cond+fsm+branch+tgl -cm_dir ./coverage/sim_${TESTNAME}.vdb -cm_hier ./cov.cfg
COV_SIM_OPT= -cm line+cond+fsm+branch+tgl -cm_dir ./coverage/sim_${TESTNAME}.vdb -cm_name ${TESTNAME}
else
COV_COMP_OPT=
COV_SIM_OPT=
endif
verdi:
verdi -ssf $(FSDB_DIR)/$(TESTNAME).fsdb -simflow -simBin ./simv &
merge.vdb:
urg -full64 -format both -dir ./coverage/*.vdb -dbname merge.vdb
cov: merge.vdb
firefox urgReport/dashboard.html &
verdi -cov -covdir merge.vdb &
- 报错提示:
No source data
No source data was supplied to URG.
You may use options like '-dir', '-plan' or '-trend' to specify the source
data. Please run 'urg -help' for information.
- 意思是找不到
./coverage/*.vdb
文件查看文件夹在run目录下有simv.vdb文件, 所以修改Makefile中第十三行
merge.vdb:
@echo $(CURDIR) #输出当前的运行的位置(判断依据)
#urg -full64 -format both -dir ./coverage/*.vdb -dbname merge.vdb
urg -full64 -format both -dir ./*.vdb -dbname merge.vdb
- 代码覆盖率如下:
4.4 功能覆盖率
- 修改对应的sequence中 for循环的值 ,按道理来说功能覆盖率会提升,但是查了半天功能覆盖率都保持不变?
- 原因: tests 目录下有两个文件order_data_add_test.sv 和random_data_add_test.sv 这两个文件的内容完全一样,除了文件名。在test_top.sv文件中先include的文件是random… 文件 所以会执行random 文件,而之前一直修改的文件是order… 文件。
- 覆盖率截图:
4.5 新的问题:
用新的transaction_1 和test_1 利用factory机制与override机制 执行新的transaction结果没有发生变化?? (按道理对其加入的约束会生效)