mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Merge pull request #1182 from koriakin/xc6s-bram
synth_xilinx: Initial Spartan 6 block RAM inference support.
This commit is contained in:
		
						commit
						19c1c3cfa3
					
				
					 9 changed files with 598 additions and 8 deletions
				
			
		|  | @ -5,6 +5,8 @@ GENFILES += techlibs/xilinx/brams_init_36.vh | |||
| GENFILES += techlibs/xilinx/brams_init_32.vh | ||||
| GENFILES += techlibs/xilinx/brams_init_18.vh | ||||
| GENFILES += techlibs/xilinx/brams_init_16.vh | ||||
| GENFILES += techlibs/xilinx/brams_init_9.vh | ||||
| GENFILES += techlibs/xilinx/brams_init_8.vh | ||||
| 
 | ||||
| EXTRA_OBJS += techlibs/xilinx/brams_init.mk | ||||
| .SECONDARY: techlibs/xilinx/brams_init.mk | ||||
|  | @ -18,13 +20,18 @@ techlibs/xilinx/brams_init_36.vh: techlibs/xilinx/brams_init.mk | |||
| techlibs/xilinx/brams_init_32.vh: techlibs/xilinx/brams_init.mk | ||||
| techlibs/xilinx/brams_init_18.vh: techlibs/xilinx/brams_init.mk | ||||
| techlibs/xilinx/brams_init_16.vh: techlibs/xilinx/brams_init.mk | ||||
| techlibs/xilinx/brams_init_9.vh: techlibs/xilinx/brams_init.mk | ||||
| techlibs/xilinx/brams_init_8.vh: techlibs/xilinx/brams_init.mk | ||||
| 
 | ||||
| $(eval $(call add_share_file,share/xilinx,techlibs/xilinx/cells_map.v)) | ||||
| $(eval $(call add_share_file,share/xilinx,techlibs/xilinx/cells_sim.v)) | ||||
| $(eval $(call add_share_file,share/xilinx,techlibs/xilinx/cells_xtra.v)) | ||||
| $(eval $(call add_share_file,share/xilinx,techlibs/xilinx/brams.txt)) | ||||
| $(eval $(call add_share_file,share/xilinx,techlibs/xilinx/brams_map.v)) | ||||
| $(eval $(call add_share_file,share/xilinx,techlibs/xilinx/brams_bb.v)) | ||||
| $(eval $(call add_share_file,share/xilinx,techlibs/xilinx/xc6s_brams.txt)) | ||||
| $(eval $(call add_share_file,share/xilinx,techlibs/xilinx/xc6s_brams_map.v)) | ||||
| $(eval $(call add_share_file,share/xilinx,techlibs/xilinx/xc6s_brams_bb.v)) | ||||
| $(eval $(call add_share_file,share/xilinx,techlibs/xilinx/xc7_brams.txt)) | ||||
| $(eval $(call add_share_file,share/xilinx,techlibs/xilinx/xc7_brams_map.v)) | ||||
| $(eval $(call add_share_file,share/xilinx,techlibs/xilinx/xc7_brams_bb.v)) | ||||
| $(eval $(call add_share_file,share/xilinx,techlibs/xilinx/drams.txt)) | ||||
| $(eval $(call add_share_file,share/xilinx,techlibs/xilinx/drams_map.v)) | ||||
| $(eval $(call add_share_file,share/xilinx,techlibs/xilinx/arith_map.v)) | ||||
|  | @ -40,4 +47,6 @@ $(eval $(call add_gen_share_file,share/xilinx,techlibs/xilinx/brams_init_36.vh)) | |||
| $(eval $(call add_gen_share_file,share/xilinx,techlibs/xilinx/brams_init_32.vh)) | ||||
| $(eval $(call add_gen_share_file,share/xilinx,techlibs/xilinx/brams_init_18.vh)) | ||||
| $(eval $(call add_gen_share_file,share/xilinx,techlibs/xilinx/brams_init_16.vh)) | ||||
| $(eval $(call add_gen_share_file,share/xilinx,techlibs/xilinx/brams_init_9.vh)) | ||||
| $(eval $(call add_gen_share_file,share/xilinx,techlibs/xilinx/brams_init_8.vh)) | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,5 +1,17 @@ | |||
| #!/usr/bin/env python3 | ||||
| 
 | ||||
| with open("techlibs/xilinx/brams_init_9.vh", "w") as f: | ||||
|     for i in range(4): | ||||
|         init_snippets = [" INIT[%3d*9+8]" % (k+256*i,) for k in range(255, -1, -1)] | ||||
|         for k in range(4, 256, 4): | ||||
|             init_snippets[k] = "\n           " + init_snippets[k] | ||||
|         print(".INITP_%02X({%s})," % (i, ",".join(init_snippets)), file=f) | ||||
|     for i in range(32): | ||||
|         init_snippets = [" INIT[%3d*9 +: 8]" % (k+32*i,) for k in range(31, -1, -1)] | ||||
|         for k in range(4, 32, 4): | ||||
|             init_snippets[k] = "\n          " + init_snippets[k] | ||||
|         print(".INIT_%02X({%s})," % (i, ",".join(init_snippets)), file=f) | ||||
| 
 | ||||
| with open("techlibs/xilinx/brams_init_18.vh", "w") as f: | ||||
|     for i in range(8): | ||||
|         init_snippets = [" INIT[%3d*9+8]" % (k+256*i,) for k in range(255, -1, -1)] | ||||
|  | @ -24,6 +36,10 @@ with open("techlibs/xilinx/brams_init_36.vh", "w") as f: | |||
|             init_snippets[k] = "\n          " + init_snippets[k] | ||||
|         print(".INIT_%02X({%s})," % (i, ",".join(init_snippets)), file=f) | ||||
| 
 | ||||
| with open("techlibs/xilinx/brams_init_8.vh", "w") as f: | ||||
|     for i in range(32): | ||||
|         print(".INIT_%02X(INIT[%3d*256 +: 256])," % (i, i), file=f) | ||||
| 
 | ||||
| with open("techlibs/xilinx/brams_init_16.vh", "w") as f: | ||||
|     for i in range(64): | ||||
|         print(".INIT_%02X(INIT[%3d*256 +: 256])," % (i, i), file=f) | ||||
|  |  | |||
|  | @ -236,8 +236,13 @@ struct SynthXilinxPass : public ScriptPass | |||
| 
 | ||||
| 			run("read_verilog -lib +/xilinx/cells_xtra.v"); | ||||
| 
 | ||||
| 			if (!nobram || help_mode) | ||||
| 				run("read_verilog -lib +/xilinx/brams_bb.v", "(skip if '-nobram')"); | ||||
| 			if (help_mode) { | ||||
| 				run("read_verilog -lib +/xilinx/{family}_brams_bb.v"); | ||||
| 			} else if (family == "xc6s") { | ||||
| 				run("read_verilog -lib +/xilinx/xc6s_brams_bb.v"); | ||||
| 			} else if (family == "xc7") { | ||||
| 				run("read_verilog -lib +/xilinx/xc7_brams_bb.v"); | ||||
| 			} | ||||
| 
 | ||||
| 			run(stringf("hierarchy -check %s", top_opt.c_str())); | ||||
| 		} | ||||
|  | @ -280,9 +285,19 @@ struct SynthXilinxPass : public ScriptPass | |||
| 		} | ||||
| 
 | ||||
| 		if (check_label("bram", "(skip if '-nobram')")) { | ||||
| 			if (!nobram || help_mode) { | ||||
| 				run("memory_bram -rules +/xilinx/brams.txt"); | ||||
| 				run("techmap -map +/xilinx/brams_map.v"); | ||||
| 			if (help_mode) { | ||||
| 				run("memory_bram -rules +/xilinx/{family}_brams.txt"); | ||||
| 				run("techmap -map +/xilinx/{family}_brams_map.v"); | ||||
| 			} else if (!nobram) { | ||||
| 				if (family == "xc6s") { | ||||
| 					run("memory_bram -rules +/xilinx/xc6s_brams.txt"); | ||||
| 					run("techmap -map +/xilinx/xc6s_brams_map.v"); | ||||
| 				} else if (family == "xc7") { | ||||
| 					run("memory_bram -rules +/xilinx/xc7_brams.txt"); | ||||
| 					run("techmap -map +/xilinx/xc7_brams_map.v"); | ||||
| 				} else { | ||||
| 					log_warning("Block RAM inference not yet supported for family %s.\n", family.c_str()); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										84
									
								
								techlibs/xilinx/xc6s_brams.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								techlibs/xilinx/xc6s_brams.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,84 @@ | |||
| 
 | ||||
| bram $__XILINX_RAMB8BWER_SDP | ||||
|   init 1 | ||||
|   abits 8 | ||||
|   dbits 36 | ||||
|   groups 2 | ||||
|   ports  1 1 | ||||
|   wrmode 0 1 | ||||
|   enable 1 4 | ||||
|   transp 0 0 | ||||
|   clocks 2 3 | ||||
|   clkpol 2 3 | ||||
| endbram | ||||
| 
 | ||||
| bram $__XILINX_RAMB16BWER_TDP | ||||
|   init 1 | ||||
|   abits  9     @a9d36 | ||||
|   dbits 36     @a9d36 | ||||
|   abits 10     @a10d18 | ||||
|   dbits 18     @a10d18 | ||||
|   abits 11     @a11d9 | ||||
|   dbits  9     @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 0 1 | ||||
|   enable 1 4   @a9d36 | ||||
|   enable 1 2   @a10d18 | ||||
|   enable 1 1   @a11d9 @a12d4 @a13d2 @a14d1 | ||||
|   transp 0 0 | ||||
|   clocks 2 3 | ||||
|   clkpol 2 3 | ||||
| endbram | ||||
| 
 | ||||
| bram $__XILINX_RAMB8BWER_TDP | ||||
|   init 1 | ||||
|   abits  9     @a9d18 | ||||
|   dbits 18     @a9d18 | ||||
|   abits 10     @a10d9 | ||||
|   dbits  9     @a10d9 | ||||
|   abits 11     @a11d4 | ||||
|   dbits  4     @a11d4 | ||||
|   abits 12     @a12d2 | ||||
|   dbits  2     @a12d2 | ||||
|   abits 13     @a13d1 | ||||
|   dbits  1     @a13d1 | ||||
|   groups 2 | ||||
|   ports  1 1 | ||||
|   wrmode 0 1 | ||||
|   enable 1 2   @a9d18 | ||||
|   enable 1 1   @a10d9 @a11d4 @a12d2 @a13d1 | ||||
|   transp 0 0 | ||||
|   clocks 2 3 | ||||
|   clkpol 2 3 | ||||
| endbram | ||||
| 
 | ||||
| match $__XILINX_RAMB8BWER_SDP | ||||
|   min bits 4096 | ||||
|   min efficiency 5 | ||||
|   shuffle_enable B | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__XILINX_RAMB16BWER_TDP | ||||
|   min bits 4096 | ||||
|   min efficiency 5 | ||||
|   shuffle_enable B | ||||
|   make_transp | ||||
|   or_next_if_better | ||||
| endmatch | ||||
| 
 | ||||
| match $__XILINX_RAMB8BWER_TDP | ||||
|   min bits 4096 | ||||
|   min efficiency 5 | ||||
|   shuffle_enable B | ||||
|   make_transp | ||||
| endmatch | ||||
| 
 | ||||
							
								
								
									
										211
									
								
								techlibs/xilinx/xc6s_brams_bb.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										211
									
								
								techlibs/xilinx/xc6s_brams_bb.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,211 @@ | |||
| module RAMB8BWER ( | ||||
| 	input CLKAWRCLK, | ||||
| 	input CLKBRDCLK, | ||||
| 	input ENAWREN, | ||||
| 	input ENBRDEN, | ||||
| 	input REGCEA, | ||||
| 	input REGCEBREGCE, | ||||
| 	input RSTA, | ||||
| 	input RSTBRST, | ||||
| 
 | ||||
| 	input [12:0] ADDRAWRADDR, | ||||
| 	input [12:0] ADDRBRDADDR, | ||||
| 	input [15:0] DIADI, | ||||
| 	input [15:0] DIBDI, | ||||
| 	input [1:0] DIPADIP, | ||||
| 	input [1:0] DIPBDIP, | ||||
| 	input [1:0] WEAWEL, | ||||
| 	input [1:0] WEBWEU, | ||||
| 
 | ||||
| 	output [15:0] DOADO, | ||||
| 	output [15:0] DOBDO, | ||||
| 	output [1:0] DOPADOP, | ||||
| 	output [1:0] DOPBDOP | ||||
| ); | ||||
| 	parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 
 | ||||
| 	parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 
 | ||||
| 	parameter RAM_MODE = "TDP"; | ||||
| 	parameter integer DOA_REG = 0; | ||||
| 	parameter integer DOB_REG = 0; | ||||
| 
 | ||||
| 	parameter integer DATA_WIDTH_A = 0; | ||||
| 	parameter integer DATA_WIDTH_B = 0; | ||||
| 
 | ||||
| 	parameter WRITE_MODE_A = "WRITE_FIRST"; | ||||
| 	parameter WRITE_MODE_B = "WRITE_FIRST"; | ||||
| 
 | ||||
| 	parameter EN_RSTRAM_A = "TRUE"; | ||||
| 	parameter EN_RSTRAM_B = "TRUE"; | ||||
| 
 | ||||
| 	parameter INIT_A = 18'h000000000; | ||||
| 	parameter INIT_B = 18'h000000000; | ||||
| 	parameter SRVAL_A = 18'h000000000; | ||||
| 	parameter SRVAL_B = 18'h000000000; | ||||
| 
 | ||||
| 	parameter RST_PRIORITY_A = "CE"; | ||||
| 	parameter RST_PRIORITY_B = "CE"; | ||||
| 
 | ||||
| 	parameter RSTTYPE = "SYNC"; | ||||
| 
 | ||||
| 	parameter SIM_COLLISION_CHECK = "ALL"; | ||||
| endmodule | ||||
| 
 | ||||
| module RAMB16BWER ( | ||||
| 	input CLKA, | ||||
| 	input CLKB, | ||||
| 	input ENA, | ||||
| 	input ENB, | ||||
| 	input REGCEA, | ||||
| 	input REGCEB, | ||||
| 	input RSTA, | ||||
| 	input RSTB, | ||||
| 
 | ||||
| 	input [13:0] ADDRA, | ||||
| 	input [13:0] ADDRB, | ||||
| 	input [31:0] DIA, | ||||
| 	input [31:0] DIB, | ||||
| 	input [3:0] DIPA, | ||||
| 	input [3:0] DIPB, | ||||
| 	input [3:0] WEA, | ||||
| 	input [3:0] WEB, | ||||
| 
 | ||||
| 	output [31:0] DOA, | ||||
| 	output [31:0] DOB, | ||||
| 	output [3:0] DOPA, | ||||
| 	output [3:0] DOPB | ||||
| ); | ||||
| 	parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 
 | ||||
| 	parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 	parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000; | ||||
| 
 | ||||
| 	parameter integer DOA_REG = 0; | ||||
| 	parameter integer DOB_REG = 0; | ||||
| 
 | ||||
| 	parameter integer DATA_WIDTH_A = 0; | ||||
| 	parameter integer DATA_WIDTH_B = 0; | ||||
| 
 | ||||
| 	parameter WRITE_MODE_A = "WRITE_FIRST"; | ||||
| 	parameter WRITE_MODE_B = "WRITE_FIRST"; | ||||
| 
 | ||||
| 	parameter EN_RSTRAM_A = "TRUE"; | ||||
| 	parameter EN_RSTRAM_B = "TRUE"; | ||||
| 
 | ||||
| 	parameter INIT_A = 36'h000000000; | ||||
| 	parameter INIT_B = 36'h000000000; | ||||
| 	parameter SRVAL_A = 36'h000000000; | ||||
| 	parameter SRVAL_B = 36'h000000000; | ||||
| 
 | ||||
| 	parameter RST_PRIORITY_A = "CE"; | ||||
| 	parameter RST_PRIORITY_B = "CE"; | ||||
| 
 | ||||
| 	parameter RSTTYPE = "SYNC"; | ||||
| 
 | ||||
| 	parameter SIM_COLLISION_CHECK = "ALL"; | ||||
| endmodule | ||||
| 
 | ||||
							
								
								
									
										255
									
								
								techlibs/xilinx/xc6s_brams_map.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										255
									
								
								techlibs/xilinx/xc6s_brams_map.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,255 @@ | |||
| module \$__XILINX_RAMB8BWER_SDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); | ||||
| 	parameter CLKPOL2 = 1; | ||||
| 	parameter CLKPOL3 = 1; | ||||
| 	parameter [9215:0] INIT = 9216'bx; | ||||
| 
 | ||||
| 	input CLK2; | ||||
| 	input CLK3; | ||||
| 
 | ||||
| 	input [7:0] A1ADDR; | ||||
| 	output [35:0] A1DATA; | ||||
| 	input A1EN; | ||||
| 
 | ||||
| 	input [7:0] B1ADDR; | ||||
| 	input [35:0] B1DATA; | ||||
| 	input [3:0] B1EN; | ||||
| 
 | ||||
| 	wire [12:0] A1ADDR_13 = {A1ADDR, 5'b0}; | ||||
| 	wire [12:0] B1ADDR_13 = {B1ADDR, 5'b0}; | ||||
| 
 | ||||
| 	wire [3:0] DIP, DOP; | ||||
| 	wire [31:0] DI, DO; | ||||
| 
 | ||||
| 	assign A1DATA = { DOP[3], DO[31:24], DOP[2], DO[23:16], DOP[1], DO[15: 8], DOP[0], DO[ 7: 0] }; | ||||
| 	assign { DIP[3], DI[31:24], DIP[2], DI[23:16], DIP[1], DI[15: 8], DIP[0], DI[ 7: 0] } = B1DATA; | ||||
| 
 | ||||
| 	RAMB8BWER #( | ||||
| 		.RAM_MODE("SDP"), | ||||
| 		.DATA_WIDTH_A(36), | ||||
| 		.DATA_WIDTH_B(36), | ||||
| 		.WRITE_MODE_A("READ_FIRST"), | ||||
| 		.WRITE_MODE_B("READ_FIRST"), | ||||
| 		`include "brams_init_9.vh" | ||||
| 	) _TECHMAP_REPLACE_ ( | ||||
| 		.DOBDO(DO[31:16]), | ||||
| 		.DOADO(DO[15:0]), | ||||
| 		.DOPBDOP(DOP[3:2]), | ||||
| 		.DOPADOP(DOP[1:0]), | ||||
| 		.DIBDI(DI[31:16]), | ||||
| 		.DIADI(DI[15:0]), | ||||
| 		.DIPBDIP(DIP[3:2]), | ||||
| 		.DIPADIP(DIP[1:0]), | ||||
| 		.WEBWEU(B1EN[3:2]), | ||||
| 		.WEAWEL(B1EN[1:0]), | ||||
| 
 | ||||
| 		.ADDRAWRADDR(B1ADDR_13), | ||||
| 		.CLKAWRCLK(CLK3 ^ !CLKPOL3), | ||||
| 		.ENAWREN(|1), | ||||
| 		.REGCEA(|0), | ||||
| 		.RSTA(|0), | ||||
| 
 | ||||
| 		.ADDRBRDADDR(A1ADDR_13), | ||||
| 		.CLKBRDCLK(CLK2 ^ !CLKPOL2), | ||||
| 		.ENBRDEN(A1EN), | ||||
| 		.REGCEBREGCE(|1), | ||||
| 		.RSTB(|0) | ||||
| 	); | ||||
| endmodule | ||||
| 
 | ||||
| // ------------------------------------------------------------------------ | ||||
| 
 | ||||
| module \$__XILINX_RAMB16BWER_TDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); | ||||
| 	parameter CFG_ABITS = 9; | ||||
| 	parameter CFG_DBITS = 36; | ||||
| 	parameter CFG_ENABLE_B = 4; | ||||
| 
 | ||||
| 	parameter CLKPOL2 = 1; | ||||
| 	parameter CLKPOL3 = 1; | ||||
| 	parameter [18431:0] INIT = 18432'bx; | ||||
| 
 | ||||
| 	input CLK2; | ||||
| 	input CLK3; | ||||
| 
 | ||||
| 	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 [CFG_ENABLE_B-1:0] B1EN; | ||||
| 
 | ||||
| 	wire [13:0] A1ADDR_14 = A1ADDR << (14 - CFG_ABITS); | ||||
| 	wire [13:0] B1ADDR_14 = B1ADDR << (14 - CFG_ABITS); | ||||
| 	wire [3:0] B1EN_4 = {4{B1EN}}; | ||||
| 
 | ||||
| 	wire [3:0] DIP, DOP; | ||||
| 	wire [31:0] DI, DO; | ||||
| 
 | ||||
| 	wire [31:0] DOB; | ||||
| 	wire [3:0] DOPB; | ||||
| 
 | ||||
| 	assign A1DATA = { DOP[3], DO[31:24], DOP[2], DO[23:16], DOP[1], DO[15: 8], DOP[0], DO[ 7: 0] }; | ||||
| 	assign { DIP[3], DI[31:24], DIP[2], DI[23:16], DIP[1], DI[15: 8], DIP[0], DI[ 7: 0] } = B1DATA; | ||||
| 
 | ||||
| 	generate if (CFG_DBITS > 8) begin | ||||
| 		RAMB16BWER #( | ||||
| 			.DATA_WIDTH_A(CFG_DBITS), | ||||
| 			.DATA_WIDTH_B(CFG_DBITS), | ||||
| 			.WRITE_MODE_A("READ_FIRST"), | ||||
| 			.WRITE_MODE_B("READ_FIRST"), | ||||
| 			`include "brams_init_18.vh" | ||||
| 		) _TECHMAP_REPLACE_ ( | ||||
| 			.DIA(32'd0), | ||||
| 			.DIPA(4'd0), | ||||
| 			.DOA(DO[31:0]), | ||||
| 			.DOPA(DOP[3:0]), | ||||
| 			.ADDRA(A1ADDR_14), | ||||
| 			.CLKA(CLK2 ^ !CLKPOL2), | ||||
| 			.ENA(A1EN), | ||||
| 			.REGCEA(|1), | ||||
| 			.RSTA(|0), | ||||
| 			.WEA(4'b0), | ||||
| 
 | ||||
| 			.DIB(DI), | ||||
| 			.DIPB(DIP), | ||||
| 			.DOB(DOB), | ||||
| 			.DOPB(DOPB), | ||||
| 			.ADDRB(B1ADDR_14), | ||||
| 			.CLKB(CLK3 ^ !CLKPOL3), | ||||
| 			.ENB(|1), | ||||
| 			.REGCEB(|0), | ||||
| 			.RSTB(|0), | ||||
| 			.WEB(B1EN_4) | ||||
| 		); | ||||
| 	end else begin | ||||
| 		RAMB16BWER #( | ||||
| 			.DATA_WIDTH_A(CFG_DBITS), | ||||
| 			.DATA_WIDTH_B(CFG_DBITS), | ||||
| 			.WRITE_MODE_A("READ_FIRST"), | ||||
| 			.WRITE_MODE_B("READ_FIRST"), | ||||
| 			`include "brams_init_16.vh" | ||||
| 		) _TECHMAP_REPLACE_ ( | ||||
| 			.DIA(32'd0), | ||||
| 			.DIPA(4'd0), | ||||
| 			.DOA(DO[31:0]), | ||||
| 			.DOPA(DOP[3:0]), | ||||
| 			.ADDRA(A1ADDR_14), | ||||
| 			.CLKA(CLK2 ^ !CLKPOL2), | ||||
| 			.ENA(A1EN), | ||||
| 			.REGCEA(|1), | ||||
| 			.RSTA(|0), | ||||
| 			.WEA(4'b0), | ||||
| 
 | ||||
| 			.DIB(DI), | ||||
| 			.DIPB(DIP), | ||||
| 			.DOB(DOB), | ||||
| 			.DOPB(DOPB), | ||||
| 			.ADDRB(B1ADDR_14), | ||||
| 			.CLKB(CLK3 ^ !CLKPOL3), | ||||
| 			.ENB(|1), | ||||
| 			.REGCEB(|0), | ||||
| 			.RSTB(|0), | ||||
| 			.WEB(B1EN_4) | ||||
| 		); | ||||
| 	end endgenerate | ||||
| endmodule | ||||
| 
 | ||||
| // ------------------------------------------------------------------------ | ||||
| 
 | ||||
| module \$__XILINX_RAMB8BWER_TDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); | ||||
| 	parameter CFG_ABITS = 9; | ||||
| 	parameter CFG_DBITS = 18; | ||||
| 	parameter CFG_ENABLE_B = 2; | ||||
| 
 | ||||
| 	parameter CLKPOL2 = 1; | ||||
| 	parameter CLKPOL3 = 1; | ||||
| 	parameter [9215:0] INIT = 9216'bx; | ||||
| 
 | ||||
| 	input CLK2; | ||||
| 	input CLK3; | ||||
| 
 | ||||
| 	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 [CFG_ENABLE_B-1:0] B1EN; | ||||
| 
 | ||||
| 	wire [12:0] A1ADDR_13 = A1ADDR << (13 - CFG_ABITS); | ||||
| 	wire [12:0] B1ADDR_13 = B1ADDR << (13 - CFG_ABITS); | ||||
| 	wire [1:0] B1EN_2 = {2{B1EN}}; | ||||
| 
 | ||||
| 	wire [1:0] DIP, DOP; | ||||
| 	wire [15:0] DI, DO; | ||||
| 
 | ||||
| 	wire [15:0] DOBDO; | ||||
| 	wire [1:0] DOPBDOP; | ||||
| 
 | ||||
| 	assign A1DATA = { DOP[1], DO[15: 8], DOP[0], DO[ 7: 0] }; | ||||
| 	assign { DIP[1], DI[15: 8], DIP[0], DI[ 7: 0] } = B1DATA; | ||||
| 
 | ||||
| 	generate if (CFG_DBITS > 8) begin | ||||
| 		RAMB8BWER #( | ||||
| 			.RAM_MODE("TDP"), | ||||
| 			.DATA_WIDTH_A(CFG_DBITS), | ||||
| 			.DATA_WIDTH_B(CFG_DBITS), | ||||
| 			.WRITE_MODE_A("READ_FIRST"), | ||||
| 			.WRITE_MODE_B("READ_FIRST"), | ||||
| 			`include "brams_init_9.vh" | ||||
| 		) _TECHMAP_REPLACE_ ( | ||||
| 			.DIADI(16'b0), | ||||
| 			.DIPADIP(2'b0), | ||||
| 			.DOADO(DO), | ||||
| 			.DOPADOP(DOP), | ||||
| 			.ADDRAWRADDR(A1ADDR_13), | ||||
| 			.CLKAWRCLK(CLK2 ^ !CLKPOL2), | ||||
| 			.ENAWREN(A1EN), | ||||
| 			.REGCEA(|1), | ||||
| 			.RSTA(|0), | ||||
| 			.WEAWEL(2'b0), | ||||
| 
 | ||||
| 			.DIBDI(DI), | ||||
| 			.DIPBDIP(DIP), | ||||
| 			.DOBDO(DOBDO), | ||||
| 			.DOPBDOP(DOPBDOP), | ||||
| 			.ADDRBRDADDR(B1ADDR_13), | ||||
| 			.CLKBRDCLK(CLK3 ^ !CLKPOL3), | ||||
| 			.ENBRDEN(|1), | ||||
| 			.REGCEBREGCE(|0), | ||||
| 			.RSTB(|0), | ||||
| 			.WEBWEU(B1EN_2) | ||||
| 		); | ||||
| 	end else begin | ||||
| 		RAMB8BWER #( | ||||
| 			.RAM_MODE("TDP"), | ||||
| 			.DATA_WIDTH_A(CFG_DBITS), | ||||
| 			.DATA_WIDTH_B(CFG_DBITS), | ||||
| 			.WRITE_MODE_A("READ_FIRST"), | ||||
| 			.WRITE_MODE_B("READ_FIRST"), | ||||
| 			`include "brams_init_8.vh" | ||||
| 		) _TECHMAP_REPLACE_ ( | ||||
| 			.DIADI(16'b0), | ||||
| 			.DIPADIP(2'b0), | ||||
| 			.DOADO(DO), | ||||
| 			.DOPADOP(DOP), | ||||
| 			.ADDRAWRADDR(A1ADDR_13), | ||||
| 			.CLKAWRCLK(CLK2 ^ !CLKPOL2), | ||||
| 			.ENAWREN(A1EN), | ||||
| 			.REGCEA(|1), | ||||
| 			.RSTA(|0), | ||||
| 			.WEAWEL(2'b0), | ||||
| 
 | ||||
| 			.DIBDI(DI), | ||||
| 			.DIPBDIP(DIP), | ||||
| 			.DOBDO(DOBDO), | ||||
| 			.DOPBDOP(DOPBDOP), | ||||
| 			.ADDRBRDADDR(B1ADDR_13), | ||||
| 			.CLKBRDCLK(CLK3 ^ !CLKPOL3), | ||||
| 			.ENBRDEN(|1), | ||||
| 			.REGCEBREGCE(|0), | ||||
| 			.RSTB(|0), | ||||
| 			.WEBWEU(B1EN_2) | ||||
| 		); | ||||
| 	end endgenerate | ||||
| endmodule | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue