IC验证总结
描述: 新手在验证环境搭建和验证过程中的遇到过的一些问题总结,以及一些注意事项
- 在编译flist.f中的文件时,需要注意文件顺序的问题;
- 在top_tb中include文件也需要注意文件的顺序问题;
- 有时编译过程中,会出现该文件重复编译,需要注意;
- 在编译的过程中,若根据提示的错误进行查找错误,未能找到错误,则可能原因是include中的文件缺少了endmodule/endclass关键字,如下图所示的错误:
- 编译时出现vaild type的问题时:
该pkg文件未import进去
- ralf文件问题:域宽度的定义和后面的花括号之间需要一个空格,否则ralgen工具会报错
- new的问题
没有new一下
- write(T t)
T t是函数的形参,下面coverage group里面用的是analysis_txn,所以需要把t的值赋值给analysis,t的值是从外面ap.write(tr)自动传进来的;使用过程中,可以在前面直接声明apb_seq_item t,但是还是得this.t=t,然后在coverage group里面换成t。
- vcs命令中修改测试中的参数问题:
uvm里面有一个uvm_cmdline_processor,可以获取在编译时添加的自定义参数
class spi_base extends spi_base_test;
`uvm_component_utils(spi_base)
bit cpol;
uvm_cmdline_processor clp;
string arg;
function new(string name = "spi_base",uvm_component parent=null);
super.new(name,parent);
clp=new();
if(clp.get_arg_value("+cpol=",this.arg))begin
this.cpol=this.arg.atoi();
`uvm_info(get_full_name(),$sformatf("cpol=%b",cpol),UVM_LOW)
end
endfunction
endclass
//makefile
N=0
test=spi_dut_mst_mode_test
test_id +=$(test)_$(N)
CPOL=1
compile:
vcs -full64 -sverilog -f flist.f -ntb_opts uvm-1.1 -debug_access+cbk
run:
./simv -l logs/${test_id} +ntb_random_seed=$(seed) +UVM_TESTCASE=$(test) +cpol=$(CPOL)
regr:
make compile
make run test=spi_dut_mst_mode_test CPOL=1 N=0
make run test=spi_dut_mst_mode_test CPOL=0 N=1
- 仿真过程中0长度glitch的问题
(1) 代码:
(2) 激励:
(3) 仿真波形:
(4) 问题描述:
输入信号spi_nss_pin一直是低,但是最后spi_nss_d2会有一个很小的脉冲
(5) 问题原因:
pin上0glitch被打中了,具体就是这段fork-join没有消耗时间就结束了,所以赋值0后马上赋值1又变回0,所以波形上没有显示跳变。
(6) debug:在vcs中的run加上option:+fsdb+delta,dump出来的波形才可以将glitch显示出来
(7) 修改意见:写driver驱动时,信号赋值要用"<=“,不要用”="。
- vcs 仿真
可以在vcs中中加入option:-debug_access+cbk来代替上图中圈出的部分,这个参数的作用是让vcs自动设置novas.tab和pli.a两个文件,避免了写一长串,简单方便。
- sva参数设置
./simv仿真中加入参数:
-assert success 表示断言成功的会在log中显示信息
+fsdb+sva_success 表示将断言加载到fsdb中,verdi可以在波形查看相关断言的结果
- 仿真卡住的问题:
一般这种情况下检查while等死循环语句,解决办法是while里一定要加上消耗仿真时间的语句,或者加上延时
- SystemVerilog中ref关键字作为前缀,表明参数是使用引用:
(1) 在需要的方法中修改类中参数值的时候,需要在参数前加上ref,尤其是句柄,否则在方法内部对参数的修改不会被调用方法的代码看到;
(2) ref参数只能用于带自动存储的子程序中,若程序或者模块指明了automatic属性,则子程序都是自动存储的;如果不希望子程序修改数组的值,则使用const ref 类型
- Vergi中如果在波形中通过原理图的等方式无法显示状态机的名字,可以在verdi中加入命令参数-autoalias
- 关于Verdi中信号无法添加的问题:
(1) 没用-ssf命令选项或gui中鼠标选中的方式加载波形文件;
(2) 加载了波形文件,但是波形文件没有dump你需要的层次或者需要的信号;
(3) 加载了波形文件,但是verdi吃进去的filelist和vcs吃进的filelist有差别,也就是说波形文件和filelist不对应;
(4) 加载了波形文件,verdi吃进的filelist和vcs吃进的filelist完全一致,但是你对rtl文件做了修改,模块或者信号可能已经不存在了;
(5) 加载进去的波形文件很小,其实只是个信号的符号表,本质上还没有波形文件,或者波形文件还在内存中没有刷金硬盘,可以在ucli的promt下fsdbDumpflush一下把内存中的波形文件手动刷到硬盘中,然后在verdi中shift+l重新加载下波形;
(6) 临时文件问题,把中间文件全部clean了再重新run一次;
(7) 其他问题:
需要注意的是$fsdbDumpfile(“tb.fsdb”)一定是在其他fsdbDump参数的前面,否则会生成默认的novas.fsdb,同时也会有tb.fsdb文件生成,但是会发现tb.fsdb文件会很小,但是这个时候还是用verdi去打开tb.fsdb,去添加信号就会无法添加。
同时还需要注意的是:
//(1)
initial begin
\$fsdbDumpfile("tb.fsdb");
\$fsdbDumpvars();
end
//(2)
initial begin
\$fsdbDumpMDA();
end
以上(1)和(2)在tb_top中,如果(2)写在(1)部分的前面,也会出现生成默认的novas.fsdb文件,就是上面说的这种> 情况,所以其他 f s d b D u m p 参 数 一 定 保 证 写 在 fsdbDump参数一定保证写在 fsdbDump参数一定保证写在fsdbDumpfile()的后面,最好是将所有的$fsdbDump参数都写在一个initial块中。