aboutsummaryrefslogtreecommitdiff
path: root/src/rtl/trng.v
diff options
context:
space:
mode:
Diffstat (limited to 'src/rtl/trng.v')
-rw-r--r--src/rtl/trng.v80
1 files changed, 74 insertions, 6 deletions
diff --git a/src/rtl/trng.v b/src/rtl/trng.v
index 7d0e45d..e2b9212 100644
--- a/src/rtl/trng.v
+++ b/src/rtl/trng.v
@@ -82,11 +82,15 @@ module trng(
parameter ADDR_TRNG_STATUS = 8'h11;
parameter ADDR_DEBUG_CTRL = 8'h12;
+ parameter ADDR_DEBUG_DELAY = 8'h13;
parameter TRNG_NAME0 = 32'h74726e67; // "trng"
parameter TRNG_NAME1 = 32'h20202020; // " "
parameter TRNG_VERSION = 32'h302e3031; // "0.01"
+ // 20x/s @ 50 MHz.
+ parameter DEFAULT_DEBUG_DELAY = 32'h002625a0;
+
//----------------------------------------------------------------
// Registers including update variables and write enable.
@@ -98,10 +102,21 @@ module trng(
reg test_mode_new;
reg test_mode_we;
+ reg [7 : 0] debug_out_reg;
+ reg debug_out_we;
+
reg [2 : 0] debug_mux_reg;
reg [2 : 0] debug_mux_new;
reg [2 : 0] debug_mux_we;
+ reg [31 : 0] debug_delay_ctr_reg;
+ reg [31 : 0] debug_delay_ctr_new;
+ reg debug_delay_ctr_we;
+
+ reg [31 : 0] debug_delay_reg;
+ reg [31 : 0] debug_delay_new;
+ reg debug_delay_we;
+
//----------------------------------------------------------------
// Wires.
@@ -119,6 +134,7 @@ module trng(
reg mixer_api_we;
wire [31 : 0] mixer_api_read_data;
wire mixer_api_error;
+ wire mixer_security_error;
wire [7 : 0] mixer_debug;
reg mixer_debug_update;
@@ -130,6 +146,7 @@ module trng(
wire csprng_api_error;
wire [7 : 0] csprng_debug;
reg csprng_debug_update;
+ wire csprng_security_error;
wire entropy0_entropy_enabled;
wire [31 : 0] entropy0_entropy_data;
@@ -174,7 +191,7 @@ module trng(
assign read_data = tmp_read_data;
assign error = tmp_error;
assign security_error = entropy1_security_error | entropy2_security_error;
- assign debug = tmp_debug;
+ assign debug = debug_out_reg;
// Patches to get our first version to work.
assign entropy0_entropy_enabled = 0;
@@ -198,6 +215,7 @@ module trng(
.discard(discard_reg),
.test_mode(test_mode_reg),
+ .security_error(mixer_security_error),
.more_seed(csprng_more_seed),
@@ -237,6 +255,7 @@ module trng(
.discard(discard_reg),
.test_mode(test_mode_reg),
+ .security_error(csprng_security_error),
.more_seed(csprng_more_seed),
@@ -310,13 +329,22 @@ module trng(
begin
if (!reset_n)
begin
- discard_reg <= 0;
- test_mode_reg <= 0;
- debug_mux_reg <= DEBUG_ENTROPY1;
+ discard_reg <= 0;
+ test_mode_reg <= 0;
+ debug_mux_reg <= DEBUG_CSPRNG;
+ debug_delay_reg <= DEFAULT_DEBUG_DELAY;
+ debug_delay_ctr_reg <= 32'h00000000;
+ debug_out_reg <= 8'h00;
end
else
begin
- discard_reg <= discard_new;
+ discard_reg <= discard_new;
+ debug_delay_ctr_reg <= debug_delay_ctr_new;
+
+ if (debug_out_we)
+ begin
+ debug_out_reg <= tmp_debug;
+ end
if (test_mode_we)
begin
@@ -327,12 +355,40 @@ module trng(
begin
debug_mux_reg <= debug_mux_new;
end
+
+ if (debug_delay_we)
+ begin
+ debug_delay_reg <= debug_delay_new;
+ end
end
end // reg_update
//----------------------------------------------------------------
+ // debug_update_logic
+ //
+ // Debug update counter and update logic.
+ //----------------------------------------------------------------
+ always @*
+ begin : debug_update_logic
+ if (debug_delay_ctr_reg == debug_delay_reg)
+ begin
+ debug_out_we = 1;
+ debug_delay_ctr_new = 32'h00000000;
+ end
+ else
+ begin
+ debug_out_we = 0;
+ debug_delay_ctr_new = debug_delay_ctr_reg + 1'b1;
+ end
+ end // debug_update
+
+
+ //----------------------------------------------------------------
// debug_mux
+ //
+ // Select which of the sub modules that are connected to
+ // the debug port.
//----------------------------------------------------------------
always @*
begin : debug_mux
@@ -373,7 +429,6 @@ module trng(
end
endcase // case (debug_mux_reg)
-
end // debug_mux
@@ -467,6 +522,8 @@ module trng(
test_mode_we = 0;
debug_mux_new = 3'h0;
debug_mux_we = 0;
+ debug_delay_new = 32'h00000000;
+ debug_delay_we = 0;
trng_api_read_data = 32'h00000000;
trng_api_error = 0;
@@ -490,6 +547,12 @@ module trng(
debug_mux_we = 1;
end
+ ADDR_DEBUG_DELAY:
+ begin
+ debug_delay_new = write_data;
+ debug_delay_we = 1;
+ end
+
default:
begin
trng_api_error = 1;
@@ -531,6 +594,11 @@ module trng(
trng_api_read_data = debug_mux_new;
end
+ ADDR_DEBUG_DELAY:
+ begin
+ trng_api_read_data = debug_delay_reg;
+ end
+
default:
begin
trng_api_error = 1;