-
Notifications
You must be signed in to change notification settings - Fork 35
Problem 07: CPU v1
Перейдите в каталог problems/07_cpu_v1
в вашей локальной копии репозитория. Для синхронизации локального репозтория используется команда git pull
.
В этом и в следующих заданиях, чтобы узнать подробности работы и поля команды используйте спецификацию RISC-V ISA и таблицу инструкций RISC-V.
Эта часть посвящена написанию кода, необходимого для работы инструкции ADDI.
В файле alu.v
опишите модуль арифметико-логического устройства (АЛУ). Заголовок модуля должен быть следующий:
module alu(
input [31:0]src_a, // Вход первого операнда
input [31:0]src_b, // Вход второго операнда
input [2:0]op, // Вход выбора номера операции, всего 8 различных операций
output reg [31:0]res // Результат выполнения операции
);
АЛУ — комбинационная схема, выполняющая одну выбираемую входом op
операцию, над входами-операндами src_A
и src_B
.
Начните с двух операций:
-
op = 0
: тождественная операция (возвращает операнд A в качестве результата) -
op = 1
: cложение операнда A и операнда B
Пока остальные операции не определены, пусть АЛУ возвращает 0 для неиспользованных значений op
, для этого внутри блока case
-endcase
можно использовать ключевое слово default
.
В файле reg_file.v
опишите модуль регистрового файла со следующим заголовком:
module reg_file(
input clk,
input [4:0]raddr0, // Адрес чтения №0
input [4:0]raddr1, // Адрес чтения №1
input [4:0]waddr, // Адрес записи
input [31:0]wdata, // Данные для записи
input we, // Вход разрешения записи
output [31:0]rdata0, // Прочитанные данные №0
output [31:0]rdata1 // Прочитанные данные №1
);
У регистрового файла должно быть 2 порта чтения и 1 порт записи. Всего должно быть 32 32-разрядных регистра. Чтение регистра x0
должно всегда возвращать 0.
В файле control.v
доделайте устройство управления. Шины opcode
и funct3
должны соответствовать одноименным полям текущей инструкции.
В модуле core
допишите определения шин rd
, rs1
, rs2
, так чтобы они соответствовали одноименным полям текущей инструкции.
Опишите логику расширения знака c 12 бит до 32 бит для шин imm12
и imm32
. Можно воспользоваться модулем, сделанным в задании (Problem 01: Sign extension block). Это нужно для правильного сложения отрицательных чисел.
В файле cpu_top.v
опишите правильные соединения ядра core
и модуля памяти команд rom
.
Проверьте корректность работы процессора в симуляторе Icarus Verilog на тестовой программе samples/addi.txt
.
Код этой программы (без меток и директив ассемблера) следующий:
addi x5, x0, 11
addi x7, x5, 9
nop
addi x11, x7, 0
addi x7, x7, -5
nop
nop
nop
При запуске make test
произойдёт автоматическая проверка лога симуляции и эталонного лога. Если после строки grep "CPUv1" cpu.log | diff cpu_test.log -
никакого вывода нет, значит всё работает правильно.
Эта часть посвящена остальным инструкциям форматов Type-I и Type-R.
Чтобы не писать программы в двоичном виде, а пользоваться ассемблером, нужно установить соответвующие инструменты. Руководство по установке ассемблера и сборке программ находится на этой странице.
Теперь можно писать свои собственные тестовые программы. Кроме того, в каталоге samples
находится файл test_v1.s
, из которого можно собрать тестовую программу для этого задания.
Добавьте поддержку команд XORI, ORI и ANDI.
Поскольку эти инструкции выполняют новые операции (^
, |
, &
), нужно добавить их поддеружку в модуль alu
по аналогии с операцией +
. Кроме того, нужно добавить декодирование этих инструкций в модуль control
аналогии с инструкцией ADDI.
Добавьте поддержку команд ADD, XOR, OR и AND.
Эти инструкции выполняют уже определенные в АЛУ операции, поэтому теперь нужно только правильно управлять сигналом alu_op
из модуля control
. Ещё следует добавить в control
декодирование битов [31:25]. Для того, чтобы декодер не обращал внимание на эти биты при декодировании инструкций ADDI, XORI, ORI, ANDI, можно использовать знак ?
вместо 0
или 1
при описании вариантов в блоке case
-endcase
. Кроме того, для этих и других инструкций формата Type-R, в модуле core
нужно подавать операнд АЛУ alu_b_src
не из imm32
, а из rf_rdata1
.
Добавьте инструкции SUB, SLTI, SLTIU, SLL, SLT, SLTU, SRL, SRA, SLLI, SRLI, SRAI.