我需要限制不应跨越 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
我正在尝试在系统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