从 SV 约束的动态范围中选取随机地址的方法
我需要从 Systemverilog 中的一组预定义范围中选择随机地址,
program test;
int unsigned q[$], rSz;
typedef struct {
int unsigned from, till;
} range_t;
initial begin
range_t ranges[$];
ranges.push_back('{from: 'h10, till: 'h1F});
ranges.push_back('{from: 'h30, till: 'h3F});
ranges.push_back('{from: 'h50, till: 'h5F});
rSz = ranges.size();
$displayh(rSz, ranges);
repeat (10) begin
std::randomize(q) with {
q.size() inside {[4:8]};
foreach (q[i]) {
q[i] inside {[ranges[0].from: ranges[0].till]} ||
q[i] inside {[ranges[1].from: ranges[1].till]} ||
q[i] inside {[ranges[2].from: ranges[2].till]} ;
}
};
$displayh(q);
end
end
endprogram : test
如果我有固定数量的可以硬编码的范围,那么效果很好。 但范围数量本身是动态的,我无法像 foreach 循环中那样对范围进行硬编码。
我无法使用嵌套的 foreach,因为内部循环中的语句将被视为单独的约束,并且由于范围不重叠而彼此失败。
我能想出的就是像下面这样的东西,我按顺序使用范围,然后在最后随机播放。
program test;
int unsigned q[$], rSz;
typedef struct {
int unsigned from, till;
} range_t;
initial begin
range_t ranges[$];
ranges.push_back('{from: 'h10, till: 'h1F});
ranges.push_back('{from: 'h30, till: 'h3F});
ranges.push_back('{from: 'h50, till: 'h5F});
rSz = ranges.size();
$displayh(rSz, ranges);
repeat (10) begin
std::randomize(q) with {
q.size() inside {[4:8]};
foreach (q[i]) {
q[i] inside {[ranges[i % rSz].from: ranges[i % rSz].till]};
}
};
q.shuffle();
$displayh(q);
end
end
endprogram : test
一般来说,有更好的方法吗?
我正在寻找类似 foreach-or
的东西,其中循环中的所有行都是 or-ed
而不是 and-ed
- 如果这解释了要求。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
大多数人都熟悉
sum()
数组减少方法,但是也有或()
,和()
和XOR()
还原方法。请参阅 7.12.3 7.12.3阵列减少方法 /a>。
Most people are familiar with the
sum()
array reduction method, but there are alsoor()
,and()
, andxor()
reduction methods as well.See section 7.12.3 Array reduction methods in the IEEE 1800-2017 SystemVerilog LRM.