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/] [rtl/] [src_noc/] [pronoc_pkg.sv] - Blame information for rev 55

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

Line No. Rev Author Line
1 54 alirezamon
`include "pronoc_def.v"
2 48 alirezamon
/****************************************************************************
3
 * pronoc_pkg.sv
4
 ****************************************************************************/
5
 
6
package pronoc_pkg;
7
 
8 54 alirezamon
 
9
 
10
 
11 48 alirezamon
 
12
`define NOC_LOCAL_PARAM
13
`include "noc_localparam.v"
14 54 alirezamon
 
15
 
16
 
17 48 alirezamon
 
18
`define  INCLUDE_TOPOLOGY_LOCALPARAM
19
`include "topology_localparam.v"
20
 
21
 
22 54 alirezamon
 
23 48 alirezamon
localparam
24
        Vw=  log2(V),
25
        Cw=  (C==0)? 1 : log2(C),
26
        NEw = log2(NE),
27
        Bw  = log2(B),
28
        WRRA_CONFIG_INDEX=0,
29
        SMART_EN = (SMART_MAX !=0),
30
        SMART_NUM= (SMART_EN) ? SMART_MAX : 1,
31
        NEV  = NE * V,
32
        T4 = 0,
33 54 alirezamon
        BEw = (BYTE_EN)? log2(Fpay/8) : 1;
34
 
35 48 alirezamon
 
36
 
37
 localparam CONGw= (CONGESTION_INDEX==3)?  3:
38
                      (CONGESTION_INDEX==5)?  3:
39
                      (CONGESTION_INDEX==7)?  3:
40
                      (CONGESTION_INDEX==9)?  3:
41
                      (CONGESTION_INDEX==10)? 4:
42
                      (CONGESTION_INDEX==12)? 3:2;
43
 
44
 
45
 localparam
46
        E_SRC_LSB =0,                   E_SRC_MSB = E_SRC_LSB + EAw-1,
47 54 alirezamon
        E_DST_LSB = E_SRC_MSB +1,       E_DST_MSB = E_DST_LSB + DAw-1,
48 48 alirezamon
        DST_P_LSB = E_DST_MSB + 1,      DST_P_MSB = DST_P_LSB + DSTPw-1,
49
        CLASS_LSB = DST_P_MSB + 1,      CLASS_MSB = CLASS_LSB + Cw -1,
50
        MSB_CLASS = (C>1)? CLASS_MSB : DST_P_MSB,
51
        WEIGHT_LSB= MSB_CLASS + 1,      WEIGHT_MSB = WEIGHT_LSB + WEIGHTw -1,
52
        /* verilator lint_off WIDTH */
53
        MSB_W = (SWA_ARBITER_TYPE== "WRRA")? WEIGHT_MSB : MSB_CLASS,
54
        /* verilator lint_on WIDTH */
55
        BE_LSB =  MSB_W + 1,            BE_MSB = BE_LSB+ BEw-1,
56
        MSB_BE = (BYTE_EN==1)?   BE_MSB  : MSB_W,
57
        /* verilator lint_off WIDTH */
58
        //the maximum data width that can be carried out with header flit
59
        HDR_MAX_DATw = (PCK_TYPE == "SINGLE_FLIT")? Fpay : Fpay - MSB_BE -1;
60
        /* verilator lint_on WIDTH */
61
 
62
        /* verilator lint_off WIDTH */
63
localparam
64
        DISTw =  (TOPOLOGY=="FATTREE" || TOPOLOGY=="TREE" ) ? log2(2*L+1): log2(NR+1),
65 55 alirezamon
        OVC_ALLOC_MODE= ((V==1 || B<=4) )?   1'b1 : 1'b0;
66 48 alirezamon
        /* verilator lint_on WIDTH */
67
 
68
        // 0: The new ovc is allocated only if its not nearly full. Results in a simpler sw_mask_gen logic
69
        // 1: The new ovc is allocated only if its not full. Results in a little more complex sw_mask_gen logic
70
 
71
 
72
 /******************
73
 *   vsa : Virtual channel & Switch allocator
74
 *   local two-stage router allocator
75
 *****************/
76
        typedef struct packed {
77
                logic [V-1 : 0] ovc_is_allocated;
78
                logic [V-1 : 0] ovc_is_released;
79
                logic [V-1 : 0] ivc_num_getting_sw_grant;
80
                logic [V-1 : 0] ivc_num_getting_ovc_grant;
81
                logic [V-1 : 0] ivc_reset;
82
                logic [V-1 : 0] buff_space_decreased;
83
                logic [V*V-1: 0] ivc_granted_ovc_num;
84
        } vsa_ctrl_t;
85
        localparam  VSA_CTRL_w = $bits(vsa_ctrl_t);
86
 
87
/*********************
88
*       ssa : static straight allocator:
89
*             enable single cycle latency for flits goes to the same direction
90
**********************/
91
 
92
        typedef struct packed {
93
                logic [V-1 : 0] ovc_is_allocated;
94
                logic [V-1 : 0] ovc_is_released;
95
                logic [V-1 : 0] ivc_num_getting_sw_grant;
96
                logic [V-1 : 0] ivc_num_getting_ovc_grant;
97
                logic [V-1 : 0] ivc_reset;
98
                logic [V-1 : 0] buff_space_decreased;
99
                logic [V-1 : 0] ivc_single_flit_pck;
100
                logic [V-1 : 0] ovc_single_flit_pck;
101
                bit                     ssa_flit_wr;
102
                logic [V*V-1: 0] ivc_granted_ovc_num;
103
        } ssa_ctrl_t;
104
        localparam  SSA_CTRL_w = $bits(ssa_ctrl_t);
105
 
106
 
107
/*********************
108
*    smart : straight bypass allocator:
109
*    enable multihub bypassing for flits goes to the same direction
110
*********************/
111
        typedef struct packed {
112
                logic [EAw-1 : 0] dest_e_addr;
113
                logic ovc_is_assigned;
114
                logic [Vw-1   : 0] assigned_ovc_bin;
115
        } smart_ivc_info_t;
116
        localparam SMART_IVC_w = $bits(smart_ivc_info_t);
117
 
118
 
119
 
120
        typedef struct packed {
121
                bit             smart_en;
122
                bit     hdr_flit_req;
123
                logic   [V-1 : 0]        ivc_smart_en;
124
                logic   [DSTPw-1  :   0] lk_destport;
125
                logic   [DSTPw-1  :   0] destport;
126
                logic   [V-1 : 0] credit_out;
127
                logic   [V-1 : 0] buff_space_decreased;
128
                logic   [V-1 : 0] ovc_is_allocated;
129
                logic   [V-1 : 0] ovc_is_released;
130
                logic   [V-1 : 0] ivc_num_getting_ovc_grant;
131
                logic   [V-1 : 0] ivc_reset;
132
                logic   [V-1 : 0] mask_available_ovc;
133
                logic   [V-1 : 0] ivc_single_flit_pck;
134
                logic   [V-1 : 0] ovc_single_flit_pck;
135
                logic   [V*V-1: 0] ivc_granted_ovc_num;
136
        } smart_ctrl_t;
137
        localparam  SMART_CTRL_w = $bits(smart_ctrl_t);
138
 
139
        /*****************
140
         * port_info
141
         * **************/
142
        typedef struct packed {
143
                logic [V-1 : 0] ivc_req; // input vc is not empty
144
                logic [V-1 : 0] swa_first_level_grant;// The vc number (one-hot) in an input port which get the first level switch allocator grant
145
                logic [V-1 : 0] swa_grant; // The VC number in an input port which got the swa grant
146
                logic [MAX_P-1 : 0] granted_oport_one_hot;      //The granted output port num (one-hot) for an input port
147
                logic any_ivc_get_swa_grant;
148
 
149
        } iport_info_t;
150
        localparam  IPORT_INFO_w = $bits(iport_info_t);
151
 
152
        typedef struct packed {
153
                logic [V-1 : 0] non_smart_ovc_is_allocated;
154
                //logic [V-1 : 0] ovc_is_released;
155
                //logic [V-1 : 0] ovc_credit_increased;
156
                //logic [V-1 : 0] ovc_credit_decreased;
157
                //logic [V-1 : 0] ovc_avalable;
158
                bit any_ovc_granted;
159
                //bit crossbar_flit_wr;
160
 
161
        }oport_info_t;
162
        localparam  OPORT_INFO_w = $bits(oport_info_t);
163
 
164
 
165
 
166
 
167
 
168
        /*********************
169
         * ivc
170
         *******************/
171
 
172
 
173
        typedef struct packed {
174
                //ivc
175
                logic [EAw-1 : 0] dest_e_addr;
176
                logic ovc_is_assigned;
177
                logic [V-1   : 0] assigned_ovc_num;
178
                logic [Vw-1  : 0] assigned_ovc_bin;
179
                logic [MAX_P-1   : 0] destport_one_hot;
180
                logic [DSTPw-1 : 0]  dest_port_encoded;
181
                logic ivc_req; // input vc is not empty
182
                logic flit_is_tail;
183
                logic assigned_ovc_not_full;
184
                logic [V-1  : 0] candidate_ovc;
185 54 alirezamon
                logic [Cw-1 : 0] class_num;
186
                logic single_flit_pck;
187 48 alirezamon
 
188
        } ivc_info_t;
189
        localparam  IVC_INFO_w = $bits( ivc_info_t);
190
 
191
        localparam      CREDITw  = (LB>B)?  log2(LB+1) : log2(B+1);
192
 
193
        //ovc info
194
        typedef struct packed {
195
                bit avalable;
196
                bit status; //1 : is allocated 0 : not_allocated
197
                logic [CREDITw-1 : 0] credit;//available credit in OVC
198
                bit full;
199
                bit nearly_full;
200
                bit empty;
201
        }ovc_info_t;
202
        localparam  OVC_INFO_w = $bits( ovc_info_t);
203
 
204 54 alirezamon
 
205
 
206 48 alirezamon
 
207 54 alirezamon
 
208 48 alirezamon
/*********************
209
* router_chanels
210
*********************/
211
 
212
        typedef struct packed {
213
                logic [EAw-1    : 0] src_e_addr;
214 54 alirezamon
                logic [DAw-1    : 0] dest_e_addr;
215 48 alirezamon
                logic [DSTPw-1  : 0] destport;
216
                logic [Cw-1             : 0] message_class;
217
                logic [WEIGHTw-1: 0] weight;
218
                logic [BEw-1    : 0] be;
219
        } hdr_flit_t;
220
        localparam HDR_FLIT_w = $bits(hdr_flit_t);
221
 
222
        /* verilator lint_off WIDTH */
223
        localparam FPAYw = (PCK_TYPE == "SINGLE_FLIT")?   Fpay + MSB_BE: Fpay;
224
        /* verilator lint_on WIDTH */
225
 
226
        typedef struct packed {
227
                bit hdr_flag;
228
                bit tail_flag;
229
                logic [V-1 : 0] vc;
230
                logic [FPAYw-1 : 0] payload;
231
        } flit_t;
232
        localparam FLIT_w = $bits(flit_t);
233
 
234
        localparam
235
                Fw = FLIT_w,
236
                NEFw = NE *Fw;
237
 
238
        typedef struct packed {
239
                logic  flit_wr;
240
                logic  [V-1 :  0]  credit;
241
                flit_t  flit;
242
                logic  [CONGw-1 :  0]  congestion;
243
        } flit_chanel_t;
244
        localparam FLIT_CHANEL_w = $bits(flit_chanel_t);
245
 
246 54 alirezamon
        localparam BYPASSw = log2(SMART_NUM+1);
247 48 alirezamon
        typedef struct packed {
248
                logic [SMART_NUM-1: 0] requests;
249
                logic [V-1      : 0] ovc;
250
                logic [EAw-1    : 0] dest_e_addr;
251
                bit   hdr_flit;
252 54 alirezamon
                bit   flit_in_bypassed;
253
                logic [BYPASSw-1 : 0] bypassed_num;
254 48 alirezamon
        } smart_chanel_t;
255
        localparam SMART_CHANEL_w = $bits(smart_chanel_t);
256
 
257
 
258
        localparam CRDTw = (B>LB) ? log2(B+1) : log2(LB+1);
259
        typedef struct packed {
260 54 alirezamon
                bit    endp_port;  // if it is one, it means the corresponding port is connected o an endpoint
261 48 alirezamon
                logic [RAw-1:   0]  neighbors_r_addr;
262 54 alirezamon
                logic [V-1  :0] [CRDTw-1: 0] credit_init_val; // the connected port initial credit value. It is taken at reset time
263
                logic [V-1  :0] credit_release_en;
264 48 alirezamon
        } ctrl_chanel_t;
265
        localparam CTRL_CHANEL_w = $bits(ctrl_chanel_t);
266
 
267 54 alirezamon
 
268
 
269 48 alirezamon
        typedef struct packed {
270
                flit_chanel_t    flit_chanel;
271
                smart_chanel_t   smart_chanel;
272
                ctrl_chanel_t    ctrl_chanel;
273
        } smartflit_chanel_t;
274
        localparam SMARTFLIT_CHANEL_w = $bits(smartflit_chanel_t);
275
 
276
 
277
 
278
 
279
/***********
280
 * simulation
281
 * **********/
282 54 alirezamon
 
283
        localparam DELAYw = EAw+2; //Injector start delay counter width
284
 
285 48 alirezamon
        typedef struct packed {
286
                integer   ip_num;
287
                bit send_enable;
288
                integer  percentage; // x10
289
        } hotspot_t;
290
 
291
        typedef struct packed {
292
                integer value;
293
                integer percentage;
294
        }rnd_discrete_t;
295
 
296
        //packet injector interface
297
        localparam PCK_INJ_Dw =64;//TODO to be defined by user
298
        localparam PCK_SIZw= log2(MAX_PCK_SIZ);
299
 
300
 
301
 
302
        typedef struct packed {
303
                logic [PCK_INJ_Dw-1 : 0] data;
304
                logic [PCK_SIZw-1 : 0] size;
305 54 alirezamon
                logic [DAw-1 : 0] endp_addr;
306 48 alirezamon
                logic [Cw-1  : 0] class_num;
307
                logic [WEIGHTw-1   : 0] init_weight;
308
                logic [V-1   : 0] vc;
309
                bit   pck_wr;
310
                bit   [V-1   : 0] ready;
311
                logic [DISTw-1 : 0] distance;
312
                logic [15: 0]  h2t_delay;
313
    }   pck_injct_t;
314
    localparam PCK_INJCT_w = $bits(pck_injct_t);
315
 
316 54 alirezamon
    typedef struct packed {
317
        logic [BYPASSw-1 : 0] bypassed_num;
318
        bit flit_wr_i;
319
        bit pck_wr_i;
320
        bit flit_wr_o;
321
        bit pck_wr_o;
322
        bit flit_in_bypassed;
323
    } router_event_t;
324
    localparam ROUTER_EVENT_w = $bits(router_event_t);
325
 
326 48 alirezamon
 
327
endpackage : pronoc_pkg
328
 
329
 

powered by: WebSVN 2.1.0

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