Fixed write_size checks for None

This commit is contained in:
Bugra Onal 2022-07-28 16:45:58 -07:00
parent 6efe974d7b
commit a361d9f7bb
5 changed files with 37 additions and 41 deletions

View File

@ -24,7 +24,7 @@ class verilog:
self.vf.write("// OpenRAM SRAM model\n") self.vf.write("// OpenRAM SRAM model\n")
self.vf.write("// Words: {0}\n".format(self.num_words)) self.vf.write("// Words: {0}\n".format(self.num_words))
self.vf.write("// Word size: {0}\n".format(self.word_size)) self.vf.write("// Word size: {0}\n".format(self.word_size))
if self.write_size: if self.write_size != self.word_size:
self.vf.write("// Write size: {0}\n\n".format(self.write_size)) self.vf.write("// Write size: {0}\n\n".format(self.write_size))
else: else:
self.vf.write("\n") self.vf.write("\n")
@ -56,14 +56,14 @@ class verilog:
self.vf.write("// Port {0}: W\n".format(port)) self.vf.write("// Port {0}: W\n".format(port))
if port in self.readwrite_ports: if port in self.readwrite_ports:
self.vf.write(" clk{0},csb{0},web{0},".format(port)) self.vf.write(" clk{0},csb{0},web{0},".format(port))
if self.write_size: if self.write_size != self.word_size:
self.vf.write("wmask{},".format(port)) self.vf.write("wmask{},".format(port))
if self.num_spare_cols > 0: if self.num_spare_cols > 0:
self.vf.write("spare_wen{0},".format(port)) self.vf.write("spare_wen{0},".format(port))
self.vf.write("addr{0},din{0},dout{0}".format(port)) self.vf.write("addr{0},din{0},dout{0}".format(port))
elif port in self.write_ports: elif port in self.write_ports:
self.vf.write(" clk{0},csb{0},".format(port)) self.vf.write(" clk{0},csb{0},".format(port))
if self.write_size: if self.write_size != self.word_size:
self.vf.write("wmask{},".format(port)) self.vf.write("wmask{},".format(port))
if self.num_spare_cols > 0: if self.num_spare_cols > 0:
self.vf.write("spare_wen{0},".format(port)) self.vf.write("spare_wen{0},".format(port))
@ -75,7 +75,7 @@ class verilog:
self.vf.write(",\n") self.vf.write(",\n")
self.vf.write("\n );\n\n") self.vf.write("\n );\n\n")
if self.write_size: if self.write_size != self.word_size:
self.num_wmasks = int(math.ceil(self.word_size / self.write_size)) self.num_wmasks = int(math.ceil(self.word_size / self.write_size))
self.vf.write(" parameter NUM_WMASKS = {0} ;\n".format(self.num_wmasks)) self.vf.write(" parameter NUM_WMASKS = {0} ;\n".format(self.num_wmasks))
self.vf.write(" parameter DATA_WIDTH = {0} ;\n".format(self.word_size + self.num_spare_cols)) self.vf.write(" parameter DATA_WIDTH = {0} ;\n".format(self.word_size + self.num_spare_cols))
@ -128,7 +128,7 @@ class verilog:
if port in self.readwrite_ports: if port in self.readwrite_ports:
self.vf.write(" reg web{0}_reg;\n".format(port)) self.vf.write(" reg web{0}_reg;\n".format(port))
if port in self.write_ports: if port in self.write_ports:
if self.write_size: if self.write_size != self.word_size:
self.vf.write(" reg [NUM_WMASKS-1:0] wmask{0}_reg;\n".format(port)) self.vf.write(" reg [NUM_WMASKS-1:0] wmask{0}_reg;\n".format(port))
if self.num_spare_cols > 1: if self.num_spare_cols > 1:
self.vf.write(" reg [{1}:0] spare_wen{0}_reg;".format(port, self.num_spare_cols - 1)) self.vf.write(" reg [{1}:0] spare_wen{0}_reg;".format(port, self.num_spare_cols - 1))
@ -152,7 +152,7 @@ class verilog:
if port in self.readwrite_ports: if port in self.readwrite_ports:
self.vf.write(" web{0}_reg = web{0};\n".format(port)) self.vf.write(" web{0}_reg = web{0};\n".format(port))
if port in self.write_ports: if port in self.write_ports:
if self.write_size: if self.write_size != self.word_size:
self.vf.write(" wmask{0}_reg = wmask{0};\n".format(port)) self.vf.write(" wmask{0}_reg = wmask{0};\n".format(port))
if self.num_spare_cols: if self.num_spare_cols:
self.vf.write(" spare_wen{0}_reg = spare_wen{0};\n".format(port)) self.vf.write(" spare_wen{0}_reg = spare_wen{0};\n".format(port))
@ -172,13 +172,13 @@ class verilog:
self.vf.write(" $display($time,\" Reading %m addr{0}=%b dout{0}=%b\",addr{0}_reg,mem[addr{0}_reg]);\n".format(port)) self.vf.write(" $display($time,\" Reading %m addr{0}=%b dout{0}=%b\",addr{0}_reg,mem[addr{0}_reg]);\n".format(port))
if port in self.readwrite_ports: if port in self.readwrite_ports:
self.vf.write(" if ( !csb{0}_reg && !web{0}_reg && VERBOSE )\n".format(port)) self.vf.write(" if ( !csb{0}_reg && !web{0}_reg && VERBOSE )\n".format(port))
if self.write_size: if self.write_size != self.word_size:
self.vf.write(" $display($time,\" Writing %m addr{0}=%b din{0}=%b wmask{0}=%b\",addr{0}_reg,din{0}_reg,wmask{0}_reg);\n".format(port)) self.vf.write(" $display($time,\" Writing %m addr{0}=%b din{0}=%b wmask{0}=%b\",addr{0}_reg,din{0}_reg,wmask{0}_reg);\n".format(port))
else: else:
self.vf.write(" $display($time,\" Writing %m addr{0}=%b din{0}=%b\",addr{0}_reg,din{0}_reg);\n".format(port)) self.vf.write(" $display($time,\" Writing %m addr{0}=%b din{0}=%b\",addr{0}_reg,din{0}_reg);\n".format(port))
elif port in self.write_ports: elif port in self.write_ports:
self.vf.write(" if ( !csb{0}_reg && VERBOSE )\n".format(port)) self.vf.write(" if ( !csb{0}_reg && VERBOSE )\n".format(port))
if self.write_size: if self.write_size != self.word_size:
self.vf.write(" $display($time,\" Writing %m addr{0}=%b din{0}=%b wmask{0}=%b\",addr{0}_reg,din{0}_reg,wmask{0}_reg);\n".format(port)) self.vf.write(" $display($time,\" Writing %m addr{0}=%b din{0}=%b wmask{0}=%b\",addr{0}_reg,din{0}_reg,wmask{0}_reg);\n".format(port))
else: else:
self.vf.write(" $display($time,\" Writing %m addr{0}=%b din{0}=%b\",addr{0}_reg,din{0}_reg);\n".format(port)) self.vf.write(" $display($time,\" Writing %m addr{0}=%b din{0}=%b\",addr{0}_reg,din{0}_reg);\n".format(port))
@ -196,7 +196,7 @@ class verilog:
self.vf.write(" input [ADDR_WIDTH-1:0] addr{0};\n".format(port)) self.vf.write(" input [ADDR_WIDTH-1:0] addr{0};\n".format(port))
if port in self.write_ports: if port in self.write_ports:
if self.write_size: if self.write_size != self.word_size:
self.vf.write(" input [NUM_WMASKS-1:0] wmask{0}; // write mask\n".format(port)) self.vf.write(" input [NUM_WMASKS-1:0] wmask{0}; // write mask\n".format(port))
if self.num_spare_cols == 1: if self.num_spare_cols == 1:
self.vf.write(" input spare_wen{0}; // spare mask\n".format(port)) self.vf.write(" input spare_wen{0}; // spare mask\n".format(port))
@ -221,7 +221,7 @@ class verilog:
else: else:
self.vf.write(" if (!csb{0}_reg) begin\n".format(port)) self.vf.write(" if (!csb{0}_reg) begin\n".format(port))
if self.write_size: if self.write_size != self.word_size:
for mask in range(0, self.num_wmasks): for mask in range(0, self.num_wmasks):
lower = mask * self.write_size lower = mask * self.write_size
upper = lower + self.write_size - 1 upper = lower + self.write_size - 1

View File

@ -27,7 +27,7 @@ class bank(design):
self.sram_config = sram_config self.sram_config = sram_config
sram_config.set_local_config(self) sram_config.set_local_config(self)
if self.write_size: if self.write_size != self.word_size:
self.num_wmasks = int(ceil(self.word_size / self.write_size)) self.num_wmasks = int(ceil(self.word_size / self.write_size))
else: else:
self.num_wmasks = 0 self.num_wmasks = 0
@ -769,7 +769,7 @@ class bank(design):
din_name = "din{0}_{1}".format(port, row) din_name = "din{0}_{1}".format(port, row)
self.copy_layout_pin(self.port_data_inst[port], data_name, din_name) self.copy_layout_pin(self.port_data_inst[port], data_name, din_name)
if self.write_size: if self.write_size != self.word_size:
for row in range(self.num_wmasks): for row in range(self.num_wmasks):
wmask_name = "bank_wmask_{}".format(row) wmask_name = "bank_wmask_{}".format(row)
bank_wmask_name = "bank_wmask{0}_{1}".format(port, row) bank_wmask_name = "bank_wmask{0}_{1}".format(port, row)

View File

@ -36,7 +36,7 @@ class sram():
self.name = name self.name = name
from sram_1bank import sram_1bank as sram from .sram_1bank import sram_1bank as sram
self.s = sram(name, sram_config) self.s = sram(name, sram_config)

View File

@ -8,14 +8,14 @@
from base import vector from base import vector
from base import channel_route from base import channel_route
from router import router_tech from router import router_tech
from globals import OPTS from globals import OPTS, print_time
import datetime import datetime
import debug import debug
from math import ceil from math import ceil
from importlib import reload from importlib import reload
from design import design from base import design
from verilog import verilog from base import verilog
from lef import lef from base import lef
from sram_factory import factory from sram_factory import factory
from tech import spice from tech import spice
@ -34,7 +34,7 @@ class sram_1bank(design, verilog, lef):
self.bank_insts = [] self.bank_insts = []
if self.write_size: if self.write_size != self.word_size:
self.num_wmasks = int(ceil(self.word_size / self.write_size)) self.num_wmasks = int(ceil(self.word_size / self.write_size))
else: else:
self.num_wmasks = 0 self.num_wmasks = 0
@ -254,9 +254,9 @@ class sram_1bank(design, verilog, lef):
# Do not route the power supply (leave as must-connect pins) # Do not route the power supply (leave as must-connect pins)
return return
elif OPTS.route_supplies == "grid": elif OPTS.route_supplies == "grid":
from supply_grid_router import supply_grid_router as router from router import supply_grid_router as router
else: else:
from supply_tree_router import supply_tree_router as router from router import supply_tree_router as router
rtr=router(layers=self.supply_stack, rtr=router(layers=self.supply_stack,
design=self, design=self,
bbox=bbox, bbox=bbox,
@ -356,7 +356,7 @@ class sram_1bank(design, verilog, lef):
pins_to_route.append("addr{0}[{1}]".format(port, bit + self.col_addr_size)) pins_to_route.append("addr{0}[{1}]".format(port, bit + self.col_addr_size))
if port in self.write_ports: if port in self.write_ports:
if self.write_size: if self.write_size != self.word_size:
for bit in range(self.num_wmasks): for bit in range(self.num_wmasks):
pins_to_route.append("wmask{0}[{1}]".format(port, bit)) pins_to_route.append("wmask{0}[{1}]".format(port, bit))
@ -367,7 +367,7 @@ class sram_1bank(design, verilog, lef):
for bit in range(self.num_spare_cols): for bit in range(self.num_spare_cols):
pins_to_route.append("spare_wen{0}[{1}]".format(port, bit)) pins_to_route.append("spare_wen{0}[{1}]".format(port, bit))
from signal_escape_router import signal_escape_router as router from router import signal_escape_router as router
rtr=router(layers=self.m3_stack, rtr=router(layers=self.m3_stack,
design=self, design=self,
bbox=bbox) bbox=bbox)
@ -491,19 +491,15 @@ class sram_1bank(design, verilog, lef):
self.data_dff = factory.create("dff_array", module_name="data_dff", rows=1, columns=self.word_size + self.num_spare_cols) self.data_dff = factory.create("dff_array", module_name="data_dff", rows=1, columns=self.word_size + self.num_spare_cols)
if self.write_size: if self.write_size != self.word_size:
self.wmask_dff = factory.create("dff_array", module_name="wmask_dff", rows=1, columns=self.num_wmasks) self.wmask_dff = factory.create("dff_array", module_name="wmask_dff", rows=1, columns=self.num_wmasks)
if self.num_spare_cols: if self.num_spare_cols:
self.spare_wen_dff = factory.create("dff_array", module_name="spare_wen_dff", rows=1, columns=self.num_spare_cols) self.spare_wen_dff = factory.create("dff_array", module_name="spare_wen_dff", rows=1, columns=self.num_spare_cols)
# Create bank decoder
# if(self.num_banks > 1):
# self.add_multi_bank_modules()
self.bank_count = 0 self.bank_count = 0
c = reload(__import__(OPTS.control_logic)) c = reload(__import__('modules.' + OPTS.control_logic))
self.mod_control_logic = getattr(c, OPTS.control_logic) self.mod_control_logic = getattr(c, OPTS.control_logic)
# Create the control logic module for each port type # Create the control logic module for each port type
@ -796,7 +792,7 @@ class sram_1bank(design, verilog, lef):
if self.col_addr_dff: if self.col_addr_dff:
self.col_addr_dff_insts = self.create_col_addr_dff() self.col_addr_dff_insts = self.create_col_addr_dff()
if self.write_size: if self.write_size != self.word_size:
self.wmask_dff_insts = self.create_wmask_dff() self.wmask_dff_insts = self.create_wmask_dff()
self.data_dff_insts = self.create_data_dff() self.data_dff_insts = self.create_data_dff()
else: else:
@ -940,7 +936,7 @@ class sram_1bank(design, verilog, lef):
self.col_addr_pos[port] = vector(x_offset, 0) self.col_addr_pos[port] = vector(x_offset, 0)
if port in self.write_ports: if port in self.write_ports:
if self.write_size: if self.write_size != self.word_size:
# Add the write mask flops below the write mask AND array. # Add the write mask flops below the write mask AND array.
self.wmask_pos[port] = vector(x_offset, self.wmask_pos[port] = vector(x_offset,
y_offset) y_offset)
@ -992,7 +988,7 @@ class sram_1bank(design, verilog, lef):
self.spare_wen_dff_insts[port].place(self.spare_wen_pos[port], mirror="MX") self.spare_wen_dff_insts[port].place(self.spare_wen_pos[port], mirror="MX")
x_offset = self.spare_wen_dff_insts[port].lx() x_offset = self.spare_wen_dff_insts[port].lx()
if self.write_size: if self.write_size != self.word_size:
# Add the write mask flops below the write mask AND array. # Add the write mask flops below the write mask AND array.
self.wmask_pos[port] = vector(x_offset - self.wmask_dff_insts[port].width, self.wmask_pos[port] = vector(x_offset - self.wmask_dff_insts[port].width,
y_offset) y_offset)
@ -1059,7 +1055,7 @@ class sram_1bank(design, verilog, lef):
start_layer=pin_layer) start_layer=pin_layer)
if port in self.write_ports: if port in self.write_ports:
if self.write_size: if self.write_size != self.word_size:
for bit in range(self.num_wmasks): for bit in range(self.num_wmasks):
self.add_io_pin(self.wmask_dff_insts[port], self.add_io_pin(self.wmask_dff_insts[port],
"din_{}".format(bit), "din_{}".format(bit),
@ -1371,7 +1367,7 @@ class sram_1bank(design, verilog, lef):
# Data dffs and wmask dffs are only for writing so are not useful for evaluating read delay. # Data dffs and wmask dffs are only for writing so are not useful for evaluating read delay.
for inst in self.data_dff_insts: for inst in self.data_dff_insts:
self.graph_inst_exclude.add(inst) self.graph_inst_exclude.add(inst)
if self.write_size: if self.write_size != self.word_size:
for inst in self.wmask_dff_insts: for inst in self.wmask_dff_insts:
self.graph_inst_exclude.add(inst) self.graph_inst_exclude.add(inst)
if self.num_spare_cols: if self.num_spare_cols:

View File

@ -38,7 +38,7 @@ class write_driver_array(design):
else: else:
self.num_spare_cols = num_spare_cols self.num_spare_cols = num_spare_cols
if self.write_size: if self.write_size != self.word_size:
self.num_wmasks = int(math.ceil(self.word_size / self.write_size)) self.num_wmasks = int(math.ceil(self.word_size / self.write_size))
self.create_netlist() self.create_netlist()
@ -82,10 +82,10 @@ class write_driver_array(design):
for i in range(self.word_size + self.num_spare_cols): for i in range(self.word_size + self.num_spare_cols):
self.add_pin(self.get_bl_name() + "_{0}".format(i), "OUTPUT") self.add_pin(self.get_bl_name() + "_{0}".format(i), "OUTPUT")
self.add_pin(self.get_br_name() + "_{0}".format(i), "OUTPUT") self.add_pin(self.get_br_name() + "_{0}".format(i), "OUTPUT")
if self.write_size: if self.write_size != self.word_size:
for i in range(self.num_wmasks + self.num_spare_cols): for i in range(self.num_wmasks + self.num_spare_cols):
self.add_pin(self.en_name + "_{0}".format(i), "INPUT") self.add_pin(self.en_name + "_{0}".format(i), "INPUT")
elif self.num_spare_cols and not self.write_size: elif self.num_spare_cols and self.write_size == self.word_size:
for i in range(self.num_spare_cols + 1): for i in range(self.num_spare_cols + 1):
self.add_pin(self.en_name + "_{0}".format(i), "INPUT") self.add_pin(self.en_name + "_{0}".format(i), "INPUT")
else: else:
@ -110,7 +110,7 @@ class write_driver_array(design):
self.local_insts.append(self.add_inst(name=name, self.local_insts.append(self.add_inst(name=name,
mod=self.driver)) mod=self.driver))
if self.write_size: if self.write_size != self.word_size:
self.connect_inst([self.data_name + "_{0}".format(index), self.connect_inst([self.data_name + "_{0}".format(index),
self.get_bl_name() + "_{0}".format(index), self.get_bl_name() + "_{0}".format(index),
self.get_br_name() + "_{0}".format(index), self.get_br_name() + "_{0}".format(index),
@ -121,7 +121,7 @@ class write_driver_array(design):
w = 0 w = 0
windex+=1 windex+=1
elif self.num_spare_cols and not self.write_size: elif self.num_spare_cols and self.write_size == self.word_size:
self.connect_inst([self.data_name + "_{0}".format(index), self.connect_inst([self.data_name + "_{0}".format(index),
self.get_bl_name() + "_{0}".format(index), self.get_bl_name() + "_{0}".format(index),
self.get_br_name() + "_{0}".format(index), self.get_br_name() + "_{0}".format(index),
@ -135,7 +135,7 @@ class write_driver_array(design):
for i in range(self.num_spare_cols): for i in range(self.num_spare_cols):
index = self.word_size + i index = self.word_size + i
if self.write_size: if self.write_size != self.word_size:
offset = self.num_wmasks offset = self.num_wmasks
else: else:
offset = 1 offset = 1
@ -205,7 +205,7 @@ class write_driver_array(design):
width=br_pin.width(), width=br_pin.width(),
height=br_pin.height()) height=br_pin.height())
if self.write_size: if self.write_size != self.word_size:
for bit in range(self.num_wmasks): for bit in range(self.num_wmasks):
inst = self.local_insts[bit * self.write_size] inst = self.local_insts[bit * self.write_size]
en_pin = inst.get_pin(inst.mod.en_name) en_pin = inst.get_pin(inst.mod.en_name)
@ -229,7 +229,7 @@ class write_driver_array(design):
layer="m1", layer="m1",
offset=en_pin.lr() + vector(-drc("minwidth_m1"),0)) offset=en_pin.lr() + vector(-drc("minwidth_m1"),0))
elif self.num_spare_cols and not self.write_size: elif self.num_spare_cols and self.write_size == self.word_size:
# shorten enable rail to accomodate those for spare write drivers # shorten enable rail to accomodate those for spare write drivers
left_inst = self.local_insts[0] left_inst = self.local_insts[0]
left_en_pin = left_inst.get_pin(inst.mod.en_name) left_en_pin = left_inst.get_pin(inst.mod.en_name)