diff options
Diffstat (limited to 'src/rtl/sha256.v')
-rw-r--r-- | src/rtl/sha256.v | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/src/rtl/sha256.v b/src/rtl/sha256.v index 1f9e75e..17fcd84 100644 --- a/src/rtl/sha256.v +++ b/src/rtl/sha256.v @@ -64,6 +64,7 @@ module sha256( localparam ADDR_CTRL = 8'h08; localparam CTRL_INIT_BIT = 0; localparam CTRL_NEXT_BIT = 1; + localparam CTRL_MODE_BIT = 2; localparam ADDR_STATUS = 8'h09; localparam STATUS_READY_BIT = 0; @@ -97,7 +98,10 @@ module sha256( localparam CORE_NAME0 = 32'h73686132; // "sha2" localparam CORE_NAME1 = 32'h2d323536; // "-256" - localparam CORE_VERSION = 32'h302e3831; // "0.81" + localparam CORE_VERSION = 32'h312e3830; // "1.80" + + localparam MODE_SHA_224 = 1'h0; + localparam MODE_SHA_256 = 1'h1; //---------------------------------------------------------------- @@ -113,6 +117,10 @@ module sha256( reg next_we; reg next_set; + reg mode_reg; + reg mode_new; + reg mode_we; + reg ready_reg; reg [31 : 0] block0_reg; @@ -201,6 +209,7 @@ module sha256( .init(core_init), .next(core_next), + .mode(mode_reg), .block(core_block), @@ -235,6 +244,7 @@ module sha256( begin init_reg <= 0; next_reg <= 0; + mode_reg <= MODE_SHA_256; ready_reg <= 0; digest_reg <= 256'h0; digest_valid_reg <= 0; @@ -270,6 +280,9 @@ module sha256( next_reg <= next_new; end + if (mode_we) + mode_reg <= mode_new; + if (core_digest_valid) begin digest_reg <= core_digest; @@ -405,6 +418,8 @@ module sha256( begin : api_logic init_set = 0; next_set = 0; + mode_new = 0; + mode_we = 0; block0_we = 0; block1_we = 0; block2_we = 0; @@ -443,6 +458,8 @@ module sha256( begin init_set = write_data[CTRL_INIT_BIT]; next_set = write_data[CTRL_NEXT_BIT]; + mode_new = write_data[CTRL_MODE_BIT]; + mode_we = 1; end ADDR_BLOCK0: @@ -538,10 +555,10 @@ module sha256( tmp_read_data = CORE_VERSION; ADDR_CTRL: - tmp_read_data = {28'h0000000, 2'b00, next_reg, init_reg}; + tmp_read_data = {29'h0, mode_reg, next_reg, init_reg}; ADDR_STATUS: - tmp_read_data = {28'h0000000, 2'b00, digest_valid_reg, ready_reg}; + tmp_read_data = {30'h0, digest_valid_reg, ready_reg}; ADDR_BLOCK0: tmp_read_data = block0_reg; |