mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			191 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
module AL_MAP_SEQ (
 | 
						|
	output reg q,
 | 
						|
	input ce,
 | 
						|
	input clk,
 | 
						|
	input sr,
 | 
						|
	input d
 | 
						|
);
 | 
						|
	parameter DFFMODE = "FF"; //FF,LATCH
 | 
						|
	parameter REGSET = "RESET"; //RESET/SET
 | 
						|
	parameter SRMUX = "SR"; //SR/INV
 | 
						|
	parameter SRMODE = "SYNC"; //SYNC/ASYNC
 | 
						|
 | 
						|
	wire srmux;
 | 
						|
	generate
 | 
						|
		case (SRMUX)
 | 
						|
			"SR": assign srmux = sr;
 | 
						|
			"INV": assign srmux = ~sr;
 | 
						|
			default: assign srmux = sr;
 | 
						|
		endcase
 | 
						|
	endgenerate
 | 
						|
 | 
						|
	wire regset;
 | 
						|
	generate
 | 
						|
		case (REGSET)
 | 
						|
			"RESET": assign regset = 1'b0;
 | 
						|
			"SET": assign regset = 1'b1;
 | 
						|
			default: assign regset = 1'b0;
 | 
						|
		endcase
 | 
						|
	endgenerate
 | 
						|
 | 
						|
	initial q = regset;
 | 
						|
 | 
						|
	generate
 | 
						|
		if (DFFMODE == "FF")
 | 
						|
		begin
 | 
						|
			if (SRMODE == "ASYNC")
 | 
						|
			begin
 | 
						|
				always @(posedge clk, posedge srmux)
 | 
						|
					if (srmux)
 | 
						|
						q <= regset;
 | 
						|
					else if (ce)
 | 
						|
						q <= d;
 | 
						|
			end
 | 
						|
			else
 | 
						|
			begin
 | 
						|
				always @(posedge clk)
 | 
						|
					if (srmux)
 | 
						|
						q <= regset;
 | 
						|
					else if (ce)
 | 
						|
						q <= d;
 | 
						|
			end
 | 
						|
		end
 | 
						|
		else
 | 
						|
		begin
 | 
						|
			// DFFMODE == "LATCH"
 | 
						|
			if (SRMODE == "ASYNC")
 | 
						|
			begin
 | 
						|
				always @*
 | 
						|
					if (srmux)
 | 
						|
						q <= regset;
 | 
						|
					else if (~clk & ce)
 | 
						|
						q <= d;
 | 
						|
			end
 | 
						|
			else
 | 
						|
			begin
 | 
						|
				always @*
 | 
						|
					if (~clk) begin
 | 
						|
						if (srmux)
 | 
						|
							q <= regset;
 | 
						|
						else if (ce)
 | 
						|
							q <= d;
 | 
						|
					end
 | 
						|
			end
 | 
						|
		end
 | 
						|
    endgenerate
 | 
						|
endmodule
 | 
						|
 | 
						|
module AL_MAP_LUT1 (
 | 
						|
	output o,
 | 
						|
	input a
 | 
						|
);
 | 
						|
	parameter [1:0] INIT = 2'h0;
 | 
						|
	parameter EQN = "(A)";
 | 
						|
 | 
						|
	assign o = a ? INIT[1] : INIT[0];	
 | 
						|
endmodule
 | 
						|
 | 
						|
module AL_MAP_LUT2 (
 | 
						|
	output o,
 | 
						|
	input a,
 | 
						|
	input b
 | 
						|
);
 | 
						|
	parameter [3:0] INIT = 4'h0;
 | 
						|
	parameter EQN = "(A)";
 | 
						|
 | 
						|
	wire [1:0] s1 = b ? INIT[ 3:2] : INIT[1:0];
 | 
						|
	assign o = a ? s1[1] : s1[0];	
 | 
						|
endmodule
 | 
						|
 | 
						|
module AL_MAP_LUT3 (
 | 
						|
	output o,
 | 
						|
	input a,
 | 
						|
	input b,
 | 
						|
	input c
 | 
						|
);
 | 
						|
	parameter [7:0] INIT = 8'h0;
 | 
						|
	parameter EQN = "(A)";
 | 
						|
 | 
						|
	wire [3:0] s2 = c ? INIT[ 7:4] : INIT[3:0];
 | 
						|
	wire [1:0] s1 = b ?   s2[ 3:2] :   s2[1:0];
 | 
						|
	assign o = a ? s1[1] : s1[0];	
 | 
						|
endmodule
 | 
						|
 | 
						|
module AL_MAP_LUT4 (
 | 
						|
	output o,
 | 
						|
	input a,
 | 
						|
	input b,
 | 
						|
	input c,
 | 
						|
	input d
 | 
						|
);
 | 
						|
	parameter [15:0] INIT = 16'h0;
 | 
						|
	parameter EQN = "(A)";
 | 
						|
 | 
						|
	wire [7:0] s3 = d ? INIT[15:8] : INIT[7:0];
 | 
						|
	wire [3:0] s2 = c ?   s3[ 7:4] :   s3[3:0];
 | 
						|
	wire [1:0] s1 = b ?   s2[ 3:2] :   s2[1:0];
 | 
						|
	assign o = a ? s1[1] : s1[0];	
 | 
						|
endmodule
 | 
						|
 | 
						|
module AL_MAP_LUT5 (
 | 
						|
	output o,
 | 
						|
	input a,
 | 
						|
	input b,
 | 
						|
	input c,
 | 
						|
	input d,
 | 
						|
	input e
 | 
						|
);
 | 
						|
	parameter [31:0] INIT = 32'h0;
 | 
						|
	parameter EQN = "(A)";
 | 
						|
	assign o = INIT >> {e, d, c, b, a};
 | 
						|
endmodule
 | 
						|
 | 
						|
 | 
						|
module AL_MAP_LUT6 (
 | 
						|
	output o,
 | 
						|
	input a,
 | 
						|
	input b,
 | 
						|
	input c,
 | 
						|
	input d,
 | 
						|
	input e,
 | 
						|
	input f
 | 
						|
);
 | 
						|
	parameter [63:0] INIT = 64'h0;
 | 
						|
	parameter EQN = "(A)";
 | 
						|
	assign o = INIT >> {f, e, d, c, b, a};
 | 
						|
endmodule
 | 
						|
 | 
						|
module AL_MAP_ALU2B (
 | 
						|
   input cin,
 | 
						|
   input a0, b0, c0, d0,
 | 
						|
   input a1, b1, c1, d1,
 | 
						|
   output s0, s1, cout
 | 
						|
);
 | 
						|
	parameter [15:0] INIT0 = 16'h0000;
 | 
						|
	parameter [15:0] INIT1 = 16'h0000;
 | 
						|
	parameter FUNC0 = "NO";
 | 
						|
	parameter FUNC1 = "NO";
 | 
						|
endmodule
 | 
						|
 | 
						|
module AL_MAP_ADDER (
 | 
						|
  input a,
 | 
						|
  input b,
 | 
						|
  input c,
 | 
						|
  output [1:0] o
 | 
						|
);
 | 
						|
	parameter ALUTYPE = "ADD";
 | 
						|
 | 
						|
	generate
 | 
						|
		case (ALUTYPE)
 | 
						|
			"ADD": 		 assign o = a + b + c;
 | 
						|
			"SUB": 		 assign o = a - b - c;
 | 
						|
			"A_LE_B":    assign o = a - b - c;
 | 
						|
 | 
						|
			"ADD_CARRY":    assign o = {  a, 1'b0 };
 | 
						|
			"SUB_CARRY":    assign o = { ~a, 1'b0 };
 | 
						|
			"A_LE_B_CARRY": assign o = {  a, 1'b0 };
 | 
						|
			default: assign o = a + b + c;
 | 
						|
		endcase
 | 
						|
	endgenerate	
 | 
						|
 | 
						|
endmodule
 |