verilog符号数问题主要涉及【常数】、【变量】、【运算符】。
一、整型数
1、十进制数
普通十进制数一律被认为是有符号数,如
32 //有符号数
-15 //有符号数
2、基数格式的表示法
基数格式表示情况下,数的符号要明确声明,如
8'sh51 //8位有符号数01010001
6'so72 //6位有符号数111010,即十进制数下的-6
对于未声明符号位的,按无符号数处理
4'd2 //4位无符号数
'hAF //32位16进制数,无符号。注意未声明长度的,统一按32位长度处理
二、变量
当将一个常数赋值给某个变量时,仿真器如何解释这个常数的值,最终取决于这个变量的符号形式,此时常数的符号仅仅决定常数的各位取1还是0而已。
将一个有符号常量赋值给一个无符号变量可能会出现意想不到的结果。
reg [5 : 0] burst_data;
burst_data = -4'd12;//-4'd12转换成二进制数为110100,而burst_data为无符号reg型变量,
//所以最终将储存在其中的二进制数翻译成52
作为对比有:
integer burst_data;
burst_data = -4'd12;//-4'd12转换成二进制数为110100,integer为有符号型整形变量,
//所以最终将储存在其中的二进制数翻译成有符号数-12
下面对常用变量类型的符号情况做一下总结。
1、wire
wire型变量要明确声明其符号。
wire [signed] [[msb:lsb]] net1;
2、reg
reg型变量要明确声明其符号。
reg [signed] [[msb:lsb]] reg1;
3、integer
integer型变量不必也不允许声明符号,其中存储的二进制数本身就代表有符号数。
integer interger1;
三、算数操作符
在一个表达式中混合使用有符号操作数和无符号操作数时,必须非常小心。
只要有一个操作数时有符号的,在运算开始前,所有其他的操作数都被转换成了无符号数。
'd2+4'sb1001//第一个操作数为无符号数,第二个操作数为有符号数,故第二个数被认为是无符号数9,结果为9+2=11
为了完成有符号数的运算,可以使用 $signed 和 ¥unsigned系统函数控制操作数的符号行为。
$signed('d2)+4'sb1001 //-5