diff options
Diffstat (limited to 'src/rtl/modexpa7_wrapper.v')
-rw-r--r-- | src/rtl/modexpa7_wrapper.v | 73 |
1 files changed, 60 insertions, 13 deletions
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 |