首页 > 其他分享 >verilog的signed和unsigned

verilog的signed和unsigned

时间:2022-10-06 17:12:29浏览次数:77  
标签:din 运算 unsigned signed dout1 verilog assign

数字IC秋招面试专题(二)verilog的signed和unsigned


前言

如果用verilog做一些数据处理的话,一定会经常用到signed和unsigned,而其中有一些知识点很多人都不太关注,故在此总结一下

一、右值按signed还是unsigned

  • 1、一条运算究竟是按unsigned还是signed运算,取决于其右值的操作数是否含有unsigned变量,只要右值存在unsigned变量,整个操作就会按unsigned处理,否则必须要右值全是signed变量,整个操作才按signed处理。
  • 例如:
reg signed [7:0] din;
integer dou1,dou2;
initial 
	din = -5;
assign dout1 = din + 1;
assign dout2 = din + 1'b1; 

此处dout1= -5 + 1 = -4,因为din为signed变量,不做特定描述的常数也为signed,所以dout1的结果为正确的有符号结果。
而dout2 = -5 + 1’b1 = 251 + 1’b1 = 252,因为1’b1默认为unsigned,所以-5会被转换到unsigned类型再进行运算。

  • 2、如果对signed进行截位运算,那么即使是signed变量,截位后也会变成unsigned变量
  • 例如
reg signed [7:0] din;
integer dou1,dou2;
initial 
	din = -5;
assign dout1 = din[6:0];
assign dout2 = din[7:0]; 

此处dout1=7b,因为只截取了111_1011,不会管有没有符号位,而dout2即使把符号位都截取了,也是fb。

二、signed的自动扩位

如果是signed运算会先扩展到右值中最大的位宽再参与运算,例如

reg signed [7:0] a,b;
reg signed       c;
integer dout;
initial begin 
	a = 1;
	b = 2;
end
assign dout = a + b + c;

这里c会先扩展为8位,再参与运算,光这么看好像没什么问题,但是如果c=1时,扩位后c=1111_1111。计算后肯定不符合理论值,其原因就是1bit的数无法同时表示sign和value,所以通常会手动补上符号位:

assign dout = a + b + {1'b0,c};

三、系统函数$signed 和 $unsigned

在verilog中可以通过$signed函数对一个unsigned变量在运算过程中作为signed变量处理,例如上文说的

reg signed [7:0] din;
integer dou1,dou2;
initial 
	din = -5;
assign dout1 = din + 1;
assign dout2 = din + $signed(1'b1); 

如果对1’b1使用$signed,那么dout1和dout2的值会一样,都是-4。

而$unsigned函数,虽然存在,但是经测试其没有什么实质作用,对一个signed变量,其不能自动对一负值转换成绝对值。


总结

  1. 只有当右值全为signed,计算才会按signed完成;否则,右值又要存在unsigned数,就按unsigned处理;
  2. 不论是对signed还是unsigned数进行截位,截位后的数据都是unsigned;
  3. 当右值位数不等时进行运算,小位宽数会先扩位到大位宽再参与运算;扩位按最高位进行扩,所以要尤其注意正负
  4. 如果在signed和unsigned计算中不想过分考虑扩位截位等逻辑,可以用$signed()函数来简化。



搜索关注我的微信公众号【IC墨鱼仔】,获取我的更多IC干货分享!
在这里插入图片描述

标签:din,运算,unsigned,signed,dout1,verilog,assign
From: https://www.cnblogs.com/amxiang/p/16758015.html

相关文章

  • unsigned和signed的转换
    一直以来,关于在overflow和underflow这方面,自己都没有怎么去关注。最近看了CSAPP,然后又在这方面吃了几次亏,比如使用C++中的vector,vector.size() 返回的就是unsigned。所以,......
  • verilog中结构说明语句
    结构说明语句Verilog语言中的任何过程模块都从属于以下四种结构的说明语句。1)initial说明语句2)always说明语句3)task说明语句4)function说明语句initial和alwa......
  • Verilog 基本语句
    VerilogHDL语句包括过程语句、块语句、赋值语句、条件语句、循环语句、编译导向语句等。类别语句赋值语句持续赋值语句:assign过程赋值:=,<=块语句串行......
  • verilog行为级描述与结构级描述
    verilog行为级描述与结构级描述1、在使用verilog描述电路时,既可以进行行为级的描述,也可以进行结构级的描述。(1)行为级描述:侧重对模块行为功能的抽象描述。(......
  • verilog实现rgb2gray
    前言  项目算法需求,需要将RGB彩色图像转换为灰度图像,算法原理是很简单的,但是对于刚接触FPGA的宝宝来说,进行时序的设计和调试还是不那么容易的,为了省事儿,就按照上一篇中值......
  • Program Block-systemverilog
    systemverilog中的ProgramBlock与module有些类似,但module是基于硬件思想,ProgramBlock纯粹是为了仿真。如果不熟悉program,可以不用program.Theprogramblockservesth......
  • systemverilog中的静态变量static和动态变量automatic
    本文参考:SystemVerilog静态变量和动态变量_行走的BUG永动机的博客-CSDN博客_systemverilog静态变量和动态变量systemverilog之Automatic-腾讯云开发者社区-腾讯云(ten......
  • Verilog——任务task的调用
    参考自以下链接处:http://t.csdn.cn/4ws4t下面直接看代码,代码中会有注意事项。`timescale1ns/10psmoduletraffic_lights;regclk;reg......
  • Systemverilog之SVA(一)
     前言systemverilogassertion作为systemverilog引入的重要特性,在功能仿真及形式验证中有着重要的作用。相较于Verilog传统的checker,SVA作为声明性的语言,使用简单易于管......
  • SystemVerilog断言(一)
    摘要SystemVerilog断言(SVA)可以直接添加到RTL代码中,也可以通过bindfiles间接添加。实践表明,最好使用bindfiles添加大多数断言。这篇论文将解释为什么将断言直接添加到RTL......