IAF0041 Free Software

На этой странице подробно расписано как пройти IAF0041 используя только свободное программное обеспечение.

Самой удобной связкой скорее всего будет gschem + icarus + gtkwave.

Вроде бы схему можно сделать и в Kicad, но я так и не разобрался, как из него генерировать verilog модули.

Установка

На debian-based системах всё просто:

sh: 1: pygmentize: not found

apt-get install geda gtkwave iverilog

Есть и порт для windows, но он неадекватно устарел, можете даже им не заморачиваться.

Проекты развиваются достаточно быстро, поэтому советую использовать последние версии.

On most systems, verilog symbol library is not enabled by default. That’s because of conflicts with vhdl library, meaning that you cannot have both enabled at the same time.

You have to edit /usr/share/gEDA/gafrc.d/geda-clib.scm and uncomment "verilog".

Схема

В схеме для входов используйте IPAD, а для выходов OPAD. Сеть каждого IPAD и OPAD должна быть названа - кликаете на соединение, edit, добавляете netname.

Для схемы необходимо добавить атрибут module_name, которым в дальнейшем будет называться ваш модуль в verilog. (Add/Attribute)

В конце все элементы нужно пронумеровать. Это делается автоматически: Attributes/Autonumber text. В autonumber text in вместо Selected objects выбрать Whole hierarchy (впрочем, можно и что-то другое, но если вы используете submodules, тогда точно whole hierarchy).

Создание своего компонента, состоящего из обычных элементов

Вам необходимо создать два файла:

Подробнее:

.sch

Для входов и выходов используйте in-1 и out-1 из библиотеки input/output.
Каждому входу и выходу нужно дать имя в refdes.

.sym

Добавляем пины и линии, как вам нравится. У каждого пина в настройках нужно поставить:

После того, как все готово, выделяем всё что есть (Ctrl+a) и жмем Edit/Symbol translate, на 0, ОК. Это нужно для того, чтобы при добавлении компонента на схему он появлялся бы под мышкой, а не где-то еще.

Добавляем два атрибута:

Добавление элемента в основную схему

Чтобы ваш новый компонент было видно в библиотеке элементов, нужно отредактировать (или создать, если его не существует) файл ~/.gEDA/gafrc . Туда добавляем это:

sh: 1: pygmentize: not found

(component-library ".")
(source-library ".")

Другими словами, чтобы он добавлял в библиотеку все файлы, лежащие рядом с вашей главной схемой.

Создание своего компонента с готовым verilog кодом для него

Нужно создать .sym файл, процесс чем-то похож на создание сабмодуля, но есть различия. В .sym нужно добавить атрибут device, а в его значение написать название модуля. Также вам может понадобится VERILOG_PORTS=POSITIONAL, хотя я такой атрибут не добавлял вообще. Порядок параметров определяется за счет pinnumber, в который вы можете вписать название параметра. Смею предположить, что при VERILOG_PORTS=POSITIONAL будет игнорироваться pinnumber, а вместо него будет использован pinseq. Совестно будет поставить pinseq и pinnumber соответствующие действительности. Кроме этого, вы должны также указать refdes, а вот указывать source не нужно. Не забывайте сделать translate :)

Симуляция

Для начала нужно по схеме сгенерировать verilog модуль:

sh: 1: pygmentize: not found

gnetlist -g verilog -o ПолучившийсяМодуль.v файлсхемы.sch

Получившийся .v файл будет содержать переменные, у которых в названии есть “/”. Несмотря на то, что даже такие переменные должны работать, iverilog очень ругается. Если же заменить все знаки “/” на, допустим, “__”, то проблема решится. Плохо, что нельзя в обычном редакторе сделать replace all, потому что это не единственные места, где есть этот знак, зато perl легко с этим справится:

sh: 1: pygmentize: not found

perl -p -i -e 's/(?

Компилируем и запускаем

sh: 1: pygmentize: not found

iverilog -o compiled Arvutid.V ArvutidTestBench.v # compile
vvp compiled # run

Если же у вас несколько verilog файлов (так может быть в том случае, если вы создавали свой модуль), то вставьте и его имя в первую команду.

В случае, если у вас какая-то ошибка в схеме, то на выходах вы можете получить такие значение:

  • x - unknown logic value
  • z - high impendance
    Проверяйте схему!

Весь процесс от начала до конца:

sh: 1: pygmentize: not found

gnetlist -g veriog -o Arvutid.v arvutid.sch # generate verilog file for schematic
perl -p -i -e 's/(?

Результат симуляции

Просто открываете .vcd файл с помощью gtkwave.

Некоторые замечания

  • Порядок входящих и выходящих портов зависит от расположения в .sch файле
  • Если вас не устраивает порядок параметров в сгенерированном .v файле, то удалите все IPAD (при этом не удаляя соединения), а потом поставьте их обратно в обратном порядке.
  • Все файлы содержат просто текст, так что если что-то не так, то их можно открыть любым текстовым редактором и подредактировать вручную.
  • bufif не работают. Баг репорт с патчем здесь: https://bugs.launchpad.net/geda/+bug/1304681 2014-04-11 патч приняли, в следующей версии должно всё работать. 2015-09-30 в последней версии всё ОК.

Пример

Один пример ценнее тысячи слов: первая лаба
Если возникают какие-то проблемы, особенно при создании своих компонентов, то задавайте вопросы в комментариях - разберемся.

Полезные ссылки: