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.sv] - Blame information for rev 56

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 56 alirezamon
`include "pronoc_def.v"
9 48 alirezamon
 
10 56 alirezamon
module  noc_emulator
11 48 alirezamon
 #(
12 56 alirezamon
    parameter NOC_ID=0,
13 48 alirezamon
    // simulation
14
    parameter PATTERN_VJTAG_INDEX=125,
15
    parameter STATISTIC_VJTAG_INDEX=124
16
)(
17
    jtag_ctrl_reset,
18
    start_o,
19
    reset,
20
    clk,
21
    done
22
);
23
 
24 56 alirezamon
    `NOC_CONF
25 48 alirezamon
 
26
        parameter MAX_RATIO = 100;
27
    parameter RAM_Aw=7;
28
    parameter STATISTIC_NUM=8;
29
 
30
 
31
    input reset,jtag_ctrl_reset,clk;
32
    output done;
33 56 alirezamon
    output start_o;
34 48 alirezamon
 
35
    localparam
36
        PCK_CNTw =30,  // 1 G packets
37
        PCK_SIZw =14,   // 16 K flit
38
        MAX_EAw  =8,
39 56 alirezamon
        MAX_Cw   =4;   // 16 message classes
40 48 alirezamon
 
41
   //localparam  MAX_SIM_CLKs  = 1_000_000_000;
42
 
43
    reg start_i;
44
    reg [10:0] cnt;
45
 
46 56 alirezamon
    assign start_o=start_i;
47 48 alirezamon
 
48
 
49
    //noc connection channels
50
    smartflit_chanel_t chan_in_all  [NE-1 : 0];
51
        smartflit_chanel_t chan_out_all [NE-1 : 0];
52
 
53 56 alirezamon
        noc_top  # (
54
                .NOC_ID(NOC_ID)
55
        ) the_top (
56 48 alirezamon
                .reset(reset),
57
                .clk(clk),
58
                .chan_in_all(chan_in_all),
59 54 alirezamon
                .chan_out_all(chan_out_all),
60
                .router_event()
61 48 alirezamon
        );
62
 
63
   Jtag_traffic_gen #(
64 56 alirezamon
        .NOC_ID(NOC_ID),
65 48 alirezamon
        .PATTERN_VJTAG_INDEX(PATTERN_VJTAG_INDEX),
66
        .STATISTIC_VJTAG_INDEX(STATISTIC_VJTAG_INDEX),
67
                .MAX_RATIO(MAX_RATIO),
68
        .RAM_Aw(RAM_Aw),
69
        .STATISTIC_NUM(STATISTIC_NUM),  // the last 8 rows of RAM is reserved for collecting statistic values;
70
        .PCK_CNTw(PCK_CNTw),  // 1 G packets
71
        .PCK_SIZw(PCK_SIZw),   // 16 K flit
72
        .MAX_EAw(MAX_EAw),   // 16 nodes in x dimension
73
        .MAX_Cw(MAX_Cw)   // 16 message class
74
    )
75
    the_traffic_gen
76
    (
77
 
78
        .start_i(start_i),
79
        .jtag_ctrl_reset(jtag_ctrl_reset),
80
        .reset(reset),
81
        .clk(clk),
82
        .done(done),
83
                //noc
84
        .chan_in_all(chan_out_all),
85
                .chan_out_all(chan_in_all)
86
    );
87
 
88
 
89
  always @(posedge clk or posedge reset) begin
90
        if(reset) begin
91
            cnt     <=0;
92
            start_i   <=0;
93
       end else begin
94
             if(cnt < 1020) cnt<=  cnt+1'b1;
95
             if(cnt== 1000)begin
96
                    start_i<=1'b1;
97
             end else if(cnt== 1010)begin
98
                    start_i<=1'b0;
99
             end
100
        end
101
    end
102
endmodule
103
 
104
 
105
 
106
/***************
107
    Jtag_traffic_gen:
108
    A traffic generator which can be programed using JTAG port
109
 
110
****************/
111
 
112
module  Jtag_traffic_gen
113
#(
114 56 alirezamon
    parameter NOC_ID = 0,
115 48 alirezamon
    parameter PATTERN_VJTAG_INDEX=125,
116
    parameter STATISTIC_VJTAG_INDEX=124,
117
    parameter RAM_Aw=7,
118
    parameter STATISTIC_NUM=8,
119
    parameter MAX_RATIO = 100,
120
    parameter PCK_CNTw =30,  // 1 G packets
121
    parameter PCK_SIZw =14,   // 16 K flit
122
    parameter MAX_EAw    =8,
123
    parameter MAX_Cw    =4   // 16 message class
124
)
125
(
126
    chan_in_all,
127
        chan_out_all,
128
 
129
    done,
130
    start_i,
131
    jtag_ctrl_reset,
132
    reset,
133
    clk
134
);
135
 
136 56 alirezamon
`NOC_CONF
137 48 alirezamon
 
138
 
139
 
140
    input  reset,jtag_ctrl_reset, clk;
141
    input  start_i;
142
    output done;
143
 
144
    // NOC interfaces
145
    input  smartflit_chanel_t chan_in_all  [NE-1 : 0];
146
        output smartflit_chanel_t chan_out_all [NE-1 : 0];
147
 
148
 
149
 
150
    wire [NE-1 :   0]  start;
151
    wire [NE-1      :   0]  done_sep;
152
    assign done = &done_sep;
153
 
154
    start_delay_gen #(
155
        .NC(NE) //number of cores
156
 
157
    )
158
    st_gen
159
    (
160
        .clk(clk),
161
        .reset(reset),
162
        .start_i(start_i),
163
        .start_o(start)
164
    );
165
 
166
    //jtag pattern controller
167
 
168
    localparam
169
                NEw=$clog2(NE),
170
                Dw=64,
171
        Aw =RAM_Aw;
172
 
173
    wire [Dw-1 :   0] jtag_data ;
174
    wire [Aw-1 :   0] jtag_addr ;
175
    wire              jtag_we;
176
    wire [Dw-1 :   0] jtag_q ;
177
    wire [NEw-1:   0] jtag_RAM_select;
178
    wire [NE-1 :   0] jtag_we_sep;
179
    wire [Dw-1 :   0] jtag_q_sep   [NE-1  :   0];
180
 
181
    assign jtag_q = jtag_q_sep[jtag_RAM_select];
182
 
183
 
184
    jtag_emulator_controller #(
185
        .VJTAG_INDEX(PATTERN_VJTAG_INDEX),
186
        .Dw(Dw),
187
        .Aw(Aw+NEw)
188
    )
189
    pttern_jtag_controller
190
    (
191
        .dat_o(jtag_data),
192
        .addr_o({jtag_RAM_select,jtag_addr}),
193
        .we_o(jtag_we),
194
        .q_i(jtag_q),
195
        .clk(clk),
196
        .reset(jtag_ctrl_reset)
197
    );
198
 
199
 
200
 
201
    //jtag statistic reader
202
 
203
 
204
    localparam
205
                STATISw=log2(STATISTIC_NUM);
206
 
207
 
208
    wire [STATISw-1 :   0] statis_jtag_addr ;
209
    wire [Dw-1 :   0] statis_jtag_data_i;
210
    wire [NEw-1:   0] statis_jtag_select;
211
    wire [Dw-1 :   0] statis_jtag_q_sep   [NE-1  :   0];
212
 
213
    assign statis_jtag_data_i = statis_jtag_q_sep[statis_jtag_select];
214
 
215
   jtag_emulator_controller #(
216
        .VJTAG_INDEX(STATISTIC_VJTAG_INDEX),
217
        .Dw(Dw),
218
        .Aw(STATISw+NEw)
219
 
220
   )
221
   jtag_statistic_reader
222
   (
223
        .dat_o(),
224
        .addr_o({statis_jtag_select,statis_jtag_addr}),
225
        .we_o( ),
226
        .q_i(statis_jtag_data_i),
227
        .clk(clk),
228
        .reset(jtag_ctrl_reset)
229
   );
230
 
231
   function integer addrencode;
232
        input integer pos,k,n,kw;
233
        integer pow,i,tmp;begin
234
        addrencode=0;
235
        pow=1;
236
        for (i = 0; i 
237
            tmp=(pos/pow);
238
            tmp=tmp%k;
239
            tmp=tmp<
240
            addrencode=addrencode | tmp;
241
            pow=pow * k;
242
        end
243
        end
244
    endfunction
245
 
246
 
247
    genvar i;
248
    generate
249
    for (i=0;   i
250
 
251
        wire [EAw-1 : 0] current_e_addr [NE-1 : 0];
252
 
253
        endp_addr_encoder #(
254
                .TOPOLOGY(TOPOLOGY),
255
                .T1(T1),
256
                .T2(T2),
257
                .T3(T3),
258
                .EAw(EAw),
259
                .NE(NE)
260
        )
261
        encoder
262
        (
263
                .id(i[NEw-1 : 0]),
264
                .code(current_e_addr[i])
265
        );
266
 
267
 
268
        // seperate interfaces per router
269
        assign jtag_we_sep[i] = (jtag_RAM_select == i) ? jtag_we :1'b0;
270
 
271
        traffic_gen_ram #(
272 56 alirezamon
            .NOC_ID(NOC_ID),
273 48 alirezamon
                .RAM_Aw(RAM_Aw),
274
            .STATISTIC_NUM(STATISTIC_NUM),
275
                .MAX_RATIO(MAX_RATIO),
276
                .PCK_CNTw(PCK_CNTw),  // 1 G packets
277
            .PCK_SIZw(PCK_SIZw),   // 16 K flit
278
            .MAX_EAw(MAX_EAw),
279
            .MAX_Cw(MAX_Cw)   // 16 message cla
280
          )
281
          traffic_gen_ram_inst
282
          (
283
                .reset(reset),
284
                .clk(clk),
285
                .current_r_addr(chan_in_all[i].ctrl_chanel.neighbors_r_addr),
286
            .current_e_addr(current_e_addr[i]),
287
                .start(start[i]),
288
                .done(done_sep[i]),
289
                //pattern updater
290
                .jtag_data_b(jtag_data),
291
                .jtag_addr_b(jtag_addr),
292
                .jtag_we_b( jtag_we_sep[i]),
293
                .jtag_q_b(  jtag_q_sep[i]),
294
                //statistic reader
295
                .statistic_jtag_addr_b(statis_jtag_addr),
296
            .statistic_jtag_q_b( statis_jtag_q_sep[i]),
297
                //noc interface
298
                        .chan_in (chan_in_all[i]),
299
                        .chan_out(chan_out_all[i])
300
 
301
          );
302
    end
303
    endgenerate
304
 
305
endmodule
306
 
307
 
308
 
309
/********************
310
*
311
*   traffic_gen_ram
312
*
313
*********************/
314
 
315
module  traffic_gen_ram
316
#(
317 56 alirezamon
    parameter NOC_ID=0,
318 48 alirezamon
    parameter RAM_Aw=7,
319
    parameter STATISTIC_NUM=8,  // the last 8 rows of RAM is reserved for collecting statistic values;
320
    parameter MAX_RATIO=100,
321
    parameter PCK_CNTw =30,  // 1 G packets
322
    parameter PCK_SIZw =14,   // 16 K flit
323
    parameter MAX_EAw    =8,
324
    parameter MAX_Cw    =4  // 16 message class
325
 
326
)
327
(
328
 
329
    done,
330
    current_r_addr,
331
    current_e_addr,
332
    start,
333
 
334
   //noc port
335
    chan_in,
336
        chan_out,
337
 
338
    //Pattern RAM to jtag interface
339
    jtag_data_b,
340
    jtag_addr_b,
341
    jtag_we_b,
342
    jtag_q_b,
343
 
344
    // Statistic to jtag interface
345
    statistic_jtag_addr_b,
346
    statistic_jtag_q_b,
347
 
348
    reset,
349
    clk
350
);
351
 
352 56 alirezamon
    `NOC_CONF
353
 
354 48 alirezamon
 
355
 
356
  //  localparam   MAX_PATTERN =  (2**RAM_Aw)-1;   // support up to MAX_PATTERN different injections pattern
357
 
358
 
359
 
360
 
361
      //define maximum width for each parameter of packet injector
362
 
363
    localparam    RATIOw   =7;   // log2(100)
364
 
365
    localparam  Dw=PCK_CNTw+ RATIOw + PCK_SIZw + MAX_EAw + MAX_Cw  +1;//=64
366
    localparam  Aw=RAM_Aw;
367
    localparam  STATISw=log2(STATISTIC_NUM);
368
 
369
    localparam
370
        STATE_NUM=5,
371
        IDEAL =1,
372
        WAIT1 = 2,
373
        WAIT2 = 4,
374
        SEND_PCK=8,
375
        /*
376
        SAVE_SENT_PCK_NUM=4,
377
        SAVE_RSVD_PCK_NUM=8,
378
        SAVE_TOTAL_LATENCY_NUM=16,
379
        SAVE_WORST_LATENCY_NUM=32,
380
        */
381
        ASSET_DONE=16;
382
 
383
    localparam
384
        CLK_CNTw = log2(MAX_SIM_CLKs+1),
385
        MAX_PCK_NUM   = (2**PCK_CNTw)-1,
386
        MAX_PCK_SIZ   = (2**PCK_SIZw)-1;  // max packet size
387
 
388
    localparam [Aw-1    :   0]
389
        RAM_CNT_ADDR = 0,
390
        PATTERN_START_ADDR=1,
391
 //       PATTERN_END_ADDR=  MAX_PATTERN,
392
        SENT_PCK_ADDR = 0,
393
        RSVD_PCK_ADDR = 1,
394
        TOTAL_LATENCY_ADDR  = 2,
395
        WORST_LATENCY_ADDR  = 3;
396
 
397
 
398
    input                               reset, clk;
399
    // the connected router address
400
    input  [RAw-1                   :0] current_r_addr;
401
    // the current endpoint address
402
    input  [EAw-1                   :0] current_e_addr;
403
 
404
 
405
 
406
    input                               start;
407
 
408
    output  reg done;
409
    reg done_next;
410
 
411
    input [Dw-1 :   0]  jtag_data_b;
412
    input [Aw-1 :   0]  jtag_addr_b;
413
    input jtag_we_b;
414
    output [Dw-1 :   0] jtag_q_b;
415
 
416
    input [STATISw-1    :   0] statistic_jtag_addr_b;
417
    output reg [Dw-1 :   0] statistic_jtag_q_b;
418
 
419
 
420
 
421
    // NOC interfaces
422
    input   smartflit_chanel_t  chan_in;
423
        output  smartflit_chanel_t      chan_out;
424
 
425
 
426
 
427
    wire [Dw-1  :   0] q_a;
428
    reg  [Aw-1  :   0] addr_a,addr_a_next;
429
    reg                we_a;
430
    reg  [Dw-1  :   0] data_a;
431
 
432
 
433
    wire  [PCK_CNTw-1 :0] pck_num_to_send_in;
434
    wire  [RATIOw-1 :0] ratio,ratio_in;
435
    wire  [PCK_SIZw-1 :0] pck_size_in;
436
    wire  [MAX_EAw-1  :0] dest_e_in;
437
    wire  [MAX_Cw-1   :0] pck_class_in;
438
    wire  last_adr_in;
439
 
440
    assign {pck_num_to_send_in,ratio_in, pck_size_in,dest_e_in, pck_class_in, last_adr_in}= q_a;
441
 
442
    wire  [EAw-1                    :0] dest_e_addr = dest_e_in [EAw-1                    :0];
443
    wire  [Cw-1                    :0] pck_class= pck_class_in[Cw-1                :0];
444
 
445
 
446
    wire [CLK_CNTw-1              :0] time_stamp_h2t;
447
    wire sent_done, update;
448
    reg  [ STATE_NUM-1 :   0]  ps,ns;
449
    reg  [63    :   0] total_pck_recieved,total_pck_recieved_next,total_pck_sent,total_pck_sent_next;
450
    reg  [63    :   0] total_latency_cnt,total_latency_cnt_next;
451
    reg  [31    :   0] ram_counter,ram_counter_next;
452
    reg  [PCK_CNTw-1 : 0] pck_number_sent,pck_number_sent_next;
453
    reg  [CLK_CNTw-1 : 0] worst_latency,worst_latency_next;
454
 
455
    reg nvalid_dest,reset_pck_number_sent_old;
456
    wire nvalid_dest_next= (current_e_addr==dest_e_addr && ps!=IDEAL && ps!=WAIT1);
457
    wire reset_pck_number_sent= ((pck_number_sent==pck_num_to_send_in) | nvalid_dest) & ~reset_pck_number_sent_old;
458
    reg stop;
459
        assign ratio=(ps==SEND_PCK)?  ratio_in : {RATIOw{1'b0}};
460
 
461
    dual_port_ram #(
462
        .Dw (Dw),
463
        .Aw (Aw)
464
    )
465
    the_ram
466
    (
467
        .clk        (clk),
468
         //port a
469
        .data_a     (data_a),
470
        .addr_a     (addr_a),
471
        .we_a       (we_a),
472
        .q_a        (q_a),
473
 
474
        //port b connected to the jtag
475
        .data_b     (jtag_data_b),
476
        .addr_b     (jtag_addr_b),
477
        .we_b       (jtag_we_b),
478
        .q_b        (jtag_q_b)
479
    );
480
 
481
 wire start_traffic;
482
 reg [3:0] counter;
483
 
484
 always @(posedge clk or posedge reset) begin
485
    if(reset)  counter <=4'd0;
486
    else begin
487
        if(start)  counter <=4'd1;
488
        else if(counter> 4'd0 &&  counter<=4'b1111) counter <=counter+1'b1;
489
    end
490
 end
491
 
492
 assign start_traffic = counter == 4'b1100; // delaied for 12 clock cycles
493
 
494
 
495
  traffic_gen_top #(
496 56 alirezamon
        .NOC_ID(NOC_ID),
497 48 alirezamon
        .MAX_RATIO(MAX_RATIO)
498
    )
499
    the_traffic_gen
500
    (
501
 
502
        .reset(reset),
503
        .clk(clk),
504
        //input
505
        .ratio (ratio),
506
        .start(start_traffic),
507
        .stop(stop),
508
        .pck_size_in(pck_size_in),
509
        .current_e_addr(current_e_addr),
510
        .dest_e_addr(dest_e_addr),
511
        .pck_class_in(pck_class),
512
        .init_weight({WEIGHTw{1'b0}}),
513
        .report ( ),
514
 
515
        //output
516
        .update(update), // update the noc_analayzer
517
        .src_e_addr( ),
518
        .pck_number( ),
519
        .sent_done(sent_done), // tail flit has been sent
520
        .hdr_flit_sent( ),
521
        .distance( ),
522
        .pck_class_out( ),
523
        .time_stamp_h2h( ),
524
        .time_stamp_h2t(time_stamp_h2t),
525
        .flit_out_class(),
526
         //noc
527
         .chan_in(chan_in),
528
                 .chan_out(chan_out),
529 54 alirezamon
                 .mcast_dst_num_o()
530 48 alirezamon
 
531
 
532
    );
533
 
534
    always @ (*)begin
535
        case (statistic_jtag_addr_b)
536
            SENT_PCK_ADDR: statistic_jtag_q_b=  total_pck_sent;
537
            RSVD_PCK_ADDR: statistic_jtag_q_b=  total_pck_recieved;
538
            TOTAL_LATENCY_ADDR: statistic_jtag_q_b= total_latency_cnt;
539
            WORST_LATENCY_ADDR: statistic_jtag_q_b= worst_latency;
540
            default: statistic_jtag_q_b= worst_latency;
541
         endcase
542
    end
543
 
544
 
545
 
546
 
547
     always @ (*)begin
548
         ns=ps;
549
         addr_a_next =  addr_a;
550
         pck_number_sent_next = pck_number_sent;
551
         done_next =done;
552
         total_latency_cnt_next = total_latency_cnt;
553
         worst_latency_next = worst_latency;
554
         total_pck_recieved_next = total_pck_recieved;
555
         total_pck_sent_next = total_pck_sent;
556
         ram_counter_next = ram_counter;
557
         data_a = total_pck_sent;
558
         we_a = 0;
559
         stop=1'b0;
560
 
561
         if(update)begin
562
                total_latency_cnt_next = total_latency_cnt + time_stamp_h2t;
563
                if(time_stamp_h2t >worst_latency ) worst_latency_next=time_stamp_h2t;
564
                total_pck_recieved_next =total_pck_recieved+1'b1;
565
         end
566
 
567
         if(sent_done)begin
568
                 pck_number_sent_next =pck_number_sent+1'b1;
569
                 total_pck_sent_next  =total_pck_sent+1'b1;
570
         end
571
 
572
 
573
         case(ps)
574
         IDEAL : begin
575
              done_next =1'b0;
576
              addr_a_next =RAM_CNT_ADDR;
577
              ram_counter_next = q_a[31:0];  // first ram data shows how many times the RAM is needed to ne read
578
              if( start) begin
579
                    addr_a_next=PATTERN_START_ADDR;
580
                    ns= WAIT1;
581
              end
582
 
583
         end//IDEAL
584
         WAIT1 : begin
585
            ns= WAIT2;
586
 
587
         end
588
         WAIT2 : begin
589
            ns= SEND_PCK;
590
 
591
         end
592
         SEND_PCK: begin
593
            if (reset_pck_number_sent) begin
594
                 pck_number_sent_next={PCK_CNTw{1'b0}};
595
                 if(last_adr_in)begin
596
                     if(ram_counter==0)begin
597
                       ns = ASSET_DONE;// SAVE_SENT_PCK_NUM;
598
                       //addr_a_next = SENT_PCK_ADDR;
599
                     end else addr_a_next = 1;
600
                     ram_counter_next=ram_counter-1'b1;
601
               end else begin
602
                    addr_a_next=addr_a+1'b1;
603
 
604
               end
605
 
606
            end
607
 
608
 
609
 
610
 
611
 
612
         end//SEND_PCk
613
         /*
614
         SAVE_SENT_PCK_NUM: begin
615
            data_a = total_pck_sent;
616
            we_a   = 1;
617
            addr_a_next =RSVD_PCK_ADDR ;
618
            ns= SAVE_RSVD_PCK_NUM;
619
 
620
         end
621
         SAVE_RSVD_PCK_NUM: begin
622
            data_a = total_pck_recieved;
623
            addr_a_next =TOTAL_LATENCY_ADDR;
624
            we_a   = 1;
625
            ns= SAVE_TOTAL_LATENCY_NUM;
626
 
627
 
628
         end
629
         SAVE_TOTAL_LATENCY_NUM:  begin
630
            data_a = total_latency_cnt;
631
            addr_a_next =WORST_LATENCY_ADDR;
632
            we_a   = 1;
633
            ns=SAVE_WORST_LATENCY_NUM;
634
 
635
 
636
         end
637
         SAVE_WORST_LATENCY_NUM:begin
638
            data_a = worst_latency;
639
            we_a   = 1;
640
            ns= ASSET_DONE;
641
         end
642
         */
643
         ASSET_DONE: begin
644
              done_next =1'b1;
645
              stop=1'b1;
646
         end
647
         endcase
648
      end//always
649
 
650
 
651
 
652
    always @(posedge clk) begin
653
        if(reset)begin
654
            ps      <=  IDEAL;
655
            addr_a  <={Aw{1'b0}};
656
            pck_number_sent<={PCK_CNTw{1'b0}};
657
            done<=1'b0;
658
            total_latency_cnt<=64'd0;
659
            total_pck_recieved<=64'd0;
660
            total_pck_sent<=64'd0;
661
            ram_counter<= 32'd0;
662
            nvalid_dest<=1'b0;
663
            reset_pck_number_sent_old<=1'b0;
664
            worst_latency<={CLK_CNTw{1'b0}};
665
        end else begin
666
            ps      <=  ns;
667
            addr_a<= addr_a_next;
668
            pck_number_sent<= pck_number_sent_next;
669
            done <=done_next;
670
            total_latency_cnt<= total_latency_cnt_next;
671
            total_pck_recieved<= total_pck_recieved_next;
672
            total_pck_sent<= total_pck_sent_next;
673
            ram_counter<= ram_counter_next;
674
            nvalid_dest<=nvalid_dest_next;
675
            reset_pck_number_sent_old<=reset_pck_number_sent;
676
            worst_latency<=worst_latency_next;
677
        end
678
     end
679
 
680
 
681
 
682
endmodule
683
 
684
 
685
 
686
 
687
 
688
/***********************
689
*
690
*   jtag_emulator_controller
691
*
692
***********************/
693
 
694
 
695
 
696
module jtag_emulator_controller #(
697
    parameter VJTAG_INDEX=125,
698
    parameter Dw=32,
699
    parameter Aw=32
700
 
701
)(
702
    clk,
703
    reset,
704
    //wishbone master interface signals
705
 
706
    dat_o,
707
    addr_o,
708
    we_o,
709
    q_i
710
);
711
 
712
    //IO declaration
713
    input reset,clk;
714
 
715
 
716
    //wishbone master interface signals
717
 
718
    output  [Dw-1            :   0] dat_o;
719
    output  [Aw-1          :   0] addr_o;
720
    output  we_o;
721
    input   [Dw-1           :  0]   q_i;
722
 
723
 
724
 
725
    localparam STATE_NUM=3,
726
                  IDEAL =1,
727
                  WB_WR_DATA=2,
728
                  WB_RD_DATA=4;
729
 
730
    reg [STATE_NUM-1    :   0] ps,ns;
731
 
732
    wire [Dw-1  :0] data_out,  data_in;
733
    wire  wb_wr_addr_en,  wb_wr_data_en,    wb_rd_data_en;
734
    reg wr_mem_en,    wb_cap_rd;
735
 
736
    reg [Aw-1   :   0]  wb_addr,wb_addr_next;
737
    reg [Dw-1   :   0]  wb_wr_data,wb_rd_data;
738
    reg wb_addr_inc;
739
 
740
 
741
 
742
    assign  we_o                = wr_mem_en;
743
    assign  dat_o           = wb_wr_data;
744
    assign  addr_o          = wb_addr;
745
    assign  data_in             = wb_rd_data;
746
//vjtag vjtag signals declaration
747
 
748
 
749
localparam VJ_DW= (Dw > Aw)? Dw : Aw;
750
 
751
 
752
    vjtag_ctrl #(
753
        .DW(VJ_DW),
754
        .VJTAG_INDEX(VJTAG_INDEX)
755
    )
756
    vjtag_ctrl_inst
757
    (
758
        .clk(clk),
759
        .reset(reset),
760
        .data_out(data_out),
761
        .data_in(data_in),
762
        .wb_wr_addr_en(wb_wr_addr_en),
763
        .wb_wr_data_en(wb_wr_data_en),
764
        .wb_rd_data_en(wb_rd_data_en),
765
        .status_i( )
766
    );
767
 
768
 
769
 
770
    always @(posedge clk or posedge reset) begin
771
        if(reset) begin
772
            wb_addr <= {Aw{1'b0}};
773
            wb_wr_data  <= {Dw{1'b0}};
774
            ps <= IDEAL;
775
        end else begin
776
            wb_addr <= wb_addr_next;
777
            ps <= ns;
778
            if(wb_wr_data_en) wb_wr_data  <= data_out;
779
            if(wb_cap_rd) wb_rd_data <= q_i;
780
        end
781
    end
782
 
783
 
784
    always @(*)begin
785
        wb_addr_next= wb_addr;
786
        if(wb_wr_addr_en) wb_addr_next = data_out [Aw-1 :   0];
787
        else if (wb_addr_inc)  wb_addr_next =   wb_addr + 1'b1;
788
    end
789
 
790
 
791
 
792
    always @(*)begin
793
        ns=ps;
794
        wr_mem_en =1'b0;
795
 
796
        wb_addr_inc=1'b0;
797
        wb_cap_rd=1'b0;
798
        case(ps)
799
        IDEAL : begin
800
            if(wb_wr_data_en) ns= WB_WR_DATA;
801
            if(wb_rd_data_en) ns= WB_RD_DATA;
802
        end
803
        WB_WR_DATA: begin
804
            wr_mem_en =1'b1;
805
            ns=IDEAL;
806
            wb_addr_inc=1'b1;
807
 
808
        end
809
        WB_RD_DATA: begin
810
 
811
            wb_cap_rd=1'b1;
812
            ns=IDEAL;
813
                //wb_addr_inc=1'b1;
814
 
815
        end
816
        endcase
817
    end
818
 
819
    //assign led={wb_addr[7:0], wb_wr_data[7:0]};
820
 
821
endmodule
822
 
823
 
824
 
825
 

powered by: WebSVN 2.1.0

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