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

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

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

Verilog編碼中位寬不匹配的危害是什么?

ruikundianzi ? 來源:IP與SoC設(shè)計(jì) ? 2023-09-19 10:14 ? 次閱讀

1、位寬不匹配

Verilog編碼中,常見的位寬不匹配錯(cuò)誤,有賦值左右位寬不匹配(<=,=),比較位寬(>,<,>=,<=)不匹配,計(jì)算位寬(+,-)不匹配

位寬不匹配會(huì)導(dǎo)致綜合產(chǎn)生的網(wǎng)表與個(gè)人預(yù)期差異較大,導(dǎo)致功能不正確。VCS仿真能及時(shí)發(fā)現(xiàn)問題,但VCS仿真存在部分場景沒有覆蓋的問題,因此僅僅通過VCS仿真不容易發(fā)現(xiàn)問題。通過spyglass lint檢測(cè)可以發(fā)現(xiàn)所有位寬不匹配的情況。

2、位寬不匹配的危害

下文以比較位寬不匹配為例,講解位寬不匹配的危害。

注意:

1)在條件判斷中(if語句),不建議使用加減后結(jié)果直接進(jìn)行比較,禁止進(jìn)行加減運(yùn)算后與位寬不匹配的數(shù)據(jù)/變量進(jìn)行比較。

2)拼接符號(hào)中“{}”,不允許使用加減乘除等運(yùn)算,綜合類軟件無法正確判斷數(shù)據(jù)運(yùn)算結(jié)果位寬。數(shù)字運(yùn)算必須先通過wire指定位寬,然后通過assign得到運(yùn)算結(jié)果

錯(cuò)誤案例1

如下代碼,代碼本意是:當(dāng)cnt0與cnt1之和大于8的時(shí)候,count加1。

錯(cuò)誤代碼中:

比較數(shù)據(jù)是4’h8,此時(shí)綜合完成后的網(wǎng)表中,會(huì)將cnt0與cnt1之和截位成4bit,再與4’h8比較,如果cnt0與cnt1之和為5’h10000,在此會(huì)截位為4’h0000,反而小于4’h8,與預(yù)期功能不符

正確代碼&推薦代碼中:

先定義:wire [4:0] cnt_add ; 指定cnt_add位寬為5bit,然后assign cnt_add = (cnt0+cnt1) ;最后與5’h8比較,因?yàn)橥ㄟ^wire指定了位寬,所以對(duì)于各類綜合軟件而言都不會(huì)發(fā)生截位,不會(huì)發(fā)生錯(cuò)誤。

正確代碼&不推薦中

直接將4’h8修改為5’h8,也避免了cnt0+cnt1累加截位,但是spyglass lint會(huì)報(bào)warning,

不推薦。

reg  [3:0]   cnt0  ;
reg  [3:0]   cnt1  ;
reg  [4:0]   count ;
reg          ov_nc ;


//-------------case 1-----------------
//wrongcode錯(cuò)誤代碼
always @ (posedge clk or negedge rst_n) 
    if(!rst_n)begin
    count     <= 5'b0 ;
    end 
    else if((cnt0+cnt1)>4'h8) //should be 5'h8
    begin
       {ov_nc, count} <= count +1'b1;
    end 
    
//right  ,but not recommended
always @ (posedge clk or negedge rst_n) 
    if(!rst_n)begin
    count     <= 5'b0 ;
    end 
    else if((cnt0+cnt1)>5'h8) //should be 5'h8
    begin
       {ov_nc, count} <= count +1'b1;


//right code and recommended  正確且推薦
wire [4:0] cnt_add ;
assign  cnt_add  = (cnt0+cnt1) ;


always @ (posedge clk or negedge rst_n) 
    if(!rst_n)begin
    count     <= 5'b0 ;
    end 
    else if(cnt_add >5'h8) // (cnt0+cnt1) is 5 bits
    begin
         {ov_nc, count} <= count +1'b1;
    end 
    
?錯(cuò)誤案例2

NOTE: 拼接符號(hào)中“{}”,不允許使用加減乘除等運(yùn)算,綜合類軟件無法正確判斷數(shù)據(jù)運(yùn)算結(jié)果位寬。數(shù)字運(yùn)算必須先通過wire指定位寬,然后通過assign得到運(yùn)算結(jié)果。

錯(cuò)誤代碼中:

{1'b0,(cnt0+cnt1)} ,在if語句()拼接符號(hào)中,綜合軟件無法識(shí)別 (cnt0+cnt1)應(yīng)該是多少bit,(cnt0+cnt1)可能會(huì)是5bit,也可能是4bit。

正確代碼&推薦代碼中

通過 wire [4:0] cnt_add ; assign cnt_add = (cnt0+cnt1) ; 指定了(cnt0+cnt1)之和為5bit,利用拼接符指定{1'b0,cnt_add}為6bit,然后與6bit的cnt2比較。

正確代碼&不推薦中

通過 wire [4:0] cnt_add ; assign cnt_add = (cnt0+cnt1) ; 指定了(cnt0+cnt1)之和為5bit,但是直接與6bit的cnt2比較,各類綜合軟件也會(huì)正確識(shí)別位寬,不會(huì)發(fā)生截位,但是spyglass lint會(huì)報(bào)warning,雖然功能正確,但是不推薦。

//-------------case 2-----------------//
 reg  [3:0]   cnt0  ;
 reg  [3:0]   cnt1  ;
 reg  [5:0]   cnt2  ;
 
 //wrong code
 always @ (posedge clk or negedge rst_n) 
    if(!rst_n)begin
    count     <= 5'b0 ;
    end 
    else if({1'b0,(cnt0+cnt1)}

編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1343

    瀏覽量

    109925
  • VCS
    VCS
    +關(guān)注

    關(guān)注

    0

    文章

    78

    瀏覽量

    9581

原文標(biāo)題:錯(cuò)誤案例:位寬不匹配錯(cuò)誤

文章出處:【微信號(hào):IP與SoC設(shè)計(jì),微信公眾號(hào):IP與SoC設(shè)計(jì)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FIR compiler 7.2 數(shù)據(jù)輸入問題

    AD采集為14,但是在FIR IP核中將輸入設(shè)置為14,IP核數(shù)據(jù)輸入端依然為16。在之后的仿真階段會(huì)報(bào)
    發(fā)表于 09-07 10:32

    從設(shè)備讀取的idcode與bsdl文件的idcode匹配該怎么辦?

    我遇到了這個(gè)問題。信息:iMPACT:583 - '1':從設(shè)備讀取的idcode與bsdl的idcode匹配File.INFO:iMPACT:1578 - '1':設(shè)備IDCODE
    發(fā)表于 08-08 08:58

    帶字庫LCD12864寫數(shù)據(jù)時(shí)類型匹配

    現(xiàn)有帶字庫LCD12864(控制器ST7920)一塊,暫時(shí)只需實(shí)現(xiàn)往DDRAM寫數(shù)據(jù)來顯示漢字。根據(jù)技術(shù)手冊(cè),對(duì)DDRAM的發(fā)數(shù)據(jù)操作是一次發(fā)一個(gè)字型(兩個(gè)字節(jié))的,但是12864數(shù)據(jù)口是8
    發(fā)表于 11-11 09:00

    怎么實(shí)現(xiàn)RocketIOTM GTP在串行高速接口中的設(shè)計(jì)?

    本文在對(duì)Virtex-5 RocketIOTM GTP進(jìn)行了解的基礎(chǔ)上,針對(duì)串行高速接口開發(fā)匹配的問題,提出了一種
    發(fā)表于 05-28 06:21

    Verilog 變量的數(shù)值類型

    Verilog 變量的數(shù)值類型Verilog變量每個(gè)位(bit)的數(shù)值類型有四種,分別為1,0,Z,X。其中1,0比較明確就是高、低電
    發(fā)表于 08-04 09:42

    在SpinalHDL里有沒有什么好的方式實(shí)現(xiàn)一個(gè)接口轉(zhuǎn)換呢

    整數(shù)倍時(shí)進(jìn)行數(shù)據(jù)填充(默認(rèn)為false,但如果位不能整除則要設(shè)置為true)。其內(nèi)部設(shè)計(jì)實(shí)現(xiàn)思路并不難,匹配時(shí)輸入輸出直接相連,
    發(fā)表于 07-27 14:52

    嵌入式的計(jì)算

    ,然后將在擴(kuò)大1即可。 有符號(hào)數(shù)的表示為最高位為符號(hào),表示數(shù)值大小,所以計(jì)算完絕對(duì)值
    發(fā)表于 03-02 19:52

    JPEG2000平面編碼的存儲(chǔ)優(yōu)化方案設(shè)計(jì)

    本文通過對(duì)JPEG2000平面編碼器的存儲(chǔ)方案進(jìn)行了分析,設(shè)計(jì)了一個(gè)高效的存儲(chǔ)結(jié)構(gòu)以及相應(yīng)的控制電路,設(shè)計(jì)采用verilog[4]語言描述。
    發(fā)表于 08-16 11:28 ?1476次閱讀
    JPEG2000<b class='flag-5'>中</b><b class='flag-5'>位</b>平面<b class='flag-5'>編碼</b>的存儲(chǔ)優(yōu)化方案設(shè)計(jì)

    verilog實(shí)現(xiàn)的RS204—188編碼

    這是verilog實(shí)現(xiàn)的RS204—188編碼,附帶測(cè)試文件
    發(fā)表于 01-20 18:24 ?28次下載

    華為的verilog編碼規(guī)范

    華為的verilog編碼規(guī)范
    發(fā)表于 11-01 08:41 ?41次下載
    華為的<b class='flag-5'>verilog</b><b class='flag-5'>編碼</b>規(guī)范

    Verilog設(shè)計(jì)如何匹配變量的

      在FPGA設(shè)計(jì),我們經(jīng)常需要用寄存器來寄存某些“數(shù)量類”的變量,比如FIFO的深度啦、或者計(jì)數(shù)器的最大值啦;又或者輸入輸出信號(hào)也需要將用parameter參數(shù)化以便更好的調(diào)用等。
    的頭像 發(fā)表于 02-16 16:21 ?6763次閱讀
    <b class='flag-5'>Verilog</b>設(shè)計(jì)<b class='flag-5'>中</b>如何<b class='flag-5'>匹配</b>變量的<b class='flag-5'>位</b><b class='flag-5'>寬</b>

    淺談IC設(shè)計(jì)匹配危害

    在IC設(shè)計(jì),硬復(fù)位用于配置寄存器和配置信號(hào)的跨時(shí)鐘模塊。即一個(gè)配置信號(hào)cfg_mac_mode是由硬復(fù)位驅(qū)動(dòng)的,如果要同步到其他時(shí)鐘域,跨時(shí)鐘模塊需要使用硬復(fù)位,而不能使用軟復(fù)位。
    發(fā)表于 07-15 11:53 ?2435次閱讀

    Verilog編碼風(fēng)格的建議

    良好的編碼風(fēng)格,有助于代碼的閱讀、調(diào)試和修改。雖然 Verilog 代碼可以在保證語法正確的前提下任意編寫,但是潦草的編碼風(fēng)格往往是一錘子買賣。
    的頭像 發(fā)表于 06-01 16:27 ?674次閱讀
    <b class='flag-5'>Verilog</b><b class='flag-5'>編碼</b>風(fēng)格的建議

    二十進(jìn)制編碼器及Verilog HDL描述 Verilog HDL程序的基本結(jié)構(gòu)及特點(diǎn)

    節(jié)通過硬件描述語言Verilog HDL對(duì)二十進(jìn)制編碼器的描述,介紹Verilog HDL程序的基本結(jié)構(gòu)及特點(diǎn)。
    的頭像 發(fā)表于 08-28 09:54 ?2674次閱讀
    二十進(jìn)制<b class='flag-5'>編碼</b>器及<b class='flag-5'>Verilog</b> HDL描述 <b class='flag-5'>Verilog</b> HDL程序的基本結(jié)構(gòu)及特點(diǎn)

    Verilog表達(dá)式的確定規(guī)則

    很多時(shí)候,Verilog中表達(dá)式的都是被隱式確定的,即使你自己設(shè)計(jì)了,它也是根據(jù)規(guī)則先確定位
    的頭像 發(fā)表于 10-22 15:41 ?135次閱讀
    <b class='flag-5'>Verilog</b>表達(dá)式的<b class='flag-5'>位</b><b class='flag-5'>寬</b>確定規(guī)則