示例#1
0
void CPersTest00::PersTest00() {
	if (PR_htValid) {
		switch (PR_htInst) {
		case TEST00_ENTRY: {
			HtContinue(TEST00_WR0);
			break;
		}
		case TEST00_WR0: {
			PW_test00_0_dst_u0_data.write_addr(0);
			PW_test00_0_dst_u0_data.test00_0_dst_v0_data[0][0] = ((int32_t)0x0015f6080d6fd5c0LL);
			PW_test00_0_dst_u0_data.test00_0_dst_v0_data[0][1] = ((int32_t)0x0015f6080d6fd5c0LL);
			PW_test00_0_dst_u0_data.test00_0_dst_v0_data[0][2] = ((int32_t)0x0015f6080d6fd5c0LL);
			PW_test00_0_dst_u0_data.test00_0_dst_v0_data[0][3] = ((int32_t)0x0015f6080d6fd5c0LL);
			PW_test00_0_dst_u0_data.test00_0_dst_v0_data[0][4] = ((int32_t)0x0015f6080d6fd5c0LL);
			PW_test00_0_dst_u0_data.test00_0_dst_v0_data[1][0] = ((int32_t)0x0015f6080d6fd5c0LL);
			PW_test00_0_dst_u0_data.test00_0_dst_v0_data[1][1] = ((int32_t)0x0015f6080d6fd5c0LL);
			PW_test00_0_dst_u0_data.test00_0_dst_v0_data[1][2] = ((int32_t)0x0015f6080d6fd5c0LL);
			PW_test00_0_dst_u0_data.test00_0_dst_v0_data[1][3] = ((int32_t)0x0015f6080d6fd5c0LL);
			PW_test00_0_dst_u0_data.test00_0_dst_v0_data[1][4] = ((int32_t)0x0015f6080d6fd5c0LL);
			PW_test00_0_dst_u0_data.test00_0_dst_v0_data[2][0] = ((int32_t)0x0015f6080d6fd5c0LL);
			PW_test00_0_dst_u0_data.test00_0_dst_v0_data[2][1] = ((int32_t)0x0015f6080d6fd5c0LL);
			PW_test00_0_dst_u0_data.test00_0_dst_v0_data[2][2] = ((int32_t)0x0015f6080d6fd5c0LL);
			PW_test00_0_dst_u0_data.test00_0_dst_v0_data[2][3] = ((int32_t)0x0015f6080d6fd5c0LL);
			PW_test00_0_dst_u0_data.test00_0_dst_v0_data[2][4] = ((int32_t)0x0015f6080d6fd5c0LL);
			HtContinue(TEST00_ST0);
			break;
		}
		case TEST00_ST0: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_test00_0_dst_u0_data(PR_memAddr + 0, 0);
			WriteMemPause(TEST00_LD0);
			break;
		}
		case TEST00_LD0: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_0_dst_u0_data(PR_memAddr + 0, 0);
			P_test00_0_dst_u0_data_RdAddr1 = (ht_uint1)0;
			ReadMemPause(TEST00_CHK0);
			break;
		}
		case TEST00_CHK0: {
			if (PR_test00_0_dst_u0_data.test00_0_dst_v0_data[0][0] != ((int32_t)(ht_int32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_0_dst_u0_data.test00_0_dst_v0_data[0][1] != ((int32_t)(ht_int32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_0_dst_u0_data.test00_0_dst_v0_data[0][2] != ((int32_t)(ht_int32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_0_dst_u0_data.test00_0_dst_v0_data[0][3] != ((int32_t)(ht_int32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_0_dst_u0_data.test00_0_dst_v0_data[0][4] != ((int32_t)(ht_int32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_0_dst_u0_data.test00_0_dst_v0_data[1][0] != ((int32_t)(ht_int32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_0_dst_u0_data.test00_0_dst_v0_data[1][1] != ((int32_t)(ht_int32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_0_dst_u0_data.test00_0_dst_v0_data[1][2] != ((int32_t)(ht_int32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_0_dst_u0_data.test00_0_dst_v0_data[1][3] != ((int32_t)(ht_int32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_0_dst_u0_data.test00_0_dst_v0_data[1][4] != ((int32_t)(ht_int32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_0_dst_u0_data.test00_0_dst_v0_data[2][0] != ((int32_t)(ht_int32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_0_dst_u0_data.test00_0_dst_v0_data[2][1] != ((int32_t)(ht_int32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_0_dst_u0_data.test00_0_dst_v0_data[2][2] != ((int32_t)(ht_int32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_0_dst_u0_data.test00_0_dst_v0_data[2][3] != ((int32_t)(ht_int32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_0_dst_u0_data.test00_0_dst_v0_data[2][4] != ((int32_t)(ht_int32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_0_dst_u0_data.test00_0_dst_v1_data != ((uint32_t)(ht_uint32)0x000000000d6fd5c0LL)) {
				HtAssert(0, 0);
			}
			HtContinue(TEST00_RTN);
			break;
		}
		case TEST00_RTN: {
			if (SendReturnBusy_test00()) {
				HtRetry();
				break;
			}
			SendReturn_test00();
			break;
		}
		default:
			assert(0);
		}
	}
}
示例#2
0
void CPersTest00::PersTest00() {
    if (PR_htValid) {
        switch (PR_htInst) {
        case TEST00_ENTRY: {
            HtContinue(TEST00_WR);
            break;
        }
        case TEST00_WR: {
            S_test00_0_src_s0_data[1][0].test00_0_src_v0_data[0][0] = ((int64_t)0x001f7a58947f5200LL);
            S_test00_0_src_s0_data[1][0].test00_0_src_v0_data[0][1] = ((int64_t)0x001f7a58947f5200LL);
            S_test00_0_src_s0_data[1][0].test00_0_src_v0_data[0][2] = ((int64_t)0x001f7a58947f5200LL);
            S_test00_0_src_s0_data[1][0].test00_0_src_v1_data[0][0] = ((uint16_t)0x0019fc3898d606e0LL);
            S_test00_0_src_s0_data[1][0].test00_0_src_v1_data[0][1] = ((uint16_t)0x0019fc3898d606e0LL);
            S_test00_0_src_s0_data[1][0].test00_0_src_v1_data[0][2] = ((uint16_t)0x0019fc3898d606e0LL);
            HtContinue(TEST00_ST0);
            break;
        }
        case TEST00_ST0: {
            if (WriteMemBusy()) {
                HtRetry();
                break;
            }
            WriteMem_test00_0_src_s0_data(PR_memAddr + 0, 1, 0, 1);
            WriteMemPause(TEST00_LD0);
            break;
        }
        case TEST00_LD0: {
            if (ReadMemBusy()) {
                HtRetry();
                break;
            }
            ReadMem_test00_0_src_s0_data(PR_memAddr + 0, 1, 0, 1);
            ReadMemPause(TEST00_CHK);
            break;
        }
        case TEST00_CHK: {
            if ((int64_t)SR_test00_0_src_s0_data[1][0].test00_0_src_v0_data[0][0] != ((int64_t)0x001f7a58947f5200LL)) {
                HtAssert(0, 0);
            }
            if ((int64_t)SR_test00_0_src_s0_data[1][0].test00_0_src_v0_data[0][1] != ((int64_t)0x001f7a58947f5200LL)) {
                HtAssert(0, 0);
            }
            if ((int64_t)SR_test00_0_src_s0_data[1][0].test00_0_src_v0_data[0][2] != ((int64_t)0x001f7a58947f5200LL)) {
                HtAssert(0, 0);
            }
            if ((uint16_t)S_test00_0_src_s0_data[1][0].test00_0_src_v1_data[0][0] != ((uint16_t)0x0019fc3898d606e0LL)) {
                HtAssert(0, 0);
            }
            if ((uint16_t)S_test00_0_src_s0_data[1][0].test00_0_src_v1_data[0][1] != ((uint16_t)0x0019fc3898d606e0LL)) {
                HtAssert(0, 0);
            }
            if ((uint16_t)S_test00_0_src_s0_data[1][0].test00_0_src_v1_data[0][2] != ((uint16_t)0x0019fc3898d606e0LL)) {
                HtAssert(0, 0);
            }
            HtContinue(TEST00_RTN);
            break;
        }
        case TEST00_RTN: {
            if (SendReturnBusy_test00()) {
                HtRetry();
                break;
            }
            SendReturn_test00();
            break;
        }
        default:
            assert(0);
        }
    }
}
示例#3
0
void CPersBcm::PersBcm()
{
	if (PR1_htValid) {
		switch (PR1_htInst) {
		// Initial Entry Point from Host Code -> BCM_ENTRY
		//
		// Read in Task information
		// GR_task -> midState[8]/data[3]/initNonce/lastNonce/target[3]
		case BCM_ENTRY: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}

			ReadMem_task(PR1_pBcmTask);

			ReadMemPause(BCM_TASK_VALID);
		}
		break;


		// Force initial task to be valid
		// Setup initial Nonce
		case BCM_TASK_VALID: {
			S_bTaskValid = true;

			S_nonce = S_task.m_initNonce;

			S_hashCount = 0;

			HtContinue(BCM_CHK_RTN);
		}
		break;


		// Main hash loop, sit and check the result queue
		case BCM_CHK_RTN: {
			if (SendReturnBusy_bcm() || SendHostMsgBusy()) {
				HtRetry();
				break;
			}

			if (S_hashCount > 1000000) {
				SendHostMsg(BCM_HASHES_COMPLETED, (ht_uint56)S_hashCount);
				S_hashCount = 0;
			}

			if (S_nonceHitQue.empty()) {
				// No results waiting
				if (S_bTaskValid) {
					HtContinue(BCM_CHK_RTN);
				} else {
					if (S_hashCount > 0) {
						SendHostMsg(BCM_HASHES_COMPLETED, (ht_uint56)S_hashCount);
						S_hashCount = 0;
					}
					SendReturn_bcm(P1_pBcmTask);
				}
			} else {
				// Results are waiting to be processed
				if (S_bcmRsltQue.empty())
					HtContinue(BCM_CHK_RTN);
				else
					HtContinue(BCM_WR_RSLT1);
			}

			// Reset index for results to zero (for writing to memory)
			S_rsltQwIdx = 0;
		}
		break;

		// BCM_WR_RSLT1->3, steps to write a result to memory
		case BCM_WR_RSLT1: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}

			ht_uint48 memAddr = S_bcmRsltQue.front() | (S_rsltQwIdx << 3);

			WriteMem(memAddr, S_task.m_qw[S_rsltQwIdx]);

			S_rsltQwIdx += 1;

			if (S_rsltQwIdx < 5)
				HtContinue(BCM_WR_RSLT1);
			else
				HtContinue(BCM_WR_RSLT2);
		}
		break;

		case BCM_WR_RSLT2: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}

			ht_uint48 memAddr = S_bcmRsltQue.front() | (5 << 3);
			ht_uint64 memData;

			memData(31, 0) = S_task.m_qw[5] & 0xffffffff;
			memData(63, 32) = BcmByteSwap32(S_nonceHitQue.front());

			S_nonceHitQue.pop();

			WriteMem(memAddr, memData);

			WriteMemPause(BCM_WR_RSLT3);
		}
		break;

		case BCM_WR_RSLT3: {
			if (SendHostMsgBusy()) {
				HtRetry();
				break;
			}

			SendHostMsg(BCM_RSLT_BUF_RDY, (ht_uint56)S_bcmRsltQue.front());

			S_bcmRsltQue.pop();

			HtContinue(BCM_CHK_RTN);
		}
		break;

		default:
			assert(0);
		}
	}

	// temps used within macros
	uint32_t temp1, temp2, tmp;

	// Input Valid Signal reflects Task Valid Signal
	T1_vld = S_bTaskValid;

	// *** State Setup ***

	// Setup T1_data
	T1_data.m_dw[0] = S_task.m_data[0];
	T1_data.m_dw[1] = S_task.m_data[1];
	T1_data.m_dw[2] = S_task.m_data[2];
	T1_data.m_dw[3] = S_nonce;
	T1_data.m_dw[4] = 0x80000000;
	T1_data.m_dw[5] = 0x00000000;
	T1_data.m_dw[6] = 0x00000000;
	T1_data.m_dw[7] = 0x00000000;
	T1_data.m_dw[8] = 0x00000000;
	T1_data.m_dw[9] = 0x00000000;
	T1_data.m_dw[10] = 0x00000000;
	T1_data.m_dw[11] = 0x00000000;
	T1_data.m_dw[12] = 0x00000000;
	T1_data.m_dw[13] = 0x00000000;
	T1_data.m_dw[14] = 0x00000000;
	T1_data.m_dw[15] = 0x00000280;

	// Setup T1_state
	T1_state.m_state[0] = S_task.m_midState.m_state[0];
	T1_state.m_state[1] = S_task.m_midState.m_state[1];
	T1_state.m_state[2] = S_task.m_midState.m_state[2];
	T1_state.m_state[3] = S_task.m_midState.m_state[3];
	T1_state.m_state[4] = S_task.m_midState.m_state[4];
	T1_state.m_state[5] = S_task.m_midState.m_state[5];
	T1_state.m_state[6] = S_task.m_midState.m_state[6];
	T1_state.m_state[7] = S_task.m_midState.m_state[7];

	// Nonce
	T1_nonce = S_nonce;

	// *** Do Work ***

	// 64-deep Hash Cycle 1
	Q(T2_state, 0, T2_data, 0x428A2F98);
	Q(T3_state, 7, T3_data, 0x71374491);
	Q(T4_state, 6, T4_data, 0xB5C0FBCF);
	Q(T5_state, 5, T5_data, 0xE9B5DBA5);
	Q(T6_state, 4, T6_data, 0x3956C25B);
	Q(T7_state, 3, T7_data, 0x59F111F1);
	Q(T8_state, 2, T8_data, 0x923F82A4);
	Q(T9_state, 1, T9_data, 0xAB1C5ED5);
	Q(T10_state, 0, T10_data, 0xD807AA98);
	Q(T11_state, 7, T11_data, 0x12835B01);
	Q(T12_state, 6, T12_data, 0x243185BE);
	Q(T13_state, 5, T13_data, 0x550C7DC3);
	Q(T14_state, 4, T14_data, 0x72BE5D74);
	Q(T15_state, 3, T15_data, 0x80DEB1FE);
	Q(T16_state, 2, T16_data, 0x9BDC06A7);
	Q(T17_state, 1, T17_data, 0xC19BF174);
	R(T18_state, 0, T18_data, 0xE49B69C1);
	R(T19_state, 7, T19_data, 0xEFBE4786);
	R(T20_state, 6, T20_data, 0x0FC19DC6);
	R(T21_state, 5, T21_data, 0x240CA1CC);
	R(T22_state, 4, T22_data, 0x2DE92C6F);
	R(T23_state, 3, T23_data, 0x4A7484AA);
	R(T24_state, 2, T24_data, 0x5CB0A9DC);
	R(T25_state, 1, T25_data, 0x76F988DA);
	R(T26_state, 0, T26_data, 0x983E5152);
	R(T27_state, 7, T27_data, 0xA831C66D);
	R(T28_state, 6, T28_data, 0xB00327C8);
	R(T29_state, 5, T29_data, 0xBF597FC7);
	R(T30_state, 4, T30_data, 0xC6E00BF3);
	R(T31_state, 3, T31_data, 0xD5A79147);
	R(T32_state, 2, T32_data, 0x06CA6351);
	R(T33_state, 1, T33_data, 0x14292967);
	R(T34_state, 0, T34_data, 0x27B70A85);
	R(T35_state, 7, T35_data, 0x2E1B2138);
	R(T36_state, 6, T36_data, 0x4D2C6DFC);
	R(T37_state, 5, T37_data, 0x53380D13);
	R(T38_state, 4, T38_data, 0x650A7354);
	R(T39_state, 3, T39_data, 0x766A0ABB);
	R(T40_state, 2, T40_data, 0x81C2C92E);
	R(T41_state, 1, T41_data, 0x92722C85);
	R(T42_state, 0, T42_data, 0xA2BFE8A1);
	R(T43_state, 7, T43_data, 0xA81A664B);
	R(T44_state, 6, T44_data, 0xC24B8B70);
	R(T45_state, 5, T45_data, 0xC76C51A3);
	R(T46_state, 4, T46_data, 0xD192E819);
	R(T47_state, 3, T47_data, 0xD6990624);
	R(T48_state, 2, T48_data, 0xF40E3585);
	R(T49_state, 1, T49_data, 0x106AA070);
	R(T50_state, 0, T50_data, 0x19A4C116);
	R(T51_state, 7, T51_data, 0x1E376C08);
	R(T52_state, 6, T52_data, 0x2748774C);
	R(T53_state, 5, T53_data, 0x34B0BCB5);
	R(T54_state, 4, T54_data, 0x391C0CB3);
	R(T55_state, 3, T55_data, 0x4ED8AA4A);
	R(T56_state, 2, T56_data, 0x5B9CCA4F);
	R(T57_state, 1, T57_data, 0x682E6FF3);
	R(T58_state, 0, T58_data, 0x748F82EE);
	R(T59_state, 7, T59_data, 0x78A5636F);
	R(T60_state, 6, T60_data, 0x84C87814);
	R(T61_state, 5, T61_data, 0x8CC70208);
	R(T62_state, 4, T62_data, 0x90BEFFFA);
	R(T63_state, 3, T63_data, 0xA4506CEB);
	R(T64_state, 2, T64_data, 0xBEF9A3F7);
	R(T65_state, 1, T65_data, 0xC67178F2);

	// Add following hash cycle 1
	T66_state.m_state[0] = T66_state.m_state[0] + S_task.m_midState.m_state[0];
	T66_state.m_state[1] = T66_state.m_state[1] + S_task.m_midState.m_state[1];
	T66_state.m_state[2] = T66_state.m_state[2] + S_task.m_midState.m_state[2];
	T66_state.m_state[3] = T66_state.m_state[3] + S_task.m_midState.m_state[3];
	T66_state.m_state[4] = T66_state.m_state[4] + S_task.m_midState.m_state[4];
	T66_state.m_state[5] = T66_state.m_state[5] + S_task.m_midState.m_state[5];
	T66_state.m_state[6] = T66_state.m_state[6] + S_task.m_midState.m_state[6];
	T66_state.m_state[7] = T66_state.m_state[7] + S_task.m_midState.m_state[7];

	// State Setup
	// Setup T67_data
	T67_data.m_dw[0] = T67_state.m_state[0];
	T67_data.m_dw[1] = T67_state.m_state[1];
	T67_data.m_dw[2] = T67_state.m_state[2];
	T67_data.m_dw[3] = T67_state.m_state[3];
	T67_data.m_dw[4] = T67_state.m_state[4];
	T67_data.m_dw[5] = T67_state.m_state[5];
	T67_data.m_dw[6] = T67_state.m_state[6];
	T67_data.m_dw[7] = T67_state.m_state[7];
	T67_data.m_dw[8] = 0x00000000;
	T67_data.m_dw[9] = 0x00000000;
	T67_data.m_dw[10] = 0x00000000;
	T67_data.m_dw[11] = 0x00000000;
	T67_data.m_dw[12] = 0x00000000;
	T67_data.m_dw[13] = 0x00000000;
	T67_data.m_dw[14] = 0x00000000;
	T67_data.m_dw[15] = 0x00000000;

	T67_data.m_uc[35] = 0x80;
	T67_data.m_uc[61] = 0x01;

	// Setup T67_state
	T67_state.m_state[0] = 0x6A09E667;
	T67_state.m_state[1] = 0xBB67AE85;
	T67_state.m_state[2] = 0x3C6EF372;
	T67_state.m_state[3] = 0xA54FF53A;
	T67_state.m_state[4] = 0x510E527F;
	T67_state.m_state[5] = 0x9B05688C;
	T67_state.m_state[6] = 0x1F83D9AB;
	T67_state.m_state[7] = 0x5BE0CD19;

	// 64-deep Hash Cycle 2
	Q(T68_state, 0, T68_data, 0x428A2F98);
	Q(T69_state, 7, T69_data, 0x71374491);
	Q(T70_state, 6, T70_data, 0xB5C0FBCF);
	Q(T71_state, 5, T71_data, 0xE9B5DBA5);
	Q(T72_state, 4, T72_data, 0x3956C25B);
	Q(T73_state, 3, T73_data, 0x59F111F1);
	Q(T74_state, 2, T74_data, 0x923F82A4);
	Q(T75_state, 1, T75_data, 0xAB1C5ED5);
	Q(T76_state, 0, T76_data, 0xD807AA98);
	Q(T77_state, 7, T77_data, 0x12835B01);
	Q(T78_state, 6, T78_data, 0x243185BE);
	Q(T79_state, 5, T79_data, 0x550C7DC3);
	Q(T80_state, 4, T80_data, 0x72BE5D74);
	Q(T81_state, 3, T81_data, 0x80DEB1FE);
	Q(T82_state, 2, T82_data, 0x9BDC06A7);
	Q(T83_state, 1, T83_data, 0xC19BF174);
	R(T84_state, 0, T84_data, 0xE49B69C1);
	R(T85_state, 7, T85_data, 0xEFBE4786);
	R(T86_state, 6, T86_data, 0x0FC19DC6);
	R(T87_state, 5, T87_data, 0x240CA1CC);
	R(T88_state, 4, T88_data, 0x2DE92C6F);
	R(T89_state, 3, T89_data, 0x4A7484AA);
	R(T90_state, 2, T90_data, 0x5CB0A9DC);
	R(T91_state, 1, T91_data, 0x76F988DA);
	R(T92_state, 0, T92_data, 0x983E5152);
	R(T93_state, 7, T93_data, 0xA831C66D);
	R(T94_state, 6, T94_data, 0xB00327C8);
	R(T95_state, 5, T95_data, 0xBF597FC7);
	R(T96_state, 4, T96_data, 0xC6E00BF3);
	R(T97_state, 3, T97_data, 0xD5A79147);
	R(T98_state, 2, T98_data, 0x06CA6351);
	R(T99_state, 1, T99_data, 0x14292967);
	R(T100_state, 0, T100_data, 0x27B70A85);
	R(T101_state, 7, T101_data, 0x2E1B2138);
	R(T102_state, 6, T102_data, 0x4D2C6DFC);
	R(T103_state, 5, T103_data, 0x53380D13);
	R(T104_state, 4, T104_data, 0x650A7354);
	R(T105_state, 3, T105_data, 0x766A0ABB);
	R(T106_state, 2, T106_data, 0x81C2C92E);
	R(T107_state, 1, T107_data, 0x92722C85);
	R(T108_state, 0, T108_data, 0xA2BFE8A1);
	R(T109_state, 7, T109_data, 0xA81A664B);
	R(T110_state, 6, T110_data, 0xC24B8B70);
	R(T111_state, 5, T111_data, 0xC76C51A3);
	R(T112_state, 4, T112_data, 0xD192E819);
	R(T113_state, 3, T113_data, 0xD6990624);
	R(T114_state, 2, T114_data, 0xF40E3585);
	R(T115_state, 1, T115_data, 0x106AA070);
	R(T116_state, 0, T116_data, 0x19A4C116);
	R(T117_state, 7, T117_data, 0x1E376C08);
	R(T118_state, 6, T118_data, 0x2748774C);
	R(T119_state, 5, T119_data, 0x34B0BCB5);
	R(T120_state, 4, T120_data, 0x391C0CB3);
	R(T121_state, 3, T121_data, 0x4ED8AA4A);
	R(T122_state, 2, T122_data, 0x5B9CCA4F);
	R(T123_state, 1, T123_data, 0x682E6FF3);
	R(T124_state, 0, T124_data, 0x748F82EE);
	R(T125_state, 7, T125_data, 0x78A5636F);
	R(T126_state, 6, T126_data, 0x84C87814);
	R(T127_state, 5, T127_data, 0x8CC70208);
	R(T128_state, 4, T128_data, 0x90BEFFFA);
	R(T129_state, 3, T129_data, 0xA4506CEB);
	R(T130_state, 2, T130_data, 0xBEF9A3F7);
	R(T131_state, 1, T131_data, 0xC67178F2);

	// Add following hash cycle 2
	T132_state.m_state[0] = BcmByteSwap32(T132_state.m_state[0] + 0x6A09E667);
	T132_state.m_state[1] = BcmByteSwap32(T132_state.m_state[1] + 0xBB67AE85);
	T132_state.m_state[2] = BcmByteSwap32(T132_state.m_state[2] + 0x3C6EF372);
	T132_state.m_state[3] = BcmByteSwap32(T132_state.m_state[3] + 0xA54FF53A);
	T132_state.m_state[4] = BcmByteSwap32(T132_state.m_state[4] + 0x510E527F);
	T132_state.m_state[5] = BcmByteSwap32(T132_state.m_state[5] + 0x9B05688C);
	T132_state.m_state[6] = BcmByteSwap32(T132_state.m_state[6] + 0x1F83D9AB);
	T132_state.m_state[7] = BcmByteSwap32(T132_state.m_state[7] + 0x5BE0CD19);


	// *** End Checks ***

	// Increment Nonce
	if (T1_vld)
		S_nonce++;

	// Send MSG back if we need to!

	// Check for Result Found
	if (T133_vld && !S_nonceHitQue.full()) {
		bool bW7Eq = T133_state.m_state[7] == S_task.m_target[2];
		bool bW7Lt = T133_state.m_state[7] < S_task.m_target[2];

		bool bW6Eq = T133_state.m_state[6] == S_task.m_target[1];
		bool bW6Lt = T133_state.m_state[6] < S_task.m_target[1];

		bool bW5Eq = T133_state.m_state[5] == S_task.m_target[0];
		bool bW5Lt = T133_state.m_state[5] < S_task.m_target[0];

		bool bMatch = bW7Lt || bW7Eq && (bW6Lt || bW6Eq && (bW5Lt || bW5Eq));

		if (bMatch)
			S_nonceHitQue.push(BcmByteSwap32(T133_nonce));

		// Check for Last Nonce / Increment count
		if (S_task.m_lastNonce == T133_nonce)
			S_bTaskValid = false;
		else
			S_hashCount++;
	}

	// Check force return / reset
	if (S_forceReturn) {
		S_bTaskValid = false;
		S_forceReturn = false;
	}

	if (GR_htReset) {
		S_zeroInput = true;
		S_bTaskValid = false;
		S_forceReturn = false;
	}
}
示例#4
0
void
CPersVadd::PersVadd()
{
    if (PR_htValid) {
        switch (PR_htInst) {
        case VADD_RESET:
            if (SR_msgDelay < 500 || SendHostMsgBusy()) {
                S_msgDelay += 1;
                HtRetry();
                break;
            }
            SendHostMsg(VADD_TYPE_SIZE, (XDIM_LEN << 8) | TYPE_SIZE);
            HtTerminate();
            break;
        case VADD_ENTER:
            S_yIdx[PR_htId] = 0;
            S_yDimLen[PR_htId] = PR_yDimLen;
            S_xIdx[PR_htId] = 0;
            S_xDimLen[PR_htId] = PR_xDimLen;
            S_sum[PR_htId] = 0;

            P_addrA = SR_addrA + PR_yAddrOff;
            P_addrB = SR_addrB + PR_yAddrOff;
            P_addrC = SR_addrC + PR_yAddrOff;

            HtContinue(VADD_OPEN);

            break;
        case VADD_OPEN:

            // Open read stream A, once for each xDim to be processed
            if (PR_yOpenAIdx < PR_yDimLen && !ReadStreamBusy_A(PR_htId)) {
                ht_uint32 remLen = (ht_uint32)((PR_yDimLen - PR_yOpenAIdx) * PR_xDimLen);
                ReadStreamOpen_A(PR_htId, PR_addrA, remLen > 0x3f ? (ht_uint6)0x3f : (ht_uint6)remLen, P_yOpenAIdx);

                P_addrA+= PR_xDimLen * TYPE_SIZE;
                P_yOpenAIdx += 1;
            }

            // Open read stream B, once for each xDim to be processed
            if (PR_yOpenBIdx < PR_yDimLen && !ReadStreamBusy_B(PR_htId)) {
                ReadStreamOpen_B(PR_htId, PR_addrB, PR_xDimLen);

                P_addrB += PR_xDimLen * TYPE_SIZE;
                P_yOpenBIdx += 1;
            }

            // Open write stream, once for each xDim to be processed
            if (PR_yOpenCIdx < SR_yDimLen[PR_htId] && !WriteStreamBusy_C(PR_htId)) {
#if VADD_STRM_RSP_GRP_HTID == 0 && VADD_HTID_W == 0 && VADD_RSP_GRP_W > 0
                WriteStreamOpen_C(PR_htId, 1u, PR_addrC);
#elif VADD_STRM_RSP_GRP_HTID || VADD_HTID_W == 0
                WriteStreamOpen_C(PR_htId, PR_addrC);
#else
                WriteStreamOpen_C(PR_htId, PR_htId ^ 1, PR_addrC);
#endif
                P_addrC += PR_xDimLen * TYPE_SIZE;
                P_yOpenCIdx += 1;
            }

            if (PR_yOpenAIdx == PR_yDimLen && PR_yOpenBIdx == PR_yDimLen && PR_yOpenCIdx == PR_yDimLen)
#if VADD_STRM_RSP_GRP_HTID == 0 && VADD_HTID_W == 0 && VADD_RSP_GRP_W > 0
                WriteStreamPause_C(1, VADD_RETURN);
#elif VADD_STRM_RSP_GRP_HTID || VADD_HTID_W == 0
                WriteStreamPause_C(VADD_RETURN);
#else
                WriteStreamPause_C(PR_htId ^ 1, VADD_RETURN);
#endif
            else
                HtContinue(VADD_OPEN);

            break;
        case VADD_RETURN: {
            BUSY_RETRY(SendReturnBusy_htmain());

            SendReturn_htmain(S_sum[PR_htId]);
        }
        break;
        default:
            assert(0);
        }
    }
示例#5
0
void
CPersStream::PersStream()
{
	if (PR_htValid) {
		switch (PR_htInst) {

		// Main entry point from Main.cpp
		// P_rcvAu, P_rcvCnt are populated through call.
		case STRM_IDLE:
		{
			if (SendReturnBusy_htmain()) {
				HtRetry();
				break;
			}

#ifndef _HTV
			printf("SysC:  AU %2d - Processing\n", P_rcvAu);
#endif

			if (P_rcvCnt) {
				HtContinue(STRM_RECV);
			} else {
				// There are no calls to receive...simply return
				SendReturn_htmain(0);
			}
		}
		break;

		case STRM_RECV:
		{
			if (RecvHostDataBusy()) {
				HtRetry();
				break;
			}

			// Store received data into pricate variable recvData
			P_recvData = RecvHostData();

			HtContinue(STRM_SEND);
		}
		break;

		case STRM_SEND:
		{
			if (SendHostDataBusy() || SendReturnBusy_htmain()) {
				HtRetry();
				break;
			}

			// Generate an expected value to compare against received data
			uint64_t expectedData = 0LL;
			expectedData |= (uint64_t)((uint64_t)P_rcvAu << 48);
			expectedData |= (uint64_t)(P_wordCnt + 1);

			if (expectedData != P_recvData) {
#ifndef _HTV
			  printf("SysC:  WARNING - Expected Data did not match Received data!\n");
			  printf("         0x%016llx != 0x%016llx\n",
				 (unsigned long long)expectedData, (unsigned long long)P_recvData);
#endif
				P_errs += 1;
			}
			HtAssert(!P_errs, 0);

			// Send generated data back to the host
			// More error checking will be done there
			SendHostData(expectedData);

			P_wordCnt += 1;

			// Check count so far..
			// Either return to Main.cpp or continue reading in values
			if (P_wordCnt == P_rcvCnt) {
				SendReturn_htmain(P_errs);
			} else {
				HtContinue(STRM_RECV);
			}
		}
		break;
		default:
			assert(0);
		}
	}
}
示例#6
0
void CPersCtl::PersCtl()
{
	if (PR_htValid) {
		switch (PR_htInst) {
		case CTL_INIT:
		{
			HtContinue(CTL_A);
		}
		break;
		case CTL_A:
		{
			if (SendCallBusy_modA()) {
				HtRetry();
				break;
			}

			SendCall_modA(CTL_B);
		}
		break;
		case CTL_B:
		{
			if (SendCallBusy_modB()) {
				HtRetry();
				break;
			}

			SendCall_modB(CTL_C);
		}
		break;
		case CTL_C:
		{
			if (SendCallBusy_modC()) {
				HtRetry();
				break;
			}

			SendCall_modC(CTL_D);
		}
		break;
		case CTL_D:
		{
			if (SendCallBusy_modD()) {
				HtRetry();
				break;
			}

			SendCall_modD(CTL_E);
		}
		break;
		case CTL_E:
		{
			if (SendCallBusy_modE()) {
				HtRetry();
				break;
			}

			SendCall_modE(CTL_SEND_MSG);
		}
		break;
		case CTL_SEND_MSG:
		{
			if (SendMsgBusy_CtlToA(2)) {
				HtRetry();
				break;
			}

			S_msgRcvd = false;

			// Send messages to modA
			SendMsg_CtlToA(2, 0);

			HtContinue(CTL_RTN);
		}
		break;
		case CTL_RTN:
		{
			if (SendReturnBusy_htmain()) {
				HtRetry();
				break;
			}

			if (!S_msgRcvd) {
				HtRetry();
				break;
			}

			// Return to host interface
			SendReturn_htmain(P_elemCnt);
		}
		break;
		default:
			assert(0);
		}
	}

	if (!GR_htReset && !RecvMsgBusy_EtoCtl()) {
		ht_uint4 msg = RecvMsg_EtoCtl();
		HtAssert(msg == 0, msg);
		S_msgRcvd = msg == 0;
	}
}
示例#7
0
void CPersTest00::PersTest00() {
	if (PR1_htValid) {
		switch (PR1_htInst) {
		case TEST00_ENTRY: {
			HtContinue(TEST00_WR);
			break;
		}
		case TEST00_WR: {
			HtContinue(TEST00_ST0);
			break;
		}
		case TEST00_ST0: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_test00_0_src_u0_data(PR1_memAddr + 0, 6, 0, 1);
			WriteMemPause(TEST00_LD0);
			break;
		}
		case TEST00_LD0: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_0_src_u0_data(PR1_memAddr + 0, 0, 0, 1);
			ReadMemPause(TEST00_CHK);
			break;
		}
		case TEST00_CHK: {
			if ((ht_uint8)PR1_test00_0_src_u0_data[0].test00_0_src_v0_data[0] != ((ht_uint8)0x0000000000000060LL)) {
				HtAssert(0, 0);
			}
			if ((ht_int64)PR1_test00_0_src_u0_data[0].test00_0_src_v1_data != ((ht_int64)0x0015d74eb55d5960LL)) {
				printf("EXP - v1 = 0x%016lx\n", (int64_t)0x0015d74eb55d5960LL);
				printf("ACT - v1 = 0x%016lx\n", (int64_t)PR1_test00_0_src_u0_data[0].test00_0_src_v1_data);
				HtAssert(0, 0);
			}
			HtContinue(TEST00_RTN);
			break;
		}
		case TEST00_RTN: {
			if (SendReturnBusy_test00()) {
				HtRetry();
				break;
			}
			SendReturn_test00();
			break;
		}
		default:
			assert(0);
		}
	}
	if (PR5_htValid) {
		switch (PR5_htInst) {
		case TEST00_ENTRY: {
			break;
		}
		case TEST00_WR: {
			PW5_test00_0_src_u0_data[0].write_addr(6);
			PW5_test00_0_src_u0_data[0].test00_0_src_v1_data = ((int64_t)0x0015d74eb55d5960LL);
			break;
		}
		case TEST00_ST0: {
			break;
		}
		case TEST00_LD0: {
			P5_test00_0_src_u0_data_RdAddr1 = (ht_uint3)0;
			break;
		}
		case TEST00_CHK: {
			break;
		}
		case TEST00_RTN: {
			break;
		}
		default:
			assert(0);
		}
	}
}
示例#8
0
void CPersProcess::PersProcess() {
	if (PR_htValid) {
		switch (PR_htInst) {

		// Main Entry Point from PersCtl_src.cpp -> PROCESS_ENTRY
		// Calculate the number of multiplies we need to do and store in P_calcLen
		// Dispatch threads to do a muliply operation for that index
		// Continue spawning multiply threads until P_calcIdx == P_calcLen, at which point
		//   wait for all threads to return before continuing to PROCESS_STORE
		case PROCESS_ENTRY: {
			if (SendCallBusy_mult()) {
				HtRetry();
				break;
			}

			P_calcLen = ((P_rcvIdx+1) < SR_numTaps) ? (P_rcvIdx+1) : SR_numTaps;

			if (P_calcIdx < P_calcLen) {
				SendCallFork_mult(PROCESS_JOIN, P_rcvIdx, P_calcIdx);
				HtContinue(PROCESS_ENTRY);
				P_calcIdx += 1;
			} else {
				RecvReturnPause_mult(PROCESS_STORE);
			}
		}
		break;

		// Join spawned Mult threads
		// Sum Returned data from P_result into P_sum to later be stored to memory
		// Accumulate errors from the returning thread
		case PROCESS_JOIN: {
			P_sum += P_result;
			P_errs += P_errRcv;
			RecvReturnJoin_mult();
		}
		break;

		// Store P_sum into memory as an output of the FIR Filter
		// This is one element (index) in the entire output
		// Issue Write Request and wait until complete, then continue to PROCESS_RTN
		case PROCESS_STORE: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}

			MemAddr_t memWrAddr = (ht_uint48)(SR_outAddrBase + (P_rcvIdx << 3));
			WriteMem(memWrAddr, P_sum);
			WriteMemPause(PROCESS_RTN);
		}
		break;

		// Done with work for this Index
		// Return to CTL to echo the Index to the Host and accumulate errors
		case PROCESS_RTN: {
			if (SendReturnBusy_process()) {
				HtRetry();
				break;
			}

			SendReturn_process(P_rcvIdx, P_errs);
		}
		break;

		default:
			assert(0);

		}
	}
}
示例#9
0
void CPersGv1::PersGv1()
{
	if (PR_htValid) {
		switch (PR_htInst) {
		case GV1_ENTRY:
		{
			P_x = PR_htId;
			P_gvAddr = PR_htId;
			P_gvAddr2 = 0u;
			P_gvAddr3 = 0u;

			// D_1x
			GW_gv_D_1x_1F_m0.write_addr(PR_htId);
			GW_gv_D_1x_1F_m0.m_x = P_x;

			GW_gv_D_1x_1F_m1.write_addr(PR_htId);
			GW_gv_D_1x_1F_m1.m_x = P_x;

			GW_gv_D_1x_2F_m0.write_addr(PR_htId);
			GW_gv_D_1x_2F_m0.m_x[0] = P_x;

			GW_gv_D_1x_2F_m1.write_addr(PR_htId);
			GW_gv_D_1x_2F_m1.m_x[0] = P_x;

			GW_gv_D_1x_1F_AI_m0.write_addr(PR_htId);
			GW_gv_D_1x_1F_AI_m0.m_x = P_x;

			GW_gv_D_1x_1F_AI_m1.write_addr(PR_htId);
			GW_gv_D_1x_1F_AI_m1.m_x = P_x;

			GW_gv_D_1x_2F_AI_m0.write_addr(PR_htId);
			GW_gv_D_1x_2F_AI_m0.m_x[0] = P_x;

			GW_gv_D_1x_2F_AI_m1.write_addr(PR_htId);
			GW_gv_D_1x_2F_AI_m1.m_x[0] = P_x;

			GW_gv_D_1x_1F_AA_m0.write_addr(PR_htId);
			GW_gv_D_1x_1F_AA_m0.m_x = P_x;

			GW_gv_D_1x_1F_AA_m1.write_addr(PR_htId);
			GW_gv_D_1x_1F_AA_m1.m_x = P_x;

			GW_gv_D_1x_4F_AA_m0.write_addr(PR_htId);
			GW_gv_D_1x_4F_AA_m0.m_x[0] = P_x;

			GW_gv_D_1x_4F_AA_m1.write_addr(PR_htId);
			GW_gv_D_1x_4F_AA_m1.m_x[0] = P_x;

			// D_1x1x
			GW_gv_D_1x1x_1F_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x_1F_m0.m_x = P_x;

			GW_gv_D_1x1x_1F_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x_1F_m1.m_x = P_x;

			GW_gv_D_1x1x_2F_m0.write_addr(PR_htId);
			GW_gv_D_1x1x_2F_m0.m_x[0] = P_x;

			GW_gv_D_1x1x_2F_m1.write_addr(PR_htId);
			GW_gv_D_1x1x_2F_m1.m_x[0] = P_x;

			GW_gv_D_1x1x_1F_AI_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x_1F_AI_m0.m_x = P_x;

			GW_gv_D_1x1x_1F_AI_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x_1F_AI_m1.m_x = P_x;

			GW_gv_D_1x1x_2F_AI_m0.write_addr(PR_htId);
			GW_gv_D_1x1x_2F_AI_m0.m_x[0] = P_x;

			GW_gv_D_1x1x_2F_AI_m1.write_addr(PR_htId);
			GW_gv_D_1x1x_2F_AI_m1.m_x[0] = P_x;

			GW_gv_D_1x1x_1F_AA_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x_1F_AA_m0.m_x = P_x;

			GW_gv_D_1x1x_1F_AA_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x_1F_AA_m1.m_x = P_x;

			GW_gv_D_1x1x_4F_AA_m0.write_addr(PR_htId);
			GW_gv_D_1x1x_4F_AA_m0.m_x[0] = P_x;

			GW_gv_D_1x1x_4F_AA_m1.write_addr(PR_htId);
			GW_gv_D_1x1x_4F_AA_m1.m_x[0] = P_x;

			// D_1x1x1x
			GW_gv_D_1x1x1x_1F_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x1x_1F_m0.m_x = P_x;

			GW_gv_D_1x1x1x_1F_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x1x_1F_m1.m_x = P_x;

			GW_gv_D_1x1x1x_2F_m0.write_addr(PR_htId);
			GW_gv_D_1x1x1x_2F_m0.m_x[0] = P_x;

			GW_gv_D_1x1x1x_2F_m1.write_addr(PR_htId);
			GW_gv_D_1x1x1x_2F_m1.m_x[0] = P_x;

			GW_gv_D_1x1x1x_1F_AI_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x1x_1F_AI_m0.m_x = P_x;

			GW_gv_D_1x1x1x_1F_AI_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x1x_1F_AI_m1.m_x = P_x;

			GW_gv_D_1x1x1x_2F_AI_m0.write_addr(PR_htId);
			GW_gv_D_1x1x1x_2F_AI_m0.m_x[0] = P_x;

			GW_gv_D_1x1x1x_2F_AI_m1.write_addr(PR_htId);
			GW_gv_D_1x1x1x_2F_AI_m1.m_x[0] = P_x;

			GW_gv_D_1x1x1x_1F_AA_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x1x_1F_AA_m0.m_x = P_x;

			GW_gv_D_1x1x1x_1F_AA_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x1x_1F_AA_m1.m_x = P_x;

			GW_gv_D_1x1x1x_4F_AA_m0.write_addr(PR_htId);
			GW_gv_D_1x1x1x_4F_AA_m0.m_x[0] = P_x;

			GW_gv_D_1x1x1x_4F_AA_m1.write_addr(PR_htId);
			GW_gv_D_1x1x1x_4F_AA_m1.m_x[0] = P_x;

			// D_1x1x2x2x
			GW_gv_D_1x1x2x2x_1F_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x2x2x_1F_m0.m_x = P_x;

			GW_gv_D_1x1x2x2x_1F_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x2x2x_1F_m1.m_x = P_x;

			GW_gv_D_1x1x2x2x_2F_m0.write_addr(PR_htId);
			GW_gv_D_1x1x2x2x_2F_m0.m_x[0] = P_x;

			GW_gv_D_1x1x2x2x_2F_m1.write_addr(PR_htId);
			GW_gv_D_1x1x2x2x_2F_m1.m_x[0] = P_x;

			GW_gv_D_1x1x2x2x_1F_AI_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x2x2x_1F_AI_m0.m_x = P_x;

			GW_gv_D_1x1x2x2x_1F_AI_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x2x2x_1F_AI_m1.m_x = P_x;

			GW_gv_D_1x1x2x2x_2F_AI_m0.write_addr(PR_htId);
			GW_gv_D_1x1x2x2x_2F_AI_m0.m_x[0] = P_x;

			GW_gv_D_1x1x2x2x_2F_AI_m1.write_addr(PR_htId);
			GW_gv_D_1x1x2x2x_2F_AI_m1.m_x[0] = P_x;

			GW_gv_D_1x1x2x2x_1F_AA_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x2x2x_1F_AA_m0.m_x = P_x;

			GW_gv_D_1x1x2x2x_1F_AA_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x2x2x_1F_AA_m1.m_x = P_x;

			GW_gv_D_1x1x2x2x_4F_AA_m0.write_addr(PR_htId);
			GW_gv_D_1x1x2x2x_4F_AA_m0.m_x[0] = P_x;

			GW_gv_D_1x1x2x2x_4F_AA_m1.write_addr(PR_htId);
			GW_gv_D_1x1x2x2x_4F_AA_m1.m_x[0] = P_x;

			P_loopCnt = 0;
			HtContinue(GV1_LOOP);
		}
			break;
		case GV1_LOOP:
		{
			// D_1x
			if (GR_gv_D_1x_1F_m0.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x_1F_m1.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x_2F_m0.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x_2F_m1.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x_1F_AI_m0.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x_1F_AI_m1.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x_2F_AI_m0.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x_2F_AI_m1.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x_1F_AA_m0.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x_1F_AA_m1.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x_4F_AA_m0.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x_4F_AA_m1.m_x[0] != PR_x) HtAssert(0, 0);

			// D_1x1x
			if (GR_gv_D_1x1x_1F_m0.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x_1F_m1.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x_2F_m0.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x_2F_m1.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x_1F_AI_m0.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x_1F_AI_m1.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x_2F_AI_m0.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x_2F_AI_m1.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x_1F_AA_m0.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x_1F_AA_m1.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x_4F_AA_m0.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x_4F_AA_m1.m_x[0] != PR_x) HtAssert(0, 0);

			// D_1x1x1x
			if (GR_gv_D_1x1x1x_1F_m0.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x1x_1F_m1.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x1x_2F_m0.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x1x_2F_m1.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x1x_1F_AI_m0.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x1x_1F_AI_m1.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x1x_2F_AI_m0.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x1x_2F_AI_m1.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x1x_1F_AA_m0.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x1x_1F_AA_m1.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x1x_4F_AA_m0.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x1x_4F_AA_m1.m_x[0] != PR_x) HtAssert(0, 0);

			// D_1x1x2x2x
			if (GR_gv_D_1x1x2x2x_1F_m0.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x2x2x_1F_m1.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x2x2x_2F_m0.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x2x2x_2F_m1.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x2x2x_1F_AI_m0.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x2x2x_1F_AI_m1.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x2x2x_2F_AI_m0.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x2x2x_2F_AI_m1.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x2x2x_1F_AA_m0.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x2x2x_1F_AA_m1.m_x != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x2x2x_4F_AA_m0.m_x[0] != PR_x) HtAssert(0, 0);
			if (GR_gv_D_1x1x2x2x_4F_AA_m1.m_x[0] != PR_x) HtAssert(0, 0);

			P_x += 1;

			// D_1x
			GW_gv_D_1x_1F_m0.write_addr(PR_htId);
			GW_gv_D_1x_1F_m0.m_x = P_x;

			GW_gv_D_1x_1F_m1.write_addr(PR_htId);
			GW_gv_D_1x_1F_m1.m_x = P_x;

			GW_gv_D_1x_2F_m0.write_addr(PR_htId);
			GW_gv_D_1x_2F_m0.m_x[0] = P_x;

			GW_gv_D_1x_2F_m1.write_addr(PR_htId);
			GW_gv_D_1x_2F_m1.m_x[0] = P_x;

			GW_gv_D_1x_1F_AI_m0.write_addr(PR_htId);
			GW_gv_D_1x_1F_AI_m0.m_x.AtomicInc();

			GW_gv_D_1x_1F_AI_m1.write_addr(PR_htId);
			GW_gv_D_1x_1F_AI_m1.m_x.AtomicInc();

			GW_gv_D_1x_2F_AI_m0.write_addr(PR_htId);
			GW_gv_D_1x_2F_AI_m0.m_x[0].AtomicInc();

			GW_gv_D_1x_2F_AI_m1.write_addr(PR_htId);
			GW_gv_D_1x_2F_AI_m1.m_x[0].AtomicInc();

			GW_gv_D_1x_1F_AA_m0.write_addr(PR_htId);
			GW_gv_D_1x_1F_AA_m0.m_x.AtomicAdd(1u);

			GW_gv_D_1x_1F_AA_m1.write_addr(PR_htId);
			GW_gv_D_1x_1F_AA_m1.m_x = P_x;

			GW_gv_D_1x_4F_AA_m0.write_addr(PR_htId);
			GW_gv_D_1x_4F_AA_m0.m_x[0].AtomicAdd(1u);

			GW_gv_D_1x_4F_AA_m1.write_addr(PR_htId);
			GW_gv_D_1x_4F_AA_m1.m_x[0] = P_x;

			// D_1x1x
			GW_gv_D_1x1x_1F_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x_1F_m0.m_x = P_x;

			GW_gv_D_1x1x_1F_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x_1F_m1.m_x = P_x;

			GW_gv_D_1x1x_2F_m0.write_addr(PR_htId);
			GW_gv_D_1x1x_2F_m0.m_x[0] = P_x;

			GW_gv_D_1x1x_2F_m1.write_addr(PR_htId);
			GW_gv_D_1x1x_2F_m1.m_x[0] = P_x;

			GW_gv_D_1x1x_1F_AI_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x_1F_AI_m0.m_x.AtomicInc();

			GW_gv_D_1x1x_1F_AI_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x_1F_AI_m1.m_x.AtomicInc();

			GW_gv_D_1x1x_2F_AI_m0.write_addr(PR_htId);
			GW_gv_D_1x1x_2F_AI_m0.m_x[0].AtomicInc();

			GW_gv_D_1x1x_2F_AI_m1.write_addr(PR_htId);
			GW_gv_D_1x1x_2F_AI_m1.m_x[0].AtomicInc();

			GW_gv_D_1x1x_1F_AA_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x_1F_AA_m0.m_x.AtomicAdd(1u);

			GW_gv_D_1x1x_1F_AA_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x_1F_AA_m1.m_x = P_x;

			GW_gv_D_1x1x_4F_AA_m0.write_addr(PR_htId);
			GW_gv_D_1x1x_4F_AA_m0.m_x[0].AtomicAdd(1u);

			GW_gv_D_1x1x_4F_AA_m1.write_addr(PR_htId);
			GW_gv_D_1x1x_4F_AA_m1.m_x[0] = P_x;

			// D_1x1x1x
			GW_gv_D_1x1x1x_1F_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x1x_1F_m0.m_x = P_x;

			GW_gv_D_1x1x1x_1F_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x1x_1F_m1.m_x = P_x;

			GW_gv_D_1x1x1x_2F_m0.write_addr(PR_htId);
			GW_gv_D_1x1x1x_2F_m0.m_x[0] = P_x;

			GW_gv_D_1x1x1x_2F_m1.write_addr(PR_htId);
			GW_gv_D_1x1x1x_2F_m1.m_x[0] = P_x;

			GW_gv_D_1x1x1x_1F_AI_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x1x_1F_AI_m0.m_x.AtomicInc();

			GW_gv_D_1x1x1x_1F_AI_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x1x_1F_AI_m1.m_x.AtomicInc();

			GW_gv_D_1x1x1x_2F_AI_m0.write_addr(PR_htId);
			GW_gv_D_1x1x1x_2F_AI_m0.m_x[0].AtomicInc();

			GW_gv_D_1x1x1x_2F_AI_m1.write_addr(PR_htId);
			GW_gv_D_1x1x1x_2F_AI_m1.m_x[0].AtomicInc();

			GW_gv_D_1x1x1x_1F_AA_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x1x_1F_AA_m0.m_x.AtomicAdd(1u);

			GW_gv_D_1x1x1x_1F_AA_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x1x_1F_AA_m1.m_x = P_x;

			GW_gv_D_1x1x1x_4F_AA_m0.write_addr(PR_htId);
			GW_gv_D_1x1x1x_4F_AA_m0.m_x[0].AtomicAdd(1u);

			GW_gv_D_1x1x1x_4F_AA_m1.write_addr(PR_htId);
			GW_gv_D_1x1x1x_4F_AA_m1.m_x[0] = P_x;

			// D_1x1x2x2x
			GW_gv_D_1x1x2x2x_1F_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x2x2x_1F_m0.m_x = P_x;

			GW_gv_D_1x1x2x2x_1F_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x2x2x_1F_m1.m_x = P_x;

			GW_gv_D_1x1x2x2x_2F_m0.write_addr(PR_htId);
			GW_gv_D_1x1x2x2x_2F_m0.m_x[0] = P_x;

			GW_gv_D_1x1x2x2x_2F_m1.write_addr(PR_htId);
			GW_gv_D_1x1x2x2x_2F_m1.m_x[0] = P_x;

			GW_gv_D_1x1x2x2x_1F_AI_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x2x2x_1F_AI_m0.m_x.AtomicInc();

			GW_gv_D_1x1x2x2x_1F_AI_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x2x2x_1F_AI_m1.m_x.AtomicInc();

			GW_gv_D_1x1x2x2x_2F_AI_m0.write_addr(PR_htId);
			GW_gv_D_1x1x2x2x_2F_AI_m0.m_x[0].AtomicInc();

			GW_gv_D_1x1x2x2x_2F_AI_m1.write_addr(PR_htId);
			GW_gv_D_1x1x2x2x_2F_AI_m1.m_x[0].AtomicInc();

			GW_gv_D_1x1x2x2x_1F_AA_m0.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x2x2x_1F_AA_m0.m_x.AtomicAdd(1u);

			GW_gv_D_1x1x2x2x_1F_AA_m1.write_addr(PR_htId, 0u);
			GW_gv_D_1x1x2x2x_1F_AA_m1.m_x = P_x;

			GW_gv_D_1x1x2x2x_4F_AA_m0.write_addr(PR_htId);
			GW_gv_D_1x1x2x2x_4F_AA_m0.m_x[0].AtomicAdd(1u);

			GW_gv_D_1x1x2x2x_4F_AA_m1.write_addr(PR_htId);
			GW_gv_D_1x1x2x2x_4F_AA_m1.m_x[0] = P_x;

			HtContinue(P_loopCnt++ < 100 ? GV1_LOOP : GV1_RETURN);
		}
			break;
		case GV1_RETURN:
		{
			if (SendReturnBusy_gv1()) {
				HtRetry();
				break;
			}

			SendReturn_gv1();
		}
			break;
		default:
			assert(0);
		}
	}
}
示例#10
0
void
CPersInc::PersInc()
{
    if (PR_htValid) {
        switch (PR_htInst) {
        case INC_INIT:
        {
            P_loopCnt = 0;
            P_reqCnt = 0;

            // Set address for reading memory response data
            P_arrayMemRdPtr = PR_htId;

            HtContinue(INC_READ);
        }
        break;
        case INC_READ:
        {
            if (ReadMemBusy() || SendReturnBusy_htmain()) {
                HtRetry();
                break;
            }

            // Check if end of loop
            if (P_loopCnt == P_elemCnt) {
                // Return to host interface
                SendReturn_htmain(P_loopCnt);
            } else {
                // Calculate memory read address
                sc_uint<MEM_ADDR_W> memRdAddr = (sc_uint<MEM_ADDR_W>)(SR_arrayAddr + (((P_loopCnt + P_reqCnt) * 2) << 3));

                sc_uint<2> rdDstId = P_reqCnt;
                bool bLast = P_reqCnt == 3;

                // Issue read request to memory
                switch (rdDstId) {
                case 0:
                    ReadMem_arrayMem1Fld1(memRdAddr, PR_htId);
                    break;
                case 1:
                    ReadMem_arrayMem1Fld2(memRdAddr, PR_htId);
                    break;
                case 2:
                    ReadMem_arrayMem2Fld1(memRdAddr, PR_htId);
                    break;
                case 3:
                    ReadMem_arrayMem2Fld2(memRdAddr, PR_htId);
                    break;
                }

                if (bLast) {
                    P_reqCnt = 0;
                    ReadMemPause(INC_WRITE);
                } else {
                    P_reqCnt += 1;
                    HtContinue(INC_READ);
                }
            }
        }
        break;
        case INC_WRITE:
        {
            if (WriteMemBusy()) {
                HtRetry();
                break;
            }

            // Increment memory data
            uint64_t memWrData = 0;
            sc_uint<2> rdDstId = P_reqCnt;
            switch (rdDstId) {
            case 0:
                memWrData = GR_arrayMem1.fld1 + 1;
                break;
            case 1:
                memWrData = GR_arrayMem1.fld2 + 1;
                break;
            case 2:
                memWrData = GR_arrayMem2.fld1 + 1;
                break;
            case 3:
                memWrData = GR_arrayMem2.fld2 + 1;
                break;
            }

            // Calculate memory write address
            sc_uint<MEM_ADDR_W> memWrAddr = (sc_uint<MEM_ADDR_W>)(SR_arrayAddr + (((P_loopCnt + P_reqCnt) * 2 + 1) << 3));

            bool bLast = P_reqCnt == 3;

            // Issue write memory request
            WriteMem(memWrAddr, memWrData);

            if (bLast) {
                // Increment loop count
                P_loopCnt = P_loopCnt + 4;
                P_reqCnt = 0;

                WriteMemPause(INC_READ);
            } else {
                P_reqCnt += 1;
                HtContinue(INC_WRITE);
            }
        }
        break;
        default:
            assert(0);
        }
    }
}
示例#11
0
void CPersTest00::PersTest00() {
	if (PR1_htValid) {
		switch (PR1_htInst) {
		case TEST00_ENTRY: {
			HtContinue(TEST00_WR0);
			break;
		}
		case TEST00_WR0: {
			GW1_test00_0_dst_s0_data[0][0].write_addr(14, 13);
			GW1_test00_0_dst_s0_data[0][0].test00_0_dst_v0_data[0][0] = ((uint8_t)0x001af188b6cf7780LL);
			GW1_test00_0_dst_s0_data[0][0].test00_0_dst_v0_data[1][0] = ((uint8_t)0x001af188b6cf7780LL);
			GW1_test00_0_dst_s0_data[0][0].test00_0_dst_v0_data[2][0] = ((uint8_t)0x001af188b6cf7780LL);
			GW1_test00_0_dst_s0_data[0][0].test00_0_dst_v1_data = ((uint32_t)0x001de80faced6660LL);
			GW1_test00_0_dst_s0_data[0][0].test00_0_dst_v2_data = ((int64_t)0x0002809850655dc0LL);
			HtContinue(TEST00_ST0);
			break;
		}
		case TEST00_ST0: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_test00_0_dst_s0_data(PR1_memAddr + 0, 0, 0, 1);
			WriteMemPause(TEST00_LD0);
			break;
		}
		case TEST00_LD0: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_0_dst_s0_data(PR1_memAddr + 0, 6, 5, 0, 1);
			ReadMemPause(TEST00_CHK0);
			break;
		}
		case TEST00_CHK0: {
			if (GR1_test00_0_dst_s0_data[0][0].test00_0_dst_v0_data[0][0] != ((uint8_t)0x001af188b6cf7780LL)) {
				HtAssert(0, 0);
			}
			if (GR1_test00_0_dst_s0_data[0][0].test00_0_dst_v0_data[1][0] != ((uint8_t)0x001af188b6cf7780LL)) {
				HtAssert(0, 0);
			}
			if (GR1_test00_0_dst_s0_data[0][0].test00_0_dst_v0_data[2][0] != ((uint8_t)0x001af188b6cf7780LL)) {
				HtAssert(0, 0);
			}
			if (GR1_test00_0_dst_s0_data[0][0].test00_0_dst_v1_data != ((uint32_t)0x001de80faced6660LL)) {
				HtAssert(0, 0);
			}
			if (GR1_test00_0_dst_s0_data[0][0].test00_0_dst_v2_data != ((int64_t)0x0002809850655dc0LL)) {
				HtAssert(0, 0);
			}
			HtContinue(TEST00_RTN);
			break;
		}
		case TEST00_RTN: {
			if (SendReturnBusy_test00()) {
				HtRetry();
				break;
			}
			SendReturn_test00();
			break;
		}
		default:
			assert(0);
		}
	}
	if (PR2_htValid) {
		switch (PR2_htInst) {
		case TEST00_ENTRY: {
			break;
		}
		case TEST00_WR0: {
			break;
		}
		case TEST00_ST0: {
			break;
		}
		case TEST00_LD0: {
			P2_test00_0_dst_s0_data_RdAddr1 = (ht_uint4)6;
			P2_test00_0_dst_s0_data_RdAddr2 = (ht_uint5)5;
			break;
		}
		case TEST00_CHK0: {
			break;
		}
		case TEST00_RTN: {
			break;
		}
		default:
			assert(0);
		}
	}
}
示例#12
0
void CPersWr4::PersWr4()
{
	if (PR_htValid) {
		switch (PR_htInst) {
		case WR4_INIT:
		{
			P_loopCnt = 0;
			P_err = 0;
			P_pauseLoopCnt = 0;

			HtContinue(WR4_WRITE1b);
		}
		break;
		case WR4_WRITE1a:
		case WR4_WRITE1b:
		{
			if (PR_htInst != (PR_pauseDst ? WR4_WRITE1a : WR4_WRITE1b)) {
				HtAssert(0, 0);
				P_err += 1;
			}
			P_pauseDst ^= 1;

			if (WriteMemBusy() || SendReturnBusy_wr4()) {
				HtRetry();
				break;
			}

			// Check if end of loop
			if (P_loopCnt == PAUSE_LOOP_CNT || P_err) {
				// Return to host interface
				SendReturn_wr4(P_err);
			} else {
				// Calculate memory read address
				MemAddr_t memRdAddr = P_arrayAddr + ((P_loopCnt & 0xf) << 3);

				// Issue read request to memory
				WriteMem(memRdAddr, (P_loopCnt & 0xf));

				// Set address for reading memory response data

				HtContinue(WR4_WRITE2);
			}
		}
		break;
		case WR4_WRITE2:
		{
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}

			// Calculate memory read address
			MemAddr_t memRdAddr = P_arrayAddr + (((P_loopCnt + 1) & 0xf) << 3);

			// Issue read request to memory
			WriteMem(memRdAddr, ((P_loopCnt + 1) & 0xf));

			HtContinue(WR4_WRITE3);
		}
		break;
		case WR4_WRITE3:
		{
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}

			// Calculate memory read address
			MemAddr_t memRdAddr = P_arrayAddr + (((P_loopCnt + 2) & 0xf) << 3);

			// Issue read request to memory
			WriteMem(memRdAddr, ((P_loopCnt + 2) & 0xf));

			HtContinue(WR4_WRITE4);
		}
		break;
		case WR4_WRITE4:
		{
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}

			// Calculate memory read address
			MemAddr_t memRdAddr = P_arrayAddr + (((P_loopCnt + 3) & 0xf) << 3);

			// Issue read request to memory
			WriteMem(memRdAddr, ((P_loopCnt + 3) & 0xf));

			HtContinue(WR4_LOOP);
		}
		break;
		case WR4_LOOP:
		{
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}

			// wait a few instructions for last response to line up with call to ReadMemPause
			if (P_pauseLoopCnt == 0) {
				P_pauseLoopCnt = 0;
				P_loopCnt += 1;

				if (PR_pauseDst)
					WriteMemPause(WR4_WRITE1a);
				else
					WriteMemPause(WR4_WRITE1b);
			} else {
				P_pauseLoopCnt += 1;
				HtContinue(WR4_LOOP);
			}
		}
		break;
		default:
			assert(0);
		}
	}

#ifndef _HTV
	if (r_m1_wrRspRdy) {
#if (WR4_HTID_W == 0)
		if (!r_wrGrpRsmWait)
			printf("-");
		else if (r_wrGrpRspCnt == 1)
			printf("1");
		else
			printf("+");
#else
#if (WR4_HTID_W < 2)
		if (!r_wrGrpRsmWait[INT(r_m1_wrRspTid & ((1 << WR2_WR_GRP_ID_W) - 1))])
			printf("-");
		else if (r_wrGrpRspCnt[INT(r_m1_wrRspTid & ((1 << WR2_WR_GRP_ID_W) - 1))] == 1)
			printf("4");
		else
			printf("+");
#else
		{
			m_wrGrpReqState1.read_addr(r_m1_wrGrpId);
			m_wrGrpRspState0.read_addr(r_m1_wrGrpId);
			CWrGrpRspState c_m1_wrGrpRspState = m_wrGrpRspState0.read_mem();
			CWrGrpReqState c_m1_wrGrpReqState = m_wrGrpReqState1.read_mem();

			if (c_m1_wrGrpReqState.m_pause != c_m1_wrGrpRspState.m_pause)
				printf("-");
			else if (c_m1_wrGrpReqState.m_cnt - c_m1_wrGrpRspState.m_cnt == 1)
				printf("4");
			else
				printf("+");
		}
#endif
#endif
	}
#endif
}
示例#13
0
void CPersRd::PersRd() {
	if (PR_htValid) {
		switch (PR_htInst) {
		case RD_ENTRY: {
			P_bStandalonePause = false;
			P_reqIdx = 0;
			P_loopIdx = 0;
			P_memOffset = PR_threadId;

			HtBarrier(RD_REQ, 8);
			break;
		}
		case RD_REQ: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}

			ht_uint5 elemCnt = ((PR_threadId + PR_reqIdx) & 7) + 1;
			if (PR_memOffset + elemCnt + PR_threadId >= 256)
				P_memOffset = PR_threadId;

			ht_uint8 info = PR_threadId + P_memOffset;
			ht_uint48 addr = PR_memAddr + P_memOffset * 8;

			ReadMem_rdFunc(addr, info, elemCnt);

			P_memOffset += elemCnt;

			if (PR_reqIdx == 7) {
				if (PR_bStandalonePause) {
					HtContinue(RD_PAUSE);
				} else {
					ReadMemPause(RD_LOOP);
				}

				P_bStandalonePause ^= 1;
				P_reqIdx = 0;
			} else {
				P_reqIdx += 1;
				HtContinue(RD_REQ);
			}
			break;
		}
		case RD_PAUSE: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}

			ReadMemPause(RD_LOOP);
			break;
		}
		case RD_LOOP: {
			if (PR_loopIdx == 255) {
				HtContinue(RD_RTN);
			} else {
				HtContinue(RD_REQ);
			}

			P_loopIdx += 1;
			break;
		}
		case RD_RTN: {
			if (SendReturnBusy_rdPause()) {
				HtRetry();
				break;
			}
			SendReturn_rdPause();
			break;
		}
		default:
			assert(0);
		}
	}
}
示例#14
0
void CPersRdSub::PersRdSub()
{
	if (PR_htValid) {
		switch (PR_htInst) {
		case WS_READ:
			{
#ifndef _HTV
				entryMask |= 1 << PR_htId;
#endif
				if (
#ifndef _HTV
					entryMask != ((1ull << (1 << WS_HTID_W))-1) ||
#endif

					ReadMemBusy()) {
					HtRetry();
					break;
				}

				switch (P_rdType) {
				case 0:
					ReadMem_uint8(P_rdAddr, PR_htId);
					break;
				case 1:
					ReadMem_uint16(P_rdAddr, PR_htId);
					break;
				case 2:
					ReadMem_uint32(P_rdAddr, PR_htId);
					break;
				case 3:
					ReadMem_uint64(P_rdAddr, PR_htId);
					break;
				case 4:
					ReadMem_int8(P_rdAddr, PR_htId);
					break;
				case 5:
					ReadMem_int16(P_rdAddr, PR_htId);
					break;
				case 6:
					ReadMem_int32(P_rdAddr, PR_htId);
					break;
				case 7:
					ReadMem_int64(P_rdAddr, PR_htId);
					break;
				default:
					assert(0);
				}

				ReadMemPause(WS_RETURN);
			}
			break;
		case WS_RETURN:
			{
				if (SendReturnBusy_RdSub()) {
					HtRetry();
					break;
				}

				SendReturn_RdSub(S_actual[PR_htId], P_expected);
			}
			break;
		default:
			assert(0);
		}
	}
}
示例#15
0
void CPersTest00::PersTest00() {
	if (PR_htValid) {
		switch (PR_htInst) {
		case TEST00_ENTRY: {
			HtContinue(TEST00_WR);
			break;
		}
		case TEST00_WR: {
			PW_test00_0_src_v0_data[0].write_addr(4, 7);
			PW_test00_0_src_v0_data[0] = ((int16_t)0x000e9de7ebf4aec0LL);
			S_test00_1_dst_s0_data.write_addr(3, 3);
			S_test00_1_dst_s0_data.write_mem().test00_1_dst_u0_data.test00_1_dst_u2_data.test00_1_dst_v6_data = ((int16_t)0x000cfb2347be8920LL);
			HtContinue(TEST00_ST0);
			break;
		}
		case TEST00_ST0: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_test00_0_src_v0_data(PR_memAddr + 0, 4, 7, 0, 1);
			HtContinue(TEST00_ST1);
			break;
		}
		case TEST00_ST1: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_test00_1_dst_u2_data(PR_memAddr + 64, 3, 3, 1);
			WriteMemPause(TEST00_LD0);
			break;
		}
		case TEST00_LD0: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_0_dst_v3_data(PR_memAddr + 0, 0, 1, 1);
			HtContinue(TEST00_LD1);
			break;
		}
		case TEST00_LD1: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_1_dst_u2_data(PR_memAddr + 64, 3, 3, 1);
			ReadMemPause(TEST00_CHK);
			break;
		}
		case TEST00_CHK: {
			if ((int16_t)PR_test00_0_dst_u0_data[0].test00_0_dst_v3_data[1] != ((int16_t)0x000e9de7ebf4aec0LL)) {
				HtAssert(0, 0);
			}
			SR_test00_1_dst_s0_data.read_addr(3, 3);
			printf("EXP: 0x%04x\n", (int16_t)0x000cfb2347be8920LL);
			printf("ACT: 0x%04x\n", (int16_t)S_test00_1_dst_s0_data.read_mem().test00_1_dst_u0_data.test00_1_dst_u2_data.test00_1_dst_v6_data);
			if ((int16_t)S_test00_1_dst_s0_data.read_mem().test00_1_dst_u0_data.test00_1_dst_u2_data.test00_1_dst_v6_data != ((int16_t)0x000cfb2347be8920LL)) {
				HtAssert(0, 0);
			}
			HtContinue(TEST00_RTN);
			break;
		}
		case TEST00_RTN: {
			if (SendReturnBusy_test00()) {
				HtRetry();
				break;
			}
			SendReturn_test00();
			break;
		}
		default:
			assert(0);
		}
	}
}
示例#16
0
void
CPersInc11::PersInc11()
{
	if (PR1_htValid) {
		switch (PR1_htInst) {
		case INC11_INIT:
		{
			P1_loopIdx[0][1] = 0;

			P1_wrGrpId = PR1_htId ^ 0x5;

			// wait until all threads have started
			HtContinue(INC11_READ);
		}
		break;
		case INC11_READ:
		{
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}

			// Calculate memory read address
			MemAddr_t memRdAddr = SR_arrayAddr + ((P1_loopBase + P1_loopIdx[0][1]) << 3);

			Inc11Ptr_t arrayMemWrPtr = (PR1_htId << 7) | P1_loopIdx[0][1];

			// Issue read request to memory
			ReadMem_arrayMem11(memRdAddr, arrayMemWrPtr);

			bool bLast = P1_loopIdx[0][1] == P1_elemCnt - 1;
			if (bLast) {
				P1_loopIdx[0][1] = 0;
				ReadMemPause(INC11_WRITE);
			} else {
				P1_loopIdx[0][1] += 1;
				HtContinue(INC11_READ);
			}

			// Set address for reading memory response data
			P1_arrayMemRdPtr = (PR1_htId << 7) | P1_loopIdx[0][1];
		}
		break;
		case INC11_WRITE:
		{
			if (WriteMemBusy()) {
				//if (WriteMemBusy(wrRspGrpId)) {
				HtRetry();
				break;
			}

			// Increment memory data
			uint64_t memWrData = GR1_arrayMem11.data + 1;

			// Calculate memory write address
			MemAddr_t memWrAddr = SR_arrayAddr + ((P1_loopBase + P1_loopIdx[0][1]) << 3);

			// Issue write memory request
			WriteMem(PR1_wrGrpId, memWrAddr, memWrData);

			bool bLast = P1_loopIdx[0][1] == P1_elemCnt - 1;
			if (bLast) {
				P1_loopIdx[0][1] = 0;
				//WriteMemPause(wrRspGrpId, INC11_RTN);
				WriteMemPause(PR1_wrGrpId, INC11_RTN);
				//HtPause();
			} else {
				P1_loopIdx[0][1] += 1;
				HtContinue(INC11_WRITE);
			}

			// Set address for reading memory response data
			P1_arrayMemRdPtr = (PR1_htId << 7) | P1_loopIdx[0][1];
		}
		break;
		case INC11_RTN:
		{
			if (SendReturnBusy_inc11()) {
				HtRetry();
				break;
			}

			SendReturn_inc11(P1_elemCnt);

			break;
		}
		default:
			assert(0);
		}
	}
}
示例#17
0
void
CPersAdd::PersAdd()
{
	// Set read address of op1Mem/op2Mem/resMem variables
	// These will always be the same in every instruction for each thread
	S_op1Mem.read_addr(PR_htId);
	S_op2Mem.read_addr(PR_htId);
	S_resMem.read_addr(PR_htId);

	// Force "Inputs Valid" to default to false unless true in the ADD_PAUSE instruction
	P_i_vld = false;

	if (PR_htValid) {
		switch (PR_htInst) {
		case ADD_LD1: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}

			// Memory read request - Operand 1
			MemAddr_t memRdAddr = SR_op1Addr + (P_vecIdx << 3);
			ReadMem_op1Mem(memRdAddr, PR_htId);
			HtContinue(ADD_LD2);
		}
		break;
		case ADD_LD2: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}

			// Memory read request - Operand 2
			MemAddr_t memRdAddr = SR_op2Addr + (P_vecIdx << 3);
			ReadMem_op2Mem(memRdAddr, PR_htId);
			ReadMemPause(ADD_PAUSE);
		}
		break;
		case ADD_PAUSE: {
			// Store op1 and op2 into private variables 'a' and 'b'.
			P_a = S_op1Mem.read_mem();
			P_b = S_op2Mem.read_mem();

			// Mark inputs as valid, set htId
			P_i_htId = PR_htId;
			P_i_vld = true;

			// Pause thread and wait for primitive to calculate the result...
			// (will return to ADD_ST)
			HtPause(ADD_ST);
		}
		break;
		case ADD_ST: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}

			// Memory write request - Addition Result
			MemAddr_t memWrAddr = SR_resAddr + (P_vecIdx << 3);
			WriteMem(memWrAddr, S_resMem.read_mem());
			WriteMemPause(ADD_RTN);
		}
		break;
		case ADD_RTN: {
			if (SendReturnBusy_add()) {
				HtRetry();
				break;
			}

			// Return Result from shared ram 'resMem'
			SendReturn_add(S_resMem.read_mem());
		}
		break;
		default:
			assert(0);
		}
	}

	// Temporary variables to use as outputs to the primitive
	// (these are not saved between cycles)
	uint64_t o_res;
	ht_uint7 o_htId;
	bool o_vld;

	// use clocked primitive
	add_5stage(P_a, P_b, P_i_htId, P_i_vld, o_res, o_htId, o_vld, add_prm_state1);

	// Check for valid outputs from the primitive
	if (o_vld) {
		// Store Result into shared ram to be written to memory later
		S_resMem.write_addr(o_htId);
		S_resMem.write_mem(o_res);

		// Wake up the thread (with corresponding htId)
		HtResume(o_htId);
	}
}
示例#18
0
void CPersTest00::PersTest00() {
	if (PR_htValid) {
		switch (PR_htInst) {
		case TEST00_ENTRY: {
			HtContinue(TEST00_WR0);
			break;
		}
		case TEST00_WR0: {
			PW_test00_0_src_v0_data.write_addr(0, 7);
			PW_test00_0_src_v0_data = ((int16_t)0x0013c9d0b2ab5b60LL);
			P_test00_1_src_v0_data = ((ht_int53)0x0003070368ff74e0LL);
			HtContinue(TEST00_ST0);
			break;
		}
		case TEST00_ST0: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_test00_0_src_v0_data(PR_memAddr + 0);
			HtContinue(TEST00_ST1);
			break;
		}
		case TEST00_ST1: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_test00_1_src_v0_data(PR_memAddr + 64);
			WriteMemPause(TEST00_LD0);
			break;
		}
		case TEST00_LD0: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_0_dst_v0_data(PR_memAddr + 0);
			HtContinue(TEST00_LD1);
			break;
		}
		case TEST00_LD1: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_1_src_v0_data(PR_memAddr + 64);
			ReadMemPause(TEST00_CHK0);
			break;
		}
		case TEST00_CHK0: {
			if (SR_test00_0_dst_v0_data[1] != ((int16_t)0x0013c9d0b2ab5b60LL)) {
				HtAssert(0, 0);
			}
			if (PR_test00_1_src_v0_data != ((ht_int53)0x0003070368ff74e0LL)) {
				HtAssert(0, 0);
			}
			HtContinue(TEST00_RTN);
			break;
		}
		case TEST00_RTN: {
			if (SendReturnBusy_test00()) {
				HtRetry();
				break;
			}
			SendReturn_test00();
			break;
		}
		default:
			assert(0);
		}
	}
}
示例#19
0
void
CPersVadd::PersVadd()
{
	if (PR_htValid) {
		switch (PR_htInst) {
		case VADD_RESET:
			if (SR_msgDelay < 500 || SendHostMsgBusy()) {
				S_msgDelay += 1;
				HtRetry();
				break;
			}
			SendHostMsg(VADD_TYPE_SIZE, (XDIM_LEN << 8) | TYPE_SIZE);
			HtTerminate();
			break;
		case VADD_ENTER:
			S_yIdx = 0;
			S_yDimLen = PR_yDimLen;
			S_xIdx = 0;
			S_xDimLen = PR_xDimLen;
			S_sum = 0;

			S_addrA += PR_yAddrOff;
			S_addrB += PR_yAddrOff;
			S_addrC += PR_yAddrOff;

			WriteStreamPause_C(VADD_OPEN);

			break;
		case VADD_OPEN:

			// Open read stream A, once for each xDim to be processed
			if (PR_yOpenAIdx < PR_yDimLen && !ReadStreamBusy_A()) {
				ht_uint32 remLen = (ht_uint32)((PR_yDimLen - PR_yOpenAIdx) * PR_xDimLen);
				ReadStreamOpen_A(SR_addrA, remLen > 0x3f ? (ht_uint6)0x3f : (ht_uint6)remLen, P_yOpenAIdx);

				S_addrA += PR_xDimLen * TYPE_SIZE;
				P_yOpenAIdx += 1;
			}

			// Open read stream B, once for each xDim to be processed
			if (PR_yOpenBIdx < PR_yDimLen && !ReadStreamBusy_B()) {
				ReadStreamOpen_B(SR_addrB, PR_xDimLen);

				S_addrB += PR_xDimLen * TYPE_SIZE;
				P_yOpenBIdx += 1;
			}

			// Open write stream, once for each xDim to be processed
			if (PR_yOpenCIdx < SR_yDimLen && !WriteStreamBusy_C()) {
				WriteStreamOpen_C(SR_addrC);

				S_addrC += PR_xDimLen * TYPE_SIZE;
				P_yOpenCIdx += 1;
			}

			if (PR_yOpenAIdx == PR_yDimLen && PR_yOpenBIdx == PR_yDimLen && PR_yOpenCIdx == PR_yDimLen)
				WriteStreamPause_C(VADD_RETURN);
			else
				HtContinue(VADD_OPEN);

			break;
		case VADD_RETURN: {
			BUSY_RETRY(SendReturnBusy_htmain());

			SendReturn_htmain(S_sum);
		}
		break;
		default:
			assert(0);
		}
	}

	if (SR_yIdx < SR_yDimLen &&
		ReadStreamReady_A() &&
		ReadStreamReady_B() &&
		WriteStreamReady_C())
	{
		PersType_t a, b;
		a = ReadStream_A();
		b = ReadStream_B();

		PersType_t c = a + b;

		S_sum += (ht_uint32)c;
		WriteStream_C(c);

		assert_msg(SR_yIdx == ReadStreamTag_A(), "ReadStreamTag_A() error");

		if (SR_xIdx + 1 < SR_xDimLen)
			S_xIdx += 1;
		else {
			ReadStreamClose_A();
			WriteStreamClose_C();
			S_xIdx = 0;
			S_yIdx += 1;
		}
	}
}
示例#20
0
void CPersSub::PersSub() {

  if (PR_htValid) {
    switch (PR_htInst) {

    case SUB_ENTRY: {
      if (SendCallBusy_mult()) {
	HtRetry();
	break;
      }
      
      // Generate a seperate thread for each multiply operation within a matrix element
      if (P_calcIdx < SR_comRC) {
	SendCallFork_mult(SUB_JOIN, P_rowIdx, P_eleIdx, P_calcIdx);

	HtContinue(SUB_ENTRY);
	P_calcIdx += 1;
      } else {
	RecvReturnPause_mult(SUB_STORE);
      }
    }
      break;

    case SUB_JOIN: {
      // Add resulting products into a sum variable
      // The resulting element will be the sum of all multiply operations
      P_eleSum += P_result;
      RecvReturnJoin_mult();
    }
      break;

    case SUB_STORE: {
      if (WriteMemBusy()) {
	HtRetry();
	break;
      }

      // Memory write request - element
      MemAddr_t memWrAddr = (ht_uint48)(SR_mcBase + ((P_rowIdx*SR_mcCol) << 3) + (P_eleIdx << 3));
      WriteMem(memWrAddr, P_eleSum);
      WriteMemPause(SUB_RTN);
    }
      break;

    case SUB_RTN: {
      if (SendReturnBusy_sub()) {
	HtRetry();
	break;
      }

      // Finished calculating matrix element
      SendReturn_sub();
    }
      break;

    default:
      assert(0);

    }
  }
}
示例#21
0
void CPersTest00::PersTest00() {
	if (PR_htValid) {
		switch (PR_htInst) {
		case TEST00_ENTRY: {
			HtContinue(TEST00_WR);
			break;
		}
		case TEST00_WR: {
			S_test00_0_src_u0_data.write_addr(0, 10);
			S_test00_0_src_u0_data.write_mem().test00_0_src_u1_data[0][0].test00_0_src_v1_data = ((uint64_t)0x001169336de7cda0LL);
			S_test00_0_src_u0_data.write_mem().test00_0_src_u1_data[1][0].test00_0_src_v1_data = ((uint64_t)0x001169336de7cda0LL);
			S_test00_0_src_u0_data.write_mem().test00_0_src_u1_data[0][1].test00_0_src_v1_data = ((uint64_t)0x001169336de7cda0LL);
			S_test00_0_src_u0_data.write_mem().test00_0_src_u1_data[1][1].test00_0_src_v1_data = ((uint64_t)0x001169336de7cda0LL);
			S_test00_0_src_u0_data.write_mem().test00_0_src_u1_data[0][2].test00_0_src_v1_data = ((uint64_t)0x001169336de7cda0LL);
			S_test00_0_src_u0_data.write_mem().test00_0_src_u1_data[1][2].test00_0_src_v1_data = ((uint64_t)0x001169336de7cda0LL);
			S_test00_1_src_v0_data = ((uint16_t)0x0003834a4c86abe0LL);
			P_test00_2_src_u0_data[0].test00_2_src_u3_data.test00_2_src_v5_data = ((int16_t)0x0016951177fd7880LL);
			GW_test00_3_src_v0_data.write_addr(1);
			GW_test00_3_src_v0_data = ((int8_t)0x001e9fcdc4e5a160LL);
			GW_test00_4_src_u0_data[0][0].test00_4_src_u2_data.test00_4_src_v6_data[1][0] = ((uint8_t)0x0017cdc6cc1a0560LL);
			HtContinue(TEST00_ST0);
			break;
		}
		case TEST00_ST0: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			S_test00_0_src_u0_data.read_addr(0, 10);
			WriteMem_test00_0_src_u0_data_union(PR_memAddr + 0, SR_test00_0_src_u0_data.read_mem());
			HtContinue(TEST00_ST1);
			break;
		}
		case TEST00_ST1: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_uint16_t(PR_memAddr + 64, SR_test00_1_src_v0_data);
			HtContinue(TEST00_ST2);
			break;
		}
		case TEST00_ST2: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_test00_2_src_v5_data(PR_memAddr + 128, 0);
			HtContinue(TEST00_ST3);
			break;
		}
		case TEST00_ST3: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_test00_3_src_v0_data(PR_memAddr + 192, 1, 1);
			HtContinue(TEST00_ST4);
			break;
		}
		case TEST00_ST4: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_test00_4_src_v6_data(PR_memAddr + 256, 0, 0, 1, 0, 1);
			WriteMemPause(TEST00_LD0);
			break;
		}
		case TEST00_LD0: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_0_src_u0_data(PR_memAddr + 0, 0, 10, 1);
			HtContinue(TEST00_LD1);
			break;
		}
		case TEST00_LD1: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_1_dst_v0_data(PR_memAddr + 64, 5, 0, 1, 1);
			P_test00_1_dst_v0_data_RdAddr1 = (ht_uint3)5;
			HtContinue(TEST00_LD2);
			break;
		}
		case TEST00_LD2: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_2_dst_v0_data(PR_memAddr + 128);
			HtContinue(TEST00_LD3);
			break;
		}
		case TEST00_LD3: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_3_dst_v0_data(PR_memAddr + 192);
			HtContinue(TEST00_LD4);
			break;
		}
		case TEST00_LD4: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_4_dst_v0_data(PR_memAddr + 256, 1, 2, 1);
			P_test00_4_dst_v0_data_RdAddr1 = (ht_uint1)1;
			P_test00_4_dst_v0_data_RdAddr2 = (ht_uint2)2;
			ReadMemPause(TEST00_CHK);
			break;
		}
		case TEST00_CHK: {
			SR_test00_0_src_u0_data.read_addr(0, 10);
			if ((uint64_t)S_test00_0_src_u0_data.read_mem().test00_0_src_u1_data[0][0].test00_0_src_v1_data != ((uint64_t)0x001169336de7cda0LL)) {
				HtAssert(0, 0);
			}
			if ((uint64_t)S_test00_0_src_u0_data.read_mem().test00_0_src_u1_data[1][0].test00_0_src_v1_data != ((uint64_t)0x001169336de7cda0LL)) {
				HtAssert(0, 0);
			}
			if ((uint64_t)S_test00_0_src_u0_data.read_mem().test00_0_src_u1_data[0][1].test00_0_src_v1_data != ((uint64_t)0x001169336de7cda0LL)) {
				HtAssert(0, 0);
			}
			if ((uint64_t)S_test00_0_src_u0_data.read_mem().test00_0_src_u1_data[1][1].test00_0_src_v1_data != ((uint64_t)0x001169336de7cda0LL)) {
				HtAssert(0, 0);
			}
			if ((uint64_t)S_test00_0_src_u0_data.read_mem().test00_0_src_u1_data[0][2].test00_0_src_v1_data != ((uint64_t)0x001169336de7cda0LL)) {
				HtAssert(0, 0);
			}
			if ((uint64_t)S_test00_0_src_u0_data.read_mem().test00_0_src_u1_data[1][2].test00_0_src_v1_data != ((uint64_t)0x001169336de7cda0LL)) {
				HtAssert(0, 0);
			}
			printf("EXP: 0x%04x\n", (uint16_t)0x0003834a4c86abe0LL);
			printf("ACT: 0x%04x\n", (uint16_t)PR_test00_1_dst_v0_data[0][1]);
			if ((uint16_t)PR_test00_1_dst_v0_data[0][1] != ((uint16_t)0x0003834a4c86abe0LL)) {
				HtAssert(0, 0);
			}
			if ((int16_t)PR_test00_2_dst_v0_data[0] != ((int16_t)0x0016951177fd7880LL)) {
				HtAssert(0, 0);
			}
			if ((int8_t)GR_test00_3_dst_v0_data[0] != ((int8_t)0x001e9fcdc4e5a160LL)) {
				HtAssert(0, 0);
			}
			if ((uint8_t)GR_test00_4_dst_v0_data != ((uint8_t)0x0017cdc6cc1a0560LL)) {
				HtAssert(0, 0);
			}
			HtContinue(TEST00_RTN);
			break;
		}
		case TEST00_RTN: {
			if (SendReturnBusy_test00()) {
				HtRetry();
				break;
			}
			SendReturn_test00();
			break;
		}
		default:
			assert(0);
		}
	}
}
示例#22
0
void
CPersCtl::PersCtl()
{
	if (PR_htValid) {
#ifndef _HTV
		static const char *instructions[] = { "CTL_ENTRY", "CTL_RUN", "CTL_RTN" };
		if (0 || (PR_htInst == CTL_ENTRY))
			fprintf(stderr, "CTL: cmd=%s PR_cmd=%s S_rqAddr=%llx @ %lld\n",
				instructions[(int)PR_htInst],
				(PR_cmd == CMD_LD) ? "LD" : "ST",
				(long long)S_rqAddr,
				HT_CYCLE());
#endif

		switch (PR_htInst) {
		case CTL_ENTRY: {
			P_rqIdx = 0;
			P_rqCnt = 0;

			HtContinue(CTL_RUN);
		}
		break;
		case CTL_RUN: {
			if (MemReadBusy() || MemWriteBusy()) {
				HtRetry();
				break;
			}

			// Memory request
			MemAddr_t memAddr = S_rqAddr + (P_rqIdx << 3);

			if (PR_cmd == CMD_LD)
				MemRead_memRsp(memAddr);
			else
				MemWrite(memAddr, 0x600dbeef);

			P_rqCnt = P_rqCnt + 1;

			if ((P_rqIdx + 1) >= S_arrayLen)
				P_rqIdx = 0;
			else
				P_rqIdx = P_rqIdx + 1;

			if (P_rqCnt >= P_numReqs)
				HtContinue(CTL_RTN);
			else
				HtContinue(CTL_RUN);
		}
		break;
		case CTL_RTN: {
			if (ReturnBusy_htmain()) {
				HtRetry();
				break;
			}

			Return_htmain(P_rqCnt);
		}
		break;
		default:
			assert(0);
		}
	}
}
示例#23
0
void CPersTest00::PersTest00() {
	if (PR1_htValid) {
		switch (PR1_htInst) {
		case TEST00_ENTRY: {
			break;
		}
		case TEST00_WR: {
			break;
		}
		case TEST00_ST0: {
			break;
		}
		case TEST00_ST1: {
			break;
		}
		case TEST00_ST2: {
			break;
		}
		case TEST00_ST3: {
			break;
		}
		case TEST00_ST4: {
			break;
		}
		case TEST00_LD0: {
			break;
		}
		case TEST00_LD1: {
			break;
		}
		case TEST00_LD2: {
			break;
		}
		case TEST00_LD3: {
			break;
		}
		case TEST00_LD4: {
			break;
		}
		case TEST00_CHK: {
			break;
		}
		case TEST00_RTN: {
			break;
		}
		default:
			assert(0);
		}
	}
	if (PR3_htValid) {
		switch (PR3_htInst) {
		case TEST00_ENTRY: {
			HtContinue(TEST00_WR);
			break;
		}
		case TEST00_WR: {
			GW3_test00_0_src_v0_data = ((int16_t)0x00192aa94393dec0LL);
			GW3_test00_1_src_v0_data[0] = ((uint32_t)0x00111ffb66693520LL);
			GW3_test00_2_src_v0_data.write_addr(3);
			GW3_test00_2_src_v0_data = ((uint32_t)0x001d7f229c1c49a0LL);
			GW3_test00_3_src_v0_data[0][0].write_addr(0, 0);
			GW3_test00_3_src_v0_data[0][0] = ((uint16_t)0x000cec97f4c84740LL);
			GW3_test00_4_src_v0_data.write_addr(1, 9);
			GW3_test00_4_src_v0_data = ((uint64_t)0x000beba9f75cc5c0LL);
			P3_test00_2_src_v0_data_RdAddr1 = (ht_uint3)3;
			P3_test00_3_src_v0_data_RdAddr1 = (ht_uint1)0;
			P3_test00_3_src_v0_data_RdAddr2 = (ht_uint2)0;
			P3_test00_4_src_v0_data_RdAddr1 = (ht_uint1)1;
			P3_test00_4_src_v0_data_RdAddr2 = (ht_uint4)9;
			HtContinue(TEST00_ST0);
			break;
		}
		case TEST00_ST0: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_int16_t(PR3_memAddr + 0, GR3_test00_0_src_v0_data);
			HtContinue(TEST00_ST1);
			break;
		}
		case TEST00_ST1: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_test00_1_src_v0_data(PR3_memAddr + 64);
			HtContinue(TEST00_ST2);
			break;
		}
		case TEST00_ST2: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_uint32_t(PR3_memAddr + 128, GR3_test00_2_src_v0_data);
			HtContinue(TEST00_ST3);
			break;
		}
		case TEST00_ST3: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_uint16_t(PR3_memAddr + 192, GR3_test00_3_src_v0_data[0][0]);
			HtContinue(TEST00_ST4);
			break;
		}
		case TEST00_ST4: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_uint64_t(PR3_memAddr + 256, GR3_test00_4_src_v0_data);
			WriteMemPause(TEST00_LD0);
			break;
		}
		case TEST00_LD0: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_0_dst_v0_data(PR3_memAddr + 0);
			HtContinue(TEST00_LD1);
			break;
		}
		case TEST00_LD1: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_1_dst_v1_data(PR3_memAddr + 64, 0);
			HtContinue(TEST00_LD2);
			break;
		}
		case TEST00_LD2: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_2_dst_v0_data(PR3_memAddr + 128, 1, 1);
			HtContinue(TEST00_LD3);
			break;
		}
		case TEST00_LD3: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_3_dst_v1_data(PR3_memAddr + 192, 12, 0, 0, 0, 0, 1);
			P3_test00_3_dst_s0_data_RdAddr1 = (ht_uint4)12;
			P3_test00_3_dst_s0_data_RdAddr2 = (ht_uint1)0;
			HtContinue(TEST00_LD4);
			break;
		}
		case TEST00_LD4: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_4_dst_v0_data(PR3_memAddr + 256, 1, 1, 1, 2, 1, 1);
			P3_test00_4_dst_s0_data_RdAddr1 = (ht_uint1)1;
			P3_test00_4_dst_s0_data_RdAddr2 = (ht_uint1)1;
			ReadMemPause(TEST00_CHK);
			break;
		}
		case TEST00_CHK: {
			if ((int16_t)P3_test00_0_dst_s0_data.test00_0_dst_v0_data != ((int16_t)0x00192aa94393dec0LL)) {
				HtAssert(0, 0);
			}
			if ((uint32_t)SR_test00_1_dst_u0_data[0].test00_1_dst_v1_data != ((uint32_t)0x00111ffb66693520LL)) {
				HtAssert(0, 0);
			}
			if ((uint32_t)PR3_test00_2_dst_v0_data[1] != ((uint32_t)0x001d7f229c1c49a0LL)) {
				HtAssert(0, 0);
			}
			if ((uint16_t)GR3_test00_3_dst_s0_data[0].test00_3_dst_v1_data[0][0] != ((uint16_t)0x000cec97f4c84740LL)) {
				HtAssert(0, 0);
			}
			if ((uint64_t)PR3_test00_4_dst_s0_data[1].test00_4_dst_v0_data[2][1] != ((uint64_t)0x000beba9f75cc5c0LL)) {
				HtAssert(0, 0);
			}
			HtContinue(TEST00_RTN);
			break;
		}
		case TEST00_RTN: {
			if (SendReturnBusy_test00()) {
				HtRetry();
				break;
			}
			SendReturn_test00();
			break;
		}
		default:
			assert(0);
		}
	}
}
示例#24
0
void
CPersInc7::PersInc7()
{
	if (PR_htValid) {
		//sc_uint<INC_WR_RSP_GRP_ID_W> wrRspGrpId = (sc_uint<INC_WR_RSP_GRP_ID_W>)((P_htId << 2) | (P_htId & 3));
		//static int cnt = 0;
		//if (++cnt == 151)
		//    bool stop = true;

		//printf("%d - HtId %d: inst %d\n", cnt, (int)PR_htId, (int)PR_htInst);
		switch (PR_htInst) {
		case INC7_INIT:
		{
			P_loopIdx = 0;

			P_rdGrpId = PR_htId ^ 0x5;

			//if (m_htIdPool.empty())
			// wait until all threads have started
			HtContinue(INC7_READ);
			//else
			//	HtContinue(INC7_INIT);
		}
		break;
		case INC7_READ:
		{
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}

			// Calculate memory read address
			MemAddr_t memRdAddr = SR_arrayAddr + ((P_loopBase + P_loopIdx) << 3);

			Inc7Ptr_t arrayMemWrPtr = (PR_htId << 7) | P_loopIdx;

			// Issue read request to memory
			ReadMem_arrayMem7(PR_rdGrpId, memRdAddr, arrayMemWrPtr);

			bool bLast = P_loopIdx == P_elemCnt - 1;
			if (bLast) {
				P_loopIdx = 0;
				ReadMemPause(PR_rdGrpId, INC7_WRITE);
			} else {
				P_loopIdx += 1;
				HtContinue(INC7_READ);
			}

			// Set address for reading memory response data
			P_arrayMemRdPtr = (PR_htId << 7) | P_loopIdx;
		}
		break;
		case INC7_WRITE:
		{
			//if (WriteMemBusy(rspGrpId)) {
			if (WriteMemBusy()) {
				//if (WriteMemBusy(wrRspGrpId)) {
				HtRetry();
				break;
			}

			// Increment memory data
			uint64_t memWrData = GR_arrayMem7.data + 1;

			// Calculate memory write address
			MemAddr_t memWrAddr = SR_arrayAddr + ((P_loopBase + P_loopIdx) << 3);

			// Issue write memory request
			//WriteMem(wrRspGrpId, memWrAddr, memWrData);
			WriteMem(memWrAddr, memWrData);

			bool bLast = P_loopIdx == P_elemCnt - 1;
			if (bLast) {
				P_loopIdx = 0;
				//WriteMemPause(wrRspGrpId, INC7_RTN);
				WriteMemPause(INC7_RTN);
				//HtPause();
			} else {
				P_loopIdx += 1;
				HtContinue(INC7_WRITE);
			}

			// Set address for reading memory response data
			P_arrayMemRdPtr = (PR_htId << 7) | P_loopIdx;
		}
		break;
		case INC7_RTN:
		{
			if (SendReturnBusy_inc7()) {
				HtRetry();
				break;
			}

			SendReturn_inc7(P_elemCnt);

			break;
		}
		default:
			assert(0);
		}
	}
}
示例#25
0
void CPersF8::PersF8()
{
	if (PR1_htValid) {
		switch (PR1_htInst) {
		case F8_ENTRY:
		{
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}

			ht_uint2 rdGrpId = 0;

			S_rslt64[rdGrpId] = 0;

			ReadMem_func64(rdGrpId, PR1_addr, 0x15, 256);

			ReadMemPause(rdGrpId, F8_RD32);
			break;
		}
		case F8_RD32:
		{
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}

			HtAssert(SR_rslt64[0] == 9574400, 0);

			ht_uint2 rdGrpId = 1;

			S_rslt32[rdGrpId] = 0;

			ReadMem_func32(rdGrpId, PR1_addr + 256 * 8, 0x75, 64);

			ReadMemPause(rdGrpId, F8_RD16);
			break;
		}
		case F8_RD16:
		{
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}

			HtAssert(SR_rslt32[1] == 341376, 0);

			ht_uint2 rdGrpId = 2;

			ReadMem_func16(rdGrpId, PR1_addr, 0x9);

			ReadMemPause(rdGrpId, F8_RD64DLY);
			break;
		}
		case F8_RD64DLY:
		{
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}

			ht_uint2 rdGrpId = 3;

			S_rslt64Dly[rdGrpId] = 0;

			ReadMem_func64Dly(rdGrpId, PR1_addr, 0x19, 32);

			ReadMemPause(rdGrpId, F8_RD64GBL);
			break;
		}
		case F8_RD64GBL:
		{
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}

			HtAssert(SR_rslt64Dly[3] == 71424, 0);

			ht_uint2 rdGrpId = 3;

			ReadMem_gbl(rdGrpId, PR1_addr + 8);

			P1_gvAddr = 12;

			ReadMemPause(rdGrpId, F8_RETURN);
			break;
		}
		case F8_RETURN: {
			if (SendReturnBusy_f8()) {
				HtRetry();
				break;
			}

			HtAssert(GR1_gbl.u64 == 124, 0);

			SendReturn_f8();
			break;
		}
		default:
			assert(0);
		}
	}

	T1_rdRspData = 0;
	S_rslt64Dly[3] += T2_rdRspData;
}
示例#26
0
void CPersTest05::PersTest05() {
	if (PR1_htValid) {
		switch (PR1_htInst) {
		case TEST05_ENTRY: {
			HtContinue(TEST05_WR);
			break;
		}
		case TEST05_WR: {
			GW1_test05_1_src_v0_data.write_addr(1, 2);
			GW1_test05_1_src_v0_data = ((uint32_t)0x000e0ee0743246a0LL);
			S_test05_2_src_v0_data[1][0] = ((uint64_t)0x0016f0f7024f88c0LL);
			S_test05_3_dst_s0_data[1].write_addr(1);
			S_test05_3_dst_s0_data[1].write_mem().test05_3_dst_v0_data = ((int8_t)0x000fe190cc1c5d20LL);
			HtContinue(TEST05_ST0);
			break;
		}
		case TEST05_ST0: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_int16_t(PR1_memAddr + 0, PR1_test05_0_src_v0_data[2]);
			HtContinue(TEST05_ST1);
			break;
		}
		case TEST05_ST1: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_test05_1_src_v0_data(PR1_memAddr + 64, 1, 2, 1);
			HtContinue(TEST05_ST2);
			break;
		}
		case TEST05_ST2: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_test05_2_src_v0_data(PR1_memAddr + 128, 1, 0, 1);
			HtContinue(TEST05_ST3);
			break;
		}
		case TEST05_ST3: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			SR_test05_3_dst_s0_data[1].read_addr(1);
			WriteMem_test05_3_dst_s0_data_struct(PR1_memAddr + 192, SR_test05_3_dst_s0_data[1].read_mem());
			WriteMemPause(TEST05_LD0);
			break;
		}
		case TEST05_LD0: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test05_0_dst_v0_data(PR1_memAddr + 0, 2, 0, 1);
			HtContinue(TEST05_LD1);
			break;
		}
		case TEST05_LD1: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test05_1_src_v0_data(PR1_memAddr + 64, 1, 2, 1);
			HtContinue(TEST05_LD2);
			break;
		}
		case TEST05_LD2: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test05_2_dst_v0_data(PR1_memAddr + 128, 2, 14, 0, 0, 1);
			HtContinue(TEST05_LD3);
			break;
		}
		case TEST05_LD3: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test05_3_dst_s0_data(PR1_memAddr + 192, 1, 1, 1);
			ReadMemPause(TEST05_CHK);
			break;
		}
		case TEST05_CHK: {
			if ((int16_t)GR1_test05_0_dst_u0_data[2].test05_0_dst_v0_data[0][1] != ((int16_t)0x0004b4ff2aff2220LL)) {
				HtAssert(0, 0);
			}
			if ((uint32_t)GR1_test05_1_src_v0_data != ((uint32_t)0x000e0ee0743246a0LL)) {
				HtAssert(0, 0);
			}
			if ((uint64_t)GR1_test05_2_dst_v0_data[0][0] != ((uint64_t)0x0016f0f7024f88c0LL)) {
				HtAssert(0, 0);
			}
			SR_test05_3_dst_s0_data[1].read_addr(1);
			if ((int8_t)SR_test05_3_dst_s0_data[1].read_mem().test05_3_dst_v0_data != ((int8_t)0x000fe190cc1c5d20LL)) {
				HtAssert(0, 0);
			}
			HtContinue(TEST05_RTN);
			break;
		}
		case TEST05_RTN: {
			if (SendReturnBusy_test05()) {
				HtRetry();
				break;
			}
			SendReturn_test05();
			break;
		}
		default:
			assert(0);
		}
	}
	if (PR2_htValid) {
		switch (PR2_htInst) {
		case TEST05_ENTRY: {
			break;
		}
		case TEST05_WR: {
			PW2_test05_0_src_v0_data[2].write_addr(3, 0);
			PW2_test05_0_src_v0_data[2] = ((int16_t)0x0004b4ff2aff2220LL);
			P2_test05_0_src_v0_data_RdAddr1 = (ht_uint2)3;
			P2_test05_0_src_v0_data_RdAddr2 = (ht_uint1)0;
			break;
		}
		case TEST05_ST0: {
			break;
		}
		case TEST05_ST1: {
			break;
		}
		case TEST05_ST2: {
			break;
		}
		case TEST05_ST3: {
			break;
		}
		case TEST05_LD0: {
			break;
		}
		case TEST05_LD1: {
			P2_test05_1_src_v0_data_RdAddr1 = (ht_uint1)1;
			P2_test05_1_src_v0_data_RdAddr2 = (ht_uint2)2;
			break;
		}
		case TEST05_LD2: {
			P2_test05_2_dst_v0_data_RdAddr1 = (ht_uint4)2;
			P2_test05_2_dst_v0_data_RdAddr2 = (ht_uint4)14;
			break;
		}
		case TEST05_LD3: {
			break;
		}
		case TEST05_CHK: {
			break;
		}
		case TEST05_RTN: {
			break;
		}
		default:
			assert(0);
		}
	}
}
示例#27
0
void CPersTest00::PersTest00() {
	if (PR_htValid) {
		switch (PR_htInst) {
		case TEST00_ENTRY: {
			HtContinue(TEST00_WR0);
			break;
		}
		case TEST00_WR0: {
			S_test00_0_dst_s0_data.test00_0_dst_s1_data.test00_0_dst_s2_data.test00_0_dst_v1_data = ((int32_t)0x0002daa2633de3e0LL);
			S_test00_0_dst_s0_data.test00_0_dst_s1_data.test00_0_dst_s2_data.test00_0_dst_v2_data[0][0] = ((int32_t)0x0000ba052338b540LL);
			S_test00_0_dst_s0_data.test00_0_dst_s1_data.test00_0_dst_s2_data.test00_0_dst_v2_data[0][1] = ((int32_t)0x0000ba052338b540LL);
			S_test00_0_dst_s0_data.test00_0_dst_s1_data.test00_0_dst_s2_data.test00_0_dst_v2_data[0][2] = ((int32_t)0x0000ba052338b540LL);
			S_test00_0_dst_s0_data.test00_0_dst_s1_data.test00_0_dst_s2_data.test00_0_dst_v2_data[0][3] = ((int32_t)0x0000ba052338b540LL);
			S_test00_0_dst_s0_data.test00_0_dst_s1_data.test00_0_dst_s2_data.test00_0_dst_v3_data = ((uint32_t)0x00194f52bcc93520LL);
			HtContinue(TEST00_ST0);
			break;
		}
		case TEST00_ST0: {
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}
			WriteMem_test00_0_dst_s2_data_struct(PR_memAddr + 0, SR_test00_0_dst_s0_data.test00_0_dst_s1_data.test00_0_dst_s2_data);
			WriteMemPause(TEST00_LD0);
			break;
		}
		case TEST00_LD0: {
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}
			ReadMem_test00_0_dst_s2_data(PR_memAddr + 0);
			ReadMemPause(TEST00_CHK0);
			break;
		}
		case TEST00_CHK0: {
			if ((int32_t)S_test00_0_dst_s0_data.test00_0_dst_s1_data.test00_0_dst_s2_data.test00_0_dst_v1_data != ((int32_t)0x0002daa2633de3e0LL)) {
				printf("EXP: 0x%08x\n", (int32_t)0x0002daa2633de3e0LL);
				printf("ACT: 0x%08x\n\n", (int32_t)S_test00_0_dst_s0_data.test00_0_dst_s1_data.test00_0_dst_s2_data.test00_0_dst_v1_data);
				HtAssert(0, 0);
			}
			if ((int32_t)SR_test00_0_dst_s0_data.test00_0_dst_s1_data.test00_0_dst_s2_data.test00_0_dst_v2_data[0][0] != ((int32_t)0x0000ba052338b540LL)) {
				HtAssert(0, 0);
			}
			if ((int32_t)S_test00_0_dst_s0_data.test00_0_dst_s1_data.test00_0_dst_s2_data.test00_0_dst_v2_data[0][1] != ((int32_t)0x0000ba052338b540LL)) {
				HtAssert(0, 0);
			}
			if ((int32_t)SR_test00_0_dst_s0_data.test00_0_dst_s1_data.test00_0_dst_s2_data.test00_0_dst_v2_data[0][2] != ((int32_t)0x0000ba052338b540LL)) {
				HtAssert(0, 0);
			}
			if ((int32_t)S_test00_0_dst_s0_data.test00_0_dst_s1_data.test00_0_dst_s2_data.test00_0_dst_v2_data[0][3] != ((int32_t)0x0000ba052338b540LL)) {
				HtAssert(0, 0);
			}
			if ((uint32_t)S_test00_0_dst_s0_data.test00_0_dst_s1_data.test00_0_dst_s2_data.test00_0_dst_v3_data != ((uint32_t)0x00194f52bcc93520LL)) {
				HtAssert(0, 0);
			}
			HtContinue(TEST00_RTN);
			break;
		}
		case TEST00_RTN: {
			if (SendReturnBusy_test00()) {
				HtRetry();
				break;
			}
			SendReturn_test00();
			break;
		}
		default:
			assert(0);
		}
	}
}
示例#28
0
void CPersGv11::PersGv11()
{
	if (PR_htValid) {
		switch (PR_htInst) {
		case GV11_ENTRY:
			if (SendCallBusy_gv12a()) {
				HtRetry();
				break;
			}

			GW_Gv12a.data = 0x1234;

			SendCall_gv12a(GV11_gv12b, PR_addr);
			break;
		case GV11_gv12b:
			if (SendCallBusy_gv12b()) {
				HtRetry();
				break;
			}

			P_addr1 = 5;

			GW_Gv12b.write_addr(P_addr1);
			GW_Gv12b.data = 0x2345;

			SendCall_gv12b(GV11_gv12c_WR, P_addr1);
			break;
		case GV11_gv12c_WR:
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}

			WriteMem_uint16_t(PR_addr, 0x3456);

			WriteMemPause(GV11_gv12c_RD);
			break;
		case GV11_gv12c_RD:
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}

			ReadMem_Gv12c(PR_addr);

			ReadMemPause(GV11_gv12c);
			break;
		case GV11_gv12c:
			if (SendCallBusy_gv12c()) {
				HtRetry();
				break;
			}

			SendCall_gv12c(GV11_gv12d_WR, PR_addr);
			break;
		case GV11_gv12d_WR:
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}

			WriteMem_uint16_t(PR_addr, 0x4567);

			WriteMemPause(GV11_gv12d_RD);
			break;
		case GV11_gv12d_RD:
			if (ReadMemBusy()) {
				HtRetry();
				break;
			}

			P_addr1 = 6;

			ReadMem_Gv12d(PR_addr, P_addr1, 1);

			ReadMemPause(GV11_gv12d);
			break;
		case GV11_gv12d:
			if (SendCallBusy_gv12d()) {
				HtRetry();
				break;
			}

			SendCall_gv12d(GV11_RETURN, PR_addr1);
			break;
		case GV11_RETURN:
			if (SendReturnBusy_gv11()) {
				HtRetry();
				break;
			}

			SendReturn_gv11();
			break;
		default:
			assert(0);
		}
	}
}
示例#29
0
void
CPersSch::PersSch()
{
    //sch_thr_idx_t wcid = (sch_thr_idx_t)RecvMsg_schPush().m_connId;
    // UDP must go through the same queue based on pConn index
    uint16_t nxtCid = RecvMsg_schPush().m_connId;
    sch_thr_idx_t wcid = cid2que(nxtCid);
    sch_que_idx_t wadr = S_queWrIdx[wcid];

	m_queDat.write_addr(wcid, wadr);

	if (!RecvMsgBusy_schPush()) {
		m_queDat.write_mem(RecvMsg_schPush());
        S_queWrIdx[wcid] += 1;
	}

	//
	// Stage 1
	//

	sch_que_idx_t radr = S_queRdIdx[PR1_htId];
	m_queDat.read_addr(PR1_htId, radr);

	T1_bEmpty = SR_queWrIdx[PR1_htId] == SR_queRdIdx[PR1_htId];

	//
	// Stage 2
	//

	if (PR2_htValid) {
		switch (PR2_htInst) {
		case SCH_SPIN: {
			if (SendCallBusy_ProcessPkt()
			    || SendMsgBusy_schPop()
			    || TR2_bEmpty) {
				HtRetry();
				break;
			}

			uint16_t cid = S_queDat.read_mem().m_connId;
            conn_addr_t cidAddr = cid2addr(cid);

#ifndef _HTV
            extern FILE *tfp;
            if (tfp)
                fprintf(tfp, "SCH: Calling Pkt cid=0x%04x blkIdx=%d @ %lld\n",
                        (int)cid, (int)S_queDat.read_mem().m_info.m_blkIndex,
                        (long long)sc_time_stamp().value() / 10000);
#endif
			SendCall_ProcessPkt(SCH_RETURN,
					S_queDat.read_mem().m_info,
                    cid, cidAddr);

			S_queRdIdx[PR2_htId] += 1;
			SendMsg_schPop(PR2_htId);
		}
		break;
		case SCH_RETURN: {
			HtContinue(SCH_SPIN);
		}
		break;
		default:
			if (SendReturnBusy_sch()) {
				HtRetry();
				break;
			}
			SendReturn_sch();
			assert(0);
		}
	}

        if (GR_htReset) {
		for (int i=0; i<16; i++) {
			S_queWrIdx[i] = 0;
			S_queRdIdx[i] = 0;
		}
	}
}
示例#30
0
void CPersWr3::PersWr3()
{
	if (PR_htValid) {
		switch (PR_htInst) {
		case WR3_INIT:
		{
			P_loopCnt = 0;
			P_err = 0;
			P_pauseLoopCnt = 0;

			HtContinue(WR3_WRITE1);
		}
		break;
		case WR3_WRITE1:
		{
			if (WriteMemBusy() || SendReturnBusy_wr3()) {
				HtRetry();
				break;
			}

			// Check if end of loop
			if (P_loopCnt == PAUSE_LOOP_CNT || P_err) {
				// Return to host interface
				SendReturn_wr3(P_err);
			} else {
				// Calculate memory read address
				MemAddr_t memRdAddr = P_arrayAddr + ((P_loopCnt & 0xf) << 3);

				// Issue read request to memory
				WriteMem(PR_wrGrpId, memRdAddr, (P_loopCnt & 0xf));

				// Set address for reading memory response data

				HtContinue(WR3_WRITE2);
			}
		}
		break;
		case WR3_WRITE2:
		{
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}

			// Calculate memory read address
			MemAddr_t memRdAddr = P_arrayAddr + (((P_loopCnt + 1) & 0xf) << 3);

			// Issue read request to memory
			WriteMem(PR_wrGrpId, memRdAddr, ((P_loopCnt + 1) & 0xf));

			HtContinue(WR3_WRITE3);
		}
		break;
		case WR3_WRITE3:
		{
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}

			// Calculate memory read address
			MemAddr_t memRdAddr = P_arrayAddr + (((P_loopCnt + 2) & 0xf) << 3);

			// Issue read request to memory
			WriteMem(PR_wrGrpId, memRdAddr, ((P_loopCnt + 2) & 0xf));

			HtContinue(WR3_WRITE4);
		}
		break;
		case WR3_WRITE4:
		{
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}

			// Calculate memory read address
			MemAddr_t memRdAddr = P_arrayAddr + (((P_loopCnt + 3) & 0xf) << 3);

			// Issue read request to memory
			WriteMem(PR_wrGrpId, memRdAddr, ((P_loopCnt + 3) & 0xf));

			HtContinue(WR3_LOOP);
		}
		break;
		case WR3_LOOP:
		{
			if (WriteMemBusy()) {
				HtRetry();
				break;
			}

			// wait a few instructions for last response to line up with call to ReadMemPause
			if (P_pauseLoopCnt == 2) {
				P_pauseLoopCnt = 0;
				P_loopCnt += 1;

				WriteMemPause(PR_wrGrpId, WR3_WRITE1);
			} else {
				P_pauseLoopCnt += 1;
				HtContinue(WR3_LOOP);
			}
		}
		break;
		default:
			assert(0);
		}
	}

#ifndef _HTV
	if (r_m1_wrRspRdy) {
#if (WR3_WR_GRP_W == 0)
		if (!r_wrGrpRsmWait)
			printf("-");
		else if (r_wrGrpRspCnt == 1)
			printf("1");
		else
			printf("+");
#else
#if (WR3_WR_GRP_W <= 2)
		if (r_wrGrpState[r_m1_wrGrpId].m_pause)
			printf("-");
		else if (r_wrGrpState[r_m1_wrGrpId].m_cnt == 1)
			printf("3");
		else
			printf("+");
#else
		{
			m_wrGrpReqState1.read_addr(r_m1_wrGrpId);
			m_wrGrpRspState0.read_addr(r_m1_wrGrpId);
			CWrGrpRspState c_m2_wrGrpRspState = m_wrGrpRspState0.read_mem();
			CWrGrpReqState c_m2_wrGrpReqState = m_wrGrpReqState1.read_mem();

			if (c_m2_wrGrpRspState.m_pause == c_m2_wrGrpReqState.m_pause)
				printf("-");
			else if (c_m2_wrGrpReqState.m_cnt - c_m2_wrGrpRspState.m_cnt == 1)
				printf("3");
			else
				printf("+");
	}
#endif
#endif
	}
#endif
}