diff options
Diffstat (limited to 'core_selector/src/rtl/core_selector.v')
-rw-r--r-- | core_selector/src/rtl/core_selector.v | 219 |
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 //====================================================================== |