Перед началом хотел бы уточнить один момент. CPU-0 я создавал в программе Logisim. CPU-1 я буду создавать в её расширенной версии Logisim Evolution. Она практически идентична оригинальной программе, но добавляет новый функционал, такой как поддержка 64-битных элементов и отрисовка изображений на экране.
Итак, в этой статье я опишу то, как я себе представляю CPU-1. Однако это не обязательно будет конечной версией архитектуры. Мой предыдущий процессор был простой аккумуляторной машиной, и сразу после него я перепрыгиваю на многоядерный суперскалярный процессор. Это довольно большой скачок, и, так как опыта у меня не много, я могу наделать много ошибок, которые буду находить и исправлять в процессе проектирования, так что конечная архитектура может отличаться от того, что я опишу здесь. Это лишь примерное представление того, как CPU-1 должен быть устроен.
Начнём с самого верхнего уровня и будем постепенно спускаться ниже.
Внешний уровень.
Процессору нужно каким-то образом общаться с внешним миром, и для этого ему нужны шины данных и адреса. И тут у нас есть два варианта конфигурации.
- Свои шины адреса и данных для каждого ядра. Это позволит ядрам параллельно обращаться по разным адресам, не мешая друг другу. Однако это увеличит сложность контроллера памяти, а также усложнит подключение внешних устройств, потому что каждое из них придётся подключать к каждой из шин.
- Общие шины адреса и данных для всех ядер. Это не позволит нескольким ядрам одновременно обращаться к внешним устройствам, но гораздо проще в реализации, а также упрощает процесс подключения внешних устройств.
Раз уж я взялся делать такой сложный процессор, то чего мелочиться? Каждому ядру будут выделены свои шины адреса и данных, чтобы они могли обращаться к внешним устройствам параллельно.
Теперь нужно определиться с прерываниями. Я думаю, делать отдельную шину прерываний для каждого ядра не стоит. Я хочу, чтобы прерывания динамически распределялись между ядрами, так что у процессора будет всего одна внешняя шина прерываний.
Уровень процессора.
Процессор будет иметь несколько ядер, но я пока не определился, сколько именно. Также на этом уровне будет расположен общий контроллер прерываний, который будет принимать прерывания с внешней шины и распределять их между ядрами. А ещё здесь будет верхний кеш, общий для всех ядер. Здесь же будет находится контроллер, отвечающий за обмен данными между ядрами.
Уровень ядра.
У каждого ядра будет свой блок управления и свой набор регистров. Так как я хочу, чтобы процессор был суперскалярным, у каждого ядра будет 2 АЛУ. А ещё у каждого будет свой FPU, потому что я хочу иметь поддержку операций с числами с плавающей запятой. У каждого ядра будет свой блок ввода/вывода, внутри которого будет находится контроллер памяти и нижний кеш, принадлежащие конкретно этому ядру.
У каждого ядра должны быть свои шины для передачи данных между блоками. Я думаю, что у каждого будет по 8 шин. Может быть, это многовато, но ядра суперскалярные, так что им нужно иметь возможность оперировать сразу несколькими потоками данных, чтобы выполнять несколько операций параллельно. К одним блокам шины будут подключены полностью, и данные между ними будут распределяться динамически, к другим же могут быть подключены не все шины. Например, к АЛУ и FPU можно подключить только 2 шины на вход и 2 шины на выход. Но я могу сделать и иначе, это всего лишь концепт, и в ходе проектирования он может измениться. Ниже приведу примерный вид ядра.
Допустим, в блоке управления будет 2 конвейера команд. Один из них может задействовать АЛУ 1 для сложения, подав на шины 1 и 2 слагаемые и получая сумму на шину 5. Второй конвейер параллельно с этим может использовать FPU для вычитания чисел с плавающей запятой, подав уменьшаемое и вычитаемое на шины 3 и 4 и получая разность на шину 7. В это время блок управления может использовать блок ввода/вывода для считывания из памяти следующих команд, задействуя шину 6 для адреса и получая команду на шину 8. То есть у нас получается выполнить две операции и произвести доступ к памяти, и всё это параллельно. По-моему, неплохо.
На этом пока всё, более детально каждый аспект процессора буду продумывать позже. Если у вас есть какие-то вопросы касательно как архитектуры CPU-1, так и в общем устройства и принципов работы процессоров, можете задавать их в комментариях, постараюсь ответить всё, что знаю.
Также очень приветствуются замечания, советы и указания на ошибки. Всё-таки, я хочу сделать хороший процессор, так что если вы заметили где-то ошибку в моей архитектуре, или знаете, как можно сделать лучше, или у вас есть идеи касательно того, что ещё можно добавить, опять же, можете написать об этом в комментариях.
А в следующей статье я расскажу о блоках умножения и деления, которые я спроектировал для своего процессора пару дней назад. Я думаю, это будет интересно как минимум тем, кто не знает, как они работают, но хочет узнать, потому что умножение и деление всё же сложнее сложения и вычитания. Схемы и принципы работы сумматоров можно легко найти в Интернете, а вот об умножителях и делителях информации поменьше.