fix(scripts,constraints): handle empty STATS properties in build summaries, fix 50T XDC DRC errors
Build scripts (17-21): STATS.WNS/TNS/WHS/THS/TPWS from get_property can return empty strings in Vivado 2025.2 after write_bitstream auto-launch. Wrap in catch with N/A fallback. Guard all expr delta calculations and signoff comparisons with [string is double -strict] checks. XDC (xc7a50t_ftg256): Fix PLIO-9 by moving clk_120m_dac from C13 (N-type) to D13 (P-type MRCC) — clock inputs require P-type MRCC pin. Fix BIVC-1 by disabling DIFF_TERM on Bank 14 LVDS pairs to resolve VCCO conflict with single-ended adc_pwdn (LVCMOS33) on T5 — requires external termination.
This commit is contained in:
@@ -321,13 +321,14 @@ puts $summary_fh "Impl Time: ${impl_elapsed}s"
|
||||
puts $summary_fh "Bitstream Time: ${bit_elapsed}s"
|
||||
puts $summary_fh ""
|
||||
|
||||
# Extract key timing numbers
|
||||
# Extract key timing numbers — use catch to handle empty STATS properties
|
||||
# (Vivado 2025.2 may return empty strings after write_bitstream auto-launch)
|
||||
puts $summary_fh "--- Timing ---"
|
||||
set wns [get_property STATS.WNS [current_design]]
|
||||
set tns [get_property STATS.TNS [current_design]]
|
||||
set whs [get_property STATS.WHS [current_design]]
|
||||
set ths [get_property STATS.THS [current_design]]
|
||||
set fail_ep [get_property STATS.TPWS [current_design]]
|
||||
if {[catch {set wns [get_property STATS.WNS [current_design]]}] || $wns eq ""} { set wns "N/A" }
|
||||
if {[catch {set tns [get_property STATS.TNS [current_design]]}] || $tns eq ""} { set tns "N/A" }
|
||||
if {[catch {set whs [get_property STATS.WHS [current_design]]}] || $whs eq ""} { set whs "N/A" }
|
||||
if {[catch {set ths [get_property STATS.THS [current_design]]}] || $ths eq ""} { set ths "N/A" }
|
||||
if {[catch {set fail_ep [get_property STATS.TPWS [current_design]]}] || $fail_ep eq ""} { set fail_ep "N/A" }
|
||||
puts $summary_fh " WNS: $wns ns"
|
||||
puts $summary_fh " TNS: $tns ns"
|
||||
puts $summary_fh " WHS: $whs ns"
|
||||
@@ -366,19 +367,25 @@ puts $summary_fh ""
|
||||
# Signoff
|
||||
puts $summary_fh "--- Final Signoff ---"
|
||||
set signoff_pass 1
|
||||
if {$wns < 0} {
|
||||
if {![string is double -strict $wns]} {
|
||||
puts $summary_fh " WARN: WNS = N/A (timing stats unavailable — check reports)"
|
||||
} elseif {$wns < 0} {
|
||||
puts $summary_fh " FAIL: WNS = $wns (negative slack)"
|
||||
set signoff_pass 0
|
||||
} else {
|
||||
puts $summary_fh " PASS: WNS = $wns ns (no setup violations)"
|
||||
}
|
||||
if {$whs < 0} {
|
||||
if {![string is double -strict $whs]} {
|
||||
puts $summary_fh " WARN: WHS = N/A (timing stats unavailable — check reports)"
|
||||
} elseif {$whs < 0} {
|
||||
puts $summary_fh " FAIL: WHS = $whs (hold violation)"
|
||||
set signoff_pass 0
|
||||
} else {
|
||||
puts $summary_fh " PASS: WHS = $whs ns (no hold violations)"
|
||||
}
|
||||
if {$tns != 0} {
|
||||
if {![string is double -strict $tns]} {
|
||||
puts $summary_fh " WARN: TNS = N/A (timing stats unavailable — check reports)"
|
||||
} elseif {$tns != 0} {
|
||||
puts $summary_fh " FAIL: TNS = $tns (total negative slack)"
|
||||
set signoff_pass 0
|
||||
} else {
|
||||
|
||||
@@ -331,13 +331,14 @@ puts $summary_fh "Impl Time: ${impl_elapsed}s"
|
||||
puts $summary_fh "Bitstream Time: ${bit_elapsed}s"
|
||||
puts $summary_fh ""
|
||||
|
||||
# Extract key timing numbers
|
||||
# Extract key timing numbers — use catch to handle empty STATS properties
|
||||
# (Vivado 2025.2 may return empty strings after write_bitstream auto-launch)
|
||||
puts $summary_fh "--- Timing ---"
|
||||
set wns [get_property STATS.WNS [current_design]]
|
||||
set tns [get_property STATS.TNS [current_design]]
|
||||
set whs [get_property STATS.WHS [current_design]]
|
||||
set ths [get_property STATS.THS [current_design]]
|
||||
set fail_ep [get_property STATS.TPWS [current_design]]
|
||||
if {[catch {set wns [get_property STATS.WNS [current_design]]}] || $wns eq ""} { set wns "N/A" }
|
||||
if {[catch {set tns [get_property STATS.TNS [current_design]]}] || $tns eq ""} { set tns "N/A" }
|
||||
if {[catch {set whs [get_property STATS.WHS [current_design]]}] || $whs eq ""} { set whs "N/A" }
|
||||
if {[catch {set ths [get_property STATS.THS [current_design]]}] || $ths eq ""} { set ths "N/A" }
|
||||
if {[catch {set fail_ep [get_property STATS.TPWS [current_design]]}] || $fail_ep eq ""} { set fail_ep "N/A" }
|
||||
puts $summary_fh " WNS: $wns ns"
|
||||
puts $summary_fh " TNS: $tns ns"
|
||||
puts $summary_fh " WHS: $whs ns"
|
||||
@@ -376,19 +377,25 @@ puts $summary_fh ""
|
||||
# Signoff
|
||||
puts $summary_fh "--- Final Signoff ---"
|
||||
set signoff_pass 1
|
||||
if {$wns < 0} {
|
||||
if {![string is double -strict $wns]} {
|
||||
puts $summary_fh " WARN: WNS = N/A (timing stats unavailable — check reports)"
|
||||
} elseif {$wns < 0} {
|
||||
puts $summary_fh " FAIL: WNS = $wns (negative slack)"
|
||||
set signoff_pass 0
|
||||
} else {
|
||||
puts $summary_fh " PASS: WNS = $wns ns (no setup violations)"
|
||||
}
|
||||
if {$whs < 0} {
|
||||
if {![string is double -strict $whs]} {
|
||||
puts $summary_fh " WARN: WHS = N/A (timing stats unavailable — check reports)"
|
||||
} elseif {$whs < 0} {
|
||||
puts $summary_fh " FAIL: WHS = $whs (hold violation)"
|
||||
set signoff_pass 0
|
||||
} else {
|
||||
puts $summary_fh " PASS: WHS = $whs ns (no hold violations)"
|
||||
}
|
||||
if {$tns != 0} {
|
||||
if {![string is double -strict $tns]} {
|
||||
puts $summary_fh " WARN: TNS = N/A (timing stats unavailable — check reports)"
|
||||
} elseif {$tns != 0} {
|
||||
puts $summary_fh " FAIL: TNS = $tns (total negative slack)"
|
||||
set signoff_pass 0
|
||||
} else {
|
||||
|
||||
@@ -322,21 +322,30 @@ puts $summary_fh "Impl Time: ${impl_elapsed}s"
|
||||
puts $summary_fh "Bitstream Time: ${bit_elapsed}s"
|
||||
puts $summary_fh ""
|
||||
|
||||
# Extract key timing numbers
|
||||
# Extract key timing numbers — use catch to handle empty STATS properties
|
||||
# (Vivado 2025.2 may return empty strings after write_bitstream auto-launch)
|
||||
puts $summary_fh "--- Timing ---"
|
||||
set wns [get_property STATS.WNS [current_design]]
|
||||
set tns [get_property STATS.TNS [current_design]]
|
||||
set whs [get_property STATS.WHS [current_design]]
|
||||
set ths [get_property STATS.THS [current_design]]
|
||||
set fail_ep [get_property STATS.TPWS [current_design]]
|
||||
if {[catch {set wns [get_property STATS.WNS [current_design]]}] || $wns eq ""} { set wns "N/A" }
|
||||
if {[catch {set tns [get_property STATS.TNS [current_design]]}] || $tns eq ""} { set tns "N/A" }
|
||||
if {[catch {set whs [get_property STATS.WHS [current_design]]}] || $whs eq ""} { set whs "N/A" }
|
||||
if {[catch {set ths [get_property STATS.THS [current_design]]}] || $ths eq ""} { set ths "N/A" }
|
||||
if {[catch {set fail_ep [get_property STATS.TPWS [current_design]]}] || $fail_ep eq ""} { set fail_ep "N/A" }
|
||||
puts $summary_fh " WNS: $wns ns"
|
||||
puts $summary_fh " TNS: $tns ns"
|
||||
puts $summary_fh " WHS: $whs ns"
|
||||
puts $summary_fh " THS: $ths ns"
|
||||
puts $summary_fh ""
|
||||
puts $summary_fh " Build 18 Baseline: WNS = +0.062 ns, WHS = +0.059 ns"
|
||||
puts $summary_fh " Delta WNS: [expr {$wns - 0.062}] ns"
|
||||
puts $summary_fh " Delta WHS: [expr {$whs - 0.059}] ns"
|
||||
if {[string is double -strict $wns]} {
|
||||
puts $summary_fh " Delta WNS: [expr {$wns - 0.062}] ns"
|
||||
} else {
|
||||
puts $summary_fh " Delta WNS: N/A (timing stats unavailable)"
|
||||
}
|
||||
if {[string is double -strict $whs]} {
|
||||
puts $summary_fh " Delta WHS: [expr {$whs - 0.059}] ns"
|
||||
} else {
|
||||
puts $summary_fh " Delta WHS: N/A (timing stats unavailable)"
|
||||
}
|
||||
puts $summary_fh ""
|
||||
|
||||
# Extract utilization
|
||||
@@ -380,19 +389,25 @@ puts $summary_fh ""
|
||||
# Signoff
|
||||
puts $summary_fh "--- Final Signoff ---"
|
||||
set signoff_pass 1
|
||||
if {$wns < 0} {
|
||||
if {![string is double -strict $wns]} {
|
||||
puts $summary_fh " WARN: WNS = N/A (timing stats unavailable — check reports)"
|
||||
} elseif {$wns < 0} {
|
||||
puts $summary_fh " FAIL: WNS = $wns (negative slack)"
|
||||
set signoff_pass 0
|
||||
} else {
|
||||
puts $summary_fh " PASS: WNS = $wns ns (no setup violations)"
|
||||
}
|
||||
if {$whs < 0} {
|
||||
if {![string is double -strict $whs]} {
|
||||
puts $summary_fh " WARN: WHS = N/A (timing stats unavailable — check reports)"
|
||||
} elseif {$whs < 0} {
|
||||
puts $summary_fh " FAIL: WHS = $whs (hold violation)"
|
||||
set signoff_pass 0
|
||||
} else {
|
||||
puts $summary_fh " PASS: WHS = $whs ns (no hold violations)"
|
||||
}
|
||||
if {$tns != 0} {
|
||||
if {![string is double -strict $tns]} {
|
||||
puts $summary_fh " WARN: TNS = N/A (timing stats unavailable — check reports)"
|
||||
} elseif {$tns != 0} {
|
||||
puts $summary_fh " FAIL: TNS = $tns (total negative slack)"
|
||||
set signoff_pass 0
|
||||
} else {
|
||||
@@ -413,11 +428,11 @@ if {[file exists $bit_src]} {
|
||||
puts $summary_fh ""
|
||||
|
||||
# Timing regression check vs Build 18
|
||||
if {$wns < 0.062} {
|
||||
if {[string is double -strict $wns] && $wns < 0.062} {
|
||||
puts $summary_fh " *** WARNING: WNS REGRESSED vs Build 18 (was +0.062 ns, now $wns ns) ***"
|
||||
puts $summary_fh " *** Consider reverting MMCM changes per revert-safety policy ***"
|
||||
}
|
||||
if {$whs < 0.059} {
|
||||
if {[string is double -strict $whs] && $whs < 0.059} {
|
||||
puts $summary_fh " *** WARNING: WHS REGRESSED vs Build 18 (was +0.059 ns, now $whs ns) ***"
|
||||
}
|
||||
|
||||
|
||||
@@ -326,13 +326,14 @@ puts $summary_fh "Impl Time: ${impl_elapsed}s"
|
||||
puts $summary_fh "Bitstream Time: ${bit_elapsed}s"
|
||||
puts $summary_fh ""
|
||||
|
||||
# Extract key timing numbers
|
||||
# Extract key timing numbers — use catch to handle empty STATS properties
|
||||
# (Vivado 2025.2 may return empty strings after write_bitstream auto-launch)
|
||||
puts $summary_fh "--- Timing ---"
|
||||
set wns [get_property STATS.WNS [current_design]]
|
||||
set tns [get_property STATS.TNS [current_design]]
|
||||
set whs [get_property STATS.WHS [current_design]]
|
||||
set ths [get_property STATS.THS [current_design]]
|
||||
set fail_ep [get_property STATS.TPWS [current_design]]
|
||||
if {[catch {set wns [get_property STATS.WNS [current_design]]}] || $wns eq ""} { set wns "N/A" }
|
||||
if {[catch {set tns [get_property STATS.TNS [current_design]]}] || $tns eq ""} { set tns "N/A" }
|
||||
if {[catch {set whs [get_property STATS.WHS [current_design]]}] || $whs eq ""} { set whs "N/A" }
|
||||
if {[catch {set ths [get_property STATS.THS [current_design]]}] || $ths eq ""} { set ths "N/A" }
|
||||
if {[catch {set fail_ep [get_property STATS.TPWS [current_design]]}] || $fail_ep eq ""} { set fail_ep "N/A" }
|
||||
puts $summary_fh " WNS: $wns ns"
|
||||
puts $summary_fh " TNS: $tns ns"
|
||||
puts $summary_fh " WHS: $whs ns"
|
||||
@@ -340,8 +341,16 @@ puts $summary_fh " THS: $ths ns"
|
||||
puts $summary_fh ""
|
||||
puts $summary_fh " Build 18 Baseline: WNS = +0.062 ns, WHS = +0.059 ns"
|
||||
puts $summary_fh " Build 19 (FAILED): WNS = -0.011 ns, WHS = +0.055 ns"
|
||||
puts $summary_fh " Delta WNS vs B18: [expr {$wns - 0.062}] ns"
|
||||
puts $summary_fh " Delta WHS vs B18: [expr {$whs - 0.059}] ns"
|
||||
if {[string is double -strict $wns]} {
|
||||
puts $summary_fh " Delta WNS vs B18: [expr {$wns - 0.062}] ns"
|
||||
} else {
|
||||
puts $summary_fh " Delta WNS vs B18: N/A (timing stats unavailable)"
|
||||
}
|
||||
if {[string is double -strict $whs]} {
|
||||
puts $summary_fh " Delta WHS vs B18: [expr {$whs - 0.059}] ns"
|
||||
} else {
|
||||
puts $summary_fh " Delta WHS vs B18: N/A (timing stats unavailable)"
|
||||
}
|
||||
puts $summary_fh ""
|
||||
|
||||
# Extract utilization
|
||||
@@ -387,19 +396,25 @@ puts $summary_fh ""
|
||||
# Signoff
|
||||
puts $summary_fh "--- Final Signoff ---"
|
||||
set signoff_pass 1
|
||||
if {$wns < 0} {
|
||||
if {![string is double -strict $wns]} {
|
||||
puts $summary_fh " WARN: WNS = N/A (timing stats unavailable — check reports)"
|
||||
} elseif {$wns < 0} {
|
||||
puts $summary_fh " FAIL: WNS = $wns (negative slack)"
|
||||
set signoff_pass 0
|
||||
} else {
|
||||
puts $summary_fh " PASS: WNS = $wns ns (no setup violations)"
|
||||
}
|
||||
if {$whs < 0} {
|
||||
if {![string is double -strict $whs]} {
|
||||
puts $summary_fh " WARN: WHS = N/A (timing stats unavailable — check reports)"
|
||||
} elseif {$whs < 0} {
|
||||
puts $summary_fh " FAIL: WHS = $whs (hold violation)"
|
||||
set signoff_pass 0
|
||||
} else {
|
||||
puts $summary_fh " PASS: WHS = $whs ns (no hold violations)"
|
||||
}
|
||||
if {$tns != 0} {
|
||||
if {![string is double -strict $tns]} {
|
||||
puts $summary_fh " WARN: TNS = N/A (timing stats unavailable — check reports)"
|
||||
} elseif {$tns != 0} {
|
||||
puts $summary_fh " FAIL: TNS = $tns (total negative slack)"
|
||||
set signoff_pass 0
|
||||
} else {
|
||||
@@ -420,11 +435,11 @@ if {[file exists $bit_src]} {
|
||||
puts $summary_fh ""
|
||||
|
||||
# Timing regression check vs Build 18
|
||||
if {$wns < 0.062} {
|
||||
if {[string is double -strict $wns] && $wns < 0.062} {
|
||||
puts $summary_fh " *** WARNING: WNS REGRESSED vs Build 18 (was +0.062 ns, now $wns ns) ***"
|
||||
puts $summary_fh " *** Review critical paths — CREG fix may not have helped ***"
|
||||
}
|
||||
if {$whs < 0.059} {
|
||||
if {[string is double -strict $whs] && $whs < 0.059} {
|
||||
puts $summary_fh " *** WARNING: WHS REGRESSED vs Build 18 (was +0.059 ns, now $whs ns) ***"
|
||||
}
|
||||
|
||||
|
||||
@@ -335,13 +335,14 @@ puts $summary_fh "Impl Time: ${impl_elapsed}s"
|
||||
puts $summary_fh "Bitstream Time: ${bit_elapsed}s"
|
||||
puts $summary_fh ""
|
||||
|
||||
# Extract key timing numbers
|
||||
# Extract key timing numbers — use catch to handle empty STATS properties
|
||||
# (Vivado 2025.2 may return empty strings after write_bitstream auto-launch)
|
||||
puts $summary_fh "--- Timing ---"
|
||||
set wns [get_property STATS.WNS [current_design]]
|
||||
set tns [get_property STATS.TNS [current_design]]
|
||||
set whs [get_property STATS.WHS [current_design]]
|
||||
set ths [get_property STATS.THS [current_design]]
|
||||
set fail_ep [get_property STATS.TPWS [current_design]]
|
||||
if {[catch {set wns [get_property STATS.WNS [current_design]]}] || $wns eq ""} { set wns "N/A" }
|
||||
if {[catch {set tns [get_property STATS.TNS [current_design]]}] || $tns eq ""} { set tns "N/A" }
|
||||
if {[catch {set whs [get_property STATS.WHS [current_design]]}] || $whs eq ""} { set whs "N/A" }
|
||||
if {[catch {set ths [get_property STATS.THS [current_design]]}] || $ths eq ""} { set ths "N/A" }
|
||||
if {[catch {set fail_ep [get_property STATS.TPWS [current_design]]}] || $fail_ep eq ""} { set fail_ep "N/A" }
|
||||
puts $summary_fh " WNS: $wns ns"
|
||||
puts $summary_fh " TNS: $tns ns"
|
||||
puts $summary_fh " WHS: $whs ns"
|
||||
@@ -349,8 +350,16 @@ puts $summary_fh " THS: $ths ns"
|
||||
puts $summary_fh ""
|
||||
puts $summary_fh " Build 20 Baseline: WNS = +0.426 ns, WHS = +0.058 ns"
|
||||
puts $summary_fh " Gap 2 Build (ref): WNS = +0.078 ns, WHS = +0.054 ns"
|
||||
puts $summary_fh " Delta WNS vs B20: [expr {$wns - 0.426}] ns"
|
||||
puts $summary_fh " Delta WHS vs B20: [expr {$whs - 0.058}] ns"
|
||||
if {[string is double -strict $wns]} {
|
||||
puts $summary_fh " Delta WNS vs B20: [expr {$wns - 0.426}] ns"
|
||||
} else {
|
||||
puts $summary_fh " Delta WNS vs B20: N/A (timing stats unavailable)"
|
||||
}
|
||||
if {[string is double -strict $whs]} {
|
||||
puts $summary_fh " Delta WHS vs B20: [expr {$whs - 0.058}] ns"
|
||||
} else {
|
||||
puts $summary_fh " Delta WHS vs B20: N/A (timing stats unavailable)"
|
||||
}
|
||||
puts $summary_fh ""
|
||||
|
||||
# Extract utilization
|
||||
@@ -396,19 +405,25 @@ puts $summary_fh ""
|
||||
# Signoff
|
||||
puts $summary_fh "--- Final Signoff ---"
|
||||
set signoff_pass 1
|
||||
if {$wns < 0} {
|
||||
if {![string is double -strict $wns]} {
|
||||
puts $summary_fh " WARN: WNS = N/A (timing stats unavailable — check reports)"
|
||||
} elseif {$wns < 0} {
|
||||
puts $summary_fh " FAIL: WNS = $wns (negative slack)"
|
||||
set signoff_pass 0
|
||||
} else {
|
||||
puts $summary_fh " PASS: WNS = $wns ns (no setup violations)"
|
||||
}
|
||||
if {$whs < 0} {
|
||||
if {![string is double -strict $whs]} {
|
||||
puts $summary_fh " WARN: WHS = N/A (timing stats unavailable — check reports)"
|
||||
} elseif {$whs < 0} {
|
||||
puts $summary_fh " FAIL: WHS = $whs (hold violation)"
|
||||
set signoff_pass 0
|
||||
} else {
|
||||
puts $summary_fh " PASS: WHS = $whs ns (no hold violations)"
|
||||
}
|
||||
if {$tns != 0} {
|
||||
if {![string is double -strict $tns]} {
|
||||
puts $summary_fh " WARN: TNS = N/A (timing stats unavailable — check reports)"
|
||||
} elseif {$tns != 0} {
|
||||
puts $summary_fh " FAIL: TNS = $tns (total negative slack)"
|
||||
set signoff_pass 0
|
||||
} else {
|
||||
@@ -429,11 +444,11 @@ if {[file exists $bit_src]} {
|
||||
puts $summary_fh ""
|
||||
|
||||
# Timing regression check vs Build 20
|
||||
if {$wns < 0.078} {
|
||||
if {[string is double -strict $wns] && $wns < 0.078} {
|
||||
puts $summary_fh " *** WARNING: WNS REGRESSED below Gap 2 build (was +0.078 ns, now $wns ns) ***"
|
||||
puts $summary_fh " *** Review critical paths — FFT opts or RTL fixes may have introduced new timing pressure ***"
|
||||
}
|
||||
if {$whs < 0.054} {
|
||||
if {[string is double -strict $whs] && $whs < 0.054} {
|
||||
puts $summary_fh " *** WARNING: WHS REGRESSED below Gap 2 build (was +0.054 ns, now $whs ns) ***"
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user