1. 问题的提出
工程a是一个soft core,用VHDL写的,综合的时候去掉了"Add I/O buffers" ,并将-iob(Pack I/O Registers into IOBs)置为否。综合最后生成了a.ngc文件供其他工程使用。在生成完ngc后,还可以在 "Design Utilities" -> "View HDL Instantiation Template" 中生成相应的调用文件。
工程b调用的a.ngc,但是工程b使用verilog写的,在调用的时候出现了找不到a模块的错误。
2. 问题的解决方法a
使用netgen命令将该ngc转换成vhdl或者verilog文件,然后在调用转换后的文件
linux下
netgen -ofmt verilog filename.ngc
netgen -ofmt vhdlfilename.ngc
windows 下
netgen.exe -ofmt verilog filename.ngc
netgen.exe -ofmt vhdlfilename.ngc
3. 问题的解决办法b
上述的办法只是一种取巧的办法,更好地办法是通过使用wrapper文件来实现。
假定原来的ngc文件为abc.ngc, 则其wrapper文件名为abc.v 或者 abc.vhd. 这个wrapper文件只申明abc模块的输入输出端口,不包含其他信息。
一种简单的生成wrapper文件的办法就是利用解决办法a中提到的netgen工具,利用netgen生成的verilog文件或者vhdl文件,将其他语句删除,仅保留其申明部分。
然后在工程中同时添加该wrapper文件和ngc文件即可。
4. 问题的进一步讨论
在用VHDL写的soft core里面,接口不能包含inout形式的,否则调用不会有问题,但最终的工程的功能会出错。
这个时候,ngc中的接口使用两个信号分别代表i和o,然后在verilog的工程中调用的时候,使用一个VHDL的wrapper文件来完成两信号转成单线三态的信号,或者直接用verilog来实现三态。