mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-30 11:12:29 +00:00 
			
		
		
		
	quicklogic: Testing split TDP36K
Adds `double_sync_ram_sdp` to `common/blockram.v`, providing a test for two disjoint memories. Refactor python blockram template to take a list of params to support the above. Also change the smaller single TDP36K tests to also test `port_a_width` value.
This commit is contained in:
		
							parent
							
								
									991850e1c9
								
							
						
					
					
						commit
						8d3b238b9b
					
				
					 2 changed files with 93 additions and 30 deletions
				
			
		|  | @ -1,51 +1,74 @@ | |||
| blockram_template = """\ | ||||
| blockram_template = """# ====================================== | ||||
| design -reset; read_verilog -defer ../../common/blockram.v | ||||
| chparam -set ADDRESS_WIDTH {aw} -set DATA_WIDTH {dw} {top} | ||||
| chparam{param_str} {top} | ||||
| hierarchy -top {top} | ||||
| synth_quicklogic -family qlf_k6n10f -top {top}; cd {top} | ||||
| log TESTING aw:{aw} dw:{dw} top:{top}\ | ||||
| log ** TESTING {top} WITH PARAMS{param_str}\ | ||||
| """ | ||||
| blockram_tests: "list[tuple[int, int, str, list[str]]]" = [ | ||||
| blockram_tests: "list[tuple[list[tuple[str, int]], str, list[str]]]" = [ | ||||
|     # TDP36K = 1024x36bit RAM, 2048x18bit or 4096x9bit also work | ||||
|     (10, 36, "sync_ram_*dp",     ["-assert-count 1 t:TDP36K"]), | ||||
|     (11, 18, "sync_ram_*dp",     ["-assert-count 1 t:TDP36K"]), | ||||
|     (12,  9, "sync_ram_*dp",     ["-assert-count 1 t:TDP36K"]), | ||||
|     ([("ADDRESS_WIDTH", 10), ("DATA_WIDTH", 36)], "sync_ram_*dp", ["-assert-count 1 t:TDP36K"]), | ||||
|     ([("ADDRESS_WIDTH", 11), ("DATA_WIDTH", 18)], "sync_ram_*dp", ["-assert-count 1 t:TDP36K"]), | ||||
|     ([("ADDRESS_WIDTH", 12), ("DATA_WIDTH",  9)], "sync_ram_*dp", ["-assert-count 1 t:TDP36K"]), | ||||
|     # larger sizes need an extra ram | ||||
|     (10, 48, "sync_ram_*dp",     ["-assert-count 2 t:TDP36K"]), | ||||
|     (11, 36, "sync_ram_*dp",     ["-assert-count 2 t:TDP36K"]), | ||||
|     (12, 18, "sync_ram_*dp",     ["-assert-count 2 t:TDP36K"]), | ||||
|     (12, 10, "sync_ram_*dp",     ["-assert-count 2 t:TDP36K"]), | ||||
|     ([("ADDRESS_WIDTH", 10), ("DATA_WIDTH", 48)], "sync_ram_*dp", ["-assert-count 2 t:TDP36K"]), | ||||
|     ([("ADDRESS_WIDTH", 11), ("DATA_WIDTH", 36)], "sync_ram_*dp", ["-assert-count 2 t:TDP36K"]), | ||||
|     ([("ADDRESS_WIDTH", 12), ("DATA_WIDTH", 18)], "sync_ram_*dp", ["-assert-count 2 t:TDP36K"]), | ||||
|     ([("ADDRESS_WIDTH", 12), ("DATA_WIDTH", 10)], "sync_ram_*dp", ["-assert-count 2 t:TDP36K"]), | ||||
|     # 4096x20bit *can* fit in 3, albeit somewhat awkwardly | ||||
|     (12, 20, "sync_ram_*dp",     ["-assert-min 3 t:TDP36K", | ||||
|                                   "-assert-max 4 t:TDP36K"]), | ||||
|     # smaller sizes can still fit in one | ||||
|     (10, 32, "sync_ram_*dp",     ["-assert-count 1 t:TDP36K"]), | ||||
|     (10, 18, "sync_ram_*dp",     ["-assert-count 1 t:TDP36K"]), | ||||
|     (10,  9, "sync_ram_*dp",     ["-assert-count 1 t:TDP36K"]), | ||||
|     (11, 16, "sync_ram_*dp",     ["-assert-count 1 t:TDP36K"]), | ||||
|     (11,  9, "sync_ram_*dp",     ["-assert-count 1 t:TDP36K"]), | ||||
|     (12,  8, "sync_ram_*dp",     ["-assert-count 1 t:TDP36K"]), | ||||
|     (13,  4, "sync_ram_*dp",     ["-assert-count 1 t:TDP36K"]), | ||||
|     (14,  2, "sync_ram_*dp",     ["-assert-count 1 t:TDP36K"]), | ||||
|     (15,  1, "sync_ram_*dp",     ["-assert-count 1 t:TDP36K"]), | ||||
|     ([("ADDRESS_WIDTH", 12), ("DATA_WIDTH", 20)], "sync_ram_*dp", ["-assert-min 3 t:TDP36K", | ||||
|                                                                    "-assert-max 4 t:TDP36K"]), | ||||
| 
 | ||||
|     # smaller sizes can still fit in one, and assign the correct width (1, 2, 4, 8, 18 or 36) | ||||
|     ([("ADDRESS_WIDTH", 10), ("DATA_WIDTH", 32)], "sync_ram_*dp", ["-assert-count 1 t:TDP36K", "-assert-count 1 t:TDP36K a:port_a_width=36 %i"]), | ||||
|     ([("ADDRESS_WIDTH", 10), ("DATA_WIDTH", 24)], "sync_ram_*dp", ["-assert-count 1 t:TDP36K", "-assert-count 1 t:TDP36K a:port_a_width=36 %i"]), | ||||
|     ([("ADDRESS_WIDTH", 10), ("DATA_WIDTH", 18)], "sync_ram_*dp", ["-assert-count 1 t:TDP36K", "-assert-count 1 t:TDP36K a:port_a_width=18 %i"]), | ||||
|     ([("ADDRESS_WIDTH", 10), ("DATA_WIDTH",  9)], "sync_ram_*dp", ["-assert-count 1 t:TDP36K", "-assert-count 1 t:TDP36K a:port_a_width=9 %i"]), | ||||
|     ([("ADDRESS_WIDTH", 11), ("DATA_WIDTH", 16)], "sync_ram_*dp", ["-assert-count 1 t:TDP36K", "-assert-count 1 t:TDP36K a:port_a_width=18 %i"]), | ||||
|     ([("ADDRESS_WIDTH", 11), ("DATA_WIDTH",  9)], "sync_ram_*dp", ["-assert-count 1 t:TDP36K", "-assert-count 1 t:TDP36K a:port_a_width=9 %i"]), | ||||
|     ([("ADDRESS_WIDTH", 12), ("DATA_WIDTH",  8)], "sync_ram_*dp", ["-assert-count 1 t:TDP36K", "-assert-count 1 t:TDP36K a:port_a_width=9 %i"]), | ||||
|     ([("ADDRESS_WIDTH", 13), ("DATA_WIDTH",  4)], "sync_ram_*dp", ["-assert-count 1 t:TDP36K", "-assert-count 1 t:TDP36K a:port_a_width=4 %i"]), | ||||
|     ([("ADDRESS_WIDTH", 14), ("DATA_WIDTH",  2)], "sync_ram_*dp", ["-assert-count 1 t:TDP36K", "-assert-count 1 t:TDP36K a:port_a_width=2 %i"]), | ||||
|     ([("ADDRESS_WIDTH", 15), ("DATA_WIDTH",  1)], "sync_ram_*dp", ["-assert-count 1 t:TDP36K", "-assert-count 1 t:TDP36K a:port_a_width=1 %i"]), | ||||
| 
 | ||||
|     # 2x write width (1024x36bit write / 2048x18bit read = 1TDP36K) | ||||
|     (11, 18, "sync_ram_sdp_wwr", ["-assert-count 1 t:TDP36K"]), | ||||
|     (11,  9, "sync_ram_sdp_wwr", ["-assert-count 1 t:TDP36K"]), | ||||
|     ([("ADDRESS_WIDTH", 11), ("DATA_WIDTH", 18)], "sync_ram_sdp_wwr", ["-assert-count 1 t:TDP36K"]), | ||||
|     ([("ADDRESS_WIDTH", 11), ("DATA_WIDTH",  9)], "sync_ram_sdp_wwr", ["-assert-count 1 t:TDP36K"]), | ||||
|     # 2x read width (1024x36bit read / 2048x18bit write = 1TDP36K) | ||||
|     (11, 18, "sync_ram_sdp_wrr", ["-assert-count 1 t:TDP36K"]), | ||||
|     (10, 36, "sync_ram_sdp_wrr", ["-assert-count 1 t:TDP36K"]), | ||||
|     ([("ADDRESS_WIDTH", 11), ("DATA_WIDTH", 18)], "sync_ram_sdp_wrr", ["-assert-count 1 t:TDP36K"]), | ||||
|     ([("ADDRESS_WIDTH", 10), ("DATA_WIDTH", 36)], "sync_ram_sdp_wrr", ["-assert-count 1 t:TDP36K"]), | ||||
| 
 | ||||
|     # two disjoint 18K memories can share a single TDP36K | ||||
|     ([("ADDRESS_WIDTH_A", 10), ("DATA_WIDTH_A", 18), | ||||
|       ("ADDRESS_WIDTH_B", 10), ("DATA_WIDTH_B", 18)], "double_sync_ram_sdp", ["-assert-count 1 t:TDP36K"]), | ||||
|     ([("ADDRESS_WIDTH_A", 10), ("DATA_WIDTH_A", 16), | ||||
|       ("ADDRESS_WIDTH_B", 11), ("DATA_WIDTH_B",  8)], "double_sync_ram_sdp", ["-assert-count 1 t:TDP36K"]), | ||||
|     ([("ADDRESS_WIDTH_A", 14), ("DATA_WIDTH_A",  1), | ||||
|       ("ADDRESS_WIDTH_B", 11), ("DATA_WIDTH_B",  8)], "double_sync_ram_sdp", ["-assert-count 1 t:TDP36K"]), | ||||
|     # but only if data width is <= 18 | ||||
|     ([("ADDRESS_WIDTH_A",  9), ("DATA_WIDTH_A", 36), | ||||
|       ("ADDRESS_WIDTH_B", 11), ("DATA_WIDTH_B",  9)], "double_sync_ram_sdp", ["-assert-count 2 t:TDP36K"]), | ||||
|     # sharing a TDP36K sets is_split=1 | ||||
|     ([("ADDRESS_WIDTH_A", 10), ("DATA_WIDTH_A", 18), | ||||
|       ("ADDRESS_WIDTH_B", 10), ("DATA_WIDTH_B", 18)], "double_sync_ram_sdp", ["-assert-count 1 t:TDP36K a:is_split=1 %i"]), | ||||
|     # an unshared TDP36K sets is_split=0 | ||||
|     ([("ADDRESS_WIDTH", 10), ("DATA_WIDTH", 36)],     "sync_ram_*dp",        ["-assert-count 1 t:TDP36K a:is_split=0 %i"]), | ||||
| ] | ||||
| 
 | ||||
| with open("t_mem.ys", mode="w") as f: | ||||
|     for (aw, dw, top, assertions) in blockram_tests: | ||||
|     for (params, top, assertions) in blockram_tests: | ||||
|         param_str = "" | ||||
|         for (key, val) in params: | ||||
|             param_str += f" -set {key} {val}" | ||||
|         if "*" in top: | ||||
|             star_sub = ["s", "t"] | ||||
|         else: | ||||
|             star_sub = [""] | ||||
|         for sub in star_sub: | ||||
|             print( | ||||
|                 blockram_template.format(aw=aw, dw=dw, top=top.replace("*", sub)), | ||||
|                 blockram_template.format(param_str=param_str, top=top.replace("*", sub)), | ||||
|                 file=f | ||||
|             ) | ||||
|             for assertion in assertions: | ||||
|                 print("select {}\n".format(assertion), file=f, end=None) | ||||
|                 print("select {}".format(assertion), file=f) | ||||
|             print("", file=f) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue