From 6652e2f0e9aa90131259f81d2799c4d21ed707e0 Mon Sep 17 00:00:00 2001 From: Blaise Tine Date: Sat, 11 Sep 2021 18:16:08 -0700 Subject: [PATCH] minor update --- hw/rtl/libs/VX_find_first.v | 65 ++++++++++++++----------------------- 1 file changed, 24 insertions(+), 41 deletions(-) diff --git a/hw/rtl/libs/VX_find_first.v b/hw/rtl/libs/VX_find_first.v index ab724c7e..3ff8c8a9 100644 --- a/hw/rtl/libs/VX_find_first.v +++ b/hw/rtl/libs/VX_find_first.v @@ -12,50 +12,33 @@ module VX_find_first #( output wire [DATAW-1:0] data_o, output wire valid_o ); - if (N > 1) begin - wire [N-1:0] valid_r; - wire [N-1:0][DATAW-1:0] data_r; + localparam TL = (1 << LOGN) - 1; + localparam TN = (1 << (LOGN+1)) - 1; - for (genvar i = 0; i < N; ++i) begin - assign valid_r[i] = REVERSE ? valid_i[N-1-i] : valid_i[i]; - assign data_r[i] = REVERSE ? data_i[N-1-i] : data_i[i]; +`IGNORE_WARNINGS_BEGIN + wire [TN-1:0] s_n; + wire [TN-1:0][DATAW-1:0] d_n; +`IGNORE_WARNINGS_END + + for (genvar i = 0; i < N; ++i) begin + assign s_n[TL+i] = REVERSE ? valid_i[N-1-i] : valid_i[i]; + assign d_n[TL+i] = REVERSE ? data_i[N-1-i] : data_i[i]; + end + + for (genvar i = TL+N; i < TN; ++i) begin + assign s_n[i] = 0; + assign d_n[i] = 'x; + end + + for (genvar j = 0; j < LOGN; ++j) begin + for (genvar i = 0; i < (2**j); ++i) begin + assign s_n[2**j-1+i] = s_n[2**(j+1)-1+i*2] | s_n[2**(j+1)-1+i*2+1]; + assign d_n[2**j-1+i] = s_n[2**(j+1)-1+i*2] ? d_n[2**(j+1)-1+i*2] : d_n[2**(j+1)-1+i*2+1]; end - - `IGNORE_WARNINGS_BEGIN - wire [2**LOGN-1:0] s_n; - wire [2**LOGN-1:0][DATAW-1:0] d_n; - `IGNORE_WARNINGS_END - - for (genvar i = 0; i < LOGN; ++i) begin - if (i == (LOGN-1)) begin - for (genvar j = 0; j < 2**i; ++j) begin - if ((j*2) < (N-1)) begin - assign s_n[2**i-1+j] = valid_r[j*2] | valid_r[j*2+1]; - assign d_n[2**i-1+j] = valid_r[j*2] ? data_r[j*2] : data_r[j*2+1]; - end - if ((j*2) == (N-1)) begin - assign s_n[2**i-1+j] = valid_r[j*2]; - assign d_n[2**i-1+j] = data_r[j*2]; - end - if ((j*2) > (N-1)) begin - assign s_n[2**i-1+j] = 0; - assign d_n[2**i-1+j] = 'x; - end - end - end else begin - for (genvar j = 0; j < 2**i; ++j) begin - assign s_n[2**i-1+j] = s_n[2**(i+1)-1+j*2] | s_n[2**(i+1)-1+j*2+1]; - assign d_n[2**i-1+j] = s_n[2**(i+1)-1+j*2] ? d_n[2**(i+1)-1+j*2] : d_n[2**(i+1)-1+j*2+1]; - end - end - end + end - assign valid_o = s_n[0]; - assign data_o = d_n[0]; - end else begin - assign valid_o = valid_i; - assign data_o = data_i[0]; - end + assign valid_o = s_n[0]; + assign data_o = d_n[0]; endmodule `TRACING_ON \ No newline at end of file