mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	
							parent
							
								
									62311b7ec0
								
							
						
					
					
						commit
						a2fb84fd0c
					
				
					 8 changed files with 133 additions and 39 deletions
				
			
		|  | @ -15,9 +15,9 @@ $(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/ds | |||
| $(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/mem_sim.v)) | ||||
| 
 | ||||
| # RAM
 | ||||
| bramtypes := m10k m20k | ||||
| $(foreach bramtype, $(bramtypes), $(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/bram_$(bramtype).txt))) | ||||
| $(foreach bramtype, $(bramtypes), $(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/bram_$(bramtype)_map.v))) | ||||
| $(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/bram_m10k.txt)) | ||||
| $(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/bram_m20k.txt)) | ||||
| $(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/bram_m20k_map.v)) | ||||
| $(eval $(call add_share_file,share/intel_alm/common,techlibs/intel_alm/common/lutram_mlab.txt)) | ||||
| 
 | ||||
| # Miscellaneous
 | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| bram __MISTRAL_M10K_SDP | ||||
| bram MISTRAL_M10K | ||||
|     init   0   # TODO: Re-enable when I figure out how BRAM init works | ||||
|     abits 13   @D8192x1 | ||||
|     dbits  1   @D8192x1 | ||||
|  | @ -27,7 +27,7 @@ bram __MISTRAL_M10K_SDP | |||
| endbram | ||||
| 
 | ||||
| 
 | ||||
| match __MISTRAL_M10K_SDP | ||||
| match MISTRAL_M10K | ||||
|     min efficiency 5 | ||||
|     make_transp | ||||
| endmatch | ||||
|  |  | |||
|  | @ -1,31 +0,0 @@ | |||
| module __MISTRAL_M10K_SDP(CLK1, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); | ||||
| 
 | ||||
| parameter CFG_ABITS = 10; | ||||
| parameter CFG_DBITS = 10; | ||||
| parameter CFG_ENABLE_A = 1; | ||||
| parameter CFG_ENABLE_B = 1; | ||||
| 
 | ||||
| input CLK1; | ||||
| input [CFG_ABITS-1:0] A1ADDR, B1ADDR; | ||||
| input [CFG_DBITS-1:0] A1DATA; | ||||
| output [CFG_DBITS-1:0] B1DATA; | ||||
| input [CFG_ENABLE_A-1:0] A1EN, B1EN; | ||||
| 
 | ||||
| altsyncram #( | ||||
|     .operation_mode("dual_port"), | ||||
|     .ram_block_type("m10k"), | ||||
|     .widthad_a(CFG_ABITS), | ||||
|     .width_a(CFG_DBITS), | ||||
|     .widthad_b(CFG_ABITS), | ||||
|     .width_b(CFG_DBITS), | ||||
| ) _TECHMAP_REPLACE_ ( | ||||
|     .address_a(A1ADDR), | ||||
|     .data_a(A1DATA), | ||||
|     .wren_a(A1EN), | ||||
|     .address_b(B1ADDR), | ||||
|     .q_b(B1DATA), | ||||
|     .clock0(CLK1), | ||||
|     .clock1(CLK1) | ||||
| ); | ||||
| 
 | ||||
| endmodule | ||||
|  | @ -157,3 +157,38 @@ input [ay_scan_in_width-1:0] ay; | |||
| output [result_a_width-1:0] resulta; | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| (* blackbox *) | ||||
| module cyclonev_ram_block(portaaddr, portadatain, portawe, portbaddr, portbdataout, portbre, clk0); | ||||
| 
 | ||||
| parameter operation_mode = "dual_port"; | ||||
| parameter logical_ram_name = ""; | ||||
| parameter port_a_address_width = 10; | ||||
| parameter port_a_data_width = 10; | ||||
| parameter port_a_logical_ram_depth = 1024; | ||||
| parameter port_a_logical_ram_width = 10; | ||||
| parameter port_a_first_address = 0; | ||||
| parameter port_a_last_address = 1023; | ||||
| parameter port_a_first_bit_number = 0; | ||||
| parameter port_b_address_width = 10; | ||||
| parameter port_b_data_width = 10; | ||||
| parameter port_b_logical_ram_depth = 1024; | ||||
| parameter port_b_logical_ram_width = 10; | ||||
| parameter port_b_first_address = 0; | ||||
| parameter port_b_last_address = 1023; | ||||
| parameter port_b_first_bit_number = 0; | ||||
| parameter port_b_address_clock = "clock0"; | ||||
| parameter port_b_read_enable_clock = "clock0"; | ||||
| parameter mem_init0 = ""; | ||||
| parameter mem_init1 = ""; | ||||
| parameter mem_init2 = ""; | ||||
| parameter mem_init3 = ""; | ||||
| parameter mem_init4 = ""; | ||||
| 
 | ||||
| input [port_a_address_width-1:0] portaaddr; | ||||
| input [port_b_address_width-1:0] portbaddr; | ||||
| input [port_a_data_width-1:0] portadatain; | ||||
| output [port_b_data_width-1:0] portbdataout; | ||||
| input clk0, portawe, portbre; | ||||
| 
 | ||||
| endmodule | ||||
|  |  | |||
|  | @ -73,3 +73,37 @@ always @(posedge CLK1) | |||
| assign B1DATA = mem[B1ADDR]; | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| // The M10K
 | ||||
| // --------
 | ||||
| // TODO
 | ||||
| 
 | ||||
| module MISTRAL_M10K(CLK1, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); | ||||
| 
 | ||||
| parameter CFG_ABITS = 10; | ||||
| parameter CFG_DBITS = 10; | ||||
| 
 | ||||
| input CLK1; | ||||
| input [CFG_ABITS-1:0] A1ADDR, B1ADDR; | ||||
| input [CFG_DBITS-1:0] A1DATA; | ||||
| input A1EN, B1EN; | ||||
| output reg [CFG_DBITS-1:0] B1DATA; | ||||
| 
 | ||||
| reg [2**CFG_ABITS * CFG_DBITS - 1 : 0] mem = 0; | ||||
| 
 | ||||
| specify | ||||
|     $setup(A1ADDR, posedge CLK1, 0); | ||||
|     $setup(A1DATA, posedge CLK1, 0); | ||||
| 
 | ||||
|     if (B1EN) (posedge CLK1 => (B1DATA : A1DATA)) = 0; | ||||
| endspecify | ||||
| 
 | ||||
| always @(posedge CLK1) begin | ||||
|     if (A1EN) | ||||
|         mem[(A1ADDR + 1) * CFG_DBITS - 1 : A1ADDR * CFG_DBITS] <= A1DATA; | ||||
| 
 | ||||
|     if (B1EN) | ||||
|         B1DATA <= mem[(B1ADDR + 1) * CFG_DBITS - 1 : B1ADDR * CFG_DBITS]; | ||||
| end | ||||
| 
 | ||||
| endmodule | ||||
|  |  | |||
|  | @ -88,6 +88,8 @@ endmodule | |||
| 
 | ||||
| module MISTRAL_MLAB(input [4:0] A1ADDR, input A1DATA, A1EN, CLK1, input [4:0] B1ADDR, output B1DATA); | ||||
| 
 | ||||
| parameter _TECHMAP_CELLNAME_ = ""; | ||||
| 
 | ||||
| // Here we get to an unfortunate situation. The cell has a mem_init0 parameter,
 | ||||
| // which takes in a hexadecimal string that could be used to initialise RAM.
 | ||||
| // In the vendor simulation models, this appears to work fine, but Quartus,
 | ||||
|  | @ -99,7 +101,7 @@ module MISTRAL_MLAB(input [4:0] A1ADDR, input A1DATA, A1EN, CLK1, input [4:0] B1 | |||
| // or an undocumented way to get Quartus to initialise from mem_init0 is found.
 | ||||
| 
 | ||||
| `MLAB #( | ||||
|     .logical_ram_name("MISTRAL_MLAB"), | ||||
|     .logical_ram_name(_TECHMAP_CELLNAME_), | ||||
|     .logical_ram_depth(32), | ||||
|     .logical_ram_width(1), | ||||
|     .mixed_port_feed_through_mode("Dont Care"), | ||||
|  | @ -123,6 +125,53 @@ module MISTRAL_MLAB(input [4:0] A1ADDR, input A1DATA, A1EN, CLK1, input [4:0] B1 | |||
| endmodule | ||||
| 
 | ||||
| 
 | ||||
| module MISTRAL_M10K(A1ADDR, A1DATA, A1EN, CLK1, B1ADDR, B1DATA, B1EN); | ||||
| 
 | ||||
| parameter CFG_ABITS = 10; | ||||
| parameter CFG_DBITS = 10; | ||||
| 
 | ||||
| parameter _TECHMAP_CELLNAME_ = ""; | ||||
| 
 | ||||
| input [CFG_ABITS-1:0] A1ADDR, B1ADDR; | ||||
| input [CFG_DBITS-1:0] A1DATA; | ||||
| input CLK1, A1EN, B1EN; | ||||
| output [CFG_DBITS-1:0] B1DATA; | ||||
| 
 | ||||
| // Much like the MLAB, the M10K has mem_init[01234] parameters which would let
 | ||||
| // you initialise the RAM cell via hex literals. If they were implemented.
 | ||||
| 
 | ||||
| cyclonev_ram_block #( | ||||
|     .operation_mode("dual_port"), | ||||
|     .logical_ram_name(_TECHMAP_CELLNAME_), | ||||
|     .port_a_address_width(CFG_ABITS), | ||||
|     .port_a_data_width(CFG_DBITS), | ||||
|     .port_a_logical_ram_depth(2**CFG_ABITS), | ||||
|     .port_a_logical_ram_width(CFG_DBITS), | ||||
|     .port_a_first_address(0), | ||||
|     .port_a_last_address(2**CFG_ABITS - 1), | ||||
|     .port_a_first_bit_number(0), | ||||
|     .port_b_address_width(CFG_ABITS), | ||||
|     .port_b_data_width(CFG_DBITS), | ||||
|     .port_b_logical_ram_depth(2**CFG_ABITS), | ||||
|     .port_b_logical_ram_width(CFG_DBITS), | ||||
|     .port_b_first_address(0), | ||||
|     .port_b_last_address(2**CFG_ABITS - 1), | ||||
|     .port_b_first_bit_number(0), | ||||
|     .port_b_address_clock("clock0"), | ||||
|     .port_b_read_enable_clock("clock0") | ||||
| ) _TECHMAP_REPLACE_ ( | ||||
|     .portaaddr(A1ADDR), | ||||
|     .portadatain(A1DATA), | ||||
|     .portawe(A1EN), | ||||
|     .portbaddr(B1ADDR), | ||||
|     .portbdataout(B1DATA), | ||||
|     .portbre(B1EN), | ||||
|     .clk0(CLK1) | ||||
| ); | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| 
 | ||||
| module MISTRAL_MUL27X27(input [26:0] A, B, output [53:0] Y); | ||||
| 
 | ||||
| `MAC #(.ax_width(27), .ay_scan_in_width(27), .result_a_width(54), .operation_mode("M27x27")) _TECHMAP_REPLACE_ (.ax(A), .ay(B), .resulta(Y)); | ||||
|  |  | |||
|  | @ -235,6 +235,7 @@ struct SynthIntelALMPass : public ScriptPass { | |||
| 
 | ||||
| 		if (!nobram && check_label("map_bram", "(skip if -nobram)")) { | ||||
| 			run(stringf("memory_bram -rules +/intel_alm/common/bram_%s.txt", bram_type.c_str())); | ||||
| 			if (help_mode || bram_type != "m10k") | ||||
| 				run(stringf("techmap -map +/intel_alm/common/bram_%s_map.v", bram_type.c_str())); | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										6
									
								
								tests/arch/intel_alm/blockram.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								tests/arch/intel_alm/blockram.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | |||
| read_verilog ../common/blockram.v | ||||
| chparam -set ADDRESS_WIDTH 10 -set DATA_WIDTH 10 sync_ram_sdp | ||||
| synth_intel_alm -family cyclonev | ||||
| cd sync_ram_sdp | ||||
| select -assert-count 1 t:MISTRAL_M10K | ||||
| select -assert-none t:MISTRAL_M10K %% t:* %D | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue