Skip to content

Commit 47f471f

Browse files
fa-jimenezErickOF
authored andcommitted
Change how the input data is handled in the packet generator to accept more data in form of a pointer
1 parent 6462ca3 commit 47f471f

File tree

5 files changed

+120
-62
lines changed

5 files changed

+120
-62
lines changed

modules/ethernetAMS/include/ethernetEncoder.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,14 @@ SCA_TDF_MODULE(ethernetEncoder)
2424

2525
std::map<std::string, std::string> encoding_map;
2626

27+
sca_core::sca_time sample_time;
28+
2729
void set_attributes();
2830
void initialize();
2931
void processing();
3032

31-
SCA_CTOR(ethernetEncoder)
32-
: data_in("data_in"), mlt3_out("mlt3_out"), valid("valid")
33+
ethernetEncoder(sc_core::sc_module_name name, sca_core::sca_time sample_time)
34+
: sca_tdf::sca_module(name), data_in("data_in"), mlt3_out("mlt3_out"), valid("valid"), sample_time(sample_time)
3335
{
3436
}
3537
};

modules/ethernetAMS/include/packetGenerator.h

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,11 @@
1+
#ifndef PACKET_GENERATOR_H
2+
#define PACKET_GENERATOR_H
3+
14
#include <systemc-ams.h>
25

36
SCA_TDF_MODULE(packetGenerator)
47
{
5-
SCA_CTOR(packetGenerator) : bitCount(0)
6-
{
7-
// Set the time-step
8-
set_timestep(sc_core::sc_time(10, sc_core::SC_NS));
9-
tmp_data_out_valid = false;
10-
n1_data_out_valid = false;
11-
n2_data_out_valid = false;
12-
n2_sigBitCount = 0;
13-
14-
preamble_in_process = false;
15-
data_length_in_process = false;
16-
}
17-
8+
public:
189
#define N 16
1910

2011
// Main results from block
@@ -42,6 +33,8 @@ SCA_TDF_MODULE(packetGenerator)
4233
sca_tdf::sca_out<sc_dt::sc_int<4>> n2_sigBitCount_;
4334
sca_tdf::sca_out<sc_dt::sc_int<4>> sigBitCount;
4435

36+
sca_tdf::sca_out<sc_dt::sc_int<32>> remaining_bytes_to_send;
37+
4538
// Internal values to do the logic
4639
bool tmp_data_out_valid;
4740

@@ -56,7 +49,6 @@ SCA_TDF_MODULE(packetGenerator)
5649
sc_dt::sc_int<4> n2_sigBitCount;
5750

5851
bool preamble_in_process;
59-
bool data_length_in_process;
6052

6153
// Data to be sent, set in fill_data()
6254
sc_dt::sc_bv<N * 4> data_in;
@@ -66,9 +58,34 @@ SCA_TDF_MODULE(packetGenerator)
6658
sc_dt::sc_bv<N> data_valid_to_send;
6759

6860
int bitCount;
61+
int actual_data_length;
62+
int bytes_sent;
6963

70-
void fill_data(unsigned char* data, int data_length);
64+
unsigned char preamble_data[8] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBA};
65+
unsigned char* local_data;
7166

72-
void processing();
67+
sca_core::sca_time sample_time;
7368

69+
// Constructor with sample time argument
70+
packetGenerator(sc_core::sc_module_name name, sca_core::sca_time sample_time)
71+
: sca_tdf::sca_module(name)
72+
{
73+
bitCount = 0;
74+
this->sample_time = sample_time;
75+
76+
tmp_data_out_valid = false;
77+
n1_data_out_valid = false;
78+
n2_data_out_valid = false;
79+
n2_sigBitCount = 0;
80+
81+
preamble_in_process = false;
82+
}
83+
84+
void fill_data(unsigned char* data, int packet_length);
85+
void create_pack_of_data(unsigned char* data, int packet_length);
86+
87+
void processing();
88+
void set_attributes();
7489
};
90+
91+
#endif // PACKET_GENERATOR_H

modules/ethernetAMS/src/ethernetEncoder.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
#ifndef ETHERNET_ENCODER_CPP
2+
#define ETHERNET_ENCODER_CPP
3+
14
#include "ethernetEncoder.h"
25

36
void ethernetEncoder::set_attributes()
47
{
58
// Set a timestep for the TDF module
6-
set_timestep(sca_core::sca_time(10, SC_NS)); // Example timestep
9+
set_timestep(sample_time);
710
}
811

912
void ethernetEncoder::initialize()
@@ -71,3 +74,5 @@ void ethernetEncoder::processing()
7174

7275
sampleCount++;
7376
}
77+
78+
#endif // ETHERNET_ENCODER_CPP

modules/ethernetAMS/src/packetGenerator.cpp

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,31 @@
1+
#ifndef PACKET_GENERATOR_CPP
2+
#define PACKET_GENERATOR_CPP
3+
14
#include <systemc-ams.h>
25
#include <systemc.h>
36
#include "packetGenerator.h"
47

8+
void packetGenerator::set_attributes()
9+
{
10+
// Set a timestep for the TDF module
11+
set_timestep(sample_time);
12+
}
13+
514
void packetGenerator::fill_data(unsigned char* data, int packet_length)
15+
{
16+
local_data = new unsigned char[packet_length];
17+
memcpy(local_data, data, packet_length * sizeof(char));
18+
19+
actual_data_length = packet_length;
20+
bytes_sent = 0;
21+
22+
// Insert first the preamble
23+
create_pack_of_data(preamble_data, 8);
24+
25+
preamble_in_process = true;
26+
}
27+
28+
void packetGenerator::create_pack_of_data(unsigned char* data, int packet_length)
629
{
730
int actual_length = (packet_length * 2 > N) ? N : packet_length * 2;
831
unsigned char tmp_data;
@@ -20,22 +43,11 @@ void packetGenerator::fill_data(unsigned char* data, int packet_length)
2043
tmp_data_valid[i] = 1;
2144
}
2245

23-
data_in = tmp_data_in;
24-
data_in_valid = tmp_data_valid;
25-
26-
// Insert first the preamble
27-
for (int i = 0; i < 15; i++)
28-
{
29-
std::cout << "@" << sc_time_stamp() << " Inside fill_data(): i " << i << std::endl;
30-
data_to_send.range(i * 4 + 3, i * 4) = "1010";
31-
}
32-
data_to_send.range(63, 60) = "1011";
33-
data_valid_to_send = "1111111111111111";
46+
data_to_send = tmp_data_in;
47+
data_valid_to_send = tmp_data_valid;
3448

3549
n2_data_valid = data_valid_to_send;
3650
n1_data_valid = n2_data_valid;
37-
38-
preamble_in_process = true;
3951
}
4052

4153
void packetGenerator::processing()
@@ -47,41 +59,35 @@ void packetGenerator::processing()
4759

4860
if ((tmp_data_valid_to_send.or_reduce() == 0) && (preamble_in_process == true))
4961
{
50-
unsigned char length = 0;
51-
sc_dt::sc_bv<8> local_length = 0;
62+
sc_dt::sc_bv<32> local_length = 0;
5263

5364
preamble_in_process = false;
54-
data_length_in_process = true;
5565

56-
for (int i = 0; i < N; i++)
57-
{
58-
if (data_in_valid[i] == 1)
59-
{
60-
length++;
61-
}
62-
}
63-
local_length = length / 2;
66+
local_length = (unsigned int)actual_data_length;
6467

6568
data_to_send = 0;
66-
data_to_send.range(7, 0) = local_length;
67-
data_valid_to_send = "11";
69+
data_to_send.range(31, 0) = local_length;
70+
data_valid_to_send = "11111111";
6871
tmp_data_to_send = data_to_send;
6972
tmp_data_valid_to_send = data_valid_to_send;
7073

7174
n2_data_valid = data_valid_to_send;
7275
n1_data_valid = n2_data_valid;
7376
}
74-
else if ((tmp_data_valid_to_send.or_reduce() == 0) && (data_length_in_process == true))
77+
else if ((tmp_data_valid_to_send.or_reduce() == 0) && (actual_data_length > 0))
7578
{
76-
data_length_in_process = false;
77-
78-
data_to_send = data_in;
79-
data_valid_to_send = data_in_valid;
80-
tmp_data_to_send = data_to_send;
81-
tmp_data_valid_to_send = data_valid_to_send;
82-
83-
n2_data_valid = data_valid_to_send;
84-
n1_data_valid = n2_data_valid;
79+
if (actual_data_length > 8)
80+
{
81+
create_pack_of_data((local_data + bytes_sent), 8);
82+
actual_data_length -= 8;
83+
bytes_sent += 8;
84+
}
85+
else
86+
{
87+
create_pack_of_data((local_data + bytes_sent), actual_data_length);
88+
actual_data_length = 0;
89+
delete[] local_data;
90+
}
8591
}
8692

8793
n1_data_out = n2_data_out;
@@ -174,4 +180,8 @@ void packetGenerator::processing()
174180

175181
data_to_send_.write(data_to_send);
176182
data_valid_to_send_.write(data_valid_to_send);
183+
184+
remaining_bytes_to_send.write(actual_data_length);
177185
}
186+
187+
#endif // PACKET_GENERATOR_CPP

modules/ethernetAMS/src/tb_ethernet_encoder.cpp

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
#ifndef TB_ETHERNET_ENCODER_CPP
2+
#define TB_ETHERNET_ENCODER_CPP
3+
14
#include <systemc-ams.h>
25
#include <systemc.h>
36
#include "ethernetEncoder.h"
47
#include "packetGenerator.h"
58

6-
int sc_main(int argc, char* argv[])
9+
int sc_main()
710
{
811
sca_tdf::sca_signal<bool> valid;
912
sca_tdf::sca_signal<double> mlt3_out_signal;
@@ -30,11 +33,14 @@ int sc_main(int argc, char* argv[])
3033
sca_tdf::sca_signal<sc_dt::sc_int<4>> n2_sigBitCount;
3134
sca_tdf::sca_signal<sc_dt::sc_int<4>> sigBitCount;
3235

36+
sca_tdf::sca_signal<sc_dt::sc_int<32>> remaining_bytes_to_send;
37+
38+
sca_core::sca_time sample_time(10, SC_NS);
3339

34-
unsigned char data[8];
40+
unsigned char data[16];
3541

36-
ethernetEncoder encoder("encoder");
37-
packetGenerator pkt_gen("pkt_gen");
42+
ethernetEncoder encoder("encoder", sample_time);
43+
packetGenerator pkt_gen("pkt_gen", sample_time);
3844

3945
encoder.data_in(data_out);
4046
encoder.mlt3_out(mlt3_out_signal);
@@ -63,6 +69,8 @@ int sc_main(int argc, char* argv[])
6369
pkt_gen.n2_sigBitCount_(n2_sigBitCount);
6470
pkt_gen.sigBitCount(sigBitCount);
6571

72+
pkt_gen.remaining_bytes_to_send(remaining_bytes_to_send);
73+
6674
// Trace file setup
6775
sca_util::sca_trace_file *traceFile = sca_util::sca_create_vcd_trace_file("ethernetEncoder");
6876

@@ -85,15 +93,29 @@ int sc_main(int argc, char* argv[])
8593
sca_util::sca_trace(traceFile, tmp_data_out_valid, "pkt_gen_tmp_data_out_valid");
8694
sca_util::sca_trace(traceFile, data_to_send, "pkt_gen_data_to_send");
8795
sca_util::sca_trace(traceFile, data_valid_to_send, "pkt_gen_data_valid_to_send");
96+
sca_util::sca_trace(traceFile, remaining_bytes_to_send, "pkt_gen_remaining_bytes_to_send");
8897
}
8998

9099
sc_start(45, SC_NS);
91100
data[0] = 113;
92101
data[1] = 255;
93102
data[2] = 204;
94-
pkt_gen.fill_data(data, 3);
95-
96-
sc_start(1455, SC_NS); // Run the simulation for 500 ns
103+
data[3] = 85;
104+
data[4] = 173;
105+
data[5] = 37;
106+
data[6] = 142;
107+
data[7] = 69;
108+
data[8] = 91;
109+
data[9] = 178;
110+
data[10] = 220;
111+
data[11] = 33;
112+
data[12] = 77;
113+
data[13] = 111;
114+
data[14] = 146;
115+
data[15] = 194;
116+
pkt_gen.fill_data(data, 13);
117+
118+
sc_start(3455, SC_NS); // Run the simulation for 500 ns
97119

98120
if (traceFile)
99121
{
@@ -102,3 +124,5 @@ int sc_main(int argc, char* argv[])
102124

103125
return 0;
104126
}
127+
128+
#endif // TB_ETHERNET_ENCODER_CPP

0 commit comments

Comments
 (0)