Verilog中整数取反的溢出问题

在Verilog编程中,直接位取反加1处理整数可能会导致溢出问题,例如4bit的-8(1000)取反后仍为-8。原因是补码表示下,0000和1000都表示0,但1000表示-8。解决方法是手动判断并修正,或将超出范围的负数转换为正数的最小值。本文通过一个简单的测试案例帮助理解和避免此类溢出。
摘要由CSDN通过智能技术生成

        在写Verilog代码中,常常会将一个整数取反(将定点化后的数也视为整数,因为操作一致),通常的做法是:step1:位取反;step2:+1。

        但在写代码的过程中发现了,这样会存在溢出的问题。比如对一个4bit的数-8(二进制1000)取反+1后依旧是-8(1000),这样便是取反溢出了。究其原因,我觉得是因为0000和1000都是表示0的,但在补码中让1000表示了-8导致的,所以需要人为多进行一步判断,将-8变为+7(因为最大只能表示到+7)。

        或者可以理解为符号位为1,但8的二进制1000无法用3bit数据表示,所以进行了截位,-8也按此思路理解。

以下是我写的一个简单的测试文件,帮助记忆和理解。

module tb_QuFan();

reg     [3:0]  Test_A;
wire     [3:0]  Test_A_F;
assign Test_A_F = ~Test_A + 4'd1;

parameter clk_period=10; 
parameter clk_half_period=clk_period/2;    
initial begin
    Test_A = -4'd8;
#(5*clk_period)
    Test_A = 4'd7;
#(5*clk_period)   
    Test_A = 4'd0;
#(5*clk_period)
    Test_A = -1;
#(5*clk_period)
        Test_A = -1;
#(5*clk_period)        
    $stop
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值