Quantcast
Channel: UVM SystemVerilog Discussions Forum RSS Feed
Viewing all articles
Browse latest Browse all 410

Help in resolving this error?

$
0
0
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,

Viewing all articles
Browse latest Browse all 410

Trending Articles