Subversion Repositories pentevo

Rev

Rev 255 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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