Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add top level Makefile and func tests in CI #4

Merged
merged 4 commits into from
Oct 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,17 @@ jobs:
release/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

functest:
runs-on: ubuntu-24.04
steps:
- name: Check out repository code
uses: actions/checkout@v4
with:
submodules: true
- run: sudo apt-get install -y yosys verilator iverilog
- run: make func-tests




2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ beh_simu/tvs/generated

docs/SMAesH.pdf


work

# Created by https://www.toptal.com/developers/gitignore/api/latex
# Edit at https://www.toptal.com/developers/gitignore?templates=latex
Expand Down
65 changes: 65 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Use in order to use the compress-optimized sbox.
NSHARES?=2
WORK?=work/d$(NSHARES)
WORKDIR=$(abspath $(WORK))

# Python Venv
SHELL=/bin/bash
VE=$(abspath $(WORKDIR)/ve)
VE_INSTALLED=$(VE)/installed
PYTHON_VE=source $(VE)/bin/activate

# Directory created containing all the HDL files
DIR_HDL?=$(WORKDIR)/hdl
HDL_DONE = $(DIR_HDL)/.gather

# path where the COMPRESS tool is located (root of the git)
DIR_COMPRESS_ROOT?=./sboxes-compress/compress

##################"
COMPRESS_WORKDIR=$(WORKDIR)/sbox
SBOX_FILE=$(COMPRESS_WORKDIR)/circuits/canright_aes_sbox_dual_d$(NSHARES)_l4/design.v

DIR_COMPRESS_GADGETS=$(DIR_COMPRESS_ROOT)/gadget_library
DIR_SMAESH_HDL=hdl/smaesh_hpc

.PHONY: sbox hdl

$(VE)/pyvenv.cfg:
mkdir -p $(WORKDIR)
python3 -m venv $(VE)

$(VE_INSTALLED): $(VE)/pyvenv.cfg
${PYTHON_VE}; python -m pip install -r func_tests/requirements.txt
touch $(VE_INSTALLED)

$(SBOX_FILE):
make -C sboxes-compress WORK=$(COMPRESS_WORKDIR) DS=$(NSHARES)

sbox: $(SBOX_FILE)

$(HDL_DONE): $(SBOX_FILE)
OUT_DIR=${DIR_HDL} ./gather_sources.sh $(DIR_SMAESH_HDL) $(DIR_COMPRESS_GADGETS)/BIN $(DIR_COMPRESS_GADGETS)/MSK
cp $(SBOX_FILE) $(DIR_HDL)/canright_aes_sbox_dual.v
cp $(dir $(SBOX_FILE))/design.vh $(DIR_HDL)
echo "\`define DEFAULTSHARES ${NSHARES}" > $(DIR_HDL)/architecture_default.vh
touch $(HDL_DONE)

hdl: $(HDL_DONE)

# Functionnal testing
FUNC_LOG=$(WORKDIR)/functests/simu.log
FUNC_SUCCESS=$(WORKDIR)/functests/success
$(FUNC_LOG): $(VE_INSTALLED) $(HDL_DONE)
mkdir $(dir $(FUNC_LOG))
$(PYTHON_VE); make -C func_tests NSHARES=$(NSHARES) WORK_CASE=$(WORKDIR)/functests RTL_DIR_HDL=$(DIR_HDL) simu | tee $@

# Mark simulation success (simulation always return a zero exit code).
%/success: %/simu.log
grep -q -s FAIL=0 $< && touch $@ || exit 1

func-tests: $(FUNC_SUCCESS)


clean:
if [ -d $(DIR_HDL) ]; then rm -r $(DIR_HDL); fi
15 changes: 7 additions & 8 deletions func_tests/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,32 +8,31 @@ RTL_DIR_HDL?=$(WORK_CASE)/smaesh_hdl_d$(NSHARES)

####### Verilator related
VERILATOR_MDIR=$(WORK_CASE)/verilator
VERILATOR_BUILD_PROC?=8
VERILATOR_BUILD_PROC?=1

####### COCOTB related
# defaults
export SIM ?= icarus
#export EXTRA_ARGS ?= -Wno-NULLPORT -Wno-PINMISSING -Wno-WIDTH -j $(VERILATOR_BUILD_PROC)
export SIM ?= verilator
export EXTRA_ARGS ?= -Wno-NULLPORT -Wno-PINMISSING -Wno-WIDTH -j $(VERILATOR_BUILD_PROC) #--trace --trace-structs
export TOPLEVEL_LANG ?= verilog
# Scratch directory
export SIM_BUILD ?= $(WORK_CASE)
# Sources related
export VERILOG_INCLUDE_DIRS?= $(RTL_DIR_HDL)
export VERILOG_SOURCES ?= $(shell ls $(RTL_DIR_HDL)/*.v)
export VERILOG_SOURCES ?= $(RTL_DIR_HDL)/*.v
# TOPLEVEL is the name of the toplevel module in your Verilog or VHDL file
export TOPLEVEL ?= smaesh_hpc
# MODULE is the basename of the Python test file
export MODULE ?= functionnal_tests
# Logging level
export COCOTB_LOG_LEVEL ?= INFO
# Results
export COCOTB_RESULTS_FILE = $(WORK_CASE)/result.xml

# include cocotb's make rules to take care of the simulator setup
COCOTB_DIR_MAKEFILES=$(shell cocotb-config --makefiles)

$(RTL_DIR_HDL):
NSHARES=$(NSHARES) DIR_HDL=$(RTL_DIR_HDL) make -C ../hdl all

simu: $(RTL_DIR_HDL)
simu:
make -f $(COCOTB_DIR_MAKEFILES)/Makefile.sim

clean:
Expand Down
84 changes: 42 additions & 42 deletions func_tests/functionnal_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -368,48 +368,48 @@ async def run(self):
############################################################
#### TESTS #################################################

## Simple tests for KATs verif first
### Test for the AES-128 encryption KAT
#@cocotb.test()
#async def AES_128_ENC_KAT(dut):
# # Load the test cases
# list_cases = utils_KAT.load_AES_BC_KAT_files(utils_KAT.KAT_AES_BC_128_FILES)
# await AES_BC_ENC_TEMPLATE(dut, list_cases, 50000, NSHARES)
#
## Test for the AES-128 execution
#@cocotb.test()
#async def AES_128_DEC_KAT(dut):
# # Load the test cases
# list_cases = utils_KAT.load_AES_BC_KAT_files(utils_KAT.KAT_AES_BC_128_FILES)
# await AES_BC_DEC_TEMPLATE(dut, list_cases, 150000, NSHARES)
#
## Test for the AES-92 encryption KAT
#@cocotb.test()
#async def AES_192_ENC_KAT(dut):
# # Load the test cases
# list_cases = utils_KAT.load_AES_BC_KAT_files(utils_KAT.KAT_AES_BC_192_FILES)
# await AES_BC_ENC_TEMPLATE(dut, list_cases, 100000, NSHARES)
#
## Test for the AES-128 execution
#@cocotb.test()
#async def AES_192_DEC_KAT(dut):
# # Load the test cases
# list_cases = utils_KAT.load_AES_BC_KAT_files(utils_KAT.KAT_AES_BC_192_FILES)
# await AES_BC_DEC_TEMPLATE(dut, list_cases, 300000, NSHARES)
#
## Test for the AES-92 encryption KAT
#@cocotb.test()
#async def AES_256_ENC_KAT(dut):
# # Load the test cases
# list_cases = utils_KAT.load_AES_BC_KAT_files(utils_KAT.KAT_AES_BC_256_FILES)
# await AES_BC_ENC_TEMPLATE(dut, list_cases, 100000, NSHARES)
#
## Test for the AES-128 execution
#@cocotb.test()
#async def AES_256_DEC_KAT(dut):
# # Load the test cases
# list_cases = utils_KAT.load_AES_BC_KAT_files(utils_KAT.KAT_AES_BC_256_FILES)
# await AES_BC_DEC_TEMPLATE(dut, list_cases, 300000, NSHARES)
# Simple tests for KATs verif first
## Test for the AES-128 encryption KAT
@cocotb.test()
async def AES_128_ENC_KAT(dut):
# Load the test cases
list_cases = utils_KAT.load_AES_BC_KAT_files(utils_KAT.KAT_AES_BC_128_FILES)
await AES_BC_ENC_TEMPLATE(dut, list_cases, 50000, NSHARES)

# Test for the AES-128 execution
@cocotb.test()
async def AES_128_DEC_KAT(dut):
# Load the test cases
list_cases = utils_KAT.load_AES_BC_KAT_files(utils_KAT.KAT_AES_BC_128_FILES)
await AES_BC_DEC_TEMPLATE(dut, list_cases, 150000, NSHARES)

# Test for the AES-92 encryption KAT
@cocotb.test()
async def AES_192_ENC_KAT(dut):
# Load the test cases
list_cases = utils_KAT.load_AES_BC_KAT_files(utils_KAT.KAT_AES_BC_192_FILES)
await AES_BC_ENC_TEMPLATE(dut, list_cases, 100000, NSHARES)

# Test for the AES-128 execution
@cocotb.test()
async def AES_192_DEC_KAT(dut):
# Load the test cases
list_cases = utils_KAT.load_AES_BC_KAT_files(utils_KAT.KAT_AES_BC_192_FILES)
await AES_BC_DEC_TEMPLATE(dut, list_cases, 300000, NSHARES)

# Test for the AES-92 encryption KAT
@cocotb.test()
async def AES_256_ENC_KAT(dut):
# Load the test cases
list_cases = utils_KAT.load_AES_BC_KAT_files(utils_KAT.KAT_AES_BC_256_FILES)
await AES_BC_ENC_TEMPLATE(dut, list_cases, 100000, NSHARES)

# Test for the AES-128 execution
@cocotb.test()
async def AES_256_DEC_KAT(dut):
# Load the test cases
list_cases = utils_KAT.load_AES_BC_KAT_files(utils_KAT.KAT_AES_BC_256_FILES)
await AES_BC_DEC_TEMPLATE(dut, list_cases, 300000, NSHARES)

########## Test to validate basic functionality of the KSU

Expand Down
2 changes: 2 additions & 0 deletions func_tests/requirements.txt
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
cocotb
numpy
cryptography
File renamed without changes.
39 changes: 0 additions & 39 deletions hdl/Makefile

This file was deleted.

2 changes: 1 addition & 1 deletion hdl/smaesh_hpc/MSKaes_32bits_key_datapath.v
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ module MSKaes_32bits_key_datapath
sh_4bytes_rot_to_SB,
sh_4bytes_from_SB,
sh_4bytes_to_AK,
sh_3bytes_to_AK_inverse,
sh_3bytes_to_AK_inverse
);

input clk;
Expand Down
4 changes: 1 addition & 3 deletions hdl/smaesh_hpc/MSKkey_holder.v
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,6 @@ always@(*) begin
end
IN_REFRESH: begin
in_refresh = 1;
ll_enable_from_ksched = 1;
if(rnd_rfrsh_in_valid) begin
inc_count_words = 1;
ll_enable_mask = 1;
Expand All @@ -408,7 +407,7 @@ always@(*) begin

// LL data holder
ll_fetch_in = 0; // Mux taking data from input instead of refresh shift
ll_enable_from_ksched = 0; // data at the input comes from the key scheduling
ll_enable_from_ksched = in_fetch_last_key | in_refresh; // data at the input comes from the key scheduling
enforce_data_in_zero = 0;

// Logic for branch_compute_last
Expand All @@ -418,7 +417,6 @@ always@(*) begin
branch_compute_last = IDLE;
end

ll_enable_from_ksched = in_fetch_last_key;
data_in_from_buffer = in_fetch_from_buffer;
fetch_key_lcol_high = word_idx[0];
if (in_padding) begin
Expand Down
22 changes: 18 additions & 4 deletions sboxes-compress/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ CIRCUIT=$(WORK)/$(MODULE_NAME).txt
LATS ?= 4
DS ?= 2 3 4

# Python Venv
SHELL=/bin/bash
VE=$(abspath $(WORK)/ve)
VE_INSTALLED=$(VE)/installed
PYTHON_VE=source $(VE)/bin/activate

AREA_REPORT = $(WORK)/$(MODULE_NAME)_area.csv

BEH_SIMU_TB ?= tb_sbox_dual.v
Expand All @@ -15,6 +21,14 @@ BEH_SIMU_DIR ?= $(WORK)/beh-simu

all: $(AREA_REPORT)

$(VE)/pyvenv.cfg:
mkdir -p work
python3 -m venv $(VE)

$(VE_INSTALLED): $(VE)/pyvenv.cfg
${PYTHON_VE}; python -m pip install -r compress/requirements.txt
touch $(VE_INSTALLED)

clean:
-rm -r $(WORK) / 2> /dev/null

Expand All @@ -23,14 +37,14 @@ $(YOSYS_NETLIST): $(FILE_IN) build-json-yosys.tcl
mkdir -p $(WORK)
FILE_IN=$(FILE_IN) YOSYS_NETLIST=$(YOSYS_NETLIST) yosys -c build-json-yosys.tcl

$(CIRCUIT): $(YOSYS_NETLIST)
python compress/scripts/yosys2compress.py \
$(CIRCUIT): $(VE_INSTALLED) $(YOSYS_NETLIST)
${PYTHON_VE}; python compress/scripts/yosys2compress.py \
--netlist-file $(YOSYS_NETLIST) \
--top canright_aes_sbox_dual \
--compress-file $(CIRCUIT)

$(AREA_REPORT): $(CIRCUIT)
make -C compress CIRCUIT="$(abspath $(CIRCUIT))" LATS="$(LATS)" DS="$(DS)" WORK=$(abspath $(WORK)) area
$(AREA_REPORT): $(VE_INSTALLED) $(CIRCUIT)
${PYTHON_VE}; make -C compress CIRCUIT="$(abspath $(CIRCUIT))" LATS="$(LATS)" DS="$(DS)" WORK=$(abspath $(WORK)) area

$(BEH_SIMU_DIR):
mkdir -p $(BEH_SIMU_DIR)
Expand Down
2 changes: 1 addition & 1 deletion sboxes-compress/compress