Code Browser Pages:
| #include <rvm_std_lib.vrh> #ifndef HOST_XTOR_CLASS #define HOST_XTOR_CLASS class host_xtor_tx extends rvm_xactor{ integer EXECUTING; host_driver drvr; packet_channel chan_gen2xtor; packet_channel chan_hst2sb; task new(string name,host_driver drvr,packet_channel chan_gen2xtor,packet_channel chan_hst2sb ); task drive_packet(packet pkt); task main_t(); } task host_xtor_tx::new(string name,host_driver drvr,packet_channel chan_gen2xtor,packet_channel chan_hst2sb){ super.new("HOST_RX",name); if(drvr == null) { rvm_note(log,psprintf(" null object drvr ")); } this.drvr = drvr; this.chan_gen2xtor = chan_gen2xtor; this.chan_hst2sb = chan_hst2sb ; this.EXECUTING = this.notify.configure(); } task host_xtor_tx::drive_packet(packet pkt){ integer length,i,last_word,loop_var; bit[31:0] last_wd; bit [7:0] bytes[*]; rvm_note(this.log,psprintf("Sending packet ")); void = pkt.byte_pack(bytes); length = bytes.size(); 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) { // Wait if Tx_mac_wa is low. while(drvr.read_Tx_mac_wa() === 0) { drvr.drive_Tx_mac_wr(0); drvr.posedge_clk() ; } 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 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} ; } 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); } //end of task task host_xtor_tx::main_t(){ packet p; fork super.main_t(); join none fork while(1) { this.wait_if_stopped_or_empty_t(chan_gen2xtor); p = this.chan_gen2xtor.activate_t(); void = this.chan_gen2xtor.start(); this.notify.indicate(this.EXECUTING,p); rvm_trace(this.log, "Starting transaction..."); rvm_debug(this.log, p.psdisplay()); rvm_OO_callback(data_callback,pre_cb(p)); this.drive_packet(p); rvm_OO_callback(data_callback,post_cb(p)); this.chan_hst2sb.put_t(p); this.notify.reset(this.EXECUTING); void = this.chan_gen2xtor.complete(); rvm_trace(this.log, "Completed transaction..."); rvm_debug(this.log, p.psdisplay()); void = this.chan_gen2xtor.remove(); repeat(20) drvr.posedge_clk() ; } join none } #endif |