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 48

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

powered by: WebSVN 2.1.0

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