这次在进行lint检查时,出现了关于$signed函数的使用警告,基于此点,给自己把$signed的应用整理记录在此。
在硬件中,都是二进制数,但是在实际的使用中经常使用的是有符号数,就是一个数是有正负之分。verilog语言给我们提供了方便设计者的有符号数处理的函数$signed,这也依赖于我们的编译器能识别并正确的解释该函数。该函数存在以下几方面的使用和注意事项。
1 数据类型的声明
在定义一个有符号变量时,直接在定义时声明,在之后的使用中不用在该变量前加上$signed。
wire signed [2:0] data_a;
reg signed [3:0] data_b;
如果定义的变量没有声明为有符号数,在使用过程中需要做有符号数运算时,需要在该变量前加上$signed。
wire [3:0] data_c;
wire signed [4:0] data_d;
assign data_d = $signed(data_c)+$signed(-3'd2);
定义有符号数变量的最小位宽为2bit,因为1bit无法表示符号位和数值位。
如果一个变量已经被定义为有符号数,在调用时还在该变量前加了$signed,则在lint检查时会报warning。
2 加、减、乘运算
运算的操作数都是$signed的才会进行有符号运算,否则按照无符号数进行运算。
3 移位操作
有符号数移位操做后会成为无符号数。
4 位扩展和截短操作
对有符号数进行截短操作后获得一个无符号数,对一个有符号数进行位扩展需要考虑是向左还是向右进行扩展,但一般多用于向左扩展符号位,保留其有能号数的性质。
5 参考链接
数字IC秋招面试专题(二)verilog的signed和unsigned_verilog $signed-CSDN博客总
写在最后,记住输入是什么样子,明确需要的结果是什么,就会时刻记住数据的正确格式和类型。