數(shù)字硬件建模SystemVerilog-運(yùn)算符/表達(dá)式規(guī)則
經(jīng)過幾周的更新,SV核心部分用戶自定義類型和包內(nèi)容已更新完畢,接下來就是RTL表達(dá)式和運(yùn)算符。
馬上HDLBits-SystemVerilog版本也開始準(zhǔn)備了,基本這一部分完成后就開始更新~
介紹
運(yùn)算符對(duì)操作數(shù)執(zhí)行操作。大多數(shù)運(yùn)算符都有兩個(gè)操作數(shù)。例如,在運(yùn)算a+b中,+(加法)運(yùn)算的操作數(shù)是a和b。每個(gè)操作數(shù)都被稱為表達(dá)式,表達(dá)式可以是文字值、變量、網(wǎng)絡(luò);函數(shù)調(diào)用的返回,或另一個(gè)操作的結(jié)果。表達(dá)式有許多影響操作執(zhí)行方式的特征。這些特征在后面章節(jié)中討論。
4-state(4態(tài))和2-state(2態(tài))操作
表達(dá)式可以是2態(tài)或4態(tài)。2態(tài)表達(dá)式的每個(gè)位只能有0或1的值。2態(tài)表達(dá)式不能具有高阻抗值(由字母Z表示)、未知值(由字母X表示)或不關(guān)心值(也由X表示)。4態(tài)表達(dá)式可以在表達(dá)式的任何位中包含0、l、Z或X的值。
對(duì)2態(tài)和4態(tài)表達(dá)式進(jìn)行運(yùn)算的規(guī)則很簡(jiǎn)單——當(dāng)任何操作數(shù)都是4態(tài)表達(dá)式時(shí),運(yùn)算的結(jié)果將是4態(tài)表達(dá)式。所有操作數(shù)都必須是2態(tài)表達(dá)式才能得到2態(tài)結(jié)果。如果結(jié)果被用作另一個(gè)操作的操作數(shù),或在編程語句(如if-else)中求值,則此規(guī)則可能會(huì)影響其他操作。
該章中建議的編碼準(zhǔn)則是,RTL建模只使用4態(tài)類型。一個(gè)主要原因是,運(yùn)算結(jié)果中任何一位的X都可以很好地表明其中一個(gè)操作數(shù)有問題。當(dāng)使用2態(tài)類型時(shí),設(shè)計(jì)問題可能會(huì)被隱藏,因?yàn)椴僮鹘Y(jié)果中沒有X值指示潛在的錯(cuò)誤(之前的文章有詳細(xì)討論這部分)。
X-OPTIMISM和X-PESSIMISM
大多數(shù)SystemVerilog運(yùn)算符都是X-optimism,這意味著即使操作數(shù)中有X或Z值,該操作也可能產(chǎn)生已知結(jié)果。一些SystemVerilog運(yùn)算符,如算術(shù)運(yùn)算符和關(guān)系運(yùn)算符,是X-pessimism,這意味著,如果任何操作數(shù)的任何位具有X或Z值,則結(jié)果的所有位將自動(dòng)為X。
X-OPTIMISM。即使一個(gè)或兩個(gè)操作數(shù)的位具有X或Z值,X-optimism也可以產(chǎn)生有效的結(jié)果。考慮下面的示例和所示的邏輯值:
該運(yùn)算的結(jié)果是值4’b0000。這是因?yàn)?運(yùn)算符為其操作數(shù)的每一位建模一個(gè)數(shù)字and邏輯門。在數(shù)字邏輯中,0與任何值的AND運(yùn)算將產(chǎn)生0,操作數(shù)a中的高阻抗位(由Z表示)和未知位(由X表示)在result中變?yōu)?,因?yàn)檫@些位與b中對(duì)應(yīng)的位進(jìn)行AND運(yùn)算,b的值為0。這種行為被稱為X-OPTIMISM。仿真將有一個(gè)已知的結(jié)果,即使操作數(shù)的位具有X或Z值。
X-OPTIMISM僅適用于仿真可以準(zhǔn)確預(yù)測(cè)實(shí)際邏輯門行為的值。在下面的示例中,b操作數(shù)是全1而不是全0。
運(yùn)算的結(jié)果是值4’b01xx。對(duì)于這些操作數(shù)值,X-optimism不適用于最右邊的兩個(gè)位。在實(shí)際邏輯門中,高阻抗AND (與)X,可能會(huì)產(chǎn)生0或1,其值取決于一系列條件,例如用于構(gòu)建與門的晶體管類型、晶體管電路的阻抗和電容、工作電壓,甚至環(huán)境溫度。抽象RTL和運(yùn)算符沒有此詳細(xì)信息。如果沒有這些細(xì)節(jié),數(shù)字仿真無法預(yù)測(cè)0或1是否會(huì)由1與Z相加產(chǎn)生。類似地,X代表未知值,這意味著實(shí)際邏輯門值可能是0、1或Z,如果存在這種模糊性,數(shù)字仿真無法預(yù)測(cè)0或1是否會(huì)由1與X相加產(chǎn)生。
**X-pessimistic。少數(shù)SystemVerilog運(yùn)算符更"悲觀"**。如果任何操作數(shù)的任何位具有X或Z值,則該操作會(huì)自動(dòng)返回一個(gè)值,其中所有位都為X。X-pessimistic如算術(shù)運(yùn)算符(如加法運(yùn)算符)和關(guān)系運(yùn)算符(如小于運(yùn)算符)。
運(yùn)算的結(jié)果是4’bxxxx。出現(xiàn)這種X是因?yàn)樗阈g(shù)加法運(yùn)算符執(zhí)行基于數(shù)字的加法,而不是按位加法。操作數(shù)a的值為4’b000x,這不是一個(gè)數(shù)字,因此運(yùn)算結(jié)果是一個(gè)未知值。
后面會(huì)更詳細(xì)地研究SystemVerilog RTL運(yùn)算符,以及每個(gè)運(yùn)算符是X-optimistic or X-pessimistic。為了編寫能夠正確表示的RTL模型,理解這些影響硬件行為至關(guān)重要。
運(yùn)算向量大小和自動(dòng)向量擴(kuò)展
運(yùn)算符的每個(gè)操作數(shù)可以是任意大小的向量;包括標(biāo)量(1位)。操作數(shù)的向量大小可能會(huì)影響操作的執(zhí)行方式。一個(gè)重要的考慮因素是當(dāng)運(yùn)算符的操作數(shù)是不同的向量大小時(shí)。
自定義操作數(shù)Self-determined operands。有些運(yùn)算符獨(dú)立處理每個(gè)操作數(shù)。操作數(shù)是否為不同的向量大小并不重要。這些運(yùn)算符的操作數(shù)稱為自定數(shù)self-determined。在下面的示例中,運(yùn)算符執(zhí)行邏輯“&&”運(yùn)算,測(cè)試兩個(gè)操作數(shù)是否都為真。如果是,則該操作返回的結(jié)果為true,否則,該操作返回的結(jié)果為false:
操作數(shù)a和b是自定數(shù)。每個(gè)操作數(shù)的計(jì)算結(jié)果可以是真或假,與另一個(gè)操作數(shù)的向量大小無關(guān)。
上下文確定的操作數(shù)。許多運(yùn)算符需要將操作數(shù)展開為相同的向量大小,然后才能執(zhí)行操作。這些運(yùn)算符的操作數(shù)被稱為上下文確定的操作數(shù)(context-determined)。該操作將使最短的操作數(shù)向左擴(kuò)展,使其與最大的操作數(shù)的向量大小相同。在下面的示例中,&運(yùn)算符執(zhí)行按位AND運(yùn)算,將每個(gè)操作數(shù)的每一位相加,并返回布爾結(jié)果。
為了將a的每一位與b的每一位進(jìn)行AND,該操作將兩個(gè)操作數(shù)調(diào)整為相同的向量寬度。該操作將檢查操作的上下文以確定最大的操作數(shù),然后左擴(kuò)展較短的操作數(shù)以匹配最大操作數(shù)的大小。擴(kuò)展規(guī)則如下:
- 如果最左邊的位為0或l,且操作數(shù)為無符號(hào)類型,則操作數(shù)為零擴(kuò)展(每個(gè)附加位的值為0)。
- 如果最左邊的位是0或l,并且操作數(shù)是有符號(hào)類型,則操作數(shù)是符號(hào)擴(kuò)展的(每個(gè)額外的位被賦予最左邊位的值或原始值。最左邊的位被稱為符號(hào)位)。
- 如果最左邊的位是Z,則操作數(shù)是Z擴(kuò)展的(每個(gè)額外的位都有Z的值)。
- 如果最左邊的位是X,則操作數(shù)是X擴(kuò)展的(每個(gè)附加位的值為X)。
算術(shù)運(yùn)算的上下文推斷大小比其他運(yùn)算符的上下文推斷大小更復(fù)雜,上下文推斷大小不僅考慮運(yùn)算符的操作數(shù),還考慮賦值語句右側(cè)和左側(cè)所有表達(dá)式的向量大小,如以下代碼所示:
有符號(hào)和無符號(hào)表達(dá)式
算術(shù)、比較和移位運(yùn)算符可以執(zhí)行有符號(hào)或無符號(hào)運(yùn)算。規(guī)則很簡(jiǎn)單——如果執(zhí)行運(yùn)算的所有操作數(shù)都是有符號(hào)的,則執(zhí)行有符號(hào)運(yùn)算。如果任何受影響的操作數(shù)是無符號(hào)的,則執(zhí)行無符號(hào)操作——以下代碼段說明了這些規(guī)則。注釋中注明了操作類型。
運(yùn)算符的符號(hào)性完全由操作運(yùn)算符的操作數(shù)決定。它不受賦值語句左側(cè)的符號(hào)性影響。
整數(shù)(向量)和實(shí)數(shù)(浮點(diǎn))表達(dá)式
所有SystemVerilog運(yùn)算符都可以對(duì)整數(shù)值執(zhí)行操作。IEEE SystemVerilog標(biāo)準(zhǔn)將整數(shù)值稱為整數(shù)表達(dá)式——由一個(gè)或多個(gè)連續(xù)位組成的值。工程師通常將這些整數(shù)或整數(shù)值稱為向量。
SystemVerilog將定點(diǎn)和浮點(diǎn)表達(dá)式稱為實(shí)數(shù)表達(dá)式。大多數(shù)類型的運(yùn)算都可以在實(shí)數(shù)表達(dá)式上執(zhí)行,包括:賦值運(yùn)算、算術(shù)運(yùn)算、邏輯(真/假)運(yùn)算、比較運(yùn)算和遞增/遞減運(yùn)算。有一些操作無法在實(shí)數(shù)表達(dá)式上執(zhí)行。這些操作主要包括向量的位處理,例如位和部分選擇操作、按位操作、移位操作、連接操作和流操作。
可以對(duì)整數(shù)和實(shí)數(shù)表達(dá)式的混合執(zhí)行操作。混合類型運(yùn)算的規(guī)則是,如果任何操作數(shù)是實(shí)數(shù)表達(dá)式,則另一個(gè)操作數(shù)將轉(zhuǎn)換為實(shí)數(shù)表達(dá)式,并執(zhí)行浮點(diǎn)運(yùn)算。
筆記 |
---|
RTL綜合編譯器通常不支持實(shí)數(shù)(浮點(diǎn))表達(dá)式。高級(jí)綜合(HLS)工具可用于復(fù)雜的算法設(shè)計(jì)。浮點(diǎn)和定點(diǎn)設(shè)計(jì)不在本系列文章的范圍之內(nèi)。 |
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62571 -
變量
+關(guān)注
關(guān)注
0文章
613瀏覽量
28360 -
運(yùn)算符
+關(guān)注
關(guān)注
0文章
172瀏覽量
11079
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論