dxp 65 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба Всем привет! Обнаружилась непонятка в, казалось бы, совершенно безобидном месте. По непонятной причине симулятор после прогона возвращает код 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(). Ну и вообще, хочется разобраться, и чтобы работало правильно, а не на костылях. Буду благодарен за любые идеи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 225 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба Рецепты из https://stackoverflow.com/questions/25533774/how-can-i-make-modelsim-exit-with-a-specified-exit-code-from-systemverilog пробовали? И ещё в Modelsim Command Reference есть хороший пример в описании exit: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба Да, это сразу нагуглилось. Там вопрошающий делал выход по $finish, и удивлялся, что код ошибки не "ошибочный", ведь он же по асерту выходит. $fatal там, судя по всему, ведёт себя как надо. У меня исходно запуск осуществлялся так: vsim -c -do prj.tcl -do sim_begin -do sim_run где sim_run sim_begin run -all exit Так вот, если в коде есть $fatal или $error, то до exit дело не доходит - симулятор выходит неким иным путём. И по идее он должен сам вернуть код ошибки (там у него есть в доках таблица с кодами ошибки), что и происходит в обсуждении по ссылке. У меня же как раз этого не случается почему-то - возвращает 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 225 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба 2 минуты назад, dxp сказал: Так вот, если в коде есть $fatal или $error, то до exit дело не доходит - симулятор выходит неким иным путём. На этот случай и есть onbreak в примере из руководства Modelsim. Стоит попробовать, т.к. если этот или аналогичный метод перехвата события симулятора не сработает, то останется только парсить выхлоп vsim. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба В упомянутой таблице, например, есть: И если, скажем, удаляю рабочую библиотеку, то запуск получается такой: # 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 Т.е. всё чётко тут работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 225 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба Посмотрите описания onbreak, onerror, onfinish в руководстве и попробуйте назначить им обработчики. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба 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, что к моему случаю отношения не имеет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 225 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба 3 минуты назад, dxp сказал: И если, скажем, удаляю рабочую библиотеку, то запуск получается такой: Это другой этап работы vsim и другая логика. Нет файла - это фатально. Логические ошибки в процессе симуляции это ещё не повод завершения с фатальным кодом возврата. Только что, dxp сказал: Это не работает. По ходу, эта команда ловит ошибки в скриптах (тикле), а не в HDL. onbreak - это, судя по документации, обработка события breakpoint, что к моему случаю отношения не имеет. Остаётся только onfinish. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба 1 минуту назад, makc сказал: Это другой этап работы vsim и другая логика. Нет файла - это фатально. Логические ошибки в процессе симуляции это ещё не повод завершения с фатальным кодом возврата. Насколько понимаю, там ситуация такая: $error - ошибка, но сим не останавливается и едет до конца, сколько может. $fatal - ошибка и немедленный останов. В любом из этих случаев сим должен вернуть в ОС код ошибки, а не 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 225 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба 4 минуты назад, dxp сказал: onbreak - это, судя по документации, обработка события breakpoint, что к моему случаю отношения не имеет. И всё же попробовать стоит, тем более это совсем несложно. 3 минуты назад, dxp сказал: $fatal - ошибка и немедленный останов. В любом из этих случаев сим должен вернуть в ОС код ошибки, а не 0. Останов функции симуляции, но не процесса симулятора. Это не одно и то же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба 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 нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 225 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба 1 минуту назад, dxp сказал: Реакции ни на onerror, ни на onbreak нет. Добавьте ещё onfinish Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба 29 минут назад, makc сказал: Добавьте ещё onfinish Без изменений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 225 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба 5 минут назад, dxp сказал: Без изменений. Печально. И при этом есть команда runStatus, которая, судя по описанию, может вернуть те самые нужные статусы... Могу ещё только предложить поэкспериментировать с modelsim.ini, параметры которого (возможно) позволят получить необходимую реакцию. 1 час назад, dxp сказал: $fatal(); Попробуйте передать параметр 2 в $fatal(...). У меня есть предположение, что если ничего не передано, то внутри $fatal() происходит вызов $finish(0). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба 34 минуты назад, makc сказал: И при этом есть команда runStatus, которая, судя по описанию, может вернуть те самые нужные статусы... Эту пробовал. В пакетном режиме не понял, как её пользоваться (вызов ничего не делает и на консоль не выводит), в GUI режиме вызывал руками, там она печатает текстовый статус. В пакетном режиме опять же не ясно, как ей пользоваться, если в случае ошибок управление в скрипт из 'run -all' не возвращается. 37 минут назад, makc сказал: Попробуйте передать параметр 2 в $fatal(...). У меня есть предположение, что если ничего не передано, то внутри $fatal() происходит вызов $finish(0). К сожалению, тоже без изменений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться