aboutsummaryrefslogtreecommitdiff
path: root/rtl/modexpng_wrapper.v
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/modexpng_wrapper.v')
-rw-r--r--rtl/modexpng_wrapper.v246
1 files changed, 157 insertions, 89 deletions
diff --git a/rtl/modexpng_wrapper.v b/rtl/modexpng_wrapper.v
index 687a963..0af6c32 100644
--- a/rtl/modexpng_wrapper.v
+++ b/rtl/modexpng_wrapper.v
@@ -111,7 +111,8 @@ module modexpng_wrapper
//
localparam MIN_OP_W = 2 * NUM_MULTS * WORD_W * 2;
localparam MIN_EXP_W = 2 * 2;
- localparam ZEROES_BIT_INDEX_W = 1 + cryptech_clog2(NUM_MULTS) + cryptech_clog2(WORD_W);
+ localparam LSB_BIT_INDEX_W = 1 + cryptech_clog2(NUM_MULTS) + cryptech_clog2(WORD_W);
+ localparam MSB_BIT_INDEX_W = BIT_INDEX_W - LSB_BIT_INDEX_W;
//
@@ -125,35 +126,29 @@ module modexpng_wrapper
//
// Registers
//
- reg wrap_reg_control = `MODEXPNG_DEFAULT_CONTROL;
- reg sync_reg_control = `MODEXPNG_DEFAULT_CONTROL;
- reg sync_reg_control_dly = `MODEXPNG_DEFAULT_CONTROL;
- reg core_reg_control = `MODEXPNG_DEFAULT_CONTROL;
- reg wrap_reg_mode = `MODEXPNG_DEFAULT_MODE;
+ reg wrap_reg_control = `MODEXPNG_DEFAULT_CONTROL;
+ reg core_reg_control = `MODEXPNG_DEFAULT_CONTROL;
+ reg wrap_reg_mode = `MODEXPNG_DEFAULT_MODE;
reg sync_reg_mode;
reg core_reg_mode;
- reg [BIT_INDEX_W:ZEROES_BIT_INDEX_W] wrap_modulus_bits_msb;
- reg [BIT_INDEX_W: 0] wrap_exponent_bits;
+ reg [BIT_INDEX_W:LSB_BIT_INDEX_W] wrap_modulus_bits_msb;
+ reg [BIT_INDEX_W: 0] wrap_exponent_bits;
- initial write_modulus_bits(`MODEXPNG_DEFAULT_MODULUS_BITS);
- initial write_exponent_bits(`MODEXPNG_DEFAULT_EXPONENT_BITS);
-
- wire sync_reg_control_rising = sync_reg_control & ~sync_reg_control_dly;
+ initial update_modulus_bits_user;
+ initial update_exponent_bits_user;
+
+ //wire sync_reg_control_rising = sync_reg_control & ~sync_reg_control_dly;
//
// Wires
//
- reg wrap_reg_status = 1'b1;
- reg sync_reg_status = 1'b1;
+ reg wrap_reg_status = 1'b1;
+ reg sync_reg_status = 1'b1;
+ reg sync_reg_status_dly = 1'b1;
wire core_reg_status;
- always @(posedge clk or negedge rst_n)
- //
- if (!rst_n) {wrap_reg_status, sync_reg_status} <= { 1'b1, 1'b1};
- else {wrap_reg_status, sync_reg_status} <= {sync_reg_status, core_reg_status};
-
//
// Output Mux
@@ -175,8 +170,76 @@ module modexpng_wrapper
else core_rst_shreg <= {core_rst_shreg[14:0], 1'b1};
assign core_rst_n = core_rst_shreg[15];
+
+
+ //
+ // Trigger Logic
+ //
+ reg wrap_reg_control_dly = `MODEXPNG_DEFAULT_CONTROL;
+ reg wrap_reg_control_posedge = 1'b0;
+ reg sync_reg_control_posedge = 1'b0;
+ reg core_reg_control_posedge = 1'b0;
+ reg core_reg_control_posedge_dly = 1'b0;
+ reg sync_reg_control_posedge_ack = 1'b0;
+ reg wrap_reg_control_posedge_ack = 1'b0;
+
+ always @(posedge clk or negedge rst_n)
+ if (!rst_n) wrap_reg_control_dly <= `MODEXPNG_DEFAULT_CONTROL;
+ else wrap_reg_control_dly <= wrap_reg_control;
+
+ always @(posedge clk or negedge rst_n)
+ if (!rst_n) wrap_reg_control_posedge <= 1'b0;
+ else begin
+ if (!wrap_reg_control_posedge) begin
+ if (wrap_reg_control && !wrap_reg_control_dly) wrap_reg_control_posedge <= 1'b1;
+ end else begin
+ if (wrap_reg_control_posedge_ack) wrap_reg_control_posedge <= 1'b0;
+ end
+ end
+
+ always @(posedge clk_core or negedge core_rst_n)
+ if (!core_rst_n) sync_reg_control_posedge <= 1'b0;
+ else sync_reg_control_posedge <= wrap_reg_control_posedge;
+
+ always @(posedge clk_core or negedge core_rst_n)
+ if (!core_rst_n) core_reg_control_posedge <= 1'b0;
+ else core_reg_control_posedge <= sync_reg_control_posedge;
+
+ always @(posedge clk_core or negedge core_rst_n)
+ if (!core_rst_n) core_reg_control_posedge_dly <= 1'b0;
+ else core_reg_control_posedge_dly <= core_reg_control_posedge;
+
+ always @(posedge clk or negedge rst_n)
+ if (!rst_n) sync_reg_control_posedge_ack <= 1'b0;
+ else sync_reg_control_posedge_ack <= core_reg_control_posedge;
+
+ always @(posedge clk or negedge rst_n)
+ if (!rst_n) wrap_reg_control_posedge_ack <= 1'b0;
+ else wrap_reg_control_posedge_ack <= sync_reg_control_posedge_ack;
+
+ always @(posedge clk_core or negedge core_rst_n)
+ if (!core_rst_n) core_reg_control <= `MODEXPNG_DEFAULT_CONTROL;
+ else core_reg_control <= core_reg_control_posedge && !core_reg_control_posedge_dly;
+ always @(posedge clk or negedge rst_n)
+ if (!rst_n) sync_reg_status <= 1'b1;
+ else sync_reg_status <= core_reg_status;
+
+ always @(posedge clk or negedge rst_n)
+ if (!rst_n) sync_reg_status_dly <= 1'b1;
+ else sync_reg_status_dly <= sync_reg_status;
+
+ always @(posedge clk or negedge rst_n)
+ if (!rst_n) wrap_reg_status <= 1'b1;
+ else begin
+ if (wrap_reg_status) begin
+ if (wrap_reg_control && !wrap_reg_control_dly) wrap_reg_status <= 1'b0;
+ end else begin
+ if (!wrap_reg_control_posedge && !wrap_reg_control_posedge_ack && sync_reg_status_dly) wrap_reg_status <= 1'b1;
+ end
+ end
+
//
// Parameters Resync
//
@@ -212,7 +275,7 @@ module modexpng_wrapper
always @(posedge clk_core)
//
- if (sync_reg_control_rising) begin
+ if (core_reg_control_posedge && !core_reg_control_posedge_dly) begin
//
core_reg_mode <= sync_reg_mode;
//
@@ -224,21 +287,6 @@ module modexpng_wrapper
//
end
-
- //
- // Trigger Logic
- //
- always @(posedge clk_core or negedge rst_n)
- //
- if (!rst_n) {sync_reg_control_dly, sync_reg_control} <= {`MODEXPNG_DEFAULT_CONTROL, `MODEXPNG_DEFAULT_CONTROL};
- else {sync_reg_control_dly, sync_reg_control} <= { sync_reg_control, wrap_reg_control};
-
- always @(posedge clk_core or negedge rst_n)
- //
- if (!rst_n) core_reg_control <= `MODEXPNG_DEFAULT_CONTROL;
- else core_reg_control <= sync_reg_control_rising;
-
-
//
// ModExpNG
//
@@ -271,6 +319,63 @@ module modexpng_wrapper
//
// Write Interface
//
+
+ wire [ BIT_INDEX_W :0] corrected_modulus_bits_user = correct_modulus_bits(write_data[BIT_INDEX_W:0]);
+ wire [MSB_BIT_INDEX_W :0] corrected_modulus_bits_msb_user = corrected_modulus_bits_user[BIT_INDEX_W:LSB_BIT_INDEX_W];
+ wire [ OP_ADDR_W :0] modulus_num_words_n_user = {corrected_modulus_bits_msb_user, {(LSB_BIT_INDEX_W-WORD_MUX_W){1'b0}}} - 1'b1;
+ wire [ OP_ADDR_W-1:0] modulus_num_words_n_lsb_user = modulus_num_words_n_user[OP_ADDR_W-1:0];
+ wire [ OP_ADDR_W-1:0] modulus_num_words_pq_user = {corrected_modulus_bits_msb_user, {(LSB_BIT_INDEX_W-WORD_MUX_W-1){1'b0}}} - 1'b1;
+
+ wire [ BIT_INDEX_W :0] corrected_modulus_bits_default = `MODEXPNG_DEFAULT_MODULUS_BITS;
+ wire [MSB_BIT_INDEX_W :0] corrected_modulus_bits_msb_default = corrected_modulus_bits_default[BIT_INDEX_W:LSB_BIT_INDEX_W];
+ wire [ OP_ADDR_W :0] modulus_num_words_n_default = {corrected_modulus_bits_msb_default, {(LSB_BIT_INDEX_W-WORD_MUX_W){1'b0}}} - 1'b1;
+ wire [ OP_ADDR_W-1:0] modulus_num_words_n_lsb_default = modulus_num_words_n_default[OP_ADDR_W-1:0];
+ wire [ OP_ADDR_W-1:0] modulus_num_words_pq_default = {corrected_modulus_bits_msb_default, {(LSB_BIT_INDEX_W-WORD_MUX_W-1){1'b0}}} - 1'b1;
+
+ wire [ BIT_INDEX_W :0] corrected_exponent_bits_user = correct_exponent_bits(write_data[BIT_INDEX_W:0]);
+ wire [ BIT_INDEX_W-1:0] corrected_exponent_bits_msb_user = corrected_exponent_bits_user[BIT_INDEX_W:1];
+ wire [ BIT_INDEX_W :0] exponent_num_bits_n_user = corrected_exponent_bits_user - 1'b1;
+ wire [ BIT_INDEX_W-1:0] exponent_num_bits_n_lsb_user = exponent_num_bits_n_user[BIT_INDEX_W-1:0];
+ wire [ BIT_INDEX_W-1:0] exponent_num_bits_pq_user = corrected_exponent_bits_msb_user - 1'b1;
+
+ wire [ BIT_INDEX_W :0] corrected_exponent_bits_default = `MODEXPNG_DEFAULT_EXPONENT_BITS;
+ wire [ BIT_INDEX_W-1:0] corrected_exponent_bits_msb_default = corrected_exponent_bits_default[BIT_INDEX_W:1];
+ wire [ BIT_INDEX_W :0] exponent_num_bits_n_default = corrected_exponent_bits_default - 1'b1;
+ wire [ BIT_INDEX_W-1:0] exponent_num_bits_n_lsb_default = exponent_num_bits_n_default[BIT_INDEX_W-1:0];
+ wire [ BIT_INDEX_W-1:0] exponent_num_bits_pq_default = corrected_exponent_bits_msb_default - 1'b1;
+
+ task update_modulus_bits_user;
+ begin
+ wrap_modulus_bits_msb <= corrected_modulus_bits_msb_user;
+ wrap_word_index_last_n <= modulus_num_words_n_lsb_user;
+ wrap_word_index_last_pq <= modulus_num_words_pq_user;
+ end
+ endtask
+
+ task update_modulus_bits_default;
+ begin
+ wrap_modulus_bits_msb <= corrected_modulus_bits_msb_default;
+ wrap_word_index_last_n <= modulus_num_words_n_lsb_default;
+ wrap_word_index_last_pq <= modulus_num_words_pq_default;
+ end
+ endtask
+
+ task update_exponent_bits_user;
+ begin
+ wrap_exponent_bits <= corrected_exponent_bits_user;
+ wrap_bit_index_last_n <= exponent_num_bits_n_lsb_user;
+ wrap_bit_index_last_pq <= exponent_num_bits_pq_user;
+ end
+ endtask
+
+ task update_exponent_bits_default;
+ begin
+ wrap_exponent_bits <= corrected_exponent_bits_default;
+ wrap_bit_index_last_n <= exponent_num_bits_n_lsb_default;
+ wrap_bit_index_last_pq <= exponent_num_bits_pq_default;
+ end
+ endtask
+
always @(posedge clk or negedge rst_n)
//
if (!rst_n) begin
@@ -278,77 +383,40 @@ module modexpng_wrapper
wrap_reg_control <= `MODEXPNG_DEFAULT_CONTROL;
wrap_reg_mode <= `MODEXPNG_DEFAULT_MODE;
//
- write_modulus_bits(`MODEXPNG_DEFAULT_MODULUS_BITS);
- write_exponent_bits(`MODEXPNG_DEFAULT_EXPONENT_BITS);
+ update_modulus_bits_default;
+ update_exponent_bits_default;
//
end else if (cs && we && addr_msb_is_wrap)
//
case (addr_lsb)
ADDR_CONTROL: wrap_reg_control <= write_data[CONTROL_NEXT_BIT];
ADDR_MODE: wrap_reg_mode <= write_data[MODE_FULLCRT_BIT];
- ADDR_MODULUS_BITS: write_modulus_bits(write_data[BIT_INDEX_W:0]);
- ADDR_EXPONENT_BITS: write_exponent_bits(write_data[BIT_INDEX_W:0]);
+ ADDR_MODULUS_BITS: update_modulus_bits_user;
+ ADDR_EXPONENT_BITS: update_exponent_bits_user;
endcase
//
- // Update modulus width
+ // Only accept correct modulus width
//
- function [BIT_INDEX_W:ZEROES_BIT_INDEX_W] fix_modulus_bits;
- input [BIT_INDEX_W: 0] width;
- if (width < MIN_OP_W) fix_modulus_bits = MIN_OP_W[BIT_INDEX_W:ZEROES_BIT_INDEX_W];
- else if (width > MAX_OP_W) fix_modulus_bits = MAX_OP_W[BIT_INDEX_W:ZEROES_BIT_INDEX_W];
- else fix_modulus_bits = width [BIT_INDEX_W:ZEROES_BIT_INDEX_W];
- endfunction
-
- function [OP_ADDR_W-1: 0] calc_modulus_num_words_n;
- input [BIT_INDEX_W:ZEROES_BIT_INDEX_W] width;
- calc_modulus_num_words_n = {width, {(ZEROES_BIT_INDEX_W-WORD_MUX_W){1'b0}}} - 1'b1; // truncates msb
- endfunction
-
- function [OP_ADDR_W-1: 0] calc_modulus_num_words_pq;
- input [BIT_INDEX_W:ZEROES_BIT_INDEX_W] width;
- calc_modulus_num_words_pq = {width, {(ZEROES_BIT_INDEX_W-WORD_MUX_W-1){1'b0}}} - 1'b1; // fits exactly
- endfunction
-
- task write_modulus_bits;
+ function [BIT_INDEX_W:0] correct_modulus_bits;
input [BIT_INDEX_W:0] width;
- begin
- wrap_modulus_bits_msb <= fix_modulus_bits(width);
- wrap_word_index_last_n <= calc_modulus_num_words_n(fix_modulus_bits(width));
- wrap_word_index_last_pq <= calc_modulus_num_words_pq(fix_modulus_bits(width));
- end
- endtask
+ if (width < MIN_OP_W) correct_modulus_bits = MIN_OP_W;
+ else if (width > MAX_OP_W) correct_modulus_bits = MAX_OP_W;
+ else correct_modulus_bits = width;
+ endfunction
//
- // Update exponent width
+ // Only accept correct exponent width
//
- function [BIT_INDEX_W:0] fix_exponent_bits;
+ function [BIT_INDEX_W:0] correct_exponent_bits;
input [BIT_INDEX_W:0] width;
- if (width < MIN_EXP_W) fix_exponent_bits = MIN_EXP_W;
- else if (width > MAX_OP_W ) fix_exponent_bits = MAX_OP_W;
- else fix_exponent_bits = width;
- endfunction
-
- function [BIT_INDEX_W-1:0] calc_exponent_num_bits_n;
- input [BIT_INDEX_W :0] width;
- calc_exponent_num_bits_n = width - 1'b1; // truncates msb
- endfunction
-
- function [BIT_INDEX_W-1:0] calc_exponent_num_bits_pq;
- input [BIT_INDEX_W: 0] width;
- calc_exponent_num_bits_pq = width[BIT_INDEX_W:1] - 1'b1; // fits exactly
+ if (width < MIN_EXP_W) correct_exponent_bits = MIN_EXP_W;
+ else if (width > MAX_OP_W ) correct_exponent_bits = MAX_OP_W;
+ else correct_exponent_bits = width;
endfunction
-
- task write_exponent_bits;
- input [BIT_INDEX_W:0] width;
- begin
- wrap_exponent_bits <= fix_exponent_bits(width);
- wrap_bit_index_last_n <= calc_exponent_num_bits_n(fix_exponent_bits(width));
- wrap_bit_index_last_pq <= calc_exponent_num_bits_pq(fix_exponent_bits(width));
- end
- endtask
+
//
@@ -367,7 +435,7 @@ module modexpng_wrapper
ADDR_STATUS: wrap_read_data <= {{30{1'b0}}, wrap_reg_status, 1'b1};
//
ADDR_MODE: wrap_read_data <= {{30{1'b0}}, wrap_reg_mode, 1'b0};
- ADDR_MODULUS_BITS: wrap_read_data <= {{(31-BIT_INDEX_W){1'b0}}, wrap_modulus_bits_msb, {ZEROES_BIT_INDEX_W{1'b0}}};
+ ADDR_MODULUS_BITS: wrap_read_data <= {{(31-BIT_INDEX_W){1'b0}}, wrap_modulus_bits_msb, {LSB_BIT_INDEX_W{1'b0}}};
ADDR_EXPONENT_BITS: wrap_read_data <= {{(31-BIT_INDEX_W){1'b0}}, wrap_exponent_bits};
ADDR_BANK_BITS: wrap_read_data <= MAX_OP_W;
ADDR_NUM_MULTS: wrap_read_data <= NUM_MULTS;