From f81392e6e4a59e33185ade91a86c4968d207b8ff Mon Sep 17 00:00:00 2001
From: Daniel Newbrook <dwn1c21@soton.ac.uk>
Date: Fri, 4 Apr 2025 11:40:27 +0100
Subject: [PATCH] Add TSMC 16nm SRAM wrapper

---
 flist/asic_lib_ip_TSMC16nm.flist | 26 ++++++++++
 sram/TSMC16nm/verilog/sl_sram.v  | 82 ++++++++++++++++++++++++++++++++
 2 files changed, 108 insertions(+)
 create mode 100644 flist/asic_lib_ip_TSMC16nm.flist
 create mode 100644 sram/TSMC16nm/verilog/sl_sram.v

diff --git a/flist/asic_lib_ip_TSMC16nm.flist b/flist/asic_lib_ip_TSMC16nm.flist
new file mode 100644
index 0000000..f7638aa
--- /dev/null
+++ b/flist/asic_lib_ip_TSMC16nm.flist
@@ -0,0 +1,26 @@
+//-----------------------------------------------------------------------------
+// ASIC Library Memory Filelist
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// Daniel Newbrook (d.newbrook@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Verilog Command File for NanoSoC Testbench
+//-----------------------------------------------------------------------------
+
+// ============= Verilog library extensions ===========
++libext+.v+.vlib
+
+// =============    NanoSoC Testbench search path    =============
+// +incdir+$(SOCLABS_ASIC_LIB_TECH_DIR)/sram/verilog/
+
+// - Memories
+$(SOCLABS_ASIC_LIB_TECH_DIR)/sram/verilog/sl_ahb_sram.v
+$(SOCLABS_ASIC_LIB_TECH_DIR)/sram/TSMC16nm/verilog/sl_sram.v
+$(SOCLABS_ASIC_LIB_TECH_DIR)/rom/verilog/bootrom.v
+
+$(SOCLABS_ASIC_LIB_TECH_DIR)/sync/verilog/SYNCHRONIZER_EDGES.v
\ No newline at end of file
diff --git a/sram/TSMC16nm/verilog/sl_sram.v b/sram/TSMC16nm/verilog/sl_sram.v
new file mode 100644
index 0000000..62173e1
--- /dev/null
+++ b/sram/TSMC16nm/verilog/sl_sram.v
@@ -0,0 +1,82 @@
+//-----------------------------------------------------------------------------
+// SoCLabs ASIC RAM Wrapper 
+// - substituted using the same name from the FPGA tech library
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.flynn@soton.ac.uk)
+//
+// Copyright 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module sl_sram #(
+// --------------------------------------------------------------------------
+// Parameter Declarations
+// --------------------------------------------------------------------------
+  parameter AW = 16
+ )
+ (
+  `ifdef POWER_PINS
+  inout  wire          VDD,
+  inout  wire          VSS,
+  `endif
+  // Inputs
+  input  wire          CLK,
+  input  wire [AW-1:2] ADDR,
+  input  wire [31:0]   WDATA,
+  input  wire [3:0]    WREN,
+  input  wire          CS,
+
+  // Outputs
+  output wire [31:0]   RDATA
+  );
+
+// fixed pre-compiled 16K instance supported
+localparam  TIE_EMA = 3'b010;
+localparam  TIE_EMAW = 2'b00;
+wire [AW-3:0] ADDR12 = ADDR;
+wire [31:0] WDATA32 = WDATA;
+wire [31:0] RDATA32;
+assign      RDATA = RDATA32;
+wire        CEN = !CS;
+wire        GWEN = &(~WREN);
+wire [31:0] WEN32 = { {8{!WREN[3]}},{8{!WREN[2]}},{8{!WREN[1]}},{8{!WREN[0]}} };
+localparam  TIE_RET1N = 1'b1;
+
+generate
+  if (AW==14) begin
+     sram_16k
+      u_sram (
+      .Q     (RDATA32),
+      .CLK   (CLK),
+      .CEN   (CEN),
+      .WEN   (WEN32),
+      .A     (ADDR12),
+      .D     (WDATA32),
+      .EMA   (TIE_EMA),
+      .EMAW  (TIE_EMAW),
+      .GWEN  (GWEN),
+      .RET1N (TIE_RET1N)
+    );
+
+  end
+  else if (AW==15) begin
+     sram_32k
+      u_sram (
+      .Q     (RDATA32),
+      .CLK   (CLK),
+      .CEN   (CEN),
+      .WEN   (WEN32),
+      .A     (ADDR12),
+      .D     (WDATA32),
+      .EMA   (TIE_EMA),
+      .EMAW  (TIE_EMAW),
+      .GWEN  (GWEN),
+      .RET1N (TIE_RET1N)
+    );
+  end
+endgenerate
+ 
+
+endmodule
-- 
GitLab