You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

231 lines
6.6 KiB
Verilog

// 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