Как эффективно разработать код операции для процессора?

Я создаю простой 16-битный процессор в Logisim, и у меня есть готовый ALU и коды операций, которые я хочу иметь. Теперь мне очень трудно найти правильную кодировку для команд, чтобы различные подсхемы (например, логическая, арифметическая) не нуждались в входных данных для всех управляющих проводов (из которых состоит кодировка), а как можно меньше. Существуют ли какие-либо стратегии или методы, помогающие разработать эффективный код операции?

спасибо заранее

Сначала соберите свой ALU и посмотрите, какие провода управления ему нужны. Затем подключите их непосредственно к регистру «текущая инструкция». То же самое для логики управления доступом к памяти и любых других основных классов кодов операций. Затем используйте оставшиеся биты, чтобы выбрать, какая подсхема активирована.
Существует также оригинальная статья Кена Чепмена о его 8-битном программируемом конечном автомате KCPSM, также известном как PicoBlaze. В нем описывается, как он выбирал инструкции и проектировал ISA. dc.uba.ar/materias/disfpga/2010/c2/descargas/…

Ответы (6)

Я думаю, что это хороший подход к изучению некоторых других наборов инструкций.

Маленьким будет MSP430 от TI, это 16-битный процессор с примерно 22 инструкциями.

http://www.physics.mcmaster.ca/phys3b06/MSP430/MSP430_Instruction_Set_Summary.pdf

Вы также можете посмотреть на AVR Atmel, у них также довольно небольшой набор инструкций.

В своем небольшом проекте я попытался разработать простой 32-битный процессор на VHDL с небольшим набором инструкций (14 инструкций):

http://www.blog-tm.de/?p=80

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

Но я не нашел что-то, где я мог бы увидеть, что такое фактическая кодировка и почему она была выбрана именно такой.
Фактическую кодировку можно найти в репозитории: github.com/TM90/MISC_Processor/raw/master/Documentation/… . Причина, по которой я выбираю эти кодировки таким образом, чтобы логика в декодере инструкций была минимальной.

Изучите (но не копируйте) подход ARM к кодированию инструкций. Он в значительной степени ориентирован на префикс (например, подход дерева Хаффмана, рекомендованный Дзардой) и очень единообразен с точки зрения того, где находится часть команды выбора регистра.

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

Я не совсем понимаю, что вы имеете в виду под управляющими сигналами.
Что мне понравилось в ARM, так это поле условия, которое я включу.
Сигналы управления являются входами для различных мультиплексоров и позволяют направлять данные между частями ЦП.
Я не думаю, что для 16-битной архитектуры кодировка инструкций ARM подходит. Mayby thumb2 лучше. Но мне нравится способ кодирования MIPS, простой и понятный, хотя и немного расточительный.

Однажды я попытался сделать 4-битный процессор с ядром с 8-битной длиной инструкции в Logisim. В итоге получился простой конечный автомат, на самом деле больше, чем процессор.

Случайные вещи для поиска

  • Деревья Хаффмана
  • Фиксированная длина или переменная кодировка?
  • Это дизайн фон Неймана с единым адресным пространством или гарвардский стиль с отдельными данными/программой?

Отличное видео на Computerphile про деревья Хаффмана:

https://www.youtube.com/watch?v=umTbivyJoiI

Кодирование Хаффмана не будет работать для кодирования фиксированной длины, верно?
@Benjoyo Я могу представить себе сценарий, в котором запасные биты используются для вариаций наиболее часто используемых инструкций, что обеспечивает большую функциональность.
Но я не понимаю, какую оптимизацию это приносит. Это не поможет мне с дизайном схемы. Какова цель использования кодирования Хаффмана для кода операции?

У ISA, который я когда-то написал для класса, был такой 4-битный код операции: 1XXX ALU instructions 01XX jump, jump register, call etc 001X branch not equal, branch equal zero 000X 0 - load, 1 - store

Вместо того, чтобы быть наиболее оптимальным, это один из самых простых стилей для создания / проектирования вентилей, потому что входной сигнал одного бита может полностью контролировать, какой логический путь выбирается. Кроме того, вы можете закодировать наиболее часто используемые символы с помощью кода Хаффмана и дополнить их нулями, чтобы получить код операции фиксированной длины.

Такая оптимизация - это то, что я ищу в данный момент. Но у меня есть 5-битный код операции, и я изо всех сил пытаюсь сгруппировать команды вместе, чтобы это имело смысл в схеме.
@Benjoyo, у тебя может быть еще куча инструкций ALU с установленным верхним битом. Кроме того, мое покрытие условий перехода было довольно слабым, и для большинства обычных ветвей требовалось две инструкции. Обычно я думал о категориях как: Математика/Управление/Память.

Одна вещь, которую вам нужно будет рассмотреть, заключается в том, разрешать ли любую форму инструкции из нескольких слов или что-либо, что может «действовать» как инструкция из нескольких слов; если вы это сделаете, вы можете подумать, следует ли использовать дополнительные слова инструкций после основной инструкции или слова-префиксы перед ней. Разрешение префиксов и последующих слов может усложнить обработку прерываний, но позволяет избежать необходимости размещать редко используемые инструкции в том же пространстве кода операции, что и часто используемые.

Если инструкции извлекаются в цикле до их выполнения, может быть инструкция «условного перехода», которая либо вызывает пропуск следующего командного слова, либо ее содержимое передается непосредственно в программный счетчик; такой дизайн может усложнить последовательность прерываний, но он может облегчить необходимость использования большой части пространства кода операции для инструкций «ветвления», «прыжка» и «вызова», допуская при этом гораздо более широкий диапазон условий ветвления. чем это было бы возможно в противном случае. Поскольку ветвь, которая выполняется, обычно требует мертвого цикла после выполнения самой инструкции, независимо от того, откуда берется адрес, получение адреса из следующего слова, которое было выбрано, но не будет выполнено, не требует дополнительных затрат. время.

Несмотря на то, что удаление целевого адреса из инструкций ветвления уменьшит объем пространства кода операции, которое они занимают, 16-битный формат кода операции все еще довольно тесный. Использование префиксных инструкций может помочь в этом. Если, например, кто-то хочет иметь 32 регистра, то для того, чтобы любой регистр мог быть независимо указан как источник1, источник2 и место назначения, потребуется 15 бит в коде операции, что позволяет получить в общей сложности две инструкции. Не очень полезно. С другой стороны, было бы неплохо иметь возможность использовать любой из 32 регистров для каждого из трех операндов. Можно сбалансировать две цели, если любая операция АЛУ, которой не предшествует префикс, использует восемь битов для выбора одного из шестнадцати регистров, но имеет операцию АЛУ, которая следует сразу за префиксом, использует некоторые биты в префиксе вдоль с восьмеркой из следующей инструкции, чтобы обеспечить независимый выбор как источника, так и адресата из полного набора 32. Инструкции, использующие верхние регистры, заняли бы два слова/цикла, а не один, но в некоторых случаях такой компромисс может быть вполне оправданным. Самая большая трудность при использовании префиксов заключается в том, что нужно либо предотвратить возникновение прерывания между префиксом и следующей инструкцией, либо гарантировать, что если прерывание произойдет, то инструкция после префикса по-прежнему будет использовать правильные регистры [например, если программа Логика сохранения счетчика сохраняет адрес последней выполненной инструкции без префикса]. но в некоторых случаях такой компромисс может оказаться вполне оправданным. Самая большая трудность при использовании префиксов заключается в том, что нужно либо предотвратить возникновение прерывания между префиксом и следующей инструкцией, либо гарантировать, что если прерывание произойдет, то инструкция после префикса по-прежнему будет использовать правильные регистры [например, если программа Логика сохранения счетчика сохраняет адрес последней выполненной инструкции без префикса]. но в некоторых случаях такой компромисс может оказаться вполне оправданным. Самая большая трудность при использовании префиксов заключается в том, что нужно либо предотвратить возникновение прерывания между префиксом и следующей инструкцией, либо гарантировать, что если прерывание произойдет, то инструкция после префикса по-прежнему будет использовать правильные регистры [например, если программа Логика сохранения счетчика сохраняет адрес последней выполненной инструкции без префикса].

Использование инструкций, состоящих из нескольких слов, усложнит некоторые аспекты дизайна, но может уменьшить потребность в принятии других сложных решений.

Этот парень лучше всех разбирается в жестком подключении жестко закодированной части декодера, что объясняет линии управления для жестко запрограммированного процессора: http://minnie.tuhs.org/CompArch/Tutes/week03.html Как видите, ваш выбор в кодах операций действительно влияет на сложность логики декодирования.