From 0262bd77921a467e936afd73a0f260534d3f9d71 Mon Sep 17 00:00:00 2001 From: Tomasz Wlostowski <tomasz.wlostowski@cern.ch> Date: Wed, 10 Aug 2011 11:24:59 +0200 Subject: [PATCH] simulation models: added WBP packet source class --- sim/wb_packet_source.svh | 144 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 sim/wb_packet_source.svh diff --git a/sim/wb_packet_source.svh b/sim/wb_packet_source.svh new file mode 100644 index 00000000..c4c18ce1 --- /dev/null +++ b/sim/wb_packet_source.svh @@ -0,0 +1,144 @@ +`ifndef __WB_PACKET_SOURCE_SVH + `define __WB_PACKET_SOURCE_SVH + +`include "simdrv_defs.svh" +`include "if_wishbone_accessor.svh" + +virtual class EthPacketSource; + + static int _null = 0; + + pure virtual task send(ref EthPacket pkt, ref int result = _null); + +endclass // PacketSource + + +class WBPacketSource extends EthPacketSource; + protected CWishboneAccessor m_acc; + + const bit [2:0] WRF_STATUS = 3'b110; + const bit [2:0] WRF_DATA = 3'b000; + const bit [2:0] WRF_OOB = 3'b010; + const bit [2:0] WRF_USER = 3'b100; + + const bit [3:0] WRF_OOB_TX_FID = 4'b0000; + const bit [3:0] WRF_OOB_RX_TIMESTAMP = 4'b0001; + + + function new(CWishboneAccessor acc); + m_acc = acc; + endfunction // new + + function bit[15:0] pack_status(ref EthPacket pkt, input bit error = 0); + bit [15:0] st; + st[0] = (pkt.is_hp ? 1'b1: 1'b0); + st[1] = 1'b0; + st[2] = (pkt.has_smac ? 1'b1: 1'b0); + st[3] = error; + st[15:3] = 0; // FIXME: add packet classes + return st; + endfunction // pack_status + + task unpack_status(bit[15:0] status, ref EthPacket pkt); + + endtask // unpack_status + + typedef bit[15:0] oob_array16[]; + + function u64_array_t pack_oob(ref EthPacket pkt); + u64_array_t oob; + + case(pkt.oob_type) + TX_FID: begin + oob = new[2]; + oob[0] = {WRF_OOB_TX_FID, 12'b0}; + oob[1] = pkt.ts.frame_id; + end + endcase // case (pkt.oob_type) + return oob; + + endfunction // pack_oob + + + task send(ref EthPacket pkt, ref int result = _null); + byte pdata[]; // FIXME: dynamic allocation would be better... + u64_array_t pdata_p; + u64_array_t oob_p; + + int i, len; + + wb_cycle_t cyc; + wb_xfer_t xf; + + cyc.ctype = PIPELINED; + + /* First, the status register */ + + xf.a = WRF_STATUS; + xf.d = pack_status(pkt); + xf.size = 2; + + cyc.data.push_back(xf); + + pkt.serialize(pdata); + + pdata_p = SimUtils.pack(pdata, 2, 1); + len = pdata_p.size(); + + for(i=0; i < len; i++) + begin + xf.a = WRF_DATA; + if(i==len-1 && (pdata.size()&1)) + begin + xf.size = 1; + xf.d = pdata_p[i] >> 8; + end else begin + xf.size = 2; + xf.d = pdata_p[i]; + end + + cyc.data.push_back(xf); + + end + + if(pkt.error) + begin + + xf.a = WRF_STATUS; + xf.d = pack_status(pkt, 1); + xf.size = 2; + cyc.data.push_back(xf); + + + end else begin + +// $display("DataSize: %d\n", cyc.data.size()); + + oob_p = pack_oob(pkt); + + for (i=0;i<oob_p.size(); i++) + begin + xf.a = WRF_OOB; + xf.d = oob_p[i] & 'hffff; + xf.size = 2; + cyc.data.push_back(xf); + + end + end // else: !if(pkt.error) + + m_acc.put(cyc); + + + + endtask // send + + + + + + +endclass // WBPacketSource + + + +`endif -- GitLab