verilog $signed()特性【易错】

关于有、无符号数之间的运算,经常会混淆,特此记录。

运算规则有以下几条:

  • 两个有符号数运算,结果是有符号数。
  • 两个无符号数运算,结果是无符号数。
  • 一个有符号数和一个无符号数运算,如果结果位宽>操作数位宽,由于操作数中存在无符号数,会默认将有符号数0扩展到结果位宽,再运算(相当于做了无符号运算);如果结果位宽=操作数位宽,由于不需要扩位,此时可以实现有符号与无符号运算。

根据上述规则,需要注意的易错点:

wire [ 7:0] a,b;
wire [15:0] c;
assign c = a*b;//两个无符号数相乘得到无符号结果
assign c = $signed(a)*$signed(b);//两个有符号数相乘得到有符号结果
assign c = $signed(a)*b;//结果是无符号数
assign c = $signed(a*b);//这种写法,会先做两个无符号数相乘,得到无符号数c_unsigned,然后$signed(c_unsigned),要注意这种写法与$signed(a)*$signed(b)是不等价的

如果想做一个有符号数和一个无符号数运算,并得到有符号结果,可以手动将无符号操作数做零扩展至结果位宽,然后使用$signed()函数将运算变为有符号运算。

wire [ 7:0] a,b;
wire [15:0] c;
assign c = $signed(a)*$signed({8'h0,b});//结果是有符号数

如果结果位宽与操作数位宽相同,则可以这样写:

wire [7:0] a,b;
wire [7:0] c;
assign c = $signed(a)*b;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值