The post has been translated automatically. Original language: Russian
When a modern processor is compared to Donald Knuth's MIX, it's easy to expect a direct relationship: similar instructions, identical registers, or a repetition of the structure of a machine word. In the case of Memora8, there is almost no such similarity, and this is done deliberately.
MIX was created as an educational computing machine. His task was to provide a sufficiently universal and understandable model on which algorithms can be considered independently of specific computers of his time. Knuth needed a complete architecture suitable for programming and analysis.
Memora8 solves a different problem. This is a real 32-bit processor that must be implemented in programmable logic, undergo synthesis, placement and tracing, work with memory and execute machine code in a real device.
Therefore, literally copying the MIX was not only not the goal, but it would quickly lead to unnecessary restrictions.
What can you borrow from the old architecture?
The processor architecture consists not only of specific instructions and register names. There are more general solutions behind them.: how to represent data, where to store intermediate results, how to calculate the address, how to make transitions, and what part of the work to give to the hardware.
It is at this level that MIX remains interesting.
For example, in MIX, an attempt to make the car compact enough, but at the same time complete, is clearly visible. There is memory, registers, arithmetic, comparison, transitions, I/O, and ways to work with parts of a machine word. All the elements are connected in a single model that can be fully understood.
For Memora8, the value of this approach lies not in repeating every mechanism, but in the question behind it: what is the minimum set of tools a processor really needs?
The answer for a modern car is already different.
Specialized registers turned out to be optional
In MIX, registers differ not only in numbers, but also in their purpose. A participates in the basic calculations, X complements it, six index registers help form addresses, and J stores the return address.
If Memora8 had literally followed MIX, a similar separation would have to be preserved in the hardware.
Instead, Memora8 uses 32 general-purpose registers. Almost all of them are the same in terms of processor. The role of a register is determined not by its physical type, but by how the program uses it.
The same problem is solved in a different way.
The return address still needs to be stored somewhere, but it doesn't require a separate register type. The index for the array is also needed, but it can be in a regular register. The intermediate result of an arithmetic operation does not have to pass through a dedicated accumulator.
Thus, the idea of MIX is preserved at the function level, but it changes at the implementation level.
The machine word fields didn't need to be moved either.
One of the characteristic features of MIX is the ability to access not only the entire machine word, but also a selected part of it. To do this, the instructions use a special modifier that specifies the word field.
This mechanism is very expressive. One command can work in different ways depending on the selected byte range.
There is no such mechanism in Memora8.
Here, all the main registers have a fixed width of 32 bits, and working with smaller pieces of data is solved by simpler means. When accessing memory, there are separate commands for a byte, half a word, and a full 32-bit value. If necessary, further processing is performed using the usual logical and arithmetic instructions.
For a programmer, sometimes this means more individual actions. For hardware, this means fewer hidden behaviors for a single command.
And again, it turns out not to abandon the task that MIX solved, but another way to draw the line between the instruction and the program.
Addressing has become easier
In MIX, the instruction address can be changed using one of the six index registers. The number of such a register is stored directly in the machine command. This makes indexing part of the overall addressing architecture.
There is no separate index register class in Memora8. The usual memory access instruction uses the base register and the direct offset.
From the point of view of the program, the possibilities remain familiar. You can keep the beginning of an array or structure in a register and access individual elements via an offset. If the address needs to be changed more difficult, it can be pre-calculated using arithmetic commands.
For the processor, this means that the address calculation uses the same regular registers as the rest of the program.
This approach fits well with the general idea of Memora8: if possible, do not create a separate hardware mechanism where an existing mechanism can solve the same problem.
Comparison has become a common calculation result.
Another notable difference is in working with conditions.
MIX has a separate comparison indicator. After executing the comparison command, it stores one of the states: less than, equal to, or greater than. A subsequent transition command checks this state.
There is no separate hidden register in Memora8. There are no signs of comparison.
The CMP and CMPI commands write the result to a regular register. This result contains signs of equality, signed and unsigned relationships. After that, the program can use the usual logical commands to select the desired condition and pass it to the transition command.
At the program level, the sequence is longer. But the result of the comparison becomes ordinary data.
It can be saved, passed on, processed logically, or used multiple times. The processor does not need a separate hidden mechanism, the state of which exists in parallel with the main registers.
This is a good example of how the idea from MIX is not just simplified, but reinterpreted.
The actual implementation changes the criteria
Educational architecture can afford to choose solutions primarily based on the convenience of explanation and programming. A real processor has an additional criterion: how well an architectural idea transforms into a digital circuit.
In Memora8, each team goes through a five-stage pipeline. First, the instruction is selected from memory, then registers are read, work is performed with memory, calculations are performed, and only after that the result finally changes the architectural state.
Therefore, the new feature of the command system does not end with a change in the instruction table. She has to be led through this whole path.
If a special register appears, you need to decide how it is read and written. If an instruction receives a new kind of operand, it must pass through decoding and the data path. If a new state change option is added, it is necessary to determine at what stage it occurs and when it becomes visible to the program.
In FPGAs, this complexity gradually turns into real logic gates, connections, and delays.
That is why Memora8 often chooses a combination of existing simple mechanisms instead of creating a new special case.
A copy of MIX would have lost the meaning of the experiment itself
It would be possible to create a modern hardware implementation of MIX. Such a project would be interesting as a historical reconstruction and would allow running programs for the Knuth machine on a real digital circuit.
But that's not what Memora8 was created for.
Another question was of interest: if we start with the same idea of a visible computing machine, but design it today for an FPGA, which solutions will remain useful?
The answer was ambiguous.
The idea of a small and clear architecture has been preserved. There is still a desire to clearly define the role of each instruction. The separation of computing, memory, and flow control has been preserved.
But the specific mechanisms have changed almost completely.
Specialized registers have given way to general-purpose registers. Working with word fields has become simpler operations on data. The rich semantics of some commands were divided among several elementary instructions. The hidden signs of comparison have become a common value in the register.
That is why it is better to describe the relationship between MIX and Memora8 not as an inheritance of a command system, but as a continuation of an architectural conversation.
Knuth asked the question: what should be a sufficiently simple machine so that algorithms can be clearly described on it?
Memora8 asks a similar question in a different environment: what should be a simple enough machine so that it can not only be understood, but also really assembled in modern programmable logic?
Several decades have passed between these issues. Therefore, the answers are inevitable they differ.
But the very way of thinking about architecture has proved to be surprisingly tenacious.
Когда современный процессор сравнивают с MIX Дональда Кнута, легко ожидать прямого родства: похожих команд, одинаковых регистров или повторения структуры машинного слова. В случае Memora8 такого сходства почти нет, и это сделано сознательно.
MIX создавался как учебная вычислительная машина. Его задача состояла в том, чтобы дать достаточно универсальную и понятную модель, на которой можно рассматривать алгоритмы независимо от конкретных компьютеров своего времени. Кнуту была нужна законченная архитектура, пригодная для программирования и анализа.
Memora8 решает другую задачу. Это реальный 32-битный процессор, который должен быть реализован в программируемой логике, пройти синтез, размещение и трассировку, работать с памятью и выполнять машинный код в настоящем устройстве.
Поэтому буквальное копирование MIX не только не было целью, но и быстро привело бы к ненужным ограничениям.
Что вообще можно заимствовать у старой архитектуры
Архитектура процессора состоит не только из конкретных команд и названий регистров. За ними находятся более общие решения: как представлять данные, где хранить промежуточные результаты, как вычислять адрес, каким образом выполнять переходы и какую часть работы отдавать аппаратуре.
Именно на этом уровне MIX остаётся интересен.
Например, в MIX хорошо видна попытка сделать машину достаточно компактной, но при этом законченной. Есть память, регистры, арифметика, сравнение, переходы, ввод-вывод и способы работы с частями машинного слова. Все элементы связаны в единую модель, которую можно понять целиком.
Для Memora8 ценность такого подхода заключается не в том, чтобы повторить каждый механизм, а в вопросе, который стоит за ним: какой минимальный набор средств действительно необходим процессору?
Ответ для современной машины получается уже другим.
Специализированные регистры оказались необязательными
В MIX регистры отличаются не только номерами, но и назначением. A участвует в основных вычислениях, X дополняет его, шесть индексных регистров помогают формировать адреса, а J хранит адрес возврата.
Если бы Memora8 буквально следовал MIX, подобное разделение пришлось бы сохранить и в аппаратуре.
Вместо этого в Memora8 используются 32 регистра общего назначения. Почти все они одинаковы с точки зрения процессора. Роль регистра определяется не его физическим типом, а тем, как его использует программа.
Та же задача решается другим способом.
Адрес возврата всё ещё нужно где-то хранить, но для этого не требуется отдельный тип регистра. Индекс для массива тоже нужен, однако он может находиться в обычном регистре. Промежуточный результат арифметической операции не обязан проходить через специально выделенный аккумулятор.
Таким образом, идея MIX сохраняется на уровне функции, но меняется на уровне реализации.
Поля машинного слова тоже не понадобилось переносить
Одной из характерных особенностей MIX является возможность обращаться не только ко всему машинному слову, но и к выбранной его части. Для этого в инструкции используется специальный модификатор, задающий поле слова.
Такой механизм очень выразителен. Одна команда может работать по-разному в зависимости от выбранного диапазона байтов.
В Memora8 этого механизма нет.
Здесь все основные регистры имеют фиксированную ширину 32 бита, а работа с меньшими частями данных решается более простыми средствами. При обращении к памяти существуют отдельные команды для байта, половины слова и полного 32-битного значения. При необходимости дальнейшая обработка выполняется обычными логическими и арифметическими инструкциями.
Для программиста иногда это означает больше отдельных действий. Для аппаратуры это означает меньше скрытых вариантов поведения одной команды.
И снова получается не отказ от задачи, которую решал MIX, а другой способ провести границу между инструкцией и программой.
Адресация стала проще
В MIX адрес инструкции может изменяться с помощью одного из шести индексных регистров. Номер такого регистра хранится прямо в машинной команде. Это делает индексирование частью общей архитектуры адресации.
В Memora8 нет отдельного класса индексных регистров. Обычная команда обращения к памяти использует базовый регистр и непосредственное смещение.
С точки зрения программы возможности остаются привычными. Можно держать в регистре начало массива или структуры и обращаться к отдельным элементам через смещение. Если адрес нужно изменить сложнее, его можно предварительно вычислить арифметическими командами.
Для процессора это означает, что вычисление адреса использует те же обычные регистры, что и остальная программа.
Такой подход хорошо соответствует общей идее Memora8: по возможности не создавать отдельный аппаратный механизм там, где уже существующий механизм способен решить ту же задачу.
Сравнение стало обычным результатом вычисления
Ещё одно заметное различие находится в работе с условиями.
MIX имеет отдельный индикатор сравнения. После выполнения команды сравнения он хранит одно из состояний: меньше, равно или больше. Последующая команда перехода проверяет это состояние.
В Memora8 отдельного скрытого регистра признаков сравнения нет.
Команды CMP и CMPI записывают результат в обычный регистр. В этом результате содержатся признаки равенства, знакового и беззнакового отношений. После этого программа может обычными логическими командами выбрать нужное условие и передать его команде перехода.
На уровне программы последовательность получается длиннее. Зато результат сравнения становится обычными данными.
Его можно сохранить, передать дальше, обработать логически или использовать несколько раз. Процессору не требуется отдельный скрытый механизм, состояние которого существует параллельно с основными регистрами.
Это хороший пример того, как идея из MIX не просто упрощается, а переосмысливается.
Реальная реализация меняет критерии
Учебная архитектура может позволить себе выбирать решения прежде всего по удобству объяснения и программирования. У реального процессора появляется дополнительный критерий: насколько хорошо архитектурная идея превращается в цифровую схему.
В Memora8 каждая команда проходит через пятистадийный конвейер. Сначала инструкция выбирается из памяти, затем читаются регистры, выполняется работа с памятью, производится вычисление и только после этого результат окончательно меняет архитектурное состояние.
Поэтому новая особенность системы команд не заканчивается изменением таблицы инструкций. Её приходится проводить через весь этот путь.
Если появляется специальный регистр, нужно решить, как он читается и записывается. Если команда получает новый вид операнда, он должен пройти через декодирование и тракт данных. Если добавляется новый вариант изменения состояния, необходимо определить, на какой стадии он возникает и когда становится видимым программе.
В FPGA эта сложность постепенно превращается в реальные логические элементы, соединения и задержки.
Именно поэтому Memora8 чаще выбирает сочетание уже существующих простых механизмов вместо создания нового специального случая.
Копия MIX потеряла бы смысл самого эксперимента
Можно было бы создать современную аппаратную реализацию MIX. Такой проект был бы интересен как историческая реконструкция и позволил бы запускать программы для машины Кнута на настоящей цифровой схеме.
Но Memora8 создавался не для этого.
Интерес представлял другой вопрос: если начать с той же идеи обозримой вычислительной машины, но проектировать её сегодня для FPGA, какие решения останутся полезными?
Ответ оказался неоднозначным.
Сохранилась идея небольшой и понятной архитектуры. Сохранилось стремление ясно определить роль каждой инструкции. Сохранилось разделение вычислений, памяти и управления потоком.
Но конкретные механизмы изменились почти полностью.
Специализированные регистры уступили место регистрам общего назначения. Работа с полями слова превратилась в более простые операции над данными. Богатая семантика некоторых команд была разделена между несколькими элементарными инструкциями. Скрытые признаки сравнения стали обычным значением в регистре.
Именно поэтому связь между MIX и Memora8 лучше описывать не как наследование системы команд, а как продолжение архитектурного разговора.
Кнут задавал вопрос: какой должна быть достаточно простая машина, чтобы на ней можно было ясно описывать алгоритмы?
Memora8 задаёт похожий вопрос уже в другой среде: какой должна быть достаточно простая машина, чтобы её можно было не только понять, но и действительно собрать в современной программируемой логике?
Между этими вопросами прошло несколько десятилетий. Поэтому ответы неизбежно различаются.
Но сам способ рассуждать об архитектуре оказался удивительно живучим.