Convert CIC comb + FIR delay_line to sync reset for DSP48 absorption (Build 10)
CIC: async→sync reset on decimation control, valid pipeline, and comb section. Added (* use_dsp = "yes" *) on comb[] to force DSP48E1 absorption of 28-bit subtracts (was 7-deep CARRY4, Build 9 critical path at WNS +0.128ns). Targets ~10 additional DSP48E1s. FIR: async→sync reset on delay_line block, enabling DSP48E1 AREG/BREG absorption. Targets elimination of ~2,522 DPIR-1 methodology warnings. 13/13 regression suites pass. Integration golden: 2048/2048 exact match.
This commit is contained in:
@@ -476,7 +476,7 @@ assign pcout_3 = sim_int_3;
|
|||||||
// CONTROL AND MONITORING (fabric logic)
|
// CONTROL AND MONITORING (fabric logic)
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
reg signed [COMB_WIDTH-1:0] integrator_sampled;
|
reg signed [COMB_WIDTH-1:0] integrator_sampled;
|
||||||
reg signed [COMB_WIDTH-1:0] comb [0:STAGES-1];
|
(* use_dsp = "yes" *) reg signed [COMB_WIDTH-1:0] comb [0:STAGES-1];
|
||||||
reg signed [COMB_WIDTH-1:0] comb_delay [0:STAGES-1][0:COMB_DELAY-1];
|
reg signed [COMB_WIDTH-1:0] comb_delay [0:STAGES-1][0:COMB_DELAY-1];
|
||||||
|
|
||||||
// Enhanced control and monitoring
|
// Enhanced control and monitoring
|
||||||
@@ -545,7 +545,9 @@ initial begin
|
|||||||
end
|
end
|
||||||
|
|
||||||
// Decimation control + monitoring (integrators are now DSP48E1 instances)
|
// Decimation control + monitoring (integrators are now DSP48E1 instances)
|
||||||
always @(posedge clk or negedge reset_n) begin
|
// Sync reset: enables FDRE inference for better timing at 400 MHz.
|
||||||
|
// Reset is already synchronous to clk via reset synchronizer in parent module.
|
||||||
|
always @(posedge clk) begin
|
||||||
if (!reset_n) begin
|
if (!reset_n) begin
|
||||||
integrator_sampled <= 0;
|
integrator_sampled <= 0;
|
||||||
decimation_counter <= 0;
|
decimation_counter <= 0;
|
||||||
@@ -599,7 +601,8 @@ always @(posedge clk or negedge reset_n) begin
|
|||||||
end
|
end
|
||||||
|
|
||||||
// Pipeline the valid signal for comb section
|
// Pipeline the valid signal for comb section
|
||||||
always @(posedge clk or negedge reset_n) begin
|
// Sync reset: matches decimation control block reset style.
|
||||||
|
always @(posedge clk) begin
|
||||||
if (!reset_n) begin
|
if (!reset_n) begin
|
||||||
data_valid_comb <= 0;
|
data_valid_comb <= 0;
|
||||||
end else begin
|
end else begin
|
||||||
@@ -608,7 +611,20 @@ always @(posedge clk or negedge reset_n) begin
|
|||||||
end
|
end
|
||||||
|
|
||||||
// Enhanced comb section with scaling and saturation monitoring
|
// Enhanced comb section with scaling and saturation monitoring
|
||||||
always @(posedge clk or negedge reset_n) begin
|
// Sync reset: converts FDCE → FDRE for all comb registers. This eliminates
|
||||||
|
// async-clear routing overhead and enables DSP48E1 absorption of the 28-bit
|
||||||
|
// subtracts via Vivado's use_dsp inference. The comb subtraction was the
|
||||||
|
// design-wide critical path in Build 9 (8 logic levels of CARRY4 at 400 MHz,
|
||||||
|
// WNS = +0.128ns). DSP48E1 ALU performs 48-bit add/subtract in a single
|
||||||
|
// cycle with zero fabric logic, targeting WNS > +1.0ns.
|
||||||
|
//
|
||||||
|
// The (* use_dsp = "yes" *) attribute on comb[] tells Vivado synthesis to
|
||||||
|
// map the subtract into DSP48E1 P = C - A:B (ALUMODE=4'b0011). Each comb
|
||||||
|
// stage becomes one DSP48E1 with PREG=1, completely eliminating the CARRY4
|
||||||
|
// chain from fabric. With 5 stages × 2 channels (I/Q) = 10 additional
|
||||||
|
// DSP48E1s, total DSP usage rises from 130 to ~140 out of 740 (18.9%).
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
if (!reset_n) begin
|
if (!reset_n) begin
|
||||||
for (i = 0; i < STAGES; i = i + 1) begin
|
for (i = 0; i < STAGES; i = i + 1) begin
|
||||||
comb[i] <= 0;
|
comb[i] <= 0;
|
||||||
|
|||||||
@@ -92,8 +92,13 @@ integer i;
|
|||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// Pipeline Stage 0: Shift delay line on data_valid
|
// Pipeline Stage 0: Shift delay line on data_valid
|
||||||
|
// Sync reset: enables DSP48E1 AREG/BREG absorption for delay_line registers
|
||||||
|
// feeding the multipliers. Async reset (FDCE) prevented Vivado from using
|
||||||
|
// the DSP48E1 internal A/B pipeline registers — the source of 2,522 DPIR-1
|
||||||
|
// methodology warnings in Build 9. Converting to sync reset (FDRE) allows
|
||||||
|
// Vivado to absorb these into DSP48E1 AREG/BREG, further reducing LUT count.
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
always @(posedge clk or negedge reset_n) begin
|
always @(posedge clk) begin
|
||||||
if (!reset_n) begin
|
if (!reset_n) begin
|
||||||
for (i = 0; i < TAPS; i = i + 1) begin
|
for (i = 0; i < TAPS; i = i + 1) begin
|
||||||
delay_line[i] <= 0;
|
delay_line[i] <= 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user