summaryrefslogtreecommitdiff
path: root/rtl/core/porch/conds.sv
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-11-08 13:00:40 -0600
committerAlejandro Soto <alejandro@34project.org>2022-11-08 13:29:23 -0600
commitf6929f9a4703e3eee9d7bd9752de055729cdd498 (patch)
tree770acb4f96fd16e0f12bec2c5ed5cfdfa5a4c315 /rtl/core/porch/conds.sv
parent89a8edd4bb96787c69118dd5f549345015b2d480 (diff)
Register decode output in a new porch stage
Diffstat (limited to 'rtl/core/porch/conds.sv')
-rw-r--r--rtl/core/porch/conds.sv47
1 files changed, 47 insertions, 0 deletions
diff --git a/rtl/core/porch/conds.sv b/rtl/core/porch/conds.sv
new file mode 100644
index 0000000..b8db1e7
--- /dev/null
+++ b/rtl/core/porch/conds.sv
@@ -0,0 +1,47 @@
+`include "core/decode/isa.sv"
+`include "core/uarch.sv"
+
+module core_porch_conds
+(
+ input word insn,
+ input psr_flags flags,
+
+ output logic execute,
+ conditional,
+ undefined
+);
+
+ always_comb begin
+ undefined = 0;
+ conditional = 1;
+
+ unique case(insn `FIELD_COND)
+ `COND_EQ: execute = flags.z;
+ `COND_NE: execute = ~flags.z;
+ `COND_HS: execute = flags.c;
+ `COND_LO: execute = ~flags.c;
+ `COND_MI: execute = flags.n;
+ `COND_PL: execute = ~flags.n;
+ `COND_VS: execute = flags.v;
+ `COND_VC: execute = ~flags.v;
+ `COND_HI: execute = flags.c & ~flags.z;
+ `COND_LS: execute = ~flags.c | flags.z;
+ `COND_GE: execute = flags.n ~^ flags.v;
+ `COND_LT: execute = flags.n ^ flags.v;
+ `COND_GT: execute = ~flags.z & (flags.n ~^ flags.v);
+ `COND_LE: execute = flags.z | (flags.n ^ flags.v);
+
+ `COND_AL: begin
+ execute = 1;
+ conditional = 0;
+ end
+
+ `COND_UD: begin
+ execute = 1'bx;
+ conditional = 1'bx;
+ undefined = 1;
+ end
+ endcase
+ end
+
+endmodule