0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用SystemVerilog解決數(shù)組問(wèn)題

芯片驗(yàn)證工程師 ? 來(lái)源:芯片驗(yàn)證工程師 ? 2023-03-08 14:06 ? 次閱讀

數(shù)獨(dú)是一種非常流行的游戲,數(shù)獨(dú)本質(zhì)上也是一個(gè)約束問(wèn)題,所以我們可以讓SystemVerilog的約束求解器來(lái)幫助我們解決。 約束求解器的精妙之處就是,我們只描述約束限制,繁重的數(shù)值生成工作由工具來(lái)幫我們完成。 你只需“既要...又要...”,其他的讓下人干吧~


我們將數(shù)獨(dú)網(wǎng)格表示為9x9整數(shù)數(shù)組,在名為sudoku_solver_base的類中定義所有屬性字段和約束。

class sudoku_solver_base;          
  rand int grid[9][9];          
            
  // ...          
endclass
我們的第一個(gè)約束是數(shù)組中的所有元素都必須是 1 到 9 之間的數(shù)字,這很容易:

constraint all_elements_1_to_9_c {          
  foreach (grid[i, j])          
    grid[i][j] inside { [1:9] };          
}
每行中的元素必須是唯一的,可以使用SystemVerilog中的unique語(yǔ)法結(jié)構(gòu)來(lái)描述:

constraint unique_on_row_c {          
  foreach (grid[i])          
    unique { grid[i] };          
}
另外,每列上的所有元素也必須是唯一的。此時(shí)我們就需要構(gòu)建一個(gè)輔助數(shù)組,將網(wǎng)格轉(zhuǎn)置。

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] };          
}
要解決一個(gè)數(shù)獨(dú)問(wèn)題,僅有這3個(gè)約束遠(yuǎn)遠(yuǎn)是不夠的,因?yàn)?strong>還需要9 個(gè)子網(wǎng)格(3x3)都滿足相同的約束。 我們將9x9網(wǎng)格保存在四維數(shù)組中:


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 ];           
}

 在我們已經(jīng)拿到所有對(duì)應(yīng)的3x3網(wǎng)格后,我們類似地可以使用unique語(yǔ)法結(jié)構(gòu)進(jìn)行約束。 注意,這里需要將3x3的網(wǎng)格轉(zhuǎn)換成一個(gè)一維數(shù)組再約束。

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 ];           
}
????

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110100
  • System
    +關(guān)注

    關(guān)注

    0

    文章

    165

    瀏覽量

    36943
  • 約束
    +關(guān)注

    關(guān)注

    0

    文章

    82

    瀏覽量

    12733
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    417

    瀏覽量

    25947
  • 求解器
    +關(guān)注

    關(guān)注

    0

    文章

    77

    瀏覽量

    4534

原文標(biāo)題:使用SystemVerilog解決數(shù)組問(wèn)題

文章出處:【微信號(hào):芯片驗(yàn)證工程師,微信公眾號(hào):芯片驗(yàn)證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    轉(zhuǎn)一篇Systemverilog的一個(gè)牛人總結(jié)

    Systemverilog數(shù)據(jù)類型l 合并數(shù)組和非合并數(shù)組1)合并數(shù)組:存儲(chǔ)方式是連續(xù)的,中間沒(méi)有閑置空間。例如,32bit的寄存器,可以看成是4個(gè)8bit的數(shù)據(jù),或者也可以看成是1個(gè)
    發(fā)表于 08-27 14:50

    SystemVerilog Assertion Handbo

    SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
    發(fā)表于 07-22 14:08 ?188次下載

    SystemVerilog的斷言手冊(cè)

    SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
    發(fā)表于 07-22 14:12 ?20次下載

    SystemVerilog語(yǔ)言介紹匯總

    作者:limanjihe ?https://blog.csdn.net/limanjihe/article/details/83005713 SystemVerilog是一種硬件描述和驗(yàn)證語(yǔ)言
    的頭像 發(fā)表于 10-11 10:35 ?2397次閱讀

    SystemVerilog數(shù)組的賦值、索引和切片

    數(shù)組可以作為參數(shù)傳遞給子程序,當(dāng)數(shù)組作為值傳遞給子程序時(shí),會(huì)將這個(gè)數(shù)組復(fù)制一份傳遞給子程序。
    的頭像 發(fā)表于 10-20 10:13 ?5338次閱讀

    SystemVerilog動(dòng)態(tài)數(shù)組的大小更改展示

    需要使用" new "操作符實(shí)例化一個(gè)動(dòng)態(tài)數(shù)組,使用[]表示。在實(shí)例化過(guò)程中,會(huì)設(shè)置動(dòng)態(tài)數(shù)組的大小。
    的頭像 發(fā)表于 10-21 09:43 ?1454次閱讀

    SystemVerilog中的操作方法

    SystemVerilog提供了幾個(gè)內(nèi)置方法來(lái)支持數(shù)組搜索、排序等功能。
    的頭像 發(fā)表于 10-31 10:10 ?2833次閱讀

    SystemVerilog中的關(guān)聯(lián)數(shù)組

    關(guān)聯(lián)數(shù)組實(shí)際上是一種查找表,內(nèi)存空間直到被使用時(shí)才會(huì)分配,每個(gè)數(shù)據(jù)項(xiàng)都會(huì)有一個(gè)特定的“鍵(索引)”,索引的類型不局限于整型。
    的頭像 發(fā)表于 10-31 10:12 ?3640次閱讀

    SystemVerilog中可以嵌套的數(shù)據(jù)結(jié)構(gòu)

    SystemVerilog中除了數(shù)組、隊(duì)列和關(guān)聯(lián)數(shù)組等數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)還可以嵌套。
    的頭像 發(fā)表于 11-03 09:59 ?1606次閱讀

    FPGA學(xué)習(xí)-SystemVerilog語(yǔ)言簡(jiǎn)介

    壓縮數(shù)組、 接口、斷言等等,這些都使得SystemVerilog在一個(gè)更高的抽象層次上提高了設(shè)計(jì)建模的能力。SystemVerilog由Accellera開發(fā),它主要定位在芯片的實(shí)現(xiàn)和驗(yàn)證流程上,并為
    的頭像 發(fā)表于 12-08 10:35 ?2161次閱讀

    網(wǎng)絡(luò)和變量的未壓縮數(shù)組

    SystemVerilog有兩種類型的數(shù)組:壓縮數(shù)組和非壓縮數(shù)組。壓縮數(shù)組是連續(xù)存儲(chǔ)的位的集合,通常稱為向量。非壓縮
    的頭像 發(fā)表于 02-09 14:50 ?706次閱讀
    網(wǎng)絡(luò)和變量的未壓縮<b class='flag-5'>數(shù)組</b>

    一些有趣的數(shù)組相關(guān)的SystemVerilog約束

    我們?cè)诠ぷ髦谐3?huì)針對(duì)數(shù)組施加各式的約束,下面列舉一下有趣的Systemverilog數(shù)組約束示例。
    的頭像 發(fā)表于 03-08 13:12 ?972次閱讀

    列舉一下有趣的Systemverilog數(shù)組約束示例

    上面是最先想到的寫法,但是會(huì)報(bào)錯(cuò),因?yàn)镾V約束語(yǔ)法不允許使用size()或任何其他隨機(jī)值作為索引。
    的頭像 發(fā)表于 05-04 17:35 ?1041次閱讀

    一些有趣的數(shù)組相關(guān)的SystemVerilog約束

    我們?cè)诠ぷ髦谐3?huì)針對(duì)數(shù)組施加各式的約束,下面列舉一下有趣的**Systemverilog數(shù)組約束**示例
    的頭像 發(fā)表于 05-30 11:13 ?793次閱讀

    帶你了解SystemVerilog中的關(guān)聯(lián)數(shù)組

    SystemVerilog中,我們知道可以使用動(dòng)態(tài)數(shù)組實(shí)現(xiàn)數(shù)組元素個(gè)數(shù)的動(dòng)態(tài)分配,即隨用隨分
    的頭像 發(fā)表于 06-09 09:46 ?7467次閱讀
    帶你了解<b class='flag-5'>SystemVerilog</b>中的關(guān)聯(lián)<b class='flag-5'>數(shù)組</b>