Subversion Repositories ngs

Rev

Rev 58 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. /*
  2.  
  3. reset...init...save.start_write.stop_write.restore.start_read(compare).stop_read.loop
  4.  
  5. error...
  6.  
  7.  
  8.  
  9. */
  10. module mem_tester(
  11.  
  12.         clk,
  13.  
  14.         rst_n,
  15.  
  16.  
  17.         led, // LED flashing or not
  18.  
  19.  
  20. // SRAM signals
  21.         SRAM_DQ,   // sram inout databus
  22.  
  23.         SRAM_ADDR, // sram address bus
  24.  
  25.         SRAM_UB_N,
  26.         SRAM_LB_N,
  27.         SRAM_WE_N, //
  28.         SRAM_CE_N, //
  29.         SRAM_OE_N  //
  30. );
  31.  
  32. parameter SRAM_DATA_SIZE = 8;
  33. parameter SRAM_ADDR_SIZE = 19;
  34.  
  35.         inout [SRAM_DATA_SIZE-1:0] SRAM_DQ;
  36.         wire  [SRAM_DATA_SIZE-1:0] SRAM_DQ;
  37.         output [SRAM_ADDR_SIZE-1:0] SRAM_ADDR;
  38.         wire   [SRAM_ADDR_SIZE-1:0] SRAM_ADDR;
  39.         output SRAM_UB_N,SRAM_LB_N,SRAM_WE_N,SRAM_CE_N,SRAM_OE_N;
  40.         wire   SRAM_UB_N,SRAM_LB_N,SRAM_WE_N,SRAM_CE_N,SRAM_OE_N;
  41.  
  42.  
  43.  
  44.  
  45.         input clk;
  46.  
  47.         input rst_n;
  48.  
  49.         output led; reg led;
  50.  
  51.  
  52.         reg inc_pass_ctr; // increment passes counter (0000-9999 BCD)
  53.         reg inc_err_ctr;  // increment errors counter (10 red binary LEDs)
  54.  
  55.  
  56.         reg check_in_progress; // when 1 - enables errors checking
  57.  
  58.  
  59.         reg [19:0] ledflash;
  60.  
  61.         reg was_error;
  62.  
  63.  
  64.  
  65.         initial ledflash='d0;
  66.  
  67.         always @(posedge clk)
  68.         begin
  69.                 if( inc_pass_ctr )
  70.                         ledflash <= 20'd0;
  71.                 else if( !ledflash[19] )
  72.                         ledflash <= ledflash + 20'd1;
  73.         end
  74.  
  75.         always @(posedge clk)
  76.         begin
  77.                 led <= ledflash[19] ^ was_error;
  78.         end
  79.  
  80.  
  81.  
  82.         always @(posedge clk, negedge rst_n)
  83.         begin
  84.                 if( !rst_n )
  85.                         was_error <= 1'b0;
  86.                 else if( inc_err_ctr )
  87.                         was_error <= 1'b1;
  88.         end
  89.  
  90.  
  91.  
  92.         reg rnd_init,rnd_save,rnd_restore; // rnd_vec_gen control
  93.         wire [SRAM_DATA_SIZE-1:0] rnd_out; // rnd_vec_gen output
  94.  
  95.         reg sram_start,sram_rnw;
  96.         wire sram_stop,sram_ready;
  97.  
  98.         rnd_vec_gen my_rnd( .clk(clk), .init(rnd_init), .next(sram_ready), .save(rnd_save), .restore(rnd_restore), .out(rnd_out) );
  99.         defparam my_rnd.OUT_SIZE = SRAM_DATA_SIZE;
  100.         defparam my_rnd.LFSR_LENGTH = 41;
  101.         defparam my_rnd.LFSR_FEEDBACK = 3;
  102.  
  103.  
  104.  
  105.  
  106.         wire [SRAM_DATA_SIZE-1:0] sram_rdat;
  107.  
  108.         sram_control my_sram( .clk(clk), .clk2(clk), .start(sram_start), .rnw(sram_rnw), .stop(sram_stop), .ready(sram_ready),
  109.                               .rdat(sram_rdat), .wdat(rnd_out),
  110.                               .SRAM_DQ(SRAM_DQ), .SRAM_ADDR(SRAM_ADDR),
  111.                               .SRAM_CE_N(SRAM_CE_N), .SRAM_OE_N(SRAM_OE_N), .SRAM_WE_N(SRAM_WE_N) );
  112.         defparam my_sram.SRAM_DATA_SIZE = SRAM_DATA_SIZE;
  113.         defparam my_sram.SRAM_ADDR_SIZE = SRAM_ADDR_SIZE;
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121. // FSM states and registers
  122.         reg [3:0] curr_state,next_state;
  123.  
  124. parameter RESET        = 4'h0;
  125.  
  126. parameter INIT1        = 4'h1;
  127. parameter INIT2        = 4'h2;
  128.  
  129. parameter BEGIN_WRITE1 = 4'h3;
  130. parameter BEGIN_WRITE2 = 4'h4;
  131. parameter BEGIN_WRITE3 = 4'h5;
  132. parameter BEGIN_WRITE4 = 4'h6;
  133.  
  134. parameter WRITE        = 4'h7;
  135.  
  136. parameter BEGIN_READ1  = 4'h8;
  137. parameter BEGIN_READ2  = 4'h9;
  138. parameter BEGIN_READ3  = 4'hA;
  139. parameter BEGIN_READ4  = 4'hB;
  140.  
  141. parameter READ         = 4'hC;
  142.  
  143. parameter END_READ     = 4'hD;
  144.  
  145. parameter INC_PASSES1  = 4'hE;
  146. parameter INC_PASSES2  = 4'hF;
  147.  
  148.  
  149. // FSM dispatcher
  150.  
  151.         always @*
  152.         begin
  153.                 case( curr_state )
  154.  
  155.                 RESET:
  156.                         next_state <= INIT1;
  157.  
  158.                 INIT1:
  159.                         if( sram_stop )
  160.                                 next_state <= INIT2;
  161.                         else
  162.                                 next_state <= INIT1;
  163.  
  164.                 INIT2:
  165.                         next_state <= BEGIN_WRITE1;
  166.  
  167.                 BEGIN_WRITE1:
  168.                         next_state <= BEGIN_WRITE2;
  169.  
  170.                 BEGIN_WRITE2:
  171.                         next_state <= BEGIN_WRITE3;
  172.  
  173.                 BEGIN_WRITE3:
  174.                         next_state <= BEGIN_WRITE4;
  175.  
  176.                 BEGIN_WRITE4:
  177.                         next_state <= WRITE;
  178.  
  179.                 WRITE:
  180.                         if( sram_stop )
  181.                                 next_state <= BEGIN_READ1;
  182.                         else
  183.                                 next_state <= WRITE;
  184.  
  185.                 BEGIN_READ1:
  186.                         next_state <= BEGIN_READ2;
  187.  
  188.                 BEGIN_READ2:
  189.                         next_state <= BEGIN_READ3;
  190.  
  191.                 BEGIN_READ3:
  192.                         next_state <= BEGIN_READ4;
  193.  
  194.                 BEGIN_READ4:
  195.                         next_state <= READ;
  196.  
  197.                 READ:
  198.                         if( sram_stop )
  199.                                 next_state <= END_READ;
  200.                         else
  201.                                 next_state <= READ;
  202.  
  203.                 END_READ:
  204.                         next_state <= INC_PASSES1;
  205.  
  206.                 INC_PASSES1:
  207.                         next_state <= INC_PASSES2;
  208.  
  209.                 INC_PASSES2:
  210.                         next_state <= BEGIN_WRITE1;
  211.  
  212.  
  213.  
  214.  
  215.                 default:
  216.                         next_state <= RESET;
  217.  
  218.  
  219.                 endcase
  220.         end
  221.  
  222.  
  223. // FSM sequencer
  224.  
  225.         always @(posedge clk,negedge rst_n)
  226.         begin
  227.                 if( !rst_n )
  228.                         curr_state <= RESET;
  229.                 else
  230.                         curr_state <= next_state;
  231.         end
  232.  
  233.  
  234. // FSM controller
  235.  
  236.         always @(posedge clk)
  237.         begin
  238.                 case( curr_state )
  239.  
  240. //////////////////////////////////////////////////
  241.                 RESET:
  242.                 begin
  243.                         // various initializings begin
  244.  
  245.                         inc_pass_ctr <= 1'b0;
  246.  
  247.                         check_in_progress <= 1'b0;
  248.  
  249.                         rnd_init <= 1'b1; //begin RND init
  250.  
  251.                         rnd_save <= 1'b0;
  252.                         rnd_restore <= 1'b0;
  253.  
  254.                         sram_start <= 1'b1;
  255.                         sram_rnw   <= 1'b1; // start condition for sram controller, in read mode
  256.                 end
  257.  
  258.                 INIT1:
  259.                 begin
  260.                   sram_start <= 1'b0; // end sram start
  261.                 end
  262.  
  263.                 INIT2:
  264.                 begin
  265.                         rnd_init <= 1'b0; // end rnd init
  266.                 end
  267.  
  268.  
  269.  
  270. //////////////////////////////////////////////////
  271.                 BEGIN_WRITE1:
  272.                 begin
  273.                         rnd_save <= 1'b1;
  274.                         sram_rnw <= 1'b0;
  275.                 end
  276.  
  277.                 BEGIN_WRITE2:
  278.                 begin
  279.                         rnd_save   <= 1'b0;
  280.                         sram_start <= 1'b1;
  281.                 end
  282.  
  283.                 BEGIN_WRITE3:
  284.                 begin
  285.                         sram_start <= 1'b0;
  286.                 end
  287.  
  288. /*              BEGIN_WRITE4:
  289.                 begin
  290.                         rnd_save   <= 1'b0;
  291.                         sram_start <= 1'b1;
  292.                 end
  293.  
  294.                 WRITE:
  295.                 begin
  296.                         sram_start <= 1'b0;
  297.                 end
  298. */
  299.  
  300.  
  301.  
  302. //////////////////////////////////////////////////
  303.                 BEGIN_READ1:
  304.                 begin
  305.                         rnd_restore <= 1'b1;
  306.                         sram_rnw <= 1'b1;
  307.                 end
  308.  
  309.                 BEGIN_READ2:
  310.                 begin
  311.                   rnd_restore <= 1'b0;
  312.                   sram_start <= 1'b1;
  313.                 end
  314.  
  315.                 BEGIN_READ3:
  316.                 begin
  317.                         sram_start <= 1'b0;
  318.                                 check_in_progress <= 1'b1;
  319.                 end
  320.  
  321. /*              BEGIN_READ4:
  322.                 begin
  323.                   rnd_restore <= 1'b0;
  324.                   sram_start <= 1'b1;
  325.                 end
  326.  
  327.                 READ:
  328.                 begin
  329.                         sram_start <= 1'b0;
  330.                         check_in_progress <= 1'b1;
  331.                 end
  332. */
  333.                 END_READ:
  334.                 begin
  335.                         check_in_progress <= 1'b0;
  336.                 end
  337.  
  338.                 INC_PASSES1:
  339.                 begin
  340.                         inc_pass_ctr <= 1'b1;
  341.                 end
  342.  
  343.                 INC_PASSES2:
  344.                 begin
  345.                         inc_pass_ctr <= 1'b0;
  346.                 end
  347.  
  348.  
  349.  
  350.  
  351.                 endcase
  352.         end
  353.  
  354.  
  355.  
  356. // errors counter
  357.  
  358.         always @(posedge clk)
  359.                 inc_err_ctr <= check_in_progress & sram_ready & ((sram_rdat==rnd_out)?0:1);
  360.  
  361.  
  362.  
  363. endmodule
  364.  
  365.  
  366.