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 值。
对于下面的函数(顺便说一句,这个函数命名是错误的),
关闭函数后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 值。