在verilog中整数常量的表示是比较复杂的,在这根据IEEE verilog 2005版标准做了一下梳理
两大基本格式
1. 十进制表示法,被视为有符号整数。
2. 基数表示法,<位宽><进制><数字>
1)无位宽和进制即十进制表示法,表示有符号整数。
2)<进制><数字>
3)<位宽><进制><数字>
关于x,z和?
x代表不确定值,z代表高阻,?是z的同意替换。x和z在16, 8和二进制中的解释分别是4位,3位和1位。其中10进制表示中不能包含x和z,除非整个10进制仅用一个x或z表示,代表每一位都是x或z。
关于填充
对于无符号整数,若给定数值位数小于指定尺寸则左边补0,若数值最左边是x或z则补x或z。若给定数值位数大于指定尺寸,则在左边进行截断。对于未指定尺寸的表示形式,至少填充到32位。
关于s标志
基数格式由一个“撇号+可选的s+基数指示字母”s指示数值解释成有符号整数还是有符号整数。例如4’[s]b1111加s代表数值为有符号整数解释成-1,不加s代表无符号整数解释成7,实际存储的二进制内容是不变的(尺寸范围内最高位为符号位其余位为数据位)。
s标志只影响对后面数值的解释,不影响数值的内容。
关于正负号
正负号应放在尺寸之前,放在数值前是不合法的语法。前为负号取数值的补码,如-4’b0011,指的是3的补码1101,ISE测试中将他赋给8位总线时赋值结果为1111_1101。实际标准中并没规定超过指定尺寸位数如何取值,实际应用中中应尽量让右值长度等于左值的长度。
在于s的组合中比较麻烦,文档给了这样一个例子:
-4 'sd15 // this is equivalent to -(-4'd 1), or '0001'
因此在解释有负号和s的基数时,要先根据尺寸内的最高位确定数值的符号,再按照负号的规则进行处理。
用ise进行综合测试
4’hf赋给8位的总线,赋值结果为{0000_1111}
4’shf赋给8位的总线,赋值结果为{1111_1111}}
-4’hf赋给8位的总线,赋值结果为{1111_0001};
-4’shf赋给8位的总线,赋值结果为{0000_0001}。
IEEE标准中有尺寸的负数和有尺寸的符号整数赋给寄存器时会进行负号拓展,而不管寄存器自身是否有符号的。IEEE标准未规定尺寸外的比特位如何处理,尺寸外的数值结果倾向于编译器的特性。S影响对数值的解释(即根据尺寸内最高符号位进行符号拓展),不影尺寸内比特位的结果,4’shf解释为-1所以最高位四位都是1。而负号则是最后处理的,对之前解释的值进行取补码( two's complement)操作,尺寸范围内的值是从低位截断的结果。
如果仅考虑尺寸内比特位的结果,则遇S不变化,遇负号各位取反再加1。为了避免意外结果,赋值时,整数应有足够的尺寸进行赋值。
Example 1—Unsized constant numbers
659 // is a decimal number
'h 837FF // is a hexadecimal number
'o7460 // is an octal number
4af // is illegal (hexadecimal format requires 'h)
Example 2—Sized constant numbers
4'b1001 // is a 4-bit binary number
5 'D 3 // is a 5-bit decimal number
3'b01x // is a 3-bit number with the least
// significant bit unknown
12'hx // is a 12-bit unknown number
16'hz // is a 16-bit high-impedance number
Example 3—Using sign with constant numbers
8 'd -6 // this is illegal syntax
-8 'd 6 // this defines the two's complement of 6,
// held in 8 bits—equivalent to -(8'd 6)
4 'shf // this denotes the 4-bit number '1111', to
// be interpreted as a 2's complement number,
// or '-1'. This is equivalent to -4'h 1
-4 'sd15 // this is equivalent to -(-4'd 1), or '0001'
16'sd? // the same as 16'sbz
Example 4—Automatic left padding
reg [11:0] a, b, c, d;
initial begin
a = 'h x; // yields xxx
b = 'h 3x; // yields 03x
c = 'h z3; // yields zz3
d = 'h 0z3; // yields 0z3
end
reg [84:0] e, f, g;
e = 'h5; // yields {82{1'b0},3'b101}
f = 'hx; // yields {85{1'hx}}
g = 'hz; // yields {85{1'hz}}
Example 5—Using underscore character in numbers
27_195_000
16'b0011_0101_0001_1111
32 'h 12ab_f001
最后关于下划线,放在数字中任何地方都可以,除了开头。