5.4 Архитектура SF1
==108
5.4.1 Введение
==109
SF1, что расшифровывается как «компьютер со стековыми кадрами номер один», университета The Wright State - экспериментальный процессор с несколькими стеками, созданный для эффективного исполнения программ на языках высокого уровня, включающих как FORTH, так и Си. Он разрабатывался под использование большого количества стеков. В описываемой реализации задействовано пять. SF1 берёт своё начало в языке FORTH, но сам он стирает границу между ML0 и ML2 машинами, позволяя каждой инструкции обращаться к любому элементу двух стеков непосредственно в стековой памяти. В этой модели можно увидеть интересную смесь свойств FRISC 3 и RTX 32P , а так же некоторые уникальные особенности.
Университет Wright State разработал серию стековых компьютеров, начиная с RUFOR ( Grewe & Dixon 1984 ), который был чистой FORTH-машиной, собранной на секционных процессорах. В 1985-1986 группа компьютерной архитектуры собрала из дискретных компонентов прототип более универсального стекового процессора SF1. В 1986-1987 группа VLSI расширила архитектуру и воплотила её в кремнии, создав многокристальную VLSI версию. Ниже следует описание именно этого варианта.
Предполагаемой областью использования SF1 является управление в реальном масштабе времени с использованием FORTH, Си и других языков высокого уровня.
5.4.2 Блок-схема
Блок-схема SF1 приведена на рис. 5.6 .
Рис. 5.6 Блок-схема SF1
В процессоре имеется две шины. По мультиплексированной MBUS передаётся сначала адрес, а затем инструкция и данные в системную память и обратно. SBUS используется для передачи данных между остальными системными ресурсами. Две шины позволяют выбирать инструкции через MBUS одновременно с обработкой данных через SBUS.
С АЛУ связан регистр верхнего элемента стека ( TOS ), который принимает результаты всех вычислительных операций. Входной регистр АЛУ ( ALUI ) работает как промежуточный буфер для хранения второго операнда. Он может загружаться с шины MBUS при операциях с памятью и с SBUS при всех остальных. Содержимое обоих регистров - ALUI и TOS - может выдаваться как на MBUS, так и на SBUS. TOS хранит верхний элемент того стека, с которым работает текущая инструкция, а заботы о корректности обращения с ним лежат на программисте.
К шине стека подключены восемь абонентов: S, F, R, L, G, C, I и P .
- S
- стек параметров общего применения
- L
- стек счётчиков циклов
- G
- общий стек
- F
- стек кадров
- R
- стек адресов возврата
- C
- регистр констант
- I
- пространство ввода/вывода
- P
- счётчик программы
==110
Все восемь источников упоминаются в технической документации как стеки, но на самом деле C, I и P являются структурами не стековой природы. Стеки L, G, F и S по большей части взаимозаменяемы и могут использоваться в любых целях. Стек R [* в оригинале здесь «S», вероятно, опечатка ] отличается тем, что все адреса возврата из подпрограмм автоматически кладутся именно в него.
Любой из 8192 верхних элементов любого стека может быть указан в качестве источника или приёмника. Если происходит чтение из стека, верхний элемент может как сохраняться, так и выбрасываться. Если операция предполагает удаление данных из стека, то выбрасывается самый верхний элемент независимо от того, какой именно элемент читался.
Аналогично, если стек является приёмником, то значение с шины SBUS может быть помещено на его вершину или в любой из 8192 верхних элементов.
Через «Стек» C можно прочитать поле адреса исполняемой инструкции в виде 13-разрядной знаковой величины [* 12 разрядов и знак в битах 28..16 инструкции ] . P позволяет сохранить или загрузить значение счётчика команд. I используется как адресное пространство ввода/вывода размером 8K слов.
==111
Содержимое счётчика программы ( PC ) выдаётся на шину MBUS для выборки инструкции или загружается с неё при переходах или вызовах подпрограмм. Кроме того, PC может записываться и прочитываться через шину SBUS для сохранения и восстановления адресов возврата из подпрограмм.
5.4.3 Обзор системы команд
В SF1 есть два формата инструкций, показанные на рис. 5.7a и 5.7b . Один используется для переходов и вызовов подпрограмм, а другой во всех остальных случаях.
Рис. 5.7a показывает формат инструкций передачи управления. Он выбирается установкой в нуль младшего бита. Единица в бите_1 соответствует переходу, а нуль - вызову подпрограммы. Биты 2..31 содержат выровненный по границе слова адрес назначения. Инструкции передачи управления исполняются за один такт.
Рис. 5.7a Формат инструкций SF1 -- переходы и вызовы
Формат операционных инструкций показан на рис. 5.7b . Операционный формат выбирается единицей в бите_0 .
Рис. 5.7b Формат инструкций SF1 -- операции
Бит_1 отвечает за операцию пропуска команды. Если выбран пропуск и флаг статуса установлен, то из последовательности команд считывается очередная инструкция. [* По логике, следующая за исполняемой выкидывается, а считывается вторая от текущей ] . Такая возможность позволяет организовывать в программе условные переходы.
Биты 2..7 выбирают режим работы АЛУ. Специальный режим возвращает флаги состояния предыдущей операции. Эти флаги могут использоваться как смещение в таблице адресов для организации переходов по различным условиям. Такие условные переходы выполняются медленнее, чем пропуск команды, но более универсальны.
Перед тем, как разъяснять роль битов 8..28 , следует описать работу шины SBUS. В каждом машинном цикле SBUS используется дважды. В первой половине читается один из восьми источников, а результат кладётся в регистр ALUI . Во второй половине АЛУ выполняет действие над новым содержимым ALUI и старым значением TOS . Одновременно старое содержимое TOS или ALUI , обновлённый в первой половине цикла, сохраняется в одном из восьми подключённых к шине SBUS приёмников. Выбор TOS/ALUI выполняется с помощью бита_29 .
Биты 8..11 указывают приёмник на шине SBUS. Во второй половине цикла в приёмник пишется значение TOS , полученное в ходе предыдущей инструкции [* отложенная запись, т.е. одностадийный конвейер ] . Бит_8 выбирает помещение в стек [* число элементов в стеке увеличивается ] или простую перезапись [* число элементов в стеке остаётся прежним ] . Аналогично, биты 12..15 выбирают источник на шине SBUS, который считывается в первой половине машинного цикла. Бит_12 сообщает, нужно ли удалять элемент из стека-источника.
В битах 16..28 передаётся адрес, используемый при считывании или записи элемента в стеке. Адрес позволяет обратиться к любому из 8K верхних элементов стека непосредственно. Отметим, что в инструкции есть только один адрес и именно его используют как источник, так и приёмник.
==112
==113
Бит_29 меняет отправителя сохраняемых через SBUS данных. Когда бит установлен, вместо TOS используется регистр ALUI . Обновление значения в ALUI в первой половине такта и сохранение его же во второй позволяет прямую передачу данных между любыми источниками на SBUS.
Биты 30..31 управляют доступом к памяти. Бит_31 выбирает расширенную последовательность исполнения, которая использует второй - дополнительный - цикл для обращения к оперативной памяти через MBUS ( в первом происходит выборка следующей инструкции ). Бит_30 указывает операцию - чтение или запись. В первом цикле из TOS считывается адрес памяти, а во втором TOS используется вновь для передачи собственно данных. Отметим, что само обращение к оперативной памяти происходит во втором цикле, а в первом биты 2..29 могут использоваться для выполнения обычных операций. Первый цикл часто используется для загрузки в регистр TOS ( в котором изначально находится адрес ) значения, которое должно быть сохранено в памяти во втором цикле.
5.4.4 Архитектурные особенности
Здесь вновь становится очевидна важность разделения потока на канал выборки инструкций ( шина MBUS ) и обработки данных ( шина SBUS ). Как и другие стековые машины, SF1 проектировался с прицелом на быстрое выполнение инструкций и в частности быстрый вызов подпрограмм.
Нововведением является указание операндов в формате машинных команд. Использование единственного общего регистра вершины стека во всех вычислительных операциях и тот факт, что инструкция содержит только одно поле адреса, делает SF1 похожим на однооперандные стековые машины. Возможность же задания источника и приёмника в каждой инструкции роднит его с двухоперандными моделями. Вероятно, правильнее называть формат 1-операндным ( S1 ), так как, несмотря на наличие полей источника и приёмника, адрес может быть только один.
Обоснованием предоставления доступа к любому из 8K верхних элементов любого стека была поддержка языков, работающих со стековыми кадрами ( например, Си ). Кроме того, какой-нибудь из стеков может использоваться в качестве очень большого регистрового файла: достаточно никогда не использовать при обращении к нему команды сохранения в стеке и выталкивания из него.
Несколько стеков делались из соображений быстрого переключения контекста в приложениях реального времени. Здесь описана модель с пятью стеками, но в других модификациях их число может быть увеличено. Самый простой вариант их распределения - назначить каждой из четырёх приоритетных задач по собственному стеку, оставив пятый для обслуживания низкоприоритетных задач с сохранением и восстановлением его содержимого из системной памяти по мере необходимости.
==114
Возврат из подпрограммы производится через извлечение верхнего элемента стека и записью его в PC . Из-за наличия конвейера команд инструкция, следующая сразу после команды возврата, будет исполнена до возврата управления из подпрограммы [* см. «delay slot» в §6.2.3.2 ] .
Доступ к 32-разрядным константам осуществляется через относительную адресацию с использованием 13-разрядного смещения. Константы обычно располагаются после безусловных переходов, команд возврата из подпрограмм или в конце использующих их процедур.
5.4.5 Реализация и область использования
SF1 выполнен по 3.0µm КМОП технологии MOSIS и состоит из двух кристаллов. Один содержит АЛУ и PC , а другой целиком занят 32-разрядным стеком. Декодирование инструкций и управление реализовано на микросхемах программируемой логики, но в дальнейшем также будет включено в единый кристалл.
Конструкция стеков заметно отличается от того, что можно наблюдать в других разработках. Очевидным методом обеспечения доступа к произвольному элементу является включение сумматора и указателя стека в обычную память. Недостатками этого метода являются медленная работа и сложность расширения стеков.
В SF1 используется принципиально иной подход. Стековая память выполнена как гигантский сдвиговый регистр, который перемещает элементы между соседними словами памяти при сохранении и выталкивании из стека. Обращение к N-ному слову в стеке эквивалентно обращению к N-ному слову в памяти, так как верхний элемент стека всегда находится по нулевому адресу. Минусом такого подхода является больший размер сдвиговой ячейки по сравнению с размером ячейки памяти. Таким образом, самая большая микросхема стека для SF1 имеет объём 128 32-разрядных слов.
SF1 - в первую очередь исследовательская платформа с акцентом на управлении в реальном времени с быстрым переключением контекста ( назначением каждой задаче индивидуальной микросхемы стека ) и поддержкой языков высокого уровня.
Сведения для данного раздела базируются на описании SF1 взятом у Dixon ( 1987 ) и Longway ( 1988 ).
==114