Модуль miriscv_mdu (multiplication division unit) предназначен для выполнения операций деления и умножения. Параметры модуля описаны в таблице 1, порты в таблице 2.
Название параметра | Значение по умолчанию | Назначение |
---|---|---|
XLEN | 32 | Разрядность шины данных |
MDU_OP_W | 3 | Разрядность кода инструкции для MDU |
MDU_MUL | 0 | Код операции умножения со знаком с сохранением битов [XLEN-1:0] от результата |
MDU_MULH | 1 | Код операции умножения со знаком с сохранением битов [2*XLEN-1:XLEN] от результата |
MDU_MULHSU | 2 | Код операции умножения знакового операнда на беззнаковый с сохранением битов [2*XLEN-1:XLEN] от результата |
MDU_MULHU | 3 | Код операции беззнакового умножения с сохранением битов [2*XLEN-1:XLEN] от результата |
MDU_DIV | 4 | Код операции деления на знаковое число с округлением в меньшую сторону |
MDU_DIVU | 5 | Код операции деления на беззнаковое число с округлением в меньшую сторону |
MDU_REM | 6 | Код операции вычисления остатка от деления на знаковое число |
MDU_REMU | 7 | Код операции вычисления остатка от деления на беззнаковое число |
Далее в тексте под делением будут подразумеваться все разновидности этой операции ( DIV, DIVU, REM, REMU ).
Название сигнала | Разрядность | Назначение |
---|---|---|
mdu_req_i | 1 | Запрос на выполнение операции в mdu |
mdu_port_a_i | XLEN | Первый операнд для выполнение инструкции в mdu |
mdu_port_b_i | XLEN | Второй операнд для выполнение инструкции в mdu |
mdu_op_i | MDU_OP_W | Идентификатор операции для mdu (opcode) |
mdu_kill_i | 1 | Сигнал сброса операции деления при конфликте по управлению |
mdu_keep_i | 1 | Сигнал для сохранения результатов деления и предотвращения повтора вычислений |
mdu_result_o | XLEN | Вывод результата вычислений |
mdu_stall_req_o | 1 | Сигнал приостановки конвейера для решения структурного конфликта при выполнении операции деления |
Умножение в данном модуле выполняется комбинационно. Деление происходит оптимально и выполняется итерационно за 32 такта. Из за итерационного выполнения деления ( результат не готов после одного такта ) возникает структурный конфликт, который решается приостановкой конвейера сигналом mdu_stall_req_o (таблица 2 )