Differential Pair routing not connecting


I am trying to route a very simple differential pair. I named the nets with +/- respectively and i can start routing but Kicad won’t let me finish the connection. Either the differential pair disappears completely when i hover over the pad where it should connect or it draws the signal through the pad where it should connect to.

See picture

Version is Kicad 5.1.6 on Windows 10.

Any ideas what’s the issue here?


I often get such situations, I assumed that the pads are to far away from each other to be routed properly, my work around is to stop before reaching the final pads and then route the individual signals. Sometime it helps also to route in the opposite direction (in your case, from the THT to the SMD)

Of course, check your clearances and track widths to see if the track is at all routable.

Thanks for your reply. Clearances were OK. I also tried from the other side but very similar result. Even tried from both sides and then connect them in the middle but also similar behavior.

I managed to finally get the traces routed now by randomly going up and down a little and then shortening the traces but is the differential routing really that glitchy in Kicad?


To be honest I have done a couple of projects using differential routing with out too much issues, but it all depends on your grid size, clearances, track width, etc.

The tracks normally snap to the target pads, tracks, as such you shouldn’t need to do much fiddling.

Differential pair routing was for me one of arguments to move to KiCad, but I didn’t tried it yet.
Do differential pair routing can make for me both tracks having the same length from beginning to end if on the way they are connected to ESD protection elements and I don’t won’t the track length to be the same before that protection and after but only the whole length have to be the same?

Maybe it’s a strange combination of my board parameters then but it would be good to show some kind of indication of why it can’t complete the route. At least now I know that I’m not doing something totally stupid. Thanks for your help.

Piotr: yes length can be matched for every segment of a track from what I have seen by playing around with the tools but, since I’m also just starting out, I don’t have much experience.

Differential routing can be done only for those nets that have the same name but the final letter is (+/-) or (P/N), as such, if you have and element in between you have to make sure that the net continuation also has the (+/-) or (P/N)

Signal1_+ ----------- +            + --Signal1_Cont+ -------->
Signal2_- ----------- +            + --Signal2_Cont- -------->

The length matching will be done later with meanders to the desired target length.

EDIT: The drawing makes no sense now, as it was automatically corrected :frowning:

it can be the combination of your settings, if you care, you could make a minimum example a share it here (the THT component and the SMD component are more than enough), maybe others can take a look and make better suggestions or even flag a bug.

I had never routed a differential pair before, so I made a little test myself, and I made this:

On the first try I had some trouble connecting to the THT connector, and then I discovered you need to add at least one intermediate fixation point after you start the differential track before you connect to the end.

When I did that, both ends of the pair got connected as expected.

I do find it a bit disappointing that if you drag one of the tracks of a differential pair, the Interactive Router treats them as separate traces and the coupling is lost:

Because I already made a test case, I thought I might as well share the projgect:
asdf_adapter_2020-06-03.zip (6.2 KB)

1 Like

I don’t have the element in serie so I have the same net before and after it. I just have the SOT23-6 ESD protection element for 2 pairs. One pair goes through pins 1 and 3. So one track goes to pin 3 and then out of SOT package goes forward near pin 1. The second comes near pin 3 under SOT package and to pin 1 and further. Second pair is done symmetric.
In my previous program I had to count manually (spreadsheet) all segments of my meanders near a connector at one end of my wires. I supposed if I will have the same situation KiCad will do it for me, but later I began to have doubts if that ESD element will not confuse KiCad. I plan to check it, but as never tried differential pair routing in KiCad I can suppose that if I will be having a problems to get what I wont I will be not sure if it is because ‘not possible’ or because I don’t know how to do it.
So it would be good to know if it is possible or not. When I sow this thread I decided to ask - may be you just know.

Good to know, but what I wont is opposite - I wont to have segments not matched, but the whole length matched.

Good to know.
But at your screenshots tracks not look be matched in length.

As I posted before, this is my first ever diffential pair.
I have not done the length matching yet, and am experimenting with it now.

For differential pairs you have to match each segment.
If you have vias in the pair, you have to make them symmetrical. I think that ideally you even have length match before and after a 90 degree bend.

How critical this is depends on your flank speed. For example for USB2 it’s much less critical than for USB3. Think of it as 2 electrons leaving the die (not the pins on the outside of the package! (You can enter distance from die to package pin somewhere)) at the same time, have to run parallel through the differential pair the hole distance between start and finish. You always have to do length matching as close to where the discontinuity is generated.

I supposed differential pair routing takes care of length matching. So from what you wrote I understand that I have to decide what length I need and then ask KiCad to do it for me for each track.
Do KiCad will count the length for whole track (I need it) or only from the last pad (in my case that ESD protection element) (I don’t need it)?
I am busy with something other (not KiCad) now, so asked only as sow the right topic appeared.

This video show how does it work, it is a bit old, so the menu have changed and the location of the features is somewhere else, but the matching is as before, you can then make the meanders tighter or change their amplitude.

You define a target lenght for your signal, per default it is set to 100mm if I remember correctly.

What I wont is not to match segments but only the whole length.
Here is how I have done it previously.

I have no place for meanders at one side of my ESD protector.
As normally ESD protector in ‘not seen’ I don’t care of matching lengths before and after it.

I have seen it when it was young :slight_smile:
Don’t remember if there were answer for my question.
Have other thing to do and my time is shortening. I will see it once more and do my experiments when come to that problem.
I asked only to get info if matching is possible for whole length even if tracks go through something on the way.

I did a bit of experimentation, you can only match the lenght of the segment:

Here you can see the length of the complete signal:

and here the length of the last segment:

When matching the length, it is shown the length of the last segment:

@Juanjuan I was unable to reach the THT pins even with very small grid and small clearences and widths, when I was routing the tracks in between two THT pins (tracks where simply not going past the obstacle), however when I try to route the signals throgh the pin, the tracks automatically went around.

This is totally irrelevant but I remember from high school physics that electrons don’t actually travel very far. In fact an electron from the negative pole of a battery connected by a wire to the positive pole will not make it to the positive pole within the lifetime of the battery. It’s easy to verify from the electron density of metal. It’s the phenomenon that propagates of course. But if the mental image helps, go ahead.

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.