diff --git a/minitests/iob/DRIVE.tcl b/minitests/iob/DRIVE.tcl new file mode 100644 index 00000000..171315b2 --- /dev/null +++ b/minitests/iob/DRIVE.tcl @@ -0,0 +1,9 @@ +source "$::env(SRC_DIR)/template.tcl" + +# set vals "0 4 8 12 16 24" +# ERROR: [Common 17-69] Command failed: Illegal DRIVE_STRENGTH value '0' for standard 'LVCMOS33'. +# Legal values: 4, 8, 12, 16 +set prop DRIVE +set port [get_ports do] +source "$::env(SRC_DIR)/sweep.tcl" + diff --git a/minitests/iob/IOSTANDARD.tcl b/minitests/iob/IOSTANDARD.tcl new file mode 100644 index 00000000..09871672 --- /dev/null +++ b/minitests/iob/IOSTANDARD.tcl @@ -0,0 +1,6 @@ +source "$::env(SRC_DIR)/template.tcl" + +set prop IOSTANDARD +set port [get_ports do] +source "$::env(SRC_DIR)/sweep.tcl" + diff --git a/minitests/iob/Makefile b/minitests/iob/Makefile index d074989b..a0cd12fa 100644 --- a/minitests/iob/Makefile +++ b/minitests/iob/Makefile @@ -1,4 +1,9 @@ -all: build/env build/roi_roi_io.diff +all: build/env build/roi_roi_io.diff \ + build/PULLTYPE/run.ok \ + build/SLEW/run.ok \ + build/DRIVE/run.ok \ + build/IOSTANDARD/run.ok \ + clean: rm -rf build @@ -10,4 +15,18 @@ build/env: build/roi_roi_io.diff: $(MAKE) -f diff.mk OUT_DIFF=build/roi_io.diff PRJL=roi_io_a PRJR=roi_io_b +build/PULLTYPE/run.ok: + PROJECT=PULLTYPE bash runme_tcl.sh + diff build/PULLTYPE/design_{PULLDOWN,KEEPER}.bits || true + diff build/PULLTYPE/design_{PULLDOWN,PULLUP}.bits || true + diff build/PULLTYPE/design_{PULLDOWN,NONE}.bits || true + +build/SLEW/run.ok: + PROJECT=SLEW bash runme_tcl.sh + +build/DRIVE/run.ok: + PROJECT=DRIVE bash runme_tcl.sh + +build/IOSTANDARD/run.ok: + PROJECT=IOSTANDARD bash runme_tcl.sh diff --git a/minitests/iob/PULLTYPE.tcl b/minitests/iob/PULLTYPE.tcl new file mode 100644 index 00000000..c227fe1e --- /dev/null +++ b/minitests/iob/PULLTYPE.tcl @@ -0,0 +1,15 @@ +source "$::env(SRC_DIR)/template.tcl" + +set port [get_ports di] + +set_property PULLTYPE "" $port +write_checkpoint -force design_NONE.dcp +write_bitstream -force design_NONE.bit + +set vals "KEEPER PULLUP PULLDOWN" +foreach {val} $vals { + set_property PULLTYPE $val $port + write_checkpoint -force design_$val.dcp + write_bitstream -force design_$val.bit +} + diff --git a/minitests/iob/README.md b/minitests/iob/README.md index e69de29b..736770a2 100644 --- a/minitests/iob/README.md +++ b/minitests/iob/README.md @@ -0,0 +1,39 @@ +# PULLTYPE + +PULLTYPE 28 29 30 +NONE X +KEEPER X X +PULLDOWN +PULLUP X X + + +# DRIVE + +DRIVE A00 A02 A08 A10 B09 B01 +0 FIXME +4 X X X +8 X X X +12 X X X +16 X X X +24 FIXME + + +# IOSTANDARD + +Effects bits, TBD exactly how +Sample output: + +diff LVCMOS33.bits LVTTL.bits +< bit_00020026_006_00 +> bit_00020026_006_08 + +diff LVCMOS33.bits PCI33_3.bits +< bit_00020026_006_02 +< bit_00020026_006_18 +< bit_00020026_006_22 +> bit_00020026_006_10 +> bit_00020026_006_16 +> bit_00020026_006_20 +> bit_00020027_006_11 +> bit_00020027_006_15 + diff --git a/minitests/iob/SLEW.tcl b/minitests/iob/SLEW.tcl new file mode 100644 index 00000000..ac97d92c --- /dev/null +++ b/minitests/iob/SLEW.tcl @@ -0,0 +1,8 @@ +source "$::env(SRC_DIR)/template.tcl" + +# set vals "SLOW MEDIUM FAST" +# ERROR: [Common 17-69] Command failed: Slew type 'MEDIUM' is not supported by I/O standard 'LVCMOS33' +set prop SLEW +set port [get_ports do] +source "$::env(SRC_DIR)/sweep.tcl" + diff --git a/minitests/iob/diff_tcl.mk b/minitests/iob/diff_tcl.mk new file mode 100644 index 00000000..5c40cf3a --- /dev/null +++ b/minitests/iob/diff_tcl.mk @@ -0,0 +1,11 @@ +all: $(OUT_DIFF) + +$(OUT_DIFF): build/$(PRJL)/design.bits build/$(PRJR)/design.bits + diff build/$(PRJL)/design.bits build/$(PRJR)/design.bits >$(OUT_DIFF) || true + +build/$(PRJL)/design.bits: + PROJECT=$(PRJL) bash runme_tcl.sh + +build/$(PRJR)/design.bits: + PROJECT=$(PRJR) bash runme_tcl.sh + diff --git a/minitests/iob/runme_tcl.sh b/minitests/iob/runme_tcl.sh new file mode 100644 index 00000000..143dfdbf --- /dev/null +++ b/minitests/iob/runme_tcl.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +set -ex + +: "${PROJECT:?Need to set PROJECT non-empty}" + +# Create build dir +export SRC_DIR=$PWD +BUILD_DIR=build/$PROJECT +mkdir -p $BUILD_DIR +cd $BUILD_DIR + +export TOP_V=$SRC_DIR/tcl.v + +vivado -mode batch -source $SRC_DIR/$PROJECT.tcl +for x in design*.bit; do + ${XRAY_BITREAD} -F $XRAY_ROI_FRAMES -o ${x}s -z -y $x +done +test -z "$(fgrep CRITICAL vivado.log)" +touch run.ok + diff --git a/minitests/iob/sweep.tcl b/minitests/iob/sweep.tcl new file mode 100644 index 00000000..208f2195 --- /dev/null +++ b/minitests/iob/sweep.tcl @@ -0,0 +1,22 @@ +# Sweep all values of $prop on given I/O $port +# Write out bitstream for all legal values + +set vals [list_property_value $prop $port] +foreach {val} $vals { + puts $val + # Not all listable properties are settable + # Its easiest to try setting and see if it sticks + set_property -quiet $prop $val $port + set got [get_property $prop $port] + if {"$got" != "$val"} { + puts " Skipping: wanted $val, got $got" + continue + } + if {[catch {write_bitstream -force design_$val.bit} issue]} { + puts "WARNING failed to write: $issue" + continue + } + # Only write checkpoints for acceptable bitstreams + write_checkpoint -force design_$val.dcp +} + diff --git a/minitests/iob/tcl.v b/minitests/iob/tcl.v new file mode 100644 index 00000000..6535c2d8 --- /dev/null +++ b/minitests/iob/tcl.v @@ -0,0 +1,39 @@ +module top(input clk, stb, di, output do); + localparam integer DIN_N = 256; + localparam integer DOUT_N = 256; + + reg [DIN_N-1:0] din; + wire [DOUT_N-1:0] dout; + + reg [DIN_N-1:0] din_shr; + reg [DOUT_N-1:0] dout_shr; + + always @(posedge clk) begin + din_shr <= {din_shr, di}; + dout_shr <= {dout_shr, din_shr[DIN_N-1]}; + if (stb) begin + din <= din_shr; + dout_shr <= dout; + end + end + + assign do = dout_shr[DOUT_N-1]; + + roi + roi ( + .clk(clk), + .din(din), + .dout(dout) + ); +endmodule + +module roi(input clk, input [255:0] din, output [255:0] dout); + assign dout = din; +endmodule + +/* +module top (input i, output o); + assign o = i; +endmodule +*/ + diff --git a/minitests/iob/template.tcl b/minitests/iob/template.tcl new file mode 100644 index 00000000..0c0dc873 --- /dev/null +++ b/minitests/iob/template.tcl @@ -0,0 +1,20 @@ +# Create a simple design with a few IOs + +create_project -force -part $::env(XRAY_PART) design design +read_verilog $::env(TOP_V) +synth_design -top top -flatten_hierarchy none + +set_property -dict "PACKAGE_PIN $::env(XRAY_PIN_00) IOSTANDARD LVCMOS33" [get_ports clk] +set_property -dict "PACKAGE_PIN $::env(XRAY_PIN_01) IOSTANDARD LVCMOS33" [get_ports stb] +set_property -dict "PACKAGE_PIN $::env(XRAY_PIN_02) IOSTANDARD LVCMOS33" [get_ports di] +set_property -dict "PACKAGE_PIN $::env(XRAY_PIN_03) IOSTANDARD LVCMOS33" [get_ports do] + +set_property CFGBVS VCCO [current_design] +set_property CONFIG_VOLTAGE 3.3 [current_design] +set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design] + +set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_IBUF] + +place_design +route_design +