Files
mlkem-sync/.trellis/tasks/archive/2026-06/06-25-vivado-verilog-tb/prd.md

168 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 编写所有模块的 Vivado Verilog Testbench
## Goal
为 ML-KEM 硬件项目的所有 RTL 模块编写 Verilog testbench.v 文件),可在 Vivado xsim 中仿真。遵循已有 sha3/TB/ 的 xsim testbench 约定和风格。
## What I already know
### 项目结构
- 项目根目录:`/home/fallensigh/Dev/mlkem`
- 所有 RTL 源码在 `sync_rtl/` 下按功能分目录
- 已有 testbench 在各自的 `TB/` 子目录下
### 已有 testbench 情况
| 模块目录 | 已有 Verilator (.cpp) TB | 已有 XSIM (.v) TB | 需要新增 .v TB |
|----------|------------------------|-------------------|---------------|
| sha3/ | ✅ tb_sha3.cpp | ✅ tb_sha3_xsim.v, tb_sha3_xsim_simple.v, tb_keccak_core_xsim.v | ❌ 已完成 |
| sha3_chain/ | ✅ tb_sha3_chain.cpp | ❌ | ✅ |
| ntt/ | ✅ tb_ntt.cpp | ❌ | ✅ |
| poly_mul/ | ✅ tb_poly_mul.cpp | ❌ | ✅ |
| poly_arith/ | ✅ tb_poly_arith.cpp | ❌ | ✅ |
| sample_cbd/ | ✅ tb_sample_cbd.cpp | ❌ | ✅ |
| sample_ntt/ | ✅ tb_sample_ntt.cpp | ❌ | ✅ |
| rng/ | ✅ tb_rng.cpp | ❌ | ✅ |
| comp_decomp/ | ✅ tb_comp_decomp.cpp | ❌ | ✅ |
| storage/ | ✅ tb_storage.cpp | ❌ | ✅ |
| mod_add/ | ✅ tb_mod_add.cpp | ❌ | ✅ |
| common/ | ❌ | ❌ | ✅ (pipeline_reg, skid_buffer) |
### RTL 模块清单(按目录)
**sha3/** (已有 TB)
- `sha3_top.v` - SHA3 顶层G/H/J 模式)
- `keccak_core.v` - Keccak 24 轮核心
- `keccak_round.v` - 单轮 Keccak组合逻辑
**sha3_chain/**
- `sha3_chain_top.v` - SHA3 链式调用顶层
**ntt/**
- `ntt_sync.v` - NTT 同步顶层wrapper
- `ntt_core.v` - NTT 核心Barrett 约简 + butterfly
- `butterfly_unit.v` - 蝶形运算单元
- `barrett_mul.v` - Barrett 模乘
- `zeta_rom.v` - Zeta 预计算 ROM
**poly_mul/**
- `poly_mul_sync.v` - 多项式乘法顶层
- `poly_mul_zeta_rom.v` - PolyMul zeta ROM
- `basecase_mul.v` - 基础乘法
**poly_arith/**
- `poly_arith_sync.v` - 多项式加减PolyAdd/PolySub
**sample_cbd/**
- `sample_cbd_sync.v` - CBD 采样SHAKE-256 PRF
**sample_ntt/**
- `sample_ntt_sync.v` - NTT 域采样
**rng/**
- `rng_sync.v` - Galois LFSR PRNG256-bit
**comp_decomp/**
- `comp_decomp_sync.v` - 压缩/解压缩
**storage/**
- `s_bram.v` - 单口 BRAM
- `sd_bram.v` - 简单双口 BRAM
**mod_add/**
- `mod_add_sync.v` - 模加法
**common/**
- `pipeline_reg.v` - 流水线寄存器
- `skid_buffer.v` - Skid Buffer
### 现有 XSIM TB 约定(参考 sha3/TB/
- 命名:`tb_<module>_xsim.v`
- 时钟100MHz10ns 周期(`always #5 clk = ~clk`
- 复位:`rst_n` 低有效 3 周期
- 自检模式hardcode 期望值,用 `$error` 报告 mismatch
- 文件向量模式:`$readmemh` 从 hex 文件读测试向量
- 输出:`$display` 日志 + `$fwrite` 结果文件
- 超时看门狗:防止死锁
- 编译脚本:`xsim_run.tcl` (xvlog → xelab → xsim)
### 接口约定(从各模块 port 列表得出)
- 所有模块使用 synchronous valid/ready 握手
- `clk, rst_n` 标准端口
- 数据宽度12-bit 系数ntt/poly256-bitrng512-bitsha3
- 部分模块有 `done_o` 信号(如 ntt_sync
## Assumptions
1. 测试自检模式为主,可对比 Python 参考实现的期望输出
2. 简单模块common/)用 hardcoded 向量测试
3. 复杂模块可能需要 hex 文件向量
4. 子模块butterfly_unit, barrett_mul, zeta_rom, basecase_mul 等)通过父模块间接测试
## Decisions Made
* **测试范围**:只测顶层 sync 模块,子模块通过父模块间接覆盖
* **common/** 模块pipeline_reg, skid_buffer不在本次范围内
* **测试模式**:文件向量模式(`$readmemh` 读 hex 文件),参考 `tb_sha3_xsim.v` 风格
* **向量生成**:每个模块配套 Python `gen_vectors.py` 生成输入向量 `.hex` 文件
* **编译脚本**:每个模块目录一个独立的 `xsim_run.tcl`
## 需要编写 TB 的模块清单10 个)
| # | 模块 | 文件 | 接口要点 |
|---|------|------|---------|
| 1 | `sha3_chain_top` | `sync_rtl/sha3_chain/sha3_chain_top.v` | d_in[255:0], start_i → rho_out[255:0], sigma_out[255:0] |
| 2 | `ntt_core` | `sync_rtl/ntt/ntt_core.v` | coeff_in[11:0]×256, mode → coeff_out[11:0]×256, done_o |
| 3 | `poly_mul_sync` | `sync_rtl/poly_mul/poly_mul_sync.v` | coeff_a/b ×256 → coeff_out ×256 |
| 4 | `poly_arith_sync` | `sync_rtl/poly_arith/poly_arith_sync.v` | coeff_a/b[11:0], mode → coeff_out[11:0] (流式) |
| 5 | `sample_cbd_sync` | `sync_rtl/sample_cbd/sample_cbd_sync.v` | seed_i[255:0], nonce_i[7:0], eta_i → coeff_o[11:0]×256 |
| 6 | `sample_ntt_sync` | `sync_rtl/sample_ntt/sample_ntt_sync.v` | rho_i[255:0], k/i/j_idx → coeff_o[11:0]×256 |
| 7 | `rng_sync` | `sync_rtl/rng/rng_sync.v` | valid_i → data_o[255:0] (LFSR) |
| 8 | `comp_decomp_sync` | `sync_rtl/comp_decomp/comp_decomp_sync.v` | coeff_in[11:0], d[4:0], mode → coeff_out[11:0] |
| 9 | `s_bram` / `sd_bram` | `sync_rtl/storage/s_bram.v`, `sd_bram.v` | 参数化 BRAM 读写 |
| 10 | `mod_add_sync` | `sync_rtl/mod_add/mod_add_sync.v` | a[11:0], b[11:0] → sum[11:0] |
## Requirements (final)
* 10 个顶层 sync 模块各产出 4 个文件:
- `TB/tb_<module>_xsim.v` — Verilog testbench文件向量模式`$readmemh` + `$fwrite`
- `TB/vectors/<module>_input.hex` — 测试输入向量
- `TB/gen_vectors.py` — Python 脚本生成输入向量
- `TB/xsim_run.tcl` — Vivado 编译+仿真脚本
* 遵循 sha3/TB/ 的编码风格和目录结构:
- 时钟 100MHz (`always #5 clk = ~clk`)
- 复位 `rst_n` 低有效 3 周期
- valid/ready 握手协议
- 超时看门狗
- pass/fail 统计 + `$display` 报告
* 支持 `xvlog -sv` + `xelab` + `xsim -R` 流程
## Acceptance Criteria
* [ ] 10 个模块各有完整的 TB 目录tb .v + gen_vectors.py + xsim_run.tcl
* [ ] 每个 testbench 可通过 `xvlog -sv` 编译无 error
* [ ] 每个 testbench 可通过 `xelab` + `xsim -R` 跑通仿真
* [ ] 输出清晰的 pass/fail 报告
* [ ] 包含超时看门狗防止死锁
* [ ] Python `gen_vectors.py` 可独立运行生成 hex 向量文件
## Definition of Done
* 所有 10 个模块的 4 类文件已创建
* 每个 TB 遵循 `sha3/TB/` 的代码风格
* 向量文件格式与 `$readmemh` 兼容
## Out of Scope
* Verilator C++ testbench已有
* 覆盖率收集
* UVM 框架
* 子模块独立 TBbutterfly_unit, barrett_mul, basecase_mul, ROM 等)
* common/ 模块 TBpipeline_reg, skid_buffer
## Technical Notes
- 参考已有 TB`sync_rtl/sha3/TB/tb_sha3_xsim.v`(文件向量模式)、`sync_rtl/sha3/TB/tb_sha3_xsim_simple.v`(简单自检模式)
- 编译脚本参考:`sync_rtl/sha3/TB/xsim_run.tcl`
- RTL spec`.trellis/spec/rtl/verilator-conventions.md`Verilator 相关,部分适用)
- 时钟定义:`sync_rtl/common/defines.vh` 中的 `CLK_PERIOD 10.0`