У меня есть design.h и design. cpp, как указано ниже. Я пытаюсь сделать два этапа в дизайне. Я замечаю, что задержка такая же, когда у меня был только один этап. Я не понимаю, почему количество тактов, необходимое для прохождения дизайна, может остаться неизменным, если у меня есть два этапа вместо одного. Я думаю, что эти два этапа выполнены неправильно.
//Design.h file
#include <systemc.h>
#include "Buffer.h"
using namespace std;
SC_MODULE(Design)
{
sc_in_clk clock;
sc_in <bool> reset;
sc_in <Flit> flit_rx[DIRECTIONS + 2];
sc_out <Flit> flit_tx[DIRECTIONS + 2];
BufferBank buffer[DIRECTIONS + 2];
BufferBank intermediate_buffer[DIRECTIONS + 2];
void process();
void rxProcess();
void second_stage_process();
void intermediateProcess();
void txProcess();
SC_CTOR(Design) {
SC_METHOD(process);
sensitive << reset;
sensitive << clock.pos();
SC_METHOD(second_stage_process);
sensitive << reset;
sensitive << clock.pos();
}
};
Конструкция. cpp выглядит следующим образом.
#include "Design.h"
void Design::process()
{
rxProcess();
}
void Design::second_stage_process()
{
txProcess();
intermediateProcess();
}
void Design::rxProcess()
{
if (!reset.read()) {
for (int i = 0; i < DIRECTIONS + 2; i++) {
Flit received_flit = flit_rx[i].read();
int vc = received_flit.vc_id;
if (!buffer[i][vc].IsFull())
{
// Store the incoming flit in the circular buffer
buffer[i][vc].Push(received_flit);
}
}
}
}
void Design::intermediateProcess()
{
if (!reset.read())
{
for (int i = 0; i < DIRECTIONS + 2; i++) {
for (int vc = 0;vc < GlobalParams::n_virtual_channels; vc++)
{
if ((!buffer[i][vc].IsEmpty()) && (!intermediate_buffer[i][vc].IsFull()))
{
// Store the incoming flit in the circular buffer
intermediate_buffer[i][vc].Push(buffer[i][vc].Front());
buffer[i][vc].Pop();
}
}
}
}
}
void Design::txProcess()
{
if (!reset.read())
{
for (int j = 0; j < DIRECTIONS + 2; j++)
{
int i = (start_from_port + j) % (DIRECTIONS + 2);
for (int k = 0;k < GlobalParams::n_virtual_channels; k++)
{
int vc = (start_from_vc[i]+k)%(GlobalParams::n_virtual_channels);
if (!intermediate_buffer[i][vc].IsEmpty())
{
Flit flit = intermediate_buffer[i][vc].Front();
//some operations with flit
}
}
}
for (int i = 0; i < DIRECTIONS + 2; i++)
{
if (!intermediate_buffer[i][vc].IsEmpty())
{
Flit flit = intermediate_buffer[i][vc].Front();
//some operations to get the value of o
flit_tx[o].write(flit);
intermediate_buffer[i][vc].Pop();
}
}
}
}
Пожалуйста, скажите мне, что я делаю неправильно. Я хочу создать второй этап, и поэтому я сохраняю данные из buffer
в intermediate_buffer
и использую этот буфер в txProcess
. Но это не увеличивает задержку распространения данных (от входного приемника к выходному передатчику), что означает, что вторая ступень фактически не создается.