Skip to content

Commit 073d8d5

Browse files
implement srl and sra
1 parent 5147b78 commit 073d8d5

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

documentation/Modules/Hart.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ Currently only the `LW` instruction uses stage 2, since in stage 1 `LW` requests
2727
- [x] SLT
2828
- [x] SLTU
2929
- [x] XOR
30-
- [ ] SRL
31-
- [ ] SRA
30+
- [x] SRL
31+
- [x] SRA
3232
- [x] OR
3333
- [x] AND
3434
- [ ] LB

src/main/scala/RISCV/Main.scala

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,29 @@ class Main() extends Module {
323323
printf("[SLL] Rs1: %d Rs2: %d Rd: %d\n", decoder.io.rs1, decoder.io.rs2, decoder.io.rd);
324324
}
325325

326+
// SRL and SRA
327+
is("b101_0110011".U) {
328+
registers.io.read_address_a := decoder.io.rs1;
329+
330+
registers.io.write_address := decoder.io.rd;
331+
registers.io.write_enable := true.B;
332+
333+
when(decoder.io.immediate(10) === 1.U) { // SRA
334+
registers.io.in := (registers.io.out_a.asSInt >> decoder.io.immediate(5, 0)).asUInt;
335+
}.otherwise { // SLA
336+
registers.io.in := registers.io.out_a >> decoder.io.immediate(5, 0);
337+
}
338+
339+
program_pointer := program_pointer + 1.U;
340+
stage := 0.U;
341+
342+
when(decoder.io.immediate(10) === 1.U) { // SRA
343+
printf("[SRA] Rs1: %d Rd: %d Shift: %d\n", decoder.io.rs1, decoder.io.rd, decoder.io.immediate(5, 0));
344+
}.otherwise { // SLA
345+
printf("[SRL] Rs1: %d Rd: %d Shift: %d\n", decoder.io.rs1, decoder.io.rd, decoder.io.immediate(5, 0));
346+
}
347+
}
348+
326349
// SLT
327350
is("b010_0110011".U) {
328351
registers.io.read_address_a := decoder.io.rs1;

0 commit comments

Comments
 (0)