Sib
A wrapper that specifies the creation and, optionally, the insertion of a Segment Insertion Bit (SIB) into the IJTAG network. (用于创建并插入 SIBs。)
Usage
Descriptions
SIB 是 IJTAG 中的一个特殊节点,它包含了一个单 bit 移位寄存器。
当该 bit 为 0 的时候,SIB bypass 连接到它的 host port 的 client nodes;当该 bit 为 1 的时候,SIB 会将连接到它的 host port 的 client nodes 包含在内,将其(client nodes)作为 active scan path 的一部分。
SIB 的内部结构如下图所示:
当 update_en 激活时,移位寄存器的值在 TCK 的下降沿被所锁存到 update stage。
to_select_en 的 transition 会延时一个 TCK 周期,以避免 SIB 和它的 clients 之间 TCK 不完全平衡导致的时序竞争。
reuse_modules_when_possible
被设置为 on (或者 DftSpecification wrapper 中推断出它是 on),SIB 模块名称被硬编码为 design_name_design_idtessent_sib#,其中 # 是一个从1开始不断增大的整数。工具会为 Interface wrapper 中的端口名称和Attributes wrapper 中的 attributes 创建唯一的 module。
当 reuse_modules_when_possible
被设置为 off 时,SIB 模块名称被硬编码为 design_name_design_id_tessent_sib。
正如 create_dft_specification
命令中的描述,在 scan 中需要保持 active 的 instruments 会被插入到一个 SIB 下,而用于 scan tested(如 memory BIST 控制器)的 instruments 会被插入到另一个 SIB 下面。
Arguments
(待补充。。。)
Examples
使用 SIBs 分别访问复杂 network 的多个部分。如下图所示,顶层的 network 中有三个 SIBs。
第一个 SIB 最靠近 scan-out,它的 id 是 “logictest_hw”,用于访问生成扫描模式使能信号的 TDR。因为这个 TDR 的 id 是 “scan_modes”,所以 keep_active_during_scan_test
默认是 on。
第二个 SIB 的 id 为 “scannable_instruments”,用于访问所有在 scan test 中不需要保持 active 的 instruments。这个 SIB 在 scan test 模式下会保持关闭状态,从而使 network 的其他部分保持稳定状态,并提供一些稳定且不受干扰的 test_setup values。
第三个 SIB 的 id 为 “child_cores”,用于访问 SIBs 链。串成链的 SIBs 独立为每个 child core 开启 scan path。这些 SIBs 的存在可以保证访问其他的 cores 的时候绕过有缺陷的 core 或者是断电的 core。
上述 IjtagNetwork 在 DftSpecification 的描述如下所示:
DftSpecification(top,setup_hw) {
IjtagNetwork {
HostScanInterface(ijtag){
Sib(logictest_hw) {
Tdr(scan_modes) {
DecodeSignal(edt) {
decode_values : 2'b01, 2'b10 ;
}
DecodeSignal(edt_config2) {
decode_values : 2'b10 ;
}
DecodeSignal(multi_bypass) {
decode_values : 2'b01, 2'b10, 2'b11 ;
}
DecodeSignal(scan_test_en) {
decode_values : 2'b01, 2'b10, 2'b11 ;
}
}
}
// Everything below this Sib is scan tested.
// This sibs remains off when setting up logictest_hw
sib(scannable_instruments) {
sib(mbist1) {
}
sib(mbist2){
}
}
sib(child_cores) {
sib(c1){
DesignInstance(corea_i1) {
}
}
sib(c2){
DesignInstance(corea_i2) {
}
}
sib(c3){
DesignInstance(corea_i3) {
}
}
}
}
}
}
Interface
A wrapper that contains a Client and Host wrapper that together fully specify the client and host ports.
Usage
Description
8 个 client ports 和 8 个 host ports 都在这里指定。
简单来说就是定义端口名称。标准中规定 Sib 有 16 个不同功能的端口,这里就是告诉工具每个功能端口的在实际设计中的端口名称。(实际设计中端口命名可能是工具可以识别的默认端口名称不一样。)
Tdr
A wrapper that specifies the creation and, optionally, the insertion of a TDR inside the IJTAG network.
Usage
Description
一个 3bit TDR 的内部结构图如下所示,它有几个数据输入端口、数据输出端口以及解码输出端口。
当需要 data-out ports 或者是 decoded signals 时,默认情况下总是使用 shift stage 和 output port 之间的 update stage。(这里的 stage 是电路一级一级的意思。)
在具有的 decoded signals 的情况下,解码逻辑位于 shift stage 和 update stage 之间。
如果 shift 的过程中,数据的跳变(data bits toggle)是无关紧要的,那么 update stage 是可以移除的。
如果输出数据被用作 IJTAG network 的使能信号(enable or disable),为了避免出现竞争,输出时间必须有额外的延时。
TCK 时钟只需要在 TDR 的内部进行平衡。因为 Tdr 的 scan-out 端口和 Sib nodes 之间使用了负边沿触发的 flip-flop,所以可以最多可以容忍 50% 的 TCK 周期。(这个内容应该是和时钟树综合有关。)
TDR module 的名称被硬编码为: design_name_design_id_tessent_tdr_id
Update Stage Timing
(后面补充,,,)
Argument
-
id
只能包含字母、数组和下划线的唯一 id。 IjtagNetwork wrapper 中的每一个 Tdr Wrapper 的 id 不能相同。 -
parent_instance :
instance_name
指定实例化 TDR module 的 parent instance。如果没有指定,TDR 会实例化到 DataInPorts、DataOutPorts 和 DecodedSignal 所在的实例中。
可以使用该选项将 TDR 放到不同的位置。
可以指定 “.” 作为 parent_instance ,迫使 TDR 被放置在 root module,使其不再依赖端口的连接关系。
如果 TDR 没有指定 DataInPorts 和 DataOutPorts 的连接关系,parent_instance 默认为 root module。 -
length :
integer
指定移位寄存器的长度。 默认情况下,移位寄存器的长度足以满足 DataInPorts/count、DataOutPorts/count 或 DecodedSignal/decode_values 中指定的内容。
Examples
对图 10-20 中所示电路的描述如下所示。
output_timing
用于满足 ijtag_scan_selection 的时序需求,它会使一些输出 unlatcch 或者具有额外的延时。
Dftsepcification(MyCore,rtl){
IjtagNetwork {
HostScanInterface(purple) {
}
Tdr(blue) {
length : 3 ;
extra_bits_capture_value : self ;
DataOutPorts {
count : 3 ;
port_naming : Dout[%d];
output_timing(0) : ijtag_scan_selection ;
output_timing(1) : normal ;
output_timing(2) : unlarched ;
}
DataInPorts {
count : 1 ;
port_naming : Din%d ;
}
DecodedSignal(SigA) {
decode_values : 3'bx00;
output_timing : ijtag_scan_selection ;
}
DecodedSignal(SigB) {
decode_values : 3'bx01 ;
output_timing : normal ;
}
DecodedSignal(SigC) {
decode_values : 3'bx1x ;
output_timing : unlatched ;
}
}
}
}
}
Interface
A wrapper that provides properties to fully specify the names of the eight client ports of the TDR.
在这里也可以定义 reset 端口的有效电平。
Uasge
这里的意思就是定义端口的功能。
【Tdr模块一般是自己在 Dft Specification 中定义,然后工具自动插入到设计中。在定义 Tdr wrapper 的时候,可以不在 interface 中指定端口名称,这样工具在插入 Tdr 的时候会使用默认的端口名称。如果在 interface 中定义了端口名称,工具就使用给定的名称。】
Examples
【这 8 个端口只固定死的,所有插入的 Tdr 至少都会有这 8 个端口。】
【如下图所示,即 Dft Spec 中定义名称为 PERIPLL_CFG1 的 Tdr,只制定了输入输入端口,然后最终生成的 Tdr 中也是包含 8 个控制端口的, 这些端口的名称使用的是默认名称。】
定义:
实现:
DataInPorts
A wrapper that specifies the number (count) of data-in ports to create on the TDR, the naming of the ports, and the connections to make to them.
(指定所创建的 TDR 上数据输入端口的数量、名称和链接关系)
Uasge
Arguments
count :
integer
指定 TDR 上所需要的 data-in bits 的数量。port_naming :
port_naming, ...
指定 data-in ports 的名称
port_naming 的值有两种不同的格式:① 使用符号的单一字符串;② 带有 explicit sizes 的端口列表。connection(range) :
pin_name
指定 data-in ports 和设计中存在的引脚之间的连接关系。可以重复多次。range 就是 TDR 的 data-in 端口具体的 bit 位。
因为 data-in ports 是接收端口,相同的 bit 不能被连接到多个 source,所以多个 connection 的 range 索引不能重叠。
如果 pin_name 是总线,并且使用process_dft_specification -no_insertion
命令,必须指定目标引脚的完整范围(因为无法从设计中提取)。
Examples
示例1:
定义两个 data-in ports ,并将其连接到设计示例的 instance 上。
DftSpecitication(MyCore,rtl){
IjtagNetwork {
HostScanInterface(purple) {
Sib(orange) {
Tdr(orange) {
DataInPorts {
connection(0) : u2/top_green/go ;
connection(1) : u2/top_green/done ;
}
}
}
}
}
}
DataOutPorts
A wrapper that specifies the number (count) of data-out ports to create on the TDR, the naming of the ports, the output_timing of the ports, and the connections to make to them.
(输出端口的数量、名称和连接关系)
Uasge
Arguments
multiplexing : on | off | auto
指定在连接到 pin_name 的时候是否需要添加 mux 。默认值是 auto。
当设置为 auto 时,如果 pin 没有连接或者连接到一个固定值,或者连接到没有扇入 net,工具都会插入一个 mux。一旦连接关系中需要插入 mux,工具还会自动添加一个额外的 date-out port 来控制 mux 。
mux 会被插入到 pin_name 所在的 parent_instance 。
Examples
指定 data-in 和 date-out 端口的名字。
data-in 端口是单 bit 的,名字为 “locked”;date-out 端口有 7 个。输出端口的最低位 connection(0) 连接到了 div[0],connection(5) 连接到了 mult[2] 。
DftSpecitication(clk_gen,bottom_up) {
IjtagNetwork {
HostScanInterface(ijtag) {
Tdr(1) {
DataOutPorts {
connection(5:3) : pll/mult[2:0] ;
connection(2:0) : pll/div[2:0] ;
port_naming : mux_sel,mult[2:0],div[2:0] ;
}
DataInPorts {
connection(0) : pll/locked ;
port_naming : locked ;
}
}
}
}
}
Multiplexing 没有指定值,所以应该是默认是 auto。因为 pll/mult[2:0] 和 pll/div[2:0] 这两个 pins 还有 functional source,所以会插入 mux,data-out 端口的第 7 个 bit 命名为 mux_sel ,用以控制 mux。
DecodedSignal
A wrapper that specifies the creation of a decoded signal.
Uasge
decode_values 用于指定 TDR 的哪些值可以激活解码信号。
Arguments
decode_values :
binary_code, ...
指定一个二进制编码列表,用于定义 decoded signal 的激活条件。二进制编码的宽度必须和 TDR 一样,编码中可以包含 X 值,但是保证至少有一个 0 或者 1。
(遗留问题:decoded signal 的输出取决于什么? )