diff options
Diffstat (limited to 'src/tb')
-rw-r--r-- | src/tb/tb_csprng.v | 105 | ||||
-rw-r--r-- | src/tb/tb_csprng_fifo.v | 199 |
2 files changed, 277 insertions, 27 deletions
diff --git a/src/tb/tb_csprng.v b/src/tb/tb_csprng.v index 0404b56..bd84489 100644 --- a/src/tb/tb_csprng.v +++ b/src/tb/tb_csprng.v @@ -50,7 +50,7 @@ module tb_csprng(); //---------------------------------------------------------------- // Internal constant and parameter definitions. //---------------------------------------------------------------- - parameter DEBUG = 1; + parameter DEBUG = 0; parameter CLK_HALF_PERIOD = 1; parameter CLK_PERIOD = 2 * CLK_HALF_PERIOD; @@ -68,6 +68,7 @@ module tb_csprng(); localparam ADDR_STAT_BLOCKS_LOW = 8'h14; localparam ADDR_STAT_BLOCKS_HIGH = 8'h15; + localparam ADDR_STAT_RESEEDS = 8'h16; localparam ADDR_RND_DATA = 8'h20; @@ -109,6 +110,7 @@ module tb_csprng(); reg tb_debug_update; reg [31 : 0] read_data; + reg [7 : 0] pbyte; //---------------------------------------------------------------- @@ -127,10 +129,9 @@ module tb_csprng(); .discard(tb_discard), .test_mode(tb_test_mode), - - .more_seed(tb_more_seed), .security_error(tb_security_error), + .more_seed(tb_more_seed), .seed_data(tb_seed_data), .seed_syn(tb_seed_syn), .seed_ack(tb_seed_ack), @@ -210,11 +211,6 @@ module tb_csprng(); dut.cipher_inst.ready, dut.cipher_inst.data_out_valid); $display("cipher data out: 0x%064x", dut.cipher_inst.data_out); $display(""); - - $display("Outputs:"); - $display("rnd_syn = 0x%01x, rnd_ack = 0x%01x, rnd_data = 0x%08x", - dut.rnd_syn, dut.rnd_ack, tb_read_data); - $display(""); end endtask // dump_dut_state @@ -237,6 +233,7 @@ module tb_csprng(); tb_write_data = word; tb_cs = 1; tb_we = 1; + #(2 * CLK_PERIOD); tb_cs = 0; tb_we = 0; @@ -330,14 +327,68 @@ module tb_csprng(); tb_test_mode = 0; tb_seed_syn = 0; - tb_seed_data = {16{32'h00000000}}; + tb_seed_data = {8{64'h0000000000000000}}; tb_rnd_ack = 0; tb_debug_update = 0; + + pbyte = 8'h00; end endtask // init_sim //---------------------------------------------------------------- + // seed_generator + // + // When a seed_syn is observed this process will provide a new + // seed to the DUT, assert SYN, wait for ACK and then update + // the seed pattern state. + //---------------------------------------------------------------- + always @ (posedge tb_more_seed) + begin : seed_generator + #(CLK_PERIOD); + tb_seed_data = {64{pbyte}}; + tb_seed_syn = 1'b1; + + while (!tb_seed_ack) + #(CLK_PERIOD); + + tb_seed_syn = 1'b0; + pbyte = pbyte + 8'h01; + end + + + //---------------------------------------------------------------- + // read_rng_data() + // + // Support task that reads a given number of data words + // from the DUT via the API. + //---------------------------------------------------------------- + task read_rng_data(input [31 : 0] num_words); + reg [31 : 0] i; + begin + i = 32'h00000000; + + $display("*** Trying to read 0x%08x RNG data words", num_words); + while (i < num_words) + begin + tb_cs = 1'b1; + tb_we = 1'b0; + tb_address = ADDR_RND_DATA; + i = i + 1; + + #CLK_PERIOD; + + if (DEBUG) + $display("*** RNG data word 0x%08x: 0x%08x", i, tb_read_data); + end + + tb_cs = 1'b0; + $display("*** Reading of RNG data words completed."); + end + endtask // read_rng_data + + + //---------------------------------------------------------------- // tc1_init_csprng() // // TC1: Test that the DUT automatically starts initialize when @@ -353,11 +404,8 @@ module tb_csprng(); tb_seed_data = {8{64'haaaaaaaa55555555}}; tb_seed_syn = 1'b1; - tb_cs = 1'b1; - tb_we = 1'b0; - tb_address = ADDR_RND_DATA; - - #(200 * CLK_PERIOD); + // Start pulling data. + read_rng_data(32'h100); $display("*** TC1: Test automatic init of csprng done."); end @@ -365,6 +413,32 @@ module tb_csprng(); //---------------------------------------------------------------- + // tc2_reseed_csprng() + // + // TC2: Test that the CSPRNG is reseeded as expected. + // We set the max block size to a small value and pull data. + //---------------------------------------------------------------- + task tc2_reseed_csprng(); + begin + tc_ctr = tc_ctr + 1; + + $display("*** TC2: Test reseed of CSPRNG started."); + + tb_seed_data = {8{64'h0102030405060708}}; + tb_seed_syn = 1'b1; + + // Set the max number of blocks to a low value + write_word(ADDR_NUM_BLOCKS_HIGH, 32'h00000000); + write_word(ADDR_NUM_BLOCKS_LOW, 32'h00000007); + + read_rng_data(32'h10000); + + $display("*** TC2 done.."); + end + endtask // tc2_reseed_csprng + + + //---------------------------------------------------------------- // csprng_test // // The main test functionality. @@ -381,7 +455,8 @@ module tb_csprng(); reset_dut(); dump_dut_state(); - tc1_init_csprng(); +// tc1_init_csprng(); + tc2_reseed_csprng(); display_test_results(); diff --git a/src/tb/tb_csprng_fifo.v b/src/tb/tb_csprng_fifo.v index 91044a5..a2db466 100644 --- a/src/tb/tb_csprng_fifo.v +++ b/src/tb/tb_csprng_fifo.v @@ -50,7 +50,7 @@ module tb_csprng_fifo(); //---------------------------------------------------------------- // Internal constant and parameter definitions. //---------------------------------------------------------------- - parameter DEBUG = 1; + parameter DEBUG = 0; parameter CLK_HALF_PERIOD = 1; parameter CLK_PERIOD = 2 * CLK_HALF_PERIOD; @@ -143,9 +143,39 @@ module tb_csprng_fifo(); $display("cycle: 0x%016x", cycle_ctr); $display("State of DUT"); $display("------------"); + $display("inputs:"); + $display("more_data = 0x%01x, data_valid = 0x%01x", + tb_more_data, tb_csprng_data_valid); + $display("input_data = 0x%0128x", tb_csprng_data); + $display(""); + $display("outputs:"); $display("rnd_syn = 0x%01x, rnd_ack = 0x%01x, rnd_data = 0x%08x", tb_rnd_syn, tb_rnd_ack, tb_rnd_data); $display(""); + $display("internals:"); + $display("rd_ptr = 0x%02x, wr_ptr = 0x%02x, fifo_ctr = 0x%02x, mux_ptr = 0x%02x", + dut.rd_ptr_reg, dut.wr_ptr_reg, dut.fifo_ctr_reg, dut.mux_data_ptr_reg); + $display("fifo_empty = 0x%01x, fifo_full = 0x%01x", dut.fifo_empty, dut.fifo_full); + $display(""); + end + endtask // dump_dut_state + + + //---------------------------------------------------------------- + // dump_fifo() + // + // Dump the state of the fifo when needed. + //---------------------------------------------------------------- + task dump_fifo(); + begin + $display("contents of the fifo"); + $display("--------------------"); + $display("fifo_mem[0] = 0x%0128x", dut.fifo_mem[0]); + $display("fifo_mem[1] = 0x%0128x", dut.fifo_mem[1]); + $display("fifo_mem[2] = 0x%0128x", dut.fifo_mem[2]); + $display("fifo_mem[3] = 0x%0128x", dut.fifo_mem[3]); + $display(""); + $display(""); end endtask // dump_dut_state @@ -156,15 +186,15 @@ module tb_csprng_fifo(); // Generate test data with distinct patterns as requested // by the dut. //---------------------------------------------------------------- - always @ (posedge tb_more_data) - begin - for (i = 0 ; i < 16 ; i = i + 1) - tb_csprng_data[i * 32 +: 32] = tb_csprng_data[i * 32 +: 32] + 32'h10101010; - - tb_csprng_data_valid = 1'b1; - #(2 * CLK_PERIOD); - tb_csprng_data_valid = 1'b0; - end +// always @ (posedge tb_more_data) +// begin +// for (i = 0 ; i < 16 ; i = i + 1) +// tb_csprng_data[i * 32 +: 32] = tb_csprng_data[i * 32 +: 32] + 32'h10101010; +// +// tb_csprng_data_valid = 1'b1; +// #(2 * CLK_PERIOD); +// tb_csprng_data_valid = 1'b0; +// end //---------------------------------------------------------------- @@ -225,15 +255,156 @@ module tb_csprng_fifo(); tb_write_data = 32'h00000000; tb_discard = 0; - tb_rnd_ack = 1; + tb_rnd_ack = 0; for (i = 0 ; i < 16 ; i = i + 1) - tb_csprng_data[i * 32 +: 32] = {i, i, i, i}; + tb_csprng_data[i * 32 +: 32] = 32'h0; + tb_csprng_data_valid = 0; end endtask // init_sim //---------------------------------------------------------------- + // wait_more_data() + // + // Wait for the DUT to signal that it wants more data. + //---------------------------------------------------------------- + task wait_more_data(); + begin + while (!tb_more_data) + #(CLK_PERIOD); + end + endtask // wait_more_data + + + //---------------------------------------------------------------- + // write_w512() + // + // Writes a 512 bit data word into the fifo. + //---------------------------------------------------------------- + task write_w512(input [7 : 0] b); + reg [511 : 0] w512; + reg [31 : 0] w00; + reg [31 : 0] w01; + reg [31 : 0] w02; + reg [31 : 0] w03; + reg [31 : 0] w04; + reg [31 : 0] w05; + reg [31 : 0] w06; + reg [31 : 0] w07; + reg [31 : 0] w08; + reg [31 : 0] w09; + reg [31 : 0] w10; + reg [31 : 0] w11; + reg [31 : 0] w12; + reg [31 : 0] w13; + reg [31 : 0] w14; + reg [31 : 0] w15; + begin + w00 = {(b + 8'd15), (b + 8'd15), (b + 8'd15), (b + 8'd15)}; + w01 = {(b + 8'd14), (b + 8'd14), (b + 8'd14), (b + 8'd14)}; + w02 = {(b + 8'd13), (b + 8'd13), (b + 8'd13), (b + 8'd13)}; + w03 = {(b + 8'd12), (b + 8'd12), (b + 8'd12), (b + 8'd12)}; + w04 = {(b + 8'd11), (b + 8'd11), (b + 8'd11), (b + 8'd11)}; + w05 = {(b + 8'd10), (b + 8'd10), (b + 8'd10), (b + 8'd10)}; + w06 = {(b + 8'd09), (b + 8'd09), (b + 8'd09), (b + 8'd09)}; + w07 = {(b + 8'd08), (b + 8'd08), (b + 8'd08), (b + 8'd08)}; + + w08 = {(b + 8'd07), (b + 8'd07), (b + 8'd07), (b + 8'd07)}; + w09 = {(b + 8'd06), (b + 8'd06), (b + 8'd06), (b + 8'd06)}; + w10 = {(b + 8'd05), (b + 8'd05), (b + 8'd05), (b + 8'd05)}; + w11 = {(b + 8'd04), (b + 8'd04), (b + 8'd04), (b + 8'd04)}; + w12 = {(b + 8'd03), (b + 8'd03), (b + 8'd03), (b + 8'd03)}; + w13 = {(b + 8'd02), (b + 8'd02), (b + 8'd02), (b + 8'd02)}; + w14 = {(b + 8'd01), (b + 8'd01), (b + 8'd01), (b + 8'd01)}; + w15 = {(b + 8'd00), (b + 8'd00), (b + 8'd00), (b + 8'd00)}; + + w512 = {w00, w01, w02, w03, w04, w05, w06, w07, + w08, w09, w10, w11, w12, w13, w14, w15}; + + wait_more_data(); + + dump_dut_state(); + dump_fifo(); + + $display("writing to fifo: 0x%0128x", w512); + tb_csprng_data = w512; + tb_csprng_data_valid = 1; + #(CLK_PERIOD); + tb_csprng_data_valid = 0; + end + endtask // write_w512 + + + //---------------------------------------------------------------- + // read_w32() + // + // read a 32 bit data word from the fifo. + //---------------------------------------------------------------- + task read_w32(); + begin + $display("*** Reading from the fifo: 0x%08x", tb_rnd_data); + tb_rnd_ack = 1; + #(2 * CLK_PERIOD); + tb_rnd_ack = 0; + dump_dut_state(); + end + endtask // read_w32 + + + //---------------------------------------------------------------- + // fifo_test() + // + // Writes a number of 512-bit words to the FIFO and then + // extracts 32-bit words and checks that we get the correct + // words all the time. + //---------------------------------------------------------------- + task fifo_test(); + reg [7 : 0] i; + reg [7 : 0] j; + + begin + $display("*** Test of FIFO by loading known data and then reading out."); + + dump_dut_state(); + dump_fifo(); + + i = 8'd0; + + // Filling up the memory with data. + for (j = 0 ; j < 4 ; j = j + 1) + begin + write_w512(i); + #(2 * CLK_PERIOD); + i = i + 16; + end + + dump_dut_state(); + dump_fifo(); + + // Read out a number of words from the fifo. + for (j = 0 ; j < 17 ; j = j + 1) + begin + read_w32(); + end + + dump_dut_state(); + dump_fifo(); + + // Write another 512-bit word into the fifo. + write_w512(8'h40); + + + // Read out all of the rest of the data. + while (tb_rnd_syn) + read_w32(); + + dump_fifo(); + end + endtask // fifo_test + + + //---------------------------------------------------------------- // csprng_test // // The main test functionality. @@ -250,6 +421,10 @@ module tb_csprng_fifo(); reset_dut(); dump_dut_state(); + #(10 * CLK_PERIOD) + + fifo_test(); + #(100 * CLK_PERIOD) display_test_results(); |