Получить дамп памяти в ModelSim (периодический)

Как я могу регулярно получать дамп памяти в ModelSim?

Я знаю, как экспортировать данные памяти. Есть ли способ записать в файл .do команду для экспорта данных памяти каждые 1000 нс или каждые 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 нс»

в качестве альтернативы вы можете использовать сигнал, указывающий на конец симуляции

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

и в do-файле:

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

person Sadik    schedule 12.02.2013    source источник


Ответы (1)


Это не блестящее решение вашей проблемы, но оно может вам немного помочь.

В цикле TCL вы можете выполнить следующие две команды:

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

Обратите внимание, что файл Modelsim DO является файлом TCL.

Лучшим решением было бы добавить дамп памяти в функцию «onbreak».

onbreak {mem save ...}

Всякий раз, когда вы прерываете или останавливаете симуляцию, содержимое оперативной памяти будет сохранено. Тогда вам все еще нужен триггер, чтобы сломать симуляцию. Кто-то?

person vermaete    schedule 13.02.2013
comment
Благодарность! Я попробовал ваше первое предложение, и, похоже, оно сработало. Может быть, я могу написать что-то вроде «пока (правда) { запустить 100 нс; ломать; }' и напишите остальные команды сохранения памяти в функции onbreak. - person Sadik; 13.02.2013
comment
Я пытаюсь запустить функцию прерывания с подтверждением ложного отчета. Конец серьезности ошибки; но это не работает. Зачем? кстати: я буду голосовать, как только у меня будет достаточно репутации - person Sadik; 14.02.2013
comment
Функция onbreak вызывается, когда срабатывает точка останова. Если вы остановите симуляцию старым способом (утвердить... серьезный сбой), вы можете использовать функцию onerror. Обратите внимание, что функция onerror должна быть определена до запуска в файле TCL/DO. Примечание: версия VHDl 2008 года имеет более удобный способ остановить или завершить симуляцию. используйте «env.stop()» или «env.finished()». - person vermaete; 14.02.2013