你没看注释,datac不是这样表征的,datac[7] 是溢出位,datac[6:0]是差的绝对值,是正数,不存在补码的问题。
我能理解你的想法,但是我综合的结果里,并没有出现你所谓的32位,可见综合工具是完全可以给优化的。你没仔细看我在二楼三楼的留言,你建议什么不重要,重要的是综合工具对代码编译后产生的电路是什么。在这方面,做编译工具的公司已经作了很多工作,他已经做了的,你没必要非得自己去从底层实现,这是做硬件出身的后遗症。这个电路无非就是一个组合逻辑,用两个八位数,产生一个八位数。你需要的是一个结果,而不是非得用你自己喜欢的方式,如果是那样,你干脆用MOS管设计好了,更有成就感。
下边是我的综合结果:
module gen_diff ( dataa, datab, datac );
input [7:0] dataa;
input [7:0] datab;
output [7:0] datac;
wire n17, n18, n19, n20, n21, n22, n23, n24, n25, n26, n27, n28, n29, n30,
n31, n32, n33, n34, n35, n36, n37, n38, n39, n40, n41, n42, n43, n44,
n45, n46, n47, n48, n49, n50, n51, n52, n53, n54, n55, n56, n57, n58,
n59, n60, n61;
xo2_lp U20 ( .A(n17), .B(n18), .Y(datac[7]) );
mx2i_lp U21 ( .D0(n19), .D1(n20), .S(n21), .YN(n18) );
ao21_lp U22 ( .A(n22), .B(n23), .C(n24), .Y(n17) );
xn2_lp U23 ( .A(n25), .B(n23), .Y(datac[6]) );
xn3_lp U24 ( .A(datab[6]), .B(dataa[6]), .C(n26), .Y(n23) );
nr2_lp U25 ( .A(n22), .B(n24), .Y(n25) );
nr2b_lp U26 ( .AN(n27), .B(n28), .Y(n22) );
xo2_lp U27 ( .A(n29), .B(n28), .Y(datac[5]) );
xo3_lp U28 ( .A(datab[5]), .B(dataa[5]), .C(n30), .Y(n28) );
nr2_lp U29 ( .A(n27), .B(n24), .Y(n29) );
nr2b_lp U30 ( .AN(n31), .B(n32), .Y(n27) );
xo2_lp U31 ( .A(n33), .B(n32), .Y(datac[4]) );
xo3_lp U32 ( .A(datab[4]), .B(dataa[4]), .C(n34), .Y(n32) );
nr2_lp U33 ( .A(n31), .B(n24), .Y(n33) );
nr2b_lp U34 ( .AN(n35), .B(n36), .Y(n31) );
xo2_lp U35 ( .A(n37), .B(n36), .Y(datac[3]) );
xo3_lp U36 ( .A(datab[3]), .B(dataa[3]), .C(n38), .Y(n36) );
nr2_lp U37 ( .A(n35), .B(n24), .Y(n37) );
nr2b_lp U38 ( .AN(n39), .B(n40), .Y(n35) );
xo2_lp U39 ( .A(n41), .B(n40), .Y(datac[2]) );
xo3_lp U40 ( .A(datab[2]), .B(dataa[2]), .C(n42), .Y(n40) );
nr2_lp U41 ( .A(n39), .B(n24), .Y(n41) );
nr2_lp U42 ( .A(n43), .B(datac[0]), .Y(n39) );
xo2_lp U43 ( .A(n44), .B(n43), .Y(datac[1]) );
xn3_lp U44 ( .A(datab[1]), .B(dataa[1]), .C(n45), .Y(n43) );
nr2b_lp U45 ( .AN(datac[0]), .B(n24), .Y(n44) );
mx2_lp U46 ( .D0(n20), .D1(n19), .S(n46), .Y(n24) );
ao21_lp U47 ( .A(n47), .B(n21), .C(n48), .Y(n46) );
oa21_lp U48 ( .A(n26), .B(n49), .C(n50), .Y(n21) );
scg6_lp U49 ( .A(n49), .B(n26), .C(datab[6]), .Y(n50) );
iv_lp U50 ( .A(dataa[6]), .Y(n49) );
scg9_lp U51 ( .A(n30), .B(n51), .C(n52), .Y(n26) );
scg6_lp U52 ( .A(n51), .B(n30), .C(datab[5]), .Y(n52) );
iv_lp U53 ( .A(dataa[5]), .Y(n51) );
scg9_lp U54 ( .A(n34), .B(n53), .C(n54), .Y(n30) );
scg6_lp U55 ( .A(n53), .B(n34), .C(datab[4]), .Y(n54) );
iv_lp U56 ( .A(dataa[4]), .Y(n53) );
scg9_lp U57 ( .A(n38), .B(n55), .C(n56), .Y(n34) );
scg6_lp U58 ( .A(n55), .B(n38), .C(datab[3]), .Y(n56) );
iv_lp U59 ( .A(dataa[3]), .Y(n55) );
scg9_lp U60 ( .A(n42), .B(n57), .C(n58), .Y(n38) );
scg6_lp U61 ( .A(n57), .B(n42), .C(datab[2]), .Y(n58) );
iv_lp U62 ( .A(dataa[2]), .Y(n57) );
ao21_lp U63 ( .A(n45), .B(dataa[1]), .C(n59), .Y(n42) );
scg20_lp U64 ( .A(dataa[1]), .B(n45), .C(datab[1]), .Y(n59) );
xo2_lp U65 ( .A(dataa[7]), .B(datab[7]), .Y(n19) );
nr2b_lp U66 ( .AN(n47), .B(n48), .Y(n20) );
nr2_lp U67 ( .A(n60), .B(datab[7]), .Y(n48) );
nd2_lp U68 ( .A(datab[7]), .B(n60), .Y(n47) );
iv_lp U69 ( .A(dataa[7]), .Y(n60) );
oa21_lp U70 ( .A(datab[0]), .B(n61), .C(n45), .Y(datac[0]) );
nd2_lp U71 ( .A(datab[0]), .B(n61), .Y(n45) );
iv_lp U72 ( .A(dataa[0]), .Y(n61) );
endmodule |