feat: add test vector generation for RTL verification

Improve generate_test_vectors() to use mixed SNR levels (high SNR for
first half, nominal for second half) ensuring a mix of converged and
non-converged test cases. Add gen_firmware_vectors.py converter that
reads test_vectors.json and produces packed LLR data matching the
RTL wishbone interface format (5 LLRs per 32-bit word, 6-bit two's
complement).

Generated 20 vectors: 11 converged, 9 non-converged.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
cah
2026-02-25 18:36:26 -07:00
parent 9a28e30bed
commit 74baf3cd05
3 changed files with 22466 additions and 3 deletions

View File

@@ -397,14 +397,26 @@ def run_ber_simulation(lam_s_db_range, lam_b=0.1, n_frames=1000, max_iter=30):
def generate_test_vectors(n_vectors=10, lam_s=2.0, lam_b=0.1, max_iter=30):
"""Generate test vectors for RTL verification."""
"""
Generate test vectors for RTL verification.
Uses a mix of signal levels to ensure we get both converged and
non-converged vectors. First half uses high SNR (lam_s * 3) for
reliable convergence, then uses the specified lam_s for realistic
channel conditions.
"""
H = build_full_h_matrix()
vectors = []
# Use high SNR for first half to guarantee converged vectors
n_high_snr = n_vectors // 2
lam_schedule = [lam_s * 3.0] * n_high_snr + [lam_s] * (n_vectors - n_high_snr)
for i in range(n_vectors):
info = np.random.randint(0, 2, K)
codeword = ldpc_encode(info, H)
llr_float, photons = poisson_channel(codeword, lam_s, lam_b)
cur_lam_s = lam_schedule[i]
llr_float, photons = poisson_channel(codeword, cur_lam_s, lam_b)
llr_q = quantize_llr(llr_float)
decoded, converged, iters, syn_wt = decode_layered_min_sum(llr_q, max_iter)
@@ -420,10 +432,11 @@ def generate_test_vectors(n_vectors=10, lam_s=2.0, lam_b=0.1, max_iter=30):
'iterations': iters,
'syndrome_weight': syn_wt,
'bit_errors': int(np.sum(decoded != info)),
'lam_s': cur_lam_s,
}
vectors.append(vec)
status = "PASS" if np.array_equal(decoded, info) else f"FAIL ({vec['bit_errors']} errs)"
print(f" Vector {i}: {status} (iter={iters}, converged={converged})")
print(f" Vector {i}: {status} (lam_s={cur_lam_s:.1f}, iter={iters}, converged={converged})")
return vectors