diff --git a/hdl/registers/config.yml b/hdl/registers/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..446767e17c2cc28f41f6058c460768698a7c7a44
--- /dev/null
+++ b/hdl/registers/config.yml
@@ -0,0 +1,3 @@
+bus_width:      32
+address_width:  4
+protocol:       apb
\ No newline at end of file
diff --git a/hdl/registers/out/status_regs.h b/hdl/registers/out/status_regs.h
new file mode 100644
index 0000000000000000000000000000000000000000..f16e7c6d7a4160a737ec5d648760acd10756b384
--- /dev/null
+++ b/hdl/registers/out/status_regs.h
@@ -0,0 +1,31 @@
+#ifndef STATUS_REGS_H
+#define STATUS_REGS_H
+#include "stdint.h"
+#define STATUS_REGS_STATUS_0_STATUS_ID_BIT_WIDTH 6
+#define STATUS_REGS_STATUS_0_STATUS_ID_BIT_MASK 0x3f
+#define STATUS_REGS_STATUS_0_STATUS_ID_BIT_OFFSET 0
+#define STATUS_REGS_STATUS_0_STATUS_BUFFERED_IDS_BIT_WIDTH 3
+#define STATUS_REGS_STATUS_0_STATUS_BUFFERED_IDS_BIT_MASK 0x7
+#define STATUS_REGS_STATUS_0_STATUS_BUFFERED_IDS_BIT_OFFSET 6
+#define STATUS_REGS_STATUS_0_STATUS_ERR_BUFFER_BIT_WIDTH 1
+#define STATUS_REGS_STATUS_0_STATUS_ERR_BUFFER_BIT_MASK 0x1
+#define STATUS_REGS_STATUS_0_STATUS_ERR_BUFFER_BIT_OFFSET 9
+#define STATUS_REGS_STATUS_0_STATUS_ERR_PACKET_BIT_WIDTH 1
+#define STATUS_REGS_STATUS_0_STATUS_ERR_PACKET_BIT_MASK 0x1
+#define STATUS_REGS_STATUS_0_STATUS_ERR_PACKET_BIT_OFFSET 10
+#define STATUS_REGS_STATUS_0_STATUS_ERR_CLEAR_BIT_WIDTH 1
+#define STATUS_REGS_STATUS_0_STATUS_ERR_CLEAR_BIT_MASK 0x1
+#define STATUS_REGS_STATUS_0_STATUS_ERR_CLEAR_BIT_OFFSET 11
+#define STATUS_REGS_STATUS_0_STATUS_PACKET_COUNT_BIT_WIDTH 10
+#define STATUS_REGS_STATUS_0_STATUS_PACKET_COUNT_BIT_MASK 0x3ff
+#define STATUS_REGS_STATUS_0_STATUS_PACKET_COUNT_BIT_OFFSET 12
+#define STATUS_REGS_STATUS_0_BYTE_WIDTH 4
+#define STATUS_REGS_STATUS_0_BYTE_SIZE 4
+#define STATUS_REGS_STATUS_0_BYTE_OFFSET 0x0
+typedef struct {
+  uint32_t status_0;
+  uint32_t __reserved_0x4;
+  uint32_t __reserved_0x8;
+  uint32_t __reserved_0xc;
+} status_regs_t;
+#endif
diff --git a/hdl/registers/out/status_regs.md b/hdl/registers/out/status_regs.md
new file mode 100644
index 0000000000000000000000000000000000000000..2b36b17f7ef19ce14de0b96030afe998b003b396
--- /dev/null
+++ b/hdl/registers/out/status_regs.md
@@ -0,0 +1,24 @@
+## status_regs
+
+* byte_size
+    * 16
+
+|name|offset_address|
+|:--|:--|
+|[status_0](#status_regs-status_0)|0x0|
+
+### <div id="status_regs-status_0"></div>status_0
+
+* offset_address
+    * 0x0
+* type
+    * default
+
+|name|bit_assignments|type|initial_value|reference|labels|comment|
+|:--|:--|:--|:--|:--|:--|:--|
+|status_id|[5:0]|ro|0x00|||Contains last ID Value in ID Buffer|
+|status_buffered_ids|[8:6]|ro|0x0|||Number of IDs in ID Buffer|
+|status_err_buffer|[9]|ro|0x0|||ID Buffer Error|
+|status_err_packet|[10]|ro|0x0|||Dropped Packet Error|
+|status_err_clear|[11]|wo|0x0|||Clear Error Flags|
+|status_packet_count|[21:12]|ro|0x000|||Number of Packets Passed Through|
diff --git a/hdl/registers/out/status_regs.sv b/hdl/registers/out/status_regs.sv
new file mode 100644
index 0000000000000000000000000000000000000000..006211faf39012606ee9fb7c51424cd1cdc98872
--- /dev/null
+++ b/hdl/registers/out/status_regs.sv
@@ -0,0 +1,233 @@
+`ifndef rggen_connect_bit_field_if
+  `define rggen_connect_bit_field_if(RIF, FIF, LSB, WIDTH) \
+  assign  FIF.valid                 = RIF.valid; \
+  assign  FIF.read_mask             = RIF.read_mask[LSB+:WIDTH]; \
+  assign  FIF.write_mask            = RIF.write_mask[LSB+:WIDTH]; \
+  assign  FIF.write_data            = RIF.write_data[LSB+:WIDTH]; \
+  assign  RIF.read_data[LSB+:WIDTH] = FIF.read_data; \
+  assign  RIF.value[LSB+:WIDTH]     = FIF.value;
+`endif
+`ifndef rggen_tie_off_unused_signals
+  `define rggen_tie_off_unused_signals(WIDTH, VALID_BITS, RIF) \
+  if (1) begin : __g_tie_off \
+    genvar  __i; \
+    for (__i = 0;__i < WIDTH;++__i) begin : g \
+      if (!(((VALID_BITS) >> __i) & 1'b1)) begin : g \
+        assign  RIF.read_data[__i]  = 1'b0; \
+        assign  RIF.value[__i]      = 1'b0; \
+      end \
+    end \
+  end
+`endif
+module status_regs
+  import rggen_rtl_pkg::*;
+#(
+  parameter int ADDRESS_WIDTH = 4,
+  parameter bit PRE_DECODE = 0,
+  parameter bit [ADDRESS_WIDTH-1:0] BASE_ADDRESS = '0,
+  parameter bit ERROR_STATUS = 0,
+  parameter bit [31:0] DEFAULT_READ_DATA = '0
+)(
+  input logic i_clk,
+  input logic i_rst_n,
+  rggen_apb_if.slave apb_if,
+  input logic [5:0] i_status_0_status_id,
+  input logic [2:0] i_status_0_status_buffered_ids,
+  input logic i_status_0_status_err_buffer,
+  input logic i_status_0_status_err_packet,
+  output logic o_status_0_status_err_clear,
+  input logic [9:0] i_status_0_status_packet_count
+);
+  rggen_register_if #(4, 32, 32) register_if[1]();
+  rggen_apb_adapter #(
+    .ADDRESS_WIDTH        (ADDRESS_WIDTH),
+    .LOCAL_ADDRESS_WIDTH  (4),
+    .BUS_WIDTH            (32),
+    .REGISTERS            (1),
+    .PRE_DECODE           (PRE_DECODE),
+    .BASE_ADDRESS         (BASE_ADDRESS),
+    .BYTE_SIZE            (16),
+    .ERROR_STATUS         (ERROR_STATUS),
+    .DEFAULT_READ_DATA    (DEFAULT_READ_DATA)
+  ) u_adapter (
+    .i_clk        (i_clk),
+    .i_rst_n      (i_rst_n),
+    .apb_if       (apb_if),
+    .register_if  (register_if)
+  );
+  generate if (1) begin : g_status_0
+    rggen_bit_field_if #(32) bit_field_if();
+    `rggen_tie_off_unused_signals(32, 32'h003fffff, bit_field_if)
+    rggen_default_register #(
+      .READABLE       (1),
+      .WRITABLE       (1),
+      .ADDRESS_WIDTH  (4),
+      .OFFSET_ADDRESS (4'h0),
+      .BUS_WIDTH      (32),
+      .DATA_WIDTH     (32),
+      .REGISTER_INDEX (0)
+    ) u_register (
+      .i_clk        (i_clk),
+      .i_rst_n      (i_rst_n),
+      .register_if  (register_if[0]),
+      .bit_field_if (bit_field_if)
+    );
+    if (1) begin : g_status_id
+      localparam bit [5:0] INITIAL_VALUE = 6'h00;
+      rggen_bit_field_if #(6) bit_field_sub_if();
+      `rggen_connect_bit_field_if(bit_field_if, bit_field_sub_if, 0, 6)
+      rggen_bit_field #(
+        .WIDTH              (6),
+        .STORAGE            (0),
+        .EXTERNAL_READ_DATA (1),
+        .TRIGGER            (0)
+      ) u_bit_field (
+        .i_clk              (i_clk),
+        .i_rst_n            (i_rst_n),
+        .bit_field_if       (bit_field_sub_if),
+        .o_write_trigger    (),
+        .o_read_trigger     (),
+        .i_sw_write_enable  ('0),
+        .i_hw_write_enable  ('0),
+        .i_hw_write_data    ('0),
+        .i_hw_set           ('0),
+        .i_hw_clear         ('0),
+        .i_value            (i_status_0_status_id),
+        .i_mask             ('1),
+        .o_value            (),
+        .o_value_unmasked   ()
+      );
+    end
+    if (1) begin : g_status_buffered_ids
+      localparam bit [2:0] INITIAL_VALUE = 3'h0;
+      rggen_bit_field_if #(3) bit_field_sub_if();
+      `rggen_connect_bit_field_if(bit_field_if, bit_field_sub_if, 6, 3)
+      rggen_bit_field #(
+        .WIDTH              (3),
+        .STORAGE            (0),
+        .EXTERNAL_READ_DATA (1),
+        .TRIGGER            (0)
+      ) u_bit_field (
+        .i_clk              (i_clk),
+        .i_rst_n            (i_rst_n),
+        .bit_field_if       (bit_field_sub_if),
+        .o_write_trigger    (),
+        .o_read_trigger     (),
+        .i_sw_write_enable  ('0),
+        .i_hw_write_enable  ('0),
+        .i_hw_write_data    ('0),
+        .i_hw_set           ('0),
+        .i_hw_clear         ('0),
+        .i_value            (i_status_0_status_buffered_ids),
+        .i_mask             ('1),
+        .o_value            (),
+        .o_value_unmasked   ()
+      );
+    end
+    if (1) begin : g_status_err_buffer
+      localparam bit INITIAL_VALUE = 1'h0;
+      rggen_bit_field_if #(1) bit_field_sub_if();
+      `rggen_connect_bit_field_if(bit_field_if, bit_field_sub_if, 9, 1)
+      rggen_bit_field #(
+        .WIDTH              (1),
+        .STORAGE            (0),
+        .EXTERNAL_READ_DATA (1),
+        .TRIGGER            (0)
+      ) u_bit_field (
+        .i_clk              (i_clk),
+        .i_rst_n            (i_rst_n),
+        .bit_field_if       (bit_field_sub_if),
+        .o_write_trigger    (),
+        .o_read_trigger     (),
+        .i_sw_write_enable  ('0),
+        .i_hw_write_enable  ('0),
+        .i_hw_write_data    ('0),
+        .i_hw_set           ('0),
+        .i_hw_clear         ('0),
+        .i_value            (i_status_0_status_err_buffer),
+        .i_mask             ('1),
+        .o_value            (),
+        .o_value_unmasked   ()
+      );
+    end
+    if (1) begin : g_status_err_packet
+      localparam bit INITIAL_VALUE = 1'h0;
+      rggen_bit_field_if #(1) bit_field_sub_if();
+      `rggen_connect_bit_field_if(bit_field_if, bit_field_sub_if, 10, 1)
+      rggen_bit_field #(
+        .WIDTH              (1),
+        .STORAGE            (0),
+        .EXTERNAL_READ_DATA (1),
+        .TRIGGER            (0)
+      ) u_bit_field (
+        .i_clk              (i_clk),
+        .i_rst_n            (i_rst_n),
+        .bit_field_if       (bit_field_sub_if),
+        .o_write_trigger    (),
+        .o_read_trigger     (),
+        .i_sw_write_enable  ('0),
+        .i_hw_write_enable  ('0),
+        .i_hw_write_data    ('0),
+        .i_hw_set           ('0),
+        .i_hw_clear         ('0),
+        .i_value            (i_status_0_status_err_packet),
+        .i_mask             ('1),
+        .o_value            (),
+        .o_value_unmasked   ()
+      );
+    end
+    if (1) begin : g_status_err_clear
+      localparam bit INITIAL_VALUE = 1'h0;
+      rggen_bit_field_if #(1) bit_field_sub_if();
+      `rggen_connect_bit_field_if(bit_field_if, bit_field_sub_if, 11, 1)
+      rggen_bit_field #(
+        .WIDTH          (1),
+        .INITIAL_VALUE  (INITIAL_VALUE),
+        .SW_READ_ACTION (RGGEN_READ_NONE),
+        .SW_WRITE_ONCE  (0),
+        .TRIGGER        (0)
+      ) u_bit_field (
+        .i_clk              (i_clk),
+        .i_rst_n            (i_rst_n),
+        .bit_field_if       (bit_field_sub_if),
+        .o_write_trigger    (),
+        .o_read_trigger     (),
+        .i_sw_write_enable  ('1),
+        .i_hw_write_enable  ('0),
+        .i_hw_write_data    ('0),
+        .i_hw_set           ('0),
+        .i_hw_clear         ('0),
+        .i_value            ('0),
+        .i_mask             ('1),
+        .o_value            (o_status_0_status_err_clear),
+        .o_value_unmasked   ()
+      );
+    end
+    if (1) begin : g_status_packet_count
+      localparam bit [9:0] INITIAL_VALUE = 10'h000;
+      rggen_bit_field_if #(10) bit_field_sub_if();
+      `rggen_connect_bit_field_if(bit_field_if, bit_field_sub_if, 12, 10)
+      rggen_bit_field #(
+        .WIDTH              (10),
+        .STORAGE            (0),
+        .EXTERNAL_READ_DATA (1),
+        .TRIGGER            (0)
+      ) u_bit_field (
+        .i_clk              (i_clk),
+        .i_rst_n            (i_rst_n),
+        .bit_field_if       (bit_field_sub_if),
+        .o_write_trigger    (),
+        .o_read_trigger     (),
+        .i_sw_write_enable  ('0),
+        .i_hw_write_enable  ('0),
+        .i_hw_write_data    ('0),
+        .i_hw_set           ('0),
+        .i_hw_clear         ('0),
+        .i_value            (i_status_0_status_packet_count),
+        .i_mask             ('1),
+        .o_value            (),
+        .o_value_unmasked   ()
+      );
+    end
+  end endgenerate
+endmodule
diff --git a/hdl/registers/out/status_regs_ral_pkg.sv b/hdl/registers/out/status_regs_ral_pkg.sv
new file mode 100644
index 0000000000000000000000000000000000000000..e9a85a7ab829d098a86b82637ad2c160394d6288
--- /dev/null
+++ b/hdl/registers/out/status_regs_ral_pkg.sv
@@ -0,0 +1,34 @@
+package status_regs_ral_pkg;
+  import uvm_pkg::*;
+  import rggen_ral_pkg::*;
+  `include "uvm_macros.svh"
+  `include "rggen_ral_macros.svh"
+  class status_0_reg_model extends rggen_ral_reg;
+    rand rggen_ral_field status_id;
+    rand rggen_ral_field status_buffered_ids;
+    rand rggen_ral_field status_err_buffer;
+    rand rggen_ral_field status_err_packet;
+    rand rggen_ral_field status_err_clear;
+    rand rggen_ral_field status_packet_count;
+    function new(string name);
+      super.new(name, 32, 0);
+    endfunction
+    function void build();
+      `rggen_ral_create_field(status_id, 0, 6, "RO", 1, 6'h00, 1, -1, "")
+      `rggen_ral_create_field(status_buffered_ids, 6, 3, "RO", 1, 3'h0, 1, -1, "")
+      `rggen_ral_create_field(status_err_buffer, 9, 1, "RO", 1, 1'h0, 1, -1, "")
+      `rggen_ral_create_field(status_err_packet, 10, 1, "RO", 1, 1'h0, 1, -1, "")
+      `rggen_ral_create_field(status_err_clear, 11, 1, "WO", 0, 1'h0, 1, -1, "")
+      `rggen_ral_create_field(status_packet_count, 12, 10, "RO", 1, 10'h000, 1, -1, "")
+    endfunction
+  endclass
+  class status_regs_block_model extends rggen_ral_block;
+    rand status_0_reg_model status_0;
+    function new(string name);
+      super.new(name, 4, 0);
+    endfunction
+    function void build();
+      `rggen_ral_create_reg(status_0, '{}, 4'h0, "RW", "g_status_0.u_register")
+    endfunction
+  endclass
+endpackage
diff --git a/hdl/registers/out/status_regs_rtl_pkg.sv b/hdl/registers/out/status_regs_rtl_pkg.sv
new file mode 100644
index 0000000000000000000000000000000000000000..e5b57358c2d4a85f1d396dc74bb03085991a59b7
--- /dev/null
+++ b/hdl/registers/out/status_regs_rtl_pkg.sv
@@ -0,0 +1,23 @@
+package status_regs_rtl_pkg;
+  localparam int STATUS_0_BYTE_WIDTH = 4;
+  localparam int STATUS_0_BYTE_SIZE = 4;
+  localparam bit [3:0] STATUS_0_BYTE_OFFSET = 4'h0;
+  localparam int STATUS_0_STATUS_ID_BIT_WIDTH = 6;
+  localparam bit [5:0] STATUS_0_STATUS_ID_BIT_MASK = 6'h3f;
+  localparam int STATUS_0_STATUS_ID_BIT_OFFSET = 0;
+  localparam int STATUS_0_STATUS_BUFFERED_IDS_BIT_WIDTH = 3;
+  localparam bit [2:0] STATUS_0_STATUS_BUFFERED_IDS_BIT_MASK = 3'h7;
+  localparam int STATUS_0_STATUS_BUFFERED_IDS_BIT_OFFSET = 6;
+  localparam int STATUS_0_STATUS_ERR_BUFFER_BIT_WIDTH = 1;
+  localparam bit STATUS_0_STATUS_ERR_BUFFER_BIT_MASK = 1'h1;
+  localparam int STATUS_0_STATUS_ERR_BUFFER_BIT_OFFSET = 9;
+  localparam int STATUS_0_STATUS_ERR_PACKET_BIT_WIDTH = 1;
+  localparam bit STATUS_0_STATUS_ERR_PACKET_BIT_MASK = 1'h1;
+  localparam int STATUS_0_STATUS_ERR_PACKET_BIT_OFFSET = 10;
+  localparam int STATUS_0_STATUS_ERR_CLEAR_BIT_WIDTH = 1;
+  localparam bit STATUS_0_STATUS_ERR_CLEAR_BIT_MASK = 1'h1;
+  localparam int STATUS_0_STATUS_ERR_CLEAR_BIT_OFFSET = 11;
+  localparam int STATUS_0_STATUS_PACKET_COUNT_BIT_WIDTH = 10;
+  localparam bit [9:0] STATUS_0_STATUS_PACKET_COUNT_BIT_MASK = 10'h3ff;
+  localparam int STATUS_0_STATUS_PACKET_COUNT_BIT_OFFSET = 12;
+endpackage
diff --git a/hdl/registers/status_regs.yml b/hdl/registers/status_regs.yml
new file mode 100644
index 0000000000000000000000000000000000000000..13a3ca47c9db4094d3dfc5d9f19b2d2d1c733528
--- /dev/null
+++ b/hdl/registers/status_regs.yml
@@ -0,0 +1,12 @@
+register_blocks:
+  - name: status_regs
+    byte_size: 16
+    registers:
+    - name: status_0
+      bit_fields:
+      - { name: status_id,           bit_assignment: { width: 6 }, type: ro  ,  initial_value: 0, comment: Contains last ID Value in ID Buffer }
+      - { name: status_buffered_ids, bit_assignment: { width: 3 },  type: ro  , initial_value: 0, comment: Number of IDs in ID Buffer }
+      - { name: status_err_buffer,   bit_assignment: { width: 1 },  type: ro  , initial_value: 0, comment: ID Buffer Error }
+      - { name: status_err_packet,   bit_assignment: { width: 1 },  type: ro  , initial_value: 0, comment: Dropped Packet Error }
+      - { name: status_err_clear,    bit_assignment: { width: 1 },  type: wo  , initial_value: 0, comment: Clear Error Flags }
+      - { name: status_packet_count, bit_assignment: { width: 10 }, type: ro  , initial_value: 0, comment: Number of Packets Passed Through }
\ No newline at end of file
diff --git a/hdl/src/sha256_config_sync.sv b/hdl/src/sha256_config_sync.sv
index 3c4a1d7186e1380fe9deaca2ab508406f7bd2817..6f75f98ae86da5359655d8c0ba6ff360ccac2651 100644
--- a/hdl/src/sha256_config_sync.sv
+++ b/hdl/src/sha256_config_sync.sv
@@ -40,8 +40,7 @@ module sha256_config_sync (
     // Status Out - Gets updated after every hash
     // - outputs size and then clears size to 0
     // - status regs are looking for non-zero size
-    output logic [63:0] status_size,
-    input  logic status_clear
+    output logic [63:0] status_size
 );
 
     logic [1:0] state, next_state;
@@ -109,9 +108,7 @@ module sha256_config_sync (
             
             2'd1: begin
                     // Handle Status Signals
-                    if (status_clear) begin
-                        next_status_size = 64'd0;
-                    end
+                    next_status_size = 64'd0;
                     // Check outputs can be written to
                     if (cfg_out_valid && !cfg_out_ready) begin
                         // If data out is valid and ready is low, there is already data waiting to be transferred
@@ -158,9 +155,7 @@ module sha256_config_sync (
             
             2'd2: begin // Cfg already handshaked - wait for ID handshake
                     // Handle Status Signals
-                    if (status_clear) begin
-                        next_status_size = 64'd0;
-                    end
+                    next_status_size = 64'd0;
                     // These can be overloaded later if data is written to the outputs
                     next_cfg_out_valid = 1'b0; 
                     next_cfg_in_ready  = 1'b0;
@@ -182,9 +177,7 @@ module sha256_config_sync (
 
             2'd3: begin // ID already handshaked - wait for config handshake
                     // Handle Status Signals
-                    if (status_clear) begin
-                        next_status_size = 64'd0;
-                    end
+                    next_status_size = 64'd0;
                     // These can be overloaded later if data is written to the outputs
                     next_cfg_out_valid = 1'b0; 
                     next_cfg_in_ready  = 1'b1;
diff --git a/hdl/src/sha256_packet_manager.sv b/hdl/src/sha256_packet_manager.sv
new file mode 100644
index 0000000000000000000000000000000000000000..be8170d8f6c37ac91af60dd6d700778fe2af2841
--- /dev/null
+++ b/hdl/src/sha256_packet_manager.sv
@@ -0,0 +1,147 @@
+//-----------------------------------------------------------------------------
+// SoC Labs Basic SHA-256 Packet Manager
+// 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)
+//-----------------------------------------------------------------------------
+`include "sha256_id_buf.sv"
+`include "sha256_id_issue.sv"
+`include "sha256_id_validator.sv"
+`include "sha256_config_sync.sv"
+
+module sha256_packet_manager (
+    // Clocking Signals
+    input logic clk,
+    input logic nrst,
+    input logic en,
+
+    // Synchronous, localised reset
+    input logic sync_rst,
+    
+    // Config data and Handshaking
+    input  logic [63:0] cfg_in_size,
+    input  logic [1:0]  cfg_in_scheme,
+    input  logic cfg_in_last,
+    input  logic cfg_in_valid,
+    output logic cfg_in_ready,
+    
+    // Hash IN
+    input  logic [255:0] hash_in,
+    input  logic [5:0]   hash_in_id,
+    input  logic hash_in_last,
+    input  logic hash_in_valid,
+    output logic hash_in_ready,
+    
+    // Hash Out
+    output logic [255:0] hash_out,
+    output logic hash_out_err,
+    output logic hash_out_last,
+    output logic hash_out_valid,
+    input  logic hash_out_ready,
+
+    // Status Signals
+    output logic [5:0] status_id,
+    output logic [1:0] status_err,
+    output logic [9:0] status_packet_count,
+    output logic [2:0] status_buffered_ids,
+    output logic [63:0] status_size,
+    input  logic status_err_clear
+);
+
+    logic [5:0] issue_id;
+    logic issue_id_last;
+    logic issue_id_buf_ready, issue_id_buf_valid;
+    logic issue_id_cfg_ready, issue_id_cfg_valid;
+
+    logic [5:0] id_buf_id;
+    logic id_buf_id_last;
+    logic id_buf_id_ready, id_buf_id_valid;
+
+    logic [63:0] cfg_size;
+    logic [1:0]  cfg_scheme;
+    logic [5:0] cfg_id;
+    logic cfg_last;
+    logic cfg_ready, cfg_valid;
+
+    sha256_id_issue id_issuer (
+        .clk               (clk),
+        .nrst              (nrst),
+        .en                (en),
+        .sync_rst          (sync_rst),
+        .id_out            (issue_id),
+        .id_out_last       (issue_id_last),
+        .id_out_cfg_valid  (issue_id_cfg_valid),
+        .id_out_cfg_ready  (issue_id_cfg_ready),
+        .id_out_buf_valid  (issue_id_buf_valid),
+        .id_out_buf_ready  (issue_id_buf_ready)
+    );
+
+    sha256_config_sync config_synchroniser (
+        .clk             (clk),
+        .nrst            (nrst),
+        .en              (en),
+        .sync_rst        (sync_rst),
+        .id_in           (issue_id),
+        .id_in_last      (issue_id_last),
+        .id_in_valid     (issue_id_cfg_valid),
+        .id_in_ready     (issue_id_cfg_ready),
+        .cfg_in_size     (cfg_in_size),
+        .cfg_in_scheme   (cfg_in_scheme),
+        .cfg_in_last     (cfg_in_last),
+        .cfg_in_valid    (cfg_in_valid),
+        .cfg_in_ready    (cfg_in_ready),
+        .cfg_out_size    (cfg_size),
+        .cfg_out_scheme  (cfg_scheme),
+        .cfg_out_id      (cfg_id),
+        .cfg_out_last    (cfg_last),
+        .cfg_out_valid   (cfg_valid),
+        .cfg_out_ready   (cfg_ready),
+        .status_size     (status_size)
+    );
+
+    sha256_id_buf id_buffer (
+        .clk                 (clk),
+        .nrst                (nrst),
+        .en                  (en),
+        .sync_rst            (sync_rst),
+        .id_in               (issue_id),
+        .id_in_last          (issue_id_last),
+        .id_in_valid         (issue_id_buf_valid),
+        .id_in_ready         (issue_id_buf_ready),
+        .id_out              (id_buf_id),
+        .id_out_last         (id_buf_id_last),
+        .id_out_valid        (id_buf_id_valid),
+        .id_out_ready        (id_buf_id_ready),
+        .status_id           (status_id),
+        .status_buffered_ids (status_buffered_ids)
+    );
+
+    sha256_id_validator id_validator (
+        .clk                  (clk),
+        .nrst                 (nrst),
+        .en                   (en),
+        .sync_rst             (sync_rst),
+        .id_in_buf            (id_buf_id),
+        .id_in_buf_last       (id_buf_id_last),
+        .id_in_buf_valid      (id_buf_id_valid),
+        .id_in_buf_ready      (id_buf_id_ready),
+        .hash_in              (hash_in),
+        .hash_in_id           (hash_in_id),
+        .hash_in_last         (hash_in_last),
+        .hash_in_valid        (hash_in_valid),
+        .hash_in_ready        (hash_in_ready),
+        .hash_out             (hash_out),
+        .hash_out_err         (hash_out_err),
+        .hash_out_last        (hash_out_last),
+        .hash_out_valid       (hash_out_valid),
+        .hash_out_ready       (hash_out_ready),
+        .status_err           (status_err),
+        .status_packet_count  (status_packet_count),
+        .status_clear         (status_err_clear)
+    );
+    
+endmodule
\ No newline at end of file