【问题标题】:Constraints for arrays in system verilog系统verilog中数组的约束
【发布时间】:2014-02-24 01:56:59
【问题描述】:

使用最初生成的随机元素来约束随机数组的连续元素是否有效。 例如:我想生成一组 10 个 addr、size 对来模拟典型的内存分配例程,并有一个如下所示的类:

class abc;
  rand bit[5:0] size[8];
  rand bit[5:0] addr[8];

  constraint mem_unique{
  foreach(size[i]) begin
    solve size[i] before addr[i];
    size[i] inside {[6'h2:6'h10]};
    if(i>0)
      addr[i] > addr[i-1]+size[i-1];
  end
  }
endclass:abc

【问题讨论】:

    标签: constraints system-verilog


    【解决方案1】:

    您的示例中的几行额外代码将显示它是否有效。这是我要做的工作:

    module top;
    class abc;
       rand bit[5:0] size[8];
       rand bit[6:0] addr[8];
    
       constraint mem_unique
         {
          foreach(size[i]) {
                           size[i] inside {[6'h2:6'h10]};
                           if(i>0) // concatenate 1'b0 to catch overflow
                              {1'b0,addr[i]} > addr[i-1]+size[i-1];
                           }
         }
    endclass : abc
       abc c=new();
       initial repeat(5) begin
          $display();
          assert(c.randomize());
          foreach(c.addr[i]) $displayh(c.addr[i],, c.size[i]);
       end
    endmodule  top
    

    foreach 约束被展开,就像使用综合工具一样。所以你得到的东西看起来像:

     size[0] inside {[6'h2:6'h10]};
     size[1] inside {[6'h2:6'h10]};
     {1'b0,addr[1]} > addr[0]+size[0];
     size[2] inside {[6'h2:6'h10]};
     {1'b0,addr[2]} > addr[1]+size[1];
     ...
    
     size[7] inside {[6'h2:6'h10]};
     {1'b0,addr[7]} > addr[6]+size[6];
    

    【讨论】:

      【解决方案2】:

      我不确定你想做的是否合法,所以我希望其他人能直接回答你的问题。但是,我可以提供一种解决方案,以稍微不同的方式生成您想要的内容。你可以使用post_randomize函数:

      class abc;
        rand bit[5:0] size[10];
        rand bit[5:0] offset[10];
        bit[5:0] addr[10];
      
        constraint mem_unique{
          foreach(size[i]) size[i] inside {[6'h10:6'h20]};
          (size.sum + offset.sum) <= 6'h3F;
        }
      
        function void post_randomize();
          foreach(addr[i]) begin
            if(i == 0) addr[i] = offset[i];
            else addr[i] = addr[i-1] + size[i-1] + offset[i];
          end
        endfunction
      
      endclass
      

      你会注意到这个约束会失败,因为你说过 size 的最小值是 6'h10 ('d16) 并且你想要 10 个地址。所以即使偏移量都是0,最大地址也是'd160('hA0)。 addr 中没有足够的位来保存该值。

      【讨论】:

      • 你好,nguthrie,我明白你的意思了。您希望我将整个 me 空间划分为 2 种使用的块(块大小由 size 数组给出)和间隙(间隙大小由偏移数组给出),并使用这些块的边界从中推断地址。这是一个好主意,但我只是想看看是否可以存在基于先前值的数组约束,以及如果我使用这样的迭代约束,它如何影响 sim 性能。尺寸部分我没有想通。会更正它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多