验证经验乱记

ucli调试

获取当前仿真时间:1.senv time;2.call {$realtime}

想要在ucli模式中使用fsdbDumpxxx命令,必须在simv中加-ucli命令进入到ucli模式,仿真时直接ctrl+c进入ucli模式则不行,且-ucli后需指定需执行的命令文件,如-i ucli.cmd,文件里写run即可,否则进入ucli模式后不会继续仿真;LD_LIBRARA_PATH库也要设置,可参考手册。

dump波形

ucli dump波形命令:

$fsdbAutoSwitchDumpfile(10, "test.fsdb", 20); // 10M, 20 files max
$fsdbDumpvars(0, top, "+fsdbfile+novas.fsdb");//指定波形名称,dump top波形,+all则dump所有,+mda则dump多维数组。如果是命令行模式,则是:fsdbDumpvars 0 top +fsdbfile+novas.fsdb

变量声明的位置

放在最前边,出现代码块之后,就不能再声明变量了。

int a;
repeat(10) begin
    xxx;
end
int b;//syntax error,this line should be in front of repeat block

vcs可以设置变量的初值:+initreg+...

force限制:force dut信号的右端一定要是静态的值,class里一般都是动态的,除非手动声明为static类型。(可以借用interface/bind module来实现,具体是在interface中增加trigger/dis-trigger/value三个值,在interface中使用always块force dut信号,在class中驱动trigger/value/dis-trigger?)

vcs编译无法识别uvm类,报错"uvm_sequence_item should be a valid type",是因为uvm_pkg没有正确的导入,解决办法:

        1.import uvm_pkg::*,如果import后仍然识别不了uvm_seq_item时,可能是import的位置不对,比如在program里import时,只对program里有效,所以改为在program外import,就全局有效了。

        2.加编译选项:+ntb_opts uvm

        3.设置UVM_HOME环境变量指向uvm_pkg目录

vcs编译报错:Replacing interface cell in logical library not yet supported。原因是interface include了两次

program xxx没运行:可能存在多个顶层,但没在编译选项中使用-top xxx+yyy+zzz指定顶层,或者只指定了别的顶层。当然,program xxx也可以在别的顶层下实例化,这样就不用指定xxx为顶层了。

波形代码不匹配问题

1.波形和代码版本不匹配,尝试shift+L重载,检查sim log是否新生成了波形。

2.多驱动问题,可能是force了信号,或者一个 信号通过接口连接了多驱动(这个问题比较隐蔽),可通过观察drivern显示的驱动情况检查是否有多驱动问题,如果1个信号存在多个驱动,且分布在不同的instance里,大概率是有问题的。双击信号跳到的地方不一定是其真正的驱动处。

下图所示的情况就是,assign赋值左右两边的信号,在波形上不一致,在排除了代码波形版本不一致的情况下,基本可以判断是多驱动的问题了,双击又发现存在多个驱动,但由于使用了generate和同一module多次例化,不好直接判断是否多驱动,最终一步一步找信号连接,在顶层发现了多驱动问题:信号位选存在重复。

代码结果和预期不符问题

1.可能运算符优先级的问题,比如1+x?y:z,其中,+优先级最高,?:优先级最低;a&&b==c,其中==优先级高,&&优先级低。避免此问题的方法是加括号。

  

运算位宽

等式右边计算时按最宽的位数进行计算,直接赋值给左边时,结果按左边位宽进行赋值,如果计算后又进行了其他操作,比如拼接{},位宽则按右边最宽位宽进行赋值,可能导致截位,比如 

wire signed [7:0] a;

wire signed [15:0] b;

wire signed [16:0] sum;

wire signed [23:0] prod;

sum = {a + b};

prod = (a * b) >>> 7; 

这两个赋值都会因计算后进行了其他操作而导致结果位宽为16,最终赋值后得到意外的结果。

有符号数除法时,比如/8,可以使用算数右移>>>3,不能直接使用/8,比如a/8,会先根据a的符号计算a的值,再/8,比如fc/8,结果为0,而使用算数右移,则结果为ff(-1)。无符号数,算数和逻辑移位相同。

有符号数和parameter类型比较大小时,parameter需要声明成bit signed [m:n]类型,才能把两个数都当成有符号数(任意一个操作数为无符号数时,有符号操作数也会被当成无符号数进行运算)

拼接:

多层拼接时,每一层都需要用{}包起来,比如:a={1'b0,{{DW-1}{1'b1}}};

编译warning

要看,可能有意外收获,比如 port connection width mismatchselect index out of bounds等。

增量编译-M

此选项开启时,如果只是修改了编译选择+incdir,可能是不会重新编译的,比如不同目录有两个同名文件,+incdir顺序决定了编译时选择哪个目录的文件:编译先incdir的目录下的文件,此时修改了incdir顺序后,不会重新编译,这个问题容易被忽略,需要删除work目录重新仿真。

平台中获取仿真种子的方法:$get_initial_random_seed,前提是设置了+ntb_random_seed=value,或者+ntb_random_seed=value,否则返回初始seed 1.

有符号型表示方法:bit signed [6:0]

parameter声明时钟频率时,要声明为real型:parameter SYS_CYCLE=1.0

function & task

function调用时可作为返回值,需要时需要声明位宽:function int xxx();

task没有返回值,但可通过在形参中声明output,或ref类型的参数,间接返回值。

合并数组

for(int i=0;i<NUM;i++) begin xxx=xxx[nn][i*2-1:i] end,编译会报错说不能这样位选,但可通过修改xxx为合并数组解决(只适用于各部分位宽一致情况):

bit [x:0][y:0] xxx[z];

for(int i=0;i<NUM;i++) begin xxx=xxx[n][i]; end 可通过编译。

仿真提速:

  1. Simprofile统计资源占用:vcs -simprofile;simv -simprofile time,可分析哪部分代码是速度瓶颈,time+mem还可看资源占用
  2. VCS编译选项 rad作用:优化设计,加速仿真
  3. 关闭不使用的模块的时钟,可以加速仿真,接近于没例化模块。

-timescale指定的内容是给编译时未指定timescale,且之前编译的文件也没指定timescale的文件使用的。如果想统一使用一个timescale,可以使用-override_timescale选项。

反压映射:反压测试不要单纯的从入口直接给反压,可以设置整形起反压,这样从流量上方便检测是否反压相互影响。

verdi:

可通过preference中设置source view,进行代码的折叠,包括generate产生的块,宏等,还可设置折叠false代码(波形光标时间点处不会执行的代码),方便浏览。

Verdi debug调试时,如果想看interface波形,需要先dump,再add to waveform,否则波形里显示的interface内信号可能不符预期,有些可能不显示,尤其是涉及VIP时。

尽量在class里定义变量。可以对其进行非阻塞赋值,在方法里定义的变量则不可以,编译报错说automatic型不能非阻塞赋值,那意思class里定义的变量不是automatic型。可以通过非阻塞赋值实现打一拍功能。

verdi里批量拷贝信号名:source-find signal,用*筛选出特定名称的信号,保存。就可以得到信号路径名的文本了。

导出波形成文本格式:使用verdi自带的fsdbreport命令,具体查verdi手册,可以使用表达式,可以指定开始结束时间,导出数据格式等,十分方便。

毛刺:波形dump毛刺需要在run option中加 +fsdb+delta。覆盖率有时候会因为毛刺而产生意外的结果,这时候需要在收集时去掉毛刺:–cm_glitch 0。平台里想要去掉毛刺的影响,则需要在时钟延时对有毛刺的信号进行采样,尽量不要直接@有毛刺的信号,会有意外的结果。查看毛刺:在Verdi菜单中选择“view->Expand Delta->Expand/Collapse Time at Cursor”。

波形显示状态机名称:


ahb:

由于从机的ready拉低导致的数据暂停,之后在ready拉高后,直接传输,不需看htrans状态;同时下个传输(上个burs完成)需要看htrans。


文本处理:

Sed: 

/aa/s/bb/cc/g 表示所有匹配aa的行,进行bb到cc的替换

1,2p表示打印1~2行

/aa/,/bb/p 功能同上,匹配aa的行,到匹配bb的行,进行打印

Sed -i.bak备份

awk:

Linux awk 命令 | 菜鸟教程 (runoob.com)

cd:

cd - 返回上一层

find:

find . -size +1G -exec ls -lh {} \;  查找并打印大于1G的文件

find . -cmin +60 查找60min前changed的文件(对应ll列出的文件时间项,+表示da,-表示之后)

svn:

svn st出现~标志时,需要svn revert将其更新成最新版本文件,否则无法ci。

  • 6
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值