Vivado的报错:Opt 31-67

文章来源: FPGA的现今未的微信公众号

最近遇到了一个vivado的报错,也算是一个比较低级的错误了,但是有值得思考的地方,这里分享下。
有一个项目,需要用的第三方开发的一个模块,暂时叫这个模块为AAA吧。AAA模块是以edf网表的形式提供给我们,由我们在工程里做集成,模块关系如下图所示:
1.JPG



将AAA模块所有的信号连接好以后,在imp阶段就报错了,出现了Opt 31-67错误。[Opt 31-67] Problem: A LUT6 cell in the design is missing a connection on input pin I5, which is used by the LUT equation. This pin has either been left unconnected in the design or the connection was removed due to the trimming of unused logic. The LUT cell name is: c/xxx/yyy/zzz/inst/cnt[2]。
因为很少使用第三方(xilinx除外)的网表,对这个问题刚看到的时候比较陌生,没有想到产生这个error的原因。后来在官网找到答案:
2.JPG



先说结论,这个error产生的原因是因为网表有悬空未使用的端口在例化的时候被其他模块使用了。那怎么解决呢?分2个步骤:
(1)、首先在网表中找到这个报错的信号,由于这个报错的信号和代码是无法对应的,所以要在网表中寻找,Xilinx给出了一个方法:https://support.xilinx.com/s/article/72980?language=en_US
我没有按照这个方法,而是打开综合网表后,在netlist中找到这个信号,然后右键在schemaitc中打开这个LUT,然后双击报错的LUT输入端口,就可以找到网表对应的管脚。它大概是这个样子,如下图所示,该网表的B管脚是有输出的,但是输出A管脚是悬空的。
3.JPG
(2)、解决方案有2个,第一个就是例化网表的时候处理,对于悬空的输出信号,例化的时候就不要连接,直接悬空;对于输入信号,直接给0,不要悬空。第二个方案就是重新综合网表,对于目前不使用的输出信号直接赋值0或者1.
总结,这个问题值得思考的地方是为什么不使用的信号会悬空?一个好的编码习惯应该是所有的输出信号都要赋值,即使目前不用,也应该赋值0或者1。好的编码习惯或者编码风格可以提前规避很多问题,做到事半功倍的效果。

最新文章