Run KAT for LWC

 

本文介绍了如何对轻量级密码算法 (LWC) 硬件代码进行已知答案测试 (KAT) 的方法步骤。


准备

  • 下载GMU提供的LWC开发包,其中路径hardware\dummy_lwc\scripts\下包含了测试脚本
  • 安装好Modelsim,可从Intel网站点击下载,选择Intel Quartus blabla,选择版本21.2,选择Individual Files,下载ModelSim相关的文件并安装,参考博客
  • 准备好RTL代码KAT文件

测试环境

建议新建文件夹,并按以下的文件结构准备测试环境

  • src_rtl\:rtl源代码
  • KAT\v1\:KAT文件,两级文件夹是因为官方tb文件中按这个路径读的
    • 路径下应包含do.txtpdi.txtrdi.txtsdi.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仿真

  1. 启动Modelsim,在Transcript窗口中通过cd "path/to/test"命令进入测试文件夹,注意用/而非\

  2. 进入脚本路径:cd scripts

  3. 读取tcl文件:source modelsim.tcl,注意,每次修改tcl文件后,都需要先运行此命令重新读取,再运行后面的命令

  4. 编译,通过报错信息修改文件列表的顺序

    1. 运行ldd命令
    2. 根据报错信息编译文件A:无法找到名称B,在tcl的src_vhdlsrc_verilog列表中,将文件B置于文件A之前
    3. 重新进行第三步,读取tcl文件;再进行第四步;直到仿真能够开始
  5. 如果仿真出错,可用quit -sim命令退出仿真

  6. 如果没有问题,应该只输出类似这种结果

    # ** Note: Testcase #33 MsgID:33 Op:HASH
    #    Time: 20340 ns  Iteration: 1  Instance: /lwc_tb
    

    如果只有个别测试出错,大部分测试通过,有可能是用的LWC接口版本不同。有的实现使用了较老的版本,用新版本测试会有个别测试出错,可以查看实现的相关说明,找到对应版本进行测试。

相关链接