Компоненты и технологии, № 9'2002 Софт
VHDL против AHDL:
попытка полемики
Нельзя объять необъятное.
К. Прутков
В № 72002 «КиТ» была напечатана статья «Проектирование в системе Мах+Р1ив II: УИ01 против ДИОЬ». Ее автор, Глеб Варфоломеев, затрагивает действительно актуальный вопрос — на каком языке описания аппаратуры остановиться разработчику систем на ПЛИС. Сразу хочется сказать, что статья своевременная и нужная, но...
Вот об этих нескольких «но» и хотелось бы поговорить.
Владимир Стешенко, к. т. и.
steshenk@sm.bmstu.ru
С
татью предваряет фраза: «Разработчики, замкнувшиеся в рамках AHDL, уподобляются программистам, пишущим на ассемблере». Так разве это плохо? Не подлежит сомнению, что код на языке ассемблера позволяет получить самый быстрый и эффективный исполняемый код, и, в определенных условиях ограничения аппаратурных ресурсов, это преимущество ассемблерного кода становится гораздо важнее простоты и изящества кода на языке высокого уровня. Кроме того, как совершенно справедливо отмечает Глеб Варфоломеев: «AHDL
(AlteraHDL) является внутренним языком пакета Max+Plus II». Только это отнюдь не означает, что в «каком бы виде вы ни выполняли свой проект (графический, AHDL, VHDL, Verilog или в виде временных диаграмм в Waveform Editor), компилятор Max+Plus II сначала переведет ваш проект на язык AHDL». К сожалению, все тонкости работы компилятора Max+Plus II не известны за пределами узкого круга программистов фирмы Altera, замечу только, что никакого перевода на AHDL нет и быть, в силу понятных причин, не может — компилятор Max+Plus II формирует по любому описанию проекта список цепей (netlist), как и все синтезаторы. По эффективности синтеза с языков описания аппаратуры высокого уровня Max+Plus II сильно не дотягивает ни до Leonardo, ни до Synplicity. В этом легко убедиться, взяв стандартные примеры тестов от PREP, и протестировать на них вышеупомянутые синтезаторы и компилятор Max+Plus II. Max+Plus II создает проект на 15-30% хуже по занимаемым ресурсам и быстродействию. Значит ли это, что Max+Plus II «плохой» компилятор? Нет и еще раз нет. Он дешев (на поря-док-два дешевле «серьезных» продуктов), имеет развитую систему помощи и, как справедливо отмечено, имеет «неплохой ассортимент литературы по языку AHDL». Есть несколько книг на русском языке, фирменное описание — но вот, пожалуй, и все. Max+Plus II изначально ориентирован на собственный язык описания аппаратуры — AHDL, и оптимизированные примеры на нем будут эффективно синтезированы и размещены.
Трудно согласиться с фразой, что «с литературой же по языку VHDL ситуация зеркально противоположная». Не хочется заниматься рекламой, в том
числе и саморекламой, но за последние год-два только на русском языке издано не менее пяти книг, частично или полностью посвященных использованию языков высокого уровня: УИБЬ и УегДо^ Я уж не говорю об открытых сетевых ресурсах по языкам описания аппаратуры высокого уровня (это тема для отдельной статьи).
На взгляд Глеба Варфоломеева «в доступной автору литературе... не содержится сравнения эффективности языков АИВЬ и УИВЬ». А нужно ли это сравнение? Преимущества языков описания аппаратуры высокого уровня проявляются при наличии мощных средств синтеза и необходимости переноса проекта с ПЛИС на заказную БИС. Писать на УИБЬ и пользоваться штатным компилятором Мах+Р1ш II можно, только нужно ли это для эффективной работы с проектом?
Рассмотрим приведенный Глебом Варфоломеевым пример (рис. 1).
Первое, что бросается в глаза, — полностью доверяемся компилятору, а что он сгенерирует, попробуйте догадаться сами. Смею предположить, что будет много-много сумматоров с последовательным переносом, огромные задержки на комбинационных цепях. И второе — быстродействие такого проекта будет крайне низко. Только «достоинства те же: краткость и наглядность».
Здесь сделаем небольшое лирическое отступление. Дело в том, что вопрос проектирования и оптимизации структур вычислителей — достаточно обширная область теории и практики алгоритмов, методов вычислений и т. п. Потому-то стоимость IP-cores тех же быстрых перемножителей сопоставима со стоимостью пакетов разработки. Увы, эти ядра интеллектуальной собственности жестко привязаны либо к ар------www.finestreet.ru-----------------------
Компоненты и технологии, № 9'2002
хитектуре конкретной ПЛИС, либо к библиотекам конкретной кремниевой фабрики при проектировании и производстве СБИС.
А оптимизировать под конкретную архитектуру без использования дорогих продуктов, таких, как Amplify, или тяжелого ручного труда по физическому размещению ячеек в роутере после компиляции исходного описания на языке высокого уровня, невозможно.
А тот же AHDL содержит целый ряд примитивов (LCELL, SOFT), которые худо-бедно позволяют дешево и просто выполнить оптимизацию. Именно поэтому некорректным является пример сравнения с перемножителем на AHDL (рис. 2).
INCLUDE «lpm_mult.inc»;
Софт
SUBDESIGN MULT
(
dataa[7..0]
datab[7..0]
result[15..0]
)
INPUT;
INPUT;
OUTPUT;
VARIABLE
lpm_mult_component : lpm_mult WITH (
LPM_WIDTHA = 8,
LPM_WIDTHB = 8,
LPM_WIDTHP = 16,
LPM_WIDTHS = 16, INPUT_B_IS_CONSTANT = «NO», LPM_REPRESENTATION = «UNSIGNED», USE_EAB = «OFF»
result[15..0] = lpm_mult_component.result[15..0]; lpm_mult_component.dataa[7..0] = dataa[7..0]; lpm_mult_component.datab[7..0] = datab[7..0];
Рис. 2
Вызван уже оптимизированный перемно-житель, построенный по нормальной архитектуре с цепями переноса и каскадирования. Естественно, он не поместится в одной ПЛИС ЕРМ3256 — за быстродействие мы платим ресурсами. Я уж не говорю, что использование CPLD для реализации вычислителей неэффективно именно в силу их архитектур, ориентированных на реализацию функций большого числа входных переменных — для этого лучше взять ПЛИС семейств FLEX или ACEX. Если бы автор попробовал вызвать оптимизированный перемножитель из VHDL (что, кстати, возможно и для рассмотренного примера), то обращение было бы очень похожим (рис. 3).
И где же тут «краткость и наглядность»?
Особого разговора заслуживает вопрос о выходных файлах (tdo, vho, vo). Эти файлы
COMPONENT lpm_mult GENERIC (LPM_WIDTHA: POSITIVE;
LPM_WIDTHB: POSITIVE;
LPM_WIDTHS: NATURAL := 0;
LPM_WIDTHP: POSITIVE;
LPM_REPRESENTATION: STRING := «UNSIGNED»; LPM_PIPELINE: INTEGER := 0;
LPM_TYPE: STRING := «LPM_MULT»;
LPM_HINT: STRING := «UNUSED»);
PORT (dataa: IN STD_LOGIC_VECTOR(LPM_WIDTHA-1 DOWNTO 0);
datab: IN STD_LOGIC_VECTOR(LPM_WIDTHB-1 DOWNTO 0);
aclr, clock: IN STD_LOGIC := '0'; clken: IN STD_LOGIC := '1';
sum: IN STD_LOGIC_VECTOR(LPM_WIDTHS-1 DOWNTO 0) := (OTHERS => '0');
result: OUT STD_LOGIC_VECTOR(LPM_WIDTHP-1 DOWNTO 0));
END COMPONENT;
Рис. 3
представляют собой не что иное, как выходной список цепей и используются, как правило, в системах моделирования типа Modelsim в качестве исходного файла, иногда совместно с файлом задержек. Именно поэтому несколько строк на поведенческом уровне превращаются в сотни килобайт структурного описания на самом нижнем уровне. В каком виде формировать этот выходной файл — дело разработчика, и зависит от используемых средств моделирования.
Немаловажным моментом в статье Глеба Варфоломеева является противопоставление поведенческого и структурного описания проекта. Любой разработчик систем на ПЛИС и СБИС скажет, что чаще всего описание проекта состоит из структурного объединения нескольких иерархических описаний подсистем, как правило, поведенческих. Но поведенческое описание таит подводные камни, связанные с работой конкретного синтезатора. Несмотря на наличие стандарта IEEE1076.6 на синтезируемое подмножество VHDL, оно весьма различно для разных синтезаторов. И Max+Plus имеет весьма и весьма ограниченное подмножество для синтеза. Это же касается и языка Verilog. Именно поэтому мощные системы и стоят таких денег. И фирма Altera ведет очень разумную политику, обеспечивая возможность интеграции Max+Plus и Quartus с современными пакетами синтеза и моделирования.
Ошибочным является утверждение, выраженное Глебом Варфоломеевым в следующем абзаце: «Однако иногда не удается избежать структурного описания. В этом случае в про-
граммы на языках высокого уровня вставляют ассемблерные вставки или подгружают внешние ассемблерные модули. У языков описания аппаратуры такой аналогии нет.» А как же ядра IP-core, — те же мегафункции — ведь это фактически оптимизированный под конкретную ПЛИС список цепей (netlist). Чем не вставка на самом нижнем уровне?
Абсолютно справедливо, что «существенный недостаток языка AHDL — невозможность перенести с платформы на платформу проект на языке AHDL». А надо ли это для разработчика, который не занимается переносом проектов?
Нельзя не согласиться с тем, что «если вы еще не имели опыта использования языков описания аппаратуры и размышляете о выборе языка, то выбирайте VHDL!» Я бы добавил — и Verilog, и ABEL, и AHDL тоже. Нельзя заниматься противопоставлением тех или иных способов описания цифрового проекта.
Из вышесказанного мною может сложиться мнение, что ваш покорный слуга категорически не согласен с Глебом Варфоломеевым и всячески отстаивает AHDL как универсальное языковое средство описания проектов. Отнюдь! Просто, если уж браться за анализ возможностей того или иного языка программирования или описания аппаратуры, то делать это нужно корректнее. И помнить, что помимо чисто языковых особенностей и стилей есть еще средства реализации и моделирования проекта.
Какие же основные выводы можно сделать? Во-первых, язык AHDL — простой и дешевый инструмент тонкой оптимизации проекта под конкретное семейство ПЛИС конкретного производителя в конкретной среде разработки. Во-вторых, языки VHDL и Verilog дают преимущество при использовании качественных средств синтеза и моделирования.
В заключение хотелось бы поблагодарить уважаемого Глеба Варфоломеева за попытку начать дискуссию по выбору и критическому анализу средств проектирования и методов описания проекта. Автор будет признателен за любые замечания и пожелания, которые следует направлять по адресу:
107005, Москва, 2-я Бауманская ул., д. 5, МГТУ им. Баумана, кафедра СМ5 «Автономные информационные и управляющие системы», для Стешенко В. Б. E-mail: steshenk@sm.bmstu.ru, сайт www.sm.bmstu.ru/sm5.
BEGIN
END
-www.finestreet.ru -
91