微信公众号:FPGA动力联盟
在verilog-2001中,除非明确声明为有符号数,否则 reg、wire等数据类型应被视为无符号数,而integer整数变量若无明确声明,应被视为有符号数,且在verilog中有符号数应使用二进制补码表示。
但是我们应当切记,有符号和无符号数之间的转换应保持相同的位值,只是编译器的解释发生了变化。
下表列出了每种数据类型的默认数据类型:
数据类型 | 解释 |
unsigned net | Unsigned |
signed net | Signed,二进制补码 |
unsigned reg | Unsigned |
signed reg | Signed,二进制补码 |
integer | Signed,二进制补码 |
time | Unsigned |
real,realtime | Signed, floating point |
下面示例展示了将“-12除以3”的各种方法——在表达式中使用 integer 和 reg 数据类型。这些用法都是在实际工程中,我们往往一不小心就会踩的坑……
integer intA;
reg [15:0] regA;
reg signed [15:0] regS;
intA = -4’d12;
regA = intA / 3; // expression result is-4, intA is an integer data type, regA is 65532
regA = -4’d12; // regA is 65524
intA = regA / 3; // expression result is21841,regA is a reg data type
intA = -4’d12 / 3;// expression result is1431655761.-4’d12 is effectively a 32-bit reg data type
regA = -12 / 3; // expression result is -4,-12 is effectively an integer data type. regA is 65532
regS = -12 / 3; // expression result is -4.regS is a signed reg
regS = -4’sd12 / 3;// expression result is1. -4’sd12 is actually 4. The rules for integer division yield 4/3==1
参考文献:
1,IEEEverilog-2001 标准