微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > 求助:uvm_do_with如何给一个动态数组赋值

求助:uvm_do_with如何给一个动态数组赋值

时间:10-02 整理:3721RD 点击:
各位:
我最近在学着折腾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);

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top