最近工作中遇到的一个问题,不知道是否是工具的bug,在此备案。
问题描述:设计中所用到的一个乘法器,在fpga验证时不能工作,用逻辑分析仪查看得知乘法器输入正确,但输出有问题。通过多次修改并用综合后的网表仿真得知是synplify在综合时调用DSP48E时处理出错,具体分析如下:
环境:Xilinx的Virtex5 LX系列FPGA,Synplify8.6.2综合,ISE9.2实现,Modelsim后仿
设计背景:乘法器的输入,一端为寄存器直接输出,另一端是比较复杂的组合逻辑,输出结果再做加法等运算,然后送入寄存器。
DSP48E简介:
Virtex-5 DSP48E Slice 包含 Virtex-4 DSP48 的所有功能以及多种新功能。这些新功能包括
一个更宽的 25 x 18 乘法器和一个扩展后用作逻辑单元的加/ 减功能。
看框图:
其中输入可以有两级寄存器,所以在做优化的时候会把外面的寄存器放到里面,而这两级寄存器分别有两个EN端,当只用其中一个时,会使用REG2,可以从仿真的model中间可以看到详细的描述,但Synpilfy在处理这种情况时,使用的是REG1 ,此时CE2常为1,所以导致输入数据不能在正确的时刻被latch,进而导致输出错误。
在搜索时发现Xilinx自己的工具,如coregen之类的在处理DSP48E时也出现过不少bug,synplify也是从8.6版本才开始支持virtex5的,所以我觉得很有可能是工具在这有bug,目前synplify的版本已达9.6以上,估计新版本不会再有此问题。
总结:
1、尽量不要用工具最新的功能,关注工具新版的release notes
2、FPGA做逻辑验证的时候最好不要使用FPGA的特殊单元,也不要让工具做太多的优化,除非timing确实有问题
3、出了问题应该先分析问题,不要一上来就尝试各种修改的办法。(这点我开始认为自己的coding style有问题,让工具犯傻了,所以修改了好几次,均已失败告终)