对于一个完整的FPGA设计,既要有时序约束,也要有物理约束(例如:管脚分配与管脚电平设置)。Xilinx建议将这两类约束分开写在不同的约束文件中。此外,考虑到某些设计中可能会用到手工布局,从而会有相应的Floorplan约束(对应Pblock,可理解为面积约束)。同时,在大多数情形下都需要对FPGA设计进行调试,这样就会用到ILA,同时需要对相应的net设置MARK_DEBUG属性,这可理解为第三种约束即调试约束。因此一个完备的约束会包含时序约束、物理约束和调试约束,如下图所示。
对于约束文件,Vivado支持.xdc和.tcl两种格式。约束文件都有自己的属性,可在属性窗口中查看,也可通过下图示的Tcl脚本在Vivado Tcl Console中查看。
在这些属性中有一个需要关注的属性即USED_IN,如下图所示。图中显示其值为{synthesis, implementation},表示该约束文件在综合和实现阶段均有效。相应地,属性USED_IN_IMPLEMENTATION和USED_IN_SYNTHESIS属性值为1。可见对约束文件,可通过USED_IN属性设定其有效阶段。
另一个比较重要的属性是IS_ENABLED,如下图所示,用于ENABLE或DISABLE相应的约束文件,实际上就是管理约束文件是否使用。这个属性对于调式约束非常有用。当调试完毕,可直接将调试约束文件设置为不使用状态(在Sources窗口中显示为灰色)。如果调试约束与时序约束混合在一个文件中,调试结束就需要注释掉或直接删除相应的调试约束,操作起来不太方便。IS_ENABLED属性则避免了这种不便。
此外,Vivado允许用户创建不同的Design Runs,从而,对于不同的Design Run,用户可以使用不同的Constraint Set,如下图所示。这样的好处是可以根据Design Run的需求创建不同的约束。例如,Synth_1/Impl_1要求时钟频率为200MHz,而Synth_2/Impl_2要求时钟频率为300MHz,如果这两个Design Run的目标芯片一致,则可验证该设计的Fmax(最高时钟频率);如果目标芯片不一致,则可用于验证同一设计在不同芯片上所能达到的最高频率。
结论:
-约束文件= 时序约束 + 物理约束 + 调试约束
-通过属性可设定约束文件是否有效及其有效阶段
-Vivado允许用户创建多个Constraint Set