FPGA团队协作时,模块要交给别人却不想暴露源码?Vivado里的DCP网表能做到:对方拿到手就能直接布局布线出bit文件,源码完全看不见。这个网表到底怎么生成、怎么交付,一文讲清楚。
一、Vivado设置
如图1所示,在Settings中找到Synthesis设置,将flatten_hierarchy设为full,More Options填入-mode out_of_context后点击Apply保存。

flatten_hierarchy有三个选项:full表示将所有子模块逻辑展开到同一层级;none保持原始层次结构不变;rebuilt让综合器自动重新构建层次。生成DCP时推荐用full。
-mode out_of_context表示以"上下文无关"模式综合,即端口不被当作顶层物理引脚,综合器不会插入I/OBUF,也不依赖上层设计进行跨层优化。
接下来如图2所示,将要生成DCP的模块设为顶层,点击Run Synthesis,综合完成后点击Open Synthesized Design进入综合后设计界面。

需要注意的是,如果模块包含parameter参数,生成DCP后参数值会被固化为固定值。这与Xilinx IP核设置好参数后都需要重新综合是同样的道理。
二、生成DCP网表与仿真文件
在Tcl Console中执行cd命令切换保存路径,例如:
cd E:/play_vivado/test_dcp/test_dcp.srcs/sources_1/new/test_computer
然后执行以下命令生成DCP文件:
write_checkpoint -force <design_name>.dcp
如图3所示,执行后就能在所在路径看到生成的DCP文件,如图4所示。


这里checkpoint意为检查点,即保存当前设计快照;force表示强制覆盖同名文件。无论是否包含Xilinx IP,生成DCP都用这个命令,不同于生成EDF网表。
接下来还需要生成端口描述文件,输入以下命令:
write_verilog -mode synth_stub -force <design_name>.v
执行后就能在所在路径看到生成好的端口描述文件。mode synth_stub生成只包含端口声明的文件。
然后生成功能仿真文件,在Tcl Console执行open_checkpoint <design_name>.dcp,Vivado会弹出新窗口,在弹出的窗口Tcl Console执行:
write_verilog -force -mode funcsim <design_name>_sim.v
如图4所示,执行后生成仿真文件。mode funcsim即functional simulation,生成用于功能仿真的Verilog网表。生成后需要将文件名改为<design_name>_sim.v,这样同一工程便可以同时将端口描述文件和仿真文件导入,综合和仿真分别使用不同的文件。完成后回到原来窗口并关闭open_checkpoint弹出的窗口。
三、在工程中使用DCP网表
将源码顶层V文件删除,把生成的DCP网表、端口描述文件和仿真文件加入工程,如图5所示。

仅用端口描述文件和DCP网表就能生成bit文件,但生成前需还原设置:将flatten_hierarchy改回rebuilt,More Options保持为空。另外,DCP文件不能单独作为顶层被综合,需要再套一个顶层模块来调用它。
四、DCP网表与EDF网表的区别
Vivado还支持生成EDF(Electronic Design Format,电子设计格式)网表。步骤相同,命令不同。
模块不含Xilinx IP:
write_edif <design_name>.edf
模块含Xilinx IP:
write_edif -security_mode all <design_name>.edf
-security_mode all用于保护IP核安全信息,不加该参数遇到IP核大概率报错或丢失IP信息。如仍报错可加上-force一起用。仿真文件建议后缀改为sim_model:write_verilog -force -mode funcsim <design_name>_sim_model.v
DCP是Xilinx专有格式,信息最完整(网表、约束、属性等),但仅Vivado可读。EDF是行业通用格式,理论跨工具链,但不同厂商解析存在差异,实际仍需调整;且IP核在EDF中常以黑盒形式存在,对方缺少对应IP库会导致报错。Xilinx生态内流转推荐DCP,需对接其他EDA工具可考虑EDF,但要提前确认IP兼容性。
-END-
如果文章对你有帮助,请记得关注公众号,本公众号将持续更新FPGA和信号处理相关的知识,谢谢!
夜雨聆风