Коды операций ISA --- откуда они берутся?


13

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

Изменить: После проведения дополнительных исследований, я думаю, что я пытаюсь спросить, касается того, как назначаются коды операций для различных инструкций процессора. ADD может быть обозначен кодом операции 10011; инструкция загрузки может быть обозначена как 10110. Какой мыслительный процесс используется для назначения этих двоичных кодов операций для набора команд?


8
В книге Монте Далримпла «Проектирование микропроцессоров с использованием Verilog HDL» представлен очень детальный подход к проектированию процессора Z80, и я думаю, что из него вы многое узнаете. Но есть много соображений, которые относятся к конкретному выбору, в том числе статистический анализ других наборов команд, выходные данные компилятора и т. Д. Я бы порекомендовал начать с этой книги. Хотя все начинается с известного дизайна, он подробно рассказывает об этом, и я думаю, вы бы подобрали несколько вещей. Хорошая книга.
Джон

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

2
Кто-то еще задает этот вопрос. Должен быть вторник.
Игнасио Васкес-Абрамс

5
@ Стивен Подумай об этом. Если бы вам пришлось разрабатывать ISA, о чем бы вы подумали? Если ваши инструкции не были одинаковой длины, как бы вы выбрали более короткие или длинные слова инструкции, для каких инструкций? Если бы вам пришлось разработать этап декодирования , как бы вы хотели, чтобы ваш ISA выглядел? Я думаю, что вопрос неоправданно широк (и, следовательно, почти невозможно ответить полностью), но вы можете значительно улучшить его, если вложите в него больше собственных мыслей и зададите точный вопрос, который не потребует от нас написания книги для ответа Это.
Маркус Мюллер

4
Спецификации RISC-V говорят о проектных решениях, которые они принимали на всех уровнях, в том числе о кодировке машинных инструкций. (Это необычно для руководства по процессору; RISC-V - это сначала учебное упражнение, а архитектура процессора - второе, в отличие от большинства.)
zwol

Ответы:


6

Во многих случаях выбор является довольно произвольным или основан на «везде, где он подходит лучше всего», поскольку ISA растут со временем. Тем не менее, MOS 6502 является прекрасным примером микросхемы, где на дизайн ISA сильно повлияла попытка выжать как можно больше из ограниченных транзисторов.

Посмотрите это видео, объясняющее, как 6502 был перепроектирован, особенно с 34:20 и далее.

6502 - это 8-битный микропроцессор, представленный в 1975 году. Несмотря на то, что у него было на 60% меньше вентилей, чем у Z80, он был в два раза быстрее, и хотя он был более ограниченным (с точки зрения регистров и т. Д.), Он восполнял это с помощью элегантный набор инструкций.

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

Как вы можете видеть ниже, 6502 передает код операции и данные синхронизации в ПЗУ декодера, а затем передает их в компонент «логики случайного управления», цель которого, вероятно, состоит в том, чтобы перекрывать вывод ПЗУ в определенных сложных ситуациях.

Блок-схема 6502

В 37:00 в видео вы можете увидеть таблицу ПЗУ декодирования, которая показывает, каким условиям должны удовлетворять входы, чтобы получить «1» для данного контрольного выхода. Вы также можете найти его на этой странице .

Вы можете видеть, что большинство вещей в этой таблице имеют X в разных позициях. Давайте возьмем для примера

011XXXXX 2 X RORRORA

Это означает, что первые 3 бита кода операции должны быть 011, а G должен быть 2; Остальное не важно. Если это так, вывод с именем RORRORA станет верным. Все коды операций ROR начинаются с 011; но есть и другие инструкции, которые также начинаются с 011. Они, вероятно, должны быть отфильтрованы модулем «случайной логики управления».

Таким образом, в основном, коды операций были выбраны так, чтобы инструкции, которые должны были делать то же самое, что и друг друга, имели что-то общее в их битовой структуре. Вы можете увидеть это, посмотрев таблицу кодов операций ; все инструкции OR начинаются с 000, все инструкции Store начинаются с 010, все инструкции, использующие адресацию нулевой страницы, имеют форму xxxx01xx. Конечно, некоторые инструкции, похоже, не подходят, потому что цель состоит не в том, чтобы иметь полностью регулярный формат кода операции, а в том, чтобы обеспечить мощный набор команд. И именно поэтому «логика случайного управления» была необходима.

На странице, о которой я упоминал выше, говорится, что некоторые строки вывода в ПЗУ появляются дважды: «Мы предполагаем, что это было сделано, потому что у них не было способа направить вывод какой-либо строки туда, куда они хотели, поэтому они помещают одну и ту же строку в другую Ещё раз. " Я могу только представить, как инженеры вручную рисуют эти ворота, внезапно осознавая недостатки в дизайне и пытаясь придумать способ избежать повторного запуска всего процесса.


22

Это зависит от того, сколько лет ISA.

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

Таким образом, может существовать особый шаблон сигналов управления, который позволяет некоторым мультиплексорам подключать выход ALU ко входу файла регистра GP, еще несколько сигналов управления, которые инструктируют ALU складывать, вычитать, И, ИЛИ и т. Д., И несколько адресные биты в регистровом файле. Эти три группы сигналов будут формировать поля внутри инструкции. Каждая группа будет храниться вместе, и их подробное значение вытекает из дизайна для этого блока (ALU и т. Д.), Но группы могут быть в любом порядке, вплоть до разработки декодера команд. (x86 достаточно стар, чтобы вы могли обнаружить кое-что из этого, если вы посмотрите в нужном месте - это был не совсем новый дизайн, но взятый из более старого 8080)

Более поздние ISA могут быть «очищены» и сделаны более регулярными и более простыми в использовании, с аппаратными средствами для преобразования между ними и фактическими управляющими сигналами аппаратного уровня, иногда через «микрокод». Они называются «CISC» или «Кодирование набора сложных команд». Префикс инструкции x86 «Rep» является простым примером этого - он заставляет следующую инструкцию повторяться несколько раз, чтобы избавить от необходимости писать цикл FOR.

Позже (в 1980-х) появилось движение к более простому стилю прямого кодирования (RISC - Reduced Instruction Set Coding), который вы можете увидеть в процессорах ARM. Это было обусловлено небольшим размером ASIC в то время и желанием установить на них 32-битные процессоры, следовательно, не было резервной емкости для декодеров со сложным набором команд, чтобы снизить нагрузку на весь процессор примерно до 20 000 шлюзов. (Был также временный прирост производительности, потому что люди еще не разработали методики для быстрого создания декодеров CISC - это произошло примерно в 1995 году с Pentium Pro)

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


2
Я не уверен, что я бы действительно назвал CISC "проще в использовании". Возможно, это было первоначальное намерение, но 30 лет спустя они являются своего рода антитезой «простого в использовании» (по крайней мере, по сравнению с ISA RISC).
tonysdg

2
Есть аспекты, в которых их было проще использовать ... либо регулярность (ортогональность была большой темой) назад, когда компиляторы были относительно тривиальными программами, либо посредством прямой поддержки операций более высокого уровня, требующих меньшего количества переводов от компилятора. Но это было долгое время назад, и любой выживший CISC имеет так много слоев ревизий поверх своего первоначального набора инструкций. Компиляторы также изменились до неузнаваемости - тысячи или около того проходов оптимизации, выполненных gcc, были бы тогда немыслимы. Так что то, что было «легким» тогда и сейчас, имеет очень мало отношения.
Брайан Драммонд

4
Различие было размыто (наборы «RISC» добавляют больше инструкций) и заменено новыми, еще более сложными архитектурами, такими как VLIW; на самом деле единственное согласие заключается в том, что x86 (16 и 32 бит) трудно использовать
pjc50

1
@tonysdg: сложно использовать RISC и CISC. Хорошее сравнение «дружелюбия программиста» - это сравнение 68К с ARM. ARM был разработан для компилятора, поэтому вам пришлось много работать вручную, чтобы получить данные из ОЗУ и записать их обратно в ОЗУ. 68k был разработан для программистов на ассемблере и позволяет работать непосредственно с данными в оперативной памяти. Если вы посмотрите на 68k ISA, то обнаружите, что она очень похожа на современную RISC ISA, за одним исключением - вы можете работать напрямую с оперативной памятью, тогда как RISC позволяет работать только с регистрами.
Slebetman

1
Микрокод - это прежде всего атрибут CISC. Однако вы можете реализовать CISC без микрокода: декодер команд будет более сложным. Вы также увидите некоторые CISC из Pentium-Pro и далее, описанные как RISC внутри; перевод каждой инструкции CISC в одну или несколько внутренних операций RISC: другое имя для микрокода (хотя различия распределяются в суперскалярных исполнительных единицах)
Брайан Драммонд

9

Если вы сгруппируете похожие инструкции вместе, появятся шаблоны. Это очень очевидно в ARM, где руководство ISA фактически показывает, какой бит командного слова соответствует функции, выбору регистра и т. Д. Но это также может быть выведено для X86 .

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


Вы в основном говорите, что они стремятся к минимальному количеству транзисторов на чипе. Я полностью согласен в контексте вопроса ОП, где они не могут позволить себе сотни дополнительных транзисторов для более аккуратного набора команд. У миллионов транзисторных процессоров нет особой причины заботиться, но, конечно, многие сохраняют ее для обратной совместимости.
Харпер - Восстановить Монику

@Harper Есть еще причина, потому что хотя транзисторы стали меньше, они все еще имеют размер - и тем временем тактовая частота значительно увеличилась. Таким образом, слишком большой декодер команд может по-прежнему быть узким местом для производительности (одна из причин, по которой многие процессоры предпочли предварительно кодировать инструкции заранее). Речь идет не только о количестве транзисторов, а о тактовой частоте в сочетании с площадью кристалла. Для распространения информации все еще требуется время, и хотя современные процессоры не работают со скоростью света, они не достаточно далеко от предела скорости, чтобы ожидать значительных улучшений.
Луан

@Luaan: На самом деле, «что мы делаем со всеми этими транзисторами» - это настоящий вопрос в настоящее время. Посмотрите на все кэши L2 / L3, распространенные в наши дни. Это молчаливое признание, что мы не можем лучше использовать все эти миллионы транзисторов. Последние Xeon посвящают более 2 миллиардов транзисторов для кэширования!
MSalters

6

Кто-то в какой-то момент сел и определил их.

Хороший ISA сделает декодер максимально простым.

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


Спасибо всем за отличные ответы. Вы все помогли мне понять это намного лучше.
Стивен

4
На самом деле существует довольно много факторов, помимо простоты декодера, чтобы принять во внимание. В зависимости от обстоятельств и предполагаемого использования другие (например, плотность кода) могут быть важнее простоты декодера. В современном процессоре плотность кода, вероятно, перевешивает простоту декодера в большинстве случаев.
Джерри Коффин

5

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

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


1

Кодировка команд - это ужасный компромисс между ними.

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

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

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


1

У Рэнди Хайда отличное (хотя и несколько устаревшее) искусство сборки. Он подробно описан в наборе команд x86 в главе 3.3.4 «Блок управления и наборы инструкций» и далее.

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

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

Вы получите что-то вроде этого:

введите описание изображения здесь


Спасибо за ссылку от Хайда! Это очень информативно, и у него, кажется, отличный стиль преподавания.
Стивен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.