FPGA集成 techbench 仿真测试
0赞本文的HSL指的是我自己设计的一种语言,和myHDL类似
先对标题做说明:
“集成仿真”是我从软件的“集成测试”那里借取的概念,也可以叫“集成自动化测试”,对应与FPGA开发就是“集成自动化仿真”。但是这个和UVM验证这些不一样。FPGA的SDK开发不在此列,那个更像软件测试。
目前我知道常用的测试仿真流程大概是这样,独立模块A拥有自己的仿真测试,把模块A加入系统后会有系统集的仿真测试(不区分前仿,后仿)。以前我没觉得这个会是个问题,一直到最近。当你有很多个独立模块时就会成为不可忽视的缺点。首先工作上你会需要搭建比较多的系统工程,有些是用于产品(这个占少数),有些只是为了测试(这个占多数),比如产品需要4个独立模块(DDR,SPI,Serder,串口),可能就需要先做子系统的测试(DDR+SerDer,DDR+串口,Spi+串口),这些子系统不仅要仿真而且要下载到板卡做硬件测试。如果用以前的流程,就需要为每个子系统建立top文件,techbench,约束文件(理论上约束文件是可以共用的,但是不是很好管理),显然这些文件内容都有部分是重复的,子系统A的部分内容其实也会在其他子系统中用到,这就会指数级的增加工作量,如果我要在产品系统中仅仅新加入第五的独立模块,工作量就要翻一倍。这还是时最糟糕的情况,当这些模块有几个或全部都是开发中,代码随时可能会修改,相应的文件,工程都需要更改,如果所有的东西不同步修改,就很难保持一致性,子系统A使用的是verb的SPI,而子系统B却使用vera的SPI,技术债就是这么积累的。
注:为什么要,用子系统,分部测试?从代码量来说确实增加工作量,子系统覆盖的功能,全系统也会覆盖到。但是分部子系统会提高工作效率,“一次只解决一个问题原则”,A-B-C系统,A-B子系统可以解决A-B关联的问题,而无需关注C。另一点如果A-B-C系统出现BUG,会很容易定位。
很遗憾,我没法提供HDL级的解决方案,只能从HSL寻求方法。这也是这篇文章的核心,如何从HSL级解决FPGA集成仿真测试的方法。
独立模块打包成类似vivado IP,即包含RTL,也包含IP exmple 测试,约束文件。但是不可能做成这样的IP,因为,一 没有这个时间,二 没法做出vivado的软件,三 vivado ip方式也不能解决模块间关联的问题。
1、HSL的单个文件里面不仅有RTL的设计,也有此设计的测试单元,其实在设计的时候是最明白此设计应该怎么测试的。分开多个文件容易管理混乱,HDL严重依赖与工程软件。因为HSL所以一个文件行数不会很多,我目前写的都在500行一下
2、约束文件自动生成,当引入某个HSL模块时,此模块所需的约束自动加入工程
3、测试文件自动生成(这个是最难实现的),当引入某个HSL模块时,此模块相应的测试单元自动引入techbench。再也不用手动去写tb,如果想加入新的测试,只需要在HSL模块文件那里增加就行。这个的难点在于port和模块关联仿真。
调用模块时port的输入,怎么及关联到RTL,又关联到相应的tb(HSL其实最终也是生成HDL)。
模块的关联仿真,打个比方,A模块是网口IP,B模块是TCP模块,显然B模块的存在必须以A模块存在为基础。当调用B的时候把B的单元测试注入到A的测试中,然后再生成tb,有没有B模块,生成tb也是不一样的。
以上则是我对HSL应该有的功能的新认知,我正打算把这个功能加入到我的第5版HSL里面(没错是第5版,我在这一年里迭代了整整5个版本)。
从年初不知道HSL应该设计成什么样子到年末第5个版本HSL和几乎所有的开发都是用HSL,自己也没想到会发展这个快。这个可能就是收益递增原则吧,(投入得越多,收获会更多,指数函数y=ex或 y=x2)。有机会和大家说说这个收益递增会怎样改变世界。