如何编写关于返回数据的函数

时间:2014-02-21 03:34:46

标签: system-verilog

所有,我需要help.i遇到关于数组数据事务的问题。请帮帮我!    代码如下。    packet是数据类,并且有三个队列,R,G,B,并且在模块“test”中,arith函数的return_data是没有数据的。为什么?     问题:虽然“入 - arith”函数,但输出tr_out不是数据。

class packet # (int bit_depth =16);//packet class

  bit [bit_depth-1:0] R[$];
  bit [bit_depth-1:0] G[$];
  bit [bit_depth-1:0] B[$];

endclass 

//数据包是数据类

module test #(active_num=1920);   //

    packet in_tr [4];

    initial begin
        foreach(in_tr[i]) begin
            in_tr[i] = new();
        end
        foreach(in_tr[j]) begin
            for(int i=0;i<1920;i++) begin
                in_tr[j].R.push_back(i);
            end
        end
        process_in_tr;
    end

    task process_in_tr();
       packet tr_out[4];

       foreach(tr_out[i])begin
            tr_out[i] = new();
       end

       tr_out[4] = into_arith(in_tr);

       foreach(tr_out[j]) begin
           foreach(tr_out[j].R[i]) begin
               $display("%h",tr_out[j].R[i]);
           end
       end
    endtask


    function packet[4] into_arith(ref packet in_tr[4]);
       packet tr_tmp[4];

       foreach(tr_tmp[i]) begin
            tr_tmp[i] = new();
       end

       for(int m=0;m<4;m++) begin
           foreach(in_tr[m].R[i]) begin
               tr_tmp[m].R.push_back(in_tr[m].R[i]);
               tr_tmp[m].G.push_back(in_tr[m].G[i]);
               tr_tmp[m].B.push_back(in_tr[m].B[i]);
           end
       end

      return tr_tmp[4];
    endfunction

endmodule

1 个答案:

答案 0 :(得分:2)

我无法在Questa中编译这个事件,有很多语法错误。

三个主要问题是

  1. 该函数的声明是错误的。返回聚合类型时必须使用typedef(在您的情况下是一个解包的数据包#())
  2. 作业tr_out[4] = into_arith(in_tr);是非法的。您正在尝试将一个包含4个元素的解包数组分配给数组的第5个元素,这个元素甚至不存在。
  3. return tr_tmp[4];也是非法的。您试图返回数组中不存在的第5个元素作为需要4个元素数组的函数的返回值。
  4. 请参阅下面的所有更正:

    class packet # (int bit_depth =16);//packet class
      bit [bit_depth-1:0] R[$];
      bit [bit_depth-1:0] G[$];
      bit [bit_depth-1:0] B[$];
    endclass 
    
    //packet is data class
    
    module test #(active_num=1920);   //
    
       typedef packet#() packet4_t[4];
    
        packet4_t in_tr;
    
        initial begin
           foreach(in_tr[j]) begin
              in_tr[j] = new();
              for(int i=0;i<1920;i++)
                in_tr[j].R.push_back(i);
           end
           process_in_tr;
        end
    
        task process_in_tr();
           packet4_t tr_out;
    
           tr_out = into_arith(in_tr);
    
           foreach(tr_out[j]) begin
               foreach(tr_out[j].R[i]) begin
                   $display("%h",tr_out[j].R[i]);
               end
           end
        endtask
    
        function automatic packet4_t into_arith(ref packet4_t in_tr);
           packet4_t tr_tmp;
    
           foreach(tr_tmp[i]) begin
              tr_tmp[i] = new();
    
              tr_tmp[m].R = in_tr[m].R;
              tr_tmp[m].G = in_tr[m].G;
              tr_tmp[m].B = in_tr[m].B;   
              /* assigments above are the same as the foreach loop below
          foreach(in_tr[m].R[i]) begin
                 tr_tmp[m].R.push_back(in_tr[m].R[i]);
                 tr_tmp[m].G.push_back(in_tr[m].G[i]);
                 tr_tmp[m].B.push_back(in_tr[m].B[i]);
               end */
           end
    
           return tr_tmp;
        endfunction
    
    endmodule