边界扫描测试原理 14 -- BSDL 8 用户提供的 VHDL 包
边界扫描测试原理 14 – BSDL 8 用户提供的 VHDL 包
文章目录
- 边界扫描测试原理 14 -- BSDL 8 用户提供的 VHDL 包
- 用户提供的 VHDL 包
- 用户提供的 VHDL 包结构
- 单元描述常量
- 单元上下文值
- 数据源值
- 语义检查
- 用户提供的 VHDL 包示例
用户提供的 VHDL 包
- 用户提供的 VHDL 包结构
- 单元描述常量
- 用户提供的 VHDL 包示例
用户提供的 VHDL 包结构
用户提供的 VHDL 包用于表示用户设计的边界寄存器单元的行为。它包括 VHDL 包部分和 VHDL 包体部分。与标准 VHDL 包相比,VHDL 包部分较简略,因为 BSDL 的定义在<标准使用声明>指定的标准包中提供。在 VHDL 包体中定义的单元名称(称为延迟常量)会被列出。
编写用户提供的 VHDL 包时,如果引用了在<标准使用声明>中指定的先前定义的标准包中未定义的结构(如 BSDL_EXTENSION),可能会导致错误。为避免此类错误,2001 年用户提供的包应该引用 STD_1149_1_2001。
示例 2-44
用户提供的 VHDL 包结构
<用户包> ::= package <用户包名称> is <标准使用声明>{ <扩展声明> }{ <延迟常量> }end <用户包名称> ;<用户包名称> ::= <VHDL 标识符><延迟常量> ::= constant <单元名称> : CELL_INFO;<单元名称> ::= <VHDL 标识符><用户包体> ::= package body <用户包名称> is<标准使用声明>{ <单元描述常量> }end <用户包名称> ;
请注意以下几点:
-
<用户包名称>的值必须是唯一的。
-
所有<单元名称>的值必须是唯一的。
-
<用户包>中的<用户包名称>的值必须与<用户包体>中的<用户包名称>的值相匹配。
单元描述常量
单元描述常量使用以下格式:
示例 2-45
单元描述语法
<单元描述常量> ::=constant <单元名称> : CELL_INFO := ( <捕获描述符列表> ) ;<单元名称> ::= <VHDL 标识符><捕获描述符列表> ::= <捕获描述符> { , <捕获描述符> }<捕获描述符> ::= ( <单元上下文>, <捕获指令>, <数据源> )<单元上下文> ::= INPUT | OUTPUT2 | OUTPUT3 | INTERNAL | CONTROL |CONTROLR | CLOCK | BIDIR_IN | BIDIR_OUT | OBSERVE_ONLY<捕获指令> ::= EXTEST | SAMPLE | INTEST<数据源> ::= PI | PO | CAP | UPD | ZERO | ONE | X
单元描述常量是由包含VHDL枚举类型的数据三元组组成的指定VHDL常量记录。例如,一个捕获描述符如下所示:
示例 2-46
单元描述示例 #1
(INPUT, EXTEST, PI)
可以理解为“对于用作输入单元(INPUT)的此单元,当EXTEST生效时,捕获触发器在CAPTURE-DR状态下加载并行输入(PI)数据。”
示例 2-47
单元描述示例 #2
(BIDIR_IN, INTEST, UPD)
可以理解为“对于用作双向单元且作为输入(BIDIR_IN)的此单元,当INTEST生效时,捕获触发器在CAPTURE-DR状态下加载更新触发器(或锁存器)数据(UPD)的值。”
示例 2-48
单元描述示例 #3
(OUTPUT2, SAMPLE, PI)
可以理解为“对于用作(两态)输出单元的此单元,当SAMPLE生效时,捕获触发器在CAPTURE-DR状态下加载并行输入(PI)数据。”
示例 2-49
单元描述示例 #4
(OUTPUT3, EXTEST, ZERO)
可以理解为“对于用作(3态)输出单元的此单元,当EXTEST生效时,捕获触发器在CAPTURE-DR状态下加载0(ZERO)数据。”
单元上下文值
表 2-4 列出了<单元上下文>值。
表 2-4
单元上下文元素值及其含义
| 单元上下文值 | 含义 |
|---|---|
| INPUT | 控制与观察输入单元 |
| CLOCK | 时钟引脚的仅观察单元(支持 INTEST 指令) |
| OUTPUT2 | 两态输出单元 |
| OUTPUT3 | 三态输出单元 |
| CONTROL | 输出使能或方向控制单元 |
| CONTROLR | 在 TEST-LOGIC-RESET 预设/清除的 CONTROL |
| BIDIR_IN | 作为输入的单元双向引脚 |
| BIDIR_OUT | 作为输出的单元双向引脚 |
| INTERNAL | 控制与观察内部单元,不与 I/O 引脚关联 |
| OBSERVE_ONLY | 仅观察单元,无控制能力,与 I/O 引脚关联 |
除了 BIDIR_IN 和 BIDIR_OUT 的<单元上下文>值之外,表 2-4 中的所有<单元上下文>值都映射到表 2-3 和支持文本中的同名<功能>值。BIDIR_IN 和 BIDIR_OUT 的<单元上下文>值都映射到<功能>值 BIDIR。BIDIR 单元的行为取决于它当前是设置为驱动数据输出(BIDIR_OUT)还是接收数据输入(BIDIR_IN),这由<控制单元>值识别的控制单元中包含的数据值决定。
数据源值
表 2-5 给出了<数据源>的值。图 2-5 提供了数据源可能性的通用模型。
表 2-5
数据源元素值及其含义
| 数据源值 | 含义 |
|---|---|
| PI | 并行输入 |
| PO | 并行输出(如果有驱动器,则为输出垫) |
| CAP | 捕获触发器数据 |
| UPD | 更新触发器(或锁存器)数据 |
| ZERO | 常数 ‘0’ |
| ONE | 常数 ‘1’ |
| X | 未知数据 |
| KEEPER | 在禁用时弱驱动最近驱动的数据状态的输出 |
了解单元的上下文以解释数据源是很重要的。这种上下文决定了软件如何解释 PI 和 PO。
-
如果单元用作输入(或作为输入的双向作用),则必须将 PI 解释为其数据被捕获的系统引脚。
-
如果单元用作输出(或作为输出的双向作用),PI必须解释为来自系统逻辑的输出;在EXTEST期间,除非使用完整的系统逻辑仿真来预测系统逻辑输出,否则单元将捕获X。
-
如果单元用作输出,PO必须是系统引脚;在EXTEST期间,单元将捕获组件外的板级信号;当单元用作输入时,PO将捕获X。

显示 CAP 输入的边界寄存器单元的通用模型
语义检查
在以下表格中,L 表示合法。M 表示仅在合并单元的情况下合法。A 表示当单元是IEEE未强制规定的附加单元时合法。<捕获描述符>是一个(<单元上下文> <捕获指令> <数据源>)元素。一个非法的<捕获描述符>的示例是 (Input, Extest, UPD)。
表 2-6
语义检查
| <捕获指令> | PI | PO | UPD | CAP | X | ZERO | ONE |
|---|---|---|---|---|---|---|---|
| <单元上下文> 为 INPUT、CLOCK 和 BIDIR_IN | |||||||
| EXTEST | L | ||||||
| SAMPLE | L | ||||||
| INTEST | L | L | L | L | L | L | L |
| <单元上下文> 为 OUTPUT2、OUTPUT3 和 BIDIR_OUT | |||||||
| EXTEST | L | L | L | L | L | L | L |
| SAMPLE | L | ||||||
| INTEST | L | ||||||
| <单元上下文> 为 CONTROL 和 CONTROLR | |||||||
| EXTEST | L | L | L | L | L | L | L |
| SAMPLE | L | ||||||
| INTEST | L | M | |||||
| <单元上下文> 为 INTERNAL(见下文注释) | |||||||
| EXTEST | L | L | L | L | L | L | L |
| SAMPLE | L | L | L | L | L | L | L |
| INTEST | L | L | L | L | L | L | L |
| <单元上下文> 为 OBSERVE_ONLY | |||||||
| EXTEST | L | ||||||
| SAMPLE | L | ||||||
| INTEST | A |
对于INTERNAL的<单元上下文>,<捕获描述符>值PI本质上与X相同,因为内部单元不捕获除常数0(ZERO)、1(ONE)或先前移入的值(CAP、UPD或PO)以外的任何内容。
在单个<捕获描述符列表>中,没有<单元上下文>值和<捕获指令>值的组合出现超过一次。
<用户包体>中的<单元描述常量>的<单元名称>值必须与<用户包>中的<延迟常量>的<单元名称>值匹配,其中<用户包体>和<用户包>指定相同的<用户包名称>。
在BSDL的1990版本中,RUNBIST指令作为<捕获指令>元素之一被包括在内,但在1994版本中未出现。这反映了RUNBIST可能会或可能不会引用边界寄存器的事实,并且RUNBIST_EXECUTION属性已被添加到1994版本中以描述RUNBIST的捕获行为。
用户提供的 VHDL 包示例
以下是一个描述两个新单元的用户提供的 VHDL 包示例。这些单元能够在某些情况下捕获常量(0 和 1)。例如,作为输出使用,在 EXTEST 期间,它们捕获常数数据而不是系统逻辑值(通常解释为 X)。通过在边界寄存器的输出单元位置使用这些单元,可以实现一个非正式的 ID 代码。它们将捕获一个由 1 和 0 位组成的模式。
示例 2-50
用户提供的 VHDL 包
-- 用户定义包,描述两个新单元package USER_PACKAGE is
use STD_1149_1_2001.all; -- 获取 "Cell_info"" 的定义-- 边界单元延迟常量(在包体中定义)constant USER_0 : CELL_INFO;
constant USER_1 : CELL_INFO;
end USER_PACKAGE; -- 用户包结束package body USER_PACKAGE is -- 用户边界单元use STD_1149_1_2001.all;constant USER_0 : CELL_INFO :=((OUTPUT2, EXTEST, ZERO),(OUTPUT2, SAMPLE, PI),(OUTPUT3, EXTEST, ZERO), (INTERNAL, EXTEST, ZERO).(OUTPUT3, SAMPLE, PI), (INTERNAL, SAMPLE, PI),(CONTROL, EXTEST, ZERO), (CONTROLR, EXTEST, ONE),(CONTROL, SAMPLE, PI), (CONTROLR, SAMPLE, PI),(CONTROL, INTEST, PI), (CONTROLR, INTEST, PI) );constant USER_1 : CELL_INFO :=((OUTPUT2, EXTEST, ONE),(OUTPUT2, SAMPLE, PI),(OUTPUT3, EXTEST, ONE), (INTERNAL, EXTEST, ONE),(OUTPUT3, SAMPLE, PI), (INTERNAL, SAMPLE, PI),(OUTPUT3, INTEST, PI), (INTERNAL, INTEST, PI),(CONTROL, EXTEST, ONE), (CONTROLR, EXTEST, ONE),(CONTROL, SAMPLE, PI), (CONTROLR, SAMPLE, PI),(CONTROL, INTEST, PI), (CONTROLR, INTEST, PI) );end USER_PACKAGE; -- 用户包体结束
