⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 idt_512kx18_pbsram_test.v

📁 verilog 写的 memory controller
💻 V
📖 第 1 页 / 共 2 页
字号:
///////////////////////////////////////////////////////////////    Test fixture for IDT 9Meg Synchronous Burst SRAMs//              (for 512K x 18 configurations)////////////////////////////////////////////////////////////`timescale 1ns / 10ps`define Max 16`define Max1 8`define Max2 16module main;parameter addr_msb = 18;/////// Remove comments for specific device under test //////////////////////////////////////////////////////Pipelined sync burst SRAMs////////////////////////////////////////////////////// 2.5v I/O ////////////parameter pipe = 1, Tcyc = 7.5, Tsu = 1.5, Tdh = 0.5, Tcd = 4.2, Toe = 4.2;           `define device idt71t67802s133//parameter pipe = 1, Tcyc = 6.7, Tsu = 1.5, Tdh = 0.5, Tcd = 3.8, Toe = 3.8; //          `define device idt71t67802s150//parameter pipe = 1, Tcyc = 6.0, Tsu = 1.5, Tdh = 0.5, Tcd = 3.5, Toe = 3.5; //          `define device idt71t67802s166//////////////////////////////////////////////////Flow-through sync burst SRAMs/////////////////////////////////////////////////////// 2.5v I/O //////////////parameter pipe = 0, Tcyc = 11.5, Tsu = 2.0, Tdh = 0.5, Tcd = 8.5, Toe = 3.5; //          `define device idt71t67902s85//parameter pipe = 0, Tcyc = 10.0, Tsu = 2.0, Tdh = 0.5, Tcd = 8.0, Toe = 3.5; //          `define device idt71t67902s80//parameter pipe = 0, Tcyc = 8.5,  Tsu = 1.5, Tdh = 0.5, Tcd = 7.5, Toe = 3.5; //          `define device idt71t67902s75reg   [addr_msb:0] A;reg          CLK;reg          ADSP_;reg          ADV_;reg          LBO_;reg          ADSC_;reg    [2:1] BW_;reg          BWE_;reg          GW_;reg          CE_;reg          CS0;reg          CS1_;reg          OE_;reg   [17:0] DataOut;reg   [17:0] TempReg;reg   [17:0] DQ;wire  [15:0] DQbus = {DQ[16:9], DQ[7:0]};wire  [2:1]  DQPbus = {DQ[17], DQ[8]};reg   [17:0] Dstore[0:`Max-1];              //temp data storereg   [17:0] data;reg   [addr_msb:0] lastaddr;reg          tempcs1_;reg          tempcs0;reg          tempce_;reg   [17:0] RandomData[0:`Max-1];reg   [17:0] BurstData[0:`Max-1];reg  [8*4:1] status;                       //data read pass/fail//internalreg check_data_m1, qual_ads;reg check_data;integer   i,j,addrb,counter,          result;// Output filesinitial begin  $recordfile ("idt_sram_67802.trn");  $recordvars;//  $dumpfile ("idt_sram_67802.vcd");//  $dumpvars;  result = $fopen("idt_sram.res"); if (result == 0) $finish;endalways begin  @(posedge CLK)     $fdisplay(result,      "%b",  ADSC_,      "%b",  ADSP_,      "%b",  BWE_,      "%b",  CE_,      "%b",  CS0,      "%b",  CS1_,      "%b",  LBO_,      "%b",  OE_,      "%b",  BW_,  // 2 bits      "%b",  ADV_,      "%b ", GW_,      "%h ", {DQPbus[2], DQbus[15:8], DQPbus[1], DQbus[7:0]},      "%h ", A,      "%d", $stime      );endinitial begin  ADSC_ = 1;  ADSP_ = 1;  BWE_  = 1;  CE_   = 0;  CS0   = 1;  CS1_  = 0;  LBO_  = 0;  OE_   = 1;  CLK   = 0;  BW_   = 2'hf;  ADV_  = 1;  GW_   = 1;  counter = 0;  for (i=0;i<`Max;i=i+1) begin           // Generate random data for testing    RandomData[i] = $random;  end//****************//disable_ce;//disable_cs0;//####init;$display($time,"(1)  write        adsp_ = 0");for(i=0; i<`Max1; i=i+1) beginwrite(i,i,0,1,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0end$display($time,"     read         adsp_ = 0");for(i=0; i<`Max1; i=i+1) beginread(i,0,1,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0enddummy_cyc(1);$display($time,"                  status = %s",status); //####init;$display($time,"(2)  write        adsc_ = 0");for(i=0; i<`Max1; i=i+1) beginwrite(i,i,1,0,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0end$display($time,"     read         adsc_ = 0");for(i=0; i<`Max1; i=i+1) beginread(i,1,0,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0end$display($time,"                  status = %s",status);//####init;$display($time,"(3)  write        adsp_ = 0");for(i=0; i<`Max1; i=i+1) beginwrite(i,i,0,1,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0end$display($time,"     read         adsp_ = 0 cs1_ = 1 - every other cyc");for(i=0; i<`Max1; i=i+2) beginread(i,0,1,0,1,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0read(i+1,0,1,0,0,1);                     //addr,adsp_,adsc_,ce_,cs1_,cs0end$display($time,"                  status = %s",status);//####init;$display($time,"(4)  write/read   adsp_ = 0");for(i=0; i<`Max1; i=i+1) beginwrite(i,i,0,1,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0read(i,0,1,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0end$display($time,"                  status = %s",status);//####init;$display($time,"(5)  write/read   adsc_ = 0");for(i=0; i<`Max1; i=i+1) beginwrite(i,i,1,0,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0read(i,1,0,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0dummy_cyc(1);end$display($time,"                  status = %s",status);//####init;$display($time,"(6)  burst_write  adsp_ = 0");for(i=0; i<`Max2; i=i+4) beginburst_write(i,i,0,1,0,0,0,1,4);          //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0,nburstend$display($time,"     burst_read   adsp_ = 0");for(i=0; i<`Max2; i=i+4) beginburst_read(i,0,1,0,0,1,4);               //addr,adsp_,adsc_,ce_,cs1_,cs0,nburstenddummy_cyc(1);$display($time,"                  status = %s",status);//####init;$display($time,"(7)  burst_write  adsc_ = 0");for(i=0; i<`Max2; i=i+4) beginburst_write(i,i,1,0,0,0,0,1,4);          //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0,nburstend$display($time,"     burst_read   adsc_ = 0");for(i=0; i<`Max2; i=i+4) beginburst_read(i,1,0,0,0,1,4);               //addr,adsp_,adsc_,ce_,cs1_,cs0,nburstend$display($time,"                  status = %s",status);//####init;$display($time,"(8)  write        adsp_ = 0 cs1_ = 1 - every other cyc");for(i=0; i<`Max1; i=i+2) beginwrite(i,i,0,1,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0write(i+1,9,0,1,0,0,1,1);                //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0end$display($time,"     read         adsp_ = 0");for(i=0; i<`Max1; i=i+2) beginread(i,0,1,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0end$display($time,"                  status = %s",status);//####init;$display($time,"(9)  write        adsp_ = 0 cs0  = 0 - every other cyc");for(i=0; i<`Max1; i=i+2) beginwrite(i,i,0,1,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0write(i+1,9,0,1,0,0,0,0);                //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0end$display($time,"     read         adsc_ = 0");for(i=0; i<`Max1; i=i+2) beginread(i,1,0,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0end$display($time,"                  status = %s",status);//####init;$display($time,"(10) write        adsp_ = 0 ce_  = 1 - every other cyc");for(i=0; i<`Max1; i=i+2) beginwrite(i,i,0,1,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0write(i+1,i,0,1,0,1,0,1);                //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0endwrite(i,i,0,1,0,0,0,1);                  //this will write last address to Dstore$display($time,"     read         adsp_ = 0");for(i=0; i<`Max1; i=i+2) beginread(i,0,1,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0end$display($time,"                  status = %s",status);//####init;$display($time,"(11) write        adsc_ = 0 ce_  = 1 - every other cyc");for(i=0; i<`Max1; i=i+2) beginwrite(i,i,1,0,0,0,0,1);                  //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0write(i+1,i+1,1,0,0,1,0,1);              //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0endwrite(i,i,1,0,0,0,0,1);                  //this will write last address to Dstore$display($time,"     read         adsc_ = 0");for(i=0; i<`Max1; i=i+2) beginread(i,1,0,0,0,1);                       //addr,adsp_,adsc_,ce_,cs1_,cs0end$display($time,"                  status = %s",status);//####init;$display($time,"(12) burst_write_adv  adsc_ = 0 adv_ = 1 - 2nd cyc");for(i=0; i<`Max2; i=i+4) beginburst_write_adv(i,i,1,0,0,0,0,1,1,0);     //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0,adv_,tempcounterburst_write_adv(i,i,1,0,0,0,0,1,1,1);     burst_write_adv(i+1,i+1,1,0,0,0,0,1,0,2); burst_write_adv(i+2,i+2,1,0,0,0,0,1,0,3); burst_write_adv(i+3,i+3,1,0,0,0,0,1,0,4); end$display($time,"     burst_read   adsc_ = 0");for(i=0; i<`Max2; i=i+4) beginburst_read(i,1,0,0,0,1,4);               //addr,adsp_,adsc_,ce_,cs1_,cs0,nburstend$display($time,"                  status = %s",status);//####init;$display($time,"(13) burst_write_adv  adsp_ = 0 adv_ = 1 - 2nd cyc");for(i=0; i<`Max2; i=i+4) beginburst_write_adv(i,i,0,1,0,0,0,1,1,0);     //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0,adv_,tempcounterburst_write_adv(i,i,0,0,0,1,0,1,1,1);     burst_write_adv(i+1,i+1,0,1,0,0,0,1,0,2); burst_write_adv(i+2,i+2,0,1,0,0,0,1,0,3); burst_write_adv(i+3,i+3,0,1,0,0,0,1,0,4); end$display($time,"     burst_read   adsc_ = 0");for(i=0; i<`Max2; i=i+4) beginburst_read(i,1,0,0,0,1,4);               //addr,adsp_,adsc_,ce_,cs1_,cs0,nburstend$display($time,"                  status = %s",status);//####init;$display($time,"(14) burst_write  adsp_ = 0");for(i=0; i<`Max2; i=i+4) beginburst_write(i,i,0,1,0,0,0,1,4);          //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0,nburstend$display($time,"     burst_read_adv   adsp_ = 0 adv_ = 1 - 3rd cyc");for(i=0; i<`Max2; i=i+4) beginburst_read_adv(i,  0,1,0,0,1,1,0);       //addr,adsp_,adsc_,ce_,cs1_,cs0,adv_,tempcounterburst_read_adv(i+1,1,1,0,0,1,0,1);       burst_read_adv(i+2,1,1,0,0,1,1,2);      burst_read_adv(i+3,1,1,0,0,1,0,3);     end$display($time,"                  status = %s",status);//####init;$display($time,"(15) burst_write  adsp_ = 0");for(i=0; i<`Max2; i=i+4) beginburst_write(i,i,0,1,0,0,0,1,4);          //addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0,nburstend$display($time,"     burst_read_adv   adsp_=1/ce_=0 - 2/3 cyc, adsp = 0/ce_=1 - 4/5 cyc");for(i=0; i<`Max2; i=i+4) beginburst_read_adv(i,  0,1,0,0,1,1,0);       //addr,adsp_,adsc_,ce_,cs1_,cs0,adv_,tempcounterburst_read_adv(i+1,1,1,0,0,1,0,1);       burst_read_adv(i+2,1,1,0,0,1,0,2);       burst_read_adv(i+3,0,1,1,0,1,0,3);       burst_read_adv(i,  0,1,1,0,1,0,4);       end$display($time,"                  status = %s",status);//####@( negedge CLK );@( negedge CLK );@( negedge CLK );//*****************CE_ = 0;CS0 = 1;CS1_ = 0;  $display($time,,"Simple read/write test");  for (i=0;i<`Max;i=i+1) begin      // Test straight write/read    write_random(i, RandomData[i]);  $display($time,,"Simple read test");    read_random(i, DataOut, RandomData[i]);  end $display($time,,"CE_ disable - random data"); read_random(3, DataOut, RandomData[3]); disable_ce; read_random(7, DataOut, RandomData[7]); disable_cs0; read_random(2, DataOut, RandomData[2]);  for (i=0;i<`Max;i=i+1) begin      // Fill RAM with zero's    write_random(i, 0);  end  $display($time,,"Byte mode read/write test - random data");//  GW_ = 1;                        // Disable global write//  BWE_  = 0;                      // Enable byte write  for (i=0;i<`Max;i=i+1) begin    // Test byte write/read    BW_ = $random;    TempReg = RandomData[i];    byte_write_random(i, TempReg);    if ( BW_[1] == 1 ) TempReg[8:0] = 0;    if ( BW_[2] == 1 ) TempReg[17:9] = 0;    read_random(i, DataOut, TempReg);  end  BWE_  = 1;                      // Disable byte write  // Test burst mode write/read  $display($time,,"Burst mode read/write test - random data");  for (i=0;i<`Max;i=i+1) begin      // Test byte write/read      BurstData[i] = RandomData[i];  end  GW_ = 0;                       // Enable global write  for (i=0;i<`Max;i=i+4) begin   // Write data from BurstData buffer    burst_write_random(i,4);   end  GW_ = 1;                       // Disable global write  for (i=0;j<`Max;i=i+1) begin   // Clear data buffer      BurstData[i] = 0;  end    for (i=0;i<`Max;i=i+4) begin    burst_read_random(i,4); //    for (j=i;j<i+4;j=j+1) begin      // verify read data//      if ( BurstData[j] != RandomData[j] )//          $display("%d  Burst error: Addr %h Exp %h Act %h", $stime, j, RandomData[j], BurstData[j]);//    end  end  burst_wrap_random(0);  disable_ce;  burst_rd_pipe_random(0,4);  $finish;end/////////////////////////////////////////////////////////////////always @(posedge CLK) begin   if ((~ADSC_ | ~ADSP_) & ~CE_ & CS0 & ~CS1_) qual_ads <= #1 1;   else qual_ads <= #1 0;   check_data_m1 <= #1 ~ADV_;   if (pipe == 0) check_data = #1 (qual_ads | ~ADV_);   else check_data = #1 (qual_ads | check_data_m1);endalways #(Tcyc/2) CLK = ~CLK;`device  dut (    .A        (A),     .D        (DQbus),     .DP       (DQPbus),     .oe_      (OE_),    .ce_      (CE_),    .cs0      (CS0),    .cs1_     (CS1_),    .lbo_     (LBO_),    .gw_      (GW_),    .bwe_     (BWE_),    .bw2_     (BW_[2]),    .bw1_     (BW_[1]),    .adsp_    (ADSP_),    .adsc_    (ADSC_),    .adv_     (ADV_),    .clk      (CLK)    );//================ test bench taskstask disable_ce;begin    OE_ = 0;    if (CLK)        @( negedge CLK );    ADSC_ = 0;    CE_   = 1;    @( posedge CLK );    @( negedge CLK );    ADSC_ = 1;    CE_   = 0;endendtasktask disable_cs0;begin    OE_ = 0;    if (CLK)        @( negedge CLK );    ADSP_ = 0;    CS0   = 0;    @( posedge CLK );    @( negedge CLK );    ADSP_ = 1;    CS0   = 1;endendtasktask dummy_cyc;input oe;begin@(posedge CLK);  @(negedge CLK);   #Tcd;   OE_ = oe;endendtasktask init;begin  for(i=0; i<`Max2; i=i+1) begin         // fill memory with 0 data    write(i,0,0,1,0,0,0,1);              // addr,data,adsp_,adsc_,gw_,ce_,cs1_,cs0    Dstore[i] = 18'hx;                   // fill temp memory with xx data  endendendtasktask read;                   // ADSP|ADSC controlled PL - adsp_/adsc_ 2cycle readinput  [addr_msb:0] addr;    // ADSP|ADSC controlled FT - adsp_/adsc_ 1cycle readinput  adsp_;input  adsc_;input  ce_; input  cs1_;input  cs0; begin   @( negedge CLK );    #(Tcyc/2 - Tsu);    A     = addr;    ADV_  = 1;    GW_   = 1;    BWE_  = 1;    ADSP_ = adsp_;    ADSC_ = adsc_;    CE_   = ce_;    CS1_  = cs1_;    CS0   = cs0;      assign data = {DQPbus[2], DQbus[15:8], DQPbus[1], DQbus[7:0]};   @( posedge CLK );           // SRAM latches Address and begins internal read     tempcs0  <= cs0; tempcs1_  <= cs1_; tempce_  <= ce_;     lastaddr <= addr;     A <= #Tdh 19'hz;     ADSP_ <= #Tdh 1;     ADSC_ <= #Tdh 1;     CE_ <= #Tdh 1;     CS1_<= #Tdh 1;     CS0 <= #Tdh 0;     if(pipe == 1)       OE_ <= #(Tcyc+Tcd-Toe) 0;     else if(pipe == 0)        OE_ <= #(Tcd-Toe) 0;     if(counter != 0)       if ( data !== Dstore[lastaddr] ) begin         if (tempcs0 & ~tempce_ & ~tempcs1_) begin         status = "FAIL";            $display("%d Read error: Addr %h Exp %h Act %h", $stime, lastaddr,                       Dstore[lastaddr], data);         end         end       else if (tempcs0 & ~tempce_ & ~tempcs1_)               status = "PASS";    DQ = 18'hz;    if(pipe == 1)      #(Tcyc/2);    counter = counter+1;endendtasktask burst_read;             // ADSP|ADSC controlled - adsp/adsc 3-1-1-1 PL readinput  [addr_msb:0] addr;    //                        adsp/adsc 2-1-1-1 FT readinput  adsp_;input  adsc_;input  ce_; input  cs1_;input  cs0; input  [3:0] nburst;integer tempaddr,tempcounter;begin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -