Verilog-2001中的signed的理解
一、Verilog四值逻辑
0
1
X:未知,亚稳态
Z:高阻,三态,无驱动
二、常数
整数
实数
字符串:双引号括起的8位ASCII码值
parameter:参数,仅定义模块有效
`define:全局定义,所有模块有效
1、整数
(1)十进制表示法:可表示有符号数
(2)基数表示法:符号 长度'进制 数。表示无符号数
2、实数
(1)十进制表示法
(2)科学计数法
三、变量
(1)线网型变量(一般为无符号数)
wire tri
(2)寄存器型变量(一般为无符号数)
reg:一般表示无符号数,但在Verilog-2001中可被signed修饰,表示为有符号数
integer:一般表示32位有符号数
四、signed
在verilog中有时会用signed修饰符来修饰定义的数据,运算的时候也会用$signed()任务来强制转换数据,signed的真正作用是决定如何对操作数扩位的问题。
verilog中的加法和乘法操作前,会先对操作数据扩位成结果相同的位宽,然后进行加法或者乘法处理。比如a/b都为4位数据,c为5位数据,c = a + b,这个运算的时候会先把a和b扩位成5位,然后按照无符号加法进行相加。a/b没有被signed修饰的时候会按照无符号数的扩位方式进行扩位,即高位补0,加法的结果当然也是a、b为无符号数相加的结果。
如果想把a、b作为有符号数来相加,那么就得在a/b数据定义的时候用signed修改,或者在计算的时候用$signed()来修饰,这样在c = a + b,这个运算开始的扩位就会按照有符号数的方式进行扩位,在高位补符号位,加法得出的结果就是a、b视为有符号数的结果。当然c要视为有符号数据。
参考: