diff options
Diffstat (limited to 'rtl/core')
| -rw-r--r-- | rtl/core/control/control.sv | 4 | ||||
| -rw-r--r-- | rtl/core/decode/decode.sv | 20 | ||||
| -rw-r--r-- | rtl/core/decode/ldst/misc.sv | 1 | ||||
| -rw-r--r-- | rtl/core/decode/ldst/multiple.sv | 1 | ||||
| -rw-r--r-- | rtl/core/decode/ldst/single.sv | 1 | ||||
| -rw-r--r-- | rtl/core/decode/mul.sv | 1 | ||||
| -rw-r--r-- | rtl/core/uarch.sv | 14 |
7 files changed, 22 insertions, 20 deletions
diff --git a/rtl/core/control/control.sv b/rtl/core/control/control.sv index c1ac5a1..929d53a 100644 --- a/rtl/core/control/control.sv +++ b/rtl/core/control/control.sv @@ -119,7 +119,7 @@ module core_control final_update_flags <= 0; if(dec.execute & ~next_bubble) begin - branch <= dec_branch.branch; + branch <= dec.branch; branch_target <= next_pc_visible + dec_branch.offset; alu <= dec_data.op; @@ -141,7 +141,7 @@ module core_control // TODO: dec_ldst.unprivileged/user_regs // TODO: byte/halfword sizes - ldst <= dec_ldst.enable; + ldst <= dec.ldst; ldst_pre <= dec_ldst.pre_indexed; ldst_increment <= dec_ldst.increment; ldst_writeback <= dec_ldst.writeback; diff --git a/rtl/core/decode/decode.sv b/rtl/core/decode/decode.sv index f5668c1..e93c476 100644 --- a/rtl/core/decode/decode.sv +++ b/rtl/core/decode/decode.sv @@ -14,14 +14,16 @@ module core_decode output mul_decode mul_ctrl ); - logic execute, undefined, conditional, writeback, update_flags, branch; + logic execute, undefined, conditional, writeback, update_flags, branch, ldst, mul; assign ctrl.execute = execute; assign ctrl.undefined = undefined; assign ctrl.conditional = conditional; assign ctrl.writeback = writeback; assign ctrl.update_flags = update_flags; - assign branch_ctrl.branch = branch; + assign ctrl.branch = branch; + assign ctrl.ldst = ldst; + assign ctrl.mul = mul; //TODO logic restore_spsr; @@ -130,11 +132,14 @@ module core_decode ); always_comb begin + mul = 0; + ldst = 0; branch = 0; - writeback = 0; - update_flags = 0; + execute = cond_execute; undefined = cond_undefined; + writeback = 0; + update_flags = 0; data_ctrl = {($bits(data_ctrl)){1'bx}}; data_ctrl.uses_rn = 1; @@ -152,7 +157,6 @@ module core_decode ldst_addr = {($bits(ldst_addr)){1'bx}}; ldst_ctrl = {($bits(ldst_ctrl)){1'bx}}; - ldst_ctrl.enable = 0; // El orden de los casos es importante, NO CAMBIAR priority casez(insn `FIELD_OP) @@ -168,7 +172,7 @@ module core_decode end `GROUP_MUL: begin - mul_ctrl.enable = 1; + mul = 1; data_ctrl.rd = mul_rd; data_ctrl.rn = mul_rs; @@ -241,7 +245,7 @@ module core_decode unique casez(insn `FIELD_OP) `GROUP_LDST_SINGLE, `GROUP_LDST_MISC, `GROUP_LDST_MULT: begin - ldst_ctrl.enable = 1; + ldst = 1; data_ctrl = data_ldst; writeback = ldst_ctrl.writeback || ldst_ctrl.load; end @@ -252,6 +256,8 @@ module core_decode if(undefined) begin execute = 0; + mul = 1'bx; + ldst = 1'bx; branch = 1'bx; writeback = 1'bx; conditional = 1'bx; diff --git a/rtl/core/decode/ldst/misc.sv b/rtl/core/decode/ldst/misc.sv index df7b823..d8ac898 100644 --- a/rtl/core/decode/ldst/misc.sv +++ b/rtl/core/decode/ldst/misc.sv @@ -13,7 +13,6 @@ module core_decode_ldst_misc logic p, w; - assign decode.enable = 1'bx; assign decode.rn = insn `FIELD_LDST_MISC_RN; assign decode.rd = insn `FIELD_LDST_MISC_RD; assign decode.size = insn `FIELD_LDST_MISC_H ? LDST_HALF : LDST_BYTE; diff --git a/rtl/core/decode/ldst/multiple.sv b/rtl/core/decode/ldst/multiple.sv index 8a09fc0..0ecd674 100644 --- a/rtl/core/decode/ldst/multiple.sv +++ b/rtl/core/decode/ldst/multiple.sv @@ -12,7 +12,6 @@ module core_decode_ldst_multiple logic s, l; reg_list regs; - assign decode.enable = 1'bx; assign decode.rn = insn `FIELD_LDST_MULT_RN; assign decode.rd = 4'bxxxx; assign decode.size = LDST_WORD; diff --git a/rtl/core/decode/ldst/single.sv b/rtl/core/decode/ldst/single.sv index b99c1c0..402c17b 100644 --- a/rtl/core/decode/ldst/single.sv +++ b/rtl/core/decode/ldst/single.sv @@ -11,7 +11,6 @@ module core_decode_ldst_single logic p, w; - assign decode.enable = 1'bx; assign decode.rn = insn `FIELD_LDST_SINGLE_RN; assign decode.rd = insn `FIELD_LDST_SINGLE_RD; assign decode.size = insn `FIELD_LDST_SINGLE_B ? LDST_BYTE : LDST_WORD; diff --git a/rtl/core/decode/mul.sv b/rtl/core/decode/mul.sv index f67435c..27f6651 100644 --- a/rtl/core/decode/mul.sv +++ b/rtl/core/decode/mul.sv @@ -20,7 +20,6 @@ module core_decode_mul assign rm = insn `FIELD_MUL_RM; assign update_flags = insn `FIELD_MUL_S; - assign decode.enable = 0; assign decode.add = insn `FIELD_MUL_ACC; assign decode.long_mul = long_mul; assign decode.signed_mul = insn `FIELD_MUL_SIGNED; diff --git a/rtl/core/uarch.sv b/rtl/core/uarch.sv index bd4d659..3b9351d 100644 --- a/rtl/core/uarch.sv +++ b/rtl/core/uarch.sv @@ -63,7 +63,10 @@ typedef struct packed undefined, conditional, writeback, - update_flags; + update_flags, + branch, + ldst, + mul; } datapath_decode; typedef struct packed @@ -76,8 +79,7 @@ typedef struct packed typedef struct packed { - logic branch; - ptr offset; + ptr offset; } branch_decode; typedef struct packed @@ -106,8 +108,7 @@ typedef struct packed reg_num rn, rd; - logic enable, - load, + logic load, increment, writeback, sign_extend, @@ -128,8 +129,7 @@ typedef struct packed reg_num r_add_lo, r_add_hi; // TambiƩn es destino cuando mul_decode.long - logic enable, - signed_mul, + logic signed_mul, long_mul, add; } mul_decode; |
