−目录
ijtag
1. SIB
1.1 STI
The Sib(sti) provides access to the IJTAG network for all instruments in the current design that are to be scan tested along with the rest of the functional logic by the logictest modes such as EDT or logicBIST. The acronym “sti” refers to “Scan Tested Instrument”. As shown in Figure 13-18, that Sib provides isolation between its host port and its clients.
简单地讲STI这种类型的SIB,里面可以插入scan chain, 这样可以把SIB周边的接口用SCAN测试到。
其中MBIST & MBISR使用的SIB,就是STI中的一种。
Sib(sti) { Attributes { tessent_dft_function : scan_tested_instrument_host; } Sib(mbist) { } }
1.2 SRI
SRI这种SIB就只是单纯的SIB, 在任何时候都可以用来配置TDR.
The Sib(sri) is used to provide access to the IJTAG network for child physical blocks, and for logictest instruments and Tdrs used to configure the logictest modes. The acronym “sri” refers to “Scan Resource Instrument”. These IJTAG nodes must remain active and undisturbed during the logictest modes, and are excluded from the logictest scan chains.
1.3 sri sti flow
用ijtag插sri组件,如tdr, icl等, 或sti组件时,为了spec有一个比较统一的hier path, 建议是用两次create spec的方式:
- 先create sri sti spec
- 再新的context design_id, 再create 分别的tdr等,在当前处hier path会有统一名字,方便脚本统一
- HostScanInterface(sri)
- HostScanInterface(sti)
2. tile flow
TC - Tile Client, 表示用于当前tile下面的jtag register SIB节点 THC - Tile Host Collector, 表示用于route到其它tile的router 总控制SIB节点 TH - Tile Host, 表示连接到其它tile的ijtag host控制SIB节点 STI - Scan Tested Instrument, 表示用于scan相关控制的SIB总控SIB节点,比如下面会挂载mbist mbisr等测试组件 SRI - Scan Resource Instrument, 用于连接其它的ijtag register的总控SIB节点,下面可以挂功能的各种SIB和ijtag register
set_dft_specification_requirements -design_type tile
set spec [create_dft_specification -tile_ijtag_host_list {r1 r2} -sri_sib_list {occ edt} -sti_sib_list {mbist mbisr}] report_config_data $spec
report config结果:
2.1 design_type is tile
SRI & STI是被包含在TC下面。
DftSpecification(a_t,rtl1) { IjtagNetwork { HostScanInterface(ijtag) { Sib(tc) { Attributes { tessent_dft_function : tile_client_sib; } to_scan_in_feedthrough : buffer; so_retiming : off; Sib(sti) { Attributes { tessent_dft_function : scan_tested_instrument_host; } Sib(mbist) { } Sib(mbisr) { } } Sib(sri) { Attributes { tessent_dft_function : scan_resource_instrument_host; } Sib(occ) { } Sib(edt) { } } } Sib(thc) { Attributes { tessent_dft_function : tile_host_collector; } Sib(th_r2) { to_scan_in_feedthrough : pipeline; SecondaryHostScanInterface(r2) { } } Sib(th_r1) { to_scan_in_feedthrough : pipeline; SecondaryHostScanInterface(r1) { } } } } } }
2.2 design_type is standard
SRI & STI 与THC是平级结构,没有TC这个东西。
DftSpecification(a_t,rtl1) { IjtagNetwork { HostScanInterface(ijtag) { Sib(sti) { Attributes { tessent_dft_function : scan_tested_instrument_host; } Sib(mbist) { } Sib(mbisr) { } } Sib(sri) { Attributes { tessent_dft_function : scan_resource_instrument_host; } Sib(occ) { } Sib(edt) { } } Sib(thc) { Attributes { tessent_dft_function : tile_host_collector; } Sib(th_r2) { to_scan_in_feedthrough : pipeline; SecondaryHostScanInterface(r2) { } } Sib(th_r1) { to_scan_in_feedthrough : pipeline; SecondaryHostScanInterface(r1) { } } } } } }
3. PTAP / STAP
PTAP STAP也可参考1838协议,主要是想使用在3D封装的项目上。
PTAP相当于是JTAG TAP控制器里面的一个IR指令,对外形成PTAP接口。
STAP相当于是一个SIB,多个STAP可以串行连接到一个PTAP上,STAP的SIB可以向外形成一个接口,可以连接其它的TAP控制器,是标准的5线JTAG接口。
实现上,一般同一DIE内部是用ijtag的方式连接模块与顶层;DIE与DIE之间堆叠的话,是用STAP的方式连在一起,相比ijtag的方式连线会少一点。
下图是一个PTAP连接3个STAP
3.1 example 1
一个PTAP接两个STAP。
## 从下往上看流向, si 到 so的方向 Tap(main) { HostIjtag(1) { // Normal IJTAG network removed for clarity } HostBscan { } HostSTap { // 定义一个PTAP STapPipeline(end) { } STap(left) { // 相当于实例化一个定义好的STAP进来 SecondaryHostScanInterface(stap_left) { // STAP连接到当前模块外面,扩展一个JTAG口 } } STapPipeline(between) { } STap(right) { // 相当于实例化一个定义好的STAP进来 SecondaryHostScanInterface(stap_right) { // STAP连接到当前模块外面,扩展一个JTAG口 } } } }
3.2 example 2
这个例子与上一个例子一样,都是一个PTAP接两个STAP接口,只不过PTAP与STAP在不同的tile,它们之间有连线穿过其它tile的情况,连线有pipeline结构。
因为STAP扩展的JTAG口是直接会连到PAD,应该是不能再添加pipeline结构,对于需要在芯片不同方向扩展JTAG口到芯片外的话,需要STAP放置在芯片的不同位置,STAP与PTAP之间的物理位置可能会是比较远,所以需要这样的分开的结构。
注:tile2, tile3, tile4里面只是描述是的STAP的连接结构,没有描述ijtag结构,可以再单独加一个HostScanInterface(ijtag)去描述。
3.2.1 tile1
IjtagNetwork { HostScanInterface(tap) { Tap(main) { HostIjtag(1) { // Content removed for clarity } HostBScan { } HostSTap { STapPipeline(end) { } STapPipeline(from_right) { } SecondaryHostScanInterface(host_right_stap) { // 开一个接口port, 外面可接一个STAP to_tck : %s_to_tck; } STapPipeline(to_right) { } STapPipeline(from_left) { } SecondaryHostScanInterface(host_left_stap) { //开一个接口port,外面可接一个STAP to_tck : %s_to_tck; } STapPipeline(to_left) { } STapPipeline(start) { } } } } }
3.2.2 tile2
IjtagNetwork { HostScanInterface(stap) { Interface { tdi : stap_tdi; tdo : stap_tdo; tms : stap_tms; tck : stap_tck; trst : stap_trst; reset : stap_ijtag_reset; capture_en : stap_ijtag_ce; shift_en : stap_ijtag_se; update_en : stap_ijtag_ue; } STapPipeline(end) { so_retiming : off; } STapPipeline(from_host) { } SecondaryHostScanInterface(host_stap) { to_tck : %s_to_tck; } STapPipeline(to_host) { } } }
3.2.3 tile3
IjtagNetwork{ HostScanInterface(stap) { Interface { tdi : stap_tdi; tdo : stap_tdo; tms : stap_tms; tck : stap_tck; trst : stap_trst; reset : stap_ijtag_reset; capture_en : stap_ijtag_ce; shift_en : stap_ijtag_se; update_en : stap_ijtag_ue; } STapPipeline(end) { so_retiming : off; } STap(host) { SecondaryHostScanInterface(stap_host) { } } } }
3.2.4 tile4
IjtagNetwork { HostScanInterface(stap) { Interface { tdi : stap_tdi; tdo : stap_tdo; tms : stap_tms; tck : stap_tck; trst : stap_trst; reset : stap_ijtag_reset; capture_en : stap_ijtag_ce; shift_en : stap_ijtag_se; update_en : stap_ijtag_ue; } STapPipeline(end) { so_retiming : off; } STapPipeline(from_host) { } STap(host) { SecondaryHostScanInterface(stap_host) { } } STapPipeline(to_host) { } } }
4. DesignInstance
对于实例化已经存在ijtag接口的模块而言,需要用icl将其内部的结构描述出来。 有两种情况:
- 模块有多个scan_interface的, 理解为有多个平行的TDR
- 模块只有一个scan_interface的,理解为只有一个TDR
如下图所示:
DftSpecification(MyCore,rtl) { IjtagNetwork { HostScanInterface(purple) { Sib(orange) { Tdr(orange) { DataOutPorts { Count : 2 ; } } ScanMux(M1) { Select : tdr(orange)/DataOut(1) ; Input(0) { ScanMux(M0) { Select : tdr(orange)/DataOut(0) ; Input(0) { DesignInstance (u3/top_green) { scan_interface : I1 ; } } Input(1) { DesignInstance (u3/top_green) { scan_interface : I2 ; } } } } Input(1) { DesignInstance (u3/top_green) { scan_interface : I3 ; } } } } Sib(red) { DesignInstance (u1/bottom_green) {} } } } }
如果在环境中,读取了预先写好的icl文件,那么工具将会自动地把这个模块给连接到ijtag network上去,但是结构会比较乱一些。
最好是自己去描述ijtag连接结构,不用工具自动生成的。
5. reset
ijtag tdr里面,reset是用test-logic-reset来作为reset信号, -- 对应ICL ResetPort ToResetPort
而不是使用trst_n来作为reset,这个是TAP的reset。 -- 对应ICL TRSTPort ToTRSTPort
DftSpecification(module_name,id) { IjtagNetwork { HostScanInterface(id) { Tdr(id) { so_retiming : on | off ; DataInPorts { } DataOutPorts { } Interface { } parent_instance : instance_name ; leaf_instance_name : leaf_instance_name ; keep_active_during_scan_test : on | off | auto ; length : integer ; // default: auto extra_bits_capture_value : 0 | 1 | self ; reset_value : binary ; // default: auto Attributes { attribute_name : attribute_value ; } DecodedSignal(signal_name) { } } } } }
6. get_icl_objects
# 获取指定icl module的scan interface列表 get_icl_objects -object_types icl_scan_interface_of_module -of_objects [get_icl_modules $module_name] # 获取指定icl instance的scan interface列表 get_icl_objects -object_types icl_scan_interface -of_objects $instance # 获取指定icl instance下面的icl tdr register get_icl_objects *tdr* -object_types icl_scan_register -below_instances icl_instance_spec
7. 多TAP组织结构
7.1 通过单独port选择TAP
ScanMux ComplianceOutputSelect SelectedBy ce { 1'b1 : tdo_ts ; 1'b0 : tdo_other ; }
7.2 串行选择结构
由其中一个TAP进行选择。
IjtagNetwork { HostScanInterface(purple) { Tap(main) { DataOutPorts { count : 1 ; } } ScanMux(green) { select : Tap(main)/DataOut(0) ; Input(1) { Tap(secondary) { HostIjtag(0) { Tdr(pink) { } } } } } } }
7.3 并行选择结构
由每个TAP都能访问的一个共公模块进行选择。
IjtagNetwork { HostScanInterface(tap) { Interface { tck : tck ; tdi : tdi ; tdo : tdo ; trst : trst ; tms : tms ; } ScanMux(tap_mux) { select : DesignInstance(scan_selector)/data_out ; Input(0) { Tap(main) { HostIjtag(0) { DesignInstance(scan_selector) { scan_interface : Int0 ; } } HostIjtag(1) { tdr(1) { DataOutPorts { count : 8 ; } } } } } Input(1) { Tap(secondary) { HostIjtag(0) { DesignInstance(scan_selector) { scan_interface : Int1 ; } } HostIjtag(1) { tdr(2) { DataOutPorts { count : 8 ; } } } } } } } }
Module scan_selector { TCKPort tck; SelectPort sel1; ScanInPort si1; ShiftEnPort se1; UpdateEnPort ue1; SelectPort sel0; ScanInPort si0; ShiftEnPort se0; UpdateEnPort ue0; ScanOutPort so1 { Source tdr; } ScanOutPort so0 { Source tdr; } DataOutPort data_out { Source tdr; } ScanInterface Int1 { Port tck; Port sel1; Port si1; Port se1; Port ue1; Port so1;} ScanInterface Int0 { Port tck; Port sel0; Port si0; Port se0; Port ue0; Port so0;} ScanMux M1 SelectedBy tdr { 1'b0 : si0; 1'b1 : si1; } ScanRegister tdr { ScanInSource M1; ResetValue 1'b0; } }