Skip to content

Commit 5147b78

Browse files
implement xor, or, and and
1 parent 28c4c2f commit 5147b78

File tree

2 files changed

+48
-3
lines changed

2 files changed

+48
-3
lines changed

documentation/Modules/Hart.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ Currently only the `LW` instruction uses stage 2, since in stage 1 `LW` requests
2626
- [x] SLL
2727
- [x] SLT
2828
- [x] SLTU
29-
- [ ] XOR
29+
- [x] XOR
3030
- [ ] SRL
3131
- [ ] SRA
32-
- [ ] OR
33-
- [ ] AND
32+
- [x] OR
33+
- [x] AND
3434
- [ ] LB
3535
- [ ] LH
3636
- [x] LW

src/main/scala/RISCV/Main.scala

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,51 @@ class Main() extends Module {
362362

363363
printf("[SLTU] Rs1: %d Rs2: %d Rd: %d\n", decoder.io.rs1, decoder.io.rs2, decoder.io.rd);
364364
}
365+
366+
// XOR
367+
is("b100_0110011".U) {
368+
registers.io.read_address_a := decoder.io.rs1;
369+
registers.io.read_address_b := decoder.io.rs2;
370+
371+
registers.io.write_address := decoder.io.rd;
372+
registers.io.write_enable := true.B;
373+
registers.io.in := registers.io.out_a ^ registers.io.out_b;
374+
375+
program_pointer := program_pointer + 1.U;
376+
stage := 0.U;
377+
378+
printf("[XOR] Rs1: %d Rs2: %d Rd: %d\n", decoder.io.rs1, decoder.io.rs2, decoder.io.rd);
379+
}
380+
381+
// OR
382+
is("b110_0110011".U) {
383+
registers.io.read_address_a := decoder.io.rs1;
384+
registers.io.read_address_b := decoder.io.rs2;
385+
386+
registers.io.write_address := decoder.io.rd;
387+
registers.io.write_enable := true.B;
388+
registers.io.in := registers.io.out_a | registers.io.out_b;
389+
390+
program_pointer := program_pointer + 1.U;
391+
stage := 0.U;
392+
393+
printf("[OR] Rs1: %d Rs2: %d Rd: %d\n", decoder.io.rs1, decoder.io.rs2, decoder.io.rd);
394+
}
395+
396+
// AND
397+
is("b111_0110011".U) {
398+
registers.io.read_address_a := decoder.io.rs1;
399+
registers.io.read_address_b := decoder.io.rs2;
400+
401+
registers.io.write_address := decoder.io.rd;
402+
registers.io.write_enable := true.B;
403+
registers.io.in := registers.io.out_a & registers.io.out_b;
404+
405+
program_pointer := program_pointer + 1.U;
406+
stage := 0.U;
407+
408+
printf("[AND] Rs1: %d Rs2: %d Rd: %d\n", decoder.io.rs1, decoder.io.rs2, decoder.io.rd);
409+
}
365410
}
366411
}
367412

0 commit comments

Comments
 (0)