在约束 systemverilog 中找不到关联数组索引的元素

问题描述

我试图随机化关联数组的内容并遇到错误: “在约束中找不到关联数组索引的元素”

如何初始化这些索引,然后随机化它们的值?

module top;

class TFoo;

typedef struct {
                rand byte element_id;
                rand byte length;
                rand byte body_val[int];
               } mgmt_info_ele;

rand mgmt_info_ele   tspec; 

constraint tspec_1                                //Constraints for tspec
   {
      tspec.element_id == 8'd13;
      tspec.length == 'd55;
      //tspec.body_val.num() == tspec.length;      
      {tspec.body_val[1][0],tspec.body_val[0][7]} inside {[1:3]};
      tspec.body_val[1][7:6] inside {0,1,3};
      tspec.body_val[2][7:1] == 7'b0;
   }
endclass

TFoo f = new;
int status;

initial begin
    for(int i = 0; i < 1000; i++) begin
        $display("i=%0d: %s",i,f.get_randstate());
                $display("NUM Return value = %0d",f.tspec.body_val.num());      
        status = f.randomize();
        $display(status);
        assert(status) else $fatal;
    end
end

endmodule

解决方法

调用 randomize 不能修改关联数组的大小或其任何索引键。关联数组的索引不一定是连续的。这就是为什么人们有时称它们为稀疏数组。也许您应该改用动态数组。