// ========== Copyright Header Begin ========================================== // // OpenSPARC T2 Processor File: ios_l2_stub.vr // Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved // 4150 Network Circle, Santa Clara, California 95054, U.S.A. // // * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; version 2 of the License. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // For the avoidance of doubt, and except that if any non-GPL license // choice is available it will apply instead, Sun elects to use only // the General Public License version 2 (GPLv2) at this time for any // software where a choice of GPL license versions is made // available with the language indicating that GPLv2 or any later version // may be used, or where a choice of which version of the GPL is applied is // otherwise unspecified. // // Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, // CA 95054 USA or visit www.sun.com if you need additional information or // have any questions. // // ========== Copyright Header End ============================================ #include #include #include #include "ios_l2_stub.if.vrh" #include "ios_l2_stub_ports_binds.vrh" #include "std_display_class.vrh" #include "l2_packet.vrh" ExternVeraList(l2_packet); extern VeraList_l2_packet l2_list0; extern VeraList_l2_packet l2_list1; extern VeraList_l2_packet l2_list2; extern VeraList_l2_packet l2_list3; extern VeraList_l2_packet l2_list4; extern VeraList_l2_packet l2_list5; extern VeraList_l2_packet l2_list6; extern VeraList_l2_packet l2_list7; //extern bit [63:0] IOSMemoryAddress[8]; //extern event IOSMemorySync[8]; #define REQ_WRI 3'b100 #define REQ_WR8 3'b010 #define REQ_RDD 3'b001 #define REQ_TYPE_FIELD 26:24 #define IOS_MIN_DEQ_DELAY 0 #define IOS_MIN_WIB_DELAY 0 #define IOS_MIN_CTAG_DELAY 0 #define IOS_MAX_DELAY 100 class ios_l2_stub { bit [511:0] l2_mem[]; l2_stub_port l2; // for dispmon StandardDisplay dbg; local string myname; local integer receive_count; local integer response_count; l2_packet transaction_in; bit [511:0] sent_read_data = 0; local event expect_data_received; local bit [2:0] bank_number; local bit matched_packet = 0; bit enable_l2_checker = 0; bit enable_l2_wr_checker = 0; bit enable_l2_rd_checker = 0; local bit dump_expects = 0; // for delay local integer deq_delay; local integer wib_delay; local integer ctag_delay; local integer enable_tracking; local integer check_semph_id; VeraList_l2_packet l2_list; task new(l2_stub_port l2, integer bank, StandardDisplay dbg, VeraList_l2_packet l2_list); task start_l2_stub(); function bit[6:0] gen_ecc(bit[31:0] data); function bit[1:0] gen_parity(bit[31:0] data); task check_packet(l2_packet received_packet); function bit expect(l2_packet expected_packet, integer timeout = 100000); task look_for_packets(); task set_packet_expect(l2_packet l2_pkt[16], integer total); } task ios_l2_stub::new(l2_stub_port l2_stub, integer bank, StandardDisplay dbg, VeraList_l2_packet l2_list) { // for dispmon myname = "FC_L2stub"; this.dbg = dbg; this.l2_list = l2_list; receive_count = 0; bank_number = bank; // for delay deq_delay = IOS_MIN_DEQ_DELAY; wib_delay = IOS_MIN_WIB_DELAY; ctag_delay = IOS_MIN_CTAG_DELAY; enable_tracking = 1; l2 = l2_stub; transaction_in = new("Inbound L2 Packet", dbg); check_semph_id = alloc(SEMAPHORE, 0, 1,1); fork { start_l2_stub(); look_for_packets(); } join none } task ios_l2_stub::start_l2_stub() { bit [39:0] addr; bit [15:0] tag; bit [3:0] opes; bit [31:0] req_cmd_1, req_cmd_2, req_data; bit [7:0] bytemask; bit [511:0] wri_data; bit [511:0] rdd_data, deq_data512, ret_data512; bit [511:0] tmp_rdd_data; bit [127:0] rdd_data0, rdd_data1, rdd_data2, rdd_data3, rdd_data4, rdd_data5, rdd_data6, rdd_data7; bit [127:0] tmp_rdd_data0, tmp_rdd_data1, tmp_rdd_data2, tmp_rdd_data3, tmp_rdd_data4, tmp_rdd_data5, tmp_rdd_data6, tmp_rdd_data7; bit [63:0] wr8_data,data64; bit [76:0] req_to_deq_data, deq_to_ret_data, ret_to_ack_data; bit last_rdd = 0, curr_rdd = 0; bit [6:0] ecc; bit [6:0] ctag_ecc; integer i; integer mbox_req_to_deq = alloc(MAILBOX, 0, 1), mbox_deq_to_ret = alloc(MAILBOX, 0, 1); dbg.dispmon(myname, MON_NORMAL, psprintf("[%1d] Starting ... ", bank_number)); fork { while (1) { @(posedge l2.$clk); if (enable_l2_checker) { transaction_in.reset(); if (l2.$req_vld) { case (l2.$req[REQ_TYPE_FIELD]) { REQ_WRI: { if (enable_l2_wr_checker) { req_cmd_1 = l2.$req; ctag_ecc = l2.$ecc; tag = req_cmd_1[23:8]; opes = req_cmd_1[30:27]; dbg.dispmon(myname, MON_NORMAL, psprintf("[%1d] recv REQ_WRI tag=%x", bank_number, tag)); @(posedge l2.$clk); req_cmd_2 = l2.$req; addr = {req_cmd_1[7:0],req_cmd_2}; bytemask = 0; if (addr[39] === 1'b1) { addr[39] = 1'b0; dbg.dispmon(myname, MON_NORMAL, psprintf("[%1d]-RAS recv addr=%x pa[39] is set!", bank_number, addr)); } if (opes[1] === 1'b1) dbg.dispmon(myname, MON_NORMAL, psprintf("[%1d]-RAS recv addr=%x E bit is set!", bank_number, addr)); @(posedge l2.$clk); req_data = l2.$req; wri_data[511:480] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 0 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wri_data[479:448] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 1 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wri_data[447:416] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 2 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wri_data[415:384] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 3 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wri_data[383:352] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 4 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wri_data[351:320] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 5 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wri_data[319:288] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 6 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wri_data[287:256] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 7 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wri_data[255:224] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 8 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wri_data[223:192] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 9 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wri_data[191:160] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 10 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wri_data[159:128] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 11 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wri_data[127:96] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 12 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wri_data[95:64] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 13 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wri_data[63:32] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 14 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wri_data[31:0] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WRI request data 15 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } l2_mem[addr[39:9]] = wri_data; // Fu 4/19/05 for Rx checker: mark memory // for (i=0; i<8; i++) { // IOSMemoryAddress[bank_number] = (addr + 8*i); // dbg.dispmon(myname, MON_NORMAL, psprintf("[%1d] inform call back tag=%x, addr=", bank_number, tag, IOSMemoryAddress[bank_number])); //trigger(IOSMemorySync[bank_number]); //sync(ALL,IOSMemorySync[bank_number]); //trigger(OFF,IOSMemorySync); // } // mark memory end transaction_in.set("address", addr); transaction_in.set("tag", tag); transaction_in.set("bytemask", bytemask); transaction_in.set("opes", opes); transaction_in.set("data", wri_data); transaction_in.set("bank_number", bank_number); check_packet(transaction_in); dbg.dispmon(myname, MON_NORMAL, psprintf("[%1d] REQ_WRI complete tag=%x, addr=%0h, data=%0h", bank_number, tag, addr, wri_data)); // mail addr and tag to mbox_req_to_deq mailbox_put(mbox_req_to_deq, {ctag_ecc, REQ_WRI, opes, bytemask, tag, addr}); } } REQ_WR8: { if (enable_l2_wr_checker) { req_cmd_1 = l2.$req; ctag_ecc = l2.$ecc; tag = 0; dbg.dispmon(myname, MON_NORMAL, psprintf("[%1d] recv REQ_WR8 tag=%x", bank_number, tag)); @(posedge l2.$clk); req_cmd_2 = l2.$req; addr = {req_cmd_1[7:0],req_cmd_2}; bytemask = req_cmd_1[15:8]; opes = req_cmd_1[30:27]; if (addr[39] === 1'b1) { addr[39] = 1'b0; dbg.dispmon(myname, MON_NORMAL, psprintf("[%1d]-RAS recv addr=%x pa[39] is set!", bank_number, addr)); } if (opes[1] === 1'b1) dbg.dispmon(myname, MON_NORMAL, psprintf("[%1d]-RAS recv addr=%x E bit is set!", bank_number, addr)); @(posedge l2.$clk); req_data = l2.$req; wr8_data[63:32] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WR8 request data 0 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } @(posedge l2.$clk); req_data = l2.$req; wr8_data[31:0] = req_data; //ecc = l2.$ecc; // if (gen_ecc(req_data) !== ecc) { // dbg.dispmon(myname, MON_ERR, psprintf ("IOS_L2_STUB: ECC mismatch for WR8 request data 1 %h. Expect = %h, Actual = %h",req_data,gen_ecc(req_data),ecc)); // } wri_data = l2_mem[{addr[39:6],6'h00}]; case (addr[5:3]) { 3'd0: data64 = wri_data[511:448]; 3'd1: data64 = wri_data[447:384]; 3'd2: data64 = wri_data[383:320]; 3'd3: data64 = wri_data[319:256]; 3'd4: data64 = wri_data[255:192]; 3'd5: data64 = wri_data[191:128]; 3'd6: data64 = wri_data[127:64]; 3'd7: data64 = wri_data[63:0]; } if (bytemask[0]) data64[7:0] = wr8_data[7:0]; if (bytemask[1]) data64[15:8] = wr8_data[15:8]; if (bytemask[2]) data64[23:16] = wr8_data[23:16]; if (bytemask[3]) data64[31:24] = wr8_data[31:24]; if (bytemask[4]) data64[39:32] = wr8_data[39:32]; if (bytemask[5]) data64[47:40] = wr8_data[47:40]; if (bytemask[6]) data64[55:48] = wr8_data[55:48]; if (bytemask[7]) data64[63:56] = wr8_data[63:56]; case (addr[5:3]) { 3'd0: wri_data[511:448] = data64; 3'd1: wri_data[447:384] = data64; 3'd2: wri_data[383:320] = data64; 3'd3: wri_data[319:256] = data64; 3'd4: wri_data[255:192] = data64; 3'd5: wri_data[191:128] = data64; 3'd6: wri_data[127:64] = data64; 3'd7: wri_data[63:0] = data64; } l2_mem[{addr[39:6],6'h00}] = wri_data; transaction_in.set("address", addr); transaction_in.set("tag", tag); transaction_in.set("bytemask", bytemask); transaction_in.set("opes", opes); transaction_in.set("data", data64); transaction_in.set("bank_number", bank_number); check_packet(transaction_in); // mail addr and tag to mbox_req_to_deq mailbox_put(mbox_req_to_deq, {ctag_ecc, REQ_WR8, opes, bytemask, tag, addr}); } } REQ_RDD: { if (enable_l2_rd_checker) { req_cmd_1 = l2.$req; ctag_ecc = l2.$ecc; tag = req_cmd_1[23:8]; opes = req_cmd_1[30:27]; dbg.dispmon(myname, MON_NORMAL, psprintf("[%1d] recv REQ_WR8 tag=%x", bank_number, tag)); @(posedge l2.$clk); req_cmd_2 = l2.$req; @(posedge l2.$clk); @(posedge l2.$clk); addr = {req_cmd_1[7:0],req_cmd_2}; if (addr[39] === 1'b1) { addr[39] = 1'b0; dbg.dispmon(myname, MON_NORMAL, psprintf("[%1d]-RAS recv addr=%x pa[39] is set!", bank_number, addr)); } if (opes[1] === 1'b1) dbg.dispmon(myname, MON_NORMAL, psprintf("[%1d]-RAS recv addr=%x E bit is set!", bank_number, addr)); bytemask = 0; tmp_rdd_data = l2_mem[addr[39:9]]; tmp_rdd_data0[127:0] = tmp_rdd_data[127:0]; tmp_rdd_data1[127:0] = tmp_rdd_data[255:128]; tmp_rdd_data2[127:0] = tmp_rdd_data[383:256]; tmp_rdd_data3[127:0] = tmp_rdd_data[511:384]; rdd_data0[127:0] = {tmp_rdd_data0[7:0], tmp_rdd_data0[15:8], tmp_rdd_data0[23:16], tmp_rdd_data0[31:24], tmp_rdd_data0[39:32], tmp_rdd_data0[47:40], tmp_rdd_data0[55:48], tmp_rdd_data0[63:56], tmp_rdd_data0[71:64], tmp_rdd_data0[79:72], tmp_rdd_data0[87:80], tmp_rdd_data0[95:88], tmp_rdd_data0[103:96], tmp_rdd_data0[111:104], tmp_rdd_data0[119:112], tmp_rdd_data0[127:120]}; rdd_data1[127:0] = {tmp_rdd_data1[7:0], tmp_rdd_data1[15:8], tmp_rdd_data1[23:16], tmp_rdd_data1[31:24], tmp_rdd_data1[39:32], tmp_rdd_data1[47:40], tmp_rdd_data1[55:48], tmp_rdd_data1[63:56], tmp_rdd_data1[71:64], tmp_rdd_data1[79:72], tmp_rdd_data1[87:80], tmp_rdd_data1[95:88], tmp_rdd_data1[103:96], tmp_rdd_data1[111:104], tmp_rdd_data1[119:112], tmp_rdd_data1[127:120]}; rdd_data2[127:0] = {tmp_rdd_data2[7:0], tmp_rdd_data2[15:8], tmp_rdd_data2[23:16], tmp_rdd_data2[31:24], tmp_rdd_data2[39:32], tmp_rdd_data2[47:40], tmp_rdd_data2[55:48], tmp_rdd_data2[63:56], tmp_rdd_data2[71:64], tmp_rdd_data2[79:72], tmp_rdd_data2[87:80], tmp_rdd_data2[95:88], tmp_rdd_data2[103:96], tmp_rdd_data2[111:104], tmp_rdd_data2[119:112], tmp_rdd_data2[127:120]}; rdd_data3[127:0] = {tmp_rdd_data3[7:0], tmp_rdd_data3[15:8], tmp_rdd_data3[23:16], tmp_rdd_data3[31:24], tmp_rdd_data3[39:32], tmp_rdd_data3[47:40], tmp_rdd_data3[55:48], tmp_rdd_data3[63:56], tmp_rdd_data3[71:64], tmp_rdd_data3[79:72], tmp_rdd_data3[87:80], tmp_rdd_data3[95:88], tmp_rdd_data3[103:96], tmp_rdd_data3[111:104], tmp_rdd_data3[119:112], tmp_rdd_data3[127:120]}; rdd_data[511:0] = {rdd_data3[127:0], rdd_data2[127:0], rdd_data1[127:0], rdd_data0[127:0]}; case (addr[5:2]) { 4'd0: {} 4'd1: rdd_data = {rdd_data[479:0],rdd_data[511:480]}; 4'd2: rdd_data = {rdd_data[447:0],rdd_data[511:448]}; 4'd3: rdd_data = {rdd_data[415:0],rdd_data[511:416]}; 4'd4: rdd_data = {rdd_data[383:0],rdd_data[511:384]}; 4'd5: rdd_data = {rdd_data[351:0],rdd_data[511:352]}; 4'd6: rdd_data = {rdd_data[319:0],rdd_data[511:320]}; 4'd7: rdd_data = {rdd_data[287:0],rdd_data[511:288]}; 4'd8: rdd_data = {rdd_data[255:0],rdd_data[511:256]}; 4'd9: rdd_data = {rdd_data[223:0],rdd_data[511:224]}; 4'd10: rdd_data = {rdd_data[191:0],rdd_data[511:192]}; 4'd11: rdd_data = {rdd_data[159:0],rdd_data[511:160]}; 4'd12: rdd_data = {rdd_data[127:0],rdd_data[511:128]}; 4'd13: rdd_data = {rdd_data[95:0],rdd_data[511:96]}; 4'd14: rdd_data = {rdd_data[63:0],rdd_data[511:64]}; 4'd15: rdd_data = {rdd_data[31:0],rdd_data[511:32]}; } dbg.dispmon(myname, MON_NORMAL, psprintf("[%1d] REQ_RDD addr=%0h tag=%x data=%0h", bank_number, addr, tag, rdd_data)); if((&rdd_data[31:0]) === 1'bx) rdd_data[31:0] = 32'b11111111111111111111111111111111; if((&rdd_data[63:32]) === 1'bx ) rdd_data[63:32] = 32'b11111111111111111111111111111111; if((&rdd_data[95:64]) === 1'bx) rdd_data[95:64] = 32'b11111111111111111111111111111111; if((&rdd_data[127:96]) === 1'bx) rdd_data[127:96] = 32'b11111111111111111111111111111111; if((&rdd_data[159:128]) === 1'bx ) rdd_data[159:128] = 32'b11111111111111111111111111111111; if((&rdd_data[191:160]) === 1'bx) rdd_data[191:160] = 32'b11111111111111111111111111111111; if((&rdd_data[223:192]) === 1'bx) rdd_data[223:192] = 32'b11111111111111111111111111111111; if((&rdd_data[255:224]) === 1'bx) rdd_data[255:224] = 32'b11111111111111111111111111111111; if((&rdd_data[287:256]) === 1'bx) rdd_data[287:256] = 32'b11111111111111111111111111111111; if((&rdd_data[319:288]) === 1'bx) rdd_data[319:288] = 32'b11111111111111111111111111111111; if((&rdd_data[351:320]) === 1'bx) rdd_data[351:320] = 32'b11111111111111111111111111111111; if((&rdd_data[383:352]) === 1'bx) rdd_data[383:352] = 32'b11111111111111111111111111111111; if((&rdd_data[415:384]) === 1'bx) rdd_data[415:384] = 32'b11111111111111111111111111111111; if((&rdd_data[447:416]) === 1'bx) rdd_data[447:416] = 32'b11111111111111111111111111111111; if((&rdd_data[479:448]) === 1'bx) rdd_data[479:448] = 32'b11111111111111111111111111111111; if((&rdd_data[511:480]) === 1'bx) rdd_data[511:480] = 32'b11111111111111111111111111111111; dbg.dispmon(myname, MON_INFO, psprintf(" REQ_RDD data[63:0] = 0x%0h", rdd_data[63:0])); dbg.dispmon(myname, MON_INFO, psprintf(" REQ_RDD data[127:64] = 0x%0h", rdd_data[127:64])); dbg.dispmon(myname, MON_INFO, psprintf(" REQ_RDD data[191:128] = 0x%0h", rdd_data[191:128])); dbg.dispmon(myname, MON_INFO, psprintf(" REQ_RDD data[255:192] = 0x%0h", rdd_data[255:192])); dbg.dispmon(myname, MON_INFO, psprintf(" REQ_RDD data[319:256] = 0x%0h", rdd_data[319:256])); dbg.dispmon(myname, MON_INFO, psprintf(" REQ_RDD data[383:320] = 0x%0h", rdd_data[383:320])); dbg.dispmon(myname, MON_INFO, psprintf(" REQ_RDD data[447:384] = 0x%0h", rdd_data[447:384])); dbg.dispmon(myname, MON_INFO, psprintf(" REQ_RDD data[511:448] = 0x%0h", rdd_data[511:448])); transaction_in.set("address", addr); transaction_in.set("tag", tag); transaction_in.set("bytemask", bytemask); transaction_in.set("opes", opes); transaction_in.set("bank_number", bank_number); check_packet(transaction_in); if (opes[0]) { rdd_data = sent_read_data; printf("Setting read_data to %0h\n", rdd_data); } // mail addr and tag to mbox_req_to_deq mailbox_put(mbox_req_to_deq, {ctag_ecc, REQ_RDD, opes, bytemask, tag, addr}); mailbox_put(mbox_req_to_deq, rdd_data); dbg.dispmon(myname, MON_INFO, psprintf("[%1d] recv process REQ_RDD addr=%0h tag=%x data=%0h", bank_number, addr, tag, rdd_data)); } } default: { } } } } } } join none } function reg[1:0] ios_l2_stub::gen_parity(bit [31:0] data) { gen_parity = { (data[16] ^ data[17] ^ data[18] ^ data[19] ^ data[20] ^ data[21] ^ data[22] ^ data[23] ^ data[24] ^ data[25] ^ data[26] ^ data[27] ^ data[28] ^ data[29] ^ data[30] ^ data[31] ), (data[0] ^ data[1] ^ data[2] ^ data[3] ^ data[4] ^ data[5] ^ data[6] ^ data[7] ^ data[8] ^ data[9] ^ data[10] ^ data[11] ^ data[12] ^ data[13] ^ data[14] ^ data[15] ) }; } /// function to generate 7-bit ecc from 32 bit data, need to verify the algorithm function bit[6:0] ios_l2_stub::gen_ecc(bit [31:0] data) { bit [6:0] temp_ecc; temp_ecc[0] = data[0] ^ data[1] ^ data[3] ^ data[4] ^ data[6] ^ data[8] ^ data[10] ^ data[11] ^ data[13] ^ data[15] ^ data[17] ^ data[19] ^ data[21] ^ data[23] ^ data[25] ^ data[26] ^ data[28] ^ data[30]; temp_ecc[1] = data[0] ^ data[2] ^ data[3] ^ data[5] ^ data[6] ^ data[9] ^ data[10] ^ data[12] ^ data[13] ^ data[16] ^ data[17] ^ data[20] ^ data[21] ^ data[24] ^ data[25] ^ data[27] ^ data[28] ^ data[31]; temp_ecc[2] = data[1] ^ data[2] ^ data[3] ^ data[7] ^ data[8] ^ data[9] ^ data[10] ^ data[14] ^ data[15] ^ data[16] ^ data[17] ^ data[22] ^ data[23] ^ data[24] ^ data[25] ^ data[29] ^ data[30] ^ data[31]; temp_ecc[3] = data[4] ^ data[5] ^data[6] ^data[7] ^data[8] ^data[9] ^ data[10] ^ data[18] ^data[19] ^data[20] ^data[21] ^data[22] ^ data[23] ^ data[24] ^ data[25]; temp_ecc[4] = data[11] ^ data[12] ^ data[13] ^ data[14] ^ data[15] ^ data[16] ^ data[17] ^ data[18] ^ data[19] ^ data[20] ^ data[21] ^ data[22] ^ data[23] ^ data[24] ^ data[25]; temp_ecc[5] = data[26] ^ data[27] ^ data[28] ^ data[29] ^ data[30] ^ data[31]; temp_ecc[6] = ^{temp_ecc[5:0],data[31:0]}; gen_ecc = temp_ecc; } task ios_l2_stub::check_packet(l2_packet packet_received) { bit [3:0] opes; dbg.dispmon(myname, MON_NORMAL, psprintf("[%1d] checker: examin a packet ", bank_number)); dump_expects = 0; trigger(ONE_BLAST, expect_data_received); @ (posedge l2.$clk); opes = packet_received.get("opes"); if (!matched_packet) { dump_expects = 1; trigger(ONE_BLAST, expect_data_received); if (opes[0]) { packet_received.display("Got Unexpected L2 Packet", 1); } else { packet_received.display("Warning: Got Unexpected L2 Packet"); } } else { packet_received.display("L2 Packet Expect Satisfied"); } matched_packet = 0; } function bit ios_l2_stub::expect(l2_packet expected_packet, integer timeout = 100000) { integer timer = 0; bit not_matched = 1; l2_packet packet; packet = expected_packet; fork { while (timeout > timer) { @ (posedge l2.$clk); timer++; } if (not_matched) { packet.display("Expected packet timeout", 1); not_matched = 0; } } { while (not_matched) { sync(ANY, expect_data_received); semaphore_get(WAIT, check_semph_id, 1); if (!matched_packet) { if (dump_expects) { packet.display("Dumping expect"); } if (transaction_in.compare(packet)) { matched_packet = 1; not_matched = 0; timer = timeout; //sent_read_data = packet.get("read_data"); //printf("Got read data of %0h", sent_read_data); //printf("--- Packet Matched! ---\n"); } } semaphore_put(check_semph_id, 1); @ (posedge l2.$clk); } } join any } task ios_l2_stub::look_for_packets() { l2_packet l2_pkt[16]; integer total = 0; dbg.dispmon(myname, MON_NORMAL, psprintf("[%1d] Starting to look for packets ", bank_number)); while (1) { @ (posedge l2.$clk); if (enable_l2_checker){ if (!l2_list.empty()) { l2_pkt[total] = l2_list.front(); l2_pkt[total].display("Pulled L2 Packet off list"); if (l2_pkt[total].get("last_packet")) { //printf("Got Last Packet\n"); set_packet_expect(l2_pkt, total); //printf("Setting total to 0\n"); total = 0; } else { total = total + 1; //printf("Incrementing total to %0d\n", total); } l2_list.pop_front(); } } } } task ios_l2_stub::set_packet_expect(l2_packet l2_pkt[16], integer total) { integer i; fork { for (i = 0; i <= total; i++) { l2_pkt[i].display("Setting Expect for L2 Packet"); void = expect(l2_pkt[i].copy()); //printf("i is %0d and total is %0d\n", i, total); } //printf("Got the Last packet of this group\n"); } join none }