Documente Academic
Documente Profesional
Documente Cultură
1450.6.1
IEEE
3 Park Avenue IEEE Std 1450.6.1-2009
New York, NY 10016-5997, USA
13 July 2009
IEEE Std 1450.6.1-2009
Sponsor
IEEE is a registered trademark in the U.S. Patent & Trademark Office, owned by The Institute of Electrical and Electronics
Engineers, Incorporated.
No part of this publication may be reproduced in any form, in an electronic retrieval system or otherwise, without the prior
written permission of the publisher.
IEEE Standards documents are developed within the IEEE Societies and the Standards Coordinating Committees of the
IEEE Standards Association (IEEE-SA) Standards Board. The IEEE develops its standards through a consensus
development process, approved by the American National Standards Institute, which brings together volunteers
representing varied viewpoints and interests to achieve the final product. Volunteers are not necessarily members of the
Institute and serve without compensation. While the IEEE administers the process and establishes rules to promote fairness
in the consensus development process, the IEEE does not independently evaluate, test, or verify the accuracy of any of the
information or the soundness of any judgments contained in its standards.
Use of an IEEE Standard is wholly voluntary. The IEEE disclaims liability for any personal injury, property or other
damage, of any nature whatsoever, whether special, indirect, consequential, or compensatory, directly or indirectly resulting
from the publication, use of, or reliance upon this, or any other IEEE Standard document.
The IEEE does not warrant or represent the accuracy or content of the material contained herein, and expressly disclaims
any express or implied warranty, including any implied warranty of merchantability or fitness for a specific purpose, or that
the use of the material contained herein is free from patent infringement. IEEE Standards documents are supplied AS IS.
The existence of an IEEE Standard does not imply that there are no other ways to produce, test, measure, purchase, market,
or provide other goods and services related to the scope of the IEEE Standard. Furthermore, the viewpoint expressed at the
time a standard is approved and issued is subject to change brought about through developments in the state of the art and
comments received from users of the standard. Every IEEE Standard is subjected to review at least every five years for
revision or reaffirmation, or every ten years for stabilization. When a document is more than five years old and has not been
reaffirmed, or more than ten years old and has not been stabilized, it is reasonable to conclude that its contents, although still
of some value, do not wholly reflect the present state of the art. Users are cautioned to check to determine that they have the
latest edition of any IEEE Standard.
In publishing and making this document available, the IEEE is not suggesting or rendering professional or other services
for, or on behalf of, any person or entity. Nor is the IEEE undertaking to perform any duty owed by any other person or
entity to another. Any person utilizing this, and any other IEEE Standards document, should rely upon his or her
independent judgment in the exercise of reasonable care in any given circumstances or, as appropriate, seek the advice of a
competent professional in determining the appropriateness of a given IEEE standard.
Interpretations: Occasionally questions may arise regarding the meaning of portions of standards as they relate to specific
applications. When the need for interpretations is brought to the attention of IEEE, the Institute will initiate action to prepare
appropriate responses. Since IEEE Standards represent a consensus of concerned interests, it is important to ensure that any
interpretation has also received the concurrence of a balance of interests. For this reason, IEEE and the members of its
societies and Standards Coordinating Committees are not able to provide an instant response to interpretation requests
except in those cases where the matter has previously received formal consideration. A statement, written or oral, that is not
processed in accordance with the IEEE-SA Standards Board Operations Manual shall not be considered the official position
of IEEE or any of its committees and shall not be considered to be, nor be relied upon as, a formal interpretation of the
IEEE. At lectures, symposia, seminars, or educational courses, an individual presenting information on IEEE standards shall
make it clear that his or her views should be considered the personal views of that individual rather than the formal position,
explanation, or interpretation of the IEEE.
Comments for revision of IEEE Standards are welcome from any interested party, regardless of membership affiliation with
IEEE. Suggestions for changes in documents should be in the form of a proposed change of text, together with appropriate
supporting comments. Recommendations to change the status of a stabilized standard should include a rationale as to why a
revision or withdrawal is required. Comments and recommendations on standards, and requests for interpretations should be
addressed to:
Secretary, IEEE-SA Standards Board
445 Hoes Lane
Piscataway, NJ 08854
USA
Authorization to photocopy portions of any individual standard for internal or personal use is granted by The Institute of
Electrical and Electronics Engineers, Inc., provided that the appropriate fee is paid to Copyright Clearance Center. To
arrange for payment of licensing fee, please contact Copyright Clearance Center, Customer Service, 222 Rosewood Drive,
Danvers, MA 01923 USA; +1 978 750 8400. Permission to photocopy portions of any individual standard for educational
classroom use can also be obtained through the Copyright Clearance Center.
Introduction
This introduction is not part of IEEE Std 1450.6.1-2009, IEEE Standard for Describing On-Chip Scan Compression.
The purpose of this standard is to provide a sufficient description of on-chip scan compression structures,
operation, and connectivity such that EDA tools may interoperate for pattern generation and diagnosis. The
standard extends the CTL language (IEEE Std 1450.6), which provides such information for designs without
on-chip scan compression structures.
Notice to users
Users of these documents should consult all applicable laws and regulations. Compliance with the
provisions of this standard does not imply compliance to any applicable regulatory requirements.
Implementers of the standard are responsible for observing or referring to the applicable regulatory
requirements. IEEE does not, by the publication of its standards, intend to urge action that is not in
compliance with applicable laws, and these documents may not be construed as doing so.
Copyrights
This document is copyrighted by the IEEE. It is made available for a wide variety of both public and private
uses. These include both use, by reference, in laws and regulations, and use in private self-regulation,
standardization, and the promotion of engineering practices and methods. By making this document
available for use and adoption by public authorities and private users, the IEEE does not waive any rights in
copyright to this document.
Users of IEEE standards should be aware that these documents may be superseded at any time by the
issuance of new editions or may be amended from time to time through the issuance of amendments,
corrigenda, or errata. An official IEEE document at any point in time consists of the current edition of the
document together with any amendments, corrigenda, or errata then in effect. In order to determine whether
a given document is the current edition and whether it has been amended through the issuance of
amendments, corrigenda, or errata, visit the IEEE Standards Association website at
http://ieeexplore.ieee.org/xpl/standards.jsp, or contact the IEEE at the address listed previously.
For more information about the IEEE Standards Association or the IEEE standards development process,
visit the IEEE-SA website at http://standards.ieee.org.
Errata
Errata, if any, for this and all other standards can be accessed at the following URL: http://
standards.ieee.org/reading/ieee/updates/errata/index.html. Users are encouraged to check this URL for
errata periodically.
Patents
Attention is called to the possibility that implementation of this standard may require use of subject matter
covered by patent rights. By publication of this standard, no position is taken with respect to the existence or
validity of any patent rights in connection therewith. The IEEE is not responsible for identifying Essential
Patent Claims for which a license may be required, for conducting inquiries into the legal validity or scope
of Patents Claims or determining whether any licensing terms or conditions provided in connection with
submission of a Letter of Assurance, if any, or in any licensing agreements are reasonable or non-
discriminatory. Users of this standard are expressly advised that determination of the validity of any patent
rights, and the risk of infringement of such rights, is entirely their own responsibility. Further information
may be obtained from the IEEE Standards Association.
At the time this standard was submitted to the IEEE-SA Standards Board for approval, the OCI (Open Com-
pression Interface) Working Group had the following membership:
The following members of the entity balloting committee voted on this standard. Balloters may have voted
for approval, disapproval, or abstention.
Accellera Intel Nvidia
Cadence Design Mentor Graphics Synopsys
When the IEEE-SA Standards Board approved this standard on 13 May 2009, it had the following
membership:
Robert M. Grow, Chair
Thomas Prevost, Vice Chair
Steve M. Mills, Past Chair
Judith Gorman, Secretary
John Barr Mark Epstein David J. Law
Karen Bartleson Alexander Gelman Ted Olsen
Victor Berman Jim Hughes Glenn Parsons
Richard H. Hulett Ronald C. Petersen
Ted Burse
Young Kyun Kim Narayanan Ramachandran
Richard DeBlasio Joseph L. Koepfinger* Jon Walter Rosdahl
Andy Drozd John Kulick Sam Sciacca
*Member Emeritus
Also included are the following nonvoting IEEE-SA Standards Board liaisons:
Lorraine Patsco
IEEE Standards Program Manager, Document Development
Michael Kipness
IEEE Standards Program Manager, Technical Program Development
1. Overview............................................................................................................................................... 1
1.1 Scope .......................................................................................................................................... 1
1.2 General ....................................................................................................................................... 1
1.3 Conceptual data flow.................................................................................................................. 2
1.4 High-level implementation details ............................................................................................. 3
1.5 Limitations of this standard........................................................................................................ 5
1.6 Structure of this standard............................................................................................................ 5
2. Normative references............................................................................................................................ 6
7. Semantics updates............................................................................................................................... 12
IMPORTANT NOTICE: This standard is not intended to ensure safety, security, health, or
environmental protection in all circumstances. Implementers of the standard are responsible for
determining appropriate safety, security, environmental, and health practices or regulatory requirements.
This IEEE document is made available for use subject to important notices and legal disclaimers. These
notices and disclaimers appear in all publications containing this document and may be found under the
heading Important Notice or Important Notices and Disclaimers Concerning IEEE Documents.
They can also be obtained on request from IEEE or viewed at http://standards.ieee.org/IPR/
disclaimers.html.
1. Overview
1.1 Scope
This standard defines how the necessary information is passed from scan insertion to pattern generation and
from pattern generation to diagnosis such that different tool vendors could be used for each step independent
of on-chip scan compression logic used.
1.2 General
Flows for scan-based test tools are broken into three main stages. Test logic insertion, pattern generation,
and diagnosis. Test logic insertion does insertion and verification of test logic. Pattern generation uses the
test logic to make test patterns that can be used to verify if the design is fabricated correctly. Diagnosis is
used to identify the failing location in a specific device. Diagnosis information can also be used to increase
future yield and to solve problems that keep a design from going to market.
This standard, the Open Compression Interface (OCI), defines on-chip scan compression structures
(OCSCS), which can be used to pass information from test logic insertion to pattern generation, and from
pattern generation to diagnosis, such that interoperability of electronic design automation (EDA) tools is
possible. These structures
Only reveal as much hardware implementation as necessary for pattern generation and diagnosis
Do not limit EDA companies from innovating and developing their own compression solutions
OCSCS are defined here as an extension of IEEE Std 1450.6TM-2005 [Core Test Language (CTL)].1 This
standard highlights the revised CTL syntax and then provides several examples that cover common
compression structure types. The actual OCI syntax and semantics appear prior to the examples.
Figure 1 shows the OCI conceptual data flow from test logic insertion to pattern generation and from pattern
generation to diagnosis. Both the OCI flow (assuming a different vendor for each stage) and the current flow
(same vendor for each stage) are shown. Since same-vendor tools have their own way of linking different
stages of the flow together, OCI is only needed for changing stages when any previous step was completed
by a different vendor. If different vendors were used, then all the data OCI would normally add in the
previous stages is needed.
Current OCI
Inserts test structures
Test Logic Verifies test structures (DRC)
Insertion Adds information for Pattern Generation
- Allowed Sequences
- Compression structure description
OCI Transfer - Symbolic to netlist name mapping
Data
The test logic insertion stage has the best understanding of the test structure being implemented. Test logic
insertion tools are developed based on specific compression structures and have many special design rule
checks implemented so customers have as good a chance as possible to generate working, highly effective
patterns the first time. The time and knowledge necessary to develop all of the design rule checks is
significant. Due to this, the OCI flow presumes the pattern generation tool does not need to perform test
structure verification. In the case where a design house is integrating a core with in-house design logic, the
test structure in the core is presumed to be verified by the core provider and all core-level OCI information
needed for pattern generation shall be in the OCI-compliant CTL file the core provider gives the design
house. The design house integrating the core is responsible for generating and verifying the final OCI
information passed to pattern generation.
The OCI-specific information passed from test logic insertion to pattern generation includes pattern
sequence restrictions, a description of compression hardware, netlist mapping points, and vendor-specific
data to ensure vendor flows are as easy to use as possible when using OCI. For a more detailed description
of how CTL is leveraged to pass information from test logic insertion to pattern generation, see 1.4.
The pattern generation stage can be very time consuming. The automatic test pattern generator (ATPG)
determines which logic values are needed on scan cells to detect the most faults by each test pattern. After a
pattern is generated, it is then simulated to determine how many faulty locations have been detected. This
1
For information on references, see Clause 2.
sequence is repeated until as many as possible faulty locations have been detected. For chips without on-
chip scan compression, the value loaded and unloaded from each scan cell can be mapped directly to a
unique value loaded into the chip and to a unique value unloaded from the chip. Only sequence definitions
that describe how to initialize, load, unload, and apply tests are needed by pattern generation for this case.
On-chip scan compression needs more information. Putting a logic value in a scan cell requires a value to be
loaded into the chip at a previous point in time and likely forces other scan cells to be put to certain logic
values. Checking that a value is in a scan cell may require values in masking logic or on other scan cells.
Also, on-chip scan compression hardware may restrict the length of a sequence or require a relationship
between sequences because of how the hardware is implemented. To do pattern generation efficiently, OCI
passes pattern generation sequences, sequence limitations/relationships, and symbolic descriptions of the
compression hardware created by the test logic insertion stage.
The output test patterns generated by pattern generation need to be diagnosable using both EDA diagnosis,
that can isolate to a gate or net, and on the tester, where isolation is possible due to the failing scan cell or
scan chain. To enable this capability, the pattern generation stage shall identify key events in the pattern data
and pass this information to diagnosis. The information is passed through OCI by updating the sequences
and/or by adding information to the test pattern data. For a more detailed description of how CTL is
leveraged to pass information from pattern generation to diagnosis, see 1.4.
The diagnosis stage uses the key event information added by pattern generation to map each automatic test
equipment (ATE) failure back to a list of defect candidates that might have caused that failure. The
diagnosis stage does not add any new information to the OCI file.
OCI data is passed from stage to stage to allow tool interoperability. The format of the OCI data passed
leverages CTL (IEEE Std 1450.6-2005) as a foundation with some new syntax and semantics added where
needed. Figure 2 shows the information in an OCI file after test logic insertion.
OCI File
Timing Specifications
Sequences
Procedures or Macros {
Step 1
Step 2
Step 3
}
ScanStructures my_chains {
Chain 1
Chain 2
}
CompressionStructures my_comp_structs {
Compressor or Decompressor {
Symbolic description,
Sequence restrictions,
Vendor area
}
}
Environment
Environment env_name {
NameMaps {
}
}
The goal here is to provide a syntax such that tools support a uniform interface and no special
implementation is needed for the various compression technologies. This is achieved by using sequences to
handle the complexities of applying the pattern data and compression equations to handle the data
relationships between scan cells and the inputs and outputs of the design.
The sequences are procedures and macros provided by the compression technology implementor, while the
pattern data provides the data to the sequences. The data relationship of the scan data is provided in
equations in the compression structure block. Pattern generation uses the equations to translate the scan data
to the scan-in and scan-outs and provide the patterns that invoke the existing macros and procedures with the
data passed to them.
The Environment syntax (see Clause 6) can be used to define the compression structures for different
modes, allowing for a mix and match of multiple vendor solutions as needed.
This standard is to be used with IEEE Std 1450TM-1999, IEEE Std 1450.1TM-2005, IEEE Std 1450.2TM-2002,
and IEEE Std 1450.6-2005. The conventions established and defined in IEEE Std 1450-1999 are used in this
standard and are included verbatim below.
Many clauses in this document add additional constructs to existing clauses in IEEE Std 1450-1999, IEEE
Std 1450.1, and IEEE Std 1450.6-2005 and are so identified in the title. Most constructs defined in this
standard are limited to the Environment and Test Mode structures that were extended by IEEE Std 1450.6-
2005.
The following is a copy of the conventions as defined in IEEE Std 1450-1999 and followed herein.
In the syntax explanations, the verb shall is used to indicate mandatory requirements. The meaning of a
mandatory requirement varies for different readers of the standard:
To developers of tools that process OCI (readers), shall denotes a requirement that the standard
imposes. The resulting implementation is required to enforce this requirement and issue an error if
the requirement is not met by the input.
To developers of OCI files (writers), shall denotes mandatory characteristics of the language. The
resulting output shall conform to these characteristics.
To the users of OCI, shall denotes mandatory characteristics of the language. Users may depend on
these characteristics for interpretation of the CTL source.
The language definition clauses contain statements that use the phrase it is an error. This phrase indicates
improperly defined CTL information.
2. Normative references
OCI extends syntax defined by IEEE Std 1450-1999, IEEE Std 1450.1-2005, and IEEE Std 1450.6-2005.
Exceptions, if any, to these standards are defined in this standard. The following referenced documents are
indispensable for the application of this document (i.e., they must be understood and used, so each
referenced document is cited in text and its relationship to this document is explained). For dated references,
only the edition cited applies. For undated references, the latest edition of the referenced document
(including any amendments or corrigenda) applies.
IEEE Std 1450-1999, IEEE Standard Test Interface Language (STIL) for Digital Test Vectors.2, 3
IEEE Std 1450.1-2005, IEEE Standard for Extensions to Standard Test Interface Language (STIL) (IEEE
Std 1450-1999) for Semiconductor Design Environments.
IEEE Std 1450.2-2002, IEEE Standard for Extensions to Standard Test Interface Language (STIL) for DC
Level Specification.
IEEE Std 1450.6-2005, IEEE Standard for Standard Test Interface Language (STIL) for Digital Test Vector
DataCore Test Language (CTL).
3.1 Definitions
For the purposes of this standard, the following terms and definitions apply. Since OCI is the union of the
syntax defined in four documents, the terminology defined in the other documents (IEEE Std 1450-1999,
IEEE Std. 1450.1-2005, IEEE Std. 1450.2-2002, and IEEE Std 1450.6-2006) is applicable in this document.
IEEE 100, The IEEE Standard Dictionary of Electrical and Electronics Terms, Seventh Edition, should be
referenced for terms not defined in this standard.
3.1.1 compressor: Test logic that compacts internal scan-chain data (before it gets to output signal pins).
3.1.2 decompressor: Test logic that expands input signal pin data (before it gets to internal scan-chains).
2IEEE publications are available from the Institute of Electrical and Electronics Engineers, Inc., 445 Hoes Lane, Piscataway, NJ 08854,
USA (http://standards.ieee.org/).
3
The IEEE standards or products referred to in this standard are trademarks of the Institute of Electrical and Electronics Engineers, Inc.
4. New blocksCompressionStructures
This clause defines a new block CompressionStructures that is allowed at the top level of a CTL file and
within CoreType blocks.
The CompressionStructures block is required for chips with on-chip scan compression logic when a
different tool vendor is used for test logic insertion, pattern generation, or diagnosis. A CTL file, including a
CompressionStructures block, standardizes how on-chip scan compression information is passed to enable
different vendor tool interoperability.
The CompressionStructures block is primarily used to describe the on-chip scan compression compressor
and decompressor logic, including how they connect to the internal scan chains and signal pins. A
combination of the CompressionStructures, ScanStructures, CTLMode, MacroDefs, and Procedures
blocks shall describe the behavior of the compressor and decompressor logic from the internal scan chains to
signal pins. Optionally, the CompressionStructures block can also be used to identify vendors and include
vendor-specific information.
(CompressionStructures (COMPRESSION_STRUCTURE_NAME) { (1)
(<Decompressor | Compressor> COMPRESSION_BLOCK_NAME { (2)
(Vendor vendor_name < ; (3)
| { (vendor_value1 = vendor_value2 ; )+ }>)
(SIGNAL_OR_VARIABLE_NAME logic_expression ; )* (4)
(Wire WIRE_NAME logic_expression ; )* (5)
(State state_name {Data logic_expression ; Clock logic_expression ; (6)
(Reset logic_expression ; ) (Set logic_expression ; )
(FuncX logic_expression ; )} )*
})+
})*
(CoreType CORE_TYPE_NAME {
.
(CompressionStructures (COMPRESSION_STRUCTURE_NAME) { (7)
compression_structure_definitions
})*
})*
All shift registers or scan chains only used within compression logic can be defined via ScanStructures
statements (see 20.1 of IEEE Std 1450-1999) or as States in Decompressor and Compressor blocks.
(3) Vendor: This block specifies the vendor of the on-chip scan compression hardware, where
vendor_name is a string (see 9.2 of IEEE Std 1450.6-2005).
The original vendor may also choose to include a list of expressions in this block (where
vendor_value1 and vendor_value2 are strings). This list is not guaranteed to be usable by anyone other
than the originating vendor.
(5) Wire WIRE_NAME logic_expression: This statement specifies the hardware relationship between a Wire
and the logic feeding it, by using the following set of Verilog operators: MUX (?:), OR (|), XOR (^), AND
(&), or INVERT (~). The Wire keyword defines the WIRE_NAME signal as a Pseudo whose scope is only
valid within the specified Decompressor or Compressor block.
(6) State state_name: This statement defines positive edge flip-flops used in the on-chip scan compression
hardware. The state_name shall be unique within CompressionStructures blocks. If a state element is
defined in both the ScanStructures and CompressionStructures blocks, and both are referenced in the
same CTL mode DomainReference block, the ScanStructures cell name shall be the same as the
CompressionStructures state name. state_names inherit all naming capabilities and rules of ScanCell
names.
Any Data for the defined state element specifies generic data input. The Clock, Reset, Set, and FuncX
for the defined state element are (presumed) active high. When Set and Reset are both active, any
resulting behavior is undefined. When FuncX is active, the state element is set to an undefined state.
This is a CompressionStructures example for a chip with a combinational compressor and decompressor.
There are four input signals (in0 in3), two output signals (out0 and out1), and three internal scan
chains whose scan inputs are the internal nets chip.si1, chip.si2, and chip.si3 and whose scan
outputs are the internal nets chip.so1, chip.so2, and chip.so3. More complex examples are
provided in Annex A.
CompressionStructures my_compression {
Decompressor my_decompressor {
Vendor Synopsys {
Decompressor_architecture = mux;
}
chip.si1 in0?in2:in1;
chip.si2 in0?in1:in2;
chip.si3 in0?in3:in1;
}
Compressor my_compressor {
Vendor Synopsys {
Compressor_architecture = xor;
}
out0 chip.so1 ^ chip.so2;
out1 chip.so2 ^ chip.so3;
}
}
The STIL statement, as defined in IEEE Std 1450-1999, identifies the primary version of IEEE Std 1450-
1999 information contained in a STIL file and the presence of one or more standard Extension constructs.
All other constructs and restrictions for Clause 8 of IEEE Std 1450-1999 are in effect here.
STIL IEEE_1450_0_IDENTIFIER {
( EXT_NAME EXT_VERSION; )+ (1)
} // end STIL
(1) EXT_NAME: The specific name of the Extension. This syntax of this standard is identified by the name
Compression. While the Compression concept and mechanisms include IEEE 1450.6, the associated
EXT_NAME for IEEE 1450.6 [namely CTL (and Design)] should be used to indicate use of syntax defined
by IEEE Std 1450.6-2005. Refer to IEEE Std 1450.1-2005 and IEEE Std 1450.6-2005 for details.
EXT_VERSION: The primary version of an EXT_NAME. This version of the standard is identified by the
value 2006.
STIL 1.0 {
Design 2005;
CTL 2005;
Compression 2006;
}
This section shows the extensions OCI defines for usage within Environment blocks.
(Environment (ENV_NAME) {
(CTLMode (CTLMODE_NAME) {
(PatternInformation {
(<Pattern | PatternBurst> (pat_or_burst_name) {
(Identifiers (PATTERN_OR_BURST_ENUM)*{
(EventType identifier_event_enum { (1)
.
})*
})*
})*
(<Procedure | Macro> PROCEDURE_OR_MACRO_NAME {
( Purpose ( procedure_or_macro_enum )+ ;) (2)
.
})*
})
(Internal {
(sig_ref_expr {
(DataType (data_type_enum)+ { (3)
(DataRateForProtocol <Average | Maximum | Minimum> INTEGER;)* (4)
(ConstrainedDuringCapture constrain_value;) (5)
})*
})+
})
(External {
(sig_ref_expr {
...
(PadType <PrePad | PostPad | NoPad>;) (6)
(PadValue default_state;) (7)
})+
})
(DomainReferences (CORE_INSTANCE_NAME) * {
(CompressionStructures (COMPRESSION_STRUCT_NAME)+;) (8)
})*
})*
})
(1) Added new identifier_event_enum options (see 16.1 of IEEE Std 1450.6-2005) called TestReset and
PreviousTestEnd. These values shall be specified for logic tested with CompressionStructures. The labels
or X_REF_ID structures defined for these new identifier_event_enums can be specified in MacroDefs,
Procedures, or Pattern statements.
TestReset: Identifies the locations in the pattern data where simulations from that point forward do not
rely on previous pattern data, assuming the test mode is established and some compare data leveraging the
PreviousTestEnd enum is ignored. If TestReset is not specified, no assumptions can be made for using
PreviousTestEnd.
PreviousTestEnd: Identifies the location in patterns where compares from patterns in the previous
TestReset point end.
(2) Added new procedure_or_macro_enum fields (see 16.1 of IEEE Std 1450.6-2005) called LoadMask,
ObserveSignature, and ResetSignature. LoadMask identifies MacroDefs or Procedures that load mask
data. ObserveSignature identifies MacroDefs or Procedures that are required to observe compressed
representations of captured data. ResetSignature identifies MacroDefs or Procedures that reset the
compressed representations of captured data, thus discarding all the captured responses that have been
captured up to that point. If a MacroDef or Procedure has LoadMask, ObserveSignature, or
ResetSignature as a purpose and does not have any of the purposes: ShiftIn, ShiftOut, Control, Observe,
DoTest, ControlObserve, or DoTestOverlap, then this MacroDef or Procedure can be applied without
disturbing scan cells.
(3) Added new fields to testcontrol_subtype_enum and test_data_subtype_enum (the options for
data_type_enum) called MaskDisable, MaskData, and MaskAll. Use of these new fields is optional (no
default setting is presumed for masking).
MaskDisable: Identifies a place in the design that is not scan enable, test mode, or clock which controls
the selection (mask) logic so, when all MaskDisable are active, it disables selection control (masking) for
scan chains fed by that design location. When inactive, the selection control logic may be masking (or
not).
MaskAll: Identifies a place in the design that is not scan enable, test mode, or clock which controls the
selection (mask) logic so, when all MaskAll are active, it enables selection control (masking) for all scan
chains fed by that design location. When inactive, the selection control logic may be masking or not.
MaskData: Identifies a place in the design that is not scan enable, test mode, or clock which modifies
internal scan chain data streams.
Combinational masking logic specifies these attributes on signal pins. Sequential mask logic specifies
these attributes on scan cells or States in the compression equations. These attributes cannot be placed on
symbolic names.
(5) ConstrainedDuringCapture constrain_value: This statement specifies the required signal values for
Procedures or MacroDefs that have a Capture Purpose specified in the PatternInformation portion of the
Environment block. constrain_value can be D, U, or Z waveform characters (see 18.2 of IEEE Std 1450-
1999).
(6) PadType <PrePad | PostPad | NoPad>: This statement specifies that, if the test data going to the
defined signal pin is not fully specified (not enough values are specified based on size of the MacroDef or
Procedure), it needs to be pre, post, or not padded (extra logic values need to be added to the start, end, or
should not be added). A signal pin of type ScanIn is pre-padded (by default). A signal pin of type ScanOut
is post-padded (by default).
(7) PadValue default_state: When a PadType of PrePad or PostPad is specified, the default_state is in the
PadValue statement defines the padding value. default_state should not be specified for NoPad. Valid
default_state values are the set of Waveform event definitions (see 18.2 of IEEE Std 1450-1999).
(8) Added new DomainReferences type called CompressionStructures that can be included in a
CTLMode block (see 9.2 of IEEE Std 1450.6-2005).
7. Semantics updates
This clause details any semantics that were extended or changed (no syntax changes).
a) All Loops defined in MacroDef or Procedure statements for on-chip scan compression logic imply
a full load/unload sequence.
b) Mapping symbolic signal names to design netlist names (anchor points) are mandatory for each
ScanIn and ScanOut of each ScanStructures block that defines an internal scan chain. Scan
chains used by test logic do not need this mapping. When a scanin/scanout of a ScanStructures
block matches a design netlist pin path name, no anchor point is needed. All inversions that occur on
the ScanStructures side of the anchor point shall be included in the ScanStructures definition and
those on the CompressionStructures side in the CompressionStructures definition.
Anchor points (see Figure 3) can be defined on any port of any netlist gate and are specified by using
the ScanCells and Signals NameMaps defined in 18.3 of IEEE Std 1450.1-2005. Setting anchor
points on state elements can be useful, since these names do not change as much as logic gates do
during design.
When anchor points are defined using NameMaps for ScanStructures defined inside a CoreType
block, the ScanIn and ScanOut name being mapped shall be scoped using the core instance name
followed by a colon (:).
When a CoreType block uses design netlist pin path names to identify internal core anchor points to
the level of design hierarchy of the CoreType block, the CoreInstance CORE_TYPE_NAME can be
mapped to a design netlist instance name using NameMaps. If no NameMap assignment exists for
the CORE_TYPE_NAME or the SI/SO ports in the internal core chains, the CORE_TYPE_NAME defaults
to the design netlist instance name. In the case where the SI/SO ports in the internal core chains are
not mapped (using NameMaps), the core anchor points shall be mapped using the CoreInstance
design netlist instance name (the default) or the mapped name (if mapped via NameMaps), plus a
hierarchical delimiter and the core anchor point design netlist pin path name.
c) All on-chip scan compression logic shall be fully specified from anchor points to input and output
signal pins through State, logic_expression, or MacroDef or Procedure statements.
d) Core non-pseudo ScanIn and ScanOut signal pins cannot be daisy-chained with other scan chains
during core integration when on-chip scan compression logic is defined using those pins.
e) Any core with on-chip scan compression logic shall have fully specified patterns; it shall not rely on
padding assumptions from the Signal block.
f) When Pseudo signals are specified in the MacroDef and Procedure blocks with no waveform, it is
assumed to not be pulsed and to change at time 0. If a pulse is needed on a Pseudo signal, a
Waveforms specification is required.
g) When test logic insertion uses a different tool than pattern generation and a MacroDef or
Procedure has a Control, Observe, or ControlObserve Purpose assigned in the
PatternInformation portion of the Environment block, that Procedure or MacroDef shall not be
modified by the pattern generation tool.
scanenable
clk
in0
ScanStructures Out0
ScanStructures
Out1
in1
Decompressor Internal Compressor
Logic Scan Chains Logic
Out2
ScanStructures
in2
Out3
ScanStructures
in3
h) If an identifier used in a logic_expression refers to a local identifier (wire or state) and a non-local
identifier, then the local identifier supersedes the non-local identifier.
i) Add a convention to waveform characters 0 and 1 (see 18.2 of IEEE Std 1450-1999) such that they
are equal to logic values 0 and 1 when the signals are used in a logic_expression. When a waveform
is defined for a signal that is used in a logic_expression, at least a 0 and a 1 has to be defined.
j) When the pattern generation tool and test logic insertion come from different vendors, all
Procedures and MacroDefs shall have fully defined PatternInformation purposes to specify the
intent of the Procedures and MacroDefs.
Annex A
(informative)
Examples
This annex shows various examples demonstrating practical usage of OCI. New OCI syntax and semantics
are shown in bold.
This circuit has four scan inputs and four scan outputs. The inputs use MUXes to break data dependency; the
outputs use XOR gates, which allow some ability to isolate failures. The same clock (CLK) and scan enable
(SE) go to each flop. For simplicity, each scan chain has only one flop. The anchor points are not specified
using NameMap because the first and last scancell port names are used to define the ScanIn and ScanOut
in the ScanStructures block. Figure A.1 shows the circuit diagram.
clk
CLK
0 Flop1
SI
1 SI Q
S SE
in0
Out0
0 CLK Flop2
SI Q
1
S SE
Out1
in1 CLK Flop3
0
SI Q
1
S SE
Out2
0 CLK Flop4
SI Q
in2 1 SE
S SI Q
Out3
0 CLK Flop5
SI
SI Q
1
S SE
scanenable
Header {
Title CTL to define combinational compression circuitry;
Date 2005
}
Signals {
in0 In {ScanIn;}
in1 In {ScanIn;}
in2 In {ScanIn;}
in3 In {ScanIn;}
clk In; scanenable In;
Out0 Out {ScanOut;}
Out1 Out {ScanOut;}
Out2 Out {ScanOut;}
Out3 Out {ScanOut;}
Flop1/SI Pseudo; Flop2/SI Pseudo; Flop3/SI Pseudo;
Flop4/SI Pseudo; Flop5/SI Pseudo; Flop6/SI Pseudo;
Flop1/Q Pseudo; Flop2/Q Pseudo; Flop3/Q Pseudo;
Flop4/Q Pseudo; Flop5/Q Pseudo; Flop6/Q Pseudo;
}
Timing comp_timing {
WaveformTable time {
Period 100ns;
Waveforms {
in0+in1+in2+in3+clk+scanenable { 01X {0nsD/U/N;}
clk {01P {0ns D/U/D;50ns D/U/U;60ns D/U/D;}
Out0+Out1+Out2+Out3 { lhX {0ns X; '20ns l/h/X; 30ns X;}
}
}
}
}
MacroDefs comp_macros {
comp_load_unload_and_capture {
W time;
C { scanenable = 1;}
X Previous_End_Point;
Shift { V {in0=#; in1=#; in2=#; in3=#; clk=P; Out0=#; Out1=#;
Out2=#; Out3= #;}}
}
comp_capture {
W time;
C { scanenable = 0;}
V {clk=#; in0=#; in1=#; in2=#; in3=#; Out0=#; Out1=#; Out2=#;
Out3=#;}
}
}
ScanStructures comp_internal_chains {
ScanChain intchain1 {ScanCells Flop1; ScanLength 1; ScanIn Flop1/SI;
ScanOut Flop1/Q; ScanMasterClock clk;}
ScanChain intchain2 {ScanCells Flop2; ScanLength 1; ScanIn Flop2/SI;
ScanOut Flop2/Q; ScanMasterClock clk;}
ScanChain intchain3 {ScanCells Flop3; ScanLength 1; ScanIn Flop3/SI;
ScanOut Flop3/Q; ScanMasterClock clk;}
ScanChain intchain4 {ScanCells Flop4; ScanLength 1; ScanIn Flop4/SI;
ScanOut Flop4/Q; ScanMasterClock clk;}
A.2 LFSR-MUX
This example uses a reseeding LFSR decompressor and a selectable MUX output compressor. A shift chain
updates both during the capture clock. The load signal is defined as a Pseudo and presumed to change value
at time 0. Figure A.2 shows the circuit diagram.
c lk
CLK Flop1
c o_1
D Q
SI Q
C LK
lfsrFlop 6 SE 0 Out0
SI Q
CLK
lfs rloadFlop 6
SE
1
0 D Q CLK Flop2 1
Q
CLK
SI Q
SI
CLK
SE
1
0
SI Q
CLK Flop3
CLK
lfs rloadFlop 4
SE
SI Q
D Q
CLK
lf srFlop4 0
SE Out1
SI Q
CLK
lfs rloadFlop 3
SE
CLK Flop4
1
0
1
SI Q
D Q
CLK
SI Q
lfs rloadFlop 2
CLK
lfs rFlop3 SE
SE
CLK Flop5
1
0
lfs rloadFlop 1
SI Q
Q
CLK
SI 0
SE
D Q
C LK
lfsrFlop 2 SE Out2
c i_1
CLK Flop6
1
1
0
SI Q
SE
D Q
CLK
c_reset lf srFlop1
1
0
Q
Counter
Q
load
CLK
CLK
C LK
D
Testcloc k
D
D
This sample CTL defines the compression for this structure after test logic insertion. Because the TestReset
and PreviousTestEnd are defined to pattern generation, no modifications to these CTL blocks are needed
after pattern generation and the pattern generation tool shall assume no state can be kept between captures.
STIL 1.0 {
Design 2005;
CTL 2005;
Compression 2006;
}
Header {
Title CTL for reseeding LFSR decompressor and mux compressor;
Date 2006
}
Signals {
Testclock In;
ci_1 In {ScanIn;}
ci_2 In {ScanIn;}
clk In; scanenable In;
}
ScanStructures selector_load_chains {
ScanChain maskffs { ScanCells LoadSelFlop1 LoadSelFlop2 LoadSelFlop3;
ScanLength 3; ScanMasterClock testclock;
ScanIn ci_2;ScanOut co_2; ScanEnable scanenable;
ScanInversion 0; }
}
ScanStructures lfsr_load_chains {
ScanChain load_chains {ScanCells lfsrloadFlop1 lfsrloadFlop2
lfsrloadFlop3 lfsrloadFlop4 lfsrloadFlop5
lfsrloadFlop6;
ScanLength 6; ScanIn ci_1; ScanOut co_1;
ScanMasterClock testclock; ScanInversion 0;
ScanEnable scanenable}
}
ScanStructures comp_internal_chains {
ScanChain intchain1 {ScanCells Flop1; ScanLength 1; ScanIn si1;
ScanOut so1; ScanMasterClock clk;
ScanEnable scanenable}
ScanChain intchain2 {ScanCells Flop2; ScanLength 1; ScanIn si2;
ScanOut so2; ScanMasterClock clk;
ScanEnable scanenable}
ScanChain intchain3 {ScanCells Flop3; ScanLength 1; ScanIn si3;
ScanOut so3; ScanMasterClock clk;
ScanEnable scanenable}
ScanChain intchain4 {ScanCells Flop4; ScanLength 1; ScanIn si4;
ScanOut so4; ScanMasterClock clk;
ScanEnable scanenable}
ScanChain intchain5 {ScanCells Flop5; ScanLength 1; ScanIn si5;
ScanOut so5; ScanMasterClock clk;
ScanEnable scanenable}
ScanChain intchain6 {ScanCells Flop6; ScanLength 1; ScanIn si6;
ScanOut so6; ScanMasterClock clk;
ScanEnable scanenable}
}
CompressionStructures comp_decompressor {
Compressor my_compressor {
Vendor Synopsys;
State SelFlop1 { Data LoadSelFlop1; Clock Testclock & load;}
State SelFlop2 { Data LoadSelFlop2; Clock Testclock & load;}
State SelFlop3 { Data LoadSelFlop3; Clock Testclock & load;}
Out0 SelFlop1?so6:so5;
Out1 SelfFop2?so4:so3;
Out2 SelFlop3?so2:so1;
}
Decompressor my_decompressor {
Vendor Synopsys;
State lfsrFlop1 { Data load?lfsrloadFlop1:lfsrFlop1 ^ lfsrFlop6;
Clock Testclock;}
State lfsrFlop2 { Data load?lfsrloadFlop2:lfsrFlop1;
Clock Testclock;}
State lfsrFlop3 { Data load?lfsrloadFlop3:lfsrFlop2;
Clock Testclock;}
Environment compression {
NameMaps anchor_points {
Signals {
si1 Flop1[SI]; so1 Flop1[Q];
si2 Flop2[SI]; so2 Flop2[Q};
si3 Flop3[SI]; so3 Flop3[Q];
si4 Flop4[SI]; so4 Flop4[Q];
si5 Flop5[SI]; so5 Flop5[Q];
si6 Flop6[SI]; so6 Flop6[Q];
}
}
CTLMode comp_atpg {
DomainReferences {
Timing comp_timing;
Macrodefs comp_macros;
ScanStructures comp_internal_chains selector_load_chains
lfsr_load_chains;
CompStructures comp_decompressor;
}
Internal {
ci_1 {DataType TestData ScanDataIn { DataRateForProtocol
Minimum 6; DataRateForProtocol Maximum 6;}}
ci_2 {DataType TestData ScanDataIn { DataRateForProtocol
Minimum 3;}}
scanenable {DataType TestControl ScanEnable
{ ActiveState U; AssumedInitialState D;}}
clk+Testclock {DataType CaptureClock ScanMasterClock
MasterClock {ActiveState U; AssumedInitialState D;}}
Out0+Out1+Out2 {DataType TestData ScanDataOut;
DataRateForProtocol Average 1;}
SelFlop1 + SelFlop2 + SelFlop3 {DataType TestData MaskData;}
co_1 {DataType TestData ScanDataOut { DataRateForProtocol
Minimum 6; DataRateForProtocol Maximum 6;}}
co_2 {DataType TestData ScanDataOut { DataRateForProtocol
Minimum 3;}}
c_reset {DataType Reset {ActiveState U; AssumedInitialState D;}}
}
PatternInformation {
Macro comp_load_unload {Purpose ControlObserve;
Identifiers { EventType TestReset {Xref ResetPoint
{Complete;Begin;}}}}
Macro comp_capture { Purpose Capture;
Identifiers {EventType PreviousTestEnd
{ Xref PreviousEndPoint{Complete;Begin;}}}}
Macro init_test {Purpose ModeControl;
UseByPattern EstablishMode;}
}
}
}
Figure A.3 and Figure A.4 show the decompressor and compactor, respectively, for this example.
phase shifter
int_si[0]
chain1
int_si[1]
chain2
edt_channels_in1
LFSM
(decompressor
edt_channels_in2 ring generator)
int_si[11]
chain12
edt_reset
mask_in
edt_clock
(to compactor)
Figure A.3Decompressor
chain1
chain2
edt_channels_out1
chain3
edt_channels_out2
chain12
mask decoder
edt_update
mask_hold register
STIL 1.0 {
Design 2005;
CTL 2005;
Compression 2006;
}
Header {
Title "CTL describing EDT-like compression circuitry";
Date "Mon Feb 27 15:53:58 PST 2006";
}
Signals {
// functional signals
//
clk In;
fin[2..0] In;
fout[1..0] Out;
// test signals
//
edt_clock In;
edt_reset In;
edt_update In;
scan_en In;
edt_channels_in1 In; // ScanIn, scan length defined in ScanGroups
edt_channels_in2 In; // ScanIn, scan length defined in ScanGroups
edt_channels_out1 Out; // ScanOut, scan length defined in ScanGroups
edt_channels_out2 Out; // ScanOut, scan length defined in ScanGroups
// internal signals
//
int_si[0..11] Pseudo;
int_so[0..11] Pseudo;
mask_in Pseudo;
}
SignalGroups {
// Lengths of compressed scan input and output signals are the
// same.
// Patterns generated are padded.
// Specifying "12" below is redundant since this is specified
// in DataRateForProtocol.
_si_ = 'edt_channels_in1 + edt_channels_in2' { ScanIn 12; }
_so_ = 'edt_channels_out1 + edt_channels_out2' { ScanOut 12; }
Timing comp_timing {
WaveformTable time {
Period '100ns';
Waveforms {
_pi_ {01X { '0ns' D/U/N; }}
_clks_ {0P { '0ns' D; '40ns' D/U; '50ns' D; }}
_po_ {LHXZ { '0ns' X; '10ns' l/h/X/t; '40ns' X; }}
}
}
}
MacroDefs comp_macros {
load_unload_and_update_masks {
W time;
V { clk = 0; edt_clock = P; edt_update = 1; edt_reset = 1;
scan_en = 1; }
C { edt_update = 0; edt_reset = 0; scan_en = 1; }
Shift { V { clk = P; edt_clock = P; _si_ = #; _so_ = #; } }
}
combinational_pattern {
Macro load_unload_and_update_masks { _si_ = #; _so_ = #; }
W time;
V { _pi_ = %; _clks_ = %; _po_ = %; }
}
}
ScanStructures comp_internal_chains {
ScanChain chain1 { ScanCells chain1_cells[7..0];
ScanLength 8;
ScanIn int_si[0];
ScanOut int_so[0];
ScanMasterClock clk; }
ScanChain chain2 { ScanCells chain2_cells[7..0];
ScanLength 8;
ScanIn int_si[1];
ScanOut int_so[1];
ScanMasterClock clk; }
ScanChain chain3 { ScanCells chain3_cells[7..0];
ScanLength 8;
ScanIn int_si[2];
ScanOut int_so[2];
ScanMasterClock clk; }
ScanChain chain4 { ScanCells chain4_cells[7..0];
ScanLength 8;
ScanIn int_si[3];
ScanOut int_so[3];
ScanMasterClock clk; }
ScanChain chain5 { ScanCells chain5_cells[7..0];
ScanLength 8;
ScanIn int_si[4];
ScanOut int_so[4];
ScanMasterClock clk; }
ScanChain chain6 { ScanCells chain6_cells[7..0];
ScanLength 8;
ScanIn int_si[5];
ScanOut int_so[5];
ScanMasterClock clk; }
ScanChain chain7 { ScanCells chain7_cells[7..0];
ScanLength 8;
ScanIn int_si[6];
ScanOut int_so[6];
ScanMasterClock clk; }
ScanChain chain8 { ScanCells chain8_cells[7..0];
ScanLength 8;
ScanIn int_si[7];
ScanOut int_so[7];
ScanMasterClock clk; }
ScanChain chain9 { ScanCells chain9_cells[7..0];
ScanLength 8;
ScanIn int_si[8];
ScanOut int_so[8];
ScanMasterClock clk; }
ScanChain chain10 { ScanCells chain10_cells[7..0];
ScanLength 8;
ScanIn int_si[9];
ScanOut int_so[9];
ScanMasterClock clk; }
ScanChain chain11 { ScanCells chain11_cells[7..0];
ScanLength 8;
ScanIn int_si[10];
ScanOut int_so[10];
ScanMasterClock clk; }
ScanChain chain12 { ScanCells chain12_cells[7..0];
ScanLength 8;
ScanIn int_si[11];
ScanOut int_so[11];
ScanMasterClock clk; }
}
CompressionStructures comp_compstructures {
Decompressor decompressor {
Vendor MentorGraphics {
// Vendor-specific information. Ignored by other vendors.
ip_version = "1";
n_channels = "2";
}
// LFSM (decompressor ring generator)
//
State lfsm[0] { Data '~edt_reset & (lfsm[1])';
Clock edt_clock; }
State lfsm[1] { Data '~edt_reset & (lfsm[2] ^ edt_channels_in2)';
Clock edt_clock; }
State lfsm[2] { Data '~edt_reset & (lfsm[3])';
Clock edt_clock; }
State lfsm[3] { Data '~edt_reset &
(lfsm[4] ^ lfsm[3] ^ edt_channels_in2)';
Clock edt_clock; }
// phase shifter
//
int_si[0] 'lfsm[0] ^ lfsm[3] ^ lfsm[4]';
int_si[1] 'lfsm[5] ^ lfsm[6] ^ lfsm[7]';
int_si[2] 'lfsm[2] ^ lfsm[3] ^ lfsm[7]';
int_si[3] 'lfsm[0] ^ lfsm[1] ^ lfsm[6]';
int_si[4] 'lfsm[1] ^ lfsm[2] ^ lfsm[4]';
int_si[5] 'lfsm[0] ^ lfsm[2] ^ lfsm[5]';
int_si[6] 'lfsm[4] ^ lfsm[5] ^ lfsm[6]';
int_si[7] 'lfsm[0] ^ lfsm[6] ^ lfsm[7]';
int_si[8] 'lfsm[1] ^ lfsm[5] ^ lfsm[7]';
int_si[9] 'lfsm[2] ^ lfsm[3] ^ lfsm[4]';
int_si[10] 'lfsm[3] ^ lfsm[6] ^ lfsm[7]';
int_si[11] 'lfsm[0] ^ lfsm[2] ^ lfsm[3]';
mask_in 'lfsm[1] ^ lfsm[2] ^ lfsm[3]';
}
Compressor compressor {
Vendor MentorGraphics;
// mask decoder
//
// Note: 'A function of mask_hold[0..5]' is a combinational
// expression whose inputs are connected to mask_hold[0..5].
//
Wire channel1_chain_masks[0] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[1] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[2] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[3] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[4] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[5] 'A function of mask_hold[0..5]';
Wire channel2_chain_masks[0] 'A function of mask_hold[0..5]';
Wire channel2_chain_masks[1] 'A function of mask_hold[0..5]';
Wire channel2_chain_masks[2] 'A function of mask_hold[0..5]';
Wire channel2_chain_masks[3] 'A function of mask_hold[0..5]';
Wire channel2_chain_masks[4] 'A function of mask_hold[0..5]';
Wire channel2_chain_masks[5] 'A function of mask_hold[0..5]';
Environment edt_compression {
CTLMode comp_atpg {
DomainReferences {
Timing comp_timing;
MacroDefs comp_macros;
ScanStructures comp_internal_chains;
CompressionStructures comp_compstructures;
}
Internal {
PatternInformation {
Macro load_unload_and_update_masks { Purpose ControlObserve
LoadMask; }
Macro combinational_pattern { Purpose DoTestOverlap
LoadMask; }
PatternExec scanexec;
}
}
}
PatternExec scanexec {
Timing comb_timing;
PatternBurst scanpats;
}
PatternBurst scanpats {
Purpose Scan;
Identifiers {
EventType TestPatternUnit {
Label pattern { Prefix; Begin; }
}
PatList {
pattern_0 { Protocol Macro "combinational_pattern"; }
}
}
Pattern pattern_0 {
Ann {* Pattern:0 *}
"pattern 0": P {
edt_channels_in1 = 000000110000;
edt_channels_out1 = XXXXXXXXXXXX;
edt_channels_in2 = 000001010000;
edt_channels_out2 = XXXXXXXXXXXX;
_pi_ = XXXX0XXX;
_clks_ = 00;
_po_ = XXXX;
}
Ann {* Pattern:1 *}
"pattern 1": P {
edt_channels_in1 = 101100011000;
edt_channels_out1 = LLLLHHHLXXXX;
edt_channels_in2 = 000011100110;
edt_channels_out2 = LLLHLHHLXXXX;
_pi_ = XXXX0XXX;
_clks_ = 00;
_po_ = XXXX;
}
}
Figure A.5 and Figure A.6 show the decompressor and compactor, respectively, for this example.
phase shifter
int_si[0]
chain 1
int_si[1]
chain 2
edt_channels_in1
edt_channels_in2 LFSM
(decompressor
ring generator)
int_si[11]
chain 12
edt_reset
edt_fast_clock
Figure A.5Decompressor
chain1
chain3
edt_channels_out2
chain12
clk edt_fast_clock
mask decoder
shift timing
clk
edt_update edt_fast_clock
mask_hold register
edt_slow_clock
edt_slow_clock
edt_channels_in1
edt_channels_in2 mask_shift register
STIL 1.0 {
Design 2005;
CTL 2005;
Compression 2006;
}
Header {
Title "CTL describing EDT-like compression circuitry with two-stage
compactor";
Date "Mon Jan 24 20:23:05 PST 2008";
}
Signals {
// functional signals
//
clk In;
fin[2..0] In;
fout[1..0] Out;
// test signals
//
edt_slow_clock In;
edt_fast_clock In;
edt_reset In;
edt_update In;
scan_en In;
edt_channels_in1 In; // ScanIn, scan length defined in ScanGroups
edt_channels_in2 In; // ScanIn, scan length defined in ScanGroups
edt_channels_out1 Out; // ScanOut, scan length defined in ScanGroups
edt_channels_out2 Out; // ScanOut, scan length defined in ScanGroups
// internal signals
//
int_si[0..11] Pseudo;
int_so[0..11] Pseudo;
}
SignalGroups {
// Lengths of compressed scan input and output signals are the same.
// Patterns generated are padded.
// Specifying "12" below is redundant since this is specified
// in DataRateForProtocol.
_si_ = 'edt_channels_in1 + edt_channels_in2' { ScanIn 12; }
_so_ = 'edt_channels_out1 + edt_channels_out2' { ScanOut 12; }
_clks_ = ' edt_fast_clock + edt_slow_clock + clk';
_pi_ = '_si_ + edt_reset + edt_update + scan_en + fin[2..0]';
_po_ = '_so_ + fout[1..0]';
Timing comp_timing {
WaveformTable time {
Period '100ns';
Waveforms {
_pi_ {01X { '0ns' D/U/N; }}
_clks_ {0P { '0ns' D; '40ns' D/U; '50ns' D; }}
_po_ {LHXZ { '0ns' X; '10ns' l/h/X/t; '40ns' X; }}
}
}
}
MacroDefs comp_macros {
load_unload_and_update_masks {
W time;
C { edt_update = 1; edt_reset = 1; scan_en = 1; }
V { clk = 0; edt_fast_clock = P; edt_slow_clock = P;}
C { edt_update = 0; edt_reset = 0; scan_en = 1; }
Shift {
V { clk = P; edt_fast_clock = P; edt_slow_clock = P;
_si_ = #; _so_ = #; }
V { clk = P; edt_fast_clock = P; edt_slow_clock = 0; }
V { clk = P; edt_fast_clock = P; edt_slow_clock = 0; }
V { clk = P; edt_fast_clock = P; edt_slow_clock = 0; }
V { clk = P; edt_fast_clock = P; edt_slow_clock = 0; }
V { clk = P; edt_fast_clock = P; edt_slow_clock = 0; }
V { clk = P; edt_fast_clock = P; edt_slow_clock = 0; }
V { clk = P; edt_fast_clock = P; edt_slow_clock = 0; }
}
}
combinational_pattern {
Macro load_unload_and_update_masks { _si_ = #; _so_ = #; }
W time;
C { edt_fast_clock = 0; edt_slow_clock = 0; }
V { _pi_ = #; clk = #; _po_ = #; }
}
}
ScanStructures comp_internal_chains {
ScanChain chain1 { ScanCells chain1_cells[63..0];
ScanLength 64;
ScanIn int_si[0];
ScanOut int_so[0];
ScanMasterClock clk; }
ScanChain chain2 { ScanCells chain2_cells[63..0];
ScanLength 64;
ScanIn int_si[1];
ScanOut int_so[1];
ScanMasterClock clk; }
ScanChain chain3 { ScanCells chain3_cells[63..0];
ScanLength 64;
ScanIn int_si[2];
ScanOut int_so[2];
ScanMasterClock clk; }
ScanChain chain4 { ScanCells chain4_cells[63..0];
ScanLength 64;
ScanIn int_si[3];
ScanOut int_so[3];
ScanMasterClock clk; }
ScanChain chain5 { ScanCells chain5_cells[63..0];
ScanLength 64;
ScanIn int_si[4];
ScanOut int_so[4];
ScanMasterClock clk; }
ScanChain chain6 { ScanCells chain6_cells[63..0];
ScanLength 64;
ScanIn int_si[5];
ScanOut int_so[5];
ScanMasterClock clk; }
ScanChain chain7 { ScanCells chain7_cells[63..0];
ScanLength 64;
ScanIn int_si[6];
ScanOut int_so[6];
ScanMasterClock clk; }
ScanChain chain8 { ScanCells chain8_cells[63..0];
ScanLength 64;
ScanIn int_si[7];
ScanOut int_so[7];
ScanMasterClock clk; }
ScanChain chain9 { ScanCells chain9_cells[63..0];
ScanLength 64;
ScanIn int_si[8];
ScanOut int_so[8];
ScanMasterClock clk; }
ScanChain chain10 { ScanCells chain10_cells[63..0];
ScanLength 64;
ScanIn int_si[9];
ScanOut int_so[9];
ScanMasterClock clk; }
ScanChain chain11 { ScanCells chain11_cells[63..0];
ScanLength 64;
ScanIn int_si[10];
ScanOut int_so[10];
ScanMasterClock clk; }
ScanChain chain12 { ScanCells chain12_cells[63..0];
ScanLength 64;
ScanIn int_si[11];
ScanOut int_so[11];
ScanMasterClock clk; }
}
CompressionStructures comp_compstructures {
Decompressor decompressor {
Vendor MentorGraphics {
// phase shifter
//
int_si[0] 'lfsm[0] ^ lfsm[3] ^ lfsm[4]';
int_si[1] 'lfsm[5] ^ lfsm[6] ^ lfsm[7]';
int_si[2] 'lfsm[2] ^ lfsm[3] ^ lfsm[7]';
int_si[3] 'lfsm[0] ^ lfsm[1] ^ lfsm[6]';
int_si[4] 'lfsm[1] ^ lfsm[2] ^ lfsm[4]';
int_si[5] 'lfsm[0] ^ lfsm[2] ^ lfsm[5]';
int_si[6] 'lfsm[4] ^ lfsm[5] ^ lfsm[6]';
int_si[7] 'lfsm[0] ^ lfsm[6] ^ lfsm[7]';
int_si[8] 'lfsm[1] ^ lfsm[5] ^ lfsm[7]';
int_si[9] 'lfsm[2] ^ lfsm[3] ^ lfsm[4]';
int_si[10] 'lfsm[3] ^ lfsm[6] ^ lfsm[7]';
int_si[11] 'lfsm[0] ^ lfsm[2] ^ lfsm[3]';
}
Compressor compressor {
Vendor MentorGraphics;
// mask decoder 1
//
// Note: 'A function of mask_hold[0..5]' is a combinational
// expression whose inputs are connected to mask_hold[0..5].
//
Wire channel1_chain_masks[0] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[1] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[2] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[3] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[4] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[5] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[6] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[7] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[8] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[9] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[10] 'A function of mask_hold[0..5]';
Wire channel1_chain_masks[11] 'A function of mask_hold[0..5]';
// mask decoder 2
//
Wire channel2_chain_masks[0] 'A function of mask_hold[0..5]';
Wire channel2_chain_masks[1] 'A function of mask_hold[0..5]';
Wire channel2_chain_masks[2] 'A function of mask_hold[0..5]';
Wire channel2_chain_masks[3] 'A function of mask_hold[0..5]';
Wire channel2_chain_masks[4] 'A function of mask_hold[0..5]';
Wire channel2_chain_masks[5] 'A function of mask_hold[0..5]';
Wire channel2_chain_masks[6] 'A function of mask_hold[0..5]';
Wire channel2_chain_masks[7] 'A function of mask_hold[0..5]';
Environment edt_compression {
CTLMode comp_atpg {
DomainReferences {
Timing comp_timing;
MacroDefs comp_macros;
ScanStructures comp_internal_chains;
CompressionStructures comp_compstructures;
Internal {
_si_ { DataType TestData ScanDataIn { DataRateForProtocol Minimum
12; } }
_so_ { DataType TestData ScanDataOut { DataRateForProtocol Minimum
12; } }
scan_en { DataType TestControl ScanEnable
{ ActiveState ForceUp; AssumedInitialState ForceDown; } }
clk { DataType TestControl ScanMasterClock MasterClock CaptureClock
{ ActiveState U; AssumedInitialState D; } }
edt_fast_clock { DataType TestControl ScanMasterClock MasterClock
{ ActiveState U; AssumedInitialState D;
ConstrainedDuringCapture D;} }
edt_slow_clock { DataType TestControl ScanMasterClock MasterClock
{ ActiveState U; AssumedInitialState D;
ConstrainedDuringCapture D;} }
edt_update { DataType TestControl
{ ActiveState U; AssumedInitialState D; } }
edt_reset { DataType TestControl
{ ActiveState U; AssumedInitialState D; } }
}
PatternInformation {
Macro load_unload_and_update_masks { Purpose ControlObserve
LoadMask; }
Macro combinational_pattern { Purpose DoTestOverlap
LoadMask; }
PatternExec scanexec;
}
}
}
PatternExec scanexec {
Timing comb_timing;
PatternBurst scanpats;
PatternBurst scanpats {
Purpose Scan;
Identifiers {
EventType TestPatternUnit {
Label pattern { Prefix; Begin; }
}
}
PatList {
pattern_0 { Protocol Macro "combinational_pattern"; }
}
}
Pattern pattern_0 {
Ann {* Pattern:0 *}
"pattern 0": P {
edt_channels_in1 = 000000110000;
edt_channels_out1 = XXXXXXXXXXXX;
edt_channels_in2 = 000001010000;
edt_channels_out2 = XXXXXXXXXXXX;
_pi_ = XXXX0XXX;
clk = P;
_po_ = XXXX;
}
Ann {* Pattern:1 *}
"pattern 1": P {
edt_channels_in1 = 101100011000;
edt_channels_out1 = XLLLHHHLHXXX;
edt_channels_in2 = 000011100110;
edt_channels_out2 = XLLHLHHLLXXX;
_pi_ = XXXX0XXX;
clk = P;
_po_ = XXXX;
}
This System on Chip (SoC) comprises of two cores. Each core has its own compression logic. The system
integrator brings the cores together in a top SoC called TOP. The two cores used are combinational core
(from A.1) and EDT-like core (from A.3) and each core has independent on-chip scan compressor and
decompressor logic. The ToP SoC is tested using one test mode with both compression schemes being used
in parallel. No test patterns are being remapped for the cores.
Combinational core: This circuit has four scan inputs and four scan outputs. The inputs use MUXes to break
data dependency; the outputs use XOR gates, which allow some ability to isolate failures. The same clock
(clk) and scan enable (scanenable) go to each flop. For simplicity, each scan chain has only one flop.
Figure A.7 shows the circuit diagram.
EDT-like core: This core requires an edt_clock. There are two scan inputs called edt_channels_in
and two scan outputs called edt_channels_out. The core has 12 internal scan chains with 8 Mux-D
scan cells per scan chain.
TOP
tk_in1 edt_channels_in1
Core: EDT
tk_in2 edt_channels_in2
edt_channels_out1 tk_out1
tk_reset edt_reset
edt_channels_out2 tk_out2
tk_update edt_update
tk_clock edt_clock tk_fout[1..0]
fout[1..0]
tk_fin[2..0] fin[2..0]
scan_en scan_en
clk clk
in0
in0 Core: Comb
out0
out0
in1
in1
out1 out1
in2
in2
out2 out2
in3
in3
out3 out3
scanenable
clk
STIL 1.0 {
Design 2005;
CTL 2005;
Compression 2006;
}
Header {
Title CTL to define multiple core compression circuitry;
Date 2005
}
Signals {
//All EDT signals to top-level
tk_fin[2..0] In;
tk_fout[1..0] Out;
tk_clock In;
tk_reset In;
tk_update In;
scan_en In;
clk In;
tk_in1 In;
tk_in2 In;
tk_out1 Out;
tk_out2 Out;
//All Comb signals to top-level
in0 In {ScanIn;}
in1 In {ScanIn;}
in2 In {ScanIn;}
in3 In {ScanIn;}
out0 Out {ScanOut;}
out1 Out {ScanOut;}
out2 Out {ScanOut;}
out3 Out {ScanOut;}
}
CoreType TK {
// All the example #3 syntax of the TK core is defined here except the
// Environment, Timing, and MacroDefs blocks. Compression equations are
// written to the boundary of the core. The connection to the top level
// is taken from the environment IsConnected statements.
Signals {
clk In;
fin[2..0] In;
fout[1..0] Out;
edt_clock In;
edt_reset In;
edt_update In;
scan_en In;
edt_channels_in1 In;
edt_channels_in2 In;
edt_channels_out1 Out;
edt_channels_out2 Out;
int_si[0..11] Pseudo;
int_so[0..11] Pseudo;
mask_in Pseudo;
} //Signals
SignalGroups {
_si_ = 'edt_channels_in1 + edt_channels_in2;
_so_ = 'edt_channels_out1 + edt_channels_out2';
_clks_ = 'edt_clock + clk';
_pi_ = '_si_ + edt_reset + edt_update + scan_en+fin[2..0]';
_po_ = '_so_ + fout[1..0]';
}
ScanStructures tk_internal_chains {
ScanChain chain1 { ScanCells chain1_cells[7..0];
ScanLength 8;
ScanIn int_si[0];
ScanOut int_so[0];
ScanMasterClock clk; }
ScanChain chain2 { ScanCells chain2_cells[7..0];
ScanLength 8;
ScanIn int_si[1];
ScanOut int_so[1];
ScanMasterClock clk; }
ScanChain chain3 { ScanCells chain3_cells[7..0];
ScanLength 8;
ScanIn int_si[2];
ScanOut int_so[2];
ScanMasterClock clk; }
ScanChain chain4 { ScanCells chain4_cells[7..0];
ScanLength 8;
ScanIn int_si[3];
ScanOut int_so[3];
ScanMasterClock clk; }
ScanChain chain5 { ScanCells chain5_cells[7..0];
ScanLength 8;
ScanIn int_si[4];
ScanOut int_so[4];
ScanMasterClock clk; }
ScanChain chain6 { ScanCells chain6_cells[7..0];
ScanLength 8;
ScanIn int_si[5];
ScanOut int_so[5];
ScanMasterClock clk; }
// The equations for the structures used for compression within the core.
// The equations are written to the boundary of the core which means to
// the signals defined within this CoreType. If Variables are used in the
// original equations for TK they need to be either defined as Pseudo
// Signals within this core, or Variables need to be defined outside the
// CoreType in the CTL.
CompressionStructures comp_compstructures {
Decompressor decompressor {
Vendor MentorGraphics {
// Vendor-specific information.
ip_version = "1";
n_channels = "2";
}
// LFSM (decompressor ring generator)
State lfsm[0] {
Data '~edt_reset & (lfsm[1])';
Clock edt_clock; }
State lfsm[1] {
Data '~edt_reset & (lfsm[2]^edt_channels_in2)';
Clock edt_clock; }
State lfsm[2] {
Data '~edt_reset & (lfsm[3])';
Clock edt_clock; }
State lfsm[3] {
Data '~edt_reset&(lfsm[4]^lfsm[3]^edt_channels_in2)';
Clock edt_clock; }
State lfsm[4] {
Data '~edt_reset & (lfsm[5] ^ lfsm[2] ^ lfsm[3])';
Clock edt_clock; }
State lfsm[5] {
Data '~edt_reset&(lfsm[6]^lfsm[2]^edt_channels_in1)';
Clock edt_clock; }
State lfsm[6] {
Data '~edt_reset & (lfsm[7] ^ lfsm[1])';
Clock edt_clock; }
State lfsm[7] {
Data '~edt_reset & (lfsm[0]^edt_channels_in1)';
Clock edt_clock; }
// phase shifter
//
int_si[0] 'lfsm[0] ^ lfsm[3] ^ lfsm[4]';
int_si[1] 'lfsm[5] ^ lfsm[6] ^ lfsm[7]';
int_si[2] 'lfsm[2] ^ lfsm[3] ^ lfsm[7]';
int_si[3] 'lfsm[0] ^ lfsm[1] ^ lfsm[6]';
int_si[4] 'lfsm[1] ^ lfsm[2] ^ lfsm[4]';
int_si[5] 'lfsm[0] ^ lfsm[2] ^ lfsm[5]';
int_si[6] 'lfsm[4] ^ lfsm[5] ^ lfsm[6]';
int_si[7] 'lfsm[0] ^ lfsm[6] ^ lfsm[7]';
int_si[8] 'lfsm[1] ^ lfsm[5] ^ lfsm[7]';
int_si[9] 'lfsm[2] ^ lfsm[3] ^ lfsm[4]';
int_si[10] 'lfsm[3] ^ lfsm[6] ^ lfsm[7]';
int_si[11] 'lfsm[0] ^ lfsm[2] ^ lfsm[3]';
mask_in 'lfsm[1] ^ lfsm[2] ^ lfsm[3]';
}
Compressor compressor {
Vendor MentorGraphics;
// mask shift register
//
State mask_shift[5] { Data mask_in; Clock edt_clock; }
State mask_shift[4] { Data mask_shift[5]; Clock edt_clock; }
State mask_shift[3] { Data mask_shift[4]; Clock edt_clock; }
State mask_shift[2] { Data mask_shift[3]; Clock edt_clock; }
State mask_shift[1] { Data mask_shift[2]; Clock edt_clock; }
State mask_shift[0] { Data mask_shift[1]; Clock edt_clock; }
// mask hold register
//
State mask_hold[0] { Data 'edt_update ? mask_shift[0]
: mask_hold[0]';
Clock edt_clock; }
State mask_hold[1] { Data 'edt_update ? mask_shift[1]
: mask_hold[1]';
Clock edt_clock; }
} // CoreTypeTK
Flop1/SI in0?in2:in1;
Flop2/SI in0?in1:in2;
Flop3/SI in0?in3:in1;
Flop4/SI in0?in1:in3;
Flop5/SI in0?in2:in3;
Flop6/SI in0?in3:in2;
}
Compressor my_compressor {
Vendor Synopsys {// vendor syntax optional
Compressor_architecture = xor;
}
out0 Flop1/Q ^ Flop2/Q ^ Flop3/Q;
out1 Flop2/Q ^ Flop5/Q ^ Flop6/Q;
out2 Flop1/Q ^ Flop4/Q ^ Flop5/Q;
out3 Flop3/Q ^ Flop4/Q ^ Flop6/Q;
}
}
} // CoreType
// Macros are written to the top level signals. The LHS of the
// assignments are defined in the Signals{} of the current CTL. The RHS
// of the equations represent variables or signal-names at the
// core-level. MacroDefs are same as the ones in the CTL of the core.
MacroDefs both {
load_unload_and_update_masks {
W time;
V { clk = 0; tk_clock = P; tk_update = 1; tk_reset = 1;
scan_en = 1; }
C { tk_update = 0; tk_reset = 0; scan_en = 1; }
X Previous_End_Point;
combinational_pattern {
Macro load_unload_and_update_masks { _sitk_ = #; _sotk_ = #;
_simx_ = #;_somx_ = #;}
W time;
V { _pitk_ = %; _topclks_ = %; _potk_ = %;_simx_ = %;_somx_ =%; }
}
} //MacroDefs TK1
Environment {
CTLMode both1 {
DomainReferences {
MacroDefs both;
ScanStructures coresy:comp_internal_ch coretk:tk_internal_chains;
CompressionStructures coresy:my_compression,
coretk:comp_compstructures;
}
CoreSignal coretk:edt_clock;
}
}
NameMaps scan_chain_anchor_points {
Signals {
coretk:int_si[0] top.edt.scan_in[0];
coretk:int_si[1] top.edt.scan_in[1];
coretk:int_si[2] top.edt.scan_in[2];
coretk:int_si[3] top.edt.scan_in[3];
coretk:int_si[4] top.edt.scan_in[4];
coretk:int_si[5] top.edt.scan_in[5];
coretk:int_si[6] top.edt.scan_in[6];
coretk:int_si[7] top.edt.scan_in[7];
coretk:int_si[8] top.edt.scan_in[8];
coretk:int_si[9] top.edt.scan_in[9];
coretk:int_si[10] top.edt.scan_in[10];
coretk:int_si[11] top.edt.scan_in[11];
coretk:int_so[0] top.edt.scan_out[0];
coretk:int_so[1] top.edt.scan_out[1];
coretk:int_so[2] top.edt.scan_out[2];
coretk:int_so[3] top.edt.scan_out[3];
coretk:int_so[4] top.edt.scan_out[4];
coretk:int_so[5] top.edt.scan_out[5];
coretk:int_so[6] top.edt.scan_out[6];
coretk:int_so[7] top.edt.scan_out[7];
coretk:int_so[8] top.edt.scan_out[8];
coretk:int_so[9] top.edt.scan_out[9];
coretk:int_so[10] top.edt.scan_out[10];
coretk:int_so[11] top.edt.scan_out[11];
The general compression structure used in this example is shown in Figure A.8. It uses scan-in, fan-out for
decompression and MISRs with a space compactor for compression. Because MISRs do not handle
compression of unknown or unpredictable response values, compression using MISRs often include some
form of masking to mask out these unpredictable values before they can get into the MISR. In this case, the
data can be loaded into mask registers using the data path provided by the scan inputs. One or two additional
inputs are used to select for each scan cycle whether masking is to be done and if so, which mask register to
use or to just mask all chains.
The example circuit has four scan inputs (SI[0:3]) and four MISR Observation (MO[0:3]) outputs. The
input decompression is a simple scan-in, fan-out. To keep the example simple, the fan-out factor is 2,
yielding eight internal chains. The output compression uses two MISRs and a space compactor to allow
observation of a composite MISR signature in a single tester cycle. The same clock (CLK) and scan enable
(SE) go to each scan flop and the MISR. For simplicity, each scan chain has only two flops. The scan-in bus
is used to feed both the internal chains, as well as the mask registers.
In this example, there is a separate clock (CML) that is used when loading the mask registers. Two chain
mask enable (CME) signals select one of four possible circuit states on each scan cycle: 00 is no masking;
01 is mask using reg 0, 10 is mask using reg 1, and 11 is mask all channels. Figure A.9 shows the
circuit diagram displaying the logic detail for this compression example.
For this example, there are two mask registers of four bits each. Each mask register bit is shared between
two scan chains such that when masking chain 0 or 1, both chain 0 and 1 are masked; similarly chains 2 and
3, 4 and 5, 6 and 7 are paired and shall be masked together. This helps reduce the overhead for the masking
logic, while somewhat reducing the flexibility of the masking.
SI [0]
SI [1] SI[2] SI[ 3]
0 0 0 0 0 0 0 0
1s
D Q 1s D Q 1s
D Q 1s D Q 1s
D Q 1s D Q 1s
D Q 1s D Q
CLK CLK CLK CLK CLK CLK CLK CLK
0 0 0 0 0 0 0 0
1s D Q 1s D Q 1s D Q 1s D Q 1s D Q 1s D Q 1s D Q 1s D Q
CLK CLK CLK CLK CLK CLK CLK CLK
SE
CME0
CME1
D Q D Q D Q D Q
CM L CML CM L CM L
D Q D Q D Q D Q
CM L CML CM L CM L
RESET
STIL 1.0 {
Design 2005;
CTL 2005;
Compression 2006;
}
Header {
Title CTL to define compression circuitry;
Date 17 April 2006
}
Signals {
SI[0:3] In {ScanIn 2;}
CLK In;
CML In;
RESET In;
SE In;
CME0 In; CME1 In;
MO[0:3] Out;
si0 Pseudo; si1 Pseudo; si2 Pseudo; si3 Pseudo; si4 Pseudo;
si5 Pseudo; si6 Pseudo; si7 Pseudo;
so0 Pseudo; so1 Pseudo; so2 Pseudo; so3 Pseudo; so4 Pseudo;
so5 Pseudo; so6 Pseudo; so7 Pseudo;
}
Timing comp_timing {
WaveformTable scanW {
Period 100ns;
Waveforms {
SI[0]+SI[1]+SI[2]+SI[3]+SE+CME0+CME1 {
01X {0nsD/U/N;
}
}
CLK+CML+RESET {
01PX {0nsD/U/D/N;
50nsD/U/U/N;
60nsD/U/D/N;
}
}
MO[0]+MO[1]+MO[2]+MO[3] {
lhX {0ns X, 10ns l/h/X; 20ns X;}
}
}
}
}
MacroDefs comp_macros {
comp_load_unload {
// this macro assumes overlapping of scan-in with scan-out into the MISRs
W scanW;
C { SE = 1;}
// unload current tests response into MISRs while loading
// the next tests stimulus
Shift { V {SI[0]=#; SI[1]=#; SI[2]=#; SI[3]=#; CME0=#; CME1=#;
CLK=P;}}
// Measure the composite MISR signatures (a single cycle)
V {MO[0]=#; MO[1]=#; MO[2]=#; MO[3]=#;}
// Reset the MISR for the next test
V {RESET=P;}
}
comp_mask_load {
// this macro is invoked prior to comp_load_unload,
// but only if mask registers need to be loaded
W scanW;
C { SE = 1;}
// if both mask registers need to be loaded, the total 8 mask
// register bits get loaded in two cycles.
// if one mask register needs to be loaded, the 4 bits for that
// register can be loaded in a single cycle (like a partial load).
Shift { V {SI[0]=#, SI[1]=#, SI[2]=#, SI[3]=#, CML=P;}}
}
}
ScanStructures comp_internal_chains {
// These internal scan chains are anchored by internal nets si0 si7 and
// so0 so7.
ScanChain intchain0 {ScanCells flop[0] flop[1]; ScanLength 2;
ScanIn si0; ScanOut so0; ScanMasterClock CLK; ScanEnable SE;}
ScanChain intchain1 {ScanCells flop[2] flop[3]; ScanLength 2;
ScanIn si1; ScanOut so1; ScanMasterClock CLK; ScanEnable SE;}
ScanChain intchain2 {ScanCells flop[4] flop[5]; ScanLength 2;
ScanIn si2; ScanOut so2; ScanMasterClock CLK; ScanEnable SE;}
ScanChain intchain3 {ScanCells flop[6] flop[7]; ScanLength 2;
ScanIn si3; ScanOut so3; ScanMasterClock CLK; ScanEnable SE;}
ScanChain intchain4 {ScanCells flop[8] flop[9]; ScanLength 2;
ScanIn si4; ScanOut so4; ScanMasterClock CLK; ScanEnable SE;}
ScanChain intchain5 {ScanCells flop[10] flop[11]; ScanLength 2;
ScanIn si5; ScanOut so5; ScanMasterClock CLK; ScanEnable SE;}
ScanChain intchain6 {ScanCells flop[12] flop[13]; ScanLength 2;
ScanIn si6; ScanOut so6; ScanMasterClock CLK; ScanEnable SE;}
ScanChain intchain7 {ScanCells flop[14] flop[15]; ScanLength 2;
ScanIn si7; ScanOut so7; ScanMasterClock CLK; ScanEnable SE;}
}
ScanStructures comp_mask_chains {
// Note: these are control-only registers
ScanChain maskchain0 {ScanCells mflop[0] mflop[1]; ScanLength 2;
ScanIn SI[0]; ScanMasterClock CML;}
ScanChain maskchain1 {ScanCells mflop[2] mflop[3]; ScanLength 2;
ScanIn SI[1]; ScanMasterClock CML;}
ScanChain maskchain2 {ScanCells mflop[4] mflop[5]; ScanLength 2;
ScanIn SI[2]; ScanMasterClock CML;}
ScanChain maskchain3 {ScanCells mflop[6] mflop[7]; ScanLength 2;
ScanIn SI[3]; ScanMasterClock CML;}
}
CompressionStructures opmisr_mask_fanout {
Compressor opmisr_mask2 {
Vendor Cadence; { // vendor syntax optional
Compressor_Architecture = OPMISR+;
}
Wire masked0 so0 & (~(CME0 & CME1) & ~(CME0 & mflop[0]) &
~(CME1 & mflop[1]);
Wire masked1 so1 & (~(CME0 & CME1) & ~(CME0 & mflop[0]) &
~(CME1 & mflop[1]);
Wire masked2 so2 & (~(CME0 & CME1) & ~(CME0 & mflop[2]) &
~(CME1 & mflop[3]);
Wire masked3 so3 & (~(CME0 & CME1) & ~(CME0 & mflop[2]) &
~(CME1 & mflop[3]);
Wire masked4 so4 & (~(CME0 & CME1) & ~(CME0 & mflop[4]) &
~(CME1 & mflop[5]);
Wire masked5 so5 & (~(CME0 & CME1) & ~(CME0 & mflop[4]) &
~(CME1 & mflop[5]);
Wire masked6 so6 & (~(CME0 & CME1) & ~(CME0 & mflop[6]) &
~(CME1 & mflop[7]);
Wire masked7 so7 & (~(CME0 & CME1) & ~(CME0 & mflop[6]) &
~(CME1 & mflop[7]);
State MISR1[0] { Data MISR1[3] ^ masked0; Clock CLK;
Reset RESET;}
State MISR1[1] { Data MISR1[0] ^ MISR1[3] ^ masked1; Clock CLK;
Reset RESET;}
State MISR1[2] { Data MISR1[1] ^ masked2; Clock CLK;
Reset RESET;}
State MISR1[3] { Data MISR1[2] ^ masked3; Clock CLK;
Reset RESET;}
State MISR2[0] { Data MISR2[3] ^ masked4; Clock CLK;
Reset RESET;}
State MISR2[1] { Data MISR2[0] ^ masked5; Clock CLK;
Reset RESET;}
State MISR2[2] { Data MISR2[1] ^ masked6; Clock CLK;
Reset RESET;}
State MISR2[3] { Data MISR2[2] ^ MISR2[3] ^ masked7; Clock CLK;
Reset RESET;}
MO[0] MISR1[0] ^ MISR2[3];
MO[1] MISR1[1] ^ MISR2[2];
MO[2] MISR1[2] ^ MISR2[1];
MO[3] MISR1[3] ^ MISR2[0];
}
Decompressor fan_out_2 {
Vendor Cadence { // vendor syntax optional
Decompressor_Architecture = fan-out;
}
si0 SI[0];
si1 SI[1];
si2 SI[2];
si3 SI[3];
si4 SI[0];
si5 SI[1];
si6 SI[2];
si7 SI[3];
}
}
Environment opmisr_compression {
NameMaps anchor_points {
Signals { // These signals are in the netlist but not in the diagram
si0 chip.si0;
si1 chip.si1;
si2 chip.si2;
si3 chip.si3;
si4 chip.si4;
si5 chip.si5;
si6 chip.si6;
si7 chip.si7;
so0 chip.so0;
so1 chip.so1;
so2 chip.so2;
so3 chip.so3;
so4 chip.so4;
so5 chip.so5;
so6 chip.so6;
so7 chip.so7;
}
}
CTLMode comp_atpg {
DomainReferences {
Timing comp_timing;
Macrodefs comp_macros;
ScanStructures comp_internal_chains comp_mask_chains;
CompressionStructures opmisr_mask_fanout;
}
Internal {
SI[0:3] { DataType TestData ScanDataIn MaskData
{DataRateForProtocol Minimum 2;}}
// rate is 2 if no mask registers loaded, 3 if loading,
// 1 mask register, and 4 when loading both mask registers
SE {DataType TestControl ScanEnable { ActiveState U;
AssumedInitialState D;}}
// CME1+CME0: 00=no_masking, 01=mask_reg0, 10=mask_reg1,
// 11=mask_all
CME1+CME0 {DataType TestData MaskEnable {DataRateForProtocol
Minimum 2;}
MaskDisable {ActiveState D;} MaskAll {ActiveState U;}}
CLK {DataType TestClock ScanMasterClock MasterClock
{ActiveState U; AssumedInitialState D;}}
CML {DataType TestClock ScanMasterClock MaskData {ActiveState U;
AssumedInitialState D;}}
RESET {DataType TestClock Reset (ActiveState U;
AssumedInitialState D;}}
MO[0:3] {DataType TestData ResponseCompactor
{DataRateForProtocol Average 1;}}
}
External {
SI[0:3] {PadType PrePad; PadValue D;}
MO[0:3] {PadType PostPad; PadValue X;}
}
PatternInformation {
Macro comp_load_unload {Purpose ControlObserve, ResetSignature,
ObserveSignature;}
Macro comp_mask_load {Purpose LoadMask;}
}
}
}