求助:uvm_do_with如何给一个动态数组赋值
我最近在学着折腾UVM,遇到一个问题,transaction中有一个动态数组,然后在写sequence的时候,需要为这个动态数组赋上确切的值(不想采用随机化的值),那么使用`uvm_do_with的时候是不是`uvm_do_with(req.array==arr_in)?,我不是很确定,有没有人知道是怎么弄的呀?先谢谢了!
可以考虑pre_randomize,randomize和post_randomize操作,不一定非要用这个宏。
谢谢。
另外想问问,上面那样用`uvm_do_with是否正确呢?
这种用法可能不行,动态数组不能用这种方式直接全部赋值,因为你没有给它分配地址空间呢,就是new[多少]
哦。那么,用pre_randomize,randomize和post_randomize怎么用呢,需要先提取arr_in的size,然后在给req.array进行new操作?
另外,对pre_randomize,randomize和post_randomize不是很熟悉,不知道哪里可以找到相关的资料呢?谢谢了。
刚才到处查了一下,原来pre_randomize,randomize和post_randomize是systemverilog中的,难怪怎么在UVM的书里面查都查不到,基础没学好。不过这几个东西我确实是没用过,是否应该这样写:
function void pre_randomize();
req.array=new[arr_in.size()];
endfunction : pre_randomize
. . .
virtual task body();
...
`uvm_do_with(req,{req.arrar==arr_in});
endtask : body
我想问一下,写好pre_randomize函数之后,还需要在`uvm_do_with()之前加上一句"pre_randomize();"么?还是不需要,仿真工具在随机化的时候会自动执行pre_randomize()中的东西呢?
应该不需要。
试试下面看行不行:
`uvm_do_with(req,{req.array.size==arr_in.size;foreach(req.array[i]) req.array[i] inside {arr_in[i]};}
刚才试过了,不行。ius报的warning是:
req.arr.size==arr_in.size();foreach(req.arr) req.arr==arr_in;})
|
ncsim:*W,SVRNDF (./sv/master_seq_lib.sv, 64|55): The randomize method call failed.
你写的是这个?
req.arr.size==arr_in.size();foreach(req.arr) req.arr==arr_in;})
req.arr.size==arr_in.size();foreach(req.arr[i]) req.arr[i]==arr_in[i];})
恩。没用inside,因为感觉用inside只是给req.arr划定了一个取值范围,并没用使得arr与arr_in完全一致。不知道我理解的对不对,还请指教。
小编我也遇到了同样的问题
int arr_in[];
arr_in=new(64);
然后对arr_in进行随机化
`uvm_do_with(req,{req.arr.size==arr_in.size();foreach(req.arr[i]) req.arr[i]==arr_in[i];})
现在出现的问题是arr_in也传不进req里啊?另外req里的arr应该如何定义?用不用new[]呢?
求助!
改成这种写法:
int arr_in[];
arr_in=new[64];
然后对arr_in进行随机化
int size_cnt=arr_in.size();
`uvm_create(tr);
assert(req.randomize() with{req.arr.size==size_cnt;});
foreach(arr_int[i]) req.arr[i]==arr_in[i];
start_item(req);
finish_item(req);