FPGA组合逻辑设计技巧分享4

文章来源:FPGA入门到精通

关系运算符的操作数位宽与类型匹配

使用关系运算符时,应尽可能保证两个操作数的位宽相等,或者使用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;