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_simulation/] [pronoc_uart/] [verilog/] [testbench.v] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
/**************************************
2
* Module: testbench
3
* Date:2020-04-13
4
* Author: alireza
5
*
6
* Description:
7
***************************************/
8
 
9
 
10
// synthesis translate_off
11
`timescale 1ns / 1ps
12
// synthesis translate_on
13
 
14
module  testbench(
15
 
16
);
17
 
18
 
19
      function integer log2;
20
      input integer number; begin
21
         log2=(number <=1) ? 1: 0;
22
         while(2**log2<number) begin
23
            log2=log2+1;
24
         end
25
      end
26
    endfunction // log2 
27
 
28
 
29
    // parameters
30
     parameter JTAG_INDEX =  126;
31
     parameter JAw = 32;
32
     parameter JINDEXw = 8;
33
     parameter JSTATUSw = 8;
34
     parameter BUFF_Aw =    6;
35
     parameter SELw =    4;
36
     parameter Aw =    1;
37
     parameter Dw =    32;
38
     parameter TAGw =    3;
39
     parameter JDw =  32;
40
 
41
 
42
 
43
     //wb interface
44
    localparam
45
        DATA_REG = 1'b0,
46
        CONTROL_REG  = 1'b1 ,
47
        CONTROL_WSPACE_MSK = 32'hFFFF0000,
48
        DATA_RVALID_MSK = 32'h00008000,
49
        DATA_DATA_MSK = 32'h000000FF,
50
        B = 2 ** (BUFF_Aw-1),
51
        B_1 = B-1,
52
        Bw = log2(B),
53
        DEPTHw=log2(B+1),
54
        J2WBw= 1+1+JDw+JAw,
55
        WB2Jw=1+JSTATUSw+JINDEXw+1+JDw;
56
 
57
    localparam  [Bw-1   :   0] Bint =   B_1[Bw-1    :   0];
58
 
59
    //wb
60
    reg            clk;
61
    reg            reset;
62
    wire           wb_irq;
63
    wire [ Dw-1: 0] wb_dat_o;
64
    wire       wb_ack_o;
65
    reg            wb_adr_i;
66
    reg            wb_stb_i;
67
    reg            wb_cyc_i;
68
    reg            wb_we_i;
69
    reg   [ Dw-1: 0] wb_dat_i;
70
    wire           dataavailable;
71
    wire           readyfordata; //jtag
72
 
73
    //jtag
74
    wire [WB2Jw-1  : 0] wb_to_jtag;
75
    wire  [J2WBw-1 : 0] jtag_to_wb;
76
 
77
 
78
    pronoc_jtag_uart_hw #(
79
        .BUFF_Aw(BUFF_Aw),
80
        .JTAG_INDEX(JTAG_INDEX),
81
        .JDw(JDw),
82
        .JAw(JAw),
83
        .JINDEXw(JINDEXw),
84
        .JSTATUSw(JSTATUSw)
85
    )
86
    pronoc_jtag_uart
87
    (
88
        .clk(clk),
89
        .reset(reset),
90
        //.wb_irq(wb_irq),
91
        .wb_dat_o(wb_dat_o),
92
        .wb_ack_o(wb_ack_o),
93
        .wb_adr_i(wb_adr_i),
94
        .wb_stb_i(wb_stb_i),
95
        .wb_cyc_i(wb_cyc_i),
96
        .wb_we_i(wb_we_i),
97
        .wb_dat_i(wb_dat_i),
98
        //.dataavailable(dataavailable),
99
        //.readyfordata(readyfordata),
100
        .wb_to_jtag(wb_to_jtag),
101
        .jtag_to_wb(jtag_to_wb)
102
    );
103
 
104
    integer   char_idx;       // character_loop index
105
    reg [0: 7] character;
106
 
107
    task  uart_puts;
108
    input [0:1023] data;
109
    begin
110
        character=1;
111
        for(char_idx = 0;char_idx <=1023 ;char_idx = char_idx + 8)
112
        begin : character_loop
113
            character[0]  = data[char_idx];
114
            character[1]  = data[char_idx+1];
115
            character[2]  = data[char_idx+2];
116
            character[3]  = data[char_idx+3];
117
            character[4]  = data[char_idx+4];
118
            character[5]  = data[char_idx+5];
119
            character[6]  = data[char_idx+6];
120
            character[7]  = data[char_idx+7];
121
            if (character!=0) uart_putc(character);
122
        end//for 
123
    end
124
    endtask
125
 
126
    task  uart_putc;
127
    input [0:7] data;
128
    begin
129
        wait_until_send_chanel_ready();
130
        write_wb_reg(DATA_REG,data);
131
    end
132
    endtask
133
 
134
    reg  capture_wb_dat_o;
135
    reg [Dw-1 : 0] captured_wb_dat;
136
 
137
    always @(posedge clk)begin
138
        if(capture_wb_dat_o) captured_wb_dat= wb_dat_o;
139
    end
140
 
141
 
142
    task read_wb_reg;
143
    input reg addr;
144
    begin
145
       wb_adr_i= addr;
146
       wb_stb_i= 1'b1;
147
       wb_cyc_i= 1'b1;
148
       wb_we_i =1'b0;
149
       @(posedge wb_ack_o)#1
150
       wb_stb_i= 1'b0;
151
       wb_cyc_i= 1'b0;
152
       capture_wb_dat_o=1'b1;
153
       @(posedge clk)#1;
154
       capture_wb_dat_o=1'b0;
155
       @(posedge clk)#10;
156
      // $display("%d",captured_wb_dat); 
157
    end
158
    endtask
159
 
160
 
161
    task write_wb_reg;
162
    input reg addr;
163
    input integer dat_in;
164
    begin
165
       wb_adr_i= addr;
166
       wb_dat_i= dat_in;
167
       wb_stb_i= 1'b1;
168
       wb_cyc_i= 1'b1;
169
       wb_we_i =1'b1;
170
       @(posedge wb_ack_o)#1
171
       wb_stb_i= 1'b0;
172
       wb_cyc_i= 1'b0;
173
       @(posedge clk)#1000;
174
    end
175
    endtask
176
 
177
 
178
    reg[15:0] wspace;
179
    task wait_until_send_chanel_ready;
180
    begin
181
        wspace=0;
182
        while(wspace == 0)begin
183
            read_wb_reg(CONTROL_REG);
184
            wspace = captured_wb_dat[31:16];
185
        end
186
    end
187
    endtask
188
 
189
 
190
    task uart_getc;
191
    begin
192
        read_wb_reg(0);
193
        if(captured_wb_dat[15])begin
194
            $display("Wb got %s",captured_wb_dat[7:0]);
195
        end else begin
196
            uart_getc;
197
        end
198
    end
199
    endtask
200
 
201
 
202
    uart_jtag_testbench #(
203
        .JTAG_INDEX(JTAG_INDEX),
204
        .JAw(JAw),
205
        .JDw(JDw),
206
        .JINDEXw(JINDEXw),
207
        .JSTATUSw(JSTATUSw)
208
    )
209
    uart_jtag
210
    (
211
        .wb_to_jtag(wb_to_jtag),
212
        .jtag_to_wb(jtag_to_wb)
213
    );
214
 
215
 
216
 
217
    initial begin
218
        clk=1'b0;
219
        forever clk = #4 ~clk;
220
    end
221
 
222
 
223
    initial begin
224
        reset =1'b1;
225
      //  jtag_to_wb=0;
226
        wb_adr_i=0;
227
        wb_cyc_i=0;
228
        wb_dat_i=0;
229
        wb_stb_i=0;
230
        wb_we_i=0;
231
        #1000
232
        @(posedge clk ) reset =1'b0;
233
        #10
234
        @(posedge clk )
235
 
236
        uart_puts("hi every one! This is a test message\n");
237
 
238
        repeat (6)begin    uart_getc;        end
239
 
240
        uart_puts("Also this one!");
241
uart_puts("hi every one! This is a test message\n");
242
uart_puts("hi every one! This is a test message\n");
243
 
244
    end
245
 
246
 
247
 
248
 
249
 
250
 
251
endmodule
252
 

powered by: WebSVN 2.1.0

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