Процессор - это не устройство в воздухе, а устройство для ускорения каких-то определённых вычислений.
никакой процессор он никогда не сделает
никакие трудности его не остановят
Автор всерьёз борется с Матрицей
Берёте ПЛИС, реализуете на ней ваш процессор и сравниваете с другими софт-процессорами с разными архитектурами.
Это будет иметь последствия для реализации многозадачности (переключение с задачи на задачу должно будет выгружать весь контекст одной и загружать весь контекст другой задачи), а так же для функций типа setjmp()/longjmp() и getcontext()/setcontext().
Это будет иметь последствия для реализации функций раскрутки стека, на основе которых обычно сделаны механизмы обработки исключений в ЯВУ.
Писать своё начиная с самого низа -- это колоссальный объём страданий, а нежелание страдать по полной программе приведёт к тому, что ваш процессор станет нишевым, а значит бенефиты, которые могли бы принести его странности просто не реализуются.
dm1q:/ $ mount
/dev/block/dm-7 on / type erofs (ro,seclabel,relatime,user_xattr,acl,cache_strategy=readaround)
На форумах часто утверждается что нужен еще ряд расширений. Но что-то то мне подсказывает, что соберется если умножение и деление реализовать программно или аппратно как в RV32IM. Буква M в расширении указывает на математику. Вероятно, потребуется реализация Syscall. С математикой, вроде бы понятно. У меня под рукой Cyclone IV EP4CE6 и GoWin GW1NR-9. Во второй, в наличии есть блоки ALU с умножением до 36x36. Т.е. можно использовать аппаратное умножение.
К сожалению, на данный момент я не работаю, попал в определенный момент времени под прессинг. А так, работал в АО "Концерн "Созвездие", Antilatency, Auriga (Intel), Renault-АвтоВАЗ.
Железок у меня много, т.к. много покупал в свое время для себя, кое что делал на заказ. Да и время есть.
Университетский курс по цифровым устройствам еще помню. Так что, обращая внимание на архитектуру FPGA, приблизительно понимаю как писать код. Да навыков, может и нет, но что такое FSM, и почему в FPGA все должно быть синхронным, понимаю. Как оптимизировать отдельные модули с учетом ячеек LUT, тоже понимаю. Просто осознаю, что это всего-лишь однбитная память с таблицами истинности и N-адресными входами, по выходу которых опционально стоит D-триггер. Т.е. я понимаю что двубитный сумматор на такой штуке сделать можно, но двубитный сумматор с переносом (по входу) уже задействует соседнюю LUT. Т.е. 2bit+2bit = 1LUT2 + 3LUT4 для параллельных вычислений за минимальное время распространения. Я так же понимаю что есть время распространения clock-а, и разобрался с временными ограничениями.
Попробовал написать hello_world в виде UART-а, используя сдвиговый регистр, и используя state-машину и мультиплексор. Попробовал прототипировать в iverilog работы с контекстным стеком. Продвигаюсь потихоньку. Процессор написать впринципе смогу.
Понимаю, что могу загрузить константы в BSRAM прямо сейчас, и заставить это выполнятся, используя выборку, декодирование и безусловные переходы или косвенные переходы организвать могу.
Пока это простой процессор, который может содержать адрес следующей команды в регистре или смещение в регистре. Но я уже понял что сделал неправильно. На данный момент думаю над тем как корректно реализвать fetch-decode. Из BSRAM, инструкции вообще можно было не выбирать, а декодировать прямо оттуда, особенно с учетом того что она инициализируется как ROM. Но как только появляются шины, требуется делать fetch. Выборка, это минус один такт. Кроме того, в общем случае нужно дать команду на выборку, и дождаться ее выполнения. На параллельной шине, просто выствить адрес. Если это AHB, то немного сложнее.
Вспоминается детство. Моей сестренке подарили детский кухонный набор. И на нем было написано: "Говорят что дело сложное, самому испечь пирожное. Но если чуточку помучиться, может даже торт получится". Другими словами, буду пробовать.
Спасибо.