我需要限制不应跨越 4k 边界的数据包

I need to put constraint on a data packet which should not cross 4k boundary

我正在尝试在系统verilog 中为数据包编写约束。我有一个数据包,其大小可以是 0-4096 位,我需要在我的数据包 class 中写一个约束,数据包应该是 4 字节对齐的,它不应该跨越 4k 边界,或者如果起始地址超过 4k,它不应该超过 8k 边界,依此类推直到 1GB。所以,问题是我可以为第一个 4k 边界写一个约束,如下所示(如果它看起来不错?)但是如果起始地址高于 4K 并且在这种情况下它不应该超过 8K 或者如果起始地址在8K以上,以此类推,如何编写相同的通用约束??

class packet
int size;
rand bit    [31:0]  addr;        // start address
rand bit    [7:0]   data[]; // data 
rand bit    [15:0]  size;                //  size of packet

constraint size_c     { size inside [0:4096]; }
constraint addr_c     { addr[0:1]==0; // for 4 byte alignment
                        addr[12:0] <'h1000 - size; }

endclass

我想你快到了。我想你的意思是:

addr[11:0] + size <= 32'h1000 ; 

我建议 而不是 使用 未调整大小的文字 ,即我建议说 32'h1000 而不是 'h1000。这是因为此类文字的行为在 Verilog-1995 和 Verilog-2001 之间发生了变化,因此最好避免使用它们。


module M;

  class packet;
    rand bit    [13:0]  addr;        // start address
    rand bit    [15:0]  size;        //  size of packet

    constraint size_c     { size inside {[1:4096]}; }
    constraint addr_c     { addr[1:0]==0; // for 4 byte alignment
                            addr[11:0] + size <= 32'h1000; }
  endclass

  initial
    begin
      packet p = new;
      repeat (10)
        begin
          p.randomize;
          $display("%p - %d", p, p.addr[11:0] + p.size);
        end
    end

endmodule

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