module catgen_tb();

   wire GSR, GTS;
   glbl glbl( );

   reg 	clk    = 0;
   reg 	reset  = 1;
   wire ddrclk;
   
   always #100 clk = ~clk;

   initial $dumpfile("catgen_tb.vcd");
   initial $dumpvars(0,catgen_tb);

   wire [11:0] pins;
   wire        frame;
   
   reg 	       mimo;
   reg [7:0]   count;
   reg 	       tx_strobe;
   
   wire [11:0] i0 = {4'hA,count};
   wire [11:0] q0 = {4'hB,count};
   wire [11:0] i1 = {4'hC,count};
   wire [11:0] q1 = {4'hD,count};

   initial
     begin
	#1000 reset = 0;
	BURST(4);
	BURST(5);
	MIMO_BURST(4);
	MIMO_BURST(5);
	#2000;
	$finish;
     end
   
   task BURST;
      input [7:0] len;

      begin
	 tx_strobe <= 0;
	 mimo <= 0;
	 count <= 0;
	 @(posedge clk);
	 @(posedge clk);
	 repeat(len)
	   begin
	      tx_strobe <= 1;
	      @(posedge clk);
	      count <= count + 1;
	   end
	 tx_strobe <= 0;
	 @(posedge clk);
	 @(posedge clk);
	 @(posedge clk);
      end
   endtask // BURST
   
   task MIMO_BURST;
      input [7:0] len;

      begin
	 tx_strobe <= 0;
	 mimo <= 1;
	 count <= 0;
	 @(posedge clk);
	 @(posedge clk);
	 repeat(len)
	   begin
	      tx_strobe <= 1;
	      @(posedge clk);
	      tx_strobe <= 0;
	      @(posedge clk);
	      count <= count + 1;
	   end
	 tx_strobe <= 0;
	 @(posedge clk);
	 @(posedge clk);
	 @(posedge clk);
      end
   endtask // BURST
   
   catgen_ddr_cmos catgen
     (.data_clk(ddrclk),
      .reset(reset),
      .mimo(mimo),
      .tx_frame(frame),
      .tx_d(pins),
      .tx_clk(clk),
      .tx_strobe(tx_strobe),
      .i0(i0),.q0(q0),
      .i1(i1),.q1(q1));
   
endmodule // hb_chain_tb