Line 71... |
Line 71... |
signal clk: std_logic; -- clock
|
signal clk: std_logic; -- clock
|
signal plaintext: datablock;
|
signal plaintext: datablock;
|
signal key: datablock;
|
signal key: datablock;
|
signal cipher: datablock;
|
signal cipher: datablock;
|
signal rst: std_logic; -- reset input
|
signal rst: std_logic; -- reset input
|
signal op_start: std_logic; -- signal that simulation ended
|
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;
|
constant clk_period: time := 10 ns;
|
|
|
component aes_top is
|
component aes_top is
|
port(
|
port(
|
clk_i: in std_logic;
|
clk_i: in std_logic;
|
Line 96... |
Line 97... |
ciphertext_o => cipher
|
ciphertext_o => cipher
|
);
|
);
|
-- Generate clock
|
-- Generate clock
|
gen_clk: process
|
gen_clk: process
|
begin
|
begin
|
|
if(sim_end = '0') then
|
clk <= '1';
|
clk <= '1';
|
wait for clk_period/2;
|
wait for clk_period/2;
|
clk <= '0';
|
clk <= '0';
|
wait for clk_period/2;
|
wait for clk_period/2;
|
|
else
|
|
wait;
|
|
end if;
|
end process;
|
end process;
|
-- Generate Reset
|
-- Generate Reset
|
gen_rst: process
|
gen_rst: process
|
begin
|
begin
|
rst <= '1';
|
rst <= '1';
|
Line 114... |
Line 119... |
|
|
-- generate the inputs and check against expected output
|
-- generate the inputs and check against expected output
|
gen_in: process
|
gen_in: process
|
file testfile: text open read_mode is "../src/vectors.dat";
|
file testfile: text open read_mode is "../src/vectors.dat";
|
variable line_in: line;
|
variable line_in: line;
|
variable plaintext_byte, key_byte: std_logic_vector(7 downto 0);
|
variable plaintext_block, key_block: std_logic_vector(127 downto 0);
|
begin
|
begin
|
if(endfile(testfile)) then
|
if(endfile(testfile)) then
|
file_close(testfile);
|
file_close(testfile);
|
wait;
|
wait;
|
end if;
|
end if;
|
|
|
readline(testfile, line_in);
|
readline(testfile, line_in);
|
|
hread(line_in, plaintext_block);
|
|
hread(line_in, key_block);
|
|
|
for i in 3 downto 0 loop
|
for i in 3 downto 0 loop
|
for j in 3 downto 0 loop
|
for j in 3 downto 0 loop
|
hread(line_in, plaintext_byte);
|
plaintext(3-j,3-i) <= plaintext_block((i*32 + j*8 + 7) downto (i*32 + j*8));
|
plaintext(3-j,3-i) <= plaintext_byte;
|
|
end loop;
|
end loop;
|
end loop;
|
end loop;
|
for i in 3 downto 0 loop
|
for i in 3 downto 0 loop
|
for j in 3 downto 0 loop
|
for j in 3 downto 0 loop
|
hread(line_in, key_byte);
|
key(3-j,3-i) <= key_block((i*32 + j*8 + 7) downto (i*32 + j*8));
|
key(3-j,3-i) <= key_byte;
|
|
end loop;
|
end loop;
|
end loop;
|
end loop;
|
|
|
wait for clk_period;
|
wait for clk_period;
|
end process;
|
end process;
|
Line 149... |
Line 154... |
wait;
|
wait;
|
end process;
|
end process;
|
|
|
-- Compare output with actual output file
|
-- Compare output with actual output file
|
op_chk: process
|
op_chk: process
|
file chkfile: text open read_mode is "../src/cipher.dat";
|
file opfile: text open read_mode is "../src/cipher.dat";
|
file opfile: text open write_mode is "../log/output.log";
|
file logfile: text open write_mode is "../log/output.log";
|
variable line_in, line_out_file, line_out: line;
|
variable line_in, line_out, line_out_file: line;
|
variable exp_cipher_byte: std_logic_vector(7 downto 0);
|
variable exp_cipher_block: std_logic_vector(127 downto 0);
|
variable succeded: boolean;
|
variable succeded: boolean;
|
|
variable all_ok: boolean := true;
|
begin
|
begin
|
-- if required cycles have passed
|
-- if required cycles have passed
|
if(op_start = '1') then
|
if(op_start = '1') then
|
if(endfile(chkfile)) then -- end of simulation
|
if(endfile(opfile)) then -- end of simulation
|
file_close(chkfile);
|
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;
|
wait;
|
end if;
|
end if;
|
succeded := true;
|
succeded := true;
|
readline(chkfile, line_in); -- read in one expected result
|
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 i in 3 downto 0 loop
|
for j in 3 downto 0 loop
|
for j in 3 downto 0 loop
|
hread(line_in, exp_cipher_byte); -- read in one byte
|
if(exp_cipher_block((i*32 + j*8 + 7) downto (i*32 + j*8)) /= cipher(3-j,3-i)) then
|
if(exp_cipher_byte /= cipher(3-j,3-i)) then
|
|
succeded := false; -- check failed
|
succeded := false; -- check failed
|
|
all_ok := false;
|
end if;
|
end if;
|
end loop;
|
end loop;
|
end loop;
|
end loop;
|
-- writing the output line
|
-- writing the output line
|
for i in 3 downto 0 loop
|
for i in 3 downto 0 loop
|
for j in 3 downto 0 loop
|
for j in 3 downto 0 loop
|
hwrite(line_out_file, cipher(3-j,3-i));
|
|
hwrite(line_out, cipher(3-j,3-i));
|
hwrite(line_out, cipher(3-j,3-i));
|
|
hwrite(line_out_file, cipher(3-j,3-i));
|
end loop;
|
end loop;
|
end loop;
|
end loop;
|
write(line_out_file, ' ');
|
|
write(line_out, ' ');
|
write(line_out, ' ');
|
|
write(line_out_file, ' ');
|
-- writing the comparison result
|
-- writing the comparison result
|
write(line_out_file, succeded);
|
|
write(line_out, succeded);
|
write(line_out, succeded);
|
writeline(opfile, line_out_file);
|
|
writeline(OUTPUT, line_out);
|
writeline(OUTPUT, line_out);
|
|
write(line_out_file, succeded);
|
|
writeline(logfile, line_out_file);
|
end if;
|
end if;
|
wait for clk_period;
|
wait for clk_period;
|
end process;
|
end process;
|
end rtl;
|
end rtl;
|
|
|
No newline at end of file
|
No newline at end of file
|