From bee8d86e8b86d0678470b76e547974d8f5d3fc84 Mon Sep 17 00:00:00 2001 From: Nikolay Puzanov Date: Thu, 7 Jul 2022 19:59:51 +0300 Subject: [PATCH] Initial commit --- README.md | 156 +++++++++++++++++++++++++++++++++++++++++++++ output-example.png | Bin 0 -> 27170 bytes 2 files changed, 156 insertions(+) create mode 100644 README.md create mode 100644 output-example.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..ba4e5f8 --- /dev/null +++ b/README.md @@ -0,0 +1,156 @@ +UTest +===== + +UTest - приложение для одиночного или группового запуска и контроля выполнения тестбенчей на языке Verilog/SystemVerilog. +На данный момент реализована поддержка только [Icarus Verilog](http://iverilog.icarus.com/), но в дальнейшем +я планирую добавить поддержку [Verilator](https://www.veripool.org/verilator/) и [SymbiYosys](https://github.com/YosysHQ/sby). + +Если вызвать приложение с параметром `--help`, она выведет текст справки с описанием параметров: +``` +Usage: ./utest.scm [OPTION]... [FILE|PATH] +Run testbenches with recursive search in the PATH, or in the current folder +if PATH is not specified. If argument is a file, testbench is launched from FILE. + +Options: + -k, --keep Do not delete work directory if test is pass. + -d, --dump Force dump waveforms. + -r, --no-restart Do not restart testbench with waveform dump enabled if + test failed (true by default) + -n, --nocolor Do not use color for print log + -j, --jobs NUM Use NUM threads for running testbenches. If <=0 + use as many threads as there are processors in the system. + -f, --defines Print useful Verilog defines + -c, --clean Delete work folders that have a corresponding makefile. + --force-clean Delete all work folders regardless of the presence of a makefile. + -v, --verbose Verbose output + -h, --help Print this message and exit +``` + +Программа рекурсивно ищет все файлы с расширением `*.utest` и использует их в качестве сценариев запуска тестбенчей. +Если параметров указать файл, то будет использован он. + +Сценарии запуска тестбенчей описываются на языке Scheme (а именно [Guile](https://www.gnu.org/software/guile/), на котором +и написана программа), и представляют из себя скрипт, который возвращает функцию (или список функций). Эта функция +(функции) будет вызвана в процессе запуска тестов, и в зависимости от результатов её выполнения тест будет помечен как +успешный или неуспешный. Функция вызывается в контексте приложения, по этому ёй доступны все переменные и функции, +объявленные в коде приложения. + +Функция возвращает булево значение, и имеет один опциональный аргумент типа symbol. +Если функция вызвана без аргументов, она должна выполнить тестбенч и вернуть `#true` или `#false` в зависимости +от результата его выполнения. Если функции передается агрумент, то она должна вернуть некоторые метаданные в зависимости +от значения аргумента, или `#false` если таких метаданных нет. Сейчас использутся два типа метаданных - название теста +(агрумент `'name`) и описание теста (аргумент `'description`). + +Для того, чтобы не писать вручную диспетчеризацию агрументов в приложении есть макрос `utest/tb`, который упрощает +описание сценариев: + +```scheme +(utest/tb + ("Name" + "First line of testbench description" + "Second line of testbench description") + + ;; testbench body + ) +``` + +После имени макроса в скобках указывается имя тестбенча и произвольное количество строк описания. Если аргументов нет, +тестбенч будет помечен как `noname`. + +После скобочек с именем и описанием следует тело тестбенча. Тело - это любой валидный код на Guile, который будет выполнен +в процессе запуска тестбенчей. Результат работы этого кода должно быть булево значение, показывающее успешность выполнения +теста. Весь вывод в `stdout` будет перехвачен и отфильтрован в соответствии со значением флага `--verbose` и типом +выводимого текста. + +Для типизации вывода можно использовать функцию `utest/log`. Первый параметр функции - тип выводимого +текста (опциональный), второй - строка формата как в функции `format`. Возможны три варианта значения типа: `'info`, +`'warning` и `'error`. Сообщения всех трёх типов будет выведено на экран вне зависимости от флага `--verbose`, но если +тип не указать, сообщение будет выведено только в режиме `--verbose`. Независимо от типа сообщения и флага `--verbose` все +сообщения будут сохранены в логе в рабочей папке теста. + +Запуск симуляции в Icarus Verilog выполняется с помощью функции `utest/run-simulation-iverilog`. Функция принимает два +обязательных параметра и несколько опциональных: + +```scheme +(utest/run-simulation-iverilog + sources ; List of source files + top ; Name of the top module + + #:iverilog-executable "iverilog" ; Icarus Verilog compiler executable path + #:vvp-executable "vvp" ; Icarus Verilog simularot executable path + #:modpaths '() ; iverilog -y + #:modtypes '(".v" ".sv") ; iverilog -Y + #:includes '() ; ivetilog -I + #:lang "2012" ; Language version (1995, 2001, 2005, 2005-sv, 2009, 2012) + #:parameters '() ; Top module parameters (list (list NAME VALUE)) + #:defines '() ; Preprocessor defines (list NAME|(list NAME VALUE)) + #:features '() ; iverilog -g + #:separate #f ; iverilog -u + #:plusargs '() ; List of plusargs + #:vpimods '() ; iverilog -m, vvp -m + #:vpipaths '() ; iverilog -L, vvp -M + #:warnings "all" ; List of warning classes (iverilog -W...) + #:dumpformat 'fst ; Format of dump files. Posibly values: vcd, lxt, lxt2, fst + #:timeout '(1 ms) ; Testbench execution timeout (in simulation time) + ) + +``` + +*Все агрументы, кроме `parameters` и `defines`, которые принимают список, так же могут принимать и одиночные значения.* + +Функция возвращает `#true` в случае успешного завершения теста, и `#false` в случае ошибки. Далее приведен пример использования: + +```scheme +(map + (lambda (n data-width) + (utest/tb + ((format "uart_tx_test~a" n) + "Testbench for the UART transmitter RTL code" + (format "DATA_WIDTH = ~a" data-width)) + + (utest/log 'info "Example information message") + + ;; Start simulation + (utest/run-simulation-iverilog + '("uart_tx.sv" "uart_tx_tb.sv") + "uart_tx_tb" + #:includes "." + #:parameters `((DATA_WIDTH ,data-width)) + #:defines '(TESTBENCH) + #:timeout '(5 ms)))) + '(1 2 3) + '(8 16 24)) +``` + +Сценарий возвращает три теста с разным значением параметра DATA_WIDTH. В случае успешного выполнения на экран будет выведен +следующий текст: + +![output example](output-example.png) + +В случае неудачного завершения теста тест перезапускается с дампом всех сигналов в файл (это поведение можно отключить +опцией `--no-restart`). Кроме того, в случае ошибки будет выведен полный лог симулятора и его параметры. + +Опция `--defines` выводит на экран исходник include-файла с макросами вывода информационных сообщений в тестбенче на Verilog: + +```verilog +`ifndef UTEST_VERILOG_DEFINES + `define UTEST_VERILOG_DEFINES + +// Log level string prefixes for use with $display function. +// Example usage: $display("%sError message", `LOG_ERR); + `define LOG_INFO "INFO#" + `define LOG_WARN "WARN#" + `define LOG_ERR "FAIL#" + +// Dirty hacked redefine of $display function. Must be used with two parentheses. +// Example usage: `log_info(("Information message")); + `define log_info(msg) begin $display({`LOG_INFO, $sformatf msg}); end + `define log_warn(msg) begin $display({`LOG_WARN, $sformatf msg}); end + `define log_error(msg) begin $display({`LOG_ERR, $sformatf msg}); end +`endif +``` + +С помощью макроса `log_error` можно сообщить в UTest, что во время симуляции произошла ошибка. К сожалению, +в Icarus Verilog это пока единственная возможность сообщить об ошибке в тесте, т.к. при вызове функций `$error` +и `$fatal` симулятор возвращает нулевой exit code. В следующей версии авторы обещают исправить это досадное +недоразумение. diff --git a/output-example.png b/output-example.png new file mode 100644 index 0000000000000000000000000000000000000000..4a36331295ca998da5248803cc1c6a8f233b8c72 GIT binary patch literal 27170 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 literal 0 HcmV?d00001