diff options
Diffstat (limited to 'techlibs')
| -rw-r--r-- | techlibs/gowin/Makefile.inc | 10 | ||||
| -rw-r--r-- | techlibs/gowin/bram.txt | 29 | ||||
| -rw-r--r-- | techlibs/gowin/brams_init3.vh | 12 | ||||
| -rw-r--r-- | techlibs/gowin/brams_map.v | 103 | ||||
| -rw-r--r-- | techlibs/gowin/cells_map.v | 6 | ||||
| -rw-r--r-- | techlibs/gowin/cells_sim.v | 134 | ||||
| -rw-r--r-- | techlibs/gowin/determine_init.cc | 72 | ||||
| -rw-r--r-- | techlibs/gowin/dram.txt | 17 | ||||
| -rw-r--r-- | techlibs/gowin/drams_map.v | 31 | ||||
| -rw-r--r-- | techlibs/gowin/synth_gowin.cc | 54 | 
10 files changed, 458 insertions, 10 deletions
diff --git a/techlibs/gowin/Makefile.inc b/techlibs/gowin/Makefile.inc index 2f82def7d..6f2159349 100644 --- a/techlibs/gowin/Makefile.inc +++ b/techlibs/gowin/Makefile.inc @@ -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)) diff --git a/techlibs/gowin/bram.txt b/techlibs/gowin/bram.txt new file mode 100644 index 000000000..b5f9a981c --- /dev/null +++ b/techlibs/gowin/bram.txt @@ -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 diff --git a/techlibs/gowin/brams_init3.vh b/techlibs/gowin/brams_init3.vh new file mode 100644 index 000000000..84397fa24 --- /dev/null +++ b/techlibs/gowin/brams_init3.vh @@ -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] +}; diff --git a/techlibs/gowin/brams_map.v b/techlibs/gowin/brams_map.v new file mode 100644 index 000000000..e963cfa88 --- /dev/null +++ b/techlibs/gowin/brams_map.v @@ -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 diff --git a/techlibs/gowin/cells_map.v b/techlibs/gowin/cells_map.v index e1f85effa..ebdc88a0a 100644 --- a/techlibs/gowin/cells_map.v +++ b/techlibs/gowin/cells_map.v @@ -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; diff --git a/techlibs/gowin/cells_sim.v b/techlibs/gowin/cells_sim.v index 14441c2fc..ebb238bad 100644 --- a/techlibs/gowin/cells_sim.v +++ b/techlibs/gowin/cells_sim.v @@ -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 + diff --git a/techlibs/gowin/determine_init.cc b/techlibs/gowin/determine_init.cc new file mode 100644 index 000000000..991e5245a --- /dev/null +++ b/techlibs/gowin/determine_init.cc @@ -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 diff --git a/techlibs/gowin/dram.txt b/techlibs/gowin/dram.txt new file mode 100644 index 000000000..9db530251 --- /dev/null +++ b/techlibs/gowin/dram.txt @@ -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 diff --git a/techlibs/gowin/drams_map.v b/techlibs/gowin/drams_map.v new file mode 100644 index 000000000..a50ab365a --- /dev/null +++ b/techlibs/gowin/drams_map.v @@ -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 diff --git a/techlibs/gowin/synth_gowin.cc b/techlibs/gowin/synth_gowin.cc index c7983bade..ac3dbfb29 100644 --- a/techlibs/gowin/synth_gowin.cc +++ b/techlibs/gowin/synth_gowin.cc @@ -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)")) +		 +                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"))  | 
