Skip to content

Commit 153c549

Browse files
implement slli, srli, and srai
1 parent 1897b1b commit 153c549

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

src/main/scala/RISCV/Main.scala

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,14 +270,52 @@ class Main() extends Module {
270270

271271
printf("[SUB] Rs1: %d Rs2: %d Rd: %d\n", decoder.io.rs1, decoder.io.rs2, decoder.io.rd);
272272
}
273+
274+
// SLLI
275+
is("b001_0010011".U) {
276+
registers.io.read_address_a := decoder.io.rs1;
277+
278+
registers.io.write_address := decoder.io.rd;
279+
registers.io.write_enable := true.B;
280+
registers.io.in := registers.io.out_a << decoder.io.immediate(5, 0);
281+
282+
program_pointer := program_pointer + 1.U;
283+
stage := 0.U;
284+
285+
printf("[SLLI] Rs1: %d Rd: %d Shift: %d\n", decoder.io.rs1, decoder.io.rd, decoder.io.immediate(5, 0));
286+
}
287+
288+
// SRLI and SRAI
289+
is("b101_0010011".U) {
290+
registers.io.read_address_a := decoder.io.rs1;
291+
292+
registers.io.write_address := decoder.io.rd;
293+
registers.io.write_enable := true.B;
294+
295+
when(decoder.io.immediate(10) === 1.U) { // SRAI
296+
registers.io.in := (registers.io.out_a.asSInt >> decoder.io.immediate(5, 0)).asUInt;
297+
}.otherwise { // SLAI
298+
registers.io.in := registers.io.out_a >> decoder.io.immediate(5, 0);
299+
}
300+
301+
program_pointer := program_pointer + 1.U;
302+
stage := 0.U;
303+
304+
when(decoder.io.immediate(10) === 1.U) { // SRAI
305+
printf("[SRAI] Rs1: %d Rd: %d Shift: %d\n", decoder.io.rs1, decoder.io.rd, decoder.io.immediate(5, 0));
306+
}.otherwise { // SLAI
307+
printf("[SRLI] Rs1: %d Rd: %d Shift: %d\n", decoder.io.rs1, decoder.io.rd, decoder.io.immediate(5, 0));
308+
}
309+
}
273310
}
274311
}
275312

276313
when(stage === 2.U) {
277314
stage := 0.U;
278315

279316
switch(operation_buffer) {
280-
is("b010_00000_11".U) {
317+
// LW
318+
is("b010_0000011".U) {
281319
registers.io.write_address := rd_buffer;
282320
registers.io.write_enable := true.B;
283321
registers.io.in := memory.readPorts(1).data;

src/test/scala/RISCV/MainSpec.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ class MainSpec extends AnyFreeSpec with Matchers with ChiselSim {
2626

2727
dut.clock.step(1);
2828

29+
dut.io.debug_write.poke(true.B);
30+
dut.io.debug_write_data.poke("b0100000_00001_00001_101_00010_0010011".U(32.W));
31+
dut.io.debug_write_addressess.poke(3.U);
32+
33+
dut.clock.step(1);
34+
2935
dut.io.debug_write.poke(false.B);
3036
dut.io.execute.poke(true.B);
3137

@@ -38,6 +44,8 @@ class MainSpec extends AnyFreeSpec with Matchers with ChiselSim {
3844
dut.clock.step(1);
3945
dut.clock.step(1);
4046
dut.clock.step(1);
47+
dut.clock.step(1);
48+
dut.clock.step(1);
4149
}
4250
}
4351
}

0 commit comments

Comments
 (0)