详细步骤就不贴图了,网上一大堆
在Vivado中,常用的三种封装形式有三种:
● IP
● edif
● dcp
在下文之前,先看几个概念
DCP文件是Vivado独有的一种相当于FPGA设计中的HDL源文件的加密压缩文件。
- DCP文件可以类似Verilog的使用方式,可以直接使用或者仿真。而edf文件,其特征就是不能进行功能仿真。
- 此外,为什么DCP和edf在综合的时候要设置 -mode out_of_context 属性(就是和上下文分离)或者 -no_iobuf,就是因为iobuf只有port才有,而网表或者dcp是内部使用的。
此外,dcp需要注意的点:
步骤1:将xdc disable;(我们在生成某些IP的时候,可以看到里面会有XDC和DCP,这里的DCP就会带有XDC的约束)
步骤2:设置综合属性为 -mode out_of_context
步骤3:设置要封装的代码为顶层。
步骤4:综合
步骤5:打开综合设计(打开之后再写脚本,不然会出错)
在TCL中输入命令(或者在GUI界面的FILE菜单栏找到checkpoint)生成以下文件:(因为dcp是压缩文件,所以可以直接类似Verilog直接使用)
dcp压缩文件(可仿真,可综合,可生成bit):
write_checkpoint add_driver.dcp
仅包含端口文件(仅仅是端口):
write_verilog -mode synth_stub add_driver_stub.v
或者生成仿真的网表文件:(只能进行功能仿真,不能被综合)
write_verilog -force -mode funcsim add_driver.v
生成网表的.v文件(可仿真,可综合,可生成bit):
write_verilog add_driver_netlist_v.v
注意事项:
其实在project_1.runs\synth_1路径下也可以找到顶层的DCP文件
对于同名的文件,但又只想做仿真,可以在文件general中设置为仅仅仿真
在生成bit流时,需要取消-mode out_of_context,否则会报错
输入的接口例化时不能悬空,有的接口赋0即可,但有的接口赋0后在Implementation时会报error;
EDF封装和DCP类似:区别在于EDF文件是不可以直接被用的,而是需要借助生成的.V文件
步骤1:将xdc disable;
步骤2:设置综合属性为 -mode out_of_context或者-no_iobuf
步骤3:设置要封装的代码为顶层。
步骤4:综合
步骤5:打开综合设计(打开之后再写脚本,不然会出错)
注意:如果设计里有三态,最好还是用iobuf原语
区别在于生成文件的脚本不一样
write_edif -security_mode all F:/FPGA/abc.edf
此外还需要生成stub:
write_verilog -mode synth_stub add_driver_stub.v
因为edf是不可以仿真的所以,还需要生成netlist_sim仿真网表(dcp就不需要生成仿真网表)
write_verilog -force -mode funcsim add_driver.v
总结:生成dcp和edf类似,都是在打开综合后进行命令生成,区别在于使用的命令不一样和edf要使用独立的仿真网表
遇到过小问题:我生成的edf文件在调用的时候报错block box,即drc inbb-3。解决这个的原因是edf文件必须和模块名一致才行。不过生成的stub文件倒是没有这个要求。(其实充模块分级也能看出,如果edf或者dcp没有生效,他就不会出现在调用模块的地方,而是出现在未使用的模块的层次里。
小结:不管是dcp还是edf,在生成网表的前置条件是一样的(经量重新创建工程,在新的工程里生成dcp或者edf)。都需要保证:
以上edf和dcp都是一样的,不一样的是生成的命令和两者之间的特点:
dcp是全能,且可以包含ip(生成之后,最好生成stub,方便例化)
edf不能仿真,且如果有ip 还需要使用命令
write_edif -security_mode all F:/FPGA/abc.edf
此外,edf还需要生成stub和用于仿真的netlist
write_verilog -force -mode funcsim add_driver.v