verilog对信号取相反数,小于32位需要经过寄存器

结论:

对信号(signal)取相反数,如果信号位宽小于32位,直接使用~signal+1进行操作,是不对的。

如果位宽大于等于32位宽,直接使用~signal+1进行操作,是没有问题的。

如:

//伪代码
wire [23:0]signal;
wire       a;
wire [23:0]b = 4000;
assign a = (~signal + 1 > b) ? 1 : 0

此时a将会一直为1。

因为信号位宽小于32,~signal + 1将会用1补足32位。

解决办法,加一个24位宽的寄存器存储。

//伪代码
wire [23:0]signal;
wire       a;
wire [23:0]b = 4000;
wire [23:0]signal_fan;

assign signal_fan = ~signal + 1;
assign a = (signal_fan> b) ? 1 : 0

always @(*) begin
    $display("signal_fan = %b,~signal + 1 = %b",signal_fan,~signal + 1);
end

编写相应的tb文件,打印出来的结果如下图所示:

将位宽变为33,结果如

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值