【问题标题】:unique with "with" operator in systemverilog在 systemverilog 中使用“with”运算符是唯一的
【发布时间】:2018-06-21 10:55:43
【问题描述】:

我是一个新的 SystemVerilog 用户,我遇到了一个奇怪的(从我的角度来看)将调用固定数组的唯一方法与 with 运算符相结合的行为。

module test();
  int arr[12] = '{1,2,1,2,3,4,5,8,9,10,10,8};
  int q[$]
  initial begin
    q = arr.unique() with (item > 5 ? item : 0);
    $display("the result is %p",q);
  end

我预计会获得队列 {8,9,10},但我却获得了 {1,8,9,10}。

为什么在索引 0 处有一个?

【问题讨论】:

  • 我发现 1 的位置可以是任何数字。例如我测试了一个数组 int arr[] = '{0,1,2,1,2,3,4,5,8,9,10,10,8};结果是{0,8,9,10}。在我看来,用唯一方法返回数组的第一个元素是有原因的,但钢并不明显。

标签: system-verilog


【解决方案1】:

您正在尝试将find 方法的操作与unique 结合起来。不幸的是,它不能按您期望的方式工作。 unique 返回元素,而不是 with 子句中的表达式,元素 1、2、3、4 和 5 为 0。模拟器可以选择这些元素中的任何一个来表示 0 的唯一值(和不同的模拟器会选择不同的值)

需要单独写:

module test();
  int arr[$] = '{1,2,1,2,3,4,5,8,9,10,10,8};
  int q[$]
  initial begin
    arr = arr.find() with (item > 5);
    q = arr.unique();
    $display("the result is %p",q);
  end

更新解释原始结果

with 子句生成一个值列表以检查唯一性

'{0,0,0,0,0,0,0,8,9,10,10,8};
  ^.            ^ ^ ^

假设模拟器选择第一次出现的复制值保留,那么它从原始数组返回{arr[0], arr[7], arr[8], arr[9]},即{1,8,9,10}

【讨论】:

  • 谢谢!我明白了!
  • 我试图自己回答这个问题,并且会建议将表达式分成两个(因为这有效),但没有回答,因为我不明白为什么一个表达式不起作用。不幸的是,我仍然没有。请问你能扩大一点吗?
  • 添加详细说明
猜你喜欢
  • 2021-08-19
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 2021-03-17
相关资源
最近更新 更多