mirror of https://github.com/VLSIDA/OpenRAM.git
- Characterize actual disabled power (read mode only)
- Report rise/fall power individually
This commit is contained in:
parent
7e36cd4828
commit
1f816e2823
|
|
@ -8,3 +8,5 @@
|
|||
*.toc
|
||||
*.synctex.gz
|
||||
**/model_data
|
||||
outputs
|
||||
technology/freepdk45/ncsu_basekit
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ class delay(simulation):
|
|||
""" Create measurement names. The names themselves currently define the type of measurement """
|
||||
|
||||
self.delay_meas_names = ["delay_lh", "delay_hl", "slew_lh", "slew_hl"]
|
||||
self.power_meas_names = ["read0_power", "read1_power", "write0_power", "write1_power"]
|
||||
self.power_meas_names = ["read0_power", "read1_power", "write0_power", "write1_power", "disabled_read0_power", "disabled_read1_power"]
|
||||
# self.voltage_when_names = ["volt_bl", "volt_br"]
|
||||
# self.bitline_delay_names = ["delay_bl", "delay_br"]
|
||||
|
||||
|
|
@ -108,6 +108,11 @@ class delay(simulation):
|
|||
self.read_lib_meas.append(power_measure("read0_power", "FALL", measure_scale=1e3))
|
||||
self.read_lib_meas[-1].meta_str = sram_op.READ_ZERO
|
||||
|
||||
self.read_lib_meas.append(power_measure("disabled_read1_power", "RISE", measure_scale=1e3))
|
||||
self.read_lib_meas[-1].meta_str = "disabled_read1"
|
||||
self.read_lib_meas.append(power_measure("disabled_read0_power", "FALL", measure_scale=1e3))
|
||||
self.read_lib_meas[-1].meta_str = "disabled_read0"
|
||||
|
||||
# This will later add a half-period to the spice time delay. Only for reading 0.
|
||||
for obj in self.read_lib_meas:
|
||||
if obj.meta_str is sram_op.READ_ZERO:
|
||||
|
|
@ -665,7 +670,7 @@ class delay(simulation):
|
|||
if not success:
|
||||
feasible_period = 2 * feasible_period
|
||||
continue
|
||||
|
||||
|
||||
# Positions of measurements currently hardcoded. First 2 are delays, next 2 are slews
|
||||
feasible_delays = [results[port][mname] for mname in self.delay_meas_names if "delay" in mname]
|
||||
feasible_slews = [results[port][mname] for mname in self.delay_meas_names if "slew" in mname]
|
||||
|
|
@ -1208,6 +1213,9 @@ class delay(simulation):
|
|||
read_port)
|
||||
self.measure_cycles[read_port][sram_op.READ_ZERO] = len(self.cycle_times)-1
|
||||
|
||||
self.add_nop(self.probe_address, data_zeros, read_port)
|
||||
self.measure_cycles[write_port]["disabled_read0"] = len(self.cycle_times) - 1
|
||||
|
||||
self.add_noop_all_ports("Idle cycle (if read takes >1 cycle)")
|
||||
|
||||
self.add_write("W data 1 address {} to write value".format(self.probe_address),
|
||||
|
|
@ -1223,6 +1231,9 @@ class delay(simulation):
|
|||
wmask_ones,
|
||||
write_port)
|
||||
|
||||
self.add_nop(self.probe_address, data_zeros, read_port)
|
||||
self.measure_cycles[write_port]["disabled_read1"] = len(self.cycle_times) - 1
|
||||
|
||||
# This also ensures we will have a L->H transition on the next read
|
||||
self.add_read("R data 0 address {} to clear dout caps".format(inverse_address),
|
||||
inverse_address,
|
||||
|
|
|
|||
|
|
@ -522,39 +522,43 @@ class lib:
|
|||
if port in self.write_ports:
|
||||
if port in self.read_ports:
|
||||
web_name = " & !web{0}".format(port)
|
||||
avg_write_power = np.mean(self.char_port_results[port]["write1_power"] + self.char_port_results[port]["write0_power"])
|
||||
write1_power = np.mean(self.char_port_results[port]["write1_power"])
|
||||
write0_power = np.mean(self.char_port_results[port]["write0_power"])
|
||||
self.lib.write(" internal_power(){\n")
|
||||
self.lib.write(" when : \"!csb{0}{1}\"; \n".format(port, web_name))
|
||||
self.lib.write(" rise_power(scalar){\n")
|
||||
self.lib.write(" values(\"{0}\");\n".format(avg_write_power/2.0))
|
||||
self.lib.write(" values(\"{0:.6e}\");\n".format(write1_power))
|
||||
self.lib.write(" }\n")
|
||||
self.lib.write(" fall_power(scalar){\n")
|
||||
self.lib.write(" values(\"{0}\");\n".format(avg_write_power/2.0))
|
||||
self.lib.write(" values(\"{0:.6e}\");\n".format(write0_power))
|
||||
self.lib.write(" }\n")
|
||||
self.lib.write(" }\n")
|
||||
|
||||
if port in self.read_ports:
|
||||
if port in self.write_ports:
|
||||
web_name = " & web{0}".format(port)
|
||||
avg_read_power = np.mean(self.char_port_results[port]["read1_power"] + self.char_port_results[port]["read0_power"])
|
||||
read1_power = np.mean(self.char_port_results[port]["read1_power"])
|
||||
read0_power = np.mean(self.char_port_results[port]["read0_power"])
|
||||
self.lib.write(" internal_power(){\n")
|
||||
self.lib.write(" when : \"!csb{0}{1}\"; \n".format(port, web_name))
|
||||
self.lib.write(" rise_power(scalar){\n")
|
||||
self.lib.write(" values(\"{0}\");\n".format(avg_read_power/2.0))
|
||||
self.lib.write(" values(\"{0:.6e}\");\n".format(read1_power))
|
||||
self.lib.write(" }\n")
|
||||
self.lib.write(" fall_power(scalar){\n")
|
||||
self.lib.write(" values(\"{0}\");\n".format(avg_read_power/2.0))
|
||||
self.lib.write(" values(\"{0:.6e}\");\n".format(read0_power))
|
||||
self.lib.write(" }\n")
|
||||
self.lib.write(" }\n")
|
||||
|
||||
# Have 0 internal power when disabled, this will be represented as leakage power.
|
||||
# Disabled power.
|
||||
disabled_read1_power = np.mean(self.char_port_results[port]["disabled_read1_power"])
|
||||
disabled_read0_power = np.mean(self.char_port_results[port]["disabled_read0_power"])
|
||||
self.lib.write(" internal_power(){\n")
|
||||
self.lib.write(" when : \"csb{0}\"; \n".format(port))
|
||||
self.lib.write(" rise_power(scalar){\n")
|
||||
self.lib.write(" values(\"0\");\n")
|
||||
self.lib.write(" values(\"{0:.6e}\");\n".format(disabled_read1_power))
|
||||
self.lib.write(" }\n")
|
||||
self.lib.write(" fall_power(scalar){\n")
|
||||
self.lib.write(" values(\"0\");\n")
|
||||
self.lib.write(" values(\"{0:.6e}\");\n".format(disabled_read0_power))
|
||||
self.lib.write(" }\n")
|
||||
self.lib.write(" }\n")
|
||||
|
||||
|
|
|
|||
|
|
@ -210,6 +210,22 @@ class simulation():
|
|||
if unselected_port != port:
|
||||
self.add_noop_one_port(unselected_port)
|
||||
|
||||
def add_nop(self, address, din_data, port):
|
||||
""" Add the control values for a cycle with clock only. Does not increment the period. """
|
||||
debug.check(port in self.read_ports or port in self.write_ports,
|
||||
"Cannot add read cycle to a write port. Port {0}, Read Ports {1}".format(port, self.read_ports))
|
||||
debug.info(2, 'Clock only on port {}'.format(port))
|
||||
self.fn_cycle_comments.append('Clock only on port {}'.format(port))
|
||||
self.append_cycle_comment(port, 'Clock only on port {}'.format(port))
|
||||
|
||||
self.cycle_times.append(self.t_current)
|
||||
self.t_current += self.period
|
||||
self.add_control_one_port(port, "noop")
|
||||
# If the port is also a readwrite then add data.
|
||||
if port in self.write_ports:
|
||||
self.add_data(din_data, port)
|
||||
self.add_address(address, port)
|
||||
|
||||
def add_noop_all_ports(self, comment):
|
||||
""" Add the control values for a noop to all ports. """
|
||||
debug.info(2, comment)
|
||||
|
|
|
|||
Loading…
Reference in New Issue