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 56

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 56 alirezamon
unsigned char reset_active_high=1;
132 54 alirezamon
 
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 56 alirezamon
#define BYPASS_LSB          6
192
#define FLIT_IN_WR_FLG          (1<<5)
193
#define PCK_IN_WR_FLG           (1<<4)
194
#define FLIT_OUT_WR_FLG         (1<<3)
195
#define PCK_OUT_WR_FLG          (1<<2)
196
#define FLIT_IN_BYPASSED        (1<<1)
197
#define ACTIVE_HIGH_RST     (1<<0)
198 54 alirezamon
 
199
 
200
 
201
 
202
typedef  struct  router_st_struct {
203
        unsigned int pck_num_in;
204
        unsigned int flit_num_in;
205
        unsigned int pck_num_out;
206
        unsigned int flit_num_out;
207
        unsigned int flit_num_in_bypassed;
208
        unsigned int flit_num_in_buffered;
209
        unsigned int bypass_counter [SMART_NUM+1 ] ;
210
} router_st_t;
211
 
212
alignas(64) router_st_t router_stat [NR][MAX_P];
213
router_st_t router_stat_accum [NR];
214
 
215
 
216 48 alirezamon
#if (C>1)
217
        statistic_t sent_stat [NE][C];
218
        statistic_t rsvd_stat [NE][C];
219
#else
220
        statistic_t sent_stat [NE];
221
        statistic_t rsvd_stat [NE];
222
#endif
223
 
224 54 alirezamon
        statistic_t endp_to_endp [NE][NE];
225 48 alirezamon
 
226 54 alirezamon
typedef struct mcast_struct {
227
        int ratio;
228
        int min;
229
        int max;
230
}mcast_t;
231 48 alirezamon
 
232 54 alirezamon
 
233
void update_statistic_at_ejection (     int     ,       unsigned int, unsigned int, unsigned int,  unsigned int, unsigned int ,unsigned int);
234 48 alirezamon
void update_noc_statistic (     int);
235
unsigned char pck_class_in_gen(unsigned int);
236 54 alirezamon
unsigned int pck_dst_gen_task_graph ( unsigned int, unsigned char *);
237 48 alirezamon
void print_statistic (void);
238
void print_parameter();
239
void reset_all_register();
240
void sim_eval_all (void);
241
void sim_final_all (void);
242
void traffic_clk_negedge_event(void);
243
void traffic_clk_posedge_event(void);
244
void connect_clk_reset_start_all(void);
245
unsigned int rnd_between (unsigned int, unsigned int );
246
void traffic_gen_init( void );
247 54 alirezamon
void  pck_inj_init(int);
248 48 alirezamon
void traffic_gen_final_report(void);
249
void processArgs (int, char ** );
250
void task_traffic_init (char * );
251
int parse_string ( char *, int *);
252
void update_pck_size(char *);
253
void update_custom_traffic (char *);
254
void update_hotspot(char * );
255 54 alirezamon
void update_mcast_traffic(char * str);
256 48 alirezamon
void initial_threads (void);
257
void print_statistic_new (unsigned long int);
258 54 alirezamon
void allocate_rsv_pck_counters (void);
259
void update_all_router_stat(void);
260
void print_router_st(void);
261
void print_endp_to_endp_st(const char *);
262
void update_traffic_injector_st (unsigned int );
263 48 alirezamon
 
264
#include "topology_top.h"
265
#include "traffic_task_graph.h"
266
#include "traffic_synthetic.h"
267
#include "netrace_lib.h"
268 54 alirezamon
#include "synful_wrapper.h"
269 48 alirezamon
 
270
#define RATIO_INIT              2
271
#define DISABLE -1
272
#define MY_VL_SETBIT_W(data,bit) (data[VL_BITWORD_I(bit)] |= (VL_UL(1) << VL_BITBIT_I(bit)))
273
 
274
#define RANDOM_RANGE 1
275
#define RANDOM_discrete 2
276
 
277
 
278
 
279
 
280
 
281
 
282
 
283
int HOTSPOT_NUM;
284
int  * class_percentage;
285
char * TRAFFIC;
286
char * netrace_file;
287 54 alirezamon
char * synful_file;
288 48 alirezamon
unsigned char FIXED_SRC_DST_PAIR;
289
unsigned char  NEw=0;
290
unsigned long int main_time = 0;     // Current simulation time
291
unsigned int saved_time = 0;
292
 
293
unsigned int sum_clk_h2h=0;
294
unsigned int sum_clk_h2t=0;
295
double           sum_clk_per_hop=0;
296
const int  CC=(C==0)? 1 : C;
297
unsigned int total_rsv_pck_num_per_class[CC]={0};
298
unsigned int sum_clk_h2h_per_class[CC]={0};
299
unsigned int sum_clk_h2t_per_class[CC]={0};
300
double           sum_clk_per_hop_per_class[CC]={0};
301
 
302
unsigned int clk_counter,ideal_rsv_cnt;
303
unsigned int count_en;
304
unsigned int total_active_endp;
305
char all_done=0;
306
unsigned int total_sent_flit_number =0;
307
unsigned int total_rsv_flit_number =0;
308 54 alirezamon
unsigned int total_expect_rsv_flit_num =0;
309 48 alirezamon
unsigned int total_rsv_flit_number_old=0;
310
int ratio=RATIO_INIT;
311
double first_avg_latency_flit,current_avg_latency_flit;
312
double sc_time_stamp ();
313
int pow2( int );
314
char inject_done=0;
315
char simulation_done=0;
316
char pck_size_sel=RANDOM_RANGE;
317
int  * discrete_size;
318
int  * discrete_prob;
319
int verbosity=1;
320
int thread_num =1;
321
 
322
 
323 54 alirezamon
mcast_t mcast;
324 48 alirezamon
 
325
 
326
 
327
#if (STND_DEV_EN)
328
        //#include <math.h>
329
        double sqroot (double s){
330
                int i;
331
                double root = s/3;
332
                if (s<=0) return 0;
333
                for(i=0;i<32;i++) root = (root +s/root)/2;
334
                return root;
335
        }
336
 
337
        double       sum_clk_pow2=0;
338
        double       sum_clk_pow2_per_class[C];
339
        double standard_dev( double , unsigned int, double);
340
#endif
341
 
342
 
343 54 alirezamon
        // set data[bit] to 1
344
                #define VL_BIT_SET_I(data, bit) data |= (VL_UL(1) << VL_BITBIT_I(bit))
345
                #define VL_BIT_SET_Q(data, bit) data |= (1ULL << VL_BITBIT_Q(bit))
346
                #define VL_BIT_SET_E(data, bit) data |= (VL_EUL(1) << VL_BITBIT_E(bit))
347
                #define VL_BIT_SET_W(data, bit) (data)[VL_BITWORD_E(bit)] |= (VL_EUL(1) << VL_BITBIT_E(bit))
348 48 alirezamon
 
349 54 alirezamon
                // set data[bit] to 0
350
                #define VL_BIT_CLR_I(data, bit) data &= ~(VL_UL(1) << VL_BITBIT_I(bit))
351
                #define VL_BIT_CLR_Q(data, bit) data &= ~(1ULL << VL_BITBIT_Q(bit))
352
                #define VL_BIT_CLR_E(data, bit) data &= ~ (VL_EUL(1) << VL_BITBIT_E(bit))
353
                #define VL_BIT_CLR_W(data, bit) (data)[VL_BITWORD_E(bit)] &= ~ (VL_EUL(1) << VL_BITBIT_E(bit))
354 48 alirezamon
 
355 54 alirezamon
 
356
                #if   (DAw<=VL_IDATASIZE)
357
                        #define DEST_ADDR_BIT_SET(data, bit)  VL_BIT_SET_I(data, bit)
358
                        #define DEST_ADDR_BIT_CLR(data, bit)  VL_BIT_CLR_I(data, bit)
359
                        #define DEST_ADDR_ASSIGN_RAND(data)   data = rand() & ((1<<DAw) -1)
360
                        #define DEST_ADDR_ASSIGN_ZERO(data)   data = 0
361
                        #define DEST_ADDR_ASSIGN_INT(data,val) data = val & ((1<<DAw) -1)
362
                        #define DEST_ADDR_IS_ZERO(a,data) a= (data ==0)
363
                #elif (DAw<=VL_QUADSIZE)
364
                        #define DEST_ADDR_BIT_SET(data, bit)  VL_BIT_SET_Q(data, bit)
365
                        #define DEST_ADDR_BIT_CLR(data, bit)  VL_BIT_CLR_Q(data, bit)
366
                        #define DEST_ADDR_ASSIGN_RAND(data)   data = (rand()&0xFFFFFFFF) | \
367
                        (QData) (rand() & ((1ULL<<(DAw-32)) -1))        <<32
368
                        #define DEST_ADDR_ASSIGN_ZERO(data)   data = 0ULL
369
                        #define DEST_ADDR_ASSIGN_INT(data,val) data = val & ((1ULL<<32) -1)
370
                        #define DEST_ADDR_IS_ZERO(a,data) a= (data == 0ULL)
371
                #else
372
                        #define DEST_ADDR_BIT_SET(data, bit)  VL_BIT_SET_W(data, bit)
373
                        #define DEST_ADDR_BIT_CLR(data, bit)  VL_BIT_CLR_W(data, bit)
374
                        #define DEST_ADDR_ASSIGN_RAND(data) \
375
                        for(int n=0;n<=VL_BITWORD_E(DAw-1)-1;n++)  (data)[n]=rand();\
376
                        (data)[VL_BITWORD_E(DAw-1)]=rand() & ((1ULL<<(VL_BITBIT_E(DAw-1)+1)) -1)
377
                        #define DEST_ADDR_ASSIGN_ZERO(data) \
378
                        for(int n=0;n<=VL_BITWORD_E(DAw-1);n++)  (data)[n]= 0
379
                        #define DEST_ADDR_ASSIGN_INT(data,val) (data)[0] = val
380
 
381
                        #define DEST_ADDR_IS_ZERO(a,data) \
382
                        a=1; for(int n=0;n<=VL_BITWORD_E(DAw-1)-1;n++)   \
383
                        if (a==1) a= ((data)[n]==0);\
384
                        if (a==1) a= ((data)[VL_BITWORD_E(DAw-1)] & ((1ULL<<(VL_BITBIT_E(DAw-1)+1)) -1))==0
385
                #endif
386
 
387
 
388 48 alirezamon
#endif

powered by: WebSVN 2.1.0

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