Как создать двухступенчатый конвейер, используя System C? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть 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. Но это не увеличивает задержку распространения данных (от входного приемника к выходному передатчику), что означает, что вторая ступень фактически не создается.

...