diff options
| author | Alejandro Soto <alejandro@34project.org> | 2023-09-25 19:12:49 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2023-09-25 21:33:49 -0600 |
| commit | ed0bd705f94f6aea568ec8405534984a37770f21 (patch) | |
| tree | af19fc67177962c14ce7ab88d75dcaa1b1e3aee3 /rtl/core/decode/data_dec.sv | |
| parent | cd02f821525b8710dd37e2bc39a8a7dbc36ac4b0 (diff) | |
rtl/core, tb: replace bus_master with a new top-level module
Diffstat (limited to 'rtl/core/decode/data_dec.sv')
| -rw-r--r-- | rtl/core/decode/data_dec.sv | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/rtl/core/decode/data_dec.sv b/rtl/core/decode/data_dec.sv new file mode 100644 index 0000000..f744972 --- /dev/null +++ b/rtl/core/decode/data_dec.sv @@ -0,0 +1,65 @@ +`include "core/decode/isa.sv" +`include "core/uarch.sv" + +module core_decode_data +( + input word insn, + + output data_decode decode, + output logic snd_is_imm, + snd_shift_by_reg_if_reg, + writeback, + conditional, + update_flags, + restore_spsr +); + + alu_op op; + reg_num rn, rd; + logic uses_rn; + + assign decode.op = op; + assign decode.rn = rn; + assign decode.rd = rd; + assign decode.uses_rn = uses_rn; + + assign rn = insn `FIELD_DATA_RN; + assign rd = insn `FIELD_DATA_RD; + assign op = insn `FIELD_DATA_OPCODE; + + assign snd_is_imm = insn `FIELD_DATA_IMM; + assign snd_shift_by_reg_if_reg = insn `FIELD_DATA_REGSHIFT; + + always_comb begin + unique case(op) + `ALU_ADC, `ALU_SBC, `ALU_RSC: + conditional = 1; + + default: + conditional = 0; + endcase + + unique case(op) + `ALU_CMP, `ALU_CMN, `ALU_TST, `ALU_TEQ: + writeback = 0; + + default: + writeback = 1; + endcase + + unique case(op) + `ALU_MOV, `ALU_MVN: + uses_rn = 0; + + default: + uses_rn = 1; + endcase + + update_flags = insn `FIELD_DATA_S; + restore_spsr = (rd == `R15) & update_flags; + + if(restore_spsr) + update_flags = 0; + end + +endmodule |
