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/] [traffic_synthetic.h] - Blame information for rev 48

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

Line No. Rev Author Line
1 43 alirezamon
#ifndef TRAFFIC_SYNTHETIC_H
2
#define TRAFFIC_SYNTHETIC_H
3
 
4
 
5 48 alirezamon
#define INJECT_OFF -1
6 43 alirezamon
 
7 48 alirezamon
//#include "topology.h"
8 43 alirezamon
 
9 48 alirezamon
 
10 43 alirezamon
extern int TRAFFIC_TYPE;
11
extern int HOTSPOT_NUM;
12
extern char * TRAFFIC;
13
extern unsigned char  NEw;
14
 
15 48 alirezamon
int custom_traffic_table[NE];
16 43 alirezamon
 
17
typedef struct HOTSPOT_NODE {
18
        int  ip_num;
19
        char send_enable;
20
        int  percentage; // x10 
21
} hotspot_st;
22
 
23
hotspot_st * hotspots;
24
 
25 48 alirezamon
unsigned int pck_dst_gen_1D (unsigned int);
26 43 alirezamon
 
27
// number, b:bit location  W: number width log2(num)
28
int getBit(int num, int b, int W)
29
{
30
        while(b<0) b+=W;
31
        b%=W;
32
        return (num >> b) & 0x1;
33
}
34
 
35
// number; b:bit location;  W: number width log2(num); v: 1 assert the bit, 0 deassert the bit; 
36
void setBit(int *num, int b,   int W, int v)
37
{
38
    while(b<0) b+=W;
39
        b%=W;
40
    int mask = 1 << b;
41
    //printf("b=%d\n", b);
42
        if (v == 0)*num  = *num & ~mask; // assert bit
43
    else *num = *num | mask; // deassert bit
44
 
45
}
46
 
47
 
48 48 alirezamon
unsigned int get_rnd_ip (unsigned int core_num){
49
        unsigned int rnd=rand()%NE;
50
        if(IS_SELF_LOOP_EN) return rnd;
51
        //make sure its not same as sender core
52
        while (rnd==core_num)   rnd=rand()%NE;
53
        return rnd;
54
}
55 43 alirezamon
 
56 48 alirezamon
#if (defined (IS_MESH) || defined (IS_TORUS) || defined (IS_LINE) || defined (IS_RING) )
57 43 alirezamon
 
58
unsigned int pck_dst_gen_2D (unsigned int core_num){
59
        //for mesh-tori
60
        unsigned int current_l,current_x, current_y;
61
        unsigned int dest_l,dest_x,dest_y;
62
        mesh_tori_addrencod_sep(core_num,&current_x,&current_y,&current_l);
63
 
64
        unsigned int rnd=0;
65
        unsigned int rnd100=0;
66
        unsigned int max_percent=100/HOTSPOT_NUM;
67
        int i;
68
 
69
        if((strcmp (TRAFFIC,"RANDOM")==0) || (strcmp (TRAFFIC,"random")==0)){
70 48 alirezamon
                //get a random IP core
71
            return endp_addr_encoder(get_rnd_ip(core_num));
72 43 alirezamon
        }
73
 
74
        if ((strcmp(TRAFFIC,"HOTSPOT")==0) || (strcmp (TRAFFIC,"hot spot")==0)){
75
                unsigned int rnd1000=0;
76 48 alirezamon
                rnd=get_rnd_ip(core_num);
77
 
78 43 alirezamon
                rnd1000=rand()%1000; // generate a random number between 0 & 1000
79
                for (i=0;i<HOTSPOT_NUM; i++){
80
                        if ( hotspots[i].send_enable == 0 && core_num ==hotspots[i].ip_num){
81 48 alirezamon
                                //rnd = core_num; // turn off the core
82
                                //return endp_addr_encoder(rnd);
83
                                return INJECT_OFF;
84 43 alirezamon
                        }
85
                }
86
                for (i=0;i<HOTSPOT_NUM; i++){
87
                        if (rnd1000 < hotspots[i].percentage && core_num !=hotspots[i].ip_num) {
88
                                rnd = hotspots[i].ip_num;
89
                                return endp_addr_encoder(rnd);
90
                        }
91
                }
92
                return endp_addr_encoder(rnd);
93
        }
94
 
95
        if(( strcmp(TRAFFIC ,"TRANSPOSE1")==0)|| (strcmp (TRAFFIC,"transposed 1")==0)){
96
                 dest_x = T1-current_y-1;
97
                 dest_y = T2-current_x-1;
98
                 dest_l = T3-current_l-1;
99
                 return mesh_tori_addr_join(dest_x,dest_y,dest_l);
100
        }
101
 
102
        if(( strcmp(TRAFFIC ,"TRANSPOSE2")==0)|| (strcmp (TRAFFIC,"transposed 2")==0)){
103
                dest_x = current_y;
104
                dest_y = current_x;
105
                dest_l = current_l;
106
                return mesh_tori_addr_join(dest_x,dest_y,dest_l);
107
        }
108
 
109
        if(( strcmp(TRAFFIC ,"BIT_REVERSE")==0)|| (strcmp (TRAFFIC,"bit reverse")==0)){
110
                //di = sb−i−1
111
                int tmp=0;
112
                for(i=0; i< NEw; i++)  setBit(&tmp , i, NEw, getBit(core_num, NEw-i-1, NEw));
113
                return endp_addr_encoder(tmp);
114
        }
115
 
116
        if(( strcmp(TRAFFIC ,"BIT_COMPLEMENT") ==0)|| (strcmp (TRAFFIC,"bit complement")==0)){
117
                int tmp=0;
118
                for(i=0; i< NEw; i++)  setBit(&tmp , i, NEw, getBit(core_num, i, NEw)==0);
119
                return endp_addr_encoder(tmp);
120
        }
121
 
122
        if(( strcmp(TRAFFIC ,"TORNADO") == 0)|| (strcmp (TRAFFIC,"tornado")==0)){
123
                //[(x+(k/2-1)) mod k, (y+(k/2-1)) mod k],
124
                        dest_x = ((current_x + ((T1/2)-1))%T1);
125
                        dest_y = ((current_y + ((T2/2)-1))%T2);
126
                        dest_l = current_l;
127
                        return mesh_tori_addr_join(dest_x,dest_y,dest_l);
128
     }
129
 
130
    if(( strcmp(TRAFFIC ,"SHUFFLE") == 0)|| (strcmp (TRAFFIC,"shuffle")==0)){
131
                //di = si−1 mod b
132
                int tmp=0;
133
                for(i=0; i< NEw; i++)  setBit(&tmp , i, NEw, getBit(core_num, i-1, NEw));
134
                return endp_addr_encoder(tmp);
135
     }
136
 
137
    if(( strcmp(TRAFFIC ,"BIT_ROTATION") == 0)|| (strcmp (TRAFFIC,"bit rotation")==0)){
138
                //di = si+1 mod b
139
                int tmp=0;
140
                for(i=0; i< NEw; i++)  setBit(&tmp , i, NEw, getBit(core_num, i+1, NEw));
141
                return endp_addr_encoder(tmp);
142
     }
143
 
144
    if(( strcmp(TRAFFIC ,"NEIGHBOR") == 0)|| (strcmp (TRAFFIC,"neighbor")==0)){
145
                //dx = sx + 1 mod k
146
                 dest_x = (current_x + 1)%T1;
147
                 dest_y = (current_y + 1)%T2;
148
                 dest_l = current_l;
149
                 return mesh_tori_addr_join(dest_x,dest_y,dest_l);
150
     }
151
 
152 48 alirezamon
     if(( strcmp(TRAFFIC ,"CUSTOM") == 0)|| (strcmp (TRAFFIC,"custom")==0)){
153
         if (custom_traffic_table[core_num]== INJECT_OFF) return INJECT_OFF;
154
                 return endp_addr_encoder(custom_traffic_table[core_num]);
155 43 alirezamon
 
156
     }
157
 
158 48 alirezamon
         fprintf (stderr,"ERROR: traffic %s is an unsupported traffic pattern\n",TRAFFIC);
159
         return INJECT_OFF;
160
 
161 43 alirezamon
}
162
 
163 48 alirezamon
#else
164 43 alirezamon
 
165 48 alirezamon
        unsigned int pck_dst_gen_2D (unsigned int core_num){
166
                return pck_dst_gen_1D (core_num);
167
        }
168 43 alirezamon
 
169 48 alirezamon
#endif
170 43 alirezamon
 
171 48 alirezamon
 
172 43 alirezamon
unsigned int pck_dst_gen_1D (unsigned int core_num){
173
 
174
        unsigned int rnd=0;
175
        unsigned int rnd100=0;
176
        unsigned int max_percent=100/HOTSPOT_NUM;
177
        int i;
178
 
179
 
180
        if((strcmp (TRAFFIC,"RANDOM")==0) || (strcmp (TRAFFIC,"random")==0)){
181 48 alirezamon
                 return endp_addr_encoder(get_rnd_ip(core_num));
182 43 alirezamon
        }
183
 
184
        if ((strcmp(TRAFFIC,"HOTSPOT")==0) || (strcmp (TRAFFIC,"hot spot")==0)){
185
                unsigned int rnd1000=0;
186
                int i;
187 48 alirezamon
                rnd=get_rnd_ip(core_num);
188 43 alirezamon
                rnd1000=rand()%1000; // generate a random number between 0 & 1000
189
                for (i=0;i<HOTSPOT_NUM; i++){
190
                        if ( hotspots[i].send_enable == 0 && core_num ==hotspots[i].ip_num){
191 48 alirezamon
 
192
                                return INJECT_OFF;
193 43 alirezamon
                        }
194
                }
195
 
196
                for (i=0;i<HOTSPOT_NUM; i++){
197
                        if (rnd1000 < hotspots[i].percentage && core_num !=hotspots[i].ip_num) {
198
                                rnd = hotspots[i].ip_num;
199
                                return endp_addr_encoder(rnd % NE );
200
                        }
201
                }
202
                return endp_addr_encoder(rnd % NE );
203
        }
204
 
205
 
206
        if(( strcmp(TRAFFIC ,"TRANSPOSE1")==0)|| (strcmp (TRAFFIC,"transposed 1")==0)){
207
                  return endp_addr_encoder(NE-core_num-1);
208
        }
209
        if(( strcmp(TRAFFIC ,"TRANSPOSE2")==0)|| (strcmp (TRAFFIC,"transposed 2")==0)){
210
                 return endp_addr_encoder(NE-core_num-1);
211
        }
212
 
213
        if(( strcmp(TRAFFIC ,"BIT_REVERSE")==0)|| (strcmp (TRAFFIC,"bit reverse")==0)){
214
                int tmp=0;
215
                for(i=0; i< NEw; i++)  setBit(&tmp , i, NEw, getBit(core_num, NEw-i-1, NEw));
216
                return endp_addr_encoder(tmp);
217
         }
218
 
219
         if(( strcmp(TRAFFIC ,"BIT_COMPLEMENT") ==0)|| (strcmp (TRAFFIC,"bit complement")==0)){
220
                 int tmp=0;
221
                 for(i=0; i< NEw; i++)  setBit(&tmp , i, NEw, getBit(core_num, i, NEw)==0);
222
                 return endp_addr_encoder(tmp%NE);
223
         }
224
 
225
         if(( strcmp(TRAFFIC ,"TORNADO") == 0)|| (strcmp (TRAFFIC,"tornado")==0)){
226
                //[(x+(k/2-1)) mod k, (y+(k/2-1)) mod k],
227
                 return endp_addr_encoder((core_num + ((NE/2)-1))%NE);
228
     }
229
 
230
     if(( strcmp(TRAFFIC ,"SHUFFLE") == 0)|| (strcmp (TRAFFIC,"shuffle")==0)){
231
                //di = si−1 mod b
232
                int tmp=0;
233
                for(i=0; i< NEw; i++)  setBit(&tmp , i, NEw, getBit(core_num, i-1, NEw));
234
                return endp_addr_encoder(tmp%NE);
235
         }
236
 
237
     if(( strcmp(TRAFFIC ,"BIT_ROTATION") == 0)|| (strcmp (TRAFFIC,"bit rotation")==0)){
238
                //di = si+1 mod b
239
                int tmp=0;
240
                for(i=0; i< NEw; i++)  setBit(&tmp , i, NEw, getBit(core_num, i+1, NEw));
241
                return endp_addr_encoder(tmp%NE);
242
 
243
     }
244
 
245
     if(( strcmp(TRAFFIC ,"NEIGHBOR") == 0)|| (strcmp (TRAFFIC,"neighbor")==0)){
246
                //dx = sx + 1 mod k
247
         return endp_addr_encoder((core_num + 1)%NE);
248
         }
249
 
250 48 alirezamon
     if(( strcmp(TRAFFIC ,"CUSTOM") == 0)|| (strcmp (TRAFFIC,"custom")==0)){
251
         if (custom_traffic_table[core_num]== INJECT_OFF) return INJECT_OFF;
252
         return endp_addr_encoder(custom_traffic_table[core_num]);
253 43 alirezamon
 
254 48 alirezamon
     }
255
 
256
     fprintf (stderr,"ERROR: traffic %s is an unsupported traffic pattern\n",TRAFFIC);
257
         return  INJECT_OFF;
258 43 alirezamon
}
259
 
260
 
261
unsigned int rnd_between (unsigned int a, unsigned int b){
262
        unsigned int rnd,diff,min;
263
        if(a==b) return a;
264
        diff= (a<b) ?  b-a+1 : a-b+1;
265
        min= (a<b) ?  a : b;
266
        rnd = (rand() % diff) +  min;
267
        return rnd;
268
}
269
 
270
 
271
 
272
 
273
 
274
 
275
#endif

powered by: WebSVN 2.1.0

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