aboutsummaryrefslogtreecommitdiff
path: root/src/rtl/modexpa7_wrapper.v
diff options
context:
space:
mode:
Diffstat (limited to 'src/rtl/modexpa7_wrapper.v')
-rw-r--r--src/rtl/modexpa7_wrapper.v73
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