ISC-коди --- Звідки вони беруться?


13

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

Редагувати: Після проведення додаткових досліджень я вважаю, що те, що я намагаюся задати, стосується того, як призначені опкоди для різних інструкцій процесора. ADD може бути позначений з кодом 10011; інструкція з навантаження може бути позначена як 10110. Який продуманий процес передбачає призначення цих бінарних опкодів для набору інструкцій?


8
Монте Далрімпл, "Мікропроцесорний дизайн за допомогою Verilog HDL", пропонує дуже детальний підхід до дизайну для процесора Z80, і з нього я думаю, що ви дізнаєтесь багато про своє питання. Але є багато міркувань, які вступають у конкретний вибір, включаючи статистичний аналіз інших наборів інструкцій, висновки компілятора тощо. Хоча я б рекомендував почати з цієї книги. Хоча це починається з відомого дизайну, він детально розкриває про це детальну інформацію, і я думаю, ви б підібрали кілька речей. Гарна книга.
джонк

Або, можливо, ви запитуєте про дизайн двигуна виконання і цікавитеся, як біти в інструкції можуть грати на це? Не впевнений у своїй формулюванні.
джонк

2
Хтось інший задає це питання. Повинно бути вівторок.
Ігнасіо Васкес-Абрамс

5
@Steven Подумайте про це. Якби вам довелося розробити ISA, що б ви думали? Якби ваші вказівки не були однакової довжини, як би ви вибрали коротші чи довші слова інструкцій, для яких інструкцій? Якби вам довелося розробити етап декодування , як би ви хотіли виглядати ваш ISA? Я думаю, що питання є надмірно широким (і, таким чином, майже неможливо відповісти повністю), але ви можете вдосконалити його багато, вклавши в нього ще кілька власних думок і задавши точне запитання, яке не вимагає від нас написання книги, щоб відповісти це.
Маркус Мюллер

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

Відповіді:


6

У багатьох випадках вибір є досить довільним або ґрунтується на тому, "де це найбільше підходить", оскільки МСА зростає з часом. Однак MOS 6502 - чудовий приклад мікросхеми, де на дизайн ISA сильно впливали намагання максимально вичавити з обмежених транзисторів.

Перегляньте це відео, де пояснюється, як 6502 було розроблено реверс , особливо з 34:20.

6502 - це 8-бітний мікропроцесор, представлений у 1975 році. Хоча він мав на 60% менше воріт, ніж Z80, він був удвічі швидшим, і хоча він був більш обмеженим (з точки зору реєстрів тощо), він доповнив це елегантний набір інструкцій.

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

Як ви бачите нижче, 6502 передає дані про кодування інструкцій та синхронізацію в декодируючий ПЗУ, потім передає їх в компонент "логіки випадкового керування", метою якого є певне перевищення виводу ПЗУ в певних складних ситуаціях.

Структурна схема 6502

О 37:00 на відео ви можете побачити таблицю декодування ROM, яка показує, яким умовам повинні відповідати входи, щоб отримати "1" для заданого керуючого виходу. Ви також можете знайти його на цій сторінці .

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

011XXXXX 2 X RORRORA

Це означає, що перші 3 біти опкоду повинні бути 011, а G повинні бути 2; нічого іншого не має значення. Якщо так, вихід з ім'ям RORRORA буде істинним. Усі опкоди ROR починаються з 011; але є й інші інструкції, які також починаються з 011. Вони, ймовірно, повинні бути відфільтровані за допомогою підрозділу "логіки випадкового керування".

Таким чином, опкоди були обрані таким чином, щоб інструкції, які потрібно було робити те саме, що один з одним, мали щось спільне в їх бітовій схемі. Це можна побачити, переглянувши таблицю опкоду ; всі АБО інструкції починаються з 000, всі інструкції в магазині починаються з 010, усі інструкції, які використовують адресацію з нульовою сторінкою, мають форму xxxx01xx. Звичайно, деякі інструкції, здається, не "підходять", оскільки мета полягає не у тому, щоб мати повністю нормальний формат коду, а скоріше забезпечити потужний набір інструкцій. І саме тому "логіка керування випадковим чином" була необхідною.

Сторінка, про яку я згадував вище, говорить про те, що деякі вихідні рядки в ПЗУ з’являються двічі: "Ми припускаємо, що це було зроблено, оскільки вони не мали можливості маршрутизувати вихід деякої лінії там, де вони хотіли, тому вони поставили ту саму лінію на інший знову ". Я просто можу уявити, як інженери вручну малюють ці ворота одна за одною і раптом усвідомлюють недолік у дизайні і намагаються придумати спосіб уникнути повторного запуску всього процесу.


22

Це залежить від того, скільки років ISA.

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

Таким чином, може виникнути певна схема керуючих сигналів, яка дозволяє деяким мультиплексорам підключити вихід ALU до входу файлу реєстру GP, ще кілька керуючих сигналів, які вказують ALU додавати, віднімати, AND, OR тощо, та декілька біт адреси у файл реєстру. Ці три групи сигналів формуватимуть поля в межах інструкції. Кожна група буде зберігатися разом, і їх детальний зміст виникає з розробки проекту для цього блоку (ALU тощо), але групи можуть бути в будь-якому порядку, до тих пір, поки ви не спроектуєте декодер інструкцій. (x86 досить старий, що ви можете виявити щось із цього, якщо шукати в потрібному місці - це був не зовсім новий дизайн, але намальований на старих 8080)

Пізніше ISA можуть бути «очищені» та зробити їх більш регулярними та спрощеними у використанні, за допомогою апаратних засобів для перекладу між ними та фактичними апаратними сигналами управління, іноді через «мікрокод». Вони називаються "CISC" або "Кодування комплексного набору інструкцій". Префікс інструкції "Rep" x86 - простий приклад цього - він призводить до повторення наступної інструкції кілька разів, щоб зберегти необхідність написання циклу FOR.

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

І сьогодні це не має значення - процесори читають відразу кілька інструкцій і присвячують мільйони транзисторів на їх розшифровку, переупорядкування та виконання якомога більшої кількості одразу, щоб пришвидшити програми, написані для найстаріших стиль ISA.


2
Я не впевнений, що дійсно б назвав CISC "простішим у використанні". Це, можливо, було первинним наміром, але через 30 років вони начебто є антитезою "простого у користуванні" (принаймні порівняно з МСС 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 - Відновити Моніку

@Harper Є ще причина, тому що, хоча транзисторів стало менше, вони все ще мають розмір - а тактова частота тим часом сильно зросла. Таким чином, занадто великий декодер інструкцій все ще може бути вузьким місцем для продуктивності (одна з причин, що багато процесорів перед часом вибирали інструкції попереднього кодування). Йдеться не лише про кількість транзисторів, а більше про тактову частоту в поєднанні з матрицею. Інформація все ще потребує часу для розповсюдження, і хоча сучасні процесори не працюють зі швидкістю світла, вони недостатньо далеко від обмеження швидкості, щоб очікувати значних поліпшень.
Луань

@Luaan: Насправді, "що ми робимо з усіма цими транзисторами" - це справжнє питання сьогодні. Подивіться на всі кеші L2 / L3, кинуті сьогодні. Це мовчазне визнання, що ми не маємо кращого використання для всіх цих мільйонів транзисторів. Останній Xeon присвятив понад 2 мільярди транзисторів для кешування!
MSalters

6

Хтось у якийсь момент сів і визначив їх.

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

Наприклад, з інструкцією ALU ви можете дозволити деяким бітам опкоду відправлятися безпосередньо в контрольні лінії ALU.


Дякую всім за чудові відповіді. Ви всі допомогли мені зрозуміти це набагато краще.
Стівен

4
Насправді існує досить багато факторів, окрім простоти декодера, які слід враховувати. Залежно від обставин та призначення, інші (наприклад, щільність коду) можуть бути важливішими, ніж простота декодера. У сучасному процесорі щільність коду, мабуть, переважає простоту декодера в більшості випадків.
Джеррі Труну

5

Як правило, ви розділили ISA на функціональні групи. Має сенс (або для оптимізації логіки, або просто привести в порядок), що безкоштовні пари розмежовуються однією зміною бітів (завантаження проти магазину), і що у вас є деяка ієрархія бітів, які впливають на дерево рішень декодування.

Зрештою, довільне розподілення бітів для функціонального блоку (на відміну від розміщення полів "дані" в інструкції матиме лише незначний вплив на загальну ефективність проектування - але у вас є багато варіантів, як зробити "оптимізуйте" кодування ISA залежно від того, що ви вважаєте важливим параметром.


1

Кодування інструкцій - це некрасивий компроміс між.

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

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

Сумісність вперед та назад. Якщо ви призначите функціонал кожному можливому коду, ви не зможете пізніше розширити архітектуру. Якщо ви додаєте до вже існуючої архітектури, вам потрібно розмістити свої нові інструкції у запасних опкодах.


1

Відмінне (якщо дещо датується) Ренді Хайда Мистецтво складання входить в інструкцію x86, детально викладену в главі 3.3.4. Набори блоку управління та інструкції .

Програми на ранніх (до Вон Ноймана) комп'ютерних системах часто були «провідними» в схему. Тобто проводка комп’ютера визначала, яку проблему вирішить комп’ютер. Щоб змінити програму, довелося перемотувати схему. Дуже важке завдання. Наступним успіхом у дизайні комп’ютера стала програмована комп'ютерна система, яка дозволила комп'ютерному програмісту легко "перемотувати" комп'ютерну систему, використовуючи послідовність розеток та проводів штепсельної вилки. Комп'ютерна програма складалася з набору рядів отворів (розеток), кожен рядок представляв одну операцію під час виконання програми. Програміст може вибрати одну з декількох інструкцій, підключивши провід до конкретної розетки для потрібної інструкції.

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

Ви закінчуєте щось подібне:

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


Дякую за посилання від Hyde! Це дуже інформативно, і він, здається, має відмінний стиль викладання.
Стівен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.