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

时间:2018-11-11 10:11:40

标签: tcl vhdl modelsim

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

我已经搜索了stackoverflow,上下搜索了谷歌,并搜索了命令参考手册中的命令,但是找不到解决方案。我相信必须有一个相当简单的解决方案,而我只是缺乏适当的措辞来成功地寻找它。在我看来,这似乎并不过分具体,并且我相信在自动化设计测试的许多情况下,这可能会出现。我正在使用10.6版。

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

2 个答案:

答案 0 :(得分:2)

因此,我实际上找到了一个简单的解决方案。尽管进一步研究了命令参考手册,发现只能访问一些特殊的信号属性,而length却不是其中之一,但我注意到ModelSim会自动为它的对象数据库添加一个大小对象。内存阵列。这样我就可以轻松使用

set ms [examine sim/:tb:uut:imem:mem_array_size]

获取尺寸,然后检查程序是否适合。 这对我来说非常完美,优雅又轻松。

答案 1 :(得分:1)

免责声明:我不是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

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

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

您可以使用examine -showbase -radix hex获得第一个元素的位宽, 它将返回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 ""]
}

希望这会提供一些指示!