diff options
Diffstat (limited to 'rtl/core')
| -rw-r--r-- | rtl/core/control/control.sv | 46 | ||||
| -rw-r--r-- | rtl/core/decode/decode.sv | 18 |
2 files changed, 53 insertions, 11 deletions
diff --git a/rtl/core/control/control.sv b/rtl/core/control/control.sv index 9e94c3e..3b1b797 100644 --- a/rtl/core/control/control.sv +++ b/rtl/core/control/control.sv @@ -4,6 +4,7 @@ module core_control ( input logic clk, dec_execute, + dec_undefined, dec_conditional, dec_uses_rn, dec_branch, @@ -54,16 +55,19 @@ module core_control RD_INDIRECT_SHIFT, WITH_SHIFT, TRANSFER, - BASE_WRITEBACK + BASE_WRITEBACK, + EXCEPTION } cycle, next_cycle; logic bubble, next_bubble, final_writeback, final_update_flags, ldst, ldst_pre, ldst_increment, ldst_writeback, pop_valid, - data_snd_is_imm, data_snd_shift_by_reg, trivial_shift; + data_snd_is_imm, data_snd_shift_by_reg, trivial_shift, + undefined, exception, high_vectors; + logic[2:0] vector_offset; logic[5:0] data_shift_imm; logic[11:0] data_imm; - word saved_base, mem_offset; + word saved_base, mem_offset, vector; reg_num r_shift, final_rd, popped_upper, popped_lower, popped; reg_list mem_regs, next_regs_upper, next_regs_lower; ptr pc, next_pc_visible; @@ -73,6 +77,9 @@ module core_control 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; assign next_bubble = @@ -99,7 +106,9 @@ module core_control unique case(cycle) ISSUE: - if(data_snd_shift_by_reg) + if(exception) + next_cycle = EXCEPTION; + else if(data_snd_shift_by_reg) next_cycle = RD_INDIRECT_SHIFT; else if(~trivial_shift) next_cycle = WITH_SHIFT; @@ -123,8 +132,9 @@ module core_control next_cycle = TRANSFER; unique case(cycle) - TRANSFER: alu_a = saved_base; - default: alu_a = rd_value_a; + TRANSFER: alu_a = saved_base; + EXCEPTION: alu_a = {pc, 2'b00}; + default: alu_a = rd_value_a; endcase unique case(cycle) @@ -140,6 +150,8 @@ module core_control else alu_b = rd_value_b; endcase + + vector_offset = 3'b001; //TODO end always_ff @(posedge clk) begin @@ -201,6 +213,8 @@ module core_control update_flags <= final_update_flags; writeback <= final_writeback; + undefined <= dec_undefined; + rd <= final_rd; pc <= fetch_insn_pc; pc_visible <= next_pc_visible; @@ -249,6 +263,24 @@ module core_control writeback <= !mem_write; final_rd <= ra; end + + EXCEPTION: begin + //TODO: spsr_<mode> = cpsr + //TODO: actualizar modo + //TODO: deshabilitar IRQs/FIQs dependiendo de modo + //TODO: Considerar que data abort usa + 8, no + 4 + rd <= `R15; + wr_value <= vector; + writeback <= 1; + + alu <= `ALU_ADD; + data_imm <= 12'd4; + data_snd_is_imm <= 1; + + final_rd <= `R14; + final_writeback <= 1; + final_update_flags <= 0; + end endcase end @@ -265,6 +297,8 @@ module core_control branch_target = 30'd0; data_snd_shift_by_reg = 0; + undefined = 0; + wb_alu_flags = 4'b0000; ldst = 0; diff --git a/rtl/core/decode/decode.sv b/rtl/core/decode/decode.sv index b2d9518..2580701 100644 --- a/rtl/core/decode/decode.sv +++ b/rtl/core/decode/decode.sv @@ -22,11 +22,12 @@ module core_decode //TODO logic restore_spsr; - logic cond_undefined; + logic cond_undefined, cond_execute; core_decode_conds conds ( .cond(insn `FIELD_COND), + .execute(cond_execute), .undefined(cond_undefined), .* ); @@ -117,6 +118,7 @@ module core_decode writeback = 0; update_flags = 0; uses_rn = 1; + execute = cond_execute; undefined = cond_undefined; data_ctrl = {($bits(data_ctrl)){1'bx}}; @@ -162,8 +164,8 @@ module core_decode undefined = undefined | snd_undefined; end - `INSN_MUL: ; - `GROUP_BIGMUL: ; + /*`INSN_MUL: ; + `GROUP_BIGMUL: ;*/ `GROUP_LDST_SINGLE_IMM, `GROUP_LDST_SINGLE_REG: begin snd_is_imm = ldst_single_is_imm; @@ -200,11 +202,11 @@ module core_decode restore_spsr = ldst_mult_restore_spsr; end - `GROUP_SWP: ; + /*`GROUP_SWP: ; `GROUP_CP: ; `INSN_MRS: ; `GROUP_MSR: ; - `INSN_SWI: ; + `INSN_SWI: ;*/ default: undefined = 1; endcase @@ -220,8 +222,14 @@ module core_decode endcase if(undefined) begin + execute = 0; + branch = 1'bx; + uses_rn = 1'bx; writeback = 1'bx; + conditional = 1'bx; + update_flags = 1'bx; + snd_ctrl = {($bits(snd_ctrl)){1'bx}}; data_ctrl = {($bits(data_ctrl)){1'bx}}; ldst_ctrl = {($bits(ldst_ctrl)){1'bx}}; |
