Skip to content

Commit 1ae4b56

Browse files
committed
[Feat] Revise Instruction Memory by bringing back old testbenches
1 parent d3b8cec commit 1ae4b56

1 file changed

Lines changed: 20 additions & 24 deletions

File tree

RV32I/modules/Instruction_Memory.v

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ module InstructionMemory (
1515

1616
initial begin
1717
// ──────────────────────────────────────────────
18-
// I타입 ALU 명령어 (9개)
18+
// I-타입 ALU 명령어 (9개)
1919
// {imm[11:0], rs1, funct3, rd, OPCODE_ITYPE}
2020
data[0] = {12'h2BC, 5'd0, `ITYPE_ADDI, 5'd1, `OPCODE_ITYPE}; // ADDI: x1 = x0 + 2BC = 000002BC
2121
data[1] = {12'd24, 5'd1, `ITYPE_SLLI, 5'd2, `OPCODE_ITYPE}; // SLLI: x2 = x1 << 24 = BC000000
@@ -28,7 +28,7 @@ module InstructionMemory (
2828
data[8] = {12'h0EC, 5'd5, `ITYPE_ANDI, 5'd9, `OPCODE_ITYPE}; // ANDI: x9 = x5 AND 0EC = 000000EC
2929

3030
// ──────────────────────────────────────────────
31-
// R타입 명령어 (10개)
31+
// R-타입 명령어 (10개)
3232
// {funct7, rs2, rs1, funct3, rd, OPCODE_RTYPE}
3333
data[9] = {7'b0000000, 5'd9, 5'd1, `RTYPE_ADDSUB, 5'd10, `OPCODE_RTYPE}; // ADD: x10 = x1 + x9 = 000003A8
3434
data[10] = {7'b0100000, 5'd5, 5'd6, `RTYPE_ADDSUB, 5'd11, `OPCODE_RTYPE}; // SUB: x11 = x6 - x5 = 0BBFFB11
@@ -42,14 +42,14 @@ module InstructionMemory (
4242
data[18] = {7'b0000000, 5'd11, 5'd7, `RTYPE_AND, 5'd19, `OPCODE_RTYPE}; // AND: x19 = x7 AND x11 = 0B800000
4343

4444
// ──────────────────────────────────────────────
45-
// S타입 명령어 (스토어) (3개)
45+
// S-타입 명령어 (스토어) (3개)
4646
// {imm[11:5], rs2, rs1, funct3, imm[4:0], OPCODE_STORE}
4747
data[19] = {7'd0, 5'd11, 5'd1, `STORE_SW, 5'd4, `OPCODE_STORE}; // SW: mem[x1+4 = 2C0] = (x11 = 0BBFFB11) -> 0BBFFB11
4848
data[20] = {7'd0, 5'd10, 5'd1, `STORE_SH, 5'd7, `OPCODE_STORE}; // SH: mem[x1+7 = 2C3 (write nothing)] = (x10[15:0] = 03A8) -> 0BBFFB11 // Misaligned Memory exception. NOPs and goes to Trap Handler.
4949
data[21] = {7'd0, 5'd15, 5'd1, `STORE_SB, 5'd4, `OPCODE_STORE}; // SB: mem[x1+4 = 2C0] = (x15[7:0] = BC) -> 0BBFFBBC
5050

5151
// ──────────────────────────────────────────────
52-
// I타입 로드 명령어 (5개)
52+
// I-타입 로드 명령어 (5개)
5353
// {imm[11:0], rs1, funct3, rd, OPCODE_LOAD}
5454
data[22] = {12'd5, 5'd1, `LOAD_LW, 5'd20, `OPCODE_LOAD}; // LW: x20 = mem[x1+5 = 2C1] = 0BBFFBBC // Misaligned Memory exception. NOPs and goes to Trap Handler.
5555
data[23] = {12'd4, 5'd1, `LOAD_LH, 5'd21, `OPCODE_LOAD}; // LH: x21 = (mem[x1+4 = 2C0])[15:0] = FBBC (FFFFFBBC)
@@ -58,24 +58,24 @@ module InstructionMemory (
5858
data[26] = {12'd4, 5'd1, `LOAD_LBU, 5'd24, `OPCODE_LOAD}; // LBU: x24 = (mem[x1+4 = 2C0])[7:0] = BC (000000BC)
5959

6060
// ──────────────────────────────────────────────
61-
// U타입 명령어 (2개)
61+
// U-타입 명령어 (2개)
6262
// {imm[31:12], rd, OPCODE_LUI/OPCODE_AUIPC}
6363
data[27] = {20'd1, 5'd25, `OPCODE_LUI}; // LUI: x25 = 00001000
6464
data[28] = {20'd1, 5'd26, `OPCODE_AUIPC}; // AUIPC: x26 = 00000070 + 00001000 = 00001070
6565

6666
// ──────────────────────────────────────────────
67-
// J타입 명령어 (1개)
67+
// J-타입 명령어 (1개)
6868
// {imm[20|10:1|11|19:12], rd, OPCODE_JAL}
6969
data[29] = {20'b0_0000001111_0_00000000, 5'd27, `OPCODE_JAL}; // JAL: PC + 0000001E = 00000092 (but jump to 00000090), x27 = PC + 4 = 00000078
7070
// But since this instruction occurs exception, It's handled as NOP.
7171

7272
// ──────────────────────────────────────────────
73-
// I타입 점프 (JALR) 명령어 (1개)
73+
// I-타입 점프 (JALR) 명령어 (1개)
7474
// {imm[11:0], rs1, funct3, rd, OPCODE_JALR}
7575
data[36] = {12'd0, 5'd27, 3'b000, 5'd28, `OPCODE_JALR}; // JALR: x28 = PC + 4 = 00000094; PC = x27 + 00000000 = 00000078
7676

7777
// ──────────────────────────────────────────────
78-
// B타입 명령어 (분기) (6개)
78+
// B-타입 명령어 (분기) (6개)
7979
// {imm[12], imm[10:5], rs2, rs1, funct3, imm[4:1], imm[11], OPCODE_BRANCH}
8080
data[30] = {1'b0, 6'd0, 5'd2, 5'd1, `BRANCH_BEQ, 4'b0100, 1'b0, `OPCODE_BRANCH}; // BEQ: if(x1 == x2) branch offset = 8 Not Taken
8181
data[31] = {1'b0, 6'd0, 5'd13, 5'd0, `BRANCH_BNE, 4'b0100, 1'b0, `OPCODE_BRANCH}; // BNE: if(x0 != x13) branch offset = 8 Not Taken
@@ -89,10 +89,10 @@ module InstructionMemory (
8989
// {imm[11:0], rs1(uimm), funct3, rd, OPCODE_ENVIRONMENT} ┌-> Illegal instruction, F11 is not writable but only READ now.
9090
data[37] = {12'hF11, 5'd28, `CSR_CSRRW, 5'd20, `OPCODE_ENVIRONMENT}; // CSRRW : x28 = 0000_0000; x20 = 5256_4B43 <= CSR[F11] = 5256_4B43 // R[x20] = 5256_4B43.
9191
data[38] = {12'h341, 5'd1, `CSR_CSRRS, 5'd21, `OPCODE_ENVIRONMENT}; // CSRRS: x1 = 0000_02BC; CSR[341] = 0000_0074. // R[x21] = 0000_0074, CSR[341] = 0000_02fc
92-
data[39] = {12'h341, 5'd20, `CSR_CSRRC, 5'd21, `OPCODE_ENVIRONMENT}; // CSRRC: x21 = 0000_0074, x20 = 5256_4B43, CSR[341] = 0000_02fc. // R[x21] = 0000_02fc, CSR[341] = 0000_00BC // Verified
92+
data[39] = {12'h341, 5'd20, `CSR_CSRRC, 5'd21, `OPCODE_ENVIRONMENT}; // CSRRC: x21 = 0000_0074, x20 = 5256_4B43, CSR[341] = 0000_02fc. // R[x21] = 0000_02fc, CSR[341] = 0000_00BC
9393
data[40] = {12'h342, 5'd3, `CSR_CSRRWI, 5'd22, `OPCODE_ENVIRONMENT}; // CSRRWI: x22 = FFFF_FFBC, CSR[342] = 0000_0000; // R[x22] = 0000_0000, CSR[342] = 0000_0003
9494
data[41] = {12'h305, 5'd7, `CSR_CSRRSI, 5'd22, `OPCODE_ENVIRONMENT}; // CSRRSI: x22 = 0000_0000, CSR[305] = 0000_1000; // R[x22] = 0000_1000, CSR[305] = 0000_1007
95-
data[42] = {12'h305, 5'b11111, `CSR_CSRRCI, 5'd23, `OPCODE_ENVIRONMENT}; // CSRRCI: uimm = 11111, CSR[305] = 0000_1007; // R[x23] = 0000_1007, CSR[305] = 0000_1000
95+
data[42] = {12'h305, 5'b11111, `CSR_CSRRCI, 5'd23, `OPCODE_ENVIRONMENT}; // CSRRCI: uimm = 11111, CSR[305] = 0000_1007; // R[x23] = 0000_1007, CSR[305] = 0000_1000 // CSR Verified but not REG
9696
// ──────────────────────────────────────────────
9797
// I-타입 HINT 명령어 (CSR 동작 확인)
9898
// {imm[11:0], rs1, funct3, rd, OPCODE_ITYPE}
@@ -105,7 +105,7 @@ module InstructionMemory (
105105

106106
// ──────────────────────────────────────────────
107107
// Debug Interface 명령어 수행을 위한 전초 작업. 기존 x22 값 FFFF_FFBC 값을 더하는 ADD 명령어를 DI에서 수행할 예정
108-
data[47] = {20'd0, 5'd22, `OPCODE_LUI}; // LUI: x22 = FFFF_F000
108+
data[47] = {20'd0, 5'd22, `OPCODE_LUI}; // LUI: x22 = 0000_0000
109109
data[48] = {12'hFBC, 5'd22, `ITYPE_ADDI, 5'd22, `OPCODE_ITYPE}; // ADDI x22 = x22 -FBC = FFFF_FFBC
110110
data[49] = {20'hABADC, 5'd23, `OPCODE_LUI}; // LUI: x23 = ABAD_C000
111111
data[50] = {12'hB02, 5'd23, `ITYPE_ADDI, 5'd23, `OPCODE_ITYPE}; // ADDI: x23 = x23 + -4FE = ABAD_BB02
@@ -122,29 +122,25 @@ module InstructionMemory (
122122
data[1024] = {12'h342, 5'd0, 3'b010, 5'd6, `OPCODE_ENVIRONMENT}; // csrrs x6, mcause, x0: 레지스터 x6에 mcause값 적재
123123
data[1025] = {12'd11, 5'd0, `ITYPE_ADDI, 5'd7, `OPCODE_ITYPE}; // addi x7, x0, 11: 레지스터 x7에 ECALL 코드 값 11 적재 (mcause가 11인지 비교하기 위해서는 해당 11이라는 값을 레지스터 넣고 레지스터끼리 비교해야하므로)
124124
data[1026] = {12'd2, 5'd0, `ITYPE_ADDI, 5'd8, `OPCODE_ITYPE}; // addi x8, x0, 2: 레지스터 x8에 ILLEGAL INSTRUCTION 코드 값 2 적재 (mcause가 2인지 비교하기 위해서는 해당 2이라는 값을 레지스터 넣고 레지스터끼리 비교해야하므로)
125-
data[1027] = {12'd4, 5'd0, `ITYPE_ADDI, 5'd9, `OPCODE_ITYPE}; // addi x9, x0, 4: 레지스터 x8에 MISALIGNED LOAD 코드 값 4 적재 (mcause가 2인지 비교하기 위해서는 해당 2이라는 값을 레지스터 넣고 레지스터끼리 비교해야하므로)
126-
data[1028] = {12'd6, 5'd0, `ITYPE_ADDI, 5'd10, `OPCODE_ITYPE}; // addi x10, x0, 6: 레지스터 x8에 MISALIGNED STORE 코드 값 6 적재 (mcause가 2인지 비교하기 위해서는 해당 2이라는 값을 레지스터 넣고 레지스터끼리 비교해야하므로)
127125

128126
// mcause 분석해서 해당하는 Trap Handler 주소로 분기
129-
data[1029] = {1'b0, 6'd0, 5'd7, 5'd6, `BRANCH_BEQ, 4'b1100, 1'b0, `OPCODE_BRANCH}; // beq x6, x7, +24: ECALL; x6과 x7이 같다면 12바이트 이후 주솟값으로 분기 = data[1031]
130-
data[1030] = {1'b0, 6'd0, 5'd0, 5'd6, `BRANCH_BEQ, 4'b1110, 1'b0, `OPCODE_BRANCH}; // beq x6, x0, +28: MISALIGNED INSTRUCTION; x6값이 0과 같다면 16바이트 이후 주솟값으로 분기 = data[1033]
131-
data[1031] = {1'b0, 6'd0, 5'd10, 5'd6, `BRANCH_BEQ, 4'b1100, 1'b0, `OPCODE_BRANCH}; // beq x6, x10, +24: MISALIGNED STORE; x6값이 0과 같다면 16바이트 이후 주솟값으로 분기 = data[1033]
132-
data[1032] = {1'b0, 6'd0, 5'd9, 5'd6, `BRANCH_BEQ, 4'b1010, 1'b0, `OPCODE_BRANCH}; // beq x6, x9, +20: MISALIGNED LOAD; x6값이 0과 같다면 16바이트 이후 주솟값으로 분기 = data[1033]
133-
data[1033] = {1'b0, 6'd0, 5'd8, 5'd6, `BRANCH_BEQ, 4'b1000, 1'b0, `OPCODE_BRANCH}; // beq x6, x8, +16: ILLEGAL; x6값이 x8과 같다면 16바이트 이후 주솟값으로 분기 = data[1033]
134-
data[1034] = {1'b0, 10'b000_0001_000, 1'b0, 8'b0, 5'd0, `OPCODE_JAL}; // jal x0, +16: TH 끝내기 (mret 명령어 주소로 가기)
127+
data[1027] = {1'b0, 6'd0, 5'd7, 5'd6, `BRANCH_BEQ, 4'b1000, 1'b0, `OPCODE_BRANCH}; // beq x6, x7, +16: ECALL; x6과 x7이 같다면 12바이트 이후 주솟값으로 분기 = data[1031]
128+
data[1028] = {1'b0, 6'd0, 5'd0, 5'd6, `BRANCH_BEQ, 4'b1010, 1'b0, `OPCODE_BRANCH}; // beq x6, x0, +20: MISALIGNED; x6값이 0과 같다면 16바이트 이후 주솟값으로 분기 = data[1033]
129+
data[1029] = {1'b0, 6'd0, 5'd0, 5'd6, `BRANCH_BEQ, 4'b1000, 1'b0, `OPCODE_BRANCH}; // beq x6, x8, +16: ILLEGAL; x6값이 x8과 같다면 16바이트 이후 주솟값으로 분기 = data[1033]
130+
data[1030] = {1'b0, 10'b000_0001_000, 1'b0, 8'b0, 5'd0, `OPCODE_JAL}; // jal x0, +16: TH 끝내기 (mret 명령어 주소로 가기)
135131

136132
// ECALL Trap Handler @ data[1029]
137-
data[1035] = {12'd0, 5'd0, `ITYPE_ADDI, 5'd1, `OPCODE_ITYPE}; //addi x1, x0, 0: 레지스터 x1 값 0으로 비우기
138-
data[1036] = {1'b0, 10'b000_0000_100, 1'b0, 8'b0, 5'd0, `OPCODE_JAL}; //jal x0, +8: TH 끝내기 (mret 명령어 주소로 가기)
133+
data[1031] = {12'd0, 5'd0, `ITYPE_ADDI, 5'd1, `OPCODE_ITYPE}; //addi x1, x0, 0: 레지스터 x1 값 0으로 비우기
134+
data[1032] = {1'b0, 10'b000_0000_100, 1'b0, 8'b0, 5'd0, `OPCODE_JAL}; //jal x0, +8: TH 끝내기 (mret 명령어 주소로 가기)
139135

140136
// ILLEGAL / MISALIGNED Trap Handler @ data[1031]
141-
data[1037] = {12'hFF, 5'd2, `ITYPE_ADDI, 5'd30, `OPCODE_ITYPE}; //addi x30, x2, 255: x30 레지스터에 x2(BC00_0000) + 0xFF = bc00_00ff
137+
data[1033] = {12'hFF, 5'd2, `ITYPE_ADDI, 5'd30, `OPCODE_ITYPE}; //addi x30, x2, 255: x30 레지스터에 x2(BC00_0000) + 0xFF = bc00_00ff
142138

143139
// ESCAPE Trap Handler @ data[1032]
144-
data[1038] = {12'b001100000010, 5'b0, 3'b0, 5'b0, `OPCODE_ENVIRONMENT}; //MRET: PC = CSR[mepc]
140+
data[1034] = {12'b001100000010, 5'b0, 3'b0, 5'b0, `OPCODE_ENVIRONMENT}; //MRET: PC = CSR[mepc]
145141

146142
// HINT; NOP for 'x' signal after MRET in pipeline
147-
data[1039] = {12'h2BC, 5'd0, `ITYPE_ADDI, 5'd0, `OPCODE_ITYPE}; // ADDI: x0 = x0 + 2BC = 0000_0000
143+
data[1035] = {12'h2BC, 5'd0, `ITYPE_ADDI, 5'd0, `OPCODE_ITYPE}; // ADDI: x0 = x0 + 2BC = 0000_0000
148144
end
149145

150146
always @(*) begin

0 commit comments

Comments
 (0)