Verilog-1995 VS Verilog-2001
2001年3月IEEE正式批准了Verilog‐2001標准(IEEE1364‐2001),與Verilog‐1995相比主要有以下提高。
1、模塊聲明的擴展
(1) Verilog‐2001允許將端口聲明和數據類型聲明放在同一條語句中,例子如下:
(2)Verilog‐2001中增加了ANSIC風格的輸入輸出端口聲明,可以用於module,task和function。例子如下:
(3)對於含有parameter的module,例子如下:
2、帶有初始化的寄存器類型變量聲明
Verilog‐2001中允許在聲明變量的同時對其進行初始化賦值,他是在initial語句中的0時刻開始執行。例子如下:
3、敏感表的改進
(1)逗號分開敏感列表
在敏感表中的變量可以用逗號“,”分開,當然,當然or也是可以的。例子如下:
always@(posedge clk,negedge rst)也是可以的。
(2)組合邏輯的電平敏感@* //@(*) is also ok
“*”代表了邏輯塊中每個被賦值的變量,例子如下:
4、有符號算數運算的擴展
(1)net型和reg型可以聲明為帶符號的變量
(2)函數的返回值可以是有符號數
(3)Literal integer numbers可以定義為有符號的
(4)增加算數右移左移(>>>,<<<)
操作符“>>>”和“<<<”。對於有符號數,執行算術移位操作時,將符號位填補移出的位。例子如下:
(5)增加系統函數$signed,$unsigned
用於在無符號和有符號數之間的轉換
5、可變向量域的選擇
[<starting_bit>+”:width]從起始位開始遞增,位寬為width
[<starting_bit>‐”:width]從起始位開始遞減,位寬為width
其中,起始位可以是變量,但位寬必須是整數。因此可以用可變域選擇,用循環語句選取一個很長的向量所有位。
6、多維數組的建立
Verilog‐1995中只允許對reg,integer和time建立一維的數組,常用於RAM,ROM的建模。Verilog‐2001中可以對net和variable建立多維數組。
7、多維數組的賦值
Verilog‐1995不允許直接訪問矩陣字的某一位或某幾位,必須將整個矩陣字復制到另一個暫存變量中,從暫存中訪問。
Verilog‐2001可以直接訪問矩陣的某一維或某幾位。
8、乘方運算符
增加乘方運算(power operate),運算符是**,如果其中有一個操作數是real類型的,返回值將是real類型。兩個操作數都是integer類型,返回才是integer類型。
9、自動(可重入)任務和自動(遞歸)函數
(1)可重入任務
任務本質上是靜態的,同時並發執行的多個任務共享存儲區。當某個任務在模塊中的多個地方被同時調用,則這兩個任務對同一塊地址空間進行操作,結果可能是錯誤的。Verilog‐2001中增加了關鍵字automatic,內存空間是動態分配的,使任務成為可重入的。
(2)遞歸函數
10、自動寬度擴展
Verilog‐1995中對於不指定位數的位寬超過32為的總線賦高阻時,只會對低32位賦值為高阻,高位將為0。
Verilog‐2001將高阻或不定態賦值給未指定位寬的信號時,可以自動擴展到整個位寬范圍。
11、常數函數
Verilog語法規定必須使用數值或常數表達式來定義向量的位寬和陣列的規模。
Verilog‐1995中要求上述表達式必須為算數操作。
Verilog‐2001中可以使用函數,成為常數函數。他的數值在編譯或詳細描述中被確定。
12、增加了文件輸入輸出操作
Verilog‐1995中在文件的輸入/輸出操作方面功能非常有限,文件操作經常借助於Verilog PLI(編程語言接口),通過與C語言的文件輸入/輸出庫的訪問來處理。並且規定同時打開的I/O文件數不能多於31個。
Verilog‐2001增加了新的系統任務和函數,並且規定同時打開的文件數目為230個。
13、顯式的參數重載
Verilog‐1995中參數重載有兩種方法。一種是defparam語句顯式的重新定義。第二種是在模塊實體調用時使用#符號隱式的重新定義參數。
Verilog‐2001中增加了一種新的方法,成為顯式參數重載。
14、generate語句
Verilog‐2001新增了語句“generate”,通過generate循環,可以產生一個對象(比如一個元件或一個模塊等)的多個例化,為可變尺度的設計提供了方便。
generate語句一般在循環和條件語句中使用。Verilog‐2001增加了四個關鍵字generate、endgenerate、genvar和localparam,其中genvar是一個新的數據類型,用在generate循環中的標尺變量必須定義為genvar型數據。
15、register變為variable
自1998年的Verilog一來,register一直用來描述一種變量的類型,這常常給初學者帶來困擾,誤認為register和硬件中的寄存器一致。在Verilog‐2001參考手冊中將register變為variable。
16、對條件編譯的改進
Verilog‐1995中支持`ifdef、`else、`endif、`undef進行條件編譯,Verilog‐2001中增加了`ifndef和`elseif
17、文件和行編譯顯示
Verilog需要不斷的跟蹤源代碼的行號和文件名,可編程語言接口(PLII)可以取得並利用行號和源文件的信息,以標記運行是的錯誤。但如果Verilog代碼經過其他工具的處理,源碼的行號和文件名可能丟失。故在Verilog‐2001中增加了`line,用來標定源碼的行號和文件名。
18、屬性
隨着仿真器之外的其他工具把Verilog作為設計輸入,這些工具需要Verilog語言能夠加入跟指定工具有關的信息和命令。
Verilog沒有定義標准的屬性,屬性的名字和數值由工具廠商或其他標准來定義。目前尚無指定的標准。
19、設計管理——Verilog配置
Verilog‐1995標准將設計管理工作交給軟件來承擔,但各仿真工具的設計管理方法各不相同,不利於設計的共享。為了更好地在設計人員之間共享Verilog設計,並且提高某個特定仿真的可重用性,Verilog‐‐2001標准增加了對設計內容的配置這部分內容。
增加關鍵字config、endconfig、design、instance、cell、use和liblist。
配置塊位於模塊定義之外,可以指定每一個Verilog模塊的版本及其源代碼的位置。Verilog程序設計從頂層模塊開始執行,找到在頂層模塊中實例化的模塊,進而確定其源代碼的位置,照此順序,直到確定整個設計的源程序。
configcfg4 ///給配置塊命名
designrtlLib.top ///指定從哪里找到頂層模塊
defaultliblistrtlLibgateLib; ///設置查找實例模塊的默認順序
instancetest.dut.a2liblistggateLib; //明確指定模塊實例使用哪一個庫
endconfig
20、系統任務和系統函數的擴展
Verilog‐2001增加了17個文件輸入/輸出任務:$fgetc、$ungetc、$fflush、$ferror、$fgets、$rewind、$swrite、$swriteb、$swriteo、$swriteh、$sformat、$sdf_annotate、$ffscanf、$sscanf、$fread、$ftell、$fseek。
增加了兩個轉換函數:$signed和$unsigned。
增加了命令行輸入任務:$test$plusargs和$value$plusargs。
21、VCD文件的擴展
VCD文件用於存儲選定的變量數值變化的信息,信息的記錄由VCD系統任務來完成。
在Verilog‐1995標准中只有一種類型的VCD文件,即四狀態類型,這種類型的VCD文件只記錄變量在0、1、x和z狀態之間的變化,而且不記錄信號強度信息。而在Verilog‐2001標准中增加了一種擴展類型的VCD文件,能夠記錄變量在所有狀態之間的轉換,同時記錄信號強度信息。
擴展型VCD系統任務$dumpports、$dumpportsoff、$dumpportson、$dumpportsall、$dumpportslimit、$dumpportsflush、$vcdclose
22、其他
(1)提高了ASIC/FPGA應用的正確性
①檢測脈沖的傳播錯誤
②負脈沖檢測
③新的時序約束檢查
④負時序約束
⑤提高了對SDF(標准延時文件)的支持
(2)編程語言接口PLI方面有所改進