Перейти к содержанию
    

Questa(Model)Sim. Exit code always 0.

Всем привет!

 

Обнаружилась непонятка в, казалось бы, совершенно безобидном месте. По непонятной причине симулятор после прогона возвращает код 0 там, где должна быть ошибка. Конкретно, вот есть код:

initial begin
    
    $fatal();
    $stop(2);
    
end

Запуск:

vsim -c -do prj.tcl -do sim_begin -do "run -all; exit"

prj.tcl содержит всё необходимое окружение - имена файлов, ключи, процедуры - например, указанная выше 'sim_begin' определена там же:

proc sim_begin { } {
    global vsim_cmd vsim_flags;

    quit -sim;

    set cmd [concat ${vsim_cmd} ${vsim_flags}];
    eval ${cmd}
    radix -hex
    log -r /*
}

При запуске выхлоп:

# run -all
# ** Fatal: Assertion error.
#    Time: 0 ps  Scope: top_tb File: top_tb.sv Line: 129
# ** Note: $finish    : top_tb.sv(129)
#    Time: 0 ps  Iteration: 0  Instance: /katun_tb
# End time: 10:39:56 on May 19,2022, Elapsed time: 0:00:01
# Errors: 1, Warnings: 2

Вроде норм. Но проверка кода возврата говорит:

$ echo $?                                                                                                                                             
0

Из-за этого не удаётся использовать прогон симулятора в пакетном режиме, когда в случае неуспеха вся сборка должна остановиться.

 

Если принудительно выходить с кодом ошибки, например, по команде 

exit -code 1

то код возврата правильный. Была идея закостылить - проверять наличие ошибки и выход делать вручную, как показано выше, но это не работает, т.к. в случае ошибки сим выходит сам, не достигая проверки, которая может быть запущена только после останова по $stop() или $finish().

 

Ну и вообще, хочется разобраться, и чтобы работало правильно, а не на костылях. Буду благодарен за любые идеи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рецепты из https://stackoverflow.com/questions/25533774/how-can-i-make-modelsim-exit-with-a-specified-exit-code-from-systemverilog пробовали?

И ещё в Modelsim Command Reference есть хороший пример в описании exit:

501509082_Screenshot_20220519-0715112.thumb.png.358a16f2ec4c47ff73a16aa045fed2f2.png

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, это сразу нагуглилось. Там вопрошающий делал выход по $finish, и удивлялся, что код ошибки не "ошибочный", ведь он же по асерту выходит. $fatal там, судя по всему, ведёт себя как надо. У меня исходно запуск осуществлялся так:

vsim -c -do prj.tcl -do sim_begin -do sim_run

где sim_run

sim_begin
run -all
exit

Так вот, если в коде есть $fatal или $error, то до exit дело не доходит - симулятор выходит неким иным путём. И по идее он должен сам вернуть код ошибки (там у него есть в доках таблица с кодами ошибки), что и происходит в обсуждении по ссылке. У меня же как раз этого не случается почему-то - возвращает 0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, dxp сказал:

Так вот, если в коде есть $fatal или $error, то до exit дело не доходит - симулятор выходит неким иным путём.

На этот случай и есть onbreak в примере из руководства Modelsim. Стоит попробовать, т.к. если этот или аналогичный метод перехвата события симулятора не сработает, то останется только парсить выхлоп vsim.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В упомянутой таблице, например, есть:

tFyOkFr.png

И если, скажем, удаляю рабочую библиотеку, то запуск получается такой:

# sim_begin
# vsim -lib wlib -wlf func.wlf -quiet opt_top_tb 
# Start time: 11:24:57 on May 19,2022
# ** Error (suppressible): (vsim-19) Failed to access library 'wlib'.
# No such file or directory. (errno = ENOENT)
# Error loading design
Error loading design
# End time: 11:24:57 on May 19,2022, Elapsed time: 0:00:00
# Errors: 1, Warnings: 0

и

$ echo $?                                                                                                                                             
12

 

Т.е. всё чётко тут работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите описания onbreak, onerror, onfinish в руководстве и попробуйте назначить им обработчики.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, makc сказал:

На этот случай и есть onbreak в примере из руководства Modelsim. Стоит попробовать, т.к. если этот или аналогичный метод перехвата события симулятора не сработает, то останется только парсить выхлоп vsim.

Пробовал onerror:

Цитата

onerror

Used in a DO file before a run command, specifies one or more commands to execute when a running script encounters an error.

Это не работает. По ходу, эта команда ловит ошибки в скриптах (тикле), а не в HDL. onbreak - это, судя по документации, обработка события breakpoint, что к моему случаю отношения не имеет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, dxp сказал:

И если, скажем, удаляю рабочую библиотеку, то запуск получается такой:

Это другой этап работы vsim и другая логика. Нет файла - это фатально. Логические ошибки в процессе симуляции это ещё не повод завершения с фатальным кодом возврата.

Только что, dxp сказал:

Это не работает. По ходу, эта команда ловит ошибки в скриптах (тикле), а не в HDL. onbreak - это, судя по документации, обработка события breakpoint, что к моему случаю отношения не имеет.

Остаётся только onfinish.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, makc сказал:

Это другой этап работы vsim и другая логика. Нет файла - это фатально. Логические ошибки в процессе симуляции это ещё не повод завершения с фатальным кодом возврата.

Насколько понимаю, там ситуация такая: $error - ошибка, но сим не останавливается и едет до конца, сколько может. $fatal - ошибка и немедленный останов. В любом из этих случаев сим должен вернуть в ОС код ошибки, а не 0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, dxp сказал:

onbreak - это, судя по документации, обработка события breakpoint, что к моему случаю отношения не имеет.

И всё же попробовать стоит, тем более это совсем несложно.

3 минуты назад, dxp сказал:

$fatal - ошибка и немедленный останов. В любом из этих случаев сим должен вернуть в ОС код ошибки, а не 0.

Останов функции симуляции, но не процесса симулятора. Это не одно и то же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, makc сказал:

И всё же попробовать стоит, тем более это совсем несложно.

proc run_sim {} {

    sim_begin;

    onerror {
        puts "<<<<<<<<<<<<<<<<<<<<<<<<<<<< onerror"
    }
    onbreak {
        puts "<<<<<<<<<<<<<<<<<<<<<<<<<<<< onbreak"
    }
    puts "################ before ##############"
    run -all
    puts "################ after ##############"
    exit

натыкал принтов отладочных, чтобы в логе было легче искать.

Выхлоп:

################ before ##############
# ** Fatal: Assertion error.
#    Time: 0 ps  Scope: top_tb File: top_tb.sv Line: 129
# ** Note: $finish    : top_tb.sv(129)
#    Time: 0 ps  Iteration: 0  Instance: /top_tb
# End time: 11:42:57 on May 19,2022, Elapsed time: 0:00:01
# Errors: 1, Warnings: 2
 $ echo $?                                                                                                                                    
0

Т.е. до run -all доходит, дальше нет (вываливается внутри по ошибке). Реакции ни на onerror, ни на onbreak нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, dxp сказал:

Реакции ни на onerror, ни на onbreak нет.

Добавьте ещё onfinish

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29 минут назад, makc сказал:

Добавьте ещё onfinish

Без изменений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, dxp сказал:

Без изменений.

Печально. И при этом есть команда runStatus, которая, судя по описанию, может вернуть те самые нужные статусы... Могу ещё только предложить поэкспериментировать с modelsim.ini, параметры которого (возможно) позволят получить необходимую реакцию.

 

1 час назад, dxp сказал:

$fatal();

Попробуйте передать параметр 2 в $fatal(...). У меня есть предположение, что если ничего не передано, то внутри $fatal() происходит вызов $finish(0).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

34 минуты назад, makc сказал:

И при этом есть команда runStatus, которая, судя по описанию, может вернуть те самые нужные статусы...

Эту пробовал. В пакетном режиме не понял, как её пользоваться (вызов ничего не делает и на консоль не выводит), в GUI режиме вызывал руками, там она печатает текстовый статус. В пакетном режиме опять же не ясно, как ей пользоваться, если в случае ошибок управление в скрипт из 'run -all' не возвращается.

 

37 минут назад, makc сказал:

Попробуйте передать параметр 2 в $fatal(...). У меня есть предположение, что если ничего не передано, то внутри $fatal() происходит вызов $finish(0).

К сожалению, тоже без изменений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...