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

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

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

Verilog代碼:if-else和case的電路結(jié)構(gòu)和區(qū)別

要長(zhǎng)高 ? 來源:eetop ? 作者:曜曜曜切克鬧 ? 2023-11-29 15:10 ? 次閱讀

本文是針對(duì)在寫項(xiàng)目中遇到的Verilog代碼寫法錯(cuò)誤,多對(duì)一和一對(duì)多賦值問題,從邏輯賦值的角度理解為何會(huì)編譯出錯(cuò)。并在后續(xù)討論了if-else和case的電路結(jié)構(gòu)和區(qū)別。在此處列出來供大家一起交流學(xué)習(xí)。

2.對(duì)Verilog代碼的理解

2.1 一對(duì)多賦值、多對(duì)一賦值行為的區(qū)別

2.1.1多對(duì)一賦值的Verilog代碼:

always @(posedge clk or negedge rstn)begin

if(!rstn)begin

REG1 <= 'd0;

REG2 <= 'd0;

end

else begin

if(write) begin

case(paddr)

'h54321 : REG1 <= ?pwdata; ? //在32'h54321寫入pwdata

'h12345 : REG2 <= ?pwdata; ? //在32'h12345寫入pwdata

default begin

REG1 <= REG1 ;

REG2 <= REG2 ;

end

endcase

//另一種寫法

//REG1 <= (paddr == 'h54321) ? pwdata : REG1; //在32'h54321寫入pwdata

//REG2 <= (paddr == 'h12345) ? pwdata : REG2; ?//在32'h12345寫入pwdata

end

else begin

REG1 <= REG1;

REG2 <= REG2;

end

end

end

·如果將一個(gè)信號(hào)(如pwdata)對(duì)多個(gè)信號(hào)進(jìn)行賦值(如REG1、REG2),應(yīng)該使用譯碼器形式的電路結(jié)構(gòu)。也就是pwdata根據(jù)paddr進(jìn)行譯碼,從而將值賦給REG1/REG2。如下圖所示

#FormatImgID_0#

·譯碼器一般用多個(gè)輸入信號(hào),根據(jù)padder判斷取值的不同,將輸入信號(hào)pwdata賦值給相應(yīng)的輸出信號(hào)。代碼中給出了兩種寫法都可以。

2.1.2一對(duì)多賦值的Verilog代碼:

always @(posedge clk or negedge rstn)begin

if(!rstn)begin

prdata <= 'd0;

end

else begin

if(read) begin

case(paddr)

'h54321 : prdata <= REG1; //在32'h54321讀出prdata = REG1 ?

'h12345 : prdata <= REG2; //在32'h12345讀出prdata = REG2

default : prdata <= prdata;

endcase

//注意下面這種寫法是錯(cuò)誤的(2.1.3中會(huì)分析)

//prdata <= (paddr == 'h54321) ? REG1 : prdata;

//prdata <= (paddr == 'h54321) ? REG2 : prdata;

end

else begin

prdata <= prdata;

end

end

end

·如果將多個(gè)信號(hào)(如REG1、REG2)對(duì)一個(gè)信號(hào)進(jìn)行賦值(如prdata),應(yīng)該使用多路選擇器形式的電路結(jié)構(gòu)。也就是REG1/REG2根據(jù)paddr進(jìn)行判斷,從而將值賦給prdata。如下圖所示

#FormatImgID_1#

·多路選擇器的寫法一般是利用case語句進(jìn)行實(shí)現(xiàn),根據(jù)case的條件不同,選擇不同的輸入信號(hào)對(duì)輸出信號(hào)進(jìn)行賦值。

2.1.3 為什么多對(duì)一賦值不能用三目運(yùn)算符呢?

即寫成:

always @(posedge clk or negedge rstn)begin

if(!rstn)begin

prdata <= 'd0;

end

else begin

if(read) begin

//注意多對(duì)一中,下面這種寫法是錯(cuò)誤的

prdata <= (paddr == 'h54321) ? REG1 : prdata;

prdata <= (paddr == 'h54321) ? REG2 : prdata;

end

else begin

prdata <= prdata;

end

end

end

分析:這時(shí)候編譯就會(huì)報(bào)錯(cuò),prdata同時(shí)被兩個(gè)常量賦值。假如說paddr選中了'h54321,此時(shí) prdata<= REG1成立;但是請(qǐng)注意在第二條語句中,由于paddr≠'h54321,prdata <= prdata。

由此我們可以知道三目運(yùn)算符和case并不等價(jià),如果改寫成if-else多層嵌套語句,編譯沒有出錯(cuò)誤。

always @(posedge clk or negedge rstn)begin

if(!rstn)begin

prdata <= 'd0;

end

else begin

if(read) begin

if(paddr == 'h54321)begin

prdata <= REG1;

end

else begin

if(paddr == 'h54321)begin

prdata <= REG2;

end

else begin

prdata <= prdata; ? ?

end

end

end

else begin

prdata <= prdata;

end

end

end

下面進(jìn)一步分析if-else和case語句的區(qū)別來分析。

2.2 if—else語句與case語句的區(qū)別

2.2.1 if-else語句的電路結(jié)構(gòu)

每個(gè)if-else就是一個(gè)2選1mux器。當(dāng)信號(hào)有明顯優(yōu)先級(jí)時(shí),首先要考慮if-else,但是if嵌套過多也會(huì)導(dǎo)致速度變慢;if語句結(jié)構(gòu)較慢,但占用面積小。

嵌套的if語句如果使用不當(dāng),就會(huì)導(dǎo)致設(shè)計(jì)的更大延時(shí),為了避免較大的路徑延遲,最好不要使用特別長(zhǎng)的嵌套if結(jié)構(gòu)。如想利用if語句來實(shí)現(xiàn)那些對(duì)延時(shí)要求苛刻的路徑時(shí),應(yīng)將最高優(yōu)先級(jí)給最遲到達(dá)的關(guān)鍵信號(hào)。

2.2.2 case語句的電路結(jié)構(gòu)

case語句綜合為 n選1的mux電路。適用于無明顯優(yōu)先級(jí)的邏輯判斷,即這些邏輯條件都處于同一個(gè)優(yōu)先級(jí)且互斥;case結(jié)構(gòu)電路速度較快,但占用面積較大。

2.2.3 if語句和case語句中的latch問題

if-else:組合邏輯和時(shí)序邏輯中的always語句塊中實(shí)現(xiàn)是不同的。

組合邏輯中:if缺少else 時(shí),會(huì)有l(wèi)atch;

時(shí)序邏輯中:盡管缺少else,依舊是D觸發(fā)器,不存在latch。

case語句:case列舉不全并且還沒寫default語句,則會(huì)綜合出鎖存器。所以一定寫default,無論是組合還是時(shí)序邏輯。

總結(jié):保證if-else對(duì)應(yīng)齊全;case必寫default。

2.2.4 if-else語句和case語句的區(qū)別

對(duì)于這個(gè)的討論,本人認(rèn)為是以前由于綜合工具落后,導(dǎo)致有區(qū)別,但是隨著綜合工具的更新,他們之間的區(qū)別越來越小,甚至有人可以用if-else綜合出無優(yōu)先級(jí)的多路選擇器,用case綜合出有優(yōu)先級(jí)的多路選擇器。

“if-else的邏輯判別是有優(yōu)先級(jí)的,而case的邏輯判斷條件是并列的。

舉個(gè)例子,如果你用IF實(shí)現(xiàn)譯碼器,綜合出的是有優(yōu)先級(jí)的譯碼器。如果用CASE,綜合出的就是一個(gè)無優(yōu)先級(jí)的譯碼器。也就是說IF是有優(yōu)先級(jí)的,執(zhí)行的次序有先后。而CASE執(zhí)行的時(shí)候是沒有先后順序的?!?/p>

“隨著綜合工具的進(jìn)步,已經(jīng)不需要討論if-else 和case的區(qū)別了,兩者可以等同 ”

“Verilog 2001標(biāo)準(zhǔn)(IEEE 1364-2001)第132頁:

The case item expressions shall be evaluated and compared in the exact order in which they are given.

指出了case是串行有優(yōu)先級(jí)。又:

Apart from syntax, the case statement differs from the multiway if-else-if construct in two important ways:

a) The conditional expressions in the if-else-if construct are more general than comparing one expression with several others, as in the case statement.

b) The case statement provides a definitive result when there are x and z values in an expression.

a)是廢話。b)指出了case是四態(tài)對(duì)比。除此之外和if-else沒有差別。”

審核編輯:黃飛

聲明:本文內(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)投訴
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1333

    瀏覽量

    109713
  • D觸發(fā)器
    +關(guān)注

    關(guān)注

    3

    文章

    164

    瀏覽量

    47737
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4670

    瀏覽量

    67764
  • Case
    +關(guān)注

    關(guān)注

    0

    文章

    27

    瀏覽量

    13340
  • 多路選擇器
    +關(guān)注

    關(guān)注

    1

    文章

    22

    瀏覽量

    6487
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語言中if語句、if-else語句和switch語句詳解

    在C語言中,有三種條件判斷結(jié)構(gòu):if語句、if-else語句和switch語句。
    發(fā)表于 08-18 16:36 ?5857次閱讀
    C語言中if語句、<b class='flag-5'>if-else</b>語句和switch語句詳解

    煉獄傳奇-if_elsecase之戰(zhàn)

    Verilog HDL語言中存在兩種分支語言:● if-else 條件分支語句● case 分支控制語句1. if-else條件分支語句if-els
    發(fā)表于 03-31 09:51

    Proteus之if-else語句的應(yīng)用

    Proteus之if-else語句的應(yīng)用,很好的Proteus資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-18 14:49 ?0次下載

    verilog中if與case語句不完整產(chǎn)生鎖存器的原因分析

      在很多地方都能看到,verilog中if與case語句必須完整,即if要加上elsecase后要加上default語句,以防止鎖存器的發(fā)生,下載內(nèi)容中就談到了其中原因。
    發(fā)表于 09-16 09:29 ?24次下載

    FPGA學(xué)習(xí)系列:if-elsecase

    設(shè)計(jì)背景:不管是在什么軟件和硬件語言,我們?cè)谖覀兊?b class='flag-5'>代碼中都或多或少的用到這兩條語句,if..elsecase語句,今天我們將學(xué)習(xí)verilog中的這兩條語句,其實(shí)不管在什么語言中這兩
    的頭像 發(fā)表于 06-01 16:59 ?1.1w次閱讀
    FPGA學(xué)習(xí)系列:<b class='flag-5'>if-else</b>與<b class='flag-5'>case</b>

    C語言的switch case多分支選擇語句的詳細(xì)資料說明

    1、switch-case開關(guān)語句是一種多分支選擇語句,用來實(shí)現(xiàn)多方向條件分支。雖然采用if-else條件判斷語句也可以實(shí)現(xiàn)多方向條件分支,但是當(dāng)分支較多時(shí),使用if-else條件語句的嵌套層次會(huì)
    發(fā)表于 07-12 17:39 ?1次下載
    C語言的switch <b class='flag-5'>case</b>多分支選擇語句的詳細(xì)資料說明

    30多個(gè)verilog實(shí)用例子代碼合集免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是30多個(gè)verilog實(shí)用例子代碼合集免費(fèi)下載包括了:奇偶校驗(yàn)位產(chǎn)生器,用case語句描述的4選1數(shù)據(jù)選擇器,用casez描述的數(shù)據(jù)選擇器,持續(xù)賦值方式定義的2選1多路
    發(fā)表于 09-09 08:00 ?35次下載
    30多個(gè)<b class='flag-5'>verilog</b>實(shí)用例子<b class='flag-5'>代碼</b>合集免費(fèi)下載

    FPGA代碼經(jīng)驗(yàn) case,casez,casex語句

    使用case語句代替嵌套的if-else將會(huì)產(chǎn)生更易讀的代碼,更好的邏輯利用率和更高的性能。
    的頭像 發(fā)表于 12-11 10:42 ?6055次閱讀

    從入門到高級(jí)替換If-Else的5種方法示例

    ,它導(dǎo)致設(shè)計(jì)復(fù)雜,代碼可讀性差,并且可能導(dǎo)致重構(gòu)困難。 但是,If-Else 已成為事實(shí)上的代碼分支解決方案,這確實(shí)是有道理的。這是向所有有抱負(fù)的開發(fā)人員講授的第一件事。 不幸的是,許多開發(fā)人員從來沒有前進(jìn)到更合適的分支策略。有
    的頭像 發(fā)表于 02-20 16:27 ?6650次閱讀
    從入門到高級(jí)替換<b class='flag-5'>If-Else</b>的5種方法示例

    不會(huì)有人不知道怎么優(yōu)雅的替換if-else語句吧

    來自:love1024.blog.csdn.net/article/details/104955363 場(chǎng)景日常開發(fā),if-else語句寫的不少吧??當(dāng)邏輯分支非常多的時(shí)候,if-else套了一層
    的頭像 發(fā)表于 07-28 15:46 ?1333次閱讀
    不會(huì)有人不知道怎么優(yōu)雅的替換<b class='flag-5'>if-else</b>語句吧

    數(shù)字芯片設(shè)計(jì)流程之verilog設(shè)計(jì)

    綜合開始拿給后端,確保每一個(gè)階段沒有問題。后仿真,證明加入延遲后功能是否正確。一、verilog設(shè)計(jì)可綜合語句四大關(guān)鍵字:always、if-else、assign、case1、if-else
    發(fā)表于 11-05 15:51 ?29次下載
    數(shù)字芯片設(shè)計(jì)流程之<b class='flag-5'>verilog</b>設(shè)計(jì)

    解鎖新姿勢(shì):干掉過多的if-else!

    這點(diǎn)非常容易理解,就是說在業(yè)務(wù)邏輯里面,先把不符合條件的給先過濾掉,而不是層層嵌套if-else判斷
    的頭像 發(fā)表于 11-12 10:01 ?597次閱讀

    什么是SystemVerilog-決策語句-if-else語句?

    決策語句(Decision statements)允許程序塊的執(zhí)行流程根據(jù)設(shè)計(jì)中信號(hào)的當(dāng)前值分支到特定語句。SystemVerilog有兩個(gè)主要的決策語句:if…else語句和case語句,使用關(guān)鍵字case、
    的頭像 發(fā)表于 02-09 14:15 ?904次閱讀
    什么是SystemVerilog-決策語句-<b class='flag-5'>if-else</b>語句?

    Verilog中的If語句和case語句介紹

    。這些語句統(tǒng)稱為順序語句。case 語句和 if 語句都是 verilog 中順序語句的示例。在這篇文章的其余部分,我們將討論如何在verilog中使用這兩個(gè)語句。然后,我們考慮這兩個(gè)結(jié)構(gòu)
    的頭像 發(fā)表于 05-11 15:37 ?3904次閱讀
    <b class='flag-5'>Verilog</b>中的If語句和<b class='flag-5'>case</b>語句介紹

    如何通過策略模式簡(jiǎn)化if-else

    相信大家日常開發(fā)中會(huì)經(jīng)常寫各種分支判斷語句,比如 if-else ,當(dāng)分支較多時(shí),代碼看著會(huì)比較臃腫,那么如何優(yōu)化呢? 1、什么是策略模式? Define a family
    的頭像 發(fā)表于 10-08 16:08 ?580次閱讀
    如何通過策略模式簡(jiǎn)化<b class='flag-5'>if-else</b>