Subversion Repositories pentevo

Rev

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