МІНОСВІТИ УКРАЇНИ
ДЕРЖАВНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
Комп'ютерний факультет
КАФЕДРА ЕЛЕКТРОННИХ ОБЧИСЛЮВАЛЬНИХ МАШИН
КУРСОВА РОБОТА НА ТЕМУ
ПРОЕКТУВАННЯ ПРОТОТИПУ СКАЛЯРНОГО
RISC-КОМП'ЮТЕРА
Курс – “Архітектура обчислювальних машин і систем”
Методичні вказівки і завдання на проектування
Версія 2.2 від 25 вересня 1998 року
Львів - 1998ЗМІСТ
toc \o "1-3" 1. ВСТУП pageref _Toc456356039 \h 2
2. ІНФОРМАЦІЙНИЙ ТРАКТ pageref _Toc456356040 \h 3
2.1. Структура прототипу скалярного RISC-комп'ютера pageref _Toc456356041 \h 3
2.2. Формати інструкцій DLX машини pageref _Toc456356042 \h 8
2.3. Цикл вибирання інструкції (Instruction Fetch cycle - IF) pageref _Toc456356043 \h 9
2.4. Цикл декодування інструкції/вибирання операндів з регістрового файла pageref _Toc456356044 \h 10
(Instruction decode/register fetch cycle - ID) pageref _Toc456356045 \h 10
2.5. Цикл виконання / визначення ефективної адреси pageref _Toc456356046 \h 10
(Execution / effective address cycle - EХ) pageref _Toc456356047 \h 10
2.6. Цикл звернення до пам'яті / завершення умовного переходу pageref _Toc456356048 \h 12
(memory access/branch completion cycle - MEM) pageref _Toc456356049 \h 12
2.7. Цикл зворотнього запису (write-back cycle - WB) pageref _Toc456356050 \h 12
2.8. Система машинних інструкцій pageref _Toc456356051 \h 13
Conditional branches and jumps; PC-relative or through register pageref _Toc456356052 \h 15
3. КЕШ pageref _Toc456356053 \h 17
3.1. Загальні положення pageref _Toc456356054 \h 17
3.2. Характеристики і робота кеша pageref _Toc456356055 \h 18
4. ПАМ’ЯТЬ pageref _Toc456356056 \h 20
5. КЕРУВАННЯ pageref _Toc456356057 \h 21
6. ГЕНЕРАЛЬНА СТРУКТУРА pageref _Toc456356058 \h 23
7. ВИХІДНІ ДАНІ НА ПРОЕКТУВАННЯ pageref _Toc456356059 \h 24
8. ВИМОГИ ЩОДО ОФОРМЛЕННЯ ПОЯСНЮВАЛЬНОЇ ЗАПИСКИ ТА КРЕСЛЕННЯ pageref _Toc456356060 \h 25
9. ЛІТЕРАТУРА pageref _Toc456356061 \h 25
1. ВСТУП
Мета курсового проектування полягає в опануванні студентом знань про принципи дії та архітектуру прототипних варіантів сучасних RISC-комп'ютерів (Reduced Instruction Set Computing), систем, розташованих на межі старих CISC (Complex Instruction Set Computing) та нових архітектур.
Сутність RISC підходу полягає у перерозподілі складності в парі апаратура – системні програми в спосіб спрощення системи інструкцій процесора, збільшення тактової частоти, уведення конвейєрного принципу виконання інструкцій послідовного програмного потоку з одночасним підвищення складності компілятора,. За рахунок перерозподілу та перекладання додаткової частки часових витрат на етап підготування програми (compile time) скорочують часові витрати на виконання машинного коду (run-time). Цього досягають навіть за умови збільшення кількості спрощених машинних інструкцій в програмі. Проте RISC напрямок вдосконалення комп’ютерних засобів не є безперечним. Зараз він спровокував досить суперечливий напрямок безмежного нарощування складності і апаратури, і системних програм новітніх конвейєрних суперскалярних RISC машин.
Наприклад, остання розробка процесора Merced фірми INTEL (ІНТтегрована ЕЛектроніка) свідчить про відмову цієї фірми та її компаньона фірми Hewlett-Packard (промовляти як Х'юлетт-Паккард) від RISC-підходу на користь "не-ріскової" тригер-транспортної архітектури з прямим паралельним, а не лише конвейєрним опрацюванням інструкцій. Але тригер-транспортна архітектура поки що лишається поза межами курсового проектування.
Розглянемо ілюстративний приклад програмування RISC машини, а саме, запрограмуємо С-оператор А = B + С. Фрагмент асемблерної програми має вид:
LW R1, B
LW R2, C
ADD R3, R1, R2
SW A, R3
У фрагменті через A, B, C позначено адреси комірок пам/яті даних, де зберігають відповідно збіжні за назвою операнди і результат. LW є інструкцією завантаження операнду з комірки пам’яті до регістра, інструкція SW виконує зворотню дію, ADD є інструкцією додавання. Бачимо, що дії з завантаження операндів до регістрів з комірок пам’яті та збереження результату у комірці пам’яті відокремлено від виконання власне операції додавання. Функції інструкцій різних типів зараз мають наближено однакову складність, що є необхідною передумовою виконання послідовного потоку таких інструкцій на конвеєрі з метою суттєвого прискорення опрацювання програмного коду. Як правило, у RISC-машинах довжини форматів усіх інструкцій є сталими, а кількість адресувальних режимів – мінімальна. Інтуітивно зрозуміло, що обмеження складності є запорукою прискореного опрацювання спрощених інструкцій в процесорі.
В основу курсового проектування покладено результати роботи [1].
2. ІНФОРМАЦІЙНИЙ ТРАКТ
2.1. Структура прототипу скалярного RISC-комп'ютера
Перший крок розробки прототипного (неконвейєрного) варіанту скалярного RISC-комп'ютера - це синтез структурної схеми машини.Синтез грунтується на часовій діаграмі виконання репрезентативної інструкції процесора, тобто такої інструкції, що має найбільшу часову складність виконання. В нашому випадку такою інструкцією є інструкція завантаження словного операнду з пам'яті даних до будь-якого регістру з регістрового файла чи різновид цієї інструкції, наприклад,
LW R7, 14(R5).
Часовий опис виконання відповідних зазначеній інструкції завантаження 32-х бітового слова з комірки пам'яті за адресою
ADDRESS=(R5)+14
до регістру R7 надають наступною впорядкованою послідовністю виконання мікродій (тобто, мікропрограмою):
вибирання інструкції з пам'яті інструкцій за адресою, яку містить лічильник команд PC Program Counter);
вибирання вмістимого комірки R5 з регістрового файла;
обрахування значення ефективної адреси (значення змінної ADDRESS);
вибирання з пам'яті даних за визначеною ефективною адресою операнда та тимчасовий запис його до програмно недосяжного регістру даних пам'яті LMD Load Memory Data);
наступне пересилання вмістимого регістру даних пам'яті LMD до комірки R7 регістрового файла.
Якщо кожний окремий мікрокрок у щойно наведеній мікропрограмі назвати циклом мікропрограми, тоді часова діаграма виконання інструкції завантаження операнда складатиметься з припасованої у часі послідовності п'яти циклів (часова складність є п'ять). З аналізу наведеної у таблиці 2 системи інструкцій комп'ютера можна дійти висновку, що теза про найбільшу складність інструкції типу LW є коректною. Зауважимо наступне.
По-перше, проектування машини сучасної архітектури щільно пов'язано з її часовою поведінкої.
По-друге, з точки зору програміста чи інтелектуального транслятора з мови високого рівня, існує множина регістрів. В нас це програмно досяжні регістри R0,...,R31. Проте комп'ютерний інженер ці регістри не проектує через те, що реально застосовує множину комірок із збіжними до назв регістрів адресами {R0,...,R31} внутрішньої пам'яті. Ця пам’ять має назву регістровий файл. Концепція регістрового файла (з нашої, не програмістської точки зору) є технологічною. Вона дозволяє збільшити кількість логічних регістрів загального призначення Rх (до 256 у процесорах фірми SUN). Водночас, комірки регістрового файла не поступаються у швидкодії "справжнім" регістрам, адже такий файл розташовано на кристалі процесора. Графічне уявлення часових витрат та їхнє впорядкування при виконанні інструкції LW містить рис.1.
EMBED PBrush
Рис.1. Часова діаграма виконання п’ятициклової інструкції “завантаження” LW
На рис. 1 застосовано наступні скорочені назви циклів:
IF : вибирання поточної інструкції з пам'яті інструкцій (instruction memory чи IM); назва циклу - Instruction Fetch;
ID : декодування інструкції (Instruction Decoding) та вибірання операндів;
EX : виконання дій, притаманих інструкції, що виконується (EXecution);
MEM: читання або запис операндів/результатів (access) з/до пам'яті даних (data memory); наявність відокремлених пристроїв instruction memory та data memory притамане гарвардській архітектурі Harvard Architecture;
WB: зворотній запис (Write Back) результатів АЛП-операцій або отриманих з пам'яті кодів операндів до комірок регістрового файла. АЛП - це скорочення назви "арифметичний і логічний пристрій".
Застосовані назви циклів (інколи кажуть - фаз) дещо узагальнюють притаману лише інструкції LW семантику кожної окремої фази. Це коректно, бо нашою метою є наближення до такої циклової послідовності, яка задовільняє вимогам будь-якої інструкції з заданої до реалізації множини з метою досягнення найбільшої швидкодії. Водночас, ми орієнтуємося на найскладнішу інструкцію.
Зауважимо також, що в нашому випадку фізично кожний цикл у часі відповідає одному тактовому інтервалу, а кількість тактових інтервалів, що має витрачатися на виконання будь-якої інструкції процесора, передбачають сталою (класично – це п'ять інтервалів). Можливо, що при зазначеному підході деякі інструкції матимуть порожні (не потрібні ним, зайві) цикли. Якщо внутрішня тактова частота процесора дорівнюватиме 500 МГц, тоді на кожний такт чи однотактовий цикл припаде 2 нс, а час виконання кожної інструкції складатиме 2*5=10 нс. За цієї умови у прототипному варіанті досягають швидкодії 100 мільйонів інструкцій на секунду (100 MIPS)
На рис. 2 наведено варіант (by J. Hennessy and D. Patterson, Stanford University та Berkeley University, USA) побудови інформаційного тракту прототипу скалярного RISC комп'ютера. Останній відомий у світі під назвою DLX (DeLuXe) процесор (машина). Назва інформаційний тракт (Datapath) виникла через інтегральне подання та розгляд регістрової структури процесора разом із пристроями пам'яті даних DM і пам'яті інструкцій (команд) IM. Зрозуміло, що тут реалізовано Гарвардську (Harvard University in the USA) архітектуру.
EMBED PBrush
Рис. 2. Структура інформаційного тракту прототипу скалярного RISC комп'ютера
Скороченням PC позначено лічильник інструкцій (Program Counter). Вмістиме РС визначає адресу інструкції в пам'яті інструкцій ІМ. Комбінаційний додавач Adder обраховує адресу (наступної за чергою виконання) інструкції. При цьому враховано, що впорядкована послідовність інструкцій, або програма, складається з чотирьохбайтових і тільки чотирьохбайтових інструкцій (усі інструкції мають формати з довжиною 32 біти), які розміщено в IM за послідовними адресами 0, 4, 8, C і т.д. Через це константа зсуву адреси (пересування покажчика на наступну за чергою інструкцію) дорівнює +4. Визначене за допомогою додавача значення адреси вибирання наступної інструкції зберігають у регістрі NPC (next PC). Зчитаний з ІМ бінарний код поточної інструкції записують до регістру інструкції IR. Поля щойно вибраної інструкції (рис. 6), що містять бінарні коди-ідентифікатори регістрів-операндів, є фактично адресами комірок внутрішньо процесорної пам'яті, яка емулює пул (множину) програмно досяжних (видимих програмісту) регістрів. Вмістиме зазначених полів формату інструкції надсилають на адресні входи регістрового файлу Registers чи Regs, а відповідні надісланим адресам бінарні коди регістрових операндів завантажуються до внутрішних, програмно недосяжних, тобто службових регістрів А і В.
Існує ще один тип операнда з назвою “безпосередній” (Immediate чи Imm). Його задають прямо у форматі інструкції. Як правило, довжина безпосереднього операнда не перевищує половини довжини формату інструкції. В нас безпосередній операнд матимеме довжину 32/2 = 16 бітів. В той самий час бажано зафіксувати таку довжину формату даних такою, що дорівнює довжині формату інструкції ( зауважимо без пояснень, що різноманіть довжин форматів суттєво пригальмовує машину). Якщо усі формати даних, як і формати інструкцій, матимуть довжину 32 біти, тоді безпосередньому операнду невистачатиме ще 16 бітів аби бути стандартним за довжиною. Тому знакове розширення 16 бітового безпоседнього операнда до 32-х бітів виконує комбінаційний вузол Sign Extend. Результат знакового розширення тимчасово зберігають у службовому регістрі Immediate (Imm). В цілому можна нарахувати чотири можливі операнди на вході АЛП:
з регістрів А, В, Imm;
вмістиме регістру адреси наступної для виконання інструкції NPC.
Наперед зазначимо, що останній операнд-адресу опрацьовують в АЛП при виконанні інструкцій умовного та безумовного переходів, коли на додаток до натуральної потрібна ще одна адреса, що утворена додаванням до вмістимого NPC деякої константи переходу.
Вибирання двох операндів АЛП з чотирьох можливих виконують за допомогою мультиплексорів операндів MUX, розташованих на його входах. Результат операції АЛП тимчасово запам'ятовують у проміжному службовому регістрі ALUoutput (ALUout). Якщо результатом операції є число, тоді його заносять до комірки регістрового файла. Якщо результатом операції є адреса, тоді цю адресу надсилають до (верхнього на рисунку) мультиплексора вибору адреси MUX. За допомогою зазначеного мультиплексора вибирають адресу переходу (чергова чи перехід), яку і надсилають до лічильника інструкцій PC аби коректно продовжити виконання програми.
Керування мультиплексором вибору адреси наступної інструкції покладено на вузол Zero?, де вмістиме службового регістра А порівнюють із нулем (дорівнює нулю, більше нуля, менше нуля і т.д., в залежності від виду виконуваної в поточний час операції умовного переходу). Результат порівняння є бінарним логічним значенням (так або ні). Саме цей бінарний результат керує роботою мультиплексора вибирання адреси.
Результат-адресу з виходу АЛП можуть надсилати до пам’яті даних як адресу комірки цієї пам’яті в інструкціях збереження/завантаження.
Результатом на виході правого на рисунку 2 мультиплексора може бути або вмістиме пам’яті даних (при виконанні інструкції завантаження LW слова з пам’яті даних до регістру регістрового файла), або результат виконання арифметичної, зсувної, логічної чи іншої операції в АЛП (наприклад, при виконанні інструкцій ADD, SUB і т.д.). Такий результат засобами мікропрогрування зберігають в регістрі регістрового файла. Отже, зазначений мультиплексор, керований від регістру поточної інструкції, комутує на вхід регістрового файла потрібну інформацію.
При конвейєрному опрацюванні послідовного потоку інструкцій виконуваної програми не враховують 5-ти циклову затримку виконання першої інструкції та вважатють потік інструкцій достатньо довгим. В цьому випадку (див. рис. 3) еквівалентні часові витрати на виконання однієї інструкції складатимуть лише один цикл чи тактовий інтервал, а пікова (гранична зверху) швидкодія, яку забезпечує ідеалізований варіант конвейера, зросте в порівнянні з скалярнім неконвейєрним прототипом до 500 млн. інструкцій за секунду при тактовій частоті 500 МГц
Зауважимо, що теоретично обгрунтоване прискорення конвейєра (до значення 5:1 в нашому випадку) є найвищім, тобто піковим. Його досягають лише за ідеальної умови, коли нема жодних залежностей (зв’язків) поміж сусідніми інструкціями послідовного потоку, що вже завантажені на виконання до конвейєра, та коли в цьому потоці відсутні інструкції переходів. Реально до часової діаграми роботи конвейєра мусять уводять затримки (порожні фази), аби результати неконвейєрного і конвейєрного опрацювання потоку інструкцій збігалися. В наслідок цього реальна продуктивність конвейєра зменшена в порівнянні з піковою, а його апаратна реалізація ускладнена.
EMBED PBrush
Рис. 3. Принцип конвейєрного опрацювання послідовного потоку інструкцій
На рис. 3 зазначено порядок опрацювання трьох сусідніх інструкцій з послідовного програмного потоку. Часові витрати на кожну інструкцію висвітлено окремими горизонтальними смугами, які, у свою чергу, явно поділено на п’ять фаз чи циклів.
EMBED PBrush
Рис. 3а. Ілюстрація переходу від неконвейєрного до конвейєрного опрацювання послідовного потоку інструкцій (ідеальний погляд на конвейєр)
Припустимо, що часові витрати при опрацюванні окремих етапів (циклів) виконання інструкції знаходяться в межах 50-60 нс. Тоді часові витрати на реалізацію конвейєрного способу опрацювання визначаються так, як це зазначено на рис. 3а. Надлишок в 5 нс (наближено 10 %) у кожному циклі конвейєра в порівнянні з неконвейєрною реалізацією додано через дещо сповільнену роботу ускладненої конвейєрним принципом апаратури. Це накладна платня за прискорення. Зрозуміло, що від планованого 100 відсоткового результату лишається лише100 – 10 = 90 відсотків.
Конвейєрне використання (завантаження в часі) апаратних засобів ілюструє рис. 4.
EMBED PBrush
Рис. 4. Використання апаратури при конвейєрному опрацюванні (ідеальний пипадок)
Конвейєрний варіант побудови інформаційного тракту наведено на рис. 5. Конвейєрні регістри – це звичайні, але програмно “прозорі”, тобто невидимі регістри. Вони містять повне інформаційне “оточення“ інструкції, що вже є на конвейєрі, аби створити їй віртуальне враження про класично-ізольоване від інших сусідніх інструкцій опрацювання.
EMBED PBrush
Рис. 5. Конвейєрний (основний) варіант побудови інформаційного тракту DLX машини.
На рис. 5 затемнено так звані “конвейєрні” регістри, які розташовано “на межі циклів”. Вони мають назви, відповідні сусіднім межам, наприклад, IF/ID, ID/EX, EX/MEM, MEM/WB. Кожну поточну інструкцію, що опрацьовують, ніби пересувють сходинками IF, ID, EX, MEM, WB конвейєра. В ідеалі кожна з інструкцій не “відчуває” присутності на інших сходинках конвейєра “сусідів-конкурентів”на використання апаратури інформаційного тракту.
Нагадаємо ще раз, що в проекті вимагається розробити спрощений неконвейерний прототип скалярного RISC процесора. Інформацію про конвейєризацію надано з метою досягнення поглибленого розуміння та для оформлення роботи на відмінну оцінку.
2.2. Формати інструкцій DLX машини
Формати інструкцій DLX машини наведено на рис. 6. В супровід надано стислий коментар щодо цих форматів.
EMBED PBrush
Рис. 6. Формати інструкцій DLX машини
На рисунку 6 застосовано наступні скорочені позначення:
I - тип: інструкції, що працюють із безпосереднім операндом (Immediate ).
R - тип: інструкції, що отримують пару операндів із регістрів (Registers) регістрового файла процесора та повертають результат знов таки до регістру файла.
J - тип: інструкції безумовних переходів (jump).
Opcode: поле коду операції, довжина 6 бітів.
rs1,rs2: поля довжини 5 бітів, що визначають номери регістрів-постачальників операндів (register of source), а саме, програмно досяжні регістри R0..R31.
rd: п'ятибітове поле номера регістра-приймача результату дії (register of destination), також R0..R31.
Immediate: 16-ти бітове поле, що містить безпосередній операнд; при цьому найлівіший розряд immediate може розглядатись як знаковий; тоді можливе розширення формату розрядями знакового біту за правилами доповняльного коду.
Function: поле, що визначає функцію, яка розширює обмежену кількість (на 211 –1 = 2047 позицій) дозволених різних кодів операції.
Offset added to PC: 26-ти бітова константа, яку додають до вмістимого регістру наступної адреси під час виконання інструкції безумовного переходу.
Зазначимо наступні особливості форматів інструкцій:
Довжина усіх форматів – 32 біти.
Реалізовано фіксовану систему поділу форматів на поля.
Реалізовано дизайн архітектури load/store.
Формати поділено на три групи:
формати АЛП операцій,
формати операцій load/store,
формати операцій керування програмою.
Формати АЛП операцій – трьохадресувальні, виду OP RX,RY,RZ. Одна інструкція задає операцію ОР, вказує два регістри операндів RY, RZ та регістр RZ збереження результату
2.3. Цикл вибирання інструкції (Instruction Fetch cycle - IF)
На цьому циклі виконують наступні мікродії (мікрооперації):
IR = IM [PC];
NPC = PC+4.
Виконання першої мікродії спричинює завантаження до 32-х бітового регістру поточної інструкції IR вмістимого чотирьох послідовно розташованих комірок пам'яті інструкцій, починаючи від адреси (PC)+0 і завершуючи адресою (PC)+3. Як і завжди, за допомогою (PC) позначено вмістиме лічильника інструкцій PC.
Друга мікродія (NPC = PC+4) вираховує “планову” адресу наступної за чергою інструкції з послідовного потоку. Тобто тут визначають наступне вмістиме програмного лічильника (і його тимчасово зберігають у регістрі Next PC, or NPC). “Логічне” вибирання вмістимого чотирьох послідовно розташованих байтових комірок замість однієї 4-х байтової підкреслює те, що навіть на рівні мікродій адресування комірок пам'яті вказують логічно. Фізично, за умови коли адреса байта кратна чотирьом, тобто дотримано вирівнювання границь адрес інструкцій, з фізичної пам'яті, одразу (за одне звернення) вибирають чотири байти і навіть цілі пакети по чотири байти. Отриманий з пам’яті даних код тлумачать як 32-х розрядне слово, а з пам’яті інструкцій – як одну інструкцію.
Зауважимо, що обидві наведені мікродії теоретично є сумісними в часі. Саме тому вони можуть і повинні виконуватися паралельно. Ці мікродії утворюють єдину мікроінструкцію; в нашому випадку (але не завжди !) послідовність запису мікродій у мікроінструкції значення не має.
Надзвичайно важливою властивістю циклу IF є те, що він не бере до уваги існування відомого "парадоксу пам'яті". Дійсно, у циклі IF за часовими витратами мікродія вибирання з повільних комірок пам'яті інструкцій є тотожньою мікродії, що працює з внутрішніми, а саме тому надшвидкими регістрами процесора.
Відомо, що статистично "прискорити" повільні комірки головної пам'яті можна за допомогою кеш-пам'яті. Саме тому кеш (cache - прихована від програміста чи компілятора додаткова надшвидка буферна асоціативна чи частково-асоціативна пам'ять) обов'язково використовують у RISC- процесорах. Можна казати, що на рівні прозорої, як правило, для програміста кеш-пам'яті, яку поділено на окремі кеші інструкцій та даних відбувається метаморфоза, або пеpeтворення Princeton Computers Arcitecture (чи John von Neumann Arcitecture) на modified Harvard Computers Arcitecture. Проте це перетворення відчуває лише інженер; програміст (чи компілятор) відчуває нойманівську архітектуру. Зауважимо, що у гарвардській архітектурі немає місця такій звичній і необхідній програмісту парадигмі програмування як "дані – компілятор – лінкер – програма".
2.4. Цикл декодування інструкції/вибирання операндів з регістрового файла
(Instruction decode/register fetch cycle - ID)
На цьому циклі виконують наступні мікродії (мікрооперації):
A = Regs [IR 6..10 ];
B = Regs [IR 11..15];
Imm = ((IR16)16 ## IR 16..31).
У наведеному мікрокоді, що складений з трьох сумісних у часі, тобто спроможних до одночасного, паралельного виконання мікродій, вжито наступні позначення:
A, B, Imm - внутрішні службові 32-х бітні регістри проміжного збереження кодів; всі три регістри є "прозорими" для програміста в тому сенсі, що вони аж ніяк не відбиті в машинних інструкціях.
Regs[address] - комірка пам'яті внутрішньої пам'яті процесора із вже відомою назвою назвою регістровий файл;
R x..y - бітове поле регістра інструкцій, яке містить групу послідовно розташованих бітів - від біту з номером X до біту з номером Y включно; звернемо увагу на нумерацію бітів у слові процесора - лівий біт має 0-й номер, а правий - 31-й номер.
ІR6..10 - бітове поле регістру інструкцій, що містить бінарний номер регістру - джерела коду (див. формат інструкцій); довжина поля є 5 бітів, це дозволяє позначати та реалізувати 32 регістра - від R0 до R31.
IR11..15 - також п'ятибітове поле номера ще одного регістра джерела з множини R0, ..., R31.
Вже зауваживалося, що поле безпосереднього операнду (Immediate or Imm) у форматі інструкції має довжину лише 16 бітів. В цей самий час, розрядність інформаційного тракту і усіх трьох службових регістрів є 32. До того, як записати 16-бітовий код IR16..31 безпосереднього операнда з регістру інструкцій до службового регістру Imm, цей код треба розширити з врахуванням знаку (або розряду IR16) до 32-х бітового значення за наступним стандартним алгоритмом знакового розширення:
IR16 ## IR16 ##...## IR16 # IR16..31.
Тут символом ## позначено операцію зчеплення (конкатенацію).
Важливо, що в циклі ID виконують декодування (розпізнавання) інструкції та вибирання усіх можливих варіантів операндів поточної інструкції, незалежно від її типу, з метою збільшення швидкодії. З іншого боку, можливість одночасного вибирання усіх варіантів операндів потенційно обумовлено відповідною структурою форматів інструкцій, де фіксовано розташування полів-покажчиків на джерела та приймачі операндів і результатів. Іншими словами, формати інструкцій процесора втілюють техніку кодування форматів інструкцій, що відома під назвоюя1 fixed-field coding.
2.5. Цикл виконання / визначення ефективної адреси
(Execution / effective address cycle - EХ)
Мікродії, що виконують в циклі EX, вже залежать від від типу поточної інструкції. Враховуючи це, бажано поділити усі інструкції процесора на наступні три групи або типи:
операції арифметико-логічного пристрою;
операції завантаження операндів з головної пам'яті та збереження результатів у головній пам'яті;
операції умовних та безумовних переходів.
Далі розглядаємо притамані кожному типу інструкцій мікродії.
2.5.1. Операції із зверненням до пам'яті даних (load / store instructions)
У циклі EX вказані операції готують значення ефективної адреси, тобто вираховують значення бінарного коду, що безпосередньо визначає адресу комірки пам'яті даних. Виконують наступну мікродію:
ALUoutput = A + Imm.
Позначене в мікродії додавання безпосереднього операнда (однієї з компонент адреси) з вмістимим робочого регістра А (друго. компоненти) реалізують в АЛП (ALU). Отриману суму (вона завжди ціла і додатня, переносом нехтують) записують до ще одного, прозорого для програміста регістру ALUoutput. Цей регістр має розрядність 32 біти. Він зберігає коди результатів, що з'являються на виході комбінаційної схеми з назвою ALU. Якщо пригадати дію інструкції LW, тоді призначення та форма запису наведеної мікродії стає прозорою.
2.5.2. ALU-інструкція типу регістр-регістр (наприклад, ADD R1,R2,R3)
Виконується відповідна до інструкції наступна мікродія:
ALUoutput = A op B.
Тут узагальнене позначення (op) можна конкретизувати як (add), (sub), і т.д. в залежності від конкретного виду поточної інструкції, яку опрацьовують в інформаційному тракті машини. Підкреслимо, що на попередньому щодо EX циклі, а саме на циклі ID, до службових регістрів вже завантажено вмістиме вибраних комірок пам'яті "регістровий файл" з адресами R2 і R3. Результат дії поки що не збережено в R1, але його тимчасово записано до службового регістру ALUoutput.
2.5.3 ALU - інструкція типу регістр - безпосередній операнд
(наприклад, ADD R1,R2,#23)
Виконується наступна мікродія:
ALUoutput = A op Imm.
Ясно, що замість вмістимого R3 в операції приймає участь безпосередній операнд, який з врахуванням "знакового" розширення до 32-х бітів забирають із службового регістру Imm.
2.5.4. Умовний перехід чи branch (наприклад, BNEZ R5, data)
Виконуються наступні мікродії:
ALUoutput = NPC + Imm;
Cond (ition) = (A op 0).
Обидві мікродії є сумісними в часі. За допомогою першої мікродії вираховують цільову адресу умовного переходу. При цьому до вже визначеної адреси наступної інструкції (NPC), тобто такої, яка розташована безпосередньо за інструкцією умовного переходу, додають знакову константу зі службового регістру Imm, (саме він містить значення data). Друга мікродія визначає (істинне чи хибне) значення умови Condition умовного переходу. Заради цього вмістиме службового регістру A, що є збіжним із вмістимим R5 (у прикладі інструкції), порівнюють на основі операції (op) з нулем. Згідно семантики інструкції BNEZ отримуємо, що Cond=true, коли вмістиме R5 ненульове, або Cond=false, якщо R5 містить нуль. Фізично Cond являє собою однобітовий регістр у скдаді вузла Zero ?.
Звернемо увагу на те, що зараз зформовано лише значення двох необхідних елементів виконання branch, а саме, - однобітовий код умови Cond та цільову адресу переходу, яку тимчасово зберігають у службовому вихідному регістрі АЛП, тобто в ALUoutput. Безпосереднє виконання умовного переходу, що полягає в природній (за чергою) чи неприродній (коли виконують стрибок до цільової адреси) зміні вмістимого PC, виконують наступним циклом.
2.6. Цикл звернення до пам'яті / завершення умовного переходу
(memory access/branch completion cycle - MEM)
2.6.1. Звернення до пам'яті
Виконують наступні мікродії:
LMD = DM [ALUoutput];
DM [ALUoutput] = B.
Звернення до пам'яті застосовують в інструкціях завантаження (наприклад, LW R6,112(R3)) та в інструкціях збереження (наприклад, SW 112(R3),R6).
Першу мікродію виконують тільки у випадку інструкції Load (завантаження). Тут за допомогою попередньо розрахованої адреси пам'яті даних, яку тимчасово зберігають у службовому регістрі ALUoutput, здійснюють доступ до пам'яті, що і позначено записом DM[ALUoutput].
Фізично з пам'яті завжди зчитують 32 біти (або навіть цілі пакети з 32-х бітових структурних одиниць). Отриманий з пам’яті даних бінарний код тимчасово завантажують до ще одного службового регістру LMD (Load Memory Data). І тільки наступного циклу WB, що поки що не розглядався, пересилають зчитаний код з регістру LMD до конкретної комірки (в нашому прикладі - це комірка з адресою R6) регістрового файла.
Другу мікродію реалізують лише в інструкції Store (збереження). Тут до комірки пам'яті даних за адресою, що зберігають в службовому регістрі ALUoutput = (R3) + 112, засилають вмістиме службового регістру B. При цьому (у наведеному прикладі) для інструкції SW має місце тотожність (В)=(R6).
2.6.2. Умовний перехід (branch)
Виконують наступну умовну мікродію:
if (condition) PC = ALUoutput else PC = NPC.
Здійснюють природну (cond=0) або неприродну (cond =1) заміна вмістимого PC з метою реалізації наступної за branch інструкції.
2.7. Цикл зворотнього запису (write-back cycle - WB)
На цьому, вже останньому циклі виконання інструкції у разі потреби результат, що отримано на попередніх фазах записують до деякої комірки RX регістрового файла. Наприклад, в R1, якщо поточною інструкцією ADD R1,R2,R3, або в R6, якщо поточною інструкцією є LW R6,#112(R3).
Увага! Цей цикл змінює програмний стан комп’ютера, після його виконання поновлення попереднього стану унеможливлено!
2.7.1. ALU-операція регістр – регістр
Виконують наступну мікродію:
Regs[IR16..20] = ALUoutput.
Мікродія зберігає результат ALU-операції в регістрі призначення (наприклад, в регістрі R1 на прикладі інструкції ADD). Зрозуміло, що біти 16..20 відповідного формату інструкції містять бінарний номер регістру призначення.
2.7.2. ALU-операція регістр - безпосередній операнд
Виконують наступну мікродію:
Regs[IR11..15 ] = ALUoutput.
Ця мікродія також зберігає результат операції, наприклад, SUB R5, R4, #1002, в комірці R5 регістрового файла.
2.7.3. Інструкція завантаження (наприклад, LW R6, 112(R3 ))
Виконують наступну мікродію:
Regs[IR 11..15 ] = LMD.
Наведена мікроінструкція надсилає до комірки R6 регістрового файла вмістиме комірки пам'яті даних за адресою 112+(R3), яке на попередніх циклах вже було вибране з пам'яті і тимчасово утримувалося в службовому регістрі LMD.
На цьому опис мікродій керування роботою DLX машини завершено.
Подальший крок полягає у розробці об’єднаного алгоритму функціювання комп'ютера в цілому. Алгоритм треба складати на основі вище розглянутих мікродій. Результат наведено у таблиці 1. Зрозуміло, що інструкція Load вимагає виконання повного ланцюжку зміни циклів, а саме - IF, ID, EX, MEM, WB. Але для branch-інструкцій порожнім виявився цикл WB. Проте уведення деякої надлишковості до циклової діаграми сприяє уніфікації і створює грунт для конвертування нашого прототипу до стандартного конвейєрного RISC-комп'ютера.
Таблиця 1. Варіант мікропрограми роботи неконвейєрного прототипу DLX машини
У таблиці 1 не відбито, в який спосіб виконують розгалуження на три гілки у циклі ЕХ (в залежності від типу виконуваної інструкції). До речі, слово "or", якщо воно присутнє у клітинці, треба сприймати як "або", а не як "чи". Не відзначено також, що вказані у циклі WB мікродії потрібні лише за умови опрацювання інструкції Load, а не інструкції Store. Наведену мікропрограму треба реалізовати пристроєм керування, який не обговорювався. Проте можна додатково зазначити, що, коректна генерація послідовності мікрокодів досить легко підтримується кодом поточної інструкції, який, починаючи від фази ID, містить регістр IR.
2.8. Система машинних інструкцій
Повний перелік множини інструкцій надано таблицею 2. Зауважимо, що нестандартно використовують регістр R31 регістрового файла як такий, що містить адресу повернення у разі виконання деяких типів безумовних переходів.
Регістр R0 регістрового файла завжди містить нульові біти (або просто, нуль) і нульове вмістиме не змінює навіть запис до R0. Це дозволяє реалізувати абсолютний режим адресування, коли
address = offset + [R0] = offset + 0 = offset.
де offset є зсувом.
Таблиця 2. Множина інструкцій DLX машини
Реалізовано наступні типи інструкцій (це можна зауважити аналізом вмістимого таблиці 2).
Пересилання даних поміж регістрами та пам'яттю даних, або поміж регістрами цілих операндів і регістрів операндів з рухомою комою та спеціальними регістрами; адресування пам'яті виконують за допомогою лише однієї адресувальної моди (mode), де 16-бітовий зсув, що міститься у форматі інструкції, додають до вмістимого одного з регістрів загального призначення (тобто регістра, що містить цілий операнд - базову адресу).
Ще раз пригорнемо увагу до того, що саме інструкції завантаження (load) чи збереження (store), які належать до цього типу, вивільняють від додаткової функції арифметичного, логічного чи будь-якого іншого опрацювання операндів. Це, по-перше, задовільняє необхідній умові створення множини інструкцій (машинних команд) RISC-архітектури, а по-друге, дозволяє визнати архітектуру, що зараз проектується, як Load/store architecture.
Арифметико/логічні інструкції вивільнено від дій з обміну поміж програмно керованими регістрами процесора та комірками пам'яті даних. За допомогою цієї групи інструкцій виконують дії з додавання або віднімання операндів, логічну обробку та різноманітні зсуви операндів.
Інструкції керування виконанням програми, до яких належать умовні і безумовні переходи і деякі інші інструкції, наприклад, TRAP (остання тимчасово, на короткий термін ніби "передовіряє" керування системою деякому модулю операційної системи), а також інструкція повернення з виключення (обробка особливої ситуації, що може виникнути при виконанні операції) RFE (Return From Exeption).
Інструкції обробки чисел у форматі з рухомою комою, за допомогою яких виконується додавання, віднімання, множення, ділення і низка інших операцій над відповідними кодами, як правило, у двох варіантах, із стандартною та подвійною точністю.
Пояснемо на ілюстративному прикладі синтаксис запису алгоритмів виконання окремих машинних інструкцій DLX (див. таблицю 3). Надано запис:
Regs[R19] 16..31 = 16(DM[Regs[R8]]0 )8 ## DM[Regs[R8]].
Запис фіксує наступне. Оновлюють лише 16 молодших (правих) бітів регістру R19. До них пересилають двохбайтовий бінарний код, в якому молодший правий байт береться з пам’яті даних DM за адресою, що є збіжною з вмістимим регістру R8. Старший лівий байт утворюють вісімразовим повторюванням нульового (старшого) розряду щойно згаданого правого байта. Парою символів ## позначено операцію конкатенації (зчеплення) двох байтів до двохбайтового напівслова. Наведеного у таблиці 3 достатньо для синтезу відсутніх в ній алгоритмів.
Таблиця 3. Приклади алгоритмів виконання інструкцій DLX
3. КЕШ
3.1. Загальні положення
Відомий так званий парадокс пам’яті – пам’ять ядра комп’ютера (ядро комп’ютера = процесор + пам’ять) може бути або малою, проте швидкою і задовільняти вимоги процесора щодо швидкодії, або ж відносно великою і повільною. Немає пам’яті відносно великої і, водночас, швидкої. Ставити зараз питання про пам’ять, що власною місткістю задовільняє системного програміста (системні програми) є, безперечно, не реальною задачею. Місткості пам’яті завжди не вистачає і, можливо. не вистачатиме.
Аби подалати зазначену невідповідність, вибудовують багаторівневу ієрархічну систему пам’яті комп’ютера, де на верхньому рівні ієрархії знаходяться програмно-керовані регістри процесора, на другому – кеш, потім комірки головної пам’яті в Принстонській архітектурі, або комірки пам’яті даних в Гарвардській архітектурі, потім системи зовнішньої пам’яті (диск, магнітні стрічки, архівна пам”ять з лазерною технологією і т.д.). За рівнями ієрархії, згори додолу, місткість пристроїв пам’яті зростає, а швидкодія зменшується. Керує інформаційними поміжрівневими обмінами операційна система.
Коли багаторівневість і ієрархію пам’яті приховано від прикладного програміста, тоді кажуть про реалізацію віртуальної пам’яті, де, ніби, скасовано зазначений вище парадокс пам’яті. В цьому випадку прикдадному програмісту здається, що він використовує єдину відносно велику і швидку пам’ять.
Надзвичайно важливим є той факт, що звенення процесора до пам’яті завжди локалізовано в невеликому діапазоні змін її адрес. Саме він і дозволяє застосовувати ієрархічну систему пам’яті, аби розв’язати невідповідність швидкодій процесора і підсистеми пам’яті з одним рівнем ієрархії.
EMBED PBrush
Рис. 7. Кеш в складі ядра комп’ютера
(CPU – центральний процесор, Memory – пам’ять, Cache – кеш)
Кеш – це швидка буферна пам’ять невеликої місткості, що розташована поміж процесором і основною пам’яттю. Кеш працює на повній швидкості процесора і не пригальмовує його роботу. Кеш (cache в перекладі з англ. – тайник) лишається прозорим для програміста, тому що система інструкцій процесора, як правило, не містить команд роботи з кешем.
При поясненні роботи кеша можна прийняти, що процесор також не “бачить” кеш і генерує адреси пам’яті так, ніби кеша немає. Проте кеш, як правило, існує, і на апаратному рівні перехоплює сигнали процесора читання/запис, а коли треба, то надає процесору швидкі копіїі інформаційних кодів, які тимчасово зберігає у власній робочій пам’яті. Якщо кеш спроможний підмінити собою пам’ять (у понад 96-98 відсотків випадків), тоді він за рахунок власних ресурсів задовільняє запит процесора. Процесор не пригальмовується і залишається працювати на повній швидкості. Коли “підміна” пам’яті неможлива (менше від двох-чотирьох відсотків випадків), тоді кеш залучає до роботи пам’ять, обмін з якою суттєво пригальмовує процесор.
Усі задачі, пов’язані із перехопленням запитів від процесора на роботу із пам’яттю, вирішує частина апаратури кешу під назвою контролер кешу. Друга частина апаратури кешу містить невелику робочу пам’ять, де зберігають вмістиме копій комірок головної пам’яті, що приймали участь в обслуговуванні останніх, тобто найбільш “свіжих” запитів процесора. Важливо, що вмістиме комірок головної пам’яті копіюється до пам’яті кешу разом із своїми адресами. Саме ці копійовані адреси і дозволяють контролеру кешу приймати рішення про спроможність буферної пам’яті задовільнити конкретний процесорний запит без залучення до обміну повільної головної пам’яті.
3.2. Характеристики і робота кеша
Кеш характеризують:
функцією проекції блоків пам’яті на блоки кеша (в нас – пряма проекція);
алгоритмом заміни блоків кеша на блоки пам’яті (в нас – найпростіший, примусовий алгоритм);
алгоритмом виконання запису слова, як результату виконання дій в процесорі, до складної системи кеш-пам’ять (в нас застосовано спрощений алгоритм наскрізного запису).
Детальний розгляд системи кеша залишено поза межами цих методичних вказівок. У вказівках пояснено роботу лише одного, спрощеного варіанту, відомого під назвою “кеш із прямою проекцією та наскрізним записом” (рис.8). Пригорнемо увагу до того, що у поясненні фігурує термін блок з трьома можливими тлумаченнями:
блок як інформаційна одиниця; він складається сусідніх за адресним принципом розташуванням слів без посилання на тип пам’яті;
блок як множина комірок пам’яті даних або пам’яті інструкцій;
блок як множина комірок робочої (внутрішньої) пам’яті кеша.
Розрізнення тлумачень не є важким, воно забезпечено конте...