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

How to access VHDL signal attributes in ModelSim via TCL?

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

到目前为止我最接近的是使用 describe 命令:

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]

我在Whosebug上搜索过,在google上搜索过,在命令参考手册中搜索过命令,但我找不到解决办法。我相信一定有一个相当简单的解决方案,我只是缺少正确的措辞来成功搜索它。对我来说,这看起来并不过分具体,而且我相信在自动化设计测试时,这会在很多场合派上用场。我使用的是 10.6 版。

如果有经验的 ModelSim 用户可以帮助我,我将不胜感激。

免责声明:我不是 Tcl 专家,所以可能有更优化的解决方案。

有一个名为 examine 的命令,您可以使用它来获取对象的值。

我在这里用 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_array 的值(即, now).

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

VSIM> llength [lindex  [examine sim/:tb:uut:imem:mem_array] 0]
# 256

可以通过examine -showbase -radix hex获取第一个元素的位宽, 这将 return 32'hFFFFFFFF,其中 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]

获取大小,然后检查程序是否适合。 这对我来说是完美的,优雅而简单。