## Тема 6. Микроархитектурный уровень

### 6.1. Микроархитектура

Над цифровым логическим уровнем находится микроархитектурный уровень. Его задача – интерпретация уровня команд в управляющие сигналы (команды) для цифровых устройств. Строение микроархитектурного уровня зависит от того, каков уровень архитектуры команд, от стоимости и назначения компьютера.

В настоящее время уровень архитектуры команд часто содержит простые команды, которые выполняются за один цикл (системы RISC). В других системах (например Pentium II) на этом уровне имеются более сложные команды, выполняемые за несколько циклов.

Для того, чтобы выполнить команду необходимо:

1. Найти операнды в памяти;

2. Считать операнды;

3. Выполнить операцию;

4. Записать полученный результат в память.

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

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

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

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

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

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

#### 6.1.1. Тракт данных

Тракт данных – это часть центрального процессора, состоящего из АЛУ и его входов и выходов. В общем случае тракт данных содержит ряд регистров и АЛУ. Регистры и АЛУ связаны между собой шинами. Под действием управляющих сигналов содержимое определенных регистров передается на вход АЛУ, а результат записывается в требуемый регистр. Укрупненная и упрощенная структурная схема тракта данных приведена на рис. 6.1.

Функционирование АЛУ зависит от управляющих сигналов, имеет два входа. Схема сдвига имеет свое управление.

За один цикл АЛУ можно считать и записать один и тот же регистр. Процессы считывания и записи происходят в разных частях цикла. Содержимое одного из регистров выдается на шину С в начале цикла и сохраняются там на протяжении всего цикла. Затем АЛУ выполняет операцию, результат которой через схему сдвига поступает на шину С. После стабилизации сигналов на шине С ее содержимое передается в один или несколько регистров. Одним из нескольких регистров может быть тот, от которого поступил сигнал на шину В. Для реализации этих действий должна быть выполнена синхронизация тракта данных.

#### 6.1.2. Синхронизация тракта данных

Синхронизация тракта данных иллюстрируется рис. 6.2.

Хотя в трактe данных нет запоминающих устройств, для прохождения сигналов требуется некоторое время. Для правильной работы тракта данных требуется жесткая синхронизация и достаточно длительный цикл. Никаких синхронизирующих сигналов на вход тракта данных в течение цикла не поступает. Поэтому, необоснованное сокращение длительности цикла может привести к ошибкам работы тракта данных. АЛУ и схема сдвига работают постоянно, но в течение времени Δw+Δx входные сигналы не действительны, а в течении времени Δw+Δx+Δy недействительны выходные сигналы.

#### 6.1.3. Работа памяти

Работа с памятью может быть осуществлена двумя способами: через порт с пословной адресацией (регистры MAR и MDR) и через порт с байтовой адресацией (MBR – буферный регистр). Регистры MAR и MDR используются для чтения и записи слов, а регистры MBR и РС – для считывания программы на уровне архитектуры команд в виде потока байтов.

#### 6.1.4. Микрокоманды

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

1. Сигналы для записи данных из шины С в регистры;

2. Сигналы для разрешения передачи содержимого регистров на шину В и в АЛУ;

3. Сигналы управления АЛУ и схемой сдвига;

4. Сигналы управления регистрами MAR\MDR;

5. Сигналы управления регистрами PC\MBR.

Значения этих сигналов определяют операции для одного цикла тракта данных. Если был установлен сигнал обращения в память в k-ом цикле, то данные из памяти могут появиться в регистрах MDR(MBR) только в конце следующего k+1-го цикла, а использовать эти данные можно только k+2 цикле и то только в том случае, если эти данные были в кэш-памяти.

#### 6.1.5. Разработка микроархитектурного уровня

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

##### 6.1.5.1. Скорость и стоимость

Существует три основных подхода, которые позволяют увеличить скорость выполнения операций:

1. Сокращение количества циклов, необходимых для выполнения команды.

2. Упрощение организации машины таким образом, чтобы можно было сделать цикл короче.

3. Выполнение нескольких операций одновременно.

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

1. В микропрограмме, реализующей команду, находят циклы, для выполнения которых не требуется работа АЛУ. Такие циклы ставить в конце последовательности микрокоманд.

2. Введение дополнительной шины. Т.е. к АЛУ подвести две шины и на входы подавать сигналы с произвольных регистров. Таким образом исключается цикл передачи одного из операндов в Акк, но усложняется кодировка микрокоманды и аппаратура – переход к трехшинной архитектуре.

3. Введение блока выборки команд: процедура выборки следующей команды передается отдельному блоку – команды из памяти должны вызываться специализированным функциональным блоком.

##### 6.1.5.2. Конвейерная архитектура

Следующий рассматриваемый вариант усовершенствования архитектуры – ввести в машину больше параллелизма.

Длительность цикла определяется временем, необходимым на прохождение сигнала через тракт данных. В цикле тракта данных есть три основных компонента:

1. Время, необходимое на передачу значений выбранных регистров на входы АЛУ.

2. Время работы АЛУ и схемы сдвига.

3. Время на передачу полученных значений в регистры и сохранение результатов.

Таким образом один цикл можно разбить на 3 цикла, более короткие. Продвижение микрокоманды осуществляется по трем устройствам. Следующая микрокоманда может быть начата до окончания предыдущей. Проблема: RAW-взаимозависимость (Read After Write – чтение после записи) – последующей операции могут понадобиться данные, которые еще не готовы. В таком случае возникает простой.

Это простейший конвейер с 3 стадиями, количество стадий (степень параллелизма может быть увеличена).

#### 6.1.6. Увеличение производительности.

Усовершенствования компьютеров распадаются на две категории: усовершенствование реализации и усовершенствование архитектуры.

Усовершенствование реализации – такие способы построения нового процессора и памяти, после применения которых система работает быстрее, но архитектура не меняется. Это означает, что старые программы будут работать на новой машине. Это очень нравится потребителям. Например, улучшение производительности от 80386 к 80486, Pentium, Pentium Pro, Pentium II происходило без изменения архитектуры.

Однако возникаем момент, когда старая архитектура себя исчерпала и единственный способ развивать технологии дальше – начать новую разработку. Таким революционным скачком было появление RISC в 80-х годах.

##### 6.1.6.1. Кэш-память

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

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

Помимо этого между кэш-памятью и основной памятью часто помещают кэш-память второго уровня.

Существует два типа локализации адресов:

1. Пространственная локализация – основана на вероятности того, что в скором времени потребуется обратиться к ячейкам памяти, которые расположены рядом с недавно выбранными ячейками;

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

Во всех типах кэш-памяти используется следующая модель: основная память разделяется на блоки фиксированного размера, которые называются строками кэш-памяти. Строка состоит из нескольких последовательных байтов (от4 до 64). При обращении к памяти сначала проверяется наличие требуемой информации в кэш-памяти и в случае промаха из кэш-памяти удаляется строка, а на ее место помещается требуемая из основной памяти. Трока больше, чем вызываемый элемент.

##### 6.1.6.2. Прогнозирование ветвлений

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

Первые конвейеризированные процессоры простаивали до тех пор, пока не становилось известно, куда нужно выполнить переход.

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

Динамаческое прогнозирование ветвлений. Один из самых простых способов – хранить специальную таблицу (в аппаратном обеспечении), в которую центральный процессор записывает условные переходы, когда они встречаются и там их можно искать, если он снова появляется. В такой таблице хранится адрес перехода и бит, который указывает, был ли сделан этот переход. Прогноз состоит в том, что программа пойдет тем же путем, что и в предыдущий раз. Если прогноз не верен, то бит меняется.

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

В некоторых машинах (UltraSPARC) введены дополнительные команды перехода, которые содержат бит, который указывает, совершать переход или нет.

##### 6.1.6.3. Исполнение с изменением последовательности и подмена регистров

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

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

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

Возможна ситуация, при которой возникает конфликт при обращении к регистрам: необходимо записать информацию в регистр, а там еще хранятся невостребованные данные. Этого можно избежать, если записывать информацию не в занятый регистр, а куда-то в другое место (можно временно). Для реализации указанных возможностей необходимо вводить дополнительные аппаратные и программные средства.

##### 6.1.6.4. Спекулятивное выполнение

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

Большинство базовых элементов очень короткие и в них недостаточно параллелизма.

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

В этом случае возникает проблема: понадобится ли эта операция? Выполнение команды до того, как стало известно, понадобится ли она, называется спекулятивным выполнением. Чтобы использовать эту технологию, требуется поддержка компилятора, аппаратного обеспечения и некоторое усовершенствование архитектуры.

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

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

### 6.2. Микроархитектура процессора Pentium 4

#### 6.2.1. Общий обзор системы Pentium 4

Pentium 4 – поддерживает 32-битные операнды и арифметику, 64-битные операции с плавающей точкой, а также 8-ми и 16-ти битные операции, унаследованные от предыдущих моделей. Процессор может адресовать до 64 Гбайт памяти и считывать слова по 64 бита за раз.

Микроархитектура Pentium 4, называемая NetBurst, представляет собой решительный отход от принципов архитектуры, используемой в процессорах Pentium Pro, Pentium II, Pentium III. Упрощенная схема архитектуры приведена на рис 6.3.

Подсистема памяти включает объединенный кэш второго уровня (L2), логика доступа к внешнему ОЗУ. Объем кэша от 256 Кбайт до 1 Мбайт. Длина строки 128 байт. На рисунке не показан блок предварительной выборки, который пытается перенести данные из основной памяти в кэш второго уровня до того, как они затребованы. Из кэша второго уровня данные могут передаваться в другие блоки кэш-памяти на очень высокой скорости, теоретическая пропускная способность – 96 Гбайт/с.

Блок предварительной обработки выбирает команды из L2 и декодирует их в порядке выполнения команд в программе. Каждая команда разбивается на последовательность RISC-операций. Таким образом, команда ISA процессора Pentium 4 преобразуется в последовательность RISC-операций, которые исполняются RISC-ядром микросхемы. Этот механизм позволяет соединить устаревший набор CISC-команд с современным трактом данных.

Декодированные операции отправляются в кэш трас (trace chase), в роли которого выступает кэш команд первого уровня. Поскольку кэшируются не исходные команды, а декодированные операции, то тем самым исключается повторное декодирование и извлечение команд из кэша. В этом одно из отличий архитектуры NetBurst. Здесь же выполняется прогнозирование ветвлений.

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

Блок исполнения объединяет специализированные блоки, которые работают параллельно. Данные они получают из регистрового файла и КЭШа первого уровня.

#### 6.2.2. Конвейер NetBurst

Упрощенная схема конвейера Pentium 4 приведена на рис. 6.4.

Блок предварительной обработки получает инструкции из кэша второго уровня порциями по 64 бит. Они декодируются в микрооперации и помещаются в кэш трасс. Емкость кэша трасс составляет 12 000 микроопераций и по производительности сопоставим с традиционным кэшем первого уровня на 8 или 16 кбайт.

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

Если для выполнения команды требуется более четырех микроопераций, то она не декодируется и не помещается в КЭШ трасс. Эта операция помечается специальным маркерами система производит поиск микроопераций в памяти микрокоманд.

Встретившись с командой безусловного перехода, блок декодирования ищет предсказанный объект в буфере объектов перехода (Branch Target Buffer – BTB) первого уровня и продолжает декодирование соответствующего адреса. В кэше BTB L1 сохраняются 4 000 последних переходов. Если необходимая команда отсутствует в таблице, то применяется статическое прогнозирование ветвлений. Для прогнозирования микроопераций перехода применяется буфер трасс объектов перехода или ВТВ трасс.

Второй компонент конвейера – логика исполнения с изменением последовательности – получает данные из кэша трасс емкостью 12000 микроопераций. При поступлении из блока предварительной обработки каждой последующей микрооперации (за цикл их поступает 3) блок распределения и подмены регистрирует ее в таблице, состоящей из 128 записей и называемой буфером переупорядочивания команд (ReOrder Buffer, ROB). В этом буфере хранятся данные о состоянии микрооперации вплоть до пересортировки ее результатов.

Затем блок распределения и подмены проводит проверку на предмет доступности ресурсов, необходимых для выполнения микрооперации. Если ресурсы свободны, то микрооперация устанавливается в очередь на выполнение. Для микроопераций, выполняемых в памяти и вне памяти устанавливаются разные очереди. Если выполнение микрооперации в данный момент невозможно, она откладывается, однако обработка других микроопераций продолжается. Этот принцип позволяет поддерживать загрузку всех функциональных блоков на максимально высоком уровне. В каждый момент времени могут одновременно обрабатываться 126 команд, причем 48 из них могут загружаться из памяти, а 24 – сохраняться в памяти.

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

1. Планировщик 1 – АЛУ1 и блок смещения операций с ПТ.

2. Планировщик 2 – АЛУ2 и блок исполнения операций с ПТ.

3. Планировщик 3 – команды загрузки.

4. Планировщик 4 – команды сохранения.

Поскольку планировщики и АЛУ работают на скорости, в двое превышающую тактовую частоту, то первые два планировщика могут передавать две микрооперации за цикл. С учетом того, что АЛУ также работает с удвоенной частотой, процессор Pentium 4 с тактовой частотой 3 ГГц может выполнять 12 млрд. целочисленных оп/с.

Два целочисленных АЛУ не одинаковы. АЛУ1 выполняет любые арифметические и логические операции, а также операции перехода. АЛУ2 способно выполнять только операции сложения, вычитания, сдвига и циклического сдвига. Не идентичны также и два блока исполнения операций с плавающей точкой. Первый выполняет только сдвиги и SSE-команды, а второй поддерживает арифметические операции с плавающей точкой, а также ММХ и SST команды.

АЛУ и блоки исполнения операций с ПТ получают данные от двух регистровых файлов емкостью по 128 записей. В этих файлах хранятся операнды и результаты. В силу подмены регистров восемь из них содержат регистры, доступные на уровне архитектуры команд (EAX, EBX, ECX и т.д.).

Кэш данных первого уровня имеет емкость в 8 Кбайт. В отличие от кэша трасс, эти данные не декодируются. Длина строки – 64 байт. В случае промаха в кэш первого уровня происходит обращение к кэшу второго уровня. В любой момент времени в состоянии исполнения могут находиться до четырех запросов, направленных из кэша первого в кэш второго.

Так как операции выполняются с нарушением последовательности, то результаты могут быть помещены в кэш первого уровня только после пересортировки. Такую операцию выполняет блок пересортировки.

Если команда сохранения прошла пересортировку результатов, но предшествующие команды еще не завершились, кэш обновлять нельзя и результат передается в буфер незавершенных команд. Буфер рассчитан на 24 команды сохранения. Если одна из последующих команд загрузки пытается считать сохраненные данные, то эти данные непосредственно из буфера будут направлены к команде. Этот процесс называется перенаправлением для загрузки (store-to-load-forwarding).

Таким образом, в Pentium 4 поддерживается старая архитектура команд, которая выполняется на современном RISC – ядре. Это достигается путем деления команд Pentium на микрооперации, их кэширования и передачи (по три микрооперации за раз) конвейеру, где они выполняются с помощью нескольких АЛУ, которые в оптимальных условиях обрабатывают до 6 микроопераций за цикл. Микрооперации выполняются с отклонением от исходной последовательности, но возвращаются и сохраняются в кэше первого уровня в заданном порядке.

### 6.3. Микроархитектура процессора UltraSPARC III Cu

UltraSPARC III Cu – это 64-разрядная машина (по данным и адресам), но в целях совмещения с предыдущими версиями, она воспринимает 32- разрядные операнды, адреса и программы. Шина памяти 128-битная. «Cu» означает, что проводники микросхемы сделаны из меди, а не из алюминия. У меди ниже сопротивление, поэтому при той же ширине проводников можно обеспечить более высокое сопротивление

Вся серия SPARC изначально представляла собой систему RISC. Большинство команд – трехадресные, поэтому они очень хорошо подходят для конвейеризации и нет необходимости разбивать команды CISC на микрооперации RISC (как в Pentium). Однако, в последние годы появляются новые команды обработки мультимедийной информации, для выполнения которых требуются специальные устройства.

#### 6.3.1. Общий обзор системы UltraSPARC III

Структурная схема UltraSPARC III представлена на рис. 6.5. В целом она проще микроархитектуры NetBurst.

КЭШ команд имеет объем в 32 Кбайт, длина строки – 32 байт. Поскольку большинство команд UltraSPARC III занимает 4 байта, то в КЭШе можно хранить 8 000 команд. (Pentium 4 – 12 000).

Блок вызова команд подготавливает для выполнения до 4 команд за цикл. В случае промаха кэш -памяти первого уровня количество вызываемых команд уменьшается. При обнаружении условного перехода происходит обращение к таблице переходов емкостью 16 000 записей. Повысить надежность прогнозирования ветвлений помогают дополнительные биты, связанные с каждым словом в КЭШе. Подготовленные команды поступают в 16-командный буфер, который сглаживает направленный в конвейеры поток команд.

Блок исполнения целочисленных операций состоит из двух АЛУ и короткого конвейера для обработки команд перехода. Кроме того здесь имеются регистры.

Блок исполнения операций с ПТ состоит из 32 регистров и трех независимых АЛУ. Этот же блок выполняет графические операции.

Блок загрузки/сохранения управляет командами записи и считывания. Содержащиеся в нем тракты данных обеспечивают соединение с тремя кэшами. Кэш данных представляет собой традиционную кэш-память первого уровня емкостью 64 Кбайт и длиной строки 32 байта. Кэш предвыборки емкостью 2 Кбайт используется для обеспечения упреждающей выборки. Кэш записи представляет собой небольшой по объему (2 Кбайт) блок кэш-памяти, предназначенный для объединения результатов записи, а следовательно, для оптимизации потребления ресурсов широкой (256-разрядной) шины, ведущей к кэшу второго уровня.

В микросхеме UltraSPARC III предусмотрена логика управления доступом к памяти. Состоит из трех компонентов: системного интерфейса, контроллера кэша второго уровня, контроллера памяти. Системный интерфейс обеспечивает взаимодействие с памятью по 128-разрядной шине. Теоретически объем памяти может достигать 8 Тбайт, однако пазмер печатной платы, на которой расположен процессор допускает только 16 Гбайт.

Контроллер кэша второго уровня сопряжен с объединенным кэшем второго уровня, расположенный вне микросхемы. Поскольку кэш расположен вне микросхемы и иметь объем до 8 Мбайт. Длина строки зависит от объема кэша – от 64 байта для 1 Мбайт до 512 байт в кэше объемом 8 Мбайт.

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

#### 6.3.2. Конвейеризация системы UltraSPARC III Cu

Система UltraSPARC III содержит конвейер с 14 стадиями. Некоторые стадии различны для команд с целыми числами и команд с п/з (рис. 6.6).

Стадия A (Address generation – генерация адреса). На этом этапе определяется адрес следующей команды. Так как прогнозировать ветвление за один цикл невозможно, то команда, следующая за командой перехода всегда выполняется.

Стадия P (Preliminary fetch – предварительная выборка) вызывает команды из кэша команд первого уровня (до четырех за цикл). Для выявления переходов и проверки правильности прогноза используется таблица переходов.

Стадия F (Fetch – выборка) завершается выборка команд и их передача в КЭШ команд.

Стадия B (Branch target – обнаружение объекта перехода) происходит декодирование выбранных команд. Если среди них обнаружены спрогнозированные переходы, то они передаются на стадию А для непосредственной выборки соответствующих команд.

Стадия I (Instruction group formation – группировка команд) – команды сортируются по группам, в зависимости от того, к каким функциональным блокам они обращаются. Имеются различия между АЛУ для выполнения целочисленных операций, а также для АЛУ с ПТ и графических операций. В обоих случаях различаются наборы команд, которые способны выполнять те или иные АЛУ. Сортировка команд производится на ступени I.

Стадия J (Instruction stage grouping – извлечение команды из очереди) – команды подготавливаются к отправке в блок выполнения во время следующего цикла. В течение одного цикла на стадию R можно передать до четырех команд.

Стадия R (Register – регистр) – производится поиск регистров, необходимых для обработки команд целочисленных операций. Запросы на предоставление регистров для команд с ПТ перенаправляются в соответствующий регистровый файл. Если необходимый регистр оказывается недоступным по причине занятости предыдущей командой, то текущая команда приостанавливается, а все последующие команды блокируются. В отличие от Pentium 4 в UltraSPARC III Cu команды вне исходной последовательности не выполняются.

Стадия E (Execution – выполнение) предназначена для выполнения целочисленных команд. Время выполнения большинства целочисленных операций – один цикл. Сразу по завершении операции обновляется регистровый файл. Некоторые сложные целочисленные операции передаются в специальный блок. Команды загрузки/сохранения на этом этапе начинаются, но не заканчиваются. На стадии Е также обрабатываются команды условного перехода и определяется их направление. В случае неверного прогноза сигнал направляется на ступень А и конвейер освобождается.

Стадия С (Cache – кэш) – завершается доступ к кэш-памяти первого уровня. Здесь же определяются результаты команд, предусматривающих чтение данных из памяти.

Стадия М (Miss – промах) – производится обработка слов, запрошенных, но не найденных в кэш-памяти первого уровня. Здесь же выполняются операции знакового расширения и выравнивания байтов, четвертинок и половинок слов, найденных в кэше первого уровня. Эля операций загрузки с ПТ, у которых в кэше предвыборки имеет место попадание, на этом этапе удается получить результаты. По соображениям синхронизации кэш предвыборки при обработке целочисленных данных не задействуется.

По соображениям синхронизации кэш предвыборки при обработке целочисленных данных не задействуется.

Стадия W (Write – запись) – результаты записываются в регистровый файл рабочего регистра.

Стадия X (eXtend – продленное выполнение) – завершается большинство команд с ПТ и графических команд. Перед формальной пересортировкой результатов, происходящих на ступени D результаты этих команд предоставляются последующим командам путем перенаправления для загрузки.

Стадия T (Tape – перехват) – перехватываются исключения, связанные с целочисленными командами и командами с ПТ. Если возникло исключение или прерывание, то все ранее запущенные команды должны быть завершены, а запуск последующих отменен.

Стадия D – состояние целочисленных регистров и регистров с ПТ фиксируется в соответствующих архитектурных регистровых файлах. При возникновении исключения или прерывания видимыми становятся именно эти значения, а не содержимое рабочих регистров. Кроме того, на этой ступени результаты всех завершенных команд сохранения записываются в кэш записи (вместо кэша первого уровня). В конечном итоге строки этого кэша переписываются в кэш второго уровня, минуя кэш первого уровня (содержимое кэшей не пересекается). Эта схема упрощает сборку мультипроцессорных систем на базе UltraSPARC).

Приведенная схема значительно упрощена работы конвейера значительно упрощена.

### 6.4. Микроархитектура процессора 8051

#### 6.4.1. Общий обзор системы 8051

Диаграмма микроархитектуры 8051 представлена на рис. 6.7.

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

Регистр В применяется для операций умножения и деления, а также используется как временный регистр. Регистр SP является указателем стека. В регистре IR содержатся команды, выполняемые в данный момент.

Регистры ТМР1 и ТМР2 – защелки, в которые помещаются операнды. Результаты работы АЛУ записываются в любой регистр, который доступен через основную шину. Коды состояний записываются в регистр PSW (Program Status Word – слово состояния программы).

В 8051 предусмотрены независимые модули памяти для размещения данных и кода. Емкость ОЗУ для данных составляет 128 (8051) или 256 (8052) байт. Регистр RAM ADDR адресует эту память. Емкость памяти кода может составлять 64 Кбайт (при условии расположения вне микросхемы), поэтому разрядность регистра ROM ADDR составляет 16 разрядов. Регистр DPRT (Double PointTeR –двойной указатель) – 16-разрядный временный регистр, предназначенный для управления и сборки 16-разрядных адресов. Регистр РС представляет собой 16-разрядный счетчик команд. Регистр PC incrementer – специальный аппаратный модуль, выполняющий роль псевдорегистра. Ни к PC, ни к PC incrementer нельзя обратиться через основную шину. BUFFER – еще один 16-разрядный регистр временный регистр. Каждый 16-разрядный регистр 8051состоит из двух 8-разрядныых регистров, с каждым из которых можно выполнять разные операции.

Таймеры 16-разрядные, позволяют управлять выполнением приложений в масштабе реального времени.

Предусмотрены четыре 8-разрядных порта, которые могут управлять 32 внешними кнопками, индикаторами, датчиками и т.п.

Процессор относится к синхронным процессорам, большинство операций завершается за один цикл. Каждый цикл делится на 6 частей, каждая часть называется состоянием. В первом состоянии следующая команда вызывается из ПЗУ и отправляется в регистр IR. Во втором состоянии проводится декодирование команды, а значение РС увеличивается на единицу. В третьем состоянии подготавливаются операнды. В четвертом состоянии один из операндов по основной шине передается и размещается в ТМР1. В этом же состоянии возможно копирование содержимого ACC в регистр ТМР2, после чего два операнда готовы к выполнению. В пятом состоянии происходит выполнение команды. В шестом состоянии происходит передача результата операции в регистры Одновременно в регистре ROM ADDR производится подготовка к вызову следующей команды.

### 6.5. Сравнение Pentium, UltraSPARC и 8051

Машина Pentium 4 содержит старый набор команд CISC. UltraSPARC –система RISC. 8051 – простой 8-разрядный процессор, применяемый как встроенный компьютер.

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

Главное различие между Pentium 4, UltraSPARC – переход от набора команд к функциональному блоку. Pentium разбивает команды CISC для перехода к трехрегистровому формату и делает из больших команд маленькие микрооперации.

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

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