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