Serguey Zefirov (thesz) wrote,
Serguey Zefirov
thesz

Category:

ForSyDe, ещё один HDL, встроенный в Хаскель.

http://www.ict.kth.se/forsyde/

Штука интересная.

Во-первых, она позволяет работать на нескольких уровнях описания: описать функцию преобразования данных на обычном Хаскеле, собрать систему а-ля Hawk (одна тактовая частота, всё синхронное, на потоках) и низший уровень - отобразить систему в VHDL. То есть, ценна, как средство разработки аппаратуры на нескольких уровнях, от высокого до... уровня аппаратуры.

Во-вторых, там внутри применён достаточно интересный приём. Функция преобразования данных сама преобразовывается из текста на Хаскеле в специальный текст на Хаскеле с помощью Template Haskell. Была функция f :: Int -> Int -> (Int,Int); f x inp = (x,x+inp+1), её оборачивают в $(signal [|f :: Int -> Int -> (Int,Int); f x inp = (x,x+inp+1)|]) и на выходе, в зависимости от выбранной реализации signal получится либо первоначальная реализация f, либо реализация преобразованная, что-то вроде:
f :: Signal Int -> Signal Int -> Signal (Int,Int)
f x inp =
    signalPair x (x+inp+constSignal 1) -- (+) перегружен и создаёт
                                       -- конструктор сигнала SignalPlus
Это преобразование позволяет выявить обратные связи в функциях без регистров, что защёлкивают информацию по тактовой частоте: такой вид кода запрещён в обычных HDL, поскольку его поведение трудно учесть.

Делается это следующим образом - constSignal, например, создаст IORef:
type Signal a = IORef (SignalAST a)

constSignal const = unsafePerformIO $ liftM newIORef $ ConstSignal const
plusSignal signalA signalB = unsafePerformIO $ liftM newIORef $ PlusSignal signalA signalB
...
И далее при создании внутренней схемы происходит анализ, нет ли в выражении обратной связи.

Семантика Хаскеля - всё вычисляется не более одного раза, - гарантирует, что наш constSignal сработает один раз и всегда будет равен самому себе: let x = constSignal 1 in x == x всегда будет True, как и полагается.

Из недостатков могу упомянуть отсутствие работы с алгебраическими типами данных а-ля Bluespec и отсутствие поддержки нескольких тактовых частот (на поверхности этого нет).

Последнее практически не минус, большая часть современной аппаратуры работает на одной тактовой частоте и лишь в отдельных хорошо изолированных местах происходит соединение двух больших частей. Хотя если продумать такое решение, то и асинхронные схемы можно будет делать.

Первое же, по-моему, довольно большой минус. Это делает ForSyDe системой только чуть выше Lava, примерно уровня Hydra (см. в списке HDL).
Tags: hdl, Хаскель
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 2 comments