From 96469e236b5be046926b2cb6e65b5af0e0b5a566 Mon Sep 17 00:00:00 2001 From: David Shah Date: Sun, 16 Feb 2020 10:52:26 +0000 Subject: [PATCH 1/2] Basic ODELAY fuzzer Signed-off-by: David Shah Signed-off-by: Hans Baier --- fuzzers/035a-iob18-odelay/Makefile | 29 +++ fuzzers/035a-iob18-odelay/bits.dbf | 0 fuzzers/035a-iob18-odelay/generate.py | 79 +++++++++ fuzzers/035a-iob18-odelay/generate.tcl | 31 ++++ fuzzers/035a-iob18-odelay/top.py | 234 +++++++++++++++++++++++++ prjxray/segmaker.py | 8 + 6 files changed, 381 insertions(+) create mode 100644 fuzzers/035a-iob18-odelay/Makefile create mode 100644 fuzzers/035a-iob18-odelay/bits.dbf create mode 100644 fuzzers/035a-iob18-odelay/generate.py create mode 100644 fuzzers/035a-iob18-odelay/generate.tcl create mode 100644 fuzzers/035a-iob18-odelay/top.py diff --git a/fuzzers/035a-iob18-odelay/Makefile b/fuzzers/035a-iob18-odelay/Makefile new file mode 100644 index 000000000..a8377454b --- /dev/null +++ b/fuzzers/035a-iob18-odelay/Makefile @@ -0,0 +1,29 @@ +# Copyright (C) 2017-2023 The Project X-Ray Authors. +# +# Use of this source code is governed by a ISC-style +# license that can be found in the LICENSE file or at +# https://opensource.org/licenses/ISC +# +# SPDX-License-Identifier: ISC +N := 5 +include ../fuzzer.mk + +database: build/segbits_riob18.db + +build/segbits_riob18.rdb: $(SPECIMENS_OK) + ${XRAY_SEGMATCH} -m 1 -M 1 -o build/segbits_riob18.rdb $$(find -name segdata_*.txt) + +build/segbits_riob18.db: build/segbits_riob18.rdb + ${XRAY_DBFIXUP} --db-root build --zero-db bits.dbf --seg-fn-in $^ --seg-fn-out $@ + ${XRAY_MASKMERGE} build/mask_riob18.db $$(find -name segdata_*.txt) + +pushdb: + ${XRAY_MERGEDB} rioi build/segbits_riob18.db + ${XRAY_MERGEDB} rioi_tbytesrc build/segbits_riob18.db + ${XRAY_MERGEDB} rioi_tbyteterm build/segbits_riob18.db + ${XRAY_MERGEDB} mask_rioi build/mask_riob18.db + ${XRAY_MERGEDB} mask_rioi_tbytesrc build/mask_riob18.db + ${XRAY_MERGEDB} mask_rioi_tbyteterm build/mask_riob18.db + +.PHONY: database pushdb + diff --git a/fuzzers/035a-iob18-odelay/bits.dbf b/fuzzers/035a-iob18-odelay/bits.dbf new file mode 100644 index 000000000..e69de29bb diff --git a/fuzzers/035a-iob18-odelay/generate.py b/fuzzers/035a-iob18-odelay/generate.py new file mode 100644 index 000000000..58e6d1ff8 --- /dev/null +++ b/fuzzers/035a-iob18-odelay/generate.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Copyright (C) 2017-2023 The Project X-Ray Authors. +# +# Use of this source code is governed by a ISC-style +# license that can be found in the LICENSE file or at +# https://opensource.org/licenses/ISC +# +# SPDX-License-Identifier: ISC +import json + +from prjxray.segmaker import Segmaker, add_site_group_zero +from prjxray import verilog + + +def bitfilter(frame, word): + return frame >= 27 + +def main(): + segmk = Segmaker("design.bits", verbose=True) + + # Load tags + with open("params.json", "r") as fp: + data = json.load(fp) + + odelay_types = ["FIXED", "VARIABLE", "VAR_LOAD"] + delay_srcs = ["ODATAIN"] + + # Output tags + for params in data: + if params['ODELAY_BYPASS']: + prims = params['ODELAY_NOT_IN_USE'].split(" ") + segmk.add_site_tag(prims[0], 'IN_USE', False) + segmk.add_site_tag(prims[1], 'IN_USE', False) + continue + segmk.add_site_tag(params['ODELAY_IN_USE'], 'IN_USE', True) + segmk.add_site_tag(params['ODELAY_NOT_IN_USE'], 'IN_USE', False) + + loc = verilog.unquote(params["LOC"]) + + # Delay type + # VAR_LOAD and VAR_LOAD_PIPE are the same + value = verilog.unquote(params["ODELAY_TYPE"]) + add_site_group_zero( + segmk, loc, "ODELAY_TYPE_", odelay_types, "FIXED", value) + + # Delay value + value = int(params["ODELAY_VALUE"]) + for i in range(5): + segmk.add_site_tag( + loc, "ODELAY_VALUE[%01d]" % i, ((value >> i) & 1) != 0) + segmk.add_site_tag( + loc, "ZODELAY_VALUE[%01d]" % i, ((value >> i) & 1) == 0) + + value = verilog.unquote(params["CINVCTRL_SEL"]) + segmk.add_site_tag(loc, "CINVCTRL_SEL", int(value == "TRUE")) + + value = verilog.unquote(params["PIPE_SEL"]) + segmk.add_site_tag(loc, "PIPE_SEL", int(value == "TRUE")) + + if "IS_C_INVERTED" in params and verilog.unquote(params["CINVCTRL_SEL"]) != "TRUE": + segmk.add_site_tag( + loc, "IS_C_INVERTED", int(params["IS_C_INVERTED"])) + segmk.add_site_tag(loc, "ZINV_C", 1 ^ int(params["IS_C_INVERTED"])) + + value = verilog.unquote(params["HIGH_PERFORMANCE_MODE"]) + segmk.add_site_tag( + loc, "HIGH_PERFORMANCE_MODE", int(value == "TRUE")) + + segmk.add_site_tag( + loc, "ZINV_ODATAIN", 1 ^ int(params["IS_ODATAIN_INVERTED"])) + + segmk.compile(bitfilter=bitfilter) + segmk.write() + + +if __name__ == "__main__": + main() diff --git a/fuzzers/035a-iob18-odelay/generate.tcl b/fuzzers/035a-iob18-odelay/generate.tcl new file mode 100644 index 000000000..0ab7b32da --- /dev/null +++ b/fuzzers/035a-iob18-odelay/generate.tcl @@ -0,0 +1,31 @@ +# Copyright (C) 2017-2023 The Project X-Ray Authors +# +# Use of this source code is governed by a ISC-style +# license that can be found in the LICENSE file or at +# https://opensource.org/licenses/ISC +# +# SPDX-License-Identifier: ISC +create_project -force -part $::env(XRAY_PART) design design +read_verilog top.v +synth_design -top top + +set_property CFGBVS GND [current_design] +set_property CONFIG_VOLTAGE 1.8 [current_design] +set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design] +set_param tcl.collectionResultDisplayLimit 0 + +set_property IS_ENABLED 0 [get_drc_checks {NSTD-1}] +set_property IS_ENABLED 0 [get_drc_checks {UCIO-1}] +set_property IS_ENABLED 0 [get_drc_checks {REQP-79}] +set_property IS_ENABLED 0 [get_drc_checks {REQP-81}] +set_property IS_ENABLED 0 [get_drc_checks {REQP-84}] +set_property IS_ENABLED 0 [get_drc_checks {REQP-85}] +set_property IS_ENABLED 0 [get_drc_checks {REQP-87}] +set_property IS_ENABLED 0 [get_drc_checks {REQP-85}] +set_property IS_ENABLED 0 [get_drc_checks {AVAL-28}] + +place_design +route_design + +write_checkpoint -force design.dcp +write_bitstream -force design.bit diff --git a/fuzzers/035a-iob18-odelay/top.py b/fuzzers/035a-iob18-odelay/top.py new file mode 100644 index 000000000..7e3db78e9 --- /dev/null +++ b/fuzzers/035a-iob18-odelay/top.py @@ -0,0 +1,234 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Copyright (C) 2017-2023 The Project X-Ray Authors. +# +# Use of this source code is governed by a ISC-style +# license that can be found in the LICENSE file or at +# https://opensource.org/licenses/ISC +# +# SPDX-License-Identifier: ISC + +import os, random +random.seed(int(os.getenv("SEED"), 16)) + +import sys +import json + +from prjxray import util +from prjxray.db import Database + +# ============================================================================= + + +def gen_sites(): + db = Database(util.get_db_root(), util.get_part()) + grid = db.grid() + + tile_list = [] + for tile_name in sorted(grid.tiles()): + if "IOB18" not in tile_name or "SING" in tile_name: + continue + tile_list.append(tile_name) + + get_xy = util.create_xy_fun('RIOB18_') + tile_list.sort(key=get_xy) + + for iob_tile_name in tile_list: + iob_gridinfo = grid.gridinfo_at_loc( + grid.loc_of_tilename(iob_tile_name)) + + # Find IOI tile adjacent to IOB + for suffix in ["IOI", "IOI_TBYTESRC", "IOI_TBYTETERM"]: + try: + ioi_tile_name = iob_tile_name.replace("IOB18", suffix) + ioi_gridinfo = grid.gridinfo_at_loc( + grid.loc_of_tilename(ioi_tile_name)) + break + except KeyError: + pass + + iob18s = [k for k, v in iob_gridinfo.sites.items() if v == "IOB18S"][0] + iob18m = [k for k, v in iob_gridinfo.sites.items() if v == "IOB18M"][0] + odelay_s = iob18s.replace("IOB", "ODELAY") + odelay_m = iob18m.replace("IOB", "ODELAY") + + yield iob18m, odelay_m, iob18s, odelay_s + + +def run(): + + # Get all [LR]IOI3 tiles + tiles = list(gen_sites()) + + # Header + print("// Tile count: %d" % len(tiles)) + print("// Seed: '%s'" % os.getenv("SEED")) + + ninputs = 0 + do_idx = [] + for i, sites in enumerate(tiles): + if random.randint(0, 1): + do_idx.append(ninputs) + ninputs += 1 + else: + do_idx.append(None) + + print( + ''' +module top ( + (* CLOCK_BUFFER_TYPE = "NONE" *) + input wire clk, + output wire [{N}:0] do +); + +wire clk_buf = clk; + +wire [{N}:0] do_buf; + '''.format(N=ninputs - 1)) + + # LOCes IOBs + data = [] + for i, (sites, obuf_idx) in enumerate(zip(tiles, do_idx)): + + if random.randint(0, 1): + iob_inuse = sites[0] + iob_other = sites[2] + odelay_inuse = sites[1] + odelay_other = sites[3] + else: + iob_inuse = sites[2] + iob_other = sites[0] + odelay_inuse = sites[3] + odelay_other = sites[1] + + use_obuf = obuf_idx is not None + + if not use_obuf: + continue + + params = { + "LOC": + "\"" + odelay_inuse + "\"", + "ODELAY_TYPE": + "\"" + random.choice( + ["FIXED", "VARIABLE", "VAR_LOAD"]) + "\"", + "ODELAY_VALUE": + random.randint(0, 31), + "HIGH_PERFORMANCE_MODE": + "\"" + random.choice(["TRUE", "FALSE"]) + "\"", + "CINVCTRL_SEL": + "\"" + random.choice(["TRUE", "FALSE"]) + "\"", + "PIPE_SEL": + "\"" + random.choice(["TRUE", "FALSE"]) + "\"", + "IS_C_INVERTED": + random.randint(0, 1), + "IS_ODATAIN_INVERTED": + random.randint(0, 1), + } + + if params["ODELAY_TYPE"] != "\"VAR_LOAD_PIPE\"": + params["PIPE_SEL"] = "\"FALSE\"" + + # The datasheet says that for these two modes the delay is set to 0 + if params["ODELAY_TYPE"] == "\"VAR_LOAD\"": + params["ODELAY_VALUE"] = 0 + if params["ODELAY_TYPE"] == "\"VAR_LOAD_PIPE\"": + params["ODELAY_VALUE"] = 0 + + if params["ODELAY_TYPE"] == "\"FIXED\"": + params["IS_C_INVERTED"] = 0 + + param_str = ",".join(".%s(%s)" % (k, v) for k, v in params.items()) + + if random.randint(0, 5) == 0: + print('') + print('(* LOC="%s", KEEP, DONT_TOUCH *)' % iob_inuse) + print( + 'OBUF obuf_%03d (.I(%d), .O(do[%3d]));' % + (obuf_idx, random.randint(0, 1), obuf_idx)) + params['ODELAY_BYPASS'] = True + params["ODELAY_NOT_IN_USE"] = odelay_inuse + " " + odelay_other + else: + print('') + print('(* LOC="%s", KEEP, DONT_TOUCH *)' % iob_inuse) + print( + 'OBUF obuf_%03d (.I(do_buf[%3d]), .O(do[%3d]));' % + (obuf_idx, obuf_idx, obuf_idx)) + print( + 'mod #(%s) mod_%03d (.clk(clk_buf), .O(do_buf[%3d]));' % + (param_str, i, obuf_idx)) + params['ODELAY_BYPASS'] = False + params["ODELAY_IN_USE"] = odelay_inuse + params["ODELAY_NOT_IN_USE"] = odelay_other + + data.append(params) + + # Store params + with open("params.json", "w") as fp: + json.dump(data, fp, sort_keys=True, indent=1) + + print( + ''' +// IDELAYCTRL +(* KEEP, DONT_TOUCH *) +IDELAYCTRL idelayctrl(); + +endmodule + +(* KEEP, DONT_TOUCH *) +module mod( + input wire clk, + output wire O +); + +parameter LOC = ""; +parameter ODELAY_TYPE = "FIXED"; +parameter ODELAY_VALUE = 0; +parameter DELAY_SRC = "ODATAIN"; +parameter HIGH_PERFORMANCE_MODE = "TRUE"; +parameter SIGNAL_PATTERN = "DATA"; +parameter CINVCTRL_SEL = "FALSE"; +parameter PIPE_SEL = "FALSE"; +parameter IS_C_INVERTED = 0; +parameter IS_ODATAIN_INVERTED = 0; + +wire x; +wire lut; + +(* KEEP, DONT_TOUCH *) +LUT2 l( .O(lut) ); + +// ODELAY +(* LOC=LOC, KEEP, DONT_TOUCH *) +ODELAYE2 #( + .ODELAY_TYPE(ODELAY_TYPE), + .ODELAY_VALUE(ODELAY_VALUE), + .DELAY_SRC(DELAY_SRC), + .HIGH_PERFORMANCE_MODE(HIGH_PERFORMANCE_MODE), + .SIGNAL_PATTERN(SIGNAL_PATTERN), + .CINVCTRL_SEL(CINVCTRL_SEL), + .PIPE_SEL(PIPE_SEL), + .IS_C_INVERTED(IS_C_INVERTED), + .IS_ODATAIN_INVERTED(IS_ODATAIN_INVERTED) +) +odelay +( + .C(clk), + .REGRST(), + .LD(), + .CE(), + .INC(), + .CINVCTRL(), + .CNTVALUEIN(), + .ODATAIN(lut), + .LDPIPEEN(), + .DATAOUT(O), + .CNTVALUEOUT() +); + +endmodule + ''') + + +run() diff --git a/prjxray/segmaker.py b/prjxray/segmaker.py index c362bef1d..6689d6f23 100644 --- a/prjxray/segmaker.py +++ b/prjxray/segmaker.py @@ -329,6 +329,7 @@ def name_default(): 'RAMB18': name_bram18, 'IOB': name_y0y1, 'IDELAY': name_y0y1, + 'ODELAY': name_y0y1, 'ILOGIC': name_y0y1, 'OLOGIC': name_y0y1, 'IBUFDS_GTE2': name_y0y1, @@ -391,6 +392,13 @@ def name_default(): if 'GTP_INT_INTERFACE' in tile_type_norm: tile_type_norm = 'GTP_INT_INTERFACE' + if tile_type_norm in ['LIOI', 'RIOI']: + tile_type_norm = 'IOI' + if tile_type_norm in ['LIOI_TBYTESRC', 'RIOI_TBYTESRC']: + tile_type_norm = 'IOI' + if tile_type_norm in ['LIOI_TBYTETERM', 'RIOI_TBYTETERM']: + tile_type_norm = 'IOI' + # ignore dummy tiles (ex: VBRK) if len(tiledata['bits']) == 0: if self.verbose: From 1911a458215b696970df604016fcfd968baadebe Mon Sep 17 00:00:00 2001 From: Hans Baier Date: Tue, 24 Jan 2023 07:39:59 +0700 Subject: [PATCH 2/2] fuzzers/Makefile: add odelay fuzzer and factor out condition for high performance banks Signed-off-by: Hans Baier --- fuzzers/Makefile | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/fuzzers/Makefile b/fuzzers/Makefile index 94a109491..dde3c34a2 100644 --- a/fuzzers/Makefile +++ b/fuzzers/Makefile @@ -84,6 +84,11 @@ fuzzer_$(1): fuzzer_ok/fuzzer_$(1)_$(XRAY_PART).ok endef +ifeq ($(XRAY_DATABASE),kintex7) +HAS_HIGH_PERFORMANCE_BANKS=1 +else +HAS_HIGH_PERFORMANCE_BANKS=0 +endif $(eval $(call fuzzer,000-init-db,,part)) ifneq ($(FUZZONLY),Y) @@ -113,7 +118,7 @@ $(eval $(call fuzzer,027-bram36-config,005-tilegrid,all)) $(eval $(call fuzzer,028-fifo-config,005-tilegrid,all)) $(eval $(call fuzzer,029-bram-fifo-config,005-tilegrid,all)) $(eval $(call fuzzer,030-iob,005-tilegrid,all)) -ifeq ($(XRAY_DATABASE),kintex7) +ifeq ($(HAS_HIGH_PERFORMANCE_BANKS),1) $(eval $(call fuzzer,030-iob18,005-tilegrid,all)) endif $(eval $(call fuzzer,031-cmt-mmcm,005-tilegrid,all)) @@ -126,16 +131,17 @@ $(eval $(call fuzzer,034b-cmt-mmcm-pips,005-tilegrid 071-ppips,all)) endif $(eval $(call fuzzer,035-iob-ilogic,005-tilegrid,all)) $(eval $(call fuzzer,035a-iob-idelay,005-tilegrid,all)) -ifeq ($(XRAY_DATABASE),kintex7) +ifeq ($(HAS_HIGH_PERFORMANCE_BANKS),1) $(eval $(call fuzzer,035a-iob18-idelay,005-tilegrid,all)) +$(eval $(call fuzzer,035a-iob18-odelay,005-tilegrid,all)) endif $(eval $(call fuzzer,035b-iob-iserdes,005-tilegrid,all)) $(eval $(call fuzzer,036-iob-ologic,005-tilegrid,all)) -ifeq ($(XRAY_DATABASE),kintex7) +ifeq ($(HAS_HIGH_PERFORMANCE_BANKS),1) $(eval $(call fuzzer,036-iob18-ologic,005-tilegrid,all)) endif $(eval $(call fuzzer,037-iob-pips,005-tilegrid 035b-iob-iserdes,all)) -ifeq ($(XRAY_DATABASE),kintex7) +ifeq ($(HAS_HIGH_PERFORMANCE_BANKS),1) $(eval $(call fuzzer,037-iob18-pips,005-tilegrid 035b-iob-iserdes,all)) endif $(eval $(call fuzzer,038-cfg,005-tilegrid,all)) @@ -148,7 +154,7 @@ $(eval $(call fuzzer,044-clk-bufg-pips,046-clk-bufg-muxed-pips,all)) $(eval $(call fuzzer,045-hclk-cmt-pips,005-tilegrid,all)) $(eval $(call fuzzer,046-clk-bufg-muxed-pips,005-tilegrid,all)) $(eval $(call fuzzer,047-hclk-ioi-pips,005-tilegrid,all)) -ifeq ($(XRAY_DATABASE),kintex7) +ifeq ($(HAS_HIGH_PERFORMANCE_BANKS),1) $(eval $(call fuzzer,047-hclk-ioi18-pips,005-tilegrid,all)) endif $(eval $(call fuzzer,047a-hclk-idelayctrl-pips,047-hclk-ioi-pips,all))