From bd6c4a9b916cd36890ebec72fae50555dfe6e7ba Mon Sep 17 00:00:00 2001 From: "Pavel V. Shatov (Meister)" Date: Tue, 25 Jul 2017 01:21:28 +0300 Subject: Trying to fix the bug during calculation of SN in systolic multiplier. --- src/rtl/modexpa7_wrapper.v | 73 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 13 deletions(-) (limited to 'src/rtl/modexpa7_wrapper.v') diff --git a/src/rtl/modexpa7_wrapper.v b/src/rtl/modexpa7_wrapper.v index 35be61e..3b749be 100644 --- a/src/rtl/modexpa7_wrapper.v +++ b/src/rtl/modexpa7_wrapper.v @@ -76,9 +76,10 @@ module modexpa7_wrapper # localparam [OPERAND_ADDR_WIDTH+1:0] ADDR_CONTROL = 'h08; // {next, init} localparam [OPERAND_ADDR_WIDTH+1:0] ADDR_STATUS = 'h09; // {valid, ready} // localparam [OPERAND_ADDR_WIDTH+1:0] ADDR_MODE // NOT USED ANYMORE - localparam [OPERAND_ADDR_WIDTH+1:0] ADDR_MODULUS_BITS = 'h11; // - localparam [OPERAND_ADDR_WIDTH+1:0] ADDR_EXPONENT_BITS = 'h12; // - localparam [OPERAND_ADDR_WIDTH+1:0] ADDR_OPERAND_BITS = 'h13; // + localparam [OPERAND_ADDR_WIDTH+1:0] ADDR_MODULUS_BITS = 'h11; // number of bits in modulus + localparam [OPERAND_ADDR_WIDTH+1:0] ADDR_EXPONENT_BITS = 'h12; // number of bits in exponent + localparam [OPERAND_ADDR_WIDTH+1:0] ADDR_BUFFER_BITS = 'h13; // largest supported number of bits + localparam [OPERAND_ADDR_WIDTH+1:0] ADDR_ARRAY_BITS = 'h15; // number of bits in systolic array localparam CONTROL_INIT_BIT = 0; localparam CONTROL_NEXT_BIT = 1; @@ -153,21 +154,64 @@ module modexpa7_wrapper # /* * Write Checker */ - + // largest supported operand width - localparam [OPERAND_ADDR_WIDTH+5:0] MAX_BITS = {1'b1, {OPERAND_ADDR_WIDTH+4{1'b0}}}; + localparam [OPERAND_ADDR_WIDTH+5:0] BUFFER_BITS = {1'b1, {OPERAND_ADDR_WIDTH+4{1'b0}}}; - // limit operand width to max supported - function [OPERAND_ADDR_WIDTH+5:0] write_check_bits; + // check_modulus_bits + function [OPERAND_ADDR_WIDTH+5:0] check_modulus_bits; input [OPERAND_ADDR_WIDTH+5:0] num_bits; begin + // + //t = num_bits[] + //if (num_bits > MAX_BITS) write_check_bits = MAX_BITS; + //else write_check_bits = num_bits; // - if (num_bits > MAX_BITS) write_check_bits = MAX_BITS; - else write_check_bits = num_bits; + end + endfunction + + function [OPERAND_ADDR_WIDTH+5:0] check_exponent_bits; + input [OPERAND_ADDR_WIDTH+5:0] num_bits; + begin + + // store input value + check_exponent_bits = num_bits; + + // too large? + if (num_bits > BUFFER_BITS) + check_exponent_bits = BUFFER_BITS; + + // too small? + if (num_bits == {OPERAND_ADDR_WIDTH+5{1'b0}}) + num_bits = {{OPERAND_ADDR_WIDTH+4{1'b0}}, 1'b1}; + // end endfunction + + /* + * Internal Quantities Generator + */ + + function [OPERAND_ADDR_WIDTH-1:0] modulus_num_words_core; + input [OPERAND_ADDR_WIDTH+5:0] num_bits; + begin + end + endfunction + + function [OPERAND_ADDR_WIDTH+4:0] get_exponent_num_bits_core; + input [OPERAND_ADDR_WIDTH+5:0] num_bits; + reg [OPERAND_ADDR_WIDTH+5:0] num_bits_checked; + begin + + // check number of bits (not too large, not too small) + num_bits_checked = check_exponent_bits(num_bits); + + // de + end + endfunction + /* * Write Interface (External Registers) @@ -186,8 +230,8 @@ module modexpa7_wrapper # case (address_lsb) // ADDR_CONTROL: reg_control <= write_data[ 1: 0]; - ADDR_MODULUS_BITS: reg_modulus_bits <= write_check_bits(write_data[OPERAND_ADDR_WIDTH+5:0]); - ADDR_EXPONENT_BITS: reg_exponent_bits <= write_check_bits(write_data[OPERAND_ADDR_WIDTH+5:0]); + ADDR_MODULUS_BITS: reg_modulus_bits <= check_modulus_bits(write_data[OPERAND_ADDR_WIDTH+5:0]); + ADDR_EXPONENT_BITS: reg_exponent_bits <= check_exponent_bits(write_data[OPERAND_ADDR_WIDTH+5:0]); // endcase @@ -202,8 +246,11 @@ module modexpa7_wrapper # // case (address_lsb) // - ADDR_MODULUS_BITS: modulus_num_words_core <= //modulus_num_words_int; - ADDR_EXPONENT_BITS: exponent_num_bits_core <= //exponent_num_bits_int; + ADDR_MODULUS_BITS: modulus_num_words_core <= + get_modulus_num_words_core(write_data[OPERAND_ADDR_WIDTH+5:0]); + + ADDR_EXPONENT_BITS: exponent_num_bits_core <= + get_exponent_num_bits_core(write_data[OPERAND_ADDR_WIDTH+5:0]); // endcase -- cgit v1.2.3