Опубликован: 04.08.2025 | Доступ: свободный | Студентов: 12 / 0 | Длительность: 02:58:00
Лекция 3:

Разработка цифровых ИС на примере микроконтроллерного ядра SCR1 - верификация и тестирование

Выполнение инструкции


Когда стадия декодирования готова передать декодированную инструкцию (idu2exu_req_i = 1), а стадия выполнения готова ее принять (exu2idu_rdy_o = 1), выставляется флаг "exu_queue_en", сигнализирующий о записи данных в конвейерный регистр стадии выполнения (передаётся структура типа "type_scr1_exu_cmd_s"). Далее будет рассмотрено выполнение инструкций, использованных ранее.

Выполнение инструкции (R-тип)


Рассмотрим выполнение инструкции "add gp, ra, sp" (0x002081B3).

Декодированная инструкция (управляющие сигналы, адреса операндов и т.д.) направляется на стадию выполнения.

Из регистрового файла считываются операнды: "rs1" = 3, "rs2" = 7.


Считанные операнды направляются в АЛУ с указанием операции, в данном случае - сложение.

АЛУ вычисляет результат операции (ialu_main_res = 10).

В регистровый файл отправляется запрос на запись результата (exu2mprf_w_req_o) с указанием адреса (exu2mprf_rd_addr_o = 3) и данных (exu2mprf_rd_data_o = 10). С приходом фронта тактового сигнала данные запишутся в MPRF.

По окончании выполнения инструкции (exu2pipe_instret_o = 1) выставляется флаг обновления счетчика инструкций "pc_curr_upd". С приходом фронта тактового сигнала "pc_curr_ff" примет значение "pc_curr_next" (инкрементируется на 4).

Упрощенная схема выполнения инструкции:


Выполнение инструкции (I-тип, addi)


Рассмотрим выполнение арифметической инструкции I-типа "addi gp, ra, 7" (0x00708193).

  • Декодированная инструкция (управляющие сигналы, адреса операндов и т.д.) направляется на стадию выполнения.
  • Из регистрового файла считывается только один операнд: "rs1" = 3, т.к. вторым операндом является непосредственное значение (imm = 7).

Дальнейшее выполнение аналогично инструкции "add" за исключением того, что одним из операндов АЛУ является непосредственное значение.

Упрощенная схема выполнения инструкции:


Выполнение инструкции (I-тип, lhu)


Рассмотрим выполнение инструкции чтения I-типа "lhu t0, 32(ra)" (0x0200D283).

  • Декодированная инструкция (управляющие сигналы, адреса операндов и т.д.) направляется на стадию выполнения.
  • Из регистрового файла считывается только один операнд: "rs1" = 0x4C0, т.к. вторым операндом является непосредственное значение (imm = 32)

  • Операнды i_alu_addr_op1 и i_alu_addr_op2 направляются в сумматор для вычисления адреса чтения (i_alu_addr_res = 0x4E0).
  • В модуль чтения/записи (LSU) направляется запрос (lsu_req = 1) на чтение половины слова данных с беззнаковым расширением (lsu_cmd = 5) по ранее вычисленному адресу.
  • LSU формирует запрос к памяти данных (exu2dmem_req_o = 1) на чтение (exu2dmem_cmd_o = 0) по адресу exu2dmem_addr_o = 0x4E0. Память данных подтверждает запрос (exu2dmem_req_ack_i = 1)

  • На следующем такте (задержка может быть произвольной) приходит ответ от памяти данных об успешности операции (dmem2exu_resp_i = 1) и считанные данные (dmem2exu_rdata_i = 0xFF).
  • LSU беззнаково расширяет считанные данные (lsu_l_data = 0xFF) и выставляет флаг их готовности (lsu_rdy = 1)
  • Далее, аналогично предыдущим инструкциям, с приходом фронта тактового сигнала результат записывается в MPRF и обновляется счетчик инструкций.

Упрощенная схема выполнения инструкции:


Выполнение инструкции (I-тип, jalr)


Рассмотрим выполнение инструкции прыжка I-типа "jalr t0, t1" (0x000302E7).

  • Декодированная инструкция (управляющие сигналы, адреса операндов и т.д.) направляется на стадию выполнения.
  • Из регистрового файла считывается только один операнд: "rs1" = 0x2B2, т.к. вторым операндом является непосредственное значение (imm = 0).

  • Операнды i_alu_addr_op1 и i_alu_addr_op2 направляются в сумматор для вычисления адреса прыжка (i_alu_addr_res = 0x2B2).
  • Блок выполнения передает блоку выборки флаг запроса нового адреса инструкции (exu2ifu_pc_new_req_o = 1) и сам адрес (exu2ifu_pc_new_o = 0x2B2).
  • При этом инкрементированное значение счетчика инструкций (inc_pc = 0x2B0) запишется в регистр-назначение.

  • Поскольку все инструкции, считанные после "jalr", необходимо отбросить, формируется сигнал очистки очереди инструкций (q_flush_req = 1).
  • Так как адрес 0x2B2 не выровнен на 4 байта, выставляется флаг невыровненного счетчика инструкций (new_pc_unaligned_next = 1).
  • В таком случае адрес запроса в память инструкций будет 0x2B0.

Упрощенная схема выполнения инструкции: