slba>slba_-previous[id][i+1]; slba>slba_-previous[id][i+1]->(slba+nlb)>slba_-previous[id][i+1]; slbaslba,system-verilog,questasim,System Verilog,Questasim" /> slba>slba_-previous[id][i+1]; slba>slba_-previous[id][i+1]->(slba+nlb)>slba_-previous[id][i+1]; slbaslba,system-verilog,questasim,System Verilog,Questasim" />

System verilog 约束中多维关联数组的低维循环语法 classns\u数据结构; 随机位[63:0]ns_size=64'h0000_0000_0000_0800; endclass:ns\u数据结构 类配置; ns_数据结构ns_数据[]; 函数new(); ns_数据=新[5]; foreach(ns_数据[i]) ns_data[i]=new(); 端功能 endclass:conf x类; 随机比特[63:0]slba; 随机比特[63:0]nlb; 位[63:0]slba_前一位[31:0][位[63:0]]; conf-cfg; 位[31:0]nsid='h1; 位[63:0]num[位[31:0]]; 约束slba_nlb_内部\u ns_c { slba内部{[1:cfg.ns_数据[nsid-1].ns_大小]}; nlb内部{[0:(cfg.ns_数据[nsid-1].ns_大小-slba)]; } 约束slba_nlb_非重叠_c { 取证(slba_前[nsid,i]) { 如果(!(i%2)) { slba(slba+nlb)slba_-previous[nsid][i]->slba>slba_-previous[nsid][i+1];//slba_-previous[nsid][i+1]->(slba+nlb)>slba_-previous[nsid][i];//slba警告为 i+1 条件。使用 .SimultSub(/Case>内置函数)确保存在一个数组条目。设计可能总是有偶数个条目,但它看起来像QuestaSIM的约束求解器更悲观,并且想考虑所有可能性。 class ns_data_struct; rand bit [63:0] ns_size = 64'h0000_0000_0000_0800; endclass : ns_data_struct class conf; ns_data_struct ns_data[]; function new(); ns_data = new[5]; foreach (ns_data[i]) ns_data[i] = new(); endfunction endclass : conf class x; randc bit [63:0] slba; randc bit [63:0] nlb; bit [63:0] slba_previous [bit [31:0]][bit [63:0]]; conf cfg; bit [31:0] nsid = 'h1; bit [63:0] num [bit [31:0]]; constraint slba_nlb_inside_ns_c { slba inside {[1:cfg.ns_data[nsid-1].ns_size]}; nlb inside {[0:(cfg.ns_data[nsid-1].ns_size - slba)]}; } constraint slba_nlb_non_overlapping_c { foreach(slba_previous[nsid, i]) { if(!(i%2)) { slba < slba_previous[nsid][i] -> (slba + nlb) < slba_previous[nsid] [i]; slba > slba_previous[nsid][i] -> slba > slba_previous[nsid][i+1]; // <-- Warning Here slba > slba_previous[nsid][i+1] -> (slba + nlb) > slba_previous[nsid][i+1]; // <-- Warning Here slba < slba_previous[nsid][i+1] -> slba < slba_previous[nsid][i]; // <-- Warning Here } } } function void post_randomize(); num[nsid] = (num.exists(nsid))?(num[nsid]):0; slba_previous[nsid][num[nsid]++] = slba; slba_previous[nsid][num[nsid]++] = (slba + nlb); $display("\nslba_previous - %p\n", slba_previous); endfunction function new (input conf _cfg); this.cfg = _cfg; endfunction: new endclass : x program p1; conf c; x t; initial begin c = new; t = new(c); t.nsid = 3; for(int i=0; i<15; i++) begin if(!t.randomize()) $display("ERROR : Starting LBA & NLB Provider Randomization Failed"); $display("@%0t : KARAN, Starting LBA - %0h %0d", $time, t.slba, t.slba); $display("@%0t : KARAN, Number of LBA - %0h %0d", $time, t.nlb, t.nlb); end end endprogram 约束slba\u nlb\u非重叠\u c { foreach(slba_-previous[id,i]) { 如果(id==nsid&(i%2)==0) { slba(slba+nlb)slba_-previous[id][i]->slba>slba_-previous[id][i+1]; slba>slba_-previous[id][i+1]->(slba+nlb)>slba_-previous[id][i+1]; slbaslba

System verilog 约束中多维关联数组的低维循环语法 classns\u数据结构; 随机位[63:0]ns_size=64'h0000_0000_0000_0800; endclass:ns\u数据结构 类配置; ns_数据结构ns_数据[]; 函数new(); ns_数据=新[5]; foreach(ns_数据[i]) ns_data[i]=new(); 端功能 endclass:conf x类; 随机比特[63:0]slba; 随机比特[63:0]nlb; 位[63:0]slba_前一位[31:0][位[63:0]]; conf-cfg; 位[31:0]nsid='h1; 位[63:0]num[位[31:0]]; 约束slba_nlb_内部\u ns_c { slba内部{[1:cfg.ns_数据[nsid-1].ns_大小]}; nlb内部{[0:(cfg.ns_数据[nsid-1].ns_大小-slba)]; } 约束slba_nlb_非重叠_c { 取证(slba_前[nsid,i]) { 如果(!(i%2)) { slba(slba+nlb)slba_-previous[nsid][i]->slba>slba_-previous[nsid][i+1];//slba_-previous[nsid][i+1]->(slba+nlb)>slba_-previous[nsid][i];//slba警告为 i+1 条件。使用 .SimultSub(/Case>内置函数)确保存在一个数组条目。设计可能总是有偶数个条目,但它看起来像QuestaSIM的约束求解器更悲观,并且想考虑所有可能性。 class ns_data_struct; rand bit [63:0] ns_size = 64'h0000_0000_0000_0800; endclass : ns_data_struct class conf; ns_data_struct ns_data[]; function new(); ns_data = new[5]; foreach (ns_data[i]) ns_data[i] = new(); endfunction endclass : conf class x; randc bit [63:0] slba; randc bit [63:0] nlb; bit [63:0] slba_previous [bit [31:0]][bit [63:0]]; conf cfg; bit [31:0] nsid = 'h1; bit [63:0] num [bit [31:0]]; constraint slba_nlb_inside_ns_c { slba inside {[1:cfg.ns_data[nsid-1].ns_size]}; nlb inside {[0:(cfg.ns_data[nsid-1].ns_size - slba)]}; } constraint slba_nlb_non_overlapping_c { foreach(slba_previous[nsid, i]) { if(!(i%2)) { slba < slba_previous[nsid][i] -> (slba + nlb) < slba_previous[nsid] [i]; slba > slba_previous[nsid][i] -> slba > slba_previous[nsid][i+1]; // <-- Warning Here slba > slba_previous[nsid][i+1] -> (slba + nlb) > slba_previous[nsid][i+1]; // <-- Warning Here slba < slba_previous[nsid][i+1] -> slba < slba_previous[nsid][i]; // <-- Warning Here } } } function void post_randomize(); num[nsid] = (num.exists(nsid))?(num[nsid]):0; slba_previous[nsid][num[nsid]++] = slba; slba_previous[nsid][num[nsid]++] = (slba + nlb); $display("\nslba_previous - %p\n", slba_previous); endfunction function new (input conf _cfg); this.cfg = _cfg; endfunction: new endclass : x program p1; conf c; x t; initial begin c = new; t = new(c); t.nsid = 3; for(int i=0; i<15; i++) begin if(!t.randomize()) $display("ERROR : Starting LBA & NLB Provider Randomization Failed"); $display("@%0t : KARAN, Starting LBA - %0h %0d", $time, t.slba, t.slba); $display("@%0t : KARAN, Number of LBA - %0h %0d", $time, t.nlb, t.nlb); end end endprogram 约束slba\u nlb\u非重叠\u c { foreach(slba_-previous[id,i]) { 如果(id==nsid&(i%2)==0) { slba(slba+nlb)slba_-previous[id][i]->slba>slba_-previous[id][i+1]; slba>slba_-previous[id][i+1]->(slba+nlb)>slba_-previous[id][i+1]; slbaslba,system-verilog,questasim,System Verilog,Questasim,您需要遍历完整的slba_previous[id,i],然后检查id==nsid >警告为 i+1 条件。使用 .SimultSub(/Case>内置函数)确保存在一个数组条目。设计可能总是有偶数个条目,但它看起来像QuestaSIM的约束求解器更悲观,并且想考虑所有可能性。 class ns_data_struct; rand bit [63:0] ns_size = 64'h0000_0000_0000_0800; endclass : ns_data_struct class co

您需要遍历完整的
slba_previous[id,i]
,然后检查
id==nsid

<> >警告为<代码> i+1 条件。使用<代码> .SimultSub(/Case>内置函数)确保存在一个数组条目。设计可能总是有偶数个条目,但它看起来像QuestaSIM的约束求解器更悲观,并且想考虑所有可能性。

class ns_data_struct;
  rand bit [63:0] ns_size = 64'h0000_0000_0000_0800;
endclass : ns_data_struct

class conf;
  ns_data_struct ns_data[];

  function new();
    ns_data = new[5];
    foreach (ns_data[i])
      ns_data[i] = new();
  endfunction
endclass : conf

class x;
  randc bit [63:0] slba;
  randc bit [63:0] nlb;
  bit [63:0] slba_previous [bit [31:0]][bit [63:0]];
  conf cfg;
  bit [31:0] nsid = 'h1;
  bit [63:0] num [bit [31:0]];

  constraint slba_nlb_inside_ns_c
  {
    slba inside {[1:cfg.ns_data[nsid-1].ns_size]};
    nlb inside {[0:(cfg.ns_data[nsid-1].ns_size - slba)]};
  }

  constraint slba_nlb_non_overlapping_c
  {
    foreach(slba_previous[nsid, i])
    {
      if(!(i%2))
      {
        slba < slba_previous[nsid][i] -> (slba + nlb) < slba_previous[nsid]  [i];
        slba > slba_previous[nsid][i] -> slba > slba_previous[nsid][i+1]; //  <-- Warning Here
        slba > slba_previous[nsid][i+1] -> (slba + nlb) >   slba_previous[nsid][i+1]; //  <-- Warning Here
        slba < slba_previous[nsid][i+1] -> slba < slba_previous[nsid][i]; //  <-- Warning Here
      }
    }
  }

  function void post_randomize();
    num[nsid] = (num.exists(nsid))?(num[nsid]):0;

    slba_previous[nsid][num[nsid]++] = slba;
    slba_previous[nsid][num[nsid]++] = (slba + nlb);

    $display("\nslba_previous - %p\n", slba_previous);
  endfunction

  function new (input conf _cfg);
    this.cfg = _cfg;
  endfunction: new
endclass : x

program p1;
  conf c;
  x t;

  initial
  begin
    c = new;
    t = new(c);
    t.nsid = 3;
    for(int i=0; i<15; i++)
    begin
      if(!t.randomize())
        $display("ERROR : Starting LBA & NLB Provider Randomization  Failed");
      $display("@%0t : KARAN, Starting LBA - %0h %0d", $time, t.slba, t.slba);
      $display("@%0t : KARAN, Number of LBA - %0h %0d", $time, t.nlb,  t.nlb);
    end
  end
endprogram
约束slba\u nlb\u非重叠\u c
{
foreach(slba_-previous[id,i])
{
如果(id==nsid&(i%2)==0)
{
slba(slba+nlb)slba_-previous[id][i]->slba>slba_-previous[id][i+1];
slba>slba_-previous[id][i+1]->(slba+nlb)>slba_-previous[id][i+1];
slbaslba

有关

警告的工作示例可以通过修改类x来解决,如下所示,其中关联数组被拆分为两个数组

constraint slba_nlb_non_overlapping_c
{
  foreach(slba_previous[id,i])
  {
    if(id==nsid && (i%2)==0)
    {
      slba < slba_previous[id][i] -> (slba + nlb) < slba_previous[id][i];
      if (slba_previous[id].exists(i+1))
      {
        slba > slba_previous[id][i] -> slba > slba_previous[id][i+1];
        slba > slba_previous[id][i+1] -> (slba + nlb) > slba_previous[id][i+1];
        slba < slba_previous[id][i+1] -> slba < slba_previous[id][i];
      }
    }
  }
}
x类;
随机比特[63:0]slba;
随机比特[63:0]nlb;
位[63:0]slba_前一位低[位[31:0]][位[63:0]];
位[63:0]slba_先前_高[位[31:0]][位[63:0]];
conf-cfg;
位[31:0]nsid='h1;
位[63:0]num[位[31:0]];
约束slba_nlb_内部\u ns_c
{
slba内部{[1:cfg.ns_数据[nsid-1].ns_大小]};
nlb内部{[0:(cfg.ns_数据[nsid-1].ns_大小-slba)];
}
约束slba_nlb_非重叠_c
{
foreach(slba\u先前的\u低[id,i])
{
if(id==nsid)
{
slba(slba+nlb)slba_上一次低[id][i]->slba>slba_上一次高[id][i];
slba>slba_上一个_高[id][i]->(slba+nlb)>slba_上一个_高[id][i];
slbaslba
它可能在eda上运行良好,但我仍然收到上面提到的警告QuestaSIM@MaheshShah,我用
.exists(I+1)
检查哪个应该解决警告。是的,这可能会解决警告,但我的问题是,如果我们使用了(I%2),为什么我们需要使用exists方法,确保只引用已存在的条目(如i=0然后0,1,i=2然后2,3)?在当前循环中,QuestaSIM只知道
i
的条目存在。可能
i+1
不存在(不是使用给定的代码,而是在所有可能的范围内:未来的扩展类、测试台、交互模式、dpi/vpi等)。第18.5.8.1节中说“无效或越界数组索引不会自动消除;用户必须使用谓词明确排除这些索引。”因此,QuestaSIM通过从无效索引中识别潜在的设计缺陷而落后于规范。不幸的是,尽管为(I+1)编写了exists方法,我仍然收到这些警告
class x;
  randc bit [63:0] slba;
  randc bit [63:0] nlb;
  bit [63:0] slba_previous_low [bit [31:0]][bit [63:0]];
  bit [63:0] slba_previous_high [bit [31:0]][bit [63:0]];
  conf cfg;
  bit [31:0] nsid = 'h1;
  bit [63:0] num [bit [31:0]];

  constraint slba_nlb_inside_ns_c
  {
    slba inside {[1:cfg.ns_data[nsid-1].ns_size]};
    nlb inside {[0:(cfg.ns_data[nsid-1].ns_size - slba)]};
  }

  constraint slba_nlb_non_overlapping_c
  {
    foreach(slba_previous_low[id, i])
    {
      if(id == nsid)
      {
        slba < slba_previous_low[id][i] -> (slba + nlb) < slba_previous_low[id]  [i];
        slba > slba_previous_low[id][i] -> slba > slba_previous_high[id][i];
        slba > slba_previous_high[id][i] -> (slba + nlb) >   slba_previous_high[id][i];
        slba < slba_previous_high[id][i] -> slba < slba_previous_low[id][i];
      }
    }
  }

  function void post_randomize();
    num[nsid] = (num.exists(nsid))?(num[nsid]):0;

    slba_previous_low[nsid][num[nsid]] = slba;
    slba_previous_high[nsid][num[nsid]] = (slba + nlb);

    num[nsid]++;

    $display("\nslba_previous_low - %p\n", slba_previous_low);
    $display("\nslba_previous_high - %p\n", slba_previous_high);
  endfunction

  function new (input conf _cfg);
    this.cfg = _cfg;
  endfunction: new
endclass : x