Code Browser Pages:
| `include "vmm.sv" `ifndef HOST_XTOR_CLASS `define HOST_XTOR_CLASS class host_xtor_tx extends vmm_xactor; integer EXECUTING; host_driver drvr; packet_channel chan_gen2xtor; packet_channel chan_hst2sb; extern function new(string name,host_driver drvr,packet_channel chan_gen2xtor,packet_channel chan_hst2sb ); extern task drive_packet(packet pkt); extern task main(); endclass function host_xtor_tx::new(string name,host_driver drvr,packet_channel chan_gen2xtor,packet_channel chan_hst2sb); super.new("HOST_TX",name); if(drvr == null) `vmm_fatal(log,$psprintf(" null object drvr ")); this.drvr = drvr; this.chan_gen2xtor = chan_gen2xtor; this.chan_hst2sb = chan_hst2sb ; this.EXECUTING = this.notify.configure(); endfunction task host_xtor_tx::drive_packet(packet pkt); integer length,i,last_word,loop_var; bit[31:0] last_wd; logic [7:0] bytes[]; length = pkt.byte_pack(bytes); `vmm_note(this.log,$psprintf("Sending packet of length 0",length)); last_word = length % 4 ? length % 4 : 4; loop_var = length - last_word ; drvr.posedge_clk() ; for(i = 0;i < loop_var - 1;i = i + 4) begin // Wait if Tx_mac_wa is low. while(drvr.read_Tx_mac_wa() === 0) begin drvr.drive_Tx_mac_wr(0); drvr.posedge_clk() ; end if(i == 0) // Assert Sop signal. drvr.drive_Tx_mac_sop(1); else drvr.drive_Tx_mac_sop(0); drvr.drive_Tx_mac_eop(0); drvr.drive_Tx_mac_wr(1); drvr.drive_Tx_mac_BE(2'b11); drvr.drive_Tx_mac_data({bytes[i],bytes[i+1],bytes[i+2],bytes[i+3]}); drvr.posedge_clk() ; end//end of for drvr.drive_Tx_mac_sop(0); drvr.drive_Tx_mac_eop(1); drvr.drive_Tx_mac_wr(1); drvr.drive_Tx_mac_BE(last_word); last_wd = 32'h0; case(last_word) 4:last_wd = { bytes[length -4 ],bytes[length - 3],bytes[length -2],bytes[length -1]} ; 3:last_wd = { bytes[length - 3],bytes[length -2],bytes[length -1],8'h0} ; 2:last_wd = { bytes[length -2],bytes[length -1],16'h0} ; 1:last_wd = { bytes[length -1],24'h0} ; endcase drvr.drive_Tx_mac_data(last_wd); drvr.posedge_clk() ; drvr.drive_Tx_mac_sop(0); drvr.drive_Tx_mac_eop(0); drvr.drive_Tx_mac_wr(0); drvr.drive_Tx_mac_BE(0); drvr.drive_Tx_mac_data(0); endtask task host_xtor_tx::main(); packet p; fork super.main(); join_none fork forever begin this.wait_if_stopped_or_empty(chan_gen2xtor); this.chan_gen2xtor.activate(p); this.chan_gen2xtor.start(); this.notify.indicate(this.EXECUTING,p); `vmm_trace(this.log, "Starting transaction..."); `vmm_debug(this.log, p.psdisplay()); `vmm_callback(data_callback,pre_call(p)); this.drive_packet(p); `vmm_callback(data_callback,post_call(p)); this.chan_hst2sb.sneak(p); this.notify.reset(this.EXECUTING); this.chan_gen2xtor.complete(); `vmm_trace(this.log, "Completed transaction..."); `vmm_debug(this.log, p.psdisplay()); this.chan_gen2xtor.remove(); repeat(20) drvr.posedge_clk() ; end join_none endtask `endif |