Реклама:

Микроархитектура Мю-1 имеет относительно простую структуру и работает довольно быстро, хотя эти две характеристики очень трудно совместить. В общем случае простые машины не являются высокоскоростными, а высокоскоростные машины довольно сложны. В процессоре Mic-1 используется минимум аппаратного обеспечения: 10 регистров, простое АЛ У (см. рис. 3.18), продублированное 32 раза, декодер, схема сдвига, управляющая память и некоторые связующие элементы. Для построения всей системы требуется менее 5000 транзисторов, плюс управляющая память (ПЗУ), плюс основная память (ОЗУ).

Мы уже показали, как можно воплотить IJVM микропрограммно, использовав минимум аппаратуры. Теперь рассмотрим альтернативные варианты. Сначала мы выясним, какими способами можно снизить количество микрокоманд в одной команде (то есть каким образом можно сократить длину пути), а затем перейдем к другим подходам.

Слияние цикла интерпретатора с микропрограммой

В микроархитектуре Mic-1 основной цикл состоит из микрокоманды, которая должна выполняться в начале каждой IJVM-команды. В некоторых случаях допустимо ее перекрытие предыдущей командой. В каком-то смысле эта идея уже получила свое воплощение. Вспомните, что во время цикла Mai ni код следующей операции уже находится в регистре MBR. Этот код операции вызывается либо во время предыдущего основного цикла (если у предыдущей команды не было операндов), либо при выполнении предыдущей команды.

Эту идею можно развивать и дальше. В некоторых случаях основной цикл можно свести к нулю. Это происходит следующим образом. Рассмотрим каждую последовательность микрокоманд, которая завершается переходом к Mai ni. Каждый раз основной цикл может добавляться в конце этой последовательности (а не в начале следующей), при этом межуровневый переход дублируется много раз (но всегда с одним и тем же набором целевых объектов). В некоторых случаях микрокоманда микроархитектуры Mic-1 может сливаться с предыдущими микрокомандами, поскольку эти команды используются не всегда полностью.

В табл. 4.4 приведена последовательность выполнения микрокоманд для команды POP. Основной цикл идет перед каждой командой и после каждой команды, в таблице этот цикл показан только после команды POP. Отметим, что выполнение этой команды занимает 4 цикла: три цикла специальных микрокоманд команды POP и один основной цикл.

Таблица 4.4. Новая микропрограмма для выполнения команды POP

Микрокоманда

Операции

Комментарий

рор1

MAR = SP = SP - 1 ; rd

Считывание второго сверху слова в стеке

рор2

 

Ожидание, пока из памяти считается новое значение TOS

рорЗ

TOS = MDR; goto Maini

Копирование нового слова в регистр TOS

Maini

PC = PC + 1; fetch; goto(MBR)

Регистр MBR содержит код операции; вызов следующего байта; переход

В табл. 4.5 последовательность сокращена до трех команд за счет того, что в цикле рор2 АЛУ не используется. Отметим, что в конце этой последовательности сразу осуществляется переход к коду следующей команды, поэтому требуется всего 3 цикла. Этот небольшой трюк позволяет сократить время выполнения следующей микрокоманды на один цикл, поэтому, например, последующая команда ШО сокращается с четырех циклов до трех. Это эквивалентно повышению частоты синхронизирующего сигнала с 250 МГц (каждая микрокоманда по 4 не) до 333 МГц (каждая микрокоманда по 3 не).

Таблица 4.5. Усовершенствованная микропрограмма для выполнения команды POP

Микрокоманда

Операции

Комментарий

рор1

MAR = SP = SP - 1 ; rd

Считывание второго сверху слова в стеке

Mainl.pop

PC = PC + 1 ; fetch

Регистр MBR содержит код операции; вызов

   

следующего байта

рорЗ

TOS = MDR; goto(MBR)

Копирование нового слова в регистр TOS;

   

переход к коду операции

Команда POP очень хорошо подходит для такой доработки, поскольку она содержит цикл, в котором АЛУ не используется, а основной цикл требует АЛУ. Таким образом, чтобы сократить длину команды на одну микрокоманду, нужно в этой команде найти цикл, где АЛУ не используется. Такие циклы встречаются нечасто, но все-таки встречаются, поэтому установка цикла Mai ni в конце каждой последовательности микрокоманд вполне целесообразна. Для этого требуется всего лишь небольшая управляющая память. Итак, мы узнали о первой возможности сокращения длины пути:

Помещение основного цикла в конце каждой последовательности микрокоманд.

3-шинная архитектура

Что еще можно сделать, чтобы сократить длину пути? Можно подвести к АЛУ две полные входные шины, А и В, и, следовательно, всего получится три шины. Все (или по крайней мере большинство регистров) должны иметь доступ к обеим входным шинам. Преимущество такой системы состоит в возможности складывать любой регистр с любым другим регистром за один цикл. Чтобы увидеть, насколько продуктивен такой подход, рассмотрим реализацию команды IL0AD (табл. 4.6).

Таблица 4.6. Микропрограмма для выполнения команды ILOAD

Микрокоманда

Операции

Комментарий

iloadl

Н = LV

MBR содержит индекс; копирование LV в Н

iload2

MAR = MBRU + H; rd

MAR = адрес локальной переменной, которую нужно поместить в стек

iload3

MAR = SP = SP + 1

Регистр SP указывает на новую вершину стека; подготовка к записи

iload4

PC = PC + 1; fetch; wr

Увеличение PC на 1; вызов следующего кода операции; запись вершины стека

iloadö

TOS = MDR; goto Maini

Обновление TOS

Maini

PC = PC+ 1; fetch; goto(MBR)

Регистр MBR содержит код операции; вызов следующего байта; переход

Мы видим, что в микрокоманде iloadl значение LV копируется в регистр Н. Это нужно только для того, чтобы сложить Н с MBRU в микрокоманде iload2. В разработке с двумя шинами нет возможности складывать два произвольных регистра, поэтому один из них сначала нужно скопировать в регистр Н. В 3-шин-ной архитектуре мы можем сэкономить один цикл, как показано в табл. 4.7. Мы добавили основной цикл к команде IL0AD, но при этом длина пути не увеличилась и не уменьшилась. Однако дополнительная шина сокращает общее время выполнения команды с шести циклов до пяти. Теперь мы знаем вторую возможность сокращения длины пути:

Переход от 2-шинной к 3-шинной архитектуре.

Таблица 4.7. Микропрограмма для выполнения команды ILOAD в 3-шинной архитектуре

Микрокоманда

Операции

Комментарий

Iloadl

MAR

= MBRU + LV; rd

MAR = адрес локальной переменной, которую нужно поместить в стек

Hoad2

MAR

= SP = SP + 1

Регистр SP указывает на новую вершину стека; подготовка к записи

Hoad3

PC -

PC + 1; fetch; wr

Увеличение РС на 1; вызов следующего кода операции; запись вершины стека

Hoad4

TOS

= MDR

Обновление TOS

Hoad5

PC =

PC + 1; fetch; goto(MBR)

Регистр MBR уже содержит код операции; вызов индексного байта

Блок выборки команд

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

♦ значение РС пропускается через АЛ У и увеличивается на 1;

♦ РС используется для вызова следующего байта в потоке команд;

♦ операнды считываются из памяти;

♦ операнды записываются в память;

♦ АЛУ выполняет вычисление, и результаты сохраняются в памяти.

Если команда содержит дополнительные поля (для операндов), каждое поле должно вызываться явно, по одному байту за раз. Поле можно использовать только после того, как эти байты будут объединены. При вызове и компоновке поля АЛУ должно для каждого байта увеличивать РС на единицу, а затем объединять получившийся индекс или смещение. Когда, помимо выполнения основной работы команды, приходится вызывать и объединять поля этой команды, АЛУ используется практически в каждом цикле.

Чтобы объединить основной цикл с какой-нибудь микрокомандой, нужно освободить АЛУ от некоторых задач подобного рода. Для этого можно ввести второе

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

В микроархитектуре Mic-1 с АЛ У можно снять большую часть нагрузки, если создать независимый блок для вызова и обработки команд. Этот блок, который называется блоком выборки команд (Instruction Fetch Unit, IFU), может независимо от АЛУ увеличивать значение PC на 1 и вызывать байты из потока байтов до того, как они понадобятся. Блок IFU содержит схему инкремента, которая по строению гораздо проще, чем полный сумматор. Разовьем эту идею. Блок выборки команд может также объединять 8-разрядные и 16-разрядные операнды, чтобы они могли использоваться сразу, как только потребуются. Это можно осуществить по крайней мере двумя способами:

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

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

Рисунок 4.18 иллюстрирует второй способ реализации IFU. Вместо одного 8-разрядного регистра MBR здесь есть два регистра MBR: 8-разрядный MBR1 и 16-разрядный MBR2. Блок IFU следит за самым последним байтом или байтами, которые поступили в основной операционный блок. Кроме того, он передает следующий байт в регистр MBR, как и в архитектуре Mic-1, только в данном случае он автоматически определяет, когда значение регистра считано, вызывает следующий байт и сразу загружает его в регистр MBR1. Как и в микроархитектуре Mic-1, он имеет два интерфейса с шиной В: MBR1 и MBR1U. Первый получает знаковое расширение до 32 битов, второй дополнен нулями.

Регистр MBR2 функционирует точно так же, но содержит следующие 2 байта. Он имеет два интерфейса с шиной В: MBR2 и MBR2U, первый из которых расширен по знаку, а второй дополнен до 32 бит нулями.

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

MBR1 всегда содержит самый старший байт сдвигового регистра, a MBR2 - 2 старших байта (старшим является левый байт), которые формируют 16-разрядное целое число (см. рис. 4.14, б). Два байта в регистре MBR2 могут быть получены из различных слов памяти, поскольку IJVM-команды никак не связаны с границами слов.

Сокращение длины пути

Рис. 4.18. Блок выборки команд в микроархитектуре Міс-1

Всякий раз, когда считывается регистр MBR1, значение сдвигового регистра сдвигается вправо на 1 байт. Всякий раз, когда считывается регистр MBR2, значение сдвигового регистра сдвигается вправо на 2 байта. Затем в регистры MBR1 и MBR2 загружаются самый старший байт и пара самых старших байтов соответственно. Если к этому моменту в сдвиговом регистре остается достаточно места для целого слова, блок выборки команд начинает цикл обращения к памяти, чтобы считать следующее слово. Мы предполагаем, что когда считывается любой из регистров MBR, он заполняется к началу следующего цикла, поэтому новое значение можно считывать уже в последующих циклах.

Блок выборки команд может быть смоделирован в виде конечного автомата (Finite State Machine, FSM), как показано на рис. 4.19. Любой конечный автомат характеризуется состояниями (на рисунке это кружочки) и переходами (это дуги от одного состояния к другому). Каждое состояние - это одна из возможных ситуаций, в которой может находиться конечный автомат. Данный конечный автомат имеет семь состояний, которые соответствуют семи состояниям сдвигового регистра, показанного на рис. 4.18. Эти семь состояний соответствуют количеству байтов, которые находятся в данный момент в регистре (от 0 до 6 включительно). Вызов слова из памяти означает считывание слова из памяти и помещение 4 байт в сдвиговый регистр. Переход MBR1 происходит, когда выполняется чтение регистра MBR1, а переход MBR2 - когда выполняется чтение регистра MBR2.

Каждая дуга отражает возможное событие. В нашем конечном автомате возможны три различных события. Первое - чтение одного байта из регистра MBR1. Оно активизирует сдвиговый регистр, самый правый байт в нем исчезает, и осуществляется переход в другое состояние (меньшее на 1). Второе событие - чтение

2 байт из регистра МВИ2. При этом осуществляется переход в состояние, меньшее на 2 (например, из состояния 2 в состояние 0 или из состояния 5 в состояние 3). Оба этих перехода вызывают перезагрузку регистров МВШ и М1Ш2. Когда конечный автомат переходит в состояния 0, 1 или 2, инициируется обращение к памяти, чтобы вызвать новое слово (предполагается, что память уже не занята считыванием предыдущего слова). При поступлении слова номер состояния увеличивается на 4.

Сокращение длины пути

Рис. 4.19. Конечный автомат для реализации блока выборки команд

Чтобы функционировать правильно, схема выборки команд должна блокироваться в том случае, если от нее требуют произвести какие-то действия, которые она выполнить не может (например, передать значение в MBR2, когда в сдвиговом регистре находится только 1 байт, а память все еще занята вызовом нового слова). Кроме того, блок выборки команд не может выполнять несколько операций одновременно, поэтому вся поступающая информация должна передаваться последовательно. Наконец, всякий раз, когда изменяется значение PC, блок выборки команд должен обновляться. Все эти детали усложняют работу блока. Однако многие устройства разрабатываются в виде конечных автоматов.

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

Основной операционный блок записывает значение в PC только в том случае, если необходимо изменить характер последовательности байтов. Это происходит в команде перехода, а также в командах INVOKEVIRTUAL и IRETURN.

Поскольку микропрограмма больше не увеличивает PC явным образом при вызове кода операции, блок выборки команд должен обновлять PC сам. Как это происходит? Блок IFU способен распознать, что байт из потока команд получен, то есть что значения регистров MBR1 и MBR2 (или их вариантов без знака) уже считаны. С регистром PC связана отдельная схема инкремента, которая увеличивает значение на 1 или на 2 в зависимости от того, сколько байтов получено. Таким образом, регистр PC всегда содержит адрес первого еще не полученного байта. В начале каждой команды в регистре MBR находится адрес кода операции этой команды.

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

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

Команды из памяти должны вызываться специализированным функциональным блоком.

Быстродействие и стоимость || Оглавление || Упреждающая выборка команд из памяти - микроархитектура Mic-2