OpenCores
URL https://opencores.org/ocsvn/aes_pipe/aes_pipe/trunk

Subversion Repositories aes_pipe

[/] [aes_pipe/] [trunk/] [bench/] [vhdl/] [tb_aes.vhdl] - Rev 12

Compare with Previous | Blame | View Log

----------------------------------------------------------------------
----                                                              ----
---- Pipelined Aes IP Core                                        ----
----                                                              ----
---- This file is part of the Pipelined AES project               ----
---- http://www.opencores.org/cores/aes_pipe/                     ----
----                                                              ----
---- Description                                                  ----
---- Implementation of AES IP core according to                   ----
---- FIPS PUB 197 specification document.                         ----
----                                                              ----
---- To Do:                                                       ----
----   -                                                          ----
----                                                              ----
---- Author:                                                      ----
----      - Subhasis Das, subhasis256@gmail.com                   ----
----                                                              ----
----------------------------------------------------------------------
----                                                              ----
---- Copyright (C) 2009 Authors and OPENCORES.ORG                 ----
----                                                              ----
---- This source file may be used and distributed without         ----
---- restriction provided that this copyright statement is not    ----
---- removed from the file and that any derivative work contains ----
---- the original copyright notice and the associated disclaimer. ----
----                                                              ----
---- This source file is free software; you can redistribute it   ----
---- and/or modify it under the terms of the GNU Lesser General   ----
---- Public License as published by the Free Software Foundation; ----
---- either version 2.1 of the License, or (at your option) any   ----
---- later version.                                               ----
----                                                              ----
---- This source 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 Lesser General Public License for more ----
---- details.                                                     ----
----                                                              ----
---- You should have received a copy of the GNU Lesser General    ----
---- Public License along with this source; if not, download it   ----
---- from http://www.opencores.org/lgpl.shtml                     ----
----                                                              ----
----------------------------------------------------------------------
------------------------------------------------------
-- Project: AESFast
-- Author: Subhasis
-- Last Modified: 25/03/10
-- Email: subhasis256@gmail.com
--
-- TODO: Test with NIST test vectors
------------------------------------------------------
--
-- Description: Testbench for AESFast
-- Takes in data and keys from ../src/vectors.dat
-- Takes in true output values from ../src/cipher.dat
-- Writes all the output to ../log/output.log
------------------------------------------------------
 
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_textio.all;
use std.textio.all;
 
library work;
use work.aes_pkg.all;
 
entity tb_aes is
end tb_aes;
 
architecture rtl of tb_aes is
signal clk: std_logic; -- clock
signal plaintext: datablock;
signal key: datablock;
signal cipher: datablock;
signal rst: std_logic; -- reset input
signal op_start: std_logic; -- signal that output started
signal sim_end: std_logic := '0'; -- signal that simulation ended
constant clk_period: time := 10 ns;
 
component aes_top is
port(
	clk_i: in std_logic;
	rst_i: in std_logic;
	plaintext_i: in datablock;
	keyblock_i: in datablock;
	ciphertext_o: out datablock
	);
end component;
 
begin
	-- The wiring of the top module
	DUT: aes_top port map(
						 clk_i => clk,
						 rst_i => rst,
						 plaintext_i => plaintext,
						 keyblock_i => key,
						 ciphertext_o => cipher
					 	 );
	-- Generate clock
	gen_clk: process
	begin
		if(sim_end = '0') then
			clk <= '1';
			wait for clk_period/2;
			clk <= '0';
			wait for clk_period/2;
		else
			wait;
		end if;
	end process;
	-- Generate Reset
	gen_rst: process
	begin
		rst <= '1';
		wait for clk_period/2; -- generate reset
		rst <= '0';
		wait;
	end process;
 
	-- generate the inputs and check against expected output
	gen_in: process
	file testfile: text open read_mode is "../src/vectors.dat";
	variable line_in: line;
	variable plaintext_block, key_block: std_logic_vector(127 downto 0);
	begin
		if(endfile(testfile)) then
			file_close(testfile);
			wait;
		end if;
		readline(testfile, line_in);
		hread(line_in, plaintext_block);
		hread(line_in, key_block);
 
		for i in 3 downto 0 loop
			for j in 3 downto 0 loop
				plaintext(3-j,3-i) <= plaintext_block((i*32 + j*8 + 7) downto (i*32 + j*8));
			end loop;
		end loop;
		for i in 3 downto 0 loop
			for j in 3 downto 0 loop
				key(3-j,3-i) <= key_block((i*32 + j*8 + 7) downto (i*32 + j*8));
			end loop;
		end loop;
 
		wait for clk_period;
	end process;
 
	-- Generate a signal to indicate that valid output has begun
	op_begin: process
	begin
		wait for 30*clk_period;
		wait for clk_period/2;
		op_start <= '1';
		wait;
	end process;
 
	-- Compare output with actual output file
	op_chk: process
	file opfile: text open read_mode is "../src/cipher.dat";
	file logfile: text open write_mode is "../log/output.log";
	variable line_in, line_out, line_out_file: line;
	variable exp_cipher_block: std_logic_vector(127 downto 0);
	variable succeded: boolean;
	variable all_ok: boolean := true;
	begin
		-- if required cycles have passed
		if(op_start = '1') then
			if(endfile(opfile)) then -- end of simulation
				file_close(opfile);
				if(all_ok = true) then
					write(line_out, string'("OK"));
					writeline(OUTPUT, line_out);
					write(line_out_file, string'("OK"));
					writeline(logfile, line_out_file);
				else
					write(line_out, string'("FAIL"));
					writeline(OUTPUT, line_out);
					write(line_out_file, string'("FAIL"));
					writeline(logfile, line_out_file);
				end if;
				sim_end <= '1';
				wait;
			end if;
			succeded := true;
			readline(opfile, line_in); -- read in one expected result
			hread(line_in, exp_cipher_block); -- read in one byte
			for i in 3 downto 0 loop
				for j in 3 downto 0 loop
					if(exp_cipher_block((i*32 + j*8 + 7) downto (i*32 + j*8)) /= cipher(3-j,3-i)) then
						succeded := false; -- check failed
						all_ok := false;
					end if;
				end loop;
			end loop;
			-- writing the output line
			for i in 3 downto 0 loop
				for j in 3 downto 0 loop
					hwrite(line_out, cipher(3-j,3-i));
					hwrite(line_out_file, cipher(3-j,3-i));
				end loop;
			end loop;
			write(line_out, ' ');
			write(line_out_file, ' ');
			-- writing the comparison result
			write(line_out, succeded);
			writeline(OUTPUT, line_out);
			write(line_out_file, succeded);
			writeline(logfile, line_out_file);
		end if;
		wait for clk_period;
	end process;
end rtl;
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.