From edd5efd83266bb534d7cde3d908e74749278ed96 Mon Sep 17 00:00:00 2001 From: "Pavel V. Shatov (Meister)" Date: Mon, 21 Oct 2019 15:19:30 +0300 Subject: Reworked testbench, clk_sys and clk_core can now have any ratio, not necessarily 1:2. Fixed compile-time issue where ISE fails to place two DSP slices next to each other, if A and/or B cascade path(s) between then are partially connected. Basically, if cascade is used, entire bus must be connected. --- rtl/modexpng_wrapper.v | 246 +++++++++++++++++++++++++++++++------------------ 1 file changed, 157 insertions(+), 89 deletions(-) (limited to 'rtl/modexpng_wrapper.v') 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; -- cgit v1.2.3