summaryrefslogtreecommitdiff
path: root/rtl/core/decode/mul.sv
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-10-31 15:25:38 -0600
committerAlejandro Soto <alejandro@34project.org>2022-11-01 23:04:24 -0600
commitb5a065227bd176b85765461ac2a791fb0cff1c72 (patch)
treeb67393abc0b43882647037dc2294df85ea38e93e /rtl/core/decode/mul.sv
parentf4a3bb7f9656f45b7c0d9b3ed8e8b09e9bd14d37 (diff)
Implement multiplication decode
Diffstat (limited to 'rtl/core/decode/mul.sv')
-rw-r--r--rtl/core/decode/mul.sv34
1 files changed, 34 insertions, 0 deletions
diff --git a/rtl/core/decode/mul.sv b/rtl/core/decode/mul.sv
new file mode 100644
index 0000000..f67435c
--- /dev/null
+++ b/rtl/core/decode/mul.sv
@@ -0,0 +1,34 @@
+`include "core/decode/isa.sv"
+`include "core/uarch.sv"
+
+module core_decode_mul
+(
+ input word insn,
+
+ output mul_decode decode,
+ output reg_num rd,
+ rs,
+ rm,
+ output logic update_flags
+);
+
+ logic long_mul;
+ reg_num short_rd, rn;
+
+ assign rd = long_mul ? rn : short_rd;
+ assign rs = insn `FIELD_MUL_RS;
+ 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;
+ assign decode.r_add_lo = long_mul ? rn : short_rd;
+ assign decode.r_add_hi = short_rd;
+
+ assign long_mul = insn `FIELD_MUL_LONG;
+ assign short_rd = insn `FIELD_MUL_RD;
+ assign rn = insn `FIELD_MUL_RN;
+
+endmodule