上文提到了51內核ICE51(https://github.com/ashleyjr/ice51.git)
本文就來看看怎麼編譯C程序,仿真模擬運行在該IP軟核上:
環境:MingW32、iverilog、yosys、arachne-pnr、icestorm(icetime)等
軟核佈線:(synth腳本)
#!/bin/bash
echo "========================================================"
echo "Running synth..."
rm -f syn.log
yosys -p 'synth_ice40 -top ice51_top -blif ice51.blif' rtl/ice51_top.v rtl/ice51.v rtl/mem_512x8b.v > syn.log
cat syn.log | grep -A20 statistics
echo "========================================================"
echo "Running place and route..."
rm -f blif.log
yosys -o ice51.syn.v ice51.blif > blif.log
arachne-pnr -d 5k -w etc/ice51.pcf ice51.blif -o ice51.asc
echo "========================================================"
echo "Running Timing check..."
icetime -tmd hx1k ice51.asc > ice51.time
cat ice51.time | grep -A20 "Total path delay"
編譯仿真:(run腳本)
#!/bin/bash
CMD="cd verif/src"
echo $CMD
$CMD
CMD="make"
echo $CMD
$CMD
CMD="cd ../.."
echo $CMD
$CMD
PRELOAD="preload"
if [[ "$2" == "$PRELOAD" ]]; then
P_PRELOAD=" -D PRELOAD"
fi
#
#./run all preload
#
# Run all tests add check for pass fail
ALL="all"
if [[ "$1" == "$ALL" ]]; then
echo ""
echo "--- Simulation begins ---"
for filename in verif/src/*.c; do
echo $filename
echo -n -e " >\t\t\t"
ext=".hex"
cp -f ${filename/\.c/$ext} load_mem.hex
ext=".checks"
cp -f ${filename/\.c/$ext} checks.hex
iverilog -o ice51.dat -D SIM $P_PRELOAD -c etc/filelist.txt
vvp ice51.dat -vcd | grep "PASSED\|ERROR"
done
echo "--- Simulation ends ---"
exit
fi
# Run a single test
ext=".hex"
CMD="cp -f verif/src/${1/\.c/}$ext load_mem.hex"
echo $CMD
$CMD
ext=".checks"
CMD="cp -f verif/src/${1/\.c/}$ext checks.hex"
echo $CMD
$CMD
CMD="iverilog -o ice51.dat -D SIM $P_PRELOAD -c etc/filelist.txt"
echo $CMD
$CMD
CMD="vvp ice51.dat -vcd > /dev/null 2>&1"
echo $CMD
$CMD
# Load waves for a single test
WAVES="w"
if [ "$2" == "$WAVES" ] || [ "$3" == "$WAVES" ]; then
CMD="gtkwave -S etc/signals.tcl ice51.vcd"
echo $CMD
$CMD
fi
準備好環境,分別執行1、synth 2、run
仿真結果如下:
運行仿真結果:
一個CPU就製作出來了,神奇不?
記住,山外有山,很多時候,不是自己笨,而是自己的眼界沒有被打開!!!