mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			149 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
| module $__EFINIX_5K_ (...);
 | |
| 	parameter INIT = 0;
 | |
| 	parameter OPTION_WRITE_MODE = "READ_FIRST";
 | |
| 
 | |
| 	parameter PORT_R_WIDTH = 20;
 | |
| 	parameter PORT_R_CLK_POL = 1;
 | |
| 	parameter PORT_W_WIDTH = 20;
 | |
| 	parameter PORT_W_CLK_POL = 1;
 | |
| 
 | |
| 	input PORT_R_CLK;
 | |
| 	input PORT_R_RD_EN;
 | |
| 	input [11:0] PORT_R_ADDR;
 | |
| 	output [PORT_R_WIDTH-1:0] PORT_R_RD_DATA;
 | |
| 
 | |
| 	input PORT_W_CLK;
 | |
| 	input PORT_W_WR_EN;
 | |
| 	input [11:0] PORT_W_ADDR;
 | |
| 	input [PORT_W_WIDTH-1:0] PORT_W_WR_DATA;
 | |
| 
 | |
| 	localparam IS_5BIT = PORT_R_WIDTH >= 5 && PORT_W_WIDTH >= 5;
 | |
| 
 | |
| 	localparam RADDR_WIDTH =
 | |
| 		PORT_R_WIDTH == 1 ? 12 :
 | |
| 		PORT_R_WIDTH == 2 ? 11 :
 | |
| 		PORT_R_WIDTH == 5 ? 10 :
 | |
| 		PORT_R_WIDTH == 10 ? 9 :
 | |
| 		8;
 | |
| 
 | |
| 	localparam WADDR_WIDTH =
 | |
| 		PORT_W_WIDTH == 1 ? 12 :
 | |
| 		PORT_W_WIDTH == 2 ? 11 :
 | |
| 		PORT_W_WIDTH == 5 ? 10 :
 | |
| 		PORT_W_WIDTH == 10 ? 9 :
 | |
| 		8;
 | |
| 
 | |
| 	localparam READ_WIDTH = 
 | |
| 		PORT_R_WIDTH == 1 ? 1 :
 | |
| 		PORT_R_WIDTH == 2 ? 2 :
 | |
| 		PORT_R_WIDTH == 5 ? (IS_5BIT ? 5 : 4) :
 | |
| 		PORT_R_WIDTH == 10 ? (IS_5BIT ? 10 : 8) :
 | |
| 		(IS_5BIT ? 20 : 16);
 | |
| 
 | |
| 	localparam WRITE_WIDTH = 
 | |
| 		PORT_W_WIDTH == 1 ? 1 :
 | |
| 		PORT_W_WIDTH == 2 ? 2 :
 | |
| 		PORT_W_WIDTH == 5 ? (IS_5BIT ? 5 : 4) :
 | |
| 		PORT_W_WIDTH == 10 ? (IS_5BIT ? 10 : 8) :
 | |
| 		(IS_5BIT ? 20 : 16);
 | |
| 
 | |
| 	wire [RADDR_WIDTH-1:0] RADDR = PORT_R_ADDR[11:12-RADDR_WIDTH];
 | |
| 	wire [WADDR_WIDTH-1:0] WADDR = PORT_W_ADDR[11:12-WADDR_WIDTH];
 | |
| 
 | |
| 	wire [WRITE_WIDTH-1:0] WDATA;
 | |
| 	wire [READ_WIDTH-1:0] RDATA;
 | |
| 
 | |
| 	generate
 | |
| 		case (WRITE_WIDTH)
 | |
| 		1:	assign WDATA = PORT_W_WR_DATA;
 | |
| 		2:	assign WDATA = PORT_W_WR_DATA;
 | |
| 		4:	assign WDATA = PORT_W_WR_DATA[3:0];
 | |
| 		5:	assign WDATA = PORT_W_WR_DATA;
 | |
| 		8:	assign WDATA = {
 | |
| 			PORT_W_WR_DATA[8:5],
 | |
| 			PORT_W_WR_DATA[3:0]
 | |
| 		};
 | |
| 		10:	assign WDATA = PORT_W_WR_DATA;
 | |
| 		16:	assign WDATA = {
 | |
| 			PORT_W_WR_DATA[18:15],
 | |
| 			PORT_W_WR_DATA[13:10],
 | |
| 			PORT_W_WR_DATA[8:5],
 | |
| 			PORT_W_WR_DATA[3:0]
 | |
| 		};
 | |
| 		20:	assign WDATA = PORT_W_WR_DATA;
 | |
| 		endcase
 | |
| 		case (READ_WIDTH)
 | |
| 		1:	assign PORT_R_RD_DATA = RDATA;
 | |
| 		2:	assign PORT_R_RD_DATA = RDATA;
 | |
| 		4:	assign PORT_R_RD_DATA[3:0] = RDATA;
 | |
| 		5:	assign PORT_R_RD_DATA = RDATA;
 | |
| 		8:	assign {
 | |
| 			PORT_R_RD_DATA[8:5],
 | |
| 			PORT_R_RD_DATA[3:0]
 | |
| 		} = RDATA;
 | |
| 		10:	assign PORT_R_RD_DATA = RDATA;
 | |
| 		16:	assign {
 | |
| 			PORT_R_RD_DATA[18:15],
 | |
| 			PORT_R_RD_DATA[13:10],
 | |
| 			PORT_R_RD_DATA[8:5],
 | |
| 			PORT_R_RD_DATA[3:0]
 | |
| 		} = RDATA;
 | |
| 		20:	assign PORT_R_RD_DATA = RDATA;
 | |
| 		endcase
 | |
| 	endgenerate
 | |
| 
 | |
| 	function [255:0] init_slice;
 | |
| 		input integer idx;
 | |
| 		integer i;
 | |
| 		if (IS_5BIT)
 | |
| 			init_slice = INIT[idx * 256 +: 256];
 | |
| 		else if (idx > 16)
 | |
| 			init_slice = 0;
 | |
| 		else
 | |
| 			for (i = 0; i < 64; i = i + 1)
 | |
| 				init_slice[i*4+:4] = INIT[(idx * 64 + i) * 5+:4];
 | |
| 	endfunction
 | |
| 
 | |
| 	EFX_RAM_5K #(
 | |
| 		.READ_WIDTH(READ_WIDTH),
 | |
| 		.WRITE_WIDTH(WRITE_WIDTH),
 | |
| 		.OUTPUT_REG(1'b0),
 | |
| 		.RCLK_POLARITY(PORT_R_CLK_POL),
 | |
| 		.RE_POLARITY(1'b1),
 | |
| 		.WCLK_POLARITY(PORT_W_CLK_POL),
 | |
| 		.WE_POLARITY(1'b1),
 | |
| 		.WCLKE_POLARITY(1'b1),
 | |
| 		.WRITE_MODE(OPTION_WRITE_MODE),
 | |
| 		.INIT_0(init_slice('h00)),
 | |
| 		.INIT_1(init_slice('h01)),
 | |
| 		.INIT_2(init_slice('h02)),
 | |
| 		.INIT_3(init_slice('h03)),
 | |
| 		.INIT_4(init_slice('h04)),
 | |
| 		.INIT_5(init_slice('h05)),
 | |
| 		.INIT_6(init_slice('h06)),
 | |
| 		.INIT_7(init_slice('h07)),
 | |
| 		.INIT_8(init_slice('h08)),
 | |
| 		.INIT_9(init_slice('h09)),
 | |
| 		.INIT_A(init_slice('h0a)),
 | |
| 		.INIT_B(init_slice('h0b)),
 | |
| 		.INIT_C(init_slice('h0c)),
 | |
| 		.INIT_D(init_slice('h0d)),
 | |
| 		.INIT_E(init_slice('h0e)),
 | |
| 		.INIT_F(init_slice('h0f)),
 | |
| 		.INIT_10(init_slice('h10)),
 | |
| 		.INIT_11(init_slice('h11)),
 | |
| 		.INIT_12(init_slice('h12)),
 | |
| 		.INIT_13(init_slice('h13)),
 | |
| 	) _TECHMAP_REPLACE_ (
 | |
| 		.WDATA(WDATA),
 | |
| 		.WADDR(WADDR),
 | |
| 		.WE(PORT_W_WR_EN),
 | |
| 		.WCLK(PORT_W_CLK),
 | |
| 		.WCLKE(1'b1),
 | |
| 		.RDATA(RDATA),
 | |
| 		.RADDR(RADDR),
 | |
| 		.RE(PORT_R_RD_EN),
 | |
| 		.RCLK(PORT_R_CLK)
 | |
| 	);
 | |
| 
 | |
| endmodule
 |