diff options
-rw-r--r-- | src/tb/tb_keywrap.v | 84 |
1 files changed, 82 insertions, 2 deletions
diff --git a/src/tb/tb_keywrap.v b/src/tb/tb_keywrap.v index fee890c..9c6fb56 100644 --- a/src/tb/tb_keywrap.v +++ b/src/tb/tb_keywrap.v @@ -66,6 +66,12 @@ module tb_keywrap(); localparam ADDR_A_MSB = 8'h0f; localparam ADDR_KEY0 = 8'h10; + localparam ADDR_KEY1 = 8'h11; + localparam ADDR_KEY2 = 8'h12; + localparam ADDR_KEY3 = 8'h13; + localparam ADDR_KEY4 = 8'h14; + localparam ADDR_KEY5 = 8'h15; + localparam ADDR_KEY6 = 8'h16; localparam ADDR_KEY7 = 8'h17; localparam ADDR_WRITE_DATA = 8'h20; @@ -270,7 +276,7 @@ module tb_keywrap(); //---------------------------------------------------------------- task reset_dut; begin - $display("*** Toggling reset."); + $display("** Toggling reset."); tb_reset_n = 0; #(2 * CLK_PERIOD); @@ -281,6 +287,76 @@ module tb_keywrap(); //---------------------------------------------------------------- + // Implements test based on NIST KWP_AE 128 bit key test 4. + //---------------------------------------------------------------- + task test_kwp_ae_128_4; + begin : kwp_ae_128_4 + integer i; + + tc_ctr = tc_ctr + 1; + + $display("** TC kwp_ae_128_4 START."); + + + // Write key and keylength, we also want to encrypt/wrap. + write_word(ADDR_KEY3, 32'hc03db3cc); + write_word(ADDR_KEY2, 32'h1416dcd1); + write_word(ADDR_KEY1, 32'hc069a195); + write_word(ADDR_KEY0, 32'ha8d77e3d); + write_word(ADDR_CONFIG, 32'h00000001); + + + // Write magic words to the A state regs. + // Also set the rlen. + write_word(ADDR_A_LSB, 32'h0000001f); + write_word(ADDR_A_MSB, 32'ha65959a6); + write_word(ADDR_RLEN, 32'h00000004); + + + // Initialize the AES engine and reset counters. + // Wait for init to complete. + write_word(ADDR_CTRL, 32'h00000001); + wait_ready(); + + + // Write the R blocks to be processed. + write_word(ADDR_WRITE_DATA, 32'hcdda4200); + write_word(ADDR_WRITE_DATA, 32'h46f87f58); + + write_word(ADDR_WRITE_DATA, 32'h2e49bdb7); + write_word(ADDR_WRITE_DATA, 32'hf53d99ce); + + write_word(ADDR_WRITE_DATA, 32'he0cd4d0b); + write_word(ADDR_WRITE_DATA, 32'h6212511f); + + write_word(ADDR_WRITE_DATA, 32'h45a28800); + write_word(ADDR_WRITE_DATA, 32'h5f37a27d); + + + // Start wrapping and wait for wrap to complete. + write_word(ADDR_CTRL, 32'h00000002); + wait_ready(); + + + // Read and display the A registers. + read_word(ADDR_A_LSB); + $display("A LSB after wrap: 0x%08x", read_data); + read_word(ADDR_A_MSB); + $display("A MSB after wrap: 0x%08x", read_data); + + // Read and display the R blocks that has been processed. + for (i = 0 ; i < 8 ; i = i + 1) + begin + read_word(ADDR_READ_DATA); + $display("mem[0x%07x] = 0x%08x", i, read_data); + end + + $display("** TC kwp_ae_128_4 END.\n"); + end + endtask // test_kwp_ae_128_4 + + + //---------------------------------------------------------------- // main //---------------------------------------------------------------- initial @@ -290,14 +366,18 @@ module tb_keywrap(); $display(""); init_sim(); + dump_dut_state(); reset_dut(); dump_dut_state(); + test_kwp_ae_128_4(); + display_test_results(); $display(""); - $display("*** Keywrap simulation done. ***"); + $display(" -= Testbench for Keywrap completed =-"); + $display(" ===================================="); $finish; end // main |