aboutsummaryrefslogtreecommitdiff
path: root/rtl
diff options
context:
space:
mode:
Diffstat (limited to 'rtl')
-rw-r--r--rtl/ecdsa256_base_point_multiplier.v123
1 files changed, 64 insertions, 59 deletions
diff --git a/rtl/ecdsa256_base_point_multiplier.v b/rtl/ecdsa256_base_point_multiplier.v
index 8664d0c..2adca43 100644
--- a/rtl/ecdsa256_base_point_multiplier.v
+++ b/rtl/ecdsa256_base_point_multiplier.v
@@ -73,27 +73,25 @@ module ecdsa256_base_point_multiplier
//
// FSM
//
- localparam [4:0] FSM_STATE_IDLE = 5'd00;
- localparam [4:0] FSM_STATE_PREPARE_TRIG = 5'd01;
- localparam [4:0] FSM_STATE_PREPARE_WAIT = 5'd02;
- localparam [4:0] FSM_STATE_CYCLE_DBL_TRIG = 5'd03;
- localparam [4:0] FSM_STATE_CYCLE_DBL_WAIT = 5'd04;
- localparam [4:0] FSM_STATE_CYCLE_ADD_TRIG = 5'd05;
- localparam [4:0] FSM_STATE_CYCLE_ADD_WAIT = 5'd06;
- localparam [4:0] FSM_STATE_CYCLE_ADD_EXTRA_TRIG = 5'd07;
- localparam [4:0] FSM_STATE_CYCLE_ADD_EXTRA_WAIT = 5'd08;
- localparam [4:0] FSM_STATE_AFTER_CYCLE_TRIG = 5'd09;
- localparam [4:0] FSM_STATE_AFTER_CYCLE_WAIT = 5'd10;
- localparam [4:0] FSM_STATE_INVERT_TRIG = 5'd11;
- localparam [4:0] FSM_STATE_INVERT_WAIT = 5'd12;
- localparam [4:0] FSM_STATE_CONVERT_TRIG = 5'd13;
- localparam [4:0] FSM_STATE_CONVERT_WAIT = 5'd14;
- localparam [4:0] FSM_STATE_CONVERT_EXTRA_TRIG = 5'd15;
- localparam [4:0] FSM_STATE_CONVERT_EXTRA_WAIT = 5'd16;
- localparam [4:0] FSM_STATE_DONE = 5'd17;
-
- reg [4:0] fsm_state = FSM_STATE_IDLE;
- reg [4:0] fsm_state_next;
+ localparam [3:0] FSM_STATE_IDLE = 4'd00;
+ localparam [3:0] FSM_STATE_PREPARE_TRIG = 4'd01;
+ localparam [3:0] FSM_STATE_PREPARE_WAIT = 4'd02;
+ localparam [3:0] FSM_STATE_CYCLE_ADD_TRIG = 4'd03;
+ localparam [3:0] FSM_STATE_CYCLE_ADD_WAIT = 4'd04;
+ localparam [3:0] FSM_STATE_CYCLE_ADD_EXTRA_TRIG = 4'd05;
+ localparam [3:0] FSM_STATE_CYCLE_ADD_EXTRA_WAIT = 4'd06;
+ localparam [3:0] FSM_STATE_CYCLE_DBL_TRIG = 4'd07;
+ localparam [3:0] FSM_STATE_CYCLE_DBL_WAIT = 4'd08;
+ localparam [3:0] FSM_STATE_AFTER_CYCLE_TRIG = 4'd09;
+ localparam [3:0] FSM_STATE_AFTER_CYCLE_WAIT = 4'd10;
+ localparam [3:0] FSM_STATE_INVERT_TRIG = 4'd11;
+ localparam [3:0] FSM_STATE_INVERT_WAIT = 4'd12;
+ localparam [3:0] FSM_STATE_CONVERT_TRIG = 4'd13;
+ localparam [3:0] FSM_STATE_CONVERT_WAIT = 4'd14;
+ localparam [3:0] FSM_STATE_DONE = 4'd15;
+
+ reg [3:0] fsm_state = FSM_STATE_IDLE;
+ reg [3:0] fsm_state_next;
//
@@ -121,13 +119,12 @@ module ecdsa256_base_point_multiplier
if (rst_n == 1'b0) worker_trig <= 1'b0;
else case (fsm_state)
FSM_STATE_PREPARE_TRIG,
- FSM_STATE_CYCLE_DBL_TRIG,
FSM_STATE_CYCLE_ADD_TRIG,
FSM_STATE_CYCLE_ADD_EXTRA_TRIG,
+ FSM_STATE_CYCLE_DBL_TRIG,
FSM_STATE_AFTER_CYCLE_TRIG,
FSM_STATE_INVERT_TRIG,
- FSM_STATE_CONVERT_TRIG,
- FSM_STATE_CONVERT_EXTRA_TRIG: worker_trig <= 1'b1;
+ FSM_STATE_CONVERT_TRIG: worker_trig <= 1'b1;
default: worker_trig <= 1'b0;
endcase
@@ -147,7 +144,7 @@ module ecdsa256_base_point_multiplier
// Final Cycle Detection Logic
//
wire [ 3: 0] fsm_state_after_cycle = (bit_counter == bit_counter_last) ?
- FSM_STATE_INVERT_TRIG : FSM_STATE_CYCLE_DBL_TRIG;
+ FSM_STATE_INVERT_TRIG : FSM_STATE_CYCLE_ADD_TRIG;
//
@@ -168,16 +165,10 @@ module ecdsa256_base_point_multiplier
//
// Worker Flags
//
- wire worker_flagz_sz;
- wire worker_flagz_rz;
- wire worker_flagz_e;
- wire worker_flagz_f;
+ wire worker_flagz_r0z;
+ wire worker_flagz_r1z;
- wire [2:0] worker_flagz_cycle_add =
- {worker_flagz_sz, worker_flagz_e, worker_flagz_f};
-
- wire worker_flagz_convert_extra =
- worker_flagz_rz;
+ wire [1:0] worker_flagz_cycle_add = {worker_flagz_r1z, worker_flagz_r0z};
//
@@ -191,26 +182,24 @@ module ecdsa256_base_point_multiplier
FSM_STATE_PREPARE_TRIG: worker_offset <= UOP_OFFSET_PREPARE;
- FSM_STATE_CYCLE_DBL_TRIG: worker_offset <= UOP_OFFSET_CYCLE_DOUBLE;
FSM_STATE_CYCLE_ADD_TRIG: worker_offset <= UOP_OFFSET_CYCLE_ADD;
-
+
FSM_STATE_CYCLE_ADD_EXTRA_TRIG:
- // {sz, e, f}
- casez(worker_flagz_cycle_add)
- 3'b1??: worker_offset <= UOP_OFFSET_CYCLE_ADD_AT_INFINITY;
- 3'b011: worker_offset <= UOP_OFFSET_CYCLE_ADD_SAME_X_SAME_Y;
- 3'b010: worker_offset <= UOP_OFFSET_CYCLE_ADD_SAME_X;
- 3'b00?: worker_offset <= UOP_OFFSET_CYCLE_ADD_REGULAR;
+ // {r1z, r0z}
+ case (worker_flagz_cycle_add)
+ 2'b01: worker_offset <= UOP_OFFSET_CYCLE_ADD_R0_AT_INFINITY;
+ 2'b10: worker_offset <= UOP_OFFSET_CYCLE_ADD_R1_AT_INFINITY;
endcase
-
+
+ FSM_STATE_CYCLE_DBL_TRIG: worker_offset <= k_din_shreg[31] ?
+ UOP_OFFSET_CYCLE_DOUBLE_R1 : UOP_OFFSET_CYCLE_DOUBLE_R0;
+
FSM_STATE_AFTER_CYCLE_TRIG: worker_offset <= k_din_shreg[31] ?
UOP_OFFSET_CYCLE_K1 : UOP_OFFSET_CYCLE_K0;
FSM_STATE_INVERT_TRIG: worker_offset <= UOP_OFFSET_INVERT;
- FSM_STATE_CONVERT_TRIG: worker_offset <= UOP_OFFSET_CONVERT;
- FSM_STATE_CONVERT_EXTRA_TRIG: worker_offset <= worker_flagz_convert_extra ?
- UOP_OFFSET_CONVERT_AT_INFINITY : UOP_OFFSET_CONVERT_REGULAR;
+ FSM_STATE_CONVERT_TRIG: worker_offset <= UOP_OFFSET_CONVERT;
default: worker_offset <= {UOP_ADDR_WIDTH{1'bX}};
@@ -238,21 +227,24 @@ module ecdsa256_base_point_multiplier
FSM_STATE_IDLE: fsm_state_next = ena ? FSM_STATE_PREPARE_TRIG : FSM_STATE_IDLE;
FSM_STATE_PREPARE_TRIG: fsm_state_next = FSM_STATE_PREPARE_WAIT ;
- FSM_STATE_PREPARE_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_CYCLE_DBL_TRIG : FSM_STATE_PREPARE_WAIT;
- FSM_STATE_CYCLE_DBL_TRIG: fsm_state_next = FSM_STATE_CYCLE_DBL_WAIT ;
- FSM_STATE_CYCLE_DBL_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_CYCLE_ADD_TRIG : FSM_STATE_CYCLE_DBL_WAIT;
+ FSM_STATE_PREPARE_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_CYCLE_ADD_TRIG : FSM_STATE_PREPARE_WAIT;
+
FSM_STATE_CYCLE_ADD_TRIG: fsm_state_next = FSM_STATE_CYCLE_ADD_WAIT ;
FSM_STATE_CYCLE_ADD_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_CYCLE_ADD_EXTRA_TRIG : FSM_STATE_CYCLE_ADD_WAIT;
+
FSM_STATE_CYCLE_ADD_EXTRA_TRIG: fsm_state_next = FSM_STATE_CYCLE_ADD_EXTRA_WAIT ;
- FSM_STATE_CYCLE_ADD_EXTRA_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_AFTER_CYCLE_TRIG : FSM_STATE_CYCLE_ADD_EXTRA_WAIT;
+ FSM_STATE_CYCLE_ADD_EXTRA_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_CYCLE_DBL_TRIG : FSM_STATE_CYCLE_ADD_EXTRA_WAIT;
+
+ FSM_STATE_CYCLE_DBL_TRIG: fsm_state_next = FSM_STATE_CYCLE_DBL_WAIT ;
+ FSM_STATE_CYCLE_DBL_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_AFTER_CYCLE_TRIG : FSM_STATE_CYCLE_DBL_WAIT;
+
FSM_STATE_AFTER_CYCLE_TRIG: fsm_state_next = FSM_STATE_AFTER_CYCLE_WAIT ;
FSM_STATE_AFTER_CYCLE_WAIT: fsm_state_next = fsm_wait_done ? fsm_state_after_cycle : FSM_STATE_AFTER_CYCLE_WAIT;
FSM_STATE_INVERT_TRIG: fsm_state_next = FSM_STATE_INVERT_WAIT ;
FSM_STATE_INVERT_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_CONVERT_TRIG : FSM_STATE_INVERT_WAIT;
FSM_STATE_CONVERT_TRIG: fsm_state_next = FSM_STATE_CONVERT_WAIT ;
- FSM_STATE_CONVERT_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_CONVERT_EXTRA_TRIG : FSM_STATE_CONVERT_WAIT;
- FSM_STATE_CONVERT_EXTRA_TRIG: fsm_state_next = FSM_STATE_CONVERT_EXTRA_WAIT ;
- FSM_STATE_CONVERT_EXTRA_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_DONE : FSM_STATE_CONVERT_EXTRA_WAIT;
+ FSM_STATE_CONVERT_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_DONE : FSM_STATE_CONVERT_WAIT;
+
FSM_STATE_DONE: fsm_state_next = FSM_STATE_IDLE ;
endcase
@@ -263,7 +255,7 @@ module ecdsa256_base_point_multiplier
//
// Worker
//
- wire worker_output_now = (fsm_state == FSM_STATE_CONVERT_EXTRA_WAIT);
+ wire worker_output_now = (fsm_state == FSM_STATE_CONVERT_WAIT);
ecdsa256_uop_worker uop_worker
(
@@ -275,10 +267,8 @@ module ecdsa256_base_point_multiplier
.uop_offset (worker_offset),
.output_now (worker_output_now),
- .flagz_sz (worker_flagz_sz),
- .flagz_rz (worker_flagz_rz),
- .flagz_e (worker_flagz_e),
- .flagz_f (worker_flagz_f),
+ .flagz_r0z (worker_flagz_r0z),
+ .flagz_r1z (worker_flagz_r1z),
.xy_addr (rxy_addr),
.xy_dout (rxy_dout),
@@ -300,7 +290,22 @@ module ecdsa256_base_point_multiplier
FSM_STATE_IDLE: if (ena) rdy_reg <= 1'b0;
FSM_STATE_DONE: rdy_reg <= 1'b1;
endcase
-
+
+
+
+ //
+ // Debug
+ //
+ `ifdef CRYPTECH_DEBUG_ECDSA
+
+ wire zzz;
+
+ always @(posedge clk)
+ //
+ if (fsm_state == FSM_STATE_CYCLE_DBL_TRIG)
+ $display("wc = %d, bc = %d, k_bit = %d", k_addr, k_bit_index, k_din_shreg[31]);
+
+ `endif
endmodule