IC验证总结

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参数一定保证写在 fsdbDumpfsdbDumpfile()的后面,最好是将所有的$fsdbDump参数都写在一个initial块中。

  • 3
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值