如何通过TCL访问ModelSim中的VHDL信号属性?

如何通过TCL访问ModelSim中的VHDL信号属性?,tcl,vhdl,modelsim,Tcl,Vhdl,Modelsim,我正在用VHDL开发一个CPU。我正在使用ModelSim进行模拟和测试。在模拟脚本中,我将一个程序从二进制文件加载到指令内存。现在,我想自动检查程序是否适合内存,如果不适合,则中止模拟。由于内存基本上是一个std_逻辑_向量数组,所以我所要做的就是读取相应的信号属性,以便在比较中使用。我的问题是:如何在ModelSim中访问TCL中的VHDL信号属性 到目前为止,我最接近的方法是使用descripe命令: describe sim/:tb:uut:imem:mem_array 上面印的是 #

我正在用VHDL开发一个CPU。我正在使用ModelSim进行模拟和测试。在模拟脚本中,我将一个程序从二进制文件加载到指令内存。现在,我想自动检查程序是否适合内存,如果不适合,则中止模拟。由于内存基本上是一个std_逻辑_向量数组,所以我所要做的就是读取相应的信号属性,以便在比较中使用。我的问题是:如何在ModelSim中访问TCL中的VHDL信号属性

到目前为止,我最接近的方法是使用descripe命令:

describe sim/:tb:uut:imem:mem_array
上面印的是

# Array(0 to 255) [length 256] of
#   Array(31 downto 0) [length 32] of
#     VHDL standard subtype STD_LOGIC
现在,我当然可以通过字符串操作解析长度。但这不是一个非常通用的解决方案。理想情况下,我想要这样的东西:

set mem_size [get_attribute sim/:tb:uut:imem:mem_array'length]
我搜索了stackoverflow,上下搜索了一下,并在命令参考手册中搜索了命令,但我找不到解决方案。我相信一定会有一个相当简单的解决办法,我只是缺乏适当的措辞来成功地寻找它。对我来说,这看起来不太具体,我相信在很多情况下,当自动化设计测试时,这可能会出现。我使用的是10.6版


如果有一位经验丰富的ModelSim用户能帮助我,我将不胜感激。

免责声明:我不是Tcl专家,因此可能有一个更优化的解决方案

有一个名为
examine
的命令,可以用来获取obejcts的值

我在这里用256 x 32阵列创建了一个类似的测试台,结果是

VSIM> examine -radix hex sim/:tb:uut:imem:mem_array
# {32'hXXXXXXXX} {32'hXXXXXXXX} {32'hXXXXXXXX} {32'hXXXXXXXX} {32'hXXXXXXXX} ...
这是最后一个模拟步骤中的
sim/:tb:uut:imem:mem_数组的值(即。,
现在

该命令返回每个匹配的值列表(可以使用通配符),因此 在我们的例子中,它是一个包含单个项目的列表。你可以通过计数得到深度 它返回的元素数:

VSIM> llength [lindex  [examine sim/:tb:uut:imem:mem_array] 0]
# 256
您可以使用
examine-showbase-radix hex
获得第一个元素的位宽度, 它将返回
32'hffffff
,其中
32'h
是您要分析的部分。包装 将其转换为一个函数

proc get_bit_width { signal } {
    set first_element [lindex [lindex [examine -radix hex -showbase $signal] 0] 0]
    # Replace everything after 'h, including 'h itself to return only the base
    return [regsub "'h.*" $first_element ""]
}

希望这能给我们一些启示

因此,我实际上找到了一个简单的解决办法。在进一步研究《命令参考手册》时,我发现只能访问一些特殊的信号属性,
length
不是其中之一,但我注意到ModelSim会自动将一个大小对象添加到内存阵列的对象数据库中。所以我可以很容易地使用

set ms [examine sim/:tb:uut:imem:mem_array_size]
获取尺寸,然后检查程序是否适合。
这对我来说太完美了,既优雅又简单。

谢谢。这其实很有帮助,我正要接受这个答案,但后来我偶然发现了一个更简单的解决方案。不用担心,这对我来说也是新的,而且确实很有帮助!对于ModelSim Microsemi Pro 10.5c(2016.07版),需要用括号括住检验参数。需要更多句号“.”而不是冒号“:”作为路径中的分隔符:

检查{tb.foo_package.bar_constant}