Merge branch 'main' of https://github.com/AmoghLonkar/openram_testchip into main
diff --git a/gds/sram_1rw0r0w_32_1024_sky130.gds b/gds/sram_1rw0r0w_32_1024_sky130.gds
index 12809dd..a16a24b 100644
--- a/gds/sram_1rw0r0w_32_1024_sky130.gds
+++ b/gds/sram_1rw0r0w_32_1024_sky130.gds
Binary files differ
diff --git a/gds/sram_1rw0r0w_32_256_sky130.gds b/gds/sram_1rw0r0w_32_256_sky130.gds
index 517adc2..691c94b 100644
--- a/gds/sram_1rw0r0w_32_256_sky130.gds
+++ b/gds/sram_1rw0r0w_32_256_sky130.gds
Binary files differ
diff --git a/gds/sram_1rw0r0w_32_512_sky130.gds b/gds/sram_1rw0r0w_32_512_sky130.gds
index 89b5ad5..4ea2763 100644
--- a/gds/sram_1rw0r0w_32_512_sky130.gds
+++ b/gds/sram_1rw0r0w_32_512_sky130.gds
Binary files differ
diff --git a/gds/sram_1rw0r0w_64_512_sky130.gds b/gds/sram_1rw0r0w_64_512_sky130.gds
index 8183185..d516363 100644
--- a/gds/sram_1rw0r0w_64_512_sky130.gds
+++ b/gds/sram_1rw0r0w_64_512_sky130.gds
Binary files differ
diff --git a/lef/sram_1rw0r0w_32_1024_sky130.lef b/lef/sram_1rw0r0w_32_1024_sky130.lef
index eaf7652..0747d8d 100644
--- a/lef/sram_1rw0r0w_32_1024_sky130.lef
+++ b/lef/sram_1rw0r0w_32_1024_sky130.lef
@@ -359,13 +359,13 @@
RECT 119.68 0.0 120.06 0.38 ;
END
END wmask0[3]
- PIN spare_wen0[0]
+ PIN spare_wen0
DIRECTION INPUT ;
PORT
LAYER met4 ;
RECT 317.56 0.0 317.94 0.38 ;
END
- END spare_wen0[0]
+ END spare_wen0
PIN dout0[0]
DIRECTION OUTPUT ;
PORT
diff --git a/lef/sram_1rw0r0w_32_256_sky130.lef b/lef/sram_1rw0r0w_32_256_sky130.lef
index 799258c..9db0792 100644
--- a/lef/sram_1rw0r0w_32_256_sky130.lef
+++ b/lef/sram_1rw0r0w_32_256_sky130.lef
@@ -345,13 +345,13 @@
RECT 107.44 0.0 107.82 0.38 ;
END
END wmask0[3]
- PIN spare_wen0[0]
+ PIN spare_wen0
DIRECTION INPUT ;
PORT
LAYER met4 ;
RECT 306.0 0.0 306.38 0.38 ;
END
- END spare_wen0[0]
+ END spare_wen0
PIN dout0[0]
DIRECTION OUTPUT ;
PORT
diff --git a/lef/sram_1rw0r0w_32_512_sky130.lef b/lef/sram_1rw0r0w_32_512_sky130.lef
index d543cf1..0ca3ba1 100644
--- a/lef/sram_1rw0r0w_32_512_sky130.lef
+++ b/lef/sram_1rw0r0w_32_512_sky130.lef
@@ -352,13 +352,13 @@
RECT 108.12 0.0 108.5 0.38 ;
END
END wmask0[3]
- PIN spare_wen0[0]
+ PIN spare_wen0
DIRECTION INPUT ;
PORT
LAYER met4 ;
RECT 306.68 0.0 307.06 0.38 ;
END
- END spare_wen0[0]
+ END spare_wen0
PIN dout0[0]
DIRECTION OUTPUT ;
PORT
diff --git a/lef/sram_1rw0r0w_64_512_sky130.lef b/lef/sram_1rw0r0w_64_512_sky130.lef
index 52b9509..d969802 100644
--- a/lef/sram_1rw0r0w_64_512_sky130.lef
+++ b/lef/sram_1rw0r0w_64_512_sky130.lef
@@ -604,13 +604,13 @@
RECT 157.76 0.0 158.14 0.38 ;
END
END wmask0[7]
- PIN spare_wen0[0]
+ PIN spare_wen0
DIRECTION INPUT ;
PORT
LAYER met4 ;
RECT 543.32 0.0 543.7 0.38 ;
END
- END spare_wen0[0]
+ END spare_wen0
PIN dout0[0]
DIRECTION OUTPUT ;
PORT
diff --git a/openlane/user_project_wrapper/config.tcl b/openlane/user_project_wrapper/config.tcl
index 4e2a110..1498604 100755
--- a/openlane/user_project_wrapper/config.tcl
+++ b/openlane/user_project_wrapper/config.tcl
@@ -53,6 +53,7 @@
$script_dir/../../verilog/rtl/sram_1rw0r0w_32_1024_sky130.v \
$script_dir/../../verilog/rtl/sram_1rw0r0w_32_256_sky130.v \
$script_dir/../../verilog/rtl/sram_1rw0r0w_32_512_sky130.v \
+ $script_dir/../../verilog/rtl/sram_1rw0r0w_32_512_sky130.v \
$script_dir/../../verilog/rtl/sram_1rw0r0w_64_512_sky130.v"
#$script_dir/../../verilog/rtl/openram_testchip.v
@@ -101,7 +102,6 @@
set ::env(RUN_KLAYOUT_XOR) 0
# Spray diodes
-
set ::env(DIODE_INSERTION_STRATEGY) 1
# The following is because there are no std cells in the example wrapper project.
#set ::env(SYNTH_TOP_LEVEL) 1
diff --git a/verilog/rtl/openram_defines.v b/verilog/rtl/openram_defines.v
index 67fc5f0..e7d34b1 100644
--- a/verilog/rtl/openram_defines.v
+++ b/verilog/rtl/openram_defines.v
@@ -11,11 +11,13 @@
// packet order:
// 4 chip_select
+
// 16 addr0
// 32 din0
// 1 csb0
// 1 web0
// 4 wmask0
+
// 16 addr1
// 32 din1
// 1 csb1
diff --git a/verilog/rtl/sram_1rw0r0w_32_1024_sky130.v b/verilog/rtl/sram_1rw0r0w_32_1024_sky130.v
index cabcde6..6b94771 100644
--- a/verilog/rtl/sram_1rw0r0w_32_1024_sky130.v
+++ b/verilog/rtl/sram_1rw0r0w_32_1024_sky130.v
@@ -9,11 +9,11 @@
vssd1,
`endif
// Port 0: RW
- clk0,csb0,web0,wmask0,addr0,din0,dout0
+ clk0,csb0,web0,wmask0,spare_wen0,addr0,din0,dout0
);
parameter NUM_WMASKS = 4 ;
- parameter DATA_WIDTH = 32 ;
+ parameter DATA_WIDTH = 33 ;
parameter ADDR_WIDTH = 10 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
// FIXME: This delay is arbitrary.
@@ -29,13 +29,15 @@
input csb0; // active low chip select
input web0; // active low write control
input [NUM_WMASKS-1:0] wmask0; // write mask
- input [ADDR_WIDTH-1:0] addr0;
+ input spare_wen0; // spare mask
+ input [ADDR_WIDTH-1:0] addr0;
input [DATA_WIDTH-1:0] din0;
output [DATA_WIDTH-1:0] dout0;
reg csb0_reg;
reg web0_reg;
reg [NUM_WMASKS-1:0] wmask0_reg;
+ reg spare_wen0_reg;
reg [ADDR_WIDTH-1:0] addr0_reg;
reg [DATA_WIDTH-1:0] din0_reg;
reg [DATA_WIDTH-1:0] dout0;
@@ -46,10 +48,11 @@
csb0_reg = csb0;
web0_reg = web0;
wmask0_reg = wmask0;
+ spare_wen0_reg = spare_wen0;
addr0_reg = addr0;
din0_reg = din0;
#(T_HOLD) dout0 = 32'bx;
- if ( !csb0_reg && web0_reg && VERBOSE )
+ if ( !csb0_reg && web0_reg && VERBOSE )
$display($time," Reading %m addr0=%b dout0=%b",addr0_reg,mem[addr0_reg]);
if ( !csb0_reg && !web0_reg && VERBOSE )
$display($time," Writing %m addr0=%b din0=%b wmask0=%b",addr0_reg,din0_reg,wmask0_reg);
@@ -70,6 +73,8 @@
mem[addr0_reg][23:16] = din0_reg[23:16];
if (wmask0_reg[3])
mem[addr0_reg][31:24] = din0_reg[31:24];
+ if (spare_wen0_reg)
+ mem[addr0_reg][32] = din0_reg[32];
end
end
diff --git a/verilog/rtl/sram_1rw0r0w_32_256_sky130.v b/verilog/rtl/sram_1rw0r0w_32_256_sky130.v
index 8af0030..1ec035a 100644
--- a/verilog/rtl/sram_1rw0r0w_32_256_sky130.v
+++ b/verilog/rtl/sram_1rw0r0w_32_256_sky130.v
@@ -9,11 +9,11 @@
vssd1,
`endif
// Port 0: RW
- clk0,csb0,web0,wmask0,addr0,din0,dout0
+ clk0,csb0,web0,wmask0,spare_wen0,addr0,din0,dout0
);
parameter NUM_WMASKS = 4 ;
- parameter DATA_WIDTH = 32 ;
+ parameter DATA_WIDTH = 33 ;
parameter ADDR_WIDTH = 8 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
// FIXME: This delay is arbitrary.
@@ -29,13 +29,15 @@
input csb0; // active low chip select
input web0; // active low write control
input [NUM_WMASKS-1:0] wmask0; // write mask
- input [ADDR_WIDTH-1:0] addr0;
+ input spare_wen0; // spare mask
+ input [ADDR_WIDTH-1:0] addr0;
input [DATA_WIDTH-1:0] din0;
output [DATA_WIDTH-1:0] dout0;
reg csb0_reg;
reg web0_reg;
reg [NUM_WMASKS-1:0] wmask0_reg;
+ reg spare_wen0_reg;
reg [ADDR_WIDTH-1:0] addr0_reg;
reg [DATA_WIDTH-1:0] din0_reg;
reg [DATA_WIDTH-1:0] dout0;
@@ -46,10 +48,11 @@
csb0_reg = csb0;
web0_reg = web0;
wmask0_reg = wmask0;
+ spare_wen0_reg = spare_wen0;
addr0_reg = addr0;
din0_reg = din0;
#(T_HOLD) dout0 = 32'bx;
- if ( !csb0_reg && web0_reg && VERBOSE )
+ if ( !csb0_reg && web0_reg && VERBOSE )
$display($time," Reading %m addr0=%b dout0=%b",addr0_reg,mem[addr0_reg]);
if ( !csb0_reg && !web0_reg && VERBOSE )
$display($time," Writing %m addr0=%b din0=%b wmask0=%b",addr0_reg,din0_reg,wmask0_reg);
@@ -70,6 +73,8 @@
mem[addr0_reg][23:16] = din0_reg[23:16];
if (wmask0_reg[3])
mem[addr0_reg][31:24] = din0_reg[31:24];
+ if (spare_wen0_reg)
+ mem[addr0_reg][32] = din0_reg[32];
end
end
diff --git a/verilog/rtl/sram_1rw0r0w_32_512_sky130.v b/verilog/rtl/sram_1rw0r0w_32_512_sky130.v
index a406b4f..138331b 100644
--- a/verilog/rtl/sram_1rw0r0w_32_512_sky130.v
+++ b/verilog/rtl/sram_1rw0r0w_32_512_sky130.v
@@ -9,11 +9,11 @@
vssd1,
`endif
// Port 0: RW
- clk0,csb0,web0,wmask0,addr0,din0,dout0
+ clk0,csb0,web0,wmask0,spare_wen0,addr0,din0,dout0
);
parameter NUM_WMASKS = 4 ;
- parameter DATA_WIDTH = 32 ;
+ parameter DATA_WIDTH = 33 ;
parameter ADDR_WIDTH = 9 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
// FIXME: This delay is arbitrary.
@@ -29,13 +29,15 @@
input csb0; // active low chip select
input web0; // active low write control
input [NUM_WMASKS-1:0] wmask0; // write mask
- input [ADDR_WIDTH-1:0] addr0;
+ input spare_wen0; // spare mask
+ input [ADDR_WIDTH-1:0] addr0;
input [DATA_WIDTH-1:0] din0;
output [DATA_WIDTH-1:0] dout0;
reg csb0_reg;
reg web0_reg;
reg [NUM_WMASKS-1:0] wmask0_reg;
+ reg spare_wen0_reg;
reg [ADDR_WIDTH-1:0] addr0_reg;
reg [DATA_WIDTH-1:0] din0_reg;
reg [DATA_WIDTH-1:0] dout0;
@@ -46,10 +48,11 @@
csb0_reg = csb0;
web0_reg = web0;
wmask0_reg = wmask0;
+ spare_wen0_reg = spare_wen0;
addr0_reg = addr0;
din0_reg = din0;
#(T_HOLD) dout0 = 32'bx;
- if ( !csb0_reg && web0_reg && VERBOSE )
+ if ( !csb0_reg && web0_reg && VERBOSE )
$display($time," Reading %m addr0=%b dout0=%b",addr0_reg,mem[addr0_reg]);
if ( !csb0_reg && !web0_reg && VERBOSE )
$display($time," Writing %m addr0=%b din0=%b wmask0=%b",addr0_reg,din0_reg,wmask0_reg);
@@ -70,6 +73,8 @@
mem[addr0_reg][23:16] = din0_reg[23:16];
if (wmask0_reg[3])
mem[addr0_reg][31:24] = din0_reg[31:24];
+ if (spare_wen0_reg)
+ mem[addr0_reg][32] = din0_reg[32];
end
end
diff --git a/verilog/rtl/sram_1rw0r0w_64_512_sky130.v b/verilog/rtl/sram_1rw0r0w_64_512_sky130.v
index 1fabb08..d36ca41 100644
--- a/verilog/rtl/sram_1rw0r0w_64_512_sky130.v
+++ b/verilog/rtl/sram_1rw0r0w_64_512_sky130.v
@@ -9,11 +9,11 @@
vssd1,
`endif
// Port 0: RW
- clk0,csb0,web0,wmask0,addr0,din0,dout0
+ clk0,csb0,web0,wmask0,spare_wen0,addr0,din0,dout0
);
parameter NUM_WMASKS = 8 ;
- parameter DATA_WIDTH = 64 ;
+ parameter DATA_WIDTH = 65 ;
parameter ADDR_WIDTH = 9 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
// FIXME: This delay is arbitrary.
@@ -29,13 +29,15 @@
input csb0; // active low chip select
input web0; // active low write control
input [NUM_WMASKS-1:0] wmask0; // write mask
- input [ADDR_WIDTH-1:0] addr0;
+ input spare_wen0; // spare mask
+ input [ADDR_WIDTH-1:0] addr0;
input [DATA_WIDTH-1:0] din0;
output [DATA_WIDTH-1:0] dout0;
reg csb0_reg;
reg web0_reg;
reg [NUM_WMASKS-1:0] wmask0_reg;
+ reg spare_wen0_reg;
reg [ADDR_WIDTH-1:0] addr0_reg;
reg [DATA_WIDTH-1:0] din0_reg;
reg [DATA_WIDTH-1:0] dout0;
@@ -46,10 +48,11 @@
csb0_reg = csb0;
web0_reg = web0;
wmask0_reg = wmask0;
+ spare_wen0_reg = spare_wen0;
addr0_reg = addr0;
din0_reg = din0;
#(T_HOLD) dout0 = 64'bx;
- if ( !csb0_reg && web0_reg && VERBOSE )
+ if ( !csb0_reg && web0_reg && VERBOSE )
$display($time," Reading %m addr0=%b dout0=%b",addr0_reg,mem[addr0_reg]);
if ( !csb0_reg && !web0_reg && VERBOSE )
$display($time," Writing %m addr0=%b din0=%b wmask0=%b",addr0_reg,din0_reg,wmask0_reg);
@@ -78,6 +81,8 @@
mem[addr0_reg][55:48] = din0_reg[55:48];
if (wmask0_reg[7])
mem[addr0_reg][63:56] = din0_reg[63:56];
+ if (spare_wen0_reg)
+ mem[addr0_reg][64] = din0_reg[64];
end
end
diff --git a/verilog/rtl/user_project_wrapper.v b/verilog/rtl/user_project_wrapper.v
index a220195..b87ab89 100644
--- a/verilog/rtl/user_project_wrapper.v
+++ b/verilog/rtl/user_project_wrapper.v
@@ -339,46 +339,49 @@
sram_1rw0r0w_32_256_sky130 SRAM8
(
`ifdef USE_POWER_PINS
- .vccd1(vccd1),
- .vssd1(vssd1),
+ .vccd1(vccd1),
+ .vssd1(vssd1),
`endif
- .clk0 (clk),
- .csb0 (csb0[8]),
- .web0 (web0),
- .wmask0 (wmask0),
- .addr0 (addr0),
- .din0 (din0),
- .dout0 (sram8_dout0)
+ .clk0 (clk),
+ .csb0 (csb0[8]),
+ .web0 (web0),
+ .wmask0 (wmask0),
+ .addr0 (addr0),
+ .din0 (din0),
+ .dout0 (sram8_dout0),
+ .spare_wen0(1'b0)
);
sram_1rw0r0w_32_512_sky130 SRAM9
(
`ifdef USE_POWER_PINS
- .vccd1(vccd1),
- .vssd1(vssd1),
+ .vccd1(vccd1),
+ .vssd1(vssd1),
`endif
- .clk0 (clk),
- .csb0 (csb0[9]),
- .web0 (web0),
- .wmask0 (wmask0),
- .addr0 (addr0),
- .din0 (din0),
- .dout0 (sram9_dout0)
+ .clk0 (clk),
+ .csb0 (csb0[9]),
+ .web0 (web0),
+ .wmask0 (wmask0),
+ .addr0 (addr0),
+ .din0 (din0),
+ .dout0 (sram9_dout0),
+ .spare_wen0(1'b0)
);
sram_1rw0r0w_32_1024_sky130 SRAM10
(
`ifdef USE_POWER_PINS
- .vccd1(vccd1),
- .vssd1(vssd1),
+ .vccd1(vccd1),
+ .vssd1(vssd1),
`endif
- .clk0 (clk),
- .csb0 (csb0[10]),
- .web0 (web0),
- .wmask0 (wmask0),
- .addr0 (addr0),
- .din0 (din0),
- .dout0 (sram10_dout0)
+ .clk0 (clk),
+ .csb0 (csb0[10]),
+ .web0 (web0),
+ .wmask0 (wmask0),
+ .addr0 (addr0),
+ .din0 (din0),
+ .dout0 (sram10_dout0),
+ .spare_wen0(1'b0)
);
@@ -386,16 +389,17 @@
sram_1rw0r0w_64_512_sky130 SRAM11
(
`ifdef USE_POWER_PINS
- .vccd1(vccd1),
- .vssd1(vssd1),
+ .vccd1(vccd1),
+ .vssd1(vssd1),
`endif
- .clk0 (clk),
- .csb0 (csb0[11]),
- .web0 (web0),
- .wmask0 (wmask0),
- .addr0 (addr0),
- .din0 ({din0[31:16], 32'd0, din0[15:0]}),
- .dout0 (temp_sram11_dout0)
+ .clk0 (clk),
+ .csb0 (csb0[11]),
+ .web0 (web0),
+ .wmask0 (wmask0),
+ .addr0 (addr0),
+ .din0 ({din0[31:16], 32'd0, din0[15:0]}),
+ .dout0 (temp_sram11_dout0),
+ .spare_wen0(1'b0)
);
assign sram11_dout0 = {temp_sram11_dout0[63:49], temp_sram11_dout0[15:0]};