verilog入門(四)-----表達式
阿新 • • 發佈:2018-01-18
開始 處理 lec parameter spa 方式 param mage ... 表達式有操作數和操作符組成。
操作數
操作數分為:常數、參數、線網、寄存器、位選擇、部分選擇、存儲器單元、函數調用
常數:表達時間中的整數值可被解釋為有符號數或無符號數。如果表達式中是十進制整數,那麽被解釋為有符號數。
如果整數是基數型整數(定長或非定長),該整數作為無符號數對待。
對基數表示或非基數表示的負整數處理方式不同。非基數表示形式的負整數作為有符號數處理,而基數表示形式的負整數作為無符號數。
參數:參數類似於常量,並且使用參數聲明進行說明。 例如:parameter LOAD = 4‘d12,STORE = 4‘d10 此時,LOAD和STORE的值分別聲明為12,10
線網:可在表達式中使用標量線網(1位)和向量線網(多位)
例如: wire [0:3] Prt; //prt為4位向量線網 wire Bdq; //Bbq是標量線網。 線網中的值被解釋為無符號數。在連續賦值中assign Prt = -3; Prt被賦於位向量1101.assign Prt = 4‘HA;Prt被賦於位向量1010.
寄存器:標量和向量寄存器可在表達式中使用。寄存器變量使用寄存器聲明進行說明。
例如:integer TemA,TemB; reg [1:5] State; time Que [1:5]; 整型寄存器中的值被解釋為有符號的二進制補碼數,而reg寄存器或者時間寄存器中的值被解釋成無符號數。實數和實數時間類型寄存器中的值被解釋為有符號浮點數。
TemA = -10; //TemA值為位向量10110
TemA = ‘b1011; //TemA值為十進制數11
位選擇:位選擇從向量中抽取特定的位,形式如下: net_or_reg_vector [bit_select_expr]
例如:State [1] && State [4] //寄存器位選擇 Prt [0] | Bbq //線網位選擇 如果選擇表達式的值為x,z或越界,則位選擇的值為x。
部分選擇: 向量的連續序列被選擇,net_or_reg_vector[msb_const_expr:lsb_const_expr] 範圍表達式必須為常數表達式。例如:State [1:4]
選擇範圍越界或者為x、z時,部分選擇的值為x
存儲器單元:存儲器單元從存儲器中選擇一個字。memory [word_address]
例如:reg [1:8] Ack,Dram [0:63]; ... Ack = Dram [60];------->選擇存儲器的第60個單元
不允許對存儲器變量值部分選擇或位選擇。讀取一個位或者部分選擇一個字的方法:將存儲器單元賦值給寄存器變量,然後對該寄存器采用部分選擇或位選擇操作。
函數調用:表達式中可使用函數調用。函數調用可以是系統函數調用(以$字符開始)或者用戶定義的函數調用。
例如:$time + SumOfEvents
操作符
操作符可以:算術操作符、關系操作符、相等操作符、邏輯操作符、按位操作符、歸約操作符、移位操作符、條件操作符、連接和復制操作符
所有操作如下表:
除了條件操作符從右向左關聯外,其余所有操作符自左向右關聯。 算術操作符:+、-、*、/、% 整數除法截斷任何小數部分。 取模操作符求出與第一個操作符符號相同的余數。 如果算術操作符中的任意操作數是X或Z,那麽整個結果為X。 1.算術操作結果的長度 算術表達式結果的長度由最長的操作數決定。在賦值語句下,算術操作結果的長度由操作符左端目標長度決定。 表達式中的所有中間結果應取最大操作數的長度。 2.無符號數和有符號數 執行算術操作和賦值時,註意操作數的類型。 無符號數存儲在:線網、一般寄存器、基數格式表示形式的整數 有符號數存儲在:整數寄存器、十進制形式的整數 例如:reg [0:5] Bar; integer Tab; ...... Bar = -4‘d12;//寄存器向量Bar中的向量值為110100 Tab = -4‘d12 //位形式為110100 因為Bar是普通寄存器類型變量,只存儲無符號數。右端表達式的值為‘b110100(12的二進制補碼),而Tab為整數寄存器,存入的數為有符號數。Tab存儲十進制-12. 關系操作符: >,<,>=,<= 關系操作符的結果為真(1)或假(0)。如果操作數中有一位為x或z,那麽結果為x。如23>45,結果為假0。而52<8‘hxFF,結果為x。如果操作數長度不同,較短的操作數需要填0補齊。 相等關系操作符: ==(邏輯相等)、!=(邏輯不等)、===(全等)、!==(非全等) 如果比較結果為假,則結果為0,否則結果為1.在全等比較中,值x和z嚴格按位比較。在邏輯比較中,值x和z具有通常的意義,且結果可以不為x。也就是說,在邏輯比較中,如果兩個操作數之一包含x或z,結果為未知的值x。 邏輯操作符:&&(邏輯與)、||(邏輯或),!(邏輯非)。這些操作在邏輯值為0或1上操作。邏輯操作的結構為0或1.如果任意一個操作數包含x,結果也為x。 按位操作符 ~(一元非),&(二元與)、|(二元或)、^(二元異或)、~^,^~(二元異或非)。具體運算規則見下表:
如果操作數長度不相等,長度較小的操作數在最左側添0補位。 歸約操作符 歸約操作符在單一操作數的所有位上操作,並產生1位結果。歸約操作符有: &(歸約與)-------->如果存在位值為0,那麽結果為0,如果存在位值為x或z,結果為x,否則結果為1。 ~&(歸約與非)---->與歸約操作符&相反 |(歸約或) -------->如果存在位值為1,那麽結果為1,如果存在位x或z,結果為x,否則結果為0。 ~|歸約或非 ----->與歸約操作符|相反 ^歸約異或 ------>如果存在位值為x或z,那麽結果為x;否則如果操作數中有偶數個1,結果為0,否則結果為1. ~^(歸約異或非)-->與歸約操作符^正好相反 註意邏輯相等(==)操作符不能用於比較,邏輯相等操作符比較將只會產生結果x。全等操作符期望的結果為值1. 移位操作符 <<(左移)、>>(右移) 移位操作符左側操作數移動右側操作數表示的次數,它是一個邏輯移位。空閑位添0補位。如果右側操作數的值為x或z,移位操作的結果位x。 例如:reg [0:7] Qreq;……Qreq = 4‘b0111; 則Qreq >> 2 是8‘b0000_0001 Verilog HDL中沒有指數操作符。移位操作符可用於支持部分指數操作。 條件操作符 條件操作符根據條件表達式的值選擇表達式,形式如下:cond_expr ? expr1:expr2 如果cond_expr為真,則選擇expr1否則選擇expr2 如果cond_expr為x或z,結果將是按以下邏輯expr1和expr2按位操作的值:0與0得0,1與1為1,其余情況為x 連接和復制操作 連接操作是將小表達式合並形成大表達式的操作,例如{expr1,expr2,expr3....} assign Dbus[7:4] = {Dbus[0],Dbus[1], Dbus[2], Dbus[3] }-------->以反轉的順序將低端4位賦給高端4位。
verilog入門(四)-----表達式