mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	Various small cleanups in stdcells.v techmap code
This commit is contained in:
		
							parent
							
								
									15acf593e7
								
							
						
					
					
						commit
						b3b00f1bf4
					
				
					 1 changed files with 38 additions and 68 deletions
				
			
		| 
						 | 
				
			
			@ -115,7 +115,6 @@ endmodule
 | 
			
		|||
module \$reduce_xor ;
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// --------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
(* techmap_simplemap *)
 | 
			
		||||
| 
						 | 
				
			
			@ -218,7 +217,7 @@ parameter A_WIDTH = 1;
 | 
			
		|||
parameter B_WIDTH = 1;
 | 
			
		||||
parameter Y_WIDTH = 1;
 | 
			
		||||
 | 
			
		||||
parameter WIDTH = A_WIDTH > Y_WIDTH ? A_WIDTH : Y_WIDTH;
 | 
			
		||||
localparam WIDTH = A_WIDTH > Y_WIDTH ? A_WIDTH : Y_WIDTH;
 | 
			
		||||
 | 
			
		||||
input [A_WIDTH-1:0] A;
 | 
			
		||||
input [B_WIDTH-1:0] B;
 | 
			
		||||
| 
						 | 
				
			
			@ -271,7 +270,7 @@ parameter A_WIDTH = 1;
 | 
			
		|||
parameter B_WIDTH = 1;
 | 
			
		||||
parameter Y_WIDTH = 1;
 | 
			
		||||
 | 
			
		||||
parameter WIDTH = Y_WIDTH;
 | 
			
		||||
localparam WIDTH = Y_WIDTH;
 | 
			
		||||
 | 
			
		||||
input [A_WIDTH-1:0] A;
 | 
			
		||||
input [B_WIDTH-1:0] B;
 | 
			
		||||
| 
						 | 
				
			
			@ -324,7 +323,7 @@ parameter A_WIDTH = 1;
 | 
			
		|||
parameter B_WIDTH = 1;
 | 
			
		||||
parameter Y_WIDTH = 1;
 | 
			
		||||
 | 
			
		||||
parameter WIDTH = A_WIDTH > Y_WIDTH ? A_WIDTH : Y_WIDTH;
 | 
			
		||||
localparam WIDTH = A_WIDTH > Y_WIDTH ? A_WIDTH : Y_WIDTH;
 | 
			
		||||
 | 
			
		||||
input [A_WIDTH-1:0] A;
 | 
			
		||||
input [B_WIDTH-1:0] B;
 | 
			
		||||
| 
						 | 
				
			
			@ -387,11 +386,11 @@ output X, Y;
 | 
			
		|||
// {t1, t2} = A + B
 | 
			
		||||
wire t1, t2, t3;
 | 
			
		||||
 | 
			
		||||
 \$_AND_ gate1 ( .A(A),  .B(B),  .Y(t1) );
 | 
			
		||||
 \$_XOR_ gate2 ( .A(A),  .B(B),  .Y(t2) );
 | 
			
		||||
 \$_AND_ gate3 ( .A(t2), .B(C),  .Y(t3) ); 
 | 
			
		||||
 \$_XOR_ gate4 ( .A(t2), .B(C),  .Y(Y)  );
 | 
			
		||||
 \$_OR_  gate5 ( .A(t1), .B(t3), .Y(X)  );
 | 
			
		||||
\$_AND_ gate1 ( .A(A),  .B(B),  .Y(t1) );
 | 
			
		||||
\$_XOR_ gate2 ( .A(A),  .B(B),  .Y(t2) );
 | 
			
		||||
\$_AND_ gate3 ( .A(t2), .B(C),  .Y(t3) ); 
 | 
			
		||||
\$_XOR_ gate4 ( .A(t2), .B(C),  .Y(Y)  );
 | 
			
		||||
\$_OR_  gate5 ( .A(t1), .B(t3), .Y(X)  );
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -438,7 +437,7 @@ parameter A_WIDTH = 1;
 | 
			
		|||
parameter B_WIDTH = 1;
 | 
			
		||||
parameter Y_WIDTH = 1;
 | 
			
		||||
 | 
			
		||||
parameter WIDTH = A_WIDTH > B_WIDTH ? A_WIDTH : B_WIDTH;
 | 
			
		||||
localparam WIDTH = A_WIDTH > B_WIDTH ? A_WIDTH : B_WIDTH;
 | 
			
		||||
 | 
			
		||||
input [A_WIDTH-1:0] A;
 | 
			
		||||
input [B_WIDTH-1:0] B;
 | 
			
		||||
| 
						 | 
				
			
			@ -446,8 +445,8 @@ output [Y_WIDTH-1:0] Y;
 | 
			
		|||
 | 
			
		||||
wire carry, carry_sign;
 | 
			
		||||
wire [WIDTH-1:0] A_buf, B_buf, Y_buf;
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
 | 
			
		||||
\$__alu #(
 | 
			
		||||
	.WIDTH(WIDTH)
 | 
			
		||||
| 
						 | 
				
			
			@ -487,7 +486,7 @@ parameter A_WIDTH = 1;
 | 
			
		|||
parameter B_WIDTH = 1;
 | 
			
		||||
parameter Y_WIDTH = 1;
 | 
			
		||||
 | 
			
		||||
parameter WIDTH = A_WIDTH > B_WIDTH ? A_WIDTH : B_WIDTH;
 | 
			
		||||
localparam WIDTH = A_WIDTH > B_WIDTH ? A_WIDTH : B_WIDTH;
 | 
			
		||||
 | 
			
		||||
input [A_WIDTH-1:0] A;
 | 
			
		||||
input [B_WIDTH-1:0] B;
 | 
			
		||||
| 
						 | 
				
			
			@ -495,8 +494,8 @@ output [Y_WIDTH-1:0] Y;
 | 
			
		|||
 | 
			
		||||
wire carry, carry_sign;
 | 
			
		||||
wire [WIDTH-1:0] A_buf, B_buf, Y_buf;
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
 | 
			
		||||
\$__alu #(
 | 
			
		||||
	.WIDTH(WIDTH)
 | 
			
		||||
| 
						 | 
				
			
			@ -536,7 +535,7 @@ parameter A_WIDTH = 1;
 | 
			
		|||
parameter B_WIDTH = 1;
 | 
			
		||||
parameter Y_WIDTH = 1;
 | 
			
		||||
 | 
			
		||||
parameter WIDTH = A_WIDTH > B_WIDTH ? A_WIDTH : B_WIDTH;
 | 
			
		||||
localparam WIDTH = A_WIDTH > B_WIDTH ? A_WIDTH : B_WIDTH;
 | 
			
		||||
 | 
			
		||||
input [A_WIDTH-1:0] A;
 | 
			
		||||
input [B_WIDTH-1:0] B;
 | 
			
		||||
| 
						 | 
				
			
			@ -544,8 +543,8 @@ output [Y_WIDTH-1:0] Y;
 | 
			
		|||
 | 
			
		||||
wire carry, carry_sign;
 | 
			
		||||
wire [WIDTH-1:0] A_buf, B_buf;
 | 
			
		||||
\$bu0 #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$bu0 #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
\$bu0 #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$bu0 #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
 | 
			
		||||
assign Y = ~|(A_buf ^ B_buf);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -561,7 +560,7 @@ parameter A_WIDTH = 1;
 | 
			
		|||
parameter B_WIDTH = 1;
 | 
			
		||||
parameter Y_WIDTH = 1;
 | 
			
		||||
 | 
			
		||||
parameter WIDTH = A_WIDTH > B_WIDTH ? A_WIDTH : B_WIDTH;
 | 
			
		||||
localparam WIDTH = A_WIDTH > B_WIDTH ? A_WIDTH : B_WIDTH;
 | 
			
		||||
 | 
			
		||||
input [A_WIDTH-1:0] A;
 | 
			
		||||
input [B_WIDTH-1:0] B;
 | 
			
		||||
| 
						 | 
				
			
			@ -569,8 +568,8 @@ output [Y_WIDTH-1:0] Y;
 | 
			
		|||
 | 
			
		||||
wire carry, carry_sign;
 | 
			
		||||
wire [WIDTH-1:0] A_buf, B_buf;
 | 
			
		||||
\$bu0 #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$bu0 #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
\$bu0 #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$bu0 #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
 | 
			
		||||
assign Y = |(A_buf ^ B_buf);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -586,7 +585,7 @@ parameter A_WIDTH = 1;
 | 
			
		|||
parameter B_WIDTH = 1;
 | 
			
		||||
parameter Y_WIDTH = 1;
 | 
			
		||||
 | 
			
		||||
parameter WIDTH = A_WIDTH > B_WIDTH ? A_WIDTH : B_WIDTH;
 | 
			
		||||
localparam WIDTH = A_WIDTH > B_WIDTH ? A_WIDTH : B_WIDTH;
 | 
			
		||||
 | 
			
		||||
input [A_WIDTH-1:0] A;
 | 
			
		||||
input [B_WIDTH-1:0] B;
 | 
			
		||||
| 
						 | 
				
			
			@ -594,8 +593,8 @@ output [Y_WIDTH-1:0] Y;
 | 
			
		|||
 | 
			
		||||
wire carry, carry_sign;
 | 
			
		||||
wire [WIDTH-1:0] A_buf, B_buf;
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
 | 
			
		||||
assign Y = ~|(A_buf ^ B_buf);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -611,7 +610,7 @@ parameter A_WIDTH = 1;
 | 
			
		|||
parameter B_WIDTH = 1;
 | 
			
		||||
parameter Y_WIDTH = 1;
 | 
			
		||||
 | 
			
		||||
parameter WIDTH = A_WIDTH > B_WIDTH ? A_WIDTH : B_WIDTH;
 | 
			
		||||
localparam WIDTH = A_WIDTH > B_WIDTH ? A_WIDTH : B_WIDTH;
 | 
			
		||||
 | 
			
		||||
input [A_WIDTH-1:0] A;
 | 
			
		||||
input [B_WIDTH-1:0] B;
 | 
			
		||||
| 
						 | 
				
			
			@ -619,8 +618,8 @@ output [Y_WIDTH-1:0] Y;
 | 
			
		|||
 | 
			
		||||
wire carry, carry_sign;
 | 
			
		||||
wire [WIDTH-1:0] A_buf, B_buf;
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
 | 
			
		||||
assign Y = |(A_buf ^ B_buf);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -697,8 +696,8 @@ input [B_WIDTH-1:0] B;
 | 
			
		|||
output [Y_WIDTH-1:0] Y;
 | 
			
		||||
 | 
			
		||||
wire [Y_WIDTH-1:0] A_buf, B_buf;
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(Y_WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(Y_WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(Y_WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(Y_WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
 | 
			
		||||
\$__alu #(
 | 
			
		||||
	.WIDTH(Y_WIDTH)
 | 
			
		||||
| 
						 | 
				
			
			@ -726,8 +725,8 @@ input [B_WIDTH-1:0] B;
 | 
			
		|||
output [Y_WIDTH-1:0] Y;
 | 
			
		||||
 | 
			
		||||
wire [Y_WIDTH-1:0] A_buf, B_buf;
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(Y_WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(Y_WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(Y_WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(Y_WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
 | 
			
		||||
\$__alu #(
 | 
			
		||||
	.WIDTH(Y_WIDTH)
 | 
			
		||||
| 
						 | 
				
			
			@ -775,8 +774,8 @@ input [B_WIDTH-1:0] B;
 | 
			
		|||
output [Y_WIDTH-1:0] Y;
 | 
			
		||||
 | 
			
		||||
wire [Y_WIDTH-1:0] A_buf, B_buf;
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(Y_WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(Y_WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(Y_WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(Y_WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
 | 
			
		||||
\$__arraymul #(
 | 
			
		||||
	.WIDTH(Y_WIDTH)
 | 
			
		||||
| 
						 | 
				
			
			@ -837,12 +836,12 @@ input [B_WIDTH-1:0] B;
 | 
			
		|||
output [Y_WIDTH-1:0] Y, R;
 | 
			
		||||
 | 
			
		||||
wire [WIDTH-1:0] A_buf, B_buf;
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED && B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(WIDTH)) A_conv (.A(A), .Y(A_buf));
 | 
			
		||||
\$pos #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(WIDTH)) B_conv (.A(B), .Y(B_buf));
 | 
			
		||||
 | 
			
		||||
wire [WIDTH-1:0] A_buf_u, B_buf_u, Y_u, R_u;
 | 
			
		||||
assign A_buf_u = A_SIGNED && B_SIGNED && A_buf[WIDTH-1] ? -A_buf : A_buf;
 | 
			
		||||
assign B_buf_u = A_SIGNED && B_SIGNED && B_buf[WIDTH-1] ? -B_buf : B_buf;
 | 
			
		||||
assign A_buf_u = A_SIGNED && A_buf[WIDTH-1] ? -A_buf : A_buf;
 | 
			
		||||
assign B_buf_u = B_SIGNED && B_buf[WIDTH-1] ? -B_buf : B_buf;
 | 
			
		||||
 | 
			
		||||
\$__div_mod_u #(
 | 
			
		||||
	.WIDTH(WIDTH)
 | 
			
		||||
| 
						 | 
				
			
			@ -872,9 +871,6 @@ input [A_WIDTH-1:0] A;
 | 
			
		|||
input [B_WIDTH-1:0] B;
 | 
			
		||||
output [Y_WIDTH-1:0] Y;
 | 
			
		||||
 | 
			
		||||
wire [Y_WIDTH-1:0] Y_buf;
 | 
			
		||||
wire [Y_WIDTH-1:0] Y_div_zero;
 | 
			
		||||
 | 
			
		||||
\$__div_mod #(
 | 
			
		||||
	.A_SIGNED(A_SIGNED),
 | 
			
		||||
	.B_SIGNED(B_SIGNED),
 | 
			
		||||
| 
						 | 
				
			
			@ -884,20 +880,9 @@ wire [Y_WIDTH-1:0] Y_div_zero;
 | 
			
		|||
) div_mod (
 | 
			
		||||
	.A(A),
 | 
			
		||||
	.B(B),
 | 
			
		||||
	.Y(Y_buf)
 | 
			
		||||
	.Y(Y)
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
// explicitly force the division-by-zero behavior found in other synthesis tools 
 | 
			
		||||
generate begin
 | 
			
		||||
	if (A_SIGNED && B_SIGNED) begin:make_div_zero
 | 
			
		||||
		assign Y_div_zero = A[A_WIDTH-1] ? {Y_WIDTH{1'b0}} | 1'b1 : {Y_WIDTH{1'b1}};
 | 
			
		||||
	end else begin:make_div_zero
 | 
			
		||||
		assign Y_div_zero = {A_WIDTH{1'b1}};
 | 
			
		||||
	end
 | 
			
		||||
end endgenerate
 | 
			
		||||
 | 
			
		||||
assign Y = B ? Y_buf : Y_div_zero;
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
// --------------------------------------------------------
 | 
			
		||||
| 
						 | 
				
			
			@ -914,9 +899,6 @@ input [A_WIDTH-1:0] A;
 | 
			
		|||
input [B_WIDTH-1:0] B;
 | 
			
		||||
output [Y_WIDTH-1:0] Y;
 | 
			
		||||
 | 
			
		||||
wire [Y_WIDTH-1:0] Y_buf;
 | 
			
		||||
wire [Y_WIDTH-1:0] Y_div_zero;
 | 
			
		||||
 | 
			
		||||
\$__div_mod #(
 | 
			
		||||
	.A_SIGNED(A_SIGNED),
 | 
			
		||||
	.B_SIGNED(B_SIGNED),
 | 
			
		||||
| 
						 | 
				
			
			@ -926,21 +908,9 @@ wire [Y_WIDTH-1:0] Y_div_zero;
 | 
			
		|||
) div_mod (
 | 
			
		||||
	.A(A),
 | 
			
		||||
	.B(B),
 | 
			
		||||
	.R(Y_buf)
 | 
			
		||||
	.R(Y)
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
// explicitly force the division-by-zero behavior found in other synthesis tools 
 | 
			
		||||
localparam div_zero_copy_a_bits = A_WIDTH < B_WIDTH ? A_WIDTH : B_WIDTH;
 | 
			
		||||
generate begin
 | 
			
		||||
	if (A_SIGNED && B_SIGNED) begin:make_div_zero
 | 
			
		||||
		assign Y_div_zero = $signed(A[div_zero_copy_a_bits-1:0]);
 | 
			
		||||
	end else begin:make_div_zero
 | 
			
		||||
		assign Y_div_zero = $unsigned(A[div_zero_copy_a_bits-1:0]);
 | 
			
		||||
	end
 | 
			
		||||
end endgenerate
 | 
			
		||||
 | 
			
		||||
assign Y = B ? Y_buf : Y_div_zero;
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
/****
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue