aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rtl/modexp.v329
-rw-r--r--src/tb/tb_modexp.v249
2 files changed, 361 insertions, 217 deletions
diff --git a/src/rtl/modexp.v b/src/rtl/modexp.v
index afd7a84..30b703e 100644
--- a/src/rtl/modexp.v
+++ b/src/rtl/modexp.v
@@ -24,33 +24,34 @@
//
//
// Author: Joachim Strombergson, Peter Magnusson
-// Copyright (c) 2015, NORDUnet A/S All rights reserved.
+// Copyright (c) 2015, Assured AB
+// All rights reserved.
//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-// - Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
+// Redistribution and use in source and binary forms, with or
+// without modification, are permitted provided that the following
+// conditions are met:
//
-// - Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
//
-// - Neither the name of the NORDUnet nor the names of its contributors may
-// be used to endorse or promote products derived from this software
-// without specific prior written permission.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in
+// the documentation and/or other materials provided with the
+// distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//======================================================================
@@ -86,27 +87,19 @@ module modexp(
localparam ADDR_EXPONENT_LENGTH = 8'h21;
localparam ADDR_LENGTH = 8'h22; // Should be deprecated.
+ localparam ADDR_MODULUS_PTR_RST = 8'h30;
+ localparam ADDR_MODULUS_DATA = 8'h31;
- localparam MODULUS_PREFIX = 4'h1;
- localparam ADDR_MODULUS_START = 8'h00;
- localparam ADDR_MODULUS_END = 8'hff;
-
-
- localparam EXPONENT_PREFIX = 4'h2;
- localparam ADDR_EXPONENT_START = 8'h00;
- localparam ADDR_EXPONENT_END = 8'hff;
+ localparam ADDR_EXPONENT_PTR_RST = 8'h40;
+ localparam ADDR_EXPONENT_DATA = 8'h41;
+ localparam ADDR_MESSAGE_PTR_RST = 8'h50;
+ localparam ADDR_MESSAGE_DATA = 8'h51;
- localparam MESSAGE_PREFIX = 4'h3;
- localparam MESSAGE_START = 8'h00;
- localparam MESSAGE_END = 8'hff;
+ localparam ADDR_RESULT_PTR_RST = 8'h60;
+ localparam ADDR_RESULT_DATA = 8'h61;
-
- localparam RESULT_PREFIX = 4'h4;
- localparam RESULT_START = 8'h00;
- localparam RESULT_END = 8'hff;
-
- localparam DEFAULT_MODLENGTH = 8'h80;
+ localparam DEFAULT_MODLENGTH = 8'h80; // 2048 bits.
localparam DEFAULT_EXPLENGTH = 8'h80;
localparam MONTPROD_SELECT_ONE_NR = 3'h0;
@@ -136,7 +129,7 @@ module modexp(
localparam CORE_NAME0 = 32'h6d6f6465; // "mode"
localparam CORE_NAME1 = 32'h78702020; // "xp "
- localparam CORE_VERSION = 32'h302e3530; // "0.50"
+ localparam CORE_VERSION = 32'h302e3531; // "0.51"
//----------------------------------------------------------------
@@ -204,17 +197,14 @@ module modexp(
reg [07 : 0] modulus_mem_int_rd_addr;
wire [31 : 0] modulus_mem_int_rd_data;
wire [31 : 0] modulus_mem_api_rd_data;
- reg modulus_mem_api_we;
reg [07 : 0] message_mem_int_rd_addr;
wire [31 : 0] message_mem_int_rd_data;
wire [31 : 0] message_mem_api_rd_data;
- reg message_mem_api_we;
reg [07 : 0] exponent_mem_int_rd_addr;
wire [31 : 0] exponent_mem_int_rd_data;
wire [31 : 0] exponent_mem_api_rd_data;
- reg exponent_mem_api_we;
wire [31 : 0] result_mem_api_rd_data;
reg [07 : 0] result_mem_int_rd_addr;
@@ -271,6 +261,22 @@ module modexp(
reg invalidate_residue;
reg residue_valid_int_validated;
+ reg modulus_mem_api_rst;
+ reg modulus_mem_api_cs;
+ reg modulus_mem_api_wr;
+
+ reg exponent_mem_api_rst;
+ reg exponent_mem_api_cs;
+ reg exponent_mem_api_wr;
+
+ reg message_mem_api_rst;
+ reg message_mem_api_cs;
+ reg message_mem_api_wr;
+
+ reg result_mem_api_rst;
+ reg result_mem_api_cs;
+
+
//----------------------------------------------------------------
// Concurrent connectivity for ports etc.
//----------------------------------------------------------------
@@ -331,52 +337,57 @@ module modexp(
.write_data(residue_opa_wr_data)
);
- blockmem2r1w modulus_mem(
- .clk(clk),
- .read_addr0(modulus_mem_int_rd_addr),
- .read_data0(modulus_mem_int_rd_data),
- .read_addr1(address[7 : 0]),
- .read_data1(modulus_mem_api_rd_data),
- .wr(modulus_mem_api_we),
- .write_addr(address[7 : 0]),
- .write_data(write_data)
- );
-
-
- blockmem2r1w message_mem(
- .clk(clk),
- .read_addr0(message_mem_int_rd_addr),
- .read_data0(message_mem_int_rd_data),
- .read_addr1(address[7 : 0]),
- .read_data1(message_mem_api_rd_data),
- .wr(message_mem_api_we),
- .write_addr(address[7 : 0]),
- .write_data(write_data)
- );
-
-
- blockmem2r1w exponent_mem(
- .clk(clk),
- .read_addr0(exponent_mem_int_rd_addr),
- .read_data0(exponent_mem_int_rd_data),
- .read_addr1(address[7 : 0]),
- .read_data1(exponent_mem_api_rd_data),
- .wr(exponent_mem_api_we),
- .write_addr(address[7 : 0]),
- .write_data(write_data)
- );
-
-
- blockmem2r1w result_mem(
- .clk(clk),
- .read_addr0(result_mem_int_rd_addr[7 : 0]),
- .read_data0(result_mem_int_rd_data),
- .read_addr1(address[7 : 0]),
- .read_data1(result_mem_api_rd_data),
- .wr(result_mem_int_we),
- .write_addr(result_mem_int_wr_addr),
- .write_data(result_mem_int_wr_data)
- );
+ blockmem2r1wptr modulus_mem(
+ .clk(clk),
+ .reset_n(reset_n),
+ .read_addr0(modulus_mem_int_rd_addr),
+ .read_data0(modulus_mem_int_rd_data),
+ .read_data1(modulus_mem_api_rd_data),
+ .rst(modulus_mem_api_rst),
+ .cs(modulus_mem_api_cs),
+ .wr(modulus_mem_api_wr),
+ .write_data(write_data)
+ );
+
+
+ blockmem2r1wptr message_mem(
+ .clk(clk),
+ .reset_n(reset_n),
+ .read_addr0(message_mem_int_rd_addr),
+ .read_data0(message_mem_int_rd_data),
+ .read_data1(message_mem_api_rd_data),
+ .rst(message_mem_api_rst),
+ .cs(message_mem_api_cs),
+ .wr(message_mem_api_wr),
+ .write_data(write_data)
+ );
+
+
+ blockmem2r1wptr exponent_mem(
+ .clk(clk),
+ .reset_n(reset_n),
+ .read_addr0(exponent_mem_int_rd_addr),
+ .read_data0(exponent_mem_int_rd_data),
+ .read_data1(exponent_mem_api_rd_data),
+ .rst(exponent_mem_api_rst),
+ .cs(exponent_mem_api_cs),
+ .wr(exponent_mem_api_wr),
+ .write_data(write_data)
+ );
+
+
+ blockmem2rptr1w result_mem(
+ .clk(clk),
+ .reset_n(reset_n),
+ .read_addr0(result_mem_int_rd_addr[7 : 0]),
+ .read_data0(result_mem_int_rd_data),
+ .read_data1(result_mem_api_rd_data),
+ .rst(result_mem_api_rst),
+ .cs(result_mem_api_cs),
+ .wr(result_mem_int_we),
+ .write_addr(result_mem_int_wr_addr),
+ .write_data(result_mem_int_wr_data)
+ );
blockmem2r1w p_mem(
.clk(clk),
@@ -410,7 +421,7 @@ module modexp(
modexp_ctrl_reg <= CTRL_IDLE;
one_reg <= 32'h0;
b_one_reg <= 32'h0;
- length_reg <= 8'h0;
+ length_reg <= DEFAULT_MODLENGTH;
length_m1_reg <= 8'h0;
loop_counter_reg <= 13'b0;
ei_reg <= 1'b0;
@@ -419,9 +430,9 @@ module modexp(
end
else
begin
- one_reg <= one_new;
- b_one_reg <= b_one_new;
- residue_valid_reg <= residue_valid_new;
+ one_reg <= one_new;
+ b_one_reg <= b_one_new;
+ residue_valid_reg <= residue_valid_new;
if (exponent_length_we)
exponent_length_reg <= exponent_length_new;
@@ -473,12 +484,25 @@ module modexp(
exponent_length_we = 1'b0;
start_new = 1'b0;
start_we = 1'b0;
- modulus_mem_api_we = 1'b0;
- exponent_mem_api_we = 1'b0;
- message_mem_api_we = 1'b0;
length_we = 1'b0;
invalidate_residue = 1'b0;
+ modulus_mem_api_rst = 1'b0;
+ modulus_mem_api_cs = 1'b0;
+ modulus_mem_api_wr = 1'b0;
+
+ exponent_mem_api_rst = 1'b0;
+ exponent_mem_api_cs = 1'b0;
+ exponent_mem_api_wr = 1'b0;
+
+ message_mem_api_rst = 1'b0;
+ message_mem_api_cs = 1'b0;
+ message_mem_api_wr = 1'b0;
+
+ result_mem_api_rst = 1'b0;
+ result_mem_api_cs = 1'b0;
+
+
//TODO: Add API code to enable fast exponation for working with public exponents.
exponation_mode_we = 1'b0;
@@ -512,19 +536,58 @@ module modexp(
start_we = 1'b1;
end
+ ADDR_MODULUS_LENGTH:
+ begin
+ modulus_length_we = 1'b1;
+ end
+
+ ADDR_EXPONENT_LENGTH:
+ begin
+ exponent_length_we = 1'b1;
+ end
+
ADDR_LENGTH:
begin
length_we = 1'b1;
end
- ADDR_MODULUS_LENGTH:
+ ADDR_MODULUS_PTR_RST:
begin
- modulus_length_we = 1'b1;
+ modulus_mem_api_rst = 1'b1;
end
- ADDR_EXPONENT_LENGTH:
+ ADDR_MODULUS_DATA:
begin
- exponent_length_we = 1'b1;
+ modulus_mem_api_cs = 1'b1;
+ modulus_mem_api_wr = 1'b1;
+ invalidate_residue = 1'b1;
+ end
+
+ ADDR_EXPONENT_PTR_RST:
+ begin
+ exponent_mem_api_rst = 1'b1;
+ end
+
+ ADDR_EXPONENT_DATA:
+ begin
+ exponent_mem_api_cs = 1'b1;
+ exponent_mem_api_wr = 1'b1;
+ end
+
+ ADDR_MESSAGE_PTR_RST:
+ begin
+ message_mem_api_rst = 1'b1;
+ end
+
+ ADDR_MESSAGE_DATA:
+ begin
+ message_mem_api_cs = 1'b1;
+ message_mem_api_wr = 1'b1;
+ end
+
+ ADDR_RESULT_PTR_RST:
+ begin
+ result_mem_api_rst = 1'b1;
end
default:
@@ -559,53 +622,35 @@ module modexp(
ADDR_LENGTH:
tmp_read_data = {24'h000000, length_reg};
- default:
+ ADDR_MODULUS_DATA:
begin
+ modulus_mem_api_cs = 1'b1;
+ tmp_read_data = modulus_mem_api_rd_data;
end
- endcase // case (address[7 : 0])
- end
- end
- MODULUS_PREFIX:
- begin
- if (we)
- begin
- modulus_mem_api_we = 1'b1;
- invalidate_residue = 1'b1;
- end
- else
- begin
- tmp_read_data = modulus_mem_api_rd_data;
- end
- end
+ ADDR_EXPONENT_DATA:
+ begin
+ exponent_mem_api_cs = 1'b1;
+ tmp_read_data = exponent_mem_api_rd_data;
+ end
- EXPONENT_PREFIX:
- begin
- if (we)
- begin
- exponent_mem_api_we = 1'b1;
- end
- else
- begin
- tmp_read_data = exponent_mem_api_rd_data;
- end
- end
+ ADDR_MESSAGE_DATA:
+ begin
+ message_mem_api_cs = 1'b1;
+ tmp_read_data = message_mem_api_rd_data;
+ end
- MESSAGE_PREFIX:
- begin
- if (we)
- begin
- message_mem_api_we = 1'b1;
- end
- else
- begin
- tmp_read_data = message_mem_api_rd_data;
- end
- end
+ ADDR_RESULT_DATA:
+ begin
+ result_mem_api_cs = 1'b1;
+ tmp_read_data = result_mem_api_rd_data;
+ end
- RESULT_PREFIX:
- begin
- tmp_read_data = result_mem_api_rd_data;
+ default:
+ begin
+ end
+ endcase // case (address[7 : 0])
+ end
end
default:
diff --git a/src/tb/tb_modexp.v b/src/tb/tb_modexp.v
index a7159b7..0bb81e8 100644
--- a/src/tb/tb_modexp.v
+++ b/src/tb/tb_modexp.v
@@ -6,33 +6,33 @@
//
//
// Author: Joachim Strombergson, Peter Magnusson
-// Copyright (c) 2015, NORDUnet A/S All rights reserved.
+// Copyright (c) 2015, Assured AB
+// All rights reserved.
//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-// - Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
+// Redistribution and use in source and binary forms, with or
+// without modification, are permitted provided that the following
+// conditions are met:
//
-// - Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
//
-// - Neither the name of the NORDUnet nor the names of its contributors may
-// be used to endorse or promote products derived from this software
-// without specific prior written permission.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in
+// the documentation and/or other materials provided with the
+// distribution.
//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//======================================================================
@@ -50,48 +50,53 @@ module tb_modexp();
//----------------------------------------------------------------
// Internal constant and parameter definitions.
//----------------------------------------------------------------
- parameter DEBUG = 0;
- parameter DEBUG_EI = 1;
+ // Debug output control.
+ parameter DEBUG = 0;
+ parameter DEBUG_EI = 0;
+ parameter DISPLAY_TEST_CYCLES = 1;
+
+ // Clock defines.
localparam CLK_HALF_PERIOD = 1;
localparam CLK_PERIOD = 2 * CLK_HALF_PERIOD;
+
// The DUT address map.
- localparam GENERAL_PREFIX = 4'h0;
- localparam ADDR_NAME0 = 8'h00;
- localparam ADDR_NAME1 = 8'h01;
- localparam ADDR_VERSION = 8'h02;
+ localparam GENERAL_PREFIX = 4'h0;
+ localparam ADDR_NAME0 = 8'h00;
+ localparam ADDR_NAME1 = 8'h01;
+ localparam ADDR_VERSION = 8'h02;
- localparam ADDR_CTRL = 8'h08;
- localparam CTRL_START_BIT = 0;
+ localparam ADDR_CTRL = 8'h08;
+ localparam CTRL_START_BIT = 0;
- localparam ADDR_STATUS = 8'h09;
- localparam STATUS_READY_BIT = 0;
+ localparam ADDR_STATUS = 8'h09;
+ localparam STATUS_READY_BIT = 0;
- localparam ADDR_MODULUS_LENGTH = 8'h20;
- localparam ADDR_MESSAGE_LENGTH = 8'h21;
- localparam ADDR_EXPONENT_LENGTH = 8'h22;
+ localparam ADDR_MODULUS_LENGTH = 8'h20;
+ localparam ADDR_EXPONENT_LENGTH = 8'h21;
+ localparam ADDR_LENGTH = 8'h22;
- localparam MODULUS_PREFIX = 4'h1;
- localparam ADDR_MODULUS_START = 8'h00;
- localparam ADDR_MODULUS_END = 8'hff;
+ localparam ADDR_MODULUS_PTR_RST = 8'h30;
+ localparam ADDR_MODULUS_DATA = 8'h31;
- localparam EXPONENT_PREFIX = 4'h2;
- localparam ADDR_EXPONENT_START = 8'h00;
- localparam ADDR_EXPONENT_END = 8'hff;
+ localparam ADDR_EXPONENT_PTR_RST = 8'h40;
+ localparam ADDR_EXPONENT_DATA = 8'h41;
- localparam MESSAGE_PREFIX = 4'h3;
- localparam MESSAGE_START = 8'h00;
- localparam MESSAGE_END = 8'hff;
+ localparam ADDR_MESSAGE_PTR_RST = 8'h50;
+ localparam ADDR_MESSAGE_DATA = 8'h51;
- localparam RESULT_PREFIX = 4'h4;
- localparam RESULT_START = 8'h00;
- localparam RESULT_END = 8'hff;
+ localparam ADDR_RESULT_PTR_RST = 8'h60;
+ localparam ADDR_RESULT_DATA = 8'h61;
//----------------------------------------------------------------
// Register and Wire declarations.
//----------------------------------------------------------------
+ reg [31 : 0] test_cycle_ctr;
+ reg test_cycle_ctr_rst;
+ reg test_cycle_ctr_inc;
+
reg [31 : 0] cycle_ctr;
reg [31 : 0] error_ctr;
reg [31 : 0] tc_ctr;
@@ -153,12 +158,62 @@ module tb_modexp();
end
end
+
+ //----------------------------------------------------------------
+ // test_cycle_counter
+ //
+ // Used to measure the number of cycles it takes to perform
+ // a given test case.
+ //----------------------------------------------------------------
+ always @ (posedge tb_clk)
+ begin
+ if (test_cycle_ctr_rst)
+ test_cycle_ctr = 64'h0000000000000000;
+
+ if (test_cycle_ctr_inc)
+ test_cycle_ctr = test_cycle_ctr + 1;
+ end
+
+
+ //----------------------------------------------------------------
+ // start_test_cycle_ctr
+ //
+ // Reset and start the test cycle counter.
+ //----------------------------------------------------------------
+ task start_test_cycle_ctr();
+ begin
+ test_cycle_ctr_rst = 1;
+ #(CLK_PERIOD);
+ test_cycle_ctr_rst = 0;
+
+ test_cycle_ctr_inc = 1;
+ end
+ endtask // start_test_cycle_ctr()
+
+
+ //----------------------------------------------------------------
+ // stop_test_cycle_ctr()
+ //
+ // Stop the test cycle counter and optionally display the
+ // result.
+ //----------------------------------------------------------------
+ task stop_test_cycle_ctr();
+ begin
+ test_cycle_ctr_inc = 0;
+ #(CLK_PERIOD);
+
+ if (DISPLAY_TEST_CYCLES)
+ $display("*** Number of cycles performed during test: 0x%016x", test_cycle_ctr);
+ end
+ endtask // stop_test_cycle_ctr()
+
+
//----------------------------------------------------------------
// ei_monitor()
//
// Displays ei_new, the most important variable for determining
- // what modexp will do (i.e. should Z=MONTPROD( Z, P, M) be
- // performed
+ // what modexp will do (i.e. should Z=MONTPROD( Z, P, M) be
+ // performed
//----------------------------------------------------------------
always @*
begin : ei_monitor
@@ -307,7 +362,7 @@ module tb_modexp();
tb_write_data = word;
tb_cs = 1;
tb_we = 1;
- #(2 * CLK_PERIOD);
+ #(CLK_PERIOD);
tb_cs = 0;
tb_we = 0;
end
@@ -484,22 +539,31 @@ module tb_modexp();
$display("TC1: Trying to calculate 3**7 mod 11 = 9");
// Write 3 to message memory.
- write_word({MESSAGE_PREFIX, 8'h00}, 32'h00000003);
+ write_word({GENERAL_PREFIX, ADDR_MESSAGE_PTR_RST}, 32'h00000000);
+ write_word({GENERAL_PREFIX, ADDR_MESSAGE_DATA}, 32'h00000003);
+ write_word({GENERAL_PREFIX, ADDR_LENGTH}, 32'h00000001);
// Write 7 to exponent memory and set length to one word.
- write_word({EXPONENT_PREFIX, 8'h00}, 32'h00000007);
+ write_word({GENERAL_PREFIX, ADDR_EXPONENT_PTR_RST}, 32'h00000000);
+ write_word({GENERAL_PREFIX, ADDR_EXPONENT_DATA}, 32'h00000007);
write_word({GENERAL_PREFIX, ADDR_EXPONENT_LENGTH}, 32'h00000001);
// Write 11 to modulus memory and set length to one word.
- write_word({MODULUS_PREFIX, 8'h00}, 32'h0000000b);
+ write_word({GENERAL_PREFIX, ADDR_MODULUS_PTR_RST}, 32'h00000000);
+ write_word({GENERAL_PREFIX, ADDR_MODULUS_DATA}, 32'h0000000b);
write_word({GENERAL_PREFIX, ADDR_MODULUS_LENGTH}, 32'h00000001);
+ start_test_cycle_ctr();
+
// Start processing and wait for ready.
write_word({GENERAL_PREFIX, ADDR_CTRL}, 32'h00000001);
wait_ready();
+ stop_test_cycle_ctr();
+
// Read out result word and check result.
- read_word({RESULT_PREFIX, 8'h00});
+ write_word({GENERAL_PREFIX, ADDR_RESULT_PTR_RST}, 32'h00000000);
+ read_word({GENERAL_PREFIX, ADDR_RESULT_DATA});
read_data = tb_read_data;
if (read_data == 32'h00000009)
@@ -534,23 +598,32 @@ module tb_modexp();
tc_ctr = tc_ctr + 1;
$display("TC2: Trying to calculate 251**251 mod 257 = 183");
- // Write 13 to (m)esaage memory.
- write_word({MESSAGE_PREFIX, 8'h00}, 32'h000000fb);
+ // Write 13 to message memory.
+ write_word({GENERAL_PREFIX, ADDR_MESSAGE_PTR_RST}, 32'h00000000);
+ write_word({GENERAL_PREFIX, ADDR_MESSAGE_DATA}, 32'h000000fb);
+ write_word({GENERAL_PREFIX, ADDR_LENGTH}, 32'h00000001);
// Write 11 to exponent memory and set length to one word.
- write_word({EXPONENT_PREFIX, 8'h00}, 32'h000000fb);
+ write_word({GENERAL_PREFIX, ADDR_EXPONENT_PTR_RST}, 32'h00000000);
+ write_word({GENERAL_PREFIX, ADDR_EXPONENT_DATA}, 32'h000000fb);
write_word({GENERAL_PREFIX, ADDR_EXPONENT_LENGTH}, 32'h00000001);
// Write 7 to modulus memory and set length to one word.
- write_word({MODULUS_PREFIX, 8'h00}, 32'h00000101);
+ write_word({GENERAL_PREFIX, ADDR_MODULUS_PTR_RST}, 32'h00000000);
+ write_word({GENERAL_PREFIX, ADDR_MODULUS_DATA}, 32'h00000101);
write_word({GENERAL_PREFIX, ADDR_MODULUS_LENGTH}, 32'h00000001);
+ start_test_cycle_ctr();
+
// Start processing and wait for ready.
write_word({GENERAL_PREFIX, ADDR_CTRL}, 32'h00000001);
wait_ready();
+ stop_test_cycle_ctr();
+
// Read out result word and check result.
- read_word({RESULT_PREFIX, 8'h00});
+ write_word({GENERAL_PREFIX, ADDR_RESULT_PTR_RST}, 32'h00000000);
+ read_word({GENERAL_PREFIX, ADDR_RESULT_DATA});
read_data = tb_read_data;
if (read_data == 32'h000000b7)
@@ -561,7 +634,7 @@ module tb_modexp();
else
begin
$display("*** ERROR: TC2 NOT successful.");
- $display("Expected: 0x06, got 0x%08x", read_data);
+ $display("Expected: 0x000000b7, got 0x%08x", read_data);
error_ctr = error_ctr + 1;
end
end
@@ -584,22 +657,31 @@ module tb_modexp();
tc_ctr = tc_ctr + 1;
$display("TC3: Trying to calculate 0x81 ** 0x41 mod 0x87 = 0x36");
- write_word({MESSAGE_PREFIX, 8'h00}, 32'h00000081);
+ write_word({GENERAL_PREFIX, ADDR_MESSAGE_PTR_RST}, 32'h00000000);
+ write_word({GENERAL_PREFIX, ADDR_MESSAGE_DATA}, 32'h00000081);
+ write_word({GENERAL_PREFIX, ADDR_LENGTH}, 32'h00000001);
// Write 11 to exponent memory and set length to one word.
- write_word({EXPONENT_PREFIX, 8'h00}, 32'h00000041);
+ write_word({GENERAL_PREFIX, ADDR_EXPONENT_PTR_RST}, 32'h00000000);
+ write_word({GENERAL_PREFIX, ADDR_EXPONENT_DATA}, 32'h00000041);
write_word({GENERAL_PREFIX, ADDR_EXPONENT_LENGTH}, 32'h00000001);
// Write 7 to modulus memory and set length to one word.
- write_word({MODULUS_PREFIX, 8'h00}, 32'h00000087);
+ write_word({GENERAL_PREFIX, ADDR_MODULUS_PTR_RST}, 32'h00000000);
+ write_word({GENERAL_PREFIX, ADDR_MODULUS_DATA}, 32'h00000087);
write_word({GENERAL_PREFIX, ADDR_MODULUS_LENGTH}, 32'h00000001);
+ start_test_cycle_ctr();
+
// Start processing and wait for ready.
write_word({GENERAL_PREFIX, ADDR_CTRL}, 32'h00000001);
wait_ready();
+ stop_test_cycle_ctr();
+
// Read out result word and check result.
- read_word({RESULT_PREFIX, 8'h00});
+ write_word({GENERAL_PREFIX, ADDR_RESULT_PTR_RST}, 32'h00000000);
+ read_word({GENERAL_PREFIX, ADDR_RESULT_DATA});
read_data = tb_read_data;
if (read_data == 32'h00000036)
@@ -616,6 +698,9 @@ module tb_modexp();
end
endtask // tc3
+
+ //----------------------------------------------------------------
+ //----------------------------------------------------------------
function assertEquals(
input [31:0] expected,
input [31:0] actual
@@ -635,6 +720,9 @@ module tb_modexp();
integer success;
+
+ //----------------------------------------------------------------
+ //----------------------------------------------------------------
task autogenerated_BASIC_M4962768465676381896();
reg [31 : 0] read_data;
begin
@@ -642,25 +730,36 @@ module tb_modexp();
tc_ctr = tc_ctr + 1;
$display("autogenerated_BASIC_M4962768465676381896: 00000001946473e1 ** h000000010e85e74f mod 0000000170754797 ");
- write_word({MESSAGE_PREFIX, 8'h00}, 32'h00000001); //TEMPLATE_MESSAGE_VALES
- write_word({MESSAGE_PREFIX, 8'h01}, 32'h946473e1); //TEMPLATE_MESSAGE_VALES
- write_word({EXPONENT_PREFIX, 8'h00}, 32'h00000001); //TEMPLATE_EXPONENT_VALES
- write_word({EXPONENT_PREFIX, 8'h01}, 32'h0e85e74f); //TEMPLATE_EXPONENT_VALES
- write_word({MODULUS_PREFIX, 8'h00}, 32'h00000001); //TEMPLATE_MODULUS_VALUES
- write_word({MODULUS_PREFIX, 8'h01}, 32'h70754797); //TEMPLATE_MODULUS_VALUES
+ write_word({GENERAL_PREFIX, ADDR_MESSAGE_PTR_RST}, 32'h00000000);
+ write_word({GENERAL_PREFIX, ADDR_MESSAGE_DATA}, 32'h00000001); //TEMPLATE_MESSAGE_VALUES
+ write_word({GENERAL_PREFIX, ADDR_MESSAGE_DATA}, 32'h946473e1); //TEMPLATE_MESSAGE_VALUES
+
+ write_word({GENERAL_PREFIX, ADDR_EXPONENT_PTR_RST}, 32'h00000000);
+ write_word({GENERAL_PREFIX, ADDR_EXPONENT_DATA}, 32'h00000001); //TEMPLATE_EXPONENT_VALUES
+ write_word({GENERAL_PREFIX, ADDR_EXPONENT_DATA}, 32'h0e85e74f); //TEMPLATE_EXPONENT_VALUES
+
+ write_word({GENERAL_PREFIX, ADDR_MODULUS_PTR_RST}, 32'h00000000);
+ write_word({GENERAL_PREFIX, ADDR_MODULUS_DATA}, 32'h00000001); //TEMPLATE_MODULUS_VALUES
+ write_word({GENERAL_PREFIX, ADDR_MODULUS_DATA}, 32'h70754797); //TEMPLATE_MODULUS_VALUES
write_word({GENERAL_PREFIX, ADDR_EXPONENT_LENGTH}, 32'h00000002); //TEMPLATE_MESSAGE_LENGTH
write_word({GENERAL_PREFIX, ADDR_MODULUS_LENGTH}, 32'h00000002); //TEMPLATE_MODULUS_LENGTH
+ write_word({GENERAL_PREFIX, ADDR_LENGTH}, 32'h00000002); //TEMPLATE_LENGTH
+
+ start_test_cycle_ctr();
// Start processing and wait for ready.
write_word({GENERAL_PREFIX, ADDR_CTRL}, 32'h00000001);
wait_ready();
- read_word({RESULT_PREFIX, 8'h00}); read_data = tb_read_data; success = success & assertEquals(32'h00000000, read_data); //TEMPLATE_EXPECTED_VALUES
- read_word({RESULT_PREFIX, 8'h01}); read_data = tb_read_data; success = success & assertEquals(32'h7761ed4f, read_data); //TEMPLATE_EXPECTED_VALUES
-
+ stop_test_cycle_ctr();
+
+ write_word({GENERAL_PREFIX, ADDR_RESULT_PTR_RST}, 32'h00000000);
+ read_word({GENERAL_PREFIX, ADDR_RESULT_DATA}); read_data = tb_read_data; success = success & assertEquals(32'h00000000, read_data); //TEMPLATE_EXPECTED_VALUES
+ read_word({GENERAL_PREFIX, ADDR_RESULT_DATA}); read_data = tb_read_data; success = success & assertEquals(32'h7761ed4f, read_data); //TEMPLATE_EXPECTED_VALUES
+
if (success !== 1)
- begin
+ begin
$display("*** ERROR: autogenerated_BASIC_M4962768465676381896 was NOT successful.");
error_ctr = error_ctr + 1;
end