描述
在ISE中,我可以在UCF中使用以下命令 在设计中查询寄存器“a_inst / b_inst / c_inst / data_out_reg_r”:
INST“* / data_out_reg_r”TNM =“group1”;
但是,当我使用相同的模式在Vivado中查询相同的寄存器(保留设计层次结构)时,我得到以下内容:
%get_cells * / data_out_reg_r
警告:[Vivado 12-180]没有单元格匹配’* / data_out_reg_r’。
%get_cells -hier * / data_out_reg_r
警告:[Vivado 12-180]没有单元格匹配’* / data_out_reg_r’。
通过查询其全名,可以在设计中找到该寄存器:
%get_cells a_inst / b_inst / c_inst / data_out_reg_r
a_inst / b_inst / c_inst / data_out_reg_r
Vivado中的“get_cells”命令有什么问题?
解
对象名称中的层次结构分隔符“/”在XDC和UCF中的工作方式不同。
在Vivado中,通配符*不会跨层次结构解析。
在Vivado中查询对象时,对象层次结构名称中表示保留层次结构边界(1)的“/”字符不能替换为通配符*。
在UCF中,对象层次结构名称中的层次结构分隔符“/”只是名称的一部分,可以用通配符*替换。
这就像Vivado中的场景一样,其中所有层次结构都是扁平化的,并且所有设计对象都处于同一级别。
这就像Vivado中的场景一样,其中所有层次结构都是扁平化的,并且所有设计对象都处于同一级别。
在上面的示例中,“get_cells * / data_out_reg_r”在顶级下的第一级子模块中搜索名为“ data_out_reg_r” (2)的单元格。
“get_cells -hier * / data_out_reg_r”在所有级别的层次结构中搜索名为“* / data_out_reg_r”的单元格。
所以这两个命令不会返回任何对象。
要返回正确的对象,应使用以下命令之一。
get_cells * / * / * / data_out_reg_rget_cells -hier data_out_reg_rget_cells -hier -filter {NAME =〜* / data_out_reg_r}get_cells -hier -regexp。* data_out_reg_r
要在UCF中以类似的方式搜索对象,可以使用对象的NAME属性。
get_cells -hier -filter {NAME =〜* / data_out_reg_r}
NAME属性中的层次结构分隔符“/”是普通字符,就像在UCF中一样。
有一点需要注意的是,Vivado中的引脚分层名称中的“/”意味着两个不同的东西。
例如,对于引脚“a_inst / b_inst / c_inst / data_out_reg_r / Q”,最后一个“/”是引脚名称“data_out_reg_r / Q”的一部分。
另一个“/”是层次结构分隔符。
虽然最后一个“/”不是层次结构分隔符,但它仍然不能被通配符*替换。
因此,可以通过以下命令返回此引脚:
get_pins * / * / * / data_out_reg_r / Q.get_pins -hier data_out_reg_r / Q.get_pins -hier data_out_reg_r / *get_pins -hier * / Q.
以下命令不捕获“a_inst / b_inst / c_inst / data_out_reg_r / Q”:
%get_pins * Q.警告:[Vivado 12-508]没有引脚匹配’* Q’。%get_pins a_inst / b_inst / c_inst / data_out_reg_r *警告:[Vivado 12-508]没有引脚匹配’a_inst / b_inst / c_inst / data_out_reg_r *’。%get_pins -hier Q.警告:[Vivado 12-508]没有引脚匹配’Q’。%get_pins a_inst / b_inst / c_inst / *—此命令返回c_inst边界上的分层引脚(例如a_inst / b_inst / c_inst / I1),但不返回此层次结构中的任何引脚。
笔记:
(1)可以通过以下方法保留层次结构边界:
一个。 -flatten_hierarchy = none或重建
湾模块/实体级别的“keep_hierarchy = true”
C。模块/实体级别的“dont_touch = true”
(2)对象的名称和层次名称:“data_out_reg_r”是对象的名称,“a_inst / b_inst / c_inst / data_out_reg_r”是对象的层次名称。
但是,当设计层次结构变平时,对象的名称将变为“a_inst / b_inst / c_inst / data_out_reg_r”,因为所有对象都处于同一级别。
但是,当设计层次结构变平时,对象的名称将变为“a_inst / b_inst / c_inst / data_out_reg_r”,因为所有对象都处于同一级别。


没有回复内容