我需要对不应跨越4k边界的数据包施加约束

问题描述 投票:-1回答:1

我试图在系统verilog中为数据包写一个约束。我有一个数据包,其大小可以是0-4096位,我需要在我的数据包类中写一个约束,使数据包应该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
constraints system-verilog uvm
1个回答
1
投票

我想你差不多了。我想你的意思是:

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

© www.soinside.com 2019 - 2024. All rights reserved.