mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Merge branch 'master' of https://github.com/dh73/yosys_gowin into dh73-master
This commit is contained in:
		
						commit
						913659d644
					
				
					 10 changed files with 458 additions and 10 deletions
				
			
		|  | @ -1,7 +1,17 @@ | ||||||
| 
 | 
 | ||||||
| OBJS += techlibs/gowin/synth_gowin.o | OBJS += techlibs/gowin/synth_gowin.o | ||||||
|  | OBJS += techlibs/gowin/determine_init.o | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| $(eval $(call add_share_file,share/gowin,techlibs/gowin/cells_map.v)) | $(eval $(call add_share_file,share/gowin,techlibs/gowin/cells_map.v)) | ||||||
| $(eval $(call add_share_file,share/gowin,techlibs/gowin/cells_sim.v)) | $(eval $(call add_share_file,share/gowin,techlibs/gowin/cells_sim.v)) | ||||||
| $(eval $(call add_share_file,share/gowin,techlibs/gowin/arith_map.v)) | $(eval $(call add_share_file,share/gowin,techlibs/gowin/arith_map.v)) | ||||||
|  | $(eval $(call add_share_file,share/gowin,techlibs/gowin/brams_map.v)) | ||||||
|  | $(eval $(call add_share_file,share/gowin,techlibs/gowin/bram.txt)) | ||||||
|  | $(eval $(call add_share_file,share/gowin,techlibs/gowin/drams_map.v)) | ||||||
|  | $(eval $(call add_share_file,share/gowin,techlibs/gowin/dram.txt)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | $(eval $(call add_share_file,share/gowin,techlibs/gowin/brams_init3.vh)) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										29
									
								
								techlibs/gowin/bram.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								techlibs/gowin/bram.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | ||||||
|  | bram $__GW1NR_SDP | ||||||
|  | # uncomment when done | ||||||
|  | #  init 1 | ||||||
|  |   abits 10 @a10d18 | ||||||
|  |   dbits 16 @a10d18 | ||||||
|  |   abits 11 @a11d9 | ||||||
|  |   dbits 8  @a11d9 | ||||||
|  |   abits 12 @a12d4 | ||||||
|  |   dbits 4  @a12d4 | ||||||
|  |   abits 13 @a13d2 | ||||||
|  |   dbits 2  @a13d2 | ||||||
|  |   abits 14 @a14d1 | ||||||
|  |   dbits 1  @a14d1 | ||||||
|  |   groups 2 | ||||||
|  |   ports  1 1 | ||||||
|  |   wrmode 1 0 | ||||||
|  |   enable 1 1 @a10d18 | ||||||
|  |   enable 1 1 @a11d9 @a12d4 @a13d2 @a14d1 | ||||||
|  |   transp 0 0 | ||||||
|  |   clocks 2 3 | ||||||
|  |   clkpol 2 3 | ||||||
|  | endbram | ||||||
|  | 
 | ||||||
|  | match $__GW1NR_SDP | ||||||
|  |   min bits 2048 | ||||||
|  |   min efficiency 5 | ||||||
|  |   shuffle_enable B | ||||||
|  |   make_transp | ||||||
|  | endmatch | ||||||
							
								
								
									
										12
									
								
								techlibs/gowin/brams_init3.vh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								techlibs/gowin/brams_init3.vh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | ||||||
|  | localparam [15:0] INIT_0 = { | ||||||
|  |   INIT[  60], INIT[  56], INIT[  52], INIT[  48], INIT[  44], INIT[  40], INIT[  36], INIT[  32], INIT[  28], INIT[  24], INIT[  20], INIT[  16], INIT[  12], INIT[   8], INIT[   4], INIT[   0] | ||||||
|  | }; | ||||||
|  | localparam [15:0] INIT_1 = { | ||||||
|  |   INIT[  61], INIT[  57], INIT[  53], INIT[  49], INIT[  45], INIT[  41], INIT[  37], INIT[  33], INIT[  29], INIT[  25], INIT[  21], INIT[  17], INIT[  13], INIT[   9], INIT[   5], INIT[   1] | ||||||
|  | }; | ||||||
|  | localparam [15:0] INIT_2 = { | ||||||
|  |   INIT[  62], INIT[  58], INIT[  54], INIT[  50], INIT[  46], INIT[  42], INIT[  38], INIT[  34], INIT[  30], INIT[  26], INIT[  22], INIT[  18], INIT[  14], INIT[  10], INIT[   6], INIT[   2] | ||||||
|  | }; | ||||||
|  | localparam [15:0] INIT_3 = { | ||||||
|  |   INIT[  63], INIT[  59], INIT[  55], INIT[  51], INIT[  47], INIT[  43], INIT[  39], INIT[  35], INIT[  31], INIT[  27], INIT[  23], INIT[  19], INIT[  15], INIT[  11], INIT[   7], INIT[   3] | ||||||
|  | }; | ||||||
							
								
								
									
										103
									
								
								techlibs/gowin/brams_map.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								techlibs/gowin/brams_map.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,103 @@ | ||||||
|  | /* Semi Dual Port (SDP) memory have the following configurations: | ||||||
|  |  * Memory Config    RAM(BIT)   Port Mode   Memory Depth   Data Depth | ||||||
|  |  * ----------------|---------| ----------|--------------|------------| | ||||||
|  |  * B-SRAM_16K_SD1      16K      16Kx1       16,384           1 | ||||||
|  |  * B-SRAM_8K_SD2       16K       8Kx2        8,192           2 | ||||||
|  |  * B-SRAM_4K_SD4       16K       4Kx2        4,096           4 | ||||||
|  |  */ | ||||||
|  | module \$__GW1NR_SDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); | ||||||
|  | 	parameter CFG_ABITS = 10; | ||||||
|  | 	parameter CFG_DBITS = 16; | ||||||
|  | 	parameter CFG_ENABLE_A = 3; | ||||||
|  | 
 | ||||||
|  |         parameter [16383:0] INIT = 16384'hx; | ||||||
|  |         parameter CLKPOL2 = 1; | ||||||
|  |         parameter CLKPOL3 = 1; | ||||||
|  | 
 | ||||||
|  | 	input CLK2; | ||||||
|  | 	input CLK3; | ||||||
|  | 
 | ||||||
|  | 	input [CFG_ABITS-1:0] A1ADDR; | ||||||
|  | 	input [CFG_DBITS-1:0] A1DATA;    | ||||||
|  |         input [CFG_ENABLE_A-1:0] A1EN; | ||||||
|  | 
 | ||||||
|  | 	input [CFG_ABITS-1:0] B1ADDR; | ||||||
|  | 	output [CFG_DBITS-1:0] B1DATA; | ||||||
|  | 	input B1EN; | ||||||
|  | 
 | ||||||
|  | 	 | ||||||
|  | 	generate if (CFG_DBITS == 1) begin | ||||||
|  | 		SDP   #( | ||||||
|  | 			.READ_MODE(0), | ||||||
|  | 			.BIT_WIDTH_0(1), | ||||||
|  | 			.BIT_WIDTH_1(1), | ||||||
|  | 			.BLK_SEL(3'b000), | ||||||
|  | 			.RESET_MODE("SYNC") | ||||||
|  | 		) _TECHMAP_REPLACE_ ( | ||||||
|  | 			.CLKA(CLK2),   .CLKB(CLK3), | ||||||
|  | 			.WREA(A1EN),   .OCE(1'b0), .CEA(1'b1), | ||||||
|  | 			.WREB(1'b0),   .CEB(B1EN), | ||||||
|  | 			.RESETA(1'b0), .RESETB(1'b0), .BLKSEL(3'b000), | ||||||
|  | 			.DI(A1DATA), .DO(B1DATA), .ADA(A1ADDR), .ADB(B1ADDR) | ||||||
|  | 		); | ||||||
|  | 	end else if (CFG_DBITS == 2) begin | ||||||
|  | 		SDP    #( | ||||||
|  | 			.READ_MODE(0), | ||||||
|  | 			.BIT_WIDTH_0(2), | ||||||
|  | 			.BIT_WIDTH_1(2), | ||||||
|  | 			.BLK_SEL(3'b000), | ||||||
|  | 			.RESET_MODE("SYNC") | ||||||
|  | 		) _TECHMAP_REPLACE_ ( | ||||||
|  | 			.CLKA(CLK2),   .CLKB(CLK3), | ||||||
|  | 			.WREA(A1EN),   .OCE(1'b0), .CEA(1'b1), | ||||||
|  | 			.WREB(1'b0),   .CEB(B1EN), | ||||||
|  | 			.RESETA(1'b0), .RESETB(1'b0), .BLKSEL(3'b000), | ||||||
|  |                         .DI(A1DATA), .DO(B1DATA), .ADA(A1ADDR), .ADB(B1ADDR) | ||||||
|  | 		); | ||||||
|  | 	end else if (CFG_DBITS <= 4) begin | ||||||
|  | 		SDP    #( | ||||||
|  | 			.READ_MODE(0), | ||||||
|  | 			.BIT_WIDTH_0(4), | ||||||
|  | 			.BIT_WIDTH_1(4), | ||||||
|  | 			.BLK_SEL(3'b000), | ||||||
|  | 			.RESET_MODE("SYNC") | ||||||
|  | 		) _TECHMAP_REPLACE_ ( | ||||||
|  | 			.CLKA(CLK2),   .CLKB(CLK3), | ||||||
|  | 			.WREA(A1EN),   .OCE(1'b0), | ||||||
|  | 			.WREB(1'b0),   .CEB(B1EN), .CEA(1'b1), | ||||||
|  | 			.RESETA(1'b0), .RESETB(1'b0), .BLKSEL(3'b000), | ||||||
|  |                         .DI(A1DATA), .DO(B1DATA), .ADA(A1ADDR), .ADB(B1ADDR) | ||||||
|  | 		); | ||||||
|  | 	end else if (CFG_DBITS <= 8) begin | ||||||
|  | 		SDP    #( | ||||||
|  | 			.READ_MODE(0), | ||||||
|  | 			.BIT_WIDTH_0(8), | ||||||
|  | 			.BIT_WIDTH_1(8), | ||||||
|  | 			.BLK_SEL(3'b000), | ||||||
|  | 			.RESET_MODE("SYNC") | ||||||
|  | 		) _TECHMAP_REPLACE_ ( | ||||||
|  | 			.CLKA(CLK2),   .CLKB(CLK3), | ||||||
|  | 			.WREA(A1EN),   .OCE(1'b0), .CEA(1'b1), | ||||||
|  | 			.WREB(1'b0),   .CEB(B1EN), | ||||||
|  | 			.RESETA(1'b0), .RESETB(1'b0), .BLKSEL(3'b000), | ||||||
|  |                         .DI(A1DATA), .DO(B1DATA), .ADA(A1ADDR), .ADB(B1ADDR) | ||||||
|  | 		); | ||||||
|  | 	end else if (CFG_DBITS <= 16) begin | ||||||
|  | 		SDP    #( | ||||||
|  | 			.READ_MODE(0), | ||||||
|  | 			.BIT_WIDTH_0(16), | ||||||
|  | 			.BIT_WIDTH_1(16), | ||||||
|  | 			.BLK_SEL(3'b000), | ||||||
|  | 			.RESET_MODE("SYNC") | ||||||
|  | 		) _TECHMAP_REPLACE_ ( | ||||||
|  | 			.CLKA(CLK2),   .CLKB(CLK3), | ||||||
|  | 			.WREA(A1EN),   .OCE(1'b0), | ||||||
|  | 			.WREB(1'b0),   .CEB(B1EN), .CEA(1'b1), | ||||||
|  | 			.RESETA(1'b0), .RESETB(1'b0), .BLKSEL(3'b000), | ||||||
|  |                         .DI(A1DATA), .DO(B1DATA), .ADA(A1ADDR), .ADB(B1ADDR) | ||||||
|  | 		); | ||||||
|  | 	end else begin | ||||||
|  | 		wire TECHMAP_FAIL = 1'b1; | ||||||
|  | 	end endgenerate | ||||||
|  | 	 | ||||||
|  | endmodule | ||||||
|  | @ -1,5 +1,9 @@ | ||||||
| module  \$_DFF_N_ (input D, C, output Q); DFFN _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C)); endmodule | module  \$_DFF_N_ (input D, C, output Q); DFFN _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C)); endmodule | ||||||
| module  \$_DFF_P_ (input D, C, output Q); DFF  _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C)); endmodule | module  \$_DFF_P_ #(parameter INIT = 1'b0) (input D, C, output Q); DFF  #(.INIT(INIT)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C)); endmodule | ||||||
|  | 
 | ||||||
|  | module  \$__DFFS_PN0_ (input D, C, R, output Q); DFFR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(!R)); endmodule | ||||||
|  | module  \$__DFFS_PP0_ (input D, C, R, output Q); DFFR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(R)); endmodule | ||||||
|  | module  \$__DFFS_PP1_ (input D, C, R, output Q); DFFR  _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(R)); endmodule | ||||||
| 
 | 
 | ||||||
| module \$lut (A, Y); | module \$lut (A, Y); | ||||||
|   parameter WIDTH = 0; |   parameter WIDTH = 0; | ||||||
|  |  | ||||||
|  | @ -38,6 +38,17 @@ module DFFN (output reg Q, input CLK, D); | ||||||
| 		Q <= D; | 		Q <= D; | ||||||
| endmodule | endmodule | ||||||
| 
 | 
 | ||||||
|  | module DFFR (output reg Q, input D, CLK, RESET); | ||||||
|  | 	parameter [0:0] INIT = 1'b0; | ||||||
|  | 	initial Q = INIT; | ||||||
|  | 	always @(posedge CLK) begin | ||||||
|  |         if (RESET) | ||||||
|  |                 Q <= 1'b0; | ||||||
|  |         else | ||||||
|  |                 Q <= D; | ||||||
|  | 	end | ||||||
|  | endmodule // DFFR (positive clock edge; synchronous reset) | ||||||
|  | 
 | ||||||
| module VCC(output V); | module VCC(output V); | ||||||
| 	assign V = 1; | 	assign V = 1; | ||||||
| endmodule | endmodule | ||||||
|  | @ -63,3 +74,126 @@ module ALU (input I0, input I1, input I3, input CIN, output COUT, output SUM); | ||||||
|    assign  {COUT, SUM} = CIN + I1 + I0; |    assign  {COUT, SUM} = CIN + I1 + I0; | ||||||
| endmodule // alu | endmodule // alu | ||||||
| 
 | 
 | ||||||
|  | module RAM16S4 (DO, DI, AD, WRE, CLK); | ||||||
|  |    parameter WIDTH  = 4; | ||||||
|  |    parameter INIT_0 = 16'h0000; | ||||||
|  |    parameter INIT_1 = 16'h0000; | ||||||
|  |    parameter INIT_2 = 16'h0000; | ||||||
|  |    parameter INIT_3 = 16'h0000; | ||||||
|  |     | ||||||
|  |    input  [WIDTH-1:0] AD; | ||||||
|  |    input  [WIDTH-1:0] DI; | ||||||
|  |    output [WIDTH-1:0] DO; | ||||||
|  |    input 	      CLK; | ||||||
|  |    input 	      WRE; | ||||||
|  | 
 | ||||||
|  |    reg [15:0] 	    mem0, mem1, mem2, mem3; | ||||||
|  |     | ||||||
|  |    initial begin | ||||||
|  |       mem0 = INIT_0; | ||||||
|  |       mem1 = INIT_1; | ||||||
|  |       mem2 = INIT_2; | ||||||
|  |       mem3 = INIT_3;	 | ||||||
|  |    end | ||||||
|  |     | ||||||
|  |    assign	DO[0] = mem0[AD]; | ||||||
|  |    assign	DO[1] = mem1[AD]; | ||||||
|  |    assign	DO[2] = mem2[AD]; | ||||||
|  |    assign	DO[3] = mem3[AD]; | ||||||
|  |     | ||||||
|  |    always @(posedge CLK) begin | ||||||
|  |       if (WRE) begin | ||||||
|  | 	 mem0[AD] <= DI[0]; | ||||||
|  | 	 mem1[AD] <= DI[1]; | ||||||
|  | 	 mem2[AD] <= DI[2]; | ||||||
|  | 	 mem3[AD] <= DI[3]; | ||||||
|  |       end | ||||||
|  |    end | ||||||
|  |     | ||||||
|  | endmodule // RAM16S4 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | (* blackbox *) | ||||||
|  | module SDP (DO, DI, BLKSEL, ADA, ADB, WREA, WREB, CLKA, CLKB, CEA, CEB, OCE, RESETA, RESETB); | ||||||
|  | //1'b0: Bypass mode; 1'b1 Pipeline mode | ||||||
|  | parameter READ_MODE = 1'b0; | ||||||
|  | parameter BIT_WIDTH_0 = 32; // 1, 2, 4, 8, 16, 32 | ||||||
|  | parameter BIT_WIDTH_1 = 32; // 1, 2, 4, 8, 16, 32 | ||||||
|  | parameter BLK_SEL = 3'b000; | ||||||
|  | parameter RESET_MODE = "SYNC"; | ||||||
|  | parameter INIT_RAM_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | parameter INIT_RAM_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||||
|  | 
 | ||||||
|  | input CLKA, CEA, CLKB, CEB; | ||||||
|  | input OCE; // clock enable of memory output register | ||||||
|  | input RESETA, RESETB; // resets output registers, not memory contents | ||||||
|  | input WREA, WREB; // 1'b0: read enabled; 1'b1: write enabled | ||||||
|  | input [13:0] ADA, ADB; | ||||||
|  | input [31:0] DI; | ||||||
|  | input [2:0] BLKSEL; | ||||||
|  | output [31:0] DO; | ||||||
|  | 
 | ||||||
|  | endmodule | ||||||
|  | 
 | ||||||
|  |  | ||||||
							
								
								
									
										72
									
								
								techlibs/gowin/determine_init.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								techlibs/gowin/determine_init.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,72 @@ | ||||||
|  | /*
 | ||||||
|  |  *  yosys -- Yosys Open SYnthesis Suite | ||||||
|  |  * | ||||||
|  |  *  Copyright (C) 2018 Icenowy Zheng <icenowy@aosc.io> | ||||||
|  |  * | ||||||
|  |  *  Permission to use, copy, modify, and/or distribute this software for any | ||||||
|  |  *  purpose with or without fee is hereby granted, provided that the above | ||||||
|  |  *  copyright notice and this permission notice appear in all copies. | ||||||
|  |  * | ||||||
|  |  *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||||
|  |  *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||||
|  |  *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||||
|  |  *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||||
|  |  *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||||
|  |  *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||||
|  |  *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "kernel/yosys.h" | ||||||
|  | #include "kernel/sigtools.h" | ||||||
|  | 
 | ||||||
|  | USING_YOSYS_NAMESPACE | ||||||
|  | PRIVATE_NAMESPACE_BEGIN | ||||||
|  | 
 | ||||||
|  | struct DetermineInitPass : public Pass { | ||||||
|  | 	DetermineInitPass() : Pass("determine_init", "Determine the init value of cells") { } | ||||||
|  | 	void help() YS_OVERRIDE | ||||||
|  | 	{ | ||||||
|  | 		log("\n"); | ||||||
|  | 		log("    determine_init [selection]\n"); | ||||||
|  | 		log("\n"); | ||||||
|  | 		log("Determine the init value of cells that doesn't allow unknown init value.\n"); | ||||||
|  | 		log("\n"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	Const determine_init(Const init) | ||||||
|  | 	{ | ||||||
|  | 		for (int i = 0; i < GetSize(init); i++) { | ||||||
|  | 			if (init[i] != State::S0 && init[i] != State::S1) | ||||||
|  | 				init[i] = State::S0; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return init; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE | ||||||
|  | 	{ | ||||||
|  | 		log_header(design, "Executing DETERMINE_INIT pass (determine init value for cells).\n"); | ||||||
|  | 
 | ||||||
|  | 		extra_args(args, args.size(), design); | ||||||
|  | 
 | ||||||
|  | 		size_t cnt = 0; | ||||||
|  | 		for (auto module : design->selected_modules()) | ||||||
|  | 		{ | ||||||
|  | 			for (auto cell : module->selected_cells()) | ||||||
|  | 			{ | ||||||
|  | 				if (cell->type == "\\RAM16S4") | ||||||
|  | 				{ | ||||||
|  | 					cell->setParam("\\INIT_0", determine_init(cell->getParam("\\INIT_0"))); | ||||||
|  | 					cell->setParam("\\INIT_1", determine_init(cell->getParam("\\INIT_1"))); | ||||||
|  | 					cell->setParam("\\INIT_2", determine_init(cell->getParam("\\INIT_2"))); | ||||||
|  | 					cell->setParam("\\INIT_3", determine_init(cell->getParam("\\INIT_3"))); | ||||||
|  | 					cnt++; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		log_header(design, "Updated %lu cells with determined init value.\n", cnt); | ||||||
|  | 	} | ||||||
|  | } DetermineInitPass; | ||||||
|  | 
 | ||||||
|  | PRIVATE_NAMESPACE_END | ||||||
							
								
								
									
										17
									
								
								techlibs/gowin/dram.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								techlibs/gowin/dram.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | ||||||
|  | bram $__GW1NR_RAM16S4 | ||||||
|  |   init 1 | ||||||
|  |   abits 4 | ||||||
|  |   dbits 4 | ||||||
|  |   groups 2 | ||||||
|  |   ports  1 1 | ||||||
|  |   wrmode 0 1 | ||||||
|  |   enable 0 1 | ||||||
|  |   transp 0 1 | ||||||
|  |   clocks 0 1 | ||||||
|  |   clkpol 0 1 | ||||||
|  | endbram | ||||||
|  | 
 | ||||||
|  | match $__GW1NR_RAM16S4 | ||||||
|  |   make_outreg | ||||||
|  |   min wports 1 | ||||||
|  | endmatch | ||||||
							
								
								
									
										31
									
								
								techlibs/gowin/drams_map.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								techlibs/gowin/drams_map.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,31 @@ | ||||||
|  | module \$__GW1NR_RAM16S4 (CLK1, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); | ||||||
|  | 	parameter CFG_ABITS = 4; | ||||||
|  | 	parameter CFG_DBITS = 4; | ||||||
|  | 
 | ||||||
|  |         parameter [63:0] INIT = 64'bx; | ||||||
|  | 	input CLK1; | ||||||
|  | 
 | ||||||
|  | 	input  [CFG_ABITS-1:0] A1ADDR; | ||||||
|  | 	output [CFG_DBITS-1:0] A1DATA;    | ||||||
|  |         input                  A1EN; | ||||||
|  | 
 | ||||||
|  | 	input  [CFG_ABITS-1:0] B1ADDR; | ||||||
|  | 	input  [CFG_DBITS-1:0] B1DATA; | ||||||
|  | 	input  B1EN; | ||||||
|  | 
 | ||||||
|  |         `include "brams_init3.vh" | ||||||
|  | 
 | ||||||
|  |   RAM16S4 | ||||||
|  |    #(.INIT_0(INIT_0), | ||||||
|  |      .INIT_1(INIT_1), | ||||||
|  |      .INIT_2(INIT_2), | ||||||
|  |      .INIT_3(INIT_3)) | ||||||
|  |    _TECHMAP_REPLACE_ | ||||||
|  |      (.AD(B1ADDR), | ||||||
|  |       .DI(B1DATA), | ||||||
|  |       .DO(A1DATA), | ||||||
|  |       .CLK(CLK1), | ||||||
|  |       .WRE(B1EN)); | ||||||
|  | 
 | ||||||
|  | 	 | ||||||
|  | endmodule | ||||||
|  | @ -49,9 +49,15 @@ struct SynthGowinPass : public ScriptPass | ||||||
| 		log("        from label is synonymous to 'begin', and empty to label is\n"); | 		log("        from label is synonymous to 'begin', and empty to label is\n"); | ||||||
| 		log("        synonymous to the end of the command list.\n"); | 		log("        synonymous to the end of the command list.\n"); | ||||||
| 		log("\n"); | 		log("\n"); | ||||||
|  | 		log("    -nodffe\n"); | ||||||
|  | 		log("        do not use flipflops with CE in output netlist\n"); | ||||||
|  | 		log("\n"); | ||||||
| 		log("    -nobram\n"); | 		log("    -nobram\n"); | ||||||
| 		log("        do not use BRAM cells in output netlist\n"); | 		log("        do not use BRAM cells in output netlist\n"); | ||||||
| 		log("\n"); | 		log("\n"); | ||||||
|  | 		log("    -nodram\n"); | ||||||
|  | 		log("        do not use distributed RAM cells in output netlist\n"); | ||||||
|  | 		log("\n"); | ||||||
| 		log("    -noflatten\n"); | 		log("    -noflatten\n"); | ||||||
| 		log("        do not flatten design before synthesis\n"); | 		log("        do not flatten design before synthesis\n"); | ||||||
| 		log("\n"); | 		log("\n"); | ||||||
|  | @ -65,7 +71,7 @@ struct SynthGowinPass : public ScriptPass | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	string top_opt, vout_file; | 	string top_opt, vout_file; | ||||||
| 	bool retime, flatten, nobram; | 	bool retime, nobram, nodram, flatten, nodffe; | ||||||
| 
 | 
 | ||||||
| 	void clear_flags() YS_OVERRIDE | 	void clear_flags() YS_OVERRIDE | ||||||
| 	{ | 	{ | ||||||
|  | @ -74,6 +80,8 @@ struct SynthGowinPass : public ScriptPass | ||||||
| 		retime = false; | 		retime = false; | ||||||
| 		flatten = true; | 		flatten = true; | ||||||
| 		nobram = false; | 		nobram = false; | ||||||
|  | 		nodffe = false; | ||||||
|  | 		nodram = false; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE | 	void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE | ||||||
|  | @ -108,6 +116,14 @@ struct SynthGowinPass : public ScriptPass | ||||||
| 				nobram = true; | 				nobram = true; | ||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
|  | 			if (args[argidx] == "-nodram") { | ||||||
|  | 				nodram = true; | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 			if (args[argidx] == "-nodffe") { | ||||||
|  | 				nodffe = true; | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
| 			if (args[argidx] == "-noflatten") { | 			if (args[argidx] == "-noflatten") { | ||||||
| 				flatten = false; | 				flatten = false; | ||||||
| 				continue; | 				continue; | ||||||
|  | @ -147,25 +163,43 @@ struct SynthGowinPass : public ScriptPass | ||||||
| 		{ | 		{ | ||||||
| 			run("synth -run coarse"); | 			run("synth -run coarse"); | ||||||
| 		} | 		} | ||||||
|  | 		 | ||||||
|                 if (!nobram && check_label("bram", "(skip if -nobram)")) |                 if (!nobram && check_label("bram", "(skip if -nobram)")) | ||||||
| 		{ | 		{ | ||||||
| 			run("memory_bram -rules +/gowin/bram.txt"); | 			run("memory_bram -rules +/gowin/bram.txt"); | ||||||
| 			run("techmap -map +/gowin/brams_map.v"); | 			run("techmap -map +/gowin/brams_map.v -map +/gowin/cells_sim.v"); | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
|  | 		if (!nodram && check_label("dram", "(skip if -nodram)")) | ||||||
|  | 		{ | ||||||
|  | 			run("memory_bram -rules +/gowin/dram.txt"); | ||||||
|  | 			run("techmap -map +/gowin/drams_map.v"); | ||||||
|  | 			run("determine_init"); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		if (check_label("fine")) | 		if (check_label("fine")) | ||||||
| 		{ | 		{ | ||||||
| 			run("opt -fast -mux_undef -undriven -fine"); | 			run("opt -fast -mux_undef -undriven -fine"); | ||||||
| 			run("memory_map"); | 			run("memory_map"); | ||||||
| 			run("opt -undriven -fine"); | 			run("opt -undriven -fine"); | ||||||
| 			run("techmap -map +/techmap.v -map +/gowin/arith_map.v"); | 			run("techmap -map +/techmap.v -map +/gowin/arith_map.v"); | ||||||
| 			run("opt -fine"); | 			run("techmap -map +/techmap.v"); | ||||||
| 			run("clean -purge"); |  | ||||||
| 			run("splitnets -ports"); |  | ||||||
| 			run("setundef -undriven -zero"); |  | ||||||
| 			if (retime || help_mode) | 			if (retime || help_mode) | ||||||
| 				run("abc -dff", "(only if -retime)"); | 				run("abc -dff", "(only if -retime)"); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		if (check_label("map_ffs")) | ||||||
|  | 		{ | ||||||
|  | 			run("dffsr2dff"); | ||||||
|  | 			run("dff2dffs"); | ||||||
|  | 			run("opt_clean"); | ||||||
|  | 			if (!nodffe) | ||||||
|  | 				run("dff2dffe -direct-match $_DFF_* -direct-match $__DFFS_*"); | ||||||
|  | 			run("techmap -map +/gowin/cells_map.v"); | ||||||
|  | 			run("opt_expr -mux_undef"); | ||||||
|  | 			run("simplemap"); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		if (check_label("map_luts")) | 		if (check_label("map_luts")) | ||||||
| 		{ | 		{ | ||||||
| 			run("abc -lut 4"); | 			run("abc -lut 4"); | ||||||
|  | @ -176,8 +210,10 @@ struct SynthGowinPass : public ScriptPass | ||||||
| 		{ | 		{ | ||||||
| 			run("techmap -map +/gowin/cells_map.v"); | 			run("techmap -map +/gowin/cells_map.v"); | ||||||
| 			run("hilomap -hicell VCC V -locell GND G"); | 			run("hilomap -hicell VCC V -locell GND G"); | ||||||
| 			run("iopadmap -inpad IBUF O:I -outpad OBUF I:O"); | 			run("iopadmap -bits -inpad IBUF O:I -outpad OBUF I:O", "(unless -noiopads)"); | ||||||
| 			run("clean -purge"); | 			run("dffinit  -ff DFF Q INIT"); | ||||||
|  | 			run("clean"); | ||||||
|  | 
 | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if (check_label("check")) | 		if (check_label("check")) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue