0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文詳解Verilog表達(dá)式

冬至子 ? 來源:數(shù)字IC與好好生活的兩居室 ? 作者:除夕之夜啊 ? 2023-05-29 16:23 ? 次閱讀

表達(dá)式

表達(dá)式由操作符和操作數(shù)構(gòu)成,其目的是根據(jù)操作符的意義得到一個(gè)計(jì)算結(jié)果。表達(dá)式可以在出現(xiàn)數(shù)值的任何地方使用。例如:

a^b ;          //a與b進(jìn)行異或操作
address[9:0] + 10'b1 ;  //地址累加
flag1 && flag2 ;  //邏輯與操作

操作數(shù)

操作數(shù)可以是任意的數(shù)據(jù)類型,只是某些特定的語法結(jié)構(gòu)要求使用特定類型的操作數(shù)。

操作數(shù)可以為常數(shù),整數(shù),實(shí)數(shù),線網(wǎng),寄存器,時(shí)間,位選,域選,存儲(chǔ)器及函數(shù)調(diào)用等。

module test;


//實(shí)數(shù)
real a, b, c;
c = a + b ;


//寄存器
reg  [3:0]       cprmu_1, cprmu_2 ;
always @(posedge clk) begin
       cprmu_2 = cprmu_1 ^ cprmu_2 ;
end

//函數(shù)
reg  flag1 ;
flag = calculate_result(A, B);

//非法操作數(shù)
reg [3:0]         res;
wire [3:0]        temp;
always@ (*)begin
    res    = cprmu_2 – cprmu_1 ;
    //temp = cprmu_2 – cprmu_1 ; 
    //不合法,always塊里賦值對(duì)象不能是wire型
end


endmodule

操作符

Verilog 中提供了大約 9 種操作符,分別是算術(shù)、關(guān)系、等價(jià)、邏輯、按位、歸約、移位、拼接、條件操作符。

大部分操作符與 C 語言中類似。同類型操作符之間,除條件操作符從右往左關(guān)聯(lián),其余操作符都是自左向右關(guān)聯(lián)。圓括號(hào)內(nèi)表達(dá)式優(yōu)先執(zhí)行。

例如下面前兩組內(nèi)的 2 種寫法都是等價(jià)的,后面一組的兩種寫法是不等價(jià)的。

//自左向右關(guān)聯(lián),兩種寫法等價(jià)

A+B-C ;

(A+B)-C ;

//自右向左關(guān)聯(lián),兩種寫法等價(jià):結(jié)果為 B,或 D、F

A ? B : C ? D : F ;

A ? B : (C ? D : F) ;

//自右向左關(guān)聯(lián),兩種寫法不等價(jià)

(A ? B : C) ? D : F ; //結(jié)果為 D 或 F

A ? B : C ? D : F ;

不同操作符之間,優(yōu)先級(jí)是不同的。下表列出了操作符優(yōu)先級(jí)從高至低的排列順序。當(dāng)沒有圓括號(hào)時(shí),Verilog 會(huì)根據(jù)操作符優(yōu)先級(jí)對(duì)表達(dá)式進(jìn)行計(jì)算。為了避免由操作符優(yōu)先級(jí)導(dǎo)致的計(jì)算混亂,在不確定優(yōu)先級(jí)時(shí),建議用圓括號(hào)將表達(dá)式區(qū)分開來。

1.jpg

算術(shù)操作符

算術(shù)操作符包括單目操作符和雙目操作符。

雙目操作符對(duì) 2 個(gè)操作數(shù)進(jìn)行算術(shù)運(yùn)算,包括乘(*)、除(/)、加(+)、減(-)、求冪(**)、取模(%)。

reg [3:0]  a, b;
reg [4:0]  c ;
a = 4'b0010 ;
b = 4'b1001 ;
c = a+b;        //結(jié)果為c=4'b1011
c = b/a;          //結(jié)果為c=4,取整

如果操作數(shù)某一位為 X,則計(jì)算結(jié)果也會(huì)全部出現(xiàn) X。例如:

b = 4'b100x ;
c = a+b ;       //結(jié)果為c=4'bxxxx

對(duì)變量進(jìn)行聲明時(shí),要根據(jù)變量的操作符對(duì)變量的位寬進(jìn)行合理聲明,不要讓結(jié)果溢出。上述例子中,相加的 2 個(gè)變量位寬為 4bit,那么結(jié)果寄存器變量位寬最少為 5bit。否則,高位將被截?cái)?,?dǎo)致結(jié)果高位丟失。無符號(hào)數(shù)乘法時(shí),結(jié)果變量位寬應(yīng)該為 2 個(gè)操作數(shù)位寬之和。

reg [3:0]        mula ;
reg [1:0]        mulb;
reg [5:0]        res ;
mula = 4'he   ;
mulb = 2'h3   ;
res  = mula * mulb ; //結(jié)果為res=6'h2a, 數(shù)據(jù)結(jié)果沒有丟失位數(shù)
  • 和 - 也可以作為單目操作符來使用,表示操作數(shù)的正負(fù)性。此類操作符優(yōu)先級(jí)最高。
-4  //表示負(fù)4
+3  //表示正3

負(fù)數(shù)表示時(shí),可以直接在十進(jìn)制數(shù)字前面增加一個(gè)減號(hào) “-”,也可以指定位寬。因?yàn)樨?fù)數(shù)使用二進(jìn)制補(bǔ)碼來表示,不指定位寬來表示負(fù)數(shù),編譯器在轉(zhuǎn)換時(shí),會(huì)自動(dòng)分配位寬,從而導(dǎo)致意想不到的結(jié)果。例如:

mula = -4'd4 ;
mulb = 2 ;
res = mula * mulb ;      //計(jì)算結(jié)果為res=-6'd8, 即res=6'h38,正常
res = (-'d4) * mulb ;    //((232次冪)-4) * 2, 結(jié)果異常

◆關(guān)系操作符

關(guān)系操作符有大于(>),小于(<),大于等于(>=),小于等于(<=)。

關(guān)系操作符的正常結(jié)果有 2 種,真(1)或假(0)。

如果操作數(shù)中有一位為 x 或 z,則關(guān)系表達(dá)式的結(jié)果為 x。

A = 4 ;
B = 3 ;
X = 3'b1xx ;
A > B     //為真
A <= B    //為假
A >= X    //為X,不確定

◆等價(jià)操作符

等價(jià)操作符包括邏輯相等(==),邏輯不等(!=),全等(===),非全等(!==)。

等價(jià)操作符的正常結(jié)果有 2 種:為真(1)或假(0)。

邏輯相等/不等操作符不能比較 x 或 z,當(dāng)操作數(shù)包含一個(gè) x 或 z,則結(jié)果為 x。

全等比較時(shí),如果按位比較有相同的 x 或 z,返回結(jié)果也可以為 1,即全等比較可比較 x 或 z。所以,全等比較的結(jié)果一定不包含 x。舉例如下:

A = 4 ;
B = 8'h04 ;
C = 4'bxxxx ;
D = 4'hx ;
A == B        //為真
A == (B + 1)  //為假
A == C        //為X,不確定
A === C       //為假,返回值為0
C === D       //為真,返回值為1

◆邏輯操作符

邏輯操作符主要有 3 個(gè):&&(邏輯與), ||(邏輯或),!(邏輯非)。

邏輯操作符的計(jì)算結(jié)果是一個(gè) 1bit 的值,0 表示假,1 表示真,x 表示不確定。

如果一個(gè)操作數(shù)不為 0,它等價(jià)于邏輯 1;如果一個(gè)操作數(shù)等于 0,它等價(jià)于邏輯 0。如果它任意一位為 x 或 z,它等價(jià)于 x。

如果任意一個(gè)操作數(shù)包含 x,邏輯操作符運(yùn)算結(jié)果不一定為 x。

邏輯操作符的操作數(shù)可以為變量,也可以為表達(dá)式。例如:

A = 3;
B = 0;
C = 2'b1x ;
A && B    //     為假
A || B    //     為真
! A       //     為假
! B       //     為真
A && C    //     為X,不確定
A || C    //     為真,因?yàn)锳為真
(A==2) && (! B)  //為假,此時(shí)第一個(gè)操作數(shù)為表達(dá)式

◆按位操作符

按位操作符包括:取反( ),與(&),或(|),異或(^),同或( ^)。

按位操作符對(duì) 2 個(gè)操作數(shù)的每 1bit 數(shù)據(jù)進(jìn)行按位操作。

如果 2 個(gè)操作數(shù)位寬不相等,則用 0 向左擴(kuò)展補(bǔ)充較短的操作數(shù)。

取反操作符只有一個(gè)操作數(shù),它對(duì)操作數(shù)的每 1bit 數(shù)據(jù)進(jìn)行取反操作。

下圖給出了按位操作符的邏輯規(guī)則。

1.jpg

A = 4'b0101 ;
B = 4'b1001 ;
C = 4'bx010 ;
~A        //4'b1010
A & B     //4'b0001
A | B     //4'b1101
A ^ B       //4'b1100
A ~^ B    //4'b0011
B | C     //4'b1011
B & C       //4'bx000

◆歸約操作符

歸約操作符包括:歸約與(&),歸約與非( &),歸約或(|),歸約或非( |),歸約異或(^),歸約同或(~^)。

歸約操作符只有一個(gè)操作數(shù),它對(duì)這個(gè)向量操作數(shù)逐位進(jìn)行操作,最終產(chǎn)生一個(gè) 1bit 結(jié)果。

邏輯操作符、按位操作符和歸約操作符都使用相同的符號(hào)表示,因此有時(shí)候容易混淆。區(qū)分這些操作符的關(guān)鍵是分清操作數(shù)的數(shù)目,和計(jì)算結(jié)果的規(guī)則。

A = 4'b1010 ;
&A ;      //結(jié)果為 1 & 0 & 1 & 0 = 1'b0,可用來判斷變量A是否全1
~|A ;     //結(jié)果為 ~(1 | 0 | 1 | 0) = 1'b0, 可用來判斷變量A是否為全0
^A ;      //結(jié)果為 1 ^ 0 ^ 1 ^ 0 = 1'b0

◆移位操作符

移位操作符包括左移(<<),右移(>>),算術(shù)左移(<<<),算術(shù)右移(>>>)。

移位操作符是雙目操作符,兩個(gè)操作數(shù)分別表示要進(jìn)行移位的向量信號(hào)(操作符左側(cè))與移動(dòng)的位數(shù)(操作符右側(cè))。

算術(shù)左移和邏輯左移時(shí),右邊低位會(huì)補(bǔ) 0。

邏輯右移時(shí),左邊高位會(huì)補(bǔ) 0;而算術(shù)右移時(shí),左邊高位會(huì)補(bǔ)充符號(hào)位,以保證數(shù)據(jù)縮小后值的正確性。

A = 4'b1100 ;
B = 4'b0010 ;
A = A >> 2 ;        //結(jié)果為 4'b0011
A = A << 1;         //結(jié)果為 4'b1000
A = A <<< 1 ;       //結(jié)果為 4'b1000
C = B + (A>>>2);    //結(jié)果為 2 + (-4/4) = 1, 5'b00001
// C = 5'b00010 + 5'b11111 = 6'b100001, 取五位有效數(shù)據(jù)

◆拼接操作符

拼接操作符用大括號(hào)({,})來表示,用于將多個(gè)操作數(shù)(向量)拼接成新的操作數(shù)(向量),信號(hào)間用逗號(hào)隔開。

拼接符操作數(shù)必須指定位寬,常數(shù)的話也需要指定位寬。例如:

A = 4'b1010 ;
B = 1'b1 ;
Y1 = {B, A[3:2], A[0], 4'h3 };  //結(jié)果為Y1='b1100_0011
Y2 = {4{B}, 3'd4};  //結(jié)果為 Y2=7'b111_1100
Y3 = {32'{1'b0}};  //結(jié)果為 Y3=32h0,常用作寄存器初始化時(shí)匹配位寬的賦初值

◆條件操作符

條件表達(dá)式有 3 個(gè)操作符,結(jié)構(gòu)描述如下:

condition_expression ? true_expression : false_expression

計(jì)算時(shí),如果 condition_expression 為真(邏輯值為 1),則運(yùn)算結(jié)果為 true_expression;如果 condition_expression 為假(邏輯值為 0),則計(jì)算結(jié)果為 false_expression。

assign hsel    = (addr[9:8] == 2'b0) ? hsel_p1 : hsel_p2 ;

//當(dāng)信號(hào) addr 高 2bit 為 0 時(shí),hsel 賦值為 hsel_p1; 否則,將 hsel_p2 賦值給 hsel。

其實(shí),條件表達(dá)式類似于 2 路(或多路)選擇器,其描述方式完全可以用 if-else 語句代替。

當(dāng)然條件操作符也能進(jìn)行嵌套,完成一個(gè)多次選擇的邏輯。例如:

assign   hsel = (addr[9:8] == 2'b00) ? hsel_p1 :
                (addr[9:8] == 2'b01) ? hsel_p2 :
                (addr[9:8] == 2'b10) ? hsel_p3 :
                (addr[9:8] == 2'b11) ? hsel_p4 : 1'b0 ;
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5343

    瀏覽量

    120377
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7492

    瀏覽量

    163842
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110101
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136841
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是正則表達(dá)式?正則表達(dá)式如何工作?哪些語法規(guī)則適用正則表達(dá)式?

    正則表達(dá)式又稱規(guī)則表達(dá)式(Regular Expression,在代碼中常簡(jiǎn)寫為 regex、regexp 或 RE),是種用于匹配、查找、替換文本的強(qiáng)大工具。它能夠以特定的模式匹配字符串,從而
    的頭像 發(fā)表于 11-03 14:41 ?3657次閱讀
    什么是正則<b class='flag-5'>表達(dá)式</b>?正則<b class='flag-5'>表達(dá)式</b>如何工作?哪些語法規(guī)則適用正則<b class='flag-5'>表達(dá)式</b>?

    防范表達(dá)式的失控

    在C 語言中,表達(dá)式是最重要的組成部分之,幾乎所有的代碼都由表達(dá)式構(gòu)成。表達(dá)式的使用如此廣泛,讀者也許會(huì)產(chǎn)生這樣的疑問,像+ 、- 、3 、/ 、& & 這樣簡(jiǎn)單的運(yùn)算也會(huì)出現(xiàn)
    發(fā)表于 04-22 16:57 ?13次下載

    深入淺出boost正則表達(dá)式

    什么是正則表達(dá)式?正則表達(dá)式種用來描述定數(shù)量文本的模式。Regex代表Regular Express. 如果您不知道什么是正則表達(dá)式
    發(fā)表于 09-08 18:09 ?9次下載

    Verilog HDL硬件描述語言_表達(dá)式

    本章講述在Verilog HDL中編寫表達(dá)式的基礎(chǔ)。表達(dá)式由操作數(shù)和操作符組成。表達(dá)式可以在出現(xiàn)數(shù)值的任何地方使用。verilog相關(guān)教程材
    發(fā)表于 04-25 16:09 ?19次下載

    關(guān)于java正則表達(dá)式的用法詳解

    正則表達(dá)式 個(gè)正則表達(dá)式個(gè)用于文本搜索的文本模式。換句話說,在文本中搜索出現(xiàn)的模式。例如,你可以用正則表達(dá)式搜索網(wǎng)頁中的郵箱地址或超鏈
    發(fā)表于 09-27 14:24 ?0次下載

    Python正則表達(dá)式的學(xué)習(xí)指南

    本文介紹了Python對(duì)于正則表達(dá)式的支持,包括正則表達(dá)式基礎(chǔ)以及Python正則表達(dá)式標(biāo)準(zhǔn)庫的完整介紹及使用示例。本文的內(nèi)容不包括如何編寫高效的正則表達(dá)式、如何優(yōu)化正則
    發(fā)表于 09-15 08:00 ?0次下載
    Python正則<b class='flag-5'>表達(dá)式</b>的學(xué)習(xí)指南

    Verilog HDL中編寫表達(dá)式的基礎(chǔ)講述

    本章講述在Verilog HDL中編寫表達(dá)式的基礎(chǔ)。 表達(dá)式由操作數(shù)和操作符組成。表達(dá)式可以在出現(xiàn)數(shù)值的任何地方使用。 4.1 操作數(shù) 操作數(shù)可以是以下類型中的
    的頭像 發(fā)表于 03-05 15:20 ?2808次閱讀

    Python正則表達(dá)式指南

    本文介紹了Python對(duì)于正則表達(dá)式的支持,包括正則表達(dá)式基礎(chǔ)以及Python正則表達(dá)式標(biāo)準(zhǔn)庫的完整介紹及使用示例。本文的內(nèi)容不包括如何編寫高效的正則表達(dá)式、如何優(yōu)化正則
    發(fā)表于 03-26 09:13 ?10次下載
    Python正則<b class='flag-5'>表達(dá)式</b>指南

    python正則表達(dá)式中的常用函數(shù)

    編譯正則表達(dá)式模式,返回個(gè)正則對(duì)象的模式。(可以把那些常用的正則表達(dá)式編譯成正則表達(dá)式對(duì)象,這樣可以提高點(diǎn)效率。)
    的頭像 發(fā)表于 03-18 16:12 ?1801次閱讀

    Lambda表達(dá)式詳解

    C++11中的Lambda表達(dá)式用于 **定義并創(chuàng)建匿名的函數(shù)對(duì)象** ,以簡(jiǎn)化編程工作。下面看下Lambda表達(dá)式的基本構(gòu)成。
    的頭像 發(fā)表于 02-09 11:28 ?1169次閱讀

    表達(dá)式與邏輯門之間的關(guān)系

    邏輯表達(dá)式是指表示個(gè)表示邏輯運(yùn)算關(guān)系的式子,是個(gè)抽象的類似數(shù)學(xué)表達(dá)式,下面我們重點(diǎn)說明下其表達(dá)式與邏輯門之間的關(guān)系。
    的頭像 發(fā)表于 02-15 14:54 ?1622次閱讀
    <b class='flag-5'>表達(dá)式</b>與邏輯門之間的關(guān)系

    C語言的表達(dá)式

    在C語言中,表達(dá)式是由操作符和操作數(shù)組成。表達(dá)式可以由個(gè)或者多個(gè)操作數(shù)組成,不同的操作符與操作數(shù)組成不同的表達(dá)式,因此,表達(dá)式才是C語言的
    的頭像 發(fā)表于 02-21 15:09 ?1367次閱讀
    C語言的<b class='flag-5'>表達(dá)式</b>

    如何使用lambda表達(dá)式提升開發(fā)效率?

    Java8 的個(gè)大亮點(diǎn)是引入 Lambda 表達(dá)式,使用它設(shè)計(jì)的代碼會(huì)更加簡(jiǎn)潔。當(dāng)開發(fā)者在編寫 Lambda 表達(dá)式時(shí),也會(huì)隨之被編譯成個(gè)函數(shù)式接口。
    發(fā)表于 08-24 10:25 ?292次閱讀

    zabbix觸發(fā)器表達(dá)式 基本RS觸發(fā)器表達(dá)式 rs觸發(fā)器的邏輯表達(dá)式

    zabbix觸發(fā)器表達(dá)式 基本RS觸發(fā)器表達(dá)式 rs觸發(fā)器的邏輯表達(dá)式? Zabbix是款開源的監(jiān)控軟件,它能通過監(jiān)控指標(biāo)來實(shí)時(shí)監(jiān)測(cè)服務(wù)器和網(wǎng)絡(luò)的運(yùn)行狀態(tài),同時(shí)還能提供警報(bào)和報(bào)告等功
    的頭像 發(fā)表于 08-24 15:50 ?1593次閱讀

    詳解Java表達(dá)式引擎選型

    AviatorScript 是門高性能、輕量級(jí)寄宿于 JVM 之上的腳本語言。AviatorScript 可將表達(dá)式編譯成字節(jié)碼。它原來的定位直只是個(gè)
    的頭像 發(fā)表于 12-06 10:57 ?1904次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>詳解</b>Java<b class='flag-5'>表達(dá)式</b>引擎選型