File 在ModelSim中获取内存转储(定期)

File 在ModelSim中获取内存转储(定期),file,memory,dump,modelsim,File,Memory,Dump,Modelsim,如何定期在ModelSim中获取内存转储 我知道如何导出内存数据。是否有办法在.do文件中写入命令,以便每1000 ns或每x个周期导出内存数据 更新: 谢谢你的回答。 我现在的做法是: mkdir -p mlog set counter 0 set limit 30 while { true } { run 100 us incr counter +1 mem save -o ./mlog/spram1_${counter}.mem -f mti -data binary -a

如何定期在ModelSim中获取内存转储

我知道如何导出内存数据。是否有办法在.do文件中写入命令,以便每1000 ns或每x个周期导出内存数据

更新:

谢谢你的回答。 我现在的做法是:

mkdir -p mlog
set counter 0
set limit 30

while { true } {
   run 100 us
  incr counter +1
  mem save -o ./mlog/spram1_${counter}.mem -f mti -data binary -addr hex /ram_tb/spram1/mem
  mem save -o ./mlog/spram2_${counter}.mem -f mti -data binary -addr hex /ram_tb/spram2/mem
  /path/to/third/mem
}
在这种情况下,您使用了run-all-before,但不知道模拟何时停止。 VHDL测试用例当然应该有如下内容

ASSERT false
    REPORT "### End of Simulation!"
    SEVERITY failure;
要结束模拟(要获得更好的方法,请参见下面的答案,但这是可行的)

如果您知道模拟将运行多长时间,也可以使用以下方法:

  mkdir -p mlog
  set counter 0
  set limit 10

  while { $counter < $limit } {
    run 1 ns
    incr counter +1
    mem save -o ./mlog/filename1_${counter}.mem -f mti -data binary -addr hex /path/to/another/mem
    mem save -o ./mlog/filename2_${counter}.mem -f mti -data symbolic -addr hex -wordsperline 1 /path/to/mem
    ## mem save -o ./mlog/anotherfile ...
  }

对于你的问题来说,这不是一个很好的解决方案,但它可以帮你一点忙

在TCL while循环中,您可以执行以下两个命令:

while ... {
    run 100 ns;
    mem save -outfile $filename...
}
请注意,Modelsim DO文件是一个TCL文件

更好的解决方案是在“onbreak”函数中添加内存转储

onbreak {mem save ...}

无论何时中断或停止模拟,RAM的内容都将被保存。然后您仍然需要一个触发器来中断模拟。有人吗?

谢谢!我尝试了你的第一个建议,似乎奏效了。也许我可以编写类似“while(true){run 100 ns;break;}”的代码,并在onbreak函数中编写其余的mem save命令。我试图用“assert false report”End“severity failure”触发onbreak函数;但它不起作用。为什么?顺便说一句:一旦我有足够的声誉,我就会投票支持。当触发断点时,会调用“onbreak”函数。如果使用旧方法(断言…严重失败)停止模拟,则可以使用onerror函数。请注意,必须在TCL/DO文件中运行之前定义onerror函数。注意:2008年版本的VHDl有一种更好的停止或结束模拟的方法。使用“env.stop()”或“env.finished()”。
while ... {
    run 100 ns;
    mem save -outfile $filename...
}
onbreak {mem save ...}