0

如何定期在 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 并且您不知道模拟何时停止的情况下。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 ...
  }

可以替换“运行 10 ns”

或者,您可以使用指示模拟结束的信号

  signal end_of_sim   : std_logic := '0';
  ...
  end_of_sim <= '1'

在do-file中:

  when -label end_of_simulation {/end_of_sim == '1'} {
    echo "End of simulation"; 
    stop ;
    #quit -f
  }
4

1 回答 1

1

对于您的问题,这不是一个绝妙的解决方案,但它可以帮助您一点。

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

while ... {
    run 100 ns;
    mem save -outfile $filename...
}

请注意,Modelsim DO 文件是 TCL 文件。

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

onbreak {mem save ...}

每当您中断或停止模拟时,都会保存 RAM 的内容。然后你仍然需要一个触发器来打破模拟。有人吗?

于 2013-02-13T09:26:11.927 回答