makc 192 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба 15 минут назад, dxp сказал: В пакетном режиме опять же не ясно, как ей пользоваться, если в случае ошибок управление в скрипт из 'run -all' не возвращается. Да, вот это и странно, т.к. по логике она как раз нужна для получения статуса симуляции в обработчике события типа onbreak или onfinish. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 33 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба Ну, может в интерактивном режиме это и работает. А тут-то он просто вываливается шелл и всё, там уже нечего ловить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 192 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба В интерактивном режиме это вроде бы не имеет смысла, т.к. и так всё видно глазами. :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 33 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба Ну, для разного рода автоматизаций почему бы и да. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 192 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба Пример. Текст tb.sv: `timescale 1 ns/10 ps // time-unit = 1 ns, precision = 10 ps module tb; initial begin // $finish(); $fatal(); $stop(2); end endmodule Команда для теста: vlog tb.sv && vsim -c -do "vsim tb" -onfinish final -do "run -all" -do 'exit -code [expr {[runStatus] eq "ready" ? 0 : 1}]'; echo "exit code = $?" Если в tb вызывается $fatal или $stop, то код завершения 1: Скрытый текст makc@maximus:vsim$ vlog tb.sv && vsim -c -do "vsim tb" -onfinish final -do "run -all" -do 'exit -code [expr {[runStatus] eq "ready" ? 0 : 1}]'; echo "exit code = $?" QuestaSim-64 vlog 2021.1 Compiler 2021.01 Jan 19 2021 Start time: 09:54:23 on May 19,2022 vlog tb.sv -- Compiling module tb Top level modules: tb End time: 09:54:24 on May 19,2022, Elapsed time: 0:00:01 Errors: 0, Warnings: 0 Reading pref.tcl # 2021.1 # vsim tb # vsim tb # Start time: 09:54:24 on May 19,2022 # ** Note: (vsim-8009) Loading existing optimized design _opt # // Questa Sim-64 # // Version 2021.1 linux_x86_64 Jan 19 2021 # // # // Copyright 1991-2021 Mentor Graphics Corporation # // All Rights Reserved. # // # // QuestaSim and its associated documentation contain trade # // secrets and commercial or financial information that are the property of # // Mentor Graphics Corporation and are privileged, confidential, # // and exempt from disclosure under the Freedom of Information Act, # // 5 U.S.C. Section 552. Furthermore, this information # // is prohibited from disclosure under the Trade Secrets Act, # // 18 U.S.C. Section 1905. # // # Loading sv_std.std # Loading work.tb(fast) # run -all # ** Fatal: Assertion error. # Time: 0 ps Scope: tb File: tb.sv Line: 6 # ** Note: $finish : tb.sv(6) # Time: 0 ps Iteration: 0 Instance: /tb # Break at tb.sv line 6 # Stopped at tb.sv line 6 # exit -code [expr {[runStatus] eq "ready" ? 0 : 1}] # End time: 09:54:24 on May 19,2022, Elapsed time: 0:00:00 # Errors: 1, Warnings: 0 exit code = 1 и ещё при $finish: Скрытый текст makc@maximus:vsim$ vlog tb.sv && vsim -c -do "vsim tb" -onfinish final -do "run -all" -do 'exit -code [expr {[runStatus] eq "ready" ? 0 : 1}]'; echo "exit code = $?" QuestaSim-64 vlog 2021.1 Compiler 2021.01 Jan 19 2021 Start time: 09:56:03 on May 19,2022 vlog tb.sv -- Compiling module tb Top level modules: tb End time: 09:56:03 on May 19,2022, Elapsed time: 0:00:00 Errors: 0, Warnings: 0 Reading pref.tcl # 2021.1 # vsim tb # vsim tb # Start time: 09:56:03 on May 19,2022 # ** Note: (vsim-3813) Design is being optimized due to module recompilation... # // Questa Sim-64 # // Version 2021.1 linux_x86_64 Jan 19 2021 # // # // Copyright 1991-2021 Mentor Graphics Corporation # // All Rights Reserved. # // # // QuestaSim and its associated documentation contain trade # // secrets and commercial or financial information that are the property of # // Mentor Graphics Corporation and are privileged, confidential, # // and exempt from disclosure under the Freedom of Information Act, # // 5 U.S.C. Section 552. Furthermore, this information # // is prohibited from disclosure under the Trade Secrets Act, # // 18 U.S.C. Section 1905. # // # Loading sv_std.std # Loading work.tb(fast) # run -all # ** Note: $finish : tb.sv(5) # Time: 0 ps Iteration: 0 Instance: /tb # exit -code [expr {[runStatus] eq "ready" ? 0 : 1}] # End time: 09:56:03 on May 19,2022, Elapsed time: 0:00:00 # Errors: 0, Warnings: 0 exit code = 0 Так что всё работает. 31 минуту назад, dxp сказал: Ну, для разного рода автоматизаций почему бы и да. Да, совершенно верно, для автоматизаций. :-) Можно настроить глобально в конфиге: Цитата OnFinish This variable controls the behavior of ModelSim when it encounters either an assertion failure, a $finish, in the design code. Section [vsim] Syntax OnFinish = {ask | exit | final | stop} ask — (default) In batch mode, the simulation exits. In GUI mode, a dialog box pops up and asks for user confirmation on whether to quit the simulation. stop — Causes the simulation to stay loaded in memory. This can make some post- simulation tasks easier. exit — The simulation exits without asking for any confirmation. final — The simulation executes all final blocks then exits the simulation. You can override this variable by specifying vsim -onfinish. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 33 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба Да, ваш пример работает. Добавил к себе в код onfinish final, и таки да - это он управляет тем, будет ли исполняться код после run в случае ошибки. Но вот дальше, к сожалению, что-то не поехало: runStatus у меня всегда выдаёт break. onfinish final puts "################ before ##############" run -all puts "################ after ##############" puts [runStatus -full] exit -code [expr {[runStatus] eq "ready" ? 0 : 1}] по $stop(): ################ before ############## # ** Note: $stop : top_tb.sv(130) # Time: 0 ps Iteration: 0 Instance: /top__tb # Break at top__tb.sv line 130 # Stopped at top__tb.sv line 130 ################ after ############## break simulation_stop unknown # End time: 17:02:06 on May 19,2022, Elapsed time: 0:00:01 # Errors: 0, Warnings: 2 scons: *** Error 1 ######### rcode: 1 по $fatal(): ################ before ############## # ** Fatal: Assertion error. # Time: 0 ps Scope: top_tb File: top_tb.sv Line: 129 # ** Note: Data structure takes 115995132 bytes of memory # Process time 0.06 seconds # $finish : top_tb.sv(129) # Time: 0 ps Iteration: 0 Instance: /top_tb # Break at top_tb.sv line 129 # Stopped at top_tb.sv line 129 ################ after ############## break simulation_stop unknown # End time: 17:32:05 on May 19,2022, Elapsed time: 0:00:01 # Errors: 1, Warnings: 2 scons: *** Error 1 ######### rcode: 1 Т.е. runStatus всегда выдаёт break, что не совпадает с ready. Пытаюсь понять, в чём значимое отличие от вашего варианта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 192 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба 21 минуту назад, dxp сказал: Пытаюсь понять, в чём значимое отличие от вашего варианта. У меня ведёт себя также: $finish => ready $fatal => break $stop => break В теории еще есть параметр -full для runStatus но он по-моему тоже не позволяет отличить fatal от stop. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 33 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба Так я там выше с -full и использую. А с $finish() у меня выдаёт: break step_builtin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 192 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба 14 минут назад, dxp сказал: А с $finish() у меня выдаёт: break step_builtin В целом различить можно и этого достаточно для формирования кода возврата при ошибках. Боюсь, что большего нам от него добиться не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 33 19 мая, 2022 Опубликовано 19 мая, 2022 · Жалоба У меня по коду остановки везде сделаны через $stop(2) (чтобы можно было продолжить, если что). Не хотелось бы их менять на дурацкий $finish(), который вдобавок по умолчанию в GUI предлагает выйти из сима. Т.ч. как-то так себе решение. Вам большущее спасибо за участие и ценные подсказки! Поведение программы всё равно странное. При ошибках всё-таки должна возвращать код ошибки сама, а не вынуждать пользователя костылить это поведение. Ну, если хотелось гибкости - например, иметь возможность при ошибках не останавливать сборку, - это можно решить просто аргументом тех же $error/$fatal. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 33 23 мая, 2022 Опубликовано 23 мая, 2022 · Жалоба Резюме тезисно: Квеста не выдаёт ненулевой код ошибки при вызове $error(), $fatal() т.к. не считает это основанием для аварийного (т.е. когда надо возвращать код ошибки) завершения работы. Если пользователю нужно такое поведение, он должен об этом позаботиться сам - для этого предусмотрена команда Tcl API exit с опцией -code <n>. При вызове $fatal() поток управления не возвращается в скрипт, запустивший run [-all], что осложняет анализ результата симуляции. Для исправления этого поведения необходимо использовать команду onfinish с опцией final перед вызовом run. Анализ результатов симуляции может осуществляться несколькими способами: проверкой состояния симулятора с помощью команды runStatus. К сожалению, все остановы, кроме $finish() не различаются, т.е. нет возможности определить, остановка случилась по $stop() или $fatal(). созданием в HDL коде переменной состояния, которая будет отражать результат симуляции. Значение этой переменной по окончании прогона можно проинспектировать с помощью команды examine. К сожалению, и тут существует недостаток: эту переменную состояния симулятор может оптимизировать, т.ч. может оказаться, что инспектировать будет нечего. запись состояния во внешний файл - например, записывать туда код завершения. В запускающем скрипте на старте проверять наличие этого файла и удалять. После останова снова проверять: если файла нет, то значит завершение без ошибок, если появился, то считывать из него код и, например, возвращать его при завершении работы симулятора. Пример реализации с помощью внешнего файла (фрагменты): // HDL function automatic void __sim_fatal_error(int code); int fd = $fopen("sim_error_status_code", "w"); $fwrite(fd, code); $fclose(fd); $fatal(); endfunction # Tcl ... set errcode sim_error_status_code if { [file exists $errcode] } { file delete $errcode } onfinish final run -all if { [file exists $errcode] } { set fd [open $errcode r] set exit_code [read $fd] close $fd } else { set exit_code 0 } exit -code $exit_code В итоге на этом способе и остановился. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться