相対配置制約をインプリメントするには、XDC マクロを使用する方が推奨されるため、実現可能な場合は常に RPM を XDC マクロに変換することをお勧めします。これには、手動で HDL ソースから RPM 属性を削除して、同等の XDC マクロを作成します。また、Tcl を使用して自動的に RPM 属性を XDC マクロに置換することもできます。
自動プロセスでは、次が実行されます。
- すべての HDL ソースで各 RPM 属性を次のような同様に命名された文字列に置き換えます。
-
hu_set
をm_hu_set
に置き換えます。 -
u_set
をm_u_set
に置き換えます。 -
rloc
をm_rloc
に置き換えます。
これにより、RPM は処理されなくなりますが、非アクティブな属性は、セル プロパティのように合成済みネットリストに渡されるようになります。
-
- 合成済みデザインを開くか、
link_design
を実行して、この非アクティブなプロパティに基づいて XDC マクロを作成します。たとえば、HU_SET にはそれぞれm_hu_set
というセル プロパティが付いており、同等の XDC マクロを作成するのに使用できます。元の HU_SET 内のセルには、それぞれ RLOC に変換可能なm_rloc
プロパティが付きます。 - この XDC マクロ定義を含むようになった制約を保存します。
変換には、Tcl を使用し、一意の m_hu_set
または m_uset
値に基づいた XDC マクロ セル リストを構築するのが最適な方法です。次は、単純な VHDL 変換例です。
元の VHDL ソースには、set0 という HU_SET RPM が含まれ、X0Y0 という RLOC を含むセルと、X0Y1 という RLOC を含むセルの 2 つのセルが含まれます。
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}
これら 2 つの XDC 制約は、デザイン制約の一部として保存できます。RPM 変換の大部分には、Tcl スクリプトの使用をお勧めします。次は、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"
}