System verilog 大型SystemVerilog约束的示例
你能举一个大而复杂的SystemVerilog约束的例子吗?越大越好,最好是现实的。也许一些地址计算也依赖于一些其他变量System verilog 大型SystemVerilog约束的示例,system-verilog,System Verilog,你能举一个大而复杂的SystemVerilog约束的例子吗?越大越好,最好是现实的。也许一些地址计算也依赖于一些其他变量 我正在评估将我们的IP转换为使用SystemVerilog约束,我的管理层希望了解创建/理解SystemVerilog约束有多容易/难。这里有一个示例,可能不太大也不复杂,但它应该让您了解如何使用约束。在这里,您将看到使用了以下概念: 随机数和随机数-循环和非循环随机变量 两种类型的分布式约束 使用蕴涵运算符在约束内使用if条件。。。根据另一个变量计算的地址 约束顺序求解器
我正在评估将我们的IP转换为使用SystemVerilog约束,我的管理层希望了解创建/理解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
由于我无法对上一篇文章发表评论,并且我建议的编辑被拒绝,我只能添加看起来像新答案但不是的内容。唉 下面是Subbdue的示例,该示例经过编辑以修复以下语法错误:
typedef枚举{…}代码>与OpenVera相反的语法<代码>枚举{…}代码>语法
结束枚举声明代码>
channelNumber
ipVersion
声明为rand
在{[:]}
语法中,与{min:max}语法中的OpenVera相反
结束约束中的表达式
s代码>
->
语法与OpenVera=>
语法相反solver
->solve
IPVx
->IPVx
class RandomConstraints;
typedef enum {IPV4=2, IPV6, IPVX} IpVersionType;
//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 [3:0] channelNumber;
rand bit [7:0] var1;
rand bit [7:0] var2;
rand 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 inside { [ minPacketLength : maxPacketLength ] };
}
constraint cChannelNumber {
channelNumber inside {[0:1]};
}
// Assuming total weight adds up to 100
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 inside {[0:200]};
sourceAddress inside {[201:400]};
}
(channelNumber == 1) -> {
destAddress inside {[201:400]};
sourceAddress inside {[0:200]};
}
}
//Controlling order of constraints solved using a constraint solver
constraint order_solver {
solve channelNumber before destAddress;
solve 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
干得好看起来,我需要2千分才能有资格审查建议的编辑(即使是在我自己的帖子上:)。。既然你煞费苦心地写了一篇新文章,我就不写了。