Feedthrough insertion is a subtly crucial task that naturally arises in hierarchical digital design. There are several types of approaches we can use to allow signals to traverse across a chip, but the most common and effective I've seen is where buffers are inserted in neighboring partitions. This eliminates top-level routing and more importantly takes the top-level timing closure task and makes it part of block-level timing closure. In Encounter this capability is accessed through the TCL command insertPtnFeedthrough.
Here's a picture to describe what I'm talking about. Say we have 3 partitions: a, b, and c. A signal that originates in "a" and connects to "c" traverses over "b":
If we don't perform feedthrough insertion, what we'll get is a net that traverses over partition "b". This is unacceptable in scenarios where all layers are reserved for partitions, and in scenarios where some layers are reserved for over the block-routing we get into a difficult situation because we can't insert buffers on nets that exceed the maximum distance required for rebuffering. See below what the design would look like after buffering without feedthrough insertion:
If we use insertPtnFeedthrough, the tool will:
Here's what the design would look like after feedthrough insertion (insertPtnFeedthrough -chanLess -bufCell BUFX1 -doubleBuffer) prior to partitioning:
- Insert buffers within "b" for each entrance and (optionally) exit required to traverse the partition.
- Create new ports as needed on the partitions to make new connections. In this case, 1 new input and 1 new output port is needed on "b".
- Create new top-level logical nets as needed to connect to the new ports.
Once the buffers have been inserted we can place the partition pins (assignPtnPin) and commit the partitions (partition is the command). The result should be a design where connections between neighboring partitions consist of only 2-pin nets between abutted edges (or in the case of design with small roughly 10 microns channels, short jumper wires connecting the partitions):
So that's how feedthrough works in its simplest sense. In this context it's tempting to consider writing a script to do this at the logic synthesis stage. But feedthrough insertion is much more complex in practice. In upcoming blog posts I plan to focus on more advanced scenarios to give you a sense of what to prepare for in terms of making sure the tools you're using are up to the task.
I'd love it if you subscribed to our Digital Implementation RSS feed -or- via E-mail at the form on the right side of this page so we can continue the conversation.