diff --git a/Labs/02. Arithmetic-logic unit/alu_opcodes_pkg.sv b/Labs/02. Arithmetic-logic unit/alu_opcodes_pkg.sv index 5089af6..d09db8f 100644 --- a/Labs/02. Arithmetic-logic unit/alu_opcodes_pkg.sv +++ b/Labs/02. Arithmetic-logic unit/alu_opcodes_pkg.sv @@ -1,28 +1,28 @@ package alu_opcodes_pkg; -parameter ALU_OP_WIDTH = 5; +localparam ALU_OP_WIDTH = 5; -parameter ALU_ADD = 5'b00000; -parameter ALU_SUB = 5'b01000; +localparam ALU_ADD = 5'b00000; +localparam ALU_SUB = 5'b01000; -parameter ALU_XOR = 5'b00100; -parameter ALU_OR = 5'b00110; -parameter ALU_AND = 5'b00111; +localparam ALU_XOR = 5'b00100; +localparam ALU_OR = 5'b00110; +localparam ALU_AND = 5'b00111; // shifts -parameter ALU_SRA = 5'b01101; -parameter ALU_SRL = 5'b00101; -parameter ALU_SLL = 5'b00001; +localparam ALU_SRA = 5'b01101; +localparam ALU_SRL = 5'b00101; +localparam ALU_SLL = 5'b00001; // comparisons -parameter ALU_LTS = 5'b11100; -parameter ALU_LTU = 5'b11110; -parameter ALU_GES = 5'b11101; -parameter ALU_GEU = 5'b11111; -parameter ALU_EQ = 5'b11000; -parameter ALU_NE = 5'b11001; +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 -parameter ALU_SLTS = 5'b00010; -parameter ALU_SLTU = 5'b00011; +localparam ALU_SLTS = 5'b00010; +localparam ALU_SLTU = 5'b00011; -endpackage +endpackage \ No newline at end of file diff --git a/Labs/05. Main decoder/README.md b/Labs/05. Main decoder/README.md index f332f45..d82f652 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`, описанном в файле [riscv_pkg.sv](riscv_pkg.sv). + 2. При описании модуля вы можете воспользоваться параметрами, объявленными **пакетах** `riscv_pkg`, `csr_pkg`, описанных в файлах [riscv_pkg.sv](riscv_pkg.sv) и [csr_pkg.sv](csr_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 new file mode 100644 index 0000000..bf37986 --- /dev/null +++ b/Labs/05. Main decoder/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/05. Main decoder/riscv_pkg.sv b/Labs/05. Main decoder/riscv_pkg.sv index ec80b81..df56313 100644 --- a/Labs/05. Main decoder/riscv_pkg.sv +++ b/Labs/05. Main decoder/riscv_pkg.sv @@ -1,41 +1,44 @@ package riscv_pkg; import alu_opcodes_pkg::*; - + export alu_opcodes_pkg::*; + import csr_pkg::*; + export csr_pkg::*; // opcodes -parameter LOAD_OPCODE = 5'b00_000; -parameter MISC_MEM_OPCODE = 5'b00_011; -parameter OP_IMM_OPCODE = 5'b00_100; -parameter AUIPC_OPCODE = 5'b00_101; -parameter STORE_OPCODE = 5'b01_000; -parameter OP_OPCODE = 5'b01_100; -parameter LUI_OPCODE = 5'b01_101; -parameter BRANCH_OPCODE = 5'b11_000; -parameter JALR_OPCODE = 5'b11_001; -parameter JAL_OPCODE = 5'b11_011; -parameter SYSTEM_OPCODE = 5'b11_100; +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 -parameter LDST_B = 3'b000; -parameter LDST_H = 3'b001; -parameter LDST_W = 3'b010; -parameter LDST_BU = 3'b100; -parameter LDST_HU = 3'b101; +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 -parameter OP_A_RS1 = 2'b00; -parameter OP_A_CURR_PC = 2'b01; -parameter OP_A_ZERO = 2'b10; +localparam OP_A_RS1 = 2'b00; +localparam OP_A_CURR_PC = 2'b01; +localparam OP_A_ZERO = 2'b10; // operand b selection -parameter OP_B_RS2 = 3'b000; -parameter OP_B_IMM_I = 3'b001; -parameter OP_B_IMM_U = 3'b010; -parameter OP_B_IMM_S = 3'b011; -parameter OP_B_INCR = 3'b100; +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 -parameter WB_EX_RESULT = 1'b0; -parameter WB_LSU_DATA = 1'b1; +localparam WB_EX_RESULT = 2'd0; +localparam WB_LSU_DATA = 2'd1; +localparam WB_CSR_DATA = 2'd2; -endpackage \ No newline at end of file +endpackage diff --git a/Labs/10. Interrupt subsystem/csr_pkg.sv b/Labs/10. Interrupt subsystem/csr_pkg.sv new file mode 100644 index 0000000..bf37986 --- /dev/null +++ b/Labs/10. Interrupt subsystem/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