【问题标题】:How to access VHDL signal attributes in ModelSim via TCL?如何通过 TCL 访问 ModelSim 中的 VHDL 信号属性?
【发布时间】:2018-11-11 10:11:40
【问题描述】:

我正在用 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]

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

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

【问题讨论】:

    标签: tcl vhdl modelsim


    【解决方案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 ""]
    }
    

    希望这能提供一些指导!

    【讨论】:

    • 谢谢。这实际上很有帮助,我正准备接受这个作为答案,但后来我偶然发现了一个更简单的解决方案。
    • 别担心,这对我来说也是新的,而且真的很有帮助!
    【解决方案2】:

    所以,我实际上找到了一个简单的解决方案。在进一步研究命令参考手册时发现只能访问一些特殊的信号属性,length 不是其中之一,我注意到 ModelSim 会自动将大小对象添加到内存数组的对象数据库中.所以我可以轻松使用

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

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

    【讨论】:

    • 对于 ModelSim Microsemi Pro 10.5c (Rev 2016.07),需要用括号括住检查参数。需要更多句点“.”而不是冒号“:”作为路径中的分隔符:

      examine {tb.foo_package.bar_constant}

      我接受来自@programonkey 的回答,但由于我没有足够的声誉,因此无法将其作为评论输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多