使用脚本确定库中是否存在设计元素

时间:2014-09-18 18:44:11

标签: tcl modelsim

我想确定一个设计元素是否存在(已编译)在ModelSim中的给定库中(我使用的是10.3c PE),但是我似乎无法找到合适的函数。像这样的理论代码:

if {[design_object exists $lib.$entity]} {
  ...

虽然不理想,但我可以通过以下方式检查某些自定义库:

if {[file exists $lib_path]} {
  ...

当然,这会使用文件系统访问权限,虽然理想情况下我希望检查逻辑名称,但这种解决方法现在已经足够用于我的有限用途。

不幸的是,设计实体似乎没有确切的等价物,因为ModelSim不会为编译实体创建单独的文件。我考虑过解析库的_info文件中的实体名称,但这可能是一个相对较长的操作。这样做有内置的方法吗? ModelSim的Tcl扩展是否提供对逻辑名称的访问(在模拟上下文之外)?

1 个答案:

答案 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"]