From f4529ea2a6511f668fadbbc308439bcff6c9c53b Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Sun, 6 Nov 2022 14:59:55 -0600 Subject: Split ALU/shifter control logic out of control.sv --- rtl/core/control/control.sv | 50 +++++++++------------------------------------ 1 file changed, 10 insertions(+), 40 deletions(-) (limited to 'rtl/core/control/control.sv') diff --git a/rtl/core/control/control.sv b/rtl/core/control/control.sv index 0912387..fa4510c 100644 --- a/rtl/core/control/control.sv +++ b/rtl/core/control/control.sv @@ -55,24 +55,19 @@ module core_control ); logic final_update_flags, ldst, ldst_pre, ldst_increment, - ldst_writeback, pop_valid, data_snd_is_imm, data_snd_shift_by_reg, - trivial_shift, undefined, exception, high_vectors; + ldst_writeback, pop_valid, exception, high_vectors; logic[2:0] vector_offset; - logic[5:0] data_shift_imm; - logic[11:0] data_imm; - word saved_base, mem_offset, vector; + word mem_offset, vector; reg_num r_shift, popped_upper, popped_lower, popped; reg_list mem_regs, next_regs_upper, next_regs_lower; assign reg_mode = `MODE_SVC; //TODO - assign trivial_shift = shifter_shift == 0; assign mem_data_wr = rd_value_b; assign popped = ldst_increment ? popped_lower : popped_upper; assign exception = undefined; //TODO assign high_vectors = 0; //TODO assign vector = {{16{high_vectors}}, 11'b0, vector_offset, 2'b00}; - assign next_pc_visible = fetch_insn_pc + 2; ctrl_cycle cycle, next_cycle; @@ -89,7 +84,7 @@ module core_control ); ptr pc /*verilator public*/, next_pc_visible; - logic issue; + logic issue, undefined; core_control_issue ctrl_issue ( @@ -111,7 +106,10 @@ module core_control .* ); - core_control_mux ctrl_mux + word saved_base; + logic trivial_shift, data_snd_shift_by_reg; + + core_control_data ctrl_data ( .* ); @@ -136,22 +134,9 @@ module core_control final_update_flags <= 0; if(issue) begin - alu <= dec_data.op; ra <= dec_data.rn; - - data_snd_is_imm <= dec_snd.is_imm; - data_snd_shift_by_reg <= dec_snd.shift_by_reg; - data_imm <= dec_snd.imm; - data_shift_imm <= dec_snd.shift_imm; - - shifter.shr <= dec_snd.shr; - shifter.ror <= dec_snd.ror; - shifter.put_carry <= dec_snd.put_carry; - shifter.sign_extend <= dec_snd.sign_extend; - rb <= dec_snd.r; r_shift <= dec_snd.r_shift; - c_in <= flags.c; // TODO: dec_ldst.unprivileged/user_regs // TODO: byte/halfword sizes @@ -176,16 +161,10 @@ module core_control update_flags <= final_update_flags; end - RD_INDIRECT_SHIFT: begin + RD_INDIRECT_SHIFT: rb <= r_shift; - data_snd_shift_by_reg <= 0; - saved_base <= rd_value_b; - end - WITH_SHIFT: begin - c_in <= c_shifter; - saved_base <= q_shifter; - end + WITH_SHIFT: ; TRANSFER: begin if(cycle != TRANSFER) begin @@ -196,7 +175,6 @@ module core_control if(cycle != TRANSFER || mem_ready) begin mem_regs <= ldst_increment ? next_regs_lower : next_regs_upper; mem_addr <= ldst_pre ? q_alu[31:2] : alu_a[31:2]; - saved_base <= q_alu; if(pop_valid) rb <= popped; @@ -209,24 +187,16 @@ module core_control BASE_WRITEBACK: ; - EXCEPTION: begin + EXCEPTION: //TODO: spsr_ = cpsr //TODO: actualizar modo //TODO: deshabilitar IRQs/FIQs dependiendo de modo //TODO: Considerar que data abort usa + 8, no + 4 - alu <= `ALU_ADD; - data_imm <= 12'd4; - data_snd_is_imm <= 1; - final_update_flags <= 0; - end endcase end initial begin - c_in = 0; - data_snd_shift_by_reg = 0; - wb_alu_flags = 4'b0000; ldst = 0; -- cgit v1.2.3