1 |
2 |
cmagleby |
// ===========================================================================
|
2 |
|
|
// File : pcie_dllp_packet.vri
|
3 |
|
|
// Author : cwinward
|
4 |
|
|
// Date : Mon Dec 3 11:03:46 MST 2007
|
5 |
|
|
// Project : TI PHY design
|
6 |
|
|
//
|
7 |
|
|
// Copyright (c) notice
|
8 |
|
|
// This code adheres to the GNU public license
|
9 |
|
|
//
|
10 |
|
|
// ===========================================================================
|
11 |
|
|
//
|
12 |
|
|
// $Id: pcie_dllp_packet.vri,v 1.1.1.1 2007-12-05 18:37:06 cmagleby Exp $
|
13 |
|
|
//
|
14 |
|
|
// ===========================================================================
|
15 |
|
|
//
|
16 |
|
|
// $Log: not supported by cvs2svn $
|
17 |
|
|
//
|
18 |
|
|
// ===========================================================================
|
19 |
|
|
// Function : This file is a class of pcie packet can be used for all DLLP
|
20 |
|
|
// packet types.
|
21 |
|
|
//
|
22 |
|
|
// ===========================================================================
|
23 |
|
|
// ===========================================================================
|
24 |
|
|
#include
|
25 |
|
|
|
26 |
|
|
class pcie_dllp_packet {
|
27 |
|
|
bit [7:0] byte3;
|
28 |
|
|
bit [7:0] byte2;
|
29 |
|
|
bit [7:0] byte1;
|
30 |
|
|
bit [7:0] dllp_type;
|
31 |
|
|
bit [31:0] temp_packet[];
|
32 |
|
|
|
33 |
|
|
task new(
|
34 |
|
|
bit [7:0] init_byte3 = 8'h40,
|
35 |
|
|
bit [7:0] init_byte2 = 8'h00,
|
36 |
|
|
bit [7:0] init_byte1 = 8'h01,
|
37 |
|
|
bit [7:0] init_dllp_type = 8'b01000000) {
|
38 |
|
|
|
39 |
|
|
dllp_type = init_dllp_type;
|
40 |
|
|
byte1 = init_byte1;
|
41 |
|
|
byte2 = init_byte2;
|
42 |
|
|
byte3 = init_byte3;
|
43 |
|
|
}
|
44 |
|
|
|
45 |
|
|
task build_packet (string pkt_type = "initfc1_p") {
|
46 |
|
|
if(pkt_type == "initfc1_p") {
|
47 |
|
|
temp_packet[0] = {byte3,byte2,byte1,dllp_type};
|
48 |
|
|
temp_packet[1] = {16'b0,crc16d32(temp_packet[0])};
|
49 |
|
|
}
|
50 |
|
|
else if(pkt_type == "initfc1_np") {
|
51 |
|
|
temp_packet[0] = {byte3,byte2,byte1,dllp_type};
|
52 |
|
|
temp_packet[1] = {16'b0,crc16d32(temp_packet[0])};
|
53 |
|
|
}
|
54 |
|
|
else if(pkt_type == "initfc1_cpl") {
|
55 |
|
|
temp_packet[0] = {byte3,byte2,byte1,dllp_type};
|
56 |
|
|
temp_packet[1] = {16'b0,crc16d32(temp_packet[0])};
|
57 |
|
|
}
|
58 |
|
|
else if(pkt_type == "initfc2_p") {
|
59 |
|
|
temp_packet[0] = {byte3,byte2,byte1,dllp_type};
|
60 |
|
|
temp_packet[1] = {16'b0,crc16d32(temp_packet[0])};
|
61 |
|
|
}
|
62 |
|
|
else if(pkt_type == "initfc2_np") {
|
63 |
|
|
temp_packet[0] = {byte3,byte2,byte1,dllp_type};
|
64 |
|
|
temp_packet[1] = {16'b0,crc16d32(temp_packet[0])};
|
65 |
|
|
}
|
66 |
|
|
else if(pkt_type == "initfc1_cpl") {
|
67 |
|
|
temp_packet[0] = {byte3,byte2,byte1,dllp_type};
|
68 |
|
|
temp_packet[1] = {16'b0,crc16d32(temp_packet[0])};
|
69 |
|
|
}
|
70 |
|
|
else if (pkt_type == "ack") {
|
71 |
|
|
temp_packet[0] = {byte3,byte2,byte1,dllp_type};
|
72 |
|
|
temp_packet[1] = {16'b0,crc16d32(temp_packet[0])};
|
73 |
|
|
}
|
74 |
|
|
|
75 |
|
|
}
|
76 |
|
|
|
77 |
|
|
function bit[15:0] crc16d32(bit[31:0] d) {
|
78 |
|
|
|
79 |
|
|
bit [15:0] crc;
|
80 |
|
|
bit [15:0] C = 32'hFFFF;
|
81 |
|
|
|
82 |
|
|
crc[0] = d[0] ^ d[2] ^ d[3] ^ d[5] ^ d[8] ^ d[10] ^ d[11] ^ d[16] ^ d[18] ^
|
83 |
|
|
d[19] ^ d[23] ^ d[27] ^ d[31] ^ C[4] ^ C[5] ^ C[7] ^ C[10] ^ C[12]
|
84 |
|
|
^ C[13] ^ C[15];
|
85 |
|
|
crc[1] = d[0] ^ d[1] ^ d[3] ^ d[4] ^ d[5] ^ d[7] ^ d[8] ^ d[9] ^ d[11] ^ d[15]
|
86 |
|
|
^ d[16] ^ d[17] ^ d[19] ^ d[22] ^ d[23] ^ d[26] ^ d[27] ^ d[30] ^
|
87 |
|
|
d[31] ^ C[0] ^ C[4] ^ C[6] ^ C[7] ^ C[8] ^ C[10] ^ C[11] ^ C[12] ^
|
88 |
|
|
C[14] ^ C[15];
|
89 |
|
|
crc[2] = d[0] ^ d[2] ^ d[3] ^ d[4] ^ d[6] ^ d[7] ^ d[8] ^ d[10] ^ d[14] ^ d[15]
|
90 |
|
|
^ d[16] ^ d[18] ^ d[21] ^ d[22] ^ d[25] ^ d[26] ^ d[29] ^ d[30] ^
|
91 |
|
|
C[0] ^ C[1] ^ C[5] ^ C[7] ^ C[8] ^ C[9] ^ C[11] ^ C[12] ^ C[13] ^
|
92 |
|
|
C[15];
|
93 |
|
|
crc[3] = d[0] ^ d[1] ^ d[6] ^ d[7] ^ d[8] ^ d[9] ^ d[10] ^ d[11] ^ d[13] ^
|
94 |
|
|
d[14] ^ d[15] ^ d[16] ^ d[17] ^ d[18] ^ d[19] ^ d[20] ^ d[21] ^ d[23]
|
95 |
|
|
^ d[24] ^ d[25] ^ d[27] ^ d[28] ^ d[29] ^ d[31] ^ C[0] ^ C[1] ^ C[2]
|
96 |
|
|
^ C[4] ^ C[5] ^ C[6] ^ C[7] ^ C[8] ^ C[9] ^ C[14] ^ C[15];
|
97 |
|
|
crc[4] = d[0] ^ d[5] ^ d[6] ^ d[7] ^ d[8] ^ d[9] ^ d[10] ^ d[12] ^ d[13] ^
|
98 |
|
|
d[14] ^ d[15] ^ d[16] ^ d[17] ^ d[18] ^ d[19] ^ d[20] ^ d[22] ^ d[23]
|
99 |
|
|
^ d[24] ^ d[26] ^ d[27] ^ d[28] ^ d[30] ^ C[0] ^ C[1] ^ C[2] ^ C[3]
|
100 |
|
|
^ C[5] ^ C[6] ^ C[7] ^ C[8] ^ C[9] ^ C[10] ^ C[15];
|
101 |
|
|
crc[5] = d[4] ^ d[5] ^ d[6] ^ d[7] ^ d[8] ^ d[9] ^ d[11] ^ d[12] ^ d[13] ^
|
102 |
|
|
d[14] ^ d[15] ^ d[16] ^ d[17] ^ d[18] ^ d[19] ^ d[21] ^ d[22] ^ d[23]
|
103 |
|
|
^ d[25] ^ d[26] ^ d[27] ^ d[29] ^ C[0] ^ C[1] ^ C[2] ^ C[3] ^ C[4]
|
104 |
|
|
^ C[6] ^ C[7] ^ C[8] ^ C[9] ^ C[10] ^ C[11];
|
105 |
|
|
crc[6] = d[3] ^ d[4] ^ d[5] ^ d[6] ^ d[7] ^ d[8] ^ d[10] ^ d[11] ^ d[12] ^
|
106 |
|
|
d[13] ^ d[14] ^ d[15] ^ d[16] ^ d[17] ^ d[18] ^ d[20] ^ d[21] ^ d[22]
|
107 |
|
|
^ d[24] ^ d[25] ^ d[26] ^ d[28] ^ C[0] ^ C[1] ^ C[2] ^ C[3] ^ C[4]
|
108 |
|
|
^ C[5] ^ C[7] ^ C[8] ^ C[9] ^ C[10] ^ C[11] ^ C[12];
|
109 |
|
|
crc[7] = d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[6] ^ d[7] ^ d[9] ^ d[10] ^ d[11] ^ d[12]
|
110 |
|
|
^ d[13] ^ d[14] ^ d[15] ^ d[16] ^ d[17] ^ d[19] ^ d[20] ^ d[21] ^
|
111 |
|
|
d[23] ^ d[24] ^ d[25] ^ d[27] ^ C[0] ^ C[1] ^ C[2] ^ C[3] ^ C[4] ^
|
112 |
|
|
C[5] ^ C[6] ^ C[8] ^ C[9] ^ C[10] ^ C[11] ^ C[12] ^ C[13];
|
113 |
|
|
crc[8] = d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[6] ^ d[8] ^ d[9] ^ d[10] ^ d[11]
|
114 |
|
|
^ d[12] ^ d[13] ^ d[14] ^ d[15] ^ d[16] ^ d[18] ^ d[19] ^ d[20] ^
|
115 |
|
|
d[22] ^ d[23] ^ d[24] ^ d[26] ^ C[0] ^ C[1] ^ C[2] ^ C[3] ^ C[4] ^
|
116 |
|
|
C[5] ^ C[6] ^ C[7] ^ C[9] ^ C[10] ^ C[11] ^ C[12] ^ C[13] ^ C[14];
|
117 |
|
|
crc[9] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[7] ^ d[8] ^ d[9] ^ d[10]
|
118 |
|
|
^ d[11] ^ d[12] ^ d[13] ^ d[14] ^ d[15] ^ d[17] ^ d[18] ^ d[19] ^
|
119 |
|
|
d[21] ^ d[22] ^ d[23] ^ d[25] ^ C[0] ^ C[1] ^ C[2] ^ C[3] ^ C[4] ^
|
120 |
|
|
C[5] ^ C[6] ^ C[7] ^ C[8] ^ C[10] ^ C[11] ^ C[12] ^ C[13] ^ C[14]
|
121 |
|
|
^ C[15];
|
122 |
|
|
crc[10] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[6] ^ d[7] ^ d[8] ^ d[9] ^ d[10]
|
123 |
|
|
^ d[11] ^ d[12] ^ d[13] ^ d[14] ^ d[16] ^ d[17] ^ d[18] ^ d[20] ^
|
124 |
|
|
d[21] ^ d[22] ^ d[24] ^ C[1] ^ C[2] ^ C[3] ^ C[4] ^ C[5] ^ C[6] ^
|
125 |
|
|
C[7] ^ C[8] ^ C[9] ^ C[11] ^ C[12] ^ C[13] ^ C[14] ^ C[15];
|
126 |
|
|
crc[11] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[6] ^ d[7] ^ d[8] ^ d[9] ^ d[10]
|
127 |
|
|
^ d[11] ^ d[12] ^ d[13] ^ d[15] ^ d[16] ^ d[17] ^ d[19] ^ d[20] ^
|
128 |
|
|
d[21] ^ d[23] ^ C[0] ^ C[2] ^ C[3] ^ C[4] ^ C[5] ^ C[6] ^ C[7] ^ C[8]
|
129 |
|
|
^ C[9] ^ C[10] ^ C[12] ^ C[13] ^ C[14] ^ C[15];
|
130 |
|
|
crc[12] = d[1] ^ d[3] ^ d[4] ^ d[6] ^ d[7] ^ d[9] ^ d[12] ^ d[14] ^ d[15] ^
|
131 |
|
|
d[20] ^ d[22] ^ d[23] ^ d[27] ^ d[31] ^ C[0] ^ C[1] ^ C[3] ^ C[6]
|
132 |
|
|
^ C[8] ^ C[9] ^ C[11] ^ C[12] ^ C[14];
|
133 |
|
|
crc[13] = d[0] ^ d[2] ^ d[3] ^ d[5] ^ d[6] ^ d[8] ^ d[11] ^ d[13] ^ d[14] ^
|
134 |
|
|
d[19] ^ d[21] ^ d[22] ^ d[26] ^ d[30] ^ C[1] ^ C[2] ^ C[4] ^ C[7]
|
135 |
|
|
^ C[9] ^ C[10] ^ C[12] ^ C[13] ^ C[15];
|
136 |
|
|
crc[14] = d[1] ^ d[2] ^ d[4] ^ d[5] ^ d[7] ^ d[10] ^ d[12] ^ d[13] ^ d[18] ^
|
137 |
|
|
d[20] ^ d[21] ^ d[25] ^ d[29] ^ C[2] ^ C[3] ^ C[5] ^ C[8] ^ C[10]
|
138 |
|
|
^ C[11] ^ C[13] ^ C[14];
|
139 |
|
|
crc[15] = d[0] ^ d[1] ^ d[3] ^ d[4] ^ d[6] ^ d[9] ^ d[11] ^ d[12] ^ d[17] ^
|
140 |
|
|
d[19] ^ d[20] ^ d[24] ^ d[28] ^ C[3] ^ C[4] ^ C[6] ^ C[9] ^ C[11]
|
141 |
|
|
^ C[12] ^ C[14] ^ C[15];
|
142 |
|
|
|
143 |
|
|
crc16d32 = {~crc[0],~crc[1],~crc[2],~crc[3],~crc[4],~crc[5],~crc[6],~crc[7],
|
144 |
|
|
~crc[8],~crc[9],~crc[10],~crc[11],~crc[12],~crc[13],~crc[14],~crc[15]};
|
145 |
|
|
|
146 |
|
|
return;
|
147 |
|
|
}
|
148 |
|
|
|
149 |
|
|
|
150 |
|
|
}
|