Hi. I’m designing a product that features USB3.2 gen 1 (5 Gbps). The product will be going into production and sold commercially, thus radiated emissions must be limited. I’m going through a list of mitigations, one of which are rounded traces on high frequency signals.
Rounded/curved diff pairs are not (yet) supported by the Kicad router. I’ve looked into the source to see how big of a project a proper implementation would be and god damn is the router complicated, so I’m putting that on the shelf for now.
There are ways to create the rounded/curved diff pairs though. The one method I find least tedious involves creating a footprint, trace length can be recognized by filling in the value for “pad to die”. This method is demonstrated by Hillbrand in this video (https://www.youtube.com/watch?v=k-5CuN7iANQ). It is not without pain though, it takes time to create the footprint, new failure modes in design such as erroneous trace length calculations, no push and shove, etc.
I’ve spend the last day creating a workaround-workflow for rounded/curved traces in Kicad that somewhat ease the burden. Thus far I have only implemented a curve that offsets the differential pair to the side (I call it Strafe, as we used to call sidestepping in video games back in the days). The footprint looks like this when opened in footprint editor:
Workflow:
(0. Have the diffpairs routed to satisfaction, new route would likely cause new curve footprint)
Measure needed offset (e.g. 1 mm to the right)
Call a python script with necessary parameters (diff pair trace width, gap, offset, etc)
The script calculates the primitives of the wanted footprint, in this case there will be 4 arcs and 2 lines, negative offset means an offset to the left.
The script creates the footprint file and names it according to the parameters. Provides calculated “pad to die” for each trace.
Copy of the footprint file to your .pretty footprint library. (currently manual operation)
In eeschema, add a generic symbol for a rounded diffpair segment and select the footprint you just created.
in pcbnew, update pcb from schematic, place the footprint where needed and route the diffpair.
(8. repeat until done)
Far from painless, but at least the effort in creating footprints are now limited. The design below includes 8 (of which 2 are on the bottom side) Strafes/offsets + one 90 degree direction change on the USB 3.2 gen 1. I already had it routed using 45 degree bends, so once the python script was working alright, it took about 20 minutes to replace the hard 45 degree corners with rounded/curved ones. So, using this method, before starting step one the differential pairs shall be fitted in all possible ways using the normal dp router.
Have you thought about first routing single tracks with rounded corners, and then use a script to replace these single tracks with differential pairs? The total width of those should be the same, so it’s seems logical to create a special netclass for this.
It doesn’t support them as in calculating a slightly different radius for them, but in my testing it seems to work well enough. Very minor differences in curvature are pretty unlikely to make any noticeable difference in scenarios like the example in your screenshot. Are you using simulation tools to verify?
I was about to post along these lines. The only downfall is WHEN it rounds it doesn’t adhere to other constraints so there will small area’s where the distances will fail
When looking at my previous screenshot, I noticed that the start (end) of the radii from the horizontal tracks were not aligned vertically. A further test confirms both tracks of the differential pair get the same radius. As a result the tracks are not parallel in between the radii. With 45 degree corners the result is very small, but with a 90 degree corner it’s more pronounced.
For the distance to be constant, the arcs must have the same center point, but this is unfortunately also not so easy in KiCad. One way to get close quickly is to align the ends of the arcs with the side of the drawing canvas. Make the circles around the endpoints touch the vertical edge of the canvas. It’s not perfect, but it’s easy to get close enough.
(If you’ve done the following, please ignore…) I’d confirm with a field solver whether using curved traces actually helps you for EMC compliance over and above 45 degree mitred corners. I note that all the USB 3.2 Gen 1 documentation I can find states that 45 degree corners are fine, so should be fine from a signal integrity point of view, which implies to me that the EMC impact should be minimal too. Might save yourself a whole load of hassle!
Indeed, that to. As far as I know, you have to be well above 3GHz before sharp corners even start becoming a problem at all.
Edit, Addition: At those speeds, you can also be pretty confident the risetime is not much more then the absolute minimum requirement to get the required bandwidth.
Well, USB3.2 Gen 1 is at 5Gbps, so the clock speed is up in the 5 GHz range. No idea what the rise time requirements are (which is where a whole load of higher-frequency guff comes from).