记录今日新发现,关于带符号数据的赋值问题。
在组合逻辑中,等号两端数据type类型要相同,即同为signed型或unsigned型
在时序电路中,等号两端数据type类型可以不同,signed或unsigned都可以
wire [1:0] a,b;
wire signed [1:0] c,d;
assign a=b; //合法
assign c=d; //合法
assign c=a; //非法
assign a=c; //非法
reg signed [1:0] e,f;
always@(*) begin
e=a; //非法
e=c; //合法
end
reg signed f,h;
always@(posedge clk) begin
f <= a; //合法
h <= c; //合法
end
另外,在组合逻辑中,两个完全相同的array,可以直接赋值相连
wire [1:0] arr_1 [0:1];
wire [1:0] arr_2 [0:1];
assign arr_2 = arr_1; //合法
切记:
在赋值过程尽量保证两边的位宽相等,尤其是有符号数据;
在赋值过程尽量保证两边的位宽相等,尤其是有符号数据;
在赋值过程尽量保证两边的位宽相等,尤其是有符号数据;
若赋值两边的数据位宽不相等,则直接按照位宽取低比特方向的数据,不会对符号位进行特殊处理,即可能会出现“原本是负数,赋值之后变成正数”的情况,
所以,如果要进行非等位宽且有符号的数据时,且多位宽赋值给少位宽,需要进行符号位的判断,然后进行特殊的赋值处理,而不能单纯的直接进行赋值。
如果是少位宽赋值给多位宽,则不需要特殊处理。
如图:
总结如下:
1、少位宽数据赋值多位宽,根据少位宽是否有符号进行区分,若有符号,则结果按照有符号计算,若无符号,结果按照无符号计算;
2、多位宽赋值给少位宽,不进行符号区分,直接将多位宽数据中与少位宽位数相同的低比特数据赋值给少位宽数据;