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_emulate/] [rtl/] [noc_emulator.vold] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
/**************************************
2
* Module: emulator
3
* Date:2017-01-20
4
* Author: alireza
5
*
6
* Description:
7
***************************************/
8
 
9
 
10
module  noc_emulator #(
11
    //NoC parameters
12
    parameter V    = 1,
13
    parameter B    = 4,
14
    parameter T1   = 4,
15
    parameter T2   = 4,
16
    parameter T3   = 1,
17
    parameter TOPOLOGY = "MESH",
18
    parameter ROUTE_NAME  =   "XY",
19
    parameter C    = 4,
20
    parameter Fpay = 32,
21
    parameter MUX_TYPE  = "BINARY",
22
    parameter VC_REALLOCATION_TYPE  =  "NONATOMIC",
23
    parameter COMBINATION_TYPE= "COMB_NONSPEC",
24
    parameter FIRST_ARBITER_EXT_P_EN = 1,
25
    parameter CONGESTION_INDEX = 2,
26
    parameter DEBUG_EN = 0,
27
    parameter AVC_ATOMIC_EN = 1,
28
    parameter ADD_PIPREG_AFTER_CROSSBAR = 0,
29
    parameter CVw=(C==0)? V : C * V,
30
    parameter [CVw-1:   0] CLASS_SETTING = {CVw{1'b1}},
31
    parameter [V-1  :   0] ESCAP_VC_MASK = 4'b1000,
32
    parameter SSA_EN = "NO",
33
    parameter SWA_ARBITER_TYPE = "RRA",
34
    parameter WEIGHTw = 4,
35
    parameter MIN_PCK_SIZE = 2,
36
    parameter BYTE_EN=0,
37
 
38
 
39
    // simulation
40
    parameter PATTERN_VJTAG_INDEX=125,
41
    parameter STATISTIC_VJTAG_INDEX=124,
42
    parameter MAX_RATIO = 100,
43
    parameter RAM_Aw=7,
44
    parameter STATISTIC_NUM=8,
45
    parameter TIMSTMP_FIFO_NUM=16
46
 
47
 
48
)(
49
    jtag_ctrl_reset,
50
    start_o,
51
    reset,
52
    clk,
53
    done
54
);
55
 
56
    input reset,jtag_ctrl_reset,clk;
57
    output done;
58
    output start_o;
59
 
60
 
61
    `define INCLUDE_TOPOLOGY_LOCALPARAM
62
    `include "../src_noc/topology_localparam.v"
63
 
64
    localparam
65
        Fw = 2+V+Fpay, //flit width;
66
        NEFw = NE * Fw,
67
        NEV = NE * V;
68
 
69
 
70
    localparam
71
        PCK_CNTw =30,  // 1 G packets
72
        PCK_SIZw =14,   // 16 K flit
73
        MAX_EAw =8,
74
        MAX_Cw    =4;   // 16 message classes
75
 
76
 
77
   localparam  MAX_SIM_CLKs  = 1_000_000_000;
78
 
79
 
80
 
81
 
82
    reg start_i;
83
    reg [10:0] cnt;
84
 
85
   assign start_o=start_i;
86
 
87
 
88
 
89
    wire [NEFw-1    :   0]  noc_flit_out_all;
90
    wire [NE-1      :   0]  noc_flit_out_wr_all;
91
    wire [NEV-1     :   0]  noc_credit_in_all;
92
    wire [NEFw-1    :   0]  noc_flit_in_all;
93
    wire [NE-1      :   0]  noc_flit_in_wr_all;
94
    wire [NEV-1     :   0]  noc_credit_out_all;
95
 
96
 
97
 
98
 noc #(
99
        .V(V),
100
        .B(B),
101
        .T1(T1),
102
        .T2(T2),
103
        .T3(T3),
104
        .C(C),
105
        .Fpay(Fpay),
106
        .MUX_TYPE(MUX_TYPE),
107
        .VC_REALLOCATION_TYPE(VC_REALLOCATION_TYPE),
108
        .COMBINATION_TYPE(COMBINATION_TYPE),
109
        .FIRST_ARBITER_EXT_P_EN(FIRST_ARBITER_EXT_P_EN),
110
        .TOPOLOGY(TOPOLOGY),
111
        .ROUTE_NAME(ROUTE_NAME),
112
        .CONGESTION_INDEX(CONGESTION_INDEX),
113
        .DEBUG_EN (DEBUG_EN),
114
        .AVC_ATOMIC_EN(AVC_ATOMIC_EN),
115
        .ADD_PIPREG_AFTER_CROSSBAR(ADD_PIPREG_AFTER_CROSSBAR),
116
        .CVw(CVw),
117
        .CLASS_SETTING(CLASS_SETTING), // shows how each class can use VCs
118
        .ESCAP_VC_MASK(ESCAP_VC_MASK),  //
119
        .SSA_EN(SSA_EN),
120
        .SWA_ARBITER_TYPE(SWA_ARBITER_TYPE),
121
        .WEIGHTw(WEIGHTw),
122
        .MIN_PCK_SIZE(MIN_PCK_SIZE),
123
        .BYTE_EN(BYTE_EN)
124
    )
125
    the_noc
126
    (
127
        .flit_out_all(noc_flit_out_all),
128
        .flit_out_wr_all(noc_flit_out_wr_all),
129
        .credit_in_all(noc_credit_in_all),
130
        .flit_in_all(noc_flit_in_all),
131
        .flit_in_wr_all(noc_flit_in_wr_all),
132
        .credit_out_all(noc_credit_out_all),
133
        .reset(reset),
134
        .clk(clk)
135
    );
136
 
137
 
138
 
139
   Jtag_traffic_gen #(
140
        .PATTERN_VJTAG_INDEX(PATTERN_VJTAG_INDEX),
141
        .STATISTIC_VJTAG_INDEX(STATISTIC_VJTAG_INDEX),
142
        .V(V),
143
        .B(B),
144
        .T1(T1),
145
        .T2(T2),
146
        .T3(T3),
147
        .Fpay(Fpay),
148
        .VC_REALLOCATION_TYPE(VC_REALLOCATION_TYPE),
149
        .TOPOLOGY(TOPOLOGY),
150
        .ROUTE_NAME(ROUTE_NAME),
151
        .C(C),
152
        .MIN_PCK_SIZE(MIN_PCK_SIZE),
153
        .BYTE_EN(BYTE_EN),
154
        .RAM_Aw(RAM_Aw),
155
        .STATISTIC_NUM(STATISTIC_NUM),  // the last 8 rows of RAM is reserved for collecting statistic values;
156
        .MAX_SIM_CLKs(MAX_SIM_CLKs),
157
        .MAX_RATIO(MAX_RATIO),
158
        .SWA_ARBITER_TYPE(SWA_ARBITER_TYPE),
159
        .WEIGHTw(WEIGHTw),
160
        .TIMSTMP_FIFO_NUM(TIMSTMP_FIFO_NUM),
161
        .PCK_CNTw(PCK_CNTw),  // 1 G packets
162
        .PCK_SIZw(PCK_SIZw),   // 16 K flit
163
        .MAX_EAw(MAX_EAw),   // 16 nodes in x dimension
164
        .MAX_Cw(MAX_Cw)   // 16 message class
165
    )
166
    the_traffic_gen
167
    (
168
 
169
        .start_i(start_i),
170
        .jtag_ctrl_reset(jtag_ctrl_reset),
171
        .reset(reset),
172
        .clk(clk),
173
        .done(done),
174
   //noc
175
        .flit_out_all(noc_flit_in_all),
176
        .flit_out_wr_all(noc_flit_in_wr_all),
177
        .credit_in_all(noc_credit_out_all),
178
        .flit_in_all(noc_flit_out_all),
179
        .flit_in_wr_all(noc_flit_out_wr_all),
180
        .credit_out_all(noc_credit_in_all)
181
    );
182
 
183
 
184
  always @(posedge clk or posedge reset) begin
185
        if(reset) begin
186
            cnt     <=0;
187
            start_i   <=0;
188
       end else begin
189
             if(cnt < 1020) cnt<=  cnt+1'b1;
190
             if(cnt== 1000)begin
191
                    start_i<=1'b1;
192
             end else if(cnt== 1010)begin
193
                    start_i<=1'b0;
194
             end
195
        end
196
    end
197
endmodule
198
 
199
 
200
 
201
/***************
202
    Jtag_traffic_gen:
203
    A traffic generator which can be programed using JTAG port
204
 
205
****************/
206
 
207
module  Jtag_traffic_gen #(
208
    parameter PATTERN_VJTAG_INDEX=125,
209
    parameter STATISTIC_VJTAG_INDEX=124,
210
    parameter V = 4,    // VC num per port
211
    parameter B = 4,    // buffer space :flit per VC
212
    parameter T1= 4,
213
    parameter T2= 4,
214
    parameter T3= 1,
215
    parameter Fpay = 32,
216
    parameter VC_REALLOCATION_TYPE  = "NONATOMIC",// "ATOMIC" , "NONATOMIC"
217
    parameter TOPOLOGY  = "MESH",
218
    parameter ROUTE_NAME    = "XY",
219
    parameter C = 4 ,   //  number of flit class
220
    parameter MIN_PCK_SIZE = 2,
221
    parameter BYTE_EN=0,
222
    parameter RAM_Aw=7,
223
    parameter STATISTIC_NUM=8,
224
    parameter MAX_RATIO = 100,
225
    parameter TIMSTMP_FIFO_NUM = 16,
226
    parameter MAX_SIM_CLKs=1_000_000_000,
227
    parameter PCK_CNTw =30,  // 1 G packets
228
    parameter PCK_SIZw =14,   // 16 K flit
229
    parameter MAX_EAw    =8,
230
    parameter MAX_Cw    =4,   // 16 message class
231
    parameter SWA_ARBITER_TYPE = "RRA",
232
    parameter WEIGHTw  =4
233
)
234
(
235
 
236
    done,
237
    start_i,
238
 
239
    flit_out_all,
240
    flit_out_wr_all,
241
    credit_in_all,
242
    flit_in_all,
243
    flit_in_wr_all,
244
    credit_out_all,
245
 
246
    jtag_ctrl_reset,
247
    reset,
248
    clk
249
);
250
 
251
 
252
    `define INCLUDE_TOPOLOGY_LOCALPARAM
253
    `include "../src_noc/topology_localparam.v"
254
 
255
    localparam
256
        Fw      =   2+V+Fpay,
257
        NEw     =   log2(NE),
258
        NEV     =   NE  * V,
259
        NEFw    =   NE  * Fw;
260
 
261
    input  reset,jtag_ctrl_reset, clk;
262
    input  start_i;
263
    output done;
264
 
265
    // NOC interfaces
266
    output [NEFw-1    :   0]  flit_out_all;
267
    output [NE-1      :   0]  flit_out_wr_all;
268
    input  [NEV-1     :   0]  credit_in_all;
269
    input  [NEFw-1    :   0]  flit_in_all;
270
    input  [NE-1      :   0]  flit_in_wr_all;
271
    output [NEV-1     :   0]  credit_out_all;
272
 
273
 
274
 
275
    wire [Fw-1      :   0]  flit_out                 [NE-1           :0];
276
    wire [NE-1      :   0]  flit_out_wr;
277
    wire [V-1       :   0]  credit_in                [NE-1           :0];
278
    wire [Fw-1      :   0]  flit_in                  [NE-1           :0];
279
    wire [NE-1      :   0]  flit_in_wr;
280
    wire [V-1       :   0]  credit_out               [NE-1           :0];
281
 
282
 
283
    wire [NE-1 :   0]  start;
284
    wire [NE-1      :   0]  done_sep;
285
    assign done = &done_sep;
286
 
287
    start_delay_gen #(
288
        .NC(NE) //number of cores
289
 
290
    )
291
    st_gen
292
    (
293
        .clk(clk),
294
        .reset(reset),
295
        .start_i(start_i),
296
        .start_o(start)
297
    );
298
 
299
    //jtag pattern controller
300
 
301
    localparam   Dw=64,
302
                 Aw =RAM_Aw;
303
 
304
    wire [Dw-1 :   0] jtag_data ;
305
    wire [Aw-1 :   0] jtag_addr ;
306
    wire              jtag_we;
307
    wire [Dw-1 :   0] jtag_q ;
308
    wire [NEw-1:   0] jtag_RAM_select;
309
    wire [NE-1 :   0] jtag_we_sep;
310
    wire [Dw-1 :   0] jtag_q_sep   [NE-1  :   0];
311
 
312
    assign jtag_q = jtag_q_sep[jtag_RAM_select];
313
 
314
 
315
    jtag_emulator_controller #(
316
        .VJTAG_INDEX(PATTERN_VJTAG_INDEX),
317
        .Dw(Dw),
318
        .Aw(Aw+NEw)
319
    )
320
    pttern_jtag_controller
321
    (
322
        .dat_o(jtag_data),
323
        .addr_o({jtag_RAM_select,jtag_addr}),
324
        .we_o(jtag_we),
325
        .q_i(jtag_q),
326
        .clk(clk),
327
        .reset(jtag_ctrl_reset)
328
    );
329
 
330
 
331
 
332
    //jtag statistic reader
333
 
334
 
335
    localparam
336
        STATISw=log2(STATISTIC_NUM);
337
 
338
 
339
    wire [STATISw-1 :   0] statis_jtag_addr ;
340
    wire [Dw-1 :   0] statis_jtag_data_i;
341
    wire [NEw-1:   0] statis_jtag_select;
342
    wire [Dw-1 :   0] statis_jtag_q_sep   [NE-1  :   0];
343
 
344
    assign statis_jtag_data_i = statis_jtag_q_sep[statis_jtag_select];
345
 
346
   jtag_emulator_controller #(
347
        .VJTAG_INDEX(STATISTIC_VJTAG_INDEX),
348
        .Dw(Dw),
349
        .Aw(STATISw+NEw)
350
 
351
   )
352
   jtag_statistic_reader
353
   (
354
        .dat_o(),
355
        .addr_o({statis_jtag_select,statis_jtag_addr}),
356
        .we_o( ),
357
        .q_i(statis_jtag_data_i),
358
        .clk(clk),
359
        .reset(jtag_ctrl_reset)
360
   );
361
 
362
   function integer addrencode;
363
        input integer pos,k,n,kw;
364
        integer pow,i,tmp;begin
365
        addrencode=0;
366
        pow=1;
367
        for (i = 0; i 
368
            tmp=(pos/pow);
369
            tmp=tmp%k;
370
            tmp=tmp<
371
            addrencode=addrencode | tmp;
372
            pow=pow * k;
373
        end
374
        end
375
    endfunction
376
 
377
 
378
    genvar i;
379
    generate
380
    for (i=0;   i
381
 
382
     //connected router encoded address
383
        localparam CURRENTR=  i/T3;
384
        localparam CURRENTX= (TOPOLOGY == "FATTREE" || TOPOLOGY == "TREE")?  addrencode(i/K,K,L,Kw) : CURRENTR%T1;
385
        localparam CURRENTY= (TOPOLOGY == "FATTREE" || TOPOLOGY == "TREE")?  0 : CURRENTR/T1;
386
        localparam [RAw-1 : 0] CURRENT_ADDR =  (CURRENTY<
387
        //Endpoint encoded address
388
        localparam ENDPL= (TOPOLOGY == "FATTREE" || TOPOLOGY == "TREE")? 0 :(T3>1)? i%T3: 0;
389
        localparam ENDPX= (TOPOLOGY == "FATTREE" || TOPOLOGY == "TREE")?  addrencode(i,K,L,Kw) : CURRENTX;
390
        localparam ENDPY= (TOPOLOGY == "FATTREE" || TOPOLOGY == "TREE")? 0 : CURRENTY;
391
        localparam [EAw-1 : 0] ENDP_ADRR =
392
        (TOPOLOGY == "FATTREE" || TOPOLOGY == "TREE" || TOPOLOGY == "MESH" || TOPOLOGY == "TORUS" || TOPOLOGY == "RING" || TOPOLOGY == "LINE")?
393
        (ENDPL<<(NXw+NYw)) + (ENDPY<
394
 
395
 
396
        // seperate interfaces per router
397
        assign  flit_in      [i] =   flit_in_all    [(i+1)*Fw-1    : i*Fw];
398
        assign  flit_in_wr   [i] =   flit_in_wr_all [i];
399
        assign  credit_out_all   [(i+1)*V-1 : i*V]     =   credit_out   [i];
400
        assign  flit_out_all     [(i+1)*Fw-1    : i*Fw]    =  flit_out     [i];
401
        assign  flit_out_wr_all  [i] =   flit_out_wr  [i];
402
        assign  credit_in    [i] =   credit_in_all  [(i+1)*V-1 : i*V];
403
        assign jtag_we_sep[i] = (jtag_RAM_select == i) ? jtag_we :1'b0;
404
 
405
        traffic_gen_ram #(
406
                .V(V),
407
                .B(B),
408
                .T1(T1),
409
                .T2(T2),
410
                .T3(T3),
411
                .Fpay(Fpay),
412
                .VC_REALLOCATION_TYPE(VC_REALLOCATION_TYPE),
413
                .TOPOLOGY(TOPOLOGY),
414
                .ROUTE_NAME(ROUTE_NAME),
415
                .C(C),
416
                .RAM_Aw(RAM_Aw),
417
            .STATISTIC_NUM(STATISTIC_NUM),
418
                .TIMSTMP_FIFO_NUM(TIMSTMP_FIFO_NUM),
419
                .MAX_SIM_CLKs(MAX_SIM_CLKs),
420
            .MAX_RATIO(MAX_RATIO),
421
                .PCK_CNTw(PCK_CNTw),  // 1 G packets
422
            .PCK_SIZw(PCK_SIZw),   // 16 K flit
423
            .MAX_EAw(MAX_EAw),
424
            .MAX_Cw(MAX_Cw),   // 16 message cla
425
            .SWA_ARBITER_TYPE(SWA_ARBITER_TYPE),
426
            .WEIGHTw(WEIGHTw),
427
            .MIN_PCK_SIZE(MIN_PCK_SIZE),
428
            .BYTE_EN(BYTE_EN),
429
            .RAw(RAw),
430
            .EAw(EAw)
431
          )
432
          traffic_gen_ram_inst
433
          (
434
                .reset(reset),
435
                .clk(clk),
436
                .current_r_addr(CURRENT_ADDR),
437
            .current_e_addr(ENDP_ADRR),
438
                .start(start[i]),
439
                .done(done_sep[i]),
440
                //pattern updater
441
                .jtag_data_b(jtag_data),
442
                .jtag_addr_b(jtag_addr),
443
                .jtag_we_b( jtag_we_sep[i]),
444
                .jtag_q_b(  jtag_q_sep[i]),
445
                //statistic reader
446
                .statistic_jtag_addr_b(statis_jtag_addr),
447
            .statistic_jtag_q_b( statis_jtag_q_sep[i]),
448
 
449
                .flit_out(flit_out[i]),
450
                .flit_out_wr(flit_out_wr[i]),
451
                .credit_in(credit_in[i]),
452
                .flit_in(flit_in[i]),
453
                .flit_in_wr(flit_in_wr[i]),
454
                .credit_out(credit_out[i])
455
          );
456
    end
457
    endgenerate
458
 
459
endmodule
460
 
461
 
462
 
463
/********************
464
*
465
*   traffic_gen_ram
466
*
467
*********************/
468
 
469
module  traffic_gen_ram #(
470
    parameter V = 4,    // VC num per port
471
    parameter B = 4,    // buffer space :flit per VC
472
    parameter T1= 4,
473
    parameter T2= 4,
474
    parameter T3=1,
475
    parameter Fpay = 32,
476
    parameter VC_REALLOCATION_TYPE  = "NONATOMIC",// "ATOMIC" , "NONATOMIC"
477
    parameter TOPOLOGY  = "MESH",
478
    parameter ROUTE_NAME    = "XY",
479
    parameter C = 4,    //  number of flit class
480
    parameter RAM_Aw=7,
481
    parameter STATISTIC_NUM=8,  // the last 8 rows of RAM is reserved for collecting statistic values;
482
    parameter TIMSTMP_FIFO_NUM=16,
483
    parameter MAX_SIM_CLKs = 1000000,
484
    parameter MAX_RATIO=100,
485
    parameter PCK_CNTw =30,  // 1 G packets
486
    parameter PCK_SIZw =14,   // 16 K flit
487
    parameter MAX_EAw    =8,
488
    parameter MAX_Cw    =4,  // 16 message class
489
    parameter SWA_ARBITER_TYPE ="RRA",
490
    parameter WEIGHTw  =4,
491
    parameter MIN_PCK_SIZE=2,
492
    parameter BYTE_EN=0,
493
    parameter RAw = 4,
494
    parameter EAw=4
495
)
496
(
497
 
498
    done,
499
    current_r_addr,
500
    current_e_addr,
501
    start,
502
 
503
   //noc port
504
    flit_out,
505
    flit_out_wr,
506
    credit_in,
507
    flit_in,
508
    flit_in_wr,
509
    credit_out,
510
 
511
    //Pattern RAM to jtag interface
512
    jtag_data_b,
513
    jtag_addr_b,
514
    jtag_we_b,
515
    jtag_q_b,
516
 
517
    // Statistic to jtag interface
518
    statistic_jtag_addr_b,
519
    statistic_jtag_q_b,
520
 
521
    reset,
522
    clk
523
);
524
 
525
 
526
    function integer log2;
527
      input integer number; begin
528
         log2=0;
529
         while(2**log2
530
            log2=log2+1;
531
         end
532
      end
533
    endfunction // log2
534
 
535
 
536
  //  localparam   MAX_PATTERN =  (2**RAM_Aw)-1;   // support up to MAX_PATTERN different injections pattern
537
 
538
    localparam
539
        Cw = (C > 1)? log2(C): 1,
540
        Fw = 2+V+Fpay;
541
 
542
 
543
      //define maximum width for each parameter of packet injector
544
 
545
    localparam    RATIOw   =7;   // log2(100)
546
 
547
    localparam  Dw=PCK_CNTw+ RATIOw + PCK_SIZw + MAX_EAw + MAX_Cw  +1;//=64
548
    localparam  Aw=RAM_Aw;
549
    localparam  STATISw=log2(STATISTIC_NUM);
550
 
551
    localparam
552
        STATE_NUM=5,
553
        IDEAL =1,
554
        WAIT1 = 2,
555
        WAIT2 = 4,
556
        SEND_PCK=8,
557
        /*
558
        SAVE_SENT_PCK_NUM=4,
559
        SAVE_RSVD_PCK_NUM=8,
560
        SAVE_TOTAL_LATENCY_NUM=16,
561
        SAVE_WORST_LATENCY_NUM=32,
562
        */
563
        ASSET_DONE=16;
564
 
565
    localparam
566
        CLK_CNTw = log2(MAX_SIM_CLKs+1),
567
        MAX_PCK_NUM   = (2**PCK_CNTw)-1,
568
        MAX_PCK_SIZ   = (2**PCK_SIZw)-1;  // max packet size
569
 
570
    localparam [Aw-1    :   0]
571
        RAM_CNT_ADDR = 0,
572
        PATTERN_START_ADDR=1,
573
 //       PATTERN_END_ADDR=  MAX_PATTERN,
574
        SENT_PCK_ADDR = 0,
575
        RSVD_PCK_ADDR = 1,
576
        TOTAL_LATENCY_ADDR  = 2,
577
        WORST_LATENCY_ADDR  = 3;
578
 
579
 
580
    input                               reset, clk;
581
    // the connected router address
582
    input  [RAw-1                   :0] current_r_addr;
583
    // the current endpoint address
584
    input  [EAw-1                   :0] current_e_addr;
585
 
586
 
587
 
588
    input                               start;
589
 
590
    output  reg done;
591
    reg done_next;
592
 
593
    input [Dw-1 :   0]  jtag_data_b;
594
    input [Aw-1 :   0]  jtag_addr_b;
595
    input jtag_we_b;
596
    output [Dw-1 :   0] jtag_q_b;
597
 
598
    input [STATISw-1    :   0] statistic_jtag_addr_b;
599
    output reg [Dw-1 :   0] statistic_jtag_q_b;
600
 
601
 
602
 
603
    // NOC interfaces
604
    output  [Fw-1                   :0] flit_out;
605
    output                              flit_out_wr;
606
    input   [V-1                    :0] credit_in;
607
    input   [Fw-1                   :0] flit_in;
608
    input                               flit_in_wr;
609
    output  [V-1                    :0] credit_out;
610
 
611
 
612
 
613
    wire [Dw-1  :   0] q_a;
614
    reg  [Aw-1  :   0] addr_a,addr_a_next;
615
    reg                we_a;
616
    reg  [Dw-1  :   0] data_a;
617
 
618
 
619
    wire  [PCK_CNTw-1 :0] pck_num_to_send_in;
620
    wire  [RATIOw-1 :0] ratio,ratio_in;
621
    wire  [PCK_SIZw-1 :0] pck_size_in;
622
    wire  [MAX_EAw-1  :0] dest_e_in;
623
    wire  [MAX_Cw-1   :0] pck_class_in;
624
    wire  last_adr_in;
625
 
626
    assign {pck_num_to_send_in,ratio_in, pck_size_in,dest_e_in, pck_class_in, last_adr_in}= q_a;
627
 
628
    wire  [EAw-1                    :0] dest_e_addr = dest_e_in [EAw-1                    :0];
629
    wire  [Cw-1                    :0] pck_class= pck_class_in[Cw-1                :0];
630
 
631
 
632
    wire [CLK_CNTw-1              :0] time_stamp_h2t;
633
    wire sent_done, update;
634
    reg  [ STATE_NUM-1 :   0]  ps,ns;
635
    reg  [63    :   0] total_pck_recieved,total_pck_recieved_next,total_pck_sent,total_pck_sent_next;
636
    reg  [63    :   0] total_latency_cnt,total_latency_cnt_next;
637
    reg  [31    :   0] ram_counter,ram_counter_next;
638
    reg  [PCK_CNTw-1 : 0] pck_number_sent,pck_number_sent_next;
639
    reg  [CLK_CNTw-1 : 0] worst_latency,worst_latency_next;
640
 
641
    reg nvalid_dest,reset_pck_number_sent_old;
642
    wire nvalid_dest_next= (current_e_addr==dest_e_addr && ps!=IDEAL && ps!=WAIT1);
643
    wire reset_pck_number_sent= ((pck_number_sent==pck_num_to_send_in) | nvalid_dest) & ~reset_pck_number_sent_old;
644
    reg stop;
645
        assign ratio=(ps==SEND_PCK)?  ratio_in : {RATIOw{1'b0}};
646
 
647
    dual_port_ram #(
648
        .Dw (Dw),
649
        .Aw (Aw)
650
    )
651
    the_ram
652
    (
653
        .clk        (clk),
654
         //port a
655
        .data_a     (data_a),
656
        .addr_a     (addr_a),
657
        .we_a       (we_a),
658
        .q_a        (q_a),
659
 
660
        //port b connected to the jtag
661
        .data_b     (jtag_data_b),
662
        .addr_b     (jtag_addr_b),
663
        .we_b       (jtag_we_b),
664
        .q_b        (jtag_q_b)
665
    );
666
 
667
 wire start_traffic;
668
 reg [3:0] counter;
669
 
670
 always @(posedge clk or posedge reset) begin
671
    if(reset)  counter <=4'd0;
672
    else begin
673
        if(start)  counter <=4'd1;
674
        else if(counter> 4'd0 &&  counter<=4'b1111) counter <=counter+1'b1;
675
    end
676
 end
677
 
678
 assign start_traffic = counter == 4'b1100; // delaied for 12 clock cycles
679
 
680
 
681
  traffic_gen #(
682
        .V(V),
683
        .B(B),
684
        .T1(T1),
685
        .T2(T2),
686
        .T3(T3),
687
        .Fpay(Fpay),
688
        .C(C),
689
        .VC_REALLOCATION_TYPE(VC_REALLOCATION_TYPE),
690
        .TOPOLOGY(TOPOLOGY),
691
        .ROUTE_NAME(ROUTE_NAME),
692
        .MAX_PCK_NUM(MAX_PCK_NUM),
693
        .MAX_SIM_CLKs(MAX_SIM_CLKs),
694
        .MAX_PCK_SIZ(MAX_PCK_SIZ),
695
        .TIMSTMP_FIFO_NUM(TIMSTMP_FIFO_NUM),
696
        .MAX_RATIO(MAX_RATIO),
697
        .SWA_ARBITER_TYPE(SWA_ARBITER_TYPE),
698
        .WEIGHTw(WEIGHTw),
699
        .MIN_PCK_SIZE(MIN_PCK_SIZE),
700
        .BYTE_EN(BYTE_EN)
701
    )
702
    the_traffic_gen
703
    (
704
 
705
        .reset(reset),
706
        .clk(clk),
707
        //input
708
        .ratio (ratio),
709
        .start(start_traffic),
710
        .stop(stop),
711
        .avg_pck_size_in(pck_size_in),
712
        .pck_size_in(pck_size_in),
713
        .current_r_addr(current_r_addr),
714
        .current_e_addr(current_e_addr),
715
        .dest_e_addr(dest_e_addr),
716
        .pck_class_in(pck_class),
717
        .init_weight({WEIGHTw{1'b0}}),
718
        .report ( ),
719
 
720
        //output
721
        .update(update), // update the noc_analayzer
722
        .src_e_addr( ),
723
        .pck_number( ),
724
        .sent_done(sent_done), // tail flit has been sent
725
        .hdr_flit_sent( ),
726
        .distance( ),
727
        .pck_class_out( ),
728
        .time_stamp_h2h( ),
729
        .time_stamp_h2t(time_stamp_h2t),
730
 
731
         //noc
732
        .flit_out(flit_out),
733
        .flit_out_wr(flit_out_wr),
734
        .credit_in(credit_in),
735
        .flit_in(flit_in),
736
        .flit_in_wr(flit_in_wr),
737
        .credit_out(credit_out)
738
 
739
    );
740
 
741
    always @ (*)begin
742
        case (statistic_jtag_addr_b)
743
            SENT_PCK_ADDR: statistic_jtag_q_b=  total_pck_sent;
744
            RSVD_PCK_ADDR: statistic_jtag_q_b=  total_pck_recieved;
745
            TOTAL_LATENCY_ADDR: statistic_jtag_q_b= total_latency_cnt;
746
            WORST_LATENCY_ADDR: statistic_jtag_q_b= worst_latency;
747
            default: statistic_jtag_q_b= worst_latency;
748
         endcase
749
    end
750
 
751
 
752
 
753
 
754
     always @ (*)begin
755
         ns=ps;
756
         addr_a_next =  addr_a;
757
         pck_number_sent_next = pck_number_sent;
758
         done_next =done;
759
         total_latency_cnt_next = total_latency_cnt;
760
         worst_latency_next = worst_latency;
761
         total_pck_recieved_next = total_pck_recieved;
762
         total_pck_sent_next = total_pck_sent;
763
         ram_counter_next = ram_counter;
764
         data_a = total_pck_sent;
765
         we_a = 0;
766
         stop=1'b0;
767
 
768
         if(update)begin
769
                total_latency_cnt_next = total_latency_cnt + time_stamp_h2t;
770
                if(time_stamp_h2t >worst_latency ) worst_latency_next=time_stamp_h2t;
771
                total_pck_recieved_next =total_pck_recieved+1'b1;
772
         end
773
 
774
         if(sent_done)begin
775
                 pck_number_sent_next =pck_number_sent+1'b1;
776
                 total_pck_sent_next  =total_pck_sent+1'b1;
777
         end
778
 
779
 
780
         case(ps)
781
         IDEAL : begin
782
              done_next =1'b0;
783
              addr_a_next =RAM_CNT_ADDR;
784
              ram_counter_next = q_a[31:0];  // first ram data shows how many times the RAM is needed to ne read
785
              if( start) begin
786
                    addr_a_next=PATTERN_START_ADDR;
787
                    ns= WAIT1;
788
              end
789
 
790
         end//IDEAL
791
         WAIT1 : begin
792
            ns= WAIT2;
793
 
794
         end
795
         WAIT2 : begin
796
            ns= SEND_PCK;
797
 
798
         end
799
         SEND_PCK: begin
800
            if (reset_pck_number_sent) begin
801
                 pck_number_sent_next={PCK_CNTw{1'b0}};
802
                 if(last_adr_in)begin
803
                     if(ram_counter==0)begin
804
                       ns = ASSET_DONE;// SAVE_SENT_PCK_NUM;
805
                       //addr_a_next = SENT_PCK_ADDR;
806
                     end else addr_a_next = 1;
807
                     ram_counter_next=ram_counter-1'b1;
808
               end else begin
809
                    addr_a_next=addr_a+1'b1;
810
 
811
               end
812
 
813
            end
814
 
815
 
816
 
817
 
818
 
819
         end//SEND_PCk
820
         /*
821
         SAVE_SENT_PCK_NUM: begin
822
            data_a = total_pck_sent;
823
            we_a   = 1;
824
            addr_a_next =RSVD_PCK_ADDR ;
825
            ns= SAVE_RSVD_PCK_NUM;
826
 
827
         end
828
         SAVE_RSVD_PCK_NUM: begin
829
            data_a = total_pck_recieved;
830
            addr_a_next =TOTAL_LATENCY_ADDR;
831
            we_a   = 1;
832
            ns= SAVE_TOTAL_LATENCY_NUM;
833
 
834
 
835
         end
836
         SAVE_TOTAL_LATENCY_NUM:  begin
837
            data_a = total_latency_cnt;
838
            addr_a_next =WORST_LATENCY_ADDR;
839
            we_a   = 1;
840
            ns=SAVE_WORST_LATENCY_NUM;
841
 
842
 
843
         end
844
         SAVE_WORST_LATENCY_NUM:begin
845
            data_a = worst_latency;
846
            we_a   = 1;
847
            ns= ASSET_DONE;
848
         end
849
         */
850
         ASSET_DONE: begin
851
              done_next =1'b1;
852
              stop=1'b1;
853
         end
854
         endcase
855
      end//always
856
 
857
 
858
 
859
    always @(posedge clk) begin
860
        if(reset)begin
861
            ps      <=  IDEAL;
862
            addr_a  <={Aw{1'b0}};
863
            pck_number_sent<={PCK_CNTw{1'b0}};
864
            done<=1'b0;
865
            total_latency_cnt<=64'd0;
866
            total_pck_recieved<=64'd0;
867
            total_pck_sent<=64'd0;
868
            ram_counter<= 32'd0;
869
            nvalid_dest<=1'b0;
870
            reset_pck_number_sent_old<=1'b0;
871
            worst_latency<={CLK_CNTw{1'b0}};
872
        end else begin
873
            ps      <=  ns;
874
            addr_a<= addr_a_next;
875
            pck_number_sent<= pck_number_sent_next;
876
            done <=done_next;
877
            total_latency_cnt<= total_latency_cnt_next;
878
            total_pck_recieved<= total_pck_recieved_next;
879
            total_pck_sent<= total_pck_sent_next;
880
            ram_counter<= ram_counter_next;
881
            nvalid_dest<=nvalid_dest_next;
882
            reset_pck_number_sent_old<=reset_pck_number_sent;
883
            worst_latency<=worst_latency_next;
884
        end
885
     end
886
 
887
 
888
 
889
endmodule
890
 
891
 
892
 
893
 
894
 
895
/***********************
896
*
897
*   jtag_emulator_controller
898
*
899
***********************/
900
 
901
 
902
 
903
module jtag_emulator_controller #(
904
    parameter VJTAG_INDEX=125,
905
    parameter Dw=32,
906
    parameter Aw=32
907
 
908
)(
909
    clk,
910
    reset,
911
    //wishbone master interface signals
912
 
913
    dat_o,
914
    addr_o,
915
    we_o,
916
    q_i
917
);
918
 
919
    //IO declaration
920
    input reset,clk;
921
 
922
 
923
    //wishbone master interface signals
924
 
925
    output  [Dw-1            :   0] dat_o;
926
    output  [Aw-1          :   0] addr_o;
927
    output  we_o;
928
    input   [Dw-1           :  0]   q_i;
929
 
930
 
931
 
932
    localparam STATE_NUM=3,
933
                  IDEAL =1,
934
                  WB_WR_DATA=2,
935
                  WB_RD_DATA=4;
936
 
937
    reg [STATE_NUM-1    :   0] ps,ns;
938
 
939
    wire [Dw-1  :0] data_out,  data_in;
940
    wire  wb_wr_addr_en,  wb_wr_data_en,    wb_rd_data_en;
941
    reg wr_mem_en,    wb_cap_rd;
942
 
943
    reg [Aw-1   :   0]  wb_addr,wb_addr_next;
944
    reg [Dw-1   :   0]  wb_wr_data,wb_rd_data;
945
    reg wb_addr_inc;
946
 
947
 
948
 
949
    assign  we_o                = wr_mem_en;
950
    assign  dat_o           = wb_wr_data;
951
    assign  addr_o          = wb_addr;
952
    assign  data_in             = wb_rd_data;
953
//vjtag vjtag signals declaration
954
 
955
 
956
localparam VJ_DW= (Dw > Aw)? Dw : Aw;
957
 
958
 
959
    vjtag_ctrl #(
960
        .DW(VJ_DW),
961
        .VJTAG_INDEX(VJTAG_INDEX)
962
    )
963
    vjtag_ctrl_inst
964
    (
965
        .clk(clk),
966
        .reset(reset),
967
        .data_out(data_out),
968
        .data_in(data_in),
969
        .wb_wr_addr_en(wb_wr_addr_en),
970
        .wb_wr_data_en(wb_wr_data_en),
971
        .wb_rd_data_en(wb_rd_data_en),
972
        .status_i( )
973
    );
974
 
975
 
976
 
977
    always @(posedge clk or posedge reset) begin
978
        if(reset) begin
979
            wb_addr <= {Aw{1'b0}};
980
            wb_wr_data  <= {Dw{1'b0}};
981
            ps <= IDEAL;
982
        end else begin
983
            wb_addr <= wb_addr_next;
984
            ps <= ns;
985
            if(wb_wr_data_en) wb_wr_data  <= data_out;
986
            if(wb_cap_rd) wb_rd_data <= q_i;
987
        end
988
    end
989
 
990
 
991
    always @(*)begin
992
        wb_addr_next= wb_addr;
993
        if(wb_wr_addr_en) wb_addr_next = data_out [Aw-1 :   0];
994
        else if (wb_addr_inc)  wb_addr_next =   wb_addr + 1'b1;
995
    end
996
 
997
 
998
 
999
    always @(*)begin
1000
        ns=ps;
1001
        wr_mem_en =1'b0;
1002
 
1003
        wb_addr_inc=1'b0;
1004
        wb_cap_rd=1'b0;
1005
        case(ps)
1006
        IDEAL : begin
1007
            if(wb_wr_data_en) ns= WB_WR_DATA;
1008
            if(wb_rd_data_en) ns= WB_RD_DATA;
1009
        end
1010
        WB_WR_DATA: begin
1011
            wr_mem_en =1'b1;
1012
            ns=IDEAL;
1013
            wb_addr_inc=1'b1;
1014
 
1015
        end
1016
        WB_RD_DATA: begin
1017
 
1018
            wb_cap_rd=1'b1;
1019
            ns=IDEAL;
1020
                //wb_addr_inc=1'b1;
1021
 
1022
        end
1023
        endcase
1024
    end
1025
 
1026
    //assign led={wb_addr[7:0], wb_wr_data[7:0]};
1027
 
1028
endmodule
1029
 
1030
 
1031
 
1032
 
1033
 
1034
 
1035
 
1036
 
1037
module start_delay_gen #(
1038
        parameter NC     =      64 //number of cores
1039
 
1040
)(
1041
        clk,
1042
        reset,
1043
        start_i,
1044
        start_o
1045
);
1046
 
1047
        input reset,clk,start_i;
1048
        output [NC-1    :       0] start_o;
1049
        reg start_i_reg;
1050
        wire start;
1051
        wire cnt_increase;
1052
        reg  [NC-1      :       0] start_o_next;
1053
        reg [NC-1       :       0] start_o_reg;
1054
 
1055
        assign start= start_i_reg|start_i;
1056
 
1057
        always @(*)begin
1058
                if(NC[0]==1'b0)begin // odd
1059
                        start_o_next={start_o[NC-3:0],start_o[NC-2],start};
1060
                end else begin //even
1061
                        start_o_next={start_o[NC-3:0],start_o[NC-1],start};
1062
 
1063
                end
1064
        end
1065
 
1066
        reg [2:0] counter;
1067
        assign cnt_increase=(counter==3'd0);
1068
        always @(posedge clk or posedge reset) begin
1069
                if(reset) begin
1070
 
1071
                        start_o_reg             <= {NC{1'b0}};
1072
                        start_i_reg     <=1'b0;
1073
                        counter         <=3'd0;
1074
                end else begin
1075
                   counter              <= counter+3'd1;
1076
                   start_i_reg  <=start_i;
1077
                        if(cnt_increase | start) start_o_reg <=start_o_next;
1078
 
1079
 
1080
                end//reset
1081
        end //always
1082
 
1083
        assign start_o=(cnt_increase | start)? start_o_reg : {NC{1'b0}};
1084
 
1085
endmodule

powered by: WebSVN 2.1.0

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