- •Э. Таненбаум
- •Глава 2. Организация компьютерных систем 56
- •Глава 3. Цифровой логический уровень 139
- •Глава 4. Микроархитектурный уровень 230
- •Глава 5. Уровень архитектуры команд 334
- •Глава 6. Уровень операционной системы 437
- •Глава 7. Уровень языка ассемблера 517
- •Глава 8. Архитектуры компьютеров параллельного
- •Глава 9. Библиография 647
- •Глава 8 (архитектура компьютеров параллельного действия) полностью изменена. В ней подробно описываются мультипроцессоры (uma, numa и сома) и мультикомпьютеры (мрр и cow).
- •Глава 1
- •Глава 2 знакомит читателей с основными компонентами компьютера: процессорами, памятью, устройствами ввода-вывода. В ней дается краткое описание системной архитектуры и введение к следующим главам.
- •Глава 2
- •Центральный процессор Центральный процессор
- •12 Битов б
- •24 Входные линии
- •50 Входных линий
- •Глава 4
- •Старший бит
- •Блок выборки команд
- •Сигналы управления
- •Глава 5
- •Intel ia-64
- •Глава 6
- •Глава 7
- •3. Сведения о том, можно ли получить доступ к символу извне процедуры.
- •Глава 8
- •64 Элемента на каждый регистр
- •Intel/Sandia Option Red
- •00 Процессор 2
- •Глава 9
- •4. Mazidi and Mazidi, The 80x86ibm pc and Compatible Computers, 2nd ed.
- •5. McKee et al., Smarter Memory: ImprovingBandwidthforStreamed References.
- •4. McKusick et al., Design and Implementation ofthe 4.4bsd Operating System.
- •3. Hill, Multiprocessors Should Support Simple Memory-Consistency Models.
- •Ieee Scalable Coherent Interface Working Group, ieee, 1989.
- •Ieee Micro Magazine, vol. 18, p. 60-75, July/Aug. 1998b.
- •3Rd ed., Reading, ma: Addison-Wesley, 1998.
- •1988 Int'l. Conf. On Parallel Proc. (Vol. 11), ieee, p. 94-101, 1988.
- •Implementation of the 4.4 bsd Operating System», Reading, ma: Addison-Wesley, 1996.
- •In Shared Memory Multiprocessing», ieee Computer Magazine, vol. 30, p. 4450, Dec. 1997.
- •78Jan.-March 1999.
- •0 123456789Abcdef
- •I и Ijmii him
- •Э. Таненбаум
Глава 4
Микроархитектурный уровень
Над цифровым логическим уровнем находится микроархитектурный уровень. Его задача — интерпретация команд уровня 2 (уровня архитектуры команд), как показано на рис. 1.2. Строение микроархитектурного уровня зависит от того, каков уровень архитектуры команд, а также от стоимости и предназначения компьютера. В настоящее время уровень архитектуры команд часто содержит простые команды, которые выполняются за один цикл (таковы, в частности, системы RISC). В других системах (например, в системах Pentium II) на этом уровне имеются более сложные команды; выполнение одной такой команды занимает несколько циклов. Чтобы выполнить команду, нужно найти операнды в памяти, считать их и записать полученные результаты обратно в память. Управление уровнем команд со сложными командами отличается от управления уровнем команд с простыми командами, так как в первом случае выполнение одной команды требует определенной последовательности операций.
Пример микроархитектуры
В идеале мы должны были сначала описать общие принципы разработки микроархитектурного уровня. К сожалению, таких общих принципов не существует. Каждая разработка индивидуальна. По этой причине мы просто подробно рассмотрим конкретный пример. В качестве примера мы выбрали подмножество виртуальной машины Java, как мы и обещали в главе 1. Это подмножество содержит только команды с целыми числами, поэтому мы назвали ее IJVM (Integer JVM; integer — целое число). Полную структуру JVM мы рассмотрим в главе 5.
Начнем с описания микроархитектуры, на основе которой мы воплотим IJVM. Система IJVM содержит несколько довольно сложных команд. Подобные архитектуры часто реализуются с помощью микропрограммирования, как уже было сказано в главе 1. Хотя структура IJVM несложная, она послужит отправной точкой в описании основных принципов управления командами и последовательности их выполнения.
Наша микроархитектура содержит микропрограмму (в ПЗУ), которая должна вызывать, декодировать и выполнять команды IJVM. Мы не можем использовать
для этой микропрограммы интерпретатор JVM, разработанный компанией Sun,
поскольку нам нужна крошечная микропрограмма, которая запускает отдельные вентили аппаратного обеспечения. Интерпретатор JVM компании Sun был написан на языке С, чтобы обеспечить мобильность программного обеспечения. Этот интерпретатор не может управлять аппаратным обеспечением на таком детализированном уровне, который нам нужен. Поскольку реальное аппаратное обеспечение состоит только из компонентов, описанных в главе 3, то теоретически после изучения этой главы читатель сможет пойти в магазин, купить огромное количество транзисторов и сконструировать машину IJVM. Тому, кто успешно выполнит эту задачу, будет предоставлен дополнительный кредит (а также полное психиатрическое обследование).
Разработку данной микроархитектуры удобно считать проблемой программирования, при этом каждая команда уровня архитектуры команд — функция, вызываемая основной программой. В данном случае основная программа довольно проста. Она представляет собой бесконечный цикл. Сначала программа определяет, какую функцию нужно выполнить, затем вызывает эту функцию, а затем начинает все снова.
Микропрограмма содержит набор переменных, к которым имеют доступ все функции. Этот набор переменных называется состоянием компьютера. Каждая функция изменяет по крайней мере несколько переменных, формируя при этом состояние. Например, счетчик команд — это часть состояния. Он указывает местонахождение функции (то есть команды уровня архитектуры команд), которую нужно выполнить следующей. Во время выполнения каждой команды счетчик команд указывает на следующую команду.
Команды IJVM очень короткие. Каждая команда состоит из нескольких полей, обычно одного или двух, каждое из которых выполняет определенную функцию. Первое поле является кодом операции. Этот код определяет тип команды и сообщает, что это, например, команда сложения или команда ветвления, или еще какая-нибудь команда. Многие команды содержат дополнительное поле, которое определяет тип операнда. Например, команды, которые имеют доступ к локальным переменным, должны иметь специальное поле, чтобы определить, какая это переменная.
Такая модель выполнения команды:, называемая иногда циклом выборка-исполнение, полезна для теории, а также может служить основой воплощения уровня архитектуры команд со сложными командами (например, IJVM). Ниже мы опишем, как работает эта модель, что собой представляет микроархитектура и как ею управляют микрокоманды!, каждая из которых занимает тракт данных на один цикл. Полный список команд формирует микропрограмму, которая будет рассмотрена
очень подробно. Тракт данных
Тракт данных—это часть центрального процессора, состоящая из АЛ У (арифметико-логического устройства) и его входов и выходов. Тракт данных нашей микроархитектуры показан на рис. 4.1. Хотя этот тракт данных и был оптимизирован для интерпретации программ IJVM, он схож с трактами данных большинства компьютеров. Он содержит ряд 32-разрядных регистров, которым мы приписали символические названия (например, PC, SP, MDR). Хотя некоторые из этих названий
нам знакомы, важно понимать, что эти регистры доступны только на микроархитектурном уровне (для микропрограммы). Им даны такие названия, поскольку они обычно содержат значения, соответствующие переменным с аналогичными названиями на уровне архитектуры команд Содержание большинства регистров передается на шину В. Выходной сигнал АЛУ запускает схему сдвига, а затем шину С Значение из шины С может записываться в один или несколько регистров одновременно Шину А мы введем позже, а пока представим, что ее нет
Г
<=
MAR
Регистры управления памятью
В основную память и иэ нее
ft
PC
:С>;_ MBR
SP
= t t
LV
(: I t
CPP t t
TOS 1
| Г
OPC f f
H
Управление
АЛУ
Схема
сдвига
И—**—
Управление
схемой
сдвига
Шина С-
Сигналы управления
Т Разрешающий сигнал на шину В Т Запись сигнала с шины С в регистр
Шина В
Данное АЛУ идентично тому, которое изображено на рис. 3.18 и 3.19. Его функционирование зависит от линий управления. На рис. 4.1 перечеркнутая стрелочка с цифрой 6 сверху указывает на наличие шести линий управления АЛУ. Из них F и р!служат для определения операции, EN А и ENB — для разрешения входных сигналов А и В соответственно, 1NVA — для инверсии левого входа и INC — для
прибавления единицы к результату. Однако не все 64 комбинации значений на
линиях управления могут быть полезны.
Некоторые комбинации показаны в табл. 4.1. Не все из этих функций нужны
для IJVM, но многие из них могут пригодиться для полной JVM. В большинстве
случаев существует несколько возможностей для достижения одного и того же результата. В данной таблице знак «+» означает арифметический плюс, а знак «-» — арифметический минус, поэтому -А означает дополнение А.
Таблица 4.1. Некоторые комбинации сигналов АЛУ и соответствующие им функции
|
F, |
ENA |
ENB |
INVA |
INC |
Функция |
0 |
1 |
1 |
0 |
0 |
0 |
A |
0 |
1 |
0 |
1 |
0 |
0 |
в |
0 |
1 |
1 |
0 |
1 |
0 |
A |
1 |
0 |
1 |
1 |
0 |
0 |
в |
1 |
1 |
1 |
1 |
0 |
0 |
A+B |
1 |
1 |
1 |
1 |
0 |
1 |
A+B+1 |
1 |
1 |
1 |
0 |
0 |
1 |
A+1 |
1 |
1 |
0 |
1 |
0 |
1 |
B+1 |
1 |
1 |
1 |
1 |
1 |
1 |
B-A |
1 |
1 |
0 |
1 |
1 |
0 |
B-1 |
1 |
1 |
1 |
0 |
1 |
1 |
-A |
0 |
0 |
1 |
1 |
0 |
0 |
АИВ |
0 |
1 |
1 |
1 |
0 |
0 |
А ИЛИ В |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
-1 |
АЛУ, изображенное на рис. 4.1, содержит два входа для данных: левый вход (А) и правый вход (В). С левым входом связан регистр временного хранения Н. С правым входом связана шина В, в которую могут поступать значения из одного из девяти источников, что показано с помощью девяти серых стрелок, примыкающих к шине. Существует и другая разработка АЛУ с двумя полноразрядными шинами, и мы рассмотрим ее чуть позже в этой главе.
В регистр Н может поступать функция АЛУ, которая проходит через правый вход (из шины В) к выходу АЛУ Одна из таких функций — сложение входных сигналов АЛУ, только при этом сигнал ENA отрицается, и левый вход получает значение 0. Если к значению шины В прибавить 0, это значение не изменится. Затем результат проходит через схему сдвига (также без изменений) и сохраняется в регистре Н.
Существует еще две линии управления, которые используются независимо от остальных. Они служат для управления выходом АЛУ. Линия SLL8 (Shift Left Logical — логический сдвиг влево) сдвигает число влево на 1 байт, заполняя 8 самых младших двоичных разрядов нулями; линия SRA1 (Shift Right Arithmetic — арифметический сдвиг вправо) число вправо на 1 бит, оставляя самый старший двоичный разряд без изменений.
Можно считать и записать один и тот же регистр за один цикл. Для этого, например, нужно поместить значение SP на шину В, закрыть левый вход АЛУ, установить сигнал INC и сохранить полученный результат в регистре SP, увеличив таким образом его значение на 1 (см. восьмую строку табл. 4.1). Если один и тот же регистр может считываться и записываться за один цикл, то как при этом предотвратить появление ненужных данных? Дело в том, что процессы чтения и записи проходят в разных частях цикла. Когда в качестве правого входа АЛУ выбирается один из регистров, его значение помещается на шину В в начале цикла и хранится там на протяжении всего цикла. Затем АЛУ выполняет свою работу и производит результат, который через схему сдвига поступает на шину С. Незадолго до конца цикла, когда значения выходных сигналов АЛУ и схемы сдвига стабилизировались, содержание шины С передается в один или несколько регистров. Одним из этих регистров вполне может быть тот, от которого поступил сигнал на шину В. Точная синхронизация тракта данных делает возможным считывание и запись одного и того же регистра за один цикл. Об этом речь пойдет ниже.
Синхронизация тракта данных
Как происходит синхронизация этих действий, показано на рис. 4.2. Здесь в начале каждого цикла генерируется короткий импульс. Он может выдаваться задающим генератором, как показано на рис. 3.20, в. На заднем фронте импульса устанавливаются биты, которые будут запускать все вентили. Этот процесс занимает определенный отрезок времени Aw. Затем выбирается регистр, и его значение передается на шину В. На это требуется время Дх. Затем АЛУ и схема сдвига начинают оперировать поступившими к ним данными. После промежутка Ду выходные сигналы АЛУ и схемы сдвига стабилизируются. В течение следующего отрезка Дг результаты проходят по шине С к регистрам, куда они загружаются на нарастающем фронте следующего импульса. Загрузка должна запускаться фронтом сигнала и осуществляться мгновенно, так что даже в случае изменений каких-либо входных регистров изменения в шине С будут происходить только после полной загрузки регистров. На нарастающем фронте импульса регистр, запускающий шину В, приостанавливает свою работу и ждет следующего цикла. На рис. 4.2 упомянуты регистры МРС и MIR, а также память. Их предназначение мы обсудим чуть позже.
Важно осознавать, что хотя в тракте данных нет никаких запоминающих элементов, для прохождения сигнала по нему требуется определенное время. Изменение значения на шине В вызывает изменения на шине С не сразу, а только через некоторое время (это объясняется задержками на каждом шаге). Следовательно, даже если один из входных регистров изменяется, новое значение будет сохранено
в
регистре задолго до того, как старое
(и уже неправильное) значение этого
регистра, помещенное на шину В, сможет
достичь АЛУ.
цикл; должно быть известно минимальное время прохождения сигнала через АЛУ; регистры должны загружаться из шины С очень быстро. Если подойти к этому вопросу с особым вниманием и осторожностью, можно сделать так, чтобы тракт данных функционировал правильно.
Цикл тракта данных можно разбить на подциклы. Начало подцикла 1 запускается задним фронтом синхронизирующего сигнала. Ниже показано, что происходит во время каждого из подциклов. В скобках приводится длина подцикла.
Устанавливаются сигналы управления (Aw).
Значения регистров загружаются на шину В (Ах).
Происходит работа АЛУ и схемы сдвига (Ду).
Результаты проходят по шине С обратно к регистрам (Дг).
На нарастающем фронте следующего цикла результаты сохраняются в регистрах.
Никаких внешних сигналов, указывающих на начало и конец подцикла и сообщающих АЛУ, когда нужно начинать работу и когда нужно передавать результаты на шину С, нет. В действительности АЛУ и схема сдвига работают постоянно. Однако их входные сигналы недействительны в течение периода Aw+Дх Точно так же их выиодные сигналы недействительны в течение периода Aw+ Дх+Ду. Единственными внешними сигналами, управляющими трактом данных, являются задний фронт синхронизирующего сигнала, с которого начинается цикл тракта данных, и нарастающий фронт синхронизирующего сигнала, который загружает регистры из шины С. Границы подциклов определяются толоко временем прохождения сигнала, поэтому разработчики тракта данных должны все очень четко рассчитать.
Работа памяти
Наша машина может взаимодействовать с памятью двумя способами: через порт с пословной адресацией (32-битный) и через порт с байтовой адресацией (8-битный). Порт с пословной адресацией управляется двумя регистрами; MAR (Memory Address Register—регистр адреса ячейки памяти) и MDR (Memory Data Register— информационный регистр памяти), которые показаны на рис. 4.1. Порт с байтовой адресацией управляется регистром PC, который записывает 1 байт в 8 младших разрядов регистра MBR (Memory Bufer Register — буферный регистр памяти). Этот порт может считывать данные из памяти, но не может их записывать в память.
Каждыш из этих регистров, а также все остальные регистры, изображенные на рис. 4.1, запускаются одним из сигналов управления. Белая стрелка под регистром указывает на сигнал управления, который разрешает передавать выходной сигнал регистра на шину В. Регистр MAR не связан с шиной В, поэтому у него нет сигнала разрешения. У регистра Н этого сигнала тоже нет, так как он является единственным возможным левым входом АЛУ и поэтому всегда разрешен.
Черная стрелка под регистром указывает на сигнал управления, который записывает (то есть загружает) регистр из шины С. Поскольку регистр MBR не может загружаться из шины С, у него нет сигнала записи (но зато есть два сигнала разрешения, о которых речь пойдет ниже). Чтобы инициировать процесс считывания из памяти или записи в память, нужно загрузить соответствующие регистры памяти, а затем передать памяти сигнал чтения или записи (он не показан на рис. 4.1).
Регистр MAR содержит адреса слов, таким образом, значения 0,1,2 и т. д. указывают на последовательные слова. Регистр PC содержит адреса байтов, таким образом, значения 0,1,2 и т. д. указывают на последовательные байты. Если значение 2 поместить в регистр PC и начать процесс чтения, то из памяти считается
байт 2, который затем будет записан в 8 младших разрядов регистра MBR. Если
значение 2 поместить в регистр MAR и начать процесс чтения, то из памяти считаются байты 8-11 (то есть слово 2), которые затем будут записаны в регистр MDR.
Для чего потребовалось два регистра с разной адресацией? Дело в том, что регистры MAR и PC будут использоваться для обращения к двум разным частям памяти, а зачем это нужно, станет ясно чуть позже. А пока достаточно сказать, что регистры MAR и MDR используются для чтения и записи слов данных на уровне архитектуры команд, а регистры PC и MBR — для считывания программы уровня архитектуры команд, которая состоит из потока байтов. Во всех остальных регистрах, содержащих адреса, применяется принцип пословной адресации, как и в MAR.
В действительности существует только одна память: с байтовой адресацией. Как же регистр MAR обращается к словам, если намять состоит из байтов? Когда значение регистра MAR помещается на адресную шину, 32 бита этого значения не попадают точно на 32 адресные линии (с 0 по 31). Вместо этого бит 0 соединяется с адресной линией 2, бит 1 — с адресной линией 3 и т. д. Два старших бита не учитываются, поскольку они нужны только для адресов свыше 232, а такие адреса недопустимы в нашей машине на 4 Гбайт. Когда значение MAR равно 1, на шину помещается адрес 4; когда значение MAR равно 2, на шину помещается адрес 8 и т. д. Распределение битов регистра MAR по адресным линиям показано на рис. 4.3.
Как уже было сказано выше, данные, считанные из памяти через 8-битный порт, сохраняются в 8-битном регистре MBR. Этот регистр может быть скопирован на шину В двумя способами: со знаком и без знака. Когда требуется значение без знака, 32-битное слово, помещаемое на шину В, содержит значение MBR в младших 8 битах и нули в остальных 24 битах. Значения без знака нужны для индексирования таблиц или для получения целого 16-битного числа из двух последовательных байтов (без знака) в потоке команд.
Другой способ превращения 8-битного регистра MBR в 32-битное слово — рассматривать его как значение со знаком между -128 и +127 и использовать это значение для порождения 32-битного слова с тем же самым численным значением.
Это преобразование делается путем дублирования знакового бита (самого левого
бита) регистра MBR в верхние 24 битовые позиции шины В. Такой процесс называется расширением по знаку или знаковым расширением Если выбран данный параметр, то либо все старшие 24 бита примут значение 0, либо все они примут значение 1, в зависимости от того, каков самый левый бит регистра MBR: 0 или 1.
В какое именно 32-битное значение (со знаком или без знака) превратится 8-битное значение регистра MBR, определяется тем, какой из двух сигналов управления (две белые стрелки под регистром MBR на рис. 4.1) установлен. Прямоугольник, обозначенный на рисунке пунктиром, показывает способность 8-битного
регистра MBR действовать в качестве источника 32-битных слов для шины В. Микрокоманды
Для управления трактом данных, изображенным на рис. 4.1, нам нужно 29 сигналов Их можно разделить на пять функциональных групп'
9 сигналов для записи данных из шины С в регистры.
9 сигналов для разрешения передачи регистров на шину Вив АЛУ.
8 сигналов для управления АЛУ и схемой сдвига.
2 сигнала, которые указывают, что нужно осуществить чтение или запись через регистры MAR/MDR (на рисунке они не показаны)
1 сигнал, который указывает, что нужно осуществить вызов из памяти через регистры PC/MBR (на рисунке также не показан).
Значения этих 29 сигналов управления определяют операции для одного цикла тракта данных. Цикл состоит из передачи значений регистров на шину В, прохождения этих сигналов через АЛУ и схему сдвига, передачи полученных результатов на шину С и записи их в нужный регистр (регистры). Кроме того, если установлен сигнал считывания данных, то в конце цикла после загрузки регистра MAR начинается работа памяти. Данные из памяти помещаются в MBR или MDR в конце следующего цикла, а использоваться эти данные могут в цикле, который идет после него. Другими словами, если считывание из памяти через любой из портов начинается в конце цикла к, то полученные данные еще не могут использоваться в цикле к+1 (ТОЛЬКО В цикле к+2 и позже).
Этот процесс объясняется на рис. 4.2. Сигналы управления памятью выдаются только после загрузки регистров MAR и PC, которая происходит на нарастающем фронте синхронизирующего сигнала незадолго до конца цикла 1. Мы предположим, что память помещает результаты на шину памяти в течение одного цикла, поэтому регистры MBR и (или) MDR могут загружаться на следующем нарастающем фронте вместе с другими регистрами.
Другими словами, мы загружаем регистр MAR в конце цикла тракта данных и запускаем память сразу после этого. Следовательно, мы не можем ожидать, что результаты считывания будут в регистре MDR в начале следующего цикла, особенно если длительность импульса небольшая. Этого времени будет недостаточно. Поэтому между началом считывания из памяти и использованием этого результата должен помещаться один цикл. Однако во время этого цикла может выполняться не только передача слова из памяти, но и другие операции.
Предположение о том, что работа памяти занимает один цикл, эквивалентно предположению, что количество успешных обращений в кэш-память составляет 100%. Подобное предположение никогда не может быть истинным, но мы не будем здесь рассказывать о циклах памяти переменной длины, поскольку это не входит в задачи данной книги.
Так как регистры MBR и MDR загружаются на нарастающем фронте синхронизирующего сигнала вместе с другими регистрами, они могут считывать во время циклов, в течение которых осуществляется передача нового слова из памяти. Они возвращают старые значения, поскольку прошло еще недостаточно времени для того, чтобы поменять их на новые. Здесь нет никакой двусмысленности: до тех пор пока новые значения не загрузятся в регистры MBR и MDR на нарастающем фронте сигнала, предыдущие значения находятся там и могут использоваться. Отметим, что считывания могут проходить одно за другим, то есть в двух последовательных циклах (поскольку сам процесс считывания занимает только один
цикл). Кроме того, обе памяти могут действовать в одно и то же время. Однако
попытка чтения и записи одного и того же байта одновременно приводит к неопределенным результатам.
Выходной сигнал шины С можно записывать сразу в несколько регистров, однако нежелательно передавать значения более одного регистра на шину В. Немного расширив схемотехнику, мы можем сократить количество битов, необходимых для выбора одного из возможных источников для запуска шины В. Существует только
9 входньгх регистров, которые могут запустить шину В (регистры MBR со знаком и без знака учитываются отдельно) Следовательно, мы можем закодировать информацию для шины В в 4 бита и использовать декодер для порождения 16 сигналов управления, 7 из которых не нужны. У разработчиков коммерческих моделей,
возможно, было бы большое желание избавиться от одного из регистров, чтобы
обойтись 3 битами. Однако мы как ученые предпочитаем иметь один лишний бит, но при этом получить более ясную и простую разработку.
Биты 9 |
|
3 |
|
|
|
|
8 |
|
|
|
|
|
|
|
9 |
|
|
|
|
|
|
3 |
|
4 |
NEXTADDRESS |
J М Р С |
J А М N |
J А М Z |
S L L 8 |
S R А 1 |
Fo |
Fi |
Е N А |
Е N В |
I N V А |
I N С |
Н |
О с |
т О S |
с р р |
L V |
S р |
с |
м D R |
М А R |
W R I Т Е |
R Е А D |
F Е Т С н |
Шина В |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
' V ' Addr |
V JAM |
|
|
|
... у ALU |
|
|
|
|
|
|
|
V с |
|
|
|
|
Mem |
в |
Регистры шины В | |
0-MDR |
5 = LV |
1 =PC |
6 = CPP |
2 = MBR |
7 = TOS |
3 = MBRU |
8 = OPC |
4 = SP |
9-15-нет |
Рис. 4.4. Формат микрокоманды для Мю-1
Теперь мы можем управлять трактом данных с помощью 9+4+8+2+1=24 сигналов, следовательно, нам требуется 24 бита. Однако эти 24 бита управляют трактом данных только в течение одного цикла. Задача управления — определить, что нужно делать в следующем цикле. Чтобы включить это в разработку контроллера, мы создадим формат для описания операций, которые нужно выполнить, используя
24 бита управления и два дополнительных поля поле NEXT_ADDRESS (следующий адрес) и поле JAM. Содержание каждого из этих полей мы обсудим позже. На рис. 4.4 изображен один из возможных форматов. Он разделен на следующие
6 групп, содержащие 36 сигналов'
Addr — содержит адрес следующей потенциальной микрокоманды.
JAM — определяет, как выбирается следующая микрокоманда.
ALU — функции АЛУ и схемы сдвига.
С — выбирает, какие регистры записываются из шины С.
Mem — функции памяти.
4 В — выбирает источник для шины В (как он кодируется, было показано выше)
Порядок групп в принципе произволен, хотя мы долго и тщательно его подбирали, чтобы избежать пересечений на рис. 4 5. Подобные пересечения на диаграммах часто соответствуют пересечениям проводов на микросхемах. Они сильно затрудняют разработку и их лучше сводить к минимуму.
Управление микрокомандами: Mic-1
До сих пор мы рассказывали о том, как происходит управление трактом данных, но мы еще не касались того, каким образом решается, какой именно сигнал управления и на каком цикле должен запускаться. Для этого существует контроллер последовательности, который отвечает за последовательность операций, необходимых для выполнения одной команды.
Контроллер последовательности в каждом цикле должен выдавать следующую информацию:
Состояние каждого сигнала управления в системе.
Адрес микрокоманды, которая будет выполняться следующей.
Рисунок 4.5 представляет собой подробную диаграмму полной микроархитектуры нашей машины, которую мы назовем Mic-1. На первый взгляд она может
показаться внушительной, но тем не менее ее нужно подробно изучить. Если вы
разберетесь во всех прямоугольниках и линиях, изображенных на этом рисунке, вам легче будет понять структуру микроархитектурного уровня. Диаграмма состоит из двух частей: тракта данных (слева), который мы уже подробно обсудили, и блока управления (справа), который мы рассмотрим сейчас.
Самой большой и самой важной частью блока управления является управляющая память. Удобно рассматривать ее как память, в которой хранится полная микропрограмма, хотя иногда она реализуется в виде набора логических вентилей. Мы
будем называть ее управляющей памятью, чтобы не путать с основной памятью,
доступ к которой осуществляется через регистры MBR и MDR. Функционально управляющая память представляет собой память, которая содержит микрокоманды вместо обычных команд. В нашем примере она содержит 512 слов, каждое из
которых состоит из одной 32-битной микрокоманды с форматом, изображенным
на рис. 4.4. В действительности не все эти слова нужны, но по ряду причин нам требуются адреса для 512 отдельных слов.
Управляющая память отличается от основной памяти тем, что команды, хранящиеся в основной памяти, выполняются в порядке адресов (за исключением ветвлений), а микрокоманды — нет. Увеличение счетчика команд в листинге 2.1 означает, что команда, которая будет выполняться после текущей, — это команда, которая идет вслед за текущей в памяти. Микропрограммы должны обладать большей гибкостью (поскольку последовательности микрокоманд обычно короткие), поэтому они не обладают этим свойством. Вместо этого каждая микрокоманда сама указывает на следующую микрокоманду.
Поскольку управляющая память функционально представляет собой ПЗУ, ей
нужен собственный адресный регистр и собственный регистр данных. Ей не требуются сигналы чтения и записи, поскольку здесь постоянно происходит процесс считывания. Мы назовем адресный регистр управляющей памяти МРС (Microprogram Counter — микропрограммный счетчик). Название не очень подходящее, поскольку микропрограммы не упорядочены явным образом и понятие счетчика тут неуместно, но мы не можем пойти против традиций. Регистр данных мы назовем MIR (Microinstruction Register — регистр микрокоманд). Он содержит текущую микрокоманду, биты которой запускают сигналы управления, влияющие на работу тракта данных.
Сигналы управления памятью (rd, wr, fetch)
<=
МАЯ
Декодер с 4 входами и 9 выходами
тип
МРС Ш 11111II—
PC
^1
J
Управляющая память объемом 512x36 битов для хранения микропрограмм
LV
1 I
JMPC
MIR
CPP t=H
Addr |J| АЛУ I С |М|В
TOS \=d
OPC
1 E
JAMN/JAMZ
алу
Шина В N