aboutsummaryrefslogtreecommitdiff
path: root/src/rtl/trng_mixer.v
diff options
context:
space:
mode:
authorJoachim StroĢˆmbergson <joachim@secworks.se>2014-10-02 14:21:04 +0200
committerJoachim StroĢˆmbergson <joachim@secworks.se>2014-10-02 14:21:04 +0200
commit17d72a7d0acef8fdff2ec6e177854728722e6546 (patch)
tree14172d27a34f81449ee945e1658b588dbedbd768 /src/rtl/trng_mixer.v
parent821471932eb48bb39a820fc6680355231e6093fa (diff)
Updating trng to debugged version.
Diffstat (limited to 'src/rtl/trng_mixer.v')
-rw-r--r--src/rtl/trng_mixer.v157
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;