Subversion Repositories ngs

Rev

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

  1. // dma_data_consumer
  2. // dma_data_supplier
  3. // dma_access_controller
  4. //
  5. // чрфрўр. ўшЄрЄ№ ш яшёрЄ№ Ёрчэ√х юсырёЄш ярь Єш, юфэютЁхьхээю т 4 яюЄюър
  6. // ш ёЁртэштрЄ№ яЁюўшЄрээюх ё чряшёрээ√ь. ╫шЄрЄ№ сєЁёЄрьш 1-N1 срщЄ ё ярєчющ 0-N2 ЄръЄют ьхцфє ърцф√ьш
  7. //
  8. //
  9.  
  10.  
  11.  
  12. module dma_tester(
  13.  
  14.         input  wire        clk,
  15.  
  16.         input  wire        can_go,
  17.  
  18.  
  19.         output reg         req,
  20.         output reg         rnw,
  21.         output reg   [7:0] wd,
  22.         output reg  [20:0] addr,
  23.  
  24.         input  wire        ack,
  25.         input  wire        done,
  26.         input  wire  [7:0] rd
  27. );
  28.         parameter BEG_ADDR = 21'h00C000;
  29.         parameter BLK_SIZE = 21'd004096;
  30.  
  31.  
  32.  
  33.         reg         first; // 1 when first cycle in sequence of either reads or writes
  34.  
  35.  
  36.         reg rnw_done;   // to store rnw until reader gets it at done signal
  37.         reg first_done; //
  38.  
  39.  
  40.  
  41.         // address/dir generation
  42.         //
  43.         always @(posedge clk, negedge can_go)
  44.         begin
  45.                 if( !can_go )
  46.                 begin
  47.                         addr  = BEG_ADDR;
  48.                         rnw   = 1'b1;     // start with reading
  49.                         first = 1'b0;
  50.                 end
  51.                 else // posedge clk
  52.                 begin
  53.                         if( ack )
  54.                         begin
  55.                                 if( addr >= (BEG_ADDR+BLK_SIZE-1) )
  56.                                 begin
  57.                                         addr  <= BEG_ADDR;
  58.                                         rnw   <= ~rnw;
  59.                                         first <= 1'b1;
  60.                                 end
  61.                                 else
  62.                                 begin
  63.                                         addr  <= addr + 21'd1;
  64.                                         first <= 1'b0;
  65.                                 end
  66.                         end
  67.                 end
  68.         end
  69.  
  70.  
  71.  
  72.  
  73.  
  74. `define RND_PAUSE (8'd20 + ( 8'd63 & ($random>>20)))
  75. `define RND_BURST (8'd1 + ( 8'd15 & ($random>>20)))
  76.         // burst generator
  77.         //
  78.         reg [7:0] bcnt;
  79.         //
  80.         always @(posedge clk, negedge can_go)
  81.         begin
  82.                 if( !can_go )
  83.                 begin
  84.                         bcnt = `RND_PAUSE;
  85.                         req  = 1'b0;
  86.                 end
  87.                 else // posedge clk
  88.                 begin
  89.  
  90.                         if( !req ) // waiting
  91.                         begin
  92.                                 if( bcnt!=0 )
  93.                                 begin
  94.                                         bcnt <= bcnt - 8'd1;
  95.                                 end
  96.                                 else // bcnt==0
  97.                                 begin
  98.                                         req  <= 1'b1;
  99.                                         bcnt <= `RND_BURST;
  100.                                 end
  101.                         end
  102.                         else // req - bursting
  103.                         begin
  104.                                 if( ack )
  105.                                 begin
  106.                                         if( bcnt!=0 )
  107.                                         begin
  108.                                                 bcnt <= bcnt - 8'd1;
  109.                                         end
  110.                                         else // bcnt==0
  111.                                         begin
  112.                                                 req  <= 1'b0;
  113.                                                 bcnt <= `RND_PAUSE;
  114.                                         end
  115.                                 end
  116.                         end
  117.                 end
  118.         end
  119.  
  120.  
  121.  
  122.         // rnd data supplying/checking
  123.         //
  124.         reg [7:0] chkmem [0:BLK_SIZE-1];
  125.         integer wr_ptr,rd_ptr;
  126.         integer rnd;
  127.         reg idle;
  128.         //
  129.         initial
  130.         begin
  131.                 idle=1'b1;
  132.                 wr_ptr = 0;
  133.                 rd_ptr = 0;
  134.         end
  135.         //
  136.         always @(posedge clk, negedge can_go)
  137.         begin
  138.                 if( !can_go )
  139.                 begin
  140.                         rnw_done   = 1'b1;
  141.                         first_done = 1'b0;
  142.                 end
  143.                 else // posedge clk
  144.                 begin
  145.                         if( ack )
  146.                         begin
  147.                                 rnw_done   <= rnw;
  148.                                 first_done <= first;
  149.                         end
  150.                 end
  151.         end
  152.         //
  153.         // idle control
  154.         always @(posedge first)
  155.         begin
  156.                 if( idle )
  157.                 begin
  158.                         idle <= 1'b0;
  159.                 end
  160.         end
  161.         // reading
  162.         always @(posedge clk)
  163.         begin
  164.                 if( !idle )
  165.                 begin
  166.                         if( rnw_done ) // read
  167.                         begin
  168.                                 if( done )
  169.                                 begin
  170.                                         if( first_done )
  171.                                         begin
  172.                                                 rd_ptr = 0;
  173.                                                 //$display("reader done!\n");
  174.                                         end
  175.  
  176.                                         if( chkmem[rd_ptr]!=rd )
  177.                                         begin
  178.                                                 $display("readback error: at address %x must be %x, was %x\n",rd_ptr,chkmem[rd_ptr],rd);
  179.                                                 $stop;
  180.                                         end
  181.  
  182.                                         rd_ptr=rd_ptr+1;
  183.                                 end
  184.                         end
  185.                 end
  186.         end
  187.         //
  188.         // writing
  189.         always @(posedge clk)
  190.         begin
  191.                 if( idle )
  192.                         wd <= $random>>24;
  193.                 else // !idle
  194.                         if( !rnw && ack )
  195.                                 wd <= $random>>24;
  196.         end
  197.         //     
  198.         always @(posedge clk)
  199.         begin
  200.                 if( !idle )
  201.                 begin
  202.                         if( !rnw ) // write
  203.                         begin
  204.                                 if( ack )
  205.                                 begin
  206.                                         chkmem[wr_ptr] <= wd;
  207.                                        
  208.                                         if( first )
  209.                                                 wr_ptr <= 1;
  210.                                         else if( wr_ptr<(BLK_SIZE-1) )
  211.                                                 wr_ptr <= wr_ptr+1;
  212.                                         else
  213.                                                 wr_ptr <= 0;
  214.                                 end
  215.                         end
  216.                 end
  217.         end
  218.  
  219.  
  220.  
  221. endmodule
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.