我正在用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用户可以帮助我,我将不胜感激。
答案 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 ""]
}
希望这会提供一些指示!