{"id":26432,"date":"2025-07-04T22:03:24","date_gmt":"2025-07-04T22:03:24","guid":{"rendered":"https:\/\/wattsemi.com\/?p=26432"},"modified":"2025-07-04T22:13:42","modified_gmt":"2025-07-04T22:13:42","slug":"inserting-feedthrough-signals-through-a-collapsible-power-domain-block","status":"publish","type":"post","link":"https:\/\/wattsemi.com\/?p=26432","title":{"rendered":"Inserting FeedThrough signals through a collapsible power domain block"},"content":{"rendered":"\n<p class=\"has-vivid-cyan-blue-color has-text-color has-link-color wp-elements-bb050dfc97ba0a3b49bf62b78554a522\">ASIC Low Power Physical Design: Inserting FeedThroughs:<\/p>\n\n\n\n<p>Ever wonder how complex Feedthrough signals are routed between two Hard Macros when propagating through collapsible blocks, while navigating the challenges of meeting STA timing, routing congestion and UPF constrains with isolation cells? <\/p>\n\n\n\n<p class=\"has-vivid-cyan-blue-color has-text-color has-link-color wp-elements-7a1a0d67338abb326d5386de5c328611\">Here\u2019s a simplified and structured approach on the basics of how to handle <strong>domain crossings<\/strong> for feedthrough buffers in <strong>collapsible power domains<\/strong> while ensuring <strong>always-on (AON) buffer placement<\/strong>. <br>We will refer to Synopsys Fusion Compiler commands for this example.<br><br><br><strong>Key Steps Explained<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Layer Selection<\/strong>: Use upper metals (e.g., <code>M4\/M5<\/code>) for feedthroughs to avoid block-level routing.<\/li>\n\n\n\n<li><strong>Blockage Alignment<\/strong>: Ensure feedthroughs don\u2019t overlap macros or power straps.<\/li>\n\n\n\n<li><strong>Hierarchical Flow<\/strong>: Save feedthroughs in DEF for top-level integration.<\/li>\n<\/ul>\n\n\n\n<p><strong>Port Creation<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>create_port<\/code> adds feedthrough ports at the boundaries of <code>Block_A<\/code> and <code>Block_B<\/code>.<\/li>\n\n\n\n<li><code><strong>-direction inout<\/strong><\/code> allows bidirectional signal flow (adjust if unidirectional).<\/li>\n<\/ul>\n\n\n\n<p><strong>Net Creation<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>create_net<\/code> defines the feedthrough net and connects ports across blocks.<\/li>\n<\/ul>\n\n\n\n<p><strong>Buffering<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>insert_buffer<\/code> prevents signal degradation over long distances (critical for timing).<\/li>\n<\/ul>\n\n\n\n<p><strong>Handling Power State Conflicts<\/strong><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Routing Constraints<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>set_feedthrough_strategy<\/code> reserves metal layers (e.g., <code>M4<\/code>) to avoid congestion.<\/li>\n<\/ul>\n\n\n\n<p><strong>Legalization<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ensures feedthroughs don\u2019t violate placement\/routing rules.<\/li>\n<\/ul>\n\n\n\n<p><strong>Verification<\/strong>:<\/p>\n\n\n\n<p><code>report_net<\/code> and <code>check_connectivity<\/code> validate the feedthrough path.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"638\" height=\"281\" src=\"https:\/\/wattsemi.com\/wp-content\/uploads\/2025\/07\/image.png\" alt=\"\" class=\"wp-image-26441\" srcset=\"https:\/\/wattsemi.com\/wp-content\/uploads\/2025\/07\/image.png 638w, https:\/\/wattsemi.com\/wp-content\/uploads\/2025\/07\/image-300x132.png 300w\" sizes=\"(max-width: 638px) 100vw, 638px\" \/><\/figure>\n\n\n\n<p><br><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Here\u2019s a <strong>TCL script<\/strong> for <strong>Synopsys Fusion Compiler<\/strong> to insert feedthrough ports and nets between <code>Block_A<\/code> and <code>Block_B<\/code> during floorplanning, ensuring clean signal routing across hierarchical boundaries:<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-pale-cyan-blue-background-color has-background\"><strong>1. Script to Create Feedthrough Ports and Nets<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code has-vivid-purple-color has-white-background-color has-text-color has-background has-link-color wp-elements-e91e2104818d25cafd0efdb8f7a9ff08\"><code><em>#!\/usr\/bin\/env tclsh\n\n# Load the design and floorplan\nread_db -technology \"tech.tf\"\nread_verilog \"design.v\"\nlink_design -top \"TOP\"\n\n# Define block boundaries (adjust coordinates as needed)\nset blockA_bbox {100 100 300 400}   ;# Block_A: x1 y1 x2 y2\nset blockB_bbox {500 100 700 400}   ;# Block_B: x1 y1 x2 y2\n\n# Create feedthrough ports on Block_A and Block_B\ncreate_port -direction inout  -bbox $blockA_bbox FT_AtoB\ncreate_port -direction inout  -bbox $blockB_bbox FT_BtoA\n\n# Create feedthrough net and connect ports\ncreate_net -net_type feedthrough FT_NET\nconnect_net -net FT_NET -ports {FT_AtoB FT_BtoA}\n\n# Add buffers to prevent signal degradation\ninsert_buffer -net FT_NET -cell BUF_X2 -location &#91;expr &#91;lindex $blockA_bbox 0] + 50] &#91;expr &#91;lindex $blockA_bbox 1] + 50]\n\n# Reserve routing tracks for feedthrough (e.g., Metal4)\nset_feedthrough_strategy -nets FT_NET -layers {M4} -width 0.2 -spacing 0.5\n\n# Legalize placement to avoid DRCs\nlegalize_placement -nets FT_NET\n\n# Verify feedthrough connectivity\nreport_net -nets FT_NET -verbose\ncheck_connectivity -nets FT_NET\n\n# Save floorplan changes\nwrite_def -output \"feedthrough_def.def\"\nwrite_verilog -output \"feedthrough_netlist.v\"<\/em><\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading has-pale-cyan-blue-background-color has-background\"><br><strong>2. Advanced Enhancements<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>A. Timing-Driven Feedthroughs<\/strong><\/h4>\n\n\n\n<pre class=\"wp-block-code has-vivid-purple-color has-text-color has-link-color wp-elements-d2f7985a09d3120e65fbe0310a4beeb7\"><code># Set max delay constraint for feedthrough net\n<em>set_max_delay -from &#91;get_ports FT_AtoB] -to &#91;get_ports FT_BtoA] 1.5 -datapath_only\n<\/em>\n# Optimize feedthrough path\n<em>psynopt -nets FT_NET -effort high<\/em><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>B. Power-Aware Routing<\/strong><\/h4>\n\n\n\n<pre class=\"wp-block-code has-vivid-purple-color has-text-color has-link-color wp-elements-c44a41ecaf9f31da0dfdf02516979395\"><code># Shield feedthrough to reduce noise\n<em>set_feedthrough_strategy -nets FT_NET -shield_net VSS -shield_width 0.1<\/em><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>C. Automated Feedthrough Insertion<\/strong><\/h4>\n\n\n\n<pre class=\"wp-block-code has-vivid-purple-color has-text-color has-link-color wp-elements-76209c1370e6225af6b23f98ccc82065\"><code><em># Loop to create multiple feedthroughs\nforeach net {data1 data2 clk} {\n  create_port -direction inout -bbox $blockA_bbox FT_${net}_A\n  create_port -direction inout -bbox $blockB_bbox FT_${net}_B\n  create_net -net_type feedthrough FT_${net}\n  connect_net -net FT_${net} -ports &#91;list FT_${net}_A FT_${net}_B]\n}<\/em><\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading has-pale-cyan-blue-background-color has-background\"><strong>3. Verification Commands<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code has-vivid-purple-color has-text-color has-link-color wp-elements-2ac72ef5617cd22baeede35bd32b26a6\"><code><em># Check feedthrough timing\nreport_timing -from FT_AtoB -to FT_BtoA\n\n# Verify DRCs\nverify_drc -nets FT_NET\n\n# Report congestion near feedthroughs\nreport_congestion -area &#91;list $blockA_bbox $blockB_bbox]<\/em><\/code><\/pre>\n\n\n\n<h6 class=\"wp-block-heading has-vivid-cyan-blue-color has-text-color has-link-color wp-elements-2320d9f2f5783bdac62e31ce90ef0743\"><strong>Verification Commands<\/strong> for AON FT buffering though collapsible domains:<\/h6>\n\n\n\n<p class=\"has-vivid-purple-color has-text-color has-link-color wp-elements-6d0d95749e939d93d01860d17caca38b\"><em># Check AON buffer placement<br>report_power_domain -cells [get_cells -filter &#8220;ref_name=~BUF_X1_AON*&#8221;]<br><br># Verify domain crossings<br>check_power_domains -nets $feedthrough_nets -verbose<br><br># Timing checks (AON buffers should not be gated)<br>report_timing -from [get_pins -of [get_cells -filter &#8220;ref_name==BUF_X1_AON&#8221;]*\/A] \\<br>              -to [get_pins -of [get_cells -filter &#8220;ref_name==BUF_X1_AON&#8221;]*\/Z]<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading has-pale-cyan-blue-background-color has-background\"><strong>4. Key Considerations<\/strong><\/h3>\n\n\n\n<p><strong>Library Cells<\/strong>: Use AON-specific buffers (marked <code>-always_on<\/code> in the library).<\/p>\n\n\n\n<p><strong>Placement<\/strong>: Keep AON buffers near domain boundaries to minimize wire length.<\/p>\n\n\n\n<p><strong>Routing<\/strong>: Use non-collapsible power rails (e.g., <code>VDD_AON<\/code>) for AON buffers.<\/p>\n\n\n\n<p><br><strong>Q<\/strong>: <em>&#8220;How do you ensure feedthroughs don\u2019t worsen congestion?&#8221;<\/em><br><br><em>Reserve dedicated metal layers (e.g., <code>M4<\/code>) for feedthroughs using <code>set_feedthrough_strategy<\/code>, analyze congestion with <code>report_congestion<\/code>, and avoid high-density regions. <\/em><br><em>If needed, I adjust placement blockages.<\/em><\/p>\n\n\n\n<p><strong>Q<\/strong>: <em>&#8220;What if the feedthrough net fails timing?&#8221;<\/em><\/p>\n\n\n\n<p><em>&#8220;Insert buffers (<code>BUF_X2<\/code>) and <code>set_max_delay<\/code> constraints. For critical nets,  use wider metal layers or shield with VSS to reduce crosstalk.&#8221;<\/em><\/p>\n\n\n\n<p><strong>Q<\/strong>: <em>&#8220;What if the AON buffer fails timing?&#8221;<\/em><\/p>\n\n\n\n<p><em>&#8220;Size up the buffer (<code>BUF_X2_AON<\/code>) or adjust placement to reduce wire delay. For critical paths, use <code>set_max_delay<\/code> to prioritize domain-crossing nets.&#8221;<\/em><\/p>\n\n\n\n<p><strong>Q<\/strong>: <em>&#8220;How do you ensure feedthrough buffers stay always-on?&#8221;<\/em><\/p>\n\n\n\n<p><em>&#8220;Tag them with <code>-power_domain PD_AON<\/code> during insertion and verify via <code>report_power_domain<\/code>. The UPF file enforces <code>-always_on<\/code> for <code>PD_AON<\/code>.&#8221;<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading has-pale-cyan-blue-background-color has-background\"><strong> AON Buffer Insertion Strategy<\/strong> for inserting feedthrough signals through a collapsible domain.<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>A. Identify Feedthrough Signals Crossing Domains<\/strong><\/h4>\n\n\n\n<pre class=\"wp-block-code has-vivid-purple-color has-text-color has-link-color wp-elements-528b68809378dd46658909d73c8aaba2\"><code># Get all feedthrough nets between Block_A (collapsible) and Block_B (AON)\n<em>set feedthrough_nets &#91;get_nets -of &#91;get_pins -filter \"full_name=~Block_A*||full_name=~Block_B*\"]]<\/em><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>B. Insert AON Buffers for Domain Crossing<\/strong><\/h4>\n\n\n\n<pre class=\"wp-block-code has-vivid-purple-color has-text-color has-link-color wp-elements-20e206aeb313dc46134771f6ad342197\"><code><em>foreach net $feedthrough_nets {\n  # Check if net crosses power domains (collapsible \u2194 AON)\n  set driver_pd &#91;get_power_domain -of &#91;get_drivers $net]]\n  set load_pd   &#91;get_power_domain -of &#91;get_loads $net]]\n\n  if {($driver_pd != $load_pd) &amp;&amp; ($driver_pd == \"PD_CPU\" || $load_pd == \"PD_CPU\")} {\n    # Insert AON buffer (ensure it's in PD_AON)\n    set buf_cell \"BUF_X1_AON\"  ;# Library cell with AON attribute\n    set buf_loc &#91;get_location -median $net]  ;# Place near domain boundary\n\n    insert_buffer -net $net -cell $buf_cell -location $buf_loc \\\n                 -power_domain PD_AON -placement_guide AON_REGION\n\n    # Connect buffer output to AON domain\n    connect_net -net $net -ports &#91;get_pins -of &#91;get_cells -filter \"ref_name==$buf_cell\"]]\n  }\n}<\/em><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>C. Define Placement Guides for AON Buffers<\/strong><\/h4>\n\n\n\n<pre class=\"wp-block-code has-vivid-purple-color has-text-color has-link-color wp-elements-4602de30209a6bbd040487ee49e00ccf\"><code># Create an AON buffer region near the domain boundary\ncreate_placement_blockage -name AON_REGION -bbox {x1 y1 x2 y2} -type partial\n<em>set_app_options -name plan.pgroute.power_domain_aware -value true<\/em><\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading has-pale-cyan-blue-background-color has-background\"><strong>Handling Power State Conflicts<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>A. Isolation Cell Insertion (Optional)<\/strong><\/h4>\n\n\n\n<p>If feedthrough signals need isolation when the collapsible domain is off:<\/p>\n\n\n\n<pre class=\"wp-block-code has-vivid-purple-color has-text-color has-link-color wp-elements-1df207405dea36e414f29fd8928bbcee\"><code><em>set_isolation -domain PD_CPU -isolation_power_net VDD_AON \\\n              -isolation_ground_net VSS -clamp_value 0 \\\n              -applies_to outputs<\/em><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>B. Level Shifter Insertion (Voltage Crossing)<\/strong><\/h4>\n\n\n\n<p>If domains operate at different voltages:<\/p>\n\n\n\n<pre class=\"wp-block-code has-vivid-purple-color has-text-color has-link-color wp-elements-b852d73ad46d559b1ff0a033af96672e\"><code><em>insert_level_shifter -net $net -from PD_CPU -to PD_AON \\\n                    -location $buf_loc -cell LVL_SHIFT_AON<\/em><\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading has-pale-cyan-blue-background-color has-background\"><strong>UPF\/CPF Constraints Example<\/strong><\/h3>\n\n\n\n<p>Ensure UPF\/CPF defines <code>PD_AON<\/code> as always-on:<\/p>\n\n\n\n<pre class=\"wp-block-code has-vivid-purple-color has-text-color has-link-color wp-elements-bc2fd3889ed029482c91888b178d6ebd\"><code><em>create_power_domain PD_AON -elements &#91;list BUF_X1_AON*] -always_on\ncreate_power_domain PD_CPU -shutoff_condition {!PWR_EN}<\/em><\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"743\" height=\"551\" src=\"https:\/\/wattsemi.com\/wp-content\/uploads\/2025\/07\/image.jpeg\" alt=\"\" class=\"wp-image-26442\" srcset=\"https:\/\/wattsemi.com\/wp-content\/uploads\/2025\/07\/image.jpeg 743w, https:\/\/wattsemi.com\/wp-content\/uploads\/2025\/07\/image-300x222.jpeg 300w\" sizes=\"(max-width: 743px) 100vw, 743px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>ASIC Low Power Physical Design: Inserting FeedThroughs: Ever wonder how complex Feedthrough signals are routed between two Hard Macros when propagating through collapsible blocks, while navigating the challenges of meeting STA timing, routing congestion and UPF constrains with isolation cells? Here\u2019s a simplified and structured approach on the basics of how to handle domain crossings [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":26442,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"postBodyCss":"","postBodyMargin":[],"postBodyPadding":[],"postBodyBackground":{"backgroundType":"classic","gradient":""},"footnotes":""},"categories":[40],"tags":[],"class_list":["post-26432","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology"],"_links":{"self":[{"href":"https:\/\/wattsemi.com\/index.php?rest_route=\/wp\/v2\/posts\/26432","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wattsemi.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wattsemi.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wattsemi.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/wattsemi.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=26432"}],"version-history":[{"count":7,"href":"https:\/\/wattsemi.com\/index.php?rest_route=\/wp\/v2\/posts\/26432\/revisions"}],"predecessor-version":[{"id":26445,"href":"https:\/\/wattsemi.com\/index.php?rest_route=\/wp\/v2\/posts\/26432\/revisions\/26445"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wattsemi.com\/index.php?rest_route=\/wp\/v2\/media\/26442"}],"wp:attachment":[{"href":"https:\/\/wattsemi.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=26432"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wattsemi.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=26432"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wattsemi.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=26432"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}