nabbla (nabbla1) wrote,
nabbla
nabbla1

Category:

Оочень длинные инструкции с перекрытием

Всё продолжают роиться безумные идеи по поводу своего собственного процессора, исполненного на ПЛИС 5576ХС4Т, но занимающего весьма небольшой кусок от тех 9984 ЛЭ, что там есть, и способного перемножать кватернионы, нормировать их, находить матрицу, обратную к симметричной матрице 6х6, решать систему линейных уравнений, а ещё хоть иногда, хоть паршивенько, выполнять немножко тригонометрии и квадратных корней.

Тем более, как сегодня узнал, NIOS II альтеровский на flex10k и соотв. на 5576ХС4Т поставить нельзя категорически, он под более новые кристаллы.

В прошлый раз (см . Quat Core идёт на взлёт) мне хотелось сделать команды настолько примитивными, насколько возможно, чтобы не заморачиваться с декодированием. Просто у нас есть отдельные узлы - память (у ПЛИС можно дать один адрес на запись и другой адрес на чтение - "двухпортовая" но не ТРУЪ двухпортовая), АЛУ, сколько-то немножко регистров, счётчик инструкций - и мы хотим каждого индивидуально "озадачить".

Всё бы хорошо - уж точно не нужно процессору хитрых "планировщиков", пытающихся держать все узлы загруженными (иногда прибегая к out-of-order инструкциям и hyperthreading'у, когда процессор-то один, но он решил сразу взяться за два потока - одному заняться нечем - так из другого чего-нибудь возьмём!) не нужно вшитого микрокода - мы сами на микрокоде его программируем!

Но вот незадача - инструкции получаются до безобразия толстыми.


Если для простоты взять 16-битную адресацию (у меня будет не шире 14 бит, поскольку памяти всего 12 килобайт, причём оперативки хочется совсем по-минимуму, где-нибудь в 256 слов по 16 бит, и адресация по словам), то команда будет выглядеть примерно так:
P SS DD JJ

где первый байт, P (oP) - код команды (реально: отдельные биты, управляющие АЛУ и регистрами), затем 2 байта - адрес на чтение (Source), затем 2 байта - адрес на запись (Dest) и ещё 2 байта - адрес перехода (Jump).

7 байт - очень много, учитывая наши "стеснённые габариты", причём в большинстве ситуаций нам и половины этого не нужно!

Делать инструкции разной длины - усложнится их выборка, особенно учитывая медленный кристалл, в котором нельзя делать длинных комбинаторных цепей - только что-то сделай - занеси в регистр и жди следующего такта, короткими перебежками!

Оставить в инструкции только один адрес - значит, "искусственно" заставим узлы простаивать - могли бы одновременно записывать результат в память и уже запрашивать следующий. Думаю, не такая уж большая проблема - учитывая, что умножение у меня будет выполняться за 18 тактов (аппаратного умножителя в этой ПЛИС нет, комбинаторно собранный на ЛЭ будет иметь ужасающую задержку, так что только в столбик, только хардкор!), можно и стерпеть.

Но сейчас вдруг подумалось следующее: а что, если инструкции чисто формально будут все одного размера, и декодироваться они будут "один к одному" - отдельные биты отправятся в соответствующие узлы. Но они будут иметь право перекрываться в памяти!

Скажем, большинство команд не требуют адреса для прыжка, поэтому последние байты оказываются незадействованными. Но этот адрес честно подгружается и направляется в регистр PC, но "не защёлкивается", потому что в первом байте выбран режим "без прыжка". Да и запись в память у меня будет происходить гораздо реже, чем чтение: чтобы найти одну из 4 компонент произведения кватерниона, нужно последовательно загрузить 8 различных чисел, перемножить и сложить их, и только потом результат отправится в память. В первом байте инструкции обязательно будет бит WR_EN (разрешение записи), поэтому мы тоже ВСЕГДА будем подавать некий адрес, который мы загрузили, но записи не произойдёт.

В общем, с точки зрения процессора у нас будут совершенно честные ТОЛСТЫЕ ИНСТРУКЦИИ. С одним "но": счётчик инструкций (Program Counter, PC), вместо того, чтобы всегда прибавлять 7 к текущему адресу, будет вычислять инкремент исходя из первого байта - нужен ли был прыжок, нужен ли был адрес записи? И прибавлять иногда 3 (только код команды и адрес на чтение), иногда 5 (+запись), а иногда 7 (+прыжок). А иногда и вовсе единичку, когда память совсем не нужна.

Ну и наш ассемблер расставит инструкции ровно таким же способом - видя, что байты на запись и на прыжок могут быть любыми, он "затрёт" их новой инструкцией! Таким образом, при чтении первой команды мы на месте адреса записи увидим код следующей команды, а за ним - её адрес на чтение и т.д. И это никак нам не повредит, потому что ни записи, ни прыжка мы заведомо не выполним - пущай туда поступают какие угодно байты :)

В итоге программный код получится вполне приемлемого размера. Единственное усложнение - нельзя просто ввести шину фиксированного размера (32 бита, 48 бит или как-то так), чтобы грузить инструкцию целиком - придётся разбираться с выравниванием, ну да разберёмся как-нибудь.


Интересно: а такой вариант где-нибудь реализован?

UPD. Пора все бредовые идеи собирать в каталог, чтобы не забыть. Ещё одна - про оператор "плюс-минус".
Tags: ПЛИС, работа, странные девайсы
Subscribe

Recent Posts from This Journal

  • Великая Октябрьская резня бензопилой

    Сегодня прокатился прочистить Абрамцевскую просеку. Как обычно, с приключениями. Выезжал на велосипеде, а вернулся на самокате. Первый раз по этим…

  • Очередная несуразность в единицах измерения

    Когда-то я написал программу PhysUnitCalc - калькулятор, умеющий работать с размерностями. Мне казалось, что я наступил уже на все грабли, которые…

  • Big Data, чтоб их... (3)

    "В предыдущих сериях": мой прибор выдаёт 6 значений: 3 координаты и 3 угла, т.е все 6 степеней свободы твёрдого тела. Причём ошибки измерения этих 6…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 15 comments

Recent Posts from This Journal

  • Великая Октябрьская резня бензопилой

    Сегодня прокатился прочистить Абрамцевскую просеку. Как обычно, с приключениями. Выезжал на велосипеде, а вернулся на самокате. Первый раз по этим…

  • Очередная несуразность в единицах измерения

    Когда-то я написал программу PhysUnitCalc - калькулятор, умеющий работать с размерностями. Мне казалось, что я наступил уже на все грабли, которые…

  • Big Data, чтоб их... (3)

    "В предыдущих сериях": мой прибор выдаёт 6 значений: 3 координаты и 3 угла, т.е все 6 степеней свободы твёрдого тела. Причём ошибки измерения этих 6…