SVF 规范
SVF 规范
SVF:
Serial Vector Format
介绍
本文档描述 SVF
串行向量格式文件的语法。
SVF
文件设计来鼓励对串行向量在产品生命周期中的重用,从设计阶段的引入到服务阶段的部署。
SVF
文件以 ASCII
进行描述,由一系列 SVF
语句组成。单行最大支持的字符数为 256
,一个 SVF
语句可以扩展写作多行。每一个语句由命令以及相关的参数组成。每一个 SVF
语句在分号结束。SVF
对大小写不敏感。注释可以在 !
后面或 //
后面插入到文件中。
在一个语句中的扫描数据是以十六进制数字进行表示的,并总是在一对圆括号中。扫描数据不能超过语句指定的数据长度。数据的最高位的 0
在字串较长时可以省略。扫描数据的比特顺序遵循最低位作为 TDI
以及 SMASK
的第一位,也是扫描数据的 TDO
与 MASK
数据的第一位。比特顺序遵循 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 命令细节
每一个命令及其相关的参数会在本文档的后面进行介绍。参数以 []
包围的是可选的,否则参数是强制性的。在本文档中,扫描操作是由 SIR
或 SDR
命令以及与其相关的头部或尾部命令组成的。一些操作命令参数,比如 MASK
、SMASK
以及 TDI
黏在这些指令的后面。MASK
、SMASK
以及 TDI
被 SIR
、SDR
、HIR
、HDR
、TIR
以及 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-9
。1
、1E0
、1E+0
、1E-0
、1.0
、1.0E0
、1.0E+0
以及 1.0E-0
都是合法数字。
ENDDR
ENDIR
语法:
ENDDR stable_state;
ENDIR stable_state;
目的:
建立 IEEE 1149.1
的扫描操作的结束状态
参数:
stable_state:
IEEE 1149.1
稳定状态,在标准扫描操作执行完毕之后强制进入的状态。有效的状态为IRPAUSE
、DRPAUSE
、RESET
以及IDLE
一般信息:
这两个命令分别指定 DR
、IR
扫描操作结束后要进入的状态。一旦指定这两个命令指定的数据保持有效直到被另外的 ENDDR
、ENDIR
指令覆写。在启动时候 ENDDR
与 ENDIR
都被指定为 IDLE
例子:
ENDIR IDLE;
ENDDR DRPAUSE;
FREQUENCY
语法:
FREQUENCY [cycles Hz];
目的:
指定后续操作 (如 SDR
、SIR
、状态改变 STATE
、以及测试操作 RUNTEST
) 的最大时钟频率。新的频率报纸有效,直到下一个 FREQUENCY
命令将其覆写
参数:
cycles:
[可选] 以Hz
表示的大于0
的实数来表示最大的TCK
频率
一般信息:
cycles
以实数指定。
如果 cycle
指定,可能会在 RUNTEST
命令处报错。如果 RUNTEST
即给了 run_count
有给了 max_time
,max_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
器件,如下图所示:
![](https://img2022.cnblogs.com/blog/2674901/202203/2674901-20220310215512383-1780649552.jpg)
如果报头、报尾语句定义恰当,只需要做一个很小的调整,对 ASIC
开发的原始语句就能够重用到新的情况。在这个例子中,一个头部模式将会定义为 u4
、u5
,尾部模式将会定义为 u2
与 u1
。
可选参数可以以任何顺序指定,每一个操作参数仅可以指定一次。TDI
、TDO
、MASK
或 SMASK
不能长于 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
方向。PIOMAP
在 SVF
文件使用 PIO
语句时必须使用。如果使用了 PIO
,那么 PIOMAP
必须放在 SVF
文件的 SIR
、SDR
、STATE
、RUNTEST
或 PIO
语句的前面。
参数:
direction_1(n):
指定逻辑名的IO
方向。方向可能是IN
、OUT
或INOUT
。一个带有方向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_count
或 min_time
至少要指定其中一个。如果同时指定了两个参数,那么两个条件在 RUNTEST
命令结束之前都需要满足。如果 max_time
超限,RUNTEST
在 run_count
计数到达之前提前结束。
参数:
run_state:
[可选] 在RUNTEST
命令执行期间,强制进入的状态。有效的运行状态为IRPAUSE
、DRPAUSE
、RESET
与IDLE
。如果测试总线已经处于该运行态,那么无需进行状态变换。一旦指定了一个run_state
,后续的RUNTEST
命令将会默认进入到这个默认状态。初始化默认状态是IDLE
run_count:
[可选] 总线维持在运行状态的时钟周期数,表示为一个32
位的无符号整型数run_clk:
[可选] 指定使用的时钟,可以是测试时钟TCK
或系统时钟System Clock
。系统时钟参考UUT
上的时钟。系统时钟是独立的[min_time SEC]:
[可选] 以秒计数,在结束前最小计数值[MAXIMUM max_time SEC]:
[可选] 以秒计数的最大计数值[ENDSTATE end_state]:
[可选] 在执行结束之后,强制进入的状态,有效的结束状态为IRPAUSE
、DRPAUSE
、RESET
以及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
中指定的参数,SDR
、SIR
中的参数分别记忆,不要搞混,长度改变或初次使用时,必须指定[TDO (tdo)]:
[可选] 希望从目标中扫描出来的值,以十六进制表示。如果未指定参数,那么不需要进行比较。如果没有TDO
参数存在MASK
不需要使用[MASK (mask)]:
[可选] 在进行TDO
比较时使用的掩码,十六进制表示。若参数未指定,使用上一个掩码值,SDR
、SIR
的掩码值分别记忆[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
中描述的最终稳定状态。有效状态为RESET
、IDLE
、DRSELECT
、DRCAPTURE
、DRSHIFT
、DRPAUSE
、DREXIT1
、DREXIT2
、DRUPDATE
、IRSELECT
、IRCAPTURE
、IRSHIFT
、IRPAUSE
、IREXIT1
、IREXIT2
、以及IRUPDATE
stable_state:
强制进入的最终稳定状态,有效的稳定状态为IRPAUSE
、DRPAUSE
、RESET
以及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;