mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	iCE40: Added SB_RAM40_4K{,NR,NW,NRNW}* models
This commit is contained in:
		
							parent
							
								
									7ff802e199
								
							
						
					
					
						commit
						1277d1bcb8
					
				
					 1 changed files with 289 additions and 13 deletions
				
			
		|  | @ -243,13 +243,293 @@ module SB_DFFNES (output reg Q, input C, E, S, D); | |||
| 			Q <= D; | ||||
| endmodule | ||||
| 
 | ||||
| // Packed IceStorm Logic Cells | ||||
| // SiliconBlue RAM Cells | ||||
| 
 | ||||
| module ICESTORM_CARRYCONST (output COUT); | ||||
| 	parameter [0:0] CARRYCONST = 0; | ||||
| 	assign COUT = CARRYCONST; | ||||
| module SB_RAM40_4K ( | ||||
| 	output reg [15:0] RDATA, | ||||
| 	input             RCLK, RCLKE, RE, | ||||
| 	input      [10:0] RADDR, | ||||
| 	input             WCLK, WCLKE, WE, | ||||
| 	input      [10:0] WADDR, | ||||
| 	input      [15:0] MASK, WDATA | ||||
| ); | ||||
| 	// MODE 0:  256 x 16 | ||||
| 	// MODE 1:  512 x 8 | ||||
| 	// MODE 2: 1024 x 4 | ||||
| 	// MODE 3: 2048 x 2 | ||||
| 	parameter WRITE_MODE = 0; | ||||
| 	parameter READ_MODE = 0; | ||||
| 
 | ||||
| 	parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 
 | ||||
| `ifndef BLACKBOX | ||||
| 	integer i; | ||||
| 	reg [15:0] memory [0:255]; | ||||
| 
 | ||||
| 	initial begin | ||||
| 		for (i=0; i<16; i=i+1) begin | ||||
| 			memory[ 0*16 + i] <= INIT_0[16*i +: 16]; | ||||
| 			memory[ 1*16 + i] <= INIT_1[16*i +: 16]; | ||||
| 			memory[ 2*16 + i] <= INIT_2[16*i +: 16]; | ||||
| 			memory[ 3*16 + i] <= INIT_3[16*i +: 16]; | ||||
| 			memory[ 4*16 + i] <= INIT_4[16*i +: 16]; | ||||
| 			memory[ 5*16 + i] <= INIT_5[16*i +: 16]; | ||||
| 			memory[ 6*16 + i] <= INIT_6[16*i +: 16]; | ||||
| 			memory[ 7*16 + i] <= INIT_7[16*i +: 16]; | ||||
| 			memory[ 8*16 + i] <= INIT_8[16*i +: 16]; | ||||
| 			memory[ 9*16 + i] <= INIT_9[16*i +: 16]; | ||||
| 			memory[10*16 + i] <= INIT_A[16*i +: 16]; | ||||
| 			memory[11*16 + i] <= INIT_B[16*i +: 16]; | ||||
| 			memory[12*16 + i] <= INIT_C[16*i +: 16]; | ||||
| 			memory[13*16 + i] <= INIT_D[16*i +: 16]; | ||||
| 			memory[14*16 + i] <= INIT_E[16*i +: 16]; | ||||
| 			memory[15*16 + i] <= INIT_F[16*i +: 16]; | ||||
| 		end | ||||
| 	end | ||||
| 
 | ||||
| 	always @(posedge WCLK) begin | ||||
| 		if (WE && WCLKE) begin | ||||
| 			if (WRITE_MODE == 0) begin | ||||
| 				for (i=0; i<16; i=i+1) | ||||
| 					if (MASK[i]) memory[WADDR[7:0]][i] <= WDATA[i]; | ||||
| 			end | ||||
| 			if (WRITE_MODE == 1) begin | ||||
| 				for (i=0; i<2; i=i+1) | ||||
| 					if (WADDR[0] == i) memory[WADDR[8:1]][i*8 +: 8] <= WDATA[i][7:0]; | ||||
| 			end | ||||
| 			if (WRITE_MODE == 2) begin | ||||
| 				for (i=0; i<4; i=i+1) | ||||
| 					if (WADDR[1:0] == i) memory[WADDR[9:2]][i*4 +: 4] <= WDATA[i][3:0]; | ||||
| 			end | ||||
| 			if (WRITE_MODE == 3) begin | ||||
| 				for (i=0; i<8; i=i+1) | ||||
| 					if (WADDR[2:0] == i) memory[WADDR[10:3]][i*2 +: 2] <= WDATA[i][1:0]; | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 
 | ||||
| 	always @(posedge RCLK) begin | ||||
| 		if (RE && RCLKE) begin | ||||
| 			if (READ_MODE == 0) begin | ||||
| 				RDATA <= memory[RADDR[7:0]]; | ||||
| 			end | ||||
| 			if (READ_MODE == 1) begin | ||||
| 				RDATA <= memory[RADDR[8:1]][RADDR[0]*8 +: 8]; | ||||
| 			end | ||||
| 			if (READ_MODE == 2) begin | ||||
| 				RDATA <= memory[RADDR[9:2]][RADDR[1:0]*4 +: 4]; | ||||
| 			end | ||||
| 			if (READ_MODE == 3) begin | ||||
| 				RDATA <= memory[RADDR[10:3]][RADDR[2:0]*2 +: 2]; | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| `endif | ||||
| endmodule | ||||
| 
 | ||||
| module SB_RAM40_4KNR ( | ||||
| 	output [15:0] RDATA, | ||||
| 	input         RCLK, RCLKE, RE, | ||||
| 	input  [10:0] RADDR, | ||||
| 	input         WCLK, WCLKE, WE, | ||||
| 	input  [10:0] WADDR, | ||||
| 	input  [15:0] MASK, WDATA | ||||
| ); | ||||
| 	parameter WRITE_MODE = 0; | ||||
| 	parameter READ_MODE = 0; | ||||
| 
 | ||||
| 	parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 
 | ||||
| 	SB_RAM40_4K #( | ||||
| 		.WRITE_MODE(WRITE_MODE), | ||||
| 		.READ_MODE (READ_MODE ), | ||||
| 		.INIT_0    (INIT_0    ), | ||||
| 		.INIT_1    (INIT_1    ), | ||||
| 		.INIT_2    (INIT_2    ), | ||||
| 		.INIT_3    (INIT_3    ), | ||||
| 		.INIT_4    (INIT_4    ), | ||||
| 		.INIT_5    (INIT_5    ), | ||||
| 		.INIT_6    (INIT_6    ), | ||||
| 		.INIT_7    (INIT_7    ), | ||||
| 		.INIT_8    (INIT_8    ), | ||||
| 		.INIT_9    (INIT_9    ), | ||||
| 		.INIT_A    (INIT_A    ), | ||||
| 		.INIT_B    (INIT_B    ), | ||||
| 		.INIT_C    (INIT_C    ), | ||||
| 		.INIT_D    (INIT_D    ), | ||||
| 		.INIT_E    (INIT_E    ), | ||||
| 		.INIT_F    (INIT_F    ) | ||||
| 	) RAM ( | ||||
| 		.RDATA(RDATA), | ||||
| 		.RCLK (~RCLK), | ||||
| 		.RCLKE(RCLKE), | ||||
| 		.RE   (RE   ), | ||||
| 		.RADDR(RADDR), | ||||
| 		.WCLK (WCLK ), | ||||
| 		.WCLKE(WCLKE), | ||||
| 		.WE   (WE   ), | ||||
| 		.WADDR(WADDR), | ||||
| 		.MASK (MASK ), | ||||
| 		.WDATA(WDATA) | ||||
| 	); | ||||
| endmodule | ||||
| 
 | ||||
| module SB_RAM40_4KNW ( | ||||
| 	output [15:0] RDATA, | ||||
| 	input         RCLK, RCLKE, RE, | ||||
| 	input  [10:0] RADDR, | ||||
| 	input         WCLK, WCLKE, WE, | ||||
| 	input  [10:0] WADDR, | ||||
| 	input  [15:0] MASK, WDATA | ||||
| ); | ||||
| 	parameter WRITE_MODE = 0; | ||||
| 	parameter READ_MODE = 0; | ||||
| 
 | ||||
| 	parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 
 | ||||
| 	SB_RAM40_4K #( | ||||
| 		.WRITE_MODE(WRITE_MODE), | ||||
| 		.READ_MODE (READ_MODE ), | ||||
| 		.INIT_0    (INIT_0    ), | ||||
| 		.INIT_1    (INIT_1    ), | ||||
| 		.INIT_2    (INIT_2    ), | ||||
| 		.INIT_3    (INIT_3    ), | ||||
| 		.INIT_4    (INIT_4    ), | ||||
| 		.INIT_5    (INIT_5    ), | ||||
| 		.INIT_6    (INIT_6    ), | ||||
| 		.INIT_7    (INIT_7    ), | ||||
| 		.INIT_8    (INIT_8    ), | ||||
| 		.INIT_9    (INIT_9    ), | ||||
| 		.INIT_A    (INIT_A    ), | ||||
| 		.INIT_B    (INIT_B    ), | ||||
| 		.INIT_C    (INIT_C    ), | ||||
| 		.INIT_D    (INIT_D    ), | ||||
| 		.INIT_E    (INIT_E    ), | ||||
| 		.INIT_F    (INIT_F    ) | ||||
| 	) RAM ( | ||||
| 		.RDATA(RDATA), | ||||
| 		.RCLK (RCLK ), | ||||
| 		.RCLKE(RCLKE), | ||||
| 		.RE   (RE   ), | ||||
| 		.RADDR(RADDR), | ||||
| 		.WCLK (~WCLK), | ||||
| 		.WCLKE(WCLKE), | ||||
| 		.WE   (WE   ), | ||||
| 		.WADDR(WADDR), | ||||
| 		.MASK (MASK ), | ||||
| 		.WDATA(WDATA) | ||||
| 	); | ||||
| endmodule | ||||
| 
 | ||||
| module SB_RAM40_4KNRNW ( | ||||
| 	output [15:0] RDATA, | ||||
| 	input         RCLK, RCLKE, RE, | ||||
| 	input  [10:0] RADDR, | ||||
| 	input         WCLK, WCLKE, WE, | ||||
| 	input  [10:0] WADDR, | ||||
| 	input  [15:0] MASK, WDATA | ||||
| ); | ||||
| 	parameter WRITE_MODE = 0; | ||||
| 	parameter READ_MODE = 0; | ||||
| 
 | ||||
| 	parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 
 | ||||
| 	SB_RAM40_4K #( | ||||
| 		.WRITE_MODE(WRITE_MODE), | ||||
| 		.READ_MODE (READ_MODE ), | ||||
| 		.INIT_0    (INIT_0    ), | ||||
| 		.INIT_1    (INIT_1    ), | ||||
| 		.INIT_2    (INIT_2    ), | ||||
| 		.INIT_3    (INIT_3    ), | ||||
| 		.INIT_4    (INIT_4    ), | ||||
| 		.INIT_5    (INIT_5    ), | ||||
| 		.INIT_6    (INIT_6    ), | ||||
| 		.INIT_7    (INIT_7    ), | ||||
| 		.INIT_8    (INIT_8    ), | ||||
| 		.INIT_9    (INIT_9    ), | ||||
| 		.INIT_A    (INIT_A    ), | ||||
| 		.INIT_B    (INIT_B    ), | ||||
| 		.INIT_C    (INIT_C    ), | ||||
| 		.INIT_D    (INIT_D    ), | ||||
| 		.INIT_E    (INIT_E    ), | ||||
| 		.INIT_F    (INIT_F    ) | ||||
| 	) RAM ( | ||||
| 		.RDATA(RDATA), | ||||
| 		.RCLK (~RCLK), | ||||
| 		.RCLKE(RCLKE), | ||||
| 		.RE   (RE   ), | ||||
| 		.RADDR(RADDR), | ||||
| 		.WCLK (~WCLK), | ||||
| 		.WCLKE(WCLKE), | ||||
| 		.WE   (WE   ), | ||||
| 		.WADDR(WADDR), | ||||
| 		.MASK (MASK ), | ||||
| 		.WDATA(WDATA) | ||||
| 	); | ||||
| endmodule | ||||
| 
 | ||||
| // Packed IceStorm Logic Cells | ||||
| 
 | ||||
| module ICESTORM_LC ( | ||||
| 	input I0, I1, I2, I3, CIN, CLK, CEN, SR, | ||||
| 	output O, COUT | ||||
|  | @ -272,20 +552,16 @@ module ICESTORM_LC ( | |||
| 	wire polarized_clk; | ||||
| 	assign polarized_clk = CLK ^ NEG_CLK; | ||||
| 
 | ||||
| 	wire filtered_cen, filtered_sr; | ||||
| 	assign filtered_cen = CEN === 1'bz ? 1'b1 : CEN; | ||||
| 	assign filtered_sr = SR === 1'bz ? 1'b0 : SR; | ||||
| 
 | ||||
| 	reg o_reg; | ||||
| 	always @(posedge polarized_clk) | ||||
| 		if (filtered_cen) | ||||
| 			o_reg <= filtered_sr ? SET_NORESET : lut_o; | ||||
| 		if (CEN) | ||||
| 			o_reg <= SR ? SET_NORESET : lut_o; | ||||
| 
 | ||||
| 	reg o_reg_async; | ||||
| 	always @(posedge polarized_clk, posedge filtered_sr) | ||||
| 		if (filtered_sr) | ||||
| 	always @(posedge polarized_clk, posedge SR) | ||||
| 		if (SR) | ||||
| 			o_reg <= SET_NORESET; | ||||
| 		else if (filtered_cen) | ||||
| 		else if (CEN) | ||||
| 			o_reg <= lut_o; | ||||
| 
 | ||||
| 	assign O = DFF_ENABLE ? ASYNC_SR ? o_reg_async : o_reg : lut_o; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue