查看: 84|回复: 0

用程序控制生成V50测试向量的一种尝试

[复制链接]

该用户从未签到

10

主题

3

回帖

122

积分

版主

积分
122
QQ
发表于 2025-3-18 17:55:50 | 显示全部楼层 |阅读模式
本帖最后由 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);
      }

     用此方法,将器件的操作分解为一个个功能函数,将函数组合在一起,就成了一个完整的“测试向量”产生器。
三. 向量文件生成
在上面程序的基础上,加上”向量文件头”和“向量文件尾”,在合适的位置加入标号,就成了一个完整的“向量文件”




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接:

返回顶部 返回列表