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