diff options
Diffstat (limited to 'rtl/modexpng_recombinator_block.v')
-rw-r--r-- | rtl/modexpng_recombinator_block.v | 219 |
1 files changed, 130 insertions, 89 deletions
diff --git a/rtl/modexpng_recombinator_block.v b/rtl/modexpng_recombinator_block.v index cc89db0..e3cb50f 100644 --- a/rtl/modexpng_recombinator_block.v +++ b/rtl/modexpng_recombinator_block.v @@ -153,7 +153,7 @@ module modexpng_recombinator_block // index - latch reg [MAC_INDEX_W-1:0] xy_index_latch_lsb; - // purge - index + // purge - latch reg xy_purge_latch_lsb = 1'b0; reg xy_purge_latch_msb = 1'b0; @@ -496,21 +496,25 @@ module modexpng_recombinator_block reg rcmb_xy_lsb_ce = 1'b0; reg rcmb_xy_lsb_ce_aux = 1'b0; + reg rcmb_xy_lsb_ce_aux_dly = 1'b0; reg [ 2:0] rcmb_xy_lsb_ce_purge = 3'b000; - wire rcmb_xy_lsb_ce_combined = rcmb_xy_lsb_ce | rcmb_xy_lsb_ce_aux | rcmb_xy_lsb_ce_purge[0]; + wire rcmb_xy_lsb_ce_combined = rcmb_xy_lsb_ce | rcmb_xy_lsb_ce_aux | rcmb_xy_lsb_ce_purge[0]; + wire rcmb_xy_lsb_ce_combined_ext = rcmb_xy_lsb_ce | rcmb_xy_lsb_ce_aux | rcmb_xy_lsb_ce_purge[0] | rcmb_xy_lsb_ce_aux_dly; reg rcmb_xy_lsb_clr; wire rcmb_xy_lsb_cry = !xy_valid_latch_lsb && rcmb_xy_lsb_ce_purge[1]; - reg [ MAC_W -1:0] rcmb_x_lsb_din; - reg [ MAC_W -1:0] rcmb_y_lsb_din; - wire [WORD_W -1:0] rcmb_x_lsb_dout; - wire [WORD_W -1:0] rcmb_y_lsb_dout; - wire [WORD_EXT_W -2:0] rcmb_x_lsb_dout_ext; - wire [WORD_EXT_W -2:0] rcmb_y_lsb_dout_ext; + reg [ MAC_W -1:0] rcmb_x_lsb_din; + reg [ MAC_W -1:0] rcmb_y_lsb_din; + wire [WORD_W -1:0] rcmb_x_lsb_dout; + wire [WORD_W -1:0] rcmb_y_lsb_dout; + wire [WORD_W :0] rcmb_x_lsb_doutw; + wire [WORD_W :0] rcmb_y_lsb_doutw; reg rcmb_xy_msb_ce = 1'b0; reg [ 1:0] rcmb_xy_msb_ce_purge = 2'b00; - wire rcmb_xy_msb_ce_combined = rcmb_xy_msb_ce | rcmb_xy_msb_ce_purge[0]; + reg rcmb_xy_msb_ce_purge0_rectangle_dly = 1'b0; + wire rcmb_xy_msb_ce_combined = rcmb_xy_msb_ce | rcmb_xy_msb_ce_purge[0]; + wire rcmb_xy_msb_ce_combined_ext = rcmb_xy_msb_ce | rcmb_xy_msb_ce_purge[0] | rcmb_xy_msb_ce_purge0_rectangle_dly; reg rcmb_xy_msb_clr; reg [ MAC_W -1:0] rcmb_x_msb_din; @@ -518,42 +522,45 @@ module modexpng_recombinator_block wire [WORD_W -1:0] rcmb_x_msb_dout; wire [WORD_W -1:0] rcmb_y_msb_dout; - modexpng_recombinator_cell recomb_x_lsb + always @(posedge clk) rcmb_xy_lsb_ce_aux_dly <= rcmb_xy_lsb_ce_aux; + always @(posedge clk) rcmb_xy_msb_ce_purge0_rectangle_dly <= rcmb_mode == RCMB_MODE_RECTANGLE ? rcmb_xy_msb_ce_purge[0] : 1'b0; + + modexpng_recombinator_cell recomb_x_lsb_new ( - .clk (clk), - .ce (rcmb_xy_lsb_ce_combined), - .clr (rcmb_xy_lsb_clr), - .din (rcmb_x_lsb_din), - .dout (rcmb_x_lsb_dout), - .dout_ext (rcmb_x_lsb_dout_ext) + .clk (clk), + .ce (rcmb_xy_lsb_ce_combined_ext), + .clr (rcmb_xy_lsb_clr), + .din (rcmb_x_lsb_din), + .dout (rcmb_x_lsb_dout), + .doutw (rcmb_x_lsb_doutw) ); - modexpng_recombinator_cell recomb_y_lsb + modexpng_recombinator_cell recomb_y_lsb_new ( - .clk (clk), - .ce (rcmb_xy_lsb_ce_combined), - .clr (rcmb_xy_lsb_clr), - .din (rcmb_y_lsb_din), - .dout (rcmb_y_lsb_dout), - .dout_ext (rcmb_y_lsb_dout_ext) + .clk (clk), + .ce (rcmb_xy_lsb_ce_combined_ext), + .clr (rcmb_xy_lsb_clr), + .din (rcmb_y_lsb_din), + .dout (rcmb_y_lsb_dout), + .doutw (rcmb_y_lsb_doutw) ); - modexpng_recombinator_cell recomb_x_msb + modexpng_recombinator_cell recomb_x_msb_new ( - .clk (clk), - .ce (rcmb_xy_msb_ce_combined), - .clr (rcmb_xy_msb_clr), - .din (rcmb_x_msb_din), - .dout (rcmb_x_msb_dout), - .dout_ext () + .clk (clk), + .ce (rcmb_xy_msb_ce_combined_ext), + .clr (rcmb_xy_msb_clr), + .din (rcmb_x_msb_din), + .dout (rcmb_x_msb_dout), + .doutw () ); - modexpng_recombinator_cell recomb_y_msb + modexpng_recombinator_cell recomb_y_msb_new ( - .clk (clk), - .ce (rcmb_xy_msb_ce_combined), - .clr (rcmb_xy_msb_clr), - .din (rcmb_y_msb_din), - .dout (rcmb_y_msb_dout), - .dout_ext () + .clk (clk), + .ce (rcmb_xy_msb_ce_combined_ext), + .clr (rcmb_xy_msb_clr), + .din (rcmb_y_msb_din), + .dout (rcmb_y_msb_dout), + .doutw () ); always @(posedge clk) begin @@ -704,7 +711,6 @@ module modexpng_recombinator_block xy_bitmap_latch_msb <= {1'b0, xy_bitmap_latch_msb[NUM_MULTS-1:1]}; end // - // for (i=1; i<6; i=i+1) begin xy_valid_lsb_adv [i] <= xy_valid_lsb_adv [i+1]; xy_aux_lsb_adv [i] <= xy_aux_lsb_adv [i+1]; @@ -753,17 +759,52 @@ module modexpng_recombinator_block end - reg rcmb_xy_lsb_ce_combined_dly = 1'b0; - reg rcmb_xy_msb_ce_combined_dly = 1'b0; + reg rcmb_xy_lsb_ce_combined_dly1 = 1'b0; + reg rcmb_xy_msb_ce_combined_dly1 = 1'b0; + + reg rcmb_xy_lsb_ce_combined_dly2 = 1'b0; + reg rcmb_xy_msb_ce_combined_dly2 = 1'b0; + + reg rcmb_xy_lsb_ce_combined_dly3 = 1'b0; + reg rcmb_xy_msb_ce_combined_dly3 = 1'b0; + + reg rcmb_xy_lsb_ce_combined_dly4 = 1'b0; + reg rcmb_xy_msb_ce_combined_dly4 = 1'b0; + + reg rcmb_xy_lsb_ce_combined_dly5 = 1'b0; + reg rcmb_xy_msb_ce_combined_dly5 = 1'b0; + + reg rcmb_xy_lsb_ce_combined_dly6 = 1'b0; + reg rcmb_xy_msb_ce_combined_dly6 = 1'b0; always @(posedge clk or negedge rst_n) // if (!rst_n) begin - rcmb_xy_lsb_ce_combined_dly <= 1'b0; - rcmb_xy_msb_ce_combined_dly <= 1'b0; + rcmb_xy_lsb_ce_combined_dly1 <= 1'b0; + rcmb_xy_msb_ce_combined_dly1 <= 1'b0; + rcmb_xy_lsb_ce_combined_dly2 <= 1'b0; + rcmb_xy_msb_ce_combined_dly2 <= 1'b0; + rcmb_xy_lsb_ce_combined_dly3 <= 1'b0; + rcmb_xy_msb_ce_combined_dly3 <= 1'b0; + rcmb_xy_lsb_ce_combined_dly4 <= 1'b0; + rcmb_xy_msb_ce_combined_dly4 <= 1'b0; + rcmb_xy_lsb_ce_combined_dly5 <= 1'b0; + rcmb_xy_msb_ce_combined_dly5 <= 1'b0; + rcmb_xy_lsb_ce_combined_dly6 <= 1'b0; + rcmb_xy_msb_ce_combined_dly6 <= 1'b0; end else begin - rcmb_xy_lsb_ce_combined_dly <= rcmb_xy_lsb_ce_combined; - rcmb_xy_msb_ce_combined_dly <= rcmb_xy_msb_ce_combined; + rcmb_xy_lsb_ce_combined_dly1 <= rcmb_xy_lsb_ce_combined; + rcmb_xy_msb_ce_combined_dly1 <= rcmb_xy_msb_ce_combined; + rcmb_xy_lsb_ce_combined_dly2 <= rcmb_xy_lsb_ce_combined_dly1; + rcmb_xy_msb_ce_combined_dly2 <= rcmb_xy_msb_ce_combined_dly1; + rcmb_xy_lsb_ce_combined_dly3 <= rcmb_xy_lsb_ce_combined_dly2; + rcmb_xy_msb_ce_combined_dly3 <= rcmb_xy_msb_ce_combined_dly2; + rcmb_xy_lsb_ce_combined_dly4 <= rcmb_xy_lsb_ce_combined_dly3; + rcmb_xy_msb_ce_combined_dly4 <= rcmb_xy_msb_ce_combined_dly3; + rcmb_xy_lsb_ce_combined_dly5 <= rcmb_xy_lsb_ce_combined_dly4; + rcmb_xy_msb_ce_combined_dly5 <= rcmb_xy_msb_ce_combined_dly4; + rcmb_xy_lsb_ce_combined_dly6 <= rcmb_xy_lsb_ce_combined_dly5; + rcmb_xy_msb_ce_combined_dly6 <= rcmb_xy_msb_ce_combined_dly5; end reg rcmb_xy_lsb_valid = 1'b0; @@ -775,8 +816,8 @@ module modexpng_recombinator_block rcmb_xy_lsb_valid <= 1'b0; rcmb_xy_msb_valid <= 1'b0; end else begin - rcmb_xy_lsb_valid <= rcmb_xy_lsb_ce_combined_dly; - rcmb_xy_msb_valid <= rcmb_xy_msb_ce_combined_dly; + rcmb_xy_lsb_valid <= rcmb_xy_lsb_ce_combined_dly6; + rcmb_xy_msb_valid <= rcmb_xy_msb_ce_combined_dly6; end @@ -811,17 +852,17 @@ module modexpng_recombinator_block reg cnt_lsb_wrapped; reg cnt_msb_wrapped; - reg [31:0] rcmb_xy_msb_delay_0; - reg [31:0] rcmb_xy_msb_delay_1; - reg [31:0] rcmb_xy_msb_delay_2; + reg [WORD_W-1:0] rcmb_xy_msb_dly_0_x, rcmb_xy_msb_dly_0_y; + reg [WORD_W-1:0] rcmb_xy_msb_dly_1_x, rcmb_xy_msb_dly_1_y; + reg [WORD_W-1:0] rcmb_xy_msb_dly_2_x, rcmb_xy_msb_dly_2_y; - reg [OP_ADDR_W -1:0] rcmb_msb_cnt_delay_0 = OP_ADDR_ZERO; - reg [OP_ADDR_W -1:0] rcmb_msb_cnt_delay_1 = OP_ADDR_ZERO; - reg [OP_ADDR_W -1:0] rcmb_msb_cnt_delay_2 = OP_ADDR_ZERO; + reg [OP_ADDR_W -1:0] rcmb_msb_cnt_dly_0 = OP_ADDR_ZERO; + reg [OP_ADDR_W -1:0] rcmb_msb_cnt_dly_1 = OP_ADDR_ZERO; + reg [OP_ADDR_W -1:0] rcmb_msb_cnt_dly_2 = OP_ADDR_ZERO; - reg rcmb_msb_flag_delay_0 = 1'b0; - reg rcmb_msb_flag_delay_1 = 1'b0; - reg rcmb_msb_flag_delay_2 = 1'b0; + reg rcmb_msb_flag_dly_0 = 1'b0; + reg rcmb_msb_flag_dly_1 = 1'b0; + reg rcmb_msb_flag_dly_2 = 1'b0; // @@ -870,24 +911,24 @@ module modexpng_recombinator_block input flag; begin // - rcmb_xy_msb_delay_0 <= {dout_y, dout_x}; - rcmb_xy_msb_delay_1 <= rcmb_xy_msb_delay_0; - rcmb_xy_msb_delay_2 <= rcmb_xy_msb_delay_1; + {rcmb_xy_msb_dly_0_x, rcmb_xy_msb_dly_0_y} <= {dout_x, dout_y}; + {rcmb_xy_msb_dly_1_x, rcmb_xy_msb_dly_1_y} <= {rcmb_xy_msb_dly_0_x, rcmb_xy_msb_dly_0_y}; + {rcmb_xy_msb_dly_2_x, rcmb_xy_msb_dly_2_y} <= {rcmb_xy_msb_dly_1_x, rcmb_xy_msb_dly_1_y}; // - rcmb_msb_cnt_delay_0 <= cnt; - rcmb_msb_cnt_delay_1 <= rcmb_msb_cnt_delay_0; - rcmb_msb_cnt_delay_2 <= rcmb_msb_cnt_delay_1; + rcmb_msb_cnt_dly_0 <= cnt; + rcmb_msb_cnt_dly_1 <= rcmb_msb_cnt_dly_0; + rcmb_msb_cnt_dly_2 <= rcmb_msb_cnt_dly_1; // - rcmb_msb_flag_delay_0 <= flag; - rcmb_msb_flag_delay_1 <= rcmb_msb_flag_delay_0; - rcmb_msb_flag_delay_2 <= rcmb_msb_flag_delay_1; + rcmb_msb_flag_dly_0 <= flag; + rcmb_msb_flag_dly_1 <= rcmb_msb_flag_dly_0; + rcmb_msb_flag_dly_2 <= rcmb_msb_flag_dly_1; // end endtask task _update_rcmb_msb_carry; - input [WORD_W -1:0] dout_x; - input [WORD_W -1:0] dout_y; + input [WORD_W-1:0] dout_x; + input [WORD_W-1:0] dout_y; begin rcmb_x_msb_carry_0 <= dout_x; rcmb_y_msb_carry_0 <= dout_y; @@ -1031,8 +1072,8 @@ module modexpng_recombinator_block always @(posedge clk) // if (ena) begin - clr_cnt_lsb(); - clr_cnt_msb(); + clr_cnt_lsb; + clr_cnt_msb; end else if (!rdy) // case (rcmb_mode) @@ -1040,22 +1081,22 @@ module modexpng_recombinator_block RCMB_MODE_TRIANGLE: recombine_triangle(); RCMB_MODE_RECTANGLE: recombine_rectangle(); endcase - - + + // // Padding // wire [WORD_EXT_W-1:0] rcmb_x_lsb_dout_pad = {CARRY_ZERO, rcmb_x_lsb_dout}; wire [WORD_EXT_W-1:0] rcmb_y_lsb_dout_pad = {CARRY_ZERO, rcmb_y_lsb_dout}; - wire [WORD_EXT_W-1:0] rcmb_x_lsb_dout_ext_pad = {1'b0, rcmb_x_lsb_dout_ext}; - wire [WORD_EXT_W-1:0] rcmb_y_lsb_dout_ext_pad = {1'b0, rcmb_y_lsb_dout_ext}; + wire [WORD_EXT_W-1:0] rcmb_x_lsb_doutw_pad = {1'b0, rcmb_x_lsb_doutw}; + wire [WORD_EXT_W-1:0] rcmb_y_lsb_doutw_pad = {1'b0, rcmb_y_lsb_doutw}; wire [WORD_EXT_W-1:0] rcmb_x_msb_dout_pad = {CARRY_ZERO, rcmb_x_msb_dout}; wire [WORD_EXT_W-1:0] rcmb_y_msb_dout_pad = {CARRY_ZERO, rcmb_y_msb_dout}; - wire [WORD_EXT_W-1:0] rcmb_x_msb_delay_2_pad = {CARRY_ZERO, rcmb_xy_msb_delay_2[15: 0]}; - wire [WORD_EXT_W-1:0] rcmb_y_msb_delay_2_pad = {CARRY_ZERO, rcmb_xy_msb_delay_2[31:16]}; + wire [WORD_EXT_W-1:0] rcmb_xy_msb_dly_2_x_pad = {CARRY_ZERO, rcmb_xy_msb_dly_2_x}; + wire [WORD_EXT_W-1:0] rcmb_xy_msb_dly_2_y_pad = {CARRY_ZERO, rcmb_xy_msb_dly_2_y}; // @@ -1079,25 +1120,25 @@ module modexpng_recombinator_block // case (rcmb_xy_valid) // - 2'b00: if (rcmb_msb_flag_delay_2) set_wide(BANK_WIDE_H, rcmb_msb_cnt_delay_2, rcmb_x_msb_delay_2_pad, rcmb_y_msb_delay_2_pad); + 2'b00: if (rcmb_msb_flag_dly_2) set_wide(BANK_WIDE_H, rcmb_msb_cnt_dly_2, rcmb_xy_msb_dly_2_x_pad, rcmb_xy_msb_dly_2_y_pad); else clear_wide; // - 2'b01: set_wide(BANK_WIDE_L, cnt_lsb, rcmb_x_lsb_dout_pad, rcmb_y_lsb_dout_pad); + 2'b01: set_wide(BANK_WIDE_L, cnt_lsb, rcmb_x_lsb_dout_pad, rcmb_y_lsb_dout_pad); // 2'b10: if (cnt_msb < OP_ADDR_TWO) clear_wide; - else set_wide(BANK_WIDE_H, cnt_msb, rcmb_x_msb_dout_pad, rcmb_y_msb_dout_pad); + else set_wide(BANK_WIDE_H, cnt_msb, rcmb_x_msb_dout_pad, rcmb_y_msb_dout_pad); // - 2'b11: if (!cnt_lsb_wrapped) set_wide(BANK_WIDE_L, cnt_lsb, rcmb_x_lsb_dout_pad, rcmb_y_lsb_dout_pad); + 2'b11: if (!cnt_lsb_wrapped) set_wide(BANK_WIDE_L, cnt_lsb, rcmb_x_lsb_dout_pad, rcmb_y_lsb_dout_pad); else begin - if (cnt_lsb == OP_ADDR_ZERO) set_wide(BANK_WIDE_H, cnt_lsb, rcmb_x_lsb_dout_pad, rcmb_y_lsb_dout_pad); - else set_wide(BANK_WIDE_H, cnt_lsb, rcmb_x_lsb_dout_ext_pad, rcmb_y_lsb_dout_ext_pad); + if (cnt_lsb == OP_ADDR_ZERO) set_wide(BANK_WIDE_H, cnt_lsb, rcmb_x_lsb_dout_pad, rcmb_y_lsb_dout_pad); + else set_wide(BANK_WIDE_H, cnt_lsb, rcmb_x_lsb_doutw_pad, rcmb_y_lsb_doutw_pad); end // endcase // case (rcmb_xy_valid) // - 2'b00: if (rcmb_msb_flag_delay_2) advance_rcmb_msb_delay(WORD_DNC, WORD_DNC, OP_ADDR_ZERO, 1'b0); + 2'b00: if (rcmb_msb_flag_dly_2) advance_rcmb_msb_delay(WORD_DNC, WORD_DNC, OP_ADDR_ZERO, 1'b0); // 2'b01: if (rcmb_xy_lsb_cry) pop_rcmb_msb_carry; // @@ -1120,7 +1161,7 @@ module modexpng_recombinator_block begin // case (rcmb_xy_valid) - 2'b01: inc_cnt_lsb(); + 2'b01: inc_cnt_lsb; endcase // case (rcmb_xy_valid) @@ -1156,7 +1197,7 @@ module modexpng_recombinator_block // case (rcmb_xy_valid) // - 2'b00: if (rcmb_msb_flag_delay_2) set_rdct(BANK_RCMB_MH, rcmb_msb_cnt_delay_2, rcmb_x_msb_delay_2_pad, rcmb_y_msb_delay_2_pad); + 2'b00: if (rcmb_msb_flag_dly_2) set_rdct(BANK_RCMB_MH, rcmb_msb_cnt_dly_2, rcmb_xy_msb_dly_2_x_pad, rcmb_xy_msb_dly_2_y_pad); else clear_rdct; // 2'b01: set_rdct(BANK_RCMB_ML, cnt_lsb, rcmb_x_lsb_dout_pad, rcmb_y_lsb_dout_pad); @@ -1166,14 +1207,14 @@ module modexpng_recombinator_block else set_rdct(BANK_RCMB_MH, cnt_msb, rcmb_x_msb_dout_pad, rcmb_y_msb_dout_pad); end else set_rdct(BANK_RCMB_EXT, OP_ADDR_ZERO, rcmb_x_msb_dout_pad, rcmb_y_msb_dout_pad); // - 2'b11: if (cnt_lsb == OP_ADDR_ZERO) set_rdct(BANK_RCMB_MH, cnt_lsb, rcmb_x_lsb_dout_pad, rcmb_y_lsb_dout_pad); - else set_rdct(BANK_RCMB_MH, cnt_lsb, rcmb_x_lsb_dout_ext_pad, rcmb_y_lsb_dout_ext_pad); + 2'b11: if (cnt_lsb == OP_ADDR_ZERO) set_rdct(BANK_RCMB_MH, cnt_lsb, rcmb_x_lsb_dout_pad, rcmb_y_lsb_dout_pad); + else set_rdct(BANK_RCMB_MH, cnt_lsb, rcmb_x_lsb_doutw_pad, rcmb_y_lsb_doutw_pad); // endcase // case (rcmb_xy_valid) // - 2'b00: if (rcmb_msb_flag_delay_2) advance_rcmb_msb_delay(WORD_DNC, WORD_DNC, OP_ADDR_ZERO, 1'b0); + 2'b00: if (rcmb_msb_flag_dly_2) advance_rcmb_msb_delay(WORD_DNC, WORD_DNC, OP_ADDR_ZERO, 1'b0); // 2'b01: if (rcmb_xy_lsb_cry) pop_rcmb_msb_carry; // @@ -1200,9 +1241,9 @@ module modexpng_recombinator_block else if (!rdy_reg) // case (rcmb_mode) - RCMB_MODE_SQUARE: case (rcmb_xy_valid) 2'b00: if (rcmb_msb_flag_delay_2) rdy_adv <= ~rcmb_msb_flag_delay_1; endcase - RCMB_MODE_TRIANGLE: case (rcmb_xy_valid) 2'b01: rdy_adv <= cnt_lsb_wrapped; endcase - RCMB_MODE_RECTANGLE: case (rcmb_xy_valid) 2'b00: if (rcmb_msb_flag_delay_2) rdy_adv <= ~rcmb_msb_flag_delay_1; endcase + RCMB_MODE_SQUARE: case (rcmb_xy_valid) 2'b00: if (rcmb_msb_flag_dly_2) rdy_adv <= ~rcmb_msb_flag_dly_1; endcase + RCMB_MODE_TRIANGLE: case (rcmb_xy_valid) 2'b01: rdy_adv <= cnt_lsb_wrapped; endcase + RCMB_MODE_RECTANGLE: case (rcmb_xy_valid) 2'b00: if (rcmb_msb_flag_dly_2) rdy_adv <= ~rcmb_msb_flag_dly_1; endcase endcase |