aboutsummaryrefslogtreecommitdiff
path: root/rtl/modexpng_general_worker.v
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/modexpng_general_worker.v')
-rw-r--r--rtl/modexpng_general_worker.v55
1 files changed, 52 insertions, 3 deletions
diff --git a/rtl/modexpng_general_worker.v b/rtl/modexpng_general_worker.v
index 74c939b..d82a120 100644
--- a/rtl/modexpng_general_worker.v
+++ b/rtl/modexpng_general_worker.v
@@ -334,6 +334,10 @@ module modexpng_general_worker
//
end
//
+ UOP_OPCODE_MERGE_LH:
+ //
+ enable_wide_xy_rd_en;
+ //
endcase
//
endcase
@@ -424,7 +428,8 @@ module modexpng_general_worker
//
case (opcode)
//
- UOP_OPCODE_PROPAGATE_CARRIES:
+ UOP_OPCODE_PROPAGATE_CARRIES,
+ UOP_OPCODE_MERGE_LH:
//
enable_narrow_xy_wr_en;
//
@@ -738,6 +743,13 @@ module modexpng_general_worker
wrk_rd_narrow_x_din_y,
wrk_rd_narrow_y_din_y);
//
+ UOP_OPCODE_MERGE_LH:
+ //
+ update_narrow_dout(wrk_rd_wide_x_din_x,
+ wrk_rd_wide_y_din_x,
+ wrk_rd_wide_x_din_y,
+ wrk_rd_wide_y_din_y);
+ //
endcase
//
endcase
@@ -819,6 +831,8 @@ module modexpng_general_worker
reg [OP_ADDR_W -1:0] rd_wide_xy_addr_xy_next;
reg [OP_ADDR_W -1:0] rd_narrow_xy_addr_xy_next;
+ reg rd_wide_xy_addr_xy_next_last_seen;
+
wire rd_wide_xy_addr_xy_next_is_last = rd_wide_xy_addr_xy_next == word_index_last_half;
wire rd_narrow_xy_addr_xy_next_is_last = rd_narrow_xy_addr_xy_next == word_index_last;
@@ -874,6 +888,22 @@ module modexpng_general_worker
rd_narrow_xy_addr_xy_next <= !rd_narrow_xy_addr_xy_next_is_last ? rd_narrow_xy_addr_xy_next + 1'b1 : OP_ADDR_ZERO;
endtask
+ always @(posedge clk)
+ //
+ case (wrk_fsm_state_next_one_pass)
+ //
+ WRK_FSM_STATE_LATENCY_PRE1:
+ //
+ rd_wide_xy_addr_xy_next_last_seen <= 1'b0;
+ //
+ WRK_FSM_STATE_LATENCY_PRE2,
+ WRK_FSM_STATE_BUSY:
+ //
+ if (!rd_wide_xy_addr_xy_next_last_seen)
+ rd_wide_xy_addr_xy_next_last_seen <= rd_wide_xy_addr_xy_next_is_last;
+ //
+ endcase
+
always @(posedge clk) begin
//
update_rd_wide_bank_addr (BANK_DNC, OP_ADDR_DNC);
@@ -897,6 +927,11 @@ module modexpng_general_worker
//
end
//
+ UOP_OPCODE_MERGE_LH: begin
+ update_rd_wide_bank_addr (BANK_WIDE_L, OP_ADDR_ZERO); update_rd_wide_addr_next (OP_ADDR_ONE);
+ update_rd_narrow_bank_addr(sel_narrow_in, OP_ADDR_ZERO); update_rd_narrow_addr_next(OP_ADDR_ONE);
+ end
+ //
endcase
//
WRK_FSM_STATE_LATENCY_PRE2,
@@ -920,6 +955,15 @@ module modexpng_general_worker
//
end
//
+ UOP_OPCODE_MERGE_LH: begin
+ //
+ if (!rd_wide_xy_addr_xy_next_last_seen) update_rd_wide_bank_addr (BANK_WIDE_L, rd_wide_xy_addr_xy_next );
+ else update_rd_wide_bank_addr (BANK_WIDE_H, rd_wide_xy_addr_xy_next );
+ advance_rd_wide_addr_next ;
+ update_rd_narrow_bank_addr(sel_narrow_in, rd_narrow_xy_addr_xy_next); advance_rd_narrow_addr_next;
+ //
+ end
+ //
endcase
//
endcase
@@ -1060,6 +1104,9 @@ module modexpng_general_worker
UOP_OPCODE_MODULAR_REDUCE_INIT:
update_wr_wide_bank_addr(uop_modular_reduce_init_bank_x, uop_modular_reduce_init_bank_y, rd_wide_xy_addr_x_dly2, rd_wide_xy_addr_y_dly2);
//
+ UOP_OPCODE_MERGE_LH:
+ update_wr_narrow_bank_addr(sel_narrow_out, sel_narrow_out, rd_narrow_xy_addr_x_dly2, rd_narrow_xy_addr_y_dly2);
+ //
endcase
//
endcase
@@ -1121,7 +1168,8 @@ module modexpng_general_worker
UOP_OPCODE_PROPAGATE_CARRIES,
UOP_OPCODE_OUTPUT_FROM_NARROW,
UOP_OPCODE_COPY_CRT_Y2X,
- UOP_OPCODE_MODULAR_REDUCE_INIT: wrk_fsm_state <= wrk_fsm_state_next_one_pass;
+ UOP_OPCODE_MODULAR_REDUCE_INIT,
+ UOP_OPCODE_MERGE_LH: wrk_fsm_state <= wrk_fsm_state_next_one_pass;
UOP_OPCODE_COPY_LADDERS_X2Y,
UOP_OPCODE_CROSS_LADDERS_X2Y: wrk_fsm_state <= wrk_fsm_state_next_one_pass_meander;
UOP_OPCODE_MODULAR_SUBTRACT: wrk_fsm_state <= wrk_fsm_state_next_two_pass;
@@ -1148,7 +1196,8 @@ module modexpng_general_worker
UOP_OPCODE_PROPAGATE_CARRIES,
UOP_OPCODE_OUTPUT_FROM_NARROW,
UOP_OPCODE_COPY_CRT_Y2X,
- UOP_OPCODE_MODULAR_REDUCE_INIT:
+ UOP_OPCODE_MODULAR_REDUCE_INIT,
+ UOP_OPCODE_MERGE_LH:
//
case (wrk_fsm_state)
WRK_FSM_STATE_BUSY: