关系运算符的操作数位宽与类型匹配
使用关系运算符时,应尽可能保证两个操作数的位宽相等,或者使用unsigned或signed数据类型。
Verilog 关系运算符:> >= < <= == !=
1、隐式扩展问题
当关系运算符的操作数位宽不一致时,Verilog 会进行隐式扩展:
(1)如果操作数是无符号数,短操作数会在高位补 0。
(2)如果操作数是有符号数,短操作数会在高位补符号位。
(3)当表达式中同时存在无符号数和有符号数时,所有操作数会被当作无符号数处理,这会导致非预期的比较结果。
2、错误示例
// 4位有符号数和5位无符号数比较
reg signed [3:0] signed_val = 4'b1111; // 表示-1(有符号)
reg [4:0] unsigned_val = 5'b01111; // 表示15(无符号)
wire result;
assign result = signed_val > unsigned_val;
实际比较时,signed_val是有符号数,unsigned_val是无符号数,signed_val会被当作无符号数4'b1111(15),扩展为5位是5'b01111,和unsigned_val的5'b01111相等,所以result为0,但实际-1<15,计算结果错误。
3、正确做法
保证操作数位宽相等,进行显式扩展
reg signed [3:0] signed_val = 4'b1111; // 表示-1(有符号)
reg [4:0] unsigned_val = 5'b01111; // 表示15(无符号)
wire result;
assign result = {signed_val[3], signed_val} > unsigned_val;