From d76ac32ec939e421190d8e41ee0ad5e5eacbddd5 Mon Sep 17 00:00:00 2001 From: Simon Schubert <2@0x2c.org> Date: Wed, 20 Feb 2019 11:06:01 +0100 Subject: iCE40 Ultra = iCE5LP = u4k port --- icefuzz/tests/colbuf_io_u4k.sh | 47 ++++++++++++++++++++++ icefuzz/tests/colbuf_logic_u4k.sh | 30 ++++++++++++++ icefuzz/tests/colbuf_ram_u4k.sh | 56 ++++++++++++++++++++++++++ icefuzz/tests/colbuf_u4k.sh | 51 +++++++++++++++++++++++ icefuzz/tests/glb-u4k.sh | 85 +++++++++++++++++++++++++++++++++++++++ icefuzz/tests/io_latched_u4k.sh | 27 +++++++++++++ icefuzz/tests/osc/osc.py | 75 ++++++++++++++++++++++++++++++++++ 7 files changed, 371 insertions(+) create mode 100755 icefuzz/tests/colbuf_io_u4k.sh create mode 100755 icefuzz/tests/colbuf_logic_u4k.sh create mode 100755 icefuzz/tests/colbuf_ram_u4k.sh create mode 100755 icefuzz/tests/colbuf_u4k.sh create mode 100644 icefuzz/tests/glb-u4k.sh create mode 100644 icefuzz/tests/io_latched_u4k.sh create mode 100755 icefuzz/tests/osc/osc.py (limited to 'icefuzz/tests') diff --git a/icefuzz/tests/colbuf_io_u4k.sh b/icefuzz/tests/colbuf_io_u4k.sh new file mode 100755 index 0000000..fe63b62 --- /dev/null +++ b/icefuzz/tests/colbuf_io_u4k.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +set -ex + +mkdir -p colbuf_io_u4k.work +cd colbuf_io_u4k.work + +glb_pins="20 35 37 44" + +pins=" +2 3 4 6 9 10 11 12 + 13 18 19 20 21 + 25 26 27 28 31 32 34 35 36 + 37 38 42 43 44 45 46 47 48 +" +pins="$( echo $pins )" + +for pin in $pins; do + pf="colbuf_io_u4k_$pin" + gpin=$( echo $glb_pins | tr ' ' '\n' | grep -v $pin | sort -R | head -n1; ) + cat > ${pf}.v <<- EOT + module top (input clk, data, output pin); + wire gc; + SB_GB_IO #( + .PIN_TYPE(6'b 0000_00), + .PULLUP(1'b0), + .NEG_TRIGGER(1'b0), + .IO_STANDARD("SB_LVCMOS") + ) gbuf ( + .PACKAGE_PIN(clk), + .GLOBAL_BUFFER_OUTPUT(gc) + ); + SB_IO #( + .PIN_TYPE(6'b 0101_00) + ) pin_obuf ( + .PACKAGE_PIN(pin), + .OUTPUT_CLK(gc), + .D_OUT_0(data) + ); + endmodule + EOT + echo "set_io pin $pin" > ${pf}.pcf + echo "set_io clk $gpin" >> ${pf}.pcf + ICEDEV=u4k-sg48 bash ../../icecube.sh ${pf}.v > ${pf}.log 2>&1 + ../../../icebox/icebox_explain.py ${pf}.asc > ${pf}.exp + rm -rf ${pf}.tmp +done diff --git a/icefuzz/tests/colbuf_logic_u4k.sh b/icefuzz/tests/colbuf_logic_u4k.sh new file mode 100755 index 0000000..2eaaf75 --- /dev/null +++ b/icefuzz/tests/colbuf_logic_u4k.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +set -ex + +mkdir -p colbuf_logic_u4k.work +cd colbuf_logic_u4k.work + +glb_pins="20 35 37 44" + +for x in {1..5} {7..18} {20..24}; do +for y in {1..20}; do + pf="colbuf_logic_u4k_${x}_${y}" + [ -f ${pf}.exp ] && continue + gpin=$( echo $glb_pins | tr ' ' '\n' | sort -R | head -n1; ) + cat > ${pf}.v <<- EOT + module top (input c, d, output q); + SB_DFF dff ( + .C(c), + .D(d), + .Q(q) + ); + endmodule + EOT + echo "set_location dff $x $y 0" > ${pf}.pcf + echo "set_io c $gpin" >> ${pf}.pcf + [ $x = 7 -a $y = 20 ] && continue + ICEDEV=u4k-sg48 bash ../../icecube.sh ${pf}.v > ${pf}.log 2>&1 + ../../../icebox/icebox_explain.py ${pf}.asc > ${pf}.exp + rm -rf ${pf}.tmp +done; done diff --git a/icefuzz/tests/colbuf_ram_u4k.sh b/icefuzz/tests/colbuf_ram_u4k.sh new file mode 100755 index 0000000..6391210 --- /dev/null +++ b/icefuzz/tests/colbuf_ram_u4k.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +set -ex + +mkdir -p colbuf_ram_u4k.work +cd colbuf_ram_u4k.work + +glb_pins="20 35 37 44" + +for x in 6 19; do +for y in {1..30}; do + pf="colbuf_ram_u4k_${x}_${y}" + gpin=$( echo $glb_pins | tr ' ' '\n' | sort -R | head -n1; ) + if [ $((y % 2)) == 1 ]; then + clkport="WCLK" + other_clkport="RCLK" + else + clkport="RCLK" + other_clkport="WCLK" + fi + cat > ${pf}.v <<- EOT + module top (input c, oc, input [1:0] d, output [1:0] q); + wire gc; + SB_GB_IO #( + .PIN_TYPE(6'b 0000_00), + .PULLUP(1'b0), + .NEG_TRIGGER(1'b0), + .IO_STANDARD("SB_LVCMOS") + ) gbuf ( + .PACKAGE_PIN(c), + .GLOBAL_BUFFER_OUTPUT(gc) + ); + SB_RAM40_4K #( + .READ_MODE(3), + .WRITE_MODE(3) + ) ram40 ( + .WADDR(11'b0), + .RADDR(11'b0), + .$clkport(gc), + .$other_clkport(oc), + .RDATA(q), + .WDATA(d), + .WE(1'b1), + .WCLKE(1'b1), + .RE(1'b1), + .RCLKE(1'b1) + ); + endmodule + EOT + echo "set_location ram40 $x $((y - (1 - y%2))) 0" > ${pf}.pcf + echo "set_io oc 1" >> ${pf}.pcf + echo "set_io c $gpin" >> ${pf}.pcf + ICEDEV=u4k-sg48 bash ../../icecube.sh ${pf}.v > ${pf}.log 2>&1 + ../../../icebox/icebox_explain.py ${pf}.asc > ${pf}.exp + rm -rf ${pf}.tmp +done; done diff --git a/icefuzz/tests/colbuf_u4k.sh b/icefuzz/tests/colbuf_u4k.sh new file mode 100755 index 0000000..60cf4a6 --- /dev/null +++ b/icefuzz/tests/colbuf_u4k.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +for f in colbuf_io_u4k.work/*.exp colbuf_logic_u4k.work/*.exp colbuf_ram_u4k.work/*.exp; do + echo $f >&2 + python3 colbuf.py $f +done | sort -u > colbuf_u4k.txt + +get_colbuf_data() +{ + tr -d '(,)' < colbuf_u4k.txt + # for x in {0..2} {4..9} {11..13}; do + # echo $x 4 $x 0 + # echo $x 5 $x 8 + # echo $x 12 $x 9 + # echo $x 13 $x 17 + # done + # for x in 3 10; do + # echo $x 3 $x 0 + # echo $x 3 $x 4 + # echo $x 5 $x 8 + # echo $x 11 $x 9 + # echo $x 11 $x 12 + # echo $x 13 $x 17 + # done +} + +{ + echo "" + for x in {1..33}; do + echo "" + done + for y in {1..33}; do + echo "" + done + for x in {0..33}; do + echo "$x" + done + for y in {0..33}; do + echo "$y" + done + while read x1 y1 x2 y2; do + echo "" + done < <( get_colbuf_data; ) + while read x1 y1 x2 y2; do + echo "" + done < <( get_colbuf_data; ) + while read x1 y1 x2 y2; do + echo "" + done < <( get_colbuf_data; ) + echo "" +} > colbuf_u4k.svg diff --git a/icefuzz/tests/glb-u4k.sh b/icefuzz/tests/glb-u4k.sh new file mode 100644 index 0000000..bdc50f8 --- /dev/null +++ b/icefuzz/tests/glb-u4k.sh @@ -0,0 +1,85 @@ +#!/bin/bash + +set -ex + +mkdir -p glb_u4k.work +cd glb_u4k.work + +glb_pins="20 35 37 44" + +for gpin in $glb_pins; do + pf="glb_u4k_pin_$gpin" + cat > ${pf}.v <<- EOT + module top (input clk, data, output pin); + wire gc; + SB_GB_IO #( + .PIN_TYPE(6'b 0000_00), + .PULLUP(1'b0), + .NEG_TRIGGER(1'b0), + .IO_STANDARD("SB_LVCMOS") + ) gbuf ( + .PACKAGE_PIN(clk), + .GLOBAL_BUFFER_OUTPUT(gc) + ); + SB_IO #( + .PIN_TYPE(6'b 0101_00) + ) pin_obuf ( + .PACKAGE_PIN(pin), + .OUTPUT_CLK(gc), + .D_OUT_0(data) + ); + endmodule + EOT + echo "set_io clk $gpin" > ${pf}.pcf + ICEDEV=u4k-sg48 bash ../../icecube.sh ${pf}.v > ${pf}.log 2>&1 + ../../../icebox/icebox_explain.py ${pf}.asc > ${pf}.exp + rm -rf ${pf}.tmp +done + +oscs="HF LF" + +for osc in $oscs; do + pf="glb_u4k_${osc}" + cat > ${pf}.v <<- EOT + module top (input data, output pin); + wire clk; + SB_${osc}OSC osc( + .CLK${osc}PU(1'b1), + .CLK${osc}EN(1'b1), + .CLK${osc}(clk) + ); + SB_IO #( + .PIN_TYPE(6'b 0101_00) + ) pin_obuf ( + .PACKAGE_PIN(pin), + .OUTPUT_CLK(clk), + .D_OUT_0(data) + ); + endmodule + EOT + ICEDEV=u4k-sg48 bash ../../icecube.sh ${pf}.v > ${pf}.log 2>&1 + ../../../icebox/icebox_explain.py ${pf}.asc > ${pf}.exp + rm -rf ${pf}.tmp +done + +pf="glb_u4k_gbufin" +cat > ${pf}.v <<- EOT + module top (input [7:0] clk, data, output [7:0] pin); + wire [7:0] gc; + SB_GB gbufin[7:0] ( + .USER_SIGNAL_TO_GLOBAL_BUFFER(clk), + .GLOBAL_BUFFER_OUTPUT(gc) + ); + SB_IO #( + .PIN_TYPE(6'b 0101_00) + ) pin_obuf[7:0] ( + .PACKAGE_PIN(pin), + .OUTPUT_CLK(gc), + .D_OUT_0(data) + ); + endmodule + EOT +# echo "set_io clk 10" > ${pf}.pcf +ICEDEV=u4k-sg48 bash ../../icecube.sh ${pf}.v > ${pf}.log 2>&1 +../../../icebox/icebox_explain.py ${pf}.asc > ${pf}.exp +rm -rf ${pf}.tmp diff --git a/icefuzz/tests/io_latched_u4k.sh b/icefuzz/tests/io_latched_u4k.sh new file mode 100644 index 0000000..ca724fb --- /dev/null +++ b/icefuzz/tests/io_latched_u4k.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +set -ex + +mkdir -p io_latched_u4k.work +cd io_latched_u4k.work + +pins=" +2 3 4 6 9 10 11 12 +13 18 19 20 21 23 +25 26 27 28 31 32 34 35 36 +37 38 42 43 44 45 46 47 48 +" +pins="$( echo $pins )" + +for pin in $pins ; do + pf="io_latched_$pin" + cp ../io_latched.v ${pf}.v + read pin_latch pin_data < <( echo $pins | tr ' ' '\n' | grep -v $pin | sort -R; ) + { + echo "set_io pin $pin" + echo "set_io latch_in $pin_latch" + echo "set_io data_out $pin_data" + } > ${pf}.pcf + ICEDEV=u4k-sg48 bash ../../icecube.sh ${pf}.v + ../../../icebox/icebox_vlog.py -SP ${pf}.psb ${pf}.asc > ${pf}.ve +done diff --git a/icefuzz/tests/osc/osc.py b/icefuzz/tests/osc/osc.py new file mode 100755 index 0000000..231ce01 --- /dev/null +++ b/icefuzz/tests/osc/osc.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 + +import os, sys + +device = "u4k" + +if not os.path.exists("./work_osc"): + os.mkdir("./work_osc") + +def run(route_fabric): + name = "./work_osc/osc_cbit_fabric_%d" % route_fabric + with open(name+'.v',"w") as f: + print(""" + module top( + input clkhfpu, + input clkhfen, + input clklfpu, + input clklfen, + output pin, + output pin2, + input data + ); + + wire clkhf; + SB_HFOSC #( + .CLKHF_DIV("%s") + ) hfosc ( + .CLKHFPU(clkhfpu), + .CLKHFEN(clkhfen), + .CLKHF(clkhf) + ); /* synthesis ROUTE_THROUGH_FABRIC = %d */ + + SB_IO #( + .PIN_TYPE(6'b 0101_00) + ) pin_obuf ( + .PACKAGE_PIN(pin), + .OUTPUT_CLK(clkhf), + .D_OUT_0(data) + ); + + wire clklf; + SB_LFOSC lfosc ( + .CLKLFPU(clklfpu), + .CLKLFEN(clklfen), + .CLKLF(clklf) + ); /* synthesis ROUTE_THROUGH_FABRIC = %d */ + + SB_IO #( + .PIN_TYPE(6'b 0101_00) + ) pin2_obuf ( + .PACKAGE_PIN(pin2), + .OUTPUT_CLK(clklf), + .D_OUT_0(data) + ); + + endmodule + """ % ( + "0b11", route_fabric, route_fabric + ), file=f) + + retval = os.system("bash ../../icecube.sh -" + device + " " + name+".v > ./work_osc/icecube.log 2>&1") + if retval != 0: + sys.stderr.write('ERROR: icecube returned non-zero error code\n') + sys.exit(1) + retval = os.system("../../../icebox/icebox_explain.py " + name+".asc > " + name+".exp") + if retval != 0: + sys.stderr.write('ERROR: icebox_explain returned non-zero error code\n') + sys.exit(1) + retval = os.system("../../../icebox/icebox_vlog.py " + name+".asc > " + name+".ve") + if retval != 0: + sys.stderr.write('ERROR: icebox_vlog returned non-zero error code\n') + sys.exit(1) + +run(0) +run(1) -- cgit v1.2.3