在常规非DFX(Dynamic Function eXchange)的Vivado设计中,我们可能会碰到给某一个指定的模块添加特定的约束。这时一个简单的方法就是将这些约束单独写在一个.xdc或.tcl文件中,然后将其添加到Vivado工程中,并将该约束文件的属性SCOPE_TO_CELLS设定为目标模块。如果该模块在设计中被多次实例化,不管这些实例化模块在设计中的层次如何,此时可设置该约束文件的属性SCOPE_TO_REF,如下图所示。这里我们就能理解对于一个cell其属性NAME和REF_NAME的区别:前者是实例化后的名字,后者为引用名(可以理解为Verilog的module name或VHDL的entity name)。另外,需要特别注意的是使用上述方法时,在.xdc或.tcl文件中的约束其施加的对象是以该指定模块作为顶层的而不是以实际工程的顶层作为顶层。如果采用Non-Project模式,那么可以通过read_xdc读入约束文件,然后通过set_property命令指定约束文件的属性SCOPE_TO_CELLS或者SCOPE_TO_REF。
在DFX设计中,我们也会碰到类似的情形,即给同一个RP(Reconfigurable Partition)下的不同RM(Reconfigurable Module)添加不同的约束。这时要考虑几个因素:同一个RP下不管有几个RM,在设计中均对应同一个实例化的名字。这意味着不能仅仅通过SCOPE_TO_CELLS将这些约束对应到不同的RM上。另外,每个RM只有在自身对应的configuration上才有效,所以要保证在这个configuration上对应的RM的约束也要有效。从下图可以看到,当前这个DFX设计中有一个RP,名字为图中红色方框所示,该RP下有两个RM,分别为rp1rm1和rp1rm2。
基于上图所示DFX设计,现在我们要分别对rp1rm1和rp1rm2添加不同的约束。这里我们先介绍一下DFX设计的约束管理模式。在DFX设计中,约束是按configuration分组的。这是因为不同的configuration对应不同的RM。但不管有几个configuration,都会有主约束,也就是Parent Run对应的约束,默认在constrs_1下。主约束包括:顶层IO约束(管脚分配/电平设置/input delay/output delay)、全局时钟周期约束和每个RP的Pblock信息。主约束在运行Parent Run时生效,并在运行结束之后锁定静态区时一同被锁定,因此,后续的Child Run会直接获得这些约束信息不需要重写一遍。默认情况下,Child Run并没有单独的Constraint Set,也就没有单独的约束文件。如果要针对RM施加约束,而RM又出现在Child Run,就要建立新的Constraint Set,这需要如下几个步骤完成。
第一步:创建与指定RM相关的约束,这些约束应放在单独的.xdc文件中。
第二步:创建新的Constraint Set,并将第一步创建的约束文件添加到该Constraint Set下。
除了Parent Run之外,有几个Child Run,如果这些Child Run里的RM又需要单独约束,那么就要创建几个Constraint Set。创建Constraint Set的方法如下图所示。
第三步:运行DFX Wizard到Edit Configuration Runs界面,如下图所示。在对应的Constraints列选择相应的Constraint Set,如图中红色方框所示。
在Design Run窗口中就能看到相应的Child Run对应的Constraint Set,如下图中的红色方框所示。如果没生效,要确保Child Run的Property APPLY_CONSTRSET被勾选。
上述过程针对的是Vivado Project模式。在Non-Project模式下,当运行rp1rm2对应的Configuration时,要先打开锁定静态区布线信息的dcp(在这个dcp中,RP均为黑盒子),然后加载对rp1rm2 OOC综合生成的dcp,这个过程结束之后即可通过read_xdc读入针对rp1rm2的约束文件。
针对RM的约束文件,通常要设定以下几个属性:PROCESSING_ORDER,SCOPED_TO_CELLS和USED_IN,如图中红色方框所示。
没有回复内容