UberDDR3/testbench/ddr3_micron_sim.v

211 lines
7.0 KiB
Verilog

//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 05/13/2023 07:48:19 AM
// Design Name:
// Module Name: ddr3_micron_sim
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
`timescale 1ps / 1ps
`define den8192Mb
`define sg125
`define x8
module ddr3_micron_sim;
`ifdef den1024Mb
`include "1024Mb_ddr3_parameters.vh"
`elsif den2048Mb
`include "2048Mb_ddr3_parameters.vh"
`elsif den4096Mb
`include "4096Mb_ddr3_parameters.vh"
`elsif den8192Mb
`include "8192Mb_ddr3_parameters.vh"
`else
// NOTE: Intentionally cause a compile fail here to force the users
// to select the correct component density before continuing
ERROR: You must specify component density with +define+den____Mb.
`endif
reg i_controller_clk, i_ddr3_clk;
reg i_rst_n;
// Wishbone Interface
reg i_wb_cyc; //bus cycle active (1 = normal operation, 0 = all ongoing transaction are to be cancelled)
reg i_wb_stb; //request a transfer
reg i_wb_we; //write-enable (1 = write, 0 = read)
reg[$bits(ddr3_controller.i_wb_addr)-1:0] i_wb_addr; //burst-addressable {row,bank,col}
reg[$bits(ddr3_controller.i_wb_data)-1:0] i_wb_data; //write data, for a 4:1 controller data width is 8 times the number of pins on the device
wire o_wb_stall; //1 = busy, cannot accept requests
wire o_wb_ack; //1 = read/write request has completed
wire[$bits(ddr3_controller.o_wb_data)-1:0] o_wb_data; //read data, for a 4:1 controller data width is 8 times the number of pins on the device
// PHY Interface to DDR3 Device
wire ck_en; // CKE
wire cs_n; // chip select signal
wire odt; // on-die termination
wire ras_n; // RAS#
wire cas_n; // CAS#
wire we_n; // WE#
wire reset_n;
wire[$bits(ddr3_top.o_ddr3_addr)-1:0] addr;
wire[$bits(ddr3_top.o_ddr3_ba_addr)-1:0] ba_addr;
wire[$bits(ddr3_top.io_ddr3_dq)-1:0] dq;
wire[$bits(ddr3_top.io_ddr3_dqs)-1:0] dqs;
wire[$bits(ddr3_top.io_ddr3_dqs_n)-1:0] dqs_n;
wire o_ddr3_clk_p, o_ddr3_clk_n;
// DDR3 Controller
ddr3_top #(
.ROW_BITS(14), //width of row address
.COL_BITS(10), //width of column address
.BA_BITS(3), //width of bank address
.DQ_BITS(8), //width of DQ
.CONTROLLER_CLK_PERIOD(5), //ns, period of clock input to this DDR3 controller module
.DDR3_CLK_PERIOD(1.25), //ns, period of clock input to DDR3 RAM device
.LANES(1), //8 lanes of DQ
.OPT_LOWPOWER(1), //1 = low power, 0 = low logic
.OPT_BUS_ABORT(1) //1 = can abort bus, 0 = no absort (i_wb_cyc will be ignored, ideal for an AXI implementation which cannot abort transaction)
) ddr3_top
(
.i_controller_clk(i_controller_clk),
.i_ddr3_clk(i_ddr3_clk), //i_controller_clk has period of CONTROLLER_CLK_PERIOD, i_ddr3_clk has period of DDR3_CLK_PERIOD
.i_ref_clk(i_controller_clk),
.i_rst_n(i_rst_n), //200MHz input clock
// Wishbone inputs
.i_wb_cyc(i_wb_cyc), //bus cycle active (1 = normal operation, 0 = all ongoing transaction are to be cancelled)
.i_wb_stb(i_wb_stb), //request a transfer
.i_wb_we(i_wb_we), //write-enable (1 = write, 0 = read)
.i_wb_addr(i_wb_addr), //burst-addressable {row,bank,col}
.i_wb_data(i_wb_data), //write data, for a 4:1 controller data width is 8 times the number of pins on the device
.i_wb_sel(), //byte strobe for write (1 = write the byte)
.i_aux(), //for AXI-interface compatibility (given upon strobe)
// Wishbone outputs
.o_wb_stall(o_wb_stall), //1 = busy, cannot accept requests
.o_wb_ack(o_wb_ack), //1 = read/write request has completed
.o_wb_data(o_wb_data), //read data, for a 4:1 controller data width is 8 times the number of pins on the device
// PHY Interface (to be added later)
.o_ddr3_clk_p(o_ddr3_clk_p),
.o_ddr3_clk_n(o_ddr3_clk_n),
.o_ddr3_cke(ck_en), // CKE
.o_ddr3_cs_n(cs_n), // chip select signal
.o_ddr3_odt(odt), // on-die termination
.o_ddr3_ras_n(ras_n), // RAS#
.o_ddr3_cas_n(cas_n), // CAS#
.o_ddr3_we_n(we_n), // WE#
.o_ddr3_reset_n(reset_n),
.o_ddr3_addr(addr),
.o_ddr3_ba_addr(ba_addr),
.io_ddr3_dq(dq),
.io_ddr3_dqs(dqs),
.io_ddr3_dqs_n(dqs_n)
////////////////////////////////////
);
always #2500 i_controller_clk = !i_controller_clk;
always #625 i_ddr3_clk = !i_ddr3_clk;
initial begin
i_controller_clk = 1;
i_ddr3_clk = 1;
end
integer stored_time = 0;
always begin
if($rtoi($time/1000) != $rtoi(stored_time/1000)) begin
$write("%t ", $time);
stored_time = $time;
end
#10;
end
// DDR3 Device
ddr3 ddr3_0(
.rst_n(reset_n),
.ck(o_ddr3_clk_p),
.ck_n(o_ddr3_clk_n),
.cke(ck_en),
.cs_n(cs_n),
.ras_n(ras_n),
.cas_n(cas_n),
.we_n(we_n),
.dm_tdqs(),
.ba(ba_addr),
.addr(addr),
.dq(dq),
.dqs(dqs),
.dqs_n(dqs_n),
.tdqs_n(),
.odt(odt)
);
initial begin
@(negedge i_controller_clk)
i_rst_n = 0;
i_wb_cyc = 0;
i_wb_stb = 0;
i_wb_we = 0;
i_wb_addr = 0;
i_wb_data = 0;
@(negedge i_controller_clk)
i_rst_n = 1;
wait(ddr3_controller.state_calibrate == ddr3_controller.DONE_CALIBRATE);
// burst read 1
wait(!o_wb_stall);
@(negedge i_controller_clk);
i_wb_cyc = 1;
i_wb_stb = 1;
i_wb_we = 1;
i_wb_addr = 0;
i_wb_data = "_ANGELO_";//64'h88_77_66_55_44_33_22_11;
@(negedge i_controller_clk);
i_wb_addr = 1;
i_wb_data = "_JACOBO_";//64'h00_ff_ee_dd_cc_bb_aa_99;
@(negedge i_controller_clk);
i_wb_stb = 0;
i_wb_data = 0;
/*
#100_000;
wait(!o_wb_stall);
i_wb_stb = 1;
i_wb_data = 64'h88_77_66_55_44_33_22_11;
@(negedge i_controller_clk);
i_wb_data = 64'h00_ff_ee_dd_cc_bb_aa_99;
@(negedge i_controller_clk);
i_wb_data = 64'h88_77_66_55_44_33_22_11;
@(negedge i_controller_clk);
i_wb_data = 64'h00_ff_ee_dd_cc_bb_aa_99;
@(negedge i_controller_clk);
i_wb_data = 64'h88_77_66_55_44_33_22_11;
@(negedge i_controller_clk);
i_wb_data = 64'h00_ff_ee_dd_cc_bb_aa_99;
i_wb_stb = 0;
*/
wait(!o_wb_stall);
@(negedge i_controller_clk);
i_wb_stb = 1;
i_wb_we = 0;
i_wb_addr = 0;
//i_wb_data = 64'h88_77_66_55_44_33_22_11;
@(negedge i_controller_clk);
i_wb_addr = 1;
@(negedge i_controller_clk);
i_wb_stb = 0;
//wait(ddr3_controller.o_wb_ack);
#100_000;
$stop;
end
endmodule