Разработка цифровых ИС на примере микроконтроллерного ядра SCR1 - верификация и тестирование
Декодирование инструкции (B-тип)
Рассмотрим декодирование инструкции B-типа на примере инструкции "bge ra, sp, 0x2B2". При этом адрес инструкции - 0x2A6.
Инструкция в формате "hex": 0x0020D663.
- RVI инструкция (instr_rvc = 0).
- Операндами АЛУ являются значения регистров ra и sp (ialu_op = 1).
- Операция АЛУ - больше или равно (ialu_cmd = 0xA)
- Операнды для вычисления адреса ветвления - значение счетчика команд и непосредственное значение (sum2_op = 0).
- Запись в MPRF не осуществляется (rd_wb_sel = 0).
- Поскольку инструкция выполняет ветвление branch_req = 1.
- Первый регистр-операнд - x1 (rs1_addr = 1).
- Второй регистр-операнд - x2 (rs1_addr = 2).
- Непосредственное значение - 12 (imm = 0xC).
Oстальные поля не имеют значения для данной инструкций.
Декодирование инструкции (U-тип, auipc)
В стандартном наборе инструкций RV32I существует две инструкции U-типа: "lui" и "auipc".
Рассмотрим декодирование инструкции "auipc a0, 0xFFFFE". При этом адрес инструкции - 0x2C0.
Инструкция в формате "hex": 0xFFFFE517.
- RVI инструкция (instr_rvc = 0).
- Сложение счетчика команд и непосредственного значения происходит без использования АЛУ, по данной причине ialu_cmd = 0, а sum2_op = 0.
- Источником данных для MPRF является выход сумматора "sum2" (rd_wb_sel = 2).
- Регистр-назначение - x10 (rs1_addr = 0xA).
- Непосредственное значение - 4294959104 (imm = 0xFFFFE000).
Остальные поля не имеют значения для данной инструкций.
Декодирование инструкции (U-тип, lui)
Рассмотрим декодирование инструкции "lui ra, 0x80000" Инструкция в формате "hex": 0x800000B7.
- RVI инструкция (instr_rvc = 0).
- Источником данных для MPRF является непосредственное значение (rd_wb_sel = 3).
- Регистр-назначение - x1 (rs1_addr = 1).
- Непосредственное значение - 2147483648 (imm = 0x80000000).
Остальные поля не имеют значения для данной инструкций.
Декодирование инструкции (J-тип)
Единственной инструкцией J-типа в стандартном наборе RV32I является инструкция "jal"
Рассмотрим декодирование инструкции "jal tp, 2AE". При этом адрес инструкции - 0x2A4.
Инструкция в формате "hex": 0x00A0026F.
- RVI инструкция (instr_rvc = 0).
- Операнды для вычисления адреса прыжка - значение счетчика инструкций и непосредственное значение (sum2_op = 0).
- Источник данных для MPRF - инкрементированный счетчик инструкций (rd_wb_sel = 4).
- Поскольку инструкция выполняет прыжок jump_req = 1.
- Регистр-назначение - x4 (rs1_addr = 4).
- Непосредственное значение - 10 (imm = 0xA).
Остальные поля не имеют значения для данной инструкций.
Выполнение инструкции
На стадии выполнения инструкции происходят следующие операции:
- Выборка операндов из MPRF.
- Aрифметические и логические операции.
- Операции чтения/записи памяти данных.
- Управление потоком инструкций (изменение счетчика инструкций).
- Запись результатов.
Чтение данных из MPRF
Регистровый файл (MPRF) может быть реализован на основе памяти с асинхронным чтением (Dтриггеры). В данном случае декодированные адреса регистров-операндов сначала записываются в конвейерный регистр, разделяющий стадии декодирования и выполнения, а затем направляются в MPRF.
Другой вариант реализации - на основе SRAM. В таком случае адреса регистров-операндов направляются в MPRF со стадии декодирования, т.к. задержка чтения составляет 1 такт. Считанные данные отправляются напрямую на стадию выполнения.









