mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-03 21:09:12 +00:00 
			
		
		
		
	xilinx: do not make DSP48E1 a whitebox for ABC9 by default (#2325)
* xilinx: eliminate SCCs from DSP48E1 model * xilinx: add SCC test for DSP48E1 * Update techlibs/xilinx/cells_sim.v * xilinx: Gate DSP48E1 being a whitebox behind ALLOW_WHITEBOX_DSP48E1 Have a test that checks it works through ABC9 when enabled
This commit is contained in:
		
							parent
							
								
									81348d2dce
								
							
						
					
					
						commit
						de79978372
					
				
					 3 changed files with 102 additions and 17 deletions
				
			
		| 
						 | 
				
			
			@ -3014,8 +3014,12 @@ endmodule
 | 
			
		|||
// Virtex 6, Series 7.
 | 
			
		||||
 | 
			
		||||
`ifdef YOSYS
 | 
			
		||||
(* abc9_box=!(PREG || AREG || ADREG || BREG || CREG || DREG || MREG),
 | 
			
		||||
   lib_whitebox=!(PREG || AREG || ADREG || BREG || CREG || DREG || MREG) *)
 | 
			
		||||
(* abc9_box=!(PREG || AREG || ADREG || BREG || CREG || DREG || MREG)
 | 
			
		||||
`ifdef ALLOW_WHITEBOX_DSP48E1
 | 
			
		||||
   // Do not make DSP48E1 a whitebox for ABC9 even if fully combinatorial, since it is a big complex block
 | 
			
		||||
   , lib_whitebox=!(PREG || AREG || ADREG || BREG || CREG || DREG || MREG || INMODEREG || OPMODEREG || ALUMODEREG || CARRYINREG || CARRYINSELREG)
 | 
			
		||||
`endif
 | 
			
		||||
*)
 | 
			
		||||
`endif
 | 
			
		||||
module DSP48E1 (
 | 
			
		||||
    output [29:0] ACOUT,
 | 
			
		||||
| 
						 | 
				
			
			@ -3503,11 +3507,15 @@ module DSP48E1 (
 | 
			
		|||
                if (OPMODEr[3:2] != 2'b01) $fatal(1, "OPMODEr[3:2] must be 2'b01 when OPMODEr[1:0] is 2'b01");
 | 
			
		||||
`endif
 | 
			
		||||
            end
 | 
			
		||||
            2'b10: begin X = P;
 | 
			
		||||
            2'b10:
 | 
			
		||||
                if (PREG == 1)
 | 
			
		||||
                    X = P;
 | 
			
		||||
                else begin
 | 
			
		||||
                    X = 48'bx;
 | 
			
		||||
`ifndef YOSYS
 | 
			
		||||
                if (PREG != 1) $fatal(1, "PREG must be 1 when OPMODEr[1:0] is 2'b10");
 | 
			
		||||
                    $fatal(1, "PREG must be 1 when OPMODEr[1:0] is 2'b10");
 | 
			
		||||
`endif
 | 
			
		||||
            end
 | 
			
		||||
                end
 | 
			
		||||
            2'b11: X = $signed({Ar2, Br2});
 | 
			
		||||
            default: X = 48'bx;
 | 
			
		||||
        endcase
 | 
			
		||||
| 
						 | 
				
			
			@ -3529,20 +3537,36 @@ module DSP48E1 (
 | 
			
		|||
        case (OPMODEr[6:4])
 | 
			
		||||
            3'b000: Z = 48'b0;
 | 
			
		||||
            3'b001: Z = PCIN;
 | 
			
		||||
            3'b010: begin Z = P;
 | 
			
		||||
            3'b010:
 | 
			
		||||
                if (PREG == 1)
 | 
			
		||||
                    Z = P;
 | 
			
		||||
                else begin
 | 
			
		||||
                    Z = 48'bx;
 | 
			
		||||
`ifndef YOSYS
 | 
			
		||||
                if (PREG != 1) $fatal(1, "PREG must be 1 when OPMODEr[6:4] i0s 3'b010");
 | 
			
		||||
                    $fatal(1, "PREG must be 1 when OPMODEr[6:4] is 3'b010");
 | 
			
		||||
`endif
 | 
			
		||||
            end
 | 
			
		||||
                end
 | 
			
		||||
            3'b011: Z = Cr;
 | 
			
		||||
            3'b100: begin Z = P;
 | 
			
		||||
            3'b100:
 | 
			
		||||
                if (PREG == 1 && OPMODEr[3:0] === 4'b1000)
 | 
			
		||||
                    Z = P;
 | 
			
		||||
                else begin
 | 
			
		||||
                    Z = 48'bx;
 | 
			
		||||
`ifndef YOSYS
 | 
			
		||||
                if (PREG != 1) $fatal(1, "PREG must be 1 when OPMODEr[6:4] is 3'b100");
 | 
			
		||||
                if (OPMODEr[3:0] != 4'b1000) $fatal(1, "OPMODEr[3:0] must be 4'b1000 when OPMODEr[6:4] i0s 3'b100");
 | 
			
		||||
                    if (PREG != 1) $fatal(1, "PREG must be 1 when OPMODEr[6:4] is 3'b100");
 | 
			
		||||
                    if (OPMODEr[3:0] != 4'b1000) $fatal(1, "OPMODEr[3:0] must be 4'b1000 when OPMODEr[6:4] i0s 3'b100");
 | 
			
		||||
`endif
 | 
			
		||||
            end
 | 
			
		||||
                end
 | 
			
		||||
            3'b101: Z = $signed(PCIN[47:17]);
 | 
			
		||||
            3'b110: Z = $signed(P[47:17]);
 | 
			
		||||
            3'b110:
 | 
			
		||||
                if (PREG == 1)
 | 
			
		||||
                    Z = $signed(P[47:17]);
 | 
			
		||||
                else begin
 | 
			
		||||
                    Z = 48'bx;
 | 
			
		||||
`ifndef YOSYS
 | 
			
		||||
                    $fatal(1, "PREG must be 1 when OPMODEr[6:4] is 3'b110");
 | 
			
		||||
`endif
 | 
			
		||||
                end
 | 
			
		||||
            default: Z = 48'bx;
 | 
			
		||||
        endcase
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			@ -3568,10 +3592,34 @@ module DSP48E1 (
 | 
			
		|||
            3'b001: cin_muxed = ~PCIN[47];
 | 
			
		||||
            3'b010: cin_muxed = CARRYCASCIN;
 | 
			
		||||
            3'b011: cin_muxed = PCIN[47];
 | 
			
		||||
            3'b100: cin_muxed = CARRYCASCOUT;
 | 
			
		||||
            3'b101: cin_muxed = ~P[47];
 | 
			
		||||
            3'b100:
 | 
			
		||||
                if (PREG == 1)
 | 
			
		||||
                    cin_muxed = CARRYCASCOUT;
 | 
			
		||||
                else begin
 | 
			
		||||
                    cin_muxed = 1'bx;
 | 
			
		||||
`ifndef YOSYS
 | 
			
		||||
                    $fatal(1, "PREG must be 1 when CARRYINSEL is 3'b100");
 | 
			
		||||
`endif
 | 
			
		||||
                end
 | 
			
		||||
            3'b101:
 | 
			
		||||
                if (PREG == 1)
 | 
			
		||||
                    cin_muxed = ~P[47];
 | 
			
		||||
                else begin
 | 
			
		||||
                    cin_muxed = 1'bx;
 | 
			
		||||
`ifndef YOSYS
 | 
			
		||||
                    $fatal(1, "PREG must be 1 when CARRYINSEL is 3'b101");
 | 
			
		||||
`endif
 | 
			
		||||
                end
 | 
			
		||||
            3'b110: cin_muxed = A24_xnor_B17;
 | 
			
		||||
            3'b111: cin_muxed = P[47];
 | 
			
		||||
            3'b111:
 | 
			
		||||
                if (PREG == 1)
 | 
			
		||||
                    cin_muxed = P[47];
 | 
			
		||||
                else begin
 | 
			
		||||
                    cin_muxed = 1'bx;
 | 
			
		||||
`ifndef YOSYS
 | 
			
		||||
                    $fatal(1, "PREG must be 1 when CARRYINSEL is 3'b111");
 | 
			
		||||
`endif
 | 
			
		||||
                end
 | 
			
		||||
            default: cin_muxed = 1'bx;
 | 
			
		||||
        endcase
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			@ -4163,4 +4211,3 @@ module RAMB36E1 (
 | 
			
		|||
        if (|DOB_REG) (posedge CLKBWRCLK => (DOPBDOP : 4'bx)) = 882;
 | 
			
		||||
    endspecify
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,6 +33,7 @@ module \$__MUL25X18 (input [24:0] A, input [17:0] B, output [42:0] Y);
 | 
			
		|||
		.B(B),
 | 
			
		||||
		.C(48'b0),
 | 
			
		||||
		.D(25'b0),
 | 
			
		||||
		.CARRYIN(1'b0),
 | 
			
		||||
		.P(P_48),
 | 
			
		||||
 | 
			
		||||
		.INMODE(5'b00000),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue