我试图在系统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
我想你差不多了。我想你的意思是:
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