FPGARelated.com

Clock Skew

Category: Timing | Also known as: skew

Clock skew is the difference in arrival time of the same clock edge at two or more points in a digital circuit, caused by differences in routing length, load capacitance, buffer delays, or physical layout. It is a fundamental timing concern in synchronous digital design, particularly as clock frequencies and circuit complexity increase.

In practice

In synchronous logic, every flip-flop ideally sees the clock edge at the same instant. In practice, the clock signal travels through wire and buffers, and no two paths are identical. The resulting skew reduces the effective setup-time margin between registers: if the receiving flip-flop sees the clock earlier than the launching flip-flop, the data has less time to propagate through combinational logic. Conversely, skew in the opposite direction can cause hold-time violations, which are harder to fix after fabrication because they cannot be corrected by slowing the clock.

On FPGAs, dedicated clock routing networks (global clock buffers and clock distribution trees on parts like Xilinx 7-series or Intel Cyclone/Arria families) are designed to minimize skew across the device, typically keeping it in the tens to low hundreds of picoseconds. Routing a clock signal on general-purpose fabric interconnect instead of these dedicated resources is a common mistake that introduces significant and poorly characterized skew. The blog posts "Designing a FPGA Micro Pt1 - Start The Clock" and "Designing a FPGA Micro Pt2 - Clock and Counter build and test" address practical clock network construction on FPGAs where this distinction matters.

On PCBs, skew between multiple clock-driven devices (memory buses, parallel buses, multi-chip synchronous interfaces) is controlled by length-matching clock traces. DDR memory standards, for example, specify tight skew budgets between the clock and data/strobe lines, typically in the range of tens of picoseconds. At lower speeds (below a few tens of MHz), PCB trace skew is usually negligible, but the frequency at which it becomes a dominant concern depends on the interface timing budget, trace lengths, and topology; as a rough guide, it warrants attention above roughly 100 MHz or for any multi-device synchronous bus with a tight timing budget.

Inside MCU and SoC designs, clock distribution networks use H-tree or balanced-buffer-tree topologies to equalize path lengths to all flip-flops. Static timing analysis (STA) tools model skew explicitly; in most flows, a design is not considered timing-clean until the STA tool reports closure with skew accounted for, though the exact criteria are tool- and process-specific. When manually writing HDL for FPGA targets, constraining clocks properly in the timing constraints file is the mechanism that directs the tools to manage skew within a defined clock domain.

Frequently asked

Can clock skew ever be beneficial?
Yes. Intentional skew, sometimes called 'clock skewing' or 'useful skew', can be applied deliberately to borrow time from a path with excess slack and give it to a critical path. This is an advanced technique used in custom ASIC design and some high-end FPGA flows. In most embedded FPGA and PCB work, the goal is simply to minimize skew.
What is the difference between clock skew and clock jitter?
Skew is a deterministic, spatial difference: two physically separate points see the clock edge at different times. Jitter is a temporal variation: the same clock edge arrives at slightly different times cycle to cycle at the same point. Both consume timing margin, but they have different causes and mitigation strategies. A noisy power supply or PLL reference typically increases jitter; unequal routing or buffer delays cause skew.
How do FPGAs manage clock skew?
Most FPGAs provide dedicated global and regional clock routing resources, implemented as balanced buffer trees or H-tree networks, that deliver a clock to all flip-flops in a region with tightly controlled and well-characterized skew. Placing a clock signal on these resources, rather than general fabric routing, is the primary way to control skew on FPGAs such as Xilinx/AMD 7-series, UltraScale, or Intel Cyclone and Arria families.
How does clock skew affect setup and hold timing?
Setup time is affected when the destination register's clock arrives early relative to the source register's clock, shrinking the window for data to propagate. Hold time is affected when the destination register's clock arrives late, meaning data launched on a new edge could overwrite data that has not yet been captured from the previous edge. Hold violations are particularly dangerous because reducing the clock frequency alone does not fix them, though changes to PLL settings, duty cycle, or implementation may affect the underlying timing.
At what point does PCB clock trace skew become a practical concern?
As a rough guide, a 1 cm difference in FR4 trace length produces roughly 60-70 ps of skew (propagation velocity on FR4 depends on stackup and dielectric constant, but is approximately 15-17 cm/ns for typical configurations). At clock frequencies below 20-30 MHz with generous timing margins, this is usually negligible. For DDR memory interfaces, high-speed parallel buses, or any interface with a tight timing budget, even a few millimeters of trace-length mismatch matters and length-matching in the PCB layout becomes necessary.

Differentiators vs similar concepts

Clock skew is often conflated with clock jitter. Skew is a fixed (or slowly varying) spatial offset between clock edges at different nodes in a circuit, rooted in physical routing and buffer asymmetry. Jitter is cycle-to-cycle variation in edge timing at a single node, rooted in noise, supply variation, and PLL characteristics. Both reduce timing margin, but skew appears in static timing analysis as a deterministic offset, while jitter is treated as a statistical or worst-case uncertainty. Clock skew is also distinct from clock drift, which refers to the gradual frequency divergence between independent oscillators over time, a concern for real-time clocks and distributed systems rather than on-chip synchronous logic.