Added more variance analysis for the delay data

This commit is contained in:
Hunter Nichols 2019-02-07 02:27:22 -08:00
parent 690055174d
commit d0edda93ad
3 changed files with 57 additions and 24 deletions

View File

@ -38,6 +38,7 @@ class model_check(delay):
self.rbl_delay_meas_names = ["delay_gated_clk_nand", "delay_delay_chain_in"]+dc_delay_names
self.sae_delay_meas_names = ["delay_pre_sen"]+sen_driver_delay_names+["delay_sen"]
self.delay_chain_indices = (len(self.rbl_delay_meas_names)-len(dc_delay_names), len(self.rbl_delay_meas_names))
#Create slew measurement names
wl_en_driver_slew_names = ["slew_wl_en_dvr{}_".format(stage) for stage in range(1,self.get_num_wl_en_driver_stages())]
wl_driver_slew_names = ["slew_wl_dvr{}_".format(stage) for stage in range(1,self.get_num_wl_driver_stages())]
@ -61,14 +62,14 @@ class model_check(delay):
["Xsram.wl_en0", "Xsram.Xbank0.Xwordline_driver0.wl_bar_{}".format(self.wordline_row)]+\
wl_driver_signals+\
["Xsram.Xbank0.wl_{}".format(self.wordline_row)]
self.rbl_en_signal_names = ["Xsram.Xcontrol0.gated_clk_bar", "Xsram.Xcontrol0.Xand2_rbl_in.zb_int", "Xsram.Xcontrol0.rbl_in"]+\
pre_delay_chain_names = ["Xsram.Xcontrol0.gated_clk_bar", "Xsram.Xcontrol0.Xand2_rbl_in.zb_int", "Xsram.Xcontrol0.rbl_in"]
self.rbl_en_signal_names = pre_delay_chain_names+\
delay_chain_signal_names+\
["Xsram.Xcontrol0.Xreplica_bitline.delayed_en"]
self.sae_signal_names = ["Xsram.Xcontrol0.Xreplica_bitline.bl0_0", "Xsram.Xcontrol0.pre_s_en"]+\
sen_driver_signals+\
["Xsram.s_en0"]
def create_measurement_objects(self):
"""Create the measurements used for read and write ports"""
self.create_wordline_measurement_objects()

View File

@ -4,7 +4,7 @@ num_words = 16
tech_name = "freepdk45"
#process_corners = ["TT", "FF", "SS", "SF", "FS"]
process_corners = ["TT"]
process_corners = ["TT", "FF", "SS"]
supply_voltages = [1.0]
temperatures = [25]

View File

@ -20,28 +20,60 @@ MODEL_DIR = "model_data/"
class data_collection(openram_test):
def runTest(self):
ratio_data = self.calculate_delay_ratios_of_srams()
self.display_data(ratio_data)
# word_size, num_words, words_per_row = 4, 16, 1
# self.init_data_gen()
# self.set_delay_chain(2,3)
# self.save_data_sram_corners(word_size, num_words, words_per_row)
# wl_dataframe, sae_dataframe = self.get_csv_data()
# self.evaluate_data(wl_dataframe, sae_dataframe)
#Run again but with different delay chain sizes
# self.init_data_gen()
# self.set_delay_chain(4,2)
# self.save_data_sram_corners(word_size, num_words, words_per_row)
# wl_dataframe, sae_dataframe = self.get_csv_data()
# self.evaluate_data(wl_dataframe, sae_dataframe)
# model_delay_ratios, meas_delay_ratios, ratio_error = self.compare_model_to_measure()
# debug.info(1, "model_delay_ratios={}".format(model_delay_ratios))
# debug.info(1, "meas_delay_ratios={}".format(meas_delay_ratios))
# debug.info(1, "ratio_error={}".format(ratio_error))
# globals.end_openram()
#Uncomment this for model evaluation
# ratio_data = self.calculate_delay_ratios_of_srams()
# self.display_data(ratio_data)
self.run_delay_chain_variation_analysis()
globals.end_openram()
def run_delay_chain_variation_analysis(self):
"""Generates sram with different delay chain configs over different corners and
analyzes delay variation."""
OPTS.use_tech_delay_chain_size = True
#Constant sram config for this test
word_size, num_words, words_per_row = 1, 16, 1
#Only change delay chain
dc_config_list = [(2,3), (3,3), (3,4), (4,2)]
dc_vars = []
for stages,fanout in dc_config_list:
self.init_data_gen()
self.set_delay_chain(stages,fanout)
self.save_data_sram_corners(word_size, num_words, words_per_row)
wl_dataframe, sae_dataframe = self.get_csv_data()
var = self.calculate_delay_chain_variance(sae_dataframe)
dc_vars.append(var)
debug.info(1,"DC config={}, variance={}".format((stages,fanout), var))
self.plot_data(dc_config_list, dc_vars)
#display data
def calculate_delay_chain_variance(self, sae_dataframe):
"""Determines the delay variance of the delay chain over corners"""
(start_dc, end_dc) = self.delay_obj.delay_chain_indices
start_data_pos = len(self.config_fields)+1 #items before this point are configuration related
delay_sums = []
row_count = 0
#Get delay sums over different corners
for sae_row in sae_dataframe.itertuples():
dc_delays = sae_row[start_data_pos+start_dc:start_data_pos+end_dc]
delay_sums.append(sum(dc_delays))
#calculate mean then variance
m = sum(delay_sums) / len(delay_sums)
delay_variance = sum((xi - m) ** 2 for xi in delay_sums) / len(delay_sums)
return delay_variance
def plot_data(self, x_labels, y_values):
"""Display a plot using matplot lib.
Assumes input x values are just labels and y values are actual data."""
data_range = [i+1 for i in range(len(x_labels))]
plt.xticks(data_range, x_labels)
plt.plot(data_range, y_values, 'ro')
plt.show()
def calculate_delay_ratios_of_srams(self):
"""Runs delay measurements on several sram configurations.
Computes the delay ratio for each one."""