数独是一种非常流行的游戏,数独本质上也是一个约束问题,所以我们可以让SystemVerilog的约束求解器来帮助我们解决。 约束求解器的精妙之处就是,我们只描述约束限制,繁重的数值生成工作由工具来帮我们完成。 你只需“既要...又要...”,其他的让下人干吧~
我们将数独网格表示为9x9整数数组,在名为sudoku_solver_base的类中定义所有属性字段和约束。
class sudoku_solver_base; rand int grid[9][9]; // ... endclass我们的第一个约束是数组中的所有元素都必须是 1 到 9 之间的数字,这很容易:
constraint all_elements_1_to_9_c { foreach (grid[i, j]) grid[i][j] inside { [1:9] }; }每行中的元素必须是唯一的,可以使用SystemVerilog中的unique语法结构来描述:
constraint unique_on_row_c { foreach (grid[i]) unique { grid[i] }; }另外,每列上的所有元素也必须是唯一的。此时我们就需要构建一个辅助数组,将网格转置。
local rand int grid_transposed[9][9]; constraint create_transposed_c { foreach (grid[i, j]) grid_transposed[i][j] == grid[j][i]; }然后再加上类似的unique约束:
constraint unique_on_column_c { foreach (grid_transposed[i]) unique { grid_transposed[i] }; }要解决一个数独问题,仅有这3个约束远远是不够的,因为还需要9 个子网格(3x3)都满足相同的约束。 我们将9x9网格保存在四维数组中:
local rand int sub_grids [ 3 ][ 3 ][ 3 ][ 3 ]; constraint create_sub_grids_c { foreach ( sub_grids [ i , j , k , l ]) sub_grids [ i ][ j ][ k ][ l ] == grid [ i * 3 + k ][ j * 3 + l ]; }
在我们已经拿到所有对应的3x3网格后,我们类似地可以使用unique语法结构进行约束。 注意,这里需要将3x3的网格转换成一个一维数组再约束。
local rand int sub_grids_lin [ 3 ][ 3 ][ 9 ]; constraint create_sub_grids_lin_c { foreach ( sub_grids_lin [ i , j , k ]) sub_grids_lin [ i ][ j ][ k ] == sub_grids [ i ][ j ][ k / 3 ][ k % 3 ]; }
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
Verilog
+关注
关注
28文章
1340浏览量
109904 -
System
+关注
关注
0文章
165浏览量
36819 -
约束
+关注
关注
0文章
82浏览量
12706 -
数组
+关注
关注
1文章
412浏览量
25873 -
求解器
+关注
关注
0文章
77浏览量
4501
原文标题:使用SystemVerilog解决数组问题
文章出处:【微信号:芯片验证工程师,微信公众号:芯片验证工程师】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
转一篇Systemverilog的一个牛人总结
Systemverilog数据类型l 合并数组和非合并数组1)合并数组:存储方式是连续的,中间没有闲置空间。例如,32bit的寄存器,可以看成是4个8bit的数据,或者也可以看成是1个
发表于 08-27 14:50
SystemVerilog Assertion Handbo
SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
发表于 07-22 14:08
•188次下载
SystemVerilog的断言手册
SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
发表于 07-22 14:12
•20次下载
SystemVerilog语言介绍汇总
作者:limanjihe https://blog.csdn.net/limanjihe/article/details/83005713 SystemVerilog是一种硬件描述和验证语言
SystemVerilog动态数组的大小更改展示
需要使用" new "操作符实例化一个动态数组,使用[]表示。在实例化过程中,会设置动态数组的大小。
SystemVerilog中的关联数组
关联数组实际上是一种查找表,内存空间直到被使用时才会分配,每个数据项都会有一个特定的“键(索引)”,索引的类型不局限于整型。
FPGA学习-SystemVerilog语言简介
压缩数组、 接口、断言等等,这些都使得SystemVerilog在一个更高的抽象层次上提高了设计建模的能力。SystemVerilog由Accellera开发,它主要定位在芯片的实现和验证流程上,并为
一些有趣的数组相关的SystemVerilog约束
我们在工作中常常会针对数组施加各式的约束,下面列举一下有趣的Systemverilog数组约束示例。
列举一下有趣的Systemverilog数组约束示例
上面是最先想到的写法,但是会报错,因为SV约束语法不允许使用size()或任何其他随机值作为索引。
一些有趣的数组相关的SystemVerilog约束
我们在工作中常常会针对数组施加各式的约束,下面列举一下有趣的**Systemverilog数组约束**示例
评论