@@ -140,22 +140,38 @@ class Main() extends Module {
140140 switch(decoder.io.opcode){
141141 // Load
142142 is(" b0000011" .U ) {
143-
144143
144+ registers.io.read_address_a := decoder.io.rs1;
145+
146+ memory.io.read_1 := true .B
147+ memory.io.address_1 := (addr) / 4 .U ;
148+ memory.io.read_2 := true .B
149+ memory.io.address_2 := (addr) / 4 .U + 1 .U ;
145150
146151 }
147152 // Store
148153 is(" b0100011" .U ){
154+ registers.io.read_address_a := decoder.io.rs1;
155+ registers.io.read_address_b := decoder.io.rs2;
149156
150- }
151- // ALU Imm
152- is(" b0010011" .U ){
157+ memory.io.read_1 := true .B
158+ memory.io.address_1 := (addr) / 4 .U ;
159+ memory.io.read_2 := true .B
160+ memory.io.address_2 := (addr) / 4 .U + 1 .U ;
153161
154162 }
155- // ALU Reg
156- is(" b0110011" .U ){
163+ // ALU Imm,Reg
164+ is(" b0010011" .U , " b0110011" .U ){
165+ registers.io.read_address_a := decoder.io.rs1
166+ registers.io.read_address_b := decoder.io.rs2
167+ registers.io.write_address := decoder.io.rd
168+ registers.io.write_enable := true .B
169+ program_pointer := pc_plus_4
170+ stage := 0 .U
157171
172+ val alu_b = Mux (deocer.io.opcode === " b0010011" .U , decoder.io.immediate, registers.io.out_b)
158173 }
174+
159175 // Branch
160176 is(" b1100011" .U ){
161177 registers.io.read_address_a := decoder.io.rs1;
@@ -167,36 +183,84 @@ class Main() extends Module {
167183 val lt_sel = Mux (decoder.io.func3(1 ), lt_unsigned,lt_signed)
168184 val lt_eq_sel = Mux (decoder.io.func3(2 ),lt_sel,eq)
169185 val take_branch = lt_eq_sel ^ decoder.io.func3(0 )
170-
171186 program_pointer := Mux (take_branch, pc_plus_imm, pc_plus_4)
172187 }
173188 // LUI
174189 is(" b0110111" .U ){
190+ registers.io.write_address := decoder.io.rd;
191+ registers.io.write_enable := true .B ;
192+ registers.io.in := decoder.io.immediate;
193+
194+ program_pointer := pc_plus_4;
195+ stage := 0 .U ;
175196
197+ printf(
198+ " [LUI] Rd: %d Immediate: %b\n " ,
199+ decoder.io.rd,
200+ decoder.io.immediate
201+ );
176202 }
177203 // AUIPC
178204 is(" b0010111" .U ){
205+ registers.io.write_address := decoder.io.rd;
206+ registers.io.write_enable := true .B ;
207+ registers.io.in := pc_plus_imm;
179208
209+ program_pointer := pc_plus_4;
210+ stage := 0 .U ;
211+
212+ printf(
213+ " [AUIPC] Rd: %d Immediate: %b\n " ,
214+ decoder.io.rd,
215+ decoder.io.immediate
216+ );
180217 }
181218 // JAL
182219 is(" b1101111" .U ){
220+ registers.io.write_address := decoder.io.rd;
221+ registers.io.write_enable := true .B ;
222+ registers.io.in := pc_plus_4
223+
224+ program_pointer := pc_plus_imm;
225+ stage := 0 .U ;
183226
227+ printf(
228+ " [JAL] Rd: %d Immediate: %b\n " ,
229+ decoder.io.rd,
230+ decoder.io.immediate
231+ );
184232 }
185233 // JALR
186234 is(" b1100111" .U ){
235+ registers.io.read_address_a := decoder.io.rs1;
236+
237+ registers.io.write_address := decoder.io.rd;
238+ registers.io.write_enable := true .B ;
239+ registers.io.in := pc_plus_4;
240+
241+ program_pointer := addr & ~ 1 .U (32 .W )
242+ stage := 0 .U ;
243+
244+ printf(
245+ " [JALR] RS1: %d Rd: %d Immediate: %b\n " ,
246+ decoder.io.rs1,
247+ decoder.io.rd,
248+ decoder.io.immediate
249+ );
187250
188251 }
189252 // FENCE
190253 is(" b0001111" .U ){
254+ program_pointer := pc_plus_4;
255+ stage := 0 .U ;
256+ printf(" [FENCE]" );
191257
192258 }
193259
194260
195261
196262 }
197263
198-
199-
200264 switch(decoder.io.operation) {
201265 // LB
202266 is(" b000_0000011" .U ) {
0 commit comments