平台:vivado2018.3
应用场景,在设计的过程中,我们一些特定的模块需要交付给别人,但是又不想让他们看到其中的源码。就可以将源码封装成网表和IP文件。
vivado生成网表文件
设置综合。设置-flatten_hierarchy* 为full。
这里可以设置为full或者rebuilt。
设置为full,后续需要生成.v文件和.edf文件。设置成rebuilt只需要生成.edf文件。
在more options*选项中设置为 -mode out_of_context,让输入输出的引脚不加IO buffer。
综合成网表后生.v文件,该文件的名字不应该和你的名字一样建议加上后缀。
//vivado 2017.4及以前
write_verilog -mode port <design_name>.v
//vivado 2018.1及以后
write_verilog -mode synth_stub <design_name>.v
//<design_name>.v为设置的文件路径及.v文件名,例如:D:/Users/Desktop/1/a.v (注意斜线)
生成.edf文件语句。
//模块不包含Xilinx的IP
write_edif <design_name>.edf
//模块包含Xilinx的IP
write_edif -security_mode all <design_name>.edf
//<design_name>.edf为设置的文件路径及.edf文件名,例如:D:/Users/Desktop/1/a.edf (注意斜线,与.v文件名保持相同)
生成的网表如果需要调用仿真。
write_verilog -mode funcsim <design_name>.v
不指定-mode导出verilog代码(应该相当于综合后的电路代码):
write_verilog <design_name>.v
如原文件为pcie_top.v新生成的文件名字为pcie_top1.v。
综合完成后将顶层写成.v和.edf文件。
检查文件夹中是否生成了。
两个文件。
下面我们新建工程在新工程中调用这两个文件.v和.edf文件。
综合完成后。
使用该网表生成IP核
点击ok和finish。该过程会生成一个vivado工程,该工程只是在配置该IP的时候有效。下面进行配置IP。名字叫做my_pcie3,类型为UserIP。
对一下你的IP端口,输入输出。
生成该IP。
查看生成的IP文件夹。Src文件夹下只包含顶层文件和网表文件。
下面在pcie_recon6中调用该IP。验证项目的可行性。
新建工程,将IP文件夹保存在当前项目目录下。
在工程中添加该IP。
生成IP报错。
根据报错将网表文件添加到该文件夹。
IP成功编译。
将IP添加到项目。通过综合和实现后,发现时序编译不过。
从vivado的report timing summer中可以看到。Vivado自动识别的时钟并不准确。可以看到和正常编译过了的版本工程很多时钟周期约束都不准确。下面是正常版本的时钟约束。
准备将该版本中的时钟进行约束一遍。看看能否过静态时序分析。
同时在tcl中使用report_clock查看时钟约束是否正常,经过分析报告,发现时钟约束很多都有问题。(原因暂时没有想到,我是通过工程生成的网表,然在生成的IP,按理说应该拥有正常的时钟约束,这点没有想明白)
创建时钟约束。
前面是正常出来的lb_clk_0后面这个是使用网表综合后生成的就变了。这个情况该怎么办呢?对这个错误的时钟从新约束一次吗?
经过查阅资料发现,在生成网表文件时,若生成的edf文件中包含PLL IP CORE,则对应的IP的时序约束会失效,建议不要在edf文件中不要使用PLL IP,可以将PLL放在网表外面。