【问题标题】:I need to put constraint on a data packet which should not cross 4k boundary我需要限制不应跨越 4k 边界的数据包
【发布时间】:2019-04-04 23:35:52
【问题描述】:

我正在尝试在系统 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


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2012-06-02
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-11
      相关资源
      最近更新 更多