diff options
| author | Alejandro Soto <alejandro@34project.org> | 2024-03-03 20:39:39 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2024-03-03 20:42:36 -0600 |
| commit | 2b7b2185d381f2c5fd4aee19bd3a3508b4c9557f (patch) | |
| tree | acd92b7a9de4678a08cf7e55f99b27fc23ff8938 /platform/wavelet3d/gfx_float_lane.sv | |
| parent | cce507d21c86f20a83eec1b09fe3231399ffb10c (diff) | |
platform/wavelet3d: implement rounded fmul
Diffstat (limited to 'platform/wavelet3d/gfx_float_lane.sv')
| -rw-r--r-- | platform/wavelet3d/gfx_float_lane.sv | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/platform/wavelet3d/gfx_float_lane.sv b/platform/wavelet3d/gfx_float_lane.sv new file mode 100644 index 0000000..4d214f6 --- /dev/null +++ b/platform/wavelet3d/gfx_float_lane.sv @@ -0,0 +1,53 @@ +module gfx_float_lane +( + input logic clk, + + input gfx::float a, + b, + + output gfx::float q +); + + import gfx::*; + + logic slow_fmul; + float_round q_fmul; + float_special a_special, b_special; + + function float_special front_flags(float in); + front_flags.val = in; + front_flags.exp_max = &in.exp; + front_flags.exp_min = ~|in.exp; + front_flags.mant_zero = ~|in.mant; + endfunction + + function logic is_special(float_special in); + is_special = in.exp_max | (in.exp_min & ~in.mant_zero); + endfunction + + gfx_fmul_lane fmul + ( + .clk(clk), + .a(a_special), + .b(b_special), + .q(q_fmul), + .slow_in(slow_fmul) + ); + + gfx_round_lane round + ( + .clk(clk), + .in(q_fmul), + .out(q) + ); + + always_comb begin + slow_fmul = is_special(a_special) | is_special(b_special); + end + + always_ff @(posedge clk) begin + a_special <= front_flags(a); + b_special <= front_flags(b); + end + +endmodule |
