4.2 Архитектура процессора WISC CPU/16
==50
4.2.1 Введение
CPU/16 фирмы WISC Technologies был создан автором в качестве очень простой ( в терминах количества компонентов TTL логики ) стековой машины с неплохим сочетанием универсальности и быстродействия. WISC CPU/16 целиком собран на дискретных компонентах средней степени интеграции ( MSI ). Это 16-разрядная машина, основной особенностью которой является память микрокода, построенная на микросхемах ОЗУ и полностью доступная для модификации пользователем. CPU/16 выполнен в виде двух плат и вставляется в IBM PC совместимый компьютер в качестве сопроцессора.
==51
Название WISC означает «Компьютер с Перезаписываемой Системой Команд» , хотя более точным термином было бы «WISC/Stack», так как аппаратные стеки являются составной частью конструкции.
Основным назначением CPU/16 было исследование доступных технологий и вариантов конструкции перед разработкой RTX 32P, описываемого в Части _5 книги. В результате получился довольно быстрый процессор с очень простой и лаконичной конструкций. Первый прототип, сделанный проводным монтажом умещался на одну плату расширения для IBM PC ( 13 на 4 дюйма ) и включал 16K байт программной памяти. Использование микросхем оперативной памяти для хранения микрокода и простой формат микроинструкций позволяет использовать процессор в качестве пособия на курсе проектирования вычислительных машин.
4.2.2 Блок-схема
Блок-схема CPU/16 представлена на рис. 4.1 .
Рис. 4.1 Блок схема CPU/16
Стек данных ( DS ) и стек адресов возврата ( RS ) аппаратно реализованы одинаково. Каждый состоит из 8-разрядного реверсивного счётчика ( указателя стека ), формирующего адрес, и массива памяти с организацией 256x16 бит. Указатели стеков DP/RP доступны по чтению и записи, что позволяет получить быстрый доступ к элементам в глубине стека.
Вычислительная секция состоит из АЛУ, собранного на микросхемах 74LS181, и регистра DHI ( старшее слово данных ) для хранения промежуточного результата. В соответствии с общей практикой, регистр DHI работает в качестве буфера верхнего элемента стека данных. Это означает, что указатель стека данных ( DP ) «смотрит» на элемент, который с точки зрения программиста является вторым сверху. В результате операции, работающие с двумя верхними элементами, подобные сложению, могут выполняться за один такт, в котором сторона «B» АЛУ берёт верхний элемент из регистра DHI , а сторона «A» считывает второй элемент непосредственно из стека данных.
Коды условий, доступные на уровне машинных инструкций, отсутствуют. Сложение с переносом и другие операции повышенной точности поддерживаются микрокодом, который сохраняет флаг переноса в стеке данных в виде логического значения ( «0» для сброшенного флага и «-1» - для установленного ).
Регистр DLO ( младшее слово данных ) используется как место для временного хранения промежуточных результатов в процессе выполнения одной машинной инструкции. Регистровая пара DHI/DLO позволяет сдвигать 32-разрядные величины для операций умножения и деления.
Счётчик команд ( PC ) подключён к адресной шине памяти напрямую. Это позволяет выбирать следующую инструкцию одновременно с обработкой данных остальными частями системы. Таким образом, действия над данными, требующие доступа к АЛУ и стеку данных, могут проводиться одновременно с выборкой очередной машинной инструкции. В процессе вызова функций состояние счётчика команд сохраняется в теневом регистре PCSAVE , после чего сам счётчик загружается адресом начала процедуры. Затем, в ходе её вызова, содержимое теневого регистра кладётся в стек адресов возврата. В процессе возврата из процедуры сохранённое значение PC проходит через АЛУ, где к нему прибавляется единица, после чего оно загружается обратно в PC . Это позволяет обойтись без отдельной процедуры увеличения счётчика, которая в противном случае «съела» бы один такт.
==52
==53
Системная память организована, как 64K 16-разрядных слов с возможностью доступа только по границе слова. Работа с 8-битными величинами возможна через микрокодовую операцию изменения порядка байт в слове.
Микропрограммная память выполнена в виде массива из 2K 32-разрядных слов, доступных по чтению и записи. Память организована, как 256 страниц по 8 ячеек. Счётчик микропрограммы ( MPC ) отвечает за номер страницы - 8 старших разрядов адреса. Микропрограмма исполняется в пределах 8 слов страницы. Такая схема позволяет задавать в микроинструкции только три младших бита следующей микроинструкции [* в пределах заданной страницы ] , причём [* два старших бита задаются непосредственно, а ] самый младший является результатом [* вычисления ] одного из восьми возможных условий [* , выбираемых отдельным полем микроинструкции. Всё клещами приходится вытягивать, тшьёрт побьерри! ] . Это позволяет организовывать ветвления и циклы в процессе выполнения одного кода операции.
Декодирование инструкции проводится простым выбором страницы микропрограммной памяти, то есть загрузкой восьмибитного кода операции в счётчик микропрограммы. Исполнение одной операции может занимать и больше, чем одну 8-элементную страницу, если обстоятельства того требуют. [* За переход на следующую страницу отвечает бит_23 «увеличение MPC» ] .
Микропрограммная память буферируется с помощью регистра микроинструкции ( MR ), который образует одностадийный конвейер и позволяет выбирать следующую микроинструкцию одновременно с исполнением текущей. Это полностью убирает задержку выборки данных из микропрограммной памяти с критичного по времени пути исполнения команды. Кроме того, конвейер устанавливает нижний предел в два такта на инструкцию. Если команда требует только одного такта, то к ней добавляется пустая микроинструкция для того, чтобы обеспечить правильное продвижение микрокода по конвейеру.
Блок связи с управляющим компьютером позволяет CPU/16 работать в двух возможных режимах: основном и подчинённом. В подчинённом режиме процессор управляется с персонального компьютера, в котором он установлен, и позволяет загрузку программы, запись микропрограммной памяти и изменение содержимого любого регистра или ячейки памяти для инициализации или отладки. В основном режиме CPU/16 занят исполнением программы, а персональный компьютер может находиться в сервисном цикле, контролируя регистр состояния на предмет обнаружения запроса на обслуживание, или заниматься другими делами, например, считыванием очередного блока данных с диска или отрисовкой изображения. При необходимости CPU/16 будет ожидать обслуживания столько, сколько потребуется.
4.2.3 Обзор системы команд
В CPU/16 есть два формата инструкций: один для вызова микрокода и один для вызова подпрограмм.
==54
На рис. 4.2a показан формат вызова микрокодовых инструкций. Так как микропрограммная память организована в виде 256 страниц [* и только номер страницы доступен программисту ] для указания кода операции [* номера страницы ] требуются только 8 бит. В результате для микрокодовых инструкций выбран формат, восемь старших разрядов которого установлены в «1». Это позволяет использовать в инструкции для вызова подпрограмм, показанной на рис. 4.2b , любой адрес, старшие восемь разрядов которого не равны единице [* то есть исключается диапазон 0xFF00..0xFFFF - всего 256 адресов ] . Такой подход снимает ограничение на 15-разрядный адрес подпрограмм, присутствующее в других проектах, описываемых далее. Минусом подобной стратегии является невозможность задания параметров команды в коде инструкции. Как следствие, адрес условного перехода идёт следом за инструкцией, в противоположность общепринятому методу, когда добавляют небольшое смещение относительно текущей команды в какое-то из полей самой команды. Основной целью такого решения была минимизация декодирующей логики.
Рис. 4.2 Форматы инструкций CPU/16. A ( слева ) . Операции. B ( справа ) . Вызовы подпрограмм
Для хранения микрокода используется оперативная память и при желании, пользователь может его изменить полностью или частично. Стандартным программным окружением для CPU/16 является MVP-FORTH - диалект FORTH-79 ( Haydon 1983 ). Некоторые из слов FORTH включены в стандартный набор, представленный ниже. Естественно, возможно и другое программное окружение, но реализован был только FORTH.
Единственным примечательным фактом, относящимся к системе команд, является разнообразие поддерживаемых примитивов FORTH. В табл. 4.1a помещён большой набор базовых слов языка. Табл. 4.1b представляет общеупотребительные словосочетания FORTH, реализованные как одна инструкция. В табл. 4.1c показаны слова, выполняющие низкоуровневые операции FORTH, такие как вызов подпрограммы или выход из неё. Табл. 4.1d содержит высокоуровневые слова языка, использующие оптимизированный по скорости микрокод. В табл. 4.1e собраны слова, поддерживающие целочисленные операции повышенной точности и операции с 32-битными числами с плавающей запятой.
==55
Время выполнения инструкций меняется в зависимости от сложности выполняемых операций. Простые слова, работающие с данными в стеке, такие как «+» и «SWAP», требуют 2 или 3 такта каждая. Сложным нужно больше времени ( например, «Q+» - 64-битное сложение, требует 18 тактов ), но это всё равно много быстрее, чем сравнимый код на языке высокого уровня. При необходимости могут быть написаны микрокодовые циклы, которые для повторяющихся операций, вроде перемещения блока данных, могут длиться тысячи тактов.
Как уже говорилось ранее, каждая инструкция соотносится с последовательностью микроинструкций, хранящихся в странице микропрограммной памяти, номер которой, в свою очередь, равен 8-битному коду операции. На рис. 4.3 показан формат микроинструкции. Микрокод строится по «горизонтальной» схеме. Это означает, что существует только один формат микрокода, разделённый на отдельные поля, управляющие различными частями машины.
Рис. 4.3 Формат микроинструкций CPU/16
Простота стековой архитектуры в целом и аппаратной реализации CPU/16 в частности позволили обойтись 32-разрядными микроинструкциями. Сравните их с 48 и более битами у секционных процессоров AMD 2900 с «горизонтальной» схемой кодирования. Подобная простота делает микропрограммирование ничуть на сложнее программирования на ассемблере для обычных машин.
Возьмём в качестве примера описание операции сложения для «Классической Стековой Машины» на псевдокоде:
TOS ← TOS + POP( DS )
Та же операция на микрокоде для CPU/16 будет выглядеть как:
SOURCE=DS     ALU=A+B     DEST=DHI     INC[DP]
Где микрооперация «SOURCE=DS» выставляет верхний элемент аппаратного стека данных на шину данных, «ALU=A+B» предписывает арифметическому устройству сложить вход «A» ( шину данных ) и вход «B» ( верхний элемент стека, находящийся в буфере DHI ), а «DEST=DHI» сохраняет результат в регистре DHI . Одновременно «INC[DP]» увеличивает указатель стека данных на единицу, удаляя из стека только что считанное значение.
4.2.4 Архитектурные особенности
CPU/16 очень похож на «Классическую Стековую Машину». Возможно, потому что оба проекта созданы автором этих строк и основной задачей обоих проектов была простота конструкции.
Наиболее заметным улучшением CPU/16 по сравнению с «Классической Стековой Машиной» стала замена регистра адреса памяти ( MAR ) на счётчик команд ( PC ). Это позволило выбирать следующую инструкцию, не трогая шину данных, т.е. совмещая выборку с вычислениями в стеке. Минусом такого подхода является необходимость перезаписи счётчика программы новым значением во время исполнения операций «@» и «!», с последующим восстановлением прежнего значения из теневого счётчика программы ( PCS ). Очевидно, что PC и регистр адреса MAR ( или DHI ) могут мультиплексироваться на шине адреса оперативной памяти, но это усложнит конструкцию и добавит компонентов.
==56
Табл. 4.1(a) Система команд CPU/16 -- примитивы FORTH ( см. Приложение _B , табл. B.1 )
! | 2* | AND | DUP | OVER |
+ | 2/ | BRANCH | I | R> |
+! | < | D! | I' | R@ |
- | PICK | D+ | J | ROT |
0 | ROLL | D@ | LEAVE | S->D |
0< | = | DDROP | LIT | SWAP |
0= | >R | DDUP | NEGATE | U* |
0BRANCH | ?DUP | DNEGATE | NOP | U/MOD |
1+ | @ | DROP | NOT | XOR |
1- | ABS | DSWAP | OR |
Табл. 4.1(b). Система команд CPU/16 -- Составные слова FORTH
@ + | OVER + | DUP @ SWAP 1+ выбрать из памяти и увеличить адрес |
@ - | OVER - | DUP ROT ROT ! 1- сохранить в памяти и уменьшить адрес |
DROP ; | R> DROP | @ @ косвенное чтение |
DROP DUP | R> SWAP >R | @ ! косвенная запись |
I + | SWAP - | DUP @ @ 1 ROT +! косвенное чтение и постинкремент адреса для организации программных стеков |
I + @ | SWAP DROP | -1 OVER +! @ ! предекремент адреса и косвенная запись для организации программных стеков |
==57
Табл. 4.1(c) Система команд CPU/16 -- Специальные слова
Следующие слова FORTH реализованы в микрокоде с использованием циклов или последовательностей микроопераций:
Табл. 4.1(d) Система команд CPU/16 -- Слова, поддерживающие высокоуровневые операции
SP@ | считывает содержимое указателя стека данных | |
SP! | инициализирует указатель стека данных | |
RP@ | считывает содержимое указателя стека возврата | |
RP! | инициализирует указатель стека возврата | |
MATCH | примитив сравнения строк | |
ABORT" | проверяет и информирует об ошибке | |
+LOOP | цикл увеличения переменной | |
/LOOP | цикл беззнакового увеличения переменной | |
CMOVE | перемещение строки | |
< CMOVE | перемещение строки в обратном порядке | |
DO | инициализация цикла | |
ENCLOSE | примитив для разбора текста | |
LOOP | цикл увеличения на 1 | |
FILL | инициализирует блок памяти | |
TOGGLE | изменяет отдельные биты |
==58
Табл. 4.1(e) Система команд CPU/16 -- Расширенные математические операции и действия над числами с плавающей запятой
Примечание:
- CIN
- вход переноса,
- COUT
- выход переноса
CPU/16 хранит микрокод в оперативной памяти, что позволяет пользователю изменять и добавлять интересующие инструкции. Приведённый список просто отражает стандартную комплектацию программного обеспечения.
==59
Основной целью добавления в проект регистра DLO была возможность сдвига 32-разрядных чисел при умножении и делении. Но наличие регистра промежуточного хранения заметно увеличивает производительность, так как становятся доступны одновременно уже четыре промежуточных результата: DHI , DLO , стек данных и временное значение, положенное в стек возврата. Например, DLO используется для временного хранения в операции «SWAP», что идеологически корректнее, чем использование для этих целей стека возврата.
Важной особенностью конструкции CPU/16 является возможность прямого контроля над всеми ресурсами процессора со стороны управляющей машины. Это возможно, потому что интерфейсный модуль поддерживает загрузку регистра микроинструкций и имеет опцию пошагового исполнения. Любая желаемая микроинструкция может быть выполнена с предварительной загрузкой нужных значений в другие регистры. После исполнения программного шага можно прочитать полученные значения и проверить результат. Столь непосредственный способ построения микрокода позволяет избавиться при разработке от дорогостоящего вспомогательного оборудования и очень упрощает написание диагностических программ.
Обработка прерываний в CPU/16 не предусмотрена.
4.2.5 Реализация и область применения
CPU/16 собран на микросхемах классической, кое-кто может даже сказать «устаревшей», серии 74LS00 и относительно медленной ( 150 ns ) оперативной памяти стека и программ. Цели разработки в порядке уменьшения приоритета: простота, минимальная стоимость разработки и построения, компактность, универсальность и скорость. Длительность такта CPU/16 - 280ns. Среднее время исполнения инструкции - три такта.
Микросхемы малой степени интеграции были выбраны из-за низкой стоимости и невысоких начальных затрат на организацию рабочего места по сравнению с однокристальным заказным вариантом. Проект на дискретных микросхемах гораздо проще и дешевле исправлять и изменять, что соответствует основной цели исследовательского проекта. Ещё одним следствием является заметно меньшая, чем у однокристального процессора, производительность. Это, впрочем, не помешало CPU/16 иметь при работе с некоторыми прикладными программами быстродействие, сравнимое с младшими моделями NC4016 фирмы Novix ( абсолютного лидера среди стековых машин ).
Для увеличения гибкости и сокращения разрядности микроинструкции в CPU/16 используются отдельные микросхемы АЛУ ( 74LS181 ) вместо секционных компонентов. Основная область применения - стековые вычисления общего вида в качестве сопроцессора для персональных компьютеров семейства IBM PC. Основной язык программирования - FORTH, но возможность переопределения микроинструкций позволяет использовать большинство других языков.
Дополнительной привлекательной сферой применения является использование в качестве учебного пособия на курсах компьютерной архитектуры. Машина собрана на микросхемах TTL логики с использованием менее чем 100 корпусов, включая память, и студенты без труда разберутся в её конструкции. [* Это я выделил. Эх! Где те студенты!? ] . Кроме того, из-за использования дискретных компонентов все сигналы системы становятся доступны, позволяя слушателям изучать взаимодействие аппаратуры, программы и микрокода.
==60
==61
Сведения для этой главы взяты из технического руководства для CPU/16 ( Koopman 1986 ). Дополнительные сведения о процессоре можно найти в Haydon & Koopman ( 1986 ) и Koopman & Haydon ( 1986 ). Кроме того, в Koopman ( 1987b ) описана архитектура WISC, которая очень похожа на архитектуру CPU/16.
==61