aboutsummaryrefslogtreecommitdiff
path: root/core_selector/src/rtl/math_selector.v
diff options
context:
space:
mode:
Diffstat (limited to 'core_selector/src/rtl/math_selector.v')
-rw-r--r--core_selector/src/rtl/math_selector.v88
1 files changed, 70 insertions, 18 deletions
diff --git a/core_selector/src/rtl/math_selector.v b/core_selector/src/rtl/math_selector.v
index 3c29554..93fc8d2 100644
--- a/core_selector/src/rtl/math_selector.v
+++ b/core_selector/src/rtl/math_selector.v
@@ -54,24 +54,76 @@ module math_selector
);
- //
- // Output Register
- //
- reg [31: 0] tmp_read_data;
- assign sys_read_data = tmp_read_data;
-
-
- modexp modexp_inst(
- .clk(sys_clk),
- .reset_n(~sys_rst),
- .cs(sys_ena),
- .we(sys_eim_wr),
- .address(sys_eim_addr[11 : 0]),
- .write_data(sys_write_data),
- .read_data(sys_read_data)
- );
-
-endmodule // math_selector
+ //----------------------------------------------------------------
+ // Address Decoder
+ //----------------------------------------------------------------
+ // upper 6 bits specify core being addressed
+ wire [ 5: 0] addr_core_num = sys_eim_addr[13: 8];
+ // lower 8 bits specify register offset in core
+ wire [ 7: 0] addr_core_reg = sys_eim_addr[ 7: 0];
+
+
+ //----------------------------------------------------------------
+ // List of Available Cores
+ //----------------------------------------------------------------
+ // Comment following lines to exclude cores from implementation.
+ `define USE_CORE_MODEXP
+
+
+ //----------------------------------------------------------------
+ // Core Address Table
+ //----------------------------------------------------------------
+ localparam CORE_ADDR_MODEXP = 6'd0;
+ localparam CORE_ADDR_MODEXP_MODULUS = 6'd1;
+ localparam CORE_ADDR_MODEXP_EXPONENT = 6'd2;
+ localparam CORE_ADDR_MODEXP_MESSAGE = 6'd3;
+ localparam CORE_ADDR_MODEXP_RESULT = 6'd4;
+
+
+ //----------------------------------------------------------------
+ // MODEXP
+ //----------------------------------------------------------------
+ `ifdef USE_CORE_MODEXP
+ wire enable_modexp = sys_ena && (addr_core_num >= CORE_ADDR_MODEXP) && (addr_core_num <= CORE_ADDR_MODEXP_RESULT);
+ wire [31: 0] read_data_modexp;
+
+ modexp modexp_inst
+ (
+ .clk(sys_clk),
+ .reset_n(~sys_rst),
+
+ .cs(enable_modexp & (sys_eim_rd | sys_eim_wr)),
+ .we(sys_eim_wr),
+
+ .address(addr_core_reg),
+ .write_data(sys_write_data),
+ .read_data(read_data_modexp)
+ );
+ `endif
+
+
+ //----------------------------------------------------------------
+ // Output (Read Data) Multiplexor
+ //----------------------------------------------------------------
+ reg [31: 0] sys_read_data_mux;
+ assign sys_read_data = sys_read_data_mux;
+
+ always @*
+ //
+ `ifdef USE_CORE_MODEXP
+ if ((addr_core_num >= CORE_ADDR_MODEXP) && (addr_core_num <= CORE_ADDR_MODEXP_RESULT))
+ begin
+ sys_read_data_mux = read_data_modexp;
+ end
+ else
+ `endif
+ //
+ begin
+ sys_read_data_mux = {32{1'b0}};
+ end
+
+
+endmodule
//======================================================================
// EOF math_selector.v