📄 pci_exp_expect_tasks.v
字号:
$display("[%t] : Received MEMWR64 --- Tag 0x%h", $realtime, tag_); if(tag == tag_) //find matching tag begin wait_for_next = 1'b0; if((traffic_class == traffic_class_) && (td === td_) && (ep == ep_) && (attr == attr_) && (length == length_) && (requester_id == requester_id_) && (last_dw_be == last_dw_be_) && (first_dw_be == first_dw_be_) && (address == address_)) begin // find matching header then compare payload for (i_ = 0; i_ < payload_len; i_ = i_ + 1) begin check_byte = 1; if (i_ < 4) // apply first_dw_be begin if (first_dw_be[i_]) check_byte = 1; else check_byte = 0; end else if (i_ > (payload_len - 5)) // apply last_dw_be begin if (last_dw_be[4 - (payload_len - i_)]) check_byte = 1; else check_byte = 0; end if(check_byte && `EXPECT_MEMWR64_PAYLOAD[i_] != frame_store_rx[16 + i_]) //find mismatch begin $fdisplay(error_file_ptr, "[%t] : Found payload mismatch in received MEMWR64 - Tag 0x%h: \n", $time, tag_); $fdisplay(error_file_ptr, "Expected:"); for (i_ = 0; i_ < payload_len; i_ = i_ + 1) $fdisplay(error_file_ptr,"\t %0x", `EXPECT_MEMWR64_PAYLOAD[i_]); $fdisplay(error_file_ptr, "Received:"); for (i_ = 0; i_ < payload_len; i_ = i_ + 1) $fdisplay(error_file_ptr,"\t %0x", frame_store_rx[16+i_]); $fdisplay(error_file_ptr, ""); expect_status = 1'b0; i_ = 5000; end end //find matching frame if(i_ == payload_len) expect_status = 1'b1; end else // header mismatches, error out begin $fdisplay(error_file_ptr, "[%t] : Found header mismatch in received MEMWR64 - Tag 0x%h: \n", $time, tag_); $fdisplay(error_file_ptr, "Expected:"); $fdisplay(error_file_ptr, "\t Traffic Class: 0x%h", traffic_class); $fdisplay(error_file_ptr, "\t TD: %h", td); $fdisplay(error_file_ptr, "\t EP: %h", ep); $fdisplay(error_file_ptr, "\t Attributes: 0x%h", attr); $fdisplay(error_file_ptr, "\t Length: 0x%h", length); $fdisplay(error_file_ptr, "\t Requester ID: 0x%h", requester_id); $fdisplay(error_file_ptr, "\t Tag: 0x%h", tag); $fdisplay(error_file_ptr, "\t Last DW byte-enable: 0x%h", last_dw_be); $fdisplay(error_file_ptr, "\t First DW byte-enable: 0x%h", first_dw_be); $fdisplay(error_file_ptr, "\t Address: 0x%h", address); $fdisplay(error_file_ptr, "Received:"); $fdisplay(error_file_ptr, "\t Traffic Class: 0x%h", traffic_class_); $fdisplay(error_file_ptr, "\t TD: %h", td_); $fdisplay(error_file_ptr, "\t EP: %h", ep_); $fdisplay(error_file_ptr, "\t Attributes: 0x%h", attr_); $fdisplay(error_file_ptr, "\t Length: 0x%h", length_); $fdisplay(error_file_ptr, "\t Requester ID: 0x%h", requester_id_); $fdisplay(error_file_ptr, "\t Tag: 0x%h", tag_); $fdisplay(error_file_ptr, "\t Last DW byte-enable: 0x%h", last_dw_be_); $fdisplay(error_file_ptr, "\t First DW byte-enable: 0x%h", first_dw_be_); $fdisplay(error_file_ptr, "\t Address: 0x%h", address_); $fdisplay(error_file_ptr, ""); expect_status = 1'b0; end end end endendtask// Please note that the following io tasks can be only used if the customer has a mechanism for allowing// the customer design to generate io write or io read tlps received by the dsport rx port./************************************************************Task : TSK_EXPECT_IOWRITEInputs : td, ep, requested_id, tag, firstDwBe, address, dataOutputs : status 0-Failed 1-SuccessfulDescription : Expecting a TLP from Rx side with matching td, ep, requested_id, tag, firstDwBe, address, and 32 bit data*************************************************************/task TSK_EXPECT_IOWRITE; input td; input ep; input [15:0] requester_id; input [7:0] tag; input [3:0] firstDwBe; input [31:0] address; // note that low bits [1:0] are not used input [31:0] data; output expect_status; reg [2:0] traffic_class; reg [1:0] attr; reg [9:0] length; reg [3:0] lastDwBe; reg [2:0] traffic_class_; reg td_; reg ep_; reg [1:0] attr_; reg [9:0] length_; reg [15:0] requester_id_; reg [7:0] tag_; reg [3:0] lastDwBe_; reg [3:0] firstDwBe_; reg [31:0] address_; // note that the bottom two bits are not used in comparison reg [7:0] write_payload[0:3]; reg [3:0] byte_enabled; integer i_; reg wait_for_next; integer j_; begin // following assignments are required for io header traffic_class = 3'b000; attr = 2'b00; length = 10'b00_0000_0001; lastDwBe = 4'b0000; write_payload[0] = data[31:24]; write_payload[1] = data[23:16]; write_payload[2] = data[15:8]; write_payload[3] = data[7:0]; j_ = 1000; wait_for_next = 1'b1; //haven't found any matching tag yet fork while(wait_for_next) begin @ rcvd_iowr; //wait for a rcvd_iowr event byte_enabled = 4'h0; traffic_class_ = frame_store_rx[1] >> 4; td_ = frame_store_rx[2] >> 7; ep_ = frame_store_rx[2] >> 6; attr_ = frame_store_rx[2] >> 4; length_ = frame_store_rx[2]; length_ = (length_ << 8) | (frame_store_rx[3]); requester_id_= {frame_store_rx[4], frame_store_rx[5]}; tag_= frame_store_rx[6]; lastDwBe_ = frame_store_rx[7] >>4; firstDwBe_ = frame_store_rx[7]; address_ = (frame_store_rx[8]); address_ = (address_ << 8) | frame_store_rx[9]; address_ = (address_ << 8) | frame_store_rx[10]; address_ = (address_ << 8) | frame_store_rx[11]; $display("[%t] : Received IO WRITE TLP --- Tag 0x%h", $realtime, tag_); if(tag == tag_) //find matching tag begin wait_for_next = 1'b0; if((traffic_class == traffic_class_) && (td === td_) && (ep == ep_) && (attr == attr_) && (length == length_) && (requester_id == requester_id_) && (lastDwBe == lastDwBe_) && (firstDwBe == firstDwBe_) && (address[31:2] == address_[31:2])) begin // find matching header then compare payload expect_status = 1'b1; //assume that we will succeed byte_enabled = firstDwBe; for (i_ = 0; i_ < 4; i_ = i_ + 1) begin if (byte_enabled[3] && expect_status) if (write_payload[i_] != frame_store_rx[12 + i_]) //find mismatch begin $fdisplay(error_file_ptr, "[%t] : Found payload mismatch in IO WRITE DATA - Tag 0x%h: \n", $time, tag_); $fdisplay(error_file_ptr, "Expected:"); for (i_ = 0; i_ < 4; i_ = i_ + 1) $fdisplay(error_file_ptr,"\t %0x", write_payload[i_]); $fdisplay(error_file_ptr, "Received:"); for (i_ = 0; i_ < 4; i_ = i_ + 1) $fdisplay(error_file_ptr,"\t %0x", frame_store_rx[12+i_]); $fdisplay(error_file_ptr, ""); expect_status = 1'b0; end byte_enabled = byte_enabled << 1; end end else // header mismatches, error out begin $fdisplay(error_file_ptr, "[%t] : Found header mismatch in received CPLD - Tag 0x%h: \n", $time, tag_); $fdisplay(error_file_ptr, "Expected:"); $fdisplay(error_file_ptr, "\t Traffic Class: 0x%h", traffic_class); $fdisplay(error_file_ptr, "\t TD: %h", td); $fdisplay(error_file_ptr, "\t EP: %h", ep); $fdisplay(error_file_ptr, "\t Attributes: 0x%h", attr); $fdisplay(error_file_ptr, "\t Length: 0x%h", length); $fdisplay(error_file_ptr, "\t Requester ID: 0x%h", requester_id); $fdisplay(error_file_ptr, "\t Tag: 0x%h", tag); $fdisplay(error_file_ptr, "\t Last DW Byte Enable: 0x%h", lastDwBe); $fdisplay(error_file_ptr, "\t 1st DW Byte Enable: 0x%h", firstDwBe); $fdisplay(error_file_ptr, "\t Address: 0x%h", address); $fdisplay(error_file_ptr, "Received:"); $fdisplay(error_file_ptr, "\t Traffic Class: 0x%h", traffic_class_); $fdisplay(error_file_ptr, "\t TD: %h", td_); $fdisplay(error_file_ptr, "\t EP: %h", ep_); $fdisplay(error_file_ptr, "\t Attributes: 0x%h", attr_); $fdisplay(error_file_ptr, "\t Length: 0x%h", length_); $fdisplay(error_file_ptr, "\t Requester ID: 0x%h", requester_id_); $fdisplay(error_file_ptr, "\t Tag: 0x%h", tag_); $fdisplay(error_file_ptr, "\t Last DW Byte Enable: 0x%h", lastDwBe_); $fdisplay(error_file_ptr, "\t 1st DW Byte Enable: 0x%h", firstDwBe_); $fdisplay(error_file_ptr, "\t Address: 0x%h", address_); $fdisplay(error_file_ptr, ""); expect_status = 1'b0; end end end // while begin // time out task function and return 0 if tlp never received and/or tag never matches while (j_ && wait_for_next) begin `TX_TASKS.TSK_TX_CLK_EAT(1); j_ = j_ - 1; end if (wait_for_next) begin $display("Failure: TSK_EXPECT_IOWRITE timeout. IO WRITE TLP never received or tag mismatch"); $finish; end end join end // 1stendtask/************************************************************Task : TSK_EXPECT_IOREADInputs : td, ep, requested_id, tag, firstDwBe, addressOutputs : status 0-Failed 1-SuccessfulDescription : Expecting a TLP from Rx side with matching td, ep, requested_id, tag, firstDwBe, and address*************************************************************/task TSK_EXPECT_IOREAD; input td; input ep; input [15:0] requester_id; input [7:0] tag; input [3:0] firstDwBe; input [31:0] address; // note that low bits [1:0] are not used output expect_status; reg [2:0] traffic_class; reg [1:0] attr; reg [9:0] length; reg [3:0] lastDwBe; reg [2:0] traffic_class_; reg td_; reg ep_; reg [1:0] attr_; reg [9:0] length_; reg [15:0] requester_id_; reg [7:0] tag_; reg [3:0] lastDwBe_; reg [3:0] firstDwBe_; reg [31:0] address_; // note that the bottom two bits are not used in comparison integer i_; reg wait_for_next; integer j_; begin // following assignments are required for io header traffic_class = 3'b000; attr = 2'b00; length = 10'b00_0000_0001; lastDwBe = 4'b0000; j_ = 1000; wait_for_next = 1'b1; //haven't found any matching tag yet fork while(wait_for_next) begin @ rcvd_iord; //wait for a rcvd_iord event traffic_class_ = frame_store_rx[1] >> 4; td_ = frame_store_rx[2] >> 7; ep_ = frame_store_rx[2] >> 6; attr_ = frame_store_rx[2] >> 4; length_ = frame_store_rx[2]; length_ = (length_ << 8) | (frame_store_rx[3]); requester_id_= {frame_store_rx[4], frame_store_rx[5]}; tag_= frame_store_rx[6]; lastDwBe_ = frame_store_rx[7] >>4; firstDwBe_ = frame_store_rx[7]; address_ = (frame_store_rx[8]); address_ = (address_ << 8) | frame_store_rx[9]; address_ = (address_ << 8) | frame_store_rx[10]; address_ = (address_ << 8) | frame_store_rx[11]; $display("[%t] : Received IO READ TLP --- Tag 0x%h", $realtime, tag_); if(tag == tag_) //find matching tag begin wait_for_next = 1'b0; if((traffic_class == traffic_class_) && (td === td_) && (ep == ep_) && (attr == attr_) && (length == length_) && (requester_id == requester_id_) && (lastDwBe == lastDwBe_) && (firstDwBe == firstDwBe_) && (address[31:2] == address_[31:2])) begin expect_status = 1'b1; end else // header mismatches, error out begin $fdisplay(error_file_ptr, "[%t] : Found header mismatch in received CPLD - Tag 0x%h: \n", $time, tag_); $fdisplay(error_file_ptr, "Expected:"); $fdisplay(error_file_ptr, "\t Traffic Class: 0x%h", traffic_class); $fdisplay(error_file_ptr, "\t TD: %h", td);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -