mirror of https://github.com/VLSIDA/OpenRAM.git
Added class and test for testing the delay of several bitcells.
This commit is contained in:
parent
6ef1a3c755
commit
fd806077d2
|
|
@ -6,6 +6,7 @@ from .lib import *
|
||||||
from .delay import *
|
from .delay import *
|
||||||
from .setup_hold import *
|
from .setup_hold import *
|
||||||
from .functional import *
|
from .functional import *
|
||||||
|
from .worst_case import *
|
||||||
from .simulation import *
|
from .simulation import *
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -24,7 +24,7 @@ def parse_args():
|
||||||
global OPTS
|
global OPTS
|
||||||
|
|
||||||
option_list = {
|
option_list = {
|
||||||
optparse.make_option("-b", "--backannotated", action="store_true", dest="run_pex",
|
optparse.make_option("-b", "--backannotated", action="store_true", dest="use_pex",
|
||||||
help="Back annotate simulation"),
|
help="Back annotate simulation"),
|
||||||
optparse.make_option("-o", "--output", dest="output_name",
|
optparse.make_option("-o", "--output", dest="output_name",
|
||||||
help="Base output file name(s) prefix", metavar="FILE"),
|
help="Base output file name(s) prefix", metavar="FILE"),
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,21 @@ class sram():
|
||||||
def save(self):
|
def save(self):
|
||||||
""" Save all the output files while reporting time to do it as well. """
|
""" Save all the output files while reporting time to do it as well. """
|
||||||
|
|
||||||
|
if not OPTS.netlist_only:
|
||||||
|
# Write the layout
|
||||||
|
start_time = datetime.datetime.now()
|
||||||
|
gdsname = OPTS.output_path + self.s.name + ".gds"
|
||||||
|
print("GDS: Writing to {0}".format(gdsname))
|
||||||
|
self.s.gds_write(gdsname)
|
||||||
|
print_time("GDS", datetime.datetime.now(), start_time)
|
||||||
|
|
||||||
|
# Create a LEF physical model
|
||||||
|
start_time = datetime.datetime.now()
|
||||||
|
lefname = OPTS.output_path + self.s.name + ".lef"
|
||||||
|
print("LEF: Writing to {0}".format(lefname))
|
||||||
|
self.s.lef_write(lefname)
|
||||||
|
print_time("LEF", datetime.datetime.now(), start_time)
|
||||||
|
|
||||||
# Save the spice file
|
# Save the spice file
|
||||||
start_time = datetime.datetime.now()
|
start_time = datetime.datetime.now()
|
||||||
spname = OPTS.output_path + self.s.name + ".sp"
|
spname = OPTS.output_path + self.s.name + ".sp"
|
||||||
|
|
@ -70,6 +85,8 @@ class sram():
|
||||||
|
|
||||||
# Save the extracted spice file
|
# Save the extracted spice file
|
||||||
if OPTS.use_pex:
|
if OPTS.use_pex:
|
||||||
|
import verify
|
||||||
|
print(verify.__file__)
|
||||||
start_time = datetime.datetime.now()
|
start_time = datetime.datetime.now()
|
||||||
# Output the extracted design if requested
|
# Output the extracted design if requested
|
||||||
sp_file = OPTS.output_path + "temp_pex.sp"
|
sp_file = OPTS.output_path + "temp_pex.sp"
|
||||||
|
|
@ -93,21 +110,6 @@ class sram():
|
||||||
lib(out_dir=OPTS.output_path, sram=self.s, sp_file=sp_file)
|
lib(out_dir=OPTS.output_path, sram=self.s, sp_file=sp_file)
|
||||||
print_time("Characterization", datetime.datetime.now(), start_time)
|
print_time("Characterization", datetime.datetime.now(), start_time)
|
||||||
|
|
||||||
if not OPTS.netlist_only:
|
|
||||||
# Write the layout
|
|
||||||
start_time = datetime.datetime.now()
|
|
||||||
gdsname = OPTS.output_path + self.s.name + ".gds"
|
|
||||||
print("GDS: Writing to {0}".format(gdsname))
|
|
||||||
self.s.gds_write(gdsname)
|
|
||||||
print_time("GDS", datetime.datetime.now(), start_time)
|
|
||||||
|
|
||||||
# Create a LEF physical model
|
|
||||||
start_time = datetime.datetime.now()
|
|
||||||
lefname = OPTS.output_path + self.s.name + ".lef"
|
|
||||||
print("LEF: Writing to {0}".format(lefname))
|
|
||||||
self.s.lef_write(lefname)
|
|
||||||
print_time("LEF", datetime.datetime.now(), start_time)
|
|
||||||
|
|
||||||
# Write a verilog model
|
# Write a verilog model
|
||||||
start_time = datetime.datetime.now()
|
start_time = datetime.datetime.now()
|
||||||
vname = OPTS.output_path + self.s.name + ".v"
|
vname = OPTS.output_path + self.s.name + ".v"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Run a regression test on various srams
|
||||||
|
"""
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
from testutils import header,openram_test
|
||||||
|
import sys,os
|
||||||
|
sys.path.append(os.path.join(sys.path[0],".."))
|
||||||
|
import globals
|
||||||
|
from globals import OPTS
|
||||||
|
import debug
|
||||||
|
|
||||||
|
class worst_case_timing_sram_test(openram_test):
|
||||||
|
|
||||||
|
def runTest(self):
|
||||||
|
globals.init_openram("config_20_{0}".format(OPTS.tech_name))
|
||||||
|
OPTS.spice_name="ngspice"
|
||||||
|
OPTS.analytical_delay = False
|
||||||
|
OPTS.trim_netlist = False
|
||||||
|
|
||||||
|
# This is a hack to reload the characterizer __init__ with the spice version
|
||||||
|
from importlib import reload
|
||||||
|
import characterizer
|
||||||
|
reload(characterizer)
|
||||||
|
from characterizer import worst_case
|
||||||
|
if not OPTS.spice_exe:
|
||||||
|
debug.error("Could not find {} simulator.".format(OPTS.spice_name),-1)
|
||||||
|
|
||||||
|
from sram import sram
|
||||||
|
from sram_config import sram_config
|
||||||
|
c = sram_config(word_size=4,
|
||||||
|
num_words=32,
|
||||||
|
num_banks=1)
|
||||||
|
c.words_per_row=1
|
||||||
|
debug.info(1, "Testing the timing for 2 bits inside a 2bit, 16words SRAM with 1 bank")
|
||||||
|
s = sram(c, name="sram1")
|
||||||
|
|
||||||
|
tempspice = OPTS.openram_temp + "temp.sp"
|
||||||
|
s.sp_write(tempspice)
|
||||||
|
|
||||||
|
|
||||||
|
corner = (OPTS.process_corners[0], OPTS.supply_voltages[0], OPTS.temperatures[0])
|
||||||
|
wc = worst_case(s.s, tempspice, corner)
|
||||||
|
import tech
|
||||||
|
loads = [tech.spice["msflop_in_cap"]*4]
|
||||||
|
slews = [tech.spice["rise_time"]*2]
|
||||||
|
probe_address = "1" * s.s.addr_size
|
||||||
|
probe_data = s.s.word_size - 1
|
||||||
|
wc.analyze(probe_address, probe_data, slews, loads)
|
||||||
|
|
||||||
|
globals.end_openram()
|
||||||
|
|
||||||
|
# instantiate a copdsay of the class to actually run the test
|
||||||
|
if __name__ == "__main__":
|
||||||
|
(OPTS, args) = globals.parse_args()
|
||||||
|
del sys.argv[1:]
|
||||||
|
header(__file__, OPTS.tech_name)
|
||||||
|
unittest.main()
|
||||||
|
|
@ -54,6 +54,7 @@ else:
|
||||||
|
|
||||||
if OPTS.pex_exe == None:
|
if OPTS.pex_exe == None:
|
||||||
from .none import run_pex,print_pex_stats
|
from .none import run_pex,print_pex_stats
|
||||||
|
print("why god why")
|
||||||
elif "calibre"==OPTS.pex_exe[0]:
|
elif "calibre"==OPTS.pex_exe[0]:
|
||||||
from .calibre import run_pex,print_pex_stats
|
from .calibre import run_pex,print_pex_stats
|
||||||
elif "magic"==OPTS.pex_exe[0]:
|
elif "magic"==OPTS.pex_exe[0]:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue