在CPU 的 test_flow中,大概分成底下部份
1. AC/DC Test 確保沒有短路或者漏電的問題造成Power Supply不穩...
2. Function Test 用Function Vector(PLL test, TX/RX...)來測試
3. Cache test 用BIST測, 如果有row/column fail, 可用 Cache repair的機制來修補.
4. bin class. 分出CPU的等級

所以不管是那種Test, 都要打vector到TX, 接收RX的 Data來判斷 Fail/OK.
底下就寫了個簡單的 Test-Vector Generator.
step1. 打Config Cycle, 確定 Mode selection.
step2. 打Vector到TX, 抓RX的訊號.
PS: 這只是Emulator, 離實際 Platform上的實現還有一段距離.
底下是 Physical Platform 下要考慮的因素
1. sample ratio
2. package size (Byte/Bit...)
3. latency
...
可以參考
print port control
UART/RS232
#include < stdio.h>
#include < stdlib.h>
#include < util.h>
#ifdef DEBUG
int VIA_DEBUG =1;
#else
int VIA_DEBUG =0;
#endif
//==================================
//Hash Definition
//==================================
enum TSTLIST {
TST_VECTOR_1 =0,
TST_VECTOR_2 =1,
TST_VECTOR_3 =2,
};
enum ERRORLIST {
OUT_POWER =0,
OUT_FREQ =1,
OUT_THEM =2,
OUT_BOOL =3,
};
//==================================
//THEM[31:20], FREQ[19:8], POWER[7:0]
//==================================
enum CONFIGREG {
POWER_TAG =8,
FREQ_TAG =12,
THEM_TAG =12,
};
//===================================
// Range Definition
//===================================
#define MAX_POWER 5
#define MIN_POWER 1
#define MAX_FREQ 1000
#define MIN_FREQ 20
#define MAX_THEM 50
#define MIN_THEM 2
struct Supply {
char* Name_Supply; //Name Test_Vector Name;
int Power_Supply; //Power Supply unit in voltage(.v)
int Freq_Supply; //Frequency Supply unit in Mhz
int Them_Supply; //Thermal Supply unit in .c
} SPLY_TSTLIST[] = {
{"TST_VECTOR_1", 2, 500, 30 },
{"TST_VECTOR_2", 3, 500, 30 },
{"TST_VECTOR_3", 3, 400, 28 },
};
//===================================
// TEST Vector Support
//===================================
struct Vector {
char* Name_Vector;
char* v;
} VECT_TSTLIST[] = {
{"TST_VECTOR_1", "0101 0100 0010 0110 0101 0100 0010 0110" },
{"TST_VECTOR_2", "0101 0111 0010 0010 0101 0111 0010 0010" },
{"TST_VECTOR_2", "0101 0110 1010 0110 0101 0110 1010 0110" },
};
#define ON "1"
#define OFF "0"
#define HZ "Z"
#define HX "X"
//===================================
//TESTER Definition
//===================================
struct TESTER {
char* Name_TESTER;
char* CLK;
char* RST;
char* VAL;
char* TX;
char* RX;
} OUR_TESTER = { "VIA_TST", OFF, OFF, OFF, OFF, OFF };
//===================================
//
//===================================
struct Detect {
char* Name_Detect;
int Power_Detect;
};
int ERROR_HANDLE(int a, int i){
switch(a){
case 0 : printf("Please Check Power_Supply at V-%d\n", i); return -1; break;
case 1 : printf("Please Check Freq_Supply at V-%d\n", i); return -1; break;
case 2 : printf("Please Check Them_Supply at V-%d\n", i); return -1; break;
case 3 : printf("Please Check Test Vector at V-%d\n", i); return -1; break;
default : return 0; break;
}
return 0;
}
int SETREG(int p, int f, int t ){
if( p < MIN_POWER || p > MAX_POWER) { return OUT_POWER; }
if( f < MIN_FREQ || f > MAX_FREQ ) { return OUT_FREQ; }
if( t < MIN_THEM || t > MAX_THEM ) { return OUT_THEM; }
return t << (POWER_TAG + FREQ_TAG) + f << (FREQ_TAG) + p;
}
void Set2TESTER(char* c, char* r, char* v,char* t){
OUR_TESTER.CLK = c;
OUR_TESTER.RST = r;
OUR_TESTER.TX = t;
OUR_TESTER.VAL = v;
}
char* Put2TESTER() {
char* c = OUR_TESTER.CLK;
char* s = OUR_TESTER.RST;
char* v = OUR_TESTER.VAL;
char* t = OUR_TESTER.TX;
OUR_TESTER.RX = "1";
char* r = OUR_TESTER.RX;
printf ("CLK:%2s, RST:%2s,VAL: %2s, TX:%2s, RX:%2s\n",c,s,v,t,r);
return r;
}
void Set2TSTVector(int a,int i){
char* v = VECT_TSTLIST[i].v;
Set2TESTER(ON, OFF, OFF, OFF);
Put2TESTER();
while( (*v++)!='\0'){
((*v)==' ')? :
((*v)=='0')? Set2TESTER(OFF, OFF, ON, OFF) : Set2TESTER(OFF, OFF, ON, ON);
Put2TESTER();
((*v)==' ')? :
((*v)=='0')? Set2TESTER(ON, OFF, ON, OFF) : Set2TESTER(ON, OFF, ON, ON);
Put2TESTER();
}
Set2TESTER(OFF, OFF, OFF, OFF);
Put2TESTER();
}
void Set2Config(int a,int i){
char* t = int2bin(a);
if(VIA_DEBUG) printf("Config Vector (%d) :: %s\n",i,t);
Set2TESTER(ON, OFF, OFF, OFF);
Put2TESTER();
while( (*t++)!= '\0'){
((*t)=='0')? Set2TESTER(OFF, OFF, ON, OFF) : Set2TESTER(OFF, OFF, ON, ON);
Put2TESTER();
((*t)=='0')? Set2TESTER(ON, OFF, ON, OFF) : Set2TESTER(ON, OFF, ON, ON);
Put2TESTER();
}
Set2TESTER(OFF, OFF, OFF, OFF);
Put2TESTER();
}
void Set2Ini(int a,int i){
int j;
Set2TESTER(OFF, ON, OFF, OFF);
Put2TESTER();
for( j=0; j<=3; j++){
Set2TESTER(ON, ON, OFF, OFF);
Put2TESTER();
(j==3)? Set2TESTER(OFF, OFF, OFF, OFF) : Set2TESTER(OFF, ON, OFF, OFF);
Put2TESTER();
}
}
int main() {
int i,a;
for(i=0; i<sizeof(SPLY_TSTLIST)/sizeof(SPLY_TSTLIST[0]); i++){
//Step.1 initial
Set2Ini(a,i);
//Step.2 Set Config REG
a = SETREG(SPLY_TSTLIST[i].Power_Supply, SPLY_TSTLIST[i].Freq_Supply, SPLY_TSTLIST[i].Them_Supply);
if (ERROR_HANDLE(a,i)== -1) return -1;
Set2Config(a,i);
//Step.3 Set Test Vector
Set2TSTVector(a,i);
//printf("%d\n",a);
}
return 0;
}
沒有留言:
張貼留言