//------------------------------------------------------------------------------
//
//  dp_main_linkup2.v : displaport auto linkup test module
//
//  LICENSE : "as-is"
//  TakeshiNagashima(T.NG) caramelgete@gmail.com
//------------------------------------------------------------------------------
//  2009/dec/20 release 0.0  
//  2010/jan/28 release 0.1  display timinig generate test
//  2011/jul/19 release 0.2  linkup sequenser update : set 8b10b
//
//------------------------------------------------------------------------------


module dp_main_linkup2(
	input			TX_HPD,					// in    [LINKUP] sink active

	output			link_done,				// out   [LINKUP] linkup done
	output			link_err,				// out   [LINKUP] linkup error
	output			link_main_active,		// out   [LINKUP] transmitter active
	output	[2:0]	link_main_mode,			// out   [LINKUP] transmit 00=idle/01=normal/10=tr1/11=tr2
	output			link_timeout,			// out   [LINKUP] linkup ack timeout
	output	[7:0]	link_unit,				// out   [LINKUP] unit size[7:0]

	output			link_aux_cmd_req,		// out   [LINKUP] linkup command req
	output	[2:0]	link_aux_cmd,			// out   [LINKUP] linkup command[2:0]
	output			link_aux_cmd_done,		// out   [LINKUP] linkup command done
	output	[3:0]	link_aux_stat_tr1,		// out   [LINKUP] linkup tr1 status
	output	[3:0]	link_aux_stat_tr2,		// out   [LINKUP] linkup tr2 status
	output			link_aux_stat_irq1,		// out   [LINKUP] device service irq vector bit1

	output			link_aux_tx_req,		// out   [AUX] send request
	input			link_aux_tx_ack,		// in    [AUX] send acknowredge
	input			link_aux_tx_done,		// in    [AUX] send done
	output	[3:0]	link_aux_tx_cmd,		// out   [AUX] send command
	output	[19:0]	link_aux_tx_addr,		// out   [AUX] send addr
	output	[7:0]	link_aux_tx_len,		// out   [AUX] send data length
	output	[7:0]	link_aux_tx_data,		// out   [AUX] send data
	output			link_aux_tx_i2c_ao,		// out   [AUX] send i2c adress-only

	input	[7:0]	link_aux_rx_cmd,		// in    [AUX] recieve ack
	input	[7:0]	link_aux_rx_data,		// in    [AUX] recieve data
	input			link_aux_rx_cmd_ack,	// in    [AUX] recieve cmd acknowredge
	input			link_aux_rx_data_ack,	// in    [AUX] recieve data acknowredge
	input			link_aux_rx_done,		// in    [AUX] recieve done

	input			clk27,					// in    [AUX] clk 27MHz
	input			rst_n					// in    [AUX] #reset
);

	parameter	link_aux_cmd_init_wr=4'b1000;	// active lane x1
	parameter	link_aux_cmd_idle_wr=4'b1001;	// link normal
	parameter	link_aux_cmd_tr1_wr =4'b1010;	// link tr1
	parameter	link_aux_stat_tr1_rd=4'b1011;	// tr1 status
	parameter	link_aux_cmd_tr2_wr =4'b1100;	// link tr2
	parameter	link_aux_stat_tr2_rd=4'b1101;	// tr2 status
	parameter	link_aux_cmd_rsv1   =4'b1110;	// 
	parameter	link_aux_cmd_rsv2   =4'b1111;	// 

	localparam	lkst00=5'b00000;	// reset
	localparam	lkst01=5'b00001;	// 
	localparam	lkst02=5'b00011;	// 
	localparam	lkst03=5'b00010;	// 
	localparam	lkst04=5'b00100;	// 
	localparam	lkst05=5'b00101;	// 
	localparam	lkst06=5'b00110;	// 
	localparam	lkst07=5'b00111;	// 
	localparam	lkst10=5'b01000;	// 
	localparam	lkst11=5'b01001;	// 
	localparam	lkst12=5'b01011;	// 
	localparam	lkst13=5'b01010;	// 
	localparam	lkst14=5'b01100;	// 
	localparam	lkst15=5'b01101;	// 
	localparam	lkst16=5'b01110;	// 
	localparam	lkst17=5'b01111;	// 

	wire	link_aux_cmd_init_wr_req;
	wire	link_aux_cmd_idle_wr_req;
	wire	link_aux_cmd_tr1_wr_req;
	wire	link_aux_stat_tr1_rd_req;
	wire	link_aux_cmd_tr2_wr_req;
	wire	link_aux_stat_tr2_rd_req;

	wire	hpd;

	wire	[7:0] hpd_w;
	wire	link_done_w;
	wire	link_err_w;

	wire	[11:0] link_wait100us_count_w;
	wire	link_wait100us_w;
	wire	[4:0] link_state_w;
	wire	[7:0] link_wait400us_w;
	wire	[3:0] link_main_mode_w;
	wire	[3:0] link_aux_cmd_req_w;

	reg		[7:0] hpd_r;
	reg		link_done_r;
	reg		link_err_r;

	reg		[11:0] link_wait100us_count_r;
	reg		link_wait100us_r;
	reg		[4:0] link_state_r;
	reg		[7:0] link_wait400us_r;
	reg		[3:0] link_main_mode_r;
	reg		[3:0] link_aux_cmd_req_r;

	wire	aux_cmd_req;
	wire	[2:0] aux_cmd;
	wire	aux_cmd_done;
	wire	[3:0] aux_stat_tr1;
	wire	[3:0] aux_stat_tr2;
	wire	aux_stat_algn;
	wire	aux_stat_irq1;

	assign hpd=hpd_r[7];
	assign link_done=link_done_r;
	assign link_err=link_err_r;

	assign link_main_active=link_main_mode_r[3];
	assign link_main_mode[2:0]=link_main_mode_r[2:0];

	assign link_aux_cmd_req=link_aux_cmd_req_r[3];
	assign link_aux_cmd[2:0]=link_aux_cmd_req_r[2:0];

	assign aux_cmd_req=link_aux_cmd_req_r[3];
	assign aux_cmd[2:0]=link_aux_cmd_req_r[2:0];
	assign link_aux_cmd_done=aux_cmd_done;
	assign link_aux_stat_tr1[3:0]=aux_stat_tr1[3:0];
	assign link_aux_stat_tr2[3:0]=aux_stat_tr2[3:0];
	assign link_aux_stat_irq1=aux_stat_irq1;

	assign link_aux_cmd_init_wr_req=(link_aux_cmd_req_r[3:0]==link_aux_cmd_init_wr[3:0]) ? 1'b1 : 1'b0;
	assign link_aux_cmd_idle_wr_req=(link_aux_cmd_req_r[3:0]==link_aux_cmd_idle_wr[3:0]) ? 1'b1 : 1'b0;
	assign link_aux_cmd_tr1_wr_req =(link_aux_cmd_req_r[3:0]==link_aux_cmd_tr1_wr[3:0])  ? 1'b1 : 1'b0;
	assign link_aux_stat_tr1_rd_req=(link_aux_cmd_req_r[3:0]==link_aux_stat_tr1_rd[3:0]) ? 1'b1 : 1'b0;
	assign link_aux_cmd_tr2_wr_req =(link_aux_cmd_req_r[3:0]==link_aux_cmd_tr2_wr[3:0])  ? 1'b1 : 1'b0;
	assign link_aux_stat_tr2_rd_req=(link_aux_cmd_req_r[3:0]==link_aux_stat_tr2_rd[3:0]) ? 1'b1 : 1'b0;

	always @(posedge clk27 or negedge rst_n)
	begin
		if (rst_n==1'b0)
			begin
				hpd_r[7:0] <= 8'b0;
				link_done_r <= 1'b0;
				link_err_r <= 1'b0;

				link_wait100us_count_r[11:0] <= 12'b0;
				link_wait100us_r <= 1'b0;

				link_state_r <= lkst00;
				link_wait400us_r[7:0] <= 8'b0;
				link_main_mode_r[3:0] <= 4'b0;
				link_aux_cmd_req_r[3:0] <= 4'b0;
			end
		else
			begin
				hpd_r[7:0] <= hpd_w[7:0];
				link_done_r <= link_done_w;
				link_err_r <= link_err_w;

				link_wait100us_count_r[11:0] <= link_wait100us_count_w[11:0];
				link_wait100us_r <= link_wait100us_w;

				link_state_r <= link_state_w;
				link_wait400us_r[7:0] <= link_wait400us_w[7:0];
				link_main_mode_r[3:0] <= link_main_mode_w[3:0];
				link_aux_cmd_req_r[3:0] <= link_aux_cmd_req_w[3:0];
			end
	end

	assign link_done_w=(link_state_r==lkst16) ? 1'b1 : 1'b0;
	assign link_err_w=(link_state_r==lkst17) ? 1'b1 : 1'b0;

`ifdef sim_fast

	assign link_wait100us_count_w[11:8]=4'b0;
	assign link_wait100us_count_w[7:0]=(link_wait100us_r==1'b1) ? 8'h0 : link_wait100us_count_r[7:0]+8'h01;
	assign link_wait100us_w=(link_wait100us_count_r[7:0]==12'hfe) ? 1'b1 : 1'b0;

`else

	assign link_wait100us_count_w[11:0]=(link_wait100us_r==1'b1) ? 12'h0 : link_wait100us_count_r[11:0]+12'h01;
	assign link_wait100us_w=(link_wait100us_count_r[11:0]==12'ha8a) ? 1'b1 : 1'b0;

`endif

	assign hpd_w[6:4]={hpd_r[5:4],TX_HPD};

	assign hpd_w[7]=
			(hpd_r[7]==1'b0) & (hpd_r[3:0]==4'b1111) ? 1'b1 :
			(hpd_r[7]==1'b0) & (hpd_r[3:0]!=4'b1111) ? 1'b0 :
			(hpd_r[7]==1'b1) & (hpd_r[3:0]==4'b1111) ? 1'b0 :
			(hpd_r[7]==1'b1) & (hpd_r[3:0]!=4'b1111) ? 1'b1 :
			1'b0;

	assign hpd_w[3:0]=
			(hpd_r[7]==1'b0) & (hpd_r[6]==1'b0) ? 4'b0 :
			(hpd_r[7]==1'b0) & (hpd_r[6]==1'b1) ? hpd_r[3:0]+4'b01 :
			(hpd_r[7]==1'b1) & (hpd_r[6]==1'b1) ? 4'b0 :
			(hpd_r[7]==1'b1) & (hpd_r[6]==1'b0) ? hpd_r[3:0]+4'b01 :
			4'b0;

	assign link_state_w=
			(link_state_r==lkst00) & (hpd==1'b0) ? lkst00 :	// cable release
			(link_state_r==lkst00) & (hpd==1'b1) & (link_wait100us_r==1'b0) ? lkst00 :	// wait
			(link_state_r==lkst00) & (hpd==1'b1) & (link_wait100us_r==1'b1) ? lkst01 :	// cable connect
			(link_state_r==lkst01) & (link_aux_cmd_done==1'b0) ? lkst01 :	// wr aux-ch init
			(link_state_r==lkst01) & (link_aux_cmd_done==1'b1) ? lkst02 :	// done
			(link_state_r==lkst02) & (link_wait100us_r==1'b1) ? lkst03 :	// done
			(link_state_r==lkst02) & (link_wait100us_r==1'b0) ? lkst02 :	// wait 100us

			(link_state_r==lkst03) & (link_aux_cmd_done==1'b0) ? lkst03 :	// wr aux-ch TR1
			(link_state_r==lkst03) & (link_aux_cmd_done==1'b1) ? lkst04 :	// done
			(link_state_r==lkst04) & ({link_wait100us_r,link_wait400us_r[1]}==2'b11) ? lkst05 :	// done
			(link_state_r==lkst04) & ({link_wait100us_r,link_wait400us_r[1]}!=2'b11) ? lkst04 :	// wait 200us
			(link_state_r==lkst05) & (link_aux_cmd_done==1'b0) ? lkst05 :	// rd aux-ch
			(link_state_r==lkst05) & (link_aux_cmd_done==1'b1) ? lkst06 :	// done
			(link_state_r==lkst06) & (link_aux_stat_tr1[0]==1'b0) ? lkst17 :	// clock recovery fail
			(link_state_r==lkst06) & (link_aux_stat_tr1[0]==1'b1) ? lkst10 :	// clock recovery ready
			(link_state_r==lkst07) & (link_aux_cmd_done==1'b0) ? lkst07 :	// transfer aux-ch idle
			(link_state_r==lkst07) & (link_aux_cmd_done==1'b1) ? lkst17 :	// done

			(link_state_r==lkst10) ? lkst11 :	// 
			(link_state_r==lkst11) & (link_aux_cmd_done==1'b0) ? lkst11 :	// wr aux-ch TR2
			(link_state_r==lkst11) & (link_aux_cmd_done==1'b1) ? lkst12 :	// done
			(link_state_r==lkst12) & ({link_wait100us_r,link_wait400us_r[2]}==2'b11) ? lkst13 :	// done
			(link_state_r==lkst12) & ({link_wait100us_r,link_wait400us_r[2]}!=2'b11) ? lkst12 :	// wait 400us
			(link_state_r==lkst13) & (link_aux_cmd_done==1'b0) ? lkst13 :	// rd aux-ch
			(link_state_r==lkst13) & (link_aux_cmd_done==1'b1) ? lkst14 :	// rd done
			(link_state_r==lkst14) & (link_aux_cmd_done==1'b0) ? lkst14 :	// transfer aux-ch idle
			(link_state_r==lkst14) & (link_aux_cmd_done==1'b1) ? lkst15 :	// done
			(link_state_r==lkst15) & (link_aux_stat_tr2[0]==1'b0) ? lkst17 :	// channel equakuzation fail
			(link_state_r==lkst15) & (link_aux_stat_tr2[0]==1'b1) & (aux_stat_algn==1'b0) ? lkst17 :	// channel equalization fail
			(link_state_r==lkst15) & (link_aux_stat_tr2[0]==1'b1) & (aux_stat_algn==1'b1) ? lkst16 :	// channel equalization ready

			(link_state_r==lkst16) ? lkst16 :	// normal operation
			(link_state_r==lkst17) ? lkst17 :	// link fail
			lkst00;

	assign link_wait400us_w[7:0]=
			(link_state_r==lkst00) ? 8'b0 :
			(link_state_r==lkst01) ? 8'b0 :
			(link_state_r==lkst02) ? 8'b0 :
			(link_state_r==lkst03) ? 8'b0 :
			(link_state_r==lkst04) & (link_wait100us_r==1'b0) ? link_wait400us_r[7:0] :
			(link_state_r==lkst04) & (link_wait100us_r==1'b1) ? link_wait400us_r[7:0]+8'b01 :
			(link_state_r==lkst05) & (link_wait100us_r==1'b0) ? link_wait400us_r[7:0] :
			(link_state_r==lkst05) & (link_wait100us_r==1'b1) ? link_wait400us_r[7:0]+8'b01 :
			(link_state_r==lkst06) & (link_wait100us_r==1'b0) ? link_wait400us_r[7:0] :
			(link_state_r==lkst06) & (link_wait100us_r==1'b1) ? link_wait400us_r[7:0]+8'b01 :
			(link_state_r==lkst07) & (link_wait100us_r==1'b0) ? link_wait400us_r[7:0] :
			(link_state_r==lkst07) & (link_wait100us_r==1'b1) ? link_wait400us_r[7:0]+8'b01 :

			(link_state_r==lkst10) ? 8'b0 :
			(link_state_r==lkst11) ? 8'b0 :
			(link_state_r==lkst12) & (link_wait100us_r==1'b0) ? link_wait400us_r[7:0] :
			(link_state_r==lkst12) & (link_wait100us_r==1'b1) ? link_wait400us_r[7:0]+8'b01 :
			(link_state_r==lkst13) & (link_wait100us_r==1'b0) ? link_wait400us_r[7:0] :
			(link_state_r==lkst13) & (link_wait100us_r==1'b1) ? link_wait400us_r[7:0]+8'b01 :
			(link_state_r==lkst14) & (link_wait100us_r==1'b0) ? link_wait400us_r[7:0] :
			(link_state_r==lkst14) & (link_wait100us_r==1'b1) ? link_wait400us_r[7:0]+8'b01 :
			(link_state_r==lkst15) & (link_wait100us_r==1'b0) ? link_wait400us_r[7:0] :
			(link_state_r==lkst15) & (link_wait100us_r==1'b1) ? link_wait400us_r[7:0]+8'b01 :
			(link_state_r==lkst16) & (link_wait100us_r==1'b0) ? link_wait400us_r[7:0] :
			(link_state_r==lkst16) & (link_wait100us_r==1'b1) ? link_wait400us_r[7:0]+8'b01 :
			(link_state_r==lkst17) & (link_wait100us_r==1'b0) ? link_wait400us_r[7:0] :
			(link_state_r==lkst17) & (link_wait100us_r==1'b1) ? link_wait400us_r[7:0]+8'b01 :
			8'b0;

	assign link_main_mode_w[3:0]=
			(link_state_r==lkst00) ? 4'b0000 :	// transmitter off
			(link_state_r==lkst01) ? 4'b0000 :	// transmitter off
			(link_state_r==lkst02) ? 4'b0000 :	// transmitter off
			(link_state_r==lkst03) ? 4'b1010 :	// transmitter on , training 1
			(link_state_r==lkst04) ? 4'b1010 :	// transmitter on , training 1
			(link_state_r==lkst05) ? 4'b1010 :	// transmitter on , training 1
			(link_state_r==lkst06) ? 4'b1010 :	// transmitter on , training 1
			(link_state_r==lkst07) ? 4'b1010 :	// transmitter on , training 1

			(link_state_r==lkst10) ? 4'b1010 :	// transmitter on , training 2
			(link_state_r==lkst11) ? 4'b1011 :	// transmitter on , training 2
			(link_state_r==lkst12) ? 4'b1011 :	// transmitter on , training 2
			(link_state_r==lkst13) ? 4'b1011 :	// transmitter on , training 2
			(link_state_r==lkst14) ? 4'b1011 :	// transmitter on , training 2
			(link_state_r==lkst15) ? 4'b1011 :	// transmitter on , training 2
			(link_state_r==lkst16) ? 4'b1101 :	// transmitter on , normal
			(link_state_r==lkst17) ? 4'b0000 :	// transmitter off
			3'b000;

	assign link_aux_cmd_req_w[3:0]=
			(link_state_r==lkst00) & (hpd==1'b0) ? 4'b0 :
			(link_state_r==lkst00) & (hpd==1'b1) & (link_wait100us_r==1'b0) ? 4'b0 :
			(link_state_r==lkst00) & (hpd==1'b1) & (link_wait100us_r==1'b1) ? link_aux_cmd_init_wr[3:0] :
			(link_state_r==lkst01) & (link_aux_cmd_done==1'b0) ? link_aux_cmd_init_wr[3:0] :
			(link_state_r==lkst01) & (link_aux_cmd_done==1'b1) ? 4'b0 :
			(link_state_r==lkst02) & (link_wait100us_r==1'b0) ? 4'b0 :
			(link_state_r==lkst02) & (link_wait100us_r==1'b1) ? link_aux_cmd_tr1_wr[3:0] :
			(link_state_r==lkst03) & (link_aux_cmd_done==1'b0) ? link_aux_cmd_tr1_wr[3:0] :
			(link_state_r==lkst03) & (link_aux_cmd_done==1'b1) ? 4'b0 :
			(link_state_r==lkst04) & ({link_wait100us_r,link_wait400us_r[1]}==2'b11) ? link_aux_stat_tr1_rd[3:0] :
			(link_state_r==lkst04) & ({link_wait100us_r,link_wait400us_r[1]}!=2'b11) ? 4'b0 :
			(link_state_r==lkst05) & (link_aux_cmd_done==1'b0) ? link_aux_stat_tr1_rd[3:0] :
			(link_state_r==lkst05) & (link_aux_cmd_done==1'b1) ? 4'b0 :
			(link_state_r==lkst06) & (link_aux_stat_tr1[0]==1'b0) ? link_aux_cmd_idle_wr[3:0] :
			(link_state_r==lkst06) & (link_aux_stat_tr1[0]==1'b1) ? 4'b0 :
			(link_state_r==lkst07) & (link_aux_cmd_done==1'b0) ? link_aux_cmd_idle_wr[3:0] :
			(link_state_r==lkst07) & (link_aux_cmd_done==1'b1) ? 4'b0 :

			(link_state_r==lkst10) ? link_aux_cmd_tr2_wr[3:0] :
			(link_state_r==lkst11) & (link_aux_cmd_done==1'b0) ? link_aux_cmd_tr2_wr[3:0] :
			(link_state_r==lkst11) & (link_aux_cmd_done==1'b1) ? 4'b0 :
			(link_state_r==lkst12) & ({link_wait100us_r,link_wait400us_r[2]}==2'b11) ? link_aux_stat_tr2_rd[3:0] :
			(link_state_r==lkst12) & ({link_wait100us_r,link_wait400us_r[2]}!=2'b11) ? 4'b0 :
			(link_state_r==lkst13) & (link_aux_cmd_done==1'b0) ? link_aux_stat_tr2_rd[3:0] :
			(link_state_r==lkst13) & (link_aux_cmd_done==1'b1) ? link_aux_cmd_idle_wr[3:0] :
			(link_state_r==lkst14) & (link_aux_cmd_done==1'b0) ? link_aux_cmd_idle_wr[3:0] :
			(link_state_r==lkst14) & (link_aux_cmd_done==1'b1) ? 4'b0 :
			(link_state_r==lkst15) & (link_aux_stat_tr2[0]==1'b0) ? 4'b0 :
			(link_state_r==lkst15) & (link_aux_stat_tr2[0]==1'b1) & (aux_stat_algn==1'b0) ? 4'b0 :
			(link_state_r==lkst15) & (link_aux_stat_tr2[0]==1'b1) & (aux_stat_algn==1'b1) ? 4'b0 :
			(link_state_r==lkst16) ? 4'b0 :
			(link_state_r==lkst17) ? 4'b0 :
			4'b0;

	// ---- aux-ch control ----

	localparam	aux_cmd_dpcd_wr   =4'b1000;	// dpcd write
	localparam	aux_cmd_dpcd_rd   =4'b1001;	// dpcd read
	localparam	aux_cmd_i2c_mot_wr=4'b0100;	// i2c write +MOT
	localparam	aux_cmd_i2c_mot_rd=4'b0101;	// i2c read +MOT
	localparam	aux_cmd_i2c_mot_sr=4'b0110;	// i2c write status_request +MOT
	localparam	aux_cmd_i2c_wr    =4'b0000;	// i2c write
	localparam	aux_cmd_i2c_rd    =4'b0001;	// i2c read
	localparam	aux_cmd_i2c_sr    =4'b0010;	// i2c write status_request

	localparam	aux_cmd_dpcd_ack  =2'b00;	// dpcd ack
	localparam	aux_cmd_dpcd_nack =2'b01;	// dpcd nack
	localparam	aux_cmd_dpcd_defer=2'b01;	// dpcd defer

	localparam	aux_cmd_i2c_ack   =2'b00;	// i2c ack
	localparam	aux_cmd_i2c_nack  =2'b01;	// i2c nack
	localparam	aux_cmd_i2c_defer =2'b01;	// i2c defer

	localparam	ast00=3'b000;	// 
	localparam	ast01=3'b001;	// 
	localparam	ast02=3'b011;	// 
	localparam	ast03=3'b010;	// 
	localparam	ast04=3'b100;	// 
	localparam	ast05=3'b101;	// 
	localparam	ast06=3'b111;	// 
	localparam	ast07=3'b110;	// 

	wire	aux_done;

	wire	aux_tx_ack;
	wire	aux_tx_done;
	wire	[7:0] aux_rx_cmd;
	wire	[7:0] aux_rx_data;
	wire	aux_rx_cmd_ack;
	wire	aux_rx_data_ack;
	wire	aux_rx_done;

	wire	aux_tx_req;
	wire	[3:0] aux_tx_cmd;
	wire	[19:0] aux_tx_addr;
	wire	[7:0] aux_tx_data;

	wire	[35:0] aux_cmd_code;
	wire	[5:0] aux_cmd_code_addr;

	wire	aux_rx_retry;

	wire	[2:0] aux_state_w;
	wire	[35:0] aux_cmd_code_w;
	wire	[7:0] aux_cmd_ack_w;
	wire	[5:0] aux_cmd_code_addr_w;
	wire	[7:0] aux_wait_w;
	wire	aux_wait2unit_w;
	wire	[3:0] aux_wait100us_w;
	wire	[2:0] aux_retry_w;
	wire	aux_timeout_w;
	wire	aux_tx_req_w;
	wire	aux_ack_w;
	wire	aux_done_w;
	wire	[3:0] aux_rd_count_w;
	wire	[7:0] aux_cap_ver_w;
	wire	[7:0] aux_stat_tr1_w;
	wire	[7:0] aux_stat_tr2_w;
	wire	aux_stat_algn_w;
	wire	[7:0] aux_stat_irq_w;
	wire	[7:0] aux_unit_w;

	reg		[2:0] aux_state_r;
	reg		[35:0] aux_cmd_code_r;
	reg		[7:0] aux_cmd_ack_r;
	reg		[5:0] aux_cmd_code_addr_r;
	reg		[7:0] aux_wait_r;
	reg		aux_wait2unit_r;
	reg		[3:0] aux_wait100us_r;
	reg		[2:0] aux_retry_r;
	reg		aux_timeout_r;
	reg		aux_tx_req_r;
	reg		aux_ack_r;
	reg		aux_done_r;
	reg		[3:0] aux_rd_count_r;
	reg		[7:0] aux_cap_ver_r;
	reg		[7:0] aux_stat_tr1_r;
	reg		[7:0] aux_stat_tr2_r;
	reg		aux_stat_algn_r;
	reg		[7:0] aux_stat_irq_r;
	reg		[7:0] aux_unit_r;


	assign link_aux_tx_req=aux_tx_req;
	assign aux_tx_ack=link_aux_tx_ack;
	assign aux_tx_done=link_aux_tx_done;
	assign link_aux_tx_cmd[3:0]=aux_tx_cmd[3:0];
	assign link_aux_tx_addr[19:0]=aux_tx_addr[19:0];
	assign link_aux_tx_len[7:0]=8'h00;
	assign link_aux_tx_data[7:0]=aux_tx_data[7:0];
	assign link_aux_tx_i2c_ao=1'b0;

	assign link_timeout=aux_timeout_r;

	assign aux_rx_cmd=link_aux_rx_cmd[7:0];
	assign aux_rx_data=link_aux_rx_data[7:0];
	assign aux_rx_cmd_ack=link_aux_rx_cmd_ack;
	assign aux_rx_data_ack=link_aux_rx_data_ack;
	assign aux_rx_done=link_aux_rx_done;

	assign aux_cmd_done=aux_done_r;
	assign aux_stat_tr1[3:0]=aux_stat_tr1_r[3:0];
	assign aux_stat_tr2[3:0]=aux_stat_tr2_r[3:0];
	assign aux_stat_algn=aux_stat_algn_r;
	assign aux_stat_irq1=aux_stat_irq_r[1];
	assign link_unit[7:0]=aux_unit_r[7:0];

	assign aux_cmd_code[35:0]=

`ifdef sim_fast
																	// -- init wr --
			(aux_cmd_code_addr[5:0]==6'h00) ? 36'hf_8_00100_06 :	// dpcd wr $100=$06
			(aux_cmd_code_addr[5:0]==6'h01) ? 36'hf_8_00101_01 :	// dpcd wr $101=$01
			(aux_cmd_code_addr[5:0]==6'h02) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h03) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h04) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h05) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h06) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h07) ? 36'hf_0_00000_00 :	// 
																	// -- idle wr --
			(aux_cmd_code_addr[5:0]==6'h08) ? 36'hf_8_00102_00 :	// dpcd wr $102=$00
			(aux_cmd_code_addr[5:0]==6'h09) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h0a) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h0b) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h0c) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h0d) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h0e) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h0f) ? 36'hf_0_00000_00 :	// 
																	// -- tr1 wr --
			(aux_cmd_code_addr[5:0]==6'h10) ? 36'hf_8_00102_21 :	// dpcd wr $102=$01
			(aux_cmd_code_addr[5:0]==6'h11) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h12) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h13) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h14) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h15) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h16) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h17) ? 36'hf_0_00000_00 :	// 
																	// -- tr1 rd --
			(aux_cmd_code_addr[5:0]==6'h18) ? 36'hf_9_00202_00 :	// dpcd rd $202
			(aux_cmd_code_addr[5:0]==6'h19) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h1a) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h1b) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h1c) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h1d) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h1e) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h1f) ? 36'hf_0_00000_00 :	// 
																	// -- tr2 wr --
			(aux_cmd_code_addr[5:0]==6'h20) ? 36'hf_8_00102_02 :	// dpcd wr $102=$02
			(aux_cmd_code_addr[5:0]==6'h21) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h22) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h23) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h24) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h25) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h26) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h27) ? 36'hf_0_00000_00 :	// 
																	// -- tr2 rd --
			(aux_cmd_code_addr[5:0]==6'h28) ? 36'h0_9_00203_00 :	// dpcd rd $203
			(aux_cmd_code_addr[5:0]==6'h29) ? 36'hf_9_00204_00 :	// dpcd rd $204
			(aux_cmd_code_addr[5:0]==6'h2a) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h2b) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h2c) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h2d) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h2e) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h2f) ? 36'hf_0_00000_00 :	// 
`else
																	// -- init wr --
			(aux_cmd_code_addr[5:0]==6'h01) ? 36'h0_9_00000_00 :	// dpcd rd $000 : version
			(aux_cmd_code_addr[5:0]==6'h00) ? 36'h0_9_00006_00 :	// dpcd rd $006 : encode
			(aux_cmd_code_addr[5:0]==6'h02) ? 36'h0_8_00100_06 :	// dpcd wr $100=$06 : 1.62GHz
			(aux_cmd_code_addr[5:0]==6'h03) ? 36'h0_8_00101_02 :	// dpcd wr $101=$02 : x2
			(aux_cmd_code_addr[5:0]==6'h04) ? 36'h0_8_00102_20 :	// dpcd wr $102=$20
			(aux_cmd_code_addr[5:0]==6'h05) ? 36'hf_8_00006_01 :	// dpcd wr $006=$01 : 8b10b
			(aux_cmd_code_addr[5:0]==6'h06) ? 36'hf_9_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h07) ? 36'hf_9_00000_00 :	// 
																	// -- idle wr --
			(aux_cmd_code_addr[5:0]==6'h08) ? 36'h0_8_00101_02 :	// dpcd wr $101=$02 : x2
			(aux_cmd_code_addr[5:0]==6'h09) ? 36'h0_8_00102_00 :	// dpcd wr $102=$00 :
			(aux_cmd_code_addr[5:0]==6'h0a) ? 36'h0_9_00201_00 :	// dpcd rd $201
			(aux_cmd_code_addr[5:0]==6'h0b) ? 36'h0_9_00202_00 :	// dpcd rd $202
			(aux_cmd_code_addr[5:0]==6'h0c) ? 36'h0_9_00203_00 :	// dpcd rd $203
			(aux_cmd_code_addr[5:0]==6'h0d) ? 36'h0_9_00204_00 :	// dpcd rd $204
			(aux_cmd_code_addr[5:0]==6'h0e) ? 36'hf_9_00205_00 :	// dpcd rd $205
			(aux_cmd_code_addr[5:0]==6'h0f) ? 36'hf_0_00000_00 :	// 
																	// -- tr1 wr --
			(aux_cmd_code_addr[5:0]==6'h10) ? 36'hf_8_00102_21 :	// dpcd wr $102=$21
			(aux_cmd_code_addr[5:0]==6'h11) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h12) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h13) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h14) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h15) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h16) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h17) ? 36'hf_0_00000_00 :	// 
																	// -- tr1 rd --
			(aux_cmd_code_addr[5:0]==6'h18) ? 36'h0_9_00202_00 :	// dpcd rd $202
			(aux_cmd_code_addr[5:0]==6'h19) ? 36'h0_9_00203_00 :	// dpcd rd $203
			(aux_cmd_code_addr[5:0]==6'h1a) ? 36'h0_9_00204_00 :	// dpcd rd $204
			(aux_cmd_code_addr[5:0]==6'h1b) ? 36'hf_9_00205_00 :	// dpcd rd $205
			(aux_cmd_code_addr[5:0]==6'h1c) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h1d) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h1e) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h1f) ? 36'hf_0_00000_00 :	// 
																	// -- tr2 wr --
			(aux_cmd_code_addr[5:0]==6'h20) ? 36'h0_8_00102_22 :	// dpcd wr $102=$22
			(aux_cmd_code_addr[5:0]==6'h21) ? 36'hf_8_00102_22 :	// 
			(aux_cmd_code_addr[5:0]==6'h22) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h23) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h24) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h25) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h26) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h27) ? 36'hf_0_00000_00 :	// 
																	// -- tr2 rd --
			(aux_cmd_code_addr[5:0]==6'h28) ? 36'h0_9_00202_00 :	// dpcd rd $202
			(aux_cmd_code_addr[5:0]==6'h29) ? 36'h0_9_00203_00 :	// dpcd rd $203
			(aux_cmd_code_addr[5:0]==6'h2a) ? 36'h0_9_00204_00 :	// dpcd rd $204
			(aux_cmd_code_addr[5:0]==6'h2b) ? 36'hf_9_00205_00 :	// dpcd rd $205
			(aux_cmd_code_addr[5:0]==6'h2c) ? 36'hf_9_00202_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h2d) ? 36'hf_9_00202_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h2e) ? 36'hf_9_00205_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h2f) ? 36'hf_9_00202_00 :	// 
`endif
																	// -- rsv --
			(aux_cmd_code_addr[5:0]==6'h30) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h31) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h32) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h33) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h34) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h35) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h36) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h37) ? 36'hf_0_00000_00 :	// 
																	// -- rsv --
			(aux_cmd_code_addr[5:0]==6'h38) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h39) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h3a) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h3b) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h3c) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h3d) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h3e) ? 36'hf_0_00000_00 :	// 
			(aux_cmd_code_addr[5:0]==6'h3f) ? 36'hf_0_00000_00 :	// 
			36'h0;

	assign aux_tx_req=aux_tx_req_r;
	assign aux_tx_cmd[3:0]=aux_cmd_code_r[31:28];
	assign aux_tx_addr[19:0]=aux_cmd_code_r[27:8];
	assign aux_tx_data[7:0]=aux_cmd_code_r[7:0];

	assign aux_cmd_code_addr[5:0]={aux_cmd[2:0],aux_cmd_code_addr_r[2:0]};

	always @(posedge clk27 or negedge rst_n)
	begin
		if (rst_n==1'b0)
			begin
				aux_state_r <= ast00;
				aux_cmd_code_r[35:0] <= 36'b0;
				aux_cmd_ack_r[7:0] <= 8'b0;
				aux_cmd_code_addr_r[5:0] <= 6'b0;
				aux_wait_r[7:0] <= 8'b0;
				aux_wait2unit_r <= 1'b0;
				aux_wait100us_r[3:0] <= 4'b0;
				aux_retry_r[2:0] <= 3'b0;
				aux_timeout_r <= 1'b0;
				aux_tx_req_r <= 1'b0;

				aux_ack_r <= 1'b0;
				aux_done_r <= 1'b0;
				aux_rd_count_r[3:0] <= 4'b0;
				aux_cap_ver_r[7:0] <= 8'b0;
				aux_stat_tr1_r[7:0] <= 8'b0;
				aux_stat_tr2_r[7:0] <= 8'b0;
				aux_stat_algn_r <= 1'b0;
				aux_stat_irq_r[7:0] <= 8'b0;
				aux_unit_r[7:0] <= 8'b0;
			end
		else
			begin
				aux_state_r <= aux_state_w;
				aux_cmd_code_r[35:0] <= aux_cmd_code_w[35:0];
				aux_cmd_ack_r[7:0] <= aux_cmd_ack_w[7:0];
				aux_cmd_code_addr_r[5:0] <= aux_cmd_code_addr_w[5:0];
				aux_wait_r[7:0] <= aux_wait_w[7:0];
				aux_wait2unit_r <= aux_wait2unit_w;
				aux_wait100us_r[3:0] <= aux_wait100us_w[3:0];
				aux_retry_r[2:0] <= aux_retry_w[2:0];
				aux_timeout_r <= aux_timeout_w;
				aux_tx_req_r <= aux_tx_req_w;

				aux_ack_r <= aux_ack_w;
				aux_done_r <= aux_done_w;
				aux_rd_count_r[3:0] <= aux_rd_count_r[3:0];
				aux_cap_ver_r[7:0] <= aux_cap_ver_w[7:0];
				aux_stat_tr1_r[7:0] <= aux_stat_tr1_w[7:0];
				aux_stat_tr2_r[7:0] <= aux_stat_tr2_w[7:0];
				aux_stat_algn_r <= aux_stat_algn_w;
				aux_stat_irq_r[7:0] <= aux_stat_irq_w[7:0];
				aux_unit_r[7:0] <= aux_unit_w[7:0];
			end
	end

	assign aux_rx_retry=(aux_cmd_ack_r[5:4]==2'b10) ? 1'b1 : 1'b0;

	assign aux_state_w=
			(aux_state_r==ast00) & (aux_cmd_req==1'b0) ? ast00 :
			(aux_state_r==ast00) & (aux_cmd_req==1'b1) ? ast01 :
			(aux_state_r==ast01) & (aux_tx_done==1'b0) ? ast01 :
			(aux_state_r==ast01) & (aux_tx_done==1'b1) ? ast02 :
			(aux_state_r==ast02) & (aux_rx_done==1'b0) & (aux_wait100us_r[3]==1'b0) ? ast02 :
			(aux_state_r==ast02) & (aux_rx_done==1'b0) & (aux_wait100us_r[3]==1'b1) & (aux_retry_r[2]==1'b0) ? ast01 :
			(aux_state_r==ast02) & (aux_rx_done==1'b0) & (aux_wait100us_r[3]==1'b1) & (aux_retry_r[2]==1'b1) ? ast00 :
			(aux_state_r==ast02) & (aux_rx_done==1'b1) & (aux_rx_retry==1'b1) ? ast04 :
			(aux_state_r==ast02) & (aux_rx_done==1'b1) & (aux_rx_retry==1'b0) ? ast03 :
			(aux_state_r==ast03) & (aux_wait2unit_r==1'b0) ? ast03 :
			(aux_state_r==ast03) & (aux_wait2unit_r==1'b1) & (aux_cmd_code_r[35:32]!=4'hf) ? ast01 :
			(aux_state_r==ast03) & (aux_wait2unit_r==1'b1) & (aux_cmd_code_r[35:32]==4'hf) ? ast00 :

			(aux_state_r==ast04) ? ast05 :
			(aux_state_r==ast05) & (aux_wait100us_r[3]==1'b0) ? ast05 :
			(aux_state_r==ast05) & (aux_wait100us_r[3]==1'b1) ? ast06 :
			(aux_state_r==ast06) ? ast07 :
			(aux_state_r==ast07) ? ast01 :

			ast00;

	assign aux_cmd_code_w[35:0]=
			(aux_state_r==ast00) ? aux_cmd_code[35:0] :
			(aux_state_r==ast01) ? aux_cmd_code_r[35:0] :
			(aux_state_r==ast02) ? aux_cmd_code_r[35:0] :
			(aux_state_r==ast03) & (aux_wait2unit_r==1'b0) ? aux_cmd_code_r[35:0] :
			(aux_state_r==ast03) & (aux_wait2unit_r==1'b1) ? aux_cmd_code[35:0] :

			(aux_state_r==ast04) ? aux_cmd_code_r[35:0] :
			(aux_state_r==ast05) ? aux_cmd_code_r[35:0] :
			(aux_state_r==ast06) ? aux_cmd_code_r[35:0] :
			(aux_state_r==ast07) ? aux_cmd_code_r[35:0] :

			36'b0;

	assign aux_cmd_ack_w[7:0]=(aux_state_r==ast02) & (link_aux_rx_cmd_ack==1'b1) ? link_aux_rx_cmd[7:0] : aux_cmd_ack_r[7:0];

	assign aux_cmd_code_addr_w[5:3]=
			(aux_state_r==ast00) ? aux_cmd[2:0] :
			(aux_state_r==ast01) ? aux_cmd_code_addr_r[5:3] :
			(aux_state_r==ast02) ? aux_cmd_code_addr_r[5:3] :
			(aux_state_r==ast03) ? aux_cmd_code_addr_r[5:3] :

			(aux_state_r==ast04) ? aux_cmd_code_addr_r[5:3] :
			(aux_state_r==ast05) ? aux_cmd_code_addr_r[5:3] :
			(aux_state_r==ast06) ? aux_cmd_code_addr_r[5:3] :
			(aux_state_r==ast07) ? aux_cmd_code_addr_r[5:3] :
			3'b0;

	assign aux_cmd_code_addr_w[2:0]=
			(aux_state_r==ast00) ? 3'b0 :
			(aux_state_r==ast01) ? aux_cmd_code_addr_r[2:0] :
			(aux_state_r==ast02) & (aux_rx_done==1'b0) ? aux_cmd_code_addr_r[2:0] :
			(aux_state_r==ast02) & (aux_rx_done==1'b1) & (aux_rx_retry==1'b1) ? aux_cmd_code_addr_r[2:0] :
			(aux_state_r==ast02) & (aux_rx_done==1'b1) & (aux_rx_retry==1'b0) ? aux_cmd_code_addr_r[2:0]+3'b01 :
			(aux_state_r==ast03) & (aux_wait2unit_r==1'b0) ? aux_cmd_code_addr_r[2:0] :
			(aux_state_r==ast03) & (aux_wait2unit_r==1'b1) & (aux_cmd_code_r[35:32]!=4'hf) ? aux_cmd_code_addr_r[2:0] :
			(aux_state_r==ast03) & (aux_wait2unit_r==1'b1) & (aux_cmd_code_r[35:32]==4'hf) ? 3'b0 :

			(aux_state_r==ast04) ? aux_cmd_code_addr_r[2:0] :
			(aux_state_r==ast05) ? aux_cmd_code_addr_r[2:0] :
			(aux_state_r==ast06) ? aux_cmd_code_addr_r[2:0] :
			(aux_state_r==ast07) ? aux_cmd_code_addr_r[2:0] :
			3'b0;

	assign aux_wait_w[7:0]=
			(aux_state_r==ast00) ? 8'b0 :
			(aux_state_r==ast01) ? 8'b0 :
			(aux_state_r==ast02) ? 8'b0 :
			(aux_state_r==ast03) ? aux_wait_r[7:0]+8'b01 :

			(aux_state_r==ast04) ? 8'b0 :
			(aux_state_r==ast05) ? 8'b0 :
			(aux_state_r==ast06) ? 8'b0 :
			(aux_state_r==ast07) ? 8'b0 :

			8'b0;

	assign aux_wait2unit_w=(aux_wait_r[7:6]==2'b00) ? 1'b0 : 1'b1;

	assign aux_wait100us_w[3:0]=
			(aux_state_r==ast00) ? 4'b0 :
			(aux_state_r==ast01) ? 4'b0 :
			(aux_state_r==ast02) & (link_wait100us_r==1'b0) ? aux_wait100us_r[3:0] :
			(aux_state_r==ast02) & (link_wait100us_r==1'b1) ? aux_wait100us_r[3:0]+4'b01 :
			(aux_state_r==ast03) ? 4'b0 :

			(aux_state_r==ast04) ? 4'b0 :
			(aux_state_r==ast05) & (link_wait100us_r==1'b0) ? aux_wait100us_r[3:0] :
			(aux_state_r==ast05) & (link_wait100us_r==1'b1) ? aux_wait100us_r[3:0]+4'b01 :
			(aux_state_r==ast06) ? 4'b0 :
			(aux_state_r==ast07) ? 4'b0 :
			4'b0;

	assign aux_retry_w[2:0]=
			(aux_state_r==ast00) ? 3'b0 :
			(aux_state_r==ast01) ? aux_retry_r[2:0] :
			(aux_state_r==ast02) & (aux_rx_done==1'b0) & (aux_wait100us_r[3]==1'b0) ? aux_retry_r[2:0] :
			(aux_state_r==ast02) & (aux_rx_done==1'b0) & (aux_wait100us_r[3]==1'b1) ? aux_retry_r[2:0]+3'b01 :
			(aux_state_r==ast02) & (aux_rx_done==1'b1) ? 3'b0 :
			(aux_state_r==ast03) ? 3'b0 :

			(aux_state_r==ast04) ? 3'b0 :
			(aux_state_r==ast05) ? 3'b0 :
			(aux_state_r==ast06) ? 3'b0 :
			(aux_state_r==ast07) ? 3'b0 :
			3'b0;

	assign aux_timeout_w=
			(aux_state_r==ast00) ? 1'b0 :
			(aux_state_r==ast01) ? 1'b0 :
			(aux_state_r==ast02) & (aux_rx_done==1'b0) & (aux_wait100us_r[3]==1'b0) ? 1'b0 :
			(aux_state_r==ast02) & (aux_rx_done==1'b0) & (aux_wait100us_r[3]==1'b1) & (aux_retry_r[2]==1'b0) ? 1'b0 :
			(aux_state_r==ast02) & (aux_rx_done==1'b0) & (aux_wait100us_r[3]==1'b1) & (aux_retry_r[2]==1'b1) ? 1'b1 :
			(aux_state_r==ast02) & (aux_rx_done==1'b1) ? 1'b0 :
			(aux_state_r==ast03) ? 1'b0 :

			(aux_state_r==ast04) ? 1'b0 :
			(aux_state_r==ast05) ? 1'b0 :
			(aux_state_r==ast06) ? 1'b0 :
			(aux_state_r==ast07) ? 1'b0 :
			1'b0;

	assign aux_tx_req_w=
			(aux_state_r==ast00) & (aux_cmd_req==1'b0) ? 1'b0 :
			(aux_state_r==ast00) & (aux_cmd_req==1'b1) ? 1'b1 :
			(aux_state_r==ast01) & (aux_tx_ack==1'b0) ? aux_tx_req_r :
			(aux_state_r==ast01) & (aux_tx_ack==1'b1) ? 1'b0 :
			(aux_state_r==ast02) & (aux_rx_done==1'b0) & (aux_wait100us_r[3]==1'b0) ? 1'b0 :
			(aux_state_r==ast02) & (aux_rx_done==1'b0) & (aux_wait100us_r[3]==1'b1) & (aux_retry_r[2]==1'b0) ? 1'b1 :
			(aux_state_r==ast02) & (aux_rx_done==1'b0) & (aux_wait100us_r[3]==1'b1) & (aux_retry_r[2]==1'b1) ? 1'b0 :
			(aux_state_r==ast02) & (aux_rx_done==1'b1) ? 1'b0 :
			(aux_state_r==ast03) & (aux_wait2unit_r==1'b0) ? 1'b0 :
			(aux_state_r==ast03) & (aux_wait2unit_r==1'b1) & (aux_cmd_code_r[35:32]!=4'hf) ? 1'b1 :
			(aux_state_r==ast03) & (aux_wait2unit_r==1'b1) & (aux_cmd_code_r[35:32]==4'hf) ? 1'b0 :

			(aux_state_r==ast04) ? 1'b0 :
			(aux_state_r==ast05) ? 1'b0 :
			(aux_state_r==ast06) ? 1'b0 :
			(aux_state_r==ast07) ? 1'b1 :
			1'b0;

	assign aux_ack_w=
			(aux_state_r==ast00) & (aux_cmd_req==1'b0) ? 1'b0 :
			(aux_state_r==ast00) & (aux_cmd_req==1'b1) ? 1'b1 :
			(aux_state_r==ast01) ? 1'b0 :
			(aux_state_r==ast02) ? 1'b0 :
			(aux_state_r==ast03) ? 1'b0 :

			(aux_state_r==ast04) ? 1'b0 :
			(aux_state_r==ast05) ? 1'b0 :
			(aux_state_r==ast06) ? 1'b0 :
			(aux_state_r==ast07) ? 1'b0 :
			1'b0;

	assign aux_done_w=
			(aux_state_r==ast00) ? 1'b0 :
			(aux_state_r==ast01) ? 1'b0 :
			(aux_state_r==ast02) & (aux_rx_done==1'b0) & (aux_wait100us_r[3]==1'b0) ? 1'b0 :
			(aux_state_r==ast02) & (aux_rx_done==1'b0) & (aux_wait100us_r[3]==1'b1) & (aux_retry_r[2]==1'b0) ? 1'b1 :
			(aux_state_r==ast02) & (aux_rx_done==1'b0) & (aux_wait100us_r[3]==1'b1) & (aux_retry_r[2]==1'b1) ? 1'b0 :
			(aux_state_r==ast02) & (aux_rx_done==1'b1) & (aux_rx_retry==1'b1) ? 1'b0 :
			(aux_state_r==ast02) & (aux_rx_done==1'b1) & (aux_rx_retry==1'b0) & (aux_cmd_code_r[35:32]!=4'hf) ? 1'b0 :
			(aux_state_r==ast02) & (aux_rx_done==1'b1) & (aux_rx_retry==1'b0) & (aux_cmd_code_r[35:32]==4'hf) ? 1'b1 :
			(aux_state_r==ast03) ? 1'b0 :

			(aux_state_r==ast04) ? 1'b0 :
			(aux_state_r==ast05) ? 1'b0 :
			(aux_state_r==ast06) ? 1'b0 :
			(aux_state_r==ast07) ? 1'b0 :
			1'b0;

	wire	aux_stat_rd;
	wire	aux_algn_rd;
	wire	aux_cap_rd00;
	wire	aux_stat_rd01;
	wire	aux_stat_rd23;
	wire	aux_irq_rd;
	wire	aux_unit_rd;

	assign aux_stat_rd=(({aux_tx_cmd[3:0],aux_tx_addr[19:0]}=={aux_cmd_dpcd_rd[3:0],20'h0202}) & (link_aux_rx_data_ack==1'b1)) ? 1'b1 : 1'b0;
	assign aux_cap_rd00=(({aux_tx_cmd[3:0],aux_tx_addr[19:0]}=={aux_cmd_dpcd_rd[3:0],20'h0000}) & (link_aux_rx_data_ack==1'b1)) ? 1'b1 : 1'b0;
	assign aux_stat_rd01=(({aux_tx_cmd[3:0],aux_tx_addr[19:0]}=={aux_cmd_dpcd_rd[3:0],20'h0202}) & (link_aux_rx_data_ack==1'b1)) ? 1'b1 : 1'b0;
	assign aux_stat_rd23=(({aux_tx_cmd[3:0],aux_tx_addr[19:0]}=={aux_cmd_dpcd_rd[3:0],20'h0203}) & (link_aux_rx_data_ack==1'b1)) ? 1'b1 : 1'b0;
	assign aux_algn_rd=(({aux_tx_cmd[3:0],aux_tx_addr[19:0]}=={aux_cmd_dpcd_rd[3:0],20'h0204}) & (link_aux_rx_data_ack==1'b1)) ? 1'b1 : 1'b0;
	assign aux_irq_rd=(({aux_tx_cmd[3:0],aux_tx_addr[19:0]}=={aux_cmd_dpcd_rd[3:0],20'h0201}) & (link_aux_rx_data_ack==1'b1)) ? 1'b1 : 1'b0;
	assign aux_unit_rd=(({aux_tx_cmd[3:0],aux_tx_addr[19:0]}=={aux_cmd_dpcd_rd[3:0],20'h0009}) & (link_aux_rx_data_ack==1'b1)) ? 1'b1 : 1'b0;

	assign aux_rd_count_w[3:0]=
			(link_aux_rx_cmd_ack==1'b1) ? 4'b0 :
			(link_aux_rx_cmd_ack==1'b0) & (link_aux_rx_data_ack==1'b1) ? aux_rd_count_r[3:0]+4'b01:
			(link_aux_rx_cmd_ack==1'b0) & (link_aux_rx_data_ack==1'b0) ? aux_rd_count_r[3:0]:
			4'b0;

	assign aux_cap_ver_w[7:0]=(aux_cap_rd00==1'b1) ? link_aux_rx_data[7:0] : aux_cap_ver_r[7:0];

	assign aux_stat_tr1_w[0]=(aux_stat_rd01==1'b1) ? link_aux_rx_data[0] : aux_stat_tr1_r[0];
	assign aux_stat_tr1_w[1]=(aux_stat_rd01==1'b1) ? link_aux_rx_data[4] : aux_stat_tr1_r[1];
	assign aux_stat_tr1_w[2]=(aux_stat_rd23==1'b1) ? link_aux_rx_data[0] : aux_stat_tr1_r[2];
	assign aux_stat_tr1_w[3]=(aux_stat_rd23==1'b1) ? link_aux_rx_data[4] : aux_stat_tr1_r[3];
	assign aux_stat_tr1_w[7:4]=4'b0;
	assign aux_stat_tr2_w[0]=(aux_stat_rd01==1'b1) ? link_aux_rx_data[1] : aux_stat_tr2_r[0];
	assign aux_stat_tr2_w[1]=(aux_stat_rd01==1'b1) ? link_aux_rx_data[5] : aux_stat_tr2_r[1];
	assign aux_stat_tr2_w[2]=(aux_stat_rd23==1'b1) ? link_aux_rx_data[1] : aux_stat_tr2_r[2];
	assign aux_stat_tr2_w[3]=(aux_stat_rd23==1'b1) ? link_aux_rx_data[5] : aux_stat_tr2_r[3];
	assign aux_stat_tr2_w[7:4]=4'b0;
	assign aux_stat_algn_w=(aux_algn_rd==1'b1) ? link_aux_rx_data[0] : aux_stat_algn_r;
	assign aux_stat_irq_w[7:0]=(aux_irq_rd==1'b1) ? link_aux_rx_data[7:0] : aux_stat_irq_r[7:0];
	assign aux_unit_w[7:0]=(aux_unit_rd==1'b1) ? link_aux_rx_data[7:0] : aux_unit_r[7:0];

endmodule
