예제 #1
0
void
CPersStream::PersStream()
{
    if (PR_htValid) {
        switch (PR_htInst) {

        // Main entry point from Host (htmain call)
        // P_rcvData => 0 (init)
        case STRM_RECV:
        {
            if (RecvHostDataBusy()) {
                HtRetry();
                break;
            }

            // Receive data until we see a DataMarker from the host
            if (RecvHostDataMarker()) {
                HtContinue(STRM_RTN);
            } else {
                // Store received data into private variable recvData
                P_rcvData = RecvHostData();
                HtContinue(STRM_ECHO);
            }
        }
        break;

        case STRM_ECHO:
        {
            if (SendHostDataBusy()) {
                HtRetry();
                break;
            }

            // Echo data to back host
            SendHostData(PR_rcvData);
            HtContinue(STRM_RECV);
        }
        break;

        case STRM_RTN:
        {
            if (SendReturnBusy_htmain()) {
                HtRetry();
                break;
            }

            // Return number of bytes seen to the host
            SendReturn_htmain();
        }
        break;

        default:
            assert(0);
        }
    }
}
예제 #2
0
void
CPersEcho::PersEcho()
{
	if (PR_htValid) {
		switch (PR_htInst) {
		case ECHO_INIT:
		{
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}

			// Set address for reading memory response data
			P_arrayMemRdPtr = 2;
			P_dataCnt = 0;

			sc_uint<MEM_ADDR_W> memRdAddr = (sc_uint<MEM_ADDR_W>)r_arrayAddr;

			// Issue read request to memory
			ReadMem_arrayMem(memRdAddr, 2);

			ReadMemPause(ECHO_DATA);
		}
		break;
		case ECHO_DATA:
		{
			if (ReadMemBusy() || SendReturnBusy_echo() || RecvHostDataBusy() || SendHostDataBusy()) {
				HtRetry();
				break;
			}

			// handle adding value to popped queue data and pushing to output queue

			if (RecvHostDataMarker()) {
				SendHostDataMarker();

				// Return to host interface
				SendReturn_echo(P_dataCnt);
			} else {
				uint64_t inData = PeekHostData();

				RecvHostData();

				uint64_t outData = inData + GR_arrayMem.data;

				SendHostData(outData);

				P_dataCnt += 1;

				// Calculate memory read address
				sc_uint<MEM_ADDR_W> memRdAddr = (sc_uint<MEM_ADDR_W>)(r_arrayAddr + (P_dataCnt << 3));

				// Issue read request to memory
				ReadMem_arrayMem(memRdAddr, 2);

				ReadMemPause(ECHO_DATA);
			}
		}
		break;
		default:
			assert(0);
		}
	}
}