diff options
author | Joachim StroĢmbergson <joachim@secworks.se> | 2014-10-02 14:21:04 +0200 |
---|---|---|
committer | Joachim StroĢmbergson <joachim@secworks.se> | 2014-10-02 14:21:04 +0200 |
commit | 17d72a7d0acef8fdff2ec6e177854728722e6546 (patch) | |
tree | 14172d27a34f81449ee945e1658b588dbedbd768 /src/rtl/trng_mixer.v | |
parent | 821471932eb48bb39a820fc6680355231e6093fa (diff) |
Updating trng to debugged version.
Diffstat (limited to 'src/rtl/trng_mixer.v')
-rw-r--r-- | src/rtl/trng_mixer.v | 157 |
1 files changed, 134 insertions, 23 deletions
diff --git a/src/rtl/trng_mixer.v b/src/rtl/trng_mixer.v index d11050c..821601b 100644 --- a/src/rtl/trng_mixer.v +++ b/src/rtl/trng_mixer.v @@ -49,6 +49,7 @@ module trng_mixer( input wire discard, input wire test_mode, + output wire security_error, input wire more_seed, @@ -81,13 +82,6 @@ module trng_mixer( //---------------------------------------------------------------- parameter MODE_SHA_512 = 2'h3; - parameter CTRL_IDLE = 4'h0; - parameter CTRL_COLLECT = 4'h1; - parameter CTRL_MIX = 4'h2; - parameter CTRL_SYN = 4'h3; - parameter CTRL_ACK = 4'h4; - parameter CTRL_NEXT = 4'h5; - parameter ENTROPY_IDLE = 4'h0; parameter ENTROPY_SRC0 = 4'h1; parameter ENTROPY_SRC0_ACK = 4'h2; @@ -96,11 +90,20 @@ module trng_mixer( parameter ENTROPY_SRC2 = 4'h5; parameter ENTROPY_SRC2_ACK = 4'h6; + parameter CTRL_IDLE = 4'h0; + parameter CTRL_COLLECT = 4'h1; + parameter CTRL_MIX = 4'h2; + parameter CTRL_SYN = 4'h3; + parameter CTRL_ACK = 4'h4; + parameter CTRL_NEXT = 4'h5; + parameter ADDR_MIXER_CTRL = 8'h10; parameter MIXER_CTRL_ENABLE_BIT = 0; parameter MIXER_CTRL_RESTART_BIT = 1; - parameter ADDR_MIXER_STATUS = 8'h11; + parameter ADDR_MIXER_TIMEOUT = 8'h20; + + parameter DEFAULT_ENTROPY_TIMEOUT = 24'h800000; //---------------------------------------------------------------- @@ -181,6 +184,17 @@ module trng_mixer( reg [3 : 0] entropy_collect_ctrl_new; reg entropy_collect_ctrl_we; + reg [23 : 0] entropy_timeout_ctr_reg; + reg [23 : 0] entropy_timeout_ctr_new; + reg entropy_timeout_ctr_inc; + reg entropy_timeout_ctr_rst; + reg entropy_timeout_ctr_we; + reg entropy_timeout; + + reg [23 : 0] entropy_timeout_reg; + reg [23 : 0] entropy_timeout_new; + reg entropy_timeout_we; + reg [3 : 0] mixer_ctrl_reg; reg [3 : 0] mixer_ctrl_new; reg mixer_ctrl_we; @@ -228,8 +242,9 @@ module trng_mixer( //---------------------------------------------------------------- // Concurrent connectivity for ports etc. //---------------------------------------------------------------- - assign read_data = tmp_read_data; - assign error = tmp_error; + assign read_data = tmp_read_data; + assign error = tmp_error; + assign security_error = 0; assign seed_syn = seed_syn_reg; assign seed_data = hash_digest; @@ -317,8 +332,10 @@ module trng_mixer( init_done_reg <= 0; word_ctr_reg <= 5'h00; seed_syn_reg <= 0; - enable_reg <= 0; + enable_reg <= 1; restart_reg <= 0; + entropy_timeout_reg <= DEFAULT_ENTROPY_TIMEOUT; + entropy_timeout_ctr_reg <= 24'h000000; entropy_collect_ctrl_reg <= CTRL_IDLE; mixer_ctrl_reg <= CTRL_IDLE; end @@ -515,6 +532,16 @@ module trng_mixer( begin mixer_ctrl_reg <= mixer_ctrl_new; end + + if (entropy_timeout_we) + begin + entropy_timeout_reg <= entropy_timeout_new; + end + + if (entropy_timeout_ctr_we) + begin + entropy_timeout_ctr_reg <= entropy_timeout_ctr_new; + end end end // reg_update @@ -524,12 +551,14 @@ module trng_mixer( //---------------------------------------------------------------- always @* begin : mixer_api_logic - enable_new = 0; - enable_we = 0; - restart_reg = 0; - restart_new = 0; - tmp_read_data = 32'h00000000; - tmp_error = 0; + enable_new = 0; + enable_we = 0; + restart_reg = 0; + restart_new = 0; + entropy_timeout_new = 24'h000000; + entropy_timeout_we = 0; + tmp_read_data = 32'h00000000; + tmp_error = 0; if (cs) begin @@ -545,6 +574,12 @@ module trng_mixer( restart_new = write_data[MIXER_CTRL_RESTART_BIT]; end + ADDR_MIXER_TIMEOUT: + begin + entropy_timeout_new = write_data[23 : 0]; + entropy_timeout_we = 1; + end + default: begin tmp_error = 1; @@ -559,12 +594,17 @@ module trng_mixer( // Read operations. ADDR_MIXER_CTRL: begin - tmp_read_data = {30'h00000000, restart_reg, enable_reg}; + tmp_read_data = {restart_reg, enable_reg}; end ADDR_MIXER_STATUS: begin + tmp_read_data = 32'h00000000; + end + ADDR_MIXER_TIMEOUT: + begin + tmp_read_data = entropy_timeout_reg; end default: @@ -594,6 +634,8 @@ module trng_mixer( update_block = 0; block_done = 0; muxed_entropy = 32'h00000000; + entropy_timeout_ctr_inc = 0; + entropy_timeout_ctr_rst = 0; entropy_collect_ctrl_new = ENTROPY_IDLE; entropy_collect_ctrl_we = 0; @@ -603,6 +645,7 @@ module trng_mixer( if (collect_block) begin word_ctr_rst = 1; + entropy_timeout_ctr_rst = 1; entropy_collect_ctrl_new = ENTROPY_SRC0; entropy_collect_ctrl_we = 1; end @@ -627,9 +670,21 @@ module trng_mixer( entropy_collect_ctrl_new = ENTROPY_SRC0_ACK; entropy_collect_ctrl_we = 1; end + else + if (entropy_timeout) + begin + entropy_timeout_ctr_rst = 1; + entropy_collect_ctrl_new = ENTROPY_SRC1; + entropy_collect_ctrl_we = 1; + end + else + begin + entropy_timeout_ctr_inc = 1; + end end else begin + entropy_timeout_ctr_rst = 1; entropy_collect_ctrl_new = ENTROPY_SRC1; entropy_collect_ctrl_we = 1; end @@ -682,6 +737,17 @@ module trng_mixer( entropy_collect_ctrl_new = ENTROPY_SRC1_ACK; entropy_collect_ctrl_we = 1; end + else + if (entropy_timeout) + begin + entropy_timeout_ctr_rst = 1; + entropy_collect_ctrl_new = ENTROPY_SRC2; + entropy_collect_ctrl_we = 1; + end + else + begin + entropy_timeout_ctr_inc = 1; + end end else begin @@ -736,6 +802,17 @@ module trng_mixer( entropy_collect_ctrl_new = ENTROPY_SRC2_ACK; entropy_collect_ctrl_we = 1; end + else + if (entropy_timeout) + begin + entropy_timeout_ctr_rst = 1; + entropy_collect_ctrl_new = ENTROPY_SRC0; + entropy_collect_ctrl_we = 1; + end + else + begin + entropy_timeout_ctr_inc = 1; + end end else begin @@ -854,6 +931,40 @@ module trng_mixer( //---------------------------------------------------------------- + // entropy_timeout_logic + // + // Logic that updates the entropy timeout counter and signals + // when the wait for antropy from a provider has exceeded + // acceptable time. + //---------------------------------------------------------------- + always @* + begin : entropy_timeout_logic + entropy_timeout_ctr_new = 24'h000000; + entropy_timeout_ctr_we = 0; + entropy_timeout = 0; + + if (entropy_timeout_ctr_reg == entropy_timeout_reg) + begin + entropy_timeout = 1; + entropy_timeout_ctr_new = 24'h000000; + entropy_timeout_ctr_we = 1; + end + + if (entropy_timeout_ctr_rst) + begin + entropy_timeout_ctr_new = 24'h000000; + entropy_timeout_ctr_we = 1; + end + + if (entropy_timeout_ctr_inc) + begin + entropy_timeout_ctr_new = entropy_timeout_ctr_reg + 1'b1; + entropy_timeout_ctr_we = 1; + end + end + + + //---------------------------------------------------------------- // word_ctr //---------------------------------------------------------------- always @* @@ -907,7 +1018,7 @@ module trng_mixer( CTRL_COLLECT: begin - if ((!discard)) + if ((discard)) begin mixer_ctrl_new = CTRL_IDLE; mixer_ctrl_we = 1; @@ -924,7 +1035,7 @@ module trng_mixer( CTRL_MIX: begin - if ((!discard)) + if ((discard)) begin mixer_ctrl_new = CTRL_IDLE; mixer_ctrl_we = 1; @@ -946,7 +1057,7 @@ module trng_mixer( CTRL_SYN: begin - if ((!discard)) + if ((discard)) begin mixer_ctrl_new = CTRL_IDLE; mixer_ctrl_we = 1; @@ -963,7 +1074,7 @@ module trng_mixer( CTRL_ACK: begin - if ((!discard)) + if ((discard)) begin mixer_ctrl_new = CTRL_IDLE; mixer_ctrl_we = 1; @@ -979,7 +1090,7 @@ module trng_mixer( CTRL_NEXT: begin - if ((!discard)) + if ((discard)) begin mixer_ctrl_new = CTRL_IDLE; mixer_ctrl_we = 1; |