problem with creating new levels of logic

D

David Li

I am having a lot of problem with following code. To start with
I have a working sets of code and the top level SystemC code looks
like this:

----------working main.cpp start here -------------------

#include "C:\SystemC\systemc-2.0.1\src\systemc.h"
#include "stimulus.h"
#include "display.h"
#include "fir.h"
#include "ParametizedDelay.h"

int sc_main (int argc , char *argv[]) {
sc_clock clock;
sc_signal<bool> reset;
sc_signal<bool> input_valid;
sc_signal<int> ADC_Data;
sc_signal<int> Filter_Out;
sc_signal<int> Line1_Out,Line2_Out,Line3_Out,Line4_Out;

stimulus stimulus("stimulus");
fir fir("fir");
fir.SetCoefs(13, 0, "LPF.Coeff");
display display ("display");

stimulus.CLK(clock.signal());
stimulus.reset(reset);
stimulus.ADC_Data(ADC_Data);

fir.CLK(clock.signal());
fir.reset(reset);
fir.ipData(ADC_Data);
fir.opData(Filter_Out);

ParametizedDelay Line1 ("line1");
ParametizedDelay Line2 ("line2");
ParametizedDelay Line3 ("line3");
ParametizedDelay Line4 ("line4");

Line1.SetDelay(500);
Line1.CLK(clock.signal());
Line1.reset(reset);
Line1.ipData(ADC_Data);
Line1.opData(Line1_Out);

Line2.SetDelay(500);
Line2.CLK(clock.signal());
Line2.reset(reset);
Line2.ipData(Line1_Out);
Line2.opData(Line2_Out);

Line3.SetDelay(500);
Line3.CLK(clock.signal());
Line3.reset(reset);
Line3.ipData(Line2_Out);
Line3.opData(Line3_Out);

Line4.SetDelay(500);
Line4.CLK(clock.signal());
Line4.reset(reset);
Line4.ipData(Line3_Out);
Line4.opData(Line4_Out);

display.CLK(clock.signal());
display.lpf(Filter_Out);
display.Line1(Line1_Out);
display.Line2(Line2_Out);
display.Line3(Line3_Out);
display.Line4(Line4_Out);

sc_start(clock, -1);
return 0;
}
--------------End of main.cpp ------------------

Basically, the stimulus module read in a data file and feed it(the
ADC_Data) to the fir module which is simply a FIR filter(the filter
coefficient is defined by LPF.Coeff text file). At the same time
stimulus also feed into a 4 separate Line delays each with a delay of
500 clocks. Now, the code is working but what I would like to do is to
create a new module that contains only the 4 Lines at the top level.
When done, I like it to look like the following.

-------------the new main.cpp -------------------

#include "C:\SystemC\systemc-2.0.1\src\systemc.h"
#include "stimulus.h"
#include "display.h"
#include "fir.h"
#include "ParametizedDelay.h"
#include "FourInOne.h"

int sc_main (int argc , char *argv[]) {

sc_clock clock;
sc_signal<bool> reset;
sc_signal<bool> input_valid;
sc_signal<int> ADC_Data;
sc_signal<int> Filter_Out;
sc_signal<int> Line1_Out,Line2_Out,Line3_Out,Line4_Out;

stimulus stimulus("stimulus");
fir fir("fir");
fir.SetCoefs(13, 0, "LPF.Coeff");
display display ("display");
FourInOne FourInOne("FourInOne"); // This would be the new module
added here.

stimulus.CLK(clock.signal());
stimulus.reset(reset);
stimulus.ADC_Data(ADC_Data);

fir.CLK(clock.signal());
fir.reset(reset);
fir.ipData(ADC_Data);
fir.opData(Filter_Out);

ParametizedDelay Line1 ("line1");
ParametizedDelay Line2 ("line2");
ParametizedDelay Line3 ("line3");
ParametizedDelay Line4 ("line4");

FourInOne.SetDelay(500); //Added
FourInOne.CLK(clock.signal()); //Added
FourInOne.reset(reset); //Added
FourInOne.ipBotLine(ADC_Data); //Added
FourInOne.opCurLine(Line1_Out); //Added
FourInOne.opCurLine(Line2_Out); //Added
FourInOne.opCurLine(Line3_Out); //Added
FourInOne.opTopLine(Line4_Out); //Added

display.CLK(clock.signal());
display.lpf(Filter_Out);
display.Line1(Line1_Out);
display.Line2(Line2_Out);
display.Line3(Line3_Out);
display.Line4(Line4_Out);

sc_start(clock, -1);
return 0;
}

---------------end of desired main.cpp ---------------------

As you can see, my purpose is to be able to create new levels of logic
as design gets bigger. But the code doesn't work and can not compile.

In the following, I listed all the revelent .h and .cpp code.

-----------stimulus.h---------------
SC_MODULE(stimulus) {

sc_out<bool> reset;
sc_out<int> ADC_Data;
sc_in<bool> CLK;

unsigned CLK_COUNT;
FILE* ifp;
char line[80];
int FileReadData;

SC_CTOR(stimulus)
{
SC_METHOD(Read_Data_File);
dont_initialize();
sensitive_pos(CLK);
CLK_COUNT = 0;
ifp = fopen("C:/SystemC/Hardware-Model/InputData/cnn1.vec","r");
}
void Read_Data_File();
};

-------------- stimulus.cpp -------------------
#include "stdio.h"
#include "C:\SystemC\systemc-2.0.1\src\systemc.h"
#include "stimulus.h"

void stimulus::Read_Data_File() {

if(fgets(line, 80, ifp)== NULL) {sc_stop();}
sscanf(line, "%x", &FileReadData);

CLK_COUNT++;
if (CLK_COUNT<4){
reset.write(true);
} else {
reset.write(false);
ADC_Data.write((int)FileReadData);
}
}

----------fir.h-----------------
SC_MODULE(fir){

sc_in_clk CLK;
sc_in<bool> reset;
sc_in<int> ipData;
sc_out<int> opData;

int TAP;
int DELAY;
int *filter_flops;
int *delay_flops;
int *coefs;

SC_CTOR(fir) {
SC_CTHREAD(filter, CLK.pos());
watching(reset.delayed() == true);
TAP = 0;
DELAY = 0;
coefs = new int[TAP];
filter_flops = new int[TAP];
delay_flops = new int[DELAY];
}

void SetCoefs(int NumTaps, int Delay, char *FileName);
void filter();
};


---------------fir.cpp-------------------
#include "C:\SystemC\systemc-2.0.1\src\systemc.h"
#include "fir.h"

void fir::filter() {
int acc;
int DataIn;
int i;
int delay_out;

for(i=0; i<=(TAP-1); i++) filter_flops = 0;
for(i=0; i<=(DELAY-1); i++) delay_flops = 0;
opData.write(0);
wait();

while(1){
DataIn = ipData.read();
acc = ipData*coefs[0];
for(i=(TAP-2); i>=0; i--) {
acc += filter_flops*coefs[i+1];
};
for(i=(TAP-2); i>=0; i--) {
filter_flops[i+1] = filter_flops;
};
filter_flops[0] = DataIn;
acc /=256;

delay_out = (DELAY==0) ? acc : delay_flops[0];

for(i=0; i<DELAY-1; i++) {
delay_flops = delay_flops[i+1];
};

delay_flops[DELAY-1] = acc;
opData.write(delay_out);

// opData.write(acc);
wait();
};
}

void fir::SetCoefs(int NumTaps, int Delay, char *FileName) {
FILE *ifp;
int i;
char line[80];

TAP = NumTaps;
DELAY = Delay;
coefs = new int[TAP];
filter_flops = new int[TAP-1];
delay_flops = new int[DELAY];
ifp = fopen(FileName, "r");

for (i=0; i<TAP; i++)
{
if(fgets(line, 80, ifp) != NULL)
*(coefs+i)= atoi(line);
}
}


------------ParameterizedDelay.h--------------------

SC_MODULE(ParametizedDelay){

sc_in_clk CLK;
sc_in<bool> reset;
sc_in<int> ipData;
sc_out<int> opData;
int DELAY;
int *delay_flops;
int rPoint;

SC_CTOR(ParametizedDelay) {
SC_CTHREAD(DelayIt, CLK.pos());
watching(reset.delayed() == true);
DELAY = 0;
delay_flops = new int[DELAY];
}

void SetDelay(int Delay);
void DelayIt();
};


---------------ParameterizedDelay.cpp--------------------
#include "C:\SystemC\systemc-2.0.1\src\systemc.h"
#include "ParametizedDelay.h"

void ParametizedDelay::DelayIt() {
int DataIn;
int delay_out;

while(1){
DataIn = ipData.read();
delay_out = *(delay_flops+rPoint);
*(delay_flops+rPoint) = DataIn;
opData.write(delay_out);
rPoint++;
rPoint %=DELAY;
// cout << rPoint <<":"<<DataIn<<endl;
wait();
};
}

void ParametizedDelay::SetDelay(int Delay) {
int i;
DELAY = Delay-1;
delay_flops = new int[DELAY];
for (i=0;i<=DELAY-1; i++)delay_flops=0;
rPoint = 0;
}

-----------------display.h---------------------
SC_MODULE(display) {
sc_in<int> lpf;
sc_in<int> Line1;
sc_in<int> Line2;
sc_in<int> Line3;
sc_in<int> Line4;
sc_in<bool> CLK;

FILE *ofp_lpf;
FILE *ofp_line1;
FILE *ofp_line2;
FILE *ofp_line3;
FILE *ofp_line4;

SC_CTOR(display)
{
SC_METHOD(Monitor);
dont_initialize();
sensitive_pos(CLK);
ofp_lpf = fopen("lpf.hex","w");
ofp_line1 = fopen("line1.hex","w");
ofp_line2 = fopen("line2.hex","w");
ofp_line3 = fopen("line3.hex","w");
ofp_line4 = fopen("line4.hex","w");
}

void Monitor();
};



-----------display.cpp---------------------

#include "C:\SystemC\systemc-2.0.1\src\systemc.h"
#include "display.h"

void display::Monitor(){
fprintf(ofp_lpf, "%03x\n", lpf.read());
fprintf(ofp_line1, "%03x\n", Line1.read());
fprintf(ofp_line2, "%03x\n", Line2.read());
fprintf(ofp_line3, "%03x\n", Line3.read());
fprintf(ofp_line4, "%03x\n", Line4.read());
}

------------LPF.Coeff----------
1
9
12
21
18
33
54
33
18
21
12
9
1

Finally, the FourInOne is the one that I am having problem creating,
can someone help? Thanks
 
D

David Hilsee

FourInOne FourInOne("FourInOne"); // This would be the new module
added here. [snip]
FourInOne.SetDelay(500); //Added
FourInOne.CLK(clock.signal()); //Added
FourInOne.reset(reset); //Added
FourInOne.ipBotLine(ADC_Data); //Added
FourInOne.opCurLine(Line1_Out); //Added
FourInOne.opCurLine(Line2_Out); //Added
FourInOne.opCurLine(Line3_Out); //Added
FourInOne.opTopLine(Line4_Out); //Added

It looks like you want FourInOne to be a class, but you did not provide your
code for FourInOne. Why are you trying to create an instance of FourInOne
called FourInOne? Do you really want some static methods? Are you merely
trying to move some logic into another source file?
As you can see, my purpose is to be able to create new levels of logic
as design gets bigger. But the code doesn't work and can not compile.

The compiler's diagnostic message would be helpful.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,777
Messages
2,569,604
Members
45,234
Latest member
SkyeWeems

Latest Threads

Top