色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

verilog中有符號數和無符號數的本質探究

冬至子 ? 來源:芯時代青年 ? 作者:尼德蘭的喵 ? 2023-12-04 16:13 ? 次閱讀

不知道有沒有人像我一樣,長久以來將verilog中的有符號數視為不敢觸碰的禁區。不過俗話說啊解決恐懼的最好辦法就是直面恐懼,又有俗話說要想工其事必先利其器,還有俗話說磨刀不誤砍柴工,也有俗話說The only thing we have to fear is fear itself,所以今天咱們就嘗試對verilog中數據的符號屬性(有符號數和無符號數)探究根源。

本文的驗證環境基于VCS通過auto_testbench生成,相關的vcs命令行細節請在auto_testbench工程目錄下查詢。

先說明一個大前提,有符號數即補碼表示,無符號數即原碼表示或者說必然是整數的補碼表示,因此有符號數和無符號數均可以認為是數值的補碼。

為了省流,還是先甩結論。有符號數和無符號數的最本質區別就是:符號位的識別和高位拓展。除此之外,另一個區別就是從人的角度如何如何讀這個數,或者說$display(%d)打印時打印的值是什么(而從機器的角度它壓根就不區分signed和unsigned)。也就是說,如果不涉及到位寬拓展的事,有符號數和無符號數在verilog運算中可以說毫無差別。

所以先給出兩個結論,verilog中數據的符號屬性會影響兩件事:

1.符號位的識別和位寬拓展,有符號數最高位被識別為符號位,高位拓展時拓展符號位,無符號數高位拓展0;

2.數據的實際值(人的角度如何如何讀這個數);

顯然,這個這個結論和固有的認知出入有點大,不急咱們先看一個實驗。下面的代碼是一段不涉及到位寬拓展的運算,t0_va0為有符號數-1,也就是16'hffff:

logic signed[15:0]t0_va0 = -1;//16'hffff

wire signed[15:0]t0_en0 = t0_va0 + 16'hffff;
wire [15:0]t0_en1 = t0_va0 + 16'hffff;

wire signed[15:0]t0_en2 = t0_va0 + $signed(16'hffff);
wire [15:0]t0_en3 = t0_va0 + $signed(16'hffff);

wire signed[15:0]t0_en4 = t0_va0 - 16'h1;
wire signed[15:0]t0_en5 = t0_va0 - $unsigned(16'h1);

wire [15:0]t0_en6 = t0_va0 - 16'h1;
wire [15:0]t0_en7 = t0_va0 - $unsigned(16'h1);

仿真的結果如下:

圖片

可以看到所有的結果都是一致的。而如果將va0信號改成無符號數:

logic [15:0]t1_va0 = 16'hffff;

wire signed[15:0]t1_en0 = t1_va0 + 16'hffff;
wire [15:0]t1_en1 = t1_va0 + 16'hffff;

wire signed[15:0]t1_en2 = t1_va0 + $signed(16'hffff);
wire [15:0]t1_en3 = t1_va0 + $signed(16'hffff);

wire signed[15:0]t1_en4 = t1_va0 - 16'h1;
wire signed[15:0]t1_en5 = t1_va0 - $unsigned(16'h1);

wire [15:0]t1_en6 = t1_va0 - 16'h1;
wire [15:0]t1_en7 = t1_va0 - $unsigned(16'h1);

其仿真結果也是一致的:

圖片

而一旦涉及到運算結果位寬拓展結果就有所差別了,比如將結果的位寬都改成18bit:

logic signed[15:0]t2_va0 = -1;

wire signed[17:0]t2_en0 = t2_va0 + 16'hffff;
wire [17:0]t2_en1 = t2_va0 + 16'hffff;

wire signed[17:0]t2_en2 = t2_va0 + $signed(16'hffff);
wire [17:0]t2_en3 = t2_va0 + $signed(16'hffff);

wire signed[17:0]t2_en4 = t2_va0 - 16'h1;
wire signed[17:0]t2_en5 = t2_va0 - $unsigned(16'h1);

wire [17:0]t2_en6 = t2_va0 - 16'h1;
wire [17:0]t2_en7 = t2_va0 - $unsigned(16'h1);

看到的波形就是這樣:

圖片

這個事就有些神奇了,所以后面就是說明下這里面的區別,或者說在完成運算后工具是如何識別這個數的符號性以決定位寬拓展的結果的。在開始之前必須明確下一個有符號數(補碼),'h1fffe和'hfffe對于機器是沒有區別的,都是-2。

仿真工具在對一個運算結果進行位寬拓展時,會先識別這個數的符號屬性,那么具體是怎么識別的呢?

1.有符號數和有符號數運算,結果為有符號數;

2.有符號數和無符號數運算,結果為無符號數;

3.無符號數和無符號數運算,結果為無符號數;

4.運算結果外又通過signed和unsigned定向指定時,最終的符號屬性遵照指定結果;

5.等號左側信號聲明中的signed/unsigned不影響右側運算結果的符號數屬性;

好,咱們一個一個看。

有符號數和有符號數運算,結果為有符號數。

logic signed[15:0]t3_va0 = -1;

wire signed[17:0]t3_en0 = t3_va0 - $signed(16'h1);
wire signed[17:0]t3_en1 = t3_va0 + $signed(16'hffff);
wire [17:0]t3_en2 = t3_va0 - $signed(16'h1);
wire [17:0]t3_en3 = t3_va0 + $signed(16'hffff);

圖片

很顯然,兩個有符號數進行操作結果是有符號數,位寬拓展時拓展符號位。同時這個波形還說明了等號左側信號聲明中的signed/unsigned不影響右側運算結果的符號數屬性。

有符號數和無符號數運算,結果為無符號數。

wire signed[17:0]t3_en4 = t3_va0 - 16'h1;
wire signed[17:0]t3_en5 = t3_va0 + 16'hffff;
wire [17:0]t3_en6 = t3_va0 - 16'h1;
wire [17:0]t3_en7 = t3_va0 + 16'hffff;

圖片顯然結果是無符號數,高位拓展時拓展的都是0。

無符號數和無符號數運算,結果為無符號數。這個不說了,顯而易見的事情。

運算結果外又通過signed和unsigned定向指定時,最終的符號屬性遵照指定結果。

wire signed[17:0]t3_en8 = $unsigned(t3_va0 - $signed(16'h1));
wire signed[17:0]t3_en9 = $unsigned(t3_va0 + $signed(16'hffff));
wire [17:0]t3_en10 = $signed(t3_va0 - 16'h1);
wire [17:0]t3_en11 = $signed(t3_va0 + 16'hffff);

圖片因為在運算之后又通過signed和unsigned指定了符號屬性,所以后面的位寬拓展就按照對應的屬性來了。再次進一步的佐證,等號左側信號聲明中的signed/unsigned不影響右側運算結果的符號數屬性。

好了現在我們再把前文的結論翻出來,verilog中的符號屬性會影響兩件事情:

1.符號位的識別和位寬拓展,有符號數最高位被識別為符號位,高位拓展時拓展符號位,無符號數高位拓展0;

2.數據的實際值(人的角度如何如何讀這個數);

再看這個測試就很好解釋了:

logic signed[15:0]t2_va0 = -1;

wire signed[17:0]t2_en0 = t2_va0 + 16'hffff;
//就是'hffff+'hffff = 'h1fffe
wire [17:0]t2_en1 = t2_va0 + 16'hffff;
//同上

wire signed[17:0]t2_en2 = t2_va0 + $signed(16'hffff);
//本質還是'hffff+'hffff = 'h1fffe,不過因為結果是有符號數,拓展位寬為18bit時拓展為18'h3fffe
wire [17:0]t2_en3 = t2_va0 + $signed(16'hffff);
//同上

wire signed[17:0]t2_en4 = t2_va0 - 16'h1;
//本質是'hffff-'h1,或者理解成'hffff+'hffff,加上一個負數位寬一定不需要高位拓展,所以結果是'hfffe
//再根據等號左側的需求拓展為18bit,無符號數拓展0,結果為18'fffe
wire signed[17:0]t2_en5 = t2_va0 - $unsigned(16'h1);
//同上

wire [17:0]t2_en6 = t2_va0 - 16'h1;
//同上
wire [17:0]t2_en7 = t2_va0 - $unsigned(16'h1);
//同上

圖片

再來補充一個,大家看看結果應該是啥:

wire [17:0]t2_en8 = t2_va0 - $signed(16'h1);

顯然結果應該是18'h3fffe,因為左側的運算結果是有符號數的16'hfffe,拓展成18bit時拓展符號位1:

圖片

最后呢再看一組額外的實驗,感興趣的可以分析一下結果:

//test
logic [1:0]va_u;
logic signed[1:0]va_s;

logic [2:0]vb_u;
logic [2:0]vb_s;

logic [31:0]vc_u;
logic [31:0]vc_s;

initial begin
va_u = -1;
va_s = -1;//signed
$display("va_u='b%0b, va_s='b%0b", va_u, va_s);
$display("va_u=%0d, va_s=%0d", va_u, va_s);

vb_u = -va_u;
vb_s = -va_s;
$display("vb_u='b%0b, vb_s='b%0b", vb_u, vb_s);
$display("vb_u=%0d, vb_s=%0d", vb_u, vb_s);

vc_u = va_u;
vc_s = va_s;
$display("vc_u='b%0b, vc_s='b%0b", vc_u, vc_s);
end

仿真的結果為:

va_u='b11, va_s='b11
va_u=3, va_s=-1
vb_u='b101, vb_s='b1
vb_u=5, vb_s=1
vc_u='b11, vc_s='b11111111111111111111111111111111
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 仿真器
    +關注

    關注

    14

    文章

    1017

    瀏覽量

    83721
  • Verilog
    +關注

    關注

    28

    文章

    1351

    瀏覽量

    110075
  • VCS
    VCS
    +關注

    關注

    0

    文章

    79

    瀏覽量

    9600
收藏 人收藏

    評論

    相關推薦

    關于verilog中的符號數和有符號數

    在數字電路中,出于應用的需要,我們可以使用符號數,即包括0及整數的集合;也可以使用有符號數,即包括0和正負數的集合。在更加復雜的系統中,也許這兩種類型的數,我們都會用到。 有符號數
    的頭像 發表于 11-18 17:46 ?1.7w次閱讀

    采集的數據轉換成有符號數的問題

    的時候怎么都不正確,具體原因如下,字符串轉數值的時候只發現可以轉換成符號數,而采集下來的數據是有符號數,轉換成符號數之后就無法正確顯示波
    發表于 05-02 11:55

    原碼、補碼、反碼、有符號數符號數概念.pdf

    原碼、補碼、反碼、有符號數符號數概念.pdf
    發表于 11-15 08:44

    符號數符號數,浮點數探討

    本帖最后由 hq1987 于 2015-4-29 11:52 編輯 對于符號數大家都基本理解,我主要說說有符號數,浮點數在機器世界里到底是怎么表示的。1、有符號數機器表示以16
    發表于 04-29 10:15

    關于符號數和有符號數的困惑

    ,存儲符號數)Tab = -4'd12;//整數Tab的十進制數為-12,位形式為110100.(因為Tab是整數寄存器變量,存儲有符號數)我的困惑是,-12的二進制補碼應該是10100,為什么這里寫成110100了?前面為啥
    發表于 11-02 14:13

    請問AFE5801 AD轉換后數字信號是用有符號數還是符號數表示?

    請問AFE5801 AD轉換后數字信號是用有符號數還是符號數表示的啊?
    發表于 05-24 08:04

    雙狀態符號/有符號數據類型

    雙狀態符號數據類型雙狀態有符號數據類型四狀態數據類型
    發表于 01-18 06:03

    符號數的平均數

    符號數的平均數文章目錄題目重述問題分析以及求解思路程序代碼題目重述試求內部RAM30H~37H單元中8個符號數的算術平均值,結果存入38H。問題分析以及求解思路待完善(請耐心等待
    發表于 12-01 08:01

    雙字節二進制符號數除法

    雙字節二進制符號數除法               
    發表于 01-19 22:44 ?2370次閱讀

    單字節符號數據塊排序(增序)

    單字節符號數據塊排序(增序)   入口條件:數據塊的首址在R0中,字節數在R7中。出口信息:完成排序(增序)影響資源
    發表于 01-19 22:58 ?1139次閱讀

    fpga 有符號數符號數

    ?在設計中,所有的算數運算符都是按照符號數進行的。如果要完成有符號數計算,對于加、減操作通過補碼處理即可用符號加法完成。對于乘法操作,
    的頭像 發表于 10-09 15:22 ?6067次閱讀
    fpga 有<b class='flag-5'>符號數</b>、<b class='flag-5'>無</b><b class='flag-5'>符號數</b>

    詳細分析Verilog編寫程序測試符號數和有符號數的乘法

    符號數的計算在 Verilog 中是一個很重要的問題(也很容易會被忽視),在使用 Verilog 語言編寫 FIR 濾波器時,需要涉及到有符號數的加法和乘法,在之前的程序中我把所有的
    的頭像 發表于 05-02 10:48 ?7503次閱讀
    詳細分析<b class='flag-5'>Verilog</b>編寫程序測試<b class='flag-5'>無</b><b class='flag-5'>符號數</b>和有<b class='flag-5'>符號數</b>的乘法

    基于空間相關性分析的符號數據分類

    基于空間相關性分析的符號數據分類
    發表于 06-09 14:41 ?8次下載

    C語言中符號數和有符號數的左移和右移

    。那么對于符號數和有符號數,對于左移和右移的操作分別是如何呢?下面通過實驗來進行驗證:對于符號數的左移和右移,代碼片段如下:void m
    發表于 01-13 13:17 ?2次下載
    C語言中<b class='flag-5'>無</b><b class='flag-5'>符號數</b>和有<b class='flag-5'>符號數</b>的左移和右移

    verilog中數據的符號屬性(有符號數符號數探究根源

    為了省流,還是先甩結論。有符號數符號數的最本質區別就是:符號位的識別和高位拓展。除此之外,另一個區別就是從人的角度如何如何讀這個數,或者
    的頭像 發表于 12-10 10:50 ?1544次閱讀
    <b class='flag-5'>verilog</b>中數據的<b class='flag-5'>符號</b>屬性(有<b class='flag-5'>符號數</b>和<b class='flag-5'>無</b><b class='flag-5'>符號數</b>)<b class='flag-5'>探究</b>根源
    主站蜘蛛池模板: xxnx日本| 久久久精品久久久久久| 99久久精品国产一区二区三区| 同时被两个男人轮流舔| 美女脱光app| 国产成人免费观看在线视频| 在线国产a不卡| 亚洲不卡一卡2卡三卡4卡5卡| 青青草伊人网| 蜜芽视频在线观看视频免费播放| 狠狠色丁香久久婷婷综合_中 | 国产香蕉视频| 公交车被CAO到合不拢腿| 99精品成人无码A片观看金桔| 亚洲精品国产高清嫩草影院 | 久久综合中文字幕佐佐木希| 娇妻归来在线观看免费完整版电影 | 亲嘴扒胸摸屁股视频免费网站| 欧美内射AAAAAAXXXXX| 女王羞辱丨vk| 日本理论片和搜子同居的日子2| 秋霞电影网午夜鲁丝片| 日本高清免费观看| 色妺妺免费影院| 天天爽夜夜爽| 亚洲精品有码在线观看| 伊人国产在线观看| 最近中文字幕完整版免费| 91久久精一区二区三区大全| blacked黑人战小美女| 超碰在线97av视频免费| 国产精品 日韩精品 欧美| 国产精品线路一线路二| 交换:年轻夫妇-HD中文字幕| 久久亚洲AV成人无码国产漫画 | 成人国产一区| 国产伦精品一区二区免费| 精品无码一区二区三区中文字幕 | 国产高清视频在线观看不卡v| 国精产品一区一区三区有限在线| 久久re视频这里精品免费1|