diff --git a/Labs/05. Main decoder/README.md b/Labs/05. Main decoder/README.md index d82f652c..9b900e7c 100644 --- a/Labs/05. Main decoder/README.md +++ b/Labs/05. Main decoder/README.md @@ -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`, где будет определен тип операции по ее коду. diff --git a/Labs/05. Main decoder/csr_pkg.sv b/Labs/05. Main decoder/csr_pkg.sv index bf37986f..a0fefebf 100644 --- a/Labs/05. Main decoder/csr_pkg.sv +++ b/Labs/05. Main decoder/csr_pkg.sv @@ -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; diff --git a/Labs/05. Main decoder/riscv_pkg.sv b/Labs/05. Main decoder/riscv_pkg.sv index df56313b..9f68d247 100644 --- a/Labs/05. Main decoder/riscv_pkg.sv +++ b/Labs/05. Main decoder/riscv_pkg.sv @@ -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; - -// 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 + + // 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; + + + /* + 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 \ No newline at end of file diff --git a/Labs/05. Main decoder/tb_decoder_riscv.sv b/Labs/05. Main decoder/tb_decoder_riscv.sv index 2653426e..3af4d692 100644 --- a/Labs/05. Main decoder/tb_decoder_riscv.sv +++ b/Labs/05. Main decoder/tb_decoder_riscv.sv @@ -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;