diff --git a/Labs/05. Main decoder/alu_opcodes_pkg.sv b/Labs/05. Main decoder/alu_opcodes_pkg.sv new file mode 100644 index 0000000..d09db8f --- /dev/null +++ b/Labs/05. Main decoder/alu_opcodes_pkg.sv @@ -0,0 +1,28 @@ +package alu_opcodes_pkg; +localparam ALU_OP_WIDTH = 5; + +localparam ALU_ADD = 5'b00000; +localparam ALU_SUB = 5'b01000; + +localparam ALU_XOR = 5'b00100; +localparam ALU_OR = 5'b00110; +localparam ALU_AND = 5'b00111; + +// shifts +localparam ALU_SRA = 5'b01101; +localparam ALU_SRL = 5'b00101; +localparam ALU_SLL = 5'b00001; + +// comparisons +localparam ALU_LTS = 5'b11100; +localparam ALU_LTU = 5'b11110; +localparam ALU_GES = 5'b11101; +localparam ALU_GEU = 5'b11111; +localparam ALU_EQ = 5'b11000; +localparam ALU_NE = 5'b11001; + +// set lower than operations +localparam ALU_SLTS = 5'b00010; +localparam ALU_SLTU = 5'b00011; + +endpackage \ No newline at end of file diff --git a/Labs/06. Datapath/README.md b/Labs/06. Datapath/README.md index 6408e32..70dfb7f 100644 --- a/Labs/06. Datapath/README.md +++ b/Labs/06. Datapath/README.md @@ -17,11 +17,32 @@ ### riscv_core -Рассмотрим микроархитектуру процессорного ядра `riscv_core`. +Рассмотрим микроархитектуру процессорного ядра `riscv_core`. Данный модуль обладает следующим прототипом и микроархитектурой: + +```SystemVerilog +module riscv_core ( + + input logic clk_i, + input logic rst_i, + + input logic stall_i, + input logic [31:0] instr_i, + input logic [31:0] mem_rd_i, + + output logic [31:0] instr_addr_o, + output logic [31:0] mem_addr_o, + output logic [ 2:0] mem_size_o, + output logic mem_req_o, + output logic mem_we_o, + output logic [31:0] mem_wd_o +); + +endmodule +``` ![../../.pic/Labs/lab_06_dp/fig_01.drawio.png](../../.pic/Labs/lab_06_dp/fig_01.drawio.png) -В отличие от реализованного ранее процессора с архитектурой Cybercobra, в данном модуле отсутствует память (она подключается извне, а значит у этого модуля должны быть сигналы интерфейса памяти). +В отличие от реализованного ранее процессора с архитектурой CYBERcobra, в данном модуле отсутствует память (она подключается извне, а значит у этого модуля должны быть сигналы интерфейса памяти). Кроме того, в данной микроархитектуре используется пять различных видов констант (соответствующих определенным типам инструкций). @@ -37,6 +58,15 @@ После реализации процессорного ядра, к нему необходимо подключить память. Это происходит в модуле `riscv_unit`. +```SystemVerilog +module riscv_unit( + input logic clk_i, + input logic resetn_i +); + +endmodule +``` + ![../../.pic/Labs/lab_06_dp/fig_02.drawio.png](../../.pic/Labs/lab_06_dp/fig_02.drawio.png) Обратите внимание на регистр `stall`. Этот регистр и будет управлять разрешением на запись в программный счетчик `PC`. Поскольку мы используем блочную память, расположенную прямо в ПЛИС, доступ к ней осуществляется за 1 такт, а значит, что при обращении в память, нам необходимо "отключить" программный счетчик ровно на 1 такт. Если бы использовалась действительно "внешняя" память (например чип DDR3), то вместо этого регистра появилась бы другая логика, выставляющая на вход ядра `stall_i` единицу пока идет обращение в память. diff --git a/Labs/06. Datapath/alu_opcodes_pkg.sv b/Labs/06. Datapath/alu_opcodes_pkg.sv new file mode 100644 index 0000000..d09db8f --- /dev/null +++ b/Labs/06. Datapath/alu_opcodes_pkg.sv @@ -0,0 +1,28 @@ +package alu_opcodes_pkg; +localparam ALU_OP_WIDTH = 5; + +localparam ALU_ADD = 5'b00000; +localparam ALU_SUB = 5'b01000; + +localparam ALU_XOR = 5'b00100; +localparam ALU_OR = 5'b00110; +localparam ALU_AND = 5'b00111; + +// shifts +localparam ALU_SRA = 5'b01101; +localparam ALU_SRL = 5'b00101; +localparam ALU_SLL = 5'b00001; + +// comparisons +localparam ALU_LTS = 5'b11100; +localparam ALU_LTU = 5'b11110; +localparam ALU_GES = 5'b11101; +localparam ALU_GEU = 5'b11111; +localparam ALU_EQ = 5'b11000; +localparam ALU_NE = 5'b11001; + +// set lower than operations +localparam ALU_SLTS = 5'b00010; +localparam ALU_SLTU = 5'b00011; + +endpackage \ No newline at end of file diff --git a/Labs/06. Datapath/csr_pkg.sv b/Labs/06. Datapath/csr_pkg.sv new file mode 100644 index 0000000..c863719 --- /dev/null +++ b/Labs/06. Datapath/csr_pkg.sv @@ -0,0 +1,16 @@ +package csr_pkg; + + localparam CSR_RW = 3'b001; + localparam CSR_RS = 3'b010; + localparam CSR_RC = 3'b011; + localparam CSR_RWI = 3'b101; + localparam CSR_RSI = 3'b110; + localparam CSR_RCI = 3'b111; + + localparam MIE_ADDR = 12'h304; + localparam MTVEC_ADDR = 12'h305; + localparam MSCRATCH_ADDR = 12'h340; + localparam MEPC_ADDR = 12'h341; + localparam MCAUSE_ADDR = 12'h342; + +endpackage diff --git a/Labs/06. Datapath/riscv_pkg.sv b/Labs/06. Datapath/riscv_pkg.sv new file mode 100644 index 0000000..df56313 --- /dev/null +++ b/Labs/06. Datapath/riscv_pkg.sv @@ -0,0 +1,44 @@ +package riscv_pkg; + + import alu_opcodes_pkg::*; + export alu_opcodes_pkg::*; + import csr_pkg::*; + export csr_pkg::*; +// opcodes +localparam LOAD_OPCODE = 5'b00_000; +localparam MISC_MEM_OPCODE = 5'b00_011; +localparam OP_IMM_OPCODE = 5'b00_100; +localparam AUIPC_OPCODE = 5'b00_101; +localparam STORE_OPCODE = 5'b01_000; +localparam OP_OPCODE = 5'b01_100; +localparam LUI_OPCODE = 5'b01_101; +localparam BRANCH_OPCODE = 5'b11_000; +localparam JALR_OPCODE = 5'b11_001; +localparam JAL_OPCODE = 5'b11_011; +localparam SYSTEM_OPCODE = 5'b11_100; + +// dmem type load store +localparam LDST_B = 3'b000; +localparam LDST_H = 3'b001; +localparam LDST_W = 3'b010; +localparam LDST_BU = 3'b100; +localparam LDST_HU = 3'b101; + +// operand a selection +localparam OP_A_RS1 = 2'b00; +localparam OP_A_CURR_PC = 2'b01; +localparam OP_A_ZERO = 2'b10; + +// operand b selection +localparam OP_B_RS2 = 3'b000; +localparam OP_B_IMM_I = 3'b001; +localparam OP_B_IMM_U = 3'b010; +localparam OP_B_IMM_S = 3'b011; +localparam OP_B_INCR = 3'b100; + +// writeback source selection +localparam WB_EX_RESULT = 2'd0; +localparam WB_LSU_DATA = 2'd1; +localparam WB_CSR_DATA = 2'd2; + +endpackage