Update for max of 16 SRAMs
diff --git a/verilog/rtl/openram_testchip.v b/verilog/rtl/openram_testchip.v
index 33fa3ec..ee6d6c6 100644
--- a/verilog/rtl/openram_testchip.v
+++ b/verilog/rtl/openram_testchip.v
@@ -1,227 +1,362 @@
-module openram_testchip(

-   `ifdef USE_POWER_PINS

-      inout vdda1,        // User area 1 3.3V supply

-      inout vdda2,        // User area 2 3.3V supply

-      inout vssa1,        // User area 1 analog ground

-      inout vssa2,        // User area 2 analog ground

-      inout vccd1,        // User area 1 1.8V supply

-      inout vccd2,        // User area 2 1.8v supply

-      inout vssd1,        // User area 1 digital ground

-      inout vssd2,        // User area 2 digital ground

-  `endif

-  input         la_clk,

-  input         gpio_clk,

-  input         la_sram_clk,

-  input         gpio_sram_clk,

-  input         reset,

-  input         la_in_load, 

-  input         gpio_scan,

-  input         la_sram_load,

-  input         gpio_sram_load,

-  input  [111:0] la_bits,

-  input         gpio_bit,

-  input         in_select,

-  input  [31:0] sram0_rw_in,

-  input  [31:0] sram0_ro_in,

-  input  [31:0] sram1_rw_in,

-  input  [31:0] sram1_ro_in,

-  input  [31:0] sram2_rw_in,

-  input  [31:0] sram3_rw_in,

-  input  [31:0] sram4_rw_in,

-  //input  [63:0] sram5_rw_in,

-  output reg [54:0] sram0_connections,

-  output reg [54:0] sram1_connections,

-  output reg [47:0] sram2_connections,

-  output reg [45:0] sram3_connections,

-  output reg [46:0] sram4_connections,

-  output reg sram0_clk,

-  output reg sram1_clk,

-  output reg sram2_clk,

-  output reg sram3_clk,

-  output reg sram4_clk,

-  //output reg sram5_clk,

-  //output reg [82:0] sram5_connections,

-  output reg [31:0] la_data0,

-  output reg [31:0] la_data1,

-  output reg gpio_data0,

-  output reg gpio_data1

-);

-

-reg clk;

-reg sram_clk;

-

-// Store input instruction

-reg [111:0] sram_register;

-

-// Hold dout from SRAM

-// clocked by SRAM clk

-reg [31:0] sram0_rw_data;

-reg [31:0] sram0_ro_data;

-reg [31:0] sram1_rw_data;

-reg [31:0] sram1_ro_data;

-reg [31:0] sram2_data;

-reg [31:0] sram3_data;

-reg [31:0] sram4_data;

-//reg [63:0] sram5_data;

-

-// Mux output to connect final output data

-// into sram_register

-reg [31:0] read_data0;

-reg [31:0] read_data1;

-

-// SRAM input connections

-reg [3:0] chip_select;

-

-reg [15:0] addr0;

-reg [31:0] din0;

-reg csb0;

-reg web0;

-reg [3:0] wmask0;

-

-reg [15:0] addr1;

-reg [31:0] din1;

-reg csb1;

-reg web1;

-reg [3:0] wmask1;

-

-//Selecting clock pin

-always @(*) begin

-    clk = in_select ? gpio_clk : la_clk;

-    sram_clk = in_select ? gpio_sram_clk : la_sram_clk;

-    sram0_clk = sram_clk;

-    sram1_clk = sram_clk;

-    sram2_clk = sram_clk;

-    sram3_clk = sram_clk;

-    sram4_clk = sram_clk;

-    //sram5_clk = sram_clk;

-end

-

-always @ (posedge clk) begin

-    if(reset) begin

-        sram_register <= 112'd1;

-    end

-    //GPIO scanning for transfer

-    else if(gpio_scan) begin

-        sram_register <= {sram_register[110:0], gpio_bit};

-    end

-    else if(la_in_load) begin

-        sram_register <= la_bits;

-    end

-    else if(gpio_sram_load || la_sram_load) begin

-        sram_register <= {sram_register[111:92], read_data0, sram_register[59:38], read_data1, sram_register[5:0]};

-        //sram_register <= sram_register;

-    end

-end

-

-// Splitting register bits into fields

-always @(sram_register) begin

-    chip_select = sram_register[111:108];

-        

-    addr0 = sram_register[107:92];

-    din0 = sram_register[91:60];

-    csb0 = sram_register[59];

-    web0 = sram_register[58];

-    wmask0 = sram_register[57:54];

-

-    addr1 = sram_register[53:38];

-    din1 = sram_register[37:6];

-    csb1 = sram_register[5];

-    web1 = sram_register[4];

-    wmask1 = sram_register[3:0];

-end

-

-always @ (*) begin

-    sram0_connections = (chip_select == 0) ? {csb0, web0, wmask0, addr0[7:0], din0, csb1, addr1[7:0]} : {55{1'b1}};     //32x256 Dual Port

-    sram1_connections = (chip_select == 1) ? {csb0, web0, wmask0, addr0[7:0], din0, csb1, addr1[7:0]} : {55{1'b1}};     //32x256 Dual Port

-    sram2_connections = (chip_select == 2) ? {csb0, web0, wmask0, addr0[9:0], din0} : {48{1'b1}};   //32x1024 Single Port

-    sram3_connections = (chip_select == 3) ? {csb0, web0, wmask0, addr0[7:0], din0} : {46{1'b1}};      //32x256 Single Port

-    sram4_connections = (chip_select == 4) ? {csb0, web0, wmask0, addr0[8:0], din0} : {47{1'b1}};      //32x512 Single Port

-    //sram5_connections = (chip_select == 5) ? {csb0, web0, wmask0, addr0, din0} : {83{1'b0}};

-end

-

-// Store dout of each SRAM  

-always @ (posedge sram_clk) begin   

-    if(reset) begin

-        sram0_rw_data <= 32'd0;

-        sram0_ro_data <= 32'd0;

-

-        sram1_rw_data <= 32'd0;

-        sram1_ro_data <= 32'd0;

-

-        sram2_data <= 32'd0;

-        sram3_data <= 32'd0;

-        sram4_data <= 32'd0;

-        //sram5_data <= 32'd0; 

-    end

-    else begin

-        sram0_rw_data <= sram0_rw_in;

-        sram0_ro_data <= sram0_ro_in;

-

-        sram1_rw_data <= sram1_rw_in;

-        sram1_ro_data <= sram1_ro_in;

-

-        sram2_data <= sram2_rw_in;

-        sram3_data <= sram3_rw_in;

-        sram4_data <= sram4_rw_in;

-        //sram5_data <= sram5_rw_in; 

-    end

-end

-

-// Mux value of correct SRAM dout FF to feed into 

-// DFF clocked by la/gpio clk 

-always @ (*) begin

-    case(chip_select)

-    3'd0: begin

-        if(web0) begin

-            read_data0 = sram0_rw_data;

-        end

-        if(web1) begin

-            read_data1 = sram0_ro_data;

-        end

-    end 

-    3'd1: begin

-        if(web0) begin

-            read_data0 = sram1_rw_data;

-        end

-        if(web1) begin

-            read_data1 = sram1_ro_data;

-        end

-    end 

-    3'd2: begin

-        if(web0) begin

-            read_data0 = sram2_data;

-        end

-    end

-    3'd3: begin

-        if(web0) begin

-            read_data0 = sram3_data;

-        end

-    end

-    3'd4: begin

-        if(web0) begin

-            read_data0 = sram4_data;

-        end

-    end

-    //3'd5: assign read_data0 = sram5_data;

-    default: begin

-        read_data0 = 32'd0;

-        read_data1 = 32'd0;

-    end

-    endcase

-end

-

-// Output transfer

-always @ (*) begin

-    if(in_select) begin

-        gpio_data0 = sram_register[91];

-        gpio_data1 = sram_register[37];

-    end    

-    else begin

-        la_data0 = sram_register[91:60];

-        la_data1 = sram_register[37:6];

-    end

-end

-

-endmodule

-

-

+module openram_testchip(
+`ifdef USE_POWER_PINS
+			inout vdda1,        // User area 1 3.3V supply
+			inout vdda2,        // User area 2 3.3V supply
+			inout vssa1,        // User area 1 analog ground
+			inout vssa2,        // User area 2 analog ground
+			inout vccd1,        // User area 1 1.8V supply
+			inout vccd2,        // User area 2 1.8v supply
+			inout vssd1,        // User area 1 digital ground
+			inout vssd2,        // User area 2 digital ground
+`endif
+			input         reset,
+			// Select either GPIO or LA mode
+			input         in_select,
+			
+			input         la_clk,
+			input         la_sram_clk,
+			input         la_in_load, 
+			input         la_sram_load,
+			input  [127:0] la_bits,
+			// GPIO bit to clock control register
+			input         gpio_clk,
+			input         gpio_in,
+			input         gpio_sram_clk,
+			input         gpio_scan,
+			input         gpio_sram_load,
+
+			// SRAM data outputs to be captured
+			input  [31:0] sram0_dout0,
+			input  [31:0] sram0_dout1,
+			input  [31:0] sram1_dout0,
+			input  [31:0] sram1_dout1,
+			input  [31:0] sram2_dout0,
+			input  [31:0] sram2_dout1,
+			input  [31:0] sram3_dout0,
+			input  [31:0] sram3_dout1,
+			input  [31:0] sram4_dout0,
+			input  [31:0] sram4_dout1,
+			input  [31:0] sram5_dout0,
+			input  [31:0] sram5_dout1,
+			input  [31:0] sram6_dout0,
+			input  [31:0] sram6_dout1,
+			input  [31:0] sram7_dout0,
+			input  [31:0] sram7_dout1,
+			input  [31:0] sram8_dout0,
+			input  [31:0] sram8_dout1,
+			input  [31:0] sram9_dout0,
+			input  [31:0] sram9_dout1,
+			input  [31:0] sram10_dout0,
+			input  [31:0] sram10_dout1,
+			input  [31:0] sram11_dout0,
+			input  [31:0] sram11_dout1,
+			input  [31:0] sram12_dout0,
+			input  [31:0] sram12_dout1,
+			input  [31:0] sram13_dout0,
+			input  [31:0] sram13_dout1,
+			input  [31:0] sram14_dout0,
+			input  [31:0] sram14_dout1,
+			input  [31:0] sram15_dout0,
+			input  [31:0] sram15_dout1,
+			
+			// Shared control/data to the SRAMs
+			output reg [15:0] addr0;
+			output reg [31:0] din0;
+			output reg 	  web0;
+			output reg [3:0]  wmask0;
+			output reg [15:0] addr1;
+			output reg [31:0] din1;
+			output reg 	  web1;
+			output reg [3:0]  wmask1;
+			// One CSB for each SRAM
+			output reg [15:0] csb0;
+			output reg [15:0] csb1;
+			
+			// Clocks for each SRAM
+			output reg sram0_clk,
+			output reg sram1_clk,
+			output reg sram2_clk,
+			output reg sram3_clk,
+			output reg sram4_clk,
+			output reg sram5_clk,
+			output reg sram6_clk,
+			output reg sram7_clk,
+			output reg sram8_clk,
+			output reg sram9_clk,
+			output reg sram10_clk,
+			output reg sram11_clk,
+			output reg sram12_clk,
+			output reg sram13_clk,
+			output reg sram14_clk,
+			output reg sram15_clk,
+			output reg [127:0] la_data,
+			output reg gpio_out
+);
+
+   reg clk;
+   reg sram_clk;
+
+// Store input instruction
+   reg [111:0] sram_register;
+   reg 	       csb0_temp;
+   reg 	       csb1_temp;
+
+// Hold dout from SRAM
+// clocked by SRAM clk
+   reg [31:0] sram0_dout0;
+   reg [31:0] sram0_dout1;
+   reg [31:0] sram1_dout0;
+   reg [31:0] sram1_dout1;
+   reg [31:0] sram2_dout0;
+   reg [31:0] sram2_dout1;
+   reg [31:0] sram3_dout0;
+   reg [31:0] sram3_dout1;
+   reg [31:0] sram4_dout0;
+   reg [31:0] sram4_dout1;
+   reg [31:0] sram5_dout0;
+   reg [31:0] sram5_dout1;
+   reg [31:0] sram6_dout0;
+   reg [31:0] sram6_dout1;
+   reg [31:0] sram7_dout0;
+   reg [31:0] sram7_dout1;
+   reg [31:0] sram8_dout0;
+   reg [31:0] sram8_dout1;
+   reg [31:0] sram9_dout0;
+   reg [31:0] sram9_dout1;
+   reg [31:0] sram10_dout0;
+   reg [31:0] sram10_dout1;
+   reg [31:0] sram11_dout0;
+   reg [31:0] sram11_dout1;
+   reg [31:0] sram12_dout0;
+   reg [31:0] sram12_dout1;
+   reg [31:0] sram13_dout0;
+   reg [31:0] sram13_dout1;
+   reg [31:0] sram14_dout0;
+   reg [31:0] sram14_dout1;
+   reg [31:0] sram15_dout0;
+   reg [31:0] sram15_dout1;
+
+// Mux output to connect final output data
+// into sram_register
+   reg [31:0] read_data0;
+   reg [31:0] read_data1;
+
+// SRAM input connections
+   reg [3:0]  chip_select;
+
+//Selecting clock pin
+always @(*) begin
+    clk = in_select ? gpio_clk : la_clk;
+    sram_clk = in_select ? gpio_sram_clk : la_sram_clk;
+    sram0_clk = sram_clk;
+    sram1_clk = sram_clk;
+    sram2_clk = sram_clk;
+    sram3_clk = sram_clk;
+    sram4_clk = sram_clk;
+    sram5_clk = sram_clk;
+    sram6_clk = sram_clk;
+    sram7_clk = sram_clk;
+    sram8_clk = sram_clk;
+    sram9_clk = sram_clk;
+    sram10_clk = sram_clk;
+    sram11_clk = sram_clk;
+    sram12_clk = sram_clk;
+    sram13_clk = sram_clk;
+    sram14_clk = sram_clk;
+    sram15_clk = sram_clk;
+end
+
+always @ (posedge clk) begin
+   if(reset) begin
+      sram_register <= 112'd1;
+   end
+   // GPIO scanning for transfer
+   else if(gpio_scan) begin
+      sram_register <= {sram_register[110:0], gpio_in};
+   end
+   // LA parallel load
+   else if(la_in_load) begin
+      sram_register <= la_bits;
+   end
+   // Store results for read out
+   else if(gpio_sram_load || la_sram_load) begin
+      sram_register <= {sram_register[111:92], read_data0, sram_register[59:38], read_data1, sram_register[5:0]};
+   end
+end
+
+// Splitting register bits into fields
+always @(sram_register) begin
+    chip_select = sram_register[111:108];
+        
+    addr0 = sram_register[107:92];
+    din0 = sram_register[91:60];
+    csb0_temp = sram_register[59];
+    web0 = sram_register[58];
+    wmask0 = sram_register[57:54];
+
+    addr1 = sram_register[53:38];
+    din1 = sram_register[37:6];
+    csb1_temp = sram_register[5];
+    web1 = sram_register[4];
+    wmask1 = sram_register[3:0];
+end // always @ (sram_register)
+   
+// Apply the correct CSB
+always @(*) begin
+   csb0 = csb0_temp << chip_select;
+   csb1 = csb1_temp << chip_select;
+end
+       
+
+// Store dout of each SRAM  
+always @ (posedge sram_clk) begin   
+    if(reset) begin
+        sram0_data0 <= 32'd0;
+        sram0_data1 <= 32'd0;
+        sram1_data0 <= 32'd0;
+        sram1_data1 <= 32'd0;
+        sram2_data0 <= 32'd0;
+        sram2_data1 <= 32'd0;
+        sram3_data0 <= 32'd0;
+        sram3_data1 <= 32'd0;
+        sram4_data0 <= 32'd0;
+        sram4_data1 <= 32'd0;
+        sram5_data0 <= 32'd0;
+        sram5_data1 <= 32'd0;
+        sram6_data0 <= 32'd0;
+        sram6_data1 <= 32'd0;
+        sram7_data0 <= 32'd0;
+        sram7_data1 <= 32'd0;
+        sram8_data0 <= 32'd0;
+        sram8_data1 <= 32'd0;
+        sram9_data0 <= 32'd0;
+        sram9_data1 <= 32'd0;
+        sram10_data0 <= 32'd0;
+        sram10_data1 <= 32'd0;
+        sram11_data0 <= 32'd0;
+        sram11_data1 <= 32'd0;
+        sram12_data0 <= 32'd0;
+        sram12_data1 <= 32'd0;
+        sram13_data0 <= 32'd0;
+        sram13_data1 <= 32'd0;
+        sram14_data0 <= 32'd0;
+        sram14_data1 <= 32'd0;
+        sram15_data0 <= 32'd0;
+        sram15_data1 <= 32'd0;
+    end
+    else begin
+       sram0_data0 <= sram0_dout0;
+       sram0_data1 <= sram0_dout1;
+       sram1_data0 <= sram1_dout0;
+       sram1_data1 <= sram1_dout1;
+       sram2_data0 <= sram2_dout0;
+       sram2_data1 <= sram2_dout1;
+       sram3_data0 <= sram3_dout0;
+       sram3_data1 <= sram3_dout1;
+       sram4_data0 <= sram4_dout0;
+       sram4_data1 <= sram4_dout1;
+       sram5_data0 <= sram5_dout0;
+       sram5_data1 <= sram5_dout1;
+       sram6_data0 <= sram6_dout0;
+       sram6_data1 <= sram6_dout1;
+       sram7_data0 <= sram7_dout0;
+       sram7_data1 <= sram7_dout1;
+       sram8_data0 <= sram8_dout0;
+       sram8_data1 <= sram8_dout1;
+       sram9_data0 <= sram9_dout0;
+       sram9_data1 <= sram9_dout1;
+       sram10_data0 <= sram10_dout0;
+       sram10_data1 <= sram10_dout1;
+       sram11_data0 <= sram11_dout0;
+       sram11_data1 <= sram11_dout1;
+       sram12_data0 <= sram12_dout0;
+       sram12_data1 <= sram12_dout1;
+       sram13_data0 <= sram13_dout0;
+       sram13_data1 <= sram13_dout1;
+       sram14_data0 <= sram14_dout0;
+       sram14_data1 <= sram14_dout1;
+       sram15_data0 <= sram15_dout0;
+       sram15_data1 <= sram15_dout1;
+    end
+end
+
+// Mux value of correct SRAM dout FF to feed into 
+// DFF clocked by la/gpio clk 
+always @ (*) begin
+    case(chip_select)
+    4'd0: begin
+       read_data0 = sram0_dout0;
+       read_data1 = sram0_dout1;
+    end
+    4'd1: begin
+       read_data0 = sram1_dout0;
+       read_data1 = sram1_dout1;
+    end
+    4'd2: begin
+       read_data0 = sram2_dout0;
+       read_data1 = sram2_dout1;
+    end
+    4'd3: begin
+       read_data0 = sram3_dout0;
+       read_data1 = sram3_dout1;
+    end
+    4'd4: begin
+       read_data0 = sram4_dout0;
+       read_data1 = sram4_dout1;
+    end
+    4'd5: begin
+       read_data0 = sram5_dout0;
+       read_data1 = sram5_dout1;
+    end
+    4'd6: begin
+       read_data0 = sram6_dout0;
+       read_data1 = sram6_dout1;
+    end
+    4'd7: begin
+       read_data0 = sram7_dout0;
+       read_data1 = sram7_dout1;
+    end
+    4'd8: begin
+       read_data0 = sram8_dout0;
+       read_data1 = sram8_dout1;
+    end
+    4'd9: begin
+       read_data0 = sram9_dout0;
+       read_data1 = sram9_dout1;
+    end
+    4'd10: begin
+       read_data0 = sram10_dout0;
+       read_data1 = sram10_dout1;
+    end
+    4'd11: begin
+       read_data0 = sram11_dout0;
+       read_data1 = sram11_dout1;
+    end
+    4'd12: begin
+       read_data0 = sram12_dout0;
+       read_data1 = sram12_dout1;
+    end
+    4'd13: begin
+       read_data0 = sram13_dout0;
+       read_data1 = sram13_dout1;
+    end
+    4'd14: begin
+       read_data0 = sram14_dout0;
+       read_data1 = sram14_dout1;
+    end
+    4'd15: begin
+       read_data0 = sram15_dout0;
+       read_data1 = sram15_dout1;
+    end
+    endcase
+end
+
+// Output logic
+always @ (*) begin
+   gpio_out = sram_register[111];
+   la_data = {17'd0, sram_register};
+end
+
+endmodule
+
+