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

Subversion Repositories wf3d

[/] [wf3d/] [trunk/] [implement/] [rtl/] [axi_cmn/] [fm_axi_m.v] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 specular
//=======================================================================
2
// Project Monophony
3
//   Wire-Frame 3D Graphics Accelerator IP Core
4
//
5
// File:
6
//   fm_axi_m.v
7
//
8
// Abstract:
9
//   AXI Master interface bridge
10
//
11
// Author:
12 9 specular
//   Kenji Ishimaru (info.info.wf3d@gmail.com)
13 5 specular
//
14
//======================================================================
15
//
16
// Copyright (c) 2016, Kenji Ishimaru
17
// All rights reserved.
18
//
19
// Redistribution and use in source and binary forms, with or without
20
// modification, are permitted provided that the following conditions are met:
21
//
22
//  -Redistributions of source code must retain the above copyright notice,
23
//   this list of conditions and the following disclaimer.
24
//  -Redistributions in binary form must reproduce the above copyright notice,
25
//   this list of conditions and the following disclaimer in the documentation
26
//   and/or other materials provided with the distribution.
27
//
28
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
30
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
32
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
33
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
34
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
35
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
36
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
37
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
38
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39
//
40
// Revision History
41
 
42
`include "polyphony_def.v"
43
`define USE_4KB
44
module fm_axi_m (
45
  clk_core,
46
  rst_x,
47
  // AXI Master configuration
48
  i_conf_arcache_m,
49
  i_conf_aruser_m,
50
  i_conf_awcache_m,
51
  i_conf_awuser_m,
52
  // Local Memory Range
53
  i_brg_req,
54
  i_brg_adrs,
55
  i_brg_id,
56
  i_brg_rw,
57
  i_brg_len,
58
  o_brg_ack,
59
  i_brg_wdvalid,
60
  i_brg_be,
61
  i_brg_wdata,
62
  o_brg_wack,
63
  o_brg_rdvalid,
64
  o_brg_rid,
65
  o_brg_rdata,
66
  o_brg_rlast,
67
  o_init_done,
68
  // AXI write port
69
  o_awid_m,
70
  o_awaddr_m,
71
  o_awlen_m,
72
  o_awsize_m,
73
  o_awburst_m,
74
  o_awlock_m,
75
  o_awcache_m,
76
  o_awuser_m,
77
  o_awprot_m,
78
  o_awvalid_m,
79
  i_awready_m,
80
  o_wid_m,
81
  o_wdata_m,
82
  o_wstrb_m,
83
  o_wlast_m,
84
  o_wvalid_m,
85
  i_wready_m,
86
  i_bid_m,
87
  i_bresp_m,
88
  i_bvalid_m,
89
  o_bready_m,
90
  // AXI read port
91
  o_arid_m,
92
  o_araddr_m,
93
  o_arlen_m,
94
  o_arsize_m,
95
  o_arburst_m,
96
  o_arlock_m,
97
  o_arcache_m,
98
  o_aruser_m,
99
  o_arprot_m,
100
  o_arvalid_m,
101
  i_arready_m,
102
  i_rid_m,
103
  i_rdata_m,
104
  i_rresp_m,
105
  i_rlast_m,
106
  i_rvalid_m,
107
  o_rready_m
108
);
109
`include "polyphony_axi_def.v"
110
//////////////////////////////////
111
// I/O port definition
112
//////////////////////////////////
113
  // system
114
  input clk_core;
115
  input rst_x;
116
  // AXI Master configuration
117
  input [3:0] i_conf_arcache_m;
118
  input [4:0] i_conf_aruser_m;
119
  input [3:0] i_conf_awcache_m;
120
  input [4:0] i_conf_awuser_m;
121
 // Bridge Interface
122
   input          i_brg_req;
123
   input  [P_IB_ADDR_WIDTH-1:0]
124
                 i_brg_adrs;
125
   input          i_brg_rw;
126
   input  [1:0]   i_brg_id;
127
   input  [P_IB_LEN_WIDTH-1:0]
128
                 i_brg_len;
129
   output         o_brg_ack;
130
   input          i_brg_wdvalid;
131
   input  [P_IB_BE_WIDTH-1:0]
132
                 i_brg_be;
133
   input  [P_IB_DATA_WIDTH-1:0]
134
                 i_brg_wdata;
135
   output         o_brg_wack;
136
   output         o_brg_rdvalid;
137
   output [1:0]   o_brg_rid;
138
   output [P_IB_DATA_WIDTH-1:0]
139
                 o_brg_rdata;
140
   output         o_brg_rlast;
141
   output         o_init_done;
142
  // AXI Master
143
  output [P_AXI_M_AWID-1:0] o_awid_m;
144
  output [P_AXI_M_AWADDR-1:0] o_awaddr_m;
145
  output [P_AXI_M_AWLEN-1:0] o_awlen_m;
146
  output [P_AXI_M_AWSIZE-1:0] o_awsize_m;
147
  output [P_AXI_M_AWBURST-1:0] o_awburst_m;
148
  output [P_AXI_M_AWLOCK-1:0] o_awlock_m;
149
output [P_AXI_M_AWCACHE-1:0] o_awcache_m;
150
output [P_AXI_M_AWUSER-1:0] o_awuser_m;
151
  output [P_AXI_M_AWPROT-1:0] o_awprot_m;
152
  output o_awvalid_m;
153
  input  i_awready_m;
154
  output [P_AXI_M_WID-1:0] o_wid_m;
155
  output [P_AXI_M_WDATA-1:0] o_wdata_m;
156
  output [P_AXI_M_WSTRB-1:0] o_wstrb_m;
157
  output o_wlast_m;
158
  output o_wvalid_m;
159
  input  i_wready_m;
160
  input  [P_AXI_M_BID-1:0] i_bid_m;
161
  input  [P_AXI_M_BRESP-1:0] i_bresp_m;
162
  input  i_bvalid_m;
163
  output o_bready_m;
164
   //   read port
165
  output [P_AXI_M_ARID-1:0] o_arid_m;
166
  output [P_AXI_M_ARADDR-1:0] o_araddr_m;
167
  output [P_AXI_M_ARLEN-1:0] o_arlen_m;
168
  output [P_AXI_M_ARSIZE-1:0] o_arsize_m;
169
  output [P_AXI_M_ARBURST-1:0] o_arburst_m;
170
  output [P_AXI_M_ARLOCK-1:0] o_arlock_m;
171
  output [P_AXI_M_ARCACHE-1:0] o_arcache_m;
172
  output [P_AXI_M_ARUSER-1:0] o_aruser_m;
173
  output [P_AXI_M_ARPROT-1:0] o_arprot_m;
174
  output o_arvalid_m;
175
  input  i_arready_m;
176
  // read response
177
  input  [P_AXI_M_RID-1:0] i_rid_m;
178
  input  [P_AXI_M_RDATA-1:0] i_rdata_m;
179
  input  [P_AXI_M_RRESP-1:0] i_rresp_m;
180
  input  i_rlast_m;
181
  input  i_rvalid_m;
182
  output o_rready_m;
183
//////////////////////////////////
184
// parameter definition
185
//////////////////////////////////
186
localparam P_IDLE = 1'b0;
187
localparam P_WPROC = 1'b1;
188
//////////////////////////////////
189
// reg
190
//////////////////////////////////
191
  reg         r_brg_rdvalid;
192
  reg         r_brg_rlast;
193
  reg [1:0]   r_brg_rid;
194
  reg [P_IB_DATA_WIDTH-1:0] r_brg_rdata;
195
  reg [P_AXI_M_AWLEN-1:0] r_awlen;
196
  reg [1:0]   r_brg_wid;
197
 
198
  reg         r_wstate;
199
//////////////////////////////////
200
// wire
201
//////////////////////////////////
202
  // command/data interface
203
  wire   [P_IB_LEN_WIDTH+P_IB_ADDR_WIDTH+2+1-1:0]
204
                 w_fifo_cin;
205
  wire   [P_IB_DATA_WIDTH+P_IB_BE_WIDTH-1:0]
206
                 w_fifo_din;
207
  wire   [P_IB_LEN_WIDTH+P_IB_ADDR_WIDTH+2+1-1:0]
208
                 w_fifo_cout;
209
  wire   [P_IB_DATA_WIDTH+P_IB_BE_WIDTH-1:0]
210
                 w_fifo_dout;
211
  wire           w_cfifo_ack;
212
  wire           w_dfifo_ack;
213
  wire           w_brg_req;
214
  wire   [P_IB_ADDR_WIDTH-1:0]
215
                 w_brg_adrs;
216
  wire           w_brg_rw;
217
  wire   [1:0]   w_brg_id;
218
  wire   [1:0]   w_brg_wid;
219
  wire   [P_IB_LEN_WIDTH-1:0]
220
                 w_brg_len;
221
  wire   [P_IB_BE_WIDTH-1:0]
222
                 w_brg_be;
223
  wire   [P_IB_DATA_WIDTH-1:0]
224
                 w_brg_wdata;
225
  wire           w_brg_wdvalid;
226
  wire           w_wr_full;
227
  wire           w_wr_hit;
228
  wire           w_wr_empty;
229
  wire           w_wc_ack;
230
  wire           w_wdd_last_data;
231
  wire           w_arready_m_raw;
232
  wire           w_awready_m;
233
  wire           w_is_idle;
234
  wire           w_is_wproc;
235
 
236
  wire   [P_IB_DATA_WIDTH+P_IB_BE_WIDTH-1:0]
237
                 w_fifo_dout_f;
238
  wire   w_ren_f;
239
  wire   w_full_f;
240
  wire   w_empty_f;
241
  wire   w_write_command;
242
 
243
`ifdef USE_4KB
244
  wire   [P_IB_ADDR_WIDTH-1:0]
245
                 w_brg_adrs_4k;
246
  wire   [P_IB_LEN_WIDTH-1:0]
247
                 w_brg_len_4k;
248
  wire           w_cfifo_ack_4k;
249
 
250
fm_4k_split u_4k_split (
251
  .clk_core(clk_core),
252
  .rst_x(rst_x),
253
  // incoming
254
  .i_brg_req(w_brg_req),
255
  .i_brg_adrs(w_brg_adrs),
256
  .i_brg_rw(w_brg_rw),
257
  .i_brg_len(w_brg_len),
258
  .o_brg_ack(w_cfifo_ack),
259
  // outgoing
260
  .o_brg_adrs(w_brg_adrs_4k),
261
  .o_brg_len(w_brg_len_4k),
262
  .i_brg_ack(w_cfifo_ack_4k)
263
);
264
`endif
265
 
266
//////////////////////////////////
267
// assign
268
//////////////////////////////////
269
  assign w_write_command = w_brg_req & w_brg_rw;
270
  assign {w_brg_be,w_brg_wdata} = w_fifo_dout_f;
271
  assign w_is_idle = (r_wstate == P_IDLE);
272
  assign w_is_wproc = (r_wstate == P_WPROC);
273
  assign o_init_done = 1'b1;
274
  assign w_wc_ack = o_awvalid_m & i_awready_m;
275
  assign w_wdd_last_data = o_wlast_m;
276
//  assign w_cfifo_ack = (w_brg_rw) ? i_awready_m : i_arready_m;
277
// arready should be masked if RAW condition
278
  assign w_arready_m_raw = (w_wr_empty) ? i_arready_m :
279
                                          i_arready_m & (!w_wr_hit);
280
  assign w_awready_m = (w_wr_full) ? 1'b0 : i_awready_m;
281
`ifdef USE_4KB
282
  assign w_cfifo_ack_4k = (r_wstate == P_WPROC) ? 1'b0:
283
                       (!w_brg_req) ? 1'b1:
284
                       (w_brg_rw) ? w_awready_m : w_arready_m_raw;
285
`else
286
  assign w_cfifo_ack = (r_wstate == P_WPROC) ? 1'b0:
287
                       (!w_brg_req) ? 1'b1:
288
                       (w_brg_rw) ? w_awready_m : w_arready_m_raw;
289
`endif
290
  assign w_fifo_cin = {i_brg_id,i_brg_rw,i_brg_adrs,i_brg_len};
291
  assign w_fifo_din = {i_brg_be,i_brg_wdata};
292
  assign {w_brg_id,w_brg_rw,w_brg_adrs,w_brg_len} = w_fifo_cout;
293
  assign w_ren_f = (w_empty_f) ? 1'b1:
294
                                 (w_is_wproc & i_wready_m);
295
// AXI write
296
  assign o_awid_m = {{(P_AXI_M_AWID-2){1'b0}},w_brg_id};
297
  assign o_awaddr_m = {w_brg_adrs,{P_IB_DATA_WIDTH_POW2{1'b0}}};
298
  assign o_awlen_m = w_brg_len-1'b1;
299
`ifdef PP_BUSWIDTH_64
300
  assign o_awsize_m = 'd3;
301
`else
302
  assign o_awsize_m = 'd2;
303
`endif
304
  assign o_awburst_m = 'd1;
305
  assign o_awlock_m = 'd0; // normal access
306
  assign o_awcache_m = i_conf_awcache_m;  // non-cachable
307
  assign o_awuser_m = i_conf_awuser_m;
308
  assign o_awprot_m = 'd0;
309
  assign o_awvalid_m = (w_wr_full| w_is_wproc) ? 1'b0 :
310
                        w_brg_req & w_brg_rw;
311
  assign w_brg_wid = (o_awvalid_m) ? w_brg_id : r_brg_wid;
312
  assign o_wid_m = {{(P_AXI_M_WID-2){1'b0}},w_brg_wid};
313
  assign o_wdata_m = w_brg_wdata;
314
  assign o_wstrb_m = w_brg_be;
315
  assign o_wlast_m = (r_awlen == 'd1);
316
  assign o_wvalid_m = w_is_wproc & (!w_empty_f);
317
  assign o_bready_m = !w_wr_full;
318
// AXI read
319
  assign o_arid_m = {{(P_AXI_M_ARID-2){1'b0}},w_brg_id};
320
`ifdef USE_4KB
321
  assign o_araddr_m = {w_brg_adrs_4k,{P_IB_DATA_WIDTH_POW2{1'b0}}};
322
`else
323
  assign o_araddr_m = {w_brg_adrs,{P_IB_DATA_WIDTH_POW2{1'b0}}};
324
`endif
325
`ifdef USE_4KB
326
  assign o_arlen_m = w_brg_len_4k - 1'b1;
327
`else
328
  assign o_arlen_m = w_brg_len - 1'b1;
329
`endif
330
`ifdef PP_BUSWIDTH_64
331
  assign o_arsize_m = 'd3;
332
`else
333
  assign o_arsize_m = 'd2;
334
`endif
335
  assign o_arburst_m = 'd1;
336
  assign o_arlock_m = 'd0; // normal access
337
  assign o_arcache_m = i_conf_arcache_m;  // non-cachable
338
  assign o_aruser_m = i_conf_aruser_m;
339
  assign o_arprot_m = 'd0;
340
  assign o_arvalid_m = (w_is_wproc) ? 1'b0:
341
                       (w_wr_empty) ? w_brg_req & (!w_brg_rw) :
342
                                      w_brg_req & (!w_brg_rw) & (!w_wr_hit);
343
  assign o_rready_m = 1'b1;
344
  // read response
345
  assign o_brg_rdvalid = r_brg_rdvalid;
346
  assign o_brg_rid = r_brg_rid;
347
  assign o_brg_rdata = r_brg_rdata;
348
  assign o_brg_rlast = r_brg_rlast;
349
 
350
//////////////////////////////////
351
// always
352
//////////////////////////////////
353
 
354
always @(posedge clk_core or negedge rst_x) begin
355
  if (~rst_x) begin
356
    r_wstate <= P_IDLE;
357
    r_awlen <= 'd0;
358
  end else begin
359
    case (r_wstate)
360
      P_IDLE: begin
361
        if (w_write_command & w_cfifo_ack ) begin
362
          r_awlen <= w_brg_len;
363
          r_wstate <= P_WPROC;
364
        end
365
      end
366
      P_WPROC: begin
367
        if (!w_empty_f & i_wready_m) begin
368
          r_awlen <= r_awlen - 1'b1;  // data accept only
369
          if (w_wdd_last_data) r_wstate <= P_IDLE;
370
        end
371
      end
372
    endcase
373
  end
374
end
375
 
376
always @(posedge clk_core or negedge rst_x) begin
377
  if (~rst_x) begin
378
    r_brg_rdvalid <= 1'b0;
379
  end else begin
380
    r_brg_rdvalid <= i_rvalid_m;
381
  end
382
end
383
 
384
always @(posedge clk_core) begin
385
  r_brg_rid <= i_rid_m[1:0];
386
  r_brg_rdata <= i_rdata_m;
387
  r_brg_rlast <= i_rlast_m;
388
end
389
 
390
always @(posedge clk_core) begin
391
  if (w_wc_ack) begin
392
    r_brg_wid <= w_brg_id;
393
  end
394
end
395
//////////////////////////////////
396
// module instance
397
//////////////////////////////////
398
 
399
// command interface
400
fm_cinterface #(P_IB_LEN_WIDTH+P_IB_ADDR_WIDTH+2+1) u_cinterface (
401
  .clk_core(clk_core),
402
  .rst_x(rst_x),
403
  // bus side port
404
  .i_bstr(i_brg_req),
405
  .i_bdata(w_fifo_cin),
406
  .o_back(o_brg_ack),
407
  // internal port
408
  .o_istr(w_brg_req),
409
  .o_idata(w_fifo_cout),
410
  .i_iack(w_cfifo_ack)
411
);
412
 
413
// data interface
414
fm_dinterface #(P_IB_DATA_WIDTH+P_IB_BE_WIDTH) u_dinterface (
415
  .clk_core(clk_core),
416
  .rst_x(rst_x),
417
  // bus side port
418
  .i_bstr(i_brg_wdvalid),
419
  .i_bdata(w_fifo_din),
420
  .o_back(o_brg_wack),
421
  // internal port
422
  .o_istr(w_brg_wdvalid),
423
  .o_idata(w_fifo_dout),
424
  .i_iack(!w_full_f)
425
);
426
 
427
// write data fifo
428
fm_fifo #(P_IB_DATA_WIDTH+P_IB_BE_WIDTH,1) u_wd_fifo (
429
  .clk_core(clk_core),
430
  .rst_x(rst_x),
431
  .i_wstrobe(w_brg_wdvalid),
432
  .i_dt(w_fifo_dout),
433
  .o_full(w_full_f),
434
  .i_renable(w_ren_f),
435
  .o_dt(w_fifo_dout_f),
436
  .o_empty(w_empty_f),
437
  .o_dnum()
438
);
439
 
440
// write response fifo
441
fm_raw_fifo #(P_IB_ADDR_WIDTH) u_raw_fifo (
442
  .clk_core(clk_core),
443
  .rst_x(rst_x),
444
  .i_check_address(i_brg_adrs),
445
  .o_hit(w_wr_hit),
446
  .i_wstrobe(w_wc_ack),
447
  .i_dt(i_brg_adrs),
448
  .o_full(w_wr_full),
449
  .i_renable(i_bvalid_m),
450
  .o_dt(),
451
  .o_empty(w_wr_empty),
452
  .o_dnum()
453
);
454
 
455
///////////////////////////////////////////////////////////
456
// debug signals
457
reg [15:0] r_in_rcmd;
458
reg [15:0] r_in_wcmd;
459
reg [15:0] r_in_wd;
460
 
461
reg [15:0] r_axi_rcmd;
462
reg [15:0] r_axi_wcmd;
463
reg [15:0] r_axi_wd;
464
reg [15:0] r_axi_wd_last;
465
reg [15:0] r_axi_rd;
466
reg [15:0] r_axi_rd_last;
467
reg [15:0] r_axi_bcmd;
468
 
469
// id check
470
wire [1:0] w_last_rid;
471
wire w_rd_id;
472
wire w_diff;
473
assign w_rd_id = r_brg_rlast & r_brg_rdvalid;
474
assign w_diff = r_brg_rdvalid & w_last_rid != r_brg_rid;
475
 
476
fm_fifo #(2,8) u_id (
477
  .clk_core(clk_core),
478
  .rst_x(rst_x),
479
  .i_wstrobe(i_brg_req & (!i_brg_rw)),
480
  .i_dt(i_brg_id),
481
  .o_full(),
482
  .i_renable(w_rd_id),
483
  .o_dt(w_last_rid),
484
  .o_empty(),
485
  .o_dnum()
486
);
487
 
488
always @(posedge clk_core or negedge rst_x) begin
489
  if (~rst_x) begin
490
    r_in_rcmd <= 'd0;
491
    r_in_wcmd <= 'd0;
492
    r_in_wd <= 'd0;
493
  end else begin
494
    if (i_brg_req & (!i_brg_rw)) r_in_rcmd <= r_in_rcmd + 1'b1;
495
    if (i_brg_req & i_brg_rw) r_in_wcmd <= r_in_wcmd + 1'b1;
496
    if (i_brg_wdvalid) r_in_wd <= r_in_wd + 1'b1;
497
  end
498
end
499
 
500
always @(posedge clk_core or negedge rst_x) begin
501
  if (~rst_x) begin
502
    r_axi_rcmd <= 'd0;
503
    r_axi_wcmd <= 'd0;
504
    r_axi_wd <= 'd0;
505
    r_axi_wd_last <= 'd0;
506
    r_axi_bcmd <= 'd0;
507
  end else begin
508
    if (o_arvalid_m & i_arready_m) r_axi_rcmd <= r_axi_rcmd + 1'b1;
509
    if (o_awvalid_m & i_awready_m) r_axi_wcmd <= r_axi_wcmd + 1'b1;
510
    if (o_wvalid_m & i_wready_m) r_axi_wd <= r_axi_wd + 1'b1;
511
    if (o_wvalid_m & i_wready_m & o_wlast_m) r_axi_wd_last <= r_axi_wd_last + 1'b1;
512
    if (i_bvalid_m & o_bready_m) r_axi_bcmd <= r_axi_bcmd + 1'b1;
513
    if (i_rvalid_m & o_rready_m) r_axi_rd <= r_axi_rd + 1'b1;
514
    if (i_rvalid_m & o_rready_m & i_rlast_m) r_axi_rd_last <= r_axi_rd_last + 1'b1;
515
 
516
  end
517
end
518
 
519
endmodule

powered by: WebSVN 2.1.0

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