О, Микро-7
Вид для печати
О, Микро-7
Матрица приоритетного шифратора прерываний в ВМ1Г тоже очень заметно переработана, работу этого блока придется изучать заново по полной. И как бы там не начало работать прерывание от таймера - линия запроса от него уже явно обрабатывается в матрице. Насколько я понимаю, таймер в ВМ1Г заявлен официально, так что вполне может быть.
Получена микропрограмма 1801ВМ1Г. Модель ВМ1Г прошла тесты 791401 и 791404 (без проверки исключений по недопустимым командам).
Команда MUL работает, микропрограммно и о-о-о-чень долго - примерно ~270 тактов. При частоте 5МГц - почти 60 мкс, печалька и привет прерываниям. Сам алгорим умножения точно пока не разобрал - он там классический на сдвигах, но какой-то инваринт. Счетчика циклов нет, поэтому есть вероятность что время исполнения умножения зависит от умножаемых данных (например, умножаем пока не досдвигаем аргумент до нуля). Эмуляторщикам ахтунг :)
Модель, версия 1.2k
Схема 1801ВМ1А
Схема 1801ВМ1Г
Итого 1801ВМ1Г содержит 16646 транзисторов.
Прерывание от таймера точно поддерживается, пока не тестировал, приоритет - ниже чем у IRQ1/HALT, и выше чем IRQ2/IRQ3/VIRQ.
Самое главное .
Особенно - вектор и обстоятельства прерывания.
* * *
Припоминаю, что ( предположительно ! ) кристаллы ВМ1Г могли поставлять вместо ВМ1А без уведомления потребителя - году так в 1991 выпустили извещение на Э.
И еще там нажимали на частотную градацию - т.к. ВМ1Г вовсе не 100% шли на 6.0-6.5 мгц при 25 градусах ( цеховые ворота, быт и военка ).
Vslav, я тут между попытками освоения multisima скармливал verilator'у модель, чтобы посмотреть, что он выдаст, и верилатор предлагал в vm1_plm.v в функции cmp вместо casex использовать casez, якобы это более эффективно. Как я понимаю, такая замена на уровне логического описания, а так же программирования абсолютно идентична? Ну т.е. если соответственно и в аргументах 'x' заменить на '?'.
Ещё в Qsync\vm1_qbus.v в строке 1567
16 разрядов сравнивается с 8ю разрядами. Верилатор говорит по этому поводу warning. В принципе такая конструкция полностью работоспособна и выдаёт ожидаемый результат, но наверное изначально планировалось сравнивать только старший байт? Вот так:Код:assign flag[2] = (~plr[18] | (alu[15:0] == 8'o000)) & (alu[7:0] == 8'o000); // Z
Или сперва слово сравнивать с 0 и для надёжности ещё и его мл.байт с нулём? Вот так:Код:assign flag[2] = (~plr[18] | (alu[15:8] == 8'o000)) & (alu[7:0] == 8'o000); // Z
И ещё, есть множество alwaysов с одинаковым условием, состоящих всего из одного назначения каждый. Если их объединить в один блок always, это будет просто эквивалентная запись или есть какие-то принципиальные предпосылки так не делать?Код:assign flag[2] = (~plr[18] | (alu[15:0] == 16'o000)) & (alu[7:0] == 8'o000); // Z
---------- Post added at 13:35 ---------- Previous post was at 13:12 ----------
Бегло сравнил модели Qsync и Wsync, на первый взгляд разница только в том, что в Wsync исчезли ноги, отвечающие за ПДП: DMR, SACK, DMGI, DMGO и соответствующая логика, всё остальное - не принципиально. Они действительно настолько не нужны?
В нашем случае абсолютно без разницы. casex более широкий случай, рассматривает 'x' и 'z' как не влияющие на результат сравнения, а casez - только 'z'. У меня там вообще были проблемы чтобы получить максимально совместимый синтезируемый (а не только для модели) код для сравнения переменных с 'x', поэтому лучше ничего не трогать.
В приложении - кусочек кода на Си, который я использую для анализа микрокода. Он совершенно "наколенный", но там есть функция вычисления матрицы plm (пока только для ВМ1А), надеюсь, поможет с реализацией.
Да, это опечатка. В данном случае к ошибке не приводит - 8 разрядов автоматически расширяются до 16 и получается эквивалент alu[15:0] == 16'o000000. Лучше исправить на alu[15:8] == 8'o000, хотя для получаемого после оптимизации результата разницы никакой не будет.
Если все назначения неблокирующие - со значком '<=', то разницы никакой не будет, можно объединить. В принципе, я старался чтобы все присваивания были или непрерывными (через assign) или неблокирующие (через <=). Блокирующие (через =) не планировались и могли проскочить только случайно, как опечатка. В блоке always они часто будут работать точно как неблокирующие (зависит от уравнений в блоке).
Угу, Wsync - это последняя актуальная модель, в итоге будет использовать шину Wishbone, там вопрос арбитража доступа к шине решается внешним компонентом, поэтому все эти подробности из этой модели потихоньку удаляются. Wsync - это потактовая копия, предназначенная для синтеза в реальные проекты на FPGA.
В Qsync будет вносится минимум - микропрограмма для ВМ1Г, переход на общую систему конфигурации проекта, и исправление опечаток. Хотя Qsync тоже синтезируемая, но ее реальное использование в FPGA не предполагается, основное ее назначение - моделирование на промежуточном этапе разработки. Скажем так - это "приличная" модель, очень близкая к оригиналу и позволяющая комфортно моделировать.
Async - это еще более точная модель, максимально близкая, но из-за асинхронных особенностей есть некоторые проблемы с моделированием, а надежный синтез практически невозможен. Модифицироваться никак не будет (только грубые опечатки), оставлена в пакете как демка для поборников "расовой чистоты" :)
PS. Впишу-ка я этот текст в readme, а то народ в почту возмущается что Async кучу варнингов при синтезе дает :)
PPS. А приложение-то я и позабыл, исправляюсь :)
Нашел в закромах БК11 с экситоновским КР1801ВМ1Г - но вот есть сомнения в его 3 точках. Не будет ли возможным как-нибуть разузнать вектор от встроенного в процессор таймера ?
*
Кстати, сам экз. процессора - Г. конкретное, с Большой буквы. Т.к. его проверяли на запуск БК0010 - но вот отработкой тестов из ТМОС явно не озадачивались. Не сменил его в машинке исключительно из интереса к таймеру и его вектору.
http://storage4.static.itmages.ru/i/...bc3759fd9f.jpg
А разве три точки это ВМ1Г? Вот подробное исследование со сканами ТУ и изменениями, получается что ВМ1Г это две точки или четыре, но никак не три. Тем не менее, дописал модель в части прерываний (модуль таймера не имел выходного прерывания и его сброса по подтверждению) и запустил небольшой тестик - прерывается по 270 вектору, сохраняет PC/PSW в текущем стеке.
Действительно, сейчас попробовал на машинке команду 070027 000001 - трапанула по 10 вектору.
MUL R0, #1
*
И такой тоже трапует по 10-му вектору :
http://storage1.static.itmages.ru/i/...cf23405a35.jpg