summaryrefslogtreecommitdiff
path: root/rtl/ed25519_multiplier.v
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/ed25519_multiplier.v')
-rw-r--r--rtl/ed25519_multiplier.v121
1 files changed, 100 insertions, 21 deletions
diff --git a/rtl/ed25519_multiplier.v b/rtl/ed25519_multiplier.v
index d6960ec..31a4b18 100644
--- a/rtl/ed25519_multiplier.v
+++ b/rtl/ed25519_multiplier.v
@@ -72,19 +72,31 @@ module ed25519_multiplier
//
// FSM
//
- 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_BEFORE_ROUND_TRIG = 4'd03;
- localparam [3:0] FSM_STATE_BEFORE_ROUND_WAIT = 4'd04;
- localparam [3:0] FSM_STATE_DURING_ROUND_TRIG = 4'd05;
- localparam [3:0] FSM_STATE_DURING_ROUND_WAIT = 4'd06;
- localparam [3:0] FSM_STATE_AFTER_ROUND_TRIG = 4'd07;
- localparam [3:0] FSM_STATE_AFTER_ROUND_WAIT = 4'd08;
- localparam [3:0] FSM_STATE_DONE = 4'd15;
-
- reg [3:0] fsm_state = FSM_STATE_IDLE;
- reg [3:0] fsm_state_next;
+ 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_BEFORE_ROUND_TRIG = 5'd03;
+ localparam [4:0] FSM_STATE_BEFORE_ROUND_WAIT = 5'd04;
+ localparam [4:0] FSM_STATE_DURING_ROUND_TRIG = 5'd05;
+ localparam [4:0] FSM_STATE_DURING_ROUND_WAIT = 5'd06;
+ localparam [4:0] FSM_STATE_AFTER_ROUND_TRIG = 5'd07;
+ localparam [4:0] FSM_STATE_AFTER_ROUND_WAIT = 5'd08;
+ localparam [4:0] FSM_STATE_BEFORE_INVERT_TRIG = 5'd09;
+ localparam [4:0] FSM_STATE_BEFORE_INVERT_WAIT = 5'd10;
+ localparam [4:0] FSM_STATE_DURING_INVERT_TRIG = 5'd11;
+ localparam [4:0] FSM_STATE_DURING_INVERT_WAIT = 5'd12;
+ localparam [4:0] FSM_STATE_AFTER_INVERT_TRIG = 5'd13;
+ localparam [4:0] FSM_STATE_AFTER_INVERT_WAIT = 5'd14;
+ localparam [4:0] FSM_STATE_FINAL_REDUCE_TRIG = 5'd15;
+ localparam [4:0] FSM_STATE_FINAL_REDUCE_WAIT = 5'd16;
+ localparam [4:0] FSM_STATE_HANDLE_SIGN_TRIG = 5'd17;
+ localparam [4:0] FSM_STATE_HANDLE_SIGN_WAIT = 5'd18;
+ localparam [4:0] FSM_STATE_OUTPUT_TRIG = 5'd19;
+ localparam [4:0] FSM_STATE_OUTPUT_WAIT = 5'd20;
+ localparam [4:0] FSM_STATE_DONE = 5'd31;
+
+ reg [4:0] fsm_state = FSM_STATE_IDLE;
+ reg [4:0] fsm_state_next;
//
@@ -114,7 +126,13 @@ module ed25519_multiplier
FSM_STATE_PREPARE_TRIG,
FSM_STATE_BEFORE_ROUND_TRIG,
FSM_STATE_DURING_ROUND_TRIG,
- FSM_STATE_AFTER_ROUND_TRIG: worker_trig <= 1'b1;
+ FSM_STATE_AFTER_ROUND_TRIG,
+ FSM_STATE_BEFORE_INVERT_TRIG,
+ FSM_STATE_DURING_INVERT_TRIG,
+ FSM_STATE_AFTER_INVERT_TRIG,
+ FSM_STATE_FINAL_REDUCE_TRIG,
+ FSM_STATE_HANDLE_SIGN_TRIG,
+ FSM_STATE_OUTPUT_TRIG: worker_trig <= 1'b1;
default: worker_trig <= 1'b0;
endcase
@@ -134,10 +152,8 @@ module ed25519_multiplier
// Final Round Detection Logic
//
wire [ 3: 0] fsm_state_after_round = (bit_counter != bit_counter_zero) ?
- FSM_STATE_BEFORE_ROUND_TRIG : FSM_STATE_DONE;
-
-
-
+ FSM_STATE_BEFORE_ROUND_TRIG : FSM_STATE_BEFORE_INVERT_TRIG;
+
//
// K Latch
@@ -171,6 +187,14 @@ module ed25519_multiplier
case (fsm_state)
FSM_STATE_PREPARE_TRIG: worker_offset <= UOP_OFFSET_PREPARE;
FSM_STATE_BEFORE_ROUND_TRIG: worker_offset <= k_din_shreg[0] ? UOP_OFFSET_BEFORE_ROUND_K1 : UOP_OFFSET_BEFORE_ROUND_K0;
+ FSM_STATE_DURING_ROUND_TRIG: worker_offset <= UOP_OFFSET_DURING_ROUND;
+ FSM_STATE_AFTER_ROUND_TRIG: worker_offset <= k_din_shreg[0] ? UOP_OFFSET_AFTER_ROUND_K1 : UOP_OFFSET_AFTER_ROUND_K0;
+ FSM_STATE_BEFORE_INVERT_TRIG: worker_offset <= UOP_OFFSET_BEFORE_INVERSION;
+ FSM_STATE_DURING_INVERT_TRIG: worker_offset <= UOP_OFFSET_DURING_INVERSION;
+ FSM_STATE_AFTER_INVERT_TRIG: worker_offset <= UOP_OFFSET_AFTER_INVERSION;
+ FSM_STATE_FINAL_REDUCE_TRIG: worker_offset <= UOP_OFFSET_FINAL_REDUCTION;
+ FSM_STATE_HANDLE_SIGN_TRIG: worker_offset <= UOP_OFFSET_HANDLE_SIGN;
+ FSM_STATE_OUTPUT_TRIG: worker_offset <= UOP_OFFSET_OUTPUT;
default: worker_offset <= {UOP_ADDR_WIDTH{1'bX}};
endcase
@@ -207,6 +231,24 @@ module ed25519_multiplier
FSM_STATE_AFTER_ROUND_TRIG: fsm_state_next = FSM_STATE_AFTER_ROUND_WAIT;
FSM_STATE_AFTER_ROUND_WAIT: fsm_state_next = fsm_wait_done ? fsm_state_after_round : FSM_STATE_AFTER_ROUND_WAIT;
+ FSM_STATE_BEFORE_INVERT_TRIG: fsm_state_next = FSM_STATE_BEFORE_INVERT_WAIT;
+ FSM_STATE_BEFORE_INVERT_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_DURING_INVERT_TRIG : FSM_STATE_BEFORE_INVERT_WAIT;
+
+ FSM_STATE_DURING_INVERT_TRIG: fsm_state_next = FSM_STATE_DURING_INVERT_WAIT;
+ FSM_STATE_DURING_INVERT_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_AFTER_INVERT_TRIG : FSM_STATE_DURING_INVERT_WAIT;
+
+ FSM_STATE_AFTER_INVERT_TRIG: fsm_state_next = FSM_STATE_AFTER_INVERT_WAIT;
+ FSM_STATE_AFTER_INVERT_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_FINAL_REDUCE_TRIG : FSM_STATE_AFTER_INVERT_WAIT;
+
+ FSM_STATE_FINAL_REDUCE_TRIG: fsm_state_next = FSM_STATE_FINAL_REDUCE_WAIT;
+ FSM_STATE_FINAL_REDUCE_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_HANDLE_SIGN_TRIG : FSM_STATE_FINAL_REDUCE_WAIT;
+
+ FSM_STATE_HANDLE_SIGN_TRIG: fsm_state_next = FSM_STATE_HANDLE_SIGN_WAIT;
+ FSM_STATE_HANDLE_SIGN_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_OUTPUT_TRIG : FSM_STATE_HANDLE_SIGN_WAIT;
+
+ FSM_STATE_OUTPUT_TRIG: fsm_state_next = FSM_STATE_OUTPUT_WAIT;
+ FSM_STATE_OUTPUT_WAIT: fsm_state_next = fsm_wait_done ? FSM_STATE_DONE : FSM_STATE_OUTPUT_WAIT;
+
FSM_STATE_DONE: fsm_state_next = FSM_STATE_IDLE;
endcase
@@ -214,16 +256,53 @@ module ed25519_multiplier
end
+ //
+ // Debug
+ //
+ wire debug_dump_now = fsm_state == FSM_STATE_OUTPUT_TRIG;
+
+ reg [6:0] debug_dump_addr1 = {1'bX, UOP_OPERAND_INVERT_R1};
+ reg [6:0] debug_dump_addr2 = {1'b0, UOP_OPERAND_CYCLE_R0_X};
+ reg [6:0] debug_dump_addr3 = {1'b0, UOP_OPERAND_CYCLE_R0_Y};
+ reg [6:0] debug_dump_addr4 = {1'bX, UOP_OPERAND_CYCLE_R0_T};
+ reg [6:0] debug_dump_addr5 = {1'bX, UOP_OPERAND_CYCLE_R1_X};
+ reg [6:0] debug_dump_addr6 = {1'bX, UOP_OPERAND_CYCLE_R1_Y};
+ reg [6:0] debug_dump_addr7 = {1'bX, UOP_OPERAND_CYCLE_R1_Z};
+ reg [6:0] debug_dump_addr8 = {1'bX, UOP_OPERAND_CYCLE_R1_T};
+
//
// Worker
//
+
+ wire worker_final_reduce = fsm_state == FSM_STATE_FINAL_REDUCE_WAIT;
+ wire worker_handle_sign = fsm_state == FSM_STATE_HANDLE_SIGN_WAIT;
+ wire worker_output_now = fsm_state == FSM_STATE_OUTPUT_WAIT;
+
ed25519_worker uop_worker
(
.clk (clk),
.rst_n (rst_n),
- .ena (worker_trig),
- .rdy (worker_done),
- .uop_offset (worker_offset)
+ .debug_dump_now (debug_dump_now),
+
+ .debug_dump_addr1 (debug_dump_addr1),
+ .debug_dump_addr2 (debug_dump_addr2),
+ .debug_dump_addr3 (debug_dump_addr3),
+ .debug_dump_addr4 (debug_dump_addr4),
+ .debug_dump_addr5 (debug_dump_addr5),
+ .debug_dump_addr6 (debug_dump_addr6),
+ .debug_dump_addr7 (debug_dump_addr7),
+ .debug_dump_addr8 (debug_dump_addr8),
+
+ .ena (worker_trig),
+ .rdy (worker_done),
+ .uop_offset (worker_offset),
+ .final_reduce (worker_final_reduce),
+ .handle_sign (worker_handle_sign),
+ .output_now (worker_output_now),
+
+ .y_addr (qy_addr),
+ .y_dout (qy_dout),
+ .y_wren (qy_wren)
);