summaryrefslogtreecommitdiff
path: root/rtl/gfx/gfx_fixed_fma_dot.sv
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2023-11-05 21:35:16 -0600
committerAlejandro Soto <alejandro@34project.org>2023-11-10 01:43:02 -0600
commit5c982f38139cd1b0c5b590f67e99b1bcc1a32c9b (patch)
tree8085b34356b79eac8f8a22bc0c484bddfd676b73 /rtl/gfx/gfx_fixed_fma_dot.sv
parentd5de20fade70a0d454e3aa0087313ca715ff8759 (diff)
rtl/gfx: implement fixed-point FMA
Diffstat (limited to '')
-rw-r--r--rtl/gfx/gfx_fixed_fma_dot.sv48
1 files changed, 48 insertions, 0 deletions
diff --git a/rtl/gfx/gfx_fixed_fma_dot.sv b/rtl/gfx/gfx_fixed_fma_dot.sv
new file mode 100644
index 0000000..2831d08
--- /dev/null
+++ b/rtl/gfx/gfx_fixed_fma_dot.sv
@@ -0,0 +1,48 @@
+`include "gfx/gfx_defs.sv"
+
+module gfx_fixed_fma_dot
+(
+ input logic clk,
+
+ input fixed a0,
+ b0,
+ a1,
+ b1,
+ c,
+ input logic stall,
+
+ output fixed q
+);
+
+ fixed q0, a1_hold[`FIXED_FMA_STAGES], b1_hold[`FIXED_FMA_STAGES];
+
+ gfx_fixed_fma fma0
+ (
+ .a(a0),
+ .b(b0),
+ .q(q0),
+ .*
+ );
+
+ gfx_fixed_fma fma1
+ (
+ .a(a1_hold[`FIXED_FMA_STAGES - 1]),
+ .b(b1_hold[`FIXED_FMA_STAGES - 1]),
+ .c(q0),
+ .*
+ );
+
+ integer i;
+
+ always_ff @(posedge clk)
+ if (!stall) begin
+ a1_hold[0] <= a1;
+ b1_hold[0] <= b1;
+
+ for (i = 1; i < `FIXED_FMA_STAGES; ++i) begin
+ a1_hold[i] <= a1_hold[i - 1];
+ b1_hold[i] <= b1_hold[i - 1];
+ end
+ end
+
+endmodule