diff options
Diffstat (limited to 'rtl/core/decode/decode.sv')
| -rw-r--r-- | rtl/core/decode/decode.sv | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/rtl/core/decode/decode.sv b/rtl/core/decode/decode.sv index f7d7be8..f4de2d0 100644 --- a/rtl/core/decode/decode.sv +++ b/rtl/core/decode/decode.sv @@ -12,12 +12,12 @@ module core_decode update_flags, branch, output ptr branch_offset, + output snd_decode snd_ctrl, output data_decode data_ctrl ); logic cond_undefined; - //TODO core_decode_conds conds ( .cond(insn `FIELD_COND), @@ -25,6 +25,18 @@ module core_decode .* ); + logic snd_is_imm, snd_shift_by_reg_if_reg, snd_undefined; + snd_decode snd; + + core_decode_snd snd_operand + ( + .decode(snd), + .is_imm(snd_is_imm), + .shift_by_reg_if_reg(snd_shift_by_reg_if_reg), + .undefined(snd_undefined), + .* + ); + logic branch_link; core_decode_branch group_branch @@ -37,7 +49,7 @@ module core_decode //TODO logic restore_spsr; - logic data_writeback, data_update_flags, data_undefined; + logic data_writeback, data_update_flags, data_is_imm, data_shift_by_reg_if_reg; data_decode data; core_decode_data group_data @@ -45,7 +57,8 @@ module core_decode .decode(data), .writeback(data_writeback), .update_flags(data_update_flags), - .undefined(data_undefined), + .snd_is_imm(data_is_imm), + .snd_shift_by_reg_if_reg(data_shift_by_reg_if_reg), .* ); @@ -57,6 +70,13 @@ module core_decode update_flags = 0; data_ctrl = {($bits(data_ctrl)){1'bx}}; + snd_ctrl = {($bits(snd_ctrl)){1'bx}}; + snd_ctrl.shl = 0; + snd_ctrl.shr = 0; + snd_ctrl.ror = 0; + snd_is_imm = 1'bx; + snd_shift_by_reg_if_reg = 1'bx; + priority casez(insn `FIELD_OP) `GROUP_B: begin branch = 1; @@ -68,10 +88,15 @@ module core_decode end `GROUP_ALU: begin + snd_is_imm = data_is_imm; + snd_shift_by_reg_if_reg = data_shift_by_reg_if_reg; + + snd_ctrl = snd; data_ctrl = data; + writeback = data_writeback; update_flags = data_update_flags; - undefined = undefined | data_undefined; + undefined = undefined | snd_undefined; end `INSN_MUL: ; @@ -88,6 +113,7 @@ module core_decode undefined = 1; branch = 1'bx; writeback = 1'bx; + snd_ctrl = {($bits(snd_ctrl)){1'bx}}; end endcase end |
