进行前端验证时,参考模型是动态仿真不可或缺的。
通过给RTL和参考模型施加同样的激励,然后对它们的输出进行bit-true match检查,从而确保RTL行为的正确性。
参考模型可能是用C/C++、Matlab、Python等语言写的,这时候就需要考虑TB和参考模型之间的接口了。
常见的做法主要两种:1.通过DPI函数 2.通过文件交互 ,各有利弊。
Q哥今天要说的bug,就是文件交互引发的。
本文由“壹伴编辑器”提供技术支持
如上图所示,在TB里通过Sequencer产生随机激励信号并打印激励文件,分别送给DUT和参考模型。
参考模型解析激励文件并执行后,打印结果文件。
在Scoreboard里抓取DUT的执行结果,然后解析参考模型输出的结果文件,进行比对。
这里简化了Driver和Monitor等细节,不影响问题的分析。
Q哥首先遇到的现象是结果比对失败。
出现这情况,当然第一时间看波形和log了。
进而发现,参考模型给的结果都是0.
检查了一下激励文件,正常的啊。难道是解析文件失败?
好在参考模型是C语言写的,Q哥勉强还能看懂几分。
于是加上很多调试信息,开始定位参考模型文件解析部分的代码。
单独跑了很多遍,输出结果明明也正常啊,肉眼跟波形比对完全OK的啊!
Q哥又跑了几遍仿真,发现刚刚在参考模型里面加的调试信息,报出激励文件解析失败。但是打开激励文件明明又是正常的,单独跑也没问题啊。
到底是什么情况?Q哥有点抓狂了。
代码版本不对?更新版本。
......
文件路径搞错了?改个奇怪的名字试一下。
......
环境变量没设好?重新开个窗口吧。
......
工作站有问题?重启下电脑吧。
。。。。。。
折腾了一上午,还是没解决。Q哥不由得开始怀疑人生,怀疑今天早上是不是真的该吃豆浆油条,难道包子它不香吗??
本文由“壹伴编辑器”提供技术支持
吃饭不积极,脑子有问题。
吃完午饭,Q哥又开始从头检查TB,终于发现坑爹的bug了!!
原来Q哥一时大意,打印完激励文件,忘了关闭文件!!
如下面代码片段所示:
VCS等工具仿真的时候,对于文件写操作,并不是立即回写到文件里。
而是在系统内部有一个缓冲区,每当缓冲区满了,才进行一次回写文件。
如果关闭文件,也会把缓冲区剩余的内容回写到文件。
Q哥跑仿真的时候,上面62行的打印语句虽然执行了,但是并没有立即写入test_din.txt里。
所以66行执行参考模型的时候,得到的激励文件不正常,进而报出激励解析失败的错误。
但是VCS仿真结束的时候,会自动关闭所有打开的文件,这时候会把缓冲区的内容进行回写。
所以Q哥肉眼检查激励文件的时候,才会看到正常的内容。
想歪的面壁去
俗话说武功再高也怕菜刀,验证是个细心活,大多数bug都是粗心大意造成的。
为了避免再犯这种bug,强烈建议大家在搭建验证环境的时候,一写文件打开语句, 立刻就把文件关闭语句也写上,养成良好的代码习惯。因为人家文件打开语句和关闭语句本来就是一对恩爱的情侣!不要拆散他们,否则你一定付出代价的哦~
——The End——