* Fix counter init & increase enable to prevent aes_enc PSL assume error * Add CTR-AES testbench, at the moment without data checksmaster
| @ -0,0 +1,96 @@ | |||||
| # ====================================================================== | |||||
| # AES encryption/decryption | |||||
| # Copyright (C) 2019 Torsten Meissner | |||||
| #----------------------------------------------------------------------- | |||||
| # This program is free software; you can redistribute it and/or modify | |||||
| # it under the terms of the GNU General Public License as published by | |||||
| # the Free Software Foundation; either version 2 of the License, or | |||||
| # (at your option) any later version. | |||||
| # This program is distributed in the hope that it will be useful, | |||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| # GNU General Public License for more details. | |||||
| # You should have received a copy of the GNU General Public License | |||||
| # along with this program; if not, write to the Free Software | |||||
| # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| # ====================================================================== | |||||
| .SECONDARY: | |||||
| DESIGN_NAME := ctraes | |||||
| RTL_SRC := \ | |||||
| ../../../aes/rtl/vhdl/aes_pkg.vhd \ | |||||
| ../../../aes/rtl/vhdl/aes_enc.vhd \ | |||||
| ../../rtl/vhdl/$(DESIGN_NAME).vhd | |||||
| SIM_SRC := tb_$(DESIGN_NAME).vhd | |||||
| OSVVM_DIR := ../../../lib/osvvm | |||||
| OSVVM_SRC := \ | |||||
| $(OSVVM_DIR)/NamePkg.vhd \ | |||||
| $(OSVVM_DIR)/OsvvmGlobalPkg.vhd \ | |||||
| $(OSVVM_DIR)/VendorCovApiPkg.vhd \ | |||||
| $(OSVVM_DIR)/TranscriptPkg.vhd \ | |||||
| $(OSVVM_DIR)/TextUtilPkg.vhd \ | |||||
| $(OSVVM_DIR)/AlertLogPkg.vhd \ | |||||
| $(OSVVM_DIR)/MessagePkg.vhd \ | |||||
| $(OSVVM_DIR)/SortListPkg_int.vhd \ | |||||
| $(OSVVM_DIR)/RandomBasePkg.vhd \ | |||||
| $(OSVVM_DIR)/RandomPkg.vhd \ | |||||
| $(OSVVM_DIR)/CoveragePkg.vhd \ | |||||
| $(OSVVM_DIR)/MemoryPkg.vhd \ | |||||
| $(OSVVM_DIR)/ScoreboardGenericPkg.vhd \ | |||||
| $(OSVVM_DIR)/ScoreboardPkg_slv.vhd \ | |||||
| $(OSVVM_DIR)/ScoreboardPkg_int.vhd \ | |||||
| $(OSVVM_DIR)/ResolutionPkg.vhd \ | |||||
| $(OSVVM_DIR)/TbUtilPkg.vhd \ | |||||
| $(OSVVM_DIR)/OsvvmContext.vhd | |||||
| VHD_STD := 08 | |||||
| .PHONY: sim | |||||
| sim: tb_$(DESIGN_NAME).ghw | |||||
| .PHONY: compile | |||||
| compile: tb_$(DESIGN_NAME) | |||||
| osvvm work: | |||||
| mkdir $@ | |||||
| osvvm/OsvvmContext.o: $(OSVVM_SRC) | osvvm | |||||
| @echo "Analyze OSVVM library ..." | |||||
| ghdl -a --std=$(VHD_STD) -Wno-hide --work=osvvm --workdir=osvvm $(OSVVM_SRC) | |||||
| tb_$(DESIGN_NAME): ${RTL_SRC} ${SIM_SRC} osvvm/OsvvmContext.o | work | |||||
| @echo "Analyze testbench & design ..." | |||||
| ghdl -a --std=$(VHD_STD) -fpsl --workdir=work -P=osvvm ${RTL_SRC} ${SIM_SRC} | |||||
| @echo "Elaborate testbench & design ..." | |||||
| ghdl -e --std=$(VHD_STD) -fpsl --workdir=work -P=osvvm $@ | |||||
| tb_$(DESIGN_NAME).ghw: tb_$(DESIGN_NAME) | |||||
| @echo "Run testbench ..." | |||||
| ghdl -r $(basename $@) --wave=$@ --assert-level=error --psl-report=$(basename $@)_psl_report.json | |||||
| .PHONY: wave | |||||
| wave: tb_$(DESIGN_NAME).ghw | |||||
| @echo "Run GTKwave ..." | |||||
| gtkwave -S tb_$(DESIGN_NAME).tcl tb_$(DESIGN_NAME).ghw | |||||
| .PHONY: clean | |||||
| clean: | |||||
| @echo "Cleaning simulation files ..." | |||||
| rm -rf tb_$(DESIGN_NAME) tb_$(DESIGN_NAME).ghw *.o *.json work/ osvvm/ | |||||
| @ -0,0 +1,13 @@ | |||||
| set signals [list] | |||||
| lappend signals "top.tb_ctraes.s_reset" | |||||
| lappend signals "top.tb_ctraes.s_clk" | |||||
| lappend signals "top.tb_ctraes.s_validin" | |||||
| lappend signals "top.tb_ctraes.s_acceptin" | |||||
| lappend signals "top.tb_ctraes.s_start" | |||||
| lappend signals "top.tb_ctraes.s_key" | |||||
| lappend signals "top.tb_ctraes.s_nonce" | |||||
| lappend signals "top.tb_ctraes.s_datain" | |||||
| lappend signals "top.tb_ctraes.s_validout" | |||||
| lappend signals "top.tb_ctraes.s_acceptout" | |||||
| lappend signals "top.tb_ctraes.s_dataout" | |||||
| set num_added [ gtkwave::addSignalsFromList $signals ] | |||||
| @ -0,0 +1,125 @@ | |||||
| -- ====================================================================== | |||||
| -- AES Counter mode testbench | |||||
| -- Copyright (C) 2020 Torsten Meissner | |||||
| ------------------------------------------------------------------------- | |||||
| -- This program is free software; you can redistribute it and/or modify | |||||
| -- it under the terms of the GNU General Public License as published by | |||||
| -- the Free Software Foundation; either version 2 of the License, or | |||||
| -- (at your option) any later version. | |||||
| -- This program is distributed in the hope that it will be useful, | |||||
| -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| -- GNU General Public License for more details. | |||||
| -- You should have received a copy of the GNU General Public License | |||||
| -- along with this program; if not, write to the Free Software | |||||
| -- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| -- ====================================================================== | |||||
| library ieee; | |||||
| use ieee.std_logic_1164.all; | |||||
| use ieee.numeric_std.all; | |||||
| library osvvm; | |||||
| use osvvm.RandomPkg.all; | |||||
| use std.env.all; | |||||
| entity tb_ctraes is | |||||
| end entity tb_ctraes; | |||||
| architecture sim of tb_ctraes is | |||||
| constant C_NONCE_WIDTH : natural range 64 to 96 := 96; | |||||
| signal s_reset : std_logic := '0'; | |||||
| signal s_clk : std_logic := '0'; | |||||
| signal s_start : std_logic := '0'; | |||||
| signal s_nonce : std_logic_vector(0 to C_NONCE_WIDTH-1) := (others => '0'); | |||||
| signal s_key : std_logic_vector(0 to 127) := (others => '0'); | |||||
| signal s_datain : std_logic_vector(0 to 127) := (others => '0'); | |||||
| signal s_validin : std_logic := '0'; | |||||
| signal s_acceptin : std_logic; | |||||
| signal s_dataout : std_logic_vector(0 to 127); | |||||
| signal s_validout : std_logic := '0'; | |||||
| signal s_acceptout : std_logic := '0'; | |||||
| begin | |||||
| i_ctraes : entity work.ctraes | |||||
| generic map ( | |||||
| NONCE_WIDTH => C_NONCE_WIDTH | |||||
| ) | |||||
| port map ( | |||||
| reset_i => s_reset, | |||||
| clk_i => s_clk, | |||||
| start_i => s_start, | |||||
| nonce_i => s_nonce, | |||||
| key_i => s_key, | |||||
| data_i => s_datain, | |||||
| valid_i => s_validin, | |||||
| accept_o => s_acceptin, | |||||
| data_o => s_dataout, | |||||
| valid_o => s_validout, | |||||
| accept_i => s_acceptout | |||||
| ); | |||||
| s_clk <= not(s_clk) after 10 ns; | |||||
| s_reset <= '1' after 100 ns; | |||||
| process is | |||||
| variable v_random : RandomPType; | |||||
| begin | |||||
| v_random.InitSeed(v_random'instance_name); | |||||
| wait until s_reset = '1' and rising_edge(s_clk); | |||||
| -- ENCRYPTION TESTs | |||||
| report "Test encryption"; | |||||
| for i in 0 to 31 loop | |||||
| if (i = 0) then | |||||
| s_start <= '1'; | |||||
| s_nonce <= v_random.RandSlv(s_nonce'length); | |||||
| else | |||||
| s_start <= '0'; | |||||
| end if; | |||||
| s_validin <= '1'; | |||||
| s_key <= v_random.RandSlv(128); | |||||
| s_datain <= v_random.RandSlv(128); | |||||
| report "Test #" & to_string(i); | |||||
| wait until s_acceptin = '1' and rising_edge(s_clk); | |||||
| s_validin <= '0'; | |||||
| end loop; | |||||
| -- Watchdog | |||||
| wait for 1 us; | |||||
| report "Watchdog error" | |||||
| severity failure; | |||||
| end process; | |||||
| process is | |||||
| begin | |||||
| s_acceptout <= '0'; | |||||
| for i in 0 to 31 loop | |||||
| wait until s_validout = '1' and rising_edge(s_clk); | |||||
| s_acceptout <= '1'; | |||||
| wait until rising_edge(s_clk); | |||||
| s_acceptout <= '0'; | |||||
| end loop; | |||||
| report "Tests finished"; | |||||
| wait for 100 ns; | |||||
| finish(0); | |||||
| end process; | |||||
| end architecture sim; | |||||