CPP-модель процессора 1801ВМ1 перестаёт реагировать на тактовую частоту, если хотя бы один раз деактивировать сигнал RPLY между eval_p и eval_n, а как реагируют в такой ситуации родная модель на Verilog и оригинальный процессор ?
Вид для печати
CPP-модель процессора 1801ВМ1 перестаёт реагировать на тактовую частоту, если хотя бы один раз деактивировать сигнал RPLY между eval_p и eval_n, а как реагируют в такой ситуации родная модель на Verilog и оригинальный процессор ?
"Родную" модель Async (которая на латчах, асинхронная) я проверил:
- активация RPLY по фронту и по срезу CLK
- активация RPLY при высоком уровне CLK
- активация RPLY при низком уровне CLK
- деактивация RPLY по фронту и по срезу CLK
- деактивация RPLY при высоком уровне CLK
http://s020.radikal.ru/i709/1510/ed/abc69d51cd2ct.jpg
- деактивация RPLY при низком уровне CLK
http://s014.radikal.ru/i329/1510/cd/26ce7cb4666ct.jpg
Во всех случаях заводской тест 401 успешно проходится.
Для моделей Qsync/Wsync проверка RPLY не имеет смысла (хотя Qsync тоже немного погонял, все нормально работает) - в Qsync RPLY фиксируется по перепадам CLK (ответ и освобождение шины), в Wsync просто банально нет самого RPLY.
Реальные схемы на ВМ1 обычно используют синхронизацию RPLY по какому-либо из фронтов (стоит триггер), потому что в ВМ1 есть ошибка. На модели эту ошибку воспроизвести не удалось, предполагаю что она имеет физическую природу - или метастабильность или разброс параметров конкретных транзисторов.
---------- Post added at 22:12 ---------- Previous post was at 21:47 ----------
Немножко размышлений про возможную причину неработоспособности реального ВМ1 при несинхронизированном RPLY.
Фрагмент схемы:
http://s019.radikal.ru/i615/1510/ab/3875fd922dd8t.jpg
RPLY_IN - это входной сигнал RPLY c внешнего вывода микросхемы. ~CLK - тактовый сигнал (с вывода микросхемы через буфер). Представим что на RPLY_IN и ~CLK на транзисторах T15949 и T15977 изменения сигналов происходят одновременно. В итоге на затворе T15981 может запомнится некоторое промежуточное значение (RPLY_IN переходит из одного значения в другое) - НЕ соответствующее строго какому-либо логическому уровню. На выходе Т15981 тоже может быть некоторое значение. Несмотря на то, что это значение "некоторое", дальнейшая схема все равно трактует его определенным образом (потому что есть усиление) - причем каждый транзистор может "трактовать" по-разному, в зависимости от порогового напряжения. Но даже, допустим, мы ближе к логическому нулю, и все работает одинаково. На затворе Т15981 происходит утечка (в неизвестную сторону - повышения или понижения заряда - зависит от конкретного экземпляра), и с ненормированного уровня она может произойти достаточно быстро, а не за гарантированые производителем 5мкс (полупериод от паспортных нижних 100 кГц), в итоге значение на выходе T15981 может изменится при низком ~CLK, на что схема логически не рассчитана - это состояние запоминания. Более того, из-за перекрестных помех там даже может возникнуть генерация, а не просто изменение значения.
Да, современные схемы банально имеют другую схемотехнику, уже в ВМ2 нет таких "триггеров" на затворах. В еще более современных - вся логика cинхронная, там вообще латчей может не быть - только флип-флопы. Ну и везде быстрый КМОП, тау метастабильности уменьшается на порядки, в новых ПЛИСах Альтера даже не особо педалирует эту тему.
А утечка - можно предположить что связана с химической чистотой используемых материалов (примеси), культурой производства (чистотой реакторов) и дефектами решетки - технологии выращивания бездефектной подложки это сегодня вообще жутко тайное ноу-хау. Не, в основе старый добрый метод Чохральского, но там много тонкостей.
Во всех версиях CPP-модели имеется ошибка. Публичный вызов публичного метода void SetCpuType( CPU_TYPE nCPUType ) невозможен из-за того, что тип CPU_TYPE является приватным.
Из-за этого ( например ) вызов: core.SetCpuType( nC_MicrocodeStepping ? C1801VM1::CPU_TYPE::CPU_VM1G : C1801VM1::CPU_TYPE::CPU_VM1A );
- компилируется с ошибкой.
...
Испытания CPP-модели процессора 1801ВМ1Г дали любопытный результат - при установленном бите T команда WAIT не реагирует на сигнал ACLO.
У обычного 1801ВМ1 такой особенности нет.
Такова матрица шифратора прерываний у ВМ1Г, установленный psw[4] (бит Т) вообще запрещает прерывание по ACLO, независимо от состояния ожидания. Поскольку прерывание по Т-биту более приоритетно чем по ACLO, то особенность вылазит только по команде WAIT. Я проверил фотографию и кристалл в микроскоп - в матрице есть только единственный транзистор на линии ACLO, то есть это не внесенная ошибка модели, но надо будет проверить на реальном процессоре. Для ВМ1А в матрице шифратора есть отдельная строчка, отвечающая за прерывание по ACLO в состоянии ожидания при установленном T:
Поэтому у ВМ1А такой особенности поведения быть не должно.Код:assign p[13] = plir & ~psw[10] & psw[4] & ~qbto & aclo & ~uerr & wcpu;
Вообще странно, в матрице шифратора остались неиспользуемые линии произведений, прерывание от таймера вполне можно было добавить без изменений поведения других прерываний - ресурсов достаточно.
Напомнило про ВЕ1 (если это в тему конечно).
http://s017.radikal.ru/i401/1511/97/f293544bc4bb.jpg
...
CPP-модель процессора 1801ВМ1Г показывает, что реализация в ВМ1 команды MUL имеет интересную особенность - признак нулевого значения устанавливается без учёта 15-го бита результата ( и для 16-разрядного, и для 32-разрядного результата ). Например, если умножить 128 на 256, то результат получится ненулевой, но бит Z в PSW установится.
Для проверки можно выполнить такой код:
В результате по нулевому адресу запишется значение PSW с установленным битом Z.Код:Mov #128., R0
Mul #256., R0
MFPS (R0)
Материалы ревизии А по процессору КМ1801ВМ2, маска версии "Торчок-4", различные форматы:
Транзисторная схема pdf (7 МБ)
Транзисторная схема sch (18 МБ)
Топология lay6 (12 МБ)
Топология pcb (9 МБ)
Топология tif (14 МБ)
В картинке tif сделано две страницы - начальный вариант векторизации и конечный, можно увидеть сколько ошибок было по ходу рисования схемы исправлено (сотни полторы-две).
Всего 18431 полезный транзистор, есть еще неподключенный к питанию тестовый блок примерно на сотню тразисторов, там реализован мощный драйвер, несколько защелок и площадки для подключения зондов.
Отличия от заводской схемы в ТО очень незначительные, кое-где добавлены-убраны буфера, изменены входы матрицы прерываний, также в наличии имеется неубранный мусор в виде никуда не ведущих дорожек. Вообще скан схемы не очень качественный, попадались места где невозможно было достоверно прочитать название сигналов или определить наличие/отсутствие соединения на месте пересечения линий. В электронном виде навигация, конечно, намного быстрее, хотя в по-вентильном виде схема менее читабельная. Также получено содержимое всех матриц (это примерно треть всех транзисторов), которых нет в схеме - предварительного и основного декодеров, шифратора приортетов прерываний и блока образования условий ветвления.