Шапка

5.2 Архитектура FRISC 3 ( SC32 )

5.2.1 Введение

FRISC 3, созданный в лаборатории прикладной физики университета Джона Хопкинса ( JHU/APL ), - 32-разрядный стековый процессор с жёсткой системой команд, оптимизированный для выполнения программ на языке FORTH. Название «FRISC» означает «FORTH-компьютер с сокращённой системой команд». Цифра «3» говорит о наличии двух прототипов. Основная задача разработки FRISC 3 - исполнение примитивов языка FORTH в среде реального времени за один такт.

FRISC 3 стал ответом JHU/APL на потребность в быстром FORTH-процессоре для управления бортовой аппаратурой на спутниках и в экспериментах Space Shuttle. Корни FRISC 3 можно обнаружить в проекте JHU/APL HUT , построенном на секционных процессорах и оптимизированном для языка FORTH.

По завершении проекта HUT группа разработчиков из университета Джона Хопкинса создала по 4.0µm технологии кремний-на-сапфире прототип 32-разрядного FORTH-процессора ( FRISC 1 ) и 3µm КМОП вариант общего применения ( FRISC 2 ). Оба новых процессора имели конструкцию, настраиваемую под требования заказчика. Последний вариант - FRISC 3 - процессор коммерческого уровня, который является развитием предыдущих работ.

Фирма Silicon Composers приобрела права на коммерческое производство FRISC 3 и переименовала его в SC32. Описание из этого раздела относится и к FRISC 3, и к SC32, хотя далее в книге разработка будет упоминаться как FRISC 3.

Основное назначение FRISC 3 - встраиваемые системы управления реального времени в основном космического назначения ( это область специализации группы JHU/APL ), но, кроме того, он пригоден и для промышленного и коммерческого использования.

5.2.2 Блок-схема

Блок-схема FRISC 3 представлена на рис. 5.1 .

Рис. 5.1 Блок-схема FRISC 3

Стеки данных и возврата выполнены в виде идентичных аппаратных блоков. Оба состоят из указателя стека, логики формирования адреса и стековой памяти, организованной в виде кольцевого буфера из шестнадцати 32-разрядных элементов. Четыре верхних элемента обоих стеков можно прочитать через шину Bbus. Кроме того, верхний элемент стека данных можно считать через шину Tbus , а верхний элемент стека адресов возврата - через Abus . Оба стековых буфера выполнены по двухпортовой схеме, что позволяет одновременно считывать два различных элемента стека. В каждый отдельный момент времени может записываться только один элемент.

Одним из нововведений FRISC 3 является использование специальной логики управления, связанной с указателями стека. Эта логика автоматически передаёт данные между 16-элементными буферами и стеками во внешней памяти, гарантируя отсутствие состояния переполнения/антипереполнения. Задача решается захватом процессорных тактов для организации циклов обращения к памяти. Это позволяет избежать использования дополнительных выводов корпуса для организации доступа к стекам, но несколько снижает производительность, хотя и размазывает задержку по всему времени исполнения программы. Разработчики FRISC 3 называют это нововведение «стековым кэшем», потому что оно обеспечивает быстрый доступ к нескольким верхним элементам стека, находящимся внутри процессора. Отличие от обычного кэша данных или инструкций состоит в том, что для обращения к неупорядоченным областям памяти не используются ассоциативные таблицы.

Секция АЛУ включает стандартное арифметическое устройство, источниками для которого служат два регистра-защёлки данных с шин Bbus и Tbus. Две раздельные шины и стек данных в двухпортовой памяти позволяют обрабатывать в одной инструкции верхний элемент стека данных ( через Tbus ) и любой из четырёх верхних элементов того же стека ( через Bbus ). Кроме того, к стороне «B» АЛУ через шину Bbus помимо стеков подключены и некоторые другие источники данных.

Защёлки на входах АЛУ используются для фиксации данных с шин Bbus и Tbus в первой половине цикла. Это позволяет использовать шину Bbus для записи данных из арифметического устройства в другие регистры внутри процессора во второй половине цикла. Блок LSHIFT на входе АЛУ используется для сдвига данных на один бит влево при операции деления или их передачи в неизменном виде. Аналогично, выход АЛУ может сдвигаться на один бит вправо при операции умножения перед выдачей на Bbus. [* чего-то я не постиг этой премудрости. Может, наоборот: влево - умножение, а вправо - деление ? ]

Защёлка на выходе АЛУ позволяет использовать адресацию по базе со смещением. В первом такте цикла обращения к памяти АЛУ складывает константу ( Tbus ) с нужным словом в стеке ( Bbus ). Во втором цикле получившийся адрес используется для обмена источника на шине Bbus с памятью.

Регистр флагов ( FL ) хранит один из 16 возможных признаков операции ( кодов условия ), выдаваемых АЛУ. Его можно использовать при выполнении условного перехода или в арифметических вычислениях повышенной точности. Регистр ZERO просто выдаёт на шину Bbus константу «0».

В четырёх регистрах пользователя ( User Registers ) можно держать указатели или иные переменные. Два из них зарезервированы для использования логикой управления стеками и хранят адреса верхних элементов стеков данных и возврата, находящихся в основной памяти.

Счётчик программы ( PC ) выдаёт через шину Abus адрес следующей инструкции в программной памяти. Для вызова подпрограммы содержимое PC перенаправляется через АЛУ в стек возврата, который, в свою очередь, выставляет сохранённый адрес на шину Abus при возврате из процедуры. При выборе команд, вызове подпрограмм и переходах шиной Abus управляет регистр инструкций ( INSTRUCTION REGISTER ).

5.2.3 Обзор системы команд

Ниже показаны четыре формата инструкций FRISC 3: для управления ходом программы, для обмена с памятью, для работы с АЛУ и для операций сдвига. В FRISC 3 так же, как и в NC4016 , RTX 2000 и M17 , используется раскодированный формат. Три старших бита любого формата обозначают тип инструкции.

Формат инструкций управления ходом программы показан на рис. 5.2a . Три инструкции управления это: вызов подпрограммы, безусловный переход и условный переход. Условный переход выполняется, если регистр FL равен нулю. Поле адреса содержит 29-разрядный абсолютный адрес. Безусловные переходы могут использоваться компилятором для оптимизации хвостовой рекурсии.

Рис. 5.2a Формат инструкций FRISC 3 -- управление ходом программы

На рис. 5.2b показан формат инструкции обращения к памяти. Биты 15..0 содержат беззнаковое смещение от базового адреса. Для формирования адреса содержимое источника ( биты 24..27 ) и смещение из инструкции защёлкиваются в регистрах на входе АЛУ, выполняется сложение, а результат с выхода АЛУ подаётся на шину адреса Abus.

Рис. 5.2b Формат инструкций FRISC 3 -- обращение к памяти

Биты 16..19 выбирают режим изменения указателей стеков. Биты 20..23 указывают подключённый к шине Bbus приёмник, а биты 24..27 - источник. В применяемых сокращениях TOS обозначает верхний элемент стека данных, SOS - второй элемент стека данных, 3OS - третий, TOR - верхний элемент стека возврата и так далее.

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

Биты 29..31 указывают тип инструкции, коих может быть четыре: загрузка из памяти, сохранение в памяти, формирование младшей половины адреса и формирование старшей половины адреса. В директивах работы с памятью источник предоставляет адрес, а поле приёмника указывает регистр, отдающий или получающий данные. Инструкции загрузки/сохранения - единственные, требующие два такта на исполнение, так как они должны обратиться к памяти дважды: при перемещении данных и при выборке следующей инструкции.

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

На рис. 5.2c представлен формат вычислительной инструкции. Её признаком является бит_15 , равный нулю. Биты 0..6 выбирают выполняемое АЛУ действие. Бит_7 разрешает обновление регистра FL в соответствии с условиями, заданными в битах 10..13 . Коды условий включают различные комбинации битов Zero , Negative , Carry_out , oVerflow и двух констант: «0» и «1». Биты 8..9 указывают источник входного бита переноса АЛУ. Бит_14 выбирает источник данных для Bbus: выход АЛУ или содержимое регистра FL .

Рис. 5.2c Формат инструкций FRISC 3 -- операции АЛУ

Биты 16..28 идентичны аналогичным битам в инструкции обращения к памяти на рис. 5.2b . Биты 29..31 задают операцию АЛУ или сдвиг.

На рис. 5.2d показан формат операции сдвига, определяемой единицей в бите_15 . Бит_0 не используется. Бит_1 указывает на источник данных для регистра FL : признаки операции АЛУ в соответствии с условиями, заданными в битах 10..13 , или выдвигаемый из выбранного регистра бит. Биты 2..3 управляют специальными многошаговыми действиями, выполняемыми при последовательном умножении и делении. Бит_4 выбирает входной бит для операции сдвига: регистр FL или признаки, вырабатываемые АЛУ. Биты 5..6 обозначают направление сдвига. Бит_7 разрешает обновление регистра FL в соответствии с указаниями бита_1 . Биты 8..9 выбирают источник входного переноса при операциях АЛУ, а бит_14 указывает источник данных для шины Bbus: результат вычислений или регистр FL .

Рис. 5.2d Формат инструкций FRISC 3 -- операции сдвига

Биты 16..28 выполняют те же функции, что и аналогичные биты в инструкции обращения к памяти на рис. 5.2b . Биты 29..31 задают операцию АЛУ или сдвиг.

Все инструкции исполняются за один такт. Исключение составляют команды обращения к памяти, требующие два такта. Исполнение в каждом такте разбивается на две фазы - источника и приёмника. В фазе источника данные из выбранных регистров на шине Bbus и Tbus защёлкиваются на входах АЛУ. В фазе приёмника результат записывается через Bbus. Каждая новая инструкция выбирается одновременно с исполнением предыдущей.

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

Системой команд FRISC 3 поддерживаются большинство обычных примитивов FORTH ( табл. 5.1a ) и работа с четырьмя верхними элементами стеков данных/возврата ( табл. 5.1b ).

5.2.4 Возможности архитектуры

Так же, как и все обсуждавшиеся до настоящего момента машины, FRISC 3 имеет отдельную шину адреса памяти ( Abus ) для выбора инструкций одновременно с другими операциями. Кроме того, в FRISC 3 нет специального регистра вершины стека, а вместо него используется двухпортовая стековая память, допускающая произвольный доступ к любому из четырёх верхних элементов стека. Это расширяет возможности архитектуры по сравнению с чисто стековыми моделями и может увеличить быстродействие на некоторых кодовых последовательностях.

Таблица 5.1(a) Система команд FRISC 3 - Примитивы FORTH ( см. Приложение _B  , табл. B.1 )

0 2* <> DROP R>
0< 2+ = DUP R@
0= 2/ > EXIT S->D
0> 4+ >R LITERAL U<
0BRANCH + @ NEGATE U>
1 -1 AND NOT XOR
1+ - BRANCH OR
1- < CALL OVER

Система команд FRISC 3 содержит массу составных слов FORTH. Ограниченное пространство не позволяет перечислить их всех, поэтому приводятся лишь характерные примеры.

Таблица 5.1(b) Система команд FRISC 3 - Составные примитивы FORTH

LIT + @
чтение по базе со смещением
DUP XOR DROP DUP
LIT + !
запись по базе со смещением
DUP 1+ DROP OVER
<variable> @
считать переменную
OVER + OVER @
<variable> !
сохранить переменную
2 PICK + 2 PICK @
2 PICK
создать копию третьего элемента стека
3 PICK + 3 PICK @
3 PICK
создать копию четвёртого элемента стека
R@ + OVER !
R> DROP R> + 2 PICK !
SWAP DROP DUP < 3 PICK !
LIT + DUP > + >R
OVER + R@ < DUP >R
OVER - OVER OVER + DUP R> DROP
DUP + DROP LIT R> DROP DUP
DUP AND DUP LIT +

Кроме того, FRISC 3 имеет много не включённых в язык FORTH операций, например, действия над данными в стеке возврата ( например, команда «SWAP» ).

Логика управления стеком, предназначенная для предупреждения катастрофических ошибок переполнения/антипереполнения стека, «перебрасывает» элементы из буфера в основной стек и обратно так, чтобы всегда иметь четыре элемента в запасе. Такой подход с выдачей по запросу подробно обсуждается в §6.4.2.2 . Каждый стековый кэш организован в виде кольцевого буфера и имеет глубину 16 слов. Схема управления начинает перемещать данные в память всякий раз, когда в стеке появляется более 12 элементов, и из памяти, если их становится меньше 4 . В каждый момент времени производится перемещение одного элемента, так как в каждой инструкции указатель стека может измениться только на единицу. Каждое перемещение элемента между памятью и кэшем занимает два такта. Цена этих дополнительных тактов обсуждается в Части _6  . Разработчики FRISC 3 оценивают затраты в среднем менее чем в 2% общего времени выполнения программы.

5.2.5 Реализация и область применения

FRISC 3 спроектирован по 2.0µm КМОП технологии и использует 35'000 транзисторов. Он упакован в 85-выводной корпус PGA и работает с частотой до 10 MHz.

FRISC 3 создавался под задачи управления в реальном масштабе времени, в основном для космических систем. Он рассчитан на работу с языком FORTH, но при этом может с разумной производительностью исполнять программы на других языках. В частности поддержка Си облегчается возможностью использования одного из четырёх регистров пользователя в качестве указателя кадра и применения адресной арифметики через инструкции загрузки адреса для уточнения местоположения переменной ( адресация по базе со смещением ).

Данные этого раздела основаны на описании FRISC 3 в работах Hayes & Lee ( 1988 ). Данные о предыдущих версиях архитектуры можно найти у Fraeman et al. ( 1986 ), Hayes ( 1986 ), и Hayes et al. ( 1987 ).

Previous part:

Next part: