synthesis fixing techniques

Timing fixing in synthesis
    - Logic Restructuring  
    - Boundary Optimization  
    - Pipelining  
    - Group-path  
    - Flattening  
    - Adaptive retiming  
    - MCP (Multicycle Path)  

Area fixing in synthesis
    - Multi-bit flops  
    - Boundary Optimization 
    - Logic Restructuring  

Power fixing in synthesis
    - Multi-bit flops  
    - Boundary Optimization  
    - Clock-gate  




    Advanced DFT: Real-Time Debugging, Challenges & Scan Compression Techniques

     

    Advanced DFT: Real-Time Debugging, Challenges & Scan Compression Techniques

    🔹 Real-Time Debugging Scenarios in DFT

    1️⃣ Scan Chain Debugging (Shift Errors & Scan Integrity Issues)

    Problem: Incorrect data shifting in the scan chain leads to test failures.
    Possible Causes:

    • Misconnected or broken scan chains.
    • Hold timing violations in scan paths.
    • Incorrect scan enable (SE) control.

    Debugging Approach:

    • Run scan shift test with simple patterns (101010... or 11110000...).
    • Verify scan input-to-output connectivity.
    • Check hold timing during shift operation.

    Command (Check Scan Chain Integrity in Synopsys DFT Compiler)

    report_scan_chains
    report_dft -scan_connectivity
    

    2️⃣ ATPG Failures & Low Fault Coverage

    Problem: ATPG reports low fault coverage (< 98%).
    Possible Causes:

    • Uncontrolled/unobservable logic.
    • X-values in scan chains due to floating signals.
    • Incorrect scan chain connection.

    Debugging Approach:

    • Identify uncontrollable/unobservable points.
    • Enable test points (testable registers) for scan observability.
    • Use X-masking to avoid unknown states.

    Command (Generate Fault Report in Synopsys TetraMAX)

    report_faults -summary
    

    3️⃣ JTAG TAP Controller Fails in Board Testing

    Problem: Boundary scan chain does not respond in IEEE 1149.1 (JTAG) testing.
    Possible Causes:

    • TAP (Test Access Port) controller misconfigured.
    • Incorrect TDI-TDO connections.
    • Power issues in JTAG pins.

    Debugging Approach:

    • Run JTAG IDCODE test (Instruction 0001).
    • Check TAP state transitions using an oscilloscope.
    • Verify JTAG control signals TMS, TCK, TDI, TDO.

    Command (Verify JTAG TAP in Synopsys)

    report_jtag -summary
    

    🔹 Challenges in DFT & How to Overcome Them

    DFT Challenge Cause Solution
    Scan chain routing congestion Too many scan paths Use scan chain reordering & grouping
    High shift power consumption Simultaneous switching of many FFs Use power-aware scan stitching
    X-values in scan patterns Floating values, uninitialized memories Use X-masking & ATPG constraints
    Low test coverage Uncontrollable logic, unscanned FFs Insert test points & better pattern generation
    Scan compression inefficiency Poor compaction ratio Optimize compaction logic & balancing

    🔹 Advanced Scan Compression Techniques

    1️⃣ X-Masking (Handling Unknown Values in Scan Chains)

    Problem: X-values reduce ATPG efficiency & coverage.
    Solution: X-mask registers block Xs during scan capture.

    Command (X-Masking in Synopsys DFT Compiler)

    set_dft_configuration -x_handling xmask
    insert_dft
    

    2️⃣ Adaptive Scan Compression (Dynamic Test Data Reduction)

    Problem: Traditional scan compression reduces test time but not dynamically.
    Solution: Adaptive compression selects only needed patterns.

    Command (Enable Scan Compression in Synopsys)

    set_scan_compression -enable
    insert_dft
    

    3️⃣ Test Points Insertion (Improve Observability & Controllability)

    Problem: ATPG detects unobservable faults.
    Solution: Add test points (TPs) to improve controllability.

    Command (Enable Test Point Insertion in Synopsys DFT)

    set_dft_configuration -test_point_insertion enable
    

    🔹 Summary: How to Optimize DFT for Real-World Use?

     Debug scan failures using scan shift tests.
     Improve ATPG fault coverage with test points & X-masking.
     Fix JTAG issues by verifying TAP controller states.
     Reduce test cost & power with adaptive scan compression.
     Use DFT tools like TetraMAX, Tessent, and Modus for testing.


    Design for Testability (DFT)

     

    Design for Testability (DFT) in VLSI

    🔹 What is DFT?

    Design for Testability (DFT) refers to techniques used to make an integrated circuit (IC) testable after fabrication. It ensures fault detection and diagnosis using structured testing methods, reducing manufacturing defects and improving yield.


    🔹 Why is DFT Important?

    Without DFT, testing an IC with millions to billions of transistors is impractical. DFT helps:
     Detect manufacturing defects (stuck-at faults, shorts, opens).
     Improve fault coverage using structured test techniques.
     Reduce test time and cost with scan-based approaches.
     Enable in-system testing using Built-In Self-Test (BIST).


    1️⃣ Key Techniques in DFT

    1. Scan Chain (Full Scan & Partial Scan)

    🔹 Why? Converts sequential circuits into easily testable structures.
    🔹 How? Replaces flip-flops (FFs) with scan flip-flops (SFFs) that shift test patterns.

    Example (Full Scan Insertion in Synopsys DC)

    set_scan_configuration -style multiplexed_flip_flop
    insert_dft
    

    Full Scan: Converts all FFs into scan FFs (high test coverage).
    Partial Scan: Converts selected FFs to reduce area overhead.


    2. ATPG (Automatic Test Pattern Generation)

    🔹 Why? Generates test patterns to detect faults automatically.
    🔹 How? Uses tools like TetraMAX (Synopsys), FastScan (Mentor).

    Example (ATPG Command for Stuck-at Faults in TetraMAX)

    set_faults -stuck
    run_atpg
    report_faults
    

    Stuck-at Faults: Models logic gates stuck at 0 or 1.
    Transition Faults: Detects delay faults in the circuit.


    3. Built-In Self-Test (BIST)

    🔹 Why? Allows self-testing inside the chip without external testers.
    🔹 How? Uses Linear Feedback Shift Registers (LFSRs) for test pattern generation.

    Example (BIST Implementation for Memory Using MBIST)

    create_bist_controller -type MBIST -instance MBIST_CTRL
    add_bist_structure -controller MBIST_CTRL -instance RAM_BLOCK
    

    Logic BIST (LBIST): Tests combinational logic.
    Memory BIST (MBIST): Tests embedded memories.


    4. JTAG (IEEE 1149.1 - Boundary Scan)

    🔹 Why? Enables board-level testing without physical probing.
    🔹 How? Adds a Test Access Port (TAP) for scan-based testing.

    Example (Enabling JTAG in Synopsys)

    set_dft_configuration -jtag_enable true
    insert_dft
    

     Used in board-level debugging and in-system programming.


    5. Test Compression (Scan Compression & X-Handling)

    🔹 Why? Reduces test data volume and test time.
    🔹 How? Uses compactors to merge test responses.

    Example (Scan Compression in Synopsys DFT Compiler)

    set_scan_compression -enable
    insert_dft
    

    X-Masking: Handles unknown values (X) during scan testing.
    Compaction: Reduces scan chain length for faster testing.


    2️⃣ Fault Models in DFT

    Fault Model Description Detection Method
    Stuck-at Fault (SAF) A node is permanently 0 or 1 ATPG with stuck-at test patterns
    Transition Fault (TF) A slow-to-rise/fall delay defect Launch-on-capture (LOC) or Launch-on-shift (LOS)
    Bridging Fault (BF) Two wires are accidentally connected IDDX Testing, Pattern-based ATPG
    Open Fault (OF) A break in a wire or via Voltage-based and delay tests
    Small Delay Defect (SDD) Minor timing variations causing failures Path delay ATPG, Speed binning

    3️⃣ DFT Implementation Flow

    Step 1: RTL Design with DFT Guidelines

    • Use DFT-friendly coding (avoid latches, asynchronous resets).
    • Partition design into scan-friendly blocks.

    Step 2: Scan Chain Insertion

    • Convert FFs into scan FFs.
    • Connect them into scan chains.

    Step 3: ATPG & Fault Coverage Analysis

    • Generate test patterns for stuck-at, transition faults.
    • Run fault simulation to measure coverage.

    Step 4: JTAG & BIST Integration (Optional)

    • Enable JTAG (IEEE 1149.1) for boundary scan.
    • Add BIST for self-testing memory & logic.

    Step 5: Test Compression for High-Volume Production

    • Reduce scan test data & time using compaction.

    Step 6: Physical Design & Post-Silicon Testing

    • Ensure scan routing is optimized to avoid congestion.
    • Perform wafer & final chip testing using ATE (Automatic Test Equipment).

    4️⃣ Key DFT Tools

    Tool Function
    Synopsys DFT Compiler Scan insertion, ATPG
    Mentor Tessent ATPG, scan compression
    Cadence Modus Scan & test pattern compression
    Synopsys TetraMAX ATPG & fault simulation
    JTAG ProVision JTAG boundary scan

    5️⃣ Advantages of DFT in VLSI

    Increases fault coverage (detects hidden defects).
    Reduces test cost (fewer tester resources required).
    Enables in-system testing (JTAG, BIST).
    Improves yield & reliability (early fault detection).
    Ensures better manufacturability (scan-friendly design).


     Conclusion

     DFT simplifies post-silicon testing and increases production yield.
     Techniques like Scan Chains, ATPG, BIST, and JTAG enable effective testing.
    Fault models (Stuck-at, Transition, Bridging) ensure defect detection.
     DFT tools like DFT Compiler, Tessent, and TetraMAX automate test generation.


    Synthesis Fixes & Optimization Techniques

     

    Synthesis Fixes & Optimization Techniques in Physical Design

    🔹 What is Synthesis?

    Synthesis converts RTL (Verilog/VHDL) into gate-level netlist, optimizing for timing, area, and power. Key techniques help fix common issues like timing violations, high area, and power consumption.


     Fixes & Optimization Techniques in Synthesis

    1️⃣ Timing Optimization Techniques

    Timing closure requires fixing setup and hold violations.

    Setup Violation Fixes (Reduce Path Delay)

    • Logic Restructuring: Reduce logic depth.
    • Pipelining: Add registers to break long combinational paths.
    • Cell Upsizing: Replace slower cells with faster ones.
    • Retiming: Move registers across logic to balance delay.

    Example (Synopsys DC Command for Timing Optimization)

    set_max_delay 2.0 -from REG1 -to REG2
    compile -timing
    

    Hold Violation Fixes (Increase Data Path Delay)

    • Buffer Insertion: Add delay buffers.
    • Cell Downsizing: Use slower cells to delay signal propagation.
    • Routing Detour: Increase path length artificially.

    Example (Fix Hold Timing in Synopsys DC)

    set_fix_hold [all_clocks] -max_delay 0.1
    

    2️⃣ Area Optimization Techniques

    Reducing gate count helps minimize area without affecting performance.

    Techniques to Reduce Area

    • Logic Sharing: Merge duplicate logic.
    • Resource Sharing: Use multiplexers instead of separate units.
    • Reduce Fanout: Limit the number of loads per cell.
    • Use Multi-bit Flip-Flops (MBFFs): Reduces cell count.

    Example (Minimize Area in Synopsys DC)

    set_max_area 50000
    compile -area
    

    3️⃣ Power Optimization Techniques

    Reducing dynamic and leakage power is crucial for low-power design.

    Dynamic Power Optimization (Reduces Switching Activity)

    • Clock Gating: Turns off clocks when not needed.
    • Data Gating: Blocks unnecessary data transitions.

    Example (Clock Gating in Synopsys DC)

    set_clock_gating_style -sequential_cell DFF -control_signal EN
    compile -power
    

    Leakage Power Optimization (Reduces Static Power Consumption)

    • Use Low-Vt Cells: Lower leakage transistors.
    • Power Gating: Turn off power to unused blocks.

    Example (Power Gating with UPF in DC)

    create_power_domain PD_BLOCK -elements {u_block}
    set_retention PD_BLOCK -retention_signal RET_EN -retention_supply VDD_RET
    

    4️⃣ Clock Tree Optimization Techniques

    A well-balanced Clock Tree Synthesis (CTS) reduces skew and latency.

    Clock Skew Reduction

    • Use Clock Buffers: Distribute clock uniformly.
    • Balancing Clock Paths: Equalize delays across flops.

    Example (Max Skew Constraint in DC)

    set_clock_uncertainty 0.2 [get_clocks clk]
    

    Clock Latency Reduction

    • Place Clock Sources Close to Sinks.
    • Reduce Number of Buffers in the path.

    5️⃣ Latch & FSM Optimization Techniques

    Avoid unwanted latches and improve FSM efficiency.

    Latch Removal

    • Ensure every variable has a default assignment.
    • Use synchronous always blocks for sequential logic.

    Example (Avoid Latches in Verilog)

    always @(*) begin
        if (en)
            out = data;
        else
            out = 0;  // Ensure default assignment
    end
    

    FSM Optimization

    • One-Hot Encoding for speed.
    • Binary Encoding for area.
    • Gray Encoding for low power.

    Example (FSM Optimization in DC)

    set_fsm_encoding style onehot
    compile
    

     Summary of Key Synthesis Fixes

    Issue Fixes & Techniques
    Setup Violations Pipelining, cell upsizing, retiming
    Hold Violations Buffer insertion, cell downsizing
    High Area Logic sharing, multi-bit flip-flops (MBFF)
    High Power Clock gating, power gating, low-Vt cells
    Clock Skew Balanced CTS, clock buffer insertion
    Unintended Latches Use proper sensitivity list in RTL
    FSM Optimization One-hot encoding for speed, Gray for low power

     Key Commands for Synthesis in Synopsys Design Compiler

    Optimization Command
    Timing Optimization compile -timing
    Area Optimization compile -area
    Power Optimization compile -power
    Clock Gating set_clock_gating_style
    FSM Encoding set_fsm_encoding
    Fix Hold Violations set_fix_hold


    UPF Commands

     

    Common UPF Commands Used in Real-Time Projects

    Unified Power Format (UPF) is essential for low-power design, allowing power intent specification separately from RTL. Below are key UPF commands used in real-world VLSI projects:


    1️⃣ Power Domains Definition

    🔹 Why? Defines separate power regions in the design.
    🔹 Example: Two power domains: PD_CORE and PD_IO.

    UPF Command Example:

    create_power_domain PD_CORE -elements {u_core}
    create_power_domain PD_IO -elements {u_io}
    

    2️⃣ Power Supply Network

    🔹 Why? Defines voltage sources and connections to power domains.
    🔹 Example: VDD_CORE at 0.9V, VDD_IO at 1.8V.

    UPF Command Example:

    create_supply_net VDD_CORE
    create_supply_port -direction in VDD_CORE
    set_voltage VDD_CORE 0.9
    
    create_supply_net VDD_IO
    create_supply_port -direction in VDD_IO
    set_voltage VDD_IO 1.8
    

    3️⃣ Power Switch Definition

    🔹 Why? Used for power gating to control power to a domain.
    🔹 Example: Switch SW_CORE controls PD_CORE using VDD_CORE.

    UPF Command Example:

    create_power_switch SW_CORE -domain PD_CORE \
        -input_supply VDD_CORE -output_supply VSW_CORE \
        -control_port EN_SW
    

    4️⃣ Isolation Strategy

    🔹 Why? Prevents floating signals when one domain is OFF.
    🔹 Example: PD_CORE needs isolation when PD_IO is ON.

    UPF Command Example:

    set_isolation ISOL_CORE \
        -domain PD_CORE \
        -clamp_value 0 \
        -isolation_signal ISO_EN -isolation_high
    

    5️⃣ Level Shifter Definition

    🔹 Why? Handles voltage mismatches between power domains.
    🔹 Example: Connecting PD_CORE (0.9V) and PD_IO (1.8V).

    UPF Command Example:

    set_level_shifter LS_CORE_IO \
        -from PD_CORE -to PD_IO \
        -level_shifter_type down
    

    6️⃣ Retention Strategy

    🔹 Why? Saves state when power is OFF.
    🔹 Example: Retains REG_CORE in PD_CORE using SAVE_EN.

    UPF Command Example:

    set_retention RET_CORE \
        -domain PD_CORE \
        -retention_signal SAVE_EN \
        -retention_supply VDD_CORE_RET
    

    7️⃣ Power Intent Verification

    🔹 Why? Validates UPF integrity in the design.
    🔹 Example: Reports all power domains and connections.

    UPF Command Example:

    report_power_domains
    report_isolation
    report_level_shifters
    report_retention
    

    8️⃣ Binding UPF to RTL

    🔹 Why? Connects UPF with the RTL for synthesis & verification.

    UPF Command Example:

    read_upf top_design.upf
    read_verilog top_design.v
    link_design
    

    Conclusion

    🔹 UPF commands ensure power-aware design implementation by defining:
    Power domains (create_power_domain)
    Voltage sources (create_supply_net)
    Power switches (create_power_switch)
    Isolation and level shifters (set_isolation, set_level_shifter)
    State retention (set_retention)


    False Path, Disable Timing Path, and Case Analysis


    False Path, Disable Timing Path, and Case Analysis 

    In Static Timing Analysis (STA), we use timing exceptions to relax unnecessary paths, making timing closure easier. The three key timing exceptions are False Paths, Disable Timing Paths, and Case Analysis.


    1. False Path (FP)

     Definition:

    A false path is a timing path that will never be activated during normal operation. Even though tools report violations on this path, it should be ignored.

    🔹 Real-World Example:

    In a design with two asynchronous clock domains (clk1 and clk2), a data path exists but is not functionally used. Since the clocks are not related, timing closure on this path is unnecessary.

     Fix: Ignore the path using a False Path constraint

    Command Example (Synopsys PrimeTime, Cadence Tempus, Synopsys ICC2)

    set_false_path -from [get_clocks clk1] -to [get_clocks clk2]
    

    (This tells STA tools to ignore timing violations between clk1 and clk2.)

    🛠 Debugging a False Path

    Check Clocks: Verify if clocks are truly asynchronous using report_clocks.
    Analyze Paths: Run report_timing before and after applying set_false_path.
    Confirm Functional Validity: Ensure no real data transfer occurs between these registers.


    2. Disable Timing Path (DTP)

     Definition:

    A disable timing path removes a specific timing arc inside a combinational cell from analysis.

    🔹 Real-World Example:

    A multiplexer (MUX) has two inputs (A and B), but due to a control condition, the A → Y path will never be active. The STA tool still analyzes it, causing unnecessary timing violations.

     Fix: Disable the specific timing arc

    Command Example (Synopsys PrimeTime, Cadence Tempus)

    set_disable_timing U1 -from A -to Y
    

    (Disables timing checks for path A → Y inside instance U1.)

    🛠 Debugging a Disabled Timing Path

    Check the cell: Use report_timing -from A -to Y to confirm the arc exists.
    Confirm logic condition: Ensure the A → Y transition is never functionally possible.
    Analyze tool impact: Verify the change in timing reports after applying set_disable_timing.


    3. Case Analysis (CA)

     Definition:

    Case analysis is used when a signal is statically fixed (0 or 1) in a specific operation mode. This helps eliminate unnecessary timing paths.

    🔹 Real-World Example:

    A mode selection signal (MODE_SEL) determines whether a circuit operates in Test Mode or Functional Mode. In Functional Mode, MODE_SEL = 1, meaning all paths related to MODE_SEL = 0 should be ignored.

     Fix: Apply Case Analysis to simplify timing

    Command Example (Synopsys PrimeTime, Cadence Tempus)

    set_case_analysis 1 [get_ports MODE_SEL]
    

    (Forces MODE_SEL = 1, ignoring timing paths associated with MODE_SEL = 0.)

    🛠 Debugging Case Analysis

    Check the logic: Use report_timing to see if paths related to MODE_SEL = 0 are removed.
    Confirm fixed behavior: Ensure MODE_SEL is not dynamically changing.
    Use RTL Constraints: If the condition is permanent, fix it in the RTL instead of STA constraints.


    4. Key Differences & Summary

    Feature False Path Disable Timing Path Case Analysis
    What it Ignores Entire timing path A specific timing arc Paths related to fixed conditions
    Used For Async clock paths, functionally inactive paths Unused logic within a cell Statically fixed signals
    Example Path between clk1 and clk2 A → Y transition in a MUX MODE_SEL = 1 removes MODE_SEL = 0 paths
    Command set_false_path set_disable_timing set_case_analysis
    Debugging Tip Ensure real async clocks Verify timing arcs Confirm fixed values

    5. Conclusion

    • False Path: Used for entire paths that will never be active.
    • Disable Timing: Used to remove specific arcs in combinational cells.
    • Case Analysis: Used to fix signal values and simplify timing.


    LATENCY AND SKEW REDUCTION TECHNIQUES IN CTS

     

    Latency and Skew Reduction Techniques in Physical Design

    1. Introduction

    In Clock Tree Synthesis (CTS), latency and skew directly impact timing closure and overall chip performance.

    • Clock Latency: The total delay from the clock source to the registers.
    • Clock Skew: The difference in clock arrival times between registers.

    Goal: Reduce latency and skew while ensuring balanced and optimized clock distribution.


    2. Techniques to Reduce Latency and Skew

    1️⃣ Use Balanced Clock Tree Topologies

    🔹 Why? Unbalanced clock trees cause high skew and timing violations.
    🔹 Fix:
    ✔ Use H-Tree or X-Tree structures for uniform distribution.
    ✔ Avoid asymmetrical buffering, which causes delays.

     Command Example (Cadence Innovus - Enable H-Tree CTS):

    setCTSMode -clockTopology H-tree
    createClockTree
    

    (Forces an H-tree structure for balanced clock distribution.)


    2️⃣ Clock Buffer Sizing and Placement Optimization

    🔹 Why? Incorrect buffer placement increases clock latency.
    🔹 Fix:
    Use high-drive strength buffers in long paths to reduce delay.
    Place clock buffers symmetrically to balance delays.

     Command Example (Synopsys ICC2 - Use Strong Buffers for Clock Paths):

    setOptMode -bufferSize large
    clock_opt
    

    (Uses large buffers for better clock distribution and lower skew.)


    3️⃣ Clock Shielding to Reduce Crosstalk Noise

    🔹 Why? Clock nets are sensitive to noise and delay variations due to crosstalk.
    🔹 Fix:
    ✔ Use ground shielding on critical clock nets.
    ✔ Route clock signals away from high-switching nets.

     Command Example (Cadence Innovus - Add Clock Shields):

    createShield -nets {clk} -layer M4 -type ground
    routeClockTree
    

    (Adds ground shields around the clock network to prevent noise coupling.)


    4️⃣ Skew Balancing Using Buffer Insertion

    🔹 Why? Uneven buffer distribution creates skew.
    🔹 Fix:
    ✔ Insert buffers at proper locations to balance delay.
    ✔ Perform skew-aware clock tree synthesis.

     Command Example (Synopsys ICC2 - Skew Optimization in CTS):

    setCTSMode -skewTarget 50ps
    clock_opt -postCTS
    

    (Optimizes clock skew to target 50ps post-CTS.)


    5️⃣ Adding Useful Clock Gating to Reduce Power and Delay

    🔹 Why? Large clock trees consume excessive power and increase latency.
    🔹 Fix:
    ✔ Insert clock gating cells to turn off idle sections of the clock tree.
    ✔ Use integrated clock gating (ICG) to save power.

     Command Example (Cadence Innovus - Enable Clock Gating):

    set_clock_gating -enable
    clock_opt
    

    (Enables automatic clock gating insertion to reduce power and latency.)


    6️⃣ Metal Layer Selection for Lower RC Delay

    🔹 Why? Lower metal layers (M1-M3) have higher resistance, increasing clock latency.
    🔹 Fix:
    ✔ Route clock nets on higher metal layers (M6-M9) for lower resistance.

     Command Example (Synopsys ICC2 - Force High Metal Routing for Clock):

    setCTSMode -clockRoutingLayer M6
    routeClockTree
    

    (Forces clock routing on M6 to reduce latency.)


    7️⃣ Post-CTS Clock Tree Optimization (ECO Mode)

    🔹 Why? Even after CTS, timing may not be ideal.
    🔹 Fix:
    ✔ Perform ECO adjustments to fix skew and timing violations.
    ✔ Use local buffering and wire tuning for fine adjustments.

     Command Example (Cadence Innovus - ECO Clock Fixes):

    fix_clock_eco -targetSkew 30ps
    

    (Performs an ECO to further reduce clock skew to 30ps.)


    3. CTS Optimization Flow

    Step 1: Choose balanced clock tree topology (H-Tree, X-Tree, Mesh).
    Step 2: Use proper buffer sizing to avoid excessive delays.
    Step 3: Shield clock nets from noisy signals.
    Step 4: Perform clock skew balancing using buffers.
    Step 5: Use high metal layers for routing to minimize resistance.
    Step 6: Apply ECO-based fine-tuning after CTS.