先上结论 : assign C= ~B;
assign resu =A -C -D;
和直接 assign resu = A- (~B) - D 综合结果不一样 ,仿真结果不一样;
代码如下:
module test
(
//test 1
//input sys_clk ,
//input soft_rst_n ,
input [2:0] minu1 ,
input [2:0] subs1 ,
input [2:0] subs1_1 ,
input [2:0] minu2 ,
input [2:0] subs2 ,
input [2:0] subs2_1 ,
output [2:0] resu1 ,
output [4:0] resu1_carry ,
output [2:0] resu2 ,
output [4:0] resu2_carry ,
output [2:0] subs1_inv ,
output [2:0] subs2_inv
);
//wire [2:0] subs_inv ;
assign subs1_inv = ~subs1 ;
assign subs2_inv = ~subs2 ;
assign resu1_carry = minu1 - (~subs1) - subs1_1 ;
assign resu2_carry = minu2 - subs2_inv - subs2_1 ;
assign resu1 = minu1 - (~subs1) - subs1_1 ;
assign resu2 = minu2 - subs2_inv - subs2_1 ;
endmodule
仿真测试结果:
RTL视图:
可以看到,带进位的结果,综合的电路不一样:
直接写的resu1_carry 结果和resu2_carry结果电路不同:
resu1_carry的电路分两部分:
简单说就是d = a- (~b)-c ;
总图:
而:
b_inver = ~b
d= a-b-c:综合的结果就是:
可以看到第二个加法器不一样了;
第一个步的加法器综合结果一样:
无论是d = a- (~b)-c ,还是 b_inver = ~b ,d= a-b-c;
第一个加法器都是一样的;,n是位宽,a b c位宽;
都是sum = (a*2+1)+(b*2+1+2^(n+1))/2 = a+b+2^n; sum是(n+1)位宽的数据
第二个加法器中
直接写的减c,形式:
sum[n-1:0]+1+(~sum[n] )*2^(n+1)+ { (~c) +1 + ( 2^(n+1)+2^(n+2) ) } / 2
先取反有inver中间变量的:
最后结果:
sum[n-1:0]+1+ sum[n] *( 2^(n+1)+2^(n+2) ) + { (~c) +1 + ( 2^(n+1)+2^(n+2) ) } / 2
所以最后的结果不一样了:
仿真结果 b_inver = ~b ,d= a-b-c; 使用中间变量的符合预期,而直接写a-(~b)-c的不符合预期;