SRAM.cc
// INCLUDE THE CLASS DECLARATION
#include "SRAM.h"
// INCLUDE CLASSES USED IN THE IMPLEMENTATION
#include "smi_channel.h"
#include "smi_message.h"
//***********************
// CLASS DEFINITION: SRAM
//***********************
// CONSTANTS: MUST MATCH THE DEFINITION USED BY THE VERILOG WRAPPER
const int SRAM::MEM_CONFIG=0;
const int SRAM::MEM_WRITE=1;
const int SRAM::MEM_READ=2;
// CONSTRUCTOR
SRAM::SRAM(const string& name):
d_name(name)
{
// FETCH THE SMI CHANNEL POINTER
SMI_Channel* channel = SMI_Channel::instance();
// ALLOCATE AN SMI REPLY MESSAGE
d_tx = channel->newTxMessage();
// REGISTER THIS MODEL INSTANCE WITH SMI
channel->add(name, "SRAM", this);
}
// DESTRUCTOR
SRAM::~SRAM()
{
// DELETE THE SMI REPLY MESSAGE
delete d_tx;
}
// METHOD: process(rx)
SMI_TxMessage*
SRAM::process(const SMI_RxMessage& rx)
{
// CHOOSE AN ACTION DEPENDING ON THE MESSAGE TYPE
switch(rx.integer(0))
{
// IF THE MESSAGE TYPE IS "Configure"
case MEM_CONFIG:
// SET THE BIT WIDTH FROM THE "width" MESSAGE VALUE
d_width = rx.integer(1);
break;
// IF THE MESSAGE TYPE IS "Read+Write"
case MEM_WRITE:
// READ THE VALUE OF THE MEMORY WORD AT THE ADDRESS GIVEN BY THE
// "address" MESSAGE VALUE AND STORE IN THE REPLY MESSAGE
d_tx->append(d_width, d_memory[rx.integer(1)]);
// READ THE VALUE GIVEN BY THE "data" MESSAGE VALUE TO THE MEMORY WORD
// AT THE ADDRESS GIVEN BY THE "address" MESSAGE VALUE
d_memory[rx.integer(1)] = rx.integer(2);
break;
// IF THE MESSAGE TYPE IS "Read"
case MEM_READ:
// READ THE VALUE OF THE MEMORY WORD AT THE ADDRESS GIVEN BY THE
// "address" MESSAGE VALUE AND STORE IN THE REPLY MESSAGE
d_tx->append(d_width, d_memory[rx.integer(1)]);
break;
// IF THE MESSAGE TYPE IS ILLEGAL
default:
cout << "SRAM::process: " << d_name << " ILLEGAL OPERATION" << endl;
}
// RETURN ANY REPLY MESSAGE
return d_tx;
}
© Copyright 2000-2001 Adrian Lewis