The post has been translated automatically. Original language: Russian
When designing a processor, it's easy to fall into the trap of adding everything to the instruction set that you're used to seeing in existing architectures. Each individual feature looks small, but in hardware implementation it may require additional signals, checking conditions, connections between blocks, and complicating critical paths.
In Memora8, we decided to test the reverse approach. Instead of asking "what commands do processors usually have?" we ask a different one.: which operations really justify their cost in the entire hardware system?
One of the results of this approach was the revision of memory reads and writes.
An ordinary processor can work not only with words
Memora8 is a 32-bit processor. The natural unit of data for it is a 32-bit word, but the initial instruction set, like many other architectures, allowed accessing memory in parts of a word.
In particular, operations were envisaged:
- LB — loading a signed byte;
- LBU — loading an unsigned byte;
- LH — signed 16-bit download;
- LHU — unsigned 16-bit download;
- SB — byte entry;
- SH is a 16—bit record.
At the programming level, such commands are convenient. If a program needs to change one byte, it seems natural to write exactly one byte, rather than an entire 32-bit word.
But the processor exists not only at the command language level.
One byte turns into additional lines throughout the memory.
The Memora8 memory is divided into multiple banks and connected to multiple processors. Therefore, the write signal does not end next to the computing core: it must go through the entire structure of bank selection, routing, and memory management.
For a 32-bit word, the memory physically consists of four bytes. To allow independent recording of each of them, it is necessary to transmit four additional control signals, one for each byte.
Conventionally, it looks like this:
data[31:0]
address
write
byte_enable[3:0]The last line seems like a small thing: only four bits. But if there are many such banks, several processors access the memory, and connections pass through a significant part of the FPGA, these four signals have to be stretched along with each write path.
For a software model, this is just one possibility. For the physical circuit, there are additional lines throughout the memory structure.
Why is this especially important on FPGAs
In ordinary programming, the cost of an additional logical condition is almost imperceptible. In FPGAs, the cost is often determined not only by the number of logic gates, but also by how far the signals have to be transmitted and through how many routing nodes they pass.
The more connections there are between processors and memory banks, the more difficult it is to place the circuit. The load on routing increases, signal latency increases, and it becomes more difficult to maintain the required clock frequency.
That is why, when designing Memora8 memory, we are increasingly looking not at a single block, but at the entire physical structure. An opportunity that costs almost nothing in one small module can turn out to be expensive after multiplying it into dozens of paths.
In the case of narrow records, four control lines must accompany the data through a significant part of the memory. A legitimate question arises: are they necessary enough to constantly pay for them with hardware complexity?
Leave only 32-bit reads and writes
The working hypothesis of the new ISA Memora8 is to leave only two operations for ordinary memory.:
LW — load a 32-bit word
SW — write a 32-bit wordIn other words, memory becomes strictly 32-bit from the processor's point of view. There is no separate hardware recording of a byte or half a word anymore.
This allows you to remove four byte write resolution lines from the main memory path. At the same time, operation selection, bank management, and part of the logic around the record are simplified.
The change looks small at the level of the list of commands, but its meaning lies much deeper — in the physical implementation of the entire memory subsystem.
And then how to work with bytes?
Abandoning the SB or SH commands does not mean that the program can no longer store byte data. The only thing that changes is the way they are written to memory.
If you need to change a part of a 32-bit word, the program can read the entire word, change the necessary bits using normal logical operations, and write the word back.
For example, instead of a separate hardware recording of a single byte, a sequence of something like this is performed.:
read the word
clear the required 8 bits
add a new value
write the wordYes, in the specific case it requires multiple commands instead of one. But the architectural question is not which program will be shorter, but which mechanism is more profitable for the entire system.
If a relatively rare operation requires a permanent hardware infrastructure across the entire memory, it is sometimes wiser to transfer its cost to the software.
An ISA is also a hardware budget allocation.
There is a second effect. Memora8 uses a 5-bit opcode field, meaning only 32 basic values are available.
Removing six narrow memory operations frees up a significant portion of this space.:
LB
LBU
LH
LHU
SB
SHThe released codes can be used for operations that are more difficult or more expensive to express in a sequence of simple commands.
Full-fledged multiplication, division and remainder calculations, MSB/MSBI bit search, as well as direct privileged access to the system bus are currently being considered among the candidates. Therefore, it is not just about reducing the ISA, but about redistributing a limited hardware resource.
We remove operations that are expensive to run through the entire memory, and use the freed up space for features that can give the system more benefits.
Simplicity is not needed for the sake of a minimum number of commands
The goal of Memora8 is not to make the smallest possible processor. Too small a set of commands can, on the contrary, complicate programs and increase the number of executed operations.
Therefore, each case has to be considered separately. Multiplication, for example, may take up a separate hardware unit, but it performs a significant amount of work and is often used by programs. Searching for a bit also requires hardware logic, but it can replace the entire mask processing sequence with a single operation.
With narrow memory operations, the picture is different. Their support runs through a significant part of the memory subsystem and creates a constant physical cost regardless of how often the program uses them.
It was this difference that turned out to be significant for us.
The architecture is determined not only by the logical scheme
The work on Memora8 on FPGAs is gradually changing our view of processor design. Architecture is not only a beautiful set of blocks in a diagram and not only a table of machine instructions.
It must exist after placement and tracing, fit within the limitations of a real crystal, and operate at a given frequency. Sometimes the solution becomes obvious only when you start looking at the actual signal routes between hundreds of hardware elements.
Therefore, the question "does the PROCESSOR need to write a byte?" turned out to be a non-byte question for us.
It turned out to be a question of whether, for the sake of this opportunity, it is worth conducting four additional control lines through the entire FPGA memory.
At the current stage, Memora8's answer is probably no. We are testing a variant in which the main memory becomes fully 32-bit, and the released hardware complexity is used where it brings more benefits to the system.
При разработке процессора легко попасть в ловушку: добавить в набор команд всё, что привычно видеть в существующих архитектурах. Каждая отдельная возможность выглядит небольшой, но в аппаратной реализации она может потребовать дополнительные сигналы, проверку условий, соединения между блоками и усложнение критических путей.
В Memora8 мы решили проверить обратный подход. Вместо вопроса «какие команды обычно есть у процессоров?» мы задаём другой: какие операции действительно оправдывают свою стоимость во всей аппаратной системе?
Одним из результатов этого подхода стал пересмотр операций чтения и записи памяти.
Обычный процессор умеет работать не только со словами
Memora8 — 32-битный процессор. Естественной единицей данных для него является 32-битное слово, однако первоначальный набор команд, как и многие другие архитектуры, позволял обращаться к памяти частями слова.
В частности, предусматривались операции:
- LB — загрузка байта со знаком;
- LBU — загрузка байта без знака;
- LH — загрузка 16 бит со знаком;
- LHU — загрузка 16 бит без знака;
- SB — запись байта;
- SH — запись 16 бит.
На уровне программирования такие команды удобны. Если программе требуется изменить один байт, кажется естественным записать именно один байт, а не целое 32-битное слово.
Но процессор существует не только на уровне языка команд.
Один байт превращается в дополнительные линии по всей памяти
Память Memora8 разделена на множество банков и соединена с несколькими процессорами. Поэтому сигнал записи не заканчивается рядом с вычислительным ядром: он должен пройти через всю структуру выбора банка, маршрутизации и управления памятью.
Для 32-битного слова память физически состоит из четырёх байтов. Чтобы разрешить независимую запись каждого из них, необходимо передавать четыре дополнительных управляющих сигнала — по одному на каждый байт.
Условно это выглядит так:
data[31:0]
address
write
byte_enable[3:0]Последняя строка кажется мелочью: всего четыре бита. Но если таких банков много, к памяти обращаются несколько процессоров, а соединения проходят через значительную часть ПЛИС, эти четыре сигнала приходится протягивать вместе с каждым трактом записи.
Для программной модели это всего одна возможность. Для физической схемы — дополнительные линии по всей структуре памяти.
Почему это особенно важно на ПЛИС
В обычном программировании стоимость дополнительного логического условия почти незаметна. В ПЛИС стоимость часто определяется не только количеством логических элементов, но и тем, как далеко приходится передавать сигналы и через сколько узлов маршрутизации они проходят.
Чем больше связей между процессорами и банками памяти, тем сложнее размещение схемы. Увеличивается нагрузка на маршрутизацию, растёт задержка сигналов и становится труднее удерживать требуемую тактовую частоту.
Именно поэтому при проектировании памяти Memora8 мы всё чаще смотрим не на отдельный блок, а на всю физическую структуру целиком. Возможность, которая почти ничего не стоит в одном небольшом модуле, может оказаться дорогой после её размножения на десятки путей.
В случае узких записей четыре управляющие линии должны сопровождать данные через значительную часть памяти. Возникает закономерный вопрос: настолько ли они нужны, чтобы постоянно платить за них аппаратной сложностью?
Оставить только 32-битное чтение и запись
Рабочая гипотеза новой ISA Memora8 состоит в том, чтобы оставить для обычной памяти только две операции:
LW — загрузить 32-битное слово
SW — записать 32-битное словоТо есть память с точки зрения процессора становится строго 32-битной. Отдельной аппаратной записи байта или половины слова больше нет.
Это позволяет убрать четыре линии разрешения записи байтов из основного тракта памяти. Одновременно упрощаются выбор операции, управление банками и часть логики вокруг записи.
Изменение выглядит небольшим на уровне списка команд, но его смысл находится значительно глубже — в физической реализации всей подсистемы памяти.
А как тогда работать с байтами?
Отказ от команд SB или SH не означает, что программа больше не может хранить байтовые данные. Меняется только способ их записи в память.
Если требуется изменить часть 32-битного слова, программа может прочитать всё слово, изменить нужные биты обычными логическими операциями и записать слово обратно.
Например, вместо отдельной аппаратной записи одного байта выполняется последовательность примерно такого смысла:
прочитать слово
очистить нужные 8 бит
добавить новое значение
записать словоДа, в конкретном случае это требует нескольких команд вместо одной. Но архитектурный вопрос заключается не в том, какая одна программа получится короче, а в том, какой механизм выгоднее для всей системы.
Если относительно редкая операция требует постоянной аппаратной инфраструктуры по всей памяти, иногда разумнее перенести её стоимость в программное обеспечение.
ISA — это ещё и распределение аппаратного бюджета
Есть и второй эффект. У Memora8 используется 5-битное поле кода операции, то есть доступно всего 32 основных значения.
Удаление шести узких операций памяти освобождает заметную часть этого пространства:
LB
LBU
LH
LHU
SB
SHОсвободившиеся коды можно использовать для операций, которые сложнее или дороже выразить последовательностью простых команд.
Сейчас среди кандидатов рассматриваются полноценные операции умножения, деления и вычисления остатка, поиск бита MSB/MSBI, а также прямой привилегированный доступ к системной шине. Поэтому речь идёт не просто о сокращении ISA, а о перераспределении ограниченного аппаратного ресурса.
Мы убираем операции, которые дорого проходят через всю память, и используем освободившееся пространство для возможностей, которые могут дать системе больше пользы.
Простота нужна не ради минимального числа команд
Цель Memora8 не состоит в том, чтобы сделать минимально возможный процессор. Слишком маленький набор команд способен, наоборот, усложнить программы и увеличить количество исполняемых операций.
Поэтому каждый случай приходится рассматривать отдельно. Умножение, например, может занимать отдельный аппаратный блок, но оно выполняет существенный объём работы и часто используется программами. Поиск бита также требует аппаратной логики, однако одной операцией способен заменить целую последовательность обработки маски.
С узкими операциями памяти картина другая. Их поддержка проходит через значительную часть подсистемы памяти и создаёт постоянную физическую стоимость независимо от того, насколько часто программа ими пользуется.
Именно это различие оказалось для нас существенным.
Архитектуру определяет не только логическая схема
Работа над Memora8 на ПЛИС постепенно меняет наш взгляд на проектирование процессора. Архитектура — это не только красивый набор блоков на схеме и не только таблица машинных команд.
Она должна существовать после размещения и трассировки, укладываться в ограничения реального кристалла и работать на заданной частоте. Иногда решение становится очевидным только тогда, когда начинаешь смотреть на реальные маршруты сигналов между сотнями аппаратных элементов.
Поэтому вопрос «нужна ли процессору запись байта?» оказался для нас вопросом не о байте.
Он оказался вопросом о том, стоит ли ради этой возможности проводить четыре дополнительные управляющие линии через всю память ПЛИС.
На текущем этапе ответ Memora8 — скорее нет. Мы проверяем вариант, в котором основная память становится полностью 32-битной, а освободившаяся аппаратная сложность используется там, где она приносит системе больше пользы.