1、位寬不匹配
Verilog編碼中,常見的位寬不匹配錯誤,有賦值左右位寬不匹配(<=,=),比較位寬(>,<,>=,<=)不匹配,計算位寬(+,-)不匹配
位寬不匹配會導致綜合產(chǎn)生的網(wǎng)表與個人預期差異較大,導致功能不正確。VCS仿真能及時發(fā)現(xiàn)問題,但VCS仿真存在部分場景沒有覆蓋的問題,因此僅僅通過VCS仿真不容易發(fā)現(xiàn)問題。通過spyglass lint檢測可以發(fā)現(xiàn)所有位寬不匹配的情況。
2、位寬不匹配的危害
下文以比較位寬不匹配為例,講解位寬不匹配的危害。
注意:
1)在條件判斷中(if語句),不建議使用加減后結(jié)果直接進行比較,禁止進行加減運算后與位寬不匹配的數(shù)據(jù)/變量進行比較。
2)拼接符號中“{}”,不允許使用加減乘除等運算,綜合類軟件無法正確判斷數(shù)據(jù)運算結(jié)果位寬。數(shù)字運算必須先通過wire指定位寬,然后通過assign得到運算結(jié)果
錯誤案例1
如下代碼,代碼本意是:當cnt0與cnt1之和大于8的時候,count加1。
錯誤代碼中:
比較數(shù)據(jù)是4’h8,此時綜合完成后的網(wǎng)表中,會將cnt0與cnt1之和截位成4bit,再與4’h8比較,如果cnt0與cnt1之和為5’h10000,在此會截位為4’h0000,反而小于4’h8,與預期功能不符
正確代碼&推薦代碼中:
先定義:wire [4:0] cnt_add ; 指定cnt_add位寬為5bit,然后assign cnt_add = (cnt0+cnt1) ;最后與5’h8比較,因為通過wire指定了位寬,所以對于各類綜合軟件而言都不會發(fā)生截位,不會發(fā)生錯誤。
正確代碼&不推薦中
直接將4’h8修改為5’h8,也避免了cnt0+cnt1累加截位,但是spyglass lint會報warning,
不推薦。
reg [3:0] cnt0 ; reg [3:0] cnt1 ; reg [4:0] count ; reg ov_nc ; //-------------case 1----------------- //wrongcode錯誤代碼 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 ?錯誤案例2
NOTE: 拼接符號中“{}”,不允許使用加減乘除等運算,綜合類軟件無法正確判斷數(shù)據(jù)運算結(jié)果位寬。數(shù)字運算必須先通過wire指定位寬,然后通過assign得到運算結(jié)果。
錯誤代碼中:
{1'b0,(cnt0+cnt1)} ,在if語句()拼接符號中,綜合軟件無法識別 (cnt0+cnt1)應(yīng)該是多少bit,(cnt0+cnt1)可能會是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比較,各類綜合軟件也會正確識別位寬,不會發(fā)生截位,但是spyglass lint會報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)}編輯:黃飛
-
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110400 -
VCS
+關(guān)注
關(guān)注
0文章
80瀏覽量
9648
原文標題:錯誤案例:位寬不匹配錯誤
文章出處:【微信號:IP與SoC設(shè)計,微信公眾號:IP與SoC設(shè)計】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
FIR compiler 7.2 數(shù)據(jù)輸入位寬問題
從設(shè)備讀取的idcode與bsdl文件中的idcode不匹配該怎么辦?
帶字庫LCD12864寫數(shù)據(jù)時類型不匹配
怎么實現(xiàn)RocketIOTM GTP在串行高速接口中的位寬設(shè)計?
Verilog 變量中位的數(shù)值類型
在SpinalHDL里有沒有什么好的方式實現(xiàn)一個接口位寬轉(zhuǎn)換呢
JPEG2000中位平面編碼的存儲優(yōu)化方案設(shè)計
![JPEG2000<b class='flag-5'>中</b><b class='flag-5'>位</b>平面<b class='flag-5'>編碼</b>的存儲優(yōu)化方案設(shè)計](https://file1.elecfans.com//web2/M00/A5/F6/wKgZomUMOwaAcvptAAAJOqRRWBU731.jpg)
Verilog設(shè)計中如何匹配變量的位寬
![<b class='flag-5'>Verilog</b>設(shè)計<b class='flag-5'>中</b>如何<b class='flag-5'>匹配</b>變量的<b class='flag-5'>位</b><b class='flag-5'>寬</b>](https://file.elecfans.com/web2/M00/30/E1/pYYBAGIMwgKACB0HAAD3qV0cV_o010.png)
淺談IC設(shè)計中的位寬不匹配的危害
二十進制編碼器及Verilog HDL描述 Verilog HDL程序的基本結(jié)構(gòu)及特點
![二十進制<b class='flag-5'>編碼</b>器及<b class='flag-5'>Verilog</b> HDL描述 <b class='flag-5'>Verilog</b> HDL程序的基本結(jié)構(gòu)及特點](https://file1.elecfans.com/web2/M00/A0/38/wKgZomTr_rGACKVfAAAOC0Y73xs441.jpg)
評論