mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-30 19:22:31 +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/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_sim.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_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); | ||||
|   parameter WIDTH = 0; | ||||
|  |  | |||
|  | @ -38,6 +38,17 @@ module DFFN (output reg Q, input CLK, D); | |||
| 		Q <= D; | ||||
| 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); | ||||
| 	assign V = 1; | ||||
| 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; | ||||
| 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("        synonymous to the end of the command list.\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -nodffe\n"); | ||||
| 		log("        do not use flipflops with CE in output netlist\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -nobram\n"); | ||||
| 		log("        do not use BRAM cells in output netlist\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -nodram\n"); | ||||
| 		log("        do not use distributed RAM cells in output netlist\n"); | ||||
| 		log("\n"); | ||||
| 		log("    -noflatten\n"); | ||||
| 		log("        do not flatten design before synthesis\n"); | ||||
| 		log("\n"); | ||||
|  | @ -65,7 +71,7 @@ struct SynthGowinPass : public ScriptPass | |||
| 	} | ||||
| 
 | ||||
| 	string top_opt, vout_file; | ||||
| 	bool retime, flatten, nobram; | ||||
| 	bool retime, nobram, nodram, flatten, nodffe; | ||||
| 
 | ||||
| 	void clear_flags() YS_OVERRIDE | ||||
| 	{ | ||||
|  | @ -74,6 +80,8 @@ struct SynthGowinPass : public ScriptPass | |||
| 		retime = false; | ||||
| 		flatten = true; | ||||
| 		nobram = false; | ||||
| 		nodffe = false; | ||||
| 		nodram = false; | ||||
| 	} | ||||
| 
 | ||||
| 	void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE | ||||
|  | @ -108,6 +116,14 @@ struct SynthGowinPass : public ScriptPass | |||
| 				nobram = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-nodram") { | ||||
| 				nodram = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-nodffe") { | ||||
| 				nodffe = true; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (args[argidx] == "-noflatten") { | ||||
| 				flatten = false; | ||||
| 				continue; | ||||
|  | @ -147,25 +163,43 @@ struct SynthGowinPass : public ScriptPass | |||
| 		{ | ||||
| 			run("synth -run coarse"); | ||||
| 		} | ||||
| 		 | ||||
|                 if (!nobram && check_label("bram", "(skip if -nobram)")) | ||||
| 		{ | ||||
| 			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")) | ||||
| 		{ | ||||
| 			run("opt -fast -mux_undef -undriven -fine"); | ||||
| 			run("memory_map"); | ||||
| 			run("opt -undriven -fine"); | ||||
| 			run("techmap -map +/techmap.v -map +/gowin/arith_map.v"); | ||||
| 			run("opt -fine"); | ||||
| 			run("clean -purge"); | ||||
| 			run("splitnets -ports"); | ||||
| 			run("setundef -undriven -zero"); | ||||
| 			run("techmap -map +/techmap.v"); | ||||
| 			if (retime || help_mode) | ||||
| 				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")) | ||||
| 		{ | ||||
| 			run("abc -lut 4"); | ||||
|  | @ -176,8 +210,10 @@ struct SynthGowinPass : public ScriptPass | |||
| 		{ | ||||
| 			run("techmap -map +/gowin/cells_map.v"); | ||||
| 			run("hilomap -hicell VCC V -locell GND G"); | ||||
| 			run("iopadmap -inpad IBUF O:I -outpad OBUF I:O"); | ||||
| 			run("clean -purge"); | ||||
| 			run("iopadmap -bits -inpad IBUF O:I -outpad OBUF I:O", "(unless -noiopads)"); | ||||
| 			run("dffinit  -ff DFF Q INIT"); | ||||
| 			run("clean"); | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 		if (check_label("check")) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue