summaryrefslogtreecommitdiff
path: root/rtl/core/decode/data.sv
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-09-25 17:47:26 -0600
committerAlejandro Soto <alejandro@34project.org>2022-09-25 17:47:26 -0600
commit231f84b20e168afe36067b93bf30ed5e83f8e464 (patch)
treec7ae15abe90c263496be0c821f8ada49291b47e5 /rtl/core/decode/data.sv
parentb5f43ef8431532b1e0b498a88072fdfd2cf81ac9 (diff)
Implement ALU opcode decoding
Diffstat (limited to '')
-rw-r--r--rtl/core/decode/data.sv83
1 files changed, 15 insertions, 68 deletions
diff --git a/rtl/core/decode/data.sv b/rtl/core/decode/data.sv
index 67c118c..51370be 100644
--- a/rtl/core/decode/data.sv
+++ b/rtl/core/decode/data.sv
@@ -4,85 +4,32 @@
module core_decode_data
(
- input word insn,
- input psr_flags flags,
-
- output alu_op op,
- output reg_num rn,
- rd,
- output logic writeback,
- update_flags,
- restore_spsr,
- zero_fst,
- negate_fst,
- negate_snd,
- carry_in
+ input word insn,
+
+ output alu_op op,
+ output reg_num rn,
+ rd,
+ output logic writeback,
+ update_flags,
+ restore_spsr
);
assign rn = insn `FIELD_DATA_RN;
assign rd = insn `FIELD_DATA_RD;
+ assign op = insn `FIELD_DATA_OPCODE;
always_comb begin
- update_flags = insn `FIELD_DATA_S;
- writeback = 1;
-
- op = ALU_ADD;
- zero_fst = 0;
- negate_fst = 0;
- negate_snd = 0;
- carry_in = 0;
-
- unique case(insn `FIELD_DATA_OPCODE)
- `DATA_ADD: ;
-
- `DATA_AND: op = ALU_AND;
- `DATA_EOR: op = ALU_XOR;
- `DATA_ORR: op = ALU_ORR;
- `DATA_SUB: negate_snd = 1;
- `DATA_RSB: negate_fst = 1;
- `DATA_ADC: carry_in = flags.c;
- `DATA_MOV: zero_fst = 1;
- `DATA_CMN: writeback = 0;
-
- `DATA_MVN: begin
- zero_fst = 1;
- negate_snd = 1;
- end
-
- `DATA_SBC: begin
- negate_snd = 1;
- carry_in = flags.c;
- end
-
- `DATA_RSC: begin
- negate_fst = 1;
- carry_in = flags.c;
- end
-
- `DATA_BIC: begin
- op = ALU_AND;
- negate_snd = 1;
- carry_in = 1;
- end
-
- `DATA_TST: begin
- op = ALU_AND;
- writeback = 0;
- end
-
- `DATA_TEQ: begin
- op = ALU_XOR;
+ unique case(op)
+ `ALU_CMP, `ALU_CMN, `ALU_TST, `ALU_TEQ:
writeback = 0;
- end
-
- `DATA_CMP: begin
- writeback = 0;
- negate_snd = 1;
- end
+ default:
+ writeback = 1;
endcase
+ update_flags = insn `FIELD_DATA_S;
restore_spsr = (rd == `R15) & update_flags;
+
if(restore_spsr)
update_flags = 0;
end