Files
V2TMUMemTester/UnitTest/Sim/test_EDORam.cpp
2026-03-07 15:10:59 +01:00

87 lines
2.4 KiB
C++

#include <systemc>
#include <iostream>
#include "EDORam.hpp"
using namespace sc_core;
using namespace sc_dt;
SC_MODULE(Testbench) {
sc_signal<bool> sigRAS, sigUCAS, sigLCAS, sigWE, sigOE;
sc_signal< sc_uint<9> > sigADDR;
sc_signal_rv<16> sigDATA; // resolved signal for bi-directional bus
EDORam* ram;
SC_CTOR(Testbench) {
ram = new EDORam("edoram");
ram->RAS(sigRAS);
ram->UCAS(sigUCAS);
ram->LCAS(sigLCAS);
ram->WE(sigWE);
ram->OE(sigOE);
ram->ADDRESS(sigADDR);
ram->DATA(sigDATA);
SC_THREAD(run);
}
void run() {
// init: all strobes inactive (true)
sigRAS = true; sigUCAS = true; sigLCAS = true;
sigWE = false; // choose WE=false as read, WE=true as write
sigOE = true; // OE true => output disabled; OE false => output enabled
sigADDR = 0;
sigDATA.write("ZZZZZZZZZZZZZZZZ"); // high-Z
wait(10, SC_NS);
// WRITE cycle: write 0x1234 at addr 1
unsigned addr = 1;
uint16_t write_val = 0x1234;
sigADDR = addr;
// testbench drives data during write
sc_lv<16> drive_val = sc_lv<16>( (uint64_t)write_val );
sigDATA.write(drive_val);
sigWE = true; // indicate write
// RAS falling
sigRAS = false;
wait(5, SC_NS);
// CAS falling (both)
sigUCAS = false; sigLCAS = false;
wait(5, SC_NS);
// CAS rising
sigUCAS = true; sigLCAS = true;
wait(5, SC_NS);
// RAS rising -> end
sigRAS = true;
// release testbench drive
sigDATA.write("ZZZZZZZZZZZZZZZZ");
sigWE = false;
wait(10, SC_NS);
// READ cycle: read addr 1
sigADDR = addr;
sigOE = false; // enable outputs from RAM when reading
// RAS falling
sigRAS = false;
wait(5, SC_NS);
// CAS falling
sigUCAS = false; sigLCAS = false;
wait(5, SC_NS);
// sample data bus (RAM should drive)
sc_lv<16> read_lv = sigDATA.read();
uint16_t read_val = (uint16_t)read_lv.to_uint64();
std::cout << "READ val = 0x" << std::hex << read_val << " expected 0x" << write_val << std::dec << std::endl;
// finish
sc_stop();
}
};
int sc_main(int argc, char* argv[])
{
Testbench tb("tb");
sc_start();
return 0;
}