Code Browser Pages:
| //////////////////////////////////////////////// ////s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~s//// ////s www.testbench.in s//// ////s s//// ////s VMM Tutorial s//// ////s gopi@testbench.in s//// ////s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~s//// //////////////////////////////////////////////// `ifndef GUARD_DRIVER `define GUARD_DRIVER class Driver_callbacks extends vmm_xactor_callbacks; // Called before a transaction is executed virtual task pre_trans(Packet tr); endtask: pre_trans // Called after a transaction has been executed virtual task post_trans(Packet tr); endtask: post_trans endclass:Driver_callbacks class Driver extends vmm_xactor; virtual input_interface.IP input_intf; Packet_channel gen2drv_chan; Packet_channel drv2sb_chan; function new(string inst, int stream_id = -1, virtual input_interface.IP input_intf_new, Packet_channel gen2drv_chan = null, Packet_channel drv2sb_chan = null); super.new("driver",inst,stream_id); this.input_intf = input_intf_new; if(gen2drv_chan == null) `vmm_fatal(log,"gen2drv_channel is null"); else this.gen2drv_chan = gen2drv_chan; if(drv2sb_chan == null) `vmm_fatal(log,"drvr2sb_channel is null"); else this.drv2sb_chan = drv2sb_chan; `vmm_note(log,"Driver created "); endfunction task drive(Packet pkt); logic [7:0] pack[]; int pkt_len; pkt_len = pkt.byte_pack(pack,0,0); @(posedge input_intf.clock); for (int i=0;i< pkt_len - 1;i++) begin @(posedge input_intf.clock); input_intf.cb.data_status <= 1 ; input_intf.cb.data_in <= pack[i]; end @(input_intf.clock); input_intf.cb.data_status <= 0 ; input_intf.cb.data_in <= pack[pkt_len -1]; @(input_intf.clock); endtask task main(); super.main(); `vmm_note(this.log," started main task "); forever begin Packet pkt; wait_if_stopped_or_empty(this.gen2drv_chan); this.gen2drv_chan.get(pkt); `vmm_trace(this.log, "Starting transaction..."); `vmm_debug(this.log, pkt.psdisplay(" ")); `vmm_callback(Driver_callbacks,pre_trans(pkt)); drive(pkt); `vmm_callback(Driver_callbacks,post_trans(pkt)); `vmm_trace(this.log, "Completed transaction..."); `vmm_debug(this.log, pkt.psdisplay(" ")); @(posedge input_intf.clock); this.drv2sb_chan.put(pkt); end endtask endclass `endif |