| #!/bin/bash |
| |
| set -e |
| lattice_simlib="/opt/lscc/iCEcube2.2014.12/verilog/sb_ice_syn.v" |
| |
| mkdir -p test_pio.work |
| cd test_pio.work |
| |
| for NEGTRIG in 0 1; do |
| for INTYPE in 00 01 10 11; do |
| for OUTTYPE in 0000 0110 1010 1110 0101 1001 1101 \ |
| 0100 1000 1100 0111 1011 1111; do |
| pf="test_pio_${OUTTYPE}${INTYPE}${NEGTRIG}" |
| echo "Testing ${pf}..." |
| if ! test -f ${pf}.bin; then |
| cat > ${pf}.v <<- EOT |
| module top ( |
| inout pin, |
| input latch_in, |
| input clk_en, |
| input clk_in, |
| input clk_out, |
| input oen, |
| input dout_0, |
| input dout_1, |
| output din_0, |
| output din_1, |
| output global |
| ); |
| SB_GB_IO #( |
| .PIN_TYPE(6'b${OUTTYPE}${INTYPE}), |
| .PULLUP(1'b0), |
| .NEG_TRIGGER(1'b${NEGTRIG}), |
| .IO_STANDARD("SB_LVCMOS") |
| ) pin_gb_io ( |
| .PACKAGE_PIN(pin), |
| .GLOBAL_BUFFER_OUTPUT(global), |
| .LATCH_INPUT_VALUE(latch_in), |
| .CLOCK_ENABLE(clk_en), |
| .INPUT_CLK(clk_in), |
| .OUTPUT_CLK(clk_out), |
| .OUTPUT_ENABLE(oen), |
| .D_OUT_0(dout_0), |
| .D_OUT_1(dout_1), |
| .D_IN_0(din_0), |
| .D_IN_1(din_1) |
| ); |
| endmodule |
| EOT |
| bash ../../icecube.sh ${pf}.v > ${pf}.log 2>&1 |
| fi |
| python3 ../../../icebox/icebox_vlog.py -P ${pf}.psb ${pf}.asc > ${pf}_out.v |
| iverilog -D"VCDFILE=\"${pf}_tb.vcd\"" -DINTYPE=${INTYPE} -o ${pf}_tb \ |
| -s testbench ../test_pio_tb.v ${pf}.v ${pf}_out.v $lattice_simlib 2> /dev/null |
| ./${pf}_tb > ${pf}_tb.txt |
| if grep ERROR ${pf}_tb.txt; then exit 1; fi |
| done; done; done |
| |
| echo "All tests passed." |
| |