aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Selkirk <paul@psgd.org>2015-07-17 10:11:23 -0400
committerPaul Selkirk <paul@psgd.org>2015-07-17 10:11:23 -0400
commita8e0651bd3ae3a8e579547753cbb51dc0b87525c (patch)
treef0f80ce20783bbdd8c6df1ee1818f0f7c5f7922f
parentf05a3c65ec65004b097cb63d5ac6d463a7a9dc2f (diff)
experimental modexps6 (which requires changing the read timing on all other cores)
-rw-r--r--core_selector/src/rtl/core_selector.v28
-rw-r--r--core_selector/src/rtl/math_selector.v55
2 files changed, 53 insertions, 30 deletions
diff --git a/core_selector/src/rtl/core_selector.v b/core_selector/src/rtl/core_selector.v
index 79c1fa4..34068a5 100644
--- a/core_selector/src/rtl/core_selector.v
+++ b/core_selector/src/rtl/core_selector.v
@@ -118,6 +118,11 @@ module core_selector
.sys_read_data(segment_globals_read_data),
.sys_error(segment_globals_error)
);
+
+ reg [31: 0] segment_globals_read_data_reg;
+ always @(posedge sys_clk)
+ segment_globals_read_data_reg <= segment_globals_read_data;
+
`endif
@@ -142,6 +147,11 @@ module core_selector
.sys_read_data(segment_hashes_read_data),
.sys_error(segment_hashes_error)
);
+
+ reg [31: 0] segment_hashes_read_data_reg;
+ always @(posedge sys_clk)
+ segment_hashes_read_data_reg <= segment_hashes_read_data;
+
`endif
@@ -170,6 +180,11 @@ module core_selector
.noise(noise), // only RNG segment uses these ports
.debug(segment_rngs_debug)
);
+
+ reg [31: 0] segment_rngs_read_data_reg;
+ always @(posedge sys_clk)
+ segment_rngs_read_data_reg <= segment_rngs_read_data;
+
`endif
@@ -193,6 +208,11 @@ module core_selector
.sys_read_data(segment_ciphers_read_data),
.sys_error(segment_ciphers_error)
);
+
+ reg [31: 0] segment_ciphers_read_data_reg;
+ always @(posedge sys_clk)
+ segment_ciphers_read_data_reg <= segment_ciphers_read_data;
+
`endif
@@ -240,21 +260,21 @@ module core_selector
`ifdef USE_SEGMENT_GLOBALS
SEGMENT_ADDR_GLOBALS:
begin
- sys_read_data_reg = segment_globals_read_data;
+ sys_read_data_reg = segment_globals_read_data_reg;
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_read_data_reg = segment_hashes_read_data_reg;
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_read_data_reg = segment_rngs_read_data_reg;
sys_error_reg = segment_rngs_error;
sys_debug = segment_rngs_debug;
end
@@ -262,7 +282,7 @@ module core_selector
`ifdef USE_SEGMENT_CIPHERS
SEGMENT_ADDR_CIPHERS:
begin
- sys_read_data_reg = segment_ciphers_read_data;
+ sys_read_data_reg = segment_ciphers_read_data_reg;
sys_error_reg = segment_ciphers_error;
end
`endif
diff --git a/core_selector/src/rtl/math_selector.v b/core_selector/src/rtl/math_selector.v
index b47a433..833ffbf 100644
--- a/core_selector/src/rtl/math_selector.v
+++ b/core_selector/src/rtl/math_selector.v
@@ -55,49 +55,52 @@ module math_selector
//----------------------------------------------------------------
- // Address Decoder
+ // List of Available Cores
//----------------------------------------------------------------
- // upper 2 bits specify core being addressed
- wire [ 1: 0] core_select = sys_eim_addr[13: 12];
- // lower 12 bits specify addresses within the selected core.
- wire [11: 0] core_addr = sys_eim_addr[11: 0];
+ // Comment following lines to exclude cores from implementation.
+ `define USE_CORE_MODEXPS6
//----------------------------------------------------------------
- // List of Available Cores
+ // Address Decoder
//----------------------------------------------------------------
- // Comment following lines to exclude cores from implementation.
- `define USE_CORE_MODEXP
+`ifdef USE_CORE_MODEXPS6
+ // upper 4 bits specify core being addressed
+ wire [ 3: 0] addr_core_num = sys_eim_addr[13:10];
+ // lower 10 bits specify register offset in core
+ wire [ 9: 0] addr_core_reg = sys_eim_addr[ 9: 0];
+`endif
//----------------------------------------------------------------
// Core Address Table
//----------------------------------------------------------------
- localparam CORE_MODEXP = 2'd0;
+ `ifdef USE_CORE_MODEXPS6
+ localparam CORE_ADDR_MODEXPS6 = 4'd0;
+ `endif
//----------------------------------------------------------------
- // MODEXP
+ // ModExpS6
//----------------------------------------------------------------
- `ifdef USE_CORE_MODEXP
- wire enable_modexp = sys_ena && (core_select == CORE_MODEXP);
- wire [31: 0] read_data_modexp;
-
- modexp modexp_inst
+ `ifdef USE_CORE_MODEXPS6
+ wire [31: 0] read_data_modexps6;
+ wire enable_modexps6 = sys_ena && (addr_core_num == CORE_ADDR_MODEXPS6);
+ modexps6_wrapper modexps6_inst
(
.clk(sys_clk),
- .reset_n(~sys_rst),
+ .rst(sys_rst),
- .cs(enable_modexp & (sys_eim_rd | sys_eim_wr)),
+ .cs(enable_modexps6 & (sys_eim_rd | sys_eim_wr)),
.we(sys_eim_wr),
- .address(core_addr),
+ .address(addr_core_reg),
.write_data(sys_write_data),
- .read_data(read_data_modexp)
+ .read_data(read_data_modexps6)
);
`endif
-
-
+
+
//----------------------------------------------------------------
// Output (Read Data) Multiplexor
//----------------------------------------------------------------
@@ -106,11 +109,11 @@ module math_selector
always @*
//
- `ifdef USE_CORE_MODEXP
- if (core_select == CORE_MODEXP)
- begin
- sys_read_data_mux = read_data_modexp;
- end
+ `ifdef USE_CORE_MODEXPS6
+ if (addr_core_num == CORE_ADDR_MODEXPS6)
+ begin
+ sys_read_data_mux = read_data_modexps6;
+ end
else
`endif
//