比如通过DPI的方式,以c为桥梁,搭建UVM与其他仿真软件的桥梁,再比如利用python处理UVM生成的数据然后以数据表格的形式展现,再或是研究生论文里导入VIP框架(论文还没看懂,给我点时间,嘻嘻嘻)。
正式开始之前,首先说下之后的文章更新思路
1. 说明我要DIY的大体UVM框架(绝对适合90%以上的大型测试场景,不行就来锤死我)
2. DIP-c的基础使用(也就是桥梁搭建);
3. python图形化scoreboard对比数据;
4. VIP框架导入与学习;
5. 其余所有组件(这部分我代码已写完,比较熟了,可以参考我之前发的UVM文章,太多了,比较简单,不再逐一赘述)
正式开始:
既然是DIY,那肯定得满足这些特点:通用,强大,便捷,高效 ,如果不行,那还不如直接拿UVM官方的demo好点。
下面我列出了我DIY所包含的元素:
A. 一个优秀的比较大的系统测试不可能只拥有一个agent,所以virtual sequencer该上场了,它的强大不用我说,详细参考我之前的文章《第九段:Virtual_
B. 可变时钟同样是需要的,通过修改define参数实现时钟的修改,目前我是将时钟输出做成的一个单独的agent,里面是各种频率输出,需要新的再加,方便的飞起。
C. 参数聚合(三层config),涉及多个agent同时在一个仿真环境,各个agent间的数据传递肯定会让你头痛,有了参数聚合,你就起飞了。
那什么是三层config呢,这里展开一下,正常情况我们agent的数据都是通过config传递,这样数据的使用边界就只在agent里面使用,此时,你可能会说,我放到顶层不就好了,对,这个是一个办法,但是同样会出一个问题,参数太多,agent多起来你还觉得nice吗?参数管理都会不方便,别人看你系统也会骂娘了。
我的方法是在virtual sequencer中统一连接各个agent的config参数,那么各个agent的config互不打扰,而且能相互调用,美滋滋!!!你会说具体操作呢,这两句话我看的不是很明白,支持下我会勤奋更新的。
D. interface扩展部分driver,以实现优化代码分布;
E. 单独的model,使期待脱离config;
F. 一个芯片测试人员必须要进行覆盖率,代码覆盖,功能覆盖,还有fsk等等,function coverage那必不可少了,这个我之前也写过,《第十一段:功能
G. assert断言,(这部分没完成,待更新)
H. 三层virtual class 封装;(这部分没完成,待更新)
I. seed 约束
J.后门访问(sc,c)
K.信号传递req,rsp
I. $value$plusargs
M.
N. python图形化
图片挂在下面了,目前只想到这些,图中是关于UVM部分,桥梁挂接的其他没上(为了区分 ),目前这个系统我还没完成最后的demo,社畜没这么多时间,后面会看反馈怎么样再更新把。
二次更新
距离上次更新已经很久了,这次完成的diy框架的完整编码,放上图片,简略讲一下。
上图标注的是我自己建立的共享缓存架构,实现数据在不同agent间的传递,;
class_inf文件:由于代码在candence向questam迁移过程中,发现questam编译的代码检查更加严格,例如定义一个task类,调用这个类时,假如未例化所有output,且用线连出,则会出现语法错误,为此,我参考uvm源码架构,通过item的传递来实现之前的input和output功能,完美解决工具迁移过程造成的语法问题。