mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-26 09:24:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			169 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| # Block RAMs for Virtex 4+.
 | |
| # The corresponding mapping files are:
 | |
| # - brams_xc3sda_map.v: Spartan 3A DSP, Spartan 6
 | |
| # - brams_xc4v_map.v: Virtex 4
 | |
| # - brams_xc5v_map.v: Virtex 5
 | |
| # - brams_xc6v_map.v: Virtex 6, Series 7
 | |
| # - brams_xcu_map.v: Ultrascale
 | |
| 
 | |
| ram block $__XILINX_BLOCKRAM_TDP_ {
 | |
| 	byte 9;
 | |
| 	ifdef HAS_SIZE_36 {
 | |
| 		option "MODE" "HALF" {
 | |
| 			abits 14;
 | |
| 			widths 1 2 4 9 18 per_port;
 | |
| 			cost 129;
 | |
| 		}
 | |
| 		option "MODE" "FULL" {
 | |
| 			abits 15;
 | |
| 			widths 1 2 4 9 18 36 per_port;
 | |
| 			cost 257;
 | |
| 		}
 | |
| 		ifdef HAS_CASCADE {
 | |
| 			option "MODE" "CASCADE" {
 | |
| 				abits 16;
 | |
| 				# hack to enforce same INIT layout as in the other modes
 | |
| 				widths 1 2 4 9 per_port;
 | |
| 				cost 513;
 | |
| 			}
 | |
| 		}
 | |
| 	} else {
 | |
| 		option "MODE" "FULL" {
 | |
| 			abits 14;
 | |
| 			widths 1 2 4 9 18 36 per_port;
 | |
| 			cost 129;
 | |
| 		}
 | |
| 		ifdef HAS_CASCADE {
 | |
| 			option "MODE" "CASCADE" {
 | |
| 				abits 15;
 | |
| 				widths 1 2 4 9 per_port;
 | |
| 				cost 257;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	init any;
 | |
| 	port srsw "A" "B" {
 | |
| 		option "MODE" "HALF" {
 | |
| 			width mix;
 | |
| 		}
 | |
| 		option "MODE" "FULL" {
 | |
| 			width mix;
 | |
| 		}
 | |
| 		option "MODE" "CASCADE" {
 | |
| 			width mix 1;
 | |
| 		}
 | |
| 		ifdef HAS_ADDRCE {
 | |
| 			# TODO
 | |
| 			# addrce;
 | |
| 		}
 | |
| 		# Spartan 6 and Virtex 6 have a bug where READ_FIRST is not usable with asynchronous clocks.
 | |
| 		ifdef HAS_CONFLICT_BUG {
 | |
| 			option "HAS_RDFIRST" 1 {
 | |
| 				clock posedge "C";
 | |
| 			}
 | |
| 			option "HAS_RDFIRST" 0 {
 | |
| 				clock posedge;
 | |
| 			}
 | |
| 		} else {
 | |
| 			clock posedge;
 | |
| 		}
 | |
| 		clken;
 | |
| 		rdsrst any gated_clken;
 | |
| 		rdinit any;
 | |
| 		portoption "WRITE_MODE" "NO_CHANGE" {
 | |
| 			rdwr no_change;
 | |
| 			option "MODE" "CASCADE" {
 | |
| 				forbid;
 | |
| 			}
 | |
| 		}
 | |
| 		portoption "WRITE_MODE" "WRITE_FIRST" {
 | |
| 			ifdef HAS_SIZE_36 {
 | |
| 				rdwr new;
 | |
| 			} else {
 | |
| 				rdwr new_only;
 | |
| 			}
 | |
| 		}
 | |
| 		ifdef HAS_CONFLICT_BUG {
 | |
| 			option "HAS_RDFIRST" 1 {
 | |
| 				portoption "WRITE_MODE" "READ_FIRST" {
 | |
| 					rdwr old;
 | |
| 					wrtrans all old;
 | |
| 				}
 | |
| 			}
 | |
| 		} else {
 | |
| 			portoption "WRITE_MODE" "READ_FIRST" {
 | |
| 				rdwr old;
 | |
| 				wrtrans all old;
 | |
| 			}
 | |
| 		}
 | |
| 		optional_rw;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| ifdef HAS_SIZE_36 {
 | |
| 	ram block $__XILINX_BLOCKRAM_SDP_ {
 | |
| 		byte 9;
 | |
| 		option "MODE" "HALF" {
 | |
| 			abits 14;
 | |
| 			widths 1 2 4 9 18 36 per_port;
 | |
| 			cost 129;
 | |
| 		}
 | |
| 		option "MODE" "FULL" {
 | |
| 			abits 15;
 | |
| 			widths 1 2 4 9 18 36 72 per_port;
 | |
| 			cost 257;
 | |
| 		}
 | |
| 		init any;
 | |
| 		port sw "W" {
 | |
| 			ifndef HAS_MIXWIDTH_SDP {
 | |
| 				option "MODE" "HALF" width 36;
 | |
| 				option "MODE" "FULL" width 72;
 | |
| 			}
 | |
| 			ifdef HAS_ADDRCE {
 | |
| 				# TODO
 | |
| 				# addrce;
 | |
| 			}
 | |
| 			# Spartan 6 and Virtex 6 have a bug where READ_FIRST is not usable with asynchronous clocks.
 | |
| 			ifdef HAS_CONFLICT_BUG {
 | |
| 				option "WRITE_MODE" "READ_FIRST" {
 | |
| 					clock posedge "C";
 | |
| 				}
 | |
| 				option "WRITE_MODE" "WRITE_FIRST" {
 | |
| 					clock posedge;
 | |
| 				}
 | |
| 			} else {
 | |
| 				clock posedge;
 | |
| 			}
 | |
| 			clken;
 | |
| 			option "WRITE_MODE" "READ_FIRST" {
 | |
| 				wrtrans all old;
 | |
| 			}
 | |
| 			optional;
 | |
| 		}
 | |
| 		port sr "R" {
 | |
| 			ifndef HAS_MIXWIDTH_SDP {
 | |
| 				option "MODE" "HALF" width 36;
 | |
| 				option "MODE" "FULL" width 72;
 | |
| 			}
 | |
| 			ifdef HAS_ADDRCE {
 | |
| 				# TODO
 | |
| 				# addrce;
 | |
| 			}
 | |
| 			# Spartan 6 and Virtex 6 have a bug where READ_FIRST is not usable with asynchronous clocks.
 | |
| 			ifdef HAS_CONFLICT_BUG {
 | |
| 				option "WRITE_MODE" "READ_FIRST" {
 | |
| 					clock posedge "C";
 | |
| 				}
 | |
| 				option "WRITE_MODE" "WRITE_FIRST" {
 | |
| 					clock posedge;
 | |
| 				}
 | |
| 			} else {
 | |
| 				clock posedge;
 | |
| 			}
 | |
| 			clken;
 | |
| 			rdsrst any gated_clken;
 | |
| 			rdinit any;
 | |
| 			optional;
 | |
| 		}
 | |
| 	}
 | |
| }
 |