为保护版权,或者便于公司模块化管理,需要将部分源程序封装成模块。

常用的封装有三种,分别是封装成网标文件.dcp、封装成.edif文件、封装成IP。

网标文件

如下图所示,文件后缀是.dcp

封装步骤:

1、将要封装的文件设为顶层;

2、在设置中将综合的属性More Option设置成 -mode out_of_context;

3、将xdc文件disable,因为dcp文件中会带有当前工程的约束信息,如果没有Disable掉,那么在例化生成的dcp时会引入新的约束文件。运行综合 ;

4、打开综合,在TCL命令框中输入:write_checkpoint -noxdef xx/xx.dcp,其中xxx为模块名称,这样就可以生成完整的dcp文件。

注意:如果该dcp文件的接口中有parameter,例化时应该将parameter去掉。

 

封装edif文件

封装步骤:

1、将要封装的文件设为顶层;

2、-mode out_of_context表示在该级不插入任何I/O BUFFERs,该选项类似ISE里在相应设置处不勾选I/O BUFFERs。另外还可以在选项options中找到“-flatten_hierarchy”,将层级结构设置为“full”,
层级结构则可设置“-flatten_hierarchy”选项为“full”:“全”该选项指示工具把层级全面变平,只剩下顶层,保护IP的层级结构不被其他用户清楚查看。

3、生成仅包含IO端口信息的empty module
打开综合设计open synthesized design后,在TCL命令窗口执行如下命令:
2017.4之前版本:

write_verilog -mode port F:/FPGA/abc_stub.v

2018.1之后版本:

write_verilog -mode synth_stub F:/FPGA/abc_stub.v

4、生成edf,并在TCL Console中输入:

若不含Xilinx IP则可通过如下命令生成edf文件:
write_edif F:/FPGA/abc.edf

若含Xilinx IP则需通过如下命令生成edf文件:
write_edif -security_mode all F:/FPGA/abc.edf

write_edif path/xx.edif

5、例化时,要保留一个跟edif同名的hdl文件,且文件中只保留module的接口。

 

封装成edif和dcp的区别

  1. 封装edif文件时,不能将XIlinx的IP Core封装在文件中,但dcp文件可以;
  2. 例化时的区别,edif是网表文件,例化时需要增加同名的hdl文件,但dcp文件其实就是个压缩文件,例化时只使用dcp文件即可,不需要再加入同名的hdl文件。

封装dcp文件时的注意事项

  1. 在将文件设为顶层文件时,接口中的parameter一定记得要修改成实际值。这是因为我们都习惯于在hdl中例化模块时指定parameter的参数,这往往跟模块中的参数值是不一样的;
  2. 输入的接口例化时不能悬空,有的接口赋0即可,但有的接口赋0后在Implementation时会报error;
  3. 需要额外注意inout接口,很多工程师在使用inout接口时,习惯于自己用hdl来处理,比如I2C的inout接口我们经常会这么写:
assign scl_in = i2c_scl;

assign i2c_scl = i2c_scl_oe ? i2c_scl_o : 1'bz

但这么写的话,生成的dcp在Implementation时会报error,我们要使用Xilinx的IOBUF的原语来处理,改成下面的写法:

IOBUF #( .DRIVE(12), .IBUF_LOW_PWR("TRUE"), .SLEW("SLOW") ) SCL_inst (.O(scl_in),.IO(i2c_scl), .I(i2c_scl_o),.T(~(enable & ~scl_out)));

封装IP核

参考本人写的另一片文章https://blog.csdn.net/baidu_25816669/article/details/106525085

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐