xilinx ip引发的奇思怪想
背景
入坑一年有余,实现了xilinx a7、k7、v7器件编译的整条工具链(设计文件编辑、高亮、自动补齐、lint语法检查、综合、映射、打包、布局、布线、码流生成、码流下载、码流逆向、fpga架构创建与更改),所以对各个环节都是略懂略懂。也正是由于各个方面都是略懂略懂,所以当吸收一些新知识的时候会很容易引起一些奇思妙想。
xilinx ip测试
由于硕士是图像处理出身,所以对hdl语言基本不了解。不过对数电、模电还是略懂略懂,毕竟专业是电子信息,所以电路这些还是略懂略懂的。记得当时在学完复函数那门课之后,发现电路其实非常简单。有几个电路是不能通过复函数变换求解出来的,当时就有一种豁然开朗的感觉,觉得大学的课程安排的有点不合理,就应该把复函数学完以后再学电路。这一说就跑偏了,是吧!最近一周研究了ip,首先为了验证ip的正确性,当然是选择使用xilinx自家的vivado进行综合处理查看edif文件与电路原理文件,看ip是否被实现,如果被识别为blackbox,那就不用玩了(即说明ip不完整);接着,为了验证ip的可用性,使用mentor的工具进行综合使用,毕竟xilinx能用不代表其他家的综合工具也认识是吧,毕竟ip就是为xilinx的fpga设计的。不比不知道,一比吓一跳。mentor的综合工具尽然比xilinx自家的综合工具强,为什么这么说?
首先xilinx必须对ip文件进行lib库处理,其实刚开始我是不理解这些的,毕竟没用过vhdl这个憨憨东西。哪里知道package、component、entity、architecture这些结构的学问哟!但是使用mentor的时候不需要将这个ip处理为lib,就可以直接使用,不过得选择好top module与xilinx fpga device,毕竟7系使用的dsp48e1,u+使用的是dsp48e2,其它系列使用的是48a、48;在mentor中选择ISE,它就不认识48e2的原语;选择vivado的库,他就不认识48a等;毕竟vivado只认识7系及以后的器件,之前的器件已经被xiinx的新工具打入冷宫了。不需要添加为lib文件,可以看出mentor的综合工具更智能,其次导出edif文件和.V文件,放入vivado对比对比,mentor实现出来的时序比xilinx的好,器件用的比xilinx少。基于这样的结果,我觉得在此次试验上可以说明mentor的综合更强一些。虽然mentor也成功的综合了ip的设计文件,但是这依旧不能说明它就可以为我所用;为什么呢?(1)不知道mentor和xilinx之间有什么样的合作;(2)mentor它是三巨头之一呀,综合工具也是名声在外吧。
让IP为我所用
xilinx 综合工具都做不到的事情,我肯定也做不到呀!所以我老老实实的把它们封装成lib调用。但是,这些ip是为xilinx的device而写呀,肯定会用xilinx的原语呀!所以呢,我得去把这个问题解决吧!最简单的方法直接使用unisim_VCOMP.vhd咯!其实我当时是不知道为什么的,不关注设计文件,只关注综合后网表文件。由于综合出来总是有blackbox,所以可以肯定的是这里面肯定是某个环节出错了,因为blackbox就意味着fpga架构文件中有相对应的原语实现。很显然,xilinx器件的架构文件肯定不可能有这些东西,毕竟每个人都可以用xilinx工具生成ip,不可能把架构文件做的这么自适应吧!再说了,综合肯定不用架构文件呀,要是需要架构文件,mentor也不能综合出来呀!不管多大的商业合作,我想xilinx也不会把自己器件的架构文件开放给mentor吧!所以对此,我肯定是自己综合的有问题。
遇到问题,当然是找到问题,然后解决问题。首先是从xilinx的库文件下手,vivado下的数据文件,发现了一个很有意思的事情。那就是它不经提供了vcomp文件,还开放了所有原语的设计文件。这就令我很好奇了,因为我不喜欢做仿真,看见那些01的波形图就反感,所以发现这些原语的设计文件比较晚,不过我想应该有很多经常做仿真的人也不会发现这个吧!毕竟就算做仿真,也不一定需要研究这些文件,一般跟着所用仿真工具的教程走就行了。看到这些原语的设计文件,我就想到了一个有意思的事情——xilinx把自己器件的设计文件开源了?根据一个同学提供的先验知识(曾经有一位从事FPGA开发同学告诉我,你就把xilinx的原语当作一种硬ip就行了,那这些设计文件不就是ip的源码么?),又根据另一个先验知识(老哥是从事ic的资深开发人员了,自从入坑eda这东西,遇到我哥,我就喜欢问这、问那,对ip这东西映像比较深,因为卖的贵),再根据那几天查阅的vhdl语法,我得出一个奇怪的假象——xilinx器件其实就是这些开源ip设计出来的,它器件上的node应该就是entity上的映射端口。想到这,我就去对比了vhdl文件与器件图,从dsp、bram来看这个猜想确实又一定正确性,毕竟我没有一个一个查对,不能确切的证明这一点。
一晃就是四天,四天时间里我基本尽我所能把这个东西研究了个遍,能做的实验基本都做了一遍。组长看我研究了几天基本处理无计可施的状态了,就提出了让我先放一放,根据实验数据我们都觉得ip需要重构。要不说,工作氛围还是挺好的呢,不需要有太大的心理负担,不会在一个点上被施加高压。话虽如此,一方面,我遇到的问题岂能绕过;另一方面,部门内有能力重构这个ip的估计也就副主任了,哈哈!让其它人重构的话太费时间了,不到万不得已肯定不能让其它人为难呀!第五天,这个问题终于突破了,通过更改综合工具代码与设计文件终于将门级网表综合出来了,门是出来了,不过对不对又是个问题了,哈哈!还是有对比实验需要做的(更改后的设计文件与xilinx、mentor实现出来的一样)。前路依旧是坑,哈哈!
有xilinx器件IP,是不是可以像xilinx一样出FPGA了
xilinx的硬件ip都有了,我是不是可以自己组装出一个FPGA呢?如果用xilinx的硬件单元实现FPGA,会不会被xilinx起诉呢?这其实是我最大的疑问,为什么呢,毕竟已知xilinx器件的架构实现、现在又有了硬IP的设计文件,是不是可以改一个新器件出来呢?公司就像我的及时雨,骑自行车缺手套,公司就发手套了;正思考这个问题呢,公司就推通告forgeFPGA,一个仅售0.5美元的fpga;下载软件,使用一波,通过我敏锐的眼光基本可以断定这个公司的工具链是(yosys+nextpnr)。为什么这么猜测呢,由于yosys有申明可以商用但是不能不申明;nextpnr就是布局、布线、码流生成一键走完,不分步执行的工具;而且也是实现完看布线图;还有nextpnr也是yosys团队开发的。当看见它综合时候使用xilinx原语,我就很纳闷了;布局布线码流生成后,查看布线图,发现果然是使用了xilinx的硬件单元,为啥没有被xilinx起诉呢?
很好奇的是,forgeFPGA布线图中tile内布线非常清晰但是tile间竟然毫无分辨率可言。这就太不科学了吧,能把tile内画的这么清晰,怎么可能画不出tile间连线关系呢?是不是想要隐藏什么呢?然后对比xilinx画的图,发现xilinx的线都是静态的线,可以选择是否凸显实例化、可以选择全部显现出来;可以高亮使用的线与选择的线,看它可以通过放大、缩小,我真想不到除了OpenGL以外的渲染工具可以做这个,direct3d应该不会用来做这个东西吧!
说到画图,怎么架构它呢?首先得有一个draw的基类是吧,然后得有几种形状的继承是吧;tile、site、bel;其次是数据结构,得有个几种tile吧,tile中有site,他们都有节点,节点的行为是连线;然后是tile内连线的静态布线、其次是tile间的静态布线;反正线肯定要是静态的,至于高亮哪些,那就看布线结果文件,可能与布线结果之间还有一个中间map坐标转换。然后就要考虑渲染速度与资源消耗了。(其实我没有研究过这个问题,就胡说八道一番)
都说不喜欢写文档的程序员不是好程序员,确实得多写写文档,文档可以提炼架构,文档可以巩固知识,虽然文档会影响开发速率!万事万物都在得失平衡间,没多少人可以不做选择全要,哈哈!