Fixed all Cache Warnings

This commit is contained in:
felsabbagh3
2020-03-07 14:34:05 -08:00
17 changed files with 204 additions and 168 deletions

View File

@@ -46,5 +46,8 @@ debug: compdebug
w: VERILATORnoWarnings w: VERILATORnoWarnings
$(MAKECPP) $(MAKECPP)
run: w
(cd obj_dir && ./VVortex)
clean: clean:
rm obj_dir/* rm obj_dir/*

View File

@@ -50,11 +50,12 @@ module VX_bank
// Input Core Request // Input Core Request
input wire delay_req, input wire delay_req,
input wire [NUMBER_REQUESTS-1:0] bank_valids, input wire [NUMBER_REQUESTS-1:0] bank_valids,
input wire [NUMBER_REQUESTS-1:0][31:0] bank_addr, input wire [NUMBER_REQUESTS-1:0][31:0] bank_addr,
input wire [NUMBER_REQUESTS-1:0][31:0] bank_writedata, input wire [NUMBER_REQUESTS-1:0][31:0] bank_writedata,
input wire [4:0] bank_rd, input wire [4:0] bank_rd,
input wire [1:0] bank_wb, input wire [1:0] bank_wb,
input wire [31:0] bank_pc,
input wire [`NW_M1:0] bank_warp_num, input wire [`NW_M1:0] bank_warp_num,
input wire [2:0] bank_mem_read, input wire [2:0] bank_mem_read,
input wire [2:0] bank_mem_write, input wire [2:0] bank_mem_write,
@@ -63,11 +64,12 @@ module VX_bank
// Output Core WB // Output Core WB
input wire bank_wb_pop, input wire bank_wb_pop,
output wire bank_wb_valid, output wire bank_wb_valid,
output wire [`vx_clog2(NUMBER_REQUESTS)-1:0] bank_wb_tid, output wire [`vx_clog2(NUMBER_REQUESTS)-1:0] bank_wb_tid,
output wire [4:0] bank_wb_rd, output wire [4:0] bank_wb_rd,
output wire [1:0] bank_wb_wb, output wire [1:0] bank_wb_wb,
output wire [`NW_M1:0] bank_wb_warp_num, output wire [`NW_M1:0] bank_wb_warp_num,
output wire [31:0] bank_wb_data, output wire [31:0] bank_wb_data,
output wire [31:0] bank_wb_pc,
// Dram Fill Requests // Dram Fill Requests
output wire dram_fill_req, output wire dram_fill_req,
@@ -158,6 +160,7 @@ module VX_bank
wire [2:0] reqq_req_mem_read_st0; wire [2:0] reqq_req_mem_read_st0;
wire [2:0] reqq_req_mem_write_st0; wire [2:0] reqq_req_mem_write_st0;
reg reqq_hazard_st0; reg reqq_hazard_st0;
wire [31:0] reqq_req_pc_st0;
assign reqq_push = !delay_req && (|bank_valids); assign reqq_push = !delay_req && (|bank_valids);
@@ -189,6 +192,7 @@ module VX_bank
.bank_addr (bank_addr), .bank_addr (bank_addr),
.bank_writedata (bank_writedata), .bank_writedata (bank_writedata),
.bank_rd (bank_rd), .bank_rd (bank_rd),
.bank_pc (bank_pc),
.bank_wb (bank_wb), .bank_wb (bank_wb),
.bank_warp_num (bank_warp_num), .bank_warp_num (bank_warp_num),
.bank_mem_read (bank_mem_read), .bank_mem_read (bank_mem_read),
@@ -205,6 +209,7 @@ module VX_bank
.reqq_req_warp_num_st0 (reqq_req_warp_num_st0), .reqq_req_warp_num_st0 (reqq_req_warp_num_st0),
.reqq_req_mem_read_st0 (reqq_req_mem_read_st0), .reqq_req_mem_read_st0 (reqq_req_mem_read_st0),
.reqq_req_mem_write_st0(reqq_req_mem_write_st0), .reqq_req_mem_write_st0(reqq_req_mem_write_st0),
.reqq_req_pc_st0 (reqq_req_pc_st0),
.reqq_empty (reqq_empty), .reqq_empty (reqq_empty),
.reqq_full (reqq_full) .reqq_full (reqq_full)
); );
@@ -217,6 +222,7 @@ module VX_bank
wire [31:0] mrvq_writeword_st0; wire [31:0] mrvq_writeword_st0;
wire [4:0] mrvq_rd_st0; wire [4:0] mrvq_rd_st0;
wire [1:0] mrvq_wb_st0; wire [1:0] mrvq_wb_st0;
wire [31:0] miss_resrv_pc_st0;
wire [`NW_M1:0] mrvq_warp_num_st0; wire [`NW_M1:0] mrvq_warp_num_st0;
wire [2:0] mrvq_mem_read_st0; wire [2:0] mrvq_mem_read_st0;
wire [2:0] mrvq_mem_write_st0; wire [2:0] mrvq_mem_write_st0;
@@ -225,14 +231,16 @@ module VX_bank
wire miss_add; wire miss_add;
wire[31:0] miss_add_addr; wire[31:0] miss_add_addr;
wire[31:0] miss_add_data; wire[31:0] miss_add_data;
wire[`vx_clog2(NUMBER_REQUESTS)-1:0] miss_add_tid; wire[`vx_clog2(NUMBER_REQUESTS)-1:0] miss_add_tid;
wire[4:0] miss_add_rd; wire[4:0] miss_add_rd;
wire[1:0] miss_add_wb; wire[1:0] miss_add_wb;
wire[`NW_M1:0] miss_add_warp_num; wire[`NW_M1:0] miss_add_warp_num;
wire[2:0] miss_add_mem_read; wire[2:0] miss_add_mem_read;
wire[2:0] miss_add_mem_write; wire[2:0] miss_add_mem_write;
VX_cache_miss_resrv #( wire[31:0] miss_add_pc;
VX_cache_miss_resrv #(
.CACHE_SIZE_BYTES (CACHE_SIZE_BYTES), .CACHE_SIZE_BYTES (CACHE_SIZE_BYTES),
.BANK_LINE_SIZE_BYTES (BANK_LINE_SIZE_BYTES), .BANK_LINE_SIZE_BYTES (BANK_LINE_SIZE_BYTES),
.NUMBER_BANKS (NUMBER_BANKS), .NUMBER_BANKS (NUMBER_BANKS),
@@ -264,6 +272,7 @@ module VX_bank
.miss_add_warp_num (miss_add_warp_num), .miss_add_warp_num (miss_add_warp_num),
.miss_add_mem_read (miss_add_mem_read), .miss_add_mem_read (miss_add_mem_read),
.miss_add_mem_write (miss_add_mem_write), .miss_add_mem_write (miss_add_mem_write),
.miss_add_pc (miss_add_pc),
.miss_resrv_full (mrvq_full), .miss_resrv_full (mrvq_full),
// Broadcast // Broadcast
@@ -278,6 +287,7 @@ module VX_bank
.miss_resrv_tid_st0 (mrvq_tid_st0), .miss_resrv_tid_st0 (mrvq_tid_st0),
.miss_resrv_rd_st0 (mrvq_rd_st0), .miss_resrv_rd_st0 (mrvq_rd_st0),
.miss_resrv_wb_st0 (mrvq_wb_st0), .miss_resrv_wb_st0 (mrvq_wb_st0),
.miss_resrv_pc_st0 (miss_resrv_pc_st0),
.miss_resrv_warp_num_st0 (mrvq_warp_num_st0), .miss_resrv_warp_num_st0 (mrvq_warp_num_st0),
.miss_resrv_mem_read_st0 (mrvq_mem_read_st0), .miss_resrv_mem_read_st0 (mrvq_mem_read_st0),
.miss_resrv_mem_write_st0(mrvq_mem_write_st0) .miss_resrv_mem_write_st0(mrvq_mem_write_st0)
@@ -320,6 +330,7 @@ module VX_bank
wire [`REQ_INST_META_SIZE-1:0] qual_inst_meta_st0; wire [`REQ_INST_META_SIZE-1:0] qual_inst_meta_st0;
wire qual_going_to_write_st0; wire qual_going_to_write_st0;
wire qual_is_snp; wire qual_is_snp;
wire [31:0] qual_pc_st0;
wire valid_st1 [STAGE_1_CYCLES-1:0]; wire valid_st1 [STAGE_1_CYCLES-1:0];
wire going_to_write_st1[STAGE_1_CYCLES-1:0]; wire going_to_write_st1[STAGE_1_CYCLES-1:0];
@@ -329,6 +340,7 @@ module VX_bank
wire is_fill_st1 [STAGE_1_CYCLES-1:0]; wire is_fill_st1 [STAGE_1_CYCLES-1:0];
wire [`BANK_LINE_SIZE_RNG][31:0] writedata_st1 [STAGE_1_CYCLES-1:0]; wire [`BANK_LINE_SIZE_RNG][31:0] writedata_st1 [STAGE_1_CYCLES-1:0];
wire is_snp_st1 [STAGE_1_CYCLES-1:0]; wire is_snp_st1 [STAGE_1_CYCLES-1:0];
wire [31:0] pc_st1 [STAGE_1_CYCLES-1:0];
assign qual_is_fill_st0 = dfpq_pop; assign qual_is_fill_st0 = dfpq_pop;
assign qual_valid_st0 = dfpq_pop || mrvq_pop || reqq_pop || snrq_pop; assign qual_valid_st0 = dfpq_pop || mrvq_pop || reqq_pop || snrq_pop;
@@ -355,27 +367,32 @@ module VX_bank
(snrq_pop) ? 1 : (snrq_pop) ? 1 :
0; 0;
assign qual_pc_st0 = (reqq_pop) ? reqq_req_pc_st0 :
(mrvq_pop) ? miss_resrv_pc_st0 :
(dfpq_pop) ? 32'hdeadbeef :
(snrq_pop) ? 32'hb00b0000 :
32'h0;
assign qual_is_snp = snrq_pop ? 1 : 0; assign qual_is_snp = snrq_pop ? 1 : 0;
VX_generic_register #(.N( 1 + 1 + 1 + 32 + 32 + `REQ_INST_META_SIZE + (`BANK_LINE_SIZE_WORDS*32) + 1)) s0_1_c0 ( VX_generic_register #(.N( 1 + 1 + 1 + 32 + 32 + `REQ_INST_META_SIZE + (`BANK_LINE_SIZE_WORDS*32) + 1 + 32)) s0_1_c0 (
.clk (clk), .clk (clk),
.reset(reset), .reset(reset),
.stall(stall_bank_pipe), .stall(stall_bank_pipe),
.flush(0), .flush(0),
.in ({qual_is_snp , qual_going_to_write_st0, qual_valid_st0, qual_addr_st0, qual_writeword_st0, qual_inst_meta_st0, qual_is_fill_st0, qual_writedata_st0}), .in ({qual_is_snp , qual_going_to_write_st0, qual_valid_st0, qual_addr_st0, qual_writeword_st0, qual_inst_meta_st0, qual_is_fill_st0, qual_writedata_st0, qual_pc_st0 }),
.out ({is_snp_st1[0], going_to_write_st1[0] , valid_st1[0] , addr_st1[0] , writeword_st1[0] , inst_meta_st1[0] , is_fill_st1[0] , writedata_st1[0]}) .out ({is_snp_st1[0], going_to_write_st1[0] , valid_st1[0] , addr_st1[0] , writeword_st1[0] , inst_meta_st1[0] , is_fill_st1[0] , writedata_st1[0] , pc_st1[0]})
); );
genvar curr_stage; genvar curr_stage;
generate generate
for (curr_stage = 1; curr_stage < STAGE_1_CYCLES; curr_stage = curr_stage + 1) begin for (curr_stage = 1; curr_stage < STAGE_1_CYCLES; curr_stage = curr_stage + 1) begin
VX_generic_register #(.N( 1 + 1 + 1 + 32 + 32 + `REQ_INST_META_SIZE + (`BANK_LINE_SIZE_WORDS*32) + 1)) s0_1_cc ( VX_generic_register #(.N( 1 + 1 + 1 + 32 + 32 + `REQ_INST_META_SIZE + (`BANK_LINE_SIZE_WORDS*32) + 1 + 32)) s0_1_cc (
.clk (clk), .clk (clk),
.reset(reset), .reset(reset),
.stall(stall_bank_pipe), .stall(stall_bank_pipe),
.flush(0), .flush(0),
.in ({is_snp_st1[curr_stage-1], going_to_write_st1[curr_stage-1], valid_st1[curr_stage-1], addr_st1[curr_stage-1], writeword_st1[curr_stage-1], inst_meta_st1[curr_stage-1], is_fill_st1[curr_stage-1] , writedata_st1[curr_stage-1]}), .in ({is_snp_st1[curr_stage-1], going_to_write_st1[curr_stage-1], valid_st1[curr_stage-1], addr_st1[curr_stage-1], writeword_st1[curr_stage-1], inst_meta_st1[curr_stage-1], is_fill_st1[curr_stage-1] , writedata_st1[curr_stage-1], pc_st1[curr_stage-1]}),
.out ({is_snp_st1[curr_stage] , going_to_write_st1[curr_stage] , valid_st1[curr_stage] , addr_st1[curr_stage] , writeword_st1[curr_stage] , inst_meta_st1[curr_stage] , is_fill_st1[curr_stage] , writedata_st1[curr_stage] }) .out ({is_snp_st1[curr_stage] , going_to_write_st1[curr_stage] , valid_st1[curr_stage] , addr_st1[curr_stage] , writeword_st1[curr_stage] , inst_meta_st1[curr_stage] , is_fill_st1[curr_stage] , writedata_st1[curr_stage] , pc_st1[curr_stage]})
); );
end end
endgenerate endgenerate
@@ -386,6 +403,7 @@ module VX_bank
wire[`TAG_SELECT_SIZE_RNG] readtag_st1e; wire[`TAG_SELECT_SIZE_RNG] readtag_st1e;
wire miss_st1e; wire miss_st1e;
wire dirty_st1e; wire dirty_st1e;
wire[31:0] pc_st1e;
wire [4:0] rd_st1e; wire [4:0] rd_st1e;
@@ -398,7 +416,7 @@ module VX_bank
wire is_snp_st1e; wire is_snp_st1e;
assign is_snp_st1e = is_snp_st1[STAGE_1_CYCLES-1]; assign is_snp_st1e = is_snp_st1[STAGE_1_CYCLES-1];
assign pc_st1e = pc_st1[STAGE_1_CYCLES-1];
assign {rd_st1e, wb_st1e, warp_num_st1e, mem_read_st1e, mem_write_st1e, tid_st1e} = inst_meta_st1[STAGE_1_CYCLES-1]; assign {rd_st1e, wb_st1e, warp_num_st1e, mem_read_st1e, mem_write_st1e, tid_st1e} = inst_meta_st1[STAGE_1_CYCLES-1];
@@ -464,14 +482,15 @@ module VX_bank
wire is_fill_st2; wire is_fill_st2;
wire fill_saw_dirty_st2; wire fill_saw_dirty_st2;
wire is_snp_st2; wire is_snp_st2;
wire [31:0] pc_st2;
VX_generic_register #(.N( 1 + 1 + 1 + 1 + 32 + 32 + 32 + (`BANK_LINE_SIZE_WORDS * 32) + 1 + 1 + `REQ_INST_META_SIZE + `TAG_SELECT_NUM_BITS)) st_1e_2 ( VX_generic_register #(.N( 1 + 1 + 1 + 1 + 32 + 32 + 32 + (`BANK_LINE_SIZE_WORDS * 32) + 1 + 1 + `REQ_INST_META_SIZE + `TAG_SELECT_NUM_BITS + 32)) st_1e_2 (
.clk (clk), .clk (clk),
.reset(reset), .reset(reset),
.stall(stall_bank_pipe), .stall(stall_bank_pipe),
.flush(0), .flush(0),
.in ({is_snp_st1e, fill_saw_dirty_st1e, is_fill_st1[STAGE_1_CYCLES-1], qual_valid_st1e_2, addr_st1[STAGE_1_CYCLES-1], writeword_st1[STAGE_1_CYCLES-1], readword_st1e, readdata_st1e, readtag_st1e, miss_st1e, dirty_st1e, inst_meta_st1[STAGE_1_CYCLES-1]}), .in ({is_snp_st1e, fill_saw_dirty_st1e, is_fill_st1[STAGE_1_CYCLES-1], qual_valid_st1e_2, addr_st1[STAGE_1_CYCLES-1], writeword_st1[STAGE_1_CYCLES-1], readword_st1e, readdata_st1e, readtag_st1e, miss_st1e, dirty_st1e, pc_st1e, inst_meta_st1[STAGE_1_CYCLES-1]}),
.out ({is_snp_st2 , fill_saw_dirty_st2 , is_fill_st2 , valid_st2 , addr_st2 , writeword_st2 , readword_st2 , readdata_st2 , readtag_st2 , miss_st2 , dirty_st2 , inst_meta_st2 }) .out ({is_snp_st2 , fill_saw_dirty_st2 , is_fill_st2 , valid_st2 , addr_st2 , writeword_st2 , readword_st2 , readdata_st2 , readtag_st2 , miss_st2 , dirty_st2 , pc_st2 , inst_meta_st2 })
); );
@@ -485,23 +504,24 @@ module VX_bank
// Enqueue to CWB Queue // Enqueue to CWB Queue
wire cwbq_push = (valid_st2 && !miss_st2); wire cwbq_push = (valid_st2 && !miss_st2);
wire [31:0] cwbq_data = readword_st2; wire [31:0] cwbq_data = readword_st2;
wire [`vx_clog2(NUMBER_REQUESTS)-1:0] cwbq_tid = miss_add_tid; wire [`vx_clog2(NUMBER_REQUESTS)-1:0] cwbq_tid = miss_add_tid;
wire [4:0] cwbq_rd = miss_add_rd; wire [4:0] cwbq_rd = miss_add_rd;
wire [1:0] cwbq_wb = miss_add_wb; wire [1:0] cwbq_wb = miss_add_wb;
wire [`NW_M1:0] cwbq_warp_num = miss_add_warp_num; wire [`NW_M1:0] cwbq_warp_num = miss_add_warp_num;
wire [31:0] cwbq_pc = pc_st2;
wire cwbq_full; wire cwbq_full;
wire cwbq_empty; wire cwbq_empty;
assign bank_wb_valid = !cwbq_empty; assign bank_wb_valid = !cwbq_empty;
VX_generic_queue_ll #(.DATAW( `vx_clog2(NUMBER_REQUESTS) + 5 + 2 + (`NW_M1+1) + 32), .SIZE(CWBQ_SIZE)) cwb_queue( VX_generic_queue_ll #(.DATAW( `vx_clog2(NUMBER_REQUESTS) + 5 + 2 + (`NW_M1+1) + 32 + 32), .SIZE(CWBQ_SIZE)) cwb_queue(
.clk (clk), .clk (clk),
.reset (reset), .reset (reset),
.push (cwbq_push), .push (cwbq_push),
.in_data ({cwbq_tid, cwbq_rd, cwbq_wb, cwbq_warp_num, cwbq_data}), .in_data ({cwbq_tid, cwbq_rd, cwbq_wb, cwbq_warp_num, cwbq_data, cwbq_pc}),
.pop (bank_wb_pop), .pop (bank_wb_pop),
.out_data({bank_wb_tid, bank_wb_rd, bank_wb_wb, bank_wb_warp_num, bank_wb_data}), .out_data({bank_wb_tid, bank_wb_rd, bank_wb_wb, bank_wb_warp_num, bank_wb_data, bank_wb_pc}),
.empty (cwbq_empty), .empty (cwbq_empty),
.full (cwbq_full) .full (cwbq_full)
); );
@@ -552,7 +572,7 @@ module VX_bank
assign dram_fill_req_addr = addr_st2; assign dram_fill_req_addr = addr_st2;
assign dram_wb_req = !dwbq_empty; assign dram_wb_req = !dwbq_empty;
VX_generic_queue_ll #(.DATAW( 1 + 32 + (`BANK_LINE_SIZE_WORDS * 32) + 1 + 1), .SIZE(DWBQ_SIZE)) dwb_queue( VX_generic_queue_ll #(.DATAW( 32 + (`BANK_LINE_SIZE_WORDS * 32)), .SIZE(DWBQ_SIZE)) dwb_queue(
.clk (clk), .clk (clk),
.reset (reset), .reset (reset),
@@ -571,7 +591,7 @@ module VX_bank
wire llvq_full; wire llvq_full;
wire llvq_push = valid_st2 && !miss_st2; wire llvq_push = valid_st2 && !miss_st2;
wire[`BANK_LINE_SIZE_RNG][31:0] llvq_push_data = readdata_st2; wire[`BANK_LINE_SIZE_RNG][31:0] llvq_push_data = readdata_st2;
wire llvq_addr = addr_st2; wire[31:0] llvq_addr = addr_st2;
wire[`vx_clog2(NUMBER_REQUESTS)-1:0] llvq_tid = miss_add_tid; wire[`vx_clog2(NUMBER_REQUESTS)-1:0] llvq_tid = miss_add_tid;
assign llvq_valid = !llvq_empty; assign llvq_valid = !llvq_empty;

View File

@@ -59,15 +59,17 @@ module VX_cache
input wire [4:0] core_req_rd, input wire [4:0] core_req_rd,
input wire [1:0] core_req_wb, input wire [1:0] core_req_wb,
input wire [`NW_M1:0] core_req_warp_num, input wire [`NW_M1:0] core_req_warp_num,
input wire [31:0] core_req_pc,
output wire delay_req, output wire delay_req,
// Core Writeback // Core Writeback
input wire core_no_wb_slot, input wire core_no_wb_slot,
output wire [NUMBER_REQUESTS-1:0] core_wb_valid, output wire [NUMBER_REQUESTS-1:0] core_wb_valid,
output wire [4:0] core_wb_req_rd, output wire [4:0] core_wb_req_rd,
output wire [1:0] core_wb_req_wb, output wire [1:0] core_wb_req_wb,
output wire [`NW_M1:0] core_wb_warp_num, output wire [`NW_M1:0] core_wb_warp_num,
output wire [NUMBER_REQUESTS-1:0][31:0] core_wb_readdata, output wire [NUMBER_REQUESTS-1:0][31:0] core_wb_readdata,
output wire [NUMBER_REQUESTS-1:0][31:0] core_wb_pc,
// Dram Fill Response // Dram Fill Response
@@ -93,24 +95,25 @@ module VX_cache
// Lower Level Cache // Lower Level Cache
input wire llvq_pop, input wire llvq_pop,
output wire[NUMBER_REQUESTS-1:0] llvq_valid, output wire[NUMBER_REQUESTS-1:0] llvq_valid,
output wire[NUMBER_REQUESTS-1:0][31:0] llvq_res_addr, output wire[NUMBER_REQUESTS-1:0][31:0] llvq_res_addr,
output wire[NUMBER_REQUESTS-1:0][`BANK_LINE_SIZE_RNG][31:0] llvq_res_data output wire[NUMBER_REQUESTS-1:0][`BANK_LINE_SIZE_RNG][31:0] llvq_res_data
); );
wire [NUMBER_BANKS-1:0][NUMBER_REQUESTS-1:0] per_bank_valids; wire [NUMBER_BANKS-1:0][NUMBER_REQUESTS-1:0] per_bank_valids;
wire [NUMBER_BANKS-1:0] per_bank_wb_pop; wire [NUMBER_BANKS-1:0] per_bank_wb_pop;
wire [NUMBER_BANKS-1:0] per_bank_wb_valid; wire [NUMBER_BANKS-1:0] per_bank_wb_valid;
wire [NUMBER_BANKS-1:0][`vx_clog2(NUMBER_REQUESTS)-1:0] per_bank_wb_tid; wire [NUMBER_BANKS-1:0][`vx_clog2(NUMBER_REQUESTS)-1:0] per_bank_wb_tid;
wire [NUMBER_BANKS-1:0][4:0] per_bank_wb_rd; wire [NUMBER_BANKS-1:0][4:0] per_bank_wb_rd;
wire [NUMBER_BANKS-1:0][1:0] per_bank_wb_wb; wire [NUMBER_BANKS-1:0][1:0] per_bank_wb_wb;
wire [NUMBER_BANKS-1:0][`NW_M1:0] per_bank_wb_warp_num; wire [NUMBER_BANKS-1:0][`NW_M1:0] per_bank_wb_warp_num;
wire [NUMBER_BANKS-1:0][31:0] per_bank_wb_data; wire [NUMBER_BANKS-1:0][31:0] per_bank_wb_data;
wire [NUMBER_BANKS-1:0][31:0] per_bank_wb_pc;
wire dfqq_full; wire dfqq_full;
wire[NUMBER_BANKS-1:0] per_bank_dram_fill_req; wire[NUMBER_BANKS-1:0] per_bank_dram_fill_req;
wire[NUMBER_BANKS-1:0][31:0] per_bank_dram_fill_req_addr; wire[NUMBER_BANKS-1:0][31:0] per_bank_dram_fill_req_addr;
wire[NUMBER_BANKS-1:0] per_bank_dram_fill_accept; wire[NUMBER_BANKS-1:0] per_bank_dram_fill_accept;
@@ -128,7 +131,7 @@ module VX_cache
wire[NUMBER_BANKS-1:0] per_bank_llvq_valid; wire[NUMBER_BANKS-1:0] per_bank_llvq_valid;
wire[NUMBER_BANKS-1:0][31:0] per_bank_llvq_res_addr; wire[NUMBER_BANKS-1:0][31:0] per_bank_llvq_res_addr;
wire[NUMBER_BANKS-1:0][`BANK_LINE_SIZE_RNG][31:0] per_bank_llvq_res_data; wire[NUMBER_BANKS-1:0][`BANK_LINE_SIZE_RNG][31:0] per_bank_llvq_res_data;
wire [NUMBER_BANKS-1:0][`vx_clog2(NUMBER_REQUESTS)-1:0] per_bank_llvq_res_tid; wire [NUMBER_BANKS-1:0][`vx_clog2(NUMBER_REQUESTS)-1:0] per_bank_llvq_res_tid;
assign delay_req = (|per_bank_reqq_full); assign delay_req = (|per_bank_reqq_full);
@@ -256,6 +259,7 @@ module VX_cache
.per_bank_wb_valid (per_bank_wb_valid), .per_bank_wb_valid (per_bank_wb_valid),
.per_bank_wb_tid (per_bank_wb_tid), .per_bank_wb_tid (per_bank_wb_tid),
.per_bank_wb_rd (per_bank_wb_rd), .per_bank_wb_rd (per_bank_wb_rd),
.per_bank_wb_pc (per_bank_wb_pc),
.per_bank_wb_wb (per_bank_wb_wb), .per_bank_wb_wb (per_bank_wb_wb),
.per_bank_wb_warp_num(per_bank_wb_warp_num), .per_bank_wb_warp_num(per_bank_wb_warp_num),
.per_bank_wb_data (per_bank_wb_data), .per_bank_wb_data (per_bank_wb_data),
@@ -266,7 +270,8 @@ module VX_cache
.core_wb_req_rd (core_wb_req_rd), .core_wb_req_rd (core_wb_req_rd),
.core_wb_req_wb (core_wb_req_wb), .core_wb_req_wb (core_wb_req_wb),
.core_wb_warp_num (core_wb_warp_num), .core_wb_warp_num (core_wb_warp_num),
.core_wb_readdata (core_wb_readdata) .core_wb_readdata (core_wb_readdata),
.core_wb_pc (core_wb_pc)
); );
genvar curr_bank; genvar curr_bank;
@@ -280,10 +285,12 @@ module VX_cache
wire [`NW_M1:0] curr_bank_warp_num; wire [`NW_M1:0] curr_bank_warp_num;
wire [2:0] curr_bank_mem_read; wire [2:0] curr_bank_mem_read;
wire [2:0] curr_bank_mem_write; wire [2:0] curr_bank_mem_write;
wire [31:0] curr_bank_pc;
wire curr_bank_wb_pop; wire curr_bank_wb_pop;
wire curr_bank_wb_valid; wire curr_bank_wb_valid;
wire [`vx_clog2(NUMBER_REQUESTS)-1:0] curr_bank_wb_tid; wire [`vx_clog2(NUMBER_REQUESTS)-1:0] curr_bank_wb_tid;
wire [31:0] curr_bank_wb_pc;
wire [4:0] curr_bank_wb_rd; wire [4:0] curr_bank_wb_rd;
wire [1:0] curr_bank_wb_wb; wire [1:0] curr_bank_wb_wb;
wire [`NW_M1:0] curr_bank_wb_warp_num; wire [`NW_M1:0] curr_bank_wb_warp_num;
@@ -324,6 +331,7 @@ module VX_cache
assign curr_bank_writedata = core_req_writedata; assign curr_bank_writedata = core_req_writedata;
assign curr_bank_rd = core_req_rd; assign curr_bank_rd = core_req_rd;
assign curr_bank_wb = core_req_wb; assign curr_bank_wb = core_req_wb;
assign curr_bank_pc = core_req_pc;
assign curr_bank_warp_num = core_req_warp_num; assign curr_bank_warp_num = core_req_warp_num;
assign curr_bank_mem_read = core_req_mem_read; assign curr_bank_mem_read = core_req_mem_read;
assign curr_bank_mem_write = core_req_mem_write; assign curr_bank_mem_write = core_req_mem_write;
@@ -337,6 +345,7 @@ module VX_cache
assign per_bank_wb_wb [curr_bank] = curr_bank_wb_wb; assign per_bank_wb_wb [curr_bank] = curr_bank_wb_wb;
assign per_bank_wb_warp_num[curr_bank] = curr_bank_wb_warp_num; assign per_bank_wb_warp_num[curr_bank] = curr_bank_wb_warp_num;
assign per_bank_wb_data [curr_bank] = curr_bank_wb_data; assign per_bank_wb_data [curr_bank] = curr_bank_wb_data;
assign per_bank_wb_pc [curr_bank] = curr_bank_wb_pc;
// Dram fill request // Dram fill request
assign curr_bank_dfqq_full = dfqq_full; assign curr_bank_dfqq_full = dfqq_full;
@@ -397,6 +406,7 @@ module VX_cache
.bank_writedata (curr_bank_writedata), .bank_writedata (curr_bank_writedata),
.bank_rd (curr_bank_rd), .bank_rd (curr_bank_rd),
.bank_wb (curr_bank_wb), .bank_wb (curr_bank_wb),
.bank_pc (curr_bank_pc),
.bank_warp_num (curr_bank_warp_num), .bank_warp_num (curr_bank_warp_num),
.bank_mem_read (curr_bank_mem_read), .bank_mem_read (curr_bank_mem_read),
.bank_mem_write (curr_bank_mem_write), .bank_mem_write (curr_bank_mem_write),
@@ -410,6 +420,7 @@ module VX_cache
.bank_wb_wb (curr_bank_wb_wb), .bank_wb_wb (curr_bank_wb_wb),
.bank_wb_warp_num (curr_bank_wb_warp_num), .bank_wb_warp_num (curr_bank_wb_warp_num),
.bank_wb_data (curr_bank_wb_data), .bank_wb_data (curr_bank_wb_data),
.bank_wb_pc (curr_bank_wb_pc),
// Dram fill req // Dram fill req
.dram_fill_req (curr_bank_dram_fill_req), .dram_fill_req (curr_bank_dram_fill_req),

View File

@@ -46,12 +46,14 @@
// `vx_clog2_h(value, 31) : \ // `vx_clog2_h(value, 31) : \
// 0 // 0
// 128
`define BANK_SIZE_BYTES CACHE_SIZE_BYTES/NUMBER_BANKS `define BANK_SIZE_BYTES CACHE_SIZE_BYTES/NUMBER_BANKS
// 8
`define BANK_LINE_COUNT (`BANK_SIZE_BYTES/BANK_LINE_SIZE_BYTES) `define BANK_LINE_COUNT (`BANK_SIZE_BYTES/BANK_LINE_SIZE_BYTES)
`define BANK_LINE_SIZE_WORDS (BANK_LINE_SIZE_BYTES / NUMBER_BANKS) // 4
`define BANK_LINE_SIZE_WORDS (BANK_LINE_SIZE_BYTES / WORD_SIZE_BYTES)
// 3:0
`define BANK_LINE_SIZE_RNG `BANK_LINE_SIZE_WORDS-1:0 `define BANK_LINE_SIZE_RNG `BANK_LINE_SIZE_WORDS-1:0
// Offset is fixed // Offset is fixed
@@ -62,31 +64,54 @@
`define OFFSET_ADDR_RNG `OFFSET_ADDR_END:`OFFSET_ADDR_START `define OFFSET_ADDR_RNG `OFFSET_ADDR_END:`OFFSET_ADDR_START
`define OFFSET_SIZE_RNG `OFFSET_SIZE_END:0 `define OFFSET_SIZE_RNG `OFFSET_SIZE_END:0
`define WORD_SELECT_NUM_BITS $clog2(`BANK_LINE_SIZE_WORDS) // 2
`define WORD_SELECT_SIZE_END `WORD_SELECT_NUM_BITS `define WORD_SELECT_NUM_BITS ($clog2(`BANK_LINE_SIZE_WORDS))
`define WORD_SELECT_ADDR_START 1+`OFFSET_ADDR_END // 2
`define WORD_SELECT_ADDR_END `WORD_SELECT_SIZE_END+`OFFSET_ADDR_END `define WORD_SELECT_SIZE_END (`WORD_SELECT_NUM_BITS)
// 2
`define WORD_SELECT_ADDR_START (1+`OFFSET_ADDR_END)
// 3
`define WORD_SELECT_ADDR_END (`WORD_SELECT_SIZE_END+`OFFSET_ADDR_END)
// 3:2
`define WORD_SELECT_ADDR_RNG `WORD_SELECT_ADDR_END:`WORD_SELECT_ADDR_START `define WORD_SELECT_ADDR_RNG `WORD_SELECT_ADDR_END:`WORD_SELECT_ADDR_START
`define WORD_SELECT_SIZE_RNG `WORD_SELECT_SIZE_END-1:0 `define WORD_SELECT_SIZE_RNG `WORD_SELECT_SIZE_END-1:0
`define BANK_SELECT_NUM_BITS $clog2(NUMBER_BANKS) // 3
`define BANK_SELECT_SIZE_END `BANK_SELECT_NUM_BITS `define BANK_SELECT_NUM_BITS ($clog2(NUMBER_BANKS))
`define BANK_SELECT_ADDR_START 1+`WORD_SELECT_ADDR_END // 3
`define BANK_SELECT_ADDR_END `BANK_SELECT_SIZE_END+`BANK_SELECT_ADDR_START `define BANK_SELECT_SIZE_END (`BANK_SELECT_NUM_BITS)
// 4
`define BANK_SELECT_ADDR_START (1+`WORD_SELECT_ADDR_END)
// 6
`define BANK_SELECT_ADDR_END (`BANK_SELECT_SIZE_END+`BANK_SELECT_ADDR_START-1)
// 6:4
`define BANK_SELECT_ADDR_RNG `BANK_SELECT_ADDR_END:`BANK_SELECT_ADDR_START `define BANK_SELECT_ADDR_RNG `BANK_SELECT_ADDR_END:`BANK_SELECT_ADDR_START
// 2:0
`define BANK_SELECT_SIZE_RNG `BANK_SELECT_SIZE_END-1:0 `define BANK_SELECT_SIZE_RNG `BANK_SELECT_SIZE_END-1:0
`define LINE_SELECT_NUM_BITS $clog2(`BANK_LINE_COUNT) // 3
`define LINE_SELECT_SIZE_END `LINE_SELECT_NUM_BITS `define LINE_SELECT_NUM_BITS ($clog2(`BANK_LINE_COUNT))
`define LINE_SELECT_ADDR_START 1+`BANK_SELECT_ADDR_END // 3
`define LINE_SELECT_ADDR_END `LINE_SELECT_SIZE_END+`LINE_SELECT_ADDR_START `define LINE_SELECT_SIZE_END (`LINE_SELECT_NUM_BITS)
// 7
`define LINE_SELECT_ADDR_START (1+`BANK_SELECT_ADDR_END)
// 9
`define LINE_SELECT_ADDR_END (`LINE_SELECT_SIZE_END+`LINE_SELECT_ADDR_START-1)
// 9:7
`define LINE_SELECT_ADDR_RNG `LINE_SELECT_ADDR_END:`LINE_SELECT_ADDR_START `define LINE_SELECT_ADDR_RNG `LINE_SELECT_ADDR_END:`LINE_SELECT_ADDR_START
// 2:0
`define LINE_SELECT_SIZE_RNG `LINE_SELECT_SIZE_END-1:0 `define LINE_SELECT_SIZE_RNG `LINE_SELECT_SIZE_END-1:0
`define TAG_SELECT_NUM_BITS 32-(`OFFSET_ADDR_NUM_BITS + `WORD_SELECT_NUM_BITS + `BANK_SELECT_NUM_BITS + `LINE_SELECT_NUM_BITS)
`define TAG_SELECT_SIZE_END `TAG_SELECT_NUM_BITS // 10
`define TAG_SELECT_ADDR_START 1+`LINE_SELECT_ADDR_END `define TAG_SELECT_ADDR_START (1+`LINE_SELECT_ADDR_END)
// 31:10
`define TAG_SELECT_ADDR_RNG 31:`TAG_SELECT_ADDR_START `define TAG_SELECT_ADDR_RNG 31:`TAG_SELECT_ADDR_START
// 22
`define TAG_SELECT_NUM_BITS (32-`TAG_SELECT_ADDR_START)
// 22
`define TAG_SELECT_SIZE_END (`TAG_SELECT_NUM_BITS)
// 21:0
`define TAG_SELECT_SIZE_RNG `TAG_SELECT_SIZE_END-1:0 `define TAG_SELECT_SIZE_RNG `TAG_SELECT_SIZE_END-1:0

View File

@@ -53,12 +53,13 @@ module VX_cache_miss_resrv
input wire miss_add, input wire miss_add,
input wire[31:0] miss_add_addr, input wire[31:0] miss_add_addr,
input wire[31:0] miss_add_data, input wire[31:0] miss_add_data,
input wire[`vx_clog2(NUMBER_REQUESTS)-1:0] miss_add_tid, input wire[`vx_clog2(NUMBER_REQUESTS)-1:0] miss_add_tid,
input wire[4:0] miss_add_rd, input wire[4:0] miss_add_rd,
input wire[1:0] miss_add_wb, input wire[1:0] miss_add_wb,
input wire[`NW_M1:0] miss_add_warp_num, input wire[`NW_M1:0] miss_add_warp_num,
input wire[2:0] miss_add_mem_read, input wire[2:0] miss_add_mem_read,
input wire[2:0] miss_add_mem_write, input wire[2:0] miss_add_mem_write,
input wire[31:0] miss_add_pc,
output wire miss_resrv_full, output wire miss_resrv_full,
// Broadcast Fill // Broadcast Fill
@@ -75,17 +76,19 @@ module VX_cache_miss_resrv
output wire[1:0] miss_resrv_wb_st0, output wire[1:0] miss_resrv_wb_st0,
output wire[`NW_M1:0] miss_resrv_warp_num_st0, output wire[`NW_M1:0] miss_resrv_warp_num_st0,
output wire[2:0] miss_resrv_mem_read_st0, output wire[2:0] miss_resrv_mem_read_st0,
output wire[31:0] miss_resrv_pc_st0,
output wire[2:0] miss_resrv_mem_write_st0 output wire[2:0] miss_resrv_mem_write_st0
); );
// Size of metadata = 32 + `vx_clog2(NUMBER_REQUESTS) + 5 + 2 + (`NW_M1 + 1) // Size of metadata = 32 + `vx_clog2(NUMBER_REQUESTS) + 5 + 2 + (`NW_M1 + 1)
reg[`MRVQ_METADATA_SIZE-1:0] metadata_table[MRVQ_SIZE-1:0]; reg[`MRVQ_METADATA_SIZE-1:0] metadata_table[MRVQ_SIZE-1:0];
reg[MRVQ_SIZE-1:0][31:0] addr_table; reg[MRVQ_SIZE-1:0][31:0] addr_table;
reg[MRVQ_SIZE-1:0] valid_table; reg[MRVQ_SIZE-1:0][31:0] pc_table;
reg[MRVQ_SIZE-1:0] ready_table; reg[MRVQ_SIZE-1:0] valid_table;
reg[`vx_clog2(MRVQ_SIZE)-1:0] head_ptr; reg[MRVQ_SIZE-1:0] ready_table;
reg[`vx_clog2(MRVQ_SIZE)-1:0] tail_ptr; reg[`vx_clog2(MRVQ_SIZE)-1:0] head_ptr;
reg[`vx_clog2(MRVQ_SIZE)-1:0] tail_ptr;
assign miss_resrv_full = (MRVQ_SIZE != 2) && (tail_ptr+1) == head_ptr; assign miss_resrv_full = (MRVQ_SIZE != 2) && (tail_ptr+1) == head_ptr;
@@ -108,7 +111,7 @@ module VX_cache_miss_resrv
wire[`vx_clog2(MRVQ_SIZE)-1:0] dequeue_index = head_ptr; wire[`vx_clog2(MRVQ_SIZE)-1:0] dequeue_index = head_ptr;
assign miss_resrv_valid_st0 = (MRVQ_SIZE != 2) && dequeue_possible; assign miss_resrv_valid_st0 = (MRVQ_SIZE != 2) && dequeue_possible;
assign miss_resrv_pc_st0 = pc_table[dequeue_index];
assign miss_resrv_addr_st0 = addr_table[dequeue_index]; assign miss_resrv_addr_st0 = addr_table[dequeue_index];
assign {miss_resrv_data_st0, miss_resrv_tid_st0, miss_resrv_rd_st0, miss_resrv_wb_st0, miss_resrv_warp_num_st0, miss_resrv_mem_read_st0, miss_resrv_mem_write_st0} = metadata_table[dequeue_index]; assign {miss_resrv_data_st0, miss_resrv_tid_st0, miss_resrv_rd_st0, miss_resrv_wb_st0, miss_resrv_warp_num_st0, miss_resrv_mem_read_st0, miss_resrv_mem_write_st0} = metadata_table[dequeue_index];
@@ -120,10 +123,12 @@ module VX_cache_miss_resrv
valid_table <= 0; valid_table <= 0;
ready_table <= 0; ready_table <= 0;
addr_table <= 0; addr_table <= 0;
pc_table <= 0;
end else begin end else begin
if (miss_add && enqueue_possible && (MRVQ_SIZE != 2)) begin if (miss_add && enqueue_possible && (MRVQ_SIZE != 2)) begin
valid_table[enqueue_index] <= 1; valid_table[enqueue_index] <= 1;
ready_table[enqueue_index] <= 0; ready_table[enqueue_index] <= 0;
pc_table[enqueue_index] <= miss_add_pc;
addr_table[enqueue_index] <= miss_add_addr; addr_table[enqueue_index] <= miss_add_addr;
metadata_table[enqueue_index] <= {miss_add_data, miss_add_tid, miss_add_rd, miss_add_wb, miss_add_warp_num, miss_add_mem_read, miss_add_mem_write}; metadata_table[enqueue_index] <= {miss_add_data, miss_add_tid, miss_add_rd, miss_add_wb, miss_add_warp_num, miss_add_mem_read, miss_add_mem_write};
tail_ptr <= tail_ptr + 1; tail_ptr <= tail_ptr + 1;
@@ -138,6 +143,7 @@ module VX_cache_miss_resrv
ready_table[dequeue_index] <= 0; ready_table[dequeue_index] <= 0;
addr_table[dequeue_index] <= 0; addr_table[dequeue_index] <= 0;
metadata_table[dequeue_index] <= 0; metadata_table[dequeue_index] <= 0;
pc_table[dequeue_index] <= 0;
head_ptr <= head_ptr + 1; head_ptr <= head_ptr + 1;
end end

View File

@@ -58,6 +58,7 @@ module VX_cache_req_queue
input wire [`NW_M1:0] bank_warp_num, input wire [`NW_M1:0] bank_warp_num,
input wire [2:0] bank_mem_read, input wire [2:0] bank_mem_read,
input wire [2:0] bank_mem_write, input wire [2:0] bank_mem_write,
input wire [31:0] bank_pc,
// Dequeue Data // Dequeue Data
input wire reqq_pop, input wire reqq_pop,
@@ -70,6 +71,7 @@ module VX_cache_req_queue
output wire [`NW_M1:0] reqq_req_warp_num_st0, output wire [`NW_M1:0] reqq_req_warp_num_st0,
output wire [2:0] reqq_req_mem_read_st0, output wire [2:0] reqq_req_mem_read_st0,
output wire [2:0] reqq_req_mem_write_st0, output wire [2:0] reqq_req_mem_write_st0,
output wire [31:0] reqq_req_pc_st0,
// State Data // State Data
output wire reqq_empty, output wire reqq_empty,
@@ -84,6 +86,7 @@ module VX_cache_req_queue
wire [`NW_M1:0] out_per_warp_num; wire [`NW_M1:0] out_per_warp_num;
wire [2:0] out_per_mem_read; wire [2:0] out_per_mem_read;
wire [2:0] out_per_mem_write; wire [2:0] out_per_mem_write;
wire [31:0] out_per_pc;
reg [NUMBER_REQUESTS-1:0] use_per_valids; reg [NUMBER_REQUESTS-1:0] use_per_valids;
@@ -91,6 +94,7 @@ module VX_cache_req_queue
reg [NUMBER_REQUESTS-1:0][31:0] use_per_writedata; reg [NUMBER_REQUESTS-1:0][31:0] use_per_writedata;
reg [4:0] use_per_rd; reg [4:0] use_per_rd;
reg [1:0] use_per_wb; reg [1:0] use_per_wb;
reg [31:0] use_per_pc;
reg [`NW_M1:0] use_per_warp_num; reg [`NW_M1:0] use_per_warp_num;
reg [2:0] use_per_mem_read; reg [2:0] use_per_mem_read;
reg [2:0] use_per_mem_write; reg [2:0] use_per_mem_write;
@@ -104,6 +108,7 @@ module VX_cache_req_queue
wire [`NW_M1:0] qual_warp_num; wire [`NW_M1:0] qual_warp_num;
wire [2:0] qual_mem_read; wire [2:0] qual_mem_read;
wire [2:0] qual_mem_write; wire [2:0] qual_mem_write;
wire [31:0] qual_pc;
wire[NUMBER_REQUESTS-1:0] updated_valids; wire[NUMBER_REQUESTS-1:0] updated_valids;
@@ -115,13 +120,13 @@ module VX_cache_req_queue
wire push_qual = reqq_push && !reqq_full; wire push_qual = reqq_push && !reqq_full;
wire pop_qual = reqq_pop && use_empty && !out_empty; wire pop_qual = reqq_pop && use_empty && !out_empty;
VX_generic_queue_ll #(.DATAW( (NUMBER_REQUESTS * (1+32+32)) + 5 + 2 + (`NW_M1+1) + 3 + 3 ), .SIZE(REQQ_SIZE)) reqq_queue( VX_generic_queue_ll #(.DATAW( (NUMBER_REQUESTS * (1+32+32)) + 5 + 2 + (`NW_M1+1) + 3 + 3 + 32 ), .SIZE(REQQ_SIZE)) reqq_queue(
.clk (clk), .clk (clk),
.reset (reset), .reset (reset),
.push (push_qual), .push (push_qual),
.in_data ({bank_valids , bank_addr , bank_writedata , bank_rd , bank_wb , bank_warp_num , bank_mem_read , bank_mem_write}), .in_data ({bank_valids , bank_addr , bank_writedata , bank_rd , bank_wb , bank_warp_num , bank_mem_read , bank_mem_write , bank_pc}),
.pop (pop_qual), .pop (pop_qual),
.out_data({out_per_valids, out_per_addr, out_per_writedata, out_per_rd, out_per_wb, out_per_warp_num, out_per_mem_read, out_per_mem_write}), .out_data({out_per_valids, out_per_addr, out_per_writedata, out_per_rd, out_per_wb, out_per_warp_num, out_per_mem_read, out_per_mem_write, out_per_pc}),
.empty (o_empty), .empty (o_empty),
.full (reqq_full) .full (reqq_full)
); );
@@ -137,6 +142,7 @@ module VX_cache_req_queue
assign qual_warp_num = use_empty ? out_per_warp_num : use_per_warp_num; assign qual_warp_num = use_empty ? out_per_warp_num : use_per_warp_num;
assign qual_mem_read = use_empty ? out_per_mem_read : use_per_mem_read; assign qual_mem_read = use_empty ? out_per_mem_read : use_per_mem_read;
assign qual_mem_write = use_empty ? out_per_mem_write : use_per_mem_write; assign qual_mem_write = use_empty ? out_per_mem_write : use_per_mem_write;
assign qual_pc = use_empty ? out_per_pc : use_per_pc;
wire[`vx_clog2(NUMBER_REQUESTS)-1:0] qual_request_index; wire[`vx_clog2(NUMBER_REQUESTS)-1:0] qual_request_index;
wire qual_has_request; wire qual_has_request;
@@ -156,6 +162,7 @@ module VX_cache_req_queue
assign reqq_req_warp_num_st0 = qual_warp_num; assign reqq_req_warp_num_st0 = qual_warp_num;
assign reqq_req_mem_read_st0 = qual_mem_read; assign reqq_req_mem_read_st0 = qual_mem_read;
assign reqq_req_mem_write_st0 = qual_mem_write; assign reqq_req_mem_write_st0 = qual_mem_write;
assign reqq_req_pc_st0 = qual_pc;
assign updated_valids = qual_valids & (~(1 << qual_request_index)); assign updated_valids = qual_valids & (~(1 << qual_request_index));
@@ -169,6 +176,7 @@ module VX_cache_req_queue
use_per_warp_num <= 0; use_per_warp_num <= 0;
use_per_mem_read <= 0; use_per_mem_read <= 0;
use_per_mem_write <= 0; use_per_mem_write <= 0;
use_per_pc <= 0;
end else begin end else begin
if (reqq_pop && qual_has_request) begin if (reqq_pop && qual_has_request) begin
use_per_valids <= updated_valids; use_per_valids <= updated_valids;
@@ -179,6 +187,7 @@ module VX_cache_req_queue
use_per_warp_num <= qual_warp_num; use_per_warp_num <= qual_warp_num;
use_per_mem_read <= qual_mem_read; use_per_mem_read <= qual_mem_read;
use_per_mem_write <= qual_mem_write; use_per_mem_write <= qual_mem_write;
use_per_pc <= qual_pc;
end end
// else if (reqq_pop) begin // else if (reqq_pop) begin
// use_per_valids[qual_request_index] <= updated_valids; // use_per_valids[qual_request_index] <= updated_valids;

View File

@@ -48,18 +48,20 @@ module VX_cache_wb_sel_merge
// Per Bank WB // Per Bank WB
input wire [NUMBER_BANKS-1:0] per_bank_wb_valid, input wire [NUMBER_BANKS-1:0] per_bank_wb_valid,
input wire [NUMBER_BANKS-1:0][`vx_clog2(NUMBER_REQUESTS)-1:0] per_bank_wb_tid, input wire [NUMBER_BANKS-1:0][`vx_clog2(NUMBER_REQUESTS)-1:0] per_bank_wb_tid,
input wire [NUMBER_BANKS-1:0][4:0] per_bank_wb_rd, input wire [NUMBER_BANKS-1:0][4:0] per_bank_wb_rd,
input wire [NUMBER_BANKS-1:0][1:0] per_bank_wb_wb, input wire [NUMBER_BANKS-1:0][1:0] per_bank_wb_wb,
input wire [NUMBER_BANKS-1:0][`NW_M1:0] per_bank_wb_warp_num, input wire [NUMBER_BANKS-1:0][`NW_M1:0] per_bank_wb_warp_num,
input wire [NUMBER_BANKS-1:0][31:0] per_bank_wb_data, input wire [NUMBER_BANKS-1:0][31:0] per_bank_wb_data,
input wire [NUMBER_BANKS-1:0][31:0] per_bank_wb_pc,
output wire [NUMBER_BANKS-1:0] per_bank_wb_pop, output wire [NUMBER_BANKS-1:0] per_bank_wb_pop,
// Core Writeback // Core Writeback
input wire core_no_wb_slot, input wire core_no_wb_slot,
output reg [NUMBER_REQUESTS-1:0] core_wb_valid, output reg [NUMBER_REQUESTS-1:0] core_wb_valid,
output reg [NUMBER_REQUESTS-1:0][31:0] core_wb_readdata, output reg [NUMBER_REQUESTS-1:0][31:0] core_wb_readdata,
output reg [NUMBER_REQUESTS-1:0][31:0] core_wb_pc,
output wire [4:0] core_wb_req_rd, output wire [4:0] core_wb_req_rd,
output wire [1:0] core_wb_req_wb, output wire [1:0] core_wb_req_wb,
output wire [`NW_M1:0] core_wb_warp_num output wire [`NW_M1:0] core_wb_warp_num
@@ -96,10 +98,12 @@ module VX_cache_wb_sel_merge
always @(*) begin always @(*) begin
core_wb_valid = 0; core_wb_valid = 0;
core_wb_readdata = 0; core_wb_readdata = 0;
core_wb_pc = 0;
for (this_bank = 0; this_bank < NUMBER_BANKS; this_bank = this_bank + 1) begin for (this_bank = 0; this_bank < NUMBER_BANKS; this_bank = this_bank + 1) begin
if (found_bank && (per_bank_wb_valid[this_bank]) && (per_bank_wb_rd[this_bank] == per_bank_wb_rd[main_bank_index]) && (per_bank_wb_warp_num[this_bank] == per_bank_wb_warp_num[main_bank_index])) begin if (found_bank && (per_bank_wb_valid[this_bank]) && (per_bank_wb_rd[this_bank] == per_bank_wb_rd[main_bank_index]) && (per_bank_wb_warp_num[this_bank] == per_bank_wb_warp_num[main_bank_index])) begin
core_wb_valid[per_bank_wb_tid[this_bank]] = 1; core_wb_valid[per_bank_wb_tid[this_bank]] = 1;
core_wb_readdata[per_bank_wb_tid[this_bank]] = per_bank_wb_data[this_bank]; core_wb_readdata[per_bank_wb_tid[this_bank]] = per_bank_wb_data[this_bank];
core_wb_pc[per_bank_wb_tid[this_bank]] = per_bank_wb_pc[this_bank];
per_bank_wb_pop_unqual[this_bank] = 1; per_bank_wb_pop_unqual[this_bank] = 1;
end else begin end else begin
per_bank_wb_pop_unqual[this_bank] = 0; per_bank_wb_pop_unqual[this_bank] = 0;

View File

@@ -52,8 +52,8 @@ module VX_dcache_llv_resp_bank_sel
input wire[NUMBER_BANKS-1:0][`vx_clog2(NUMBER_REQUESTS)-1:0] per_bank_llvq_res_tid, input wire[NUMBER_BANKS-1:0][`vx_clog2(NUMBER_REQUESTS)-1:0] per_bank_llvq_res_tid,
input wire llvq_pop, input wire llvq_pop,
output reg[NUMBER_REQUESTS-1:0] llvq_valid, output reg[NUMBER_REQUESTS-1:0] llvq_valid,
output reg[NUMBER_REQUESTS-1:0][31:0] llvq_res_addr, output reg[NUMBER_REQUESTS-1:0][31:0] llvq_res_addr,
output reg[NUMBER_REQUESTS-1:0][`BANK_LINE_SIZE_RNG][31:0] llvq_res_data output reg[NUMBER_REQUESTS-1:0][`BANK_LINE_SIZE_RNG][31:0] llvq_res_data
@@ -75,10 +75,10 @@ module VX_dcache_llv_resp_bank_sel
llvq_res_data = 0; llvq_res_data = 0;
per_bank_llvq_pop = 0; per_bank_llvq_pop = 0;
if (found_bank && llvq_pop) begin if (found_bank && llvq_pop) begin
llvq_valid [per_bank_llvq_res_tid] = 1; llvq_valid [per_bank_llvq_res_tid[main_bank_index]] = 1'b1;
llvq_res_addr[per_bank_llvq_res_tid] = per_bank_llvq_res_addr[main_bank_index]; llvq_res_addr[per_bank_llvq_res_tid[main_bank_index]] = per_bank_llvq_res_addr[main_bank_index];
llvq_res_data[per_bank_llvq_res_tid] = per_bank_llvq_res_data[main_bank_index]; llvq_res_data[per_bank_llvq_res_tid[main_bank_index]] = per_bank_llvq_res_data[main_bank_index];
per_bank_llvq_pop[main_bank_index] = 1; per_bank_llvq_pop[main_bank_index] = 1'b1;
end end
end end

View File

@@ -69,7 +69,7 @@ module VX_fill_invalidator
reg success_found; reg success_found;
reg[(`vx_clog2(FILL_INVALIDAOR_SIZE))-1:0] success_index; reg[(`vx_clog2(FILL_INVALIDAOR_SIZE))-1:0] success_index;
integer curr_fill; integer curr_fill;
always @(*) begin always @(*) begin
@@ -85,7 +85,7 @@ module VX_fill_invalidator
if (success_fill) begin if (success_fill) begin
success_found = 1; success_found = 1;
success_index = curr_fill; success_index = curr_fill[(`vx_clog2(FILL_INVALIDAOR_SIZE))-1:0];
end end
end end
end end

View File

@@ -69,6 +69,8 @@ module VX_tag_data_structure
reg dirty[`BANK_LINE_COUNT-1:0]; reg dirty[`BANK_LINE_COUNT-1:0];
wire[`TAG_SELECT_SIZE_RNG] kkkkkk = write_addr[`TAG_SELECT_ADDR_RNG];
assign read_valid = valid[read_addr[`LINE_SELECT_ADDR_RNG]]; assign read_valid = valid[read_addr[`LINE_SELECT_ADDR_RNG]];
assign read_dirty = dirty[read_addr[`LINE_SELECT_ADDR_RNG]]; assign read_dirty = dirty[read_addr[`LINE_SELECT_ADDR_RNG]];
assign read_tag = tag [read_addr[`LINE_SELECT_ADDR_RNG]]; assign read_tag = tag [read_addr[`LINE_SELECT_ADDR_RNG]];

View File

@@ -230,7 +230,7 @@
`define DSTAGE_1_CYCLES 2 `define DSTAGE_1_CYCLES 2
// Bank Number of words in a line // Bank Number of words in a line
`define DBANK_LINE_SIZE_WORDS (`DBANK_LINE_SIZE_BYTES / `DNUMBER_BANKS) `define DBANK_LINE_SIZE_WORDS (`DBANK_LINE_SIZE_BYTES / `DWORD_SIZE_BYTES)
`define DBANK_LINE_SIZE_RNG `DBANK_LINE_SIZE_WORDS-1:0 `define DBANK_LINE_SIZE_RNG `DBANK_LINE_SIZE_WORDS-1:0
// Queues feeding into banks Knobs {1, 2, 4, 8, ...} // Queues feeding into banks Knobs {1, 2, 4, 8, ...}

View File

@@ -54,9 +54,9 @@ module VX_dmem_controller (
.SM_BLOCK_OFFSET_END (`SHARED_MEMORY_BLOCK_OFFSET_ED), .SM_BLOCK_OFFSET_END (`SHARED_MEMORY_BLOCK_OFFSET_ED),
.SM_INDEX_START (`SHARED_MEMORY_INDEX_OFFSET_ST), .SM_INDEX_START (`SHARED_MEMORY_INDEX_OFFSET_ST),
.SM_INDEX_END (`SHARED_MEMORY_INDEX_OFFSET_ED), .SM_INDEX_END (`SHARED_MEMORY_INDEX_OFFSET_ED),
.SM_HEIGHT (`SHARED_MEMORY_HEIGHT), .SM_HEIGHT (`SHARED_MEMORY_HEIGHT),
.NUM_REQ (`SHARED_MEMORY_NUM_REQ), .NUM_REQ (`SHARED_MEMORY_NUM_REQ),
.BITS_PER_BANK (`SHARED_MEMORY_BITS_PER_BANK) .BITS_PER_BANK (`SHARED_MEMORY_BITS_PER_BANK)
) )
shared_memory shared_memory
( (
@@ -73,6 +73,12 @@ module VX_dmem_controller (
); );
wire Dllvq_pop;
wire[`DNUMBER_REQUESTS-1:0] Dllvq_valid;
wire[`DNUMBER_REQUESTS-1:0][31:0] Dllvq_res_addr;
wire[`DNUMBER_REQUESTS-1:0][`DBANK_LINE_SIZE_RNG][31:0] Dllvq_res_data;
assign Dllvq_pop = 0;
VX_cache #( VX_cache #(
.CACHE_SIZE_BYTES (`DCACHE_SIZE_BYTES), .CACHE_SIZE_BYTES (`DCACHE_SIZE_BYTES),
.BANK_LINE_SIZE_BYTES (`DBANK_LINE_SIZE_BYTES), .BANK_LINE_SIZE_BYTES (`DBANK_LINE_SIZE_BYTES),
@@ -105,6 +111,7 @@ module VX_dmem_controller (
.core_req_rd (VX_dcache_req.core_req_rd), .core_req_rd (VX_dcache_req.core_req_rd),
.core_req_wb (VX_dcache_req.core_req_wb), .core_req_wb (VX_dcache_req.core_req_wb),
.core_req_warp_num (VX_dcache_req.core_req_warp_num), .core_req_warp_num (VX_dcache_req.core_req_warp_num),
.core_req_pc (VX_dcache_req.core_req_pc),
// Delay Core Req // Delay Core Req
.delay_req (VX_dcache_rsp.delay_req), .delay_req (VX_dcache_rsp.delay_req),
@@ -118,6 +125,7 @@ module VX_dmem_controller (
.core_wb_req_wb (VX_dcache_rsp.core_wb_req_wb), .core_wb_req_wb (VX_dcache_rsp.core_wb_req_wb),
.core_wb_warp_num (VX_dcache_rsp.core_wb_warp_num), .core_wb_warp_num (VX_dcache_rsp.core_wb_warp_num),
.core_wb_readdata (VX_dcache_rsp.core_wb_readdata), .core_wb_readdata (VX_dcache_rsp.core_wb_readdata),
.core_wb_pc (VX_dcache_rsp.core_wb_pc),
// DRAM response // DRAM response
.dram_fill_rsp (VX_gpu_dcache_dram_res.dram_fill_rsp), .dram_fill_rsp (VX_gpu_dcache_dram_res.dram_fill_rsp),
@@ -141,58 +149,16 @@ module VX_dmem_controller (
// Snoop Request // Snoop Request
.snp_req (0), .snp_req (0),
.snp_req_addr (0) .snp_req_addr (0),
// LLVQ stuff
.llvq_pop (Dllvq_pop),
.llvq_valid (Dllvq_valid),
.llvq_res_addr (Dllvq_res_addr),
.llvq_res_data (Dllvq_res_data)
); );
// VX_d_cache#(
// .CACHE_SIZE (`DCACHE_SIZE),
// .CACHE_WAYS (`DCACHE_WAYS),
// .CACHE_BLOCK (`DCACHE_BLOCK),
// .CACHE_BANKS (`DCACHE_BANKS),
// .LOG_NUM_BANKS (`DCACHE_LOG_NUM_BANKS),
// .NUM_REQ (`DCACHE_NUM_REQ),
// .LOG_NUM_REQ (`DCACHE_LOG_NUM_REQ),
// .NUM_IND (`DCACHE_NUM_IND),
// .CACHE_WAY_INDEX (`DCACHE_WAY_INDEX),
// .NUM_WORDS_PER_BLOCK (`DCACHE_NUM_WORDS_PER_BLOCK),
// .OFFSET_SIZE_START (`DCACHE_OFFSET_ST),
// .OFFSET_SIZE_END (`DCACHE_OFFSET_ED),
// .TAG_SIZE_START (`DCACHE_TAG_SIZE_START),
// .TAG_SIZE_END (`DCACHE_TAG_SIZE_END),
// .IND_SIZE_START (`DCACHE_IND_SIZE_START),
// .IND_SIZE_END (`DCACHE_IND_SIZE_END),
// .ADDR_TAG_START (`DCACHE_ADDR_TAG_START),
// .ADDR_TAG_END (`DCACHE_ADDR_TAG_END),
// .ADDR_OFFSET_START (`DCACHE_ADDR_OFFSET_ST),
// .ADDR_OFFSET_END (`DCACHE_ADDR_OFFSET_ED),
// .ADDR_IND_START (`DCACHE_IND_ST),
// .ADDR_IND_END (`DCACHE_IND_ED),
// .MEM_ADDR_REQ_MASK (`DCACHE_MEM_REQ_ADDR_MASK)
// )
// dcache
// (
// .clk (clk),
// .rst (reset),
// .i_p_valid (cache_driver_in_valid),
// .i_p_addr (cache_driver_in_address),
// .i_p_writedata (cache_driver_in_data),
// .i_p_read_or_write (read_or_write),
// .i_p_mem_read (cache_driver_in_mem_read),
// .i_p_mem_write (cache_driver_in_mem_write),
// .o_p_readdata (cache_driver_out_data),
// .o_p_delay (cache_delay),
// .o_m_evict_addr (VX_dram_req_rsp.o_m_evict_addr),
// .o_m_read_addr (VX_dram_req_rsp.o_m_read_addr),
// .o_m_valid (VX_dram_req_rsp.o_m_valid),
// .o_m_writedata (VX_dram_req_rsp.o_m_writedata),
// .o_m_read_or_write (VX_dram_req_rsp.o_m_read_or_write),
// .i_m_readdata (VX_dram_req_rsp.i_m_readdata),
// .i_m_ready (VX_dram_req_rsp.i_m_ready)
// );
VX_d_cache #( VX_d_cache #(
.CACHE_SIZE (`ICACHE_SIZE), .CACHE_SIZE (`ICACHE_SIZE),
.CACHE_WAYS (`ICACHE_WAYS), .CACHE_WAYS (`ICACHE_WAYS),

View File

@@ -82,6 +82,12 @@ module VX_generic_queue_ll
end end
end end
always @(posedge clk) begin
if (writing) begin
data[wr_ctr_r] <= in_data;
end
end
always @(posedge clk) begin always @(posedge clk) begin
if (reset) begin if (reset) begin
rd_ptr_r <= 0; rd_ptr_r <= 0;
@@ -98,10 +104,8 @@ module VX_generic_queue_ll
end end
end end
if (!(!reading && bypass_r)) begin bypass_r <= writing && (empty_r || (1 == size_r) && reading);
bypass_r <= writing && (empty_r || (1 == size_r && reading)); curr_r <= in_data;
curr_r <= in_data;
end
head_r <= data[reading ? rd_next_ptr_r : rd_ptr_r]; head_r <= data[reading ? rd_next_ptr_r : rd_ptr_r];
end end
end end

View File

@@ -54,6 +54,7 @@ module VX_lsu (
assign VX_dcache_req.core_req_rd = use_rd; assign VX_dcache_req.core_req_rd = use_rd;
assign VX_dcache_req.core_req_wb = use_wb; assign VX_dcache_req.core_req_wb = use_wb;
assign VX_dcache_req.core_req_warp_num = use_warp_num; assign VX_dcache_req.core_req_warp_num = use_warp_num;
assign VX_dcache_req.core_req_pc = use_pc;
// Cache can't accept request // Cache can't accept request
assign out_delay = VX_dcache_rsp.delay_req; assign out_delay = VX_dcache_rsp.delay_req;
@@ -64,7 +65,7 @@ module VX_lsu (
assign VX_mem_wb.wb_valid = VX_dcache_rsp.core_wb_valid; assign VX_mem_wb.wb_valid = VX_dcache_rsp.core_wb_valid;
assign VX_mem_wb.wb_warp_num = VX_dcache_rsp.core_wb_warp_num; assign VX_mem_wb.wb_warp_num = VX_dcache_rsp.core_wb_warp_num;
assign VX_mem_wb.loaded_data = VX_dcache_rsp.core_wb_readdata; assign VX_mem_wb.loaded_data = VX_dcache_rsp.core_wb_readdata;
assign VX_mem_wb.mem_wb_pc = 32'hdeadbeff; assign VX_mem_wb.mem_wb_pc = VX_dcache_rsp.core_wb_pc[0];
// Core can't accept response // Core can't accept response
assign VX_dcache_req.core_no_wb_slot = no_slot_mem; assign VX_dcache_req.core_no_wb_slot = no_slot_mem;

View File

@@ -21,6 +21,7 @@ interface VX_gpu_dcache_req_inter
wire [4:0] core_req_rd; wire [4:0] core_req_rd;
wire [1:0] core_req_wb; wire [1:0] core_req_wb;
wire [`NW_M1:0] core_req_warp_num; wire [`NW_M1:0] core_req_warp_num;
wire [31:0] core_req_pc;
// Can't WB // Can't WB
wire core_no_wb_slot; wire core_no_wb_slot;

View File

@@ -13,11 +13,12 @@ interface VX_gpu_dcache_res_inter
(); ();
// Cache WB // Cache WB
wire [NUMBER_REQUESTS-1:0] core_wb_valid; wire [NUMBER_REQUESTS-1:0] core_wb_valid;
wire [4:0] core_wb_req_rd; wire [4:0] core_wb_req_rd;
wire [1:0] core_wb_req_wb; wire [1:0] core_wb_req_wb;
wire [`NW_M1:0] core_wb_warp_num; wire [`NW_M1:0] core_wb_warp_num;
wire [NUMBER_REQUESTS-1:0][31:0] core_wb_readdata; wire [NUMBER_REQUESTS-1:0][31:0] core_wb_readdata;
wire [NUMBER_REQUESTS-1:0][31:0] core_wb_pc;
// Cache Full // Cache Full
wire delay_req; wire delay_req;

View File

@@ -10,14 +10,9 @@ module testbench();
reg[3:0] in_data; reg[3:0] in_data;
reg push; reg push;
reg pop; reg pop;
wire io_enq_ready;
wire[3:0] out_data; wire[3:0] out_data;
wire io_deq_valid; wire full;
wire empty;
wire full, empty;
assign io_enq_ready = !full;
assign io_deq_valid = !empty;
VX_generic_queue_ll #(.DATAW(4), .SIZE(4)) dut ( VX_generic_queue_ll #(.DATAW(4), .SIZE(4)) dut (
.clk(clk), .clk(clk),
@@ -34,40 +29,28 @@ module testbench();
end end
initial begin initial begin
$monitor ("%d: clk=%b rst=%b push=%b, pop=%b, din=%h, empty=%b, full=%b, dout=%h", $time, clk, reset, push, pop, in_data, empty, full, out_data); $monitor ("%d: clk=%b rst=%b push=%b, pop=%b, din=%h, empty=%b, full=%b, dout=%h",
#0 clk=0; reset=1; in_data=4'hd; push=1; pop=1; $time, clk, reset, push, pop, in_data, empty, full, out_data);
#1 `check(io_enq_ready, 1); `check(out_data, 4'hd); `check(io_deq_valid, 1); #0 clk=0; reset=1; pop=0; push=0;
#1 `check(io_enq_ready, 1); `check(out_data, 4'hx); `check(io_deq_valid, 0); #2 reset=0; in_data=4'ha; pop=0; push=1;
#0 reset=0; in_data=4'ha; pop=0; #2 `check(full, 0); `check(out_data, 4'ha); `check(empty, 0);
#1 `check(io_enq_ready, 1); `check(out_data, 4'hx); `check(io_deq_valid, 0);
#1 `check(io_enq_ready, 1); `check(out_data, 4'ha); `check(io_deq_valid, 1);
#0 in_data=4'hb; #0 in_data=4'hb;
#1 `check(io_enq_ready, 1); `check(out_data, 4'ha); `check(io_deq_valid, 1); #2 `check(full, 0); `check(out_data, 4'ha); `check(empty, 0);
#1 `check(io_enq_ready, 1); `check(out_data, 4'ha); `check(io_deq_valid, 1);
#0 in_data=4'hc; #0 in_data=4'hc;
#1 `check(io_enq_ready, 1); `check(out_data, 4'ha); `check(io_deq_valid, 1); #2 `check(full, 0); `check(out_data, 4'ha); `check(empty, 0);
#1 `check(io_enq_ready, 1); `check(out_data, 4'ha); `check(io_deq_valid, 1);
#0 in_data=4'hd; #0 in_data=4'hd;
#1 `check(io_enq_ready, 1); `check(out_data, 4'ha); `check(io_deq_valid, 1); #2 `check(full, 1); `check(out_data, 4'ha); `check(empty, 0);
#1 `check(io_enq_ready, 0); `check(out_data, 4'ha); `check(io_deq_valid, 1);
#0 push=0; pop=1; #0 push=0; pop=1;
#1 `check(io_enq_ready, 0); `check(out_data, 4'ha); `check(io_deq_valid, 1); #2 `check(full, 0); `check(out_data, 4'hb); `check(empty, 0);
#1 `check(io_enq_ready, 1); `check(out_data, 4'hb); `check(io_deq_valid, 1); #2 `check(full, 0); `check(out_data, 4'hc); `check(empty, 0);
#1 `check(io_enq_ready, 1); `check(out_data, 4'hb); `check(io_deq_valid, 1); #2 `check(full, 0); `check(out_data, 4'hd); `check(empty, 0);
#1 `check(io_enq_ready, 1); `check(out_data, 4'hc); `check(io_deq_valid, 1); #2 `check(full, 0); `check(out_data, 4'ha); `check(empty, 1);
#1 `check(io_enq_ready, 1); `check(out_data, 4'hc); `check(io_deq_valid, 1); #0 in_data=4'he; push=1; pop=0;
#1 `check(io_enq_ready, 1); `check(out_data, 4'hd); `check(io_deq_valid, 1); #2 `check(full, 0); `check(out_data, 4'he); `check(empty, 0);
#1 `check(io_enq_ready, 1); `check(out_data, 4'hd); `check(io_deq_valid, 1); #0 in_data=4'hf; pop=1;
#1 `check(io_enq_ready, 1); `check(out_data, 4'ha); `check(io_deq_valid, 0); #2 `check(full, 0); `check(out_data, 4'hf); `check(empty, 0);
#0 in_data=4'ha; push=1; pop=0;
#1 `check(io_enq_ready, 1); `check(out_data, 4'ha); `check(io_deq_valid, 0);
#1 `check(io_enq_ready, 1); `check(out_data, 4'ha); `check(io_deq_valid, 1);
#0 in_data=4'hb; pop=1;
#1 `check(io_enq_ready, 1); `check(out_data, 4'ha); `check(io_deq_valid, 1);
#1 `check(io_enq_ready, 1); `check(out_data, 4'hb); `check(io_deq_valid, 1);
#0 push=0; #0 push=0;
#1 `check(io_enq_ready, 1); `check(out_data, 4'hb); `check(io_deq_valid, 1); #2 `check(full, 0); `check(out_data, 4'hc); `check(empty, 1);
#1 `check(io_enq_ready, 1); `check(out_data, 4'hc); `check(io_deq_valid, 0);
#1 $finish; #1 $finish;
end end