diff --git a/hw/rtl/libs/VX_sat_fx.v b/hw/rtl/libs/VX_sat_fx.v new file mode 100644 index 00000000..0a7abaf2 --- /dev/null +++ b/hw/rtl/libs/VX_sat_fx.v @@ -0,0 +1,21 @@ +`include "VX_platform.vh" + +module VX_sat_fx #( + parameter IN_W = 1, + parameter OUT_W = 1, + parameter MODEL = 1 +) ( + input wire [IN_W-1:0] data_in, + output wire [OUT_W-1:0] data_out +); + `STATIC_ASSERT(((OUT_W+1) < IN_W), ("invalid parameter")) + + if (MODEL == 1) begin + assign data_out = data_in[IN_W-1] ? OUT_W'(0) : ((data_in > {OUT_W{1'b1}}) ? {OUT_W{1'b1}} : OUT_W'(data_in)); + end else begin + wire [OUT_W-1:0] underflow_mask = {OUT_W{~data_in[IN_W-1]}}; + wire [OUT_W-1:0] overflow_mask = {OUT_W{(| data_in[IN_W-2:OUT_W])}}; + assign data_out = (data_in[OUT_W-1:0] | overflow_mask) & underflow_mask; + end + +endmodule \ No newline at end of file diff --git a/hw/rtl/tex_unit/VX_tex_define.vh b/hw/rtl/tex_unit/VX_tex_define.vh index 2b87d4da..9b33135d 100644 --- a/hw/rtl/tex_unit/VX_tex_define.vh +++ b/hw/rtl/tex_unit/VX_tex_define.vh @@ -9,8 +9,6 @@ `define FIXED_HALF (`FIXED_ONE >> 1) `define FIXED_MASK (`FIXED_ONE - 1) -`define CLAMP(x,lo,hi) (($signed(x) < $signed(lo)) ? lo : ((x > hi) ? hi : x)) - `define TEX_ADDR_BITS 32 `define TEX_FORMAT_BITS 3 `define TEX_WRAP_BITS 2 diff --git a/hw/rtl/tex_unit/VX_tex_wrap.v b/hw/rtl/tex_unit/VX_tex_wrap.v index 75857f8f..d9193077 100644 --- a/hw/rtl/tex_unit/VX_tex_wrap.v +++ b/hw/rtl/tex_unit/VX_tex_wrap.v @@ -12,14 +12,20 @@ module VX_tex_wrap #( reg [`FIXED_FRAC-1:0] coord_r; - wire [31:0] clamp = `CLAMP(coord_i, 0, `FIXED_MASK); + wire [`FIXED_FRAC-1:0] clamp; - `UNUSED_VAR (clamp) + VX_sat_fx #( + .IN_W (32), + .OUT_W (`FIXED_FRAC) + ) sat_fx ( + .data_in (coord_i), + .data_out (clamp) + ); always @(*) begin case (wrap_i) `TEX_WRAP_CLAMP: - coord_r = clamp[`FIXED_FRAC-1:0]; + coord_r = clamp; `TEX_WRAP_MIRROR: coord_r = coord_i[`FIXED_FRAC-1:0] ^ {`FIXED_FRAC{coord_i[`FIXED_FRAC]}}; default: //`TEX_WRAP_REPEAT