|
Answer» In SV, we use mailbox to get data from different modules and compare the result.
class Scoreboard; mailbox drvr2sb; mailbox rcvr2sb;
function new(mailbox drvr2sb,mailbox rcvr2sb); this.drvr2sb = drvr2sb; this.rcvr2sb = rcvr2sb; endfunction:new
task start(); packet pkt_rcv,pkt_exp; forever begin rcvr2sb.get(pkt_rcv); $display(" %0d : Scorebooard : Scoreboard received a packet from RECEIVER ",$time); drvr2sb.get(pkt_exp); if(pkt_rcv.compare(pkt_exp)) $display(" %0d : Scoreboardd :Packet Matched ",$time); else $root.error++; end endtask : start endclass
In VMM, we use channels to CONNECT all the modules and compare the result.
class Scoreboard extends vmm_xactor; Packet_channel drvr2sb_chan; Packet_channel rcvr2sb_chan;
function new(string inst = "class", INT unsigned stream_id = -1, Packet_channel drvr2sb_chan = null, Packet_channel rcvr2sb_chan = null); super.new("sb",inst,stream_id); if(drvr2sb_chan == null) `vmm_fatal(this.log,"drvr2sb_channel is not constructed"); else this.drvr2sb_chan = drvr2sb_chan; if(rcvr2sb_chan == null) `vmm_fatal(this.log,"rcvr2sb_channel is not constructed"); else this.rcvr2sb_chan = rcvr2sb_chan; `vmm_note(log,"Scoreboard created "); endfunction:new
task main(); Packet pkt_rcv,pkt_exp; string msg; super.main(); forever begin rcvr2sb_chan.get(pkt_rcv); $display(" %0d : Scoreboard : Scoreboard received a packet from receiver ",$time); drvr2sb_chan.get(pkt_exp); if(pkt_rcv.compare(pkt_exp,msg)) $display(" %0d : Scoreboard :Packet Matched ",$time); else `vmm_error(this.log,$psprintf(" Packet MissMatched N %s ",msg)); end endtask : main endclass In SV, we use mailbox to get data from different modules and compare the result. class Scoreboard; mailbox drvr2sb; mailbox rcvr2sb; function new(mailbox drvr2sb,mailbox rcvr2sb); this.drvr2sb = drvr2sb; this.rcvr2sb = rcvr2sb; endfunction:new task start(); packet pkt_rcv,pkt_exp; forever begin rcvr2sb.get(pkt_rcv); $display(" %0d : Scorebooard : Scoreboard received a packet from receiver ",$time); drvr2sb.get(pkt_exp); if(pkt_rcv.compare(pkt_exp)) $display(" %0d : Scoreboardd :Packet Matched ",$time); else $root.error++; end endtask : start endclass In VMM, we use channels to connect all the modules and compare the result. class Scoreboard extends vmm_xactor; Packet_channel drvr2sb_chan; Packet_channel rcvr2sb_chan; function new(string inst = "class", int unsigned stream_id = -1, Packet_channel drvr2sb_chan = null, Packet_channel rcvr2sb_chan = null); super.new("sb",inst,stream_id); if(drvr2sb_chan == null) `vmm_fatal(this.log,"drvr2sb_channel is not constructed"); else this.drvr2sb_chan = drvr2sb_chan; if(rcvr2sb_chan == null) `vmm_fatal(this.log,"rcvr2sb_channel is not constructed"); else this.rcvr2sb_chan = rcvr2sb_chan; `vmm_note(log,"Scoreboard created "); endfunction:new task main(); Packet pkt_rcv,pkt_exp; string msg; super.main(); forever begin rcvr2sb_chan.get(pkt_rcv); $display(" %0d : Scoreboard : Scoreboard received a packet from receiver ",$time); drvr2sb_chan.get(pkt_exp); if(pkt_rcv.compare(pkt_exp,msg)) $display(" %0d : Scoreboard :Packet Matched ",$time); else `vmm_error(this.log,$psprintf(" Packet MissMatched n %s ",msg)); end endtask : main endclass
|