2015-01-08 2 views
0

Я пытаюсь автоматизировать модульное тестирование кода VHDL с использованием TCL-скрипта (TCL версии 8.4) в ModelSim (6.5 PE).Получить контекст инициированного утверждения в ModelSim onbreak

Основываясь на relevant TCL-reference manual, я в настоящее время могу обрабатывать утверждения с помощью команды onbreak {} следующим образом, что позволяет мне продолжать или прекращать моделирование контролируемым образом.

Тем не менее, я также хотел бы иметь возможность использовать в этом обработчике некоторый контекст, в частности имя файла, номер строки и метку утверждения, вызвавшего перерыв. Затем я перешлю эту информацию в инструмент непрерывной интеграции.

proc break_handler {} { 
    upvar #0 now now 
    # this is where I would need some more information about the current break point: 
    set break_point_information "???" 
    puts "Break: after $now with $break_point_information!" 

    # prevent infinite simulation: 
    if {$some_condition} { 
     stop 
    } else { 
     run -continue 
    } 
} 

# Skipped: scripted compilation of project 

# Stop on Note (1) ... Failure (4) 
set BreakOnAssertion 1 
onbreak { break_handler } 

# Skipped: scripted simulation start and report generation 

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

# ** Warning: End of Testbench 
# Time: 1234 ns Iteration: 0 Process: /something/testing File: C:/something.vhd 
# Break in Process testing at C:/comething.vhd line 1234 

Следовательно, я мог бы записывать и анализировать transcript file. Тем не менее, это то, чего я хотел избежать в первую очередь ... Ближайший я пришел, используя [runStatus -full], но это дает гораздо меньше информации (например, только break simulation_stop).

+0

транскрипт единственный способ получить информацию о неудачах утверждений и других условий ошибки. Если вы запускаете vsim в подпроцессе с помощью языка сценариев (а не внутреннего Tcl interp), вы также можете анализировать stdout для каждого вызова команды, чтобы избежать необходимости читать всю расшифровку, если это проблема. –

+0

@KevinThibedeau К сожалению, не то, на что я надеялся, но спасибо за подтверждение. То, как вы формулируете свой комментарий, подразумевает, что вы совершенно уверены в этом. У вас есть какой-нибудь источник? – mbschenkel

+0

Руководство. Modelsim никогда не имел хорошей поддержки для создания «сложных» вещей с симуляцией. –

ответ

2

Свободный и открытый источник VUnit (https://github.com/LarsAsplund/vunit), который мы разработали, обеспечивает то, что вы ищете. Он укажет на местоположение ошибки и даст вам стек вызовов. У нас в основном есть внутренний сигнал, который устанавливается истинным testbench (процедура test_runner_cleanup в конце), если ошибок нет. Если этот сигнал не задан по какой-либо причине (процедура может вообще не вызываться, если тестовая среда настроена на остановку при неудачном утверждении), это увидит фрагмент кода tcl, вызываемый нашим скриптом Python. Вот отрывок из TCL https://github.com/LarsAsplund/vunit/blob/master/vunit/modelsim_interface.py

run -all 
set failed [expr [examine -internal ${status_boolean}]!=TRUE] 
if {$failed} { 
    catch { 
     # tb command can fail when error comes from pli 
     echo 
     echo "Stack trace result from 'tb' command" 
     echo [tb] 
     echo 
     echo "Surrounding code from 'see' command" 
     echo [see] 
    } 
} 
+0

Это хороший инструментарий, спасибо за обмен. Является ли vunit получение этой информации от разбора транскрипта, из vhdl или действительно ли это достигается с помощью команд modelsim tcl? – mbschenkel

+1

Tcl. Я обновил ответ, чтобы поделиться более подробной информацией. – lasplund

Смежные вопросы