对于下面的函数(顺便说一下,这个函数的命名是错误的),
当函数关闭时,ref_req会被更改吗?
由于参数是通过值传递的,并且没有返回,所以我猜不是。
但是代码的所有者告诉我用这种方式编码是可以的,我很困惑
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发布于 2022-02-21 17:33:30
考虑到这是UVM代码的一部分,request_transaction很可能是类类型,使ref_req成为输入类变量参数。调用此函数时,类对象的类句柄将复制到ref_req中。如果要将函数参数更改为、ref、参数,那么这将是一个双重引用,也是不必要的。
一旦有了类对象的句柄,就可以写入该对象的类成员。这正是这个函数所做的。类变量始终充当对类对象的引用。请参阅类术语方面的我的职位。
顺便说一句,这个函数有一个1位的返回值,这是Verilog中的默认隐式。应该使用void返回类型来声明它,这意味着它没有返回值。
https://stackoverflow.com/questions/71202655
复制相似问题