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_peripheral/] [jtag/] [jtag_uart/] [pronoc_jtag_uart.v] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
/**************************************
2
* Module: pronoc_jtag_uart
3
* Date:2020-04-11
4
* Author: alireza
5
*
6
* Description:
7
***************************************/
8
 
9
 
10
// synthesis translate_off
11
`timescale 1ns / 1ps
12
// synthesis translate_on
13
 
14
 
15
 
16
module  pronoc_jtag_uart #(
17
    //wb parameter 
18
    parameter Aw           =   1,
19
    parameter SELw         =   4,
20
    parameter TAGw         =   3,
21
    parameter Dw           =   32,
22
    //uart parameter    
23
    parameter BUFF_Aw      =   6,//max is 16
24
    //uart simulator param 
25
    parameter SIM_BUFFER_SIZE=100,
26
    parameter SIM_WAIT_COUNT    =10000,
27
    //jtag parameter
28
    parameter JTAG_CONNECT= "XILINX_JTAG_WB",//"ALTERA_JTAG_WB" ,"XILINX_JTAG_WB"  
29
    parameter JTAG_INDEX= 126,
30
    parameter JDw = 32,
31
    parameter JAw=32,
32
    parameter JINDEXw=8,
33
    parameter JSTATUSw=8,
34
    parameter J2WBw = (JTAG_CONNECT== "XILINX_JTAG_WB") ? 1+1+JDw+JAw : 1,
35
    parameter WB2Jw= (JTAG_CONNECT== "XILINX_JTAG_WB") ? 1+JSTATUSw+JINDEXw+1+JDw  : 1
36
 
37
)(
38
 //wb
39
  clk,
40
  reset,
41
 // wb_irq,
42
  wb_dat_o,
43
  wb_ack_o,
44
  wb_adr_i,
45
  wb_stb_i,
46
  wb_cyc_i,
47
  wb_we_i,
48
  wb_dat_i,
49
 
50
  //jtag 
51
  wb_to_jtag,
52
  jtag_to_wb,
53
 
54
  //rx interface for simulation
55
  RxD_din_sim,
56
  RxD_wr_sim,
57
  RxD_ready_sim
58
 
59
);
60
 
61
    //wb
62
    input            clk;
63
    input            reset;
64
  //  output           wb_irq;
65
    output  [ Dw-1: 0] wb_dat_o;
66
    output           wb_ack_o;
67
    input            wb_adr_i;
68
    input            wb_stb_i;
69
    input            wb_cyc_i;
70
    input            wb_we_i;
71
    input   [ Dw-1: 0] wb_dat_i;
72
 
73
 
74
    //jtag
75
    output [WB2Jw-1  : 0] wb_to_jtag;
76
    input  [J2WBw-1 : 0] jtag_to_wb;
77
 
78
    input [7:0 ] RxD_din_sim;
79
    input RxD_wr_sim;
80
    output RxD_ready_sim;
81
 
82
 
83
`ifdef MODEL_TECH
84
    `define RUN_SIM
85
`endif
86
`ifdef VERILATOR
87
    `define RUN_SIM
88
`endif
89
 
90
 
91
`ifdef  RUN_SIM
92
 
93
    altera_uart_simulator #(
94
        .BUFFER_SIZE(SIM_BUFFER_SIZE),
95
        .WAIT_COUNT(SIM_WAIT_COUNT)
96
    )
97
    Suart
98
    (
99
        .reset(reset),
100
        .clk(clk),
101
        .s_dat_i(wb_dat_i),
102
        .s_sel_i(4'b1111),
103
        .s_addr_i(wb_adr_i),
104
        .s_cti_i( ),
105
        .s_stb_i(wb_stb_i),
106
        .s_cyc_i(wb_cyc_i),
107
        .s_we_i(wb_we_i),
108
        .s_dat_o(wb_dat_o),
109
        .s_ack_o(wb_ack_o),
110
        .RxD_din(RxD_din_sim),
111
        .RxD_wr(RxD_wr_sim),
112
        .RxD_ready(RxD_ready_sim)
113
    );
114
 
115
 
116
`else
117
    pronoc_jtag_uart_hw #(
118
        .Aw(Aw),
119
        .SELw(SELw),
120
        .TAGw(TAGw),
121
        .Dw(Dw),
122
        .BUFF_Aw(BUFF_Aw),
123
        .JTAG_CONNECT(JTAG_CONNECT),
124
        .JTAG_INDEX(JTAG_INDEX),
125
        .JDw(JDw),
126
        .JAw(JAw),
127
        .JINDEXw(JINDEXw),
128
        .JSTATUSw(JSTATUSw),
129
        .J2WBw(J2WBw),
130
        .WB2Jw(WB2Jw)
131
    )
132
    uart_hw
133
    (
134
        .clk(clk),
135
        .reset(reset),
136
        .wb_dat_o(wb_dat_o),
137
        .wb_ack_o(wb_ack_o),
138
        .wb_adr_i(wb_adr_i),
139
        .wb_stb_i(wb_stb_i),
140
        .wb_cyc_i(wb_cyc_i),
141
        .wb_we_i(wb_we_i),
142
        .wb_dat_i(wb_dat_i),
143
        .wb_to_jtag(wb_to_jtag),
144
        .jtag_to_wb(jtag_to_wb)
145
    );
146
 
147
`endif
148
 
149
 
150
endmodule
151
 
152
 
153
 
154
 
155
 
156
 
157
 
158
 
159
module  pronoc_jtag_uart_hw #(
160
    //wb parameter 
161
    parameter Aw           =   1,
162
    parameter SELw         =   4,
163
    parameter TAGw         =   3,
164
    parameter Dw           =   32,
165
    //uart parameter    
166
    parameter BUFF_Aw      =   6,//max is 16
167
    //jtag parameter
168
    parameter JTAG_CONNECT= "XILINX_JTAG_WB",//"ALTERA_JTAG_WB" ,"XILINX_JTAG_WB"  
169
    parameter JTAG_INDEX= 126,
170
    parameter JDw = 32,
171
    parameter JAw=32,
172
    parameter JINDEXw=8,
173
    parameter JSTATUSw=8,
174
    parameter J2WBw = (JTAG_CONNECT== "XILINX_JTAG_WB") ? 1+1+JDw+JAw : 1,
175
    parameter WB2Jw= (JTAG_CONNECT== "XILINX_JTAG_WB") ? 1+JSTATUSw+JINDEXw+1+JDw  : 1
176
 
177
)(
178
 //wb
179
  clk,
180
  reset,
181
 // wb_irq,
182
  wb_dat_o,
183
  wb_ack_o,
184
  wb_adr_i,
185
  wb_stb_i,
186
  wb_cyc_i,
187
  wb_we_i,
188
  wb_dat_i,
189
 
190
  //jtag 
191
  wb_to_jtag,
192
  jtag_to_wb
193
 
194
 
195
);
196
 
197
    function integer log2;
198
      input integer number; begin
199
         log2=(number <=1) ? 1: 0;
200
         while(2**log2<number) begin
201
            log2=log2+1;
202
         end
203
      end
204
    endfunction // log2 
205
 
206
 
207
     //wb interface
208
    localparam
209
        DATA_REG = 1'b0,
210
        CONTROL_REG  = 1'b1 ,
211
        CONTROL_WSPACE_MSK = 32'hFFFF0000,
212
        DATA_RVALID_MSK = 32'h00008000,
213
        DATA_DATA_MSK = 32'h000000FF,
214
        B = 2 ** (BUFF_Aw-1),
215
        B_1 = B-1,
216
        Bw = log2(B),
217
        DEPTHw=log2(B+1);
218
 
219
 
220
    localparam  [Bw-1   :   0] Bint =   B_1[Bw-1    :   0];
221
 
222
    //wb
223
    input            clk;
224
    input            reset;
225
  //  output           wb_irq;
226
    output  reg[ Dw-1: 0] wb_dat_o;
227
    output    reg       wb_ack_o;
228
    input            wb_adr_i;
229
    input            wb_stb_i;
230
    input            wb_cyc_i;
231
    input            wb_we_i;
232
    input   [ Dw-1: 0] wb_dat_i;
233
 
234
 
235
    //jtag
236
    output [WB2Jw-1  : 0] wb_to_jtag;
237
    input  [J2WBw-1 : 0] jtag_to_wb;
238
 
239
     //control reg 
240
    wire [31 : 0] ctrl_reg;
241
    reg  [15 : 0] wspace;    // The number of spaces available in the write FIFO.
242
    reg  [15 : 0] jtag_wspace;    // The number of spaces available in the jtag write FIFO.
243
 
244
    assign ctrl_reg [31 :16] = wspace;
245
 
246
    wire [7:0]  w2j_fifo_dat_i,j2w_fifo_dat_o,j2w_fifo_dat_i,w2j_fifo_dat_o;
247
 
248
 
249
    //wb_wr_jtag_rd
250
 
251
    reg w2j_fifo_wr_en,w2j_fifo_rd_en;
252
    wire w2j_fifo_full, w2j_fifo_nearly_full, w2j_fifo_empty;
253
 
254
    //jtag_wr_wb_rd
255
 
256
    reg j2w_fifo_wr_en,j2w_fifo_rd_en;
257
    wire j2w_fifo_full, j2w_fifo_nearly_full, j2w_fifo_empty;
258
 
259
 
260
 
261
 
262
 
263
    wire [JSTATUSw-1 : 0] jtag_status_o;
264
    wire [JINDEXw-1 : 0] jtag_index_o;
265
    wire jtag_stb_i,jtag_we_i;
266
    wire [JDw-1 : 0] jtag_dat_i;
267
    wire [JDw-1 : 0] jtag_dat_o;
268
    wire [JAw-1 : 0] jtag_addr_i;
269
    reg jtag_ack_o;
270
    reg wb_rdat_valid;
271
 
272
 
273
    reg wb_ack_o_next,jtag_ack_o_next;
274
 
275
    localparam
276
        IDEAL=2'b01,
277
        WAIT =2'b10,
278
        ST_NUM=2;
279
 
280
    reg [ST_NUM-1:0] ps,ns;
281
 
282
    always @ (*) begin
283
        wb_ack_o_next =1'b0;
284
        w2j_fifo_wr_en =1'b0;
285
        j2w_fifo_rd_en=1'b0;
286
        wb_dat_o[7:0]=j2w_fifo_dat_o;
287
        wb_dat_o[15] = wb_rdat_valid;
288
        wb_dat_o[14:8] = ctrl_reg[14:8];
289
        wb_dat_o[31:16] = ctrl_reg[31:16];
290
        ns=ps;
291
        case(ps)
292
        IDEAL :begin
293
 
294
            if(wb_stb_i & wb_we_i ) begin
295
                    case(wb_adr_i)
296
                    DATA_REG:begin
297
                        if(~w2j_fifo_full)begin
298
                            w2j_fifo_wr_en=1'b1;
299
                            wb_ack_o_next =1'b1;
300
                            ns =WAIT;
301
                        end
302
                    end
303
                    CONTROL_REG:begin
304
                        // set the bits of control reg. //TODO add intrrupt control registers
305
                        wb_ack_o_next =1'b1;
306
                        ns =WAIT;
307
                    end
308
                    endcase
309
            end //sa_stb_i && sa_we_i
310
            if(wb_stb_i & ~wb_we_i ) begin
311
                    case(wb_adr_i)
312
                    DATA_REG:begin
313
                        wb_dat_o[7:0]=j2w_fifo_dat_o;
314
                        wb_dat_o[15] = wb_rdat_valid;
315
                        wb_ack_o_next =1'b1;
316
                        ns =WAIT;
317
                        if(~j2w_fifo_empty)begin
318
                            j2w_fifo_rd_en=1'b1;
319
                        end
320
                    end
321
                    CONTROL_REG:begin
322
                        // read control reg
323
                         wb_dat_o = ctrl_reg;
324
                         wb_ack_o_next =1'b1;
325
                         ns =WAIT;
326
                    end
327
                    endcase
328
            end
329
    end//IDEAL
330
    WAIT:begin // wait until stb deasserted
331
         if(~wb_stb_i) ns =IDEAL;
332
         // wb_ack_o_next =1'b1;
333
    end
334
    endcase
335
 
336
    end//always
337
 
338
    reg j2w_fifo_wr_en_next;
339
 
340
    reg stb1,stb2;
341
    wire jtag_stb_valid = stb1 & ~stb2;// fix jtag clock diffrence
342
 
343
    always @(*) begin
344
        j2w_fifo_wr_en_next=1'b0;
345
        jtag_ack_o_next =1'b0;
346
        w2j_fifo_rd_en=1'b0;
347
        if(jtag_stb_valid) begin
348
             w2j_fifo_rd_en=1'b1;
349
             jtag_ack_o_next =1'b1;
350
             if( ~j2w_fifo_full && j2w_fifo_dat_i[7:0]!=0) j2w_fifo_wr_en_next=1'b1;//make one cycle delay for wr enable
351
        end
352
 
353
    end
354
 
355
 
356
 
357
`ifdef SYNC_RESET_MODE
358
    always @ (posedge clk )begin
359
`else
360
    always @ (posedge clk or posedge reset)begin
361
`endif
362
        if (reset) begin
363
            wb_ack_o<=1'b0;
364
            jtag_ack_o<=1'b0;
365
            j2w_fifo_wr_en<=1'b0;
366
            stb1<=1'b0;
367
            stb2<=1'b0;
368
            ps<=IDEAL;
369
            wb_rdat_valid<=1'b0;
370
 
371
        end else begin
372
            wb_ack_o<= wb_ack_o_next;
373
            jtag_ack_o<=jtag_ack_o_next;
374
            j2w_fifo_wr_en<=j2w_fifo_wr_en_next;
375
            stb1<=jtag_stb_i;
376
            stb2<=stb1;
377
            ps<=ns;
378
 
379
 
380
            if(~j2w_fifo_empty) wb_rdat_valid<=1'b1;
381
            else if(wb_ack_o ) wb_rdat_valid<=1'b0;
382
 
383
        end
384
    end
385
 
386
 
387
    assign jtag_dat_o[23 : 0] = {jtag_wspace,w2j_fifo_dat_o};
388
    assign w2j_fifo_dat_i = wb_dat_i [7:0];
389
    assign jtag_status_o=0;
390
    assign jtag_index_o = JTAG_INDEX;
391
    assign j2w_fifo_dat_i = jtag_dat_i[7:0];
392
 
393
 
394
 
395
    wire  [BUFF_Aw -1      :   0] w2j_fifo_depth, j2w_fifo_depth;
396
    wire  [BUFF_Aw -1      :   0] remain = B- w2j_fifo_depth;
397
    wire  [BUFF_Aw -1      :   0] jtag_remain = B- j2w_fifo_depth;
398
    always @(*)begin
399
        wspace = 16'd0;
400
        jtag_wspace=16'd0;
401
        wspace[BUFF_Aw-1 : 0] = remain;
402
        jtag_wspace[BUFF_Aw-1 : 0] = jtag_remain;
403
    end
404
 
405
 
406
 
407
 
408
    uart_fifo #(
409
        .Dw(8),
410
        .B(B)
411
    )
412
    wb_to_jtag_fifo
413
    (
414
        .din(w2j_fifo_dat_i),
415
        .wr_en(w2j_fifo_wr_en),
416
        .rd_en(w2j_fifo_rd_en),
417
        .dout(w2j_fifo_dat_o),
418
        .full(w2j_fifo_full),
419
        .nearly_full(w2j_fifo_nearly_full),
420
        .empty(w2j_fifo_empty),
421
        .depth(w2j_fifo_depth),
422
        .reset(reset),
423
        .clk(clk)
424
    );
425
 
426
 
427
    uart_fifo #(
428
        .Dw(8),
429
        .B(B)
430
    )
431
    jtag_to_wb_fifo
432
    (
433
        .din(j2w_fifo_dat_i),
434
        .wr_en(j2w_fifo_wr_en),
435
        .rd_en(j2w_fifo_rd_en),
436
        .dout(j2w_fifo_dat_o),
437
        .full(j2w_fifo_full),
438
        .nearly_full(j2w_fifo_nearly_full),
439
        .depth(j2w_fifo_depth),
440
        .empty(j2w_fifo_empty),
441
        .reset(reset),
442
        .clk(clk)
443
    );
444
 
445
 
446
 
447
   generate
448
   if(JTAG_CONNECT == "XILINX_JTAG_WB")begin: xilinx_jwb
449
        assign wb_to_jtag = {jtag_status_o,jtag_ack_o,jtag_dat_o,jtag_index_o,clk};
450
        assign {jtag_addr_i,jtag_stb_i,jtag_we_i,jtag_dat_i} = jtag_to_wb;
451
   end else  if(JTAG_CONNECT == "ALTERA_JTAG_WB")begin: altera_jwb
452
 
453
        vjtag_wb #(
454
            .VJTAG_INDEX(JTAG_INDEX),
455
            .DW(JDw),
456
            .AW(JAw),
457
            .SW(JSTATUSw),
458
 
459
            //wishbone port parameters
460
            .M_Aw(Aw),
461
            .TAGw(TAGw)
462
        )
463
        vjtag_inst
464
        (
465
            .clk(clk),
466
            .reset(reset),
467
            .status_i(jtag_status_o),
468
             //wishbone master interface signals
469
            .m_sel_o(),
470
            .m_dat_o(jtag_dat_i),
471
            .m_addr_o(jtag_addr_i),
472
            .m_cti_o(),
473
            .m_stb_o(jtag_stb_i),
474
            .m_cyc_o(),
475
            .m_we_o(jtag_we_i),
476
            .m_dat_i(jtag_dat_o),
477
            .m_ack_i(jtag_ack_o)
478
 
479
        );
480
 
481
 
482
        assign wb_to_jtag[0] = clk;
483
   end
484
   endgenerate
485
 
486
 
487
 
488
 
489
 
490
 
491
endmodule
492
 
493
 
494
 
495
 
496
 
497
 
498
 
499
//If rd_en is asserted while fifo is empty, the dout will be zero. In this condition the rd pointer and fifo depth do not change 
500
module uart_fifo  #(
501
    parameter Dw = 72,//data_width
502
    parameter B  = 10// buffer num
503
)(
504
    din,
505
    wr_en,
506
    rd_en,
507
    dout,
508
    depth,
509
    full,
510
    nearly_full,
511
    empty,
512
    reset,
513
    clk
514
);
515
 
516
 
517
    function integer log2;
518
      input integer number; begin
519
         log2=(number <=1) ? 1: 0;
520
         while(2**log2<number) begin
521
            log2=log2+1;
522
         end
523
      end
524
    endfunction // log2 
525
 
526
    localparam  B_1 = B-1,
527
                Bw = log2(B),
528
                DEPTHw=log2(B+1);
529
    localparam  [Bw-1   :   0] Bint =   B_1[Bw-1    :   0];
530
 
531
    input [Dw-1:0] din;     // Data in
532
    input          wr_en;   // Write enable
533
    input          rd_en;   // Read the next word
534
 
535
    output reg [Dw-1:0]  dout;    // Data out
536
    output         full;
537
    output         nearly_full;
538
    output         empty;
539
 
540
    input          reset;
541
    input          clk;
542
 
543
 
544
 
545
reg [Dw-1       :   0] queue [B-1 : 0] /* synthesis ramstyle = "no_rw_check" */;
546
reg [Bw- 1      :   0] rd_ptr;
547
reg [Bw- 1      :   0] wr_ptr;
548
output reg [DEPTHw-1   :   0] depth;
549
 
550
wire rd_valid = rd_en & ~empty;
551
 
552
// Sample the data
553
always @(posedge clk)
554
begin
555
   if (wr_en)
556
      queue[wr_ptr] <= din;
557
   if (rd_en)
558
      dout <= (empty)? {Dw{1'b0}} :   queue[rd_ptr];
559
end
560
 
561
always @(posedge clk)
562
begin
563
   if (reset) begin
564
      rd_ptr <= {Bw{1'b0}};
565
      wr_ptr <= {Bw{1'b0}};
566
      depth  <= {DEPTHw{1'b0}};
567
   end
568
   else begin
569
      if (wr_en) wr_ptr <= (wr_ptr==Bint)? {Bw{1'b0}} : wr_ptr + 1'b1;
570
      if (rd_valid) rd_ptr <= (rd_ptr==Bint)? {Bw{1'b0}} : rd_ptr + 1'b1;
571
      if (wr_en & ~rd_valid) depth <=
572
//synthesis translate_off
573
//synopsys  translate_off
574
                   #1
575
//synopsys  translate_on
576
//synthesis translate_on  
577
                   depth + 1'b1;
578
      else if (~wr_en & rd_valid) depth <=
579
//synthesis translate_off
580
//synopsys  translate_off
581
                   #1
582
//synopsys  translate_on
583
//synthesis translate_on  
584
                   depth - 1'b1;
585
   end
586
end
587
 
588
//assign dout = queue[rd_ptr];
589
assign full = depth == B;
590
assign nearly_full = depth >= B-1;
591
assign empty = depth == {DEPTHw{1'b0}};
592
 
593
//synthesis translate_off
594
//synopsys  translate_off
595
always @(posedge clk)
596
begin
597
    if(~reset)begin
598
       if (wr_en && depth == B && !rd_valid)
599
          $display(" %t: ERROR: Attempt to write to full FIFO: %m",$time);
600
       if (rd_valid && depth == {DEPTHw{1'b0}})
601
          $display("%t: ERROR: Attempt to read an empty FIFO: %m",$time);
602
    end//~reset
603
end
604
 
605
 
606
 
607
    integer i;
608
    initial begin
609
       for (i=0; i<B;i=i+1 ) queue[i] ="*";
610
    end
611
 
612
 
613
 
614
 
615
//synopsys  translate_on
616
//synthesis translate_on
617
 
618
endmodule // fifo
619
 
620
 
621
 

powered by: WebSVN 2.1.0

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