@@ -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;
0 commit comments