Установка iVerilog
С последним икарусом пришлось немного попотеть, как обычно бывает, в репах дистрибутива древняя как еда мамонта версия, а сборка из исходников падает из-за старого gcc, если вкратце — надо установить последний devtoolset и и зависимости в лице gperf:
1 2 | scl enable devtoolset-4 bash sudo yum install -y gperftools gperf gperftools-devel gperftools-libs |
Теперь можем собирать икарус с верилогом, особенности, после клонирования переключаемся на метку версии v10_1, при сборке передаём компиляторы опции, позволяющие оптимизировать код под инструкции конкретного процессора, на котором идёт сборка, ну и затем собираем сборку в четыре потока:
1 2 3 4 5 6 7 8 9 10 11 | git clone git://github.com/steveicarus/iverilog.git cd iverilog git tag git checkout v10_1 autoconf sh autoconf.sh ./configure --prefix=/opt/iverilog-v10_1 \ CFLAGS='-O2 -g -pipe -march=native -m64 -mtune=native' \ CPPFLAGS='-O2 -g -pipe -march=native -m64 -mtune=native' make -j4 sudo make install |
Установка просмотрщика дампа GTKwave
iVerilog установлен. Докучи поставим GTKwave для просмотра дампов, гененируемых iVerilog’ом, тут всё просто — ставим из репо EPEL:
1 | sudo yum install -y gtkwave |
Использование iVerilog
Соорудим конфиг файл, которым будем настраивать окружение CLI на запуск и работу с iverilog:
1 2 3 | $ cat /opt/iverilog.setup export PATH=/opt/iverilog-v10_1/bin:$PATH export COCOTB=/opt/cocotb |
Настраиваем окружение командой (обратите внимание на пробел после точки):
1 | . /opt/iverilog.setup |
Компилируем исходники (здесь и далее — куски из мейкфайла), указывая в конце командной строки список из RTL & TB:
1 | iverilog -g2005-sv -I./rtl -D$(DEFINE) -s tb -o $(PROJECT).vvp src/$(PROJECT)_tb.v rtl/$(PROJECT).v |
- -g2005-sv — указываем какой версии верилога соответствуют исходники
- -Irtl — перечисляем инклюд-директории
- -D$(DEFINE) — передаем дефайны
- -s tb — указываем имя топ-модуля
- -o $(PROJECT).vvp — задаём путь и имя выходного файла
Запускаем моделирование (lxt2 — рекомендованный формат записи дампа, он прогрессивный и со сжатием):
1 | vvp -n $(PROJECT).vvp -lxt2 |
Работа с дампом
Открываем записанный дамп в GTKwave:
1 | gtkwave $(PROJECT).vcd $(PROJECT).gtkw & |
gtkw — это формат txt-подобного конфига для GTKwave (SaveFile в терминах GTKwave), его первичный вид можно получить открыв дамп и настроив GTKwave по своему вкусу, а потом дав команду «Write Save File» из меню.
Пример открытого дампа с преднастроенным файлом gtkw:
Пример файла gtkw:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | [*] GTKWave Analyzer v3.3.61 (w)1999-2014 BSI [*] [dumpfile] "gost_28147_89.vcd" [dumpfile_mtime] "Jul 22 12:25:13 2015" [dumpfile_size] 4145 [savefile] "gost_28147_89.gtkw" [timestart] 0 [size] 2071 1068 [pos] -1 -1 *-16.000000 48600 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 [treeopen] tb. [treeopen] tb.u_cipher. [sst_width] 218 [signals_width] 360 [sst_expanded] 1 [sst_vpaned_height] 306 @28 tb.u_cipher.rst[0] [color] 3 tb.u_cipher.clk[0] tb.u_cipher.select[0] tb.u_cipher.kload[0] @23 [color] 7 tb.u_cipher.key[255:0] @28 tb.u_cipher.load[0] @22 [color] 2 tb.u_cipher.pdata[63:0] @28 tb.u_cipher.done[0] @28 tb.u_cipher.kindex[2:0] tb.u_cipher.mode[0] [pattern_trace] 1 [pattern_trace] 0 |
Также GTKwave поддерживает tcl-подобные скрипты, но нормальных гайдов по нему не попадалось, а жаль — думаю там более вменяемый синтаксис (памятуя о tcl-скриптах для модельсима).