HOME       UP       PREV       |ENDOFPACK|

TLM POWER 3 library for SystemC: SRAM example

Setting the static power and area for an SRAM based on eariler 45nm Mformulae:

void sram64_cbg::recompute_pvt_parameters() // Called in constructor and when Vcc is changed.
{
  m_latency =  sc_time(0.21 + 3.8e-4 *sqrt(float(m_bits)), SC_NS);

  pw_power leakage = pw_power(82.0 * m_bits, PW_nW);
  set_static_power(leakage);

  set_fixed_area(pw_area(13359.0 + 4.93/8 * m_bits, PW_squm));

  m_read_energy_op = pw_energy(5.0 + 1.2e-4 / 8.0 *m_bits, pw_energy_unit::PW_pJ);
  m_write_energy_op = 2.0 * m_read_energy_op; // rule of thumb!

  // NB: Might want different energy when high-order address bits change.

  pw_voltage vcc = get_vcc();
  m_latency = m_latency / vcc.to_volts();
  cout << name () << ":" << kind() << ": final latency = " << m_latency << "\n";
}
How to log the wiring and transaction power for an SRAM:
void sram64_cbg::b_access(PW_TLM_PAYTYPE &trans, sc_time &delay)
{
  tlm::tlm_command cmd = trans.get_command();

  // Log wiring power consumed by transaction arriving here.
  // Also set which nets modelled by the TLM will be active after this operation:
  // For a write none (except a response ack) and for read the payload data.
  trans.pw_log_hop(this,  (cmd==tlm::TLM_READ_COMMAND ? PW_TGP_DATA: PW_TGP_NOFIELDS) |
          PW_TGP_ACCT_CKP,  &read_bus_tracker);

  if (cmd == tlm::TLM_READ_COMMAND)
    {
      // Log internal transaction energy for read
      pw_module_base::record_energy_use(m_read_energy_op); 
      ...
    }
  else if (cmd == tlm::TLM_WRITE_COMMAND)
    {
      // Log internal transaction energy for write
      pw_module_base::record_energy_use(m_write_energy_op);
      ...
    }

}


27: (C) 2008-13, DJ Greaves, University of Cambridge, Computer Laboratory.