minu - subs /minu +sub
输入 | 1测试例 | 2测试例 | 3测试例 |
A | 111 | 010 | 010 |
B | 010 | 111 | 110 |
A-B resu0 | 101 正常 | 011 | 100 |
A-B 带1bit溢出resu1 | 0101 正常 | 1011 | 1100 |
A+B ad_re0 | 001 | 001 | 000 |
A+B带1bit溢出 ad_re1 | 1001 | 1001 | 1000 |
分析 无符号数 | A>B 减法ok; 加法也ok, 有溢出得到实际值7+2=9; | A<B 2-7=-5,结果按照有符号数计算,得到2+8-5=3;得到011,减法溢出,有借位标志1,1011; 即-5的补码 1011 | 2-6=-4; 2+8-6=4;得到4 有借位标志; -4的补码 1100
|
一个问题:verilog中
a-(~b) 和 c = ~b, a - c 计算结果不一样;
测试代码:
module test
(
//test 1
//input sys_clk ,
//input soft_rst_n ,
input [2:0] minu ,
input [2:0] subs ,
output [2:0] resu0 ,
output [3:0] resu1 ,
output [3:0] resu2 ,
output [3:0] resu3 ,
output [2:0] ad_re0 ,
output [3:0] ad_re1
);
wire [2:0] subs_inv ;
assign subs_inv = ~subs ;
assign resu0 = minu - subs; //a-b
assign resu1 = minu - subs; //a-b带进位
assign resu2 = minu - (~subs) ; //a-(~b)带进位
assign resu3 = minu - subs_inv ; //a - b_inv ; b_inv = ~b ; 带进位
assign resu2_1 = minu - (~subs) ; //a-(~b)无带进位
assign resu3_1 = minu - subs_inv ; //a - b_inv ; b_inv = ~b ; 无进位
assign ad_re0 = minu+subs;
assign ad_re1 = minu+subs;
endmodule
代码如上;
resu2和resu3 结果不同;
RTL 图:
减去反码,带进位,不带进位RTL图:
图中 resu2 , resu3直接就是一个adder;
不带进位的resu2_1, resu3_1,这两个是一样的;
assign resu2 = minu - (~subs) ; 对应 Add2;
wire [2:0] subs_inv ;
assign subs_inv = ~subs ;
assign resu3 = minu - subs_inv ; 对应 Add3
上述的计算结果不一样:
总结:写完代码,减法的的结果看下RTL 视图,最好仿真自测验证一下;