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

Subversion Repositories versatile_mem_ctrl

[/] [versatile_mem_ctrl/] [trunk/] [bench/] [tb.v] - Diff between revs 94 and 99

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 94 Rev 99
Line 1... Line 1...
`include "tb_defines.v"
//`include "tb_defines.v"
`timescale 1ns/1ns
`timescale 1ns/1ns
module versatile_mem_ctrl_tb
module versatile_mem_ctrl_tb
  (
  (
   output OK
   output OK
   );
   );
 
 
   reg         wb_clk, wb_rst;
`ifdef NR_OF_WBM
   reg         sdram_clk, sdram_rst;
        parameter nr_of_wbm = `NR_OF_WBM;
   reg         tb_rst;
`else
 
        parameter nr_of_wbm = 1;
   wire [31:0] wbm_dat_i [1:nr_of_wbm];
`endif
   wire [3:0]  wbm_sel_i [1:nr_of_wbm];
 
   wire [31:0] wbm_adr_i [1:nr_of_wbm];
`ifdef SDRAM_CLK_PERIOD
   wire [2:0]  wbm_cti_i [1:nr_of_wbm];
        parameter sdram_clk_period = `SDRAM_CLK_PERIOD;
   wire [1:0]  wbm_bte_i [1:nr_of_wbm];
`else
   wire        wbm_cyc_i [1:nr_of_wbm];
        parameter sdram_clk_period = 8;
   wire        wbm_stb_i [1:nr_of_wbm];
`endif
   wire [31:0] wbm_dat_o [1:nr_of_wbm];
 
   wire        wbm_ack_o [1:nr_of_wbm];
`ifdef WB_CLK_PERIODS
   wire        wbm_clk   [1:nr_of_wbm];
        parameter [1:nr_of_wbm] wb_clk_periods = {`WB_CLK_PERIODS};
   wire        wbm_rst;
`else
 
        parameter [1:nr_of_wbm] wb_clk_periods = (20);
 
`endif
 
        parameter wb_clk_period = 20;
 
 
 
   wire [31:0] wbm_a_dat_o [1:nr_of_wbm];
 
   wire [3:0]  wbm_a_sel_o [1:nr_of_wbm];
 
   wire [31:0] wbm_a_adr_o [1:nr_of_wbm];
 
   wire [2:0]  wbm_a_cti_o [1:nr_of_wbm];
 
   wire [1:0]  wbm_a_bte_o [1:nr_of_wbm];
 
   wire        wbm_a_we_o  [1:nr_of_wbm];
 
   wire        wbm_a_cyc_o [1:nr_of_wbm];
 
   wire        wbm_a_stb_o [1:nr_of_wbm];
 
   wire [31:0] wbm_a_dat_i [1:nr_of_wbm];
 
   wire        wbm_a_ack_i [1:nr_of_wbm];
 
   reg         wbm_a_clk   [1:nr_of_wbm];
 
   reg         wbm_a_rst   [1:nr_of_wbm];
 
 
 
   wire [31:0] wbm_b_dat_o [1:nr_of_wbm];
 
   wire [3:0]  wbm_b_sel_o [1:nr_of_wbm];
 
   wire [31:2] wbm_b_adr_o [1:nr_of_wbm];
 
   wire [2:0]  wbm_b_cti_o [1:nr_of_wbm];
 
   wire [1:0]  wbm_b_bte_o [1:nr_of_wbm];
 
   wire        wbm_b_we_o  [1:nr_of_wbm];
 
   wire        wbm_b_cyc_o [1:nr_of_wbm];
 
   wire        wbm_b_stb_o [1:nr_of_wbm];
 
   wire [31:0] wbm_b_dat_i [1:nr_of_wbm];
 
   wire        wbm_b_ack_i [1:nr_of_wbm];
 
 
   wire [31:0] wb_sdram_dat_i;
   wire [31:0] wb_sdram_dat_i;
   wire [3:0]  wb_sdram_sel_i;
   wire [3:0]  wb_sdram_sel_i;
   wire [31:0] wb_sdram_adr_i;
   wire [31:2] wb_sdram_adr_i;
   wire [2:0]  wb_sdram_cti_i;
   wire [2:0]  wb_sdram_cti_i;
   wire [1:0]  wb_sdram_bte_i;
   wire [1:0]  wb_sdram_bte_i;
 
   wire        wb_sdram_we_i;
   wire        wb_sdram_cyc_i;
   wire        wb_sdram_cyc_i;
   wire        wb_sdram_stb_i;
   wire        wb_sdram_stb_i;
   wire [31:0] wb_sdram_dat_o;
   wire [31:0] wb_sdram_dat_o;
   wire        wb_sdram_ack_o;
   wire        wb_sdram_ack_o;
 
   reg         wb_sdram_clk;
 
   reg         wb_sdram_rst;
 
 
 
        wire [1:nr_of_wbm] wbm_OK;
 
 
   wire [1:0]  ba, bad;
        genvar i;
   wire [12:0] a, ad;
 
   wire [15:0] dq_i;
 
   wire [15:0] dq_o;
 
   wire [15:0] dq_io;
 
   wire [1:0]  dqs, dqs_n, dqs_i, dqs_o, dqs_n_i, dqs_n_o, dqs_io, dqs_n_io;
 
   wire [1:0]  dqm, dqmd, dm_rdqs;
 
   wire        dq_oe, dqs_oe;
 
   wire        cs_n, cs_nd, ras, rasd, cas, casd, we, wed, cke, cked;
 
   wire        ck_fb_i, ck_fb_o;
 
 
 
`ifdef SDR_16          // SDR SDRAM
`define DUT sdr_sdram_16_ctrl
   wb0 wb0i
`define SDR 16
     (
`ifdef SDR
      .adr(wb0_adr_i),
        wire [1:0]  ba, ba_pad;
      .bte(wb0_bte_i),
        wire [12:0] a, a_pad;
      .cti(wb0_cti_i),
        wire [`SDR-1:0] dq_i, dq_o, dq_pad;
      .cyc(wb0_cyc_i),
        wire        dq_oe;
      .dat(wb0_dat_i),
        wire [1:0]  dqm, dqm_pad;
      .sel(wb0_sel_i),
        wire        cke, cke_pad, cs_n, cs_n_pad, ras, ras_pad, cas, cas_pad, we, we_pad;
      .stb(wb0_stb_i),
 
      .we (wb0_we_i),
        assign #1 {ba_pad,a_pad} = {ba,a};
      .ack(wb0_ack_o),
        assign #1 {ras_pad, cas_pad, we_pad} = {ras,cas,we};
      .clk(wb_clk),
        assign #1 dqm_pad = dqm;
      .dat_i(wb0_dat_o),
        assign #1 cke_pad = cke;
      .reset(wb_rst)
        assign cs_n_pad = cs_n;
      );
 
   wb1 wb1i
        mt48lc16m16a2 mem(
     (
                .Dq(dq_pad),
      .adr(wb1_adr_i),
                .Addr(a_pad),
      .bte(wb1_bte_i),
                .Ba(ba_pad),
      .cti(wb1_cti_i),
                .Clk(wb_sdram_clk),
      .cyc(wb1_cyc_i),
                .Cke(cke_pad),
      .dat(wb1_dat_i),
                .Cs_n(cs_n_pad),
      .sel(wb1_sel_i),
                .Ras_n(ras_pad),
      .stb(wb1_stb_i),
                .Cas_n(cas_pad),
      .we (wb1_we_i),
                .We_n(we_pad),
      .ack(wb1_ack_o),
                .Dqm(dqm_pad));
      .clk(wb_clk),
 
      .dat_i(wb1_dat_o),
                assign #1 dq_pad = (dq_oe) ? dq_o : {`SDR{1'bz}};
      .reset(wb_rst)
                assign #1 dq_i = dq_pad;
      );
 
   wb4 wb4i
        `DUT DUT(
     (
        // wisbone i/f
      .adr(wb4_adr_i),
        .dat_i(wb_sdram_dat_i),
      .bte(wb4_bte_i),
        .adr_i({wb_sdram_adr_i[24:2],1'b0}),
      .cti(wb4_cti_i),
        .sel_i(wb_sdram_sel_i),
      .cyc(wb4_cyc_i),
        .cti_i(wb_sdram_cti_i),
      .dat(wb4_dat_i),
        .bte_i(wb_sdram_bte_i),
      .sel(wb4_sel_i),
        .we_i (wb_sdram_we_i),
      .stb(wb4_stb_i),
        .cyc_i(wb_sdram_cyc_i),
      .we (wb4_we_i),
        .stb_i(wb_sdram_stb_i),
      .ack(wb4_ack_o),
        .dat_o(wb_sdram_dat_o),
      .clk(wb_clk),
        .ack_o(wb_sdram_ack_o),
      .dat_i(wb4_dat_o),
        // SDR SDRAM
      .reset(wb_rst)
        .ba(ba),
      );
        .a(a),
`endif
        .cmd({ras, cas, we}),
 
        .cke(cke),
`ifdef DDR_16          // DDR2 SDRAM
        .cs_n(cs_n),
   wb0_ddr wb0i
        .dqm(dqm),
     (
 
      .adr(wb0_adr_i),
 
      .bte(wb0_bte_i),
 
      .cti(wb0_cti_i),
 
      .cyc(wb0_cyc_i),
 
      .dat(wb0_dat_i),
 
      .sel(wb0_sel_i),
 
      .stb(wb0_stb_i),
 
      .we (wb0_we_i),
 
      .ack(wb0_ack_o),
 
      .clk(wb_clk),
 
      .dat_i(wb0_dat_o),
 
      .reset(tb_rst)
 
      );
 
   wb1_ddr wb1i
 
     (
 
      .adr(wb1_adr_i),
 
      .bte(wb1_bte_i),
 
      .cti(wb1_cti_i),
 
      .cyc(wb1_cyc_i),
 
      .dat(wb1_dat_i),
 
      .sel(wb1_sel_i),
 
      .stb(wb1_stb_i),
 
      .we (wb1_we_i),
 
      .ack(wb1_ack_o),
 
      .clk(wb_clk),
 
      .dat_i(wb1_dat_o),
 
      .reset(tb_rst)
 
      );
 
   wb4_ddr wb4i
 
     (
 
      .adr(wb4_adr_i),
 
      .bte(wb4_bte_i),
 
      .cti(wb4_cti_i),
 
      .cyc(wb4_cyc_i),
 
      .dat(wb4_dat_i),
 
      .sel(wb4_sel_i),
 
      .stb(wb4_stb_i),
 
      .we (wb4_we_i),
 
      .ack(wb4_ack_o),
 
      .clk(wb_clk),
 
      .dat_i(wb4_dat_o),
 
      .reset(tb_rst)
 
      );
 
`endif
 
 
 
   versatile_mem_ctrl_top # (
 
    .nr_of_wb_clk_domains(2),
 
    .nr_of_wb_ports_clk0(1),
 
    .nr_of_wb_ports_clk1(1),
 
    .nr_of_wb_ports_clk2(0),
 
    .nr_of_wb_ports_clk3(0))
 
   dut (
 
    .wb_adr_i_0({{wb0_adr_i[31:2],wb0_we_i,wb0_bte_i,wb0_cti_i},{wb1_adr_i[31:2],wb1_we_i,wb1_bte_i,wb1_cti_i}}),
 
    .wb_dat_i_0({{wb0_dat_i,wb0_sel_i},{wb1_dat_i,wb1_sel_i}}),
 
    .wb_dat_o_0({wb0_dat_o,wb1_dat_o}),
 
    .wb_stb_i_0({wb0_stb_i,wb1_stb_i}),
 
    .wb_cyc_i_0({wb0_cyc_i,wb1_cyc_i}),
 
    .wb_ack_o_0({wb0_ack_o,wb1_ack_o}),
 
 
 
    .wb_adr_i_1({wb4_adr_i[31:2],wb4_we_i,wb4_bte_i,wb4_cti_i}),
 
    .wb_dat_i_1({wb4_dat_i,wb4_sel_i}),
 
    .wb_dat_o_1(wb4_dat_o),
 
    .wb_stb_i_1(wb4_stb_i),
 
    .wb_cyc_i_1(wb4_cyc_i),
 
    .wb_ack_o_1(wb4_ack_o),
 
 
 
    .wb_adr_i_2(2'b0),
 
    .wb_dat_i_2(2'b0),
 
    .wb_dat_o_2(),
 
    .wb_stb_i_2(2'b0),
 
    .wb_cyc_i_2(2'b0),
 
    .wb_ack_o_2(),
 
 
 
    .wb_adr_i_3(2'b0),
 
    .wb_dat_i_3(2'b0),
 
    .wb_dat_o_3(),
 
    .wb_stb_i_3(2'b0),
 
    .wb_cyc_i_3(2'b0),
 
    .wb_ack_o_3(),
 
 
 
   // SDR SDRAM 16
 
`ifdef SDR_16
 
   .ba_pad_o(ba),
 
   .a_pad_o(a),
 
   .cs_n_pad_o(cs_n),
 
   .ras_pad_o(ras),
 
   .cas_pad_o(cas),
 
   .we_pad_o(we),
 
   .dq_o(dq_o),
 
   .dqm_pad_o(dqm),
 
   .dq_i(dq_i),
   .dq_i(dq_i),
 
        .dq_o(dq_o),
   .dq_oe(dq_oe),
   .dq_oe(dq_oe),
   .cke_pad_o(cke),
        // system
`endif
        .clk(wb_sdram_clk), .rst(wb_sdram_rst));
`ifdef DDR_16
 
   // DDR2 SDRAM 16
 
   .ck_pad_o(ck),
 
   .ck_n_pad_o(ck_n),
 
   .cke_pad_o(cke),
 
   .ck_fb_pad_o(ck_fb_o),
 
   .ck_fb_pad_i(ck_fb_i),
 
   .cs_n_pad_o(cs_n),
 
   .ras_pad_o(ras),
 
   .cas_pad_o(cas),
 
   .we_pad_o(we),
 
   .dm_rdqs_pad_io(dm_rdqs),
 
   .ba_pad_o(ba),
 
   .addr_pad_o(a),
 
   .dq_pad_io(dq_io),
 
   .dqs_pad_io(dqs_io),
 
   .dqs_oe(dqs_oe),
 
   .dqs_n_pad_io(dqs_n_io),
 
   .rdqs_n_pad_i(),
 
   .odt_pad_o(),
 
`endif
 
   // misc     
 
   .wb_clk({wb_clk,wb_clk}),
 
   .wb_rst({wb_rst,wb_rst}),
 
   .sdram_clk(sdram_clk),
 
   .sdram_rst(wb_rst)
 
   );
 
 
 
`ifdef SDR_16
 
   assign #1 dq_io = dq_oe ? dq_o : {16{1'bz}};
 
   assign #1 dq_i  = dq_io;
 
   assign #1 dqmd = dqm;
 
   assign #1 dqs_io = dqs_oe ? dqs_o : {2{1'bz}};
 
   assign #1 dqs_i  = dqs_io;
 
   assign #1 dqs_n_io = dqs_oe ? dqs_n_o : {2{1'bz}};
 
   assign #1 dqs_n_i  = dqs_n_io;
 
`endif
`endif
 
 
`ifdef DDR_16
// wishbone master(s)
   assign #1 dqmd = dqm;
generate
   assign    ck_fb_i = ck_fb_o;
        for (i=1; i <= nr_of_wbm; i=i+1) begin: wb_master
`endif
 
 
                wbm wbmi(
 
                .adr_o(wbm_a_adr_o[i]),
 
                .bte_o(wbm_a_bte_o[i]),
 
                .cti_o(wbm_a_cti_o[i]),
 
                .dat_o(wbm_a_dat_o[i]),
 
                .sel_o(wbm_a_sel_o[i]),
 
                .we_o (wbm_a_we_o[i]),
 
                .cyc_o(wbm_a_cyc_o[i]),
 
                .stb_o(wbm_a_stb_o[i]),
 
                .dat_i(wbm_a_dat_i[i]),
 
                .ack_i(wbm_a_ack_i[i]),
 
                .clk(wbm_a_clk[i]),
 
                .reset(wbm_a_rst[i]),
 
                .OK(wbm_OK[i])
 
);
 
 
 
        wb3wb3_bridge wbwb_bridgei (
 
        // wishbone slave side
 
        .wbs_dat_i(wbm_a_dat_o[i]),
 
        .wbs_adr_i(wbm_a_adr_o[i][31:2]),
 
        .wbs_sel_i(wbm_a_sel_o[i]),
 
        .wbs_bte_i(wbm_a_bte_o[i]),
 
        .wbs_cti_i(wbm_a_cti_o[i]),
 
        .wbs_we_i (wbm_a_we_o[i]),
 
        .wbs_cyc_i(wbm_a_cyc_o[i]),
 
        .wbs_stb_i(wbm_a_stb_o[i]),
 
        .wbs_dat_o(wbm_a_dat_i[i]),
 
        .wbs_ack_o(wbm_a_ack_i[i]),
 
        .wbs_clk(wbm_a_clk[i]),
 
        .wbs_rst(wbm_a_rst[i]),
 
        // wishbone master side
 
        .wbm_dat_o(wbm_b_dat_o[i]),
 
        .wbm_adr_o(wbm_b_adr_o[i]),
 
        .wbm_sel_o(wbm_b_sel_o[i]),
 
        .wbm_bte_o(wbm_b_bte_o[i]),
 
        .wbm_cti_o(wbm_b_cti_o[i]),
 
        .wbm_we_o (wbm_b_we_o[i]),
 
        .wbm_cyc_o(wbm_b_cyc_o[i]),
 
        .wbm_stb_o(wbm_b_stb_o[i]),
 
        .wbm_dat_i(wbm_b_dat_i[i]),
 
        .wbm_ack_i(wbm_b_ack_i[i]),
 
        .wbm_clk(wb_sdram_clk),
 
        .wbm_rst(wb_sdram_rst));
 
 
   assign #1 ad = a;
    end
   assign #1 bad = ba;
endgenerate
   assign #1 cked = cke;
 
   assign #1 cs_nd = cs_n;
 
   assign #1 rasd = ras;
 
   assign #1 casd = cas;
 
   assign #1 wed = we;
 
 
 
`ifdef SDR_16          // SDR SDRAM Simulation model
`define SINGLE_WB
mt48lc16m16a2 sdram
`ifdef SINGLE_WB
  (
        assign wb_sdram_dat_i=wbm_b_dat_o[1];
   .Dq(dq_io),
        assign wb_sdram_sel_i=wbm_b_sel_o[1];
   .Addr(ad),
        assign wb_sdram_adr_i=wbm_b_adr_o[1];
   .Ba(bad),
        assign wb_sdram_we_i =wbm_b_we_o[1];
   .Clk(sdram_clk),
        assign wb_sdram_bte_i=wbm_b_bte_o[1];
   .Cke(cked),
        assign wb_sdram_cti_i=wbm_b_cti_o[1];
   .Cs_n(cs_nd),
        assign wb_sdram_cyc_i=wbm_b_cyc_o[1];
   .Ras_n(rasd),
        assign wb_sdram_stb_i=wbm_b_stb_o[1];
   .Cas_n(casd),
        assign wbm_b_dat_i[1]=wb_sdram_dat_o;
   .We_n(wed),
        assign wbm_b_ack_i[1]=wb_sdram_ack_o;
   .Dqm(dqmd)
 
   );
 
`endif
 
`ifdef DDR_16          // DDR2 SDRAM Simulation model
 
ddr2 ddr2_sdram
 
  (
 
   .ck(ck),
 
   .ck_n(ck_n),
 
   .cke(cke),
 
   .cs_n(cs_n),
 
   .ras_n(ras),
 
   .cas_n(cas),
 
   .we_n(we),
 
   .dm_rdqs(dm_rdqs),
 
   .ba(ba),
 
   .addr(a),
 
   .dq(dq_io),
 
   .dqs(dqs_io),
 
   .dqs_n(dqs_n_io),
 
   .rdqs_n(),
 
   .odt()
 
   );
 
`endif
`endif
 
 
 
        assign OK = &wbm_OK;
 
 
 
 
 
generate
 
        for (i=1; i <= nr_of_wbm; i=i+1) begin: wb_reset
 
 
   // Wishbone reset
   // Wishbone reset
   initial
   initial
     begin
     begin
        #0      wb_rst = 1'b1;
                #0      wbm_a_rst[i] = 1'b1;
        #200    wb_rst = 1'b1;
                #200    wbm_a_rst[i] = 1'b0;
        #200000 wb_rst = 1'b0;
 
     end
     end
 
 
   // SDRAM reset
                // Wishbone clock
   initial
   initial
     begin
     begin
        #0      sdram_rst = 1'b1;
                #0 wbm_a_clk[i] = 1'b0;
        #200    sdram_rst = 1'b1;
                forever
        #200000 sdram_rst = 1'b0;
                        #(wb_clk_period/2) wbm_a_clk[i] = !wbm_a_clk[i];
     end
     end
 
 
   // Test bench reset
 
   initial
 
     begin
 
        #0      tb_rst = 1'b1;
 
        #200    tb_rst = 1'b1;
 
        //#200000 tb_rst = 1'b0;
 
        #300000 tb_rst = 1'b0;   // hold reset to let initialization complete
 
     end
     end
 
endgenerate
 
 
   // Wishbone clock
   // SDRAM reset
   initial
   initial
     begin
     begin
        #0 wb_clk = 1'b0;
        #0      wb_sdram_rst = 1'b1;
        forever
        #200    wb_sdram_rst = 1'b0;
          #(wb0_clk_period/2) wb_clk = !wb_clk;
 
     end
     end
 
 
   // SDRAM clock
   // SDRAM clock
   initial
   initial
     begin
     begin
        #0 sdram_clk = 1'b0;
        #0 wb_sdram_clk = 1'b0;
        forever
        forever
          #(sdram_clk_period/2) sdram_clk = !sdram_clk;
          #(sdram_clk_period/2) wb_sdram_clk = !wb_sdram_clk;
     end
     end
 
 
endmodule // versatile_mem_ctrl_tb
endmodule // versatile_mem_ctrl_tb
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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