SVF 规范

SVF 规范

原文链接
我的博客

SVF: Serial Vector Format

介绍

本文档描述 SVF 串行向量格式文件的语法。

SVF 文件设计来鼓励对串行向量在产品生命周期中的重用,从设计阶段的引入到服务阶段的部署。

SVF 文件以 ASCII 进行描述,由一系列 SVF 语句组成。单行最大支持的字符数为 256,一个 SVF 语句可以扩展写作多行。每一个语句由命令以及相关的参数组成。每一个 SVF 语句在分号结束。SVF 对大小写不敏感。注释可以在 ! 后面或 // 后面插入到文件中。

在一个语句中的扫描数据是以十六进制数字进行表示的,并总是在一对圆括号中。扫描数据不能超过语句指定的数据长度。数据的最高位的 0 在字串较长时可以省略。扫描数据的比特顺序遵循最低位作为 TDI 以及 SMASK 的第一位,也是扫描数据的 TDOMASK 数据的第一位。比特顺序遵循 IEEE 1149.1 标准。

一个 SVF 文件的例子:

!Begin Test Program
TRST OFF;                                 !Disable Test Reset line
ENDIR IDLE;                               !End IR scans in IDLE
ENDDR IDLE;                               !End DR scans in IDLE
HIR  8  TDI (00);                         !8-bit IR header
HDR 16  TDI (FFFF) TDO (FFFF) MASK (FFFF);!16-bit DR header
TIR 16  TDI (0000);                       !16-bit IR trailer
TDR  8  TDI (12);                         !16-bit DR trailer
SIR  8  TDI (41);                         !8-bit IR scan
SDR 32  TDI (ABCD1234) TDO (11112222);    !32-bit DR scan
STATE   DRPAUSE;                          !Go to stable state DRPAUSE
RUNTEST 100 TCK ENDSTATE IRPAUSE;         !RUNBIST for 100 TCKs
!End Test Program

支持下面的 SVF 命令集:

  • ENDDR: 指定 DR 扫描操作之后的默认状态
  • ENDIR: 指定 IR 扫描操作之后的默认状态
  • FREQUENCY: 指定最高的时钟频率
  • HDR: 报头数据寄存器,指定报头模式,在后续的 DR 扫描操作中添加这样的头部数据
  • HKR: 报头指令寄存器,指定报头模式,在后续的 IR 扫描操作中添加这样的头部数据
  • PIO: 并行输入/输出,指定一个并行测试模式
  • PIOMAP: 并行输入/输出映射,映射 PIO 列位置到一个逻辑 PIN
  • RUNTEST: 强制 IEEE 1149.1 总线在一个状态上运行指定的时钟或指定的时长
  • SDR: 扫描数据寄存器,执行 IEEE 1149.1 规定的数据寄存器扫描
  • SIR: 扫描指令寄存器,执行 IEEE 1149.1 规定的指令寄存器扫描
  • STATE: 强制 IEEE 1149.1 总线到一个稳定的状态
  • TDR: 报尾数据寄存器,指定报尾模式,在后续的 DR 扫描操作中添加这样的尾部数据
  • TIR: 报尾指令寄存器,指定报尾模式,在后续的 IR 扫描操作中添加这样的尾部数据
  • TRST: 测试复位,控制可选的测试复位引脚

SVF 命令细节

每一个命令及其相关的参数会在本文档的后面进行介绍。参数以 [] 包围的是可选的,否则参数是强制性的。在本文档中,扫描操作是由 SIRSDR 命令以及与其相关的头部或尾部命令组成的。一些操作命令参数,比如 MASKSMASK 以及 TDI 黏在这些指令的后面。MASKSMASK 以及 TDISIRSDRHIRHDRTIR 以及 TDR “记忆”。一些 SVF 命令会涉及到 IEEE 1149.1 TAP 状态。下面的表格列出了这样的 SVF 状态:

IEEE 1149.1 TAP 状态名 SVF TAP 状态名
`Test-Logic-Reset RESET
Run-Test/Idle IDLE
Select-DR-Scan DRSELECT
Capture-DR DRCAPTURE
Shift-DR DRSHIFT
Exit1-DR DREXIT1
Pause-DR DRPAUSE
Exit2-DR DREXIT2
Update-DR DRUPDATE
Select-IR-Scan IRSELECT
Capture-IR IRCAPTURE
Shift-IR IRSHIFT
Exit1-IR IREXIT1
Pause-IR IRPAUSE
Exit2-IR IREXIT2
Update-IR IRUPDATE

SVF 中的实数使用如下的语法进行表示:
数字 [. 数字] [E [+|-] 数字]
数字为十进制的 0-911E01E+01E-01.01.0E01.0E+0 以及 1.0E-0 都是合法数字。

ENDDR ENDIR

语法:

ENDDR stable_state;
ENDIR stable_state;

目的:
建立 IEEE 1149.1 的扫描操作的结束状态

参数:

  • stable_state: IEEE 1149.1 稳定状态,在标准扫描操作执行完毕之后强制进入的状态。有效的状态为 IRPAUSEDRPAUSERESET 以及 IDLE

一般信息:
这两个命令分别指定 DRIR 扫描操作结束后要进入的状态。一旦指定这两个命令指定的数据保持有效直到被另外的 ENDDRENDIR 指令覆写。在启动时候 ENDDRENDIR 都被指定为 IDLE

例子:

ENDIR IDLE;
ENDDR DRPAUSE;

FREQUENCY

语法:

FREQUENCY [cycles Hz];

目的:
指定后续操作 (如 SDRSIR、状态改变 STATE、以及测试操作 RUNTEST) 的最大时钟频率。新的频率报纸有效,直到下一个 FREQUENCY 命令将其覆写

参数:

  • cycles: [可选] 以 Hz 表示的大于 0 的实数来表示最大的 TCK 频率

一般信息:
cycles 以实数指定。
如果 cycle 指定,可能会在 RUNTEST 命令处报错。如果 RUNTEST 即给了 run_count 有给了 max_timemax_time 可能不能满足给定的最大频率

例子:

SIR 8 TDI(F3) TDO(01) MASK(03);   ! Set up BIST, full speed
FREQUENCY 90E3 HZ;                ! Decrease to 90 kHz
RUNTEST 100000 TCK;               ! Execute BIST
FREQUENCY 1E5 HZ;                 ! Increase to 100 kHz

RUNTEST 300000 TCK 1 SEC          ! Error! 300000 TCK at 100 kHz is
   MAXIMUM 2 SEC;                 !    3 SEC, but MAXIMUM is 2 SEC
FREQUENCY;                        ! Return to full speed

HDR HIR (Header Data Register, Header Instruction Register)

语法:

HDR length [TDI (tdi)] [TDO (tdo)] [MASK (mask)] [SMASK (smask)];
HIR length [TDI (tdi)] [TDO (tdo)] [MASK (mask)] [SMASK (smask)];

目的:
指定一个默认的头部模式,在每次扫描操作前,移位进入。这个命令旨在允许对某个 IEEE 1149.1 实现的扫描语句,能够在另一个 IEEE 1149.1 设备上适配。它指定一组先导数据对扫描语句进行填充

参数:

  • length: 一个 32 比特无符号十进制整数,指定要扫描的比特位数,设置 0 移除头部
  • [TDI (tdi)]: [可选] 要扫描进入目标的十六进制值。如果没有这个参数,TDI 值将会是上一个 HDR/HIR 语句的参数,显然第一个出现的命令,或长度改变时,必须给定参数
  • [TDO (tdo)]: [可选] 扫描出来的值要与这个参数进行对比,以十六进制数表示,如果没有这个参数,则无需进行比较
  • [MASK (mask)]: [可选] 在对 TDO 进行比较时的掩码,若这个参数在初始时或修改长度后没有出现,那么所有的比特位都要进行比较,如果没有 TDO 则不需要给出本参数
  • [SMASK (SMASK)]: [可选] 指定发送的 TDI 的掩码,同上

一般信息:
下面的例子中,假设 SVF 文件是对 ASIC 开发的,ASIC 之后放到了一个板卡上作为 u3 器件,如下图所示:

如果报头、报尾语句定义恰当,只需要做一个很小的调整,对 ASIC 开发的原始语句就能够重用到新的情况。在这个例子中,一个头部模式将会定义为 u4u5,尾部模式将会定义为 u2u1

可选参数可以以任何顺序指定,每一个操作参数仅可以指定一次。TDITDOMASKSMASK 不能长于 length 指定的长度。

例子:

HDR 32 TDI(00000010) TDO(81818181) MASK(FFFFFFFF) SMASK(0);
HIR 16 TDI(ABCD);
...
HDR 0; ! Removes the previous DR scan header.

PIO (Parallel Input/Output)

语法:

PIO (vector_string);

目的:
指定一个并行测试向量。一个 PIOMAP 语句必须在之前定义,在 PIO 语句中定义的向量字符的数量必须与前面的 PIOMAP 语句定义的逻辑名的数量相同。

参数:

  • vector_string: 一个或多个向量字符的列向集合。每一个字符为一个特殊的测试向量的 PIN 指定方向与状态。定义为如下字符:

    • H 驱动为逻辑 1
    • L 驱动为逻辑 0
    • Z 驱动为高阻态
    • U 检测到逻辑 1
    • D 检测到逻辑 0
    • X 检测到未知态

    注意: 对于双向通道 Z 表示无驱动无检测

例子:

PIO (HLUDXZHHLL);

PIOMAP (Parallel Input/Output Map)

语法:

PIOMAP (direction_1 logical_name_1 ... [direction_n logical_name_n]);
PIOMAP (column_1 logical_name_1 ... [column_n logical_name_n]);

目的:
定义在 PIO 语句中的逻辑列的名称与 IO 方向。PIOMAPSVF 文件使用 PIO 语句时必须使用。如果使用了 PIO,那么 PIOMAP 必须放在 SVF 文件的 SIRSDRSTATERUNTESTPIO 语句的前面。

参数:

  • direction_1(n): 指定逻辑名的 IO 方向。方向可能是 INOUTINOUT。一个带有方向 IN 的列是 UUT 的输入,在 PIO 语句中的列可能使用 drive 字符。一个 OUT 列是从 UUT 的输出,可能使用 detect 字符。一个 INOUT 列是一个双向信号,可能使用任何向量字符
  • logical_name_1(n): 一个字符串,指示与列相关的 PIN 的逻辑名。相同的字符串在 PIOMAP 中不能使用超过一次
  • column1(n): 指定 PIO 语句的列号码。在 PIO 语句中的第一个字符是第一列,第二个字符为第二列,以此类推。列号是十进制的。一个指定的列号不能使用超过一次。现在使用中不推荐这样用了

例子:

!PIOMAP must be placed before PIO statement
PIOMAP (IN STROBE
        IN ALE
        OUT DISABLE
        OUT ENABLE
        OUT CLEAR
        IN SET);

PIO(HLUDXZ);

!Vector is:
!  STROBE   <- H
!  ALE      <- L
!  DISABLE  <- U
!  ENABLE   <- D
!  CLEAR    <- X
!  SET      <- Z

RUNTEST

语法:

RUNTEST [run_state] run_count run_clk [min_time SEC [MAXIMUM max_time SEC]] [ENDSTATE end_state];

RUNTEST [run_state] min_time SEC [MAXIMUM max_time SEC] [ENDSTATE end_state];

目的:
强制目标 IEEE 1149.1 总线运行到指定的状态一些时钟周期 (可以是测试时钟或是系统时钟),指定一个时间长度,或同时指定两者,之后移动目标总线到特定的状态。这可以被用来控制目标中的 RUNBIST 操作。

RUNTEST 第一种形式为执行指定的测试运行状态指定的时钟周期。可选的是一个最小以及最大的以秒为单位的时间延迟。第二种形式为执行指定的测试运行状态指定的最小或最大的秒为单位的时长。因为 RUNTEST 是一个生成向量的命令,因此即便 run_conut 未指定,TCK 依然在跳动。

run_countmin_time 至少要指定其中一个。如果同时指定了两个参数,那么两个条件在 RUNTEST 命令结束之前都需要满足。如果 max_time 超限,RUNTESTrun_count 计数到达之前提前结束。

参数:

  • run_state: [可选] 在 RUNTEST 命令执行期间,强制进入的状态。有效的运行状态为 IRPAUSEDRPAUSERESETIDLE。如果测试总线已经处于该运行态,那么无需进行状态变换。一旦指定了一个 run_state,后续的 RUNTEST 命令将会默认进入到这个默认状态。初始化默认状态是 IDLE
  • run_count: [可选] 总线维持在运行状态的时钟周期数,表示为一个 32 位的无符号整型数
  • run_clk: [可选] 指定使用的时钟,可以是测试时钟 TCK 或系统时钟 System Clock。系统时钟参考 UUT 上的时钟。系统时钟是独立的
  • [min_time SEC]: [可选] 以秒计数,在结束前最小计数值
  • [MAXIMUM max_time SEC]: [可选] 以秒计数的最大计数值
  • [ENDSTATE end_state]: [可选] 在执行结束之后,强制进入的状态,有效的结束状态为 IRPAUSEDRPAUSERESET 以及 IDLE。如果测试总线已经是结束状态,那么在结束后无状态变化,如果没有指定结束状态,那么结束之后进入默认状态,默认的默认状态为 IDLE

例子:

! Run in Run-Test/Idle for 1000 TCKs, then go to Pause-DR.
RUNTEST 1000 TCK ENDSTATE DRPAUSE;
! Go back to Run-Test/Idle for 20 SCKs, then go to Pause-DR.
RUNTEST 20 SCK;
! Run in Run-Test/Idle for 1000000 TCKs or at least one second, then go to Pause-DR
RUNTEST 1000000 TCK 1SEC;
! Run in Run-Test/Idle for at least one millisecond and at most 50 milliseconds, then remain in Run-Test/Idle.
RUNTEST 10.0E-3 SEC MAXIMUM 50.0E-3 SEC ENDSTATE IDLE;
! Run in Pause-DR for at least 50 ms, then go to Run-Test/Idle
RUNTEST DRPAUSE 20E-3 SEC ENDSTATE IDLE;
! Run in Pause-DR for at least one second, then go to Run-Test/Idle
RUNTEST 1 SEC;
! Run in Run-Test/Idle for at least 10 ms, then remain in Run-Test/Idle
RUNTEST IDLE 1E-2 SEC;

SDR SIR (Scan Data Register, Scan Instruction Register)

语法:

SDR length [TDI (tdi)] [TDO (tdo)] [MASK (mask)] [SMASK (smask)];
SIR length [TDI (tdi)] [TDO (tdo)] [MASK (mask)] [SMASK (smask)];

目的:
指定目标扫描寄存器的扫描模式。

参数:

  • length: 一个 32 比特无符号十进制整型数,制定要扫描的数位长度
  • [TDI (tdi)]: [可选] 希望扫描进入目标寄存器的值,以十六进制表示。如果未指定参数,会使用上一个 SDR/SIR 中指定的参数,SDRSIR 中的参数分别记忆,不要搞混,长度改变或初次使用时,必须指定
  • [TDO (tdo)]: [可选] 希望从目标中扫描出来的值,以十六进制表示。如果未指定参数,那么不需要进行比较。如果没有 TDO 参数存在 MASK 不需要使用
  • [MASK (mask)]: [可选] 在进行 TDO 比较时使用的掩码,十六进制表示。若参数未指定,使用上一个掩码值,SDRSIR 的掩码值分别记忆
  • [SMASK (smask)]: [可选] 指定不关心的 TDI 数据,十六进制表示同上

例子:

SDR 24 TDI (000010) TDO (818181) MASK (FFFFFF) SMASK (0);
SIR 16 TDI (ABCD);

STATE

语法:

STATE [pathstate_1 [pathstate_2 ... [pathstate_n]]] stable_state;

目的:
强制总线进入到一个稳定状态。

参数:

  • pathstate_1(n): 显式地给出一个或多个可选的 IEEE 1149.1 状态,以打倒在 TAP 中描述的最终稳定状态。有效状态为 RESETIDLEDRSELECTDRCAPTUREDRSHIFTDRPAUSEDREXIT1DREXIT2DRUPDATEIRSELECTIRCAPTUREIRSHIFTIRPAUSEIREXIT1IREXIT2、以及 IRUPDATE
  • stable_state: 强制进入的最终稳定状态,有效的稳定状态为 IRPAUSEDRPAUSERESET 以及 IDLE

例子:

! Force bus to DRPAUSE from current state it is in
STATE DRPAUSE;

! Dictate explicit path bus will take moving from DRPAUSE to IRPAUSE
STATE DREXIT2 DRUPDATE DRSELECT IRSELECT IRCAPTURE IREXIT1 IRPAUSE;
当前状态 新状态 状态路径
RESET RESET RESET
RESET IDLE RESET-IDLE
RESET DRPAUSE RESET-IDLE-DRSELECT-DRCAPTURE-DREXIT1-DRPAUSE
RESET IRPAUSE RESET-IDLE-DRSELECT-IRSELECT-IRCAPTURE-IREXIT1-IRPAUSE
IDLE RESET IDLE-DRSELECT-IRSELECT-RESET
IDLE IDLE IDLE
IDLE DRPAUSE IDLE-DRSELECT-DRCAPTURE-DREXIT1-DRPAUSE
IDLE IRPAUSE IDLE-DRSELECT-IRSELECT-IRCAPTURE-IREXIT1-IRPAUSE
DRPAUSE RESET DRPAUSE-DREXIT2-DRUPDATE-DRSELECT-IRSELECT-RESET
DRPAUSE IDLE DRPAUSE-DREXIT2-DRUPDATE-IDLE
DRPAUSE DRPAUSE DRPAUSE-DREXIT2-DRUPDATE-DRSELECT-DRCAPTURE-DREXIT1-DRPAUSE
DRPAUSE IRPAUSE DRPAUSE-DREXIT2-DRUPDATE-DRSELECT-IRSELECT-IRCAPTURE-IREXIT1-IRPAUSE
IRPAUSE RESET IRPAUSE-IREXIT2-IRUPDATE-DRSELECT-IRSELECT-RESET
IRPAUSE IDLE IRPAUSE-IREXIT2-IRUPDATE-IDLE
IRPAUSE DRPAUSE IRPAUSE-IREXIT2-IRUPDATE-DRSELECT-DRCAPTURE-DREXIT1-DRPAUSE
IRPAUSE IRPAUSE IRPAUSE-IREXIT2-IRUPDATE-DRSELECT-IRSELECT-IRCAPTURE-IREXIT1-IRPAUSE

TDR TIR (Trailer Data Register, Trailer Instruction Register)

语法:

TDR length [TDI (tdi)] [TDO (tdo)] [MASK (mask)] [SMASK (smask)]
TIR length [TDI (tdi)] [TDO (tdo)] [MASK (mask)] [SMASK (smask)]

目的:

参数:

例子:

TDR  32 TDI(00000010) TDO(81818181) MASK(FFFFFFFF) SMASK(0);
TIR  16 TDI(ABCD);
TDR  0; ! Removes the previous DR scan trailer.

TRST (Test Reset)

语法:

TRST trst_mode;

目的:
操作 TRST 信号操作。

参数:

  • trst_mode: 指定 TRST 激活、关闭、高阻态以及是否存在,有效的 trst_mode 为:
    • ON 激活 (逻辑 0)
    • OFF 关闭 (逻辑 1)
    • Z 高阻态
    • ABSENT 不存在

例子:

TRST ON;
TRST OFF;
posted @ 2022-03-03 09:41  ArvinDu  阅读(1851)  评论(0编辑  收藏  举报