Phase 1 hardware bring-up prep: ILA debug probes, CDC waivers, programming scripts
- Rename latency_buffer_2159 -> latency_buffer (module + file + all refs) - Add CDC waivers for 5 verified false-positive criticals to XDC - Add ILA debug probe insertion script (4 cores, 126 probe bits, 2 clock domains) - Add FPGA programming script (7-step flow with DONE pin verification) - Add ILA capture script (4 scenarios + health check, CSV export) - Add debug_ila.xdc with MARK_DEBUG fallback attributes - Full regression clean: 13/13 suites, 266/266 checks, 2048/2048 golden match
This commit is contained in:
@@ -0,0 +1,203 @@
|
||||
################################################################################
|
||||
# debug_ila.xdc
|
||||
#
|
||||
# AERIS-10 Radar FPGA — mark_debug Constraints for ILA Probe Signals
|
||||
# Target: XC7A200T-2FBG484I
|
||||
#
|
||||
# ALTERNATIVE APPROACH: If the post-synthesis ILA insertion script
|
||||
# (insert_ila_probes.tcl) encounters net-name resolution issues, add this
|
||||
# XDC to the Vivado project *before* synthesis. The mark_debug attributes
|
||||
# will preserve the nets through optimization and make them available for
|
||||
# ILA insertion in the Setup Debug wizard or via TCL.
|
||||
#
|
||||
# Usage:
|
||||
# 1. Add this file to the Vivado project as a constraint source
|
||||
# 2. Re-run synthesis (nets will be preserved with MARK_DEBUG)
|
||||
# 3. Use Vivado GUI: Flow > Set Up Debug, or run insert_ila_probes.tcl
|
||||
#
|
||||
# NOTE: mark_debug must be applied to RTL-level signal names. After
|
||||
# synthesis, Vivado will propagate the attribute to the corresponding
|
||||
# netlist nets regardless of renaming or flattening.
|
||||
################################################################################
|
||||
|
||||
# ==============================================================================
|
||||
# ILA 0 — ADC Capture (400 MHz domain)
|
||||
#
|
||||
# Raw ADC samples from the AD9484 CMOS interface inside the receiver.
|
||||
# 8-bit data bus + valid strobe. Clocked at 400 MHz (adc_dco_p derived).
|
||||
# ==============================================================================
|
||||
|
||||
# ADC raw data bus [7:0]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/adc/adc_data_cmos[0]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/adc/adc_data_cmos[1]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/adc/adc_data_cmos[2]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/adc/adc_data_cmos[3]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/adc/adc_data_cmos[4]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/adc/adc_data_cmos[5]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/adc/adc_data_cmos[6]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/adc/adc_data_cmos[7]}]
|
||||
|
||||
# ADC data valid
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/adc/adc_valid}]
|
||||
|
||||
# ==============================================================================
|
||||
# ILA 1 — DDC Output (100 MHz domain)
|
||||
#
|
||||
# Digital down-converter baseband I/Q outputs after CIC + FIR decimation.
|
||||
# 18-bit I + 18-bit Q + valid strobe. Clocked at 100 MHz (clk_100m_buf).
|
||||
# ==============================================================================
|
||||
|
||||
# DDC I-channel [17:0]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[0]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[1]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[2]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[3]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[4]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[5]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[6]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[7]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[8]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[9]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[10]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[11]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[12]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[13]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[14]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[15]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[16]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_i[17]}]
|
||||
|
||||
# DDC Q-channel [17:0]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[0]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[1]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[2]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[3]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[4]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[5]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[6]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[7]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[8]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[9]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[10]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[11]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[12]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[13]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[14]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[15]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[16]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_out_q[17]}]
|
||||
|
||||
# DDC valid strobe
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/ddc_valid_i}]
|
||||
|
||||
# ==============================================================================
|
||||
# ILA 2 — Matched Filter Output (100 MHz domain)
|
||||
#
|
||||
# Pulse-compression output from the multi-segment matched filter.
|
||||
# 16-bit I + 16-bit Q + valid + 2-bit segment index.
|
||||
# ==============================================================================
|
||||
|
||||
# Matched filter I-channel [15:0]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[0]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[1]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[2]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[3]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[4]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[5]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[6]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[7]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[8]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[9]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[10]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[11]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[12]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[13]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[14]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_i_w[15]}]
|
||||
|
||||
# Matched filter Q-channel [15:0]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[0]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[1]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[2]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[3]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[4]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[5]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[6]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[7]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[8]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[9]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[10]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[11]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[12]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[13]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[14]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_q_w[15]}]
|
||||
|
||||
# Matched filter valid
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/pc_valid_w}]
|
||||
|
||||
# Matched filter segment request [1:0]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/segment_request[0]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/mf_dual/segment_request[1]}]
|
||||
|
||||
# ==============================================================================
|
||||
# ILA 3 — Doppler Processor Output (100 MHz domain)
|
||||
#
|
||||
# Range-Doppler map output from FFT-based Doppler processor.
|
||||
# 32-bit spectrum + valid + 5-bit Doppler bin + 6-bit range bin + frame sync.
|
||||
# ==============================================================================
|
||||
|
||||
# Doppler output spectrum [31:0]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[0]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[1]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[2]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[3]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[4]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[5]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[6]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[7]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[8]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[9]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[10]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[11]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[12]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[13]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[14]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[15]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[16]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[17]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[18]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[19]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[20]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[21]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[22]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[23]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[24]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[25]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[26]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[27]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[28]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[29]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[30]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_output[31]}]
|
||||
|
||||
# Doppler valid
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_valid}]
|
||||
|
||||
# Doppler bin index [4:0]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_bin[0]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_bin[1]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_bin[2]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_bin[3]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/doppler_bin[4]}]
|
||||
|
||||
# Range bin index [5:0]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/range_bin[0]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/range_bin[1]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/range_bin[2]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/range_bin[3]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/range_bin[4]}]
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/doppler_proc/range_bin[5]}]
|
||||
|
||||
# Frame synchronization pulse
|
||||
set_property MARK_DEBUG true [get_nets {rx_inst/new_frame_pulse}]
|
||||
@@ -696,6 +696,53 @@ set_property -quiet IOB TRUE [get_cells -hierarchical -filter {NAME =~ *usb_inst
|
||||
# -from [get_cells -hierarchical -filter {NAME =~ *cic_*/integrator_*_dsp}] \
|
||||
# -to [get_cells -hierarchical -filter {NAME =~ *cic_*/integrator_*_dsp}]
|
||||
|
||||
# ============================================================================
|
||||
# CDC WAIVERS — Verified False Positives (Build 13 Freeze Candidate)
|
||||
# ============================================================================
|
||||
# These 5 CDC critical warnings were analyzed during pre-hardware audit.
|
||||
# All are structurally safe and do not represent real metastability risks.
|
||||
# See project documentation for detailed justification of each waiver.
|
||||
#
|
||||
# Waiver 1: CDC-11 — 100MHz reset_sync → 400MHz ADC reset synchronizer
|
||||
# Standard async-assert/sync-deassert pattern. ASYNC_REG is applied on
|
||||
# the destination synchronizer chain. Reset is held for many source cycles.
|
||||
create_waiver -type CDC -id CDC-11 \
|
||||
-from [get_pins -quiet -hierarchical -filter {NAME =~ *reset_sync_reg[1]/C}] \
|
||||
-to [get_pins -quiet -hierarchical -filter {NAME =~ *rx_inst/adc/reset_sync_400m_reg[0]/CLR}] \
|
||||
-description "Reset synchronizer 100M->400M: async-assert/sync-deassert, ASYNC_REG applied"
|
||||
|
||||
# Waiver 2: CDC-7 — 100MHz reset_sync → DDC active-high reset PRE
|
||||
# Active-high derived reset uses PRE (preset). PRE is the safe async
|
||||
# direction for this reset polarity. Parent chain has ASYNC_REG.
|
||||
create_waiver -type CDC -id CDC-7 \
|
||||
-from [get_pins -quiet -hierarchical -filter {NAME =~ *reset_sync_reg[1]/C}] \
|
||||
-to [get_pins -quiet -hierarchical -filter {NAME =~ *rx_inst/ddc/reset_400m_reg/PRE}] \
|
||||
-description "DDC active-high reset via PRE: safe async direction, ASYNC_REG on parent chain"
|
||||
|
||||
# Waiver 3: CDC-11 — 100MHz reset_sync → DDC 400MHz reset synchronizer
|
||||
# Same pattern as Waiver 1, different destination module (DDC vs ADC).
|
||||
create_waiver -type CDC -id CDC-11 \
|
||||
-from [get_pins -quiet -hierarchical -filter {NAME =~ *reset_sync_reg[1]/C}] \
|
||||
-to [get_pins -quiet -hierarchical -filter {NAME =~ *rx_inst/ddc/reset_sync_400m_reg[0]/CLR}] \
|
||||
-description "Reset synchronizer 100M->400M in DDC: async-assert/sync-deassert, ASYNC_REG applied"
|
||||
|
||||
# Waiver 4: CDC-11 — doppler_valid fan-out to USB doppler_valid_sync
|
||||
# Single rx_doppler_valid register fans out to two independent 2-stage
|
||||
# synchronizers in usb_data_interface. Both sync chains have ASYNC_REG.
|
||||
# The fan-out is covered by set_false_path (clk_100m ↔ ft601_clk_in).
|
||||
create_waiver -type CDC -id CDC-11 \
|
||||
-from [get_pins -quiet -hierarchical -filter {NAME =~ *doppler_valid_reg/C}] \
|
||||
-to [get_pins -quiet -hierarchical -filter {NAME =~ *usb_inst/doppler_valid_sync_reg[0]/D}] \
|
||||
-description "doppler_valid CDC fan-out to USB sync chain 1: ASYNC_REG + false_path applied"
|
||||
|
||||
# Waiver 5: CDC-11 — doppler_valid fan-out to USB range_valid_sync
|
||||
# Second fan-out endpoint of the same doppler_valid signal. Same
|
||||
# justification as Waiver 4.
|
||||
create_waiver -type CDC -id CDC-11 \
|
||||
-from [get_pins -quiet -hierarchical -filter {NAME =~ *doppler_valid_reg/C}] \
|
||||
-to [get_pins -quiet -hierarchical -filter {NAME =~ *usb_inst/range_valid_sync_reg[0]/D}] \
|
||||
-description "doppler_valid CDC fan-out to USB sync chain 2: ASYNC_REG + false_path applied"
|
||||
|
||||
# ============================================================================
|
||||
# END OF CONSTRAINTS
|
||||
# ============================================================================
|
||||
|
||||
Reference in New Issue
Block a user