diff --git a/hdl/src/wrapper_packet_deconstruct.sv b/hdl/src/wrapper_packet_deconstruct.sv index cb3656d34147c7d9720953202a739913e7715c38..cfc95bf306a8ebcee243f4c5748ee9f195ffe25c 100644 --- a/hdl/src/wrapper_packet_deconstruct.sv +++ b/hdl/src/wrapper_packet_deconstruct.sv @@ -30,12 +30,14 @@ module wrapper_packet_deconstruct #( input logic [PACKETWIDTH-1:0] packet_data, input logic packet_data_last, input logic packet_data_valid, - output logic packet_data_ready + output logic packet_data_ready, + + output logic deconstructor_ready ); // Create Deconstruction Buffer -// logic [PACKETWIDTH-1:0] deconst_buffer; logic [(PACKETWIDTH/32)-1:0][31:0] deconst_buf; +assign deconst_buf = packet_data; // Create Array to Flag which buffers have been read logic [(PACKETWIDTH/32)-1:0] deconst_buf_flag; @@ -53,34 +55,31 @@ logic deconst_buf_flag_reduced; assign deconst_buf_flag_reduced = &(deconst_buf_flag | (cur_deconst_buf_flag)); logic deconst_buf_valid; +assign deconstructor_ready = deconst_buf_valid; // Dump data on one of two conditions // - An address ends [5:0] in 0x3C i.e. [5:2] == 0xF // - Address Moved to different 512 bit word // Write Condition always_ff @(posedge hclk or negedge hresetn) begin if (~hresetn) begin - // Reset Construction Buffer - deconst_buf <= {PACKETWIDTH{1'b0}}; // Reset Values packet_data_ready <= 1'b0; deconst_buf_valid <= 1'b0; deconst_buf_flag <= {(PACKETWIDTH/32){1'b0}}; end else begin - // If ready is low and theres no valid data in buffer, asser ready - if (!packet_data_ready && !deconst_buf_valid) begin - packet_data_ready <= 1'b1; - end - // Read Packet into Deconstruction Buffer if (packet_data_valid && packet_data_ready) begin - packet_data_ready <= 1'b0; - deconst_buf <= packet_data; + packet_data_ready <= 1'b0; + end + // If buffer isn't valid but valid data on input, assert buffer valid + if ((packet_data_valid && !packet_data_ready) && !deconst_buf_valid) begin deconst_buf_valid <= 1'b1; deconst_buf_flag <= {(PACKETWIDTH/32){1'b0}}; + packet_data_ready <= 1'b0; end if (read_en) begin // Register which words in the Deconstruction buffer have been read // Check if All Words have been Read - if (deconst_buf_flag_reduced && !(packet_data_valid && packet_data_ready)) begin + if (deconst_buf_flag_reduced && deconst_buf_valid) begin // Set Ready High To Get more Data into Buffer deconst_buf_valid <= 1'b0; packet_data_ready <= 1'b1; @@ -103,8 +102,8 @@ end // Register Ready Control always_comb begin - // Not Ready Out when waiting for Valid Data on Input - rready = ~packet_data_ready; + // Ready when data in deconstruction buffer + rready = deconst_buf_valid; // Write Ready always high but doesn't do anywthing wready = 1'b1; end