mirror of
https://github.com/YosysHQ/yosys
synced 2025-08-03 18:00:24 +00:00
- Add explicitly handling of A_WIDTH=1 for completeness - mux2 uses one LUT3 instead of a hard mux (which did use LUTs anyway) - mux4 uses one LUT4 instead of hard muxes (which did use LUTs anyway) - mux8 uses only bottom half of a slice - Add a mux12 for intermediate variant between mux8 and mux16 - For sizes larger than 16 inputs, instantiate the right mux size - More comments about implementation choices - More tests including with -widemux and -abc9, and more comments
82 lines
1.2 KiB
Verilog
82 lines
1.2 KiB
Verilog
module mux2 (S,A,B,Y);
|
|
input S;
|
|
input A,B;
|
|
output reg Y;
|
|
|
|
always @(*)
|
|
Y = (S)? B : A;
|
|
endmodule
|
|
|
|
module mux4 ( S, D, Y );
|
|
input[1:0] S;
|
|
input[3:0] D;
|
|
output Y;
|
|
|
|
reg Y;
|
|
wire[1:0] S;
|
|
wire[3:0] D;
|
|
|
|
always @*
|
|
begin
|
|
case( S )
|
|
0 : Y = D[0];
|
|
1 : Y = D[1];
|
|
2 : Y = D[2];
|
|
3 : Y = D[3];
|
|
endcase
|
|
end
|
|
endmodule
|
|
|
|
module mux8 ( S, D, Y );
|
|
input[2:0] S;
|
|
input[7:0] D;
|
|
output Y;
|
|
|
|
reg Y;
|
|
wire[2:0] S;
|
|
wire[7:0] D;
|
|
|
|
always @*
|
|
begin
|
|
case( S )
|
|
0 : Y = D[0];
|
|
1 : Y = D[1];
|
|
2 : Y = D[2];
|
|
3 : Y = D[3];
|
|
4 : Y = D[4];
|
|
5 : Y = D[5];
|
|
6 : Y = D[6];
|
|
7 : Y = D[7];
|
|
endcase
|
|
end
|
|
endmodule
|
|
|
|
module mux12 (D, S, Y);
|
|
input [11:0] D;
|
|
input [3:0] S;
|
|
output Y;
|
|
|
|
wire[15:0] D16;
|
|
|
|
assign D16 = {4'bx, D};
|
|
assign Y = D16[S];
|
|
endmodule
|
|
|
|
module mux16 (D, S, Y);
|
|
input [15:0] D;
|
|
input [3:0] S;
|
|
output Y;
|
|
|
|
assign Y = D[S];
|
|
endmodule
|
|
|
|
module mux20 (D, S, Y);
|
|
input [19:0] D;
|
|
input [4:0] S;
|
|
output Y;
|
|
|
|
wire[31:0] D32;
|
|
|
|
assign D32 = {12'bx, D};
|
|
assign Y = D32[S];
|
|
endmodule
|