// A2 Core Bridge // adapt cores and buses with generic module // one thread/core for now; multithread needs thread tag, deeper queues `include "defs.v" module A2WB #( parameter [0:15] CORE_TYPES = {`CORE_TYPE_WB2, `CORE_TYPE_NONE, `CORE_TYPE_NONE, `CORE_TYPE_NONE}, parameter [0:3] BUS_TYPE = `BUS_TYPE_WB2 ) ( input clk, input rst, input [0:3] core_in, output [0:3] core_out, input bus_in, output bus_out ); integer NUMCORES = 0; genvar i; // ------------------------------------------------------------------------------------------------ // I/O Connections // cores must be contiguous, starting at 0 wire i_wb_cyc [0:3]; wire i_wb_stb [0:3]; wire [31:2] i_wb_adr[0:3] ; wire i_wb_ack [0:3]; wire [31:0] i_wb_datr[0:3]; wire d_wb_cyc [0:3]; wire d_wb_stb [0:3]; wire d_wb_we [0:3]; wire [3:0] d_wb_sel [0:3]; wire [31:0] d_wb_adr [0:3]; wire [31:0] d_wb_datw [0:3]; wire d_wb_ack [0:3]; wire [31:0] d_wb_datr[0:3]; wire [7:0] ext_cmd [0:3]; wire [7:0] ext_rsp [0:3]; generate for (i = 0; i < 4; i++) begin case (CORE_TYPES[i*4:i*4+3]) `CORE_TYPE_NONE: begin end `CORE_TYPE_A2L2: begin assign NUMCORES = NUMCORES + 1; // a2l2 end `CORE_TYPE_WB1: begin assign NUMCORES = NUMCORES + 1; wire [78:0] core_0_in; wire [32:0] core_out[i]; assign d_wb_cyc[i] = core_in[i][78]; assign d_wb_stb[i] = core_in[i][77]; assign d_wb_we[i] = core_in[i][76]; assign d_wb_sel[i] = core_in[i][75:72]; assign d_wb_adr[i] = core_in[i][71:40]; assign d_wb_datw[i] = core_in[i][39:8]; assign ext_cmd[i] = core_in[i][7:0]; assign core_out[i][32] = d_wb_ack[i]; assign core_out[i][31:0] = d_wb_datr[i]; end `CORE_TYPE_WB2: begin assign NUMCORES = NUMCORES + 1; wire [110:0] core_in[i]; wire [65:0] core_out[i]; assign i_wb_cyc[i] = core_in[i][110]; assign i_wb_stb[i] = core_in[i][109]; assign i_wb_adr[i] = core_in[i][108:79]; assign d_wb_cyc[i] = core_in[i][78]; assign d_wb_stb[i] = core_in[i][77]; assign d_wb_we[i] = core_in[i][76]; assign d_wb_sel[i] = core_in[i][75:72]; assign d_wb_adr[i] = core_in[i][71:40]; assign d_wb_datw[i] = core_in[i][39:8]; assign ext_cmd[i] = core_in[i][7:0]; assign core_out[i][65] = i_wb_ack[i]; assign core_out[i][64:33] = i_wb_datr[i]; assign core_out[i][32] = d_wb_ack[i]; assign core_out[i][31:0] = d_wb_datr[i]; end endcase end endgenerate // ------------------------------------------------------------------------------------------------ // Command Interfaces // generate for (i = 0; i < 4; i++) begin case (CORE_TYPES[i*4:i*4+3]) `CORE_TYPE_NONE: begin end `CORE_TYPE_A2L2: begin // convert a2l2 to internal format end `CORE_TYPE_WB1: begin cmd_wb #(.CORE_TYPE(CORE_TYPES[i*4:i*4+3]), .BUS_TYPE(BUS_TYPE)) core_in ( .clk(clk), .rst(rst), .i_wb_cyc('b0), .i_wb_stb('b0), .i_wb_adr('h0), .d_wb_cyc(d_wb_cyc[i]), .d_wb_stb(d_wb_stb[i]), .d_wb_we(d_wb_we[i]), .d_wb_sel(d_wb_sel[i]), .d_wb_adr(d_wb_adr[i]), .d_wb_datw(d_wb_datw[i]), .ext_cmd(ext_cmd[i]), .cmd_taken('b0), .cmd_out_0(), .cmd_out_1() ); end `CORE_TYPE_WB2: begin cmd_wb #(.CORE_TYPE(CORE_TYPES[i*4:i*4+3]), .BUS_TYPE(BUS_TYPE)) core_in ( .clk(clk), .rst(rst), .i_wb_cyc(i_wb_cyc[i]), .i_wb_stb(i_wb_stb[i]), .i_wb_adr(i_wb_adr[i]), .d_wb_cyc(d_wb_cyc[i]), .d_wb_stb(d_wb_stb[i]), .d_wb_we(d_wb_we[i]), .d_wb_sel(d_wb_sel[i]), .d_wb_adr(d_wb_adr[i]), .d_wb_datw(d_wb_datw[i]), .ext_cmd(ext_cmd[i]), .cmd_taken('b0), .cmd_out_0(), .cmd_out_1() ); end endcase end endgenerate // ------------------------------------------------------------------------------------------------ // Arbitration // // LRU, etc. select from pending cmds; also needs smp to stall some/all cmds // do addr cmp here, if necessary? or could do in smp arb #() arb ( ); // ------------------------------------------------------------------------------------------------ // SMP // special ops: track resv, stall pending cmds, gen rsp smp #() smp ( ); // ------------------------------------------------------------------------------------------------ // Bus Out // commands to main bus generate case(BUS_TYPE) `BUS_TYPE_WB1: begin end `BUS_TYPE_WB2: begin wire [101:0] bus_out; wire bus_i_wb_stb; assign bus_out[101] = bus_i_wb_stb; wire [31:2] bus_i_wb_adr; assign bus_out[100:71] = bus_i_wb_adr; wire bus_d_wb_cyc; assign bus_out[70] = bus_d_wb_cyc; wire bus_d_wb_stb; assign bus_out[69] = bus_d_wb_stb; wire bus_d_wb_we; assign bus_out[68] = bus_d_wb_we; wire [3:0] bus_d_wb_sel; assign bus_out[67:64] = bus_d_wb_sel; wire [31:0] bus_d_wb_adr; assign bus_out[63:32] = bus_d_wb_adr; wire [31:0] bus_d_wb_datw; assign bus_out[31:0] = bus_d_wb_datw; end endcase endgenerate // ------------------------------------------------------------------------------------------------ // Bus In // responses from main bus generate case(BUS_TYPE) `BUS_TYPE_WB1: begin end `BUS_TYPE_WB2: begin wire [65:0] bus_in; wire bus_i_wb_ack = bus_in[65]; wire [31:0] bus_i_wb_datr = bus_in[64:33]; wire bus_d_wb_ack = bus_in[32]; wire [31:0] bus_d_wb_datr = bus_in[31:0]; end endcase endgenerate // ------------------------------------------------------------------------------------------------ // Response Queues // responses for cores generate for (i = 0; i < 4; i++) begin end endgenerate // ------------------------------------------------------------------------------------------------ // Misc/Errors/Debug // stuff generate for (i = 0; i < 4; i++) begin end endgenerate endmodule