Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed all memory leakage in TL-Test agents and refactored include for coupledL2-huancun. #18

Open
wants to merge 1 commit into
base: coupledL2-huancun
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
build
cmake-build-debug
.idea
.idea
.vscode
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ project(tlc_test)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb -fsanitize=address -fsanitize=leak")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

if(NOT DEFINED DUT_DIR)
Expand Down
71 changes: 44 additions & 27 deletions Emu/Emu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ Emu::Emu(int argc, char **argv) {
for (int i = 0; i < NR_ULAGENTS; i++) {
agents[i] = new ULAgent_t(globalBoard, i, &Cycles);
auto port = naive_gen_port();
ports[i] = port;
agents[i]->connect(port);
fuzzers[i] = new ULFuzzer(static_cast<ULAgent_t*>(agents[i]));
fuzzers[i]->set_cycles(&Cycles);
Expand All @@ -72,9 +73,11 @@ Emu::Emu(int argc, char **argv) {
agents[i] = new CAgent_t(globalBoard, i, &Cycles);
if (i == 0) {
auto port = naive_gen_port();
ports[i] = port;
agents[i]->connect(port);
} else {
auto port = naive_gen_port2();
ports[i] = port;
agents[i]->connect(port);
}
fuzzers[i] = new CFuzzer(static_cast<CAgent_t*>(agents[i]));
Expand All @@ -98,7 +101,21 @@ Emu::Emu(int argc, char **argv) {
}

Emu::~Emu() {

for (int i = 0; i < NR_AGENTS; i++)
{
delete fuzzers[i];
delete agents[i];
delete ports[i];
}

delete[] fuzzers;
delete[] agents;
delete[] ports;

delete globalBoard;
delete dut_ptr;

#if VM_TRACE == 1
if (this->enable_wave) {
this->tfp->close();
Expand Down Expand Up @@ -160,36 +177,36 @@ void Emu::execute(uint64_t nr_cycle) {
}

// the following code is to be replaced soon, only for test
tl_agent::Port<tl_agent::ReqField, tl_agent::RespField, tl_agent::EchoField, BEATSIZE>* Emu::naive_gen_port() {
auto port = new tl_agent::Port<tl_agent::ReqField, tl_agent::RespField, tl_agent::EchoField, BEATSIZE>();
port->a.ready = &(dut_ptr->master_port_0_0_a_ready);
port->a.valid = &(dut_ptr->master_port_0_0_a_valid);
port->a.opcode = &(dut_ptr->master_port_0_0_a_bits_opcode);
port->a.param = &(dut_ptr->master_port_0_0_a_bits_param);
Emu::BaseAgent_t::tlport_t* Emu::naive_gen_port() {
auto port = new Emu::BaseAgent_t::tlport_t;
port->a.ready = &(dut_ptr->master_port_0_0_a_ready);
port->a.valid = &(dut_ptr->master_port_0_0_a_valid);
port->a.opcode = &(dut_ptr->master_port_0_0_a_bits_opcode);
port->a.param = &(dut_ptr->master_port_0_0_a_bits_param);
port->a.address = &(dut_ptr->master_port_0_0_a_bits_address);
port->a.size = &(dut_ptr->master_port_0_0_a_bits_size);
port->a.source = &(dut_ptr->master_port_0_0_a_bits_source);
port->a.mask = &(dut_ptr->master_port_0_0_a_bits_mask);
port->a.data = (uint8_t*)&(dut_ptr->master_port_0_0_a_bits_data);
port->a.alias = (uint8_t*)&(dut_ptr->master_port_0_0_a_bits_user_alias);
port->a.size = &(dut_ptr->master_port_0_0_a_bits_size);
port->a.source = &(dut_ptr->master_port_0_0_a_bits_source);
port->a.mask = &(dut_ptr->master_port_0_0_a_bits_mask);
port->a.data = (uint8_t*)&(dut_ptr->master_port_0_0_a_bits_data);
port->a.alias = (uint8_t*)&(dut_ptr->master_port_0_0_a_bits_user_alias);

port->b.ready = &(dut_ptr->master_port_0_0_b_ready);
port->b.valid = &(dut_ptr->master_port_0_0_b_valid);
port->b.opcode = &(dut_ptr->master_port_0_0_b_bits_opcode);
port->b.param = &(dut_ptr->master_port_0_0_b_bits_param);
port->b.ready = &(dut_ptr->master_port_0_0_b_ready);
port->b.valid = &(dut_ptr->master_port_0_0_b_valid);
port->b.opcode = &(dut_ptr->master_port_0_0_b_bits_opcode);
port->b.param = &(dut_ptr->master_port_0_0_b_bits_param);
port->b.address = &(dut_ptr->master_port_0_0_b_bits_address);
port->b.size = &(dut_ptr->master_port_0_0_b_bits_size);
port->b.source = &(dut_ptr->master_port_0_0_b_bits_source);
port->b.alias = (uint8_t *)&(dut_ptr->master_port_0_0_b_bits_data[0]);
port->b.size = &(dut_ptr->master_port_0_0_b_bits_size);
port->b.source = &(dut_ptr->master_port_0_0_b_bits_source);
port->b.alias = (uint8_t *)&(dut_ptr->master_port_0_0_b_bits_data[0]);

port->c.ready = &(dut_ptr->master_port_0_0_c_ready);
port->c.valid = &(dut_ptr->master_port_0_0_c_valid);
port->c.opcode = &(dut_ptr->master_port_0_0_c_bits_opcode);
port->c.param = &(dut_ptr->master_port_0_0_c_bits_param);
port->c.ready = &(dut_ptr->master_port_0_0_c_ready);
port->c.valid = &(dut_ptr->master_port_0_0_c_valid);
port->c.opcode = &(dut_ptr->master_port_0_0_c_bits_opcode);
port->c.param = &(dut_ptr->master_port_0_0_c_bits_param);
port->c.address = &(dut_ptr->master_port_0_0_c_bits_address);
port->c.size = &(dut_ptr->master_port_0_0_c_bits_size);
port->c.source = &(dut_ptr->master_port_0_0_c_bits_source);
port->c.data = (uint8_t*)&(dut_ptr->master_port_0_0_c_bits_data);
port->c.size = &(dut_ptr->master_port_0_0_c_bits_size);
port->c.source = &(dut_ptr->master_port_0_0_c_bits_source);
port->c.data = (uint8_t*)&(dut_ptr->master_port_0_0_c_bits_data);
// port->c.dirty = &(dut_ptr->master_port_0_0_c_bits_echo_blockisdirty);

port->d.ready = &(dut_ptr->master_port_0_0_d_ready);
Expand All @@ -208,8 +225,8 @@ tl_agent::Port<tl_agent::ReqField, tl_agent::RespField, tl_agent::EchoField, BEA
return port;
}

tl_agent::Port<tl_agent::ReqField, tl_agent::RespField, tl_agent::EchoField, BEATSIZE>* Emu::naive_gen_port2() {
auto port = new tl_agent::Port<tl_agent::ReqField, tl_agent::RespField, tl_agent::EchoField, BEATSIZE>();
Emu::BaseAgent_t::tlport_t* Emu::naive_gen_port2() {
auto port = new Emu::BaseAgent_t::tlport_t;
port->a.ready = &(dut_ptr->master_port_1_0_a_ready);
port->a.valid = &(dut_ptr->master_port_1_0_a_valid);
port->a.opcode = &(dut_ptr->master_port_1_0_a_bits_opcode);
Expand Down
11 changes: 7 additions & 4 deletions Emu/Emu.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,11 @@ class Emu {
VTestTop *dut_ptr;
VerilatedVcdC* tfp;
GlobalBoard<paddr_t> *globalBoard;
BaseAgent_t ** const agents = new BaseAgent_t*[NR_AGENTS];
Fuzzer ** const fuzzers = new Fuzzer*[NR_AGENTS];
//
BaseAgent_t** const agents = new BaseAgent_t*[NR_AGENTS];
Fuzzer** const fuzzers = new Fuzzer*[NR_AGENTS];
BaseAgent_t::tlport_t** const ports = new BaseAgent_t::tlport_t*[NR_AGENTS];
//
uint64_t seed = 0, wave_begin = 0, wave_end = 0;
bool enable_wave = true;
bool wave_full = false;
Expand All @@ -44,8 +47,8 @@ class Emu {
inline void pos_edge();
inline void update_cycles(uint64_t inc);
void execute(uint64_t nr_cycle);
tl_agent::Port<tl_agent::ReqField, tl_agent::RespField, tl_agent::EchoField, BEATSIZE>* naive_gen_port();
tl_agent::Port<tl_agent::ReqField, tl_agent::RespField, tl_agent::EchoField, BEATSIZE>* naive_gen_port2();
BaseAgent_t::tlport_t* naive_gen_port();
BaseAgent_t::tlport_t* naive_gen_port2();
};

inline void Emu::reset(uint64_t n) {
Expand Down
7 changes: 4 additions & 3 deletions Fuzzer/CFuzzer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@
// Created by wkf on 2021/10/29.
//

#include "../TLAgent/TLEnum.h"
#include "Fuzzer.h"

CFuzzer::CFuzzer(tl_agent::CAgent *cAgent) {
CFuzzer::CFuzzer(tl_agent::CAgent *cAgent) noexcept {
this->cAgent = cAgent;
}

Expand Down Expand Up @@ -38,9 +39,9 @@ void CFuzzer::caseTest() {
this->cAgent->do_acquireBlock(0x1040, tl_agent::NtoT, 0);
}
if (*cycles == 300) {
uint8_t* putdata = new uint8_t[DATASIZE];
auto putdata = make_shared_tldata();
for (int i = 0; i < DATASIZE; i++) {
putdata[i] = (uint8_t)rand();
putdata->data[i] = (uint8_t)rand();
}
this->cAgent->do_releaseData(0x1040, tl_agent::TtoN, putdata, 0);
}
Expand Down
10 changes: 6 additions & 4 deletions Fuzzer/Fuzzer.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ class Fuzzer {
protected:
uint64_t *cycles;
public:
Fuzzer() = default;
~Fuzzer() = default;
Fuzzer() noexcept = default;
virtual ~Fuzzer() noexcept = default;
virtual void tick() = 0;
void set_cycles(uint64_t *cycles) {
this->cycles = cycles;
Expand All @@ -24,7 +24,8 @@ class ULFuzzer: public Fuzzer {
private:
tl_agent::ULAgent *ulAgent;
public:
ULFuzzer(tl_agent::ULAgent *ulAgent);
ULFuzzer(tl_agent::ULAgent *ulAgent) noexcept;
virtual ~ULFuzzer() noexcept = default;
void randomTest(bool put);
void caseTest();
void caseTest2();
Expand All @@ -35,7 +36,8 @@ class CFuzzer: public Fuzzer {
private:
tl_agent::CAgent *cAgent;
public:
CFuzzer(tl_agent::CAgent *cAgent);
CFuzzer(tl_agent::CAgent *cAgent) noexcept;
virtual ~CFuzzer() noexcept = default;
void randomTest(bool do_alias);
void caseTest();
void tick();
Expand Down
18 changes: 9 additions & 9 deletions Fuzzer/ULFuzzer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

#include "Fuzzer.h"

ULFuzzer::ULFuzzer(tl_agent::ULAgent *ulAgent) {
ULFuzzer::ULFuzzer(tl_agent::ULAgent *ulAgent) noexcept {
this->ulAgent = ulAgent;
}

Expand All @@ -13,22 +13,22 @@ void ULFuzzer::randomTest(bool put) {
if (!put || rand() % 2) { // Get
ulAgent->do_getAuto(addr);
} else { // Put
uint8_t* putdata = new uint8_t[DATASIZE];
auto putdata = make_shared_tldata();
for (int i = 0; i < DATASIZE; i++) {
putdata[i] = (uint8_t)rand();
putdata->data[i] = (uint8_t)rand();
}
ulAgent->do_putfulldata(addr, putdata);
}
}

void ULFuzzer::caseTest() {
if (*cycles == 500) {
uint8_t* putdata = new uint8_t[DATASIZE];
auto putdata = make_shared_tldata();
for (int i = 0; i < DATASIZE/2; i++) {
putdata[i] = (uint8_t)rand();
putdata->data[i] = (uint8_t)rand();
}
for (int i = DATASIZE/2; i < DATASIZE; i++) {
putdata[i] = putdata[i-DATASIZE/2];
putdata->data[i] = putdata->data[i-DATASIZE/2];
}
ulAgent->do_putpartialdata(0x1070, 2, 0xf0000, putdata);
}
Expand All @@ -39,12 +39,12 @@ void ULFuzzer::caseTest() {

void ULFuzzer::caseTest2() {
if (*cycles == 100) {
uint8_t* putdata = new uint8_t[DATASIZE];
auto putdata = make_shared_tldata();
for (int i = 0; i < DATASIZE/2; i++) {
putdata[i] = (uint8_t)rand();
putdata->data[i] = (uint8_t)rand();
}
for (int i = DATASIZE/2; i < DATASIZE; i++) {
putdata[i] = putdata[i-DATASIZE/2];
putdata->data[i] = putdata->data[i-DATASIZE/2];
}
ulAgent->do_putpartialdata(0x1000, 2, 0xf, putdata);
}
Expand Down
18 changes: 11 additions & 7 deletions TLAgent/BaseAgent.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include <set>
#include "Port.h"
#include "Bundle.h"
#include "../Utils/Common.h"
#include "../Utils/ScoreBoard.h"

Expand Down Expand Up @@ -112,17 +113,20 @@ namespace tl_agent {
};

class BaseAgent {
public:
using tlport_t = Port<ReqField, RespField, EchoField, BEATSIZE>;

protected:
Port<ReqField, RespField, EchoField, BEATSIZE> *port;
GlobalBoard<paddr_t> *globalBoard;
IDPool idpool;
tlport_t *port;
GlobalBoard<paddr_t> *globalBoard;
IDPool idpool;
virtual void timeout_check() = 0;
int id;

public:
virtual Resp send_a(std::shared_ptr<ChnA<ReqField, EchoField, DATASIZE>> &a) = 0;
virtual void handle_b(std::shared_ptr<ChnB> &b) = 0;
virtual Resp send_c(std::shared_ptr<ChnC<ReqField, EchoField, DATASIZE>> &c) = 0;
virtual Resp send_a (std::shared_ptr<BundleChannelA<ReqField, EchoField, DATASIZE>>& a) = 0;
virtual void handle_b (std::shared_ptr<BundleChannelB>& b) = 0;
virtual Resp send_c (std::shared_ptr<BundleChannelC<ReqField, EchoField, DATASIZE>>& c) = 0;
virtual void fire_a() = 0;
virtual void fire_b() = 0;
virtual void fire_c() = 0;
Expand All @@ -133,7 +137,7 @@ namespace tl_agent {
BaseAgent(): idpool(0, NR_SOURCEID) {};
virtual ~BaseAgent() = default;

void connect(Port<ReqField, RespField, EchoField, BEATSIZE> *p){ this->port = p; }
void connect(tlport_t* p){ this->port = p; }
};

}
Expand Down
Loading