//+FHDR------------------------------------------------------------------------
|
|
//Copyright (c) 2013 Latin Group American Integhrated Circuit, Inc. All rights reserved
|
|
//GLADIC Open Source RTL
|
|
//-----------------------------------------------------------------------------
|
|
//FILE NAME :
|
|
//DEPARTMENT : IC Design / Verification
|
|
//AUTHOR : Felipe Fernandes da Costa
|
|
//AUTHOR’S EMAIL :
|
|
//-----------------------------------------------------------------------------
|
|
//RELEASE HISTORY
|
|
//VERSION DATE AUTHOR DESCRIPTION
|
|
//1.0 YYYY-MM-DD name
|
|
//-----------------------------------------------------------------------------
|
|
//KEYWORDS : General file searching keywords, leave blank if none.
|
|
//-----------------------------------------------------------------------------
|
|
//PURPOSE : ECSS_E_ST_50_12C_31_july_2008
|
|
//-----------------------------------------------------------------------------
|
|
//PARAMETERS
|
|
//PARAM NAME RANGE : DESCRIPTION : DEFAULT : UNITS
|
|
//e.g.DATA_WIDTH [32,16] : width of the DATA : 32:
|
|
//-----------------------------------------------------------------------------
|
|
//REUSE ISSUES
|
|
//Reset Strategy :
|
|
//Clock Domains :
|
|
//Critical Timing :
|
|
//Test Features :
|
|
//Asynchronous I/F :
|
|
//Scan Methodology :
|
|
//Instantiations :
|
|
//Synthesizable (y/n) :
|
|
//Other :
|
|
//-FHDR------------------------------------------------------------------------
|
|
#ifndef SPW_FSM_T_H
|
#ifndef SPW_FSM_T_H
|
#define SPW_FSM_T_H
|
#define SPW_FSM_T_H
|
|
|
#include <systemc.h>
|
#include <systemc.h>
|
|
|
#define ERROR_RESET 0
|
#define ERROR_RESET 0
|
#define ERROR_WAIT 1
|
#define ERROR_WAIT 1
|
#define READY 2
|
#define READY 2
|
#define STARTED 3
|
#define STARTED 3
|
#define CONNECTING 4
|
#define CONNECTING 4
|
#define RUN 5
|
#define RUN 5
|
|
|
class SPW_FSM_SC;
|
class SPW_FSM_SC;
|
|
|
SC_MODULE(SPW_FSM_SC)
|
SC_MODULE(SPW_FSM_SC)
|
{
|
{
|
|
|
/*FSM signal*/
|
/*FSM signal*/
|
sc_in<bool> CLOCK;
|
sc_in<bool> CLOCK;
|
sc_in<bool> RESET;
|
sc_in<bool> RESET;
|
sc_in<bool> LINK_START;
|
sc_in<bool> LINK_START;
|
sc_in<bool> LINK_DISABLE;
|
sc_in<bool> LINK_DISABLE;
|
sc_in<bool> AUTO_START;
|
sc_in<bool> AUTO_START;
|
sc_out<sc_uint<4> > FSM_SPW_OUT;
|
sc_out<sc_uint<4> > FSM_SPW_OUT;
|
|
|
/*Signal come from RX Receiver*/
|
/*Signal come from RX Receiver*/
|
sc_in<bool> GOT_FCT_RX;
|
sc_in<bool> GOT_FCT_RX;
|
sc_in<bool> GOT_TIMECODE_RX;
|
sc_in<bool> GOT_TIMECODE_RX;
|
sc_in<bool> GOTNCHAR_RX;
|
sc_in<bool> GOTNCHAR_RX;
|
sc_in<bool> GOTNULL_RX;
|
sc_in<bool> GOTNULL_RX;
|
sc_in<bool> GOTBIT_RX;
|
sc_in<bool> GOTBIT_RX;
|
sc_in<bool> CREDITERROR_RX;
|
sc_in<bool> CREDITERROR_RX;
|
sc_in<bool> RXERROR_RX;
|
sc_in<bool> RXERROR_RX;
|
sc_out<bool> ENABLE_RX;
|
sc_out<bool> ENABLE_RX;
|
|
|
/*Signal come from TX Transmit*/
|
/*Signal come from TX Transmit*/
|
sc_out<bool> ENABLE_TX;
|
sc_out<bool> ENABLE_TX;
|
sc_out<bool> SEND_NULL_TX;
|
sc_out<bool> SEND_NULL_TX;
|
sc_out<bool> SEND_FCT_TX;
|
sc_out<bool> SEND_FCT_TX;
|
sc_out<bool> SEND_NCHAR_TX;
|
sc_out<bool> SEND_NCHAR_TX;
|
sc_out<bool> SEND_TIMECODE_TX;
|
sc_out<bool> SEND_TIMECODE_TX;
|
|
|
/*RESET TX / RX*/
|
/*RESET TX / RX*/
|
sc_out<bool> RESET_TX;
|
sc_out<bool> RESET_TX;
|
sc_out<bool> RESET_RX;
|
sc_out<bool> RESET_RX;
|
|
|
bool After128;
|
bool After128;
|
|
|
bool After64;
|
bool After64;
|
|
|
sc_uint<4> state_fsm_spw;
|
sc_uint<4> state_fsm_spw;
|
|
|
void FSM()
|
void FSM()
|
{
|
{
|
|
|
//cout << "STARTING FSM SPW SC" << endl;
|
//cout << "STARTING FSM SPW SC" << endl;
|
|
|
while(1)
|
while(1)
|
{
|
{
|
|
|
if(!RESET)
|
if(!RESET)
|
{
|
{
|
FSM_SPW_OUT = state_fsm_spw = ERROR_RESET;
|
FSM_SPW_OUT = state_fsm_spw = ERROR_RESET;
|
ENABLE_TX = false;
|
ENABLE_TX = false;
|
SEND_NULL_TX = false;
|
SEND_NULL_TX = false;
|
SEND_FCT_TX = false;
|
SEND_FCT_TX = false;
|
SEND_NCHAR_TX = false;
|
SEND_NCHAR_TX = false;
|
SEND_TIMECODE_TX= false;
|
SEND_TIMECODE_TX= false;
|
RESET_TX = true;
|
RESET_TX = true;
|
RESET_RX = true;
|
RESET_RX = true;
|
}else
|
}else
|
{
|
{
|
FSM_SPW_OUT = state_fsm_spw;
|
FSM_SPW_OUT = state_fsm_spw;
|
|
|
switch(state_fsm_spw)
|
switch(state_fsm_spw)
|
{
|
{
|
case ERROR_RESET:
|
case ERROR_RESET:
|
RESET_TX = true;
|
RESET_TX = true;
|
RESET_RX = true;
|
RESET_RX = true;
|
ENABLE_TX = false;
|
ENABLE_TX = false;
|
ENABLE_RX = false;
|
ENABLE_RX = false;
|
if(After64 == true)
|
if(After64 == true)
|
{
|
{
|
state_fsm_spw = ERROR_WAIT;
|
state_fsm_spw = ERROR_WAIT;
|
}
|
}
|
//cout << "ERROR RESET" << endl;
|
//cout << "ERROR RESET" << endl;
|
break;
|
break;
|
case ERROR_WAIT:
|
case ERROR_WAIT:
|
RESET_TX = true;
|
RESET_TX = true;
|
ENABLE_TX = false;
|
ENABLE_TX = false;
|
RESET_RX = false;
|
RESET_RX = false;
|
ENABLE_RX = true;
|
ENABLE_RX = true;
|
|
|
if(After128 == true)
|
if(After128 == true)
|
{
|
{
|
state_fsm_spw = READY;
|
state_fsm_spw = READY;
|
}else if(RXERROR_RX || GOT_FCT_RX || GOTNCHAR_RX || GOT_TIMECODE_RX)
|
}else if(RXERROR_RX || GOT_FCT_RX || GOTNCHAR_RX || GOT_TIMECODE_RX)
|
{
|
{
|
state_fsm_spw = ERROR_RESET;
|
state_fsm_spw = ERROR_RESET;
|
}
|
}
|
|
|
//cout << "ERROR WAIT" << endl;
|
//cout << "ERROR WAIT" << endl;
|
break;
|
break;
|
case READY:
|
case READY:
|
RESET_TX = true;
|
RESET_TX = true;
|
RESET_RX = false;
|
RESET_RX = false;
|
ENABLE_RX = true;
|
ENABLE_RX = true;
|
if(RXERROR_RX || GOT_FCT_RX || GOTNCHAR_RX || GOT_TIMECODE_RX)
|
if(RXERROR_RX || GOT_FCT_RX || GOTNCHAR_RX || GOT_TIMECODE_RX)
|
{
|
{
|
state_fsm_spw = ERROR_RESET;
|
state_fsm_spw = ERROR_RESET;
|
}
|
}
|
else if((!LINK_DISABLE) && (LINK_START ||(AUTO_START && GOTNULL_RX)))
|
else if((!LINK_DISABLE) && (LINK_START ||(AUTO_START && GOTNULL_RX)))
|
{
|
{
|
state_fsm_spw = STARTED;
|
state_fsm_spw = STARTED;
|
}
|
}
|
|
|
//cout << "READY" << endl;
|
//cout << "READY" << endl;
|
break;
|
break;
|
case STARTED:
|
case STARTED:
|
RESET_TX = false;
|
RESET_TX = false;
|
RESET_RX = false;
|
RESET_RX = false;
|
SEND_NULL_TX = true;
|
SEND_NULL_TX = true;
|
ENABLE_TX = true;
|
ENABLE_TX = true;
|
ENABLE_RX = true;
|
ENABLE_RX = true;
|
|
|
if(RXERROR_RX || GOT_FCT_RX || GOTNCHAR_RX || GOT_TIMECODE_RX || After128 )
|
if(RXERROR_RX || GOT_FCT_RX || GOTNCHAR_RX || GOT_TIMECODE_RX || After128 )
|
{
|
{
|
state_fsm_spw = ERROR_RESET;
|
state_fsm_spw = ERROR_RESET;
|
}
|
}
|
else if(GOTNULL_RX && GOTBIT_RX)
|
else if(GOTNULL_RX && GOTBIT_RX)
|
{
|
{
|
state_fsm_spw = CONNECTING;
|
state_fsm_spw = CONNECTING;
|
}
|
}
|
//cout << "STARTED" << endl;
|
//cout << "STARTED" << endl;
|
break;
|
break;
|
case CONNECTING:
|
case CONNECTING:
|
|
|
RESET_TX = false;
|
RESET_TX = false;
|
RESET_RX = false;
|
RESET_RX = false;
|
ENABLE_TX = true;
|
ENABLE_TX = true;
|
ENABLE_RX = true;
|
ENABLE_RX = true;
|
|
|
SEND_NULL_TX = true;
|
SEND_NULL_TX = true;
|
SEND_FCT_TX = true;
|
SEND_FCT_TX = true;
|
|
|
|
|
if(RXERROR_RX || GOTNCHAR_RX || GOT_TIMECODE_RX || After128 )
|
if(RXERROR_RX || GOTNCHAR_RX || GOT_TIMECODE_RX || After128 )
|
{
|
{
|
state_fsm_spw = ERROR_RESET;
|
state_fsm_spw = ERROR_RESET;
|
}else if(GOT_FCT_RX)
|
}else if(GOT_FCT_RX)
|
{
|
{
|
state_fsm_spw = RUN;
|
state_fsm_spw = RUN;
|
}
|
}
|
//cout << "CONNECTING" << endl;
|
//cout << "CONNECTING" << endl;
|
break;
|
break;
|
case RUN:
|
case RUN:
|
|
|
SEND_NULL_TX = true;
|
SEND_NULL_TX = true;
|
ENABLE_TX = true;
|
ENABLE_TX = true;
|
SEND_FCT_TX = true;
|
SEND_FCT_TX = true;
|
SEND_NCHAR_TX = true;
|
SEND_NCHAR_TX = true;
|
SEND_TIMECODE_TX = true;
|
SEND_TIMECODE_TX = true;
|
ENABLE_RX = true;
|
ENABLE_RX = true;
|
|
|
if(RXERROR_RX || CREDITERROR_RX || LINK_DISABLE)
|
if(RXERROR_RX || CREDITERROR_RX || LINK_DISABLE)
|
{
|
{
|
state_fsm_spw = ERROR_RESET;
|
state_fsm_spw = ERROR_RESET;
|
//cout << "RX ERROR DETECTED" << endl;
|
//cout << "RX ERROR DETECTED" << endl;
|
}
|
}
|
else
|
else
|
{
|
{
|
state_fsm_spw = RUN;
|
state_fsm_spw = RUN;
|
}
|
}
|
|
|
//cout << "RUN" << endl;
|
//cout << "RUN" << endl;
|
break;
|
break;
|
}
|
}
|
}
|
}
|
wait(1);
|
wait(1);
|
}
|
}
|
}
|
}
|
|
|
|
|
void TIMER_ADTER128()
|
void TIMER_ADTER128()
|
{
|
{
|
while(1)
|
while(1)
|
{
|
{
|
if(!RESET)
|
if(!RESET)
|
{
|
{
|
After128 = false;
|
After128 = false;
|
}
|
}
|
else
|
else
|
{
|
{
|
if(state_fsm_spw == ERROR_WAIT || state_fsm_spw == STARTED || state_fsm_spw == CONNECTING)
|
if(state_fsm_spw == ERROR_WAIT || state_fsm_spw == STARTED || state_fsm_spw == CONNECTING)
|
{
|
{
|
After128 = false;
|
After128 = false;
|
wait(639);
|
wait(639);
|
After128 = true;
|
After128 = true;
|
}
|
}
|
}
|
}
|
wait(1);
|
wait(1);
|
}
|
}
|
}
|
}
|
|
|
void TIMER_ADTER64()
|
void TIMER_ADTER64()
|
{
|
{
|
while(1)
|
while(1)
|
{
|
{
|
if(!RESET)
|
if(!RESET)
|
{
|
{
|
After64 = false;
|
After64 = false;
|
}
|
}
|
else
|
else
|
{
|
{
|
if(state_fsm_spw == ERROR_RESET)
|
if(state_fsm_spw == ERROR_RESET)
|
{
|
{
|
After64 = false;
|
After64 = false;
|
wait(319);
|
wait(319);
|
After64 = true;
|
After64 = true;
|
}
|
}
|
}
|
}
|
wait(1);
|
wait(1);
|
}
|
}
|
}
|
}
|
|
|
|
|
SC_CTOR(SPW_FSM_SC)
|
SC_CTOR(SPW_FSM_SC)
|
{
|
{
|
SC_CTHREAD(FSM,CLOCK.pos());
|
SC_CTHREAD(FSM,CLOCK.pos());
|
SC_CTHREAD(TIMER_ADTER64,CLOCK.pos());
|
SC_CTHREAD(TIMER_ADTER64,CLOCK.pos());
|
SC_CTHREAD(TIMER_ADTER128,CLOCK.pos());
|
SC_CTHREAD(TIMER_ADTER128,CLOCK.pos());
|
}
|
}
|
|
|
};
|
};
|
|
|
#endif
|
#endif
|
|
|