URL
https://opencores.org/ocsvn/sdr_ctrl/sdr_ctrl/trunk
Subversion Repositories sdr_ctrl
[/] [sdr_ctrl/] [trunk/] [verif/] [tb/] [tb_top.sv] - Rev 44
Go to most recent revision | Compare with Previous | Blame | View Log
////////////////////////////////////////////////////////////////////////// //////// //////// This file is part of the SDRAM Controller project //////// http://www.opencores.org/cores/sdr_ctrl/ //////// //////// Description //////// SDRAM CTRL definitions. //////// //////// To Do: //////// nothing //////// ////// Version :0.1 - Test Bench automation is improvised with ////// seperate data,address,burst length fifo. ////// Now user can create different write and ////// read sequence ////// //////// Author(s): //////// - Dinesh Annayya, dinesha@opencores.org //////// ////////////////////////////////////////////////////////////////////////////// //////// Copyright (C) 2000 Authors and OPENCORES.ORG //////// //////// This source file may be used and distributed without //////// restriction provided that this copyright statement is not //////// removed from the file and that any derivative work contains //////// the original copyright notice and the associated disclaimer. //////// //////// This source file is free software; you can redistribute it //////// and/or modify it under the terms of the GNU Lesser General //////// Public License as published by the Free Software Foundation; //////// either version 2.1 of the License, or (at your option) any //////// later version. //////// //////// This source is distributed in the hope that it will be //////// useful, but WITHOUT ANY WARRANTY; without even the implied //////// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //////// PURPOSE. See the GNU Lesser General Public License for more //////// details. //////// //////// You should have received a copy of the GNU Lesser General //////// Public License along with this source; if not, download it //////// from http://www.opencores.org/lgpl.shtml //////// //////////////////////////////////////////////////////////////////////////`timescale 1ns/1ps// This testbench verify with SDRAM TOPmodule tb_top;parameter P_SYS = 10; // 200MHzparameter P_SDR = 20; // 100MHz// Generalreg RESETN;reg sdram_clk;reg sys_clk;initial sys_clk = 0;initial sdram_clk = 0;always #(P_SYS/2) sys_clk = !sys_clk;always #(P_SDR/2) sdram_clk = !sdram_clk;parameter dw = 32; // data widthparameter tw = 8; // tag id widthparameter bl = 5; // burst_lenght_width//-------------------------------------------// WISH BONE Interface//-------------------------------------------//--------------------------------------// Wish Bone Interface// -------------------------------------reg wb_stb_i ;wire wb_ack_o ;reg [29:0] wb_addr_i ;reg wb_we_i ; // 1 - Write, 0 - Readreg [dw-1:0] wb_dat_i ;reg [dw/8-1:0] wb_sel_i ; // Byte enablewire [dw-1:0] wb_dat_o ;reg wb_cyc_i ;reg [2:0] wb_cti_i ;//--------------------------------------------// SDRAM I/F//--------------------------------------------`ifdef SDR_32BITwire [31:0] Dq ; // SDRAM Read/Write Data Buswire [3:0] sdr_dqm ; // SDRAM DATA Mask`elsif SDR_16BITwire [15:0] Dq ; // SDRAM Read/Write Data Buswire [1:0] sdr_dqm ; // SDRAM DATA Mask`elsewire [7:0] Dq ; // SDRAM Read/Write Data Buswire [0:0] sdr_dqm ; // SDRAM DATA Mask`endifwire [1:0] sdr_ba ; // SDRAM Bank Selectwire [11:0] sdr_addr ; // SDRAM ADRESSwire sdr_init_done ; // SDRAM Init Done// to fix the sdram interface timing issuewire #(2.0) sdram_clk_d = sdram_clk;`ifdef SDR_32BITsdrc_top #(.SDR_DW(32),.SDR_BW(4)) u_dut(`elsif SDR_16BITsdrc_top #(.SDR_DW(16),.SDR_BW(2)) u_dut(`else // 8 BIT SDRAMsdrc_top #(.SDR_DW(8),.SDR_BW(1)) u_dut(`endif// System`ifdef SDR_32BIT.cfg_sdr_width (2'b00 ), // 32 BIT SDRAM`elsif SDR_16BIT.cfg_sdr_width (2'b01 ), // 16 BIT SDRAM`else.cfg_sdr_width (2'b10 ), // 8 BIT SDRAM`endif.cfg_colbits (2'b00 ), // 8 Bit Column Address/* WISH BONE */.wb_rst_i (!RESETN ),.wb_clk_i (sys_clk ),.wb_stb_i (wb_stb_i ),.wb_ack_o (wb_ack_o ),.wb_addr_i (wb_addr_i ),.wb_we_i (wb_we_i ),.wb_dat_i (wb_dat_i ),.wb_sel_i (wb_sel_i ),.wb_dat_o (wb_dat_o ),.wb_cyc_i (wb_cyc_i ),.wb_cti_i (wb_cti_i ),/* Interface to SDRAMs */.sdram_clk (sdram_clk ),.sdram_resetn (RESETN ),.sdr_cs_n (sdr_cs_n ),.sdr_cke (sdr_cke ),.sdr_ras_n (sdr_ras_n ),.sdr_cas_n (sdr_cas_n ),.sdr_we_n (sdr_we_n ),.sdr_dqm (sdr_dqm ),.sdr_ba (sdr_ba ),.sdr_addr (sdr_addr ),.sdr_dq (Dq ),/* Parameters */.sdr_init_done (sdr_init_done ),.cfg_req_depth (2'h3 ), //how many req. buffer should hold.cfg_sdr_en (1'b1 ),.cfg_sdr_mode_reg (12'h033 ),.cfg_sdr_tras_d (4'h4 ),.cfg_sdr_trp_d (4'h2 ),.cfg_sdr_trcd_d (4'h2 ),.cfg_sdr_cas (3'h3 ),.cfg_sdr_trcar_d (4'h7 ),.cfg_sdr_twr_d (4'h1 ),.cfg_sdr_rfsh (12'hC35 ),.cfg_sdr_rfmax (3'h6 ));`ifdef SDR_32BITmt48lc2m32b2 #(.data_bits(32)) u_sdram32 (.Dq (Dq ) ,.Addr (sdr_addr ),.Ba (sdr_ba ),.Clk (sdram_clk_d ),.Cke (sdr_cke ),.Cs_n (sdr_cs_n ),.Ras_n (sdr_ras_n ),.Cas_n (sdr_cas_n ),.We_n (sdr_we_n ),.Dqm (sdr_dqm ));`elsif SDR_16BITIS42VM16400K u_sdram16 (.dq (Dq ),.addr (sdr_addr ),.ba (sdr_ba ),.clk (sdram_clk_d ),.cke (sdr_cke ),.csb (sdr_cs_n ),.rasb (sdr_ras_n ),.casb (sdr_cas_n ),.web (sdr_we_n ),.dqm (sdr_dqm ));`elsemt48lc8m8a2 #(.data_bits(8)) u_sdram8 (.Dq (Dq ) ,.Addr (sdr_addr ),.Ba (sdr_ba ),.Clk (sdram_clk_d ),.Cke (sdr_cke ),.Cs_n (sdr_cs_n ),.Ras_n (sdr_ras_n ),.Cas_n (sdr_cas_n ),.We_n (sdr_we_n ),.Dqm (sdr_dqm ));`endif//--------------------// data/address/burst length FIFO//--------------------int dfifo[$]; // data fifoint afifo[$]; // address fifoint bfifo[$]; // Burst Length fiforeg [31:0] read_data;reg [31:0] ErrCnt;int k;reg [31:0] StartAddr;/////////////////////////////////////////////////////////////////////////// Test Case/////////////////////////////////////////////////////////////////////////initial begin //{ErrCnt = 0;wb_addr_i = 0;wb_dat_i = 0;wb_sel_i = 4'h0;wb_we_i = 0;wb_stb_i = 0;wb_cyc_i = 0;RESETN = 1'h1;#100// Applying resetRESETN = 1'h0;#10000;// Releasing resetRESETN = 1'h1;#1000;wait(u_dut.sdr_init_done == 1);#1000;burst_write(32'h4_0000,8'h4);#1000;burst_read();#1000;burst_write(32'h0040_0000,8'h5);#1000;burst_read();// 4 Write & 4 Readburst_write(32'h4_0000,8'h4);burst_write(32'h5_0000,8'h5);burst_write(32'h6_0000,8'h6);burst_write(32'h7_0000,8'h7);burst_read();burst_read();burst_read();burst_read();// 2 write and 2 read randomfor(k=0; k < 20; k++) beginStartAddr = $random & 32'h003FFFFF;burst_write(StartAddr,($random & 8'h3f)+1);#100;StartAddr = $random & 32'h003FFFFF;burst_write(StartAddr,($random & 8'h3f)+1);#100;burst_read();#100;burst_read();#100;end#10000;$display("###############################");if(ErrCnt == 0)$display("STATUS: SDRAM Write/Read TEST PASSED");else$display("ERROR: SDRAM Write/Read TEST FAILED");$display("###############################");$finish;endtask burst_write;input [31:0] Address;input [7:0] bl;int i;beginafifo.push_back(Address);bfifo.push_back(bl);@ (negedge sys_clk);$display("Write Address: %x, Burst Size: %d",Address,bl);for(i=0; i < bl; i++) beginwb_stb_i = 1;wb_cyc_i = 1;wb_we_i = 1;wb_sel_i = 4'b1111;wb_addr_i = Address[31:2]+i;wb_dat_i = $random & 32'hFFFFFFFF;dfifo.push_back(wb_dat_i);do begin@ (posedge sys_clk);end while(wb_ack_o == 1'b0);@ (negedge sys_clk);$display("Status: Burst-No: %d Write Address: %x WriteData: %x ",i,wb_addr_i,wb_dat_i);endwb_stb_i = 0;wb_cyc_i = 0;endendtasktask burst_read;reg [31:0] Address;reg [7:0] bl;int i,j;reg [31:0] exp_data;beginAddress = afifo.pop_front();bl = bfifo.pop_front();@ (negedge sys_clk);for(j=0; j < bl; j++) beginwb_stb_i = 1;wb_cyc_i = 1;wb_we_i = 0;wb_addr_i = Address[31:2]+j;exp_data = dfifo.pop_front(); // Exptected Read Datado begin@ (posedge sys_clk);end while(wb_ack_o == 1'b0);if(wb_dat_o !== exp_data) begin$display("READ ERROR: Burst-No: %d Addr: %x Rxp: %x Exd: %x",j,wb_addr_i,wb_dat_o,exp_data);ErrCnt = ErrCnt+1;end else begin$display("READ STATUS: Burst-No: %d Addr: %x Rxd: %x",j,wb_addr_i,wb_dat_o);end@ (negedge sdram_clk);endwb_stb_i = 0;wb_cyc_i = 0;endendtaskendmodule
Go to most recent revision | Compare with Previous | Blame | View Log
