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

Questa(Model)Sim. Exit code always 0.

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

В пакетном режиме опять же не ясно, как ей пользоваться, если в случае ошибок управление в скрипт из 'run -all' не возвращается.

Да, вот это и странно, т.к. по логике она как раз нужна для получения статуса симуляции в обработчике события типа onbreak или onfinish.

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


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

Ну, может в интерактивном режиме это и работает. А тут-то он просто вываливается  шелл и всё, там уже нечего ловить.

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


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

В интерактивном режиме это вроде бы не имеет смысла, т.к. и так всё видно глазами. :-)

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


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

Пример. Текст 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.

 

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


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

Да, ваш пример работает. Добавил к себе в код 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. 

 

Пытаюсь понять, в чём значимое отличие от вашего варианта.

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


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

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

Пытаюсь понять, в чём значимое отличие от вашего варианта.

У меня ведёт себя также:
$finish => ready
$fatal => break
$stop => break

В теории еще есть параметр -full для runStatus но он по-моему тоже не позволяет отличить fatal от stop.

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


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

Так я там выше с -full и использую.

 

А с $finish() у меня выдаёт:

 

break step_builtin

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


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

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

А с $finish() у меня выдаёт:

break step_builtin

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

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


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

У меня по коду остановки везде сделаны через $stop(2) (чтобы можно было продолжить, если что). Не хотелось бы их менять на дурацкий $finish(), который вдобавок по умолчанию в GUI предлагает выйти из сима. Т.ч. как-то так себе решение.

 

Вам большущее спасибо за участие и ценные подсказки!

 

Поведение программы всё равно странное. При ошибках всё-таки должна возвращать код ошибки сама, а не вынуждать пользователя костылить это поведение. Ну, если хотелось гибкости - например, иметь возможность при ошибках не останавливать сборку, - это можно решить просто аргументом тех же $error/$fatal.

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


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

Резюме тезисно:

 

  • Квеста не выдаёт ненулевой код ошибки при вызове $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

В итоге на этом способе и остановился.

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


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

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

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

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

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

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

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

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

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

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