Files
mlkem-sync/create_project.tcl
FallenSigh 717a9929b6 fix(rtl,scripts): replace combinational divider with Barrett multiplication, add synthesis include_dirs, set 50MHz clock
- Replace / and % operators in comp_decomp_sync with Barrett multiply-by-reciprocal
  (dividend * 5039 >> 24) + correction step. Eliminates ~100 CARRY4 divider chain.
- Add include_dirs for sources_1 fileset so Windows Vivado synthesis finds defines.vh.
- Change CLK_PERIOD from 10.0 (100MHz) to 40.0 (50MHz) to reflect actual target.
2026-06-30 00:23:43 +08:00

94 lines
4.2 KiB
Tcl
Raw Permalink 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.
# create_project.tcl — 自动创建 Vivado 工程(仿真用),加载 ML-KEM 顶层模块
# mlkem_top 及其全部叶子算子与 hello_world 端到端 testbench。
#
# 与已验证的 XSIM 流程保持一致:
# - 加载 mlkem_top 实际依赖的全部 RTL 源文件(含 sd_bram 存储)
# - 顶层仿真模块 = tb_mlkem_hello_world_xsim
#
# Usage:
# cd ~/Dev/mlkem
# vivado -mode batch -source create_project.tcl
# 或在 Vivado Tcl Console 中:
# source create_project.tcl
set PROJECT_NAME mlkem
set PROJECT_DIR [file normalize [file dirname [info script]]]
# 仅仿真工程,无需指定 FPGA partXSim 用默认 part 即可)
create_project -force ${PROJECT_NAME} ${PROJECT_DIR}/vivado_prj
set_property target_simulator XSim [current_project]
# ===================================================================
# RTL 源文件 —— hello_world 所需的全部模块
# ===================================================================
# ── SHA3 / Keccak ──
read_verilog -sv ${PROJECT_DIR}/sync_rtl/sha3/keccak_round.v
read_verilog -sv ${PROJECT_DIR}/sync_rtl/sha3/keccak_core.v
read_verilog -sv ${PROJECT_DIR}/sync_rtl/sha3/sha3_top_shared.v
# ── 采样(共享 keccak_core 变体)──
read_verilog -sv ${PROJECT_DIR}/sync_rtl/sample_ntt/sample_ntt_sync_shared.v
read_verilog -sv ${PROJECT_DIR}/sync_rtl/sample_cbd/sample_cbd_sync_shared.v
# ── NTT ──
read_verilog -sv ${PROJECT_DIR}/sync_rtl/ntt/barrett_mul.v
read_verilog -sv ${PROJECT_DIR}/sync_rtl/ntt/zeta_rom.v
read_verilog -sv ${PROJECT_DIR}/sync_rtl/ntt/butterfly_unit.v
read_verilog -sv ${PROJECT_DIR}/sync_rtl/ntt/ntt_core.v
# ── 多项式乘法 ──
read_verilog -sv ${PROJECT_DIR}/sync_rtl/poly_mul/basecase_mul.v
read_verilog -sv ${PROJECT_DIR}/sync_rtl/poly_mul/poly_mul_zeta_rom.v
read_verilog -sv ${PROJECT_DIR}/sync_rtl/poly_mul/poly_mul_sync.v
# ── 存储ek/dk 字节缓冲registered-read BRAM──
read_verilog -sv ${PROJECT_DIR}/sync_rtl/storage/sd_bram.v
# ── 公共原语 ──
read_verilog -sv ${PROJECT_DIR}/sync_rtl/common/pipeline_reg.v
# ── 压缩 / 解压缩 ──
read_verilog -sv ${PROJECT_DIR}/sync_rtl/comp_decomp/comp_decomp_sync.v
# ── 顶层 KeyGen 集成 ──
read_verilog -sv ${PROJECT_DIR}/sync_rtl/top/mlkem_top.v
# ── hello_world 端到端 testbench ──
read_verilog -sv ${PROJECT_DIR}/sync_rtl/top/TB/tb_mlkem_hello_world_xsim.v
# ===================================================================
# 仿真设置
# ===================================================================
# 顶层仿真模块
set_property top tb_mlkem_hello_world_xsim [get_filesets sim_1]
set_property top_lib xil_defaultlib [get_filesets sim_1]
# `include "sync_rtl/common/defines.vh" 的包含路径(同时用于仿真和综合)
set_property include_dirs ${PROJECT_DIR} [get_filesets sim_1]
set_property include_dirs ${PROJECT_DIR} [get_filesets sources_1]
# hello_world TB 使用 localparam KP=2硬编码无 generic 传入
# 切换 K 值需编辑 tb_mlkem_hello_world_xsim.v 中的 KP 参数后重跑
# 跑到 $finish 为止显式时标XSim 默认已加 --relax勿重复
set_property -name {xsim.simulate.runtime} -value {all} -objects [get_filesets sim_1]
set_property -name {xsim.elaborate.xelab.more_options} \
-value {--timescale 1ns/1ps} -objects [get_filesets sim_1]
# ===================================================================
puts "========================================"
puts " Project created: ${PROJECT_DIR}/vivado_prj/${PROJECT_NAME}.xpr"
puts " 仿: tb_mlkem_hello_world_xsim (K=2 )"
puts ""
puts " 仿runtime=all TB \$finish"
puts " - GUI: Run Simulation Tcl Console: launch_simulation"
puts " - batch: vivado -mode batch -source create_project.tcl "
puts " : open_project vivado_prj/mlkem.xpr; launch_simulation"
puts " launch_simulation run all 仿 \$finish"
puts " run TB 120ms timeout"
puts " : hello_world : KeyGenEncapsXORDecapsXOR PASS"
puts "========================================"