aboutsummaryrefslogtreecommitdiff
path: root/core_selector/src/rtl/core_selector.v
diff options
context:
space:
mode:
Diffstat (limited to 'core_selector/src/rtl/core_selector.v')
-rw-r--r--core_selector/src/rtl/core_selector.v219
1 files changed, 124 insertions, 95 deletions
diff --git a/core_selector/src/rtl/core_selector.v b/core_selector/src/rtl/core_selector.v
index a18717a..275089f 100644
--- a/core_selector/src/rtl/core_selector.v
+++ b/core_selector/src/rtl/core_selector.v
@@ -44,14 +44,14 @@ module core_selector
input wire sys_clk,
input wire sys_rst,
- input wire noise,
-
input wire [16: 0] sys_eim_addr,
input wire sys_eim_wr,
input wire sys_eim_rd,
output wire [31: 0] sys_read_data,
input wire [31: 0] sys_write_data,
+ output wire sys_error,
+ input wire noise,
output wire [7 : 0] debug
);
@@ -68,153 +68,182 @@ module core_selector
*/
//----------------------------------------------------------------
- // Segment Decoder
+ // Address Decoder
+ //----------------------------------------------------------------
+ // 3 upper bits are decoded here
+ wire [ 2: 0] addr_segment = sys_eim_addr[16:14];
+ // 14 lower bits are decoded in corresponding segment selectors
+ wire [13: 0] addr_segment_int = sys_eim_addr[13: 0];
+
+
+ //----------------------------------------------------------------
+ // List of Available Segments
+ //----------------------------------------------------------------
+ // Comment following lines to exclude segments from implementation.
+ `define USE_SEGMENT_GLOBALS
+ `define USE_SEGMENT_HASHES
+ `define USE_SEGMENT_RNGS
+// `define USE_SEGMENT_CIPHERS
+
+
+ //----------------------------------------------------------------
+ // Segment Address Table
//----------------------------------------------------------------
localparam SEGMENT_ADDR_GLOBALS = 3'd0;
localparam SEGMENT_ADDR_HASHES = 3'd1;
localparam SEGMENT_ADDR_RNGS = 3'd2;
localparam SEGMENT_ADDR_CIPHERS = 3'd3;
- wire [ 2: 0] addr_segment = sys_eim_addr[16:14]; // 3 upper bits are decoded here
- wire [13: 0] addr_segment_int = sys_eim_addr[13: 0]; // 14 lower bits are decoded individually
- // in corresponding segment selectors
-
- wire [31: 0] segment_globals_read_data; // data read from GLOBALS segment
- wire [31: 0] segment_hashes_read_data; // data read from HASHES segment
- wire [31: 0] segment_rngs_read_data; // data read from RNGS segment
- wire [31: 0] segment_ciphers_read_data; // data read from CIPHERS segment
-
- wire segment_enable_globals = (addr_segment == SEGMENT_ADDR_GLOBALS) ? 1'b1 : 1'b0; // GLOBALS segment is being addressed
- wire segment_enable_hashes = (addr_segment == SEGMENT_ADDR_HASHES) ? 1'b1 : 1'b0; // HASHES segment is being addressed
- wire segment_enable_rngs = (addr_segment == SEGMENT_ADDR_RNGS) ? 1'b1 : 1'b0; // RNGS segment is being addressed
- wire segment_enable_ciphers = (addr_segment == SEGMENT_ADDR_CIPHERS) ? 1'b1 : 1'b0; // CIPHERS segment is being addressed
-
-
- //----------------------------------------------------------------
- // Output (Read Data) Bus
- //----------------------------------------------------------------
- reg [31: 0] sys_read_data_reg;
- assign sys_read_data = sys_read_data_reg;
-
- always @*
- //
- case (addr_segment)
- SEGMENT_ADDR_GLOBALS: sys_read_data_reg = segment_globals_read_data;
- SEGMENT_ADDR_HASHES: sys_read_data_reg = segment_hashes_read_data;
- SEGMENT_ADDR_RNGS: sys_read_data_reg = segment_rngs_read_data;
- SEGMENT_ADDR_CIPHERS: sys_read_data_reg = segment_ciphers_read_data;
- default: sys_read_data_reg = {32{1'b0}};
- endcase
-
-
-
+
//----------------------------------------------------------------
- // GLOBAL Core Selector
- //
- // This selector is used to map core registers into
- // EIM address space and select which core to send EIM read and
- // write operations to.
+ // GLOBALS Segment
//----------------------------------------------------------------
+ `ifdef USE_SEGMENT_GLOBALS
+ wire segment_enable_globals = (addr_segment == SEGMENT_ADDR_GLOBALS) ? 1'b1 : 1'b0;
+ wire [31: 0] segment_globals_read_data;
+ wire segment_globals_error;
+
global_selector globals
(
.sys_clk(sys_clk),
.sys_rst(sys_rst),
+ .sys_ena(segment_enable_globals),
- .sys_ena(segment_enable_globals), // only enable active selector
-
- .sys_eim_addr(addr_segment_int), // we only connect 14 lower bits of address here,
- // because we have already decoded 3 upper bits earlier,
- // every segment can have its own address decoder.
+ .sys_eim_addr(addr_segment_int),
.sys_eim_wr(sys_eim_wr),
.sys_eim_rd(sys_eim_rd),
-
.sys_write_data(sys_write_data),
- .sys_read_data(segment_globals_read_data) // output from GLOBALS segment
+ .sys_read_data(segment_globals_read_data),
+ .sys_error(segment_globals_error)
);
-
-
+ `endif
+
+
//----------------------------------------------------------------
- // HASH Core Selector
- //
- // This selector is used to map core registers into
- // EIM address space and select which core to send EIM read and
- // write operations to.
+ // HASHES Segment
//----------------------------------------------------------------
+ `ifdef USE_SEGMENT_HASHES
+ wire segment_enable_hashes = (addr_segment == SEGMENT_ADDR_HASHES) ? 1'b1 : 1'b0;
+ wire [31: 0] segment_hashes_read_data;
+ wire segment_hashes_error;
+
hash_selector hashes
(
.sys_clk(sys_clk),
.sys_rst(sys_rst),
+ .sys_ena(segment_enable_hashes),
- .sys_ena(segment_enable_hashes), // only enable active selector
-
- .sys_eim_addr(addr_segment_int), // we only connect 14 lower bits of address here,
- // because we have already decoded 3 upper bits earlier,
- // every segment can have its own address decoder.
+ .sys_eim_addr(addr_segment_int),
.sys_eim_wr(sys_eim_wr),
.sys_eim_rd(sys_eim_rd),
-
.sys_write_data(sys_write_data),
- .sys_read_data(segment_hashes_read_data) // output from HASHES segment
+ .sys_read_data(segment_hashes_read_data),
+ .sys_error(segment_hashes_error)
);
-
-
+ `endif
+
+
//----------------------------------------------------------------
- // RNG Selector
- //
- // This selector is used to map random number generator registers into
- // EIM address space and select which RNG to send EIM read and
- // write operations to. So far there are no RNG cores.
+ // RNGS Segment
//----------------------------------------------------------------
+ `ifdef USE_SEGMENT_RNGS
+ wire segment_enable_rngs = (addr_segment == SEGMENT_ADDR_RNGS) ? 1'b1 : 1'b0;
+ wire [31: 0] segment_rngs_read_data;
+ wire segment_rngs_error;
+
rng_selector rngs
(
.sys_clk(sys_clk),
.sys_rst(sys_rst),
+ .sys_ena(segment_enable_rngs),
- .noise(noise),
-
- .sys_ena(segment_enable_rngs), // only enable active selector
-
- .sys_eim_addr(addr_segment_int), // we only connect 14 lower bits of address here,
- // because we have already decoded 3 upper bits earlier,
- // every segment can have its own address decoder.
+ .sys_eim_addr(addr_segment_int),
.sys_eim_wr(sys_eim_wr),
- .sys_eim_rd(sys_eim_rd),
-
+ .sys_eim_rd(sys_eim_rd),
.sys_write_data(sys_write_data),
- .sys_read_data(segment_rngs_read_data), // output from RNGS segment
+ .sys_read_data(segment_rngs_read_data),
+ .sys_error(segment_rngs_error),
+ .noise(noise), // only RNG segment uses these ports
.debug(debug)
);
-
-
+ `endif
+
+
//----------------------------------------------------------------
- // CIPHER Selector
- //
- // This selector is used to map cipher registers into
- // EIM address space and select which CIPHER to send EIM read and
- // write operations to. So far there are no CIPHER cores.
+ // CIPHERS Segment
//----------------------------------------------------------------
+ `ifdef USE_SEGMENT_CIPHERS
+ wire segment_enable_ciphers = (addr_segment == SEGMENT_ADDR_CIPHERS) ? 1'b1 : 1'b0;
+ wire [31: 0] segment_ciphers_read_data;
+ wire segment_ciphers_error;
+
cipher_selector ciphers
(
.sys_clk(sys_clk),
.sys_rst(sys_rst),
+ .sys_ena(segment_enable_ciphers),
- .sys_ena(segment_enable_ciphers), // only enable active selector
-
- .sys_eim_addr(addr_segment_int), // we only connect 14 lower bits of address here,
- // because we have already decoded 3 upper bits earlier,
- // every segment can have its own address decoder.
+ .sys_eim_addr(addr_segment_int),
.sys_eim_wr(sys_eim_wr),
- .sys_eim_rd(sys_eim_rd),
-
+ .sys_eim_rd(sys_eim_rd),
.sys_write_data(sys_write_data),
- .sys_read_data(segment_ciphers_read_data) // output from CIPHERS segment
+ .sys_read_data(segment_ciphers_read_data),
+ .sys_error(segment_ciphers_error)
);
+ `endif
+
+
+ //----------------------------------------------------------------
+ // Output (Read Data) Bus
+ //----------------------------------------------------------------
+ reg [31: 0] sys_read_data_reg;
+ assign sys_read_data = sys_read_data_reg;
+ reg sys_error_reg;
+ assign sys_error = sys_error_reg;
+ always @*
+ //
+ case (addr_segment)
+ `ifdef USE_SEGMENT_GLOBALS
+ SEGMENT_ADDR_GLOBALS:
+ begin
+ sys_read_data_reg = segment_globals_read_data;
+ sys_error_reg = segment_globals_error;
+ end
+ `endif
+ `ifdef USE_SEGMENT_HASHES
+ SEGMENT_ADDR_HASHES:
+ begin
+ sys_read_data_reg = segment_hashes_read_data;
+ sys_error_reg = segment_hashes_error;
+ end
+ `endif
+ `ifdef USE_SEGMENT_RNGS
+ SEGMENT_ADDR_RNGS:
+ begin
+ sys_read_data_reg = segment_rngs_read_data;
+ sys_error_reg = segment_rngs_error;
+ end
+ `endif
+ `ifdef USE_SEGMENT_CIPHERS
+ SEGMENT_ADDR_CIPHERS:
+ begin
+ sys_read_data_reg = segment_ciphers_read_data;
+ sys_error_reg = segment_ciphers_error;
+ end
+ `endif
+ default:
+ begin
+ sys_read_data_reg = {32{1'b0}};
+ sys_error_reg = 1;
+ end
+ endcase
+
endmodule
//======================================================================
-// EOF eim_memory.v
+// EOF core_selector.v
//======================================================================