OpenCores
URL https://opencores.org/ocsvn/wb2axip/wb2axip/trunk

Subversion Repositories wb2axip

[/] [wb2axip/] [trunk/] [rtl/] [aximrd2wbsp.v] - Blame information for rev 16

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 8 dgisselq
////////////////////////////////////////////////////////////////////////////////
2
//
3
// Filename:    aximrd2wbsp.v
4
//
5
// Project:     Pipelined Wishbone to AXI converter
6
//
7
// Purpose:     Bridge an AXI read channel pair to a single wishbone read
8
//              channel.
9
//
10 16 dgisselq
// Rules:
11
//      1. Any read channel error *must* be returned to the correct
12
//              read channel ID.  In other words, we can't pipeline between IDs
13
//      2. A FIFO must be used on getting a WB return, to make certain that
14
//              the AXI return channel is able to stall with no loss
15
//      3. No request can be accepted unless there is room in the return
16
//              channel for it
17
//
18 8 dgisselq
// Creator:     Dan Gisselquist, Ph.D.
19
//              Gisselquist Technology, LLC
20
//
21
////////////////////////////////////////////////////////////////////////////////
22
//
23 16 dgisselq
// Copyright (C) 2019, Gisselquist Technology, LLC
24 8 dgisselq
//
25 16 dgisselq
// This file is part of the pipelined Wishbone to AXI converter project, a
26
// project that contains multiple bus bridging designs and formal bus property
27
// sets.
28 8 dgisselq
//
29 16 dgisselq
// The bus bridge designs and property sets are free RTL designs: you can
30
// redistribute them and/or modify any of them under the terms of the GNU
31
// Lesser General Public License as published by the Free Software Foundation,
32
// either version 3 of the License, or (at your option) any later version.
33 8 dgisselq
//
34 16 dgisselq
// The bus bridge designs and property sets are distributed in the hope that
35
// they will be useful, but WITHOUT ANY WARRANTY; without even the implied
36
// warranty of MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
37
// GNU Lesser General Public License for more details.
38
//
39
// You should have received a copy of the GNU Lesser General Public License
40
// along with these designs.  (It's in the $(ROOT)/doc directory.  Run make
41
// with no target there if the PDF file isn't present.)  If not, see
42 8 dgisselq
// <http://www.gnu.org/licenses/> for a copy.
43
//
44 16 dgisselq
// License:     LGPL, v3, as defined and found on www.gnu.org,
45
//              http://www.gnu.org/licenses/lgpl.html
46 8 dgisselq
//
47
////////////////////////////////////////////////////////////////////////////////
48
//
49
//
50
`default_nettype        none
51
//
52 16 dgisselq
// module       aximrd2wbsp #(
53 8 dgisselq
module  aximrd2wbsp #(
54
        parameter C_AXI_ID_WIDTH        = 6, // The AXI id width used for R&W
55
                                             // This is an int between 1-16
56
        parameter C_AXI_DATA_WIDTH      = 32,// Width of the AXI R&W data
57
        parameter C_AXI_ADDR_WIDTH      = 28,   // AXI Address width
58
        parameter AW                    = 26,   // AXI Address width
59 16 dgisselq
        parameter LGFIFO                =  9    // Must be >= 8
60 8 dgisselq
        // parameter    WBMODE          = "B4PIPELINE"
61
                // Could also be "BLOCK"
62
        ) (
63
        input   wire                    i_axi_clk,      // Bus clock
64
        input   wire                    i_axi_reset_n,  // Bus reset
65
 
66
// AXI read address channel signals
67 16 dgisselq
        output  reg                     o_axi_arready,  // Read address ready
68
        input wire      [C_AXI_ID_WIDTH-1:0]     i_axi_arid,     // Read ID
69 8 dgisselq
        input   wire    [C_AXI_ADDR_WIDTH-1:0]   i_axi_araddr,   // Read address
70
        input   wire    [7:0]            i_axi_arlen,    // Read Burst Length
71
        input   wire    [2:0]            i_axi_arsize,   // Read Burst size
72
        input   wire    [1:0]            i_axi_arburst,  // Read Burst type
73
        input   wire    [0:0]             i_axi_arlock,   // Read lock type
74
        input   wire    [3:0]            i_axi_arcache,  // Read Cache type
75
        input   wire    [2:0]            i_axi_arprot,   // Read Protection type
76
        input   wire    [3:0]            i_axi_arqos,    // Read Protection type
77
        input   wire                    i_axi_arvalid,  // Read address valid
78
 
79
// AXI read data channel signals   
80
        output  wire [C_AXI_ID_WIDTH-1:0] o_axi_rid,     // Response ID
81
        output  wire [1:0]               o_axi_rresp,   // Read response
82
        output  reg                     o_axi_rvalid,  // Read reponse valid
83
        output  wire [C_AXI_DATA_WIDTH-1:0] o_axi_rdata,    // Read data
84
        output  wire                    o_axi_rlast,    // Read last
85
        input   wire                    i_axi_rready,  // Read Response ready
86
 
87
        // We'll share the clock and the reset
88
        output  reg                             o_wb_cyc,
89
        output  reg                             o_wb_stb,
90 16 dgisselq
        output  reg [(AW-1):0]                   o_wb_addr,
91 8 dgisselq
        input   wire                            i_wb_ack,
92
        input   wire                            i_wb_stall,
93 16 dgisselq
        input   wire [(C_AXI_DATA_WIDTH-1):0]    i_wb_data,
94 8 dgisselq
        input   wire                            i_wb_err
95 16 dgisselq
`ifdef  FORMAL
96
        // ,
97
        // output       wire    [LGFIFO-1:0]            f_fifo_head,
98
        // output       wire    [LGFIFO-1:0]            f_fifo_neck,
99
        // output       wire    [LGFIFO-1:0]            f_fifo_torso,
100
        // output       wire    [LGFIFO-1:0]            f_fifo_tail
101
`endif
102 8 dgisselq
        );
103
 
104
        localparam      DW = C_AXI_DATA_WIDTH;
105
 
106
        wire    w_reset;
107
        assign  w_reset = (i_axi_reset_n == 1'b0);
108
 
109
 
110 16 dgisselq
        wire    [C_AXI_ID_WIDTH+C_AXI_ADDR_WIDTH+25-1:0] i_rd_request;
111
        reg     [C_AXI_ID_WIDTH+C_AXI_ADDR_WIDTH+25-1:0] r_rd_request;
112
        wire    [C_AXI_ID_WIDTH+C_AXI_ADDR_WIDTH+25-1:0] w_rd_request;
113 8 dgisselq
 
114 16 dgisselq
        reg     [LGFIFO:0]       next_ackptr, next_rptr;
115 8 dgisselq
 
116 16 dgisselq
        reg     [C_AXI_ID_WIDTH:0]       request_fifo    [0:((1<<LGFIFO)-1)];
117
        reg     [C_AXI_ID_WIDTH:0]       rsp_data;
118 8 dgisselq
 
119 16 dgisselq
        reg     [C_AXI_DATA_WIDTH:0]     response_fifo   [0:((1<<LGFIFO)-1)];
120
        reg     [C_AXI_DATA_WIDTH:0]     ack_data;
121 8 dgisselq
 
122 16 dgisselq
        reg                             advance_ack;
123 8 dgisselq
 
124 16 dgisselq
 
125
        reg                     r_valid, last_stb, last_ack, err_state;
126
        reg     [C_AXI_ID_WIDTH-1:0]     axi_id;
127
        reg     [LGFIFO:0]       fifo_wptr, fifo_ackptr, fifo_rptr;
128
        reg             incr;
129
        reg     [7:0]    stblen;
130
 
131
        wire    [C_AXI_ID_WIDTH-1:0]     w_id;//    r_id;
132
        wire    [C_AXI_ADDR_WIDTH-1:0]   w_addr;//  r_addr;
133
        wire    [7:0]                    w_len;//   r_len;
134
        wire    [2:0]                    w_size;//  r_size;
135
        wire    [1:0]                    w_burst;// r_burst;
136
        wire    [0:0]                     w_lock;//  r_lock;
137
        wire    [3:0]                    w_cache;// r_cache;
138
        wire    [2:0]                    w_prot;//  r_prot;
139
        wire    [3:0]                    w_qos;//   r_qos;
140
        wire    [LGFIFO:0]               fifo_fill;
141
        wire    [LGFIFO:0]               max_fifo_fill;
142
        wire                            accept_request;
143
 
144
 
145
 
146
        assign  fifo_fill = (fifo_wptr - fifo_rptr);
147
        assign  max_fifo_fill = (1<<LGFIFO);
148
 
149
        assign  accept_request = (i_axi_reset_n)&&(!err_state)
150
                        &&((!o_wb_cyc)||(!i_wb_err))
151
                        &&((!o_wb_stb)||(last_stb && !i_wb_stall))
152
                        &&(r_valid ||((i_axi_arvalid)&&(o_axi_arready)))
153
                        // The request must fit into our FIFO before making
154
                        // it
155
                        &&(fifo_fill + {{(LGFIFO-8){1'b0}},w_len} +1
156
                                        < max_fifo_fill)
157
                        // One ID at a time, lest we return a bus error
158
                        // to the wrong AXI master
159
                        &&((fifo_fill == 0)||(w_id == axi_id));
160
 
161
 
162
        assign  i_rd_request = { i_axi_arid, i_axi_araddr, i_axi_arlen,
163
                                i_axi_arsize, i_axi_arburst, i_axi_arcache,
164
                                i_axi_arlock, i_axi_arprot, i_axi_arqos };
165
 
166
        initial r_rd_request = 0;
167
        initial r_valid      = 0;
168 8 dgisselq
        always @(posedge i_axi_clk)
169 16 dgisselq
        if (!i_axi_reset_n)
170 8 dgisselq
        begin
171 16 dgisselq
                r_rd_request <= 0;
172
                r_valid <= 1'b0;
173
        end else if ((i_axi_arvalid)&&(o_axi_arready))
174
        begin
175
                r_rd_request <= i_rd_request;
176
                if (!accept_request)
177
                        r_valid <= 1'b1;
178
        end else if (accept_request)
179
                r_valid <= 1'b0;
180 8 dgisselq
 
181 16 dgisselq
        always @(*)
182
                o_axi_arready = !r_valid;
183 8 dgisselq
 
184 16 dgisselq
        /*
185
        assign  r_id    = r_rd_request[25 + C_AXI_ADDR_WIDTH +: C_AXI_ID_WIDTH];
186
        assign  r_addr  = r_rd_request[25 +: C_AXI_ADDR_WIDTH];
187
        assign  r_len   = r_rd_request[17 +: 8];
188
        assign  r_size  = r_rd_request[14 +: 3];
189
        assign  r_burst = r_rd_request[12 +: 2];
190
        assign  r_lock  = r_rd_request[11 +: 1];
191
        assign  r_cache = r_rd_request[ 7 +: 4];
192
        assign  r_prot  = r_rd_request[ 4 +: 3];
193
        assign  r_qos   = r_rd_request[ 0 +: 4];
194
        */
195 8 dgisselq
 
196 16 dgisselq
        assign  w_rd_request = (r_valid) ? (r_rd_request) : i_rd_request;
197 8 dgisselq
 
198 16 dgisselq
        assign  w_id    = w_rd_request[25 + C_AXI_ADDR_WIDTH +: C_AXI_ID_WIDTH];
199
        assign  w_addr  = w_rd_request[25 +: C_AXI_ADDR_WIDTH];
200
        assign  w_len   = w_rd_request[17 +: 8];
201
        assign  w_size  = w_rd_request[14 +: 3];
202
        assign  w_burst = w_rd_request[12 +: 2];
203
        assign  w_lock  = w_rd_request[11 +: 1];
204
        assign  w_cache = w_rd_request[ 7 +: 4];
205
        assign  w_prot  = w_rd_request[ 4 +: 3];
206
        assign  w_qos   = w_rd_request[ 0 +: 4];
207
 
208
        initial o_wb_cyc        = 0;
209
        initial o_wb_stb        = 0;
210
        initial stblen          = 0;
211
        initial incr            = 0;
212
        initial last_stb        = 0;
213 8 dgisselq
        always @(posedge i_axi_clk)
214 16 dgisselq
        if (w_reset)
215 8 dgisselq
        begin
216 16 dgisselq
                o_wb_stb <= 1'b0;
217
                o_wb_cyc <= 1'b0;
218
                incr     <= 1'b0;
219
                stblen   <= 0;
220
                last_stb <= 0;
221
        end else if ((!o_wb_stb)||(!i_wb_stall))
222
        begin
223
                if (accept_request)
224 8 dgisselq
                begin
225 16 dgisselq
                        // Process the new request
226
                        o_wb_cyc <= 1'b1;
227
                        o_wb_stb <= 1'b1;
228
                        last_stb <= (w_len == 0);
229 8 dgisselq
 
230 16 dgisselq
                        o_wb_addr <= w_addr[(C_AXI_ADDR_WIDTH-1):(C_AXI_ADDR_WIDTH-AW)];
231
                        incr <= w_burst[0];
232
                        stblen <= w_len;
233
                        axi_id <= w_id;
234
                // end else if ((o_wb_cyc)&&(i_wb_err)||(err_state))
235
                end else if (o_wb_stb && !last_stb)
236
                begin
237
                        // Step forward on the burst request
238
                        last_stb <= (stblen == 1);
239 8 dgisselq
 
240 16 dgisselq
                        o_wb_addr <= o_wb_addr + ((incr)? 1'b1:1'b0);
241
                        stblen <= stblen - 1'b1;
242
 
243 8 dgisselq
                        if (i_wb_err)
244
                        begin
245 16 dgisselq
                                stblen <= 0;
246 8 dgisselq
                                o_wb_stb <= 1'b0;
247 16 dgisselq
                                o_wb_cyc <= 1'b0;
248 8 dgisselq
                        end
249 16 dgisselq
                end else if (!o_wb_stb || last_stb)
250
                begin
251
                        // End the request
252
                        o_wb_stb <= 1'b0;
253
                        last_stb <= 1'b0;
254
                        stblen <= 0;
255 8 dgisselq
 
256 16 dgisselq
                        // Check for the last acknowledgment
257
                        if ((i_wb_ack)&&(last_ack))
258 8 dgisselq
                                o_wb_cyc <= 1'b0;
259 16 dgisselq
                        if (i_wb_err)
260
                                o_wb_cyc <= 1'b0;
261 8 dgisselq
                end
262 16 dgisselq
        end else if ((o_wb_cyc)&&(i_wb_err))
263
        begin
264
                stblen <= 0;
265
                o_wb_stb <= 1'b0;
266
                o_wb_cyc <= 1'b0;
267
                last_stb <= 1'b0;
268 8 dgisselq
        end
269
 
270 16 dgisselq
        always @(*)
271
                next_ackptr = fifo_ackptr + 1'b1;
272
 
273
        always @(*)
274
        begin
275
                last_ack = 1'b0;
276
                if (err_state)
277
                        last_ack = 1'b1;
278
                else if ((o_wb_stb)&&(stblen == 0)&&(fifo_wptr == fifo_ackptr))
279
                        last_ack = 1'b1;
280
                else if ((fifo_wptr == next_ackptr)&&(!o_wb_stb))
281
                        last_ack = 1'b1;
282
        end
283
 
284
        initial fifo_wptr = 0;
285 8 dgisselq
        always @(posedge i_axi_clk)
286 16 dgisselq
        if (w_reset)
287
                fifo_wptr <= 0;
288
        else if (o_wb_cyc && i_wb_err)
289
                fifo_wptr <= fifo_wptr + {{(LGFIFO-8){1'b0}},stblen}
290
                                + ((o_wb_stb)? 1:0);
291
        else if ((o_wb_stb)&&(!i_wb_stall))
292
                fifo_wptr <= fifo_wptr + 1'b1;
293 8 dgisselq
 
294 16 dgisselq
        initial fifo_ackptr = 0;
295 8 dgisselq
        always @(posedge i_axi_clk)
296 16 dgisselq
        if (w_reset)
297
                fifo_ackptr <= 0;
298
        else if ((o_wb_cyc)&&((i_wb_ack)||(i_wb_err)))
299
                fifo_ackptr <= fifo_ackptr + 1'b1;
300
        else if (err_state && (fifo_ackptr != fifo_wptr))
301
                fifo_ackptr <= fifo_ackptr + 1'b1;
302 8 dgisselq
 
303 16 dgisselq
        always @(posedge i_axi_clk)
304
        if ((o_wb_stb)&&(!i_wb_stall))
305
                request_fifo[fifo_wptr[LGFIFO-1:0]] <= { last_stb, axi_id };
306 8 dgisselq
 
307
        always @(posedge i_axi_clk)
308 16 dgisselq
        if ((o_wb_cyc && ((i_wb_ack)||(i_wb_err)))
309
                ||(err_state && (fifo_ackptr != fifo_wptr)))
310
                response_fifo[fifo_ackptr[LGFIFO-1:0]]
311
                        <= { (err_state||i_wb_err), i_wb_data };
312 8 dgisselq
 
313 16 dgisselq
        initial fifo_rptr = 0;
314 8 dgisselq
        always @(posedge i_axi_clk)
315 16 dgisselq
        if (w_reset)
316
                fifo_rptr <= 0;
317
        else if ((o_axi_rvalid)&&(i_axi_rready))
318
                fifo_rptr <= fifo_rptr + 1'b1;
319 8 dgisselq
 
320 16 dgisselq
        always @(*)
321
                next_rptr = fifo_rptr + 1'b1;
322
 
323 8 dgisselq
        always @(posedge i_axi_clk)
324 16 dgisselq
        if (advance_ack)
325
                ack_data <= response_fifo[fifo_rptr[LGFIFO-1:0]];
326 8 dgisselq
 
327 16 dgisselq
        always @(posedge i_axi_clk)
328
        if (advance_ack)
329
                rsp_data <= request_fifo[fifo_rptr[LGFIFO-1:0]];
330 8 dgisselq
 
331 16 dgisselq
        always @(*)
332
        if ((o_axi_rvalid)&&(i_axi_rready))
333
                advance_ack = (fifo_ackptr != next_rptr);
334
        else if ((!o_axi_rvalid)&&(fifo_ackptr != fifo_rptr))
335
                advance_ack = 1'b1;
336
        else
337
                advance_ack = 1'b0;
338
 
339
        initial o_axi_rvalid = 0;
340
        always @(posedge i_axi_clk)
341
        if (w_reset)
342
                o_axi_rvalid <= 1'b0;
343
        else if (advance_ack)
344
                o_axi_rvalid <= 1'b1;
345
        else if (i_axi_rready)
346
                o_axi_rvalid <= 1'b0;
347
 
348
        initial err_state = 0;
349
        always @(posedge i_axi_clk)
350
        if (w_reset)
351
                err_state <= 1'b0;
352
        else if ((o_wb_cyc)&&(i_wb_err))
353
                err_state <= 1'b1;
354
        else if ((!o_wb_stb)&&(fifo_wptr == fifo_rptr))
355
                err_state <= 1'b0;
356
 
357
        assign  o_axi_rlast = rsp_data[C_AXI_ID_WIDTH];
358
        assign  o_axi_rid   = rsp_data[0 +: C_AXI_ID_WIDTH];
359
        assign  o_axi_rresp = {(2){ack_data[C_AXI_DATA_WIDTH]}};
360
        assign  o_axi_rdata = ack_data[0 +: C_AXI_DATA_WIDTH];
361
 
362 8 dgisselq
        // Make Verilator happy
363
        // verilator lint_off UNUSED
364
        wire    [(C_AXI_ID_WIDTH+1)+(C_AXI_ADDR_WIDTH-AW)
365 16 dgisselq
                +27-1:0] unused;
366 8 dgisselq
        assign  unused = { i_axi_arsize, i_axi_arburst[1],
367 16 dgisselq
                i_axi_arlock, i_axi_arcache, i_axi_arprot, i_axi_arqos,
368
                w_burst[1], w_size, w_lock, w_cache, w_prot, w_qos, w_addr[1:0],
369 8 dgisselq
                        i_axi_araddr[(C_AXI_ADDR_WIDTH-AW-1):0] };
370
        // verilator lint_on  UNUSED
371
 
372
`ifdef  FORMAL
373
        reg     f_past_valid;
374
        initial f_past_valid = 1'b0;
375
        always @(posedge i_axi_clk)
376
                f_past_valid <= 1'b1;
377
 
378 16 dgisselq
        ////////////////////////////////////////////////////////////////////////
379
        //
380
        // Assumptions
381
        //
382
        //
383
        always @(*)
384
        if (!f_past_valid)
385
                assume(w_reset);
386 8 dgisselq
 
387 16 dgisselq
 
388
        ////////////////////////////////////////////////////////////////////////
389
        //
390
        // Ad-hoc assertions
391
        //
392
        //
393 8 dgisselq
        always @(*)
394 16 dgisselq
        if (o_wb_stb)
395
                assert(last_stb == (stblen == 0));
396
        else
397
                assert((!last_stb)&&(stblen == 0));
398
 
399
        ////////////////////////////////////////////////////////////////////////
400
        //
401
        // Error state
402
        //
403
        //
404
        /*
405 8 dgisselq
        always @(*)
406 16 dgisselq
                assume(!i_wb_err);
407 8 dgisselq
        always @(*)
408 16 dgisselq
                assert(!err_state);
409
        */
410
        always @(*)
411
        if ((!err_state)&&(o_axi_rvalid))
412
                assert(o_axi_rresp == 2'b00);
413 8 dgisselq
 
414 16 dgisselq
        ////////////////////////////////////////////////////////////////////////
415
        //
416
        // FIFO pointers
417
        //
418
        //
419
        wire    [LGFIFO:0]       f_fifo_wb_used, f_fifo_ackremain, f_fifo_used;
420
        assign  f_fifo_used       = fifo_wptr   - fifo_rptr;
421
        assign  f_fifo_wb_used    = fifo_wptr   - fifo_ackptr;
422
        assign  f_fifo_ackremain  = fifo_ackptr - fifo_rptr;
423
 
424
        always @(*)
425
        if (o_wb_stb)
426
                assert(f_fifo_used + stblen + 1 < {(LGFIFO){1'b1}});
427
        else
428
                assert(f_fifo_used < {(LGFIFO){1'b1}});
429
        always @(*)
430
                assert(f_fifo_wb_used   <= f_fifo_used);
431
        always @(*)
432
                assert(f_fifo_ackremain <= f_fifo_used);
433
 
434
        // Reset properties
435 8 dgisselq
        always @(posedge i_axi_clk)
436 16 dgisselq
        if ((!f_past_valid)||($past(w_reset)))
437
        begin
438
                assert(fifo_wptr   == 0);
439
                assert(fifo_ackptr == 0);
440
                assert(fifo_rptr   == 0);
441
        end
442 8 dgisselq
 
443 16 dgisselq
        localparam      F_LGDEPTH = LGFIFO+1, F_LGRDFIFO = 72; // 9*F_LGFIFO;
444
        wire    [(9-1):0]                f_axi_rd_count;
445
        wire    [(F_LGRDFIFO-1):0]       f_axi_rdfifo;
446
        wire    [(F_LGDEPTH-1):0]        f_axi_rd_nbursts, f_axi_rd_outstanding,
447
                                        f_axi_awr_outstanding,
448
                        f_wb_nreqs, f_wb_nacks, f_wb_outstanding;
449
 
450
        fwb_master #(.AW(AW), .DW(C_AXI_DATA_WIDTH), .F_MAX_STALL(2),
451
                .F_MAX_ACK_DELAY(3), .F_LGDEPTH(F_LGDEPTH),
452
                .F_OPT_DISCONTINUOUS(1))
453
                fwb(i_axi_clk, w_reset,
454
                        o_wb_cyc, o_wb_stb, 1'b0, o_wb_addr, {(DW){1'b0}}, 4'hf,
455
                        i_wb_ack, i_wb_stall, i_wb_data, i_wb_err,
456
                        f_wb_nreqs, f_wb_nacks, f_wb_outstanding);
457
 
458
        always @(*)
459
        if (err_state)
460
                assert(f_wb_outstanding == 0);
461
        else
462
                assert(f_wb_outstanding == f_fifo_wb_used);
463
 
464
 
465
        faxi_slave      #(.C_AXI_DATA_WIDTH(C_AXI_DATA_WIDTH),
466
                        .C_AXI_ADDR_WIDTH(C_AXI_ADDR_WIDTH),
467
                        .F_OPT_BURSTS(1'b0),
468
                        .F_LGDEPTH(F_LGDEPTH),
469
                        .F_AXI_MAXSTALL(0),
470
                        .F_AXI_MAXDELAY(0))
471
                faxi(.i_clk(i_axi_clk), .i_axi_reset_n(!w_reset),
472
                        .i_axi_awready(1'b0),
473
                        .i_axi_awaddr(0),
474
                        .i_axi_awlen(0),
475
                        .i_axi_awsize(0),
476
                        .i_axi_awburst(0),
477
                        .i_axi_awlock(0),
478
                        .i_axi_awcache(0),
479
                        .i_axi_awprot(0),
480
                        .i_axi_awqos(0),
481
                        .i_axi_awvalid(1'b0),
482
                        //
483
                        .i_axi_wready(1'b0),
484
                        .i_axi_wdata(0),
485
                        .i_axi_wstrb(0),
486
                        .i_axi_wlast(0),
487
                        .i_axi_wvalid(1'b0),
488
                        //
489
                        .i_axi_bresp(0),
490
                        .i_axi_bvalid(1'b0),
491
                        .i_axi_bready(1'b0),
492
                        //
493
                        .i_axi_arready(o_axi_arready),
494
                        .i_axi_araddr(i_axi_araddr),
495
                        .i_axi_arlen(i_axi_arlen),
496
                        .i_axi_arsize(i_axi_arsize),
497
                        .i_axi_arburst(i_axi_arburst),
498
                        .i_axi_arlock(i_axi_arlock),
499
                        .i_axi_arcache(i_axi_arcache),
500
                        .i_axi_arprot(i_axi_arprot),
501
                        .i_axi_arqos(i_axi_arqos),
502
                        .i_axi_arvalid(i_axi_arvalid),
503
                        //
504
                        .i_axi_rresp(o_axi_rresp),
505
                        .i_axi_rvalid(o_axi_rvalid),
506
                        .i_axi_rdata(o_axi_rdata),
507
                        .i_axi_rlast(o_axi_rlast),
508
                        .i_axi_rready(i_axi_rready),
509
                        //
510
                        .f_axi_rd_nbursts(f_axi_rd_nbursts),
511
                        .f_axi_rd_outstanding(f_axi_rd_outstanding),
512
                        .f_axi_wr_nbursts(),
513
                        .f_axi_awr_outstanding(f_axi_awr_outstanding),
514
                        .f_axi_awr_nbursts(),
515
                        //
516
                        .f_axi_rd_count(f_axi_rd_count),
517
                        .f_axi_rdfifo(f_axi_rdfifo));
518
 
519
        always @(*)
520
                assert(f_axi_awr_outstanding == 0);
521
 
522 8 dgisselq
`endif
523
endmodule

powered by: WebSVN 2.1.0

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