基于System Verilog中的运行时数据的加权随机化

时间:2018-11-18 06:01:56

标签: constraints system-verilog verification hdl random-seed

是否有一种方法可以基于运行时数据在System Verilog中进行加权随机化。假设我有一个整数队列和一个权重队列(无符号整数),并希望根据第二个队列中的权重从第一个队列中选择一个随机整数。

int data[$] = '{10, 20, 30};
uint_t weights[$] = '{100, 200, 300};

任何随机构造都希望权重按照以下方式硬编码

constraint range { Var dist { [0:1] := 50 , [2:7] := 50 }; } 

但就我而言,我需要从数量未知的元素中选择一个元素。

PS:假定元素的数量和权重始终相同。

1 个答案:

答案 0 :(得分:1)

不幸的是,dist约束只允许您从固定数量的值中进行选择。

我能想到的两种方法

  1. 使用权重作为重复计数将每个数据值推入队列。在您的示例中,最后有600个值的队列。随机选择一个索引到队列中。所选元素具有所需的分布。在here上发布了一个示例。
  2. 为每个重量创建一个范围数组。对于您的示例,数组为uint_t ranges[][2]'{{0,99},{100,299},{300,599}}。然后您可以在约束条件下执行以下操作

    index inside {[0:weights.sum()-1]}; foreach (data[ii]) index inside {[ranges[ii][0]:ranges[ii][1]} -> value == date[ii];