blob: 1f23acd2d3642d6c479d68241f27831f648b75fa [file] [log] [blame] [edit]
# These targets make Kokoro complain that the Ninja version is too low.
#add_custom_target(all_xc7_iosettings_generate)
#add_custom_target(all_xc7_iosettings_bin)
#add_custom_target(all_xc7_iosettings_bit_v)
#add_custom_target(all_xc7_iosettings_vivado_diff_fasm)
function(xc7_iosettings_design)
# ~~~
# XC7_IOSETTINGS_DESIGN (
# BOARD <board>
# MODE <mode>
# IOSTANDARD <iostandard>
# [VREF <vref>]
# [DRIVES <drive value list>]
# [SLEWS <slew setting list>]
# [TERMS <IN_TERM setting list]
# )
# ~~~
#
# Generates a design that tests support for a particular IOSTANDARD in the
# given mode of operation. The MODE can be: "input", "output" or "inout" and
# for differential IO: "diff_input", "diff_output" and "diff_inout".
#
# There is always a single IOSTANDARD per design, but there may be more
# combinations of DRIVE, SLEW and IN_TERM settings. These lists are given
# in DRIVES, SLEWS and TERMS parameters.
#
# The VREF parameter specifies an internal vref to be set on the IO bank
# If omitted then no internal vref is set.
#
# The BOARD parameter specifies the pinout variant. Please refer to the
# generate.py script for the list of legal values.
#
# IMPORTANT: Please also note that designs generated by this function are
# not meant to run on an actual hardware!
#
# Parse arguments
set(OPTION_ARGS
DISABLE_DIFF_TEST
)
set(ONE_VALUE_ARGS
BOARD
MODE
IOSTANDARD
VREF
)
set(MULTI_VALUE_ARGS
DRIVES
SLEWS
TERMS
)
cmake_parse_arguments(
XC7_IOSETTINGS_DESIGN
"${OPTION_ARGS}"
"${ONE_VALUE_ARGS}"
"${MULTI_VALUE_ARGS}"
${ARGN}
)
# Get args
set(BOARD ${XC7_IOSETTINGS_DESIGN_BOARD})
set(MODE ${XC7_IOSETTINGS_DESIGN_MODE})
set(IOSTANDARD ${XC7_IOSETTINGS_DESIGN_IOSTANDARD})
set(VREF ${XC7_IOSETTINGS_DESIGN_VREF})
separate_arguments(DRIVE_LIST UNIX_COMMAND ${XC7_IOSETTINGS_DESIGN_DRIVES})
separate_arguments(SLEW_LIST UNIX_COMMAND ${XC7_IOSETTINGS_DESIGN_SLEWS})
separate_arguments(TERM_LIST UNIX_COMMAND ${XC7_IOSETTINGS_DESIGN_TERMS})
# Disable Vivado diff fasm test
if(${XC7_IOSETTINGS_DESIGN_DISABLE_DIFF_TEST})
set(VIVADO_ARGS DISABLE_DIFF_TEST)
else()
set(VIVADO_ARGS "")
endif()
# Generate options
set(GEN_OPTS)
if(DRIVE_LIST)
set(GEN_OPTS ${GEN_OPTS} "--drive" ${DRIVE_LIST})
endif()
if(SLEW_LIST)
set(GEN_OPTS ${GEN_OPTS} "--slew" ${SLEW_LIST})
endif()
if(TERM_LIST)
set(GEN_OPTS ${GEN_OPTS} "--in_term" ${TERM_LIST})
endif()
if(NOT ${VREF} STREQUAL "")
set(GEN_OPTS ${GEN_OPTS} "--vref" ${VREF})
set(DESIGN ${MODE}_${BOARD}_${IOSTANDARD}_${VREF}V)
else()
set(DESIGN ${MODE}_${BOARD}_${IOSTANDARD})
endif()
# Generate the design
set(VERILOG_FILE ${DESIGN}.v)
set(PCF_FILE ${DESIGN}.pcf)
set(XDC_FILE ${DESIGN}.xdc)
add_file_target(FILE ${VERILOG_FILE} GENERATED)
add_file_target(FILE ${PCF_FILE} GENERATED)
add_file_target(FILE ${XDC_FILE} GENERATED)
add_custom_command(
OUTPUT ${VERILOG_FILE} ${PCF_FILE} ${XDC_FILE}
COMMAND ${PYTHON3} ${CMAKE_CURRENT_SOURCE_DIR}/generate.py
--board ${BOARD}
--mode ${MODE}
-o ${DESIGN}
--iostandard ${IOSTANDARD}
${GEN_OPTS}
DEPENDS ${PYTHON3} ${PYTHON3_TARGET} generate.py
)
# Add target
add_fpga_target(
NAME ${DESIGN}
BOARD ${BOARD}
INPUT_IO_FILE ${PCF_FILE}
INPUT_XDC_FILES ${XDC_FILE}
SOURCES ${VERILOG_FILE}
EXPLICIT_ADD_FILE_TARGET
# Enable non-dedicated routes for clocks in fasm2bels until the problem
# of BUFG placement is solved. Those routes are not of concern for this
# test.
BIT_TO_V_EXTRA_ARGS --allow-non-dedicated-clk-routes
)
add_vivado_target(
NAME ${DESIGN}_vivado
PARENT_NAME ${DESIGN}
CLOCK_PINS clk
CLOCK_PERIODS 10.0
XDC ${XDC_FILE}
${VIVADO_ARGS}
)
# get_file_target(TARGET_V ${DESIGN}.v)
# get_file_target(TARGET_PCF ${DESIGN}.pcf)
# get_file_target(TARGET_XDC ${DESIGN}.xdc)
# add_dependencies(all_xc7_iosettings_generate ${TARGET_V} ${TARGET_PCF} ${TARGET_XDC})
# add_dependencies(all_xc7_iosettings_bin ${DESIGN}_bin)
# add_dependencies(all_xc7_iosettings_bit_v ${DESIGN}_bit_v)
# add_dependencies(all_xc7_iosettings_vivado_diff_fasm ${DESIGN}_vivado_diff_fasm)
endfunction()
# =============================================================================
set(BOARD "arty-full")
# Single ended
foreach(MODE input output inout)
# Input termination is only relevan for input
if(MODE STREQUAL "input")
set(TERMS "NONE UNTUNED_SPLIT_40 UNTUNED_SPLIT_50 UNTUNED_SPLIT_60")
else()
set(TERMS "NONE")
endif()
# Drive current set #1
foreach(IOSTANDARD LVCMOS15 LVCMOS25 LVCMOS33)
xc7_iosettings_design(
MODE ${MODE}
BOARD ${BOARD}
IOSTANDARD ${IOSTANDARD}
DRIVES "4 8 12 16"
SLEWS "SLOW FAST"
TERMS "NONE"
)
endforeach()
# Drive current set #2
foreach(IOSTANDARD LVTTL) # Disabled LVCMOS18 due to #1263 (PUDC_B pin issues)
xc7_iosettings_design(
MODE ${MODE}
BOARD ${BOARD}
IOSTANDARD ${IOSTANDARD}
DRIVES "4 8 12 16 24"
SLEWS "SLOW FAST"
TERMS "NONE"
)
endforeach()
# Drive current set #3
xc7_iosettings_design(
MODE ${MODE}
BOARD ${BOARD}
IOSTANDARD LVCMOS12
DRIVES "4 8 12"
SLEWS "SLOW FAST"
TERMS "NONE"
)
# Fixed drive current
foreach(IOSTANDARD SSTL135 SSTL15)
# VREF is only relevant for input/inout
if(NOT MODE STREQUAL "output")
foreach(VREF 0.600 0.675 0.750 0.900)
xc7_iosettings_design(
MODE ${MODE}
BOARD ${BOARD}
IOSTANDARD ${IOSTANDARD}
SLEWS "SLOW FAST"
TERMS ${TERMS}
VREF ${VREF}
)
endforeach()
# Output mode, no VREF setting
else()
xc7_iosettings_design(
MODE ${MODE}
BOARD ${BOARD}
IOSTANDARD ${IOSTANDARD}
SLEWS "SLOW FAST"
TERMS ${TERMS}
)
endif()
endforeach()
endforeach()
# Differential
foreach(MODE diff_output diff_inout)
foreach(IOSTANDARD DIFF_SSTL135 DIFF_SSTL15)
xc7_iosettings_design(
MODE ${MODE}
BOARD ${BOARD}
IOSTANDARD ${IOSTANDARD}
SLEWS "SLOW FAST"
TERMS "NONE"
)
endforeach()
endforeach()