mirror of https://github.com/VLSIDA/OpenRAM.git
Uncommented tests that use model delays. Fixed issue in sense amp cin.
This commit is contained in:
parent
d273c0eef5
commit
1d22d39667
|
|
@ -247,7 +247,7 @@ class delay(simulation):
|
||||||
def create_graph(self):
|
def create_graph(self):
|
||||||
"""Creates timing graph to generate the timing paths for the SRAM output."""
|
"""Creates timing graph to generate the timing paths for the SRAM output."""
|
||||||
|
|
||||||
self.sram.bank.bitcell_array.init_graph_params() # Removes previous bit exclusions
|
self.sram.bank.bitcell_array.bitcell_array.init_graph_params() # Removes previous bit exclusions
|
||||||
self.sram.bank.bitcell_array.graph_exclude_bits(self.wordline_row, self.bitline_column)
|
self.sram.bank.bitcell_array.graph_exclude_bits(self.wordline_row, self.bitline_column)
|
||||||
|
|
||||||
# Generate new graph every analysis as edges might change depending on test bit
|
# Generate new graph every analysis as edges might change depending on test bit
|
||||||
|
|
@ -1313,6 +1313,7 @@ class delay(simulation):
|
||||||
for load in loads:
|
for load in loads:
|
||||||
# Calculate delay based on slew and load
|
# Calculate delay based on slew and load
|
||||||
path_delays = self.graph.get_timing(bl_path, self.corner, slew, load)
|
path_delays = self.graph.get_timing(bl_path, self.corner, slew, load)
|
||||||
|
|
||||||
total_delay = self.sum_delays(path_delays)
|
total_delay = self.sum_delays(path_delays)
|
||||||
max_delay = max(max_delay, total_delay.delay)
|
max_delay = max(max_delay, total_delay.delay)
|
||||||
debug.info(1,'{}, {}, {}, {}'.format(slew,load,total_delay.delay/1e3, total_delay.slew/1e3))
|
debug.info(1,'{}, {}, {}, {}'.format(slew,load,total_delay.delay/1e3, total_delay.slew/1e3))
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ class sense_amp(design.design):
|
||||||
# Default is 8x. Per Samira and Hodges-Jackson book:
|
# Default is 8x. Per Samira and Hodges-Jackson book:
|
||||||
# "Column-mux transistors driven by the decoder must be sized for optimal speed"
|
# "Column-mux transistors driven by the decoder must be sized for optimal speed"
|
||||||
bitline_pmos_size = 8 #FIXME: This should be set somewhere and referenced. Probably in tech file.
|
bitline_pmos_size = 8 #FIXME: This should be set somewhere and referenced. Probably in tech file.
|
||||||
return spice["min_tx_drain_c"]*(bitline_pmos_size/parameter["min_tx_size"])#ff
|
return spice["min_tx_drain_c"]*(bitline_pmos_size)#ff
|
||||||
|
|
||||||
def get_stage_effort(self, load):
|
def get_stage_effort(self, load):
|
||||||
#Delay of the sense amp will depend on the size of the amp and the output load.
|
#Delay of the sense amp will depend on the size of the amp and the output load.
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ from globals import OPTS
|
||||||
from sram_factory import factory
|
from sram_factory import factory
|
||||||
import debug
|
import debug
|
||||||
|
|
||||||
@unittest.skip("SKIPPING 21_model_delay_test")
|
# @unittest.skip("SKIPPING 21_model_delay_test")
|
||||||
class model_delay_test(openram_test):
|
class model_delay_test(openram_test):
|
||||||
""" Compare the accuracy of the analytical model with a spice simulation. """
|
""" Compare the accuracy of the analytical model with a spice simulation. """
|
||||||
|
|
||||||
|
|
@ -51,23 +51,28 @@ class model_delay_test(openram_test):
|
||||||
import tech
|
import tech
|
||||||
loads = [tech.spice["msflop_in_cap"]*4]
|
loads = [tech.spice["msflop_in_cap"]*4]
|
||||||
slews = [tech.spice["rise_time"]*2]
|
slews = [tech.spice["rise_time"]*2]
|
||||||
|
|
||||||
|
# Run a spice characterization
|
||||||
spice_data, port_data = d.analyze(probe_address, probe_data, slews, loads)
|
spice_data, port_data = d.analyze(probe_address, probe_data, slews, loads)
|
||||||
spice_data.update(port_data[0])
|
spice_data.update(port_data[0])
|
||||||
|
|
||||||
|
# Run analytical characterization
|
||||||
model_data, port_data = d.analytical_delay(slews, loads)
|
model_data, port_data = d.analytical_delay(slews, loads)
|
||||||
model_data.update(port_data[0])
|
model_data.update(port_data[0])
|
||||||
|
|
||||||
#Only compare the delays
|
# Only compare the delays
|
||||||
spice_delays = {key:value for key, value in spice_data.items() if 'delay' in key}
|
spice_delays = {key:value for key, value in spice_data.items() if 'delay' in key}
|
||||||
model_delays = {key:value for key, value in model_data.items() if 'delay' in key}
|
model_delays = {key:value for key, value in model_data.items() if 'delay' in key}
|
||||||
debug.info(1,"Spice Delays={}".format(spice_delays))
|
debug.info(1,"Spice Delays={}".format(spice_delays))
|
||||||
debug.info(1,"Model Delays={}".format(model_delays))
|
debug.info(1,"Model Delays={}".format(model_delays))
|
||||||
|
|
||||||
if OPTS.tech_name == "freepdk45":
|
if OPTS.tech_name == "freepdk45":
|
||||||
error_tolerance = 0.25
|
error_tolerance = 0.25
|
||||||
elif OPTS.tech_name == "scn4m_subm":
|
elif OPTS.tech_name == "scn4m_subm":
|
||||||
error_tolerance = 0.25
|
error_tolerance = 0.25
|
||||||
else:
|
else:
|
||||||
self.assertTrue(False) # other techs fail
|
self.assertTrue(False) # other techs fail
|
||||||
|
|
||||||
# Check if no too many or too few results
|
# Check if no too many or too few results
|
||||||
self.assertTrue(len(spice_delays.keys())==len(model_delays.keys()))
|
self.assertTrue(len(spice_delays.keys())==len(model_delays.keys()))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ import globals
|
||||||
from globals import OPTS
|
from globals import OPTS
|
||||||
import debug
|
import debug
|
||||||
|
|
||||||
@unittest.skip("SKIPPING 23_lib_sram_model_corners_test")
|
#@unittest.skip("SKIPPING 23_lib_sram_model_corners_test")
|
||||||
class lib_model_corners_lib_test(openram_test):
|
class lib_model_corners_lib_test(openram_test):
|
||||||
|
|
||||||
def runTest(self):
|
def runTest(self):
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ import globals
|
||||||
from globals import OPTS
|
from globals import OPTS
|
||||||
import debug
|
import debug
|
||||||
|
|
||||||
@unittest.skip("SKIPPING 23_lib_sram_model_test")
|
#@unittest.skip("SKIPPING 23_lib_sram_model_test")
|
||||||
class lib_sram_model_test(openram_test):
|
class lib_sram_model_test(openram_test):
|
||||||
|
|
||||||
def runTest(self):
|
def runTest(self):
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ from sram_factory import factory
|
||||||
import debug
|
import debug
|
||||||
import getpass
|
import getpass
|
||||||
|
|
||||||
@unittest.skip("SKIPPING 30_openram_front_end_test")
|
#@unittest.skip("SKIPPING 30_openram_front_end_test")
|
||||||
class openram_front_end_test(openram_test):
|
class openram_front_end_test(openram_test):
|
||||||
|
|
||||||
def runTest(self):
|
def runTest(self):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue