本文介绍了如何对轻量级密码算法 (LWC) 硬件代码进行已知答案测试 (KAT) 的方法步骤。
准备
- 下载GMU提供的LWC开发包,其中路径
hardware\dummy_lwc\scripts\
下包含了测试脚本 - 安装好Modelsim,可从Intel网站点击下载,选择Intel Quartus blabla,选择版本21.2,选择Individual Files,下载ModelSim相关的文件并安装,参考博客
- 准备好RTL代码和KAT文件
- 如果是测试别人的实现,别人提供的库中应该有对应的KAT。
- 如果是自己的实现,可以用开发包中
software\cryptotvgen\
中的测试向量生成器cryptotvgen生成KAT文件
测试环境
建议新建文件夹,并按以下的文件结构准备测试环境
src_rtl\
:rtl源代码KAT\v1\
:KAT文件,两级文件夹是因为官方tb文件中按这个路径读的- 路径下应包含
do.txt
、pdi.txt
、rdi.txt
、sdi.txt
- 如果没有
rdi.txt
:请先随便从别的库里找一个,然后根据src_rtl\LWC_config.vhd
文件(或类似名称)中RW
的定义,修改rdi.txt
的每行长度(RW
是每行bit数,rdi.txt
中是16进制表示,因此每行应有RW/4
个数字)
- 路径下应包含
scripts\
:测试脚本modelsim.tcl
,拷贝自LWC开发包\hardware\dummy_lwc\scripts\modelsim.tcl
,稍后会对内容进行修改
LWC_rtl\
:LWC的接口源代码,拷贝自LWC开发包\hardware\LWC_rtl\
LWC_tb\
:LWC的testbench代码,拷贝自LWC开发包\hardware\LWC_tb\
修改测试脚本
修改scripts\modelsim.tcl
-
原接口库路径设置
set INTERFACE_REPO "../../LWCsrc"
修改为:set INTERFACE_REPO "../LWC_rtl"
-
顶层名称设置
set TOP_LEVEL_NAME LWC_TB
不要修改 -
修改rtl文件列表(注释
# Set implementation files
后),可以参考原库中.toml
文件中[rtl]
的sources
列表-
vhdl文件放在
src_vhdl
的列表中,例如set src_vhdl [subst { "../src_rtl/CryptoCore_SCA.vhd" "../src_rtl/design_pkg.vhd" "../src_rtl/LWC_config_32.vhd" "../src_rtl/xoodoo_globals.vhd" "$INTERFACE_REPO/data_piso.vhd" "$INTERFACE_REPO/data_sipo.vhd" "$INTERFACE_REPO/FIFO.vhd" "$INTERFACE_REPO/key_piso.vhd" "$INTERFACE_REPO/NIST_LWAPI_pkg.vhd" "$INTERFACE_REPO/PreProcessor.vhd" "$INTERFACE_REPO/PostProcessor.vhd" "$INTERFACE_REPO/LWC_SCA.vhd" }]
-
verilog文件,参考
src_vhdl
格式,新建一个src_verilog
列表,例如set src_verilog [subst { "../src_rtl/xoodoo_n_rounds_SCA.v" "../src_rtl/xoodoo_register_SCA.v" "../src_rtl/xoodoo_round_SCA.v" "../src_rtl/xoodoo_SCA.v" }]
-
tb文件列表
tb_vhdl
,修改为:set tb_vhdl [subst { "../LWC_tb/LWC_TB_SCA.vhd" }]
-
-
修改编译实现部分(注释
# Compile implementation files
后),增加对verilog文件的编译命令:alias imp_com { echo "imp_com" foreach f $src_vhdl {vcom -quiet -work work $f} foreach f $src_verilog {vlog -quiet -work work $f} }
-
修改波形列表设置(注释
# Add wave form and run
后)-
如果只想通过KAT验证是否正确,可以把该列表中除第一行外的命令全部注释(一行不留会报错
invalid command name "#"
),得到:alias run_wave { echo "\[exec\] run_wave" }
-
如果想观察某些波形,推荐新建文件
wave.do
,将添加波形命令写到该文件中。语法可用搜索引擎搜索“Modelsim do”或“Modelsim tcl”
-
使用Modelsim仿真
-
启动Modelsim,在
Transcript
窗口中通过cd "path/to/test"
命令进入测试文件夹,注意用/
而非\
。 -
进入脚本路径:
cd scripts
-
读取tcl文件:
source modelsim.tcl
,注意,每次修改tcl文件后,都需要先运行此命令重新读取,再运行后面的命令 -
编译,通过报错信息修改文件列表的顺序
- 运行
ldd
命令 - 根据报错信息
编译文件A:无法找到名称B
,在tcl的src_vhdl
或src_verilog
列表中,将文件B置于文件A之前 - 重新进行第三步,读取tcl文件;再进行第四步;直到仿真能够开始
- 运行
-
如果仿真出错,可用
quit -sim
命令退出仿真 -
如果没有问题,应该只输出类似这种结果
# ** Note: Testcase #33 MsgID:33 Op:HASH # Time: 20340 ns Iteration: 1 Instance: /lwc_tb
如果只有个别测试出错,大部分测试通过,有可能是用的LWC接口版本不同。有的实现使用了较老的版本,用新版本测试会有个别测试出错,可以查看实现的相关说明,找到对应版本进行测试。