moved axi-related files to separate folders

This commit is contained in:
AngeloJacobo 2024-06-03 17:36:19 +08:00
parent 66f0daf0e9
commit 91fc6d8ed6
17 changed files with 1239 additions and 597 deletions

View File

@ -1,313 +0,0 @@
////////////////////////////////////////////////////////////////////////////////
//
// Filename: migsdram.v
// {{{
// Project: WB2AXIPSP: bus bridges and other odds and ends
//
// Purpose: This file isn't really a part of the synthesis implementation
// of the wb2axip project itself, but rather it is an example
// of how the wb2axip project can be used to connect a MIG generated
// IP component.
//
// This implementation depends upon the existence of a MIG generated
// core, named "mig_axis", and illustrates how such a core might be
// connected to the wbm2axip bridge. Specific options of the mig_axis
// setup include 6 identifier bits, and a full-sized bus width of 128
// bits. These two settings are both appropriate for driving a DDR3
// memory (whose minimum transfer size is 128 bits), but may need to be
// adjusted to support other memories.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
//
////////////////////////////////////////////////////////////////////////////////
// }}}
// Copyright (C) 2015-2024, Gisselquist Technology, LLC
// {{{
// This file is part of the WB2AXIP project.
//
// The WB2AXIP project contains free software and gateware, licensed under the
// Apache License, Version 2.0 (the "License"). You may not use this project,
// or this file, except in compliance with the License. You may obtain a copy
// of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
//
////////////////////////////////////////////////////////////////////////////////
//
//
`default_nettype none
// }}}
module migsdram(i_clk, i_clk_200mhz, o_sys_clk, i_rst, o_sys_reset,
// Wishbone components
i_wb_cyc, i_wb_stb, i_wb_we, i_wb_addr, i_wb_data, i_wb_sel,
o_wb_ack, o_wb_stall, o_wb_data, o_wb_err,
// SDRAM connections
o_ddr_ck_p, o_ddr_ck_n,
o_ddr_reset_n, o_ddr_cke,
o_ddr_cs_n, o_ddr_ras_n, o_ddr_cas_n, o_ddr_we_n,
o_ddr_ba, o_ddr_addr,
o_ddr_odt, o_ddr_dm,
io_ddr_dqs_p, io_ddr_dqs_n,
io_ddr_data
);
parameter DDRWIDTH = 16, WBDATAWIDTH=32;
parameter AXIDWIDTH = 6;
// The SDRAM address bits (RAMABITS) are a touch more difficult to work
// out. Here we leave them as a fixed parameter, but there are
// consequences to this. Specifically, the wishbone data width, the
// wishbone address width, and this number have interactions not
// well captured here.
parameter RAMABITS = 28;
// All DDR3 memories have 8 timeslots. This, if the DDR3 memory
// has 16 bits to it (as above), the entire transaction must take
// AXIWIDTH bits ...
localparam AXIWIDTH= DDRWIDTH *8;
localparam DW=WBDATAWIDTH;
localparam AW=(WBDATAWIDTH==32)? RAMABITS-2
:((WBDATAWIDTH==64) ? RAMABITS-3
:((WBDATAWIDTH==128) ? RAMABITS-4
: RAMABITS-5)); // (WBDATAWIDTH==256)
localparam SELW= (WBDATAWIDTH/8);
//
input wire i_clk, i_clk_200mhz, i_rst;
output wire o_sys_clk;
output reg o_sys_reset;
//
input wire i_wb_cyc, i_wb_stb, i_wb_we;
input wire [(AW-1):0] i_wb_addr;
input wire [(DW-1):0] i_wb_data;
input wire [(SELW-1):0] i_wb_sel;
output wire o_wb_ack, o_wb_stall;
output wire [(DW-1):0] o_wb_data;
output wire o_wb_err;
//
output wire [0:0] o_ddr_ck_p, o_ddr_ck_n;
output wire [0:0] o_ddr_cke;
output wire o_ddr_reset_n,
o_ddr_ras_n, o_ddr_cas_n, o_ddr_we_n;
output wire [0:0] o_ddr_cs_n;
output wire [2:0] o_ddr_ba;
output wire [13:0] o_ddr_addr;
output wire [0:0] o_ddr_odt;
output wire [(DDRWIDTH/8-1):0] o_ddr_dm;
inout wire [1:0] io_ddr_dqs_p, io_ddr_dqs_n;
inout wire [(DDRWIDTH-1):0] io_ddr_data;
`define SDRAM_ACCESS
`ifdef SDRAM_ACCESS
wire aresetn;
assign aresetn = 1'b1; // Never reset
// Write address channel
wire [(AXIDWIDTH-1):0] s_axi_awid;
wire [(RAMABITS-1):0] s_axi_awaddr;
wire [7:0] s_axi_awlen;
wire [2:0] s_axi_awsize;
wire [1:0] s_axi_awburst;
wire [0:0] s_axi_awlock;
wire [3:0] s_axi_awcache;
wire [2:0] s_axi_awprot;
wire [3:0] s_axi_awqos;
wire s_axi_awvalid;
wire s_axi_awready;
// Writei data channel
wire [(AXIWIDTH-1):0] s_axi_wdata;
wire [(AXIWIDTH/8-1):0] s_axi_wstrb;
wire s_axi_wlast, s_axi_wvalid, s_axi_wready;
// Write response channel
wire s_axi_bready;
wire [(AXIDWIDTH-1):0] s_axi_bid;
wire [1:0] s_axi_bresp;
wire s_axi_bvalid;
// Read address channel
wire [(AXIDWIDTH-1):0] s_axi_arid;
wire [(RAMABITS-1):0] s_axi_araddr;
wire [7:0] s_axi_arlen;
wire [2:0] s_axi_arsize;
wire [1:0] s_axi_arburst;
wire [0:0] s_axi_arlock;
wire [3:0] s_axi_arcache;
wire [2:0] s_axi_arprot;
wire [3:0] s_axi_arqos;
wire s_axi_arvalid;
wire s_axi_arready;
// Read response/data channel
wire [(AXIDWIDTH-1):0] s_axi_rid;
wire [(AXIWIDTH-1):0] s_axi_rdata;
wire [1:0] s_axi_rresp;
wire s_axi_rlast;
wire s_axi_rvalid;
wire s_axi_rready;
// Other wires ...
wire init_calib_complete, mmcm_locked;
wire app_sr_active, app_ref_ack, app_zq_ack;
wire app_sr_req, app_ref_req, app_zq_req;
wire w_sys_reset;
wire [11:0] w_device_temp;
mig_axis mig_sdram(
.ddr3_ck_p(o_ddr_ck_p), .ddr3_ck_n(o_ddr_ck_n),
.ddr3_reset_n(o_ddr_reset_n), .ddr3_cke(o_ddr_cke),
.ddr3_cs_n(o_ddr_cs_n), .ddr3_ras_n(o_ddr_ras_n),
.ddr3_we_n(o_ddr_we_n), .ddr3_cas_n(o_ddr_cas_n),
.ddr3_ba(o_ddr_ba), .ddr3_addr(o_ddr_addr),
.ddr3_odt(o_ddr_odt),
.ddr3_dqs_p(io_ddr_dqs_p), .ddr3_dqs_n(io_ddr_dqs_n),
.ddr3_dq(io_ddr_data), .ddr3_dm(o_ddr_dm),
//
.sys_clk_i(i_clk),
.clk_ref_i(i_clk_200mhz),
.ui_clk(o_sys_clk),
.ui_clk_sync_rst(w_sys_reset),
.mmcm_locked(mmcm_locked),
.aresetn(aresetn),
.app_sr_req(1'b0),
.app_ref_req(1'b0),
.app_zq_req(1'b0),
.app_sr_active(app_sr_active),
.app_ref_ack(app_ref_ack),
.app_zq_ack(app_zq_ack),
//
.s_axi_awid(s_axi_awid), .s_axi_awaddr(s_axi_awaddr),
.s_axi_awlen(s_axi_awlen), .s_axi_awsize(s_axi_awsize),
.s_axi_awburst(s_axi_awburst), .s_axi_awlock(s_axi_awlock),
.s_axi_awcache(s_axi_awcache), .s_axi_awprot(s_axi_awprot),
.s_axi_awqos(s_axi_awqos), .s_axi_awvalid(s_axi_awvalid),
.s_axi_awready(s_axi_awready),
//
.s_axi_wready( s_axi_wready),
.s_axi_wdata( s_axi_wdata),
.s_axi_wstrb( s_axi_wstrb),
.s_axi_wlast( s_axi_wlast),
.s_axi_wvalid( s_axi_wvalid),
//
.s_axi_bready(s_axi_bready), .s_axi_bid(s_axi_bid),
.s_axi_bresp(s_axi_bresp), .s_axi_bvalid(s_axi_bvalid),
//
.s_axi_arid(s_axi_arid), .s_axi_araddr(s_axi_araddr),
.s_axi_arlen(s_axi_arlen), .s_axi_arsize(s_axi_arsize),
.s_axi_arburst(s_axi_arburst), .s_axi_arlock(s_axi_arlock),
.s_axi_arcache(s_axi_arcache), .s_axi_arprot(s_axi_arprot),
.s_axi_arqos(s_axi_arqos), .s_axi_arvalid(s_axi_arvalid),
.s_axi_arready(s_axi_arready),
//
.s_axi_rready(s_axi_rready), .s_axi_rid(s_axi_rid),
.s_axi_rdata(s_axi_rdata), .s_axi_rresp(s_axi_rresp),
.s_axi_rlast(s_axi_rlast), .s_axi_rvalid(s_axi_rvalid),
.init_calib_complete(init_calib_complete),
.sys_rst(i_rst),
.device_temp(w_device_temp)
);
wbm2axisp #(
.C_AXI_ID_WIDTH(AXIDWIDTH),
.C_AXI_DATA_WIDTH(AXIWIDTH),
.C_AXI_ADDR_WIDTH(RAMABITS),
.AW(AW), .DW(DW)
)
bus_translator(
.i_clk(o_sys_clk),
// .i_reset(i_rst), // internally unused
// Write address channel signals
.o_axi_awvalid( s_axi_awvalid),
.i_axi_awready( s_axi_awready),
.o_axi_awid( s_axi_awid),
.o_axi_awaddr( s_axi_awaddr),
.o_axi_awlen( s_axi_awlen),
.o_axi_awsize( s_axi_awsize),
.o_axi_awburst( s_axi_awburst),
.o_axi_awlock( s_axi_awlock),
.o_axi_awcache( s_axi_awcache),
.o_axi_awprot( s_axi_awprot), // s_axi_awqos
.o_axi_awqos( s_axi_awqos), // s_axi_awqos
//
.o_axi_wvalid( s_axi_wvalid),
.i_axi_wready( s_axi_wready),
.o_axi_wdata( s_axi_wdata),
.o_axi_wstrb( s_axi_wstrb),
.o_axi_wlast( s_axi_wlast),
//
.i_axi_bvalid( s_axi_bvalid),
.o_axi_bready( s_axi_bready),
.i_axi_bid( s_axi_bid),
.i_axi_bresp( s_axi_bresp),
//
.o_axi_arvalid( s_axi_arvalid),
.i_axi_arready( s_axi_arready),
.o_axi_arid( s_axi_arid),
.o_axi_araddr( s_axi_araddr),
.o_axi_arlen( s_axi_arlen),
.o_axi_arsize( s_axi_arsize),
.o_axi_arburst( s_axi_arburst),
.o_axi_arlock( s_axi_arlock),
.o_axi_arcache( s_axi_arcache),
.o_axi_arprot( s_axi_arprot),
.o_axi_arqos( s_axi_arqos),
//
.i_axi_rvalid( s_axi_rvalid),
.o_axi_rready( s_axi_rready),
.i_axi_rid( s_axi_rid),
.i_axi_rdata( s_axi_rdata),
.i_axi_rresp( s_axi_rresp),
.i_axi_rlast( s_axi_rlast),
//
.i_wb_cyc( i_wb_cyc),
.i_wb_stb( i_wb_stb),
.i_wb_we( i_wb_we),
.i_wb_addr( i_wb_addr),
.i_wb_data( i_wb_data),
.i_wb_sel( i_wb_sel),
//
.o_wb_stall( o_wb_stall),
.o_wb_ack( o_wb_ack),
.o_wb_data( o_wb_data),
.o_wb_err( o_wb_err)
);
// Convert from active low to active high, *and* hold the system in
// reset until the memory comes up.
initial o_sys_reset = 1'b1;
always @(posedge o_sys_clk)
o_sys_reset <= (!w_sys_reset)
||(!init_calib_complete)
||(!mmcm_locked);
`else
BUFG sysclk(i_clk, o_sys_clk);
initial o_sys_reset <= 1'b1;
always @(posedge i_clk)
o_sys_reset <= 1'b1;
OBUFDS ckobuf(.I(i_clk), .O(o_ddr_ck_p), .OB(o_ddr_ck_n));
assign o_ddr_reset_n = 1'b0;
assign o_ddr_cke[0] = 1'b0;
assign o_ddr_cs_n[0] = 1'b1;
assign o_ddr_cas_n = 1'b1;
assign o_ddr_ras_n = 1'b1;
assign o_ddr_we_n = 1'b1;
assign o_ddr_ba = 3'h0;
assign o_ddr_addr = 14'h00;
assign o_ddr_dm = 2'b00;
assign io_ddr_data = 16'h0;
OBUFDS dqsbufa(.I(i_clk), .O(io_ddr_dqs_p[1]), .OB(io_ddr_dqs_n[1]));
OBUFDS dqsbufb(.I(i_clk), .O(io_ddr_dqs_p[0]), .OB(io_ddr_dqs_n[0]));
`endif
endmodule
`ifndef YOSYS
`default_nettype wire
`endif

258
testbench/axi_tb/addr.coe Normal file
View File

@ -0,0 +1,258 @@
memory_initialization_radix = 16;
memory_initialization_vector =
00000000
00000000
00000010
00000010
00000020
00000020
00000030
00000030
00000040
00000040
00000050
00000050
00000060
00000060
00000070
00000070
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
ffffffff
;

258
testbench/axi_tb/ctrl.coe Normal file
View File

@ -0,0 +1,258 @@
memory_initialization_radix = 16;
memory_initialization_vector =
00030100
00020201
00030302
00020403
00030504
00020605
00030706
00020807
00030908
00020a09
00030b0a
00020c0b
00030d0c
00020e0d
00030f0e
0002100f
00031110
00031211
00031312
00031413
00031514
00031615
00031716
00031817
00031918
00031a19
00031b1a
00031c1b
00031d1c
00031e1d
00031f1e
0003201f
00032120
00032221
00032322
00032423
00032524
00032625
00032726
00032827
00032928
00032a29
00032b2a
00032c2b
00032d2c
00032e2d
00032f2e
0003302f
00033130
00033231
00033332
00033433
00033534
00033635
00033736
00033837
00033938
00033a39
00033b3a
00033c3b
00033d3c
00033e3d
00033f3e
0003403f
00034140
00034241
00034342
00034443
00034544
00034645
00034746
00034847
00034948
00034a49
00034b4a
00034c4b
00034d4c
00034e4d
00034f4e
0003504f
00035150
00035251
00035352
00035453
00035554
00035655
00035756
00035857
00035958
00035a59
00035b5a
00035c5b
00035d5c
00035e5d
00035f5e
0003605f
00036160
00036261
00036362
00036463
00036564
00036665
00036766
00036867
00036968
00036a69
00036b6a
00036c6b
00036d6c
00036e6d
00036f6e
0003706f
00037170
00037271
00037372
00037473
00037574
00037675
00037776
00037877
00037978
00037a79
00037b7a
00037c7b
00037d7c
00037e7d
00037f7e
0003807f
00038180
00038281
00038382
00038483
00038584
00038685
00038786
00038887
00038988
00038a89
00038b8a
00038c8b
00038d8c
00038e8d
00038f8e
0003908f
00039190
00039291
00039392
00039493
00039594
00039695
00039796
00039897
00039998
00039a99
00039b9a
00039c9b
00039d9c
00039e9d
00039f9e
0003a09f
0003a1a0
0003a2a1
0003a3a2
0003a4a3
0003a5a4
0003a6a5
0003a7a6
0003a8a7
0003a9a8
0003aaa9
0003abaa
0003acab
0003adac
0003aead
0003afae
0003b0af
0003b1b0
0003b2b1
0003b3b2
0003b4b3
0003b5b4
0003b6b5
0003b7b6
0003b8b7
0003b9b8
0003bab9
0003bbba
0003bcbb
0003bdbc
0003bebd
0003bfbe
0003c0bf
0003c1c0
0003c2c1
0003c3c2
0003c4c3
0003c5c4
0003c6c5
0003c7c6
0003c8c7
0003c9c8
0003cac9
0003cbca
0003cccb
0003cdcc
0003cecd
0003cfce
0003d0cf
0003d1d0
0003d2d1
0003d3d2
0003d4d3
0003d5d4
0003d6d5
0003d7d6
0003d8d7
0003d9d8
0003dad9
0003dbda
0003dcdb
0003dddc
0003dedd
0003dfde
0003e0df
0003e1e0
0003e2e1
0003e3e2
0003e4e3
0003e5e4
0003e6e5
0003e7e6
0003e8e7
0003e9e8
0003eae9
0003ebea
0003eceb
0003edec
0003eeed
0003efee
0003f0ef
0003f1f0
0003f2f1
0003f3f2
0003f4f3
0003f5f4
0003f6f5
0003f7f6
0003f8f7
0003f9f8
0003faf9
0003fbfa
0003fcfb
0003fdfc
0003fefd
0003fffe
;

BIN
testbench/axi_tb/data.atg Normal file

Binary file not shown.

258
testbench/axi_tb/data.coe Normal file
View File

@ -0,0 +1,258 @@
memory_initialization_radix = 16;
memory_initialization_vector =
01234567
00000000
89abcdef
00000000
19283746
00000000
afdec70a
00000000
12121212
00000000
34343434
00000000
00000000
00000000
ffffffff
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
;

View File

@ -0,0 +1,205 @@
<?xml version="1.0" encoding="UTF-8"?>
<wave_config>
<wave_state>
</wave_state>
<db_ref_list>
<db_ref path="ddr3_axi_traffic_gen_behav.wdb" id="1">
<top_modules>
<top_module name="ddr3_axi_traffic_gen_tb" />
<top_module name="glbl" />
</top_modules>
</db_ref>
</db_ref_list>
<zoom_setting>
<ZoomStartTime time="56,185.259 ns"></ZoomStartTime>
<ZoomEndTime time="56,341.826 ns"></ZoomEndTime>
<Cursor1Time time="56,242.459 ns"></Cursor1Time>
</zoom_setting>
<column_width_setting>
<NameColumnWidth column_width="276"></NameColumnWidth>
<ValueColumnWidth column_width="84"></ValueColumnWidth>
</column_width_setting>
<WVObjectSize size="45" />
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/i_controller_clk">
<obj_property name="ElementShortName">i_controller_clk</obj_property>
<obj_property name="ObjectShortName">i_controller_clk</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/i_ddr3_clk">
<obj_property name="ElementShortName">i_ddr3_clk</obj_property>
<obj_property name="ObjectShortName">i_ddr3_clk</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/i_ref_clk">
<obj_property name="ElementShortName">i_ref_clk</obj_property>
<obj_property name="ObjectShortName">i_ref_clk</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/i_ddr3_clk_90">
<obj_property name="ElementShortName">i_ddr3_clk_90</obj_property>
<obj_property name="ObjectShortName">i_ddr3_clk_90</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/i_rst_n">
<obj_property name="ElementShortName">i_rst_n</obj_property>
<obj_property name="ObjectShortName">i_rst_n</obj_property>
</wvobject>
<wvobject fp_name="divider622" type="divider">
<obj_property name="label">AXI Lite (Traffic Generator)</obj_property>
<obj_property name="DisplayName">label</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/axi_traffic_gen_inst/s_axi_aclk">
<obj_property name="ElementShortName">s_axi_aclk</obj_property>
<obj_property name="ObjectShortName">s_axi_aclk</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/axi_traffic_gen_inst/s_axi_aresetn">
<obj_property name="ElementShortName">s_axi_aresetn</obj_property>
<obj_property name="ObjectShortName">s_axi_aresetn</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/axi_traffic_gen_inst/m_axi_lite_ch1_awaddr">
<obj_property name="ElementShortName">m_axi_lite_ch1_awaddr[31:0]</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_awaddr[31:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/axi_traffic_gen_inst/m_axi_lite_ch1_awprot">
<obj_property name="ElementShortName">m_axi_lite_ch1_awprot[2:0]</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_awprot[2:0]</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/axi_traffic_gen_inst/m_axi_lite_ch1_awvalid">
<obj_property name="ElementShortName">m_axi_lite_ch1_awvalid</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_awvalid</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/axi_traffic_gen_inst/m_axi_lite_ch1_awready">
<obj_property name="ElementShortName">m_axi_lite_ch1_awready</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_awready</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/axi_traffic_gen_inst/m_axi_lite_ch1_wdata">
<obj_property name="ElementShortName">m_axi_lite_ch1_wdata[31:0]</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_wdata[31:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/axi_traffic_gen_inst/m_axi_lite_ch1_wstrb">
<obj_property name="ElementShortName">m_axi_lite_ch1_wstrb[3:0]</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_wstrb[3:0]</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/axi_traffic_gen_inst/m_axi_lite_ch1_wvalid">
<obj_property name="ElementShortName">m_axi_lite_ch1_wvalid</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_wvalid</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/axi_traffic_gen_inst/m_axi_lite_ch1_wready">
<obj_property name="ElementShortName">m_axi_lite_ch1_wready</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_wready</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/axi_traffic_gen_inst/m_axi_lite_ch1_bresp">
<obj_property name="ElementShortName">m_axi_lite_ch1_bresp[1:0]</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_bresp[1:0]</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/axi_traffic_gen_inst/m_axi_lite_ch1_bvalid">
<obj_property name="ElementShortName">m_axi_lite_ch1_bvalid</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_bvalid</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/axi_traffic_gen_inst/m_axi_lite_ch1_bready">
<obj_property name="ElementShortName">m_axi_lite_ch1_bready</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_bready</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/m_axi_lite_ch1_araddr">
<obj_property name="ElementShortName">m_axi_lite_ch1_araddr[31:0]</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_araddr[31:0]</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/m_axi_lite_ch1_arvalid">
<obj_property name="ElementShortName">m_axi_lite_ch1_arvalid</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_arvalid</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/m_axi_lite_ch1_arready">
<obj_property name="ElementShortName">m_axi_lite_ch1_arready</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_arready</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/m_axi_lite_ch1_rdata">
<obj_property name="ElementShortName">m_axi_lite_ch1_rdata[31:0]</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_rdata[31:0]</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/m_axi_lite_ch1_rvalid">
<obj_property name="ElementShortName">m_axi_lite_ch1_rvalid</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_rvalid</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/m_axi_lite_ch1_rresp">
<obj_property name="ElementShortName">m_axi_lite_ch1_rresp[1:0]</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_rresp[1:0]</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/m_axi_lite_ch1_rready">
<obj_property name="ElementShortName">m_axi_lite_ch1_rready</obj_property>
<obj_property name="ObjectShortName">m_axi_lite_ch1_rready</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/axi_traffic_gen_inst/done">
<obj_property name="ElementShortName">done</obj_property>
<obj_property name="ObjectShortName">done</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/axi_traffic_gen_inst/status">
<obj_property name="ElementShortName">status[31:0]</obj_property>
<obj_property name="ObjectShortName">status[31:0]</obj_property>
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/dut/s_axi_wdata">
<obj_property name="ElementShortName">s_axi_wdata[127:0]</obj_property>
<obj_property name="ObjectShortName">s_axi_wdata[127:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/dut/s_axi_wstrb">
<obj_property name="ElementShortName">s_axi_wstrb[15:0]</obj_property>
<obj_property name="ObjectShortName">s_axi_wstrb[15:0]</obj_property>
</wvobject>
<wvobject fp_name="divider621" type="divider">
<obj_property name="label">Controller</obj_property>
<obj_property name="DisplayName">label</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/dut/ddr3_top_inst/ddr3_controller_inst/instruction_address">
<obj_property name="ElementShortName">instruction_address[4:0]</obj_property>
<obj_property name="ObjectShortName">instruction_address[4:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/dut/ddr3_top_inst/ddr3_controller_inst/state_calibrate">
<obj_property name="ElementShortName">state_calibrate[5:0]</obj_property>
<obj_property name="ObjectShortName">state_calibrate[5:0]</obj_property>
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/dut/ddr3_top_inst/ddr3_controller_inst/lane">
<obj_property name="ElementShortName">lane[0:0]</obj_property>
<obj_property name="ObjectShortName">lane[0:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/dut/ddr3_top_inst/ddr3_controller_inst/correct_read_data">
<obj_property name="ElementShortName">correct_read_data[31:0]</obj_property>
<obj_property name="ObjectShortName">correct_read_data[31:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/dut/ddr3_top_inst/ddr3_controller_inst/wrong_read_data">
<obj_property name="ElementShortName">wrong_read_data[31:0]</obj_property>
<obj_property name="ObjectShortName">wrong_read_data[31:0]</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/dut/ddr3_top_inst/i_wb_cyc">
<obj_property name="ElementShortName">i_wb_cyc</obj_property>
<obj_property name="ObjectShortName">i_wb_cyc</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/dut/ddr3_top_inst/i_wb_stb">
<obj_property name="ElementShortName">i_wb_stb</obj_property>
<obj_property name="ObjectShortName">i_wb_stb</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/dut/ddr3_top_inst/i_wb_we">
<obj_property name="ElementShortName">i_wb_we</obj_property>
<obj_property name="ObjectShortName">i_wb_we</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/dut/ddr3_top_inst/i_wb_addr">
<obj_property name="ElementShortName">i_wb_addr[23:0]</obj_property>
<obj_property name="ObjectShortName">i_wb_addr[23:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/dut/ddr3_top_inst/i_wb_data">
<obj_property name="ElementShortName">i_wb_data[127:0]</obj_property>
<obj_property name="ObjectShortName">i_wb_data[127:0]</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/dut/ddr3_top_inst/i_wb_sel">
<obj_property name="ElementShortName">i_wb_sel[15:0]</obj_property>
<obj_property name="ObjectShortName">i_wb_sel[15:0]</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/dut/ddr3_top_inst/o_wb_stall">
<obj_property name="ElementShortName">o_wb_stall</obj_property>
<obj_property name="ObjectShortName">o_wb_stall</obj_property>
</wvobject>
<wvobject type="logic" fp_name="/ddr3_axi_traffic_gen_tb/dut/ddr3_top_inst/o_wb_ack">
<obj_property name="ElementShortName">o_wb_ack</obj_property>
<obj_property name="ObjectShortName">o_wb_ack</obj_property>
</wvobject>
<wvobject type="array" fp_name="/ddr3_axi_traffic_gen_tb/dut/ddr3_top_inst/o_wb_data">
<obj_property name="ElementShortName">o_wb_data[127:0]</obj_property>
<obj_property name="ObjectShortName">o_wb_data[127:0]</obj_property>
</wvobject>
</wave_config>

View File

@ -1,4 +1,4 @@
module ddr3_axi_traffic_gen;
module ddr3_axi_traffic_gen_tb;
reg i_controller_clk, i_ddr3_clk, i_ref_clk, i_ddr3_clk_90;
reg i_rst_n;
@ -68,7 +68,7 @@ wire m_axi_lite_ch1_rready;
wire done;
wire [31 : 0] status;
axi_traffic_gen_1 axi_traffic_gen_inst(
axi_traffic_gen_0 axi_traffic_gen_inst(
.s_axi_aclk(i_controller_clk),
.s_axi_aresetn(i_rst_n && (dut.ddr3_top_inst.ddr3_controller_inst.state_calibrate == 23)), //stay reset until calibration is done
.m_axi_lite_ch1_awaddr(m_axi_lite_ch1_awaddr),

258
testbench/axi_tb/mask.coe Normal file
View File

@ -0,0 +1,258 @@
memory_initialization_radix = 16;
memory_initialization_vector =
ffffffff
00000000
ffffffff
00000000
ffffffff
00000000
ffffffff
00000000
ffffffff
00000000
ffffffff
00000000
ffffffff
00000000
ffffffff
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
;

View File

@ -1,282 +0,0 @@
module ddr3_axi_tb;
reg i_controller_clk, i_ddr3_clk, i_ref_clk, i_ddr3_clk_90;
reg i_rst_n;
// AXI Interface
// AXI write address channel signals
reg s_axi_awvalid;
wire s_axi_awready;
reg [dut.AXI_ID_WIDTH-1:0] s_axi_awid;
reg [dut.AXI_ADDR_WIDTH-1:0] s_axi_awaddr;
// AXI write data channel signals
reg s_axi_wvalid;
wire s_axi_wready;
reg [dut.AXI_DATA_WIDTH-1:0] s_axi_wdata;
reg [dut.AXI_DATA_WIDTH/8-1:0] s_axi_wstrb;
reg s_axi_wlast;
// AXI write response channel signals
wire s_axi_bvalid;
reg s_axi_bready;
wire [dut.AXI_ID_WIDTH-1:0] s_axi_bid;
wire [1:0] s_axi_bresp;
// AXI read address channel signals
reg s_axi_arvalid;
wire s_axi_arready;
reg [dut.AXI_ID_WIDTH-1:0] s_axi_arid;
reg [dut.AXI_ADDR_WIDTH-1:0] s_axi_araddr;
// AXI read data channel signals
wire s_axi_rvalid; // rd rslt valid
reg s_axi_rready; // rd rslt ready
wire [dut.AXI_ID_WIDTH-1:0] s_axi_rid; // response id
wire [dut.AXI_DATA_WIDTH-1:0] s_axi_rdata;// read data
wire s_axi_rlast; // read last
wire [1:0] s_axi_rresp; // read response
// DDR3 Pins
wire o_ddr3_clk_p;
wire o_ddr3_clk_n;
wire o_ddr3_reset_n;
wire o_ddr3_cke;
wire o_ddr3_cs_n;
wire o_ddr3_ras_n;
wire o_ddr3_cas_n;
wire o_ddr3_we_n;
wire[dut.ROW_BITS-1:0] o_ddr3_addr;
wire[dut.BA_BITS-1:0] o_ddr3_ba_addr;
wire[(dut.DQ_BITS*dut.BYTE_LANES)-1:0] io_ddr3_dq;
wire[dut.BYTE_LANES-1:0] io_ddr3_dqs, io_ddr3_dqs_n;
wire[dut.BYTE_LANES-1:0] o_ddr3_dm;
wire o_ddr3_odt;
localparam CONTROLLER_CLK_PERIOD = 10_000, //ps, period of clock input to this DDR3 controller module
DDR3_CLK_PERIOD = 2500; //ps, period of clock input to DDR3 RAM device
// Clocks and reset
always #(CONTROLLER_CLK_PERIOD/2) i_controller_clk = !i_controller_clk;
always #(DDR3_CLK_PERIOD/2) i_ddr3_clk = !i_ddr3_clk;
always #2500 i_ref_clk = !i_ref_clk;
initial begin //90 degree phase shifted ddr3_clk
#(DDR3_CLK_PERIOD/4);
while(1) begin
#(DDR3_CLK_PERIOD/2) i_ddr3_clk_90 = !i_ddr3_clk_90;
end
end
initial begin
i_controller_clk = 1;
i_ddr3_clk = 1;
i_ref_clk = 1;
i_ddr3_clk_90 = 1;
i_rst_n = 0;
#1_000_000;
i_rst_n = 1;
end
initial begin
// initialize AXI
s_axi_awvalid = 0;
s_axi_awid = 0;
s_axi_awaddr = 0;
s_axi_wvalid = 0;
s_axi_wdata = 0;
s_axi_wstrb = 0;
s_axi_wlast = 0;
s_axi_bready = 0;
s_axi_arvalid = 0;
s_axi_arid = 0;
s_axi_araddr = 0;
s_axi_rready = 0;
//wait until done calibrate
wait(dut.ddr3_top_inst.ddr3_controller_inst.state_calibrate == 23);
// write data to address 3 (0-15 = address 0, 16-31 = address 1, 32-47 = address 2)
@(negedge i_controller_clk);
s_axi_awvalid = 1;
s_axi_awid = 0;
s_axi_awaddr = 33;
@(negedge i_controller_clk);
// while(!s_axi_awready) begin
// @(negedge i_controller_clk);
// end
s_axi_awvalid = 0;
s_axi_awid = 0;
s_axi_awaddr = 0;
s_axi_wvalid = 1;
s_axi_wdata = 128'hAAAA_BBBB_CCCC_DDDD_EEEE_FFFF_0000_1111; // data 1
s_axi_wstrb = -1;
@(negedge i_controller_clk);
while(!s_axi_wready) begin
@(negedge i_controller_clk);
end
s_axi_wdata = 128'h2222_3333_4444_5555_6666_7777_8888_9999; // data 2
@(negedge i_controller_clk);
while(!s_axi_wready) begin
@(negedge i_controller_clk);
end
s_axi_wdata = 100; // data 3
@(negedge i_controller_clk);
while(!s_axi_wready) begin
@(negedge i_controller_clk);
end
s_axi_wdata = 2000; // data 4
s_axi_wlast = 1;
@(negedge i_controller_clk);
while(!s_axi_wready) begin
@(negedge i_controller_clk);
end
s_axi_wvalid = 0;
s_axi_wdata = 0;
s_axi_wstrb = 0;
s_axi_wlast = 0;
// DONE write data to address 3
// wait for write response
wait(s_axi_bvalid);
@(negedge i_controller_clk);
s_axi_bready = 1;
@(negedge i_controller_clk);
s_axi_bready = 0;
// done waiting for write response
#1000_000;
// read data request from address 2 (0-15 = address 0, 16-31 = address 1, 32-47 = address 2)
@(negedge i_controller_clk);
s_axi_arvalid = 1;
s_axi_arid = 2;
s_axi_araddr = 46;
@(negedge i_controller_clk);
s_axi_arvalid = 0;
s_axi_arid = 0;
s_axi_araddr = 0;
// done read data request from address 3
// wait for read data
wait(s_axi_rvalid);
@(negedge i_controller_clk);
@(negedge i_controller_clk);
@(negedge i_controller_clk);
@(negedge i_controller_clk);
s_axi_rready = 1;
@(negedge i_controller_clk);
@(negedge i_controller_clk);
@(negedge i_controller_clk);
@(negedge i_controller_clk);
s_axi_rready = 0;
#1000_000;
$finish;
end
ddr3_top_axi #(
.CONTROLLER_CLK_PERIOD(10_000), //ps, clock period of the controller interface
.DDR3_CLK_PERIOD(2_500), //ps, clock period of the DDR3 RAM device (must be 1/4 of the CONTROLLER_CLK_PERIOD)
.ROW_BITS(14), //width of row address
.COL_BITS(10), //width of column address
.BA_BITS(3), //width of bank address
.BYTE_LANES(2), //number of byte lanes of DDR3 RAM
.AXI_ID_WIDTH(4), // The AXI id width used for R&W, an int between 1-16
.MICRON_SIM(1), //enable faster simulation for micron ddr3 model (shorten POWER_ON_RESET_HIGH and INITIAL_CKE_LOW)
.ODELAY_SUPPORTED(0), //set to 1 when ODELAYE2 is supported
.SECOND_WISHBONE(0) //set to 1 if 2nd wishbone for debugging is needed
) dut
(
.i_controller_clk(i_controller_clk),
.i_ddr3_clk(i_ddr3_clk),
.i_ref_clk(i_ref_clk), //i_controller_clk = CONTROLLER_CLK_PERIOD, i_ddr3_clk = DDR3_CLK_PERIOD, i_ref_clk = 200MHz
.i_ddr3_clk_90(i_ddr3_clk_90), //required only when ODELAY_SUPPORTED is zero
.i_rst_n(i_rst_n),
//
// AXI Interface
// AXI write address channel signals
.s_axi_awvalid(s_axi_awvalid),
.s_axi_awready(s_axi_awready),
.s_axi_awid(s_axi_awid),
.s_axi_awaddr(s_axi_awaddr),
.s_axi_awlen(3), // 4 transfers in a transaction
.s_axi_awsize($clog2(128)),
.s_axi_awburst(1), //incrementing burst address
.s_axi_awlock(0),
.s_axi_awcache(0),
.s_axi_awprot(0),
.s_axi_awqos(0),
// AXI write data channel signals
.s_axi_wvalid(s_axi_wvalid),
.s_axi_wready(s_axi_wready),
.s_axi_wdata(s_axi_wdata),
.s_axi_wstrb(s_axi_wstrb),
.s_axi_wlast(s_axi_wlast),
// AXI write response channel signals
.s_axi_bvalid(s_axi_bvalid),
.s_axi_bready(s_axi_bready),
.s_axi_bid(s_axi_bid),
.s_axi_bresp(s_axi_bresp),
// AXI read address channel signals
.s_axi_arvalid(s_axi_arvalid),
.s_axi_arready(s_axi_arready),
.s_axi_arid(s_axi_arid),
.s_axi_araddr(s_axi_araddr),
.s_axi_arlen(3), // only 1 transfer in a transaction
.s_axi_arsize($clog2(128)),
.s_axi_arburst(1), //incrementing burst address
.s_axi_arlock(0),
.s_axi_arcache(0),
.s_axi_arprot(0),
.s_axi_arqos(0),
// AXI read data channel signals
.s_axi_rvalid(s_axi_rvalid), // rd rslt valid
.s_axi_rready(s_axi_rready), // rd rslt ready
.s_axi_rid(s_axi_rid), // response id
.s_axi_rdata(s_axi_rdata),// read data
.s_axi_rlast(s_axi_rlast), // read last
.s_axi_rresp(s_axi_rresp), // read response
//
// DDR3 I/O Interface
.o_ddr3_clk_p(o_ddr3_clk_p),
.o_ddr3_clk_n(o_ddr3_clk_n),
.o_ddr3_reset_n(o_ddr3_reset_n),
.o_ddr3_cke(o_ddr3_cke),
.o_ddr3_cs_n(o_ddr3_cs_n),
.o_ddr3_ras_n(o_ddr3_ras_n),
.o_ddr3_cas_n(o_ddr3_cas_n),
.o_ddr3_we_n(o_ddr3_we_n),
.o_ddr3_addr(o_ddr3_addr),
.o_ddr3_ba_addr(o_ddr3_ba_addr),
.io_ddr3_dq(io_ddr3_dq),
.io_ddr3_dqs(io_ddr3_dqs),
.io_ddr3_dqs_n(io_ddr3_dqs_n),
.o_ddr3_dm(o_ddr3_dm),
.o_ddr3_odt(o_ddr3_odt)
//
);
ddr3 ddr3_0(
.rst_n(o_ddr3_reset_n),
.ck(o_ddr3_clk_p),
.ck_n(o_ddr3_clk_n),
.cke(o_ddr3_cke),
.cs_n(o_ddr3_cs_n),
.ras_n(o_ddr3_ras_n),
.cas_n(o_ddr3_cas_n),
.we_n(o_ddr3_we_n),
.dm_tdqs(o_ddr3_dm),
.ba(o_ddr3_ba_addr),
.addr({0,o_ddr3_addr}),
.dq(io_ddr3_dq),
.dqs(io_ddr3_dqs),
.dqs_n(io_ddr3_dqs_n),
.tdqs_n(),
.odt(o_ddr3_odt)
);
endmodule