Verilog系列:常量位宽不指定导致的异常
在进行Verilog设计时经常会遇到多位数常量的使用,常用的描述方式如下:
<size>'<base><value>
'<base><value>
其中size指定了数据的位宽,base指定了数值采用的进制,value是对应进制的具体数值。
为了减小设计人员的负担,常常允许设计人员在描述常量时可以省略数值(<base>)描述符前的具***宽数值(<size>),但是当使用不同仿真工具时可能出现与期望不一致的结果,那么具体情况到底是什么呢,请看下文。
【示例】
使用仿真器的版本如下:
NCSIM(Cadence):14.20-2014
VCSMX(Synopsys):K-2015.09-SP2-3
【使用NCSIM进行仿真的结果】
其中的sig1采用了省略数据宽度的描述方式,结果sig1中的值为只有32位有效数据“32'hAAAA_AAAA”,而期望sig1的高32位有效数据为全0.sig2中明确指定了数据宽度和数制等信息,所以输出的是完整的64位有效数据。sig3采用了省略数据宽度的写法,因为其有效数据只有8位,所以仅输出有效的8位数据。sig4省略了数据宽度和数制,这样的写法可以使数据的所有位均为指定的数值,因为这种写法保证所有数据位都为相同的数值,所以这里指定的数值必须具有1位的属性,即这里指定的数值只能是“0,1,x,X,z,Z”。
【使用VCSMX进行仿真的结果】
其中仿真器对于sig1和sig2的处理结果一致,sig3和sig4的处理方式同上例.通过上述两个仿真结果可以观测到,不同的仿真工具对于sig1处理结果产生了差异,主要是不同的EDA工具对于IEEE中未指定位宽常量的处理方式不一致导致的,具体IEEE中描述如下:
因此,不同仿真工具对于IEEE的上述描述理解不同,可能会导致仿真结果与期望不一致,所以在具体设计中对于数值常量一定要明确指定位宽,尽量将所有的常量信息都明确的指出,这样可以保证设计意图的正确性和确定性.