Skip to content

Commit 73cd137

Browse files
Implement AUIPC, SLTI, and SLTIU
1 parent 4fe72ef commit 73cd137

File tree

1 file changed

+54
-4
lines changed

1 file changed

+54
-4
lines changed

src/main/scala/RISCV/Main.scala

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class Main() extends Module {
9999

100100
switch(decoder.io.operation) {
101101
// LW
102-
is("b010_00000_11".U) {
102+
is("b010_0000011".U) {
103103
regFile.io.read_addr_A := decoder.io.rs1;
104104

105105
memory.readPorts(1).enable := true.B;
@@ -109,7 +109,7 @@ class Main() extends Module {
109109
}
110110

111111
// SW
112-
is("b010_01000_11".U) {
112+
is("b010_0100011".U) {
113113
regFile.io.read_addr_A := decoder.io.rs1;
114114
regFile.io.read_addr_B := decoder.io.rs2;
115115

@@ -124,7 +124,7 @@ class Main() extends Module {
124124
}
125125

126126
// LUI
127-
is("b01101_11".U(7.W)) {
127+
is("b0110111".U) {
128128
regFile.io.write_addr := decoder.io.rd;
129129
regFile.io.write_enable := true.B;
130130
regFile.io.in := decoder.io.immediate;
@@ -135,8 +135,20 @@ class Main() extends Module {
135135
printf("[LUI] Rd: %d Immediate: %b\n", decoder.io.rd, decoder.io.immediate);
136136
}
137137

138+
// AUIPC
139+
is("b0010111".U) {
140+
regFile.io.write_addr := decoder.io.rd;
141+
regFile.io.write_enable := true.B;
142+
regFile.io.in := program_pointer + decoder.io.immediate;
143+
144+
program_pointer := program_pointer + 1.U;
145+
stage := 0.U;
146+
147+
printf("[AUIPC] Rd: %d Immediate: %b\n", decoder.io.rd, decoder.io.immediate);
148+
}
149+
138150
// ADDI
139-
is("b000_00100_11".U(7.W)) {
151+
is("b000_0010011".U) {
140152
regFile.io.read_addr_A := decoder.io.rs1;
141153

142154
regFile.io.write_addr := decoder.io.rd;
@@ -148,6 +160,44 @@ class Main() extends Module {
148160

149161
printf("[ADDI] Rs1: %d Rd: %d Immediate: %b\n", decoder.io.rs1, decoder.io.rd, decoder.io.immediate);
150162
}
163+
164+
// SLTI
165+
is("b010_0010011".U) {
166+
regFile.io.read_addr_A := decoder.io.rs1;
167+
168+
regFile.io.write_addr := decoder.io.rd;
169+
regFile.io.write_enable := true.B;
170+
171+
when(regFile.io.out_A.asSInt() < decoder.io.immediate.asSInt()) {
172+
regFile.io.in := 1.U;
173+
}.otherwise {
174+
regFile.io.in := 0.U;
175+
}
176+
177+
program_pointer := program_pointer + 1.U;
178+
stage := 0.U;
179+
180+
printf("[SLTI] Rs1: %d Rd: %d Immediate: %b\n", decoder.io.rs1, decoder.io.rd, decoder.io.immediate);
181+
}
182+
183+
// SLTIU
184+
is("b011_0010011".U) {
185+
regFile.io.read_addr_A := decoder.io.rs1;
186+
187+
regFile.io.write_addr := decoder.io.rd;
188+
regFile.io.write_enable := true.B;
189+
190+
when(regFile.io.out_A < decoder.io.immediate) {
191+
regFile.io.in := 1.U;
192+
}.otherwise {
193+
regFile.io.in := 0.U;
194+
}
195+
196+
program_pointer := program_pointer + 1.U;
197+
stage := 0.U;
198+
199+
printf("[SLTIU] Rs1: %d Rd: %d Immediate: %b\n", decoder.io.rs1, decoder.io.rd, decoder.io.immediate);
200+
}
151201
}
152202
}
153203

0 commit comments

Comments
 (0)