5.2 Архитектура FRISC 3 ( SC32 )
==88
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 .
![](img/sc_05_01.gif)
Рис. 5.1 Блок-схема FRISC 3
Стеки данных и возврата выполнены в виде идентичных аппаратных блоков. Оба состоят из указателя стека, логики формирования адреса и стековой памяти, организованной в виде кольцевого буфера из шестнадцати 32-разрядных элементов. Четыре верхних элемента обоих стеков можно прочитать через шину Bbus. Кроме того, верхний элемент стека данных можно считать через шину Tbus , а верхний элемент стека адресов возврата - через Abus . Оба стековых буфера выполнены по двухпортовой схеме, что позволяет одновременно считывать два различных элемента стека. В каждый отдельный момент времени может записываться только один элемент.
==89
==90
Одним из нововведений 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 ).
==91
5.2.3 Обзор системы команд
Ниже показаны четыре формата инструкций FRISC 3: для управления ходом программы, для обмена с памятью, для работы с АЛУ и для операций сдвига. В FRISC 3 так же, как и в NC4016 , RTX 2000 и M17 , используется раскодированный формат. Три старших бита любого формата обозначают тип инструкции.
Формат инструкций управления ходом программы показан на рис. 5.2a . Три инструкции управления это: вызов подпрограммы, безусловный переход и условный переход. Условный переход выполняется, если регистр FL равен нулю. Поле адреса содержит 29-разрядный абсолютный адрес. Безусловные переходы могут использоваться компилятором для оптимизации хвостовой рекурсии.
![](img/sc_05_02a.gif)
Рис. 5.2a Формат инструкций FRISC 3 -- управление ходом программы
На рис. 5.2b показан формат инструкции обращения к памяти. Биты 15..0 содержат беззнаковое смещение от базового адреса. Для формирования адреса содержимое источника ( биты 24..27 ) и смещение из инструкции защёлкиваются в регистрах на входе АЛУ, выполняется сложение, а результат с выхода АЛУ подаётся на шину адреса Abus.
![](img/sc_05_02b.gif)
Рис. 5.2b Формат инструкций FRISC 3 -- обращение к памяти
Биты 16..19 выбирают режим изменения указателей стеков. Биты 20..23 указывают подключённый к шине Bbus приёмник, а биты 24..27 - источник. В применяемых сокращениях TOS обозначает верхний элемент стека данных, SOS - второй элемент стека данных, 3OS - третий, TOR - верхний элемент стека возврата и так далее.
Бит_28 сообщает, будет ли следующая инструкция адресоваться верхним элементом стека возврата или счётчиком программы ( PC ). Адресация через стек возврата сопровождается удалением из него верхнего элемента, то есть с выполнением возврата из подпрограммы, который может совмещаться с другими действиями.
Биты 29..31 указывают тип инструкции, коих может быть четыре: загрузка из памяти, сохранение в памяти, формирование младшей половины адреса и формирование старшей половины адреса. В директивах работы с памятью источник предоставляет адрес, а поле приёмника указывает регистр, отдающий или получающий данные. Инструкции загрузки/сохранения - единственные, требующие два такта на исполнение, так как они должны обратиться к памяти дважды: при перемещении данных и при выборке следующей инструкции.
Обе команды загрузки адреса просто собирают его в регистре назначения без обращения к памяти, поэтому их можно рассматривать как операцию прибавления непосредственного значения или, учитывая возможность использования в качестве источника регистра ZERO , операцию сборки 32-разрядной константы. В инструкции формирования старшей половины адреса смещение сдвигается влево на 16 разрядов перед сложением.
==92
==93
==94
==95
На рис. 5.2c представлен формат вычислительной инструкции. Её признаком является бит_15 , равный нулю. Биты 0..6 выбирают выполняемое АЛУ действие. Бит_7 разрешает обновление регистра FL в соответствии с условиями, заданными в битах 10..13 . Коды условий включают различные комбинации битов Zero , Negative , Carry_out , oVerflow и двух констант: «0» и «1». Биты 8..9 указывают источник входного бита переноса АЛУ. Бит_14 выбирает источник данных для Bbus: выход АЛУ или содержимое регистра FL .
![](img/sc_05_02c.gif)
Рис. 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 .
![](img/sc_05_02d.gif)
Рис. 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 нет специального регистра вершины стека, а вместо него используется двухпортовая стековая память, допускающая произвольный доступ к любому из четырёх верхних элементов стека. Это расширяет возможности архитектуры по сравнению с чисто стековыми моделями и может увеличить быстродействие на некоторых кодовых последовательностях.
==96
Таблица 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» ).
==97
Логика управления стеком, предназначенная для предупреждения катастрофических ошибок переполнения/антипереполнения стека, «перебрасывает» элементы из буфера в основной стек и обратно так, чтобы всегда иметь четыре элемента в запасе. Такой подход с выдачей по запросу подробно обсуждается в §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 ).
==97