diff --git a/hdl/src/wrapper_ahb_deconstruct.sv b/hdl/src/wrapper_packet_construct.sv similarity index 87% rename from hdl/src/wrapper_ahb_deconstruct.sv rename to hdl/src/wrapper_packet_construct.sv index e46ecc957eb6e506088a8acd08617a1fd22b83ce..97e00594ec584a4f979c90b3dc633b35632d8db9 100644 --- a/hdl/src/wrapper_ahb_deconstruct.sv +++ b/hdl/src/wrapper_packet_construct.sv @@ -1,4 +1,15 @@ -module wrapper_ahb_deconstruct #( +//----------------------------------------------------------------------------- +// SoC Labs Wrapper Files +// - Accelerator Packet Construction from AHB Write Transactions +// 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_packet_construct #( parameter ADDRWIDTH=11, parameter PACKETWIDTH=512 )( @@ -70,8 +81,6 @@ always_ff @(posedge hclk or negedge hresetn) begin // Reset Construction Buffer const_buffer <= 512'd0; end - end else begin - // TODO: Implement Error Propogation/Waitstates end end end diff --git a/hdl/src/wrapper_packet_deconstruct.sv b/hdl/src/wrapper_packet_deconstruct.sv new file mode 100644 index 0000000000000000000000000000000000000000..438a9ed925eb9b58a171da49b76e5a7a30a208cc --- /dev/null +++ b/hdl/src/wrapper_packet_deconstruct.sv @@ -0,0 +1,112 @@ +//----------------------------------------------------------------------------- +// SoC Labs Wrapper Files +// - Accelerator Packet Deconstruction from AHB Read Transactions +// 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_packet_deconstruct #( + parameter ADDRWIDTH=11, + parameter PACKETWIDTH=256 +)( + input logic hclk, // clock + input logic hresetn, // reset + + //Register interface + input logic [ADDRWIDTH-1:0] addr, + input logic read_en, + input logic write_en, + input logic [3:0] byte_strobe, + input logic [31:0] wdata, + output logic [31:0] rdata, + output logic wready, + output logic rready, + + // Valid/Ready interface + input logic [PACKETWIDTH-1:0] data_in, + input logic data_in_last, + input logic data_in_valid, + output logic data_in_ready +); + +// Create Deconstruction Buffer +// logic [PACKETWIDTH-1:0] deconst_buffer; +logic [(PACKETWIDTH/32)-1:0][31:0] deconst_buf; + +// Create Array to Flag which buffers have been read +logic [(PACKETWIDTH/32)-1:0] deconst_buf_flag; + +// Curent Buffer Flag +logic [(PACKETWIDTH/32)-1:0] cur_deconst_buf_flag; +assign cur_deconst_buf_flag = 1'b1 << buf_word_sel; + +// Check All Flags are High +logic deconst_buf_flag_reduced; +assign deconst_buf_flag_reduced = &(deconst_buf_flag | (cur_deconst_buf_flag)); + +// Select which word in buffer to read +logic [$clog2(PACKETWIDTH/32)-1:0] buf_word_sel; +assign buf_word_sel = addr[4:2]; + +logic 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 + data_in_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 (!data_in_ready && !deconst_buf_valid) begin + data_in_ready <= 1'b1; + end + // Read Packet into Deconstruction Buffer + if (data_in_valid && data_in_ready) begin + data_in_ready <= 1'b0; + deconst_buf <= data_in; + deconst_buf_valid <= 1'b1; + deconst_buf_flag <= {(PACKETWIDTH/32){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 && !(data_in_valid && data_in_ready)) begin + // Set Ready High To Get more Data into Buffer + deconst_buf_valid <= 1'b0; + data_in_ready <= 1'b1; + end else begin + deconst_buf_flag <= deconst_buf_flag | cur_deconst_buf_flag; + end + end + end +end + +// Read Condition +always_comb begin + if (read_en) begin + // Read appropriate 32 bits from buffer - wrapping behaviour + rdata = deconst_buf[buf_word_sel]; + end else begin + rdata = 32'd0; + end +end + +// Register Ready Control +always_comb begin + // Not Ready Out when waiting for Valid Data on Input + rready = ~data_in_ready; + // Write Ready always high but doesn't do anywthing + wready = 1'b1; +end + +endmodule \ No newline at end of file diff --git a/hdl/src/wrapper_top.sv b/hdl/src/wrapper_top.sv index 49b4b261bdff2f2968054ad4ccb8be1c903d7e8c..81fd1f7b38fbf357b967bbe3e517c9f14d0bb5ff 100644 --- a/hdl/src/wrapper_top.sv +++ b/hdl/src/wrapper_top.sv @@ -1,5 +1,5 @@ //----------------------------------------------------------------------------- -// SoC Labs Basic Top-level AHB Wrapper +// SoC Labs Basic Top-level Accelerator Wrapper // A joint work commissioned on behalf of SoC Labs; under Arm Academic Access license. // // Contributors @@ -36,7 +36,8 @@ // The example slave always output ready and OKAY response to the master //----------------------------------------------------------------------------- `timescale 1ns/1ns -`include "wrapper_ahb_deconstruct.sv" +`include "wrapper_packet_construct.sv" +`include "wrapper_packet_deconstruct.sv" `include "wrapper_ahb_interface.sv" module wrapper_top #( @@ -92,11 +93,22 @@ module wrapper_top #( logic output_rready; // Internal Wiring - logic [511:0] data_out; - logic data_out_last; - logic data_out_valid; - logic data_out_ready; + logic [511:0] packet_data_out; + logic packet_data_out_last; + logic packet_data_out_valid; + logic packet_data_out_ready; + // Internal Wiring + logic [511:0] packet_data_in; + logic packet_data_in_last; + logic packet_data_in_valid; + logic packet_data_in_ready; + + // Test Wire Assignments + assign packet_data_in = packet_data_out; + assign packet_data_in_last = packet_data_out_last; + assign packet_data_in_valid = packet_data_out_valid; + assign packet_data_out_ready = packet_data_in_ready; //----------------------------------------------------------- // Module logic start //---------------------------------------------------------- @@ -143,27 +155,52 @@ module wrapper_top #( .output_rready (output_rready) ); - wrapper_ahb_deconstruct - #(ADDRWIDTH-1) // Only half address map allocated to this device - u_wrapper_ahb_deconstruct ( - .hclk (HCLK), - .hresetn (HRESETn), - - // Register interface - .addr (input_addr), - .read_en (input_read_en), - .write_en (input_write_en), - .byte_strobe (input_byte_strobe), - .wdata (input_wdata), - .rdata (input_rdata), - .wready (input_wready), - .rready (input_rready), - - // Valid/Ready Interface - .data_out (data_out), - .data_out_last (data_out_last), - .data_out_valid (data_out_valid), - .data_out_ready (data_out_ready) + wrapper_packet_construct #( + (ADDRWIDTH - 1), // Only half address map allocated to this device + 512 // Packet Width + ) u_wrapper_packet_construct ( + .hclk (HCLK), + .hresetn (HRESETn), + + // Register interface + .addr (input_addr), + .read_en (input_read_en), + .write_en (input_write_en), + .byte_strobe (input_byte_strobe), + .wdata (input_wdata), + .rdata (input_rdata), + .wready (input_wready), + .rready (input_rready), + + // Valid/Ready Interface + .data_out (packet_data_out), + .data_out_last (packet_data_out_last), + .data_out_valid (packet_data_out_valid), + .data_out_ready (packet_data_out_ready) + ); + + wrapper_packet_deconstruct #( + (ADDRWIDTH - 1), // Only half address map allocated to this device + 512 // Ouptut Packet WIdth + ) u_wrapper_packet_deconstruct ( + .hclk (HCLK), + .hresetn (HRESETn), + + // Register interface + .addr (output_addr), + .read_en (output_read_en), + .write_en (output_write_en), + .byte_strobe (output_byte_strobe), + .wdata (output_wdata), + .rdata (output_rdata), + .wready (output_wready), + .rready (output_rready), + + // Valid/Ready Interface + .data_in (packet_data_in), + .data_in_last (packet_data_in_last), + .data_in_valid (packet_data_in_valid), + .data_in_ready (packet_data_in_ready) ); //----------------------------------------------------------- @@ -173,9 +210,11 @@ module wrapper_top #( //--------------------- //Test Logic //--------------------- - assign data_out_ready = 1'b1; - assign output_wready = 1'b1; - assign output_rready = 1'b1; + // assign data_out_ready = 1'b1; + // assign output_wready = 1'b1; + // assign output_rready = 1'b1; + // assign output_wready = 1'b1; + // assign output_rready = 1'b1; `ifdef ARM_AHB_ASSERT_ON `include "std_ovl_defines.h" diff --git a/hdl/verif/tb_wrapper_top.sv b/hdl/verif/tb_wrapper_top.sv index 8c4c945cc3bce16ef62dd7b4ebc86724b2e05346..1d535499c8fe71017f62ff4ea7edfdefedf05a8c 100644 --- a/hdl/verif/tb_wrapper_top.sv +++ b/hdl/verif/tb_wrapper_top.sv @@ -39,7 +39,6 @@ `include "cmsdk_ahb_fileread_funnel.v" `include "cmsdk_ahb_fileread_master32.v" `include "cmsdk_ahb_default_slave.v" -`include "cmsdk_ahb_ram_beh.v" `include "cmsdk_ahb_slave_mux.v" `include "wrapper_top.sv" @@ -74,22 +73,18 @@ wire hmastlock; wire [31:0] haddr; wire [31:0] hwdata; -// AHB Multiplexor signals, currently 3 slaves : example AHB slave, SRAM and default slave +// Accelerator AHB Signals wire hsel0; wire hreadyout0; wire hresp0; wire [31:0] hrdata0; +// Default Slave AHB Signals wire hsel1; wire hreadyout1; wire hresp1; wire [31:0] hrdata1; -wire hsel2; -wire hreadyout2; -wire hresp2; -wire [31:0] hrdata2; - reg HCLK; reg HRESETn; @@ -117,12 +112,10 @@ always // Address decoder, need to be changed for other configuration //******************************************************************************** // 0x60010000 - 0x60010FFF : HSEL #0 - Hash Accelerator -// 0x11000000 - 0x11000FFF : HSEL #1 - SRAM -// Other addresses : HSEL #2 - Default slave +// Other addresses : HSEL #1 - Default slave assign hsel0 = (haddr[31:12] == 20'h60010)? 1'b1:1'b0; - assign hsel1 = (haddr[31:12] == 20'h11000)? 1'b1:1'b0; - assign hsel2 = (hsel0|hsel1)? 1'b0:1'b1; + assign hsel1 = hsel0 ? 1'b0:1'b1; //******************************************************************************** // File read bus master: @@ -186,10 +179,10 @@ cmsdk_ahb_fileread_master32 #(InputFileName, .HREADYOUT1 (hreadyout1), .HRESP1 (hresp1), .HRDATA1 (hrdata1), - .HSEL2 (hsel2), // Input Port 2 - .HREADYOUT2 (hreadyout2), - .HRESP2 (hresp2), - .HRDATA2 (hrdata2), + .HSEL2 (1'b0), // Input Port 2 + .HREADYOUT2 (), + .HRESP2 (), + .HRDATA2 (), .HSEL3 (1'b0), // Input Port 3 .HREADYOUT3 (), .HRESP3 (), @@ -248,46 +241,20 @@ cmsdk_ahb_fileread_master32 #(InputFileName, ); -//******************************************************************************** -// Slave module 2: Behaviour AHB SRAM slave module -//******************************************************************************** - - // Behavioral SRAM model - cmsdk_ahb_ram_beh - #(20, //AW - "", //filename - 5, //WS_N // First access wait state - 5 //WS_S // Subsequent access wait state - ) u_ahb_ram_beh ( - .HCLK (HCLK), - .HRESETn (HRESETn), - .HSEL (hsel1), // AHB inputs - .HADDR (haddr[19:0]), - .HTRANS (htrans), - .HSIZE (hsize), - .HWRITE (hwrite), - .HWDATA (hwdata), - .HREADY (hready), - - .HREADYOUT (hreadyout1), // Outputs - .HRDATA (hrdata1), - .HRESP (hresp1) - ); - //******************************************************************************** -// Slave module 3: AHB default slave module +// Slave module 2: AHB default slave module //******************************************************************************** cmsdk_ahb_default_slave u_ahb_default_slave( .HCLK (HCLK), .HRESETn (HRESETn), - .HSEL (hsel2), + .HSEL (hsel1), .HTRANS (htrans), .HREADY (hready), - .HREADYOUT (hreadyout2), - .HRESP (hresp2) + .HREADYOUT (hreadyout1), + .HRESP (hresp1) ); - assign hrdata2 = {32{1'b0}}; // Default slave don't have data + assign hrdata1 = {32{1'b0}}; // Default slave don't have data endmodule \ No newline at end of file