@@ -30,21 +30,6 @@ class Main() extends Module {
3030
3131 val memory = SRAM (1024 , UInt (32 .W ), 2 , 1 , 0 );
3232
33- // Set up Program Counter
34-
35- // Set up RAM
36- /*
37- * 32-bit width
38- * 1024 entries
39- *
40- */
41-
42- val RAM = Module (new RAM ())
43- RAM .io.enable := false .B
44- RAM .io.write := false .B
45- RAM .io.addr := 0 .U (10 .W )
46- RAM .io.data_in := 0 .U (32 .W )
47-
4833 // Set up register file
4934 val registers = Module (new Registers ())
5035 // Default connections for register file inputs
@@ -303,168 +288,6 @@ class Main() extends Module {
303288 }
304289 }
305290 }
306- is (" b0000000_100_01100_11" .U ) {
307- // XOR instruction https://msyksphinz-self.github.io/riscv-isadoc/html/rvi.html#xor
308-
309- // Get additional fields from decoder
310- val rd = decoder.io.rd
311- val rs1 = decoder.io.rs1
312- val rs2 = decoder.io.rs2
313-
314- // Execute XOR: x[rd] = x[rs1] ^ x[rs2]
315-
316- // Read rs1 and rs2 values
317- regFile.io.read_addr_A := rs1
318- val rs1_value = regFile.io.out_A
319- regFile.io.read_addr_B := rs2
320- val rs2_value = regFile.io.out_B
321-
322- // Set up ALU
323- alu.io.operation := " b0101" .U // XOR operation
324- alu.io.signed := false .B
325- alu.io.a := rs1_value
326- alu.io.b := rs2_value
327- val alu_result = alu.io.output
328-
329- // Write result to rd
330- regFile.io.write_addr := rd
331- regFile.io.write_enable := true .B
332- regFile.io.in := alu_result
333- }
334- is (" b00000_00_101_01100_11" .U ) {
335- // SRL instruction https://msyksphinz-self.github.io/riscv-isadoc/html/rvi.html#srl
336-
337- // Get additional fields from decoder
338- val rd = decoder.io.rd
339- val rs1 = decoder.io.rs1
340- val rs2 = decoder.io.rs2
341-
342- // Execute SRL: x[rd] = x[rs1] >>u x[rs2]
343-
344- // Read rs1 and rs2 values
345- regFile.io.read_addr_A := rs1
346- val rs1_value = regFile.io.out_A
347- regFile.io.read_addr_B := rs2
348- val rs2_value = Cat (Fill (27 ,0 .U ), regFile.io.out_B(5 ,0 ))
349-
350- // Set up ALU
351- alu.io.operation := " b1000" .U // Logical right shift operation
352- alu.io.signed := false .B
353- alu.io.a := rs1_value
354- alu.io.b := rs2_value
355- val alu_result = alu.io.output
356-
357- regFile.io.write_addr := rd
358- regFile.io.write_enable := true .B
359- regFile.io.in := alu_result
360- }
361- is (" b01000_00_101_01100_11" .U ) {
362- // SRA instruction https://msyksphinz-self.github.io/riscv-isadoc/html/rvi.html#sra
363-
364- // Get additional fields from decoder
365- val rd = decoder.io.rd
366- val rs1 = decoder.io.rs1
367- val rs2 = decoder.io.rs2
368-
369- // Execute SRL: x[rd] = x[rs1] >>u x[rs2]
370-
371- // Read rs1 and rs2 values
372- regFile.io.read_addr_A := rs1
373- val rs1_value = regFile.io.out_A
374- regFile.io.read_addr_B := rs2
375- val rs2_value = Cat (Fill (27 ,0 .U ), regFile.io.out_B(5 ,0 ))
376-
377- // Set up ALU
378- alu.io.operation := " b1001" .U // Logical right shift operation
379- alu.io.signed := false .B
380- alu.io.a := rs1_value
381- alu.io.b := rs2_value
382- val alu_result = alu.io.output
383-
384- regFile.io.write_addr := rd
385- regFile.io.write_enable := true .B
386- regFile.io.in := alu_result
387- }
388- is (" b00000_00_110_01100_11" .U ) {
389- // OR instruction https://msyksphinz-self.github.io/riscv-isadoc/html/rvi.html#or
390-
391- // Get additional fields from decoder
392- val rd = decoder.io.rd
393- val rs1 = decoder.io.rs1
394- val rs2 = decoder.io.rs2
395-
396- // Execute OR: x[rd] = x[rs1] | x[rs2]
397-
398- // Read rs1 and rs2 values
399- regFile.io.read_addr_A := rs1
400- val rs1_value = regFile.io.out_A
401- regFile.io.read_addr_B := rs2
402- val rs2_value = regFile.io.out_B
403-
404- // Set up ALU
405- alu.io.operation := " b0100" .U
406- alu.io.signed := false .B
407- alu.io.a := rs1_value
408- alu.io.b := rs2_value
409- val alu_result = alu.io.output
410-
411- regFile.io.write_addr := rd
412- regFile.io.write_enable := true .B
413- regFile.io.in := alu_result
414- }
415- is (" b00000_00_111_01100_11" .U ) {
416- // AND instruction https://msyksphinz-self.github.io/riscv-isadoc/html/rvi.html#and
417-
418- // Get additional fields from decoder
419- val rd = decoder.io.rd
420- val rs1 = decoder.io.rs1
421- val rs2 = decoder.io.rs2
422-
423- // Execute AND: x[rd] = x[rs1] & x[rs2]
424-
425- // Read rs1 and rs2 values
426- regFile.io.read_addr_A := rs1
427- val rs1_value = regFile.io.out_A
428- regFile.io.read_addr_B := rs2
429- val rs2_value = regFile.io.out_B
430-
431- // Set up ALU
432- alu.io.operation := " b0011" .U
433- alu.io.signed := false .B
434- alu.io.a := rs1_value
435- alu.io.b := rs2_value
436- val alu_result = alu.io.output
437-
438- regFile.io.write_addr := rd
439- regFile.io.write_enable := true .B
440- regFile.io.in := alu_result
441- }
442- is (" b000_00000_11" .U ) {
443- // LB instruction https://msyksphinz-self.github.io/riscv-isadoc/html/rvi.html#lb
444-
445- // Get additional fields from decoder
446- val rd = decoder.io.rd
447- val rs1 = decoder.io.rs1
448- val immediate = decoder.io.immediate
449-
450- // Execute LB: x[rd] = sext(M[x[rs1] + sext(offset)][7:0])
451-
452- // Read rs1 and rs2 values
453- regFile.io.read_addr_A := rs1
454- val rs1_value = regFile.io.out_A
455-
456- // Sign extend offset
457- val sext_offset = Cat (Fill (20 , immediate(11 )), immediate) // sext(offset)
458-
459- // Intermediate
460- val _sum = rs1+ sext_offset
461- // Final Sign-extension
462- val result = Cat (Fill (24 , _sum(7 )), _sum(7 ,0 ))
463-
464- regFile.io.write_addr := rd
465- regFile.io.write_enable := true .B
466- regFile.io.in := result
467- }
468291 }
469292}
470293
@@ -478,4 +301,4 @@ object Main extends App {
478301 ),
479302 args = Array (" --target-dir" , " generated" )
480303 )
481- }
304+ }
0 commit comments