Verilog 多路分支語(yǔ)句

2022-05-17 10:44 更新

關(guān)鍵詞:case,選擇器

case 語(yǔ)句是一種多路條件分支的形式,可以解決 if 語(yǔ)句中有多個(gè)條件選項(xiàng)時(shí)使用不方便的問(wèn)題。

case 語(yǔ)句

case 語(yǔ)句格式如下:

case(case_expr)
    condition1     :             true_statement1 ;
    condition2     :             true_statement2 ;
    ……
    default        :             default_statement ;
endcase

case 語(yǔ)句執(zhí)行時(shí),如果 condition1 為真,則執(zhí)行 ?true_statement1 ?; 如果 condition1 為假,condition2 為真,則執(zhí)行 ?true_statement2?;依次類(lèi)推。如果各個(gè) condition 都不為真,則執(zhí)行 ?default_statement ?語(yǔ)句。

default 語(yǔ)句是可選的,且在一個(gè) case 語(yǔ)句中不能有多個(gè) default 語(yǔ)句。

條件選項(xiàng)可以有多個(gè),不僅限于 condition1、condition2 等,而且這些條件選項(xiàng)不要求互斥。雖然這些條件選項(xiàng)是并發(fā)比較的,但執(zhí)行效果是誰(shuí)在前且條件為真誰(shuí)被執(zhí)行。

?ture_statement1 ?等執(zhí)行語(yǔ)句可以是一條語(yǔ)句,也可以是多條。如果是多條執(zhí)行語(yǔ)句,則需要用 begin 與 end 關(guān)鍵字進(jìn)行說(shuō)明。

case 語(yǔ)句支持嵌套使用

下面用 case 語(yǔ)句代替 if 語(yǔ)句實(shí)現(xiàn)了一個(gè) 4 路選擇器的功能。仿真結(jié)果與 testbench 可參考條件語(yǔ)句一章,兩者完全一致。

module mux4to1(
    input [1:0]     sel ,
    input [1:0]     p0 ,
    input [1:0]     p1 ,
    input [1:0]     p2 ,
    input [1:0]     p3 ,
    output [1:0]    sout);
 
    reg [1:0]     sout_t ;
    always @(*)
        case(sel)
            2'b00:   begin      
                    sout_t = p0 ;
                end
            2'b01:       sout_t = p1 ;
            2'b10:       sout_t = p2 ;
            default:     sout_t = p3 ;
        endcase
    assign sout = sout_t ;
 
endmodule

case 語(yǔ)句中的條件選項(xiàng)表單式不必都是常量,也可以是 x 值或 z 值。

當(dāng)多個(gè)條件選項(xiàng)下需要執(zhí)行相同的語(yǔ)句時(shí),多個(gè)條件選項(xiàng)可以用逗號(hào)分開(kāi),放在同一個(gè)語(yǔ)句塊的候選項(xiàng)中。

但是 case 語(yǔ)句中的 ?x? 或 ?z? 的比較邏輯是不可綜合的,所以一般不建議在 case 語(yǔ)句中使用 ?x? 或 ?z? 作為比較值。

例如,對(duì) 4 路選擇器的 case 語(yǔ)句進(jìn)行擴(kuò)展,舉例如下:

case(sel)
    2'b00:   sout_t = p0 ;
    2'b01:   sout_t = p1 ;
    2'b10:   sout_t = p2 ;
    2'b11:     sout_t = p3 ;
    2'bx0, 2'bx1, 2'bxz, 2'bxx, 2'b0x, 2'b1x, 2'bzx :
        sout_t = 2'bxx ;
    2'bz0, 2'bz1, 2'bzz, 2'b0z, 2'b1z :
        sout_t = 2'bzz ;
    default:  $display("Unexpected input control!!!");
endcase

casex/casez 語(yǔ)句

casex、 casez 語(yǔ)句是 case 語(yǔ)句的變形,用來(lái)表示條件選項(xiàng)中的無(wú)關(guān)項(xiàng)。

casex 用 "?x?" 來(lái)表示無(wú)關(guān)值,casez 用問(wèn)號(hào) "???" 來(lái)表示無(wú)關(guān)值。

兩者的實(shí)現(xiàn)的功能是完全一致的,語(yǔ)法與 case 語(yǔ)句也完全一致。

但是 casex、casez 一般是不可綜合的,多用于仿真。

例如用 casez 語(yǔ)句來(lái)實(shí)現(xiàn)一個(gè) 4bit 控制端的 4 路選擇選擇器。

module mux4to1(
    input [3:0]     sel ,
    input [1:0]     p0 ,
    input [1:0]     p1 ,
    input [1:0]     p2 ,
    input [1:0]     p3 ,
    output [1:0]    sout);
 
    reg [1:0]     sout_t ;
    always @(*)
        casez(sel)
            4'b???1:     sout_t = p0 ;
            4'b??1?:     sout_t = p1 ;
            4'b?1??:     sout_t = p2 ;
            4'b1???:     sout_t = p3 ;  
        default:         sout_t = 2'b0 ;
    endcase
    assign      sout = sout_t ;
 
endmodule

點(diǎn)擊這里下載源碼


以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)