Дмитpий Hecтepук

Блог о программировании — C#, F#, C++, архитектура, и многое другое

Разработка под FPGA бесит, но что делать?

2 комментария

В моем предыдущем посте, я жалуюсь на FPGA но, как вы знаете, нытьё я не люблю — если что-то не нравится, нужно это что-то менять. Но для того чтобы понять что конкретно не нравится, нужно описать проблемы, что и будет в этом посте.

Давайте для начала сформулируем несколько банальных отличий HDL языков от обычных языков вроде С или С++. Тут все до боли банально:

  • HDL языки позволяют писать как последовательный (как и С) код, так и код который выполняется параллельно в конструкции, которую они называют process но на самом деле мы можем назвать как “условно-бесконечный while(true)”. На самом деле я лукавлю, т.к. этот бесконечный цикл работает не постоянно, а на основе событий (изменений сигналов), но это сводит его к обычному event loop в одном аппаратном потоке. Никакой магии тут нет.

  • HDL языки позволяют из маленьких логических компонент строить более сложные путем “соединения проводков” между разными элементами дизайна. Это конечно красиво, но это можно делать и в обычных языках путем правильной записи переменных. Разница лишь в том, что касательно HDL переменные — это то что ты присваиваешь последовательно (не очень-то эффективно), а параллельно присваиваются сигналы.

  • HDL языки, когда им нужно один компонент несколько раз разместить в схеме, используют статическую кодогенерацию (generate statement) которая конечно очень круто, с одной стороны, но с другой стороны — весьма тривиальная вещь которой вообще не стоит гордиться.

  • HDL языки можно симулировать прежде чем заливать в FPGA. Это конечно классно, но то как это выглядит — не особо удобоваримо.

Все это выглядит так, как будто над нами издеваются, причем жестко: ничего в списке выше не требует создания нового языка. Экосистемы — да, конечно, но языка — увольте, это какое-то безумие. Вместо этого, один из языков который можно использовать — это SystemC. Другой, который наглая Altera (читай Intel) дает использовать только на некоторых, б-гоизбранных платах, это OpenCL — да-да, та самая поделка которая програла CUDA войну за GPU.

Один из вариантов — это адаптировать Тлён для кросс-компиляции в VHDL, но для этого нужно сначала обсудить самые простые особенности, например типы данных.

Типы данных в VHDL

Вот список типов которые есть в VHDL (ну или в SystemC или чем-то аналогичном):

  • bit — вот эта штука действительно 0 или 1, тут не поспоришь.

  • bit_vector — это, соответственно, произвольный набор бит. Например bit_vector(0 to 8) делает вам целый байт! Количество битов можно самому выбирать, что очень хорошо ложится на Rust-образное описание целочисленных значений.

  • std_logic (VHDL) / sc_logic (SystemC) — понятие “логическое значение”, что на самом деле просто перечисление в котором есть как варианты 0/1 так и другие, причем в SystemC вариантов логического значения 4, а в VHDL – целых 9! Формально, посторонние значения нужны для симуляции, но есть также понятие tri-state logic (когда сигнал вообще ни к чему не подключен).

  • std_logic_vector это соответственно целый набор этих логических значений.

  • sc_fixed (SystemC) — возможность делать fixed-point arithmetic. Это пока вообще не доступно на С++ и подобных, разве что вы сами библиотеку напишете. Не то чтобы это сложно, но тут это “в железе”.

  • integer/float/wtf — возможность не только выделять нужный объем бит, но и делать всякие операции вроде сложения и даже умножения и деления (хотя эти две операции – не очень дешевые).

  • character — восьмибитная буква (ASCII). Все конечно хорошо, но…

  • string — я сейчас даже не буду говорить про то, что в VHDL, “010101” это одновременно и строка и bit_vector и std_logic_vector, просто скажу что строка на FPGA конечно же нединамическая. То есть tweet : string(1 to 160) дает нам фиксированный массив букв.

Естественно что работать без std::vector/set/map очень больно. Точнее, возможно кто-то скажет что так и надо, что мы описываем электрическую схему, которая не может просто аллоцировать и деаллоцировать память как хочется. С другой стороны, мы не маленькие и понимаем что в принципе можно выделить большое количество регистров и потом пытаться трекать общую длину полезных данных на этом поле.

Последовательность и параллелизм

То, как VHDL делит последовательные и параллельные конструкты – в корне неправильно. По идее, должно быть так: за один такт часиков мы хотим сделать ABC. Потом, мы хотим сделать DEF. Вот как-то так. А не перемешивать все в одной куче. Но тут есть один нюанс.

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

Вообще, если вы почитаете интернеты, по поймете что делать все “в один такт” на FPGA не реально. И помимо этого, есть еще пренеприятнейшая проблема которая называется glitching. Я сейчас не буду вдаваться в детали, но проблема в том, что даже имея схему которая дает детерминированный результат, из-за того что переход уровней сигнала идет не моментально, у вас может возникнуть ситуация, в которой на какие-то несколько наносекунд сигнал перейдет в состояние, которое не согласуется с тем, что должно быть на выходе. Сейчас найду видео… вот, ловите.

Так вот, о чем я… да, с одной стороны массовый паралеллизм, с другой стороны все равно не на глобальном масштабе, что впрочем итак нереально ввиду того, что описывать комбинаторно алгоритмы — это мучительно. Да, можно развить бешеную скорость относительно CPU, но… вообщем я оставлю эту дискуссию на будущее.

Что делать-то?

Тулы делать, товарищи. Тулы. На текущий момент симулятор выглядит как-то вот так:

Ничего странного не замечаете? Тут линиями показаны уровни сигнала – 0, 1, иногда U (уровень неизвестен). И вообще, в классической логике уровней сигнала всего два: 0 или 1, false или true. В std_logic их девять. И да, эти безумные типы для симуляции и прочего.

Короче, для начала нужен симулятор которые воспринимает VHDL (или Verilog, мне все равно) как последовательно-паралелльную программу, и позволяет ее гонять и дебажить примерно так же, как Visual Studio со всякими там Parallel Stacks и иже с ним. Это вполне реально написать, причем за не очень большие сроки.

Вторая часть уравнения — это сделать все это еще и на девайсе. Все равно то, что мы делаем когда захватываем несколько тысяч сэмплов с FPGA — это по сути historical debugging a la IntelliTrace. То же самое.

Короче, решение этой проблемы простое — нужно просто переделать все на высоком уровне. Лучше всего — выкинуть на помойку VHDL/Verilog, взять OpenCL (его кстати уже поддерживают некоторые, богоизбранные платы) и воткнуть все это в какую-нибудь вменяемую IDE (например IntelliJ). Profit! Но не тот профит к которому привыкли тул вендоры, т.к. FPGA, как показывает практика, это технологически закрытая тема, там новых игроков не любят.

Вообщем что-то нужно делать. Я пока еще думаю, как все эти мысли конкретно описать.

Ложка дегтя

Заказал отладочную плату, она пришла в СПб DHLем, и понеслась Рассея матушка, безумная и беспощадная, втирать мне как я должен 100 штук бумажек вручную оформить чтобы все это ввезти… вообщем поедет она назад в Тайвань, а оттуда куданть еще. Мой вам совет: заказываете железки обычной почтой. На обычную почту не смотрят. ■

Advertisements

Written by Dmitri

29 октября 2016 в 0:55

Опубликовано в FPGA

комментария 2

Subscribe to comments with RSS.

  1. Тулинг это хорошо, весело и интересно=) А рынок там есть? FPGA какая-то совсем узкая ниша.

    Mikhail Shcherbakov

    30 октября 2016 at 11:51

    • FPGA совсем не узкая ниша. А рынок есть, но конечно не такой как у software.

      Dmitri

      30 октября 2016 at 11:59


Оставить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: