aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rtl/sha512.v1041
-rw-r--r--src/rtl/sha512_k_constants.v489
-rw-r--r--src/tb/tb_sha512.v21
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:");