minor update
This commit is contained in:
@@ -12,50 +12,33 @@ module VX_find_first #(
|
|||||||
output wire [DATAW-1:0] data_o,
|
output wire [DATAW-1:0] data_o,
|
||||||
output wire valid_o
|
output wire valid_o
|
||||||
);
|
);
|
||||||
if (N > 1) begin
|
localparam TL = (1 << LOGN) - 1;
|
||||||
wire [N-1:0] valid_r;
|
localparam TN = (1 << (LOGN+1)) - 1;
|
||||||
wire [N-1:0][DATAW-1:0] data_r;
|
|
||||||
|
|
||||||
for (genvar i = 0; i < N; ++i) begin
|
`IGNORE_WARNINGS_BEGIN
|
||||||
assign valid_r[i] = REVERSE ? valid_i[N-1-i] : valid_i[i];
|
wire [TN-1:0] s_n;
|
||||||
assign data_r[i] = REVERSE ? data_i[N-1-i] : data_i[i];
|
wire [TN-1:0][DATAW-1:0] d_n;
|
||||||
end
|
`IGNORE_WARNINGS_END
|
||||||
|
|
||||||
`IGNORE_WARNINGS_BEGIN
|
for (genvar i = 0; i < N; ++i) begin
|
||||||
wire [2**LOGN-1:0] s_n;
|
assign s_n[TL+i] = REVERSE ? valid_i[N-1-i] : valid_i[i];
|
||||||
wire [2**LOGN-1:0][DATAW-1:0] d_n;
|
assign d_n[TL+i] = REVERSE ? data_i[N-1-i] : data_i[i];
|
||||||
`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
|
|
||||||
|
|
||||||
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
|
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
|
||||||
|
end
|
||||||
|
|
||||||
|
assign valid_o = s_n[0];
|
||||||
|
assign data_o = d_n[0];
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
`TRACING_ON
|
`TRACING_ON
|
||||||
Reference in New Issue
Block a user