aboutsummaryrefslogtreecommitdiff
path: root/src/rtl
diff options
context:
space:
mode:
authorJoachim StroĢˆmbergson <joachim@secworks.se>2015-06-24 19:47:45 +0200
committerJoachim StroĢˆmbergson <joachim@secworks.se>2015-06-24 19:47:45 +0200
commitd5115d8547df48e33af778eadc7cdaa07fddeb7e (patch)
treec7ac73cd6d5d41b72f99db30e10c984b7b5cd807 /src/rtl
parente6af58cb2586c0d7517d0587780174d3aab528e4 (diff)
Fused the s_mem init loop into the adder loop.
Diffstat (limited to 'src/rtl')
-rw-r--r--src/rtl/montprod.v49
1 files changed, 14 insertions, 35 deletions
diff --git a/src/rtl/montprod.v b/src/rtl/montprod.v
index ccf8341..189bb18 100644
--- a/src/rtl/montprod.v
+++ b/src/rtl/montprod.v
@@ -68,16 +68,14 @@ module montprod #(parameter OPW = 32, parameter ADW = 8)
// Internal constant and parameter definitions.
//----------------------------------------------------------------
localparam CTRL_IDLE = 4'h0;
- localparam CTRL_INIT_S = 4'h1;
- localparam CTRL_WAIT = 4'h2;
- localparam CTRL_LOOP_ITER = 4'h3;
- localparam CTRL_LOOP_BQ = 4'h4;
- localparam CTRL_CALC_ADD = 4'h5;
- localparam CTRL_STALLPIPE_ADD = 4'h6;
- localparam CTRL_CALC_SDIV2 = 4'h7;
- localparam CTRL_STALLPIPE_SDIV2 = 4'h8;
- localparam CTRL_L_STALLPIPE_ES = 4'h9;
- localparam CTRL_EMIT_S = 4'ha;
+ localparam CTRL_LOOP_ITER = 4'h1;
+ localparam CTRL_LOOP_BQ = 4'h2;
+ localparam CTRL_CALC_ADD = 4'h3;
+ localparam CTRL_STALLPIPE_ADD = 4'h4;
+ localparam CTRL_CALC_SDIV2 = 4'h5;
+ localparam CTRL_STALLPIPE_SDIV2 = 4'h6;
+ localparam CTRL_L_STALLPIPE_ES = 4'h7;
+ localparam CTRL_EMIT_S = 4'h8;
localparam SMUX_ZERO = 2'h0;
localparam SMUX_ITER = 2'h1;
@@ -317,11 +315,6 @@ module montprod #(parameter OPW = 32, parameter ADW = 8)
s_mem_we = 1'b0;
case (montprod_ctrl_reg)
- CTRL_INIT_S:
- begin
- s_mem_we_new = 1'b1;
- end
-
CTRL_LOOP_ITER:
begin
s_mem_read_addr = length_m1;
@@ -409,7 +402,11 @@ module montprod #(parameter OPW = 32, parameter ADW = 8)
always @*
begin : bq
b_new = opb_data[b_bit_index_reg];
- q_new = s_mem_read_data[0] ^ (opa_data[0] & b_new);
+
+ if (first_iteration_reg)
+ q_new = 1'b0 ^ (opa_data[0] & b_new);
+ else
+ q_new = s_mem_read_data[0] ^ (opa_data[0] & b_new);
b_bit_index_new = (2**(13 - ADW) - 1) - loop_ctr_reg[(13 - ADW - 1) : 0];
b_word_index = loop_ctr_reg[12 : (13 - ADW)];
@@ -513,29 +510,11 @@ module montprod #(parameter OPW = 32, parameter ADW = 8)
ready_we = 1'b1;
reset_word_index_lsw = 1'b1;
loop_ctr_set = 1'b1;
- montprod_ctrl_new = CTRL_INIT_S;
+ montprod_ctrl_new = CTRL_LOOP_ITER;
montprod_ctrl_we = 1'b1;
end
end
- CTRL_INIT_S:
- begin
- s_mux_new = SMUX_ZERO;
- dec_word_index = 1'b1;
-
- if (word_index_reg == 0)
- begin
- montprod_ctrl_new = CTRL_WAIT;
- montprod_ctrl_we = 1'b1;
- end
- end
-
- CTRL_WAIT:
- begin
- montprod_ctrl_new = CTRL_LOOP_ITER;
- montprod_ctrl_we = 1'b1;
- end
-
//calculate q = (s - b * A) & 1;.
// Also abort loop if done.
CTRL_LOOP_ITER: