mirror of
https://github.com/MPSU/APS.git
synced 2025-09-16 01:30:10 +00:00
ЛР6. Добавление прототипов модулей
This commit is contained in:
28
Labs/05. Main decoder/alu_opcodes_pkg.sv
Normal file
28
Labs/05. Main decoder/alu_opcodes_pkg.sv
Normal file
@@ -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
|
@@ -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
|
||||
```
|
||||
|
||||

|
||||
|
||||
В отличие от реализованного ранее процессора с архитектурой Cybercobra, в данном модуле отсутствует память (она подключается извне, а значит у этого модуля должны быть сигналы интерфейса памяти).
|
||||
В отличие от реализованного ранее процессора с архитектурой CYBERcobra, в данном модуле отсутствует память (она подключается извне, а значит у этого модуля должны быть сигналы интерфейса памяти).
|
||||
|
||||
Кроме того, в данной микроархитектуре используется пять различных видов констант (соответствующих определенным типам инструкций).
|
||||
|
||||
@@ -37,6 +58,15 @@
|
||||
|
||||
После реализации процессорного ядра, к нему необходимо подключить память. Это происходит в модуле `riscv_unit`.
|
||||
|
||||
```SystemVerilog
|
||||
module riscv_unit(
|
||||
input logic clk_i,
|
||||
input logic resetn_i
|
||||
);
|
||||
|
||||
endmodule
|
||||
```
|
||||
|
||||

|
||||
|
||||
Обратите внимание на регистр `stall`. Этот регистр и будет управлять разрешением на запись в программный счетчик `PC`. Поскольку мы используем блочную память, расположенную прямо в ПЛИС, доступ к ней осуществляется за 1 такт, а значит, что при обращении в память, нам необходимо "отключить" программный счетчик ровно на 1 такт. Если бы использовалась действительно "внешняя" память (например чип DDR3), то вместо этого регистра появилась бы другая логика, выставляющая на вход ядра `stall_i` единицу пока идет обращение в память.
|
||||
|
28
Labs/06. Datapath/alu_opcodes_pkg.sv
Normal file
28
Labs/06. Datapath/alu_opcodes_pkg.sv
Normal file
@@ -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
|
16
Labs/06. Datapath/csr_pkg.sv
Normal file
16
Labs/06. Datapath/csr_pkg.sv
Normal file
@@ -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
|
44
Labs/06. Datapath/riscv_pkg.sv
Normal file
44
Labs/06. Datapath/riscv_pkg.sv
Normal file
@@ -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
|
Reference in New Issue
Block a user