在写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