Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / verif / env / niu / txc_sat / vera / niu_txcntrl_wd.vr
// ========== Copyright Header Begin ==========================================
//
// OpenSPARC T2 Processor File: niu_txcntrl_wd.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 "pcg_defines.vri"
#include "niu_tx_pktconfig.vrh"
class TxPacketControlWord {
integer id;
// Ethernet Transmit Packet Header
// 128 bits control header for alignment
bit [1:0] pkt_type;
bit ip_ver;
bit v4_hdr_cs;
bit [1:0] l4_proto_op;
bit tcp_udp_crc_32c;
bit [4:0] rsvd_56_52;
bit [3:0] l3_start;
bit [1:0] rsvd_47_46;
bit [5:0] l4_start;
bit [1:0] rsvd_39_38;
bit [5:0] l4_stuff;
bit [1:0] rsvd_31_30;
bit [13:0] length;
bit [63:0] rsvd_127_64;
bit [12:0] rsvd_15_3;
bit [2:0] pad;
task new(integer i = 0) {
id = i;
rsvd_15_3 = 13'h0;
rsvd_56_52 = 5'h0;
rsvd_47_46 = 2'h0;
rsvd_39_38 = 2'h0;
rsvd_31_30 = 2'h0;
rsvd_127_64 = 64'h0;
}
function bit[127:0] get_header() {
get_header = {rsvd_127_64,
pkt_type,
ip_ver,
v4_hdr_cs,
l4_proto_op,
tcp_udp_crc_32c,
rsvd_56_52,
l3_start,
rsvd_47_46,
l4_start,
rsvd_39_38,
l4_stuff,
rsvd_31_30,
length,
rsvd_15_3,
pad};
}
task set_control_word ( bit [127:0] w) {
rsvd_127_64 = w[127:64];
pkt_type = w[63:62];
ip_ver = w[61];
v4_hdr_cs = w[60];
l4_proto_op = w[59:58];
tcp_udp_crc_32c = w[57];
rsvd_56_52 = w[56:52];
l3_start = w[51:48];
rsvd_47_46 = w[47:46];
l4_start = w[45:40];
rsvd_39_38 = w[39:38];
l4_stuff = w[37:32];
rsvd_31_30 = w[31:30];
length = w[29:16];
rsvd_15_3 = w[15:3];
pad = w[2:0];
// {pkt_type,ip_ver,v4_hdr_cs,l4_proto_op,tcp_udp_crc_32c,rsvd_56_52,l3_start,rsvd_47_46,l4_start,rsvd_39_38,l4_stuff,rsvd_31_0} = w;
}
//get frame type from pktconfig
function bit[4:0] get_frame_type(TxPacketGenConfig PktGenConfig) {
bit [4:0] ftype;
ftype = PktGenConfig.flow.frame.frame_type;
printf("VAL_OF_FRM_TYPE %0h\n",ftype);
get_frame_type = ftype;
}
// get frame class from pktconfig
function integer get_frame_class(TxPacketGenConfig PktGenConfig) {
integer fclass;
fclass = PktGenConfig.flow.frame.frame_class;
printf("VAL_OF_FRM_CLASS %0d\n",fclass);
get_frame_class = fclass;
}
// get ip_hdr_len
function integer get_ip_hdr_len(TxPacketGenConfig PktGenConfig) {
integer fip_hdr_len;
fip_hdr_len = PktGenConfig.flow.frame.header_length;
get_ip_hdr_len = fip_hdr_len;
}
// get pkt_length from the pktconfig
function bit [13:0] get_pkt_len(TxPacketGenConfig PktGenConfig) {
bit [13:0] pkt_len;
pkt_len = (PktGenConfig.data_length + PktGenConfig.pad*2) - 4;
get_pkt_len = pkt_len;
}
// get vlan from pkt_config
function bit get_vlan(TxPacketGenConfig PktGenConfig) {
bit vlan;
vlan = PktGenConfig.flow.frame.frame_type[2];
get_vlan = vlan;
}
// get llc from pkt_config
function bit get_llc(TxPacketGenConfig PktGenConfig) {
bit llc;
llc = PktGenConfig.flow.frame.frame_type[0];
get_llc = llc;
}
// get l3_start from pkt config
function bit [3:0] get_l3start(TxPacketGenConfig PktGenConfig) {
bit [3:0] l3_start;
bit llc;
bit vlan;
vlan = get_vlan(PktGenConfig);
llc = get_llc(PktGenConfig);
case({llc,vlan}) {
2'b00 : l3_start = 4'h7;
2'b01 : l3_start = 4'h9;
2'b10 : l3_start = 4'hb;
2'b11 : l3_start = 4'hd;
}
get_l3start = l3_start;
}
// get l4_start base
function bit [5:0] get_l4start_base(TxPacketGenConfig PktGenConfig) {
bit [5:0] l4start_base;
bit llc;
bit vlan;
bit ipver;
vlan = get_vlan(PktGenConfig);
llc = get_llc(PktGenConfig);
ipver = get_ip_ver(PktGenConfig);
if(ipver == 1'b0) {
case({llc,vlan}) {
2'b00 : l4start_base = 6'h11;
2'b01 : l4start_base = 6'h13;
2'b10 : l4start_base = 6'h15;
2'b11 : l4start_base = 6'h17;
}
} else {
case({llc,vlan}) {
2'b00 : l4start_base = 6'h1b;
2'b01 : l4start_base = 6'h1d;
2'b10 : l4start_base = 6'h1f;
2'b11 : l4start_base = 6'h21;
}
}
get_l4start_base = l4start_base;
}
// get l4_stuff base
function bit [5:0] get_l4stuff_base(TxPacketGenConfig PktGenConfig) {
bit [5:0] l4stuff_base;
bit llc;
bit vlan;
integer fclass;
bit ipver;
vlan = get_vlan(PktGenConfig);
llc = get_llc(PktGenConfig);
fclass = get_frame_class(PktGenConfig);
ipver = get_ip_ver(PktGenConfig);
if(ipver == 1'b0) {
if(fclass == CL_TCP) {
case({llc,vlan}) {
2'b00 : l4stuff_base = 6'h19;
2'b01 : l4stuff_base = 6'h1b;
2'b10 : l4stuff_base = 6'h1d;
2'b11 : l4stuff_base = 6'h1f;
}
} else if(fclass == CL_UDP) {
case({llc,vlan}) {
2'b00 : l4stuff_base = 6'h14;
2'b01 : l4stuff_base = 6'h16;
2'b10 : l4stuff_base = 6'h18;
2'b11 : l4stuff_base = 6'h1a;
}
}
} else {
if(fclass == CL_TCP_IP_V6) {
case({llc,vlan}) {
2'b00 : l4stuff_base = 6'h23;
2'b01 : l4stuff_base = 6'h25;
2'b10 : l4stuff_base = 6'h27;
2'b11 : l4stuff_base = 6'h29;
}
} else if(fclass == CL_UDP_IP_V6) {
case({llc,vlan}) {
2'b00 : l4stuff_base = 6'h1e;
2'b01 : l4stuff_base = 6'h20;
2'b10 : l4stuff_base = 6'h22;
2'b11 : l4stuff_base = 6'h24;
}
}
}
get_l4stuff_base = l4stuff_base;
}
function bit get_ip_ver(TxPacketGenConfig PktGenConfig) {
bit ipver;
if(PktGenConfig.flow.frame.frame_type[3] == 1'b1)
ipver = 1'b1;
else
ipver = 1'b0;
get_ip_ver = ipver;
}
// function bit [127:0] format_ctrl_word( bit [4:0] frame_type ,integer frame_class, bit [13:0] pkt_length, integer ip_hdr_len)
function bit [127:0] format_ctrl_word(TxPacketGenConfig PktGenConfig) {
bit [127:0] w;
bit [5:0] l4_stuff;
bit [5:0] l4stuff_base;
bit [5:0] l4_start;
bit [5:0] l4start_base;
bit [3:0] l3_start;
bit [3:0] ihl;
bit vlan;
bit llc;
bit [4:0] frame_type;
bit [13:0] pkt_length;
integer ip_hdr_len;
integer frame_class;
bit ipver;
// get the pkt params from the pkt_config;
frame_type = get_frame_type(PktGenConfig);
frame_class = get_frame_class(PktGenConfig);
pkt_length = get_pkt_len(PktGenConfig);
ip_hdr_len = get_ip_hdr_len(PktGenConfig);
l4stuff_base = get_l4stuff_base(PktGenConfig);
l4start_base = get_l4start_base(PktGenConfig);
pad = PktGenConfig.pad;
ipver = get_ip_ver(PktGenConfig);
if((frame_type[2] == 1'b0) && ((frame_class == CL_ARP) || (frame_class == CL_RARP))) {
w = {64'h0,2'b00,ipver,1'b0,30'h0,pkt_length,13'h0,pad};
} else if((frame_type[1] == 1'b1) && (frame_class == CL_IP)) {
w = {64'h0,2'b00,ipver,1'b0,30'h0,pkt_length,13'h0,pad};
} else if((frame_type[3] == 1'b1) && (frame_class == CL_IP_V6)) {
w = {64'h0,2'b00,ipver,1'b0,30'h0,pkt_length,13'h0,pad};
} else if((frame_type[1] == 1'b1) && (frame_class == CL_TCP)) {
l4_start = l4start_base + (ip_hdr_len - 5)*2;
l4_stuff = l4stuff_base + (ip_hdr_len - 5)*2;
ihl = ip_hdr_len;
vlan = get_vlan(PktGenConfig);
llc = get_llc(PktGenConfig);
l3_start = get_l3start(PktGenConfig);
w = {64'h0,2'b01,ipver,1'b0,2'h0,llc,vlan,ihl,l3_start,2'h0,l4_start,2'h0,l4_stuff,2'h0,pkt_length,13'h0,pad};
} else if ((frame_type[3] == 1'b1) && (frame_class == CL_TCP_IP_V6)) {
// w = {64'h0,2'b01,1'b1,1'b0,8'h0,4'h7,10'h0,6'h23,2'h0,pkt_length,16'h0};
l4_start = l4start_base;
l4_stuff = l4stuff_base;
ihl = ip_hdr_len;
vlan = get_vlan(PktGenConfig);
llc = get_llc(PktGenConfig);
l3_start = get_l3start(PktGenConfig);
w = {64'h0,2'b01,ipver,3'h0,llc,vlan,ihl,l3_start,2'h0,l4_start,2'h0,l4_stuff,2'h0,pkt_length,13'h0,pad};
} else if ((frame_type[1] == 1'b1) && (frame_class == CL_UDP)) {
l4_start = l4start_base + (ip_hdr_len - 5)*2;
l4_stuff = l4stuff_base + (ip_hdr_len - 5)*2;
ihl = ip_hdr_len;
vlan = get_vlan(PktGenConfig);
llc = get_llc(PktGenConfig);
l3_start = get_l3start(PktGenConfig);
w = {64'h0,2'b10,1'b0,1'b0,2'h0,llc,vlan,ihl,l3_start,2'h0,l4_start,2'h0,l4_stuff,2'h0,pkt_length,13'h0,pad};
} else if ((frame_type[3] == 1'b1) && (frame_class == CL_UDP_IP_V6)) {
// w = {64'h0,2'b10,1'b1,1'b0,8'h0,4'h7,10'h0,6'h1E,2'h0,pkt_length,13'h0,pad};
l4_start = l4start_base;
l4_stuff = l4stuff_base;
ihl = ip_hdr_len;
vlan = get_vlan(PktGenConfig);
llc = get_llc(PktGenConfig);
l3_start = get_l3start(PktGenConfig);
w = {64'h0,2'b10,ipver,3'h0,llc,vlan,ihl,l3_start,2'h0,l4_start,2'h0,l4_stuff,2'h0,pkt_length,13'h0,pad};
}
format_ctrl_word = w;
}
}