systemverilog 函数 return 值

systemverilog function return value

对于下面的函数(顺便说一句,这个函数命名是错误的),

关闭函数后ref_req会发生变化吗?

由于参数是按值传递的,并且没有return,我的猜测是NO

但是代码的所有者告诉我可以这样编码,我感到困惑

    virtual function ref_process(request_transaction ref_req);
        bit [255:0] data_tmp[];
        bit [31:0] strb_tmp[];
        int data_size;

        //ref_req.addr=ref_req.addr>>5;
        ref_req.addr=ref_req.addr;
        ref_req.len=ref_req.len/2;
        ref_req.size=5;
        data_size=ref_req.data.size/2+ref_req.data.size%2;
        `uvm_info("ref_process",$psprintf("ref_req len is %0d",ref_req.len),UVM_LOW)

        //strb process
        if(ref_req.trans_type==uvc_pkg::AXI_WRITE) begin
            strb_tmp=new[data_size];
            foreach(ref_req.strb[i]) begin
                if(i%2==0) begin
                    strb_tmp[i/2][15:0]=ref_req.strb[i];
                    //`uvm_info("write_initiated", $sformatf("strb_tmp[%d]: %0x, xact_strb[%0d]: %0x",i/2,strb_tmp[i/2],i,ref_req.strb[i]), UVM_LOW)
                end
                else begin
                    strb_tmp[i/2][31:16]=ref_req.strb[i];
                    //`uvm_info("write_initiated", $sformatf("strb_tmp[%d]: %0x, xact_strb[%0d]: %0x",i/2,strb_tmp[i/2],i,ref_req.strb[i]), UVM_LOW)
                end
            end
            ref_req.strb.delete();
            //ref_req.strb=new[ref_req.len];
            foreach(strb_tmp[i]) begin
                ref_req.strb.push_back(strb_tmp[i]);
            end

            //data process
            data_tmp=new[data_size];
            foreach(ref_req.data[i]) begin
                if(i%2==0) begin
                    data_tmp[i/2][127:0]=ref_req.data[i];
                    //`uvm_info("write_initiated", $sformatf("data_tmp[%d]: %0x, xact_data[%0d]: %0x",i/2,data_tmp[i/2],i,ref_req.data[i]), UVM_LOW)
                end
                else begin
                    data_tmp[i/2][255:128]=ref_req.data[i];
                    //`uvm_info("write_initiated", $sformatf("data_tmp[%d]: %0x, xact_data[%0d]: %0x",i/2,data_tmp[i/2],i,ref_req.data[i]), UVM_LOW)
                end
            end
            ref_req.data.delete();
            //ref_req.data=new[ref_req.len];
            foreach(data_tmp[i]) begin
                ref_req.data.push_back(data_tmp[i]);
            end
        end

    endfunction

鉴于这是一段 UVM 代码,request_transaction 很可能是 class type making ref_req a 输入class变量参数。调用此函数时,class handle 到 class object 被复制到 ref_req 中。如果您要将函数参数更改为 ref 参数,那将是双重引用且不必要。

一旦你有一个class 对象的句柄,你可以写给class 成员那个对象。这正是这个函数的作用。 class 变量始终充当对 class 对象的引用。请参阅 my post 关于 class 术语。

顺便说一句,这个函数有一个 1 位 return 值,这是 Verilog 中的隐式默认值。它实际上应该用 void return 类型声明,这意味着它没有 return 值。