diff options
-rw-r--r-- | src/rtl/sha512.v | 1041 | ||||
-rw-r--r-- | src/rtl/sha512_k_constants.v | 489 | ||||
-rw-r--r-- | src/tb/tb_sha512.v | 21 |
3 files changed, 229 insertions, 1322 deletions
diff --git a/src/rtl/sha512.v b/src/rtl/sha512.v index 6aa1557..6356a8c 100644 --- a/src/rtl/sha512.v +++ b/src/rtl/sha512.v @@ -75,36 +75,6 @@ module sha512( parameter ADDR_WORK_FACTOR_NUM = 8'h0a; parameter ADDR_BLOCK0 = 8'h10; - parameter ADDR_BLOCK1 = 8'h11; - parameter ADDR_BLOCK2 = 8'h12; - parameter ADDR_BLOCK3 = 8'h13; - parameter ADDR_BLOCK4 = 8'h14; - parameter ADDR_BLOCK5 = 8'h15; - parameter ADDR_BLOCK6 = 8'h16; - parameter ADDR_BLOCK7 = 8'h17; - parameter ADDR_BLOCK8 = 8'h18; - parameter ADDR_BLOCK9 = 8'h19; - parameter ADDR_BLOCK10 = 8'h1a; - parameter ADDR_BLOCK11 = 8'h1b; - parameter ADDR_BLOCK12 = 8'h1c; - parameter ADDR_BLOCK13 = 8'h1d; - parameter ADDR_BLOCK14 = 8'h1e; - parameter ADDR_BLOCK15 = 8'h1f; - parameter ADDR_BLOCK16 = 8'h20; - parameter ADDR_BLOCK17 = 8'h21; - parameter ADDR_BLOCK18 = 8'h22; - parameter ADDR_BLOCK19 = 8'h23; - parameter ADDR_BLOCK20 = 8'h24; - parameter ADDR_BLOCK21 = 8'h25; - parameter ADDR_BLOCK22 = 8'h26; - parameter ADDR_BLOCK23 = 8'h27; - parameter ADDR_BLOCK24 = 8'h28; - parameter ADDR_BLOCK25 = 8'h29; - parameter ADDR_BLOCK26 = 8'h2a; - parameter ADDR_BLOCK27 = 8'h2b; - parameter ADDR_BLOCK28 = 8'h2c; - parameter ADDR_BLOCK29 = 8'h2d; - parameter ADDR_BLOCK30 = 8'h2e; parameter ADDR_BLOCK31 = 8'h2f; parameter ADDR_DIGEST0 = 8'h40; @@ -126,7 +96,7 @@ module sha512( parameter CORE_NAME0 = 32'h73686132; // "sha2" parameter CORE_NAME1 = 32'h2d353132; // "-512" - parameter CORE_VERSION = 32'h302e3830; // "0.80" + parameter CORE_VERSION = 32'h302e3831; // "0.81" parameter MODE_SHA_512_224 = 2'h0; parameter MODE_SHA_512_256 = 2'h1; @@ -162,70 +132,8 @@ module sha512( reg ready_reg; - reg [31 : 0] block0_reg; - reg block0_we; - reg [31 : 0] block1_reg; - reg block1_we; - reg [31 : 0] block2_reg; - reg block2_we; - reg [31 : 0] block3_reg; - reg block3_we; - reg [31 : 0] block4_reg; - reg block4_we; - reg [31 : 0] block5_reg; - reg block5_we; - reg [31 : 0] block6_reg; - reg block6_we; - reg [31 : 0] block7_reg; - reg block7_we; - reg [31 : 0] block8_reg; - reg block8_we; - reg [31 : 0] block9_reg; - reg block9_we; - reg [31 : 0] block10_reg; - reg block10_we; - reg [31 : 0] block11_reg; - reg block11_we; - reg [31 : 0] block12_reg; - reg block12_we; - reg [31 : 0] block13_reg; - reg block13_we; - reg [31 : 0] block14_reg; - reg block14_we; - reg [31 : 0] block15_reg; - reg block15_we; - reg [31 : 0] block16_reg; - reg block16_we; - reg [31 : 0] block17_reg; - reg block17_we; - reg [31 : 0] block18_reg; - reg block18_we; - reg [31 : 0] block19_reg; - reg block19_we; - reg [31 : 0] block20_reg; - reg block20_we; - reg [31 : 0] block21_reg; - reg block21_we; - reg [31 : 0] block22_reg; - reg block22_we; - reg [31 : 0] block23_reg; - reg block23_we; - reg [31 : 0] block24_reg; - reg block24_we; - reg [31 : 0] block25_reg; - reg block25_we; - reg [31 : 0] block26_reg; - reg block26_we; - reg [31 : 0] block27_reg; - reg block27_we; - reg [31 : 0] block28_reg; - reg block28_we; - reg [31 : 0] block29_reg; - reg block29_we; - reg [31 : 0] block30_reg; - reg block30_we; - reg [31 : 0] block31_reg; - reg block31_we; + reg [31 : 0] block_reg [0 : 31]; + reg block_we; reg [511 : 0] digest_reg; reg digest_valid_reg; @@ -234,16 +142,13 @@ module sha512( //---------------------------------------------------------------- // Wires. //---------------------------------------------------------------- - wire core_init; - wire core_next; - wire [1 : 0] core_mode; - wire core_work_factor; - wire [31 : 0] core_work_factor_num; wire core_ready; wire [1023 : 0] core_block; wire [511 : 0] core_digest; wire core_digest_valid; + reg [4 : 0] block_addr; + reg state00_we; reg state01_we; reg state02_we; @@ -261,7 +166,6 @@ module sha512( reg state14_we; reg state15_we; - reg [31 : 0] tmp_read_data; reg tmp_error; @@ -269,22 +173,14 @@ module sha512( //---------------------------------------------------------------- // Concurrent connectivity for ports etc. //---------------------------------------------------------------- - assign core_init = init_reg; - - assign core_next = next_reg; - - assign core_mode = mode_reg; - - assign core_work_factor = work_factor_reg; - assign core_work_factor_num = work_factor_num_reg; - - assign core_block = {block0_reg, block1_reg, block2_reg, block3_reg, block4_reg, - block5_reg, block6_reg, block7_reg, block8_reg, block9_reg, - block10_reg, block11_reg, block12_reg, block13_reg, block14_reg, - block15_reg, block16_reg, block17_reg, block18_reg, block19_reg, - block20_reg, block21_reg, block22_reg, block23_reg, block24_reg, - block25_reg, block26_reg, block27_reg, block28_reg, block29_reg, - block30_reg, block31_reg}; + assign core_block = {block_reg[00], block_reg[01], block_reg[02], block_reg[03], + block_reg[04], block_reg[05], block_reg[06], block_reg[07], + block_reg[08], block_reg[09], block_reg[10], block_reg[11], + block_reg[12], block_reg[13], block_reg[14], block_reg[15], + block_reg[16], block_reg[17], block_reg[18], block_reg[19], + block_reg[20], block_reg[21], block_reg[22], block_reg[23], + block_reg[24], block_reg[25], block_reg[26], block_reg[27], + block_reg[28], block_reg[29], block_reg[30], block_reg[31]}; assign read_data = tmp_read_data; assign error = tmp_error; @@ -297,12 +193,12 @@ module sha512( .clk(clk), .reset_n(reset_n), - .init(core_init), - .next(core_next), - .mode(core_mode), + .init(init_reg), + .next(next_reg), + .mode(mode_reg), - .work_factor(core_work_factor), - .work_factor_num(core_work_factor_num), + .work_factor(work_factor_reg), + .work_factor_num(work_factor_num_reg), .block(core_block), @@ -339,285 +235,49 @@ module sha512( // active low reset. All registers have write enable. //---------------------------------------------------------------- always @ (posedge clk or negedge reset_n) - begin + begin : reg_update + integer i; + if (!reset_n) begin - init_reg <= 0; - next_reg <= 0; + for (i = 0 ; i < 32 ; i = i + 1) + block_reg[i] <= 32'h0; + + init_reg <= 1'h0; + next_reg <= 1'h0; mode_reg <= MODE_SHA_512; - work_factor_reg <= 0; + work_factor_reg <= 1'h0; work_factor_num_reg <= DEFAULT_WORK_FACTOR_NUM; - ready_reg <= 0; - digest_reg <= {16{32'h00000000}}; - digest_valid_reg <= 0; - block0_reg <= 32'h00000000; - block1_reg <= 32'h00000000; - block2_reg <= 32'h00000000; - block3_reg <= 32'h00000000; - block4_reg <= 32'h00000000; - block5_reg <= 32'h00000000; - block6_reg <= 32'h00000000; - block7_reg <= 32'h00000000; - block8_reg <= 32'h00000000; - block9_reg <= 32'h00000000; - block10_reg <= 32'h00000000; - block11_reg <= 32'h00000000; - block12_reg <= 32'h00000000; - block13_reg <= 32'h00000000; - block14_reg <= 32'h00000000; - block15_reg <= 32'h00000000; - block16_reg <= 32'h00000000; - block17_reg <= 32'h00000000; - block18_reg <= 32'h00000000; - block19_reg <= 32'h00000000; - block20_reg <= 32'h00000000; - block21_reg <= 32'h00000000; - block22_reg <= 32'h00000000; - block23_reg <= 32'h00000000; - block24_reg <= 32'h00000000; - block25_reg <= 32'h00000000; - block26_reg <= 32'h00000000; - block27_reg <= 32'h00000000; - block28_reg <= 32'h00000000; - block29_reg <= 32'h00000000; - block30_reg <= 32'h00000000; - block31_reg <= 32'h00000000; + ready_reg <= 1'h0; + digest_reg <= 512'h0; + digest_valid_reg <= 1'h0; end else begin ready_reg <= core_ready; digest_valid_reg <= core_digest_valid; - - if (init_we) - begin - init_reg <= init_new; - end - - if (next_we) - begin - next_reg <= next_new; - end + init_reg <= init_new; + next_reg <= next_new; if (mode_we) - begin - mode_reg <= mode_new; - end + mode_reg <= mode_new; if (work_factor_we) - begin - work_factor_reg <= work_factor_new; - end + work_factor_reg <= work_factor_new; if (work_factor_num_we) - begin - work_factor_num_reg <= write_data; - end + work_factor_num_reg <= write_data; if (core_digest_valid) - begin - digest_reg <= core_digest; - end - - if (block0_we) - begin - block0_reg <= write_data; - end - - if (block1_we) - begin - block1_reg <= write_data; - end - - if (block2_we) - begin - block2_reg <= write_data; - end - - if (block3_we) - begin - block3_reg <= write_data; - end - - if (block4_we) - begin - block4_reg <= write_data; - end - - if (block5_we) - begin - block5_reg <= write_data; - end - - if (block6_we) - begin - block6_reg <= write_data; - end - - if (block7_we) - begin - block7_reg <= write_data; - end - - if (block8_we) - begin - block8_reg <= write_data; - end - - if (block9_we) - begin - block9_reg <= write_data; - end - - if (block10_we) - begin - block10_reg <= write_data; - end - - if (block11_we) - begin - block11_reg <= write_data; - end - - if (block12_we) - begin - block12_reg <= write_data; - end - - if (block13_we) - begin - block13_reg <= write_data; - end - - if (block14_we) - begin - block14_reg <= write_data; - end - - if (block15_we) - begin - block15_reg <= write_data; - end - - if (block16_we) - begin - block16_reg <= write_data; - end - - if (block17_we) - begin - block17_reg <= write_data; - end - - if (block18_we) - begin - block18_reg <= write_data; - end - - if (block19_we) - begin - block19_reg <= write_data; - end - - if (block20_we) - begin - block20_reg <= write_data; - end - - if (block21_we) - begin - block21_reg <= write_data; - end - - if (block22_we) - begin - block22_reg <= write_data; - end - - if (block23_we) - begin - block23_reg <= write_data; - end - - if (block24_we) - begin - block24_reg <= write_data; - end - - if (block25_we) - begin - block25_reg <= write_data; - end - - if (block26_we) - begin - block26_reg <= write_data; - end + digest_reg <= core_digest; - if (block27_we) - begin - block27_reg <= write_data; - end - - if (block28_we) - begin - block28_reg <= write_data; - end - - if (block29_we) - begin - block29_reg <= write_data; - end - - if (block30_we) - begin - block30_reg <= write_data; - end - - if (block31_we) - begin - block31_reg <= write_data; - end + if (block_we) + block_reg[block_addr] <= write_data; end end // reg_update //---------------------------------------------------------------- - // flag_reset - // - // Logic to reset init and next flags that has been set. - //---------------------------------------------------------------- - always @* - begin : flag_reset - init_new = 0; - init_we = 0; - next_new = 0; - next_we = 0; - - if (init_set) - begin - init_new = 1; - init_we = 1; - end - else if (init_reg) - begin - init_new = 0; - init_we = 1; - end - - if (next_set) - begin - next_new = 1; - next_we = 1; - end - else if (next_reg) - begin - next_new = 0; - next_we = 1; - end - end - - - //---------------------------------------------------------------- // api_logic // // Implementation of the api logic. If cs is enabled will either @@ -625,579 +285,144 @@ module sha512( //---------------------------------------------------------------- always @* begin : api_logic - init_set = 0; - next_set = 0; - mode_new = 2'b00; - mode_we = 0; - work_factor_new = 0; - work_factor_we = 0; - work_factor_num_we = 0; - block0_we = 0; - block1_we = 0; - block2_we = 0; - block3_we = 0; - block4_we = 0; - block5_we = 0; - block6_we = 0; - block7_we = 0; - block8_we = 0; - block9_we = 0; - block10_we = 0; - block11_we = 0; - block12_we = 0; - block13_we = 0; - block14_we = 0; - block15_we = 0; - block16_we = 0; - block17_we = 0; - block18_we = 0; - block19_we = 0; - block20_we = 0; - block21_we = 0; - block22_we = 0; - block23_we = 0; - block24_we = 0; - block25_we = 0; - block26_we = 0; - block27_we = 0; - block28_we = 0; - block29_we = 0; - block30_we = 0; - block31_we = 0; - state00_we = 0; - state01_we = 0; - state02_we = 0; - state03_we = 0; - state04_we = 0; - state05_we = 0; - state06_we = 0; - state07_we = 0; - state08_we = 0; - state09_we = 0; - state10_we = 0; - state11_we = 0; - state12_we = 0; - state13_we = 0; - state14_we = 0; - state15_we = 0; + init_new = 1'h0; + next_new = 1'h0; + mode_new = MODE_SHA_512; + mode_we = 1'h0; + work_factor_new = 1'h0; + work_factor_we = 1'h0; + work_factor_num_we = 1'h0; + block_we = 1'h0; + state00_we = 1'h0; + state01_we = 1'h0; + state02_we = 1'h0; + state03_we = 1'h0; + state04_we = 1'h0; + state05_we = 1'h0; + state06_we = 1'h0; + state07_we = 1'h0; + state08_we = 1'h0; + state09_we = 1'h0; + state10_we = 1'h0; + state11_we = 1'h0; + state12_we = 1'h0; + state13_we = 1'h0; + state14_we = 1'h0; + state15_we = 1'h0; tmp_read_data = 32'h00000000; - tmp_error = 0; + tmp_error = 1'h0; + + block_addr = address[4 : 0] - ADDR_BLOCK0[4 : 0]; if (cs) begin if (we) begin - case (address) - // Write operations. - ADDR_CTRL: - begin - init_set = write_data[CTRL_INIT_BIT]; - next_set = write_data[CTRL_NEXT_BIT]; - mode_new = write_data[CTRL_MODE_HIGH_BIT : CTRL_MODE_LOW_BIT]; - work_factor_new = write_data[CTRL_WORK_FACTOR_BIT]; - work_factor_we = 1; - mode_we = 1; - end - - ADDR_WORK_FACTOR_NUM: - begin - work_factor_num_we = 1; - end - - ADDR_BLOCK0: - begin - block0_we = 1; - end - - ADDR_BLOCK1: - begin - block1_we = 1; - end - - ADDR_BLOCK2: - begin - block2_we = 1; - end - - ADDR_BLOCK3: - begin - block3_we = 1; - end - - ADDR_BLOCK4: - begin - block4_we = 1; - end - - ADDR_BLOCK5: - begin - block5_we = 1; - end - - ADDR_BLOCK6: - begin - block6_we = 1; - end - - ADDR_BLOCK7: - begin - block7_we = 1; - end - - ADDR_BLOCK8: - begin - block8_we = 1; - end - - ADDR_BLOCK9: - begin - block9_we = 1; - end - - ADDR_BLOCK10: - begin - block10_we = 1; - end - - ADDR_BLOCK11: - begin - block11_we = 1; - end - - ADDR_BLOCK12: - begin - block12_we = 1; - end - - ADDR_BLOCK13: - begin - block13_we = 1; - end - - ADDR_BLOCK14: - begin - block14_we = 1; - end - - ADDR_BLOCK15: - begin - block15_we = 1; - end - - ADDR_BLOCK16: - begin - block16_we = 1; - end - - ADDR_BLOCK17: - begin - block17_we = 1; - end - - ADDR_BLOCK18: - begin - block18_we = 1; - end - - ADDR_BLOCK19: - begin - block19_we = 1; - end - - ADDR_BLOCK20: - begin - block20_we = 1; - end - - ADDR_BLOCK21: - begin - block21_we = 1; - end - - ADDR_BLOCK22: - begin - block22_we = 1; - end - - ADDR_BLOCK23: - begin - block23_we = 1; - end - - ADDR_BLOCK24: - begin - block24_we = 1; - end - - ADDR_BLOCK25: - begin - block25_we = 1; - end - - ADDR_BLOCK26: - begin - block26_we = 1; - end - - ADDR_BLOCK27: - begin - block27_we = 1; - end - - ADDR_BLOCK28: - begin - block28_we = 1; - end - - ADDR_BLOCK29: - begin - block29_we = 1; - end + if (core_ready) + begin + if ((address >= ADDR_BLOCK0) && (address <= ADDR_BLOCK31)) + block_we = 1'h1; - ADDR_BLOCK30: - begin - block30_we = 1; - end + case (address) + ADDR_CTRL: + begin + init_new = write_data[CTRL_INIT_BIT]; + next_new = write_data[CTRL_NEXT_BIT]; + mode_new = write_data[CTRL_MODE_HIGH_BIT : CTRL_MODE_LOW_BIT]; + mode_we = 1'h1; + work_factor_new = write_data[CTRL_WORK_FACTOR_BIT]; + work_factor_we = 1'h1; + end - ADDR_BLOCK31: - begin - block31_we = 1; - end + ADDR_WORK_FACTOR_NUM: + begin + work_factor_num_we = 1; + end - ADDR_DIGEST0: - state00_we = 1; + ADDR_DIGEST0: + state00_we = 1; - ADDR_DIGEST1: - state01_we = 1; + ADDR_DIGEST1: + state01_we = 1; - ADDR_DIGEST2: - state02_we = 1; + ADDR_DIGEST2: + state02_we = 1; - ADDR_DIGEST3: - state03_we = 1; + ADDR_DIGEST3: + state03_we = 1; - ADDR_DIGEST4: - state04_we = 1; + ADDR_DIGEST4: + state04_we = 1; - ADDR_DIGEST5: - state05_we = 1; + ADDR_DIGEST5: + state05_we = 1; - ADDR_DIGEST6: - state06_we = 1; + ADDR_DIGEST6: + state06_we = 1; - ADDR_DIGEST7: - state07_we = 1; + ADDR_DIGEST7: + state07_we = 1; - ADDR_DIGEST8: - state08_we = 1; + ADDR_DIGEST8: + state08_we = 1; - ADDR_DIGEST9: - state09_we = 1; + ADDR_DIGEST9: + state09_we = 1; - ADDR_DIGEST10: - state10_we = 1; + ADDR_DIGEST10: + state10_we = 1; - ADDR_DIGEST11: - state11_we = 1; + ADDR_DIGEST11: + state11_we = 1; - ADDR_DIGEST12: - state12_we = 1; + ADDR_DIGEST12: + state12_we = 1; - ADDR_DIGEST13: - state13_we = 1; + ADDR_DIGEST13: + state13_we = 1; - ADDR_DIGEST14: - state14_we = 1; + ADDR_DIGEST14: + state14_we = 1; - ADDR_DIGEST15: - state15_we = 1; + ADDR_DIGEST15: + state15_we = 1; - default: - begin - tmp_error = 1; - end - endcase // case (address) + default: + tmp_error = 1; + endcase // case (address) + end // if (core_ready) end // if (we) else begin + if (core_ready) + if ((address >= ADDR_DIGEST0) && (address <= ADDR_DIGEST15)) + tmp_read_data = digest_reg[(15 - (address - ADDR_DIGEST0)) * 32 +: 32]; + + if ((address >= ADDR_BLOCK0) && (address <= ADDR_BLOCK31)) + tmp_read_data = block_reg[address[4 : 0]]; + case (address) - // Read operations. ADDR_NAME0: - begin - tmp_read_data = CORE_NAME0; - end + tmp_read_data = CORE_NAME0; ADDR_NAME1: - begin - tmp_read_data = CORE_NAME1; - end + tmp_read_data = CORE_NAME1; ADDR_VERSION: - begin - tmp_read_data = CORE_VERSION; - end + tmp_read_data = CORE_VERSION; ADDR_CTRL: - begin - tmp_read_data = {24'h000000, work_factor_reg, 3'b000, - mode_reg, next_reg, init_reg}; - end + tmp_read_data = {24'h000000, work_factor_reg, 3'b000, mode_reg, next_reg, init_reg}; ADDR_STATUS: - begin - tmp_read_data = {28'h0000000, 2'b00, digest_valid_reg, ready_reg}; - end + tmp_read_data = {28'h0000000, 2'b00, digest_valid_reg, ready_reg}; ADDR_WORK_FACTOR_NUM: - begin - tmp_read_data = work_factor_num_reg; - end - - ADDR_BLOCK0: - begin - tmp_read_data = block0_reg; - end - - ADDR_BLOCK1: - begin - tmp_read_data = block1_reg; - end - - ADDR_BLOCK2: - begin - tmp_read_data = block2_reg; - end - - ADDR_BLOCK3: - begin - tmp_read_data = block3_reg; - end - - ADDR_BLOCK4: - begin - tmp_read_data = block4_reg; - end - - ADDR_BLOCK5: - begin - tmp_read_data = block5_reg; - end - - ADDR_BLOCK6: - begin - tmp_read_data = block6_reg; - end - - ADDR_BLOCK7: - begin - tmp_read_data = block7_reg; - end - - ADDR_BLOCK8: - begin - tmp_read_data = block8_reg; - end - - ADDR_BLOCK9: - begin - tmp_read_data = block9_reg; - end - - ADDR_BLOCK10: - begin - tmp_read_data = block10_reg; - end - - ADDR_BLOCK11: - begin - tmp_read_data = block11_reg; - end - - ADDR_BLOCK12: - begin - tmp_read_data = block12_reg; - end - - ADDR_BLOCK13: - begin - tmp_read_data = block13_reg; - end - - ADDR_BLOCK14: - begin - tmp_read_data = block14_reg; - end - - ADDR_BLOCK15: - begin - tmp_read_data = block15_reg; - end - - ADDR_BLOCK16: - begin - tmp_read_data = block16_reg; - end - - ADDR_BLOCK17: - begin - tmp_read_data = block17_reg; - end - - ADDR_BLOCK18: - begin - tmp_read_data = block18_reg; - end - - ADDR_BLOCK19: - begin - tmp_read_data = block19_reg; - end - - ADDR_BLOCK20: - begin - tmp_read_data = block20_reg; - end - - ADDR_BLOCK21: - begin - tmp_read_data = block21_reg; - end - - ADDR_BLOCK22: - begin - tmp_read_data = block22_reg; - end - - ADDR_BLOCK23: - begin - tmp_read_data = block23_reg; - end - - ADDR_BLOCK24: - begin - tmp_read_data = block24_reg; - end - - ADDR_BLOCK25: - begin - tmp_read_data = block25_reg; - end - - ADDR_BLOCK26: - begin - tmp_read_data = block26_reg; - end - - ADDR_BLOCK27: - begin - tmp_read_data = block27_reg; - end - - ADDR_BLOCK28: - begin - tmp_read_data = block28_reg; - end - - ADDR_BLOCK29: - begin - tmp_read_data = block29_reg; - end - - ADDR_BLOCK30: - begin - tmp_read_data = block30_reg; - end - - ADDR_BLOCK31: - begin - tmp_read_data = block31_reg; - end - - ADDR_DIGEST0: - begin - tmp_read_data = digest_reg[511 : 480]; - end - - ADDR_DIGEST1: - begin - tmp_read_data = digest_reg[479 : 448]; - end - - ADDR_DIGEST2: - begin - tmp_read_data = digest_reg[447 : 416]; - end - - ADDR_DIGEST3: - begin - tmp_read_data = digest_reg[415 : 384]; - end - - ADDR_DIGEST4: - begin - tmp_read_data = digest_reg[383 : 352]; - end - - ADDR_DIGEST5: - begin - tmp_read_data = digest_reg[351 : 320]; - end - - ADDR_DIGEST6: - begin - tmp_read_data = digest_reg[319 : 288]; - end - - ADDR_DIGEST7: - begin - tmp_read_data = digest_reg[287 : 256]; - end - - ADDR_DIGEST8: - begin - tmp_read_data = digest_reg[255 : 224]; - end - - ADDR_DIGEST9: - begin - tmp_read_data = digest_reg[223 : 192]; - end - - ADDR_DIGEST10: - begin - tmp_read_data = digest_reg[191 : 160]; - end - - ADDR_DIGEST11: - begin - tmp_read_data = digest_reg[159 : 128]; - end - - ADDR_DIGEST12: - begin - tmp_read_data = digest_reg[127 : 96]; - end - - ADDR_DIGEST13: - begin - tmp_read_data = digest_reg[95 : 64]; - end - - ADDR_DIGEST14: - begin - tmp_read_data = digest_reg[63 : 32]; - end - - ADDR_DIGEST15: - begin - tmp_read_data = digest_reg[31 : 0]; - end + tmp_read_data = work_factor_num_reg; default: - begin - tmp_error = 1; - end + tmp_error = 1; endcase // case (address) end end diff --git a/src/rtl/sha512_k_constants.v b/src/rtl/sha512_k_constants.v index c892f4c..934aeef 100644 --- a/src/rtl/sha512_k_constants.v +++ b/src/rtl/sha512_k_constants.v @@ -8,7 +8,7 @@ // Author: Joachim Strombergson // Copyright (c) 2014, NORDUnet A/S // All rights reserved. -// +// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -52,418 +52,97 @@ module sha512_k_constants( // Concurrent connectivity for ports etc. //---------------------------------------------------------------- assign K = tmp_K; - - + + //---------------------------------------------------------------- // addr_mux //---------------------------------------------------------------- always @* begin : addr_mux case(addr) - 0: - begin - tmp_K = 64'h428a2f98d728ae22; - end - - 1: - begin - tmp_K = 64'h7137449123ef65cd; - end - - 2: - begin - tmp_K = 64'hb5c0fbcfec4d3b2f; - end - - 3: - begin - tmp_K = 64'he9b5dba58189dbbc; - end - - 4: - begin - tmp_K = 64'h3956c25bf348b538; - end - - 5: - begin - tmp_K = 64'h59f111f1b605d019; - end - - 6: - begin - tmp_K = 64'h923f82a4af194f9b; - end - - 7: - begin - tmp_K = 64'hab1c5ed5da6d8118; - end - - 8: - begin - tmp_K = 64'hd807aa98a3030242; - end - - 9: - begin - tmp_K = 64'h12835b0145706fbe; - end - - 10: - begin - tmp_K = 64'h243185be4ee4b28c; - end - - 11: - begin - tmp_K = 64'h550c7dc3d5ffb4e2; - end - - 12: - begin - tmp_K = 64'h72be5d74f27b896f; - end - - 13: - begin - tmp_K = 64'h80deb1fe3b1696b1; - end - - 14: - begin - tmp_K = 64'h9bdc06a725c71235; - end - - 15: - begin - tmp_K = 64'hc19bf174cf692694; - end - - 16: - begin - tmp_K = 64'he49b69c19ef14ad2; - end - - 17: - begin - tmp_K = 64'hefbe4786384f25e3; - end - - 18: - begin - tmp_K = 64'h0fc19dc68b8cd5b5; - end - - 19: - begin - tmp_K = 64'h240ca1cc77ac9c65; - end - - 20: - begin - tmp_K = 64'h2de92c6f592b0275; - end - - 21: - begin - tmp_K = 64'h4a7484aa6ea6e483; - end - - 22: - begin - tmp_K = 64'h5cb0a9dcbd41fbd4; - end - - 23: - begin - tmp_K = 64'h76f988da831153b5; - end - - 24: - begin - tmp_K = 64'h983e5152ee66dfab; - end - - 25: - begin - tmp_K = 64'ha831c66d2db43210; - end - - 26: - begin - tmp_K = 64'hb00327c898fb213f; - end - - 27: - begin - tmp_K = 64'hbf597fc7beef0ee4; - end - - 28: - begin - tmp_K = 64'hc6e00bf33da88fc2; - end - - 29: - begin - tmp_K = 64'hd5a79147930aa725; - end - - 30: - begin - tmp_K = 64'h06ca6351e003826f; - end - - 31: - begin - tmp_K = 64'h142929670a0e6e70; - end - - 32: - begin - tmp_K = 64'h27b70a8546d22ffc; - end - - 33: - begin - tmp_K = 64'h2e1b21385c26c926; - end - - 34: - begin - tmp_K = 64'h4d2c6dfc5ac42aed; - end - - 35: - begin - tmp_K = 64'h53380d139d95b3df; - end - - 36: - begin - tmp_K = 64'h650a73548baf63de; - end - - 37: - begin - tmp_K = 64'h766a0abb3c77b2a8; - end - - 38: - begin - tmp_K = 64'h81c2c92e47edaee6; - end - - 39: - begin - tmp_K = 64'h92722c851482353b; - end - - 40: - begin - tmp_K = 64'ha2bfe8a14cf10364; - end - - 41: - begin - tmp_K = 64'ha81a664bbc423001; - end - - 42: - begin - tmp_K = 64'hc24b8b70d0f89791; - end - - 43: - begin - tmp_K = 64'hc76c51a30654be30; - end - - 44: - begin - tmp_K = 64'hd192e819d6ef5218; - end - - 45: - begin - tmp_K = 64'hd69906245565a910; - end - - 46: - begin - tmp_K = 64'hf40e35855771202a; - end - - 47: - begin - tmp_K = 64'h106aa07032bbd1b8; - end - - 48: - begin - tmp_K = 64'h19a4c116b8d2d0c8; - end - - 49: - begin - tmp_K = 64'h1e376c085141ab53; - end - - 50: - begin - tmp_K = 64'h2748774cdf8eeb99; - end - - 51: - begin - tmp_K = 64'h34b0bcb5e19b48a8; - end - - 52: - begin - tmp_K = 64'h391c0cb3c5c95a63; - end - - 53: - begin - tmp_K = 64'h4ed8aa4ae3418acb; - end - - 54: - begin - tmp_K = 64'h5b9cca4f7763e373; - end - - 55: - begin - tmp_K = 64'h682e6ff3d6b2b8a3; - end - - 56: - begin - tmp_K = 64'h748f82ee5defb2fc; - end - - 57: - begin - tmp_K = 64'h78a5636f43172f60; - end - - 58: - begin - tmp_K = 64'h84c87814a1f0ab72; - end - - 59: - begin - tmp_K = 64'h8cc702081a6439ec; - end - - 60: - begin - tmp_K = 64'h90befffa23631e28; - end - - 61: - begin - tmp_K = 64'ha4506cebde82bde9; - end - - 62: - begin - tmp_K = 64'hbef9a3f7b2c67915; - end - - 63: - begin - tmp_K = 64'hc67178f2e372532b; - end - - 64: - begin - tmp_K = 64'hca273eceea26619c; - end - - 65: - begin - tmp_K = 64'hd186b8c721c0c207; - end - - 66: - begin - tmp_K = 64'heada7dd6cde0eb1e; - end - - 67: - begin - tmp_K = 64'hf57d4f7fee6ed178; - end - - 68: - begin - tmp_K = 64'h06f067aa72176fba; - end - - 69: - begin - tmp_K = 64'h0a637dc5a2c898a6; - end - - 70: - begin - tmp_K = 64'h113f9804bef90dae; - end - - 71: - begin - tmp_K = 64'h1b710b35131c471b; - end - - 72: - begin - tmp_K = 64'h28db77f523047d84; - end - - 73: - begin - tmp_K = 64'h32caab7b40c72493; - end - - 74: - begin - tmp_K = 64'h3c9ebe0a15c9bebc; - end - - 75: - begin - tmp_K = 64'h431d67c49c100d4c; - end - - 76: - begin - tmp_K = 64'h4cc5d4becb3e42b6; - end - - 77: - begin - tmp_K = 64'h597f299cfc657e2a; - end - - 78: - begin - tmp_K = 64'h5fcb6fab3ad6faec; - end - - 79: - begin - tmp_K = 64'h6c44198c4a475817; - end + 0: tmp_K = 64'h428a2f98d728ae22; + 1: tmp_K = 64'h7137449123ef65cd; + 2: tmp_K = 64'hb5c0fbcfec4d3b2f; + 3: tmp_K = 64'he9b5dba58189dbbc; + 4: tmp_K = 64'h3956c25bf348b538; + 5: tmp_K = 64'h59f111f1b605d019; + 6: tmp_K = 64'h923f82a4af194f9b; + 7: tmp_K = 64'hab1c5ed5da6d8118; + 8: tmp_K = 64'hd807aa98a3030242; + 9: tmp_K = 64'h12835b0145706fbe; + 10: tmp_K = 64'h243185be4ee4b28c; + 11: tmp_K = 64'h550c7dc3d5ffb4e2; + 12: tmp_K = 64'h72be5d74f27b896f; + 13: tmp_K = 64'h80deb1fe3b1696b1; + 14: tmp_K = 64'h9bdc06a725c71235; + 15: tmp_K = 64'hc19bf174cf692694; + 16: tmp_K = 64'he49b69c19ef14ad2; + 17: tmp_K = 64'hefbe4786384f25e3; + 18: tmp_K = 64'h0fc19dc68b8cd5b5; + 19: tmp_K = 64'h240ca1cc77ac9c65; + 20: tmp_K = 64'h2de92c6f592b0275; + 21: tmp_K = 64'h4a7484aa6ea6e483; + 22: tmp_K = 64'h5cb0a9dcbd41fbd4; + 23: tmp_K = 64'h76f988da831153b5; + 24: tmp_K = 64'h983e5152ee66dfab; + 25: tmp_K = 64'ha831c66d2db43210; + 26: tmp_K = 64'hb00327c898fb213f; + 27: tmp_K = 64'hbf597fc7beef0ee4; + 28: tmp_K = 64'hc6e00bf33da88fc2; + 29: tmp_K = 64'hd5a79147930aa725; + 30: tmp_K = 64'h06ca6351e003826f; + 31: tmp_K = 64'h142929670a0e6e70; + 32: tmp_K = 64'h27b70a8546d22ffc; + 33: tmp_K = 64'h2e1b21385c26c926; + 34: tmp_K = 64'h4d2c6dfc5ac42aed; + 35: tmp_K = 64'h53380d139d95b3df; + 36: tmp_K = 64'h650a73548baf63de; + 37: tmp_K = 64'h766a0abb3c77b2a8; + 38: tmp_K = 64'h81c2c92e47edaee6; + 39: tmp_K = 64'h92722c851482353b; + 40: tmp_K = 64'ha2bfe8a14cf10364; + 41: tmp_K = 64'ha81a664bbc423001; + 42: tmp_K = 64'hc24b8b70d0f89791; + 43: tmp_K = 64'hc76c51a30654be30; + 44: tmp_K = 64'hd192e819d6ef5218; + 45: tmp_K = 64'hd69906245565a910; + 46: tmp_K = 64'hf40e35855771202a; + 47: tmp_K = 64'h106aa07032bbd1b8; + 48: tmp_K = 64'h19a4c116b8d2d0c8; + 49: tmp_K = 64'h1e376c085141ab53; + 50: tmp_K = 64'h2748774cdf8eeb99; + 51: tmp_K = 64'h34b0bcb5e19b48a8; + 52: tmp_K = 64'h391c0cb3c5c95a63; + 53: tmp_K = 64'h4ed8aa4ae3418acb; + 54: tmp_K = 64'h5b9cca4f7763e373; + 55: tmp_K = 64'h682e6ff3d6b2b8a3; + 56: tmp_K = 64'h748f82ee5defb2fc; + 57: tmp_K = 64'h78a5636f43172f60; + 58: tmp_K = 64'h84c87814a1f0ab72; + 59: tmp_K = 64'h8cc702081a6439ec; + 60: tmp_K = 64'h90befffa23631e28; + 61: tmp_K = 64'ha4506cebde82bde9; + 62: tmp_K = 64'hbef9a3f7b2c67915; + 63: tmp_K = 64'hc67178f2e372532b; + 64: tmp_K = 64'hca273eceea26619c; + 65: tmp_K = 64'hd186b8c721c0c207; + 66: tmp_K = 64'heada7dd6cde0eb1e; + 67: tmp_K = 64'hf57d4f7fee6ed178; + 68: tmp_K = 64'h06f067aa72176fba; + 69: tmp_K = 64'h0a637dc5a2c898a6; + 70: tmp_K = 64'h113f9804bef90dae; + 71: tmp_K = 64'h1b710b35131c471b; + 72: tmp_K = 64'h28db77f523047d84; + 73: tmp_K = 64'h32caab7b40c72493; + 74: tmp_K = 64'h3c9ebe0a15c9bebc; + 75: tmp_K = 64'h431d67c49c100d4c; + 76: tmp_K = 64'h4cc5d4becb3e42b6; + 77: tmp_K = 64'h597f299cfc657e2a; + 78: tmp_K = 64'h5fcb6fab3ad6faec; + 79: tmp_K = 64'h6c44198c4a475817; default: - begin - tmp_K = 64'h0000000000000000; - end + tmp_K = 64'h0000000000000000; endcase // case (addr) end // block: addr_mux endmodule // sha512_k_constants diff --git a/src/tb/tb_sha512.v b/src/tb/tb_sha512.v index 8bc0068..72a50ae 100644 --- a/src/tb/tb_sha512.v +++ b/src/tb/tb_sha512.v @@ -218,25 +218,28 @@ module tb_sha512(); $display("Message block:"); $display("block0 = 0x%08x, block1 = 0x%08x, block2 = 0x%08x, block3 = 0x%08x", - dut.block0_reg, dut.block1_reg, dut.block2_reg, dut.block3_reg); + dut.block_reg[0], dut.block_reg[1], dut.block_reg[2], dut.block_reg[3]); + $display("block4 = 0x%08x, block5 = 0x%08x, block6 = 0x%08x, block7 = 0x%08x", - dut.block4_reg, dut.block5_reg, dut.block6_reg, dut.block7_reg); + dut.block_reg[4], dut.block_reg[5], dut.block_reg[6], dut.block_reg[7]); $display("block8 = 0x%08x, block9 = 0x%08x, block10 = 0x%08x, block11 = 0x%08x", - dut.block8_reg, dut.block9_reg, dut.block10_reg, dut.block11_reg); + dut.block_reg[8], dut.block_reg[9], dut.block_reg[10], dut.block_reg[11]); + $display("block12 = 0x%08x, block13 = 0x%08x, block14 = 0x%08x, block15 = 0x%08x", - dut.block12_reg, dut.block13_reg, dut.block14_reg, dut.block15_reg); + dut.block_reg[12], dut.block_reg[13], dut.block_reg[14], dut.block_reg[15]); $display("block16 = 0x%08x, block17 = 0x%08x, block18 = 0x%08x, block19 = 0x%08x", - dut.block16_reg, dut.block17_reg, dut.block18_reg, dut.block19_reg); + dut.block_reg[16], dut.block_reg[17], dut.block_reg[18], dut.block_reg[19]); + $display("block20 = 0x%08x, block21 = 0x%08x, block22 = 0x%08x, block23 = 0x%08x", - dut.block20_reg, dut.block21_reg, dut.block22_reg, dut.block23_reg); + dut.block_reg[20], dut.block_reg[21], dut.block_reg[22], dut.block_reg[23]); $display("block24 = 0x%08x, block25 = 0x%08x, block26 = 0x%08x, block27 = 0x%08x", - dut.block24_reg, dut.block25_reg, dut.block26_reg, dut.block27_reg); - $display("block28 = 0x%08x, block29 = 0x%08x, block30 = 0x%08x, block31 = 0x%08x", - dut.block28_reg, dut.block29_reg, dut.block30_reg, dut.block31_reg); + dut.block_reg[24], dut.block_reg[25], dut.block_reg[26], dut.block_reg[27]); + $display("block28 = 0x%08x, block29 = 0x%08x, block30 = 0x%08x, block31 = 0x%08x", + dut.block_reg[28], dut.block_reg[29], dut.block_reg[30], dut.block_reg[31]); $display(""); $display("Digest:"); |