Hello all UVM geeks,
I am getting the following error.
Error: monitor71.sv(69): The actual (dataout) and formal (bytestream) for a ref must be equivalent types.
Can someone please help me in resolving this error? I want to decode 10bits data received from DUT into 8bits by using 10b8b decoder, which I have used but its giving error when I am trying to put each 10bits received (after collecting them into an array) and then putting each 10bits into decoder to get 8bits and then unpack bytes to create packets. Code is also given below. Its kinda urgent,
[code=auto:0]
`include "uvm_macros.svh"
import uvm_pkg::*;
class monitor extends uvm_monitor;
//Registration of monitor with the factory.
`uvm_component_utils(monitor)
virtual dut_if dut_vi;
// uvm_analysis_port #(transaction) Montr2Sb_port;
uvm_analysis_port #(transaction) Montr2Agnt_port;
//constructor by using keyword new
function new(string name, uvm_component parent);
super.new(name, parent);
endfunction: new
function void build_phase(uvm_phase phase);
super.build_phase(phase);
assert( uvm_config_db #(virtual dut_if)::get(this, "", "dut_vi", dut_vi) );
Montr2Agnt_port = new("Montr2Ag", this);
endfunction : build_phase
task run_phase(uvm_phase phase);
transaction pkt;
fork
forever
begin
bit [9:0] bq[$],bytestream[];
bit [9:0] dataout[];
int j;
int pkt_len = 13;
// bit [9:0] unsigned bq[$];
// bit[9:0] unsigned bytestream[]; //keep it like this as the unpack_bytes take unsigned bytestream[].This works too.
$display("san14- Display of the packet contents %h",dut_vi.data);
repeat(3)@(dut_vi.clock); //keep repeat(3) at 3 only in order to match the first byte.Its needed
for ( int j = 0; j < pkt_len ; j++)
begin
$display("san- Display of the packet contents %h",dut_vi.data);
@(dut_vi.clock);
$display("san12- Display of the packet contents %h",dut_vi.data);
bq.push_back(dut_vi.data); //getting data from dut_if and putting in queue by pushing in it
@( dut_vi.clock);
$display("san11- Display of the queue contents %p",bq);
uvm_report_info(get_full_name(),"Ready to Get out of the Foreach/For loop ...",UVM_LOW);
end
uvm_report_info(get_full_name(),"Got out of the Foreach loop ...",UVM_LOW);
$display("san31- Display of the queue contents %h",bq.size());
bytestream = new[bq.size()] (bq); //(bq)
$display("san32- Display of the bytes array contents %h",bytestream);
pkt = transaction::type_id::create("pkt1");
uvm_report_info(get_full_name(),"Started unpacking of received bytes ...",UVM_LOW);
decode(bytestream);
void'(pkt.unpack_bytes(dataout)); //ERROR IS POINTING AT THIS LINE.
pkt.print();
uvm_report_info(get_full_name(),"Completed unpacking of received bytes ...",UVM_LOW);
//pkt.print();
Montr2Agnt_port.write(pkt);
$display("san34- Display of the bytes array contents %h",bytestream);
uvm_report_info(get_full_name(),"Sending received packet from monitor to the Scoreboard ...",UVM_LOW);
end
join
endtask: run_phase
virtual function decode(bytestream);
bit [9:0]bytestream[];
uvm_report_info(get_full_name(),"Decoding Each 10bits into 8bits ...",UVM_LOW);
foreach (bytestream[k])
begin
bit dispin ;
bit [9:0] dataout ; //output bytes of decoder
reg[9:0] datain = bytestream[k];
logic code_err ;
logic disp_err ;
logic ai = datain[0] ;
logic bi = datain[1] ;
logic ci = datain[2] ;
logic di = datain[3] ;
logic ei = datain[4] ;
logic ii = datain[5] ;
logic fi = datain[6] ;
logic gi = datain[7] ;
logic hi = datain[8] ;
logic ji = datain[9] ;
logic aeqb = (ai & bi) | (!ai & !bi) ;
logic ceqd = (ci & di) | (!ci & !di) ;
logic p22 = (ai & bi & !ci & !di) |
(ci & di & !ai & !bi) |
( !aeqb & !ceqd) ;
logic p13 = ( !aeqb & !ci & !di) |
( !ceqd & !ai & !bi) ;
logic p31 = ( !aeqb & ci & di) |
( !ceqd & ai & bi) ;
//logic p40;
//datain = pout;
logic p40 = ai & bi & ci & di ;
logic p04 = !ai & !bi & !ci & !di ;
logic disp6a = p31 | (p22 & dispin) ; // pos disp if p22 and was pos, or p31.
logic disp6a2 = p31 & dispin ; // disp is ++ after 4 bits
logic disp6a0 = p13 & ! dispin ; // -- disp after 4 bits
logic disp6b = (((ei & ii & ! disp6a0) | (disp6a & (ei | ii)) | disp6a2 |
(ei & ii & di)) & (ei | ii | di)) ;
// The 5B/6B decoding special cases where ABCDE != abcde
logic p22bceeqi = p22 & bi & ci & (ei == ii) ;
logic p22bncneeqi = p22 & !bi & !ci & (ei == ii) ;
logic p13in = p13 & !ii ;
logic p31i = p31 & ii ;
logic p13dei = p13 & di & ei & ii ;
logic p22aceeqi = p22 & ai & ci & (ei == ii) ;
logic p22ancneeqi = p22 & !ai & !ci & (ei == ii) ;
logic p13en = p13 & !ei ;
logic anbnenin = !ai & !bi & !ei & !ii ;
logic abei = ai & bi & ei & ii ;
logic cdei = ci & di & ei & ii ;
logic cndnenin = !ci & !di & !ei & !ii ;
//non-zero disparity cases:
logic p22enin = p22 & !ei & !ii ;
logic p22ei = p22 & ei & ii ;
//logic p13in = p12 & !ii ;
//logic p31i = p31 & ii ;
logic p31dnenin = p31 & !di & !ei & !ii ;
//logic p13dei = p13 & di & ei & ii ;
logic p31e = p31 & ei ;
logic compa = p22bncneeqi | p31i | p13dei | p22ancneeqi |
p13en | abei | cndnenin ;
logic compb = p22bceeqi | p31i | p13dei | p22aceeqi |
p13en | abei | cndnenin ;
logic compc = p22bceeqi | p31i | p13dei | p22ancneeqi |
p13en | anbnenin | cndnenin ;
logic compd = p22bncneeqi | p31i | p13dei | p22aceeqi |
p13en | abei | cndnenin ;
logic compe = p22bncneeqi | p13in | p13dei | p22ancneeqi |
p13en | anbnenin | cndnenin ;
logic ao = ai ^ compa ;
logic bo = bi ^ compb ;
logic co = ci ^ compc ;
logic d0 = di ^ compd ;
logic eo = ei ^ compe ;
logic feqg = (fi & gi) | (!fi & !gi) ;
logic heqj = (hi & ji) | (!hi & !ji) ;
logic fghj22 = (fi & gi & !hi & !ji) |
(!fi & !gi & hi & ji) |
( !feqg & !heqj) ;
logic fghjp13 = ( !feqg & !hi & !ji) |
( !heqj & !fi & !gi) ;
logic fghjp31 = ( (!feqg) & hi & ji) |
( !heqj & fi & gi) ;
logic dispout = (fghjp31 | (disp6b & fghj22) | (hi & ji)) & (hi | ji) ;
logic ko = ( (ci & di & ei & ii) | ( !ci & !di & !ei & !ii) |
(p13 & !ei & ii & gi & hi & ji) |
(p31 & ei & !ii & !gi & !hi & !ji)) ;
logic alt7 = (fi & !gi & !hi & // 1000 cases, where disp6b is 1
((dispin & ci & di & !ei & !ii) | ko |
(dispin & !ci & di & !ei & !ii))) |
(!fi & gi & hi & // 0111 cases, where disp6b is 0
(( !dispin & !ci & !di & ei & ii) | ko |
( !dispin & ci & !di & ei & ii))) ;
logic k28 = (ci & di & ei & ii) | ! (ci | di | ei | ii) ;
// k28 with positive disp into fghi - .1, .2, .5, and .6 special cases
logic k28p = ! (ci | di | ei | ii) ;
logic fo = (ji & !fi & (hi | !gi | k28p)) |
(fi & !ji & (!hi | gi | !k28p)) |
(k28p & gi & hi) |
(!k28p & !gi & !hi) ;
logic go = (ji & !fi & (hi | !gi | !k28p)) |
(fi & !ji & (!hi | gi |k28p)) |
(!k28p & gi & hi) |
(k28p & !gi & !hi) ;
logic ho = ((ji ^ hi) & ! ((!fi & gi & !hi & ji & !k28p) | (!fi & gi & hi & !ji & k28p) |
(fi & !gi & !hi & ji & !k28p) | (fi & !gi & hi & !ji & k28p))) |
(!fi & gi & hi & ji) | (fi & !gi & !hi & !ji) ;
logic disp6p = (p31 & (ei | ii)) | (p22 & ei & ii) ;
logic disp6n = (p13 & ! (ei & ii)) | (p22 & !ei & !ii) ;
logic disp4p = fghjp31 ;
logic disp4n = fghjp13 ;
//assign
code_err = p40 | p04 | (fi & gi & hi & ji) | (!fi & !gi & !hi & !ji) |
(p13 & !ei & !ii) | (p31 & ei & ii) |
(ei & ii & fi & gi & hi) | (!ei & !ii & !fi & !gi & !hi) |
(ei & !ii & gi & hi & ji) | (!ei & ii & !gi & !hi & !ji) |
(!p31 & ei & !ii & !gi & !hi & !ji) |
(!p13 & !ei & ii & gi & hi & ji) |
(((ei & ii & !gi & !hi & !ji) |
(!ei & !ii & gi & hi & ji)) &
! ((ci & di & ei) | (!ci & !di & !ei))) |
(disp6p & disp4p) | (disp6n & disp4n) |
(ai & bi & ci & !ei & !ii & ((!fi & !gi) | fghjp13)) |
(!ai & !bi & !ci & ei & ii & ((fi & gi) | fghjp31)) |
(fi & gi & !hi & !ji & disp6p) |
(!fi & !gi & hi & ji & disp6n) |
(ci & di & ei & ii & !fi & !gi & !hi) |
(!ci & !di & !ei & !ii & fi & gi & hi) ;
//assign
dataout = {ko, ho, go, fo, eo, d0, co, bo, ao} ;
// my disp err fires for any legal codes that violate disparity, may fire for illegal codes
//assign
disp_err = ((dispin & disp6p) | (disp6n & !dispin) |
(dispin & !disp6n & fi & gi) |
(dispin & ai & bi & ci) |
(dispin & !disp6n & disp4p) |
(!dispin & !disp6p & !fi & !gi) |
(!dispin & !ai & !bi & !ci) |
(!dispin & !disp6p & disp4n) |
(disp6p & disp4p) | (disp6n & disp4n)) ;
uvm_report_info(get_full_name(),"Decoded Each 10bits into 8bits ...",UVM_LOW);
$display("SM02- Display of the Decoded data contents %h",dataout);
end
endfunction: decode
endclass: monitor
[\code]
Thanks,