?(本系列只需要modelsim即可完成數字圖像的處理,每個工程都搭建了全自動化的仿真環境,只需要雙擊top_tb.bat文件就可以完成整個的仿真,大大降低了初學者的門檻!!!!如需要該系列的工程文件請關注知識星球:成工fpga,https://t.zsxq.com/DMeqH,關注即送200GB學習資料,鏈接已置頂!)
成工有個強迫癥,就是要求工程的 編號和文章的編號能對應上,由于上篇的package有單個package和多個package,工程是有兩個,但是成工在一篇文章中寫完了。如果繼續往下寫,后面的文章和工程就會錯位,這是成工不能容忍的,所以增加一課,來談談SV的數據類型。
其實看前面幾篇相應的工程,有心者應該能發現成工在使用數據類型的變化,在逐漸由verilog向system verilog轉變。不信的話可以看看第一個工程的數據類型,變量用的是interger和reg。
再看看最近工程數據類型的使用,int,logic,bit,int unsigned。
很多人可能一頭霧水,到底什么時候應該使用什么數據類型呢?有疑問其實就是考點,FPGA測試崗位的面試,數據類型的使用是必問的。
也不要急于一時,我們還是先從verilog的數據類型講起。其實verilog提供了兩種基本的數據類型,那就是變量類型和線網類型,在RTL開發過程中,用的最多的就是reg和wire,其實分別就是變量類型和線網類型。其實變量類型還有integer,time等等,主要用來存儲組合邏輯或者時序邏輯。而線網類型除了wire,還有wor,wand等,用的比較少,主要用來連接功能模塊,當然也可以用來實現組合邏輯,比如wire類型數據可以用assign來實現組合邏輯。
但是有一點需要注意,verilog的數據類型,不管是變量類型還是線網類型,都是四值邏輯的,也就是說,verilog中所有數據的每一位,都有0,1,X和Z四個值可取。所以嚴格的來說,verilog并沒有區分信號的類型,因為所用的數據都是四值邏輯。
而system verilog在verilog的基礎上添加了很多新的數據類型,大大方便了FPGA的設計和驗證,最主要的是SV將硬件信號區分為類型和數據類型。
SV的信號類型和verilog一樣,也是分為變量類型和線網類型。而數據類型則分為四值邏輯(logic)和二值邏輯(bit)。
其實大家都知道,數字信號一般就兩種狀態,那就是0和1,而為了硬件仿真的功能,增加了未知狀態X和高組態Z,比如一個信號沒有任何的輸入驅動,處于懸空狀態,那就是Z;而一個信號在某個時刻可能是0也可以是1,那就是未知狀態X。但是如果是不涉及硬件的功能仿真測試,是沒有必要使用X和Z兩張狀態的,這時候使用二值邏輯不僅可以節約內存,還可以加快仿真。
回到SV的信號類型,常用的變量類型reg和常用線網類型wire依然可以使用,也就是說用verilog寫的.v文件直接改成.sv文件可以直接進行綜合和仿真。但是在SV中,用的最多的信號類型是logic,就是不管是變量還是線網,都可以使用logic。當然信號聲明成logic類型,默認是表示變量類型,用戶可以直接在logic前加var或者wire聲明信號的類型,var logic就是變量類型,wire logic就是線網類型,但是一般我們不會如此聲明信號。
下面我們對數據類型按照四值邏輯和二值邏輯進行分類:
四值邏輯:wire,reg,logic,integer,tri;
二值邏輯:bit,byte,shortint,int,longint。
其實數據可以是有符號數也可以是無符號數,進一步分類:
有符號數:integer,byte,shortint,int,longint;
無符號數:wire,reg,logic,tri,bit。
上面的數據分類是面試的考點,其實挺好記的,四值邏輯除了integer一般都是無符號數,而integer和int一看就是同一類的,都是有符號數。二值邏輯除了bit一般都是有符號是,這個更好理解了,bit就一位,如果是符號位就不用表示其它的了。當然有符號的數據類型也可以用來定義無符號的信號,加上unsigned即可。
有了上面的分析,我們來總結一下什么時候使用什么數據類型。如果使用SV設計可綜合的RTL代碼,基本使用logic即可。如果使用SV進行非硬件的功能仿真測試,可以多使用二值邏輯。當然這個不是絕對的,還有考慮個人的喜歡,比如成工就是喜歡用logic而不是reg和wire,喜歡用int而不是integer。
舉個例子,RGB每個通道的每個圖像數據都是8bit的無符號數,那我們可以用四值邏輯logic [7:0]來定義,也可以使用二值邏輯bit [7:0]來定義,當然也可以使用二值邏輯byte unsigned來定義,形式可以多樣,只要功能正確就可以。
最后說一點,就是一個文件中使用了四值邏輯和二值邏輯,要注意交互信號的相互轉換,不然可能會出現意想不到的錯誤,后續成工會用實例的說明。這兒僅僅需要先記住一點,那就是四值邏輯的X和Z都會轉換成二值邏輯的0!