aboutsummaryrefslogtreecommitdiff
path: root/rtl/modexpng_parameters.vh
diff options
context:
space:
mode:
authorPavel V. Shatov (Meister) <meisterpaul1@yandex.ru>2019-10-21 12:56:30 +0300
committerPavel V. Shatov (Meister) <meisterpaul1@yandex.ru>2019-10-21 12:56:30 +0300
commit9eac252242c69e51a38a9a88c87b564dd40b6257 (patch)
treeab6653950a7f2a811598c73f15116fa5c009ec5c /rtl/modexpng_parameters.vh
parent36339014ec3d3ad3bb4622392d5075d674e7dbeb (diff)
Entire CRT signature algorithm works by now.
Moved micro-operations handler into a separate module file, this way we don't have any synthesized stuff in the top-level module, just instantiations. This is more consistent from the design partitioning point of view. Btw, Xilinx claims their tools work better that way too, but who knows... Added optional simulation-only code to assist debugging. Un-comment the ENABLE_DEBUG `define in 'rtl/modexpng_parameters.vh' to use, but don't ever try to synthesize the core with debugging enabled.
Diffstat (limited to 'rtl/modexpng_parameters.vh')
-rw-r--r--rtl/modexpng_parameters.vh151
1 files changed, 93 insertions, 58 deletions
diff --git a/rtl/modexpng_parameters.vh b/rtl/modexpng_parameters.vh
index c7566ad..7d2837d 100644
--- a/rtl/modexpng_parameters.vh
+++ b/rtl/modexpng_parameters.vh
@@ -1,42 +1,36 @@
+//
+// Headers
+//
`include "modexpng_parameters_x8.vh"
-
-function integer cryptech_clog2;
- input integer value;
- integer temp_value;
- integer result;
- //
- begin
- temp_value = value - 1;
- for (result = 0; temp_value > 0; result = result + 1)
- temp_value = temp_value >> 1;
- cryptech_clog2 = result;
- end
- //
-endfunction
-
-localparam MAX_OP_W = 4096;
-
-localparam WORD_W = 16;
-localparam WORD_EXT_W = 18;
-localparam MAC_W = 47;
-
-localparam BUS_DATA_W = 32;
+`include "cryptech_clog2.vh"
+
+//
+// Debug Settings
+//
+
+/* Only define this for simulation, must be turned off to synthesize properly! */
+`define MODEXPNG_ENABLE_DEBUG
+
+//
+// Core Settings
+//
+localparam MAX_OP_W = 4096;
+localparam WORD_W = 16;
+localparam WORD_EXT_W = 18;
+localparam MAC_W = 47;
+localparam BUS_DATA_W = 32;
localparam BUS_OP_ADDR_W = cryptech_clog2(MAX_OP_W / BUS_DATA_W);
-
-localparam BIT_INDEX_W = cryptech_clog2(MAX_OP_W);
-
-localparam BANK_ADDR_W = 3;
-localparam OP_ADDR_W = cryptech_clog2(MAX_OP_W / WORD_W);
-localparam COL_INDEX_W = OP_ADDR_W - cryptech_clog2(NUM_MULTS);
-
-localparam MAC_INDEX_W = cryptech_clog2(NUM_MULTS);
-
-localparam CARRY_W = WORD_EXT_W - WORD_W;
-
-localparam WORD_MUX_W = cryptech_clog2(WORD_W);
-
-localparam [CARRY_W-1:0] CARRY_ZERO = {CARRY_W{1'b0}};
-
+localparam BIT_INDEX_W = cryptech_clog2(MAX_OP_W);
+localparam BANK_ADDR_W = 3;
+localparam OP_ADDR_W = cryptech_clog2(MAX_OP_W / WORD_W);
+localparam COL_INDEX_W = OP_ADDR_W - cryptech_clog2(NUM_MULTS);
+localparam MAC_INDEX_W = cryptech_clog2(NUM_MULTS);
+localparam CARRY_W = WORD_EXT_W - WORD_W;
+localparam WORD_MUX_W = cryptech_clog2(WORD_W);
+
+//
+// Wide Bank
+//
localparam [BANK_ADDR_W-1:0] BANK_WIDE_A = 3'd0;
localparam [BANK_ADDR_W-1:0] BANK_WIDE_B = 3'd1;
localparam [BANK_ADDR_W-1:0] BANK_WIDE_C = 3'd2;
@@ -46,19 +40,28 @@ localparam [BANK_ADDR_W-1:0] BANK_WIDE_N = 3'd5;
localparam [BANK_ADDR_W-1:0] BANK_WIDE_L = 3'd6;
localparam [BANK_ADDR_W-1:0] BANK_WIDE_H = 3'd7;
-localparam [BANK_ADDR_W-1:0] BANK_NARROW_A = 3'd0;
-localparam [BANK_ADDR_W-1:0] BANK_NARROW_B = 3'd1;
-localparam [BANK_ADDR_W-1:0] BANK_NARROW_C = 3'd2;
-localparam [BANK_ADDR_W-1:0] BANK_NARROW_D = 3'd3;
-localparam [BANK_ADDR_W-1:0] BANK_NARROW_E = 3'd4;
-localparam [BANK_ADDR_W-1:0] BANK_NARROW_COEFF = 3'd5;
-localparam [BANK_ADDR_W-1:0] BANK_NARROW_Q = 3'd6;
-localparam [BANK_ADDR_W-1:0] BANK_NARROW_EXT = 3'd7; // [0] -> COEFF', [1] -> Q'
-
+//
+// Narrow Bank
+//
+localparam [BANK_ADDR_W-1:0] BANK_NARROW_A = 3'd0;
+localparam [BANK_ADDR_W-1:0] BANK_NARROW_B = 3'd1;
+localparam [BANK_ADDR_W-1:0] BANK_NARROW_C = 3'd2;
+localparam [BANK_ADDR_W-1:0] BANK_NARROW_D = 3'd3;
+localparam [BANK_ADDR_W-1:0] BANK_NARROW_E = 3'd4;
+localparam [BANK_ADDR_W-1:0] BANK_NARROW_COEFF = 3'd5;
+localparam [BANK_ADDR_W-1:0] BANK_NARROW_Q = 3'd6;
+localparam [BANK_ADDR_W-1:0] BANK_NARROW_EXT = 3'd7; // [0] -> COEFF', [1] -> Q'
+
+//
+// Recombinator Bank
+//
localparam [BANK_ADDR_W-1:0] BANK_RCMB_ML = 3'd0;
localparam [BANK_ADDR_W-1:0] BANK_RCMB_MH = 3'd1;
localparam [BANK_ADDR_W-1:0] BANK_RCMB_EXT = 3'd2; // [0] -> MH'
+//
+// Input Bank #1
+//
localparam [BANK_ADDR_W-1:0] BANK_IN_1_M = 3'd0;
localparam [BANK_ADDR_W-1:0] BANK_IN_1_N = 3'd1;
localparam [BANK_ADDR_W-1:0] BANK_IN_1_N_FACTOR = 3'd2;
@@ -67,6 +70,9 @@ localparam [BANK_ADDR_W-1:0] BANK_IN_1_EXT = 3'd4; // [0] -> N_COEFF'*/
localparam [BANK_ADDR_W-1:0] BANK_IN_1_X = 3'd5;
localparam [BANK_ADDR_W-1:0] BANK_IN_1_Y = 3'd6;
+//
+// Input Bank #2
+//
localparam [BANK_ADDR_W-1:0] BANK_IN_2_D = 3'd0;
localparam [BANK_ADDR_W-1:0] BANK_IN_2_P = 3'd1;
localparam [BANK_ADDR_W-1:0] BANK_IN_2_P_FACTOR = 3'd2;
@@ -76,30 +82,59 @@ localparam [BANK_ADDR_W-1:0] BANK_IN_2_Q_FACTOR = 3'd5;
localparam [BANK_ADDR_W-1:0] BANK_IN_2_Q_COEFF = 3'd6;
localparam [BANK_ADDR_W-1:0] BANK_IN_2_QINV = 3'd7;
-localparam [BANK_ADDR_W-1:0] BANK_OUT_S = 3'd0;
-localparam [BANK_ADDR_W-1:0] BANK_OUT_XM = 3'd1;
-localparam [BANK_ADDR_W-1:0] BANK_OUT_YM = 3'd2;
+//
+// Output Bank
+//
+localparam [BANK_ADDR_W-1:0] BANK_OUT_S = 3'd0;
+localparam [BANK_ADDR_W-1:0] BANK_OUT_XM = 3'd1;
+localparam [BANK_ADDR_W-1:0] BANK_OUT_YM = 3'd2;
-localparam [BANK_ADDR_W-1:0] BANK_DNC = {BANK_ADDR_W{1'bX}};
+//
+// Carry Values
+//
+localparam [CARRY_W-1:0] CARRY_ZERO = {CARRY_W{1'b0}};
-localparam [OP_ADDR_W-1:0] OP_ADDR_LADDER_LAST = 3; // 0..3, i.e. <dummy>, D, P, Q
+//
+// Bank Values
+//
+localparam [ BANK_ADDR_W-1:0] BANK_DNC = {BANK_ADDR_W{1'bX}};
+localparam [4*BANK_ADDR_W-1:0] BANK_DNC_ALL = {4{BANK_DNC}};
+//
+// Operand Address Values
+//
+localparam [OP_ADDR_W-1:0] OP_ADDR_LADDER_LAST = 3; // 0..3, i.e. <dummy>, D, P, Q
+localparam [OP_ADDR_W-1:0] OP_ADDR_EXT_COEFF = 0;
+localparam [OP_ADDR_W-1:0] OP_ADDR_EXT_Q = 1;
+localparam [OP_ADDR_W-1:0] OP_ADDR_ZERO = {OP_ADDR_W{1'b0}};
+localparam [OP_ADDR_W-1:0] OP_ADDR_ONE = {{(OP_ADDR_W-1){1'b0}}, 1'b1};
+localparam [OP_ADDR_W-1:0] OP_ADDR_DNC = {OP_ADDR_W{1'bX}};
+
+//
+// Bit Index Values
+//
localparam [BIT_INDEX_W-1:0] BIT_INDEX_ZERO = {BIT_INDEX_W{1'b0}};
+localparam [BIT_INDEX_W-1:0] BIT_INDEX_DNC = {BIT_INDEX_W{1'bX}};
-localparam [OP_ADDR_W-1:0] OP_ADDR_EXT_COEFF = 0;
-localparam [OP_ADDR_W-1:0] OP_ADDR_EXT_Q = 1;
-
-localparam [OP_ADDR_W-1:0] OP_ADDR_ZERO = {OP_ADDR_W{1'b0}};
-localparam [OP_ADDR_W-1:0] OP_ADDR_ONE = {{(OP_ADDR_W-1){1'b0}}, 1'b1};
-localparam [OP_ADDR_W-1:0] OP_ADDR_DNC = {OP_ADDR_W{1'bX}};
-
+//
+// Word Values
+//
localparam [WORD_W-1:0] WORD_ZERO = {WORD_W{1'b0}};
localparam [WORD_W-1:0] WORD_DNC = {WORD_W{1'bX}};
localparam [WORD_W-1:0] WORD_ONE = {{(WORD_W-1){1'b0}}, 1'b1};
+//
+// Extended Word Values
+//
localparam [WORD_EXT_W-1:0] WORD_EXT_ZERO = {WORD_EXT_W{1'b0}};
localparam [WORD_EXT_W-1:0] WORD_EXT_DNC = {WORD_EXT_W{1'bX}};
+//
+// MAC Index Values
+//
localparam [MAC_INDEX_W-1:0] MAC_INDEX_DNC = {MAC_INDEX_W{1'bX}};
+//
+// Multiplier Bitmap Values
+//
localparam [NUM_MULTS-1:0] MULT_BITMAP_ZEROES = {NUM_MULTS{1'b0}};