aboutsummaryrefslogtreecommitdiff
path: root/src/rtl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rtl')
-rw-r--r--src/rtl/modexp.v329
1 files changed, 187 insertions, 142 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: