我想确定一个设计元素是否存在(已编译)在ModelSim中的给定库中(我使用的是10.3c PE),但是我似乎无法找到合适的函数。像这样的理论代码:
if {[design_object exists $lib.$entity]} {
...
虽然不理想,但我可以通过以下方式检查某些自定义库:
if {[file exists $lib_path]} {
...
当然,这会使用文件系统访问权限,虽然理想情况下我希望检查逻辑名称,但这种解决方法现在已经足够用于我的有限用途。
不幸的是,设计实体似乎没有确切的等价物,因为ModelSim不会为编译实体创建单独的文件。我考虑过解析库的_info
文件中的实体名称,但这可能是一个相对较长的操作。这样做有内置的方法吗? ModelSim的Tcl扩展是否提供对逻辑名称的访问(在模拟上下文之外)?
答案 0 :(得分:2)
看起来vdir
命令是您以编程方式检查Modelsim库内容所需的命令。它返回一个多行字符串,其中每一行都有一个对象类型,后跟对象的名称。可以使用以下内容提取实体:
proc get_vdir_entities {lib_name} {
set contents [split [vdir -lib $lib_name] "\n"]
set rval {}
foreach c $contents {
if [regexp "^ENTITY" $c] {
lappend rval [lindex $c 1]
}
}
return $rval
}
set entities [get_vdir_entities "work"]
早期解决方案
查看_info文件显示所有编译的实体都记录为字符串,其名称前面带有“E”。 shell中的快速测试为我生成了一个全面的列表:
strings _info | sed -n -e "/^E/ p"
看起来在这些字符串“62 20 31 0a”hex之前有一个一致的前缀,它们以0a hex结尾。您可以使用以下内容在纯Tcl中进行提取:
proc get_modelsim_entities {info_file} {
set fh [open $info_file r]
fconfigure $fh -translation binary
set fields [split [read $fh] "\n"]
close $fh
set rval {}
foreach f $fields {
if [regexp -nocase "^E\[a-z0-9_\]+$" $f] {
lappend rval [string range $f 1 end]
}
}
return $rval
}
set entities [get_modelsim_entities "path/to/your/_info"]