OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [src_verilator/] [simulator.h] - Blame information for rev 54

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
 
2
#ifndef SIMULATOR_H
3
        #define  SIMULATOR_H
4
 
5
#if (__cplusplus > 201103L) //"C++11\n";
6
 
7
        void* operator new(std::size_t size, std::align_val_t align) {
8
        #if defined(_WIN32) || defined(__CYGWIN__)
9
                auto ptr = _aligned_malloc(size, static_cast<std::size_t>(align));
10
        #else
11
                auto ptr = aligned_alloc(static_cast<std::size_t>(align), size);
12
        #endif
13
 
14
                if (!ptr)
15
                        throw std::bad_alloc{};
16
        /*
17
                std::cout << "new: " << size << ", align: "
18
                                  << static_cast<std::size_t>(align)
19
                                  << ", ptr: " << ptr << '\n';
20
        */
21
                return ptr;
22
 
23
        }
24
 
25
        void operator delete(void* ptr, std::size_t size, std::align_val_t align) noexcept {
26
        /*
27
                std::cout << "delete: " << size << ", align: "
28
                                  << static_cast<std::size_t>(align)
29
                                  << ", ptr : " << ptr << '\n';
30
        */
31
        #if defined(_WIN32) || defined(__CYGWIN__)
32
                _aligned_free(ptr);
33
        #else
34
                free(ptr);
35
        #endif
36
        }
37
 
38
        void operator delete(void* ptr, std::align_val_t align) noexcept {
39
          /*  std::cout << "delete: align: "
40
                                  << static_cast<std::size_t>(align)
41
                                  << ", ptr : " << ptr << '\n';
42
          */
43
        #if defined(_WIN32) || defined(__CYGWIN__)
44
                _aligned_free(ptr);
45
        #else
46
                free(ptr);
47
        #endif
48
        }
49
 
50
#endif
51
 
52
 
53 54 alirezamon
#define xstr(s) str(s)
54
#define str(s) #s
55
 
56
 
57 48 alirezamon
//traffic type
58
#define SYNTHETIC 0
59
#define TASK      1
60
#define NETRACE   2
61 54 alirezamon
#define SYNFUL    3
62
 
63
//injector type
64
#define PCK_INJECTOR    0
65
#define TRFC_INJECTOR   1
66
 
67 48 alirezamon
#define STND_DEV_EN 1
68
 
69
 
70
int TRAFFIC_TYPE=SYNTHETIC;
71 54 alirezamon
int ENDP_TYPE   =TRFC_INJECTOR;
72 48 alirezamon
 
73
 
74
 
75
int get_router_num (int , int );
76
 
77
 
78
 
79
        #define ideal_port router_top_v__DOT__router__DOT__router_is_ideal
80
        #define active_port router_top_v__DOT__router__DOT__nb_router_active
81
        #define pck_active_port  packet_injector_verilator__DOT__endp_is_active
82
        #define traffic_active_port traffic_gen_top__DOT__endp_is_active
83
 
84
        #define CHAN_SIZE   sizeof(router1[0]->chan_in[0])
85
 
86
        #define conect_r2r(T1,r1,p1,T2,r2,p2)  \
87 54 alirezamon
                memcpy(&router##T1 [r1]->chan_in[p1] , &router##T2 [r2]->chan_out[p2], CHAN_SIZE )
88
 
89 48 alirezamon
//              router_is_active[get_router_num(T1,r1)] |=(( router##T1 [r1]-> ideal_port!=0) |  (router##T2 [r2]-> active_port[p2]==1))
90
 
91
        #define connect_r2gnd(T,r,p)\
92 54 alirezamon
                memset(&router##T [r]->chan_in [p],0x00,CHAN_SIZE);
93 48 alirezamon
 
94 54 alirezamon
 
95 48 alirezamon
        #define connect_r2e(T,r,p,e) \
96 54 alirezamon
                void * addr1, * addr2;\
97
                addr1=(ENDP_TYPE == PCK_INJECTOR)? &pck_inj[e]->chan_out  : &traffic[e]->chan_out;\
98
                addr2=(ENDP_TYPE == PCK_INJECTOR)? &pck_inj[e]->chan_in  : &traffic[e]->chan_in;\
99 48 alirezamon
                memcpy(&router##T [r]->chan_in[p], addr1, CHAN_SIZE );\
100 54 alirezamon
                memcpy(addr2, &router##T [r]->chan_out[p], CHAN_SIZE )
101
 
102
 
103
 
104
 
105
 
106
//              router_is_active[get_router_num(T,r)] |= (ENDP_TYPE == PCK_INJECTOR)? \
107 48 alirezamon
                        (( router##T [r]-> ideal_port!=0) |  (pck_inj[e]->pck_active_port==1)):\
108
                        (( router##T [r]-> ideal_port!=0) |  (traffic[e]->traffic_active_port==1))
109
 
110
 
111
 
112
 
113 54 alirezamon
#define IS_SELF_LOOP_EN   (strcmp(SELF_LOOP_EN ,"YES")==0)
114
#define IS_UNICAST        (strcmp(CAST_TYPE,"UNICAST")==0)
115
#define IS_MCAST_FULL     (strcmp(CAST_TYPE,"MULTICAST_FULL")==0)
116
#define IS_MCAST_PARTIAL  (strcmp(CAST_TYPE,"MULTICAST_PARTIAL")==0)
117
#define IS_BCAST_FULL     (strcmp(CAST_TYPE,"BROADCAST_FULL")==0)
118
#define IS_BCAST_PARTIAL  (strcmp(CAST_TYPE,"BROADCAST_PARTIAL")==0)
119 48 alirezamon
 
120
#include "parameter.h"
121
//alignas(64) int router_is_active [NR]={1};
122
 
123 54 alirezamon
 
124 48 alirezamon
int reset,clk;
125
 
126
Vtraffic                *traffic[NE]; // for synthetic and trace traffic pattern
127
Vpck_inj        *pck_inj[NE]; // for netrace
128
 
129 54 alirezamon
 
130
 
131
 
132
 
133 48 alirezamon
unsigned int total_rsv_pck_num=0;
134
unsigned int total_sent_pck_num=0;
135
unsigned int end_sim_pck_num=0;
136
unsigned int sim_end_clk_num;
137
unsigned long int nt_tr_list_pck=0;
138
int netrace_speed_up =1;
139
 
140
unsigned int * rsv_size_array;
141
int AVG_PACKET_SIZE=5;
142
int MIN_PACKET_SIZE=5;
143
int MAX_PACKET_SIZE=5;
144
 
145 54 alirezamon
 
146 48 alirezamon
unsigned int random_var[NE] = {100};
147
 
148
 
149
typedef struct  statistic_struct {
150
        unsigned int pck_num;
151
        unsigned int flit_num;
152
        unsigned int worst_latency;
153
        unsigned int min_latency;
154
        double sum_clk_h2h;
155
        double sum_clk_h2t;
156
        double sum_clk_per_hop;
157
#if (STND_DEV_EN)
158
        double sum_clk_pow2;
159
#endif
160
 
161
} statistic_t;
162
 
163
 
164
typedef struct  avg_st_struct {
165
        double avg_latency_per_hop;
166
        double avg_latency_flit;
167
        double avg_latency_pck;
168
        double avg_throughput;
169
        double avg_pck_siz;
170
#if (STND_DEV_EN)
171
        double std_dev;
172
#endif
173
 
174
} avg_st_t;
175
 
176 54 alirezamon
/*
177
 typedef struct packed {
178
        bit flit_wr_i;
179
        bit pck_wr_i;
180
        bit flit_wr_o;
181
        bit pck_wr_o;
182
        bit flit_in_bypassed;
183
        logic [BYPASSw-1 : 0] bypassed_num;
184
    } router_event_t;
185
 
186
    localparam BYPASSw = log2(SMART_NUM);
187
*/
188
 
189
 
190
 
191
#define BYPASS_LSB          5
192
#define FLIT_IN_WR_FLG          (1<<4)
193
#define PCK_IN_WR_FLG           (1<<3)
194
#define FLIT_OUT_WR_FLG         (1<<2)
195
#define PCK_OUT_WR_FLG          (1<<1)
196
#define FLIT_IN_BYPASSED        (1<<0)
197
 
198
 
199
 
200
 
201
typedef  struct  router_st_struct {
202
        unsigned int pck_num_in;
203
        unsigned int flit_num_in;
204
        unsigned int pck_num_out;
205
        unsigned int flit_num_out;
206
        unsigned int flit_num_in_bypassed;
207
        unsigned int flit_num_in_buffered;
208
        unsigned int bypass_counter [SMART_NUM+1 ] ;
209
} router_st_t;
210
 
211
alignas(64) router_st_t router_stat [NR][MAX_P];
212
router_st_t router_stat_accum [NR];
213
 
214
 
215 48 alirezamon
#if (C>1)
216
        statistic_t sent_stat [NE][C];
217
        statistic_t rsvd_stat [NE][C];
218
#else
219
        statistic_t sent_stat [NE];
220
        statistic_t rsvd_stat [NE];
221
#endif
222
 
223 54 alirezamon
        statistic_t endp_to_endp [NE][NE];
224 48 alirezamon
 
225 54 alirezamon
typedef struct mcast_struct {
226
        int ratio;
227
        int min;
228
        int max;
229
}mcast_t;
230 48 alirezamon
 
231 54 alirezamon
 
232
void update_statistic_at_ejection (     int     ,       unsigned int, unsigned int, unsigned int,  unsigned int, unsigned int ,unsigned int);
233 48 alirezamon
void update_noc_statistic (     int);
234
unsigned char pck_class_in_gen(unsigned int);
235 54 alirezamon
unsigned int pck_dst_gen_task_graph ( unsigned int, unsigned char *);
236 48 alirezamon
void print_statistic (void);
237
void print_parameter();
238
void reset_all_register();
239
void sim_eval_all (void);
240
void sim_final_all (void);
241
void traffic_clk_negedge_event(void);
242
void traffic_clk_posedge_event(void);
243
void connect_clk_reset_start_all(void);
244
unsigned int rnd_between (unsigned int, unsigned int );
245
void traffic_gen_init( void );
246 54 alirezamon
void  pck_inj_init(int);
247 48 alirezamon
void traffic_gen_final_report(void);
248
void processArgs (int, char ** );
249
void task_traffic_init (char * );
250
int parse_string ( char *, int *);
251
void update_pck_size(char *);
252
void update_custom_traffic (char *);
253
void update_hotspot(char * );
254 54 alirezamon
void update_mcast_traffic(char * str);
255 48 alirezamon
void initial_threads (void);
256
void print_statistic_new (unsigned long int);
257 54 alirezamon
void allocate_rsv_pck_counters (void);
258
void update_all_router_stat(void);
259
void print_router_st(void);
260
void print_endp_to_endp_st(const char *);
261
void update_traffic_injector_st (unsigned int );
262 48 alirezamon
 
263
#include "topology_top.h"
264
#include "traffic_task_graph.h"
265
#include "traffic_synthetic.h"
266
#include "netrace_lib.h"
267 54 alirezamon
#include "synful_wrapper.h"
268 48 alirezamon
 
269
#define RATIO_INIT              2
270
#define DISABLE -1
271
#define MY_VL_SETBIT_W(data,bit) (data[VL_BITWORD_I(bit)] |= (VL_UL(1) << VL_BITBIT_I(bit)))
272
 
273
#define RANDOM_RANGE 1
274
#define RANDOM_discrete 2
275
 
276
 
277
 
278
 
279
 
280
 
281
 
282
int HOTSPOT_NUM;
283
int  * class_percentage;
284
char * TRAFFIC;
285
char * netrace_file;
286 54 alirezamon
char * synful_file;
287 48 alirezamon
unsigned char FIXED_SRC_DST_PAIR;
288
unsigned char  NEw=0;
289
unsigned long int main_time = 0;     // Current simulation time
290
unsigned int saved_time = 0;
291
 
292
unsigned int sum_clk_h2h=0;
293
unsigned int sum_clk_h2t=0;
294
double           sum_clk_per_hop=0;
295
const int  CC=(C==0)? 1 : C;
296
unsigned int total_rsv_pck_num_per_class[CC]={0};
297
unsigned int sum_clk_h2h_per_class[CC]={0};
298
unsigned int sum_clk_h2t_per_class[CC]={0};
299
double           sum_clk_per_hop_per_class[CC]={0};
300
 
301
unsigned int clk_counter,ideal_rsv_cnt;
302
unsigned int count_en;
303
unsigned int total_active_endp;
304
char all_done=0;
305
unsigned int total_sent_flit_number =0;
306
unsigned int total_rsv_flit_number =0;
307 54 alirezamon
unsigned int total_expect_rsv_flit_num =0;
308 48 alirezamon
unsigned int total_rsv_flit_number_old=0;
309
int ratio=RATIO_INIT;
310
double first_avg_latency_flit,current_avg_latency_flit;
311
double sc_time_stamp ();
312
int pow2( int );
313
char inject_done=0;
314
char simulation_done=0;
315
char pck_size_sel=RANDOM_RANGE;
316
int  * discrete_size;
317
int  * discrete_prob;
318
int verbosity=1;
319
int thread_num =1;
320
 
321
 
322 54 alirezamon
mcast_t mcast;
323 48 alirezamon
 
324
 
325
 
326
#if (STND_DEV_EN)
327
        //#include <math.h>
328
        double sqroot (double s){
329
                int i;
330
                double root = s/3;
331
                if (s<=0) return 0;
332
                for(i=0;i<32;i++) root = (root +s/root)/2;
333
                return root;
334
        }
335
 
336
        double       sum_clk_pow2=0;
337
        double       sum_clk_pow2_per_class[C];
338
        double standard_dev( double , unsigned int, double);
339
#endif
340
 
341
 
342 54 alirezamon
        // set data[bit] to 1
343
                #define VL_BIT_SET_I(data, bit) data |= (VL_UL(1) << VL_BITBIT_I(bit))
344
                #define VL_BIT_SET_Q(data, bit) data |= (1ULL << VL_BITBIT_Q(bit))
345
                #define VL_BIT_SET_E(data, bit) data |= (VL_EUL(1) << VL_BITBIT_E(bit))
346
                #define VL_BIT_SET_W(data, bit) (data)[VL_BITWORD_E(bit)] |= (VL_EUL(1) << VL_BITBIT_E(bit))
347 48 alirezamon
 
348 54 alirezamon
                // set data[bit] to 0
349
                #define VL_BIT_CLR_I(data, bit) data &= ~(VL_UL(1) << VL_BITBIT_I(bit))
350
                #define VL_BIT_CLR_Q(data, bit) data &= ~(1ULL << VL_BITBIT_Q(bit))
351
                #define VL_BIT_CLR_E(data, bit) data &= ~ (VL_EUL(1) << VL_BITBIT_E(bit))
352
                #define VL_BIT_CLR_W(data, bit) (data)[VL_BITWORD_E(bit)] &= ~ (VL_EUL(1) << VL_BITBIT_E(bit))
353 48 alirezamon
 
354 54 alirezamon
 
355
                #if   (DAw<=VL_IDATASIZE)
356
                        #define DEST_ADDR_BIT_SET(data, bit)  VL_BIT_SET_I(data, bit)
357
                        #define DEST_ADDR_BIT_CLR(data, bit)  VL_BIT_CLR_I(data, bit)
358
                        #define DEST_ADDR_ASSIGN_RAND(data)   data = rand() & ((1<<DAw) -1)
359
                        #define DEST_ADDR_ASSIGN_ZERO(data)   data = 0
360
                        #define DEST_ADDR_ASSIGN_INT(data,val) data = val & ((1<<DAw) -1)
361
                        #define DEST_ADDR_IS_ZERO(a,data) a= (data ==0)
362
                #elif (DAw<=VL_QUADSIZE)
363
                        #define DEST_ADDR_BIT_SET(data, bit)  VL_BIT_SET_Q(data, bit)
364
                        #define DEST_ADDR_BIT_CLR(data, bit)  VL_BIT_CLR_Q(data, bit)
365
                        #define DEST_ADDR_ASSIGN_RAND(data)   data = (rand()&0xFFFFFFFF) | \
366
                        (QData) (rand() & ((1ULL<<(DAw-32)) -1))        <<32
367
                        #define DEST_ADDR_ASSIGN_ZERO(data)   data = 0ULL
368
                        #define DEST_ADDR_ASSIGN_INT(data,val) data = val & ((1ULL<<32) -1)
369
                        #define DEST_ADDR_IS_ZERO(a,data) a= (data == 0ULL)
370
                #else
371
                        #define DEST_ADDR_BIT_SET(data, bit)  VL_BIT_SET_W(data, bit)
372
                        #define DEST_ADDR_BIT_CLR(data, bit)  VL_BIT_CLR_W(data, bit)
373
                        #define DEST_ADDR_ASSIGN_RAND(data) \
374
                        for(int n=0;n<=VL_BITWORD_E(DAw-1)-1;n++)  (data)[n]=rand();\
375
                        (data)[VL_BITWORD_E(DAw-1)]=rand() & ((1ULL<<(VL_BITBIT_E(DAw-1)+1)) -1)
376
                        #define DEST_ADDR_ASSIGN_ZERO(data) \
377
                        for(int n=0;n<=VL_BITWORD_E(DAw-1);n++)  (data)[n]= 0
378
                        #define DEST_ADDR_ASSIGN_INT(data,val) (data)[0] = val
379
 
380
                        #define DEST_ADDR_IS_ZERO(a,data) \
381
                        a=1; for(int n=0;n<=VL_BITWORD_E(DAw-1)-1;n++)   \
382
                        if (a==1) a= ((data)[n]==0);\
383
                        if (a==1) a= ((data)[VL_BITWORD_E(DAw-1)] & ((1ULL<<(VL_BITBIT_E(DAw-1)+1)) -1))==0
384
                #endif
385
 
386
 
387 48 alirezamon
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.