2014-09-18 26 views
1

我想确定设计元素是否存在(已编译)在使用Tcl的ModelSim(我正在使用10.3c PE)的给定库中,但我可以似乎找不到合适的功能。事情是这样的理论代码:确定设计元素是否存在于使用脚本的库中

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

虽然不是很理想,我可以检查具有一定的自定义库:

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

它使用一个文件系统的访问,当然,同时最好我也喜欢检查一个逻辑名称,这种解决方法对于我现在有限的目的来说已经足够了。

不幸的是,似乎没有设计实体的确切等价物,因为ModelSim不会为编译实体创建单个文件。我已经考虑解析库的_info文件的实体名称,但这可能是一个相对较长的操作。有没有内置的方法来做到这一点? ModelSim的Tcl扩展甚至可以访问逻辑名称(在仿真环境之外)吗?

+0

Modelsim实体是否映射到命令?如果是这样,我们可以做一个检查。否则,通用Tcl中没有任何东西可以真正提供帮助;这将是Modelsim必须提供的功能(因为它可以理解它的自定义句柄...) – 2014-09-18 20:25:22

回答

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”前缀,以他们的名字字符串。在外壳的快速测试生成一个完整列表对我来说:

strings _info | sed -n -e "/^E/ p" 

它看起来像有“62 20 31 0A”十六进制的这些字符串之前一致的前缀和他们终止0A十六进制。您可以使用以下方法在纯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"] 
+0

我注意到 - 虽然我真的希望避免解析文件,但是,特别是如果我想随机执行检查并频繁。 – fru1tbat 2014-09-18 22:49:48

+0

进一步研究'vdir',看起来它也可以采用''参数,这使调用更容易检查单个实体。谢谢! – fru1tbat 2014-09-22 13:29:26

相关问题