diff --git a/hdl/src/wrapper_valid_filter.sv b/hdl/src/wrapper_valid_filter.sv new file mode 100644 index 0000000000000000000000000000000000000000..af94c494840644cc5fb5504727c962ecf8c420d2 --- /dev/null +++ b/hdl/src/wrapper_valid_filter.sv @@ -0,0 +1,58 @@ +//----------------------------------------------------------------------------- +// SoC Labs Valid Signal Filter Module +// A joint work commissioned on behalf of SoC Labs; under Arm Academic Access license. +// +// Contributors +// +// David Mapstone (d.a.mapstone@soton.ac.uk) +// +// Copyright 2023; SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +module wrapper_valid_filter( + input logic clk, + input logic rst, + input logic data_in_last, + input logic data_in_valid, + input logic data_in_ready, + input logic data_out_valid, + output logic payload_out_valid +); + +logic [63:0] block_count, count_check, digest_count; +logic prev_last; +logic prev_data_out_valid; + +always_ff @(posedge clk, posedge rst) begin + if (rst) begin + block_count <= 'd0; + count_check <= 'd0; + digest_count <= 'd0; + prev_data_out_valid <= 'd0; + // payload_out_valid <= 1'd0; + prev_last <= 1'd0; + end else begin + prev_data_out_valid <= data_out_valid; + if (data_in_valid && data_in_ready) begin + prev_last <= data_in_last; + if (data_in_last) begin + block_count <= 'd0; + count_check <= block_count + 1'd1; + end else begin + block_count <= block_count + 64'd1; + end + end + if (data_out_valid == 1'd0 && prev_data_out_valid == 1'd1) begin + if (digest_count == (count_check - 64'd1)) begin + digest_count <= 'd0; + // payload_out_valid <= 1'b1; + end else begin + digest_count <= digest_count + 'd1; + end + end + end +end + +// Only takes Valid High for 1 Clock Cycle (Requires Change) and only takes valid high on when correct number of output packets seen +assign payload_out_valid = (digest_count == (count_check - 64'd1)) && ~prev_data_out_valid ? data_out_valid : 1'b0; +endmodule \ No newline at end of file