Added some data scaling and error calculation in model check.

This commit is contained in:
Hunter Nichols 2019-01-16 00:46:24 -08:00
parent 6152ec7ec5
commit cc0be510c7
4 changed files with 41 additions and 3 deletions

View File

@ -164,6 +164,36 @@ class model_check(delay):
"""Get model delays based on port. Currently assumes single RW port.""" """Get model delays based on port. Currently assumes single RW port."""
return self.sram.control_logic_rw.get_wl_sen_delays() return self.sram.control_logic_rw.get_wl_sen_delays()
def scale_delays(self, delay_list):
"""Takes in a list of measured delays and convert it to simple units to easily compare to model values."""
converted_values = []
#Calculate average
total = 0
for meas_value in delay_list:
total+=meas_value
average = total/len(delay_list)
#Convert values
for meas_value in delay_list:
converted_values.append(meas_value/average)
return converted_values
def min_max_normalization(self, value_list):
"""Re-scales input values on a range from 0-1 where min(list)=0, max(list)=1"""
scaled_values = []
min_val = min(value_list)
min_max_diff = max(value_list) - min_val
for value in value_list:
scaled_values.append((value-min_val)/(min_max_diff))
return scaled_values
def calculate_error_l2_norm(self, list_a, list_b):
"""Calculates error between two lists using the l2 norm"""
error_list = []
for val_a, val_b in zip(list_a, list_b):
error_list.append((val_a-val_b)**2)
return error_list
def analyze(self, probe_address, probe_data, slews, loads): def analyze(self, probe_address, probe_data, slews, loads):
"""Measures entire delay path along the wordline and sense amp enable and compare it to the model delays.""" """Measures entire delay path along the wordline and sense amp enable and compare it to the model delays."""
self.set_probe(probe_address, probe_data) self.set_probe(probe_address, probe_data)
@ -186,6 +216,13 @@ class model_check(delay):
debug.info(1,"SAE model delays:\n\t {}".format(sae_model_delays)) debug.info(1,"SAE model delays:\n\t {}".format(sae_model_delays))
debug.info(1,"Measured SAE slews:\n\t {}".format(sae_slews[read_port])) debug.info(1,"Measured SAE slews:\n\t {}".format(sae_slews[read_port]))
scaled_wl_meas = self.min_max_normalization(wl_delays[read_port])
debug.info(1, "Scaled wordline delays:\n{}".format(scaled_wl_meas))
scaled_wl_model = self.min_max_normalization(wl_model_delays)
debug.info(1, "Scaled wordline model:\n{}".format(scaled_wl_model))
errors = self.calculate_error_l2_norm(scaled_wl_meas, scaled_wl_model)
debug.info(1, "Model errors:\n{}".format(errors))
return wl_delays, sae_delays return wl_delays, sae_delays

View File

@ -49,9 +49,7 @@ class timing_sram_test(openram_test):
data, port_data = d.analyze(probe_address, probe_data, slews, loads) data, port_data = d.analyze(probe_address, probe_data, slews, loads)
#Combine info about port into all data #Combine info about port into all data
data.update(port_data[0]) data.update(port_data[0])
print(data)
if OPTS.tech_name == "freepdk45": if OPTS.tech_name == "freepdk45":
golden_data = {'delay_hl': [0.2011], golden_data = {'delay_hl': [0.2011],
'delay_lh': [0.2011], 'delay_lh': [0.2011],

View File

@ -18,6 +18,8 @@ class delay_model_test(openram_test):
OPTS.spice_name="hspice" OPTS.spice_name="hspice"
OPTS.analytical_delay = False OPTS.analytical_delay = False
OPTS.netlist_only = True OPTS.netlist_only = True
OPTS.trim_netlist = False
debug.info(1, "Trimming disabled for this test. Simulation could be slow.")
# This is a hack to reload the characterizer __init__ with the spice version # This is a hack to reload the characterizer __init__ with the spice version
from importlib import reload from importlib import reload

View File

@ -62,6 +62,7 @@ class openram_test(unittest.TestCase):
delay_obj.set_load_slew(load, slew) delay_obj.set_load_slew(load, slew)
delay_obj.set_probe(probe_address="1"*sram.addr_size, probe_data=(sram.word_size-1)) delay_obj.set_probe(probe_address="1"*sram.addr_size, probe_data=(sram.word_size-1))
test_port = delay_obj.read_ports[0] #Only test one port, assumes other ports have similar period. test_port = delay_obj.read_ports[0] #Only test one port, assumes other ports have similar period.
delay_obj.create_measurement_objects()
delay_obj.find_feasible_period_one_port(test_port) delay_obj.find_feasible_period_one_port(test_port)
return delay_obj.period return delay_obj.period