Imax9
NEWS   ARTICLES   MINIMIG   FILES   ABOUT

Совершенно новый ISA?

Предлагаю вам перевод цикла The EightThirtyTwo ISA Part 1: A whole new ISA? автора Alastair M. Robinson.

В 2019 году существует большое число готовых процессорных ядер, которые могут быть использованы в проектах FPGA, некоторые из которых имитируют давно зарекомендовавшие себя процессоры, такие как x86, MC68000, Z80, MIPS, ARM и т.д. , а некоторые конкретно сделаны под FPGA, такие как NIOS, Microblaze, ZPU, Moxie и тому подобное. Так с какой стати мне думать о создании совершенно нового с нуля?

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

Моя цель состоит в том, чтобы создать процессор, который достаточно мал – не намного больше, чем ZPUFlex, – поэтому занимает где-то в районе 1500 логических элементов, будучи при этом несколько быстрее и предлагая лучшую плотность кода. В идеале мне нужно что-то, что может заменить ZPU для приложений модулей управления и позволить мне уменьшить объем block RAM, который я смогу выделить для кода.

Оно из моих любимых ядер процессора на данный момент f32c – в целом это маленькое и быстрое (можно добиться около 180 DMIPS на Cyclone III при работе из block RAM и с включенными улучшайзерами, и около 30 при запуске из SDRAM в более скромной и компактной форме) и поддержка 32-битного MIPS набора инструкций. MIPS имеет довольно хороший набор команд для работы, но плотность кода довольно ужасна, из-за архитектуры загрузка-сохранение, а длина команд всегда 32 бита.

Код ZPU тратит много времени на перетасовку данных в стеке, что может повредить производительности, но плотность кода на удивление не слишком ужасна, из-за того, что длина инструкции фиксирована на уровне 8 бит.

Мое слабое место это код для Motorola 68000, так как я вырос на Amiga, и его плотность кода варьируется от хорошей до отличной, в зависимости от того, смотрите ли вы на скомпилированный код или ассемблер написанный вручную. Однако soft core 68000 занимает большую площадь в FPGA.

Код Z80 часто имеет очень хорошую плотность кода, но отсутствие 32-битных регистров может немного ограничивать.

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

Мое внутреннее чутье и, следовательно, отправная точка для моих экспериментов заключается в том, что лучше всего для минимизации размера кода использовать фиксированную 8-битную длину слова инструкции с 32-битными регистрами – так что на основе этих двух параметров рождается проект EightThirtyTwo CPU.

[На совершенно несвязанной ноте я просто погуглил это имя, чтобы посмотреть, было ли оно уже использовано, и наткнулся на короткометражный фильм, который поклонники Babylon 5 найдут очень интересным! https://www.youtube.com/watch?v=uKz4pvq8kZU ]

Одно из ключевых решений, которое нужно принять при разработке ISA с нуля, - это сколько регистров реализовать и, следовательно, сколько бит командного слова будет им посвящено. Слишком мало, и мы будем страдать от недостатка регистров и тратить все свое время на перетасовку со стеком. Слишком много, и мы будем использовать так много нашего 8-битного слова инструкции, что у нас не будет достаточно места для кодирования инструкций.

Я решил использовать восемь регистров, а это значит, что для кодирования номера регистра требуется три бита. Оставшихся пяти битов недостаточно для включения непосредственных значений, а также для кодирования типа инструкции. Нам также не хватает бит, чтобы включить регистр источника и приемника в наши слова команд, поэтому я решил указать “временный” регистр, который будет использоваться для получения непосредственных значений и в качестве источника для двухоперандных инструкций. Таким образом, формат инструкции будет следующим: [ooooorrr]

Нам нужна команда “Load immediate“, которая заносит непосредственно данные из слова инструкции. Самый простой способ справиться с этим - указать, что если установлен бит 7, то остальная часть слова содержит непосредственные данные, например: [1iiiiiii]. Однако это уменьшает доступные коды операций вдвое - с 32 до 16 (плюс непосредственный код операции загрузки, то есть всего 17). Если этого окажется недостаточно, то мы могли бы указать формат Load Immediate как [11iiiiii], сократив вдвое непосредственный диапазон данных, но открыв диапазон [10ooorrr] для кодов операций, что дает нам в общей сложности 25 команд.

В части 2 я рассмотрю сами инструкции и то, как различные варианты будут влиять на плотность кода.


Адрес для контактов : imax9@narod.ru

Если вам понравились мои работы и вы желаете поддержать сайт - сделайте дотацию.

При копировании статьи – обязательна ссылка на авторство и источник. Без разрешения автора копирование запрещено.

© Максим Ильин 2022г.

Яндекс.Метрика