scope refactoring: adding modules definitions to VCD trace
This commit is contained in:
@@ -3,14 +3,7 @@
|
||||
module VX_cluster #(
|
||||
parameter CLUSTER_ID = 0
|
||||
) (
|
||||
`SCOPE_SIGNALS_ISTAGE_CLUSTER_IO
|
||||
`SCOPE_SIGNALS_LSU_CLUSTER_IO
|
||||
`SCOPE_SIGNALS_BANK_L2_CLUSTER_IO
|
||||
`SCOPE_SIGNALS_BANK_L1D_CLUSTER_IO
|
||||
`SCOPE_SIGNALS_BANK_L1I_CLUSTER_IO
|
||||
`SCOPE_SIGNALS_BANK_L1S_CLUSTER_IO
|
||||
`SCOPE_SIGNALS_ISSUE_CLUSTER_IO
|
||||
`SCOPE_SIGNALS_EXECUTE_CLUSTER_IO
|
||||
`SCOPE_IO_VX_cluster
|
||||
|
||||
// Clock
|
||||
input wire clk,
|
||||
@@ -141,13 +134,7 @@ module VX_cluster #(
|
||||
VX_core #(
|
||||
.CORE_ID(i + (CLUSTER_ID * `NUM_CORES))
|
||||
) core (
|
||||
`SCOPE_SIGNALS_ISTAGE_SELECT(i)
|
||||
`SCOPE_SIGNALS_LSU_SELECT(i)
|
||||
`SCOPE_SIGNALS_BANK_L1D_CORE_SELECT(i)
|
||||
`SCOPE_SIGNALS_BANK_L1I_CORE_SELECT(i)
|
||||
`SCOPE_SIGNALS_BANK_L1S_CORE_SELECT(i)
|
||||
`SCOPE_SIGNALS_ISSUE_SELECT(i)
|
||||
`SCOPE_SIGNALS_EXECUTE_SELECT(i)
|
||||
`SCOPE_BIND_VX_cluster_core(i)
|
||||
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
@@ -385,7 +372,7 @@ module VX_cluster #(
|
||||
.SNP_REQ_TAG_WIDTH (`L2SNP_TAG_WIDTH),
|
||||
.SNP_FWD_TAG_WIDTH (`DSNP_TAG_WIDTH)
|
||||
) l2cache (
|
||||
`SCOPE_SIGNALS_BANK_L2_CACHE_BIND
|
||||
`SCOPE_BIND_VX_cluster_l2cache()
|
||||
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
|
||||
@@ -3,13 +3,7 @@
|
||||
module VX_core #(
|
||||
parameter CORE_ID = 0
|
||||
) (
|
||||
`SCOPE_SIGNALS_ISTAGE_IO
|
||||
`SCOPE_SIGNALS_LSU_IO
|
||||
`SCOPE_SIGNALS_BANK_L1D_CORE_IO
|
||||
`SCOPE_SIGNALS_BANK_L1I_CORE_IO
|
||||
`SCOPE_SIGNALS_BANK_L1S_CORE_IO
|
||||
`SCOPE_SIGNALS_ISSUE_IO
|
||||
`SCOPE_SIGNALS_EXECUTE_IO
|
||||
`SCOPE_IO_VX_core
|
||||
|
||||
// Clock
|
||||
input wire clk,
|
||||
@@ -181,10 +175,7 @@ module VX_core #(
|
||||
VX_pipeline #(
|
||||
.CORE_ID(CORE_ID)
|
||||
) pipeline (
|
||||
`SCOPE_SIGNALS_ISTAGE_BIND
|
||||
`SCOPE_SIGNALS_LSU_BIND
|
||||
`SCOPE_SIGNALS_ISSUE_BIND
|
||||
`SCOPE_SIGNALS_EXECUTE_BIND
|
||||
`SCOPE_BIND_VX_core_pipeline()
|
||||
|
||||
.clk(clk),
|
||||
.reset(reset),
|
||||
@@ -260,9 +251,7 @@ module VX_core #(
|
||||
VX_mem_unit #(
|
||||
.CORE_ID(CORE_ID)
|
||||
) mem_unit (
|
||||
`SCOPE_SIGNALS_BANK_L1D_CORE_BIND
|
||||
`SCOPE_SIGNALS_BANK_L1I_CORE_BIND
|
||||
`SCOPE_SIGNALS_BANK_L1S_CORE_BIND
|
||||
`SCOPE_BIND_VX_core_mem_unit()
|
||||
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
|
||||
@@ -7,7 +7,7 @@ module VX_csr_unit #(
|
||||
input wire reset,
|
||||
|
||||
VX_cmt_to_csr_if cmt_to_csr_if,
|
||||
VX_csr_to_issue_if csr_to_issue_if,
|
||||
VX_csr_to_issue_if csr_to_issue_if,
|
||||
|
||||
VX_csr_io_req_if csr_io_req_if,
|
||||
VX_csr_io_rsp_if csr_io_rsp_if,
|
||||
@@ -15,8 +15,8 @@ module VX_csr_unit #(
|
||||
VX_csr_req_if csr_req_if,
|
||||
VX_exu_to_cmt_if csr_commit_if
|
||||
);
|
||||
VX_csr_req_if csr_pipe_req_if();
|
||||
VX_exu_to_cmt_if csr_pipe_rsp_if();
|
||||
VX_csr_req_if csr_pipe_req_if();
|
||||
VX_exu_to_cmt_if csr_pipe_rsp_if();
|
||||
|
||||
wire select_io_req = csr_io_req_if.valid;
|
||||
wire select_io_rsp;
|
||||
|
||||
@@ -3,8 +3,7 @@
|
||||
module VX_execute #(
|
||||
parameter CORE_ID = 0
|
||||
) (
|
||||
`SCOPE_SIGNALS_LSU_IO
|
||||
`SCOPE_SIGNALS_EXECUTE_IO
|
||||
`SCOPE_IO_VX_execute
|
||||
|
||||
input wire clk,
|
||||
input wire reset,
|
||||
@@ -55,7 +54,7 @@ module VX_execute #(
|
||||
VX_lsu_unit #(
|
||||
.CORE_ID(CORE_ID)
|
||||
) lsu_unit (
|
||||
`SCOPE_SIGNALS_LSU_BIND
|
||||
`SCOPE_BIND_VX_execute_lsu_unit()
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
.dcache_req_if (dcache_req_if),
|
||||
@@ -122,6 +121,7 @@ module VX_execute #(
|
||||
VX_gpu_unit #(
|
||||
.CORE_ID(CORE_ID)
|
||||
) gpu_unit (
|
||||
`SCOPE_BIND_VX_execute_gpu_unit()
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
.gpu_req_if (gpu_req_if),
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
module VX_fetch #(
|
||||
parameter CORE_ID = 0
|
||||
) (
|
||||
`SCOPE_SIGNALS_ISTAGE_IO
|
||||
`SCOPE_IO_VX_fetch
|
||||
|
||||
input wire clk,
|
||||
input wire reset,
|
||||
@@ -29,6 +29,8 @@ module VX_fetch #(
|
||||
VX_warp_sched #(
|
||||
.CORE_ID(CORE_ID)
|
||||
) warp_sched (
|
||||
`SCOPE_BIND_VX_fetch_warp_sched()
|
||||
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
.warp_ctl_if (warp_ctl_if),
|
||||
@@ -43,7 +45,7 @@ module VX_fetch #(
|
||||
VX_icache_stage #(
|
||||
.CORE_ID(CORE_ID)
|
||||
) icache_stage (
|
||||
`SCOPE_SIGNALS_ISTAGE_BIND
|
||||
`SCOPE_BIND_VX_fetch_icache_stage()
|
||||
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
|
||||
@@ -41,24 +41,20 @@ module VX_gpr_fp_ctrl (
|
||||
read_rs1 <= 1;
|
||||
end
|
||||
|
||||
rsp_valid <= gpr_req_if.valid;
|
||||
rsp_wid <= gpr_req_if.wid;
|
||||
rsp_pc <= gpr_req_if.PC;
|
||||
rsp_valid <= gpr_req_if.valid;
|
||||
rsp_wid <= gpr_req_if.wid;
|
||||
rsp_pc <= gpr_req_if.PC;
|
||||
|
||||
if (read_rs1) begin
|
||||
rsp_rs1_data <= rs1_data;
|
||||
rsp_rs1_data <= (gpr_req_if.rs1 == 0) ? (`NUM_THREADS*32)'(0) : rs1_data;
|
||||
end
|
||||
rsp_rs2_data <= rs2_data;
|
||||
rsp_rs3_data <= rs1_data;
|
||||
rsp_rs2_data <= (gpr_req_if.rs2 == 0) ? (`NUM_THREADS*32)'(0) : rs2_data;
|
||||
rsp_rs3_data <= (gpr_req_if.rs1 == 0) ? (`NUM_THREADS*32)'(0) : rs1_data;
|
||||
|
||||
assert(read_rs1 || rsp_wid == gpr_req_if.wid);
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge clk) begin
|
||||
|
||||
end
|
||||
|
||||
// outputs
|
||||
wire [`NR_BITS-1:0] rs1 = read_rs1 ? gpr_req_if.rs1 : gpr_req_if.rs3;
|
||||
assign raddr1 = {gpr_req_if.wid, rs1};
|
||||
|
||||
@@ -12,15 +12,7 @@ module VX_gpr_ram (
|
||||
);
|
||||
`ifndef ASIC
|
||||
|
||||
reg [`NUM_THREADS-1:0][3:0][7:0] ram [(`NUM_WARPS * `NUM_REGS)-1:0];
|
||||
|
||||
initial begin // initialize ram: set r0 = 0
|
||||
for (integer j = 0; j < `NUM_WARPS; j++) begin
|
||||
for (integer i = 0; i < `NUM_REGS; i++) begin
|
||||
ram[j * `NUM_REGS + i] = (i == 0) ? {`NUM_THREADS{32'h0}} : {`NUM_THREADS{32'hx}};
|
||||
end
|
||||
end
|
||||
end
|
||||
reg [`NUM_THREADS-1:0][3:0][7:0] ram [(`NUM_WARPS * `NUM_REGS)-1:0];
|
||||
|
||||
always @(posedge clk) begin
|
||||
for (integer i = 0; i < `NUM_THREADS; i++) begin
|
||||
|
||||
@@ -15,9 +15,8 @@ module VX_gpr_stage #(
|
||||
);
|
||||
`UNUSED_VAR (reset)
|
||||
|
||||
wire [`NUM_THREADS-1:0][31:0] rs1_data;
|
||||
wire [`NUM_THREADS-1:0][31:0] rs2_data;
|
||||
wire [`NW_BITS+`NR_BITS-1:0] raddr1;
|
||||
wire [`NUM_THREADS-1:0][31:0] rs1_data, rs2_data;
|
||||
wire [`NW_BITS+`NR_BITS-1:0] raddr1;
|
||||
|
||||
VX_gpr_ram gpr_ram (
|
||||
.clk (clk),
|
||||
@@ -57,8 +56,8 @@ module VX_gpr_stage #(
|
||||
rsp_valid <= gpr_req_if.valid;
|
||||
rsp_wid <= gpr_req_if.wid;
|
||||
rsp_pc <= gpr_req_if.PC;
|
||||
rsp_rs1_data <= rs1_data;
|
||||
rsp_rs2_data <= rs2_data;
|
||||
rsp_rs1_data <= (gpr_req_if.rs1 == 0) ? (`NUM_THREADS*32)'(0) : rs1_data;
|
||||
rsp_rs2_data <= (gpr_req_if.rs2 == 0) ? (`NUM_THREADS*32)'(0) : rs2_data;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
module VX_gpu_unit #(
|
||||
parameter CORE_ID = 0
|
||||
) (
|
||||
`SCOPE_IO_VX_gpu_unit
|
||||
|
||||
input wire clk,
|
||||
input wire reset,
|
||||
|
||||
@@ -88,4 +90,18 @@ module VX_gpu_unit #(
|
||||
// can accept new request?
|
||||
assign gpu_req_if.ready = gpu_commit_if.ready;
|
||||
|
||||
`SCOPE_ASSIGN (scope_gpu_req_valid, gpu_req_if.valid);
|
||||
`SCOPE_ASSIGN (scope_gpu_req_wid, gpu_req_if.wid);
|
||||
`SCOPE_ASSIGN (scope_gpu_req_tmask, gpu_req_if.tmask);
|
||||
`SCOPE_ASSIGN (scope_gpu_req_op_type, gpu_req_if.op_type);
|
||||
`SCOPE_ASSIGN (scope_gpu_req_rs1, gpu_req_if.rs1_data[0]);
|
||||
`SCOPE_ASSIGN (scope_gpu_req_rs2, gpu_req_if.rs2_data);
|
||||
`SCOPE_ASSIGN (scope_gpu_req_ready, gpu_req_if.ready);
|
||||
`SCOPE_ASSIGN (scope_gpu_rsp_valid, warp_ctl_if.valid);
|
||||
`SCOPE_ASSIGN (scope_gpu_rsp_wid, warp_ctl_if.wid);
|
||||
`SCOPE_ASSIGN (scope_gpu_rsp_tmc, warp_ctl_if.tmc);
|
||||
`SCOPE_ASSIGN (scope_gpu_rsp_wspawn, warp_ctl_if.wspawn);
|
||||
`SCOPE_ASSIGN (scope_gpu_rsp_split, warp_ctl_if.split);
|
||||
`SCOPE_ASSIGN (scope_gpu_rsp_barrier, warp_ctl_if.barrier);
|
||||
|
||||
endmodule
|
||||
@@ -20,16 +20,13 @@ module VX_ibuffer #(
|
||||
localparam ADDRW = $clog2(SIZE);
|
||||
localparam NWARPSW = $clog2(`NUM_WARPS+1);
|
||||
|
||||
`USE_FAST_BRAM reg [DATAW-1:0] entries [`NUM_WARPS-1:0][SIZE-1:0];
|
||||
reg [SIZEW-1:0] size_r [`NUM_WARPS-1:0];
|
||||
reg [ADDRW:0] rd_ptr_r [`NUM_WARPS-1:0];
|
||||
reg [ADDRW:0] wr_ptr_r [`NUM_WARPS-1:0];
|
||||
|
||||
wire [`NUM_WARPS-1:0] q_full;
|
||||
wire [`NUM_WARPS-1:0][SIZEW-1:0] q_size;
|
||||
wire [DATAW-1:0] q_data_in;
|
||||
wire [`NUM_WARPS-1:0][DATAW-1:0] q_data_prev;
|
||||
|
||||
reg [`NUM_WARPS-1:0][DATAW-1:0] q_data_out;
|
||||
reg [SIZEW-1:0] size_r [`NUM_WARPS-1:0];
|
||||
|
||||
wire enq_fire = ibuf_enq_if.valid && ibuf_enq_if.ready;
|
||||
wire deq_fire = ibuf_deq_if.valid && ibuf_deq_if.ready;
|
||||
@@ -39,41 +36,50 @@ module VX_ibuffer #(
|
||||
wire writing = enq_fire && (i == ibuf_enq_if.wid);
|
||||
wire reading = deq_fire && (i == ibuf_deq_if.wid);
|
||||
|
||||
wire [ADDRW-1:0] rd_ptr_a = rd_ptr_r[i][ADDRW-1:0];
|
||||
wire [ADDRW-1:0] wr_ptr_a = wr_ptr_r[i][ADDRW-1:0];
|
||||
|
||||
wire is_slot0 = ((0 == size_r[i]) || ((1 == size_r[i]) && reading));
|
||||
|
||||
wire push = writing && !is_slot0;
|
||||
wire pop = reading && (size_r[i] != 1);
|
||||
|
||||
VX_generic_queue #(
|
||||
.DATAW(DATAW),
|
||||
.SIZE(SIZE)
|
||||
) queue (
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
.push (push),
|
||||
.data_in (q_data_in),
|
||||
.pop (pop),
|
||||
.data_out (q_data_prev[i]),
|
||||
`UNUSED_PIN (empty),
|
||||
`UNUSED_PIN (full),
|
||||
`UNUSED_PIN (size)
|
||||
);
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (writing && is_slot0) begin
|
||||
q_data_out[i] <= q_data_in;
|
||||
end
|
||||
if (pop) begin
|
||||
q_data_out[i] <= q_data_prev[i];
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (reset) begin
|
||||
rd_ptr_r[i] <= 0;
|
||||
wr_ptr_r[i] <= 0;
|
||||
size_r[i] <= 0;
|
||||
size_r[i] <= 0;
|
||||
end else begin
|
||||
if (writing) begin
|
||||
if ((0 == size_r[i]) || ((1 == size_r[i]) && reading)) begin
|
||||
q_data_out[i] <= q_data_in;
|
||||
end else begin
|
||||
entries[i][wr_ptr_a] <= q_data_in;
|
||||
wr_ptr_r[i] <= wr_ptr_r[i] + ADDRW'(1);
|
||||
end
|
||||
if (!reading) begin
|
||||
size_r[i] <= size_r[i] + SIZEW'(1);
|
||||
end
|
||||
if (writing && !reading) begin
|
||||
size_r[i] <= size_r[i] + SIZEW'(1);
|
||||
end
|
||||
if (reading) begin
|
||||
if (size_r[i] != 1) begin
|
||||
q_data_out[i] <= q_data_prev[i];
|
||||
rd_ptr_r[i] <= rd_ptr_r[i] + ADDRW'(1);
|
||||
end
|
||||
if (!writing) begin
|
||||
size_r[i] <= size_r[i] - SIZEW'(1);
|
||||
end
|
||||
if (reading && !writing) begin
|
||||
size_r[i] <= size_r[i] - SIZEW'(1);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
assign q_data_prev[i] = entries[i][rd_ptr_a];
|
||||
assign q_full[i] = (size_r[i] == SIZE);
|
||||
assign q_size[i] = size_r[i];
|
||||
assign q_full[i] = (size_r[i] == SIZE);
|
||||
assign q_size[i] = size_r[i];
|
||||
end
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
@@ -144,9 +150,9 @@ module VX_ibuffer #(
|
||||
schedule_table[deq_wid_n] <= 0;
|
||||
end
|
||||
|
||||
deq_valid <= deq_valid_n;
|
||||
deq_wid <= deq_wid_n;
|
||||
deq_instr <= deq_instr_n;
|
||||
deq_valid <= deq_valid_n;
|
||||
deq_wid <= deq_wid_n;
|
||||
deq_instr <= deq_instr_n;
|
||||
|
||||
if (warp_added && !warp_removed) begin
|
||||
num_warps <= num_warps + NWARPSW'(1);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
module VX_icache_stage #(
|
||||
parameter CORE_ID = 0
|
||||
) (
|
||||
`SCOPE_SIGNALS_ISTAGE_IO
|
||||
`SCOPE_IO_VX_icache_stage
|
||||
|
||||
input wire clk,
|
||||
input wire reset,
|
||||
@@ -30,7 +30,7 @@ module VX_icache_stage #(
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (icache_req_fire) begin
|
||||
rsp_PC_buf[req_tag] <= ifetch_req_if.PC;
|
||||
rsp_PC_buf[req_tag] <= ifetch_req_if.PC;
|
||||
rsp_tmask_buf[req_tag] <= ifetch_req_if.tmask;
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
`include "VX_platform.vh"
|
||||
|
||||
module VX_ipdom_stack #(
|
||||
@@ -17,33 +16,55 @@ module VX_ipdom_stack #(
|
||||
);
|
||||
localparam STACK_SIZE = 2 ** DEPTH;
|
||||
|
||||
`USE_FAST_BRAM reg [WIDTH-1:0] stack_1 [0:STACK_SIZE-1];
|
||||
`USE_FAST_BRAM reg [WIDTH-1:0] stack_2 [0:STACK_SIZE-1];
|
||||
`USE_FAST_BRAM reg is_part [0:STACK_SIZE-1];
|
||||
reg [WIDTH-1:0] stack_1 [0:STACK_SIZE-1];
|
||||
reg [WIDTH-1:0] stack_2 [0:STACK_SIZE-1];
|
||||
reg is_part [0:STACK_SIZE-1];
|
||||
|
||||
reg [DEPTH-1:0] rd_ptr, wr_ptr;
|
||||
|
||||
reg [WIDTH - 1:0] d1, d2;
|
||||
reg p;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (reset) begin
|
||||
rd_ptr <= 0;
|
||||
wr_ptr <= 0;
|
||||
end else begin
|
||||
if (push) begin
|
||||
stack_1[wr_ptr] <= q1;
|
||||
stack_2[wr_ptr] <= q2;
|
||||
is_part[wr_ptr] <= 0;
|
||||
rd_ptr <= wr_ptr;
|
||||
wr_ptr <= wr_ptr + DEPTH'(1);
|
||||
end else if (pop) begin
|
||||
wr_ptr <= wr_ptr - DEPTH'(is_part[rd_ptr]);
|
||||
rd_ptr <= rd_ptr - DEPTH'(is_part[rd_ptr]);
|
||||
is_part[rd_ptr] <= 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
assign d = is_part[rd_ptr] ? stack_1[rd_ptr] : stack_2[rd_ptr];
|
||||
always @(posedge clk) begin
|
||||
if (push) begin
|
||||
stack_1[wr_ptr] <= q1;
|
||||
end
|
||||
end
|
||||
assign d1 = stack_1[rd_ptr];
|
||||
|
||||
assign empty = (0 == wr_ptr);
|
||||
always @(posedge clk) begin
|
||||
if (push) begin
|
||||
stack_2[wr_ptr] <= q2;
|
||||
end
|
||||
end
|
||||
assign d2 = stack_2[rd_ptr];
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (push) begin
|
||||
is_part[wr_ptr] <= 0;
|
||||
end else if (pop) begin
|
||||
is_part[rd_ptr] <= 1;
|
||||
end
|
||||
end
|
||||
assign p = is_part[rd_ptr];
|
||||
|
||||
assign d = p ? d1 : d2;
|
||||
assign empty = ~(| wr_ptr);
|
||||
assign full = ((STACK_SIZE-1) == wr_ptr);
|
||||
|
||||
endmodule
|
||||
@@ -3,7 +3,7 @@
|
||||
module VX_issue #(
|
||||
parameter CORE_ID = 0
|
||||
) (
|
||||
`SCOPE_SIGNALS_ISSUE_IO
|
||||
`SCOPE_IO_VX_issue
|
||||
|
||||
input wire clk,
|
||||
input wire reset,
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
module VX_lsu_unit #(
|
||||
parameter CORE_ID = 0
|
||||
) (
|
||||
`SCOPE_SIGNALS_LSU_IO
|
||||
`SCOPE_IO_VX_lsu_unit
|
||||
|
||||
input wire clk,
|
||||
input wire reset,
|
||||
|
||||
@@ -3,9 +3,7 @@
|
||||
module VX_mem_unit # (
|
||||
parameter CORE_ID = 0
|
||||
) (
|
||||
`SCOPE_SIGNALS_BANK_L1D_CORE_IO
|
||||
`SCOPE_SIGNALS_BANK_L1I_CORE_IO
|
||||
`SCOPE_SIGNALS_BANK_L1S_CORE_IO
|
||||
`SCOPE_IO_VX_mem_unit
|
||||
|
||||
input wire clk,
|
||||
input wire reset,
|
||||
@@ -79,7 +77,7 @@ module VX_mem_unit # (
|
||||
.CORE_TAG_ID_BITS (`DCORE_TAG_ID_BITS),
|
||||
.DRAM_TAG_WIDTH (`SDRAM_TAG_WIDTH)
|
||||
) smem (
|
||||
`SCOPE_SIGNALS_BANK_L1S_CACHE_BIND
|
||||
`SCOPE_BIND_VX_mem_unit_smem()
|
||||
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
@@ -106,7 +104,7 @@ module VX_mem_unit # (
|
||||
`UNUSED_PIN (dram_req_addr),
|
||||
`UNUSED_PIN (dram_req_data),
|
||||
`UNUSED_PIN (dram_req_tag),
|
||||
.dram_req_ready (0),
|
||||
.dram_req_ready (1'b0),
|
||||
|
||||
// DRAM response
|
||||
.dram_rsp_valid (0),
|
||||
@@ -115,7 +113,7 @@ module VX_mem_unit # (
|
||||
`UNUSED_PIN (dram_rsp_ready),
|
||||
|
||||
// Snoop request
|
||||
.snp_req_valid (0),
|
||||
.snp_req_valid (1'b0),
|
||||
.snp_req_addr (0),
|
||||
.snp_req_invalidate (0),
|
||||
.snp_req_tag (0),
|
||||
@@ -124,17 +122,17 @@ module VX_mem_unit # (
|
||||
// Snoop response
|
||||
`UNUSED_PIN (snp_rsp_valid),
|
||||
`UNUSED_PIN (snp_rsp_tag),
|
||||
.snp_rsp_ready (0),
|
||||
.snp_rsp_ready (1'b0),
|
||||
|
||||
// Snoop forward out
|
||||
`UNUSED_PIN (snp_fwdout_valid),
|
||||
`UNUSED_PIN (snp_fwdout_addr),
|
||||
`UNUSED_PIN (snp_fwdout_invalidate),
|
||||
`UNUSED_PIN (snp_fwdout_tag),
|
||||
.snp_fwdout_ready (0),
|
||||
.snp_fwdout_ready (1'b0),
|
||||
|
||||
// Snoop forward in
|
||||
.snp_fwdin_valid (0),
|
||||
.snp_fwdin_valid (1'b0),
|
||||
.snp_fwdin_tag (0),
|
||||
`UNUSED_PIN (snp_fwdin_ready)
|
||||
);
|
||||
@@ -161,7 +159,7 @@ module VX_mem_unit # (
|
||||
.DRAM_TAG_WIDTH (`DDRAM_TAG_WIDTH),
|
||||
.SNP_REQ_TAG_WIDTH (`DSNP_TAG_WIDTH)
|
||||
) dcache (
|
||||
`SCOPE_SIGNALS_BANK_L1D_CACHE_BIND
|
||||
`SCOPE_BIND_VX_mem_unit_dcache()
|
||||
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
@@ -213,10 +211,10 @@ module VX_mem_unit # (
|
||||
`UNUSED_PIN (snp_fwdout_addr),
|
||||
`UNUSED_PIN (snp_fwdout_invalidate),
|
||||
`UNUSED_PIN (snp_fwdout_tag),
|
||||
.snp_fwdout_ready (0),
|
||||
.snp_fwdout_ready (1'b0),
|
||||
|
||||
// Snoop forward in
|
||||
.snp_fwdin_valid (0),
|
||||
.snp_fwdin_valid (1'b0),
|
||||
.snp_fwdin_tag (0),
|
||||
`UNUSED_PIN (snp_fwdin_ready)
|
||||
);
|
||||
@@ -242,7 +240,7 @@ module VX_mem_unit # (
|
||||
.CORE_TAG_ID_BITS (`ICORE_TAG_ID_BITS),
|
||||
.DRAM_TAG_WIDTH (`IDRAM_TAG_WIDTH)
|
||||
) icache (
|
||||
`SCOPE_SIGNALS_BANK_L1I_CACHE_BIND
|
||||
`SCOPE_BIND_VX_mem_unit_icache()
|
||||
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
@@ -278,26 +276,26 @@ module VX_mem_unit # (
|
||||
.dram_rsp_ready (icache_dram_rsp_if.ready),
|
||||
|
||||
// Snoop request
|
||||
.snp_req_valid (0),
|
||||
.snp_req_valid (1'b0),
|
||||
.snp_req_addr (0),
|
||||
.snp_req_invalidate (0),
|
||||
.snp_req_invalidate (1'b0),
|
||||
.snp_req_tag (0),
|
||||
`UNUSED_PIN (snp_req_ready),
|
||||
|
||||
// Snoop response
|
||||
`UNUSED_PIN (snp_rsp_valid),
|
||||
`UNUSED_PIN (snp_rsp_tag),
|
||||
.snp_rsp_ready (0),
|
||||
.snp_rsp_ready (1'b0),
|
||||
|
||||
// Snoop forward out
|
||||
`UNUSED_PIN (snp_fwdout_valid),
|
||||
`UNUSED_PIN (snp_fwdout_addr),
|
||||
`UNUSED_PIN (snp_fwdout_invalidate),
|
||||
`UNUSED_PIN (snp_fwdout_tag),
|
||||
.snp_fwdout_ready (0),
|
||||
.snp_fwdout_ready (1'b0),
|
||||
|
||||
// Snoop forward in
|
||||
.snp_fwdin_valid (0),
|
||||
.snp_fwdin_valid (1'b0),
|
||||
.snp_fwdin_tag (0),
|
||||
`UNUSED_PIN (snp_fwdin_ready)
|
||||
);
|
||||
|
||||
@@ -3,10 +3,7 @@
|
||||
module VX_pipeline #(
|
||||
parameter CORE_ID = 0
|
||||
) (
|
||||
`SCOPE_SIGNALS_ISTAGE_IO
|
||||
`SCOPE_SIGNALS_LSU_IO
|
||||
`SCOPE_SIGNALS_ISSUE_IO
|
||||
`SCOPE_SIGNALS_EXECUTE_IO
|
||||
`SCOPE_IO_VX_pipeline
|
||||
|
||||
// Clock
|
||||
input wire clk,
|
||||
@@ -126,7 +123,7 @@ module VX_pipeline #(
|
||||
VX_fetch #(
|
||||
.CORE_ID(CORE_ID)
|
||||
) fetch (
|
||||
`SCOPE_SIGNALS_ISTAGE_BIND
|
||||
`SCOPE_BIND_VX_pipeline_fetch()
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
.icache_req_if (core_icache_req_if),
|
||||
@@ -153,7 +150,7 @@ module VX_pipeline #(
|
||||
VX_issue #(
|
||||
.CORE_ID(CORE_ID)
|
||||
) issue (
|
||||
`SCOPE_SIGNALS_ISSUE_BIND
|
||||
`SCOPE_BIND_VX_pipeline_issue()
|
||||
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
@@ -173,8 +170,8 @@ module VX_pipeline #(
|
||||
VX_execute #(
|
||||
.CORE_ID(CORE_ID)
|
||||
) execute (
|
||||
`SCOPE_SIGNALS_LSU_BIND
|
||||
`SCOPE_SIGNALS_EXECUTE_BIND
|
||||
`SCOPE_BIND_VX_pipeline_execute()
|
||||
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
`define USE_FAST_BRAM (* syn_ramstyle = "mlab" *)
|
||||
`define RELAX_BRAM_RW (* syn_ramstyle = "no_rw_check" *)
|
||||
`define RELAXED_RW_BRAM (* syn_ramstyle = "no_rw_check" *)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
`ifndef VX_SCOPE
|
||||
`define VX_SCOPE
|
||||
|
||||
@@ -6,86 +5,76 @@
|
||||
|
||||
`include "scope-defs.vh"
|
||||
|
||||
`define SCOPE_ASSIGN(d,s) \
|
||||
`IGNORE_WARNINGS_BEGIN \
|
||||
assign d = s \
|
||||
`IGNORE_WARNINGS_END
|
||||
`define SCOPE_ASSIGN(d,s) assign d = s
|
||||
|
||||
`else
|
||||
|
||||
`define SCOPE_SIGNALS_ISTAGE_TOP_IO
|
||||
`define SCOPE_SIGNALS_ISTAGE_TOP_BIND
|
||||
`define SCOPE_SIGNALS_ISTAGE_CLUSTER_IO
|
||||
`define SCOPE_SIGNALS_ISTAGE_CLUSTER_BIND
|
||||
`define SCOPE_SIGNALS_ISTAGE_IO
|
||||
`define SCOPE_SIGNALS_ISTAGE_BIND
|
||||
`define SCOPE_SIGNALS_ISTAGE_CLUSTER_SELECT(__i__)
|
||||
`define SCOPE_SIGNALS_ISTAGE_SELECT(__i__)
|
||||
`define SCOPE_SIGNALS_LSU_TOP_IO
|
||||
`define SCOPE_SIGNALS_LSU_TOP_BIND
|
||||
`define SCOPE_SIGNALS_LSU_CLUSTER_IO
|
||||
`define SCOPE_SIGNALS_LSU_CLUSTER_BIND
|
||||
`define SCOPE_SIGNALS_LSU_IO
|
||||
`define SCOPE_SIGNALS_LSU_BIND
|
||||
`define SCOPE_SIGNALS_LSU_CLUSTER_SELECT(__i__)
|
||||
`define SCOPE_SIGNALS_LSU_SELECT(__i__)
|
||||
`define SCOPE_SIGNALS_ISSUE_TOP_IO
|
||||
`define SCOPE_SIGNALS_ISSUE_TOP_BIND
|
||||
`define SCOPE_SIGNALS_ISSUE_CLUSTER_IO
|
||||
`define SCOPE_SIGNALS_ISSUE_CLUSTER_BIND
|
||||
`define SCOPE_SIGNALS_ISSUE_IO
|
||||
`define SCOPE_SIGNALS_ISSUE_BIND
|
||||
`define SCOPE_SIGNALS_ISSUE_CLUSTER_SELECT(__i__)
|
||||
`define SCOPE_SIGNALS_ISSUE_SELECT(__i__)
|
||||
`define SCOPE_SIGNALS_EXECUTE_TOP_IO
|
||||
`define SCOPE_SIGNALS_EXECUTE_TOP_BIND
|
||||
`define SCOPE_SIGNALS_EXECUTE_CLUSTER_IO
|
||||
`define SCOPE_SIGNALS_EXECUTE_CLUSTER_BIND
|
||||
`define SCOPE_SIGNALS_EXECUTE_IO
|
||||
`define SCOPE_SIGNALS_EXECUTE_BIND
|
||||
`define SCOPE_SIGNALS_EXECUTE_CLUSTER_SELECT(__i__)
|
||||
`define SCOPE_SIGNALS_EXECUTE_SELECT(__i__)
|
||||
`define SCOPE_SIGNALS_BANK_L3_TOP_IO
|
||||
`define SCOPE_SIGNALS_BANK_L3_TOP_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L2_TOP_IO
|
||||
`define SCOPE_SIGNALS_BANK_L2_TOP_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L1D_TOP_IO
|
||||
`define SCOPE_SIGNALS_BANK_L1D_TOP_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L1I_TOP_IO
|
||||
`define SCOPE_SIGNALS_BANK_L1I_TOP_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L1S_TOP_IO
|
||||
`define SCOPE_SIGNALS_BANK_L1S_TOP_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L2_CLUSTER_IO
|
||||
`define SCOPE_SIGNALS_BANK_L2_CLUSTER_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L1D_CLUSTER_IO
|
||||
`define SCOPE_SIGNALS_BANK_L1D_CLUSTER_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L1I_CLUSTER_IO
|
||||
`define SCOPE_SIGNALS_BANK_L1I_CLUSTER_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L1S_CLUSTER_IO
|
||||
`define SCOPE_SIGNALS_BANK_L1S_CLUSTER_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L1D_CORE_IO
|
||||
`define SCOPE_SIGNALS_BANK_L1D_CORE_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L1I_CORE_IO
|
||||
`define SCOPE_SIGNALS_BANK_L1I_CORE_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L1S_CORE_IO
|
||||
`define SCOPE_SIGNALS_BANK_L1S_CORE_BIND
|
||||
`define SCOPE_SIGNALS_BANK_CACHE_IO
|
||||
`define SCOPE_SIGNALS_BANK_CACHE_BIND
|
||||
`define SCOPE_SIGNALS_BANK_IO
|
||||
`define SCOPE_SIGNALS_BANK_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L2_CLUSTER_SELECT(__i__)
|
||||
`define SCOPE_SIGNALS_BANK_L1D_CLUSTER_SELECT(__i__)
|
||||
`define SCOPE_SIGNALS_BANK_L1I_CLUSTER_SELECT(__i__)
|
||||
`define SCOPE_SIGNALS_BANK_L1S_CLUSTER_SELECT(__i__)
|
||||
`define SCOPE_SIGNALS_BANK_L1D_CORE_SELECT(__i__)
|
||||
`define SCOPE_SIGNALS_BANK_L1I_CORE_SELECT(__i__)
|
||||
`define SCOPE_SIGNALS_BANK_L1S_CORE_SELECT(__i__)
|
||||
`define SCOPE_SIGNALS_BANK_L3_CACHE_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L2_CACHE_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L1D_CACHE_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L1I_CACHE_BIND
|
||||
`define SCOPE_SIGNALS_BANK_L1S_CACHE_BIND
|
||||
`define SCOPE_SIGNALS_BANK_SELECT(__i__)
|
||||
`define SCOPE_IO_vortex_afu
|
||||
|
||||
`define SCOPE_IO_VX_icache_stage
|
||||
|
||||
`define SCOPE_IO_VX_fetch
|
||||
|
||||
`define SCOPE_BIND_VX_fetch_icache_stage()
|
||||
|
||||
`define SCOPE_IO_VX_pipeline
|
||||
|
||||
`define SCOPE_BIND_VX_pipeline_fetch()
|
||||
|
||||
`define SCOPE_IO_VX_core
|
||||
|
||||
`define SCOPE_BIND_VX_core_pipeline()
|
||||
|
||||
`define SCOPE_IO_VX_cluster
|
||||
|
||||
`define SCOPE_BIND_VX_cluster_core(__i__)
|
||||
|
||||
`define SCOPE_IO_Vortex
|
||||
|
||||
`define SCOPE_BIND_Vortex_cluster(__i__)
|
||||
|
||||
`define SCOPE_BIND_vortex_afu_vortex()
|
||||
|
||||
`define SCOPE_IO_VX_lsu_unit
|
||||
|
||||
`define SCOPE_IO_VX_execute
|
||||
|
||||
`define SCOPE_BIND_VX_execute_lsu_unit()
|
||||
|
||||
`define SCOPE_BIND_VX_pipeline_execute()
|
||||
|
||||
`define SCOPE_IO_VX_issue
|
||||
|
||||
`define SCOPE_BIND_VX_pipeline_issue()
|
||||
|
||||
`define SCOPE_IO_VX_bank
|
||||
|
||||
`define SCOPE_IO_VX_cache
|
||||
|
||||
`define SCOPE_BIND_VX_cache_bank(__i__)
|
||||
|
||||
`define SCOPE_BIND_Vortex_l3cache()
|
||||
|
||||
`define SCOPE_BIND_VX_cluster_l2cache()
|
||||
|
||||
`define SCOPE_IO_VX_mem_unit
|
||||
|
||||
`define SCOPE_BIND_VX_mem_unit_dcache()
|
||||
|
||||
`define SCOPE_BIND_VX_core_mem_unit()
|
||||
|
||||
`define SCOPE_BIND_VX_mem_unit_icache()
|
||||
|
||||
`define SCOPE_BIND_VX_mem_unit_smem()
|
||||
|
||||
`define SCOPE_DECL_SIGNALS
|
||||
|
||||
`define SCOPE_DATA_LIST
|
||||
|
||||
`define SCOPE_UPDATE_LIST
|
||||
|
||||
`define SCOPE_TRIGGER
|
||||
|
||||
`define SCOPE_ASSIGN(d,s)
|
||||
|
||||
`endif
|
||||
|
||||
@@ -28,12 +28,16 @@ typedef struct packed {
|
||||
logic [`NUM_THREADS-1:0] tmask;
|
||||
} gpu_tmc_t;
|
||||
|
||||
`define GPU_TMC_SIZE (1+`NUM_THREADS)
|
||||
|
||||
typedef struct packed {
|
||||
logic valid;
|
||||
logic [`NUM_WARPS-1:0] wmask;
|
||||
logic [31:0] pc;
|
||||
} gpu_wspawn_t;
|
||||
|
||||
`define GPU_WSPAWN_SIZE (1+`NUM_WARPS+32)
|
||||
|
||||
typedef struct packed {
|
||||
logic valid;
|
||||
logic diverged;
|
||||
@@ -42,10 +46,14 @@ typedef struct packed {
|
||||
logic [31:0] pc;
|
||||
} gpu_split_t;
|
||||
|
||||
`define GPU_SPLIT_SIZE (1+1+`NUM_THREADS+`NUM_THREADS+32)
|
||||
|
||||
typedef struct packed {
|
||||
logic valid;
|
||||
logic [`NB_BITS-1:0] id;
|
||||
logic [`NW_BITS-1:0] size_m1;
|
||||
} gpu_barrier_t;
|
||||
|
||||
`define GPU_BARRIER_SIZE (1+`NB_BITS+`NB_BITS)
|
||||
|
||||
`endif
|
||||
@@ -3,6 +3,8 @@
|
||||
module VX_warp_sched #(
|
||||
parameter CORE_ID = 0
|
||||
) (
|
||||
`SCOPE_IO_VX_warp_sched
|
||||
|
||||
input wire clk,
|
||||
input wire reset,
|
||||
|
||||
@@ -248,4 +250,11 @@ module VX_warp_sched #(
|
||||
|
||||
assign busy = (active_warps != 0);
|
||||
|
||||
`SCOPE_ASSIGN (scope_wsched_scheduled_warp, scheduled_warp);
|
||||
`SCOPE_ASSIGN (scope_wsched_active_warps, active_warps);
|
||||
`SCOPE_ASSIGN (scope_wsched_schedule_table, schedule_table);
|
||||
`SCOPE_ASSIGN (scope_wsched_schedule_ready, schedule_ready);
|
||||
`SCOPE_ASSIGN (scope_wsched_warp_to_schedule, warp_to_schedule);
|
||||
`SCOPE_ASSIGN (scope_wsched_warp_pc, warp_pc);
|
||||
|
||||
endmodule
|
||||
@@ -25,6 +25,7 @@ module VX_writeback #(
|
||||
|
||||
wire wb_valid;
|
||||
wire [`NW_BITS-1:0] wb_wid;
|
||||
wire [31:0] wb_PC;
|
||||
wire [`NUM_THREADS-1:0] wb_tmask;
|
||||
wire [`NR_BITS-1:0] wb_rd;
|
||||
wire [`NUM_THREADS-1:0][31:0] wb_data;
|
||||
@@ -42,6 +43,13 @@ module VX_writeback #(
|
||||
mul_valid ? mul_commit_if.wid :
|
||||
fpu_valid ? fpu_commit_if.wid :
|
||||
0;
|
||||
|
||||
assign wb_PC = alu_valid ? alu_commit_if.PC :
|
||||
lsu_valid ? lsu_commit_if.PC :
|
||||
csr_valid ? csr_commit_if.PC :
|
||||
mul_valid ? mul_commit_if.PC :
|
||||
fpu_valid ? fpu_commit_if.PC :
|
||||
0;
|
||||
|
||||
assign wb_tmask = alu_valid ? alu_commit_if.tmask :
|
||||
lsu_valid ? lsu_commit_if.tmask :
|
||||
@@ -68,16 +76,16 @@ module VX_writeback #(
|
||||
wire stall = 0/*~writeback_if.ready && writeback_if.valid*/;
|
||||
|
||||
VX_generic_register #(
|
||||
.N(1 + `NW_BITS + `NUM_THREADS + `NR_BITS + (`NUM_THREADS * 32))
|
||||
.N(1 + `NW_BITS + 32 + `NUM_THREADS + `NR_BITS + (`NUM_THREADS * 32))
|
||||
) wb_reg (
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
.stall (stall),
|
||||
.flush (1'b0),
|
||||
.in ({wb_valid, wb_wid, wb_tmask, wb_rd, wb_data}),
|
||||
.out ({writeback_if.valid, writeback_if.wid, writeback_if.tmask, writeback_if.rd, writeback_if.data})
|
||||
.in ({wb_valid, wb_wid, wb_PC, wb_tmask, wb_rd, wb_data}),
|
||||
.out ({writeback_if.valid, writeback_if.wid, writeback_if.PC, writeback_if.tmask, writeback_if.rd, writeback_if.data})
|
||||
);
|
||||
|
||||
|
||||
assign alu_commit_if.ready = !stall;
|
||||
assign lsu_commit_if.ready = !stall && !alu_valid;
|
||||
assign csr_commit_if.ready = !stall && !alu_valid && !lsu_valid;
|
||||
|
||||
@@ -1,15 +1,7 @@
|
||||
`include "VX_define.vh"
|
||||
|
||||
module Vortex (
|
||||
`SCOPE_SIGNALS_ISTAGE_TOP_IO
|
||||
`SCOPE_SIGNALS_LSU_TOP_IO
|
||||
`SCOPE_SIGNALS_BANK_L3_TOP_IO
|
||||
`SCOPE_SIGNALS_BANK_L2_TOP_IO
|
||||
`SCOPE_SIGNALS_BANK_L1D_TOP_IO
|
||||
`SCOPE_SIGNALS_BANK_L1I_TOP_IO
|
||||
`SCOPE_SIGNALS_BANK_L1S_TOP_IO
|
||||
`SCOPE_SIGNALS_ISSUE_TOP_IO
|
||||
`SCOPE_SIGNALS_EXECUTE_TOP_IO
|
||||
`SCOPE_IO_Vortex
|
||||
|
||||
// Clock
|
||||
input wire clk,
|
||||
@@ -79,14 +71,7 @@ module Vortex (
|
||||
VX_cluster #(
|
||||
.CLUSTER_ID(0)
|
||||
) cluster (
|
||||
`SCOPE_SIGNALS_ISTAGE_CLUSTER_SELECT(0)
|
||||
`SCOPE_SIGNALS_LSU_CLUSTER_SELECT(0)
|
||||
`SCOPE_SIGNALS_BANK_L2_CLUSTER_SELECT(0)
|
||||
`SCOPE_SIGNALS_BANK_L1D_CLUSTER_SELECT(0)
|
||||
`SCOPE_SIGNALS_BANK_L1I_CLUSTER_SELECT(0)
|
||||
`SCOPE_SIGNALS_BANK_L1S_CLUSTER_SELECT(0)
|
||||
`SCOPE_SIGNALS_ISSUE_CLUSTER_SELECT(0)
|
||||
`SCOPE_SIGNALS_EXECUTE_CLUSTER_SELECT(0)
|
||||
`SCOPE_BIND_Vortex_cluster(0)
|
||||
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
@@ -200,14 +185,7 @@ module Vortex (
|
||||
VX_cluster #(
|
||||
.CLUSTER_ID(i)
|
||||
) cluster (
|
||||
`SCOPE_SIGNALS_ISTAGE_CLUSTER_SELECT(i)
|
||||
`SCOPE_SIGNALS_LSU_CLUSTER_SELECT(i)
|
||||
`SCOPE_SIGNALS_BANK_L2_CLUSTER_SELECT(i)
|
||||
`SCOPE_SIGNALS_BANK_L1D_CLUSTER_SELECT(i)
|
||||
`SCOPE_SIGNALS_BANK_L1I_CLUSTER_SELECT(i)
|
||||
`SCOPE_SIGNALS_BANK_L1S_CLUSTER_SELECT(i)
|
||||
`SCOPE_SIGNALS_ISSUE_CLUSTER_SELECT(i)
|
||||
`SCOPE_SIGNALS_EXECUTE_CLUSTER_SELECT(i)
|
||||
`SCOPE_BIND_Vortex_cluster(i)
|
||||
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
@@ -417,7 +395,7 @@ module Vortex (
|
||||
.SNP_REQ_TAG_WIDTH (`L3SNP_TAG_WIDTH),
|
||||
.SNP_FWD_TAG_WIDTH (`L2SNP_TAG_WIDTH)
|
||||
) l3cache (
|
||||
`SCOPE_SIGNALS_BANK_L3_CACHE_BIND
|
||||
`SCOPE_BIND_Vortex_l3cache()
|
||||
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
|
||||
32
hw/rtl/cache/VX_bank.v
vendored
32
hw/rtl/cache/VX_bank.v
vendored
@@ -50,7 +50,7 @@ module VX_bank #(
|
||||
// Snooping request tag width
|
||||
parameter SNP_REQ_TAG_WIDTH = 0
|
||||
) (
|
||||
`SCOPE_SIGNALS_BANK_IO
|
||||
`SCOPE_IO_VX_bank
|
||||
|
||||
input wire clk,
|
||||
input wire reset,
|
||||
@@ -143,7 +143,7 @@ module VX_bank #(
|
||||
) snp_req_queue (
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
.push (snp_req_valid),
|
||||
.push (snp_req_valid && snp_req_ready),
|
||||
.data_in ({snp_req_addr, snp_req_invalidate, snp_req_tag}),
|
||||
.pop (snrq_pop),
|
||||
.data_out({snrq_addr_st0, snrq_invalidate_st0, snrq_tag_st0}),
|
||||
@@ -166,7 +166,7 @@ module VX_bank #(
|
||||
) dfp_queue (
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
.push (dram_fill_rsp_valid),
|
||||
.push (dram_fill_rsp_valid && dram_fill_rsp_ready),
|
||||
.data_in ({dram_fill_rsp_addr, dram_fill_rsp_data}),
|
||||
.pop (dfpq_pop),
|
||||
.data_out({dfpq_addr_st0, dfpq_filldata_st0}),
|
||||
@@ -353,7 +353,7 @@ module VX_bank #(
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
.stall (stall_bank_pipe),
|
||||
.flush (0),
|
||||
.flush (1'b0),
|
||||
.in ({qual_is_mrvq_st0, qual_is_snp_st0, qual_snp_invalidate_st0, qual_going_to_write_st0, qual_valid_st0, qual_addr_st0, qual_wsel_st0, qual_writeword_st0, qual_inst_meta_st0, qual_is_fill_st0, qual_writedata_st0}),
|
||||
.out ({is_mrvq_st1 , is_snp_st1, snp_invalidate_st1, going_to_write_st1, valid_st1, addr_st1, wsel_st1, writeword_st1, inst_meta_st1, is_fill_st1, writedata_st1})
|
||||
);
|
||||
@@ -480,7 +480,7 @@ module VX_bank #(
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
.stall (stall_bank_pipe),
|
||||
.flush (0),
|
||||
.flush (1'b0),
|
||||
.in ({mrvq_recover_ready_state_st1, is_mrvq_st1_st2, mrvq_init_ready_state_st1, snp_to_mrvq_st1, is_snp_st1, snp_invalidate_st1, fill_saw_dirty_st1, is_fill_st1, qual_valid_st1_2, addr_st1, wsel_st1, writeword_st1, readword_st1, readdata_st1, readtag_st1, miss_st1, dirty_st1, dirtyb_st1, inst_meta_st1}),
|
||||
.out ({mrvq_recover_ready_state_st2 , is_mrvq_st2 , mrvq_init_ready_state_unqual_st2, snp_to_mrvq_st2 , is_snp_st2 , snp_invalidate_st2, fill_saw_dirty_st2 , is_fill_st2 , valid_st2 , addr_st2, wsel_st2, writeword_st2, readword_st2, readdata_st2, readtag_st2, miss_st2, dirty_st2, dirtyb_st2, inst_meta_st2})
|
||||
);
|
||||
@@ -722,18 +722,18 @@ module VX_bank #(
|
||||
end
|
||||
`endif
|
||||
|
||||
`SCOPE_ASSIGN (scope_bank_valid_st0, qual_valid_st0);
|
||||
`SCOPE_ASSIGN (scope_bank_valid_st1, valid_st1);
|
||||
`SCOPE_ASSIGN (scope_bank_valid_st2, valid_st2);
|
||||
`SCOPE_ASSIGN (scope_valid_st0, qual_valid_st0);
|
||||
`SCOPE_ASSIGN (scope_valid_st1, valid_st1);
|
||||
`SCOPE_ASSIGN (scope_valid_st2, valid_st2);
|
||||
|
||||
`SCOPE_ASSIGN (scope_bank_is_mrvq_st1, is_mrvq_st1);
|
||||
`SCOPE_ASSIGN (scope_bank_miss_st1, miss_st1);
|
||||
`SCOPE_ASSIGN (scope_bank_dirty_st1, dirty_st1);
|
||||
`SCOPE_ASSIGN (scope_bank_force_miss_st1, force_request_miss_st1);
|
||||
`SCOPE_ASSIGN (scope_bank_stall_pipe, stall_bank_pipe);
|
||||
`SCOPE_ASSIGN (scope_is_mrvq_st1, is_mrvq_st1);
|
||||
`SCOPE_ASSIGN (scope_miss_st1, miss_st1);
|
||||
`SCOPE_ASSIGN (scope_dirty_st1, dirty_st1);
|
||||
`SCOPE_ASSIGN (scope_force_miss_st1, force_request_miss_st1);
|
||||
`SCOPE_ASSIGN (scope_stall_pipe, stall_bank_pipe);
|
||||
|
||||
`SCOPE_ASSIGN (scope_bank_addr_st0, `LINE_TO_BYTE_ADDR(qual_addr_st0, BANK_ID));
|
||||
`SCOPE_ASSIGN (scope_bank_addr_st1, `LINE_TO_BYTE_ADDR(addr_st1, BANK_ID));
|
||||
`SCOPE_ASSIGN (scope_bank_addr_st2, `LINE_TO_BYTE_ADDR(addr_st2, BANK_ID));
|
||||
`SCOPE_ASSIGN (scope_addr_st0, `LINE_TO_BYTE_ADDR(qual_addr_st0, BANK_ID));
|
||||
`SCOPE_ASSIGN (scope_addr_st1, `LINE_TO_BYTE_ADDR(addr_st1, BANK_ID));
|
||||
`SCOPE_ASSIGN (scope_addr_st2, `LINE_TO_BYTE_ADDR(addr_st2, BANK_ID));
|
||||
|
||||
endmodule
|
||||
|
||||
8
hw/rtl/cache/VX_cache.v
vendored
8
hw/rtl/cache/VX_cache.v
vendored
@@ -51,15 +51,15 @@ module VX_cache #(
|
||||
parameter DRAM_TAG_WIDTH = 28,
|
||||
|
||||
// Number of snoop forwarding requests
|
||||
parameter NUM_SNP_REQUESTS = 2,
|
||||
parameter NUM_SNP_REQUESTS = 1,
|
||||
|
||||
// Snooping request tag width
|
||||
parameter SNP_REQ_TAG_WIDTH = 28,
|
||||
parameter SNP_REQ_TAG_WIDTH = 1,
|
||||
|
||||
// Snooping forward tag width
|
||||
parameter SNP_FWD_TAG_WIDTH = 1
|
||||
) (
|
||||
`SCOPE_SIGNALS_BANK_CACHE_IO
|
||||
`SCOPE_IO_VX_cache
|
||||
|
||||
input wire clk,
|
||||
input wire reset,
|
||||
@@ -365,7 +365,7 @@ module VX_cache #(
|
||||
.CORE_TAG_ID_BITS (CORE_TAG_ID_BITS),
|
||||
.SNP_REQ_TAG_WIDTH (SNP_REQ_TAG_WIDTH)
|
||||
) bank (
|
||||
`SCOPE_SIGNALS_BANK_SELECT(i)
|
||||
`SCOPE_BIND_VX_cache_bank(i)
|
||||
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
|
||||
2
hw/rtl/cache/VX_cache_core_rsp_merge.v
vendored
2
hw/rtl/cache/VX_cache_core_rsp_merge.v
vendored
@@ -91,7 +91,7 @@ module VX_cache_core_rsp_merge #(
|
||||
.clk (clk),
|
||||
.reset (reset),
|
||||
.stall (stall),
|
||||
.flush (0),
|
||||
.flush (1'b0),
|
||||
.in ({core_rsp_valid_unqual, core_rsp_data_unqual, core_rsp_tag_unqual}),
|
||||
.out ({core_rsp_valid, core_rsp_data, core_rsp_tag})
|
||||
);
|
||||
|
||||
12
hw/rtl/cache/VX_cache_miss_resrv.v
vendored
12
hw/rtl/cache/VX_cache_miss_resrv.v
vendored
@@ -125,12 +125,12 @@ module VX_cache_miss_resrv #(
|
||||
ready_table[enqueue_index] <= mrvq_init_ready_state;
|
||||
addr_table[enqueue_index] <= miss_add_addr;
|
||||
metadata_table[enqueue_index] <= {miss_add_data, miss_add_tid, miss_add_tag, miss_add_rw, miss_add_byteen, miss_add_wsel, miss_add_is_snp, miss_add_snp_invalidate};
|
||||
tail_ptr <= tail_ptr + 1;
|
||||
tail_ptr <= tail_ptr + $bits(tail_ptr)'(1);
|
||||
end else if (increment_head) begin
|
||||
valid_table[head_ptr] <= 0;
|
||||
head_ptr <= head_ptr + 1;
|
||||
head_ptr <= head_ptr + $bits(head_ptr)'(1);
|
||||
end else if (recover_state) begin
|
||||
schedule_ptr <= schedule_ptr - 1;
|
||||
schedule_ptr <= schedule_ptr - $bits(schedule_ptr)'(1);
|
||||
end
|
||||
|
||||
// update entry as 'ready' during DRAM fill response
|
||||
@@ -140,15 +140,15 @@ module VX_cache_miss_resrv #(
|
||||
|
||||
if (mrvq_pop) begin
|
||||
ready_table[dequeue_index] <= 0;
|
||||
schedule_ptr <= schedule_ptr + 1;
|
||||
schedule_ptr <= schedule_ptr + $bits(schedule_ptr)'(1);
|
||||
end
|
||||
|
||||
if (!(mrvq_push && increment_head)) begin
|
||||
if (mrvq_push) begin
|
||||
size <= size + 1;
|
||||
size <= size + $bits(size)'(1);
|
||||
end
|
||||
if (increment_head) begin
|
||||
size <= size - 1;
|
||||
size <= size - $bits(size)'(1);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -19,15 +19,14 @@ module VX_generic_queue #(
|
||||
);
|
||||
`STATIC_ASSERT(`ISPOW2(SIZE), ("must be 0 or power of 2!"))
|
||||
|
||||
reg [SIZEW-1:0] size_r;
|
||||
wire reading;
|
||||
wire writing;
|
||||
|
||||
assign reading = pop && !empty;
|
||||
assign writing = push && !full;
|
||||
always @(*) begin
|
||||
assert(!pop || !empty);
|
||||
assert(!push || !full);
|
||||
end
|
||||
|
||||
if (SIZE == 1) begin // (SIZE == 1)
|
||||
|
||||
reg [SIZEW-1:0] size_r;
|
||||
reg [DATAW-1:0] head_r;
|
||||
|
||||
always @(posedge clk) begin
|
||||
@@ -35,12 +34,12 @@ module VX_generic_queue #(
|
||||
head_r <= 0;
|
||||
size_r <= 0;
|
||||
end else begin
|
||||
if (writing && !reading) begin
|
||||
if (push && !pop) begin
|
||||
size_r <= 1;
|
||||
end else if (reading && !writing) begin
|
||||
end else if (pop && !push) begin
|
||||
size_r <= 0;
|
||||
end
|
||||
if (writing) begin
|
||||
if (push) begin
|
||||
head_r <= data_in;
|
||||
end
|
||||
end
|
||||
@@ -52,11 +51,59 @@ module VX_generic_queue #(
|
||||
assign size = size_r;
|
||||
|
||||
end else begin // (SIZE > 1)
|
||||
|
||||
`ifdef QUARTUS
|
||||
|
||||
scfifo scfifo_component (
|
||||
.clock (clk),
|
||||
.data (data_in),
|
||||
.rdreq (pop),
|
||||
.wrreq (push),
|
||||
.empty (empty),
|
||||
.full (full),
|
||||
.q (data_out),
|
||||
.sclr (reset),
|
||||
.usedw (),
|
||||
.aclr (),
|
||||
.almost_empty (),
|
||||
.almost_full (),
|
||||
.eccstatus ()
|
||||
);
|
||||
|
||||
defparam
|
||||
scfifo_component.lpm_type = "scfifo",
|
||||
scfifo_component.intended_device_family = "Arria 10",
|
||||
scfifo_component.lpm_numwords = SIZE,
|
||||
scfifo_component.lpm_width = DATAW,
|
||||
scfifo_component.lpm_widthu = $clog2(SIZE),
|
||||
scfifo_component.lpm_showahead = "ON",
|
||||
scfifo_component.add_ram_output_register = (BUFFERED ? "ON" : "ON"),
|
||||
scfifo_component.use_eab = "ON";
|
||||
|
||||
reg [SIZEW-1:0] size_r;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (reset) begin
|
||||
size_r <= 0;
|
||||
end else begin
|
||||
if (push && !pop) begin
|
||||
size_r <= size_r + SIZEW'(1);
|
||||
end
|
||||
if (pop && !push) begin
|
||||
size_r <= size_r - SIZEW'(1);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
assign size = size_r;
|
||||
|
||||
`else
|
||||
|
||||
`USE_FAST_BRAM reg [DATAW-1:0] data [SIZE-1:0];
|
||||
|
||||
if (0 == BUFFERED) begin
|
||||
if (0 == BUFFERED) begin
|
||||
|
||||
reg [SIZEW-1:0] size_r;
|
||||
reg [ADDRW:0] rd_ptr_r;
|
||||
reg [ADDRW:0] wr_ptr_r;
|
||||
|
||||
@@ -69,30 +116,35 @@ module VX_generic_queue #(
|
||||
wr_ptr_r <= 0;
|
||||
size_r <= 0;
|
||||
end else begin
|
||||
if (writing) begin
|
||||
data[wr_ptr_a] <= data_in;
|
||||
wr_ptr_r <= wr_ptr_r + 1;
|
||||
if (!reading) begin
|
||||
size_r <= size_r + 1;
|
||||
if (push) begin
|
||||
wr_ptr_r <= wr_ptr_r + (ADDRW+1)'(1);
|
||||
if (!pop) begin
|
||||
size_r <= size_r + SIZEW'(1);
|
||||
end
|
||||
end
|
||||
|
||||
if (reading) begin
|
||||
rd_ptr_r <= rd_ptr_r + 1;
|
||||
if (!writing) begin
|
||||
size_r <= size_r - 1;
|
||||
if (pop) begin
|
||||
rd_ptr_r <= rd_ptr_r + (ADDRW+1)'(1);
|
||||
if (!push) begin
|
||||
size_r <= size_r - SIZEW'(1);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (push) begin
|
||||
data[wr_ptr_a] <= data_in;
|
||||
end
|
||||
end
|
||||
|
||||
assign data_out = data[rd_ptr_a];
|
||||
assign data_out = data[rd_ptr_a];
|
||||
assign empty = (wr_ptr_r == rd_ptr_r);
|
||||
assign full = (wr_ptr_a == rd_ptr_a) && (wr_ptr_r[ADDRW] != rd_ptr_r[ADDRW]);
|
||||
assign size = size_r;
|
||||
assign size = size_r;
|
||||
|
||||
end else begin
|
||||
|
||||
reg [SIZEW-1:0] size_r;
|
||||
reg [DATAW-1:0] head_r;
|
||||
reg [DATAW-1:0] curr_r;
|
||||
reg [ADDRW-1:0] wr_ptr_r;
|
||||
@@ -105,7 +157,6 @@ module VX_generic_queue #(
|
||||
always @(posedge clk) begin
|
||||
if (reset) begin
|
||||
size_r <= 0;
|
||||
head_r <= 0;
|
||||
curr_r <= 0;
|
||||
wr_ptr_r <= 0;
|
||||
rd_ptr_r <= 0;
|
||||
@@ -113,43 +164,50 @@ module VX_generic_queue #(
|
||||
empty_r <= 1;
|
||||
full_r <= 0;
|
||||
end else begin
|
||||
if (writing) begin
|
||||
data[wr_ptr_r] <= data_in;
|
||||
wr_ptr_r <= wr_ptr_r + 1;
|
||||
if (push) begin
|
||||
wr_ptr_r <= wr_ptr_r + ADDRW'(1);
|
||||
|
||||
if (!reading) begin
|
||||
if (!pop) begin
|
||||
empty_r <= 0;
|
||||
if (size_r == ($bits(size_r)'(SIZE-1))) begin
|
||||
if (size_r == SIZEW'(SIZE-1)) begin
|
||||
full_r <= 1;
|
||||
end
|
||||
size_r <= size_r + 1;
|
||||
size_r <= size_r + SIZEW'(1);
|
||||
end
|
||||
end
|
||||
|
||||
if (reading) begin
|
||||
if (pop) begin
|
||||
rd_ptr_r <= rd_ptr_next_r;
|
||||
|
||||
if (SIZE > 2) begin
|
||||
rd_ptr_next_r <= rd_ptr_r + $bits(rd_ptr_r)'(2);
|
||||
rd_ptr_next_r <= rd_ptr_r + ADDRW'(2);
|
||||
end else begin // (SIZE == 2);
|
||||
rd_ptr_next_r <= ~rd_ptr_next_r;
|
||||
end
|
||||
|
||||
if (!writing) begin
|
||||
if (size_r == 1) begin
|
||||
if (!push) begin
|
||||
if (size_r == SIZEW'(1)) begin
|
||||
assert(rd_ptr_next_r == wr_ptr_r);
|
||||
empty_r <= 1;
|
||||
end;
|
||||
full_r <= 0;
|
||||
size_r <= size_r - 1;
|
||||
size_r <= size_r - SIZEW'(1);
|
||||
end
|
||||
end
|
||||
|
||||
bypass_r <= writing
|
||||
&& (empty_r || ((1 == size_r) && reading)); // empty or about to go empty
|
||||
|
||||
bypass_r <= push && (empty_r || ((size_r == SIZEW'(1)) && pop));
|
||||
curr_r <= data_in;
|
||||
head_r <= data[reading ? rd_ptr_next_r : rd_ptr_r];
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (reset) begin
|
||||
head_r <= 0;
|
||||
end else begin
|
||||
if (push) begin
|
||||
data[wr_ptr_r] <= data_in;
|
||||
end
|
||||
head_r <= data[pop ? rd_ptr_next_r : rd_ptr_r];
|
||||
end
|
||||
end
|
||||
|
||||
@@ -158,6 +216,9 @@ module VX_generic_queue #(
|
||||
assign full = full_r;
|
||||
assign size = size_r;
|
||||
end
|
||||
|
||||
`endif
|
||||
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -28,9 +28,13 @@ module VX_index_queue #(
|
||||
assign empty = (wr_ptr == rd_ptr);
|
||||
assign full = (wr_a == rd_a) && (wr_ptr[`LOG2UP(SIZE)] != rd_ptr[`LOG2UP(SIZE)]);
|
||||
|
||||
assign enqueue = push && !full;
|
||||
assign enqueue = push;
|
||||
assign dequeue = !empty && !valid[rd_a]; // auto-remove when head is invalid
|
||||
|
||||
always @(*) begin
|
||||
assert(!push || !full);
|
||||
end
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (reset) begin
|
||||
rd_ptr <= 0;
|
||||
|
||||
@@ -126,11 +126,11 @@ module VX_scope #(
|
||||
|| (trigger_id != prev_trigger_id)) begin
|
||||
delta_store[waddr] <= delta;
|
||||
data_store[waddr] <= data_in;
|
||||
waddr <= waddr + 1;
|
||||
waddr <= waddr + $bits(waddr)'(1);
|
||||
delta <= 0;
|
||||
delta_flush <= 0;
|
||||
end else begin
|
||||
delta <= delta + 1;
|
||||
delta <= delta + DELTAW'(1);
|
||||
delta_flush <= (delta == (MAX_DELTA-1));
|
||||
end
|
||||
prev_trigger_id <= trigger_id;
|
||||
@@ -159,7 +159,7 @@ module VX_scope #(
|
||||
if (read_offset < $bits(read_offset)'(DATAW-BUSW)) begin
|
||||
read_offset <= read_offset + $bits(read_offset)'(BUSW);
|
||||
end else begin
|
||||
raddr <= raddr + 1;
|
||||
raddr <= raddr + $bits(raddr)'(1);
|
||||
read_offset <= 0;
|
||||
read_delta <= 1;
|
||||
if (raddr == waddr) begin
|
||||
|
||||
Reference in New Issue
Block a user