數(shù)獨是一種非常流行的游戲,數(shù)獨本質上也是一個約束問題,所以我們可以讓SystemVerilog的約束求解器來幫助我們解決。 約束求解器的精妙之處就是,我們只描述約束限制,繁重的數(shù)值生成工作由工具來幫我們完成。 你只需“既要...又要...”,其他的讓下人干吧~
我們將數(shù)獨網格表示為9x9整數(shù)數(shù)組,在名為sudoku_solver_base的類中定義所有屬性字段和約束。
class sudoku_solver_base;          
  rand int grid[9][9];          
            
  // ...          
endclass
 我們的第一個約束是數(shù)組中的所有元素都必須是 1 到 9 之間的數(shù)字,這很容易:
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] };          
}
另外,每列上的所有元素也必須是唯一的。此時我們就需要構建一個輔助數(shù)組,將網格轉置。
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] };          
}
 要解決一個數(shù)獨問題,僅有這3個約束遠遠是不夠的,因為還需要9 個子網格(3x3)都滿足相同的約束。 我們將9x9網格保存在四維數(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 ]; }
在我們已經拿到所有對應的3x3網格后,我們類似地可以使用unique語法結構進行約束。 注意,這里需要將3x3的網格轉換成一個一維數(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 ];           
}
 ????
審核編輯:湯梓紅
                        聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。
                        舉報投訴
                    
                    - 
                                Verilog
                                +關注
關注
30文章
1369瀏覽量
113903 - 
                                System
                                +關注
關注
0文章
166瀏覽量
38389 - 
                                約束
                                +關注
關注
0文章
83瀏覽量
13106 - 
                                數(shù)組
                                +關注
關注
1文章
420瀏覽量
27069 - 
                                求解器
                                +關注
關注
0文章
84瀏覽量
4887 
原文標題:使用SystemVerilog解決數(shù)組問題
文章出處:【微信號:芯片驗證工程師,微信公眾號:芯片驗證工程師】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
                    熱點推薦
                  轉一篇Systemverilog的一個牛人總結
Systemverilog數(shù)據(jù)類型l 合并數(shù)組和非合并數(shù)組1)合并數(shù)組:存儲方式是連續(xù)的,中間沒有閑置空間。例如,32bit的寄存器,可以看成是4個8bit的數(shù)據(jù),或者也可以看成是1個
    
                發(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的斷言手冊
SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
    
                發(fā)表于 07-22 14:12        
                ?20次下載    
    
SystemVerilog語言介紹匯總
作者:limanjihe ?https://blog.csdn.net/limanjihe/article/details/83005713 SystemVerilog是一種硬件描述和驗證語言
    
    
SystemVerilog中數(shù)組的賦值、索引和切片
數(shù)組可以作為參數(shù)傳遞給子程序,當數(shù)組作為值傳遞給子程序時,會將這個數(shù)組復制一份傳遞給子程序。
    
    
SystemVerilog動態(tài)數(shù)組的大小更改展示
需要使用" new "操作符實例化一個動態(tài)數(shù)組,使用[]表示。在實例化過程中,會設置動態(tài)數(shù)組的大小。
    
    
SystemVerilog中的關聯(lián)數(shù)組
關聯(lián)數(shù)組實際上是一種查找表,內存空間直到被使用時才會分配,每個數(shù)據(jù)項都會有一個特定的“鍵(索引)”,索引的類型不局限于整型。
    
    
SystemVerilog中可以嵌套的數(shù)據(jù)結構
SystemVerilog中除了數(shù)組、隊列和關聯(lián)數(shù)組等數(shù)據(jù)結構,這些數(shù)據(jù)結構還可以嵌套。
    
    
FPGA學習-SystemVerilog語言簡介
壓縮數(shù)組、 接口、斷言等等,這些都使得SystemVerilog在一個更高的抽象層次上提高了設計建模的能力。SystemVerilog由Accellera開發(fā),它主要定位在芯片的實現(xiàn)和驗證流程上,并為
    
    
一些有趣的數(shù)組相關的SystemVerilog約束
我們在工作中常常會針對數(shù)組施加各式的約束,下面列舉一下有趣的Systemverilog數(shù)組約束示例。
    
    
列舉一下有趣的Systemverilog數(shù)組約束示例
上面是最先想到的寫法,但是會報錯,因為SV約束語法不允許使用size()或任何其他隨機值作為索引。
    
    
一些有趣的數(shù)組相關的SystemVerilog約束
我們在工作中常常會針對數(shù)組施加各式的約束,下面列舉一下有趣的**Systemverilog數(shù)組約束**示例
    
    
帶你了解SystemVerilog中的關聯(lián)數(shù)組
在SystemVerilog中,我們知道可以使用動態(tài)數(shù)組實現(xiàn)數(shù)組元素個數(shù)的動態(tài)分配,即隨用隨分
    
    
                    
    
          
        
        
使用SystemVerilog解決數(shù)組問題
                
 
    
           
            
            
                
            
評論