日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > ZYNQ
		


1、位寬不匹配

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


位寬不匹配會導(dǎo)致DC之后的網(wǎng)表與預(yù)期差異較大,導(dǎo)致功能不正確,通過spyglass lint檢測可以發(fā)現(xiàn)所有位寬不匹配的情況,而vcs編譯只能發(fā)現(xiàn)少數(shù)連線位寬不匹配的情況。


2、位寬不匹配的危害

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

注意:

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

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


3、錯誤案例1:

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

1)錯誤代碼中:

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

2)正確代碼&推薦代碼中:

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

3)正確代碼&不推薦中

直接將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-----------------//wrong code 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 recommendedalways @ (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

4、錯誤案例2

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


1)錯誤代碼中:

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

2)正確代碼&推薦代碼中

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

3)正確代碼&不推薦中

通過 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)}// begin {ov_nc, count} <= count +1'b1; end  //right code and not 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// begin {ov_nc, count} <= count +1'b1; end  //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({1'b0,cnt_add}// begin {ov_nc, count} <= count +1'b1; end

最后,有個比較判斷的例子,如下:

reg   [9:0]   a;
reg    [7:0]   b;
if(a == b + 1)  //如果 b = 255時,a與0相比較還是與 9‘h100相比較?

這個跟編譯器是相關(guān)的,大多數(shù)時候會是與9'h100比較,因為綜合的時候verilog會自動擴展位寬,但不要過分相信它。這樣位寬不匹配的代碼永遠(yuǎn)不要出現(xiàn)在代碼里。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
關(guān)閉