summaryrefslogtreecommitdiff
path: root/rtl
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--rtl/core/decode/data.sv83
-rw-r--r--rtl/core/decode/decode.sv8
2 files changed, 21 insertions, 70 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
diff --git a/rtl/core/decode/decode.sv b/rtl/core/decode/decode.sv
index f173529..57744e1 100644
--- a/rtl/core/decode/decode.sv
+++ b/rtl/core/decode/decode.sv
@@ -12,7 +12,8 @@ module core_decode
writeback,
branch,
output ptr branch_offset,
- output reg_num rd
+ output reg_num rd,
+ output alu_op data_op
);
logic cond_undefined;
@@ -35,15 +36,16 @@ module core_decode
);
//TODO
- alu_op op;
reg_num rn;
logic update_flags, restore_spsr, zero_fst, negate_fst, negate_snd, carry_in;
logic data_writeback;
reg_num data_rd;
+ alu_op data_group_op;
core_decode_data group_data
(
+ .op(data_group_op),
.rd(data_rd),
.writeback(data_writeback),
.*
@@ -55,6 +57,7 @@ module core_decode
branch = 0;
writeback = 0;
rd = 4'bxxxx;
+ data_op = 4'bxxxx;
priority case(insn `FIELD_OP) inside
`GROUP_B: begin
@@ -69,6 +72,7 @@ module core_decode
`GROUP_ALU: begin
rd = data_rd;
writeback = data_writeback;
+ data_op = data_group_op;
end
`INSN_MUL: ;