📄 pcie_tlp_packet.vri
字号:
// ===========================================================================// File : pcie_tlp_packet.vri// Author : cmagleby// Date : Mon Dec 3 11:03:46 MST 2007// Project : TI PHY design//// Copyright (c) notice// This code adheres to the GNU public license//// ===========================================================================//// $Id: pcie_tlp_packet.vri,v 1.1.1.1 2007-12-05 18:37:06 cmagleby Exp $//// ===========================================================================//// $Log: not supported by cvs2svn $//// ===========================================================================// Function : This file is a class of pcie packet can be used for all TLP// packet types.//// ===========================================================================// ===========================================================================#include <vera_defines.vrh>class pcie_tlp_packet { bit [15:0] sequence_num; bit [4:0] type; bit [1:0] fmt; bit [9:0] length; bit [2:0] tc; bit [1:0] attr; bit ep; bit td; bit [63:0] address; //used for multiple purposes. bit [15:0] req_id; bit [7:0] tag; bit [3:0] first_be; bit [3:0] last_be; //completion fields bit [15:0] completer_id; bit [11:0] byte_count; bit bcm; bit [2:0] cmp_status; bit [127:0] header; bit [31:0] lcrc; bit [31:0] data []; //methods task new( bit [11:0] ic_sequence_num = 12'b0, bit [4:0] ic_type = 5'h0, bit [1:0] ic_fmt = 2'h0, bit [9:0] ic_length = 10'h0, bit [2:0] ic_tc = 3'h0, bit [1:0] ic_attr = 2'h0, bit ic_ep = 1'h0, bit ic_td = 1'h0, bit [63:0] ic_address = 64'h0, bit [15:0] ic_req_id = 16'h0, bit [7:0] ic_tag = 8'h0, bit [3:0] ic_first_be = 4'hf, bit [3:0] ic_last_be = 4'hf, //completion fields bit [15:0] ic_completer_id = 16'h0, bit [11:0] ic_byte_count = 12'h0, bit ic_bcm = 1'h0, bit [2:0] ic_cmp_status = 3'h0, bit [31:0] ic_config_data = 32'b0) { sequence_num = {4'b0,ic_sequence_num}; type = ic_type; fmt = ic_fmt; length = ic_length; tc = ic_tc; attr = ic_attr; ep = ic_ep; td = ic_td; address = ic_address; req_id = ic_req_id; tag = ic_tag; first_be = ic_first_be; last_be = ic_last_be; completer_id = ic_completer_id; byte_count = ic_byte_count; bcm = ic_bcm; cmp_status = ic_cmp_status; data[0] = ic_config_data; printf ("new seq(%0h),type(%0h),fmt(%0h),length(%0h),tc(%0h),attr(%0h),ep(%0h),td(%0h),addr(%0h),req_id(%0h),tag(%0h),fbe(%0h),lbe(%0h),cmp_id(%0h),bc(%0h),bcm(%0h),cmp_stat(%0h),cfgwr data(%0h)\n", ic_sequence_num, ic_type, ic_fmt, ic_length, ic_tc, ic_attr, ic_ep, ic_td, ic_address, ic_req_id, ic_tag, ic_first_be, ic_last_be, ic_completer_id, ic_byte_count, ic_bcm, ic_cmp_status, ic_config_data ); } task build_packet (string pkt_type = "posted") { integer reserved = 0; integer i; bit [5:0] register_num; bit [3:0] ext_register_num; bit [2:0] function_number; bit [4:0] device_number; bit [7:0] bus_number; bit [6:0] lower_addr = address[6:0]; bus_number = address[31:24]; function_number = address[23:19]; device_number = address[18:16]; ext_register_num = address[11:8]; register_num = address[7:2]; if (pkt_type == "posted" || pkt_type == "nonposted") { //dw1 header[4:0] = type; header[6:5] = fmt; header[7] = reserved; header[11:8] = reserved; header[14:12] = tc; header[15] = reserved; header[17:16] = length[9:8]; header[19:18] = reserved; header[21:20] = attr; header[22] = ep; header[23] = td; header[31:24] = length[7:0]; //dw2 header[39:32] = req_id[15:8]; header[47:40] = req_id[7:0]; header[55:48] = tag; header[59:56] = first_be; header[63:60] = last_be; //dw3&4 //configurations if (type == 5'b00100 || type == 5'b00101) { header[127:64] = {32'b0, register_num[5:0],2'b0, 4'b0,ext_register_num[3:0], device_number[4:0],function_number[2:0], bus_number[7:0]}; } else if (fmt[0] == 1'b1) { header[127:64] = {address[7:2],2'b0,address[15:8], address[23:16],address[31:24], address[39:32],address[47:40], address[55:48],address[63:56]}; } else { header[127:64] = {32'b0,address[7:2],2'b0,address[15:8], address[23:16],address[31:24]}; } } else if (pkt_type == "completion") { //dw1 header[4:0] = type; header[6:5] = fmt; header[7] = reserved; header[11:8] = reserved; header[14:12] = tc; header[15] = reserved; header[17:16] = length[9:8]; header[19:18] = reserved; header[21:20] = attr; header[22] = ep; header[23] = td; header[31:24] = length[7:0]; //dw 2 header[39:32] = completer_id[15:8]; header[47:40] = completer_id[7:0]; header[51:48] = byte_count[11:8]; header[52] = bcm; header[55:53] = cmp_status; header[63:56] = byte_count[7:0]; //dw3 header[71:64] = req_id[15:8]; header[79:72] = req_id[7:0]; header[87:80] = tag; header[95:88] = {1'b0,lower_addr}; //dw4 header[127:96] = 32'b0; } if (type[4:1] != 5'b0010 && fmt[1]) { for (i=0;i<length;i++) { data[i] = random(); } } lcrc = lcrc32d32(sequence_num,header,data); printf ("lcrc(%0h)\n",lcrc); } function bit [31:0] lcrc32d32 (bit [15:0] sequence_num, bit[127:0] header, bit [31:0] data[]) { bit [31:0] crc; bit[31:0] prev_crc; bit [31:0] C; integer packet_total_length; integer hdr_dws; integer i; bit [31:0] d; bit [31:0] digest; //length + td + header size printf("function for lcrc\n"); if (header[5]) { hdr_dws = 4; if (header[6]) { packet_total_length = {header[17:16],header[31:24]} + header[23] + 4; } else packet_total_length = 4; } else { hdr_dws = 3; if (header[6]) { packet_total_length = {header[17:16],header[31:24]} + header[23] + 3; } else packet_total_length = 3; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -