@@ -1,36 +1,26 @@
# create_project.tcl — 自动创建 Vivado 工程(仿真用),加载 ML-KEM KeyGen
# 顶层 mlkem_top 及其全部叶子算子与参数化 KAT testbench。
# create_project.tcl — 自动创建 Vivado 工程(仿真用),加载 ML-KEM 顶层模块
# mlkem_top 及其全部叶子算子与 hello_world 端到端 testbench。
#
# 与已验证的 XSIM 流程( sync_rtl/top/TB/xsim_run.tcl) 保持一致:
# 与已验证的 XSIM 流程保持一致:
# - 加载 mlkem_top 实际依赖的全部 RTL 源文件(含 sd_bram 存储)
# - 顶层仿真模块 = tb_mlkem_kg_katK _xsim
# - 运行时安全等级由 generic KP( 2/3/4) 选择, 用例号由 +CASE 选择
# - 顶层仿真模块 = tb_mlkem_hello_world _xsim
#
# Usage:
# cd ~/Dev/mlkem
# vivado -mode batch -source create_project.tcl
# 或在 Vivado Tcl Console 中:
# source create_project.tcl
#
# 切换被仿真的配置(默认 KP=2, CASE=0) : 编辑下方 SIM_KP / SIM_CASE 后重跑,
# 或在工程打开后执行:
# set_property generic "KP=4" [get_filesets sim_1]
# set_property -name {xsim.simulate.xsim.more_options} -value {-testplusarg CASE=2} -objects [get_filesets sim_1]
set PROJECT_NAME mlkem
set PROJECT_DIR [ file normalize [ file dirname [ info script] ] ]
# 默认仿真配置(可改)
set SIM_KP 2 ; # ML-KEM 方案: 2=512, 3=768, 4=1024
set SIM_CASE 0 ; # KAT 用例号( K=2: 0..4, K=3/4: 0..2)
# 仅仿真工程,无需指定 FPGA part( XSim 用默认 part 即可)
create_project - force $ { PROJECT_NAME } $ { PROJECT_DIR } / vivado_prj
set_property target_simulator XSim [ current_project ]
# ===================================================================
# RTL 源文件 —— 与 xsim_run.tcl 完全一致
# RTL 源文件 —— hello_world 所需的全部模块
# ===================================================================
# ── SHA3 / Keccak ──
@@ -56,60 +46,41 @@ 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
# ── 参数化 KAT testbench ──
read_verilog - sv $ { PROJECT_DIR } / sync_rtl/ top/ TB/ tb_mlkem_kg_katK _xsim.v
# ── hello_world 端到端 testbench ──
read_verilog - sv $ { PROJECT_DIR } / sync_rtl/ top/ TB/ tb_mlkem_hello_world _xsim.v
# ===================================================================
# 仿真设置
# ===================================================================
# 顶层仿真模块
set_property top tb_mlkem_kg_katK _xsim [ get_filesets sim_1]
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]
# 运行时安全等级:通过 TB 顶层 generic KP 传入( 2/3/4)
set_property generic " K P = $ { S I M _ K P } " [ get_filesets sim_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 1 ns/ 1 ps} - objects [ get_filesets sim_1]
# ===================================================================
# 测试向量: Vivado GUI 在 vivado_prj/mlkem.sim/sim_1/behav/xsim/ 下运行
# xsim, 而 TB 的 $readmemh 路径相对工程根( sync_rtl/top/TB/vectors/…)。
# 用 compile 的 pre-hook( 在 xsim 工作目录、且在 compile/elaborate/simulate
# 之前执行)把整套 KAT 向量复制到同名相对路径下; CASE 经 -testplusarg 选择。
#
# 注意: 2019.2 的 sim_1 没有 simulate.tcl.pre 属性,且追加 -tclbatch 会排在
# Vivado 自带(含 "run all")的 tclbatch 之后、即仿真跑完才执行(太迟)。
# 因此用 xsim.compile.tcl.pre —— 它最早执行且就在仿真工作目录里。
# ===================================================================
set pre_tcl [ file join $ { PROJECT_DIR } vivado_prj copy_vectors_pre.tcl]
set fp [ open $pre_tcl w]
puts $fp " # A u t o - g e n e r a t e d b y c r e a t e _ p r o j e c t . t c l : 复 制 K A T 向 量 到 x s i m 工 作 目 录 "
puts $fp " f i l e m k d i r s y n c _ r t l / t o p / T B / v e c t o r s "
puts $fp " f o r e a c h v \[ g l o b - n o c o m p l a i n [ f i l e j o i n $ { P R O J E C T _ D I R } s y n c _ r t l t o p T B v e c t o r s k a t _ k * _ c * _ * . h e x ] \] { "
puts $fp " f i l e c o p y - f o r c e \$ v s y n c _ r t l / t o p / T B / v e c t o r s / "
puts $fp " } "
puts $fp " p u t s { \[ c r e a t e _ p r o j e c t \] K A T v e c t o r s c o p i e d t o x s i m w o r k i n g d i r } "
close $fp
set_property - name { xsim.compile.tcl.pre } - value $pre_tcl - objects [ get_filesets sim_1]
set_property - name { xsim.simulate.xsim.more_options } \
-value " - t e s t p l u s a r g C A S E = $ { S I M _ C A S E } " \
-objects [ get_filesets sim_1]
# ===================================================================
puts " = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = "
puts " P r o j e c t c r e a t e d : $ { P R O J E C T _ D I R } / v i v a d o _ p r j / $ { P R O J E C T _ N A M E } . x p r "
puts " 仿 真 配 置 : M L - K E M K = $ { S I M _ K P } , K A T C A S E = $ { S I M _ C A S E } "
puts " 仿 真 模 块 : t b _ m l k e m _ h e l l o _ w o r l d _ x s i m ( K = 2 硬 编 码 ) "
puts " "
puts " 运 行 仿 真 ( r u n t i m e = a l l , 会 自 动 跑 到 T B 的 \$ f i n i s h ) : "
puts " - G U I : 打 开 工 程 后 点 R u n S i m u l a t i o n , 或 T c l C o n s o l e : l a u n c h _ s i m u l a t i o n "
@@ -117,8 +88,5 @@ puts " - batch: vivado -mode batch -source create_project.tcl 后,"
puts " 另 开 : o p e n _ p r o j e c t v i v a d o _ p r j / m l k e m . x p r ; l a u n c h _ s i m u l a t i o n "
puts " ( 勿 在 l a u n c h _ s i m u l a t i o n 后 再 手 动 r u n a l l — — 仿 真 已 到 \$ f i n i s h , "
puts " 再 r u n 会 触 发 T B 的 1 2 0 m s 看 门 狗 误 报 t i m e o u t ) "
puts " 期 望 输 出 : K = $ { S I M _ K P } C A S E $ { S I M _ C A S E } P A S S : e k = = p k , d k = = s k "
puts " "
puts " 切 换 配 置 ( 如 K = 4 ) : 编 辑 脚 本 顶 部 S I M _ K P / S I M _ C A S E 重 跑 本 脚 本 , "
puts " 或 在 已 打 开 工 程 中 改 g e n e r i c 后 r e l a u n c h _ s i m 。 "
puts " 期 望 输 出 : h e l l o _ w o r l d 端 到 端 : K e y G e n → E n c a p s → X O R → D e c a p s → X O R 全 P A S S "
puts " = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = "