diff --git a/flist/wrapper_ip.flist b/flist/wrapper_ip.flist index 865ac08e34467f6eece7db7a29558f371fea2374..b5af8f2bfe12431f3f567d38c3e324fc369ec211 100644 --- a/flist/wrapper_ip.flist +++ b/flist/wrapper_ip.flist @@ -22,6 +22,7 @@ $(ACC_WRAPPER_DIR)/hdl/src/wrapper_ahb_packet_constructor.sv $(ACC_WRAPPER_DIR)/hdl/src/wrapper_ahb_packet_deconstructor.sv +$(ACC_WRAPPER_DIR)/hdl/src/wrapper_read_addr_calc.sv $(ACC_WRAPPER_DIR)/hdl/src/wrapper_data_req.sv $(ACC_WRAPPER_DIR)/hdl/src/wrapper_ahb_reg_interface.sv $(ACC_WRAPPER_DIR)/hdl/src/wrapper_ahb_vr_interface.sv diff --git a/hdl/src/wrapper_ahb_packet_deconstructor.sv b/hdl/src/wrapper_ahb_packet_deconstructor.sv index 408cee32360b22d627dd88109eee058ec58870c1..c582f7e0eacdf852a4eff4a168f92ecf1b2c4d57 100644 --- a/hdl/src/wrapper_ahb_packet_deconstructor.sv +++ b/hdl/src/wrapper_ahb_packet_deconstructor.sv @@ -30,15 +30,22 @@ module wrapper_ahb_packet_deconstructor #( output logic [31:0] hrdatas, // Valid/Ready Input Port - input logic [PACKETWIDTH-1:0] packet_data, - input logic packet_data_last, - input logic packet_data_valid, - output logic packet_data_ready, + input logic [PACKETWIDTH-1:0] packet_data, + input logic packet_data_last, + input logic [PACKETSPACEWIDTH-1:0] packet_data_remain, // Number of remaining packets after this transfer + input logic packet_data_valid, + output logic packet_data_ready, // Data Request Signal - output logic data_req + output logic data_req, + + // Start Read Address for Current Block + output logic [ADDRWIDTH-1:0] block_read_addr ); + localparam PACKETBYTEWIDTH = $clog2(PACKETWIDTH/8); // Number of Bytes in Packet + localparam PACKETSPACEWIDTH = ADDRWIDTH-PACKETBYTEWIDTH; // Number of Bits to represent all Packets in Address Space + // Register Interface Connections logic [ADDRWIDTH-1:0] addr; logic read_en; @@ -51,6 +58,9 @@ module wrapper_ahb_packet_deconstructor #( // Deconstructor Ready for more Data logic deconstructor_ready; + + // Number of Packets in Block + logic [PACKETSPACEWIDTH:0] block_packet_count; // AHB Interface Instantiation wrapper_ahb_reg_interface #( @@ -104,6 +114,16 @@ module wrapper_ahb_packet_deconstructor #( .data_req (data_req) ); + // Relative Read Address Calculator + wrapper_read_addr_calc #( + ADDRWIDTH, // Only half address map allocated to this device + PACKETWIDTH // Packet Width + ) u_wrapper_read_addr_calc ( + // Address Interfaces + .block_packet_count (block_packet_count), + .block_read_addr (block_read_addr) + ); + // Valid/Ready Packet Generator wrapper_packet_deconstruct #( ADDRWIDTH, // Only half address map allocated to this device @@ -125,9 +145,13 @@ module wrapper_ahb_packet_deconstructor #( // Valid/Ready Interface .packet_data (packet_data), .packet_data_last (packet_data_last), + .packet_data_remain (packet_data_remain), .packet_data_valid (packet_data_valid), .packet_data_ready (packet_data_ready), + // Block Packet Count + .block_packet_count (block_packet_count), + // Data Request .deconstructor_ready (deconstructor_ready) ); diff --git a/hdl/src/wrapper_packet_deconstruct.sv b/hdl/src/wrapper_packet_deconstruct.sv index cfc95bf306a8ebcee243f4c5748ee9f195ffe25c..0a0b76299a529307a6fe5a2738236bd1382c1b77 100644 --- a/hdl/src/wrapper_packet_deconstruct.sv +++ b/hdl/src/wrapper_packet_deconstruct.sv @@ -27,14 +27,21 @@ module wrapper_packet_deconstruct #( output logic rready, // Valid/Ready interface - input logic [PACKETWIDTH-1:0] packet_data, - input logic packet_data_last, - input logic packet_data_valid, - output logic packet_data_ready, + input logic [PACKETWIDTH-1:0] packet_data, + input logic packet_data_last, + input logic [PACKETSPACEWIDTH-1:0] packet_data_remain, // Number of remaining packets after this transfer + input logic packet_data_valid, + output logic packet_data_ready, + + // Number of Packets in Current + output logic [PACKETSPACEWIDTH:0] block_packet_count, - output logic deconstructor_ready + output logic deconstructor_ready ); +localparam PACKETBYTEWIDTH = $clog2(PACKETWIDTH/8); // Number of Bytes in Packet +localparam PACKETSPACEWIDTH = ADDRWIDTH-PACKETBYTEWIDTH; // Number of Bits to represent all Packets in Address Space + // Create Deconstruction Buffer logic [(PACKETWIDTH/32)-1:0][31:0] deconst_buf; assign deconst_buf = packet_data; @@ -56,6 +63,10 @@ assign deconst_buf_flag_reduced = &(deconst_buf_flag | (cur_deconst_buf_flag)); logic deconst_buf_valid; assign deconstructor_ready = deconst_buf_valid; + +// Previous Packet Last +logic prev_packet_last; + // 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 @@ -63,9 +74,11 @@ assign deconstructor_ready = deconst_buf_valid; always_ff @(posedge hclk or negedge hresetn) begin if (~hresetn) begin // Reset Values + block_packet_count <= {(PACKETSPACEWIDTH+1){1'b0}}; packet_data_ready <= 1'b0; deconst_buf_valid <= 1'b0; deconst_buf_flag <= {(PACKETWIDTH/32){1'b0}}; + prev_packet_last <= 1'b1; end else begin if (packet_data_valid && packet_data_ready) begin packet_data_ready <= 1'b0; @@ -75,6 +88,8 @@ always_ff @(posedge hclk or negedge hresetn) begin deconst_buf_valid <= 1'b1; deconst_buf_flag <= {(PACKETWIDTH/32){1'b0}}; packet_data_ready <= 1'b0; + // Update block_packet_count + block_packet_count <= prev_packet_last ? ({1'b0, packet_data_remain} + 'b1) : block_packet_count; end if (read_en) begin // Register which words in the Deconstruction buffer have been read @@ -83,6 +98,7 @@ always_ff @(posedge hclk or negedge hresetn) begin // Set Ready High To Get more Data into Buffer deconst_buf_valid <= 1'b0; packet_data_ready <= 1'b1; + prev_packet_last <= packet_data_last; end else begin deconst_buf_flag <= deconst_buf_flag | cur_deconst_buf_flag; end diff --git a/hdl/src/wrapper_read_addr_calc.sv b/hdl/src/wrapper_read_addr_calc.sv new file mode 100644 index 0000000000000000000000000000000000000000..9049c9f742b5f9bd675f7ea14306c579b27395ff --- /dev/null +++ b/hdl/src/wrapper_read_addr_calc.sv @@ -0,0 +1,36 @@ +//----------------------------------------------------------------------------- +// SoC Labs Relative Read Address Calculator +// 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_read_addr_calc #( + //parameter for address width + parameter ADDRWIDTH=11, + parameter PACKETWIDTH=256 +)( + // Number of Packets in Current Block + input logic [PACKETSPACEWIDTH:0] block_packet_count, + + // Start Read Address + output logic [ADDRWIDTH-1:0] block_read_addr +); + + localparam PACKETBYTES = (PACKETWIDTH+7)/8; // Number of Bytes in Packet + localparam PACKETBYTEWIDTH = $clog2(PACKETBYTES); // Number of Bits to represent Bytes in Packet + localparam PACKETSPACEWIDTH = ADDRWIDTH-PACKETBYTEWIDTH; // Number of Bits to represent all Packets in Address Space + + logic [ADDRWIDTH-1:0] block_byte_count; // Number of Bytes taken up by Block + logic [ADDRWIDTH:0] end_word_addr; // First Address at start of next region + logic [ADDRWIDTH:0] block_read_addr_ext; // Relative Read Address extended by 1 bit + + assign block_byte_count = block_packet_count * PACKETBYTES; + assign end_word_addr = {1'b1,{(ADDRWIDTH){1'b0}}}; + assign block_read_addr_ext = end_word_addr - block_byte_count; + assign block_read_addr = block_read_addr_ext[ADDRWIDTH-1:0]; + +endmodule \ No newline at end of file