SV随机约束编写案例

rand bit [31:0]      addr;
rand bit [31:0]      data[];
  constraint cstr{
    soft data.size() inside {4, 8, 16, 32};
    foreach(data[i]) soft data[i] == addr + (i << 2);
  }

这段代码是 SystemVerilog 中使用约束随机化 (Constrained Randomization) 的一个例子。它定义了一个结构体,其中包含一个随机地址 addr 和一个随机数据数组 data,并对它们施加了约束。让我们逐行分析:

rand bit [31:0] addr;: 声明一个 32 位的随机变量 addr。rand 关键字表示该变量的值会在仿真过程中随机生成。

rand bit [31:0] data[];: 声明一个 32 位数据的动态数组 data。rand 关键字表示数组中的每个元素的值会在仿真过程中随机生成。 data[] 表示数组的大小是动态的,会在约束中指定。

constraint cstr { … };: 定义一个名为 cstr 的约束块。约束块用于限制随机变量的值域,确保生成的随机值符合设计的要求。

soft data.size() inside {4, 8, 16, 32};: 这是约束块中的第一个约束。

soft: 表示这是一个软约束。软约束表示系统会尽力满足这个约束,但如果无法满足,也不会导致仿真错误。 系统会尝试生成满足约束的随机值,如果尝试多次失败,则会生成违反约束的值。

data.size(): 获取数组 data 的大小。

inside {4, 8, 16, 32}: 表示数组 data 的大小必须是 4、8、16 或 32 中的一个值。

foreach(data[i]) soft data[i] == addr + (i << 2);: 这是约束块中的第二个约束。

foreach(data[i]): 这是一个循环,对数组 data 中的每个元素进行约束。 i 是循环变量,表示数组索引。

soft: 表示这是一个软约束。

data[i] == addr + (i << 2): 这是约束的核心。它表示数组 data 中的每个元素 data[i] 的值必须等于 addr 加上 i 左移两位的结果 (i << 2)。 这等效于 addr + (i * 4),这意味着数组中的数据元素在内存中连续排列,每个元素占据 4 个字节。

总结:

这段代码使用约束随机化来生成一个地址 addr 和一个数据数组 data。数组 data 的大小必须是 4、8、16 或 32,并且数组元素的值与 addr 存在固定的偏移关系,每个元素的偏移量是 4 个字节。 soft 关键字表明这些约束是软约束,系统会优先满足这些约束,但如果无法满足,则可以生成不满足约束的值,不会导致仿真错误。 这通常用于测试不同大小的数据包的场景,并确保数据在内存中连续排列。 这种约束方式可以有效地提高测试的覆盖率,并简化测试用例的编写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值