作为博客小白,这是我的第一篇帖子。我就分享一下今天浪费了我一早上获得的小知识点。
先看下面的代码:
wire[43:0] sc[6:0];
wire[55:0] c[6:0];
wire[55:0] c1[6:0];
wire[55:0] c2,c3;
assign c1[0]=720*sc[0];
assign c1[1]=80*sc[1];
assign c1[2]=240*$signed(sc[2]);
assign c1[3]=6 *sc[3];
assign c1[4]=10*$signed(sc[4]);
assign c1[5]=16*$signed(sc[5]);
assign c1[6]=720*sc[6];
assign c2=c1[0]+c1[1]+c1[2]-c1[3]-c1[4]-c1[5]+c1[6];
assign c3=720*sc[0]+80*sc[1]+240*$signed(sc[2])-6 *sc[3]-10*$signed(sc[4])-16*$signed(sc[5])+720*sc[6];
按理说的得到的c2和c3值应该是相等的,但是事实上并不是这样的。如果上面所涉及到的数字都是正数的话得到的值是相等的,但是一旦涉及到负数,结果就会不一样。为了区别两种计算方法,我将字体的颜色分别设置为红色和蓝色。红色部分的计算方式不管是正数或者负数,计算的结果都会是正确的。但是蓝色部分计算负数时却会出错,这是因为这个长的赋值运算的计算顺序是先将各个乘