首先,我并不喜欢半自动的联合仿真,宁愿花一些时间写简单的脚本。
1.先建立自己的仿真文件夹sim,用于存放tb和相应的脚本以及仿真生成的垃圾,如下图。
2.编译库是必须的,如下以lattice的ECP3为例,其中添加了DDR、Frame_buffer、pll等IP。
为了可移植性的方便,我将相应的库拷贝到了自己指定的文件夹sim/lib下,将ECP3的器件库放到里面,如下图。
3.接下来就是写脚本(因IP存放相对位置不一样,脚本则不一样),先将写好的脚本贴出来,然后一一解释,如下图ddr3_frame_buffer.do和ddr3_frame_buffer.bat。
图ddr3_frame_buffer.bat
图ddr3_frame_buffer.bat中可以看到整个核心部件的当前文件夹是sim(这个做仿真文件关联的时候一定要注意),图ddr3_frame_buffer.bat的脚本很简单,不啰嗦。
图ddr3_frame_buffer.do,因为当前文件夹是sim,tb.v又在sim下,所以vlog ./tb.v编译当前文件夹下的tb.v,如下图所示。
lattice的库在lib的ecp3和pmi下,所以vlog ./lib/ecp3/*.v和./lib/pmi/*.v也很显然了。
接下来编译自己写的.V,vlog ./../scr/*.v。
然后编译IP的实体,调用了DDR、Frame_buffer、pll,所以他们仿真模型的实体也得编译。
vlog ./../pll/pll.v
vlog ./../frame_buffer/frame_buffer_beh.v
这两句就是编译Frame_buffer和pll的仿真模型的实体。
DDR就没有这么简单了,因为DDR实体里面还包含了很多东西
vlog ./../ecp3_ddr3/ecp3_ddr3_beh.v
vlog ./../ecp3_ddr3/ddr_p_eval/ecp3_ddr3/src/rtl/top/ecp3/*.v
vlog ./../ecp3_ddr3/ddr_p_eval/models/ecp3/*.v
看到工程的顶层包含了`include "ddr3_sdram_mem_params.v",他是指工程的相对于src作为当前路径,即指的是src文件夹为当前文件夹,如下图src下有"ddr3_sdram_mem_params.v"所以在工程编译的时候没有报错。
但是我们在编译仿真DDR仿真模型实体ecp3_ddr3_beh.v
的时候,里面没有去包含参数宏定义的文件ddr3_sdram_mem_params.v,如下图
这样必然会报错的,解决的办法有两个,第一将ddr3_sdram_mem_params.v包含在ecp3_ddr3_beh.v下面,但是包含的时候关联路径一定要注意,仿真指定的当前文件夹是sim,所以关联路径应该是,如下图。
`include "./../ecp3_ddr3/ddr_p_eval/ecp3_ddr3/src/params/ddr3_sdram_mem_params.v"
还没有完事,ecp3_ddr3_beh.v下面还包含了其他仿真实体,也要编译
vlog ./../ecp3_ddr3/ddr_p_eval/ecp3_ddr3/src/rtl/top/ecp3/*.v
要编译哪些东西,东西从哪里来???看看自己的工程就知道(首先自己要保证自己的工程在diamond下能够编译通过),看着自己工程架构写脚本是最快的,以上脚本的所有步骤都是根据工程架构写的,工程架构如下图
根据上图加上脚本
vlog ./../ecp3_ddr3/ddr_p_eval/ecp3_ddr3/src/rtl/top/ecp3/*.v
vlog ./../ecp3_ddr3/ddr_p_eval/models/ecp3/*.v
还有一种办法就是根据给出生成IP目录下给出的.do脚本来修改,这种办法相对繁琐,但是也值得参考,如下图是自动生成的脚本。
至此整个工程所需要的东西就全了,可以开心的让工程仿真跑起来了。
如有疑问请联系QQ:825972925