summaryrefslogtreecommitdiff
path: root/rtl
diff options
context:
space:
mode:
Diffstat (limited to 'rtl')
-rw-r--r--rtl/core/control/control.sv4
-rw-r--r--rtl/core/decode/decode.sv20
-rw-r--r--rtl/core/decode/ldst/misc.sv1
-rw-r--r--rtl/core/decode/ldst/multiple.sv1
-rw-r--r--rtl/core/decode/ldst/single.sv1
-rw-r--r--rtl/core/decode/mul.sv1
-rw-r--r--rtl/core/uarch.sv14
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;