首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >systemverilog函数返回值

systemverilog函数返回值
EN

Stack Overflow用户
提问于 2022-02-21 07:34:56
回答 1查看 515关注 0票数 -2

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

当函数关闭时,ref_req会被更改吗?

由于参数是通过值传递的,并且没有返回,所以我猜不是。

但是代码的所有者告诉我用这种方式编码是可以的,我很困惑

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-21 17:33:30

考虑到这是UVM代码的一部分,request_transaction很可能是类类型,使ref_req成为输入类变量参数。调用此函数时,类对象的类句柄将复制到ref_req中。如果要将函数参数更改为、ref、参数,那么这将是一个双重引用,也是不必要的。

一旦有了类对象的句柄,就可以写入该对象的类成员。这正是这个函数所做的。类变量始终充当对类对象的引用。请参阅类术语方面的我的职位

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71202655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档