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

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)