0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用SystemVerilog解决数组问题

芯片验证工程师 来源:芯片验证工程师 2023-03-08 14:06 次阅读

数独是一种非常流行的游戏,数独本质上也是一个约束问题,所以我们可以让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

    文章

    1351

    浏览量

    110078
  • System
    +关注

    关注

    0

    文章

    165

    浏览量

    36931
  • 约束
    +关注

    关注

    0

    文章

    82

    浏览量

    12728
  • 数组
    +关注

    关注

    1

    文章

    417

    浏览量

    25940
  • 求解器
    +关注

    关注

    0

    文章

    77

    浏览量

    4532

原文标题:使用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是一种硬件描述和验证语言
    的头像 发表于 10-11 10:35 2390次阅读

    SystemVerilog数组的赋值、索引和切片

    数组可以作为参数传递给子程序,当数组作为值传递给子程序时,会将这个数组复制一份传递给子程序。
    的头像 发表于 10-20 10:13 5309次阅读

    SystemVerilog动态数组的大小更改展示

    需要使用" new "操作符实例化一个动态数组,使用[]表示。在实例化过程中,会设置动态数组的大小。
    的头像 发表于 10-21 09:43 1449次阅读

    SystemVerilog中的操作方法

    SystemVerilog提供了几个内置方法来支持数组搜索、排序等功能。
    的头像 发表于 10-31 10:10 2811次阅读

    SystemVerilog中的关联数组

    关联数组实际上是一种查找表,内存空间直到被使用时才会分配,每个数据项都会有一个特定的“键(索引)”,索引的类型不局限于整型。
    的头像 发表于 10-31 10:12 3633次阅读

    SystemVerilog中可以嵌套的数据结构

    SystemVerilog中除了数组、队列和关联数组等数据结构,这些数据结构还可以嵌套。
    的头像 发表于 11-03 09:59 1595次阅读

    FPGA学习-SystemVerilog语言简介

    压缩数组、 接口、断言等等,这些都使得SystemVerilog在一个更高的抽象层次上提高了设计建模的能力。SystemVerilog由Accellera开发,它主要定位在芯片的实现和验证流程上,并为
    的头像 发表于 12-08 10:35 2149次阅读

    网络和变量的未压缩数组

    SystemVerilog有两种类型的数组:压缩数组和非压缩数组。压缩数组是连续存储的位的集合,通常称为向量。非压缩
    的头像 发表于 02-09 14:50 702次阅读
    网络和变量的未压缩<b class='flag-5'>数组</b>

    一些有趣的数组相关的SystemVerilog约束

    我们在工作中常常会针对数组施加各式的约束,下面列举一下有趣的Systemverilog数组约束示例。
    的头像 发表于 03-08 13:12 966次阅读

    列举一下有趣的Systemverilog数组约束示例

    上面是最先想到的写法,但是会报错,因为SV约束语法不允许使用size()或任何其他随机值作为索引。
    的头像 发表于 05-04 17:35 1033次阅读

    一些有趣的数组相关的SystemVerilog约束

    我们在工作中常常会针对数组施加各式的约束,下面列举一下有趣的**Systemverilog数组约束**示例
    的头像 发表于 05-30 11:13 790次阅读

    带你了解SystemVerilog中的关联数组

    SystemVerilog中,我们知道可以使用动态数组实现数组元素个数的动态分配,即随用随分
    的头像 发表于 06-09 09:46 7452次阅读
    带你了解<b class='flag-5'>SystemVerilog</b>中的关联<b class='flag-5'>数组</b>