在系统Verilog约束中在内部运算符中进行数组切片

问题描述 投票:1回答:3
///* Example 1.1 */
program automatic test;
    class pkt;
        rand bit [3:0] array[12];
        rand bit [3:0] value;
        int count;
        function new(int cnt);
            count = cnt;
            this.randomize();
        endfunction: new

        constraint c {
              value inside {array[3:count]};
        }
    endclass: pkt

    initial begin
        pkt p;

        repeat(10)
        begin
          p = new(6);
          $display("==================");
          $display("array = %0p and value = %0d", p.array, p.value);
          $display("==================");
        end
    end
endprogram

我希望valuearray内有一个值,索引范围为3count

但是出现错误,

this.array [3:this.count]“表达式'this.array [3:this.count]'包含解压缩的数组切片内部运算符右侧尚不支持该功能。请从约束表达式中删除数组切片,或替换它与整个数组。

有什么办法可以达到这个目的?没有多余的变量会更好。

arrays constraints system-verilog
3个回答
2
投票

使用数组归约迭代约束。

module test;
    class pkt;
        rand bit [3:0] array[12];
        rand bit [3:0] value;
        int count;
        function new(int cnt);
            count = cnt;
            this.randomize();
        endfunction: new

        constraint c {
          array.or() with (item.index inside {[3:count]} && item == value);
        }
    endclass: pkt

    initial begin
        pkt p;

        repeat(10)
        begin
          p = new(6);
          $display("==================");
          $display("array = %0p and value = %0h", p.array, p.value);
          $display("==================");
        end
    end
endmodule

0
投票

系统verilog中的所有切片运算符都需要constant切片宽度。在您的示例中,您尝试使用非恒定lsb表达式count。这是行不通的。它应为[3:1]之类的常量,或者您需要使用+: / -:语法,例如array[count +: 3]的含义是,从索引count开始切片,并从数组中提取3个元素。 宽度必须恒定

我认为,在您的情况下,您可以使用参数化的类并将count作为类参数传递。类似于以下内容:

class pkt#(int count = 1);
  logic [3:0]a[3:0];
  function print;
     $display ("++> %d", $bits(a[3:count]));
  endfunction
endclass

initial begin
  pkt #(2) p = new;
  p.print;
end

0
投票

我想不出如何用一个简单的约束就能做到这一点。这是一个解决方案:

您确实需要一个额外的变量(不是很好):

rand int index;

而且,您需要修改约束:

constraint c {
  index inside {[3:count]}; value == array[index];
}

使得index的随机值在3和count之间选择,然后选择该值作为array的对应元素。


https://www.edaplayground.com/x/3ata

program automatic test;
    class pkt;
        rand bit [3:0] array[12];
        rand int index;
        rand bit [3:0] value;
        int count;
        function new(int cnt);
            count = cnt;
            this.randomize();
        endfunction: new

        constraint c {
          index inside {[3:count]}; value == array[index];
        }
    endclass: pkt

    initial begin
        pkt p;

        repeat(10)
        begin
          p = new(6);
          $display("==================");
          $display("array = %0p and value = %0h", p.array, p.value);
          $display("==================");
        end
    end
endprogram
© www.soinside.com 2019 - 2024. All rights reserved.