vak: (Default)
Наконец-то нашёл время обработать и выложить отсканированные схемы ЭВМ микро-БЭСМ. Огромное спасибо Татьяне Сапожниковой за присланные материалы.
  • Лист №1, формат A1: A, B, C, D, E, F, G, H
  • Лист №2, формат A1: A, B
  • Лист №3, формат A1: A, B
  • Лист №4, формат A1: A, B
  • Лист №5, формат A1: A, B
  • Лист №6, формат A1: A
  • Лист №7, формат A1: A
  • Лист №8, формат A0: A, B, C, D, E, F
  • Лист №9, рулон формата 3*A0: A, B, C
Весь проект можно скачать целиком по ссылке: micro-besm/archive/master.zip (106 Мбайт).
vak: (Улыбка)
Тест прерываний микро-БЭСМ проходит. После исправления нескольких других ошибочек комплексный тест системы команд заметно продвинулся. Сейчас он падает на команде 15 XTA -2. Происходит прерывание: что-то не так с вычислением или проверкой отрицательного адреса в режиме БЭСМ-6.
vak: (Улыбка)
Так выглядит работа микро-БЭСМ на уровне микрокоманд. В данном случае выполняется шаг INT30 из теста intrtest.mak.src.

vak: (Улыбка)
Измерил скорость работы трёх разных Verilog-симуляторов на комплексном тесте системы команд микро-БЭСМ.

Synopsys VCS предсказуемо лидирует с большим отрывом. На втором месте Xilinx Vivado Simulator (бывший Cadence NCSIM). Altera Modelsim (заимствованный у Mentor Graphics) слегка отстаёт.

Сохранилась фотография из газеты "Дубна" от 13 июня 1990 года, где команда разработчиков демонстрирует работу ровно этого же теста отцам-основателям Мельникову и Томилину (автору аналогичного теста системы команд для БЭСМ-6).



На фотографии слева направо: В.М.Кадыков, И.Н.Силин, Т.Ф.Сапожникова, В.А.Мельников, А.П.Сапожников (1 ряд), И.А.Емелин, Ф.В.Левчановский, А.Н.Томилин (2 ряд, что выше).

Упомянутая статья на 4-5 страницах газеты: http://www.besm6.org/wiki/1990-dubna-retro86
 
vak: (Улыбка)
Процессор микро-БЭСМ успешно выполнил первые пару тысяч инструкций основного теста системы команд. Выглядит это так:
(32998)               Memory Fetch [00060] = 09:e3c0c1ffef3e0000
(33004) 80860 00060: e3c0c1ff vtm 0c1ff(14)
(33008)               Write M14[31] = 0000c1ff
(33010) 80860 00060: ef3e0000 clrr e0000(14)
(33030)               Write RR = 1307f000
(33030)               Write RR[31] = 1307f000
(33040)               Memory Fetch [00061] = 29:ef20000004800020
(33046) 80861 00061: ef200000 setr (14)
(33064)               Write RR = 0307fc00
(33064)               Write RR[31] = 0307fc00
(33064) 80861 00061: 04800020 uta 00020
(33072)               Write A = 0000000000000020
(33072)               Write RR = 0307fc04
(33080)               Memory Fetch [00062] = 29:0f101818e3c0c1ff
(33086) 80862 00062: 0f101818 wmod 01818
(33096) 80862 00062: e3c0c1ff vtm 0c1ff(14)
(33098)               Write MODGN = 01
(33100)               Write M14[1] = 0000c1ff
(33112)               Memory Fetch [00063] = 29:048000080f101819
(33118) 80863 00063: 04800008 uta 00008
(33126)               Write A = 0000000000000008
(33126) 80863 00063: 0f101819 wmod 01819
(33138)               Write PROCN = 08
Фрагмент соответствует строкам 446-453 теста.

Полный файл трассировки можно посмотреть здесь: https://gist.github.com/sergev/085fa70bb2d5e5a7d50e918c6d3168de
vak: (Улыбка)
Сижу в центре кремниевой долины и программирую на фортране для БЭСМ-6. На дворе 2016 год, а вот поди ж ты, возникла настоятельная потребность. Нужно извлечь с диска некий бинарный образ и преобразовать в текстовый HEX файл. Надо сказать, Фортран-ГДР отличный инструмент для подобных задач. Мониторная система Дубна, симулятор ОС Диспак, книжки Мазного и Салтыкова-Макаренко под рукой. Решение выглядит так: hexdump.b6

История вопроса следующая. Есть процессор микро-БЭСМ, и для него есть тест системы команд. Тест написан на языке ассемблера, а сам ассемблер имеется в исходных текстах для БЭСМ-6. К ассебмлеру также прилагается линкер. Всё это запускается под мониторной системой "Дубна" на симуляторе ОС Диспак. На самом деле написана эта кросс-система была под ОС Дубна, и пользуется некоторыми её особенностями, поэтому пришлось на скорую руку привинтить несколько дубненских экстракодов к симулятору Диспака. Но это всё мелочи. В конце концов ассемблер с линкером заработали и на диске получился двоичный образ теста, размером около 24 килобайт. Как его извлечь оттуда? Тем более, что хранится он под управлением некой "библиотеки виртуальной памяти", и формат хранения не описан. Но есть API, набор фортрановских вызовов. Не вопрос: пишем програмулину и получаем нужный результат. Теперь можно смело запускать тест на симуляторе Verilog.
vak: (Улыбка)
Текущее состояние проекта следующее.

(1) Реализованы все блоки кроме сигналов прерываний. Успешно проходят четыре основных теста первой группы (initest, sectest, octtest и memtest).

(2) При запуске процессор корректно завершает инициализацию, на 16497-й микрокоманде считывает из ОЗУ по адресу 0x00060 и пытается выполнить первую инструкцию. Пора готовить тесты команд.

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

(4) Тесты памяти уровня микрокоманд проверяют только первый мегабайт ОЗУ, адреса 00000-1ffff. Очевидно, в первом экземпляре МКБ-8601 имелось не 8Мб, а всего 1Мб памяти. Понятно, почему крейт на фотографии выглядит пустым: предпологалось со временем добавить туда еще семь плат памяти по 1 мегабайту.

(5) Тесты системы команд написаны на ассемблере MKB/ASS, который внешне напоминает Madlen, с несколько облегчённым синтаксисом. Сам ассемблер написан на Фортране-ГДР и Мадлене. Документация тоже имеется. Теперь предстоит раскрутить всю эту цепочку на симуляторе dispak.
vak: (Улыбка)
Процессор микро-БЭСМ уже проходит три больших теста: initest, sectest и octtest. Собственно процессор и механизм виртуальной памяти работают как надо. Осталось доделать два модуля: интерфейс к внешней памяти и контроллер прерываний.

Здесь можно посмотреть, как выглядит файл трассировки теста initest: https://gist.github.com/sergev/9629d7e92dc8e3829f7c2aee267b037b
vak: (Улыбка)
Набросал краткое описание архитектуры процессора микро-БЭСМ в режиме математика. Коды команд взяты непосредственно из таблицы микрокода, так что в них я уверен, а вот перечень команд надо будет сравнить с таблицей.
vak: (Улыбка)
В микро-БЭСМ в качестве программируемого таймера использовалась микросхема к580ви53. Ну не вопрос, подумал я, это ведь классический Intel 8253. Для него в интернете есть куча исходников на Верилоге, сейчас быстренько привинчу. Не тут-то было. Нашёл три разные реализации i8253 - все оказались кривоватые и не соответствующие реальному чипу. И неспроста: проблема оказалась глубже. Дело в том, что этот чип представляет собой классический пример асинхронного дизайна, забытого в наше время. В микросхеме отсутствует опорный синхросигнал.



Интерфейс к управляющему процессору состоит из сигналов адреса, данных, /CS, /RD, /WR. Здесь не участвуют сигналы CLK. Они влияют только на декремент счётчиков времени, но не на логику внешнго интерфейса. Хитрая задача абитража между осинхронными запросами от процессора и событиями от синхросигналов решается схемотехникой, что нетривиально. Современные средства Verilog-синтеза такое не могут. Приходится признать, что с развитием технологий разработки цифровых микросхем мы кое-что утеряли, а именно способность проектировать асинхронные схемы.

Чтобы сделать i8253 "понятным" для современных Verilog-синтезаторов, достаточно сделать его синхронным, то есть ввести глобальный высокоскоростной сигнал CLK со стороны процессора, и тактировать все остальные события по нему. Хотя это будет уже не совсем i8253, но для проектов типа микро-БЭСМ вполне годится.
vak: (Улыбка)
Обнаружилась косвенная информация о скорости работы микро-БЭСМ. В комментариях к тестам таймера реального времени есть строчка:
;СИГНАЛ CLOCK, ПО КОТОРОМУ ДЕЛАЕТСЯ ЗАПИСЬ, ПРИХОДИТ 1 РАЗ В 10 MKS = 20 МК
То есть синхросигнал микросхемы к580ви53 был 100кГц, что соответствовало 20 микрокомандам. Отсюда следует, что процессор микро-БЭСМ работал на частоте 2МГц. Для сравнения: штатная частота процессора БЭСМ-6 равнялась 10МГц. Хотя, по рассказам очевидцев, на большинстве ВЦ её занижали для устойчивости до 9МГц и меньше.

Из статьи А.П.Сапожникова: "Что же касается быстродействия, то оно было около 100000 команд/сек. У БЭСМ-6, если помните, было 900000. Так что, учитывая микропрограммный принцип управления, результат получился неплохой."

Выходит, что микро-БЭСМ на частоте 2МГц была в 9 раз медленнее, чем БЭСМ-6 на частоте 9МГц. Если удастся на FPGA разогнать хотя бы до 40МГц, получим машину в два раза быстрее оригинала, да еще и 64-битную.
vak: (Улыбка)
Измерил скорость трёх коммерческих симуляторов Verilog на тесте микро-БЭСМ.

Mentor Modelsim: 2428 микроинструкций в секунду.
Cadence NCsim: 2362 микроинструкций в секунду.
Synopsys VCS: 7759 микроинструкций в секунду.

Первые два - на самом деле бесплатные версии от Altera и Xilinx. Но синопсис по любому в разы быстрее получается.
vak: (Улыбка)
Блок АЛУ практически готов. Процессор микро-БЭСМ успешно проходит 68% первого из микропрограммных тестов (initest). Это порядка 30 тысяч микрокоманд. Таких тестов будет всего 18 штук, так что еще много интересного впереди. :) Потом пойдут тесты собственно системы команд БЭСМ-6.
vak: (Улыбка)
Микро-БЭСМ подаёт первые признаки жизни. Микрокод стартует и доходит до выборки первой инструкции из основной памяти. Интерфейс к памяти пока не реализован, поэтому микрокод циклится на ожидании готовности арбитра.

Что-то с АЛУ еще не так, поэтому появляются странные неопределённые значения (xxxx) в регистрах.
Trace file for input.hex

(0) *** Reset
(10) *** Clear reset
(20) 000: jz       map=PE alud=Q rb=A stopc=YTOM pshf=-64 mnsa=U bra=RG0 ara=RG0
(20)               Write control.SP = 0
(30) 000: cjpp 64a map=PE ffcnt=CLREI
(40) 64a: cont 0ce ALU alud=B alus=DZ H rb=MANT dsrc=PROM ydst=PROCN
(40)               Read Const[206] = 001fffffffffffff
(40)               Write alu.R9 = 00xxxxxxxxxxxxxx
(40)               Write alu.MSR = xxzx
(50) 64b: cont 0cf ALU alud=B alus=DZ H rb=EXPN dsrc=PROM WRB ydev=ECBTAG
(50)               Read Const[207] = ffe0000000000000
(50)               Write alu.R8 = ffe000000000000x
(60) 64c: cont 015 alud=B func=SUBR alus=DZ H rb=WR2 ci=CI1 dsrc=PROM ydev=PHYSAD
(60)               Read Const[21] = 0000000000000020
(60)               Write alu.R14 = ffffffffffffffxx
(70) 64d: push 01f map=PE ALU alud=B func=AND alus=DZ H rb=WR1 ydev=MPMEM WRY IOMP mpadr=FCP
(70)               Write alu.R15 = 0000000000000000
(70)               Write control.SP = 1
(70)               Write control.Stack1 = 64e
Дальше... )
vak: (Улыбка)
Так выглядит микрокод МКБ-8601 в виде таблицы. Здесь примерно 2% от общего объёма кода. Это самый начальный старт процессора, процедура самоинициализации.
JINIC:
--------sqi--addr-----map-alu-alud-func--alus-h-rb---ra---ci--shmux--stopc-mod-pshf-mnsa-modnm-dsrc---ydst---shf---arbi--rld-letc-sci-ici-icc-ise-cem-cen-csm-wem-ecb-wrb-bra-eca-wra-ara-ydev---wry-ddev---wrd-iomp-ffcnt--cond---mps
        CJPP INIC     PE  -   -    -     -    - -    -    -   -      -     -   -    -    -     -      -      -     -     -   -    -   -   -   -   -   -   -   -   -   -   -   -   -   -   -      -   -      -   -    CLREI  -      -
INIC:
        CONT 206      -   ALU B    -     DZ   H MANT -    -   -      -     -   -    -    -     PROM   PROCN  -     -     -   -    -   -   -   -   -   -   -   -   -   -   -   -   -   -   -      -   -      -   -    -      -      -
        CONT 207      -   ALU B    -     DZ   H EXPN -    -   -      -     -   -    -    -     PROM   -      -     -     -   -    -   -   -   -   -   -   -   -   -   WRB -   -   -   -   ECBTAG -   -      -   -    -      -      -
        CONT 21       -   -   B    SUBR  DZ   H WR2  -    CI1 -      -     -   -    -    -     PROM   -      -     -     -   -    -   -   -   -   -   -   -   -   -   -   -   -   -   -   PHYSAD -   -      -   -    -      -      -
        PUSH 31       PE  ALU B    AND   DZ   H WR1  -    -   -      -     -   -    -    -     -      -      -     -     -   -    -   -   -   -   -   -   -   -   -   -   -   -   -   -   MPMEM  WRY -      -   IOMP FCP    -      -
        CONT 21       -   ALU B    -     DA   H WR2  WR2  -   -      -     -   -    -    -     PROM   MODGN  -     -     -   -    -   -   -   -   -   -   -   -   -   -   -   -   -   -   -      -   -      -   -    -      -      -
        RFCT -        -   ALU -    -     ZA   - -    WR1  -   -      -     -   63   MP   M0    -      -      -     -     -   -    -   -   -   -   -   -   CSM WEM -   -   -   -   -   -   -      -   -      -   -    -      -      -
        CONT 120      -   -   B    -     DZ   H WR1  -    -   -      -     -   -    -    -     PROM   -      -     -     -   -    -   -   -   -   -   -   -   -   -   -   -   -   -   -   -      -   -      -   -    -      -      -
Еще... )
vak: (Улыбка)
Отсканировал описание микросхемы К1802ВВ1, вдруг пригодится кому: https://github.com/besm6/micro-besm/raw/master/doc/k1802bb1.pdf

Это довольно уникальный чип, не имевший западного аналога. Внутри находится четыре 4-битовый регистра, к которым можно обращаться с четырёх независимых двунаправленных портов. В процессоре микро-БЭСМ микросхема К1802ВВ1 (16 штук) применяется для организации взаимодействия между внутренними 64-битными шинами данных.
vak: (Улыбка)
Сделал ассемблер для трансляции микрокода ЭВМ МКБ-8601.
Так выглядит результат: https://github.com/besm6/micro-besm/blob/master/microcode/microcode.v
vak: (Улыбка)
════════100═разрядов═════════════Общая═шина═══════════════════
   ▲                        ▲
 х │8                     х │64
   ▼                        ▼
┌──────┐    ┌───────────────────────────────┐    ┌────────┐
│ БОИ  │    │             Б О И             │    │        │
│ тег: │    │  RG0  │  RG1  │  RG2  │  RG3  │    │  ППЗУ  │
│1-ком.│    │  физ. │команда│операнд│резуль-│    │  кон-  │
│2-oпep│    │ адрес │  л,п  │       │  тат  │    │ стант  │
│3-рез.│    └───────────────────────────────┘    └───┬────┘
└┬───В─┘      ▲ С  ▲ В        ▲ А                    │
С│▲  ▲  ┌───┐ │64  │64        │64                    │64
 ││  │  │кэш├─┤    │          ▼                      ▼
 ▼▼  │  └───┘ ▼  ══════Шина═D═══════════════64═разряда════════
прер.│ ┌───────┐ ▲ │      │        ▲     ▲     ▲     ▲     ▲
 по  │ │ станд.│ │ │      │64      │32   │64   │64   │7    │7
тегу │ │команд │ │ │      ▼        │     │     │     │     │
     │ └┬─┬──┬─┘ │ │ ┌─────────┐ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐
     │  │ │  │ 32│ │ │   МПС   │ │OЗY│ │сд-│ │   │ │   │ │ n │
     │  │4│  │   │ │ │ РЗУ:АЛУ │ │moд│ │виг│ │YMH│ │ПЛE│ │ед.│
     │  ▼ │  │20 │ │ ├─────┬┬┬┬┘ └───┘ └───┘ └───┘ └───┘ └───┘
     │  ИP│  ▼   │ │ │     ││││    ▲   ▲   ▲   ▲     ▲     ▲
     │    │  ┌───┤ │ │     ▼▼▼▼    │   │   │   │     │     │
     │    │  │АК │ │ │  D ┌────┐   │   │  ┌┴─┐ │     │     │
     │8   │8 └───┘ │ │  ◄─┤CYCC│   │32 │  │ПC│ │64   │64   │32
     │    │        │ │64  └────┘   │   │  └──┘ │     │     │
     │    │        │ │       ▲     │   │   ▲   │     │     │
     ▼    │        ▼ ▼       │4    │   │64 │7  │     │     │
╤═╤════════════Шина═Y═══╤═══╤╧═══╤═╧═64═разряда╧═════╧═════╧══
│ │   ▲   │        ▲    │   │    │                        ▲
│ │32 │   └────────│────│───│──┐ │ ┌───┐                  │
│ │   │            │    ▼8  │5 │ └►│ ШФ├──┬────┐          ▼
│ │ ┌─┴─┐   ┌───┐  │  ┌───┐ │  │   ├───┤  │    ▼12    ┌──────┐
│ │ │РГ.│   │   │  │  │PHП│ │  └──►│ПHA│  │  ┌────┐   │  ОЗУ │
│ └►│иcп├──►│OЗY│◄─┘  └─┬─┘ ▼      │KOП├──┤  │CYAM│   │oбмена│
│   │aдp│   │пр.│       │ ┌───┐    ├───┤  │  └────┘   └──────┘
│   └─┬─┘   └───┘       ▼ │PHГ│    │ПHA│  │    │◄───┐     ▲
│     │  ┌──────────┐   D └─┬─┘    │i/o├──┤    ▼    │     │
│     └─►│ост.по aдp├──►    │      ├───┤  │  ┌────┐ │     ▼
│10      └──────────┘halt  6▼  ┌──►│ПHA│  │  │ППЗY│ │ ┌──────┐
│    ┌►D                    D  vect│int├──┤  │ OЗY│ │ │ блок │
│    │      ┌──────┐               ├───┤  │  │ МП │ ├─┤ связи│
│    │      │ БОБР │  2            │ПHA│  │  └─┬──┘ │ │ с ПП │
│ ┌──┴──┐   │ БИЗМ │◄───►D         │гр.├──┘    │◄───┘ └───┬──┘
└►│ РФС ├──►│──────│  1            └───┘       ▼          │
  └──┬──┘   │ БМСП │◄───►D                   ┌────┐       ▼
     │      └──────┘                         │ КР │      к ПП
     │      ┌─────┐                          ├────┤
     │      │ ОЗУ │◄───Y                     │....│
     └─────►│пpиop├───►D                     ▼....▼
            │ стр.│                        управление
            └─────┘

   ┌────┐    упр┌─────┐     Y ┌─────┐     КОП ┌──────┐ упр-е
──►│блoк│    ──►│такт.│    ──►│ тай-│     арб.│      │  БОИ,
...│пре-│       │гене-├─►1    │ мер,├─►D  ───►│apбитр├──────►
──►│рыв.├───►   │paтop├─►2    │часы ├──►      │      │магист-
   └────┘vест   └─────┘...    └─────┘прер.    └──────┘ ралью
Подробное описание находится здесь.