|
本帖最后由 sjzwangjh 于 2025-3-18 17:59 编辑
在生产测试中,V50是经常使用的一种机型,常规的数字器件测试就是运行向量,打入输入逻辑,检测输出逻辑的过程,可以用程序来生成。
C#语言以其界面制作容易,类定义和使用方便而成为工程师常用的编程工具。以下以C#为例介绍V50测试向量生成的过程。
一. 首先介绍V50的测试向量
V50的测试向量由多个文件组成,每个文件中可以包含“一段向量”或者“多段向量”,每个向量文件都是以“@@PATTERN_DEFINE”作为“起始标志”,以“@@END_PATTERN_DEFINE”作为文件结束标志,为了方便阅读,一般会在最前面加上“器件引脚名”排列说明。每段向量用“标号”作为“起始标志”和“终止标志,方便调试。示例如下所示:
///***************************************************/
//========PH PPPPPPPP PP PPPPP PPPPPPPP PPPP TTD=======//
//========CV DDDDDDDD BB CCCCC CCBBBBBB AAAA WWW=======//
//========6P 76543210 76 75432 10543210 3210 IIU=======//
//========RA XIIT AAAA AAS PPP=======//
//========SD CNNX DDDD DDC 12 =======//
//========T KTTD CCCC CCK =======//
//======== 10 5432 10 =======//
///***************************************************/
//========RH PXXBWOR X B DDDDDDDD =======//
//========EV AAASRED T S 76543210 =======//
//========S| G101 Y A 2 =======//
//========E5 E B L =======//
//========TV L S =======//
//======== Y =======//
///***************************************************/
@@PATTERN_DEFINE
st0: 0000011XX00XXXXXXXXXXXXXXXXXXXX1; //1 // 0.5MHz, @COMP@, @Start patternTS13
// Enter Parallel Mode Fast Program
0001011XXX0XXXX0XXXXXXXXXXXXXXX1;RPT 25; //2 // Clear State<CRAFT3380>=25
0001011XXX0XXXX0XXXXXXXXXXXXXXX1;RPT 25; //3 // Delay 100us<CRAFT3380>=25
0001011XXX1XXXX0XXXXXXXXXXXXXXX1;RPT 6; //4 // <Trim CLK>=6
0001011XXX0XXXX0XXXXXXXXXXXXXXX1; //5
0001011XXX0XXXX0XXXXXXXXXXXXXXX1; //6
0001011XXX0XXXX0XXXXXXXXXXXXXXX1; //7
H001011XXX0XXXX0XXXXXXXXXXXXXXX1;RPT 50; //8 // PC6 add high voltage<CRAFT3380>=50
// Load Command 0x40---0
H010011XXX1XXXX001000000XXXXXXX1; //10 // XA1,XA0=10B,BS1=0Creat a PB6 + Pulse
.....
0XXXX00XXXXXXXXXXXXXXXXXXXXXXXX1;RPT 180; //22581 // delay 100us
0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1; //22582 // Set all=0
sp0: 0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1; //22583 // @Stop pattern@
@@END_PATTERN_DEFINE
上述向量只包含一段向量,从st0:开始到sp0:结束。每行向量又分为5部分,分别为”标号“、”向量体“、”微指令“、”向量行号“(非必须,方便阅读),”向量注释“(非必须方便阅读),每部分功能解释如下:
”标号“:是向量段的”标识“,把整个向量用”标号“隔离开来是个好习惯,可以将”大体量向量“分解成”小体量向量“,方便”分段“调试,调试通过后,再进行总体运行,再就是每段向量的”运行速度可以不同,把同种“功能”的向量写在一个文件中,更易于管理,减少维护成本。
“向量体”:这是向量文件的关键部分,每个向量文件中的所有“有效向量行”字符长度必须一致,向量体以“;”结尾,V50允许有以下几个字符:
0 : 输出数字低电平
1 :输出数字高电平
L : 验证外部输入逻辑0
H :验证外部输入逻辑1
X :不关心的引脚,测试机一般做”悬空“处理
如果输出引脚不是0、1,X,则可以指定”第三电平“,我们通常用做”高压“引脚输出
二. 向量生成
为了方便“向量体”的每一个“字符”和”器件的每一个“引脚”对应,我们可以引入“索引”的概念,即用“引脚名”来索引“向量字符”,这需要用到C#的“索引属性”定义,将“向量体”看作一个”字符串“,字符串是用”序号“来索引每个“字符”的,不方便”记忆“和“操作”,为此建立一个"引脚名”和“向量字符”之间的“索引”,举例如下:
// 向量数组,它是一个字符串的列表
public List<string> patterns = new List<string>();
public static string _nowPattern = "xxxxxxxxxxxxxx"; // 初始化一个向量字符串,字符串长度和引脚数量对应
public string[] _pinNames = new string[]{"PA0","PA1","PA2","PA3","PA4","PB0","PB1","PB2","PB3","PB4"};
this[string pinName]
{
get
{
int index = -1;
for(int i=0;i<this._pinNames.Length;i++)
{
if(pinName == this._pinNames)
{
index = i;
}
}
if(index > -1)
return this._nowPattern[index];
else
return ' ';
}
set
{
int index = -1;
for(int i=0;i<this._pinNames.Length;i++)
{
if(pinName == this._pinNames)
{
index = i;
}
}
if(index > -1)
{
StringBuilder sb = new StringBuilder(this._nowPattern);
sb[index] = value; // 直接修改指定位置的字符
this._nowPattern = sb.ToString();
}
}
至此,可以在函数中用此“索引”来修改向量了,方便对应,例如:
void AddPatternRun()
{
this["PA2"] = '0';
this["PB3"] = '1';
this.patterns.Add(this._nowPattern);
}
用此方法,将器件的操作分解为一个个功能函数,将函数组合在一起,就成了一个完整的“测试向量”产生器。
三. 向量文件生成
在上面程序的基础上,加上”向量文件头”和“向量文件尾”,在合适的位置加入标号,就成了一个完整的“向量文件”
|
|