vivado 将RPM转换为XDC宏

将RPM转换为XDC宏

建议在可行的情况下将RPM转换为XDC宏,因为XDC宏是实现相对放置约束的优选方法。这个过程可以完成通过从HDL源中删除RPM属性并创建等效的XDC来手动宏。通过使用Tcl代替RPM,转换也可以在一定程度上自动完成具有XDC宏约束的属性。

自动化过程包括以下步骤:

1.在所有HDL源中,将每个RPM属性替换为名称相似的字符串,例如:

•将hu_set替换为m_hu_set

•将u_set替换为m_u_set

•用m_rloc替换rloc

这样可以确保RPM不被处理,但传递非活动属性到作为单元属性的合成网表。

2.打开合成的设计或运行link_design并基于非活动属性。例如,每个HU_SET都有一个称为m_HU_SET的单元格属性其可用于创建等效的XDC宏。原始HU_SET中的每个单元格将具有可转换为rloc的属性m_ rloc。

3.保存现在包括XDC宏定义的约束。

转换最好使用Tcl来完成,方法是基于它们的唯一的m_hu_set或m_uset值。下面是一个简单的VHDL转换示例。原始VHDL源包括一个名为set0的HU_SET RPM,该RPM具有两个单元,其中一个具有RLOCX0Y0,另一个具有RLOC X0Y1。

signal r0 : std_logic;
signal r1 : std_logic;
attribute hu_set : string;
attribute rloc : string;
attribute hu_set of r0 : signal is "set0";
attribute hu_set of r1 : signal is "set0";
attribute rloc of r0 : signal is "X0Y0";
attribute rloc of r1 : signal is "X0Y1";

接下来,VHDL源被修改为用类似名称但不活动的替换hu_set和RLOC属性:

signal r0 : std_logic;
signal r1 : std_logic;
attribute m_hu_set : string;
attribute m_rloc : string;
attribute m_hu_set of r0 : signal is "set0";
attribute m_hu_set of r1 : signal is "set0";
attribute m_rloc of r0 : signal is "X0Y0";
attribute m_rloc of r1 : signal is "X0Y1";
合成后,可以基于这些类似命名的特性对细胞进行过滤:
Vivado% get_cells -filter {m_hu_set == "set0"}
r0_reg r1_reg
Vivado% get_property m_rloc [get_cells {r0_reg r1_reg}]
X0Y0 X0Y1
这提供了创建XDC宏以替换RPM所需的信息:
Vivado% create_macro set0
Vivado% update_macro set0 {r0_reg X0Y0 r1_reg X0Y1}

这两个XDC约束可以保存为设计约束的一部分。大量的使用Tcl脚本可以更好地处理RPM转换。以下是要转换的脚本示例HU_SET RPM到XDC宏。

# create a sorted list of all unique RPMs according to m_hu_set values
set RPMs [lsort -uniq [get_property m_hu_set [get_cells -hier -filter
{primitive_level != INTERNAL}]]]
# remove the first element which is empty (no m_hu_set property)
set RPMs [lrange $RPMs 1 end]
# iterate over list of RPMs, convert each to an XDC macro
# get each RPM cell of the RPM with its RLOC
# build a list for the update_macro command
foreach rpm $RPMs {
create_macro $rpm
set cells [get_cells -hier -filter "m_hu_set == $rpm"]
set rlocs [list]
foreach cell $cells { lappend rlocs $cell
lappend rlocs [get_property m_rloc $cell]
}
update_macro $rpm $rlocs
puts "created XDC macro $rpm, cell list: rlocs"
}
foreach rpm $RPMs {
create_macro $rpm
set cells [get_cells -hier -filter "m_hu_set == $rpm"] set rlocs [list]
foreach cell $cells { lappend rlocs $cell
lappend rlocs [get_property m_rloc $cell]
}
update_macro $rpm $rlocs
puts "created XDC macro $rpm, cell list: $rlocs"
}

你可能感兴趣的:(fpga开发)