diff options
author | Joachim StroĢmbergson <joachim@secworks.se> | 2015-04-21 16:09:11 +0200 |
---|---|---|
committer | Joachim StroĢmbergson <joachim@secworks.se> | 2015-04-21 16:09:11 +0200 |
commit | 29d52d2a0878647a47bc573a6f10bc3637d99266 (patch) | |
tree | c645714be0fee20cd55d7f4bf731eb6ace40ba69 /src/rtl | |
parent | b8e6a576f11a0f91d31413e4249505d053030403 (diff) |
Update of modexp to include more of the integration of residue calculator. Update of shl and shr to simplify code. shl and shr could be replaced by functions.
Diffstat (limited to 'src/rtl')
-rw-r--r-- | src/rtl/modexp.v | 140 | ||||
-rw-r--r-- | src/rtl/shl32.v | 28 | ||||
-rw-r--r-- | src/rtl/shr32.v | 26 |
3 files changed, 128 insertions, 66 deletions
diff --git a/src/rtl/modexp.v b/src/rtl/modexp.v index 8721ce9..dbf65b3 100644 --- a/src/rtl/modexp.v +++ b/src/rtl/modexp.v @@ -17,7 +17,7 @@ // // The core has a 32-bit memory like interface, but provides // status signals to inform the system that a given operation -// has completed. Additionally, any errors will also be asserted. +// has is done. Additionally, any errors will also be asserted. // // // Author: Joachim Strombergson, Peter Magnusson @@ -71,8 +71,8 @@ module modexp( localparam ADDR_NAME0 = 8'h00; localparam ADDR_NAME1 = 8'h01; localparam ADDR_VERSION = 8'h02; + localparam ADDR_CTRL = 8'h03; - localparam ADDR_CTRL = 8'h00; localparam CTRL_INIT_BIT = 0; localparam CTRL_NEXT_BIT = 1; @@ -154,17 +154,6 @@ module modexp( reg [31 : 0] result_mem_int_wr_data; reg result_mem_int_we; - reg residue_calculator_start; //TODO not implemented yet - reg residue_calculator_ready; //TODO not implemented yet - - reg [31 : 0] residue_mem [0 : 255]; - reg [07 : 0] residue_mem_rd_addr; - wire [31 : 0] residue_mem_rd_data; - reg [07 : 0] residue_mem_wr_addr; - reg [31 : 0] residue_mem_wr_data; - reg residue_mem_we; - - reg [07 : 0] p_mem_rd0_addr; wire [31 : 0] p_mem_rd0_data; reg [07 : 0] p_mem_rd1_addr; @@ -175,13 +164,13 @@ module modexp( reg [07 : 0] length_reg; reg [07 : 0] length_m1_reg; - reg [07 : 0] length_new; - reg [07 : 0] length_m1_new; - reg length_we; + reg [07 : 0] length_new; //TODO: API should write length!!! + reg [07 : 0] length_m1_new; //TODO: API should write length-1 when writing length!!! + reg length_we; //TODO: API should enable length_we!!! reg start_reg; - reg start_new; - reg start_we; + reg start_new; //TODO: API should start operations!!! + reg start_we; //TODO: API should start operations!!! reg ready_reg; reg ready_new; @@ -192,7 +181,7 @@ module modexp( reg montprod_select_we; reg [1 : 0] montprod_dest_reg; reg [1 : 0] montprod_dest_new; - reg [1 : 0] montprod_dest_we; + reg montprod_dest_we; reg [3 : 0] modexp_ctrl_reg; reg [3 : 0] modexp_ctrl_new; @@ -203,7 +192,7 @@ module modexp( reg [12 : 0] loop_counter_reg; reg [12 : 0] loop_counter_new; - reg [12 : 0] loop_counter_we; + reg loop_counter_we; reg [07 : 0] E_word_index; reg [04 : 0] E_bit_index; reg last_iteration; @@ -215,7 +204,7 @@ module modexp( // Wires. //---------------------------------------------------------------- reg [31 : 0] tmp_read_data; - reg tmp_error; + //reg tmp_error; reg montprod_calc; wire montprod_ready; @@ -234,6 +223,21 @@ module modexp( wire [31 : 0] montprod_result_data; wire montprod_result_we; + reg residue_calculate; + wire residue_ready; + //wire residue_wire; ? + reg [14 : 0] residue_nn; + wire [07 : 0] residue_length; + wire [07 : 0] residue_opa_rd_addr; + reg [31 : 0] residue_opa_rd_data; + wire [07 : 0] residue_opa_wr_addr; + wire [31 : 0] residue_opa_wr_data; + wire residue_opa_wr_we; + wire [07 : 0] residue_opm_addr; + reg [31 : 0] residue_opm_data; + + reg [07 : 0] residue_mem_montprod_read_addr; + wire [31 : 0] residue_mem_montprod_read_data; //---------------------------------------------------------------- // Concurrent connectivity for ports etc. @@ -260,7 +264,7 @@ module modexp( .opb_data(montprod_opb_data), .opm_addr(montprod_opm_addr), - .opm_data(message_mem_int_rd_data), + .opm_data(montprod_opm_data), .result_addr(montprod_result_addr), .result_data(montprod_result_data), @@ -268,6 +272,33 @@ module modexp( ); + residue residue_inst( + .clk(clk), + .reset_n(reset_n), + .calculate(residue_calculate), + .ready(residue_ready), + .nn(residue_nn), + .length(residue_length), + .opa_rd_addr(residue_opa_rd_addr), + .opa_rd_data(residue_opa_rd_data), + .opa_wr_addr(residue_opa_wr_addr), + .opa_wr_data(residue_opa_wr_data), + .opa_wr_we(residue_opa_wr_we), + .opm_addr(residue_opm_addr), + .opm_data(residue_opm_data) + ); + + blockmem2r1w residue_mem( + .clk(clk), + .read_addr0(residue_opa_rd_addr), + .read_data0(residue_opa_rd_data), + .read_addr1(residue_mem_montprod_read_addr), + .read_data1(residue_mem_montprod_read_data), + .wr(residue_opa_wr_we), + .write_addr(residue_opa_wr_addr), + .write_data(residue_opa_wr_data) + ); + blockmem2r1w modulus_mem( .clk(clk), .read_addr0(modulus_mem_int_rd_addr), @@ -487,6 +518,40 @@ module modexp( //---------------------------------------------------------------- + // one + // + // generates the big integer one ( 00... 01 ) + //---------------------------------------------------------------- + always @* + begin : one_process; + if (montprod_opa_addr == length_m1_reg) + one_new = 32'h00000001; + else + one_new = 32'h00000000; + end + + //---------------------------------------------------------------- + // read mux for modulus, since it is being addressed by two sources + //---------------------------------------------------------------- + always @* + begin : modulus_mem_reader_process + if (modexp_ctrl_reg == CTRL_RESIDUE) + modulus_mem_int_rd_addr = residue_opm_addr; + else + modulus_mem_int_rd_addr = montprod_opm_addr; + end + + //---------------------------------------------------------------- + // feeds residue calculator + //---------------------------------------------------------------- + always @* + begin : residue_process; + residue_nn = { 1'b0, length_reg, 6'h0 }; //N*2, N=length*32, *32 = shl5, *64 = shl6 + residue_length = length_reg; + residue_opm_data = modulus_mem_int_rd_data; + end + + //---------------------------------------------------------------- // montprod_op_select // // Select operands used during montprod calculations depending @@ -494,33 +559,28 @@ module modexp( //---------------------------------------------------------------- always @* begin : montprod_op_select - message_mem_int_rd_addr = montprod_opa_addr; - p_mem_rd0_addr = montprod_opa_addr; - - residue_mem_rd_addr = montprod_opb_addr; - p_mem_rd1_addr = montprod_opb_addr; - modulus_mem_int_rd_addr = montprod_opm_addr; + montprod_length = length_reg; - montprod_opa_data = 32'h00000000; - montprod_opb_data = 32'h00000000; + result_mem_int_rd_addr = montprod_opa_addr; + message_mem_int_rd_addr = montprod_opa_addr; + p_mem_rd0_addr = montprod_opa_addr; - if (montprod_opa_addr == length_m1_reg) - one_new = 32'h00000001; - else - one_new = 32'h00000000; + residue_mem_montprod_read_addr = montprod_opb_addr; + p_mem_rd1_addr = montprod_opb_addr; + montprod_opm_data = modulus_mem_int_rd_data; case (montprod_select_reg) MONTPROD_SELECT_ONE_NR: begin montprod_opa_data = one; - montprod_opb_data = residue_mem_rd_data; + montprod_opb_data = residue_mem_montprod_read_data; end MONTPROD_SELECT_X_NR: begin montprod_opa_data = message_mem_int_rd_data; - montprod_opb_data = residue_mem_rd_data; + montprod_opb_data = residue_mem_montprod_read_data; end MONTPROD_SELECT_Z_P: @@ -543,6 +603,8 @@ module modexp( default: begin + montprod_opa_data = 32'h00000000; + montprod_opb_data = 32'h00000000; end endcase // case (montprod_selcect_reg) end @@ -654,7 +716,7 @@ module modexp( modexp_ctrl_new = CTRL_IDLE; modexp_ctrl_we = 0; - residue_calculator_start = 1'b0; + residue_calculate = 1'b0; case (modexp_ctrl_reg) CTRL_IDLE: @@ -665,13 +727,13 @@ module modexp( begin modexp_ctrl_new = CTRL_RESIDUE; modexp_ctrl_we = 1; - residue_calculator_start = 1'b1; + residue_calculate = 1'b1; end end CTRL_RESIDUE: begin - if (residue_calculator_ready == 1'b1) + if (residue_ready == 1'b1) begin montprod_select_new = MONTPROD_SELECT_ONE_NR; montprod_select_we = 1; diff --git a/src/rtl/shl32.v b/src/rtl/shl32.v index d0dd1bc..42521fd 100644 --- a/src/rtl/shl32.v +++ b/src/rtl/shl32.v @@ -1,8 +1,8 @@ //====================================================================== // -// shr32.v -// --------- -// 32bit shifter with carry in / carry out. +// shl32.v +// ------- +// 32bit left shift with carry in / carry out // // // Author: Peter Magnusson @@ -36,18 +36,18 @@ // //====================================================================== - module shl32( - input [31 : 0] a, - input carry_in, - output wire [31 : 0] amul2, - output wire carry_out); + input wire [31 : 0] a, + input wire carry_in, + output wire [31 : 0] amul2, + output wire carry_out + ); - reg [32 : 0] shl_result; + assign amul2 = {a[30 : 0], carry_in}; + assign carry_out = a[31]; - assign amul2 = shl_result[31:0]; - assign carry_out = shl_result[32]; +endmodule // shl32 - always @(a, carry_in) - shl_result = { a, carry_in }; -endmodule +//====================================================================== +// EOF shl32.v +//====================================================================== diff --git a/src/rtl/shr32.v b/src/rtl/shr32.v index 840f9df..66b15c3 100644 --- a/src/rtl/shr32.v +++ b/src/rtl/shr32.v @@ -1,8 +1,8 @@ //====================================================================== // // shr32.v -// --------- -// 32bit shifter with carry in / carry out +// ------- +// 32bit right shift with carry in / carry out. // // // Author: Peter Magnusson @@ -36,18 +36,18 @@ // //====================================================================== - module shr32( - input [31 : 0] a, - input carry_in, - output wire [31 : 0] adiv2, - output wire carry_out); + input wire [31 : 0] a, + input wire carry_in, + output wire [31 : 0] adiv2, + output wire carry_out + ); - reg [32 : 0] shr_result; + assign adiv2 = {carry_in, a[31 : 1]}; + assign carry_out = a[0]; - assign adiv2 = shr_result[32:1]; - assign carry_out = shr_result[0]; +endmodule // shr32 - always @(a, carry_in) - shr_result = { carry_in, a }; -endmodule +//====================================================================== +// EOF shr32.v +//====================================================================== |