Идея состоит в построении процедурного Си-подобного языка, который бы однозначным образом компилировался в Верилог.
Язык Си часто называют высокоуровневым ассемблером. В этом есть определенная сермяжная правда: опытный программист хорошо представляет себе, в какие ассемблерные конструкции превращается Си-шный код. Нечто аналогичное хочется проделать с Верилогом.
Отличие разработки на Верилоге от традиционного программирования состоит в существенно более высоком уровне параллелизма. Система создается как некоторое количество конечных автоматов, фукнционирующих одновременно. Каждый из конечных автоматов имеет несколько десятков, реже - сотен состояний. Количество таких автоматов - тысячи и десятки тысяч.
Традиционная же программа представляет собой один конечный автомат, имеющий сотни тысяч и миллионы состояний. Каждое значение регистра адреса команды (PC) есть одно состояние конечного автомата. Иногда программа может состоять из нескольких конечных автоматов, если в ней используются потоки.
Представляется интересным проект языка — надстройки над Верилогом, позволяющего писать программы в процедурном стиле, но оставляющего свободу доступа к низкому уровню для инженера-электроника.

no subject
Date: 2007-06-20 18:55 (UTC)no subject
Date: 2007-06-20 19:51 (UTC)no subject
Date: 2007-06-20 21:55 (UTC)Например, почему Си?
Что делать, когда надо три бита и больше не надо?
Параллельный стиль не так уж и плох или труден, я в Хаскеле им пользуюсь сплошь и рядом. В HDL надо повысить уровень проверки типов, станет проще.
no subject
Date: 2007-06-21 07:25 (UTC)Если надо ровно три бита - есть тип Bit[3]. А вот как быть, если нужен знаковый бит, это пока вопрос.
Инженеры-электроники ничего не знают про типы. Они живут в терминах сигналов, фронтов, задержек.
no subject
Date: 2007-06-21 08:31 (UTC)Попробуйте положить Bit[3] на Си, получите Верилог.
Инженеры-электронщики от этого мучаются. Не далее, как вчера товарищ рассказал о своих мучениях, у него reset, на вход подается resetn. Он два дня искал, ему пришлось заниматься самогипнозом "у меня все правильно." И у всех сигналов есть определенный смысл, которых, по=хорошему, надо выразить в типах. Фронты и задержки появятся потом, когда будет этап оптимизации и отладки.
no subject
Date: 2007-06-21 14:28 (UTC)Я смотрел:
Atom - http://funhdl.org/wiki/doku.php/atom
HDCaml - http://funhdl.org/wiki/doku.php/hdcaml
Hydra - http://www.dcs.gla.ac.uk/~jtod/Hydra/
Lava - http://raintown.org/lava/
Действительно забавно, но пока не вижу, в чём кайф.
Из Си никак Верилог не получится, дело не в типах. Может быть надо уточнить - я имею в виду синтез, а не симуляцию.
Мне нравится идея типизации сигналов. Но не хватает фантазии представить, как это могло бы выглядеть. Скажем, на примере того же светофора?
no subject
Date: 2007-06-21 15:03 (UTC)"Действительно забавно" - это как понимать? Судя по всему, что-то понравилось, что конкретно? С моей точки зрения важной частью Лавы и Hydra является корректность результатов "по построению." Сразу по грамматике автомата, да еще и грамматика видна в самом коде.
"Не вижу в чем кайф" - какой кайф нужен? Если нужно, чтобы в области дизайна заработали программисты без переучивания, то это невозможно. Если нужно, чтобы программисты заработали лучше без переучивания, это также невозможно.
Насчет типизации сигналов. На примере того же ресета. Отдельный сигнал мы описываем следующим полифморфным типом:Мы нигде не перепутаем Reset и ResetN. Их надо явно преобразовывать. Если у нас поменялся тип провода и он не может больше содержать неопределенных значений (X, мы перешли к синтезируемому RTL), нам снова придется поменять описание схемы.
Если нужен пример со светофором, прошу объяснить.
no subject
Date: 2007-06-21 15:46 (UTC)Понравилось, что меньшим количеством кода можно описать более сложные вещи. А кайфа нет, потому что ясность кода при этом страдает. Известно, что при разработке читать код приходится в десятки раз чаще, чем писать. Меньше ясность - больше трудоёмкость - длинее сроки - больше ошибок.
Для тренировки "на кошечках" я придумал проект светофора для пешеходного перехода:
http://vak.ru/doku.php/proj/verilog/plog#%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%D0%BF%D0%B5%D1%88%D0%B5%D1%85%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D0%B2%D0%B5%D1%82%D0%BE%D1%84%D0%BE%D1%80%D0%B0
Такой себе вполне законченный модуль (в верилоговском смысле). Реализация на Верилоге даст автомат примерно с двадцатью состояниями. Понимать и менять такой код довольно тяжело. Как бы реализация могла выглядеть на функциональном языке?
no subject
Date: 2007-06-21 18:19 (UTC)data RoadLightStates = PassAuto | ReadyingStopAuto { time :: Int } | AutoWarned { time :: Int } | PassWalkers { time :: Int } | ReadyingWalkersStop { time :: Int } | ReadyingAutoPass { time :: Int } data Button = Pressed | NotPressed data Lights = Lights { red :: Bool, yellow :: Bool, green :: Bool, stop :: Bool, walk :: Bool} defLights = Lights False False False False False wait3sec samestate nextstate time | time > timeout3sec = nextstate | otherwise = samestate blink time = ((time / blinkcount) % 2) /= 0 roadlight PassAuto NotPressed = (PassAuto,defLights { green = True, stop = True }) roadlight PassAuto Pressed = (ReadyingStopAuto { autoGreenBlinkCount = Int, time = Int } ,defLights { green = True, stop = True }) roadlight (ReadyingStopAuto time} _ = (nextState,defLights {green = blinked, stop = True}) where nextState = wait3sec (ReadyingStopAuto (time+1)) (AutoWarned { time = 0 }) time blinked = blink time roadlight (AutoWarned time) _ = (nextState,defLights { yellow = True, stop = True) where nextState = wait3sec (AutoWarned { time = time+1}) (PassWalkers { time = 0 }) time roadlight (PassWalkers time) _ = (nextState,defLights { red = True, walk = True }) where nextState | time > timeout30sec = ReadyingAutoPass { time = 0} | otherwise = PassWalkers { time = time + 1 } roadlight (ReadyingAutoPass time) _ = (nextState,defLights { red = True, yellow = True, walk = blink time}) where nextState | time > timeout1sec = PassAuto | otherwise = ReadyingAutoPass ({ time = time+1 } -- Для симуляции: воткнем это в защелку. roadlightCircuit buttonPresses = loopS (PassAuto) roadlight buttonPressesТам есть ашипка, но ее легко исправить.Вот в таком табличном стиле все и пишется. Тут и параллельное вычисление в секции where, и машина состояний с протаскиваемым параметром.
no subject
Date: 2007-06-21 19:53 (UTC)no subject
Date: 2007-06-21 20:09 (UTC)no subject
Date: 2007-06-21 14:38 (UTC)no subject
Date: 2007-06-21 15:07 (UTC)Все равно непонятно, зачем.
Это не даст существенного ускорения разработки по сравнению с тем же Верилогом и не даст проверок больше, чем это делает VHDL.
no subject
Date: 2007-06-21 16:00 (UTC)Для синтеза VHDL ничем не лучше Верилога, вся его мощь нацелена на моделирование. Синтезируемые подмножества того и другого взаимно однозначно конвертируются.
Цель кратко формулируется как создание простого и практичного компилируемого языка для RTL-архитектуры. По аналогии с Си для фон-Неймановской архитертуры.
no subject
Date: 2007-06-21 18:26 (UTC)Большая часть аппаратуры, во-первых, таблично-реактивна (в таком состоянии по такому воздействию выдай то-то и перейди туда), во-вторых, чиста от побочных эффектов. Побочный эффект появляется при защелкивании.
В си побочные эффекты могут принимать самые причудливые формы. Поди, разберись, что оно делает. И вообще, имеет ли смысл делать a=a+2; b=b+3; в разных тактах, может, все же в одном?
Собственно, язык для HDL должен быть 1) не Тьюринг полным для простоты анализа, 2) позволять записывать реакции в табличном виде и поощрять этот вид записи и 3) иметь возможность собирать чистые функции в объекты с памятью отдельными конструкциями.
Мое мнение.
no subject
Date: 2007-06-22 20:23 (UTC)Насчет преимуществ табличного представления не готов согласиться. Несколько лет назад я разрабатывал реализацию протокола PPP для ядра FreeBSD. Все действия заданы в виде таблицы, прямо в тексте RFC. Казалось бы, куда уж проще, бери да кодируй. Нифига подобного, сил и времени на отладку ушло немеряно. Хуже того, в таблице обнаружились неочевидные ошибки: автомат попадал в тупиковые ситуации, сеанс PPP заклинивало. Выяснилось, что порядок некоторых действий спроектирован неправильно, надо было их поменять местами. Но просто поменять в таблице два элемента нельзя, от этого зависят другие элементы, и понеслось-поехало. Если бы протокол был описан в виде блок-схемы алгоритма, было бы гораздо проще.
Я странслировал вручную Plog-код светофора в Верилог, можно посмотреть здесь: http://vak.ru/doku.php/proj/verilog/tlight-v
no subject
Date: 2007-06-22 20:49 (UTC)f state inputs = (state',outputs)- один такт. Пройдясь по переходам state, получим количество тактов.Табличное представление табличному представлению рознь. Я программировал машины состояний на Паскале, Си, Тикле и Хаскеле. В Тикле я реализовал алгебраические типы и сравнение с образцом и все пошло, как по маслу, как в Хаскеле. В в последнем же вообще проблем не возникает. ;)
В Си и компании локальные переменые состояния объявлены глобально, за ними надо следить, при этом возникает желание соптимизировать, используя одну и ту же переменную в разных местах. В Хаскеле переменные надо протягивать вместе с состоянием. Это позволяет лучше проверять машины состояний.
Насчет кода верилога - это же ужас, не так ли? ;)
no subject
Date: 2007-06-24 20:41 (UTC)no subject
Date: 2007-06-24 23:29 (UTC)no subject
Date: 2007-06-25 14:32 (UTC)no subject
Date: 2007-06-25 16:04 (UTC)я сейчас его использую при создании документов, но думаю при должной сноровке его можно применить при созданиии графа програмного кода...
КА технология
Date: 2007-06-24 23:26 (UTC)no subject
Date: 2007-06-25 14:21 (UTC)no subject
Date: 2007-06-25 16:07 (UTC)щас кстати автор симавор в коде готовит, обещал скоро предоставить описание по его модели) я ему на днях ссылку скинул)