mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
Завершение работы над пакетами
This commit is contained in:
@@ -273,7 +273,7 @@ endmodule
|
||||
1. В `Design Sources` проекта с предыдущих лаб, создайте `SystemVerilog`-файл `decoder_riscv.sv`.
|
||||
2. Опишите в нем модуль основного дешифратора с таким же именем и портами, как указано в [задании](#задание).
|
||||
1. Для удобства дальнейшего описания модуля, рекомендуется сперва создать сигналы `opcode`, `func3`, `func7` и присвоить им соответствующие биты входного сигнала инструкции.
|
||||
2. При описании модуля вы можете воспользоваться параметрами, объявленными **пакетах** `riscv_pkg`, `csr_pkg`, описанных в файлах [riscv_pkg.sv](riscv_pkg.sv) и [csr_pkg.sv](csr_pkg.sv) соответственно.
|
||||
2. При описании модуля вы можете воспользоваться параметрами, объявленными **пакетах** `riscv_pkg`, `csr_pkg` и `alu_opcodes_pkg`, описанных в файлах [riscv_pkg.sv](riscv_pkg.sv), [csr_pkg.sv](csr_pkg.sv) и [alu_opcodes_pkg.sv](alu_opcodes_pkg.sv) соответственно.
|
||||
3. Модуль может быть описан множеством способов: каждый выходной сигнал может быть описан через собственную комбинационную логику в отдельном блоке `case`, однако проще всего будет описать все сигналы через вложенные `case` внутри одного блока `always_comb`.
|
||||
4. Внутри блока `always_comb` до начала блока `case` можно указать базовые значения для всех выходных сигналов. Это не то же самое, что вариант `default` в блоке `case`. Здесь вы можете описать состояния, которые будут использованы чаще всего, и в этом случае, присваивание сигналу будет выполняться только в том месте, где появится инструкция, требующая значение этого сигнала, отличное от базового.
|
||||
5. Далее вы можете описать базовый блок `case`, где будет определен тип операции по ее коду.
|
||||
|
@@ -6,7 +6,7 @@ package csr_pkg;
|
||||
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;
|
||||
|
@@ -1,44 +1,80 @@
|
||||
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;
|
||||
// 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;
|
||||
|
||||
// operand a selection
|
||||
localparam OP_A_RS1 = 2'b00;
|
||||
localparam OP_A_CURR_PC = 2'b01;
|
||||
localparam OP_A_ZERO = 2'b10;
|
||||
// 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 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;
|
||||
// operand a selection
|
||||
localparam OP_A_RS1 = 2'b00;
|
||||
localparam OP_A_CURR_PC = 2'b01;
|
||||
localparam OP_A_ZERO = 2'b10;
|
||||
|
||||
// writeback source selection
|
||||
localparam WB_EX_RESULT = 2'd0;
|
||||
localparam WB_LSU_DATA = 2'd1;
|
||||
localparam WB_CSR_DATA = 2'd2;
|
||||
// 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;
|
||||
|
||||
endpackage
|
||||
// writeback source selection
|
||||
localparam WB_EX_RESULT = 2'd0;
|
||||
localparam WB_LSU_DATA = 2'd1;
|
||||
localparam WB_CSR_DATA = 2'd2;
|
||||
|
||||
|
||||
/*
|
||||
Hack that makes nested opcodes be
|
||||
visible with just one import of
|
||||
riscv_pkg
|
||||
*/
|
||||
|
||||
export alu_opcodes_pkg::ALU_OP_WIDTH;
|
||||
export alu_opcodes_pkg::ALU_ADD;
|
||||
export alu_opcodes_pkg::ALU_SUB;
|
||||
export alu_opcodes_pkg::ALU_XOR;
|
||||
export alu_opcodes_pkg::ALU_OR;
|
||||
export alu_opcodes_pkg::ALU_AND;
|
||||
export alu_opcodes_pkg::ALU_SRA;
|
||||
export alu_opcodes_pkg::ALU_SRL;
|
||||
export alu_opcodes_pkg::ALU_SLL;
|
||||
export alu_opcodes_pkg::ALU_LTS;
|
||||
export alu_opcodes_pkg::ALU_LTU;
|
||||
export alu_opcodes_pkg::ALU_GES;
|
||||
export alu_opcodes_pkg::ALU_GEU;
|
||||
export alu_opcodes_pkg::ALU_EQ;
|
||||
export alu_opcodes_pkg::ALU_NE;
|
||||
export alu_opcodes_pkg::ALU_SLTS;
|
||||
export alu_opcodes_pkg::ALU_SLTU;
|
||||
|
||||
export csr_pkg::CSR_RW;
|
||||
export csr_pkg::CSR_RS;
|
||||
export csr_pkg::CSR_RC;
|
||||
export csr_pkg::CSR_RWI;
|
||||
export csr_pkg::CSR_RSI;
|
||||
export csr_pkg::CSR_RCI;
|
||||
export csr_pkg::MIE_ADDR;
|
||||
export csr_pkg::MTVEC_ADDR;
|
||||
export csr_pkg::MSCRATCH_ADDR;
|
||||
export csr_pkg::MEPC_ADDR;
|
||||
export csr_pkg::MCAUSE_ADDR;
|
||||
|
||||
endpackage
|
@@ -22,7 +22,6 @@
|
||||
module tb_decoder_riscv();
|
||||
|
||||
import riscv_pkg::*;
|
||||
import alu_opcodes_pkg::*;
|
||||
parameter delay = 4;
|
||||
parameter cycle = 200; // per one opcode
|
||||
|
||||
@@ -42,7 +41,7 @@ module tb_decoder_riscv();
|
||||
wire jal;
|
||||
wire jalr;
|
||||
wire mret;
|
||||
|
||||
|
||||
reg a_sel_miss;
|
||||
reg b_sel_miss;
|
||||
reg alu_op_miss;
|
||||
|
Reference in New Issue
Block a user