Code Browser Pages:
| `include "vmm.sv" `ifndef HOST_RXXTOR_CLASS `define HOST_RXXTOR_CLASS class host_xtor_rx extends vmm_xactor ; host_driver drvr; packet_channel chan_hst2sb; extern function new(string name,host_driver drvr,packet_channel chan_hst2sb ); extern task main(); endclass function host_xtor_rx::new(string name,host_driver drvr,packet_channel chan_hst2sb); super.new("HOST_RX",name); log = new("HOST_RX",name); if(drvr == null) begin `vmm_note(this.log,$psprintf("null object drvr ")); end this.drvr = drvr; this.chan_hst2sb = chan_hst2sb ; endfunction task host_xtor_rx::main(); logic [7:0] data[]; bit [31:0] word; rx_packet p; fork super.main(); join_none forever begin drvr.posedge_clk(); if(drvr.read_Rx_mac_ra()) drvr.drive_Rx_mac_rd(1); else drvr.drive_Rx_mac_rd(0); if(drvr.read_Rx_mac_pa()) begin if(drvr.read_Rx_mac_sop()) data.delete(); word = drvr.read_Rx_mac_data(); if(drvr.read_Rx_mac_BE() <= 3) begin data = new[data.size() + 1] (data); data[data.size() - 1] = word[31 :24]; end if(drvr.read_Rx_mac_BE() <= 2) begin data = new[data.size() + 1] (data); data[data.size() - 1] = word[23:16]; end if(drvr.read_Rx_mac_BE() <= 1) begin data = new[data.size() + 1] (data); data[data.size() - 1] = word[15:8]; end if(drvr.read_Rx_mac_BE() <= 0) begin data = new[data.size() + 1] (data); data[data.size() - 1] = word[7:0]; end if(drvr.read_Rx_mac_eop()) begin `vmm_note(this.log,$psprintf(" EOP is SEEN data size is 0 \n",data.size())); p = new(); void'(p.byte_unpack(data)); `vmm_note(this.log,$psprintf("PKT LEN AFTER UNPACK 0",p.Pkt_Packed.size())); `vmm_trace(this.log, "Recieved transaction..."); `vmm_debug(this.log, p.psdisplay(" ")); `vmm_callback(data_callback,pre_call(p)); chan_hst2sb.sneak(p); data.delete(); end end end endtask `endif |