16 и 32 команды могут идти вперемешку: хотя компилятор и может подбить 32-битные инструкции по границам слов, это НЕ обязательно!
Чтение невыровненной инструкции замедляет конвейер на 1 такт: сначала проталкивается NOP, затем считанная команда.
Длина инструкции закодирована в двух младших битах: если там [11], то это 32-битная команда, если там [00], [01] или [10], тогда 16-битная. Устройство извлечения анализирует эти два бита и значение 1 бита Program Counter (бит 0 всегда равен нулю, иначе срабатывает исключение):
1) если длина инструкции 16 бит, значит, выровненный доступ; приращение PC +2
2) если длина инструкции 32 бита и бит 1 равен нулю - значит, выровненный доступ; приращение PC +4
3) если длина инструкции 32 бита и бит 1 равен единице - значит, невыровненный доступ; приращение PC +2 (и в следующем такте ещё +2)
Cоорудил автомат (FSM с кодированием состояний one-hot), причём аж на пять или даже на шесть, если считать "стартовую позицию", состояний:
1) чтение нижней 16-битной команды
2) чтение верхней 16-битной команды
3) чтение нижней половинки невыровненной 32-битной команды
4) чтение верхней половинки невыровненной 32-битной команды
5) чтение выровненной 32-битной команды
Количество состояний можно сократить, но ценой потери наглядности схемы. При этом на самом деле схема упростится не так сильно, как хотелось бы: память состояний и так умещается в один корпус 74HC174, куда меньше-то...