【问题标题】:Randomly select items from a SystemVerilog queue从 SystemVerilog 队列中随机选择项目
【发布时间】:2021-04-22 16:02:00
【问题描述】:

我有一个寄存器队列,我用内存映射中的寄存器进行实例化。 发生的情况是,其中一些寄存器将直接使用 RAL 写入,而其他寄存器将通过另一种方法写入。 我的测试应该每次随机化两组寄存器的数量和名称。如何在不重复的情况下随机化要为每个配置选择的寄存器的数量和名称?

结果可以是允许我使用这些寄存器的任何格式,所以如果它产生两个子队列就可以了。

编辑:

所以我可以有一个这样的队列: reg_queue = {reg_item1, reg_item2, reg_item3, reg_item4, reg_item5, reg_item6}

我想随机选择其中一些寄存器使用方法 A 写入,其余的将使用方法 B 写入。

所以我最终可能会有 2 个队列:reg_queue_a = {reg_item3, reg_item1, reg_item4, reg_item5) 和 reg_queue_b = {reg_item2, reg_item6}

我可以通过随机播放或其他方式来做到这一点吗?

【问题讨论】:

  • 您当然应该知道如何生成随机数以用作队列的索引。但是你的问题肯定还有更多你没有解释的地方。如果您手动选择寄存器,这将有助于显示代码的外观。
  • 是的,我可以从队列中随机选择项目,但我也想单独选择第一阶段没有选择的项目。我将编辑问题以进一步解释。

标签: system-verilog uvm


【解决方案1】:

您可以添加一个约束,将两个队列之和的大小设为原始队列的大小。

rand int unsigned reg_queue_a[$], reg_queue_b[$]; // queue of index values
constraint queue_size { reg_queue_a.size() + reg_queue_b.size() == reg_queue.size();
                        // range if needed
                        reg_queue_a.size() inside {[1:reg_queue.size()-1]};
                      }
constraint queue_uniq { foreach (reg_queue_a[i]) reg_queue_a[i] inside {[0:reg_queue.size-1]};
                        foreach (reg_queue_b[i]) reg_queue_a[i] inside {[0:reg_queue.size-1]};
                        unique {reg_queue_a,reg_queue_b};
                      }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多