DCP文件
PART1:Vivado—DCP复用
在Xilinx的Vivado开发流程中,出于设计源代码保密的考虑,有时我们并不会交付源代码,而是以网表的形式进行交付,本篇就在Vivado中进行DCP复用方式进行说明。
先看一个简单的example project,里面包含两个verilog文件:
在顶层top里,我们例化了一个adder模块,adder为一个简单的加法器。当我们把这两个文件导入VIvado后即可进行正常的布局布线。
那么问题来了,假设adder是我的一个核心设计(加法器代表一下哈),当其他人想使用我这个adder IP时我不想交付给对方源代码,那么我应该如何做呢?
交付DCP!
何为DCP
在Vivado的设计流程各个阶段里,采用统一的数据模型:DCP(design checkpoint),在Vivado的设计流程里,无论是综合还是布局布线的各个阶段,工具都会生成DCP文件,每一步的执行设计输入均为上一阶段的DCP文件(综合阶段除外)。那么当我们想把adder以网表形式进行交付时,我们就可以生成对应的综合后的DCP文件,随后将DCP文件交付给合作方即可。
甲方:DCP制作流程
在我们的设计中,我们把adder这个模块作为设计的顶层:
随后进行综合,当完成后,我们会在对应的目录下看到生成了adder的DCP文件:
同时,我们准备一个我们adder对应的设计顶层:
这里的adder模块不包含任何设计代码,仅包含端口声明。同时我们将这个模块声明为“black_box”
随后,我们就可以把这个DCP文件和black box文件交付给别人使用了,而不用担心我们的源代码泄漏。
乙方:DCP的使用
当我们拿到别人的DCP文件和black box端口声明文件后,我们还需要准备一个tcl文件:
tcl文件中制定了adder.dcp的读取位置。
随后,我们将balck box文件和tcl文件导入到我们的设计中,top.v文件保持不变:
随后我们在Implement Setting中的opt_Desing中的tcl.pre中关联导入的balck.tcl文件:
Finally,我们就可以进行正常的综合及布局布线了,布局布线完成后我们得到的网表和正常工程一模一样。
PART2:DCP的生成差别
前文曾提到过在Vivado里以DCP的方式来进行IP交付,而在Vivado里,不同的方式生成的DCP却又有着别样的内容。
综合后直接生成的DCP
当我们的RTL设计完成后,首先第一步要做的就是跑综合,在Vivado里,从综合到布局布线每个阶段生成的都是DCP,当综合跑完后会在相应的目录下生成DCP文件,
这里跑完综合后在相应目录生成的DCP文件包含内容如下:
这里看下在综合过程的最后阶段Vivado的Log文件:
这里有提到一句:
WARNING: [Constraints 18-5210] No constraints selected for write.
Resolution: This message can indicate that there are no constraints for the design, or it can indicate that the used_in flags are set such that the constraints are ignored. This later case is used when running synth_design to not write synthesis constraints to the resulting checkpoint.
也就是说,在综合阶段生成的DCP文件里是不包含任何约束文件的,那么当我们的设计里包含时序约束、引脚约束时(尤其有些IP内部包含的约束文件)把这个DCP文件交付给别人使用时将会在布局布线或者生成bit文件阶段遇到问题的(都是泪的经验)!
write-checkpoint生成DCP
当完成综合后,选择Open Synthesized Design后我们可以在Vivado菜单栏选择File->CheckPoint->Write选择生成checkpoint:
这里可以看到,生成的checkPoint为一个DCP文件,但这个DCP文件包含netlist、xdc file、physical database,生成的DCP所包含的内容如下:
对比可以发现,相较于生成的综合阶段产生的DCP文件,这里包含了xdc、sta等文件,把这个文件交付给对方,对方才能愉快的跑下去。