大規模で複雑な SystemVerilog 制約の例を教えてください。大きいほど良く、できれば現実的です。おそらく、他のいくつかの変数にも依存するアドレス計算です。
SystemVerilog 制約を使用するように IP を切り替えることを検討しています。経営陣は、SystemVerilog 制約を作成/理解することがいかに簡単/難しいかを知りたがっています。
大規模で複雑な SystemVerilog 制約の例を教えてください。大きいほど良く、できれば現実的です。おそらく、他のいくつかの変数にも依存するアドレス計算です。
SystemVerilog 制約を使用するように IP を切り替えることを検討しています。経営陣は、SystemVerilog 制約を作成/理解することがいかに簡単/難しいかを知りたがっています。
以下に例を示します。おそらく大規模で複雑なものではありませんが、制約の使用方法について現実的なアイデアが得られるはずです。ここでは、次の概念が使用されていることがわかります。
これがお役に立てば幸いです...そしてインラインのコメントを見てください:
class RandomConstraints;
enum IpVersionType {IPV4=2, IPV6, IPVx}
//Randomly iterate over values without repetition
randc bit [7:0] cyclicCounter;
//Regular random variables
rand bit [15:0] destAddress;
rand bit [15:0] sourceAddress;
rand bit [15:0] numberOfPackets;
rand bit [15:0] packetLength;
rand bit [7:0] var1;
rand bit [7:0] var2;
IpVersionType ipVersion;
//Non-random variables that can be used to control constraints
bit [15:0] minNumberOfPackets, maxNumberOfPackets;
bit [15:0] minPacketLength, maxPacketLength;
integer IPV4Weight, IPV6Weight;
constraint cPacketLength {
packetLength in { minPacketLength : maxPacketLength }
}
constraint cChannelNumber {
channelNumber in {0:1}
}
constraint cIPVersionType {
ipVersion dist { IPV4 := IPV4Weight, IPV6 := IPV6Weight, IPVX := (100 - IPV4Weight - IPV6Weight) }
}
//Probability of var1 being 1,2,3,4,5 in the ratio 1,2,4,4,4
constraint cDist1 {
var1 dist { 1 := 1, 2 := 2, [3:4] := 4 }
}
//Probability of var2 being 1,2,3,4,5 is in the ratio 1,2,4/3,4/3,4/3
constraint cDist2 {
var2 dist { 1 := 1, 2 := 2, [3:5] :/ 4 }
}
//Implication constraint - if(channelNum == i) then { ... }
constraint cImplication {
(channelNumber == 0) => {
destAddress in {0:200};
sourceAddress in {201:400};
}
(channelNumber == 1) => {
destAddress in {201:400};
sourceAddress in {0:200};
}
}
//Controlling order of constraints solved using a constraint solver
constraint order_solver {
solver channelNumber before destAddress;
solver channelNumber before sourceAddress;
}
function new();
//Setting default min/max packets and min/max packet length
minNumberOfPackets = 100;
maxNumberOfPackets = 1000;
minPacketLength = 128;
maxPacketLength = 256;
IPV4Weight = 50;
IPV6Weight = 30;
endfunction
endclass