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:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user