From e65cf9f5fdeb17dc29d0e4145d0d0d86fec0a789 Mon Sep 17 00:00:00 2001 From: AurelienUoU Date: Fri, 12 Jul 2019 08:55:19 -0600 Subject: [PATCH 01/10] Update ERI-demo --- ERI_demo/ERI.sh | 6 +- ERI_demo/eri_demo.sh | 24 +- ERI_demo/my_eri_demo.sh | 42 ---- ERI_demo/pipelined_8b_adder.act | 95 -------- ERI_demo/pipelined_8b_adder.blif | 137 ----------- ERI_demo/pipelined_8b_adder.v | 63 ----- .../pipelined_8b_adder_formal_random_top_tb.v | 219 ------------------ fpga_flow/tuto_fpga_flow.sh | 2 +- vpr7_x2p/vpr/regression_verilog.sh | 2 +- 9 files changed, 15 insertions(+), 575 deletions(-) delete mode 100644 ERI_demo/my_eri_demo.sh delete mode 100644 ERI_demo/pipelined_8b_adder.act delete mode 100644 ERI_demo/pipelined_8b_adder.blif delete mode 100644 ERI_demo/pipelined_8b_adder.v delete mode 100644 ERI_demo/pipelined_8b_adder_formal_random_top_tb.v diff --git a/ERI_demo/ERI.sh b/ERI_demo/ERI.sh index 75211050a..cd812298c 100755 --- a/ERI_demo/ERI.sh +++ b/ERI_demo/ERI.sh @@ -5,7 +5,7 @@ my_pwd=$PWD fpga_flow_scripts=${my_pwd}/fpga_flow/scripts vpr_path=${my_pwd}/vpr7_x2p/vpr -benchmark="pipelined_8b_adder" +benchmark="test_modes" include_netlists="_include_netlists.v" compiled_file="compiled_$benchmark" tb_formal_postfix="_top_formal_verification_random_tb" @@ -45,5 +45,7 @@ if ["$result" = ""]; then fi else echo "Verification succeed" - cd $my_pwd fi + +gtkwave ${benchmark}_formal.vcd & +cd $my_pwd diff --git a/ERI_demo/eri_demo.sh b/ERI_demo/eri_demo.sh index 807c5110b..6974366a7 100644 --- a/ERI_demo/eri_demo.sh +++ b/ERI_demo/eri_demo.sh @@ -3,18 +3,18 @@ # Set variables # For FPGA-Verilog ONLY -benchmark="pipelined_8b_adder" +benchmark="test_modes" OpenFPGA_path="OPENFPGAPATHKEYWORD" verilog_output_dirname="${benchmark}_Verilog" verilog_output_dirpath="$vpr_path" tech_file="${OpenFPGA_path}/fpga_flow/tech/PTM_45nm/45nm.xml" # VPR critical inputs -template_arch_xml_file="${OpenFPGA_path}/fpga_flow/arch/template/k6_N10_sram_chain_HC_DPRAM_template.xml" -arch_xml_file="${OpenFPGA_path}/fpga_flow/arch/generated/k6_N10_sram_chain_HC_DPRAM.xml" -blif_file="${OpenFPGA_path}/ERI_demo/$benchmark.blif" -act_file="${OpenFPGA_path}/ERI_demo/$benchmark.act " -verilog_reference="${OpenFPGA_path}/ERI_demo/$benchmark.v" -vpr_route_chan_width="300" +template_arch_xml_file="${OpenFPGA_path}/fpga_flow/arch/template/k6_N10_sram_chain_HC_template.xml" +arch_xml_file="${OpenFPGA_path}/fpga_flow/arch/generated/k6_N10_sram_chain_HC.xml" +blif_file="${OpenFPGA_path}/fpga_flow/benchmarks/Blif/Test_Modes/$benchmark.blif" +act_file="${OpenFPGA_path}/fpga_flow/benchmarks/Blif/Test_Modes/$benchmark.act " +verilog_reference="${OpenFPGA_path}/fpga_flow/benchmarks/Verilog/Test_Modes/$benchmark.v" +vpr_route_chan_width="200" fpga_flow_script="${OpenFPGA_path}/fpga_flow/scripts" ff_path="$vpr_path/VerilogNetlists/ff.v" new_ff_path="$verilog_output_dirpath/$verilog_output_dirname/SRC/ff.v" @@ -23,15 +23,13 @@ ff_include_path="$verilog_output_dirpath/$verilog_output_dirname" arch_ff_keyword="FFPATHKEYWORD" tb_formal_ext="_formal_random_top_tb.v" formal_postfix="_top_formal_verification" -clk_unmapped="clk\[0:0\]" -clk_mapped="clk_fm" # Remove previous designs rm -rf $verilog_output_dirpath/$verilog_output_dirname mkdir ${OpenFPGA_path}/fpga_flow/arch/generated -#cd $fpga_flow_scripts +cd $fpga_flow_scripts perl rewrite_path_in_file.pl -i $template_arch_xml_file -o $arch_xml_file perl rewrite_path_in_file.pl -i $arch_xml_file -k $arch_ff_keyword $new_ff_path @@ -39,14 +37,10 @@ perl rewrite_path_in_file.pl -i $arch_xml_file -k $arch_ff_keyword $new_ff_path cd $vpr_path # Run VPR -./vpr $arch_xml_file $blif_file --full_stats --activity_file $act_file --fpga_verilog --fpga_verilog_dir $verilog_output_dirpath/$verilog_output_dirname --fpga_x2p_rename_illegal_port --fpga_bitstream_generator --fpga_verilog_print_top_testbench --fpga_verilog_print_input_blif_testbench --fpga_verilog_include_timing --fpga_verilog_include_signal_init --fpga_verilog_print_formal_verification_top_netlist --fpga_verilog_print_autocheck_top_testbench $verilog_reference --fpga_verilog_print_user_defined_template --route_chan_width $vpr_route_chan_width --fpga_verilog_include_icarus_simulator --nodisp +./vpr $arch_xml_file $blif_file --full_stats --activity_file $act_file --fpga_verilog --fpga_verilog_dir $verilog_output_dirpath/$verilog_output_dirname --fpga_x2p_rename_illegal_port --fpga_bitstream_generator --fpga_verilog_print_top_testbench --fpga_verilog_include_timing --fpga_verilog_include_signal_init --fpga_verilog_print_formal_verification_top_netlist --fpga_verilog_print_autocheck_top_testbench $verilog_reference --route_chan_width $vpr_route_chan_width --fpga_verilog_include_icarus_simulator --fpga_x2p_compact_routing_hierarchy --fpga_verilog_explicit_mapping --nodisp cd $fpga_flow_scripts perl rewrite_path_in_file.pl -i $ff_path -o $new_ff_path -k $ff_keyword $ff_include_path - -rm $verilog_output_dirpath/$verilog_output_dirname/SRC/${benchmark}${tb_formal_ext} -perl rewrite_path_in_file.pl -i ${OpenFPGA_path}/ERI_demo/${benchmark}${tb_formal_ext} -o $verilog_output_dirpath/$verilog_output_dirname/SRC/${benchmark}${tb_formal_ext} cd - -sed -i 's/^clk\[0:0\]/clk_fm/' $verilog_output_dirpath/$verilog_output_dirname/SRC/${benchmark}${formal_postfix}.v diff --git a/ERI_demo/my_eri_demo.sh b/ERI_demo/my_eri_demo.sh deleted file mode 100644 index 2e6220ba3..000000000 --- a/ERI_demo/my_eri_demo.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -# Example of how to run vpr - -# Set variables -# For FPGA-Verilog ONLY -benchmark="pipelined_32b_adder" -OpenFPGA_path="/research/ece/lnis/USERS/alacchi/Current_release/branch_multimode/OpenFPGA" -verilog_output_dirname="${benchmark}_Verilog" -verilog_output_dirpath="$vpr_path" -tech_file="${OpenFPGA_path}/fpga_flow/tech/PTM_45nm/45nm.xml" -# VPR critical inputs -template_arch_xml_file="${OpenFPGA_path}/fpga_flow/arch/template/k6_N10_sram_chain_HC_DPRAM_template.xml" -arch_xml_file="${OpenFPGA_path}/fpga_flow/arch/generated/k6_N10_sram_chain_HC_DPRAM.xml" -blif_file="${OpenFPGA_path}/ERI_demo/$benchmark.blif" -act_file="${OpenFPGA_path}/ERI_demo/$benchmark.act " -verilog_reference="${OpenFPGA_path}/ERI_demo/$benchmark.v" -vpr_route_chan_width="300" -fpga_flow_script="${OpenFPGA_path}/fpga_flow/scripts" -ff_path="$vpr_path/VerilogNetlists/ff.v" -new_ff_path="$verilog_output_dirpath/$verilog_output_dirname/SRC/ff.v" -ff_keyword="GENERATED_DIR_KEYWORD" -ff_include_path="$verilog_output_dirpath/$verilog_output_dirname" -arch_ff_keyword="FFPATHKEYWORD" - -# Remove previous designs -#rm -rf $verilog_output_dirpath/$verilog_output_dirname - -mkdir ${OpenFPGA_path}/fpga_flow/arch/generated - -cd $fpga_flow_scripts -perl rewrite_path_in_file.pl -i $template_arch_xml_file -o $arch_xml_file -perl rewrite_path_in_file.pl -i $arch_xml_file -k $arch_ff_keyword $new_ff_path - -# Move to vpr folder -cd $vpr_path - -# Run VPR -./vpr $arch_xml_file $blif_file --full_stats --nodisp --activity_file $act_file --fpga_verilog --fpga_verilog_dir $verilog_output_dirpath/$verilog_output_dirname --fpga_x2p_rename_illegal_port --fpga_bitstream_generator --fpga_verilog_print_top_testbench --fpga_verilog_print_input_blif_testbench --fpga_verilog_include_timing --fpga_verilog_include_signal_init --fpga_verilog_print_formal_verification_top_netlist --fpga_verilog_print_autocheck_top_testbench $verilog_reference --fpga_verilog_print_user_defined_template --route_chan_width $vpr_route_chan_width --fpga_verilog_include_icarus_simulator #--fpga_verilog_print_report_timing_tcl --power --tech_properties $tech_file --fpga_verilog_print_sdc_pnr --fpga_verilog_print_sdc_analysis --fpga_x2p_compact_routing_hierarchy - -cd $fpga_flow_scripts -perl rewrite_path_in_file.pl -i $ff_path -o $new_ff_path -k $ff_keyword $ff_include_path -cd - diff --git a/ERI_demo/pipelined_8b_adder.act b/ERI_demo/pipelined_8b_adder.act deleted file mode 100644 index c7a502a2d..000000000 --- a/ERI_demo/pipelined_8b_adder.act +++ /dev/null @@ -1,95 +0,0 @@ -clk 0.5 0.2 -wen 0.5 0.2 -wen_st0 0.5 0.2 -wen_st1 0.5 0.2 -ren 0.5 0.2 -raddr[0] 0.5 0.2 -raddr[1] 0.5 0.2 -raddr[2] 0.5 0.2 -raddr[3] 0.5 0.2 -raddr[4] 0.5 0.2 -raddr[5] 0.5 0.2 -waddr[0] 0.5 0.2 -waddr[1] 0.5 0.2 -waddr[2] 0.5 0.2 -waddr[3] 0.5 0.2 -waddr[4] 0.5 0.2 -waddr[5] 0.5 0.2 -waddr_st0[0] 0.5 0.2 -waddr_st0[1] 0.5 0.2 -waddr_st0[2] 0.5 0.2 -waddr_st0[3] 0.5 0.2 -waddr_st0[4] 0.5 0.2 -waddr_st0[5] 0.5 0.2 -waddr_st1[0] 0.5 0.2 -waddr_st1[1] 0.5 0.2 -waddr_st1[2] 0.5 0.2 -waddr_st1[3] 0.5 0.2 -waddr_st1[4] 0.5 0.2 -waddr_st1[5] 0.5 0.2 -a[0] 0.5 0.2 -a[1] 0.5 0.2 -a[2] 0.5 0.2 -a[3] 0.5 0.2 -a[4] 0.5 0.2 -a[5] 0.5 0.2 -a[6] 0.5 0.2 -a_st0[0] 0.5 0.2 -a_st0[1] 0.5 0.2 -a_st0[2] 0.5 0.2 -a_st0[3] 0.5 0.2 -a_st0[4] 0.5 0.2 -a_st0[5] 0.5 0.2 -a_st0[6] 0.5 0.2 -a_st1[0] 0.5 0.2 -a_st1[1] 0.5 0.2 -a_st1[2] 0.5 0.2 -a_st1[3] 0.5 0.2 -a_st1[4] 0.5 0.2 -a_st1[5] 0.5 0.2 -a_st1[6] 0.5 0.2 -b[0] 0.5 0.2 -b[1] 0.5 0.2 -b[2] 0.5 0.2 -b[3] 0.5 0.2 -b[4] 0.5 0.2 -b[5] 0.5 0.2 -b[6] 0.5 0.2 -b_st0[0] 0.5 0.2 -b_st0[1] 0.5 0.2 -b_st0[2] 0.5 0.2 -b_st0[3] 0.5 0.2 -b_st0[4] 0.5 0.2 -b_st0[5] 0.5 0.2 -b_st0[6] 0.5 0.2 -b_st1[0] 0.5 0.2 -b_st1[1] 0.5 0.2 -b_st1[2] 0.5 0.2 -b_st1[3] 0.5 0.2 -b_st1[4] 0.5 0.2 -b_st1[5] 0.5 0.2 -b_st1[6] 0.5 0.2 -q[0] 0.5 0.2 -q[1] 0.5 0.2 -q[2] 0.5 0.2 -q[3] 0.5 0.2 -q[4] 0.5 0.2 -q[5] 0.5 0.2 -q[6] 0.5 0.2 -q[7] 0.5 0.2 -AplusB[0] 0.5 0.2 -AplusB[1] 0.5 0.2 -AplusB[2] 0.5 0.2 -AplusB[3] 0.5 0.2 -AplusB[4] 0.5 0.2 -AplusB[5] 0.5 0.2 -AplusB[6] 0.5 0.2 -AplusB[7] 0.5 0.2 -cint01 0.5 0.2 -cint02 0.5 0.2 -cint03 0.5 0.2 -cint04 0.5 0.2 -cint05 0.5 0.2 -cint06 0.5 0.2 -cint07 0.5 0.2 -zero00 0 0 diff --git a/ERI_demo/pipelined_8b_adder.blif b/ERI_demo/pipelined_8b_adder.blif deleted file mode 100644 index 7f47b1661..000000000 --- a/ERI_demo/pipelined_8b_adder.blif +++ /dev/null @@ -1,137 +0,0 @@ -# Benchmark pipelined_32b_adder -.model pipelined_32b_adder -.inputs clk wen ren raddr[0] raddr[1] raddr[2] raddr[3] raddr[4] raddr[5] waddr[0] waddr[1] waddr[2] waddr[3] waddr[4] waddr[5] a[0] a[1] a[2] a[3] a[4] a[5] a[6] b[0] b[1] b[2] b[3] b[4] b[5] b[6] -.outputs q[0] q[1] q[2] q[3] q[4] q[5] q[6] q[7] - -# Start pipeline -# Pipeline a -.subckt shift D=a[0] clk=clk Q=a_st0[0] -.subckt shift D=a_st0[0] clk=clk Q=a_st1[0] -.subckt shift D=a[1] clk=clk Q=a_st0[1] -.subckt shift D=a_st0[1] clk=clk Q=a_st1[1] -.subckt shift D=a[2] clk=clk Q=a_st0[2] -.subckt shift D=a_st0[2] clk=clk Q=a_st1[2] -.subckt shift D=a[3] clk=clk Q=a_st0[3] -.subckt shift D=a_st0[3] clk=clk Q=a_st1[3] -.subckt shift D=a[4] clk=clk Q=a_st0[4] -.subckt shift D=a_st0[4] clk=clk Q=a_st1[4] -.subckt shift D=a[5] clk=clk Q=a_st0[5] -.subckt shift D=a_st0[5] clk=clk Q=a_st1[5] -.subckt shift D=a[6] clk=clk Q=a_st0[6] -.subckt shift D=a_st0[6] clk=clk Q=a_st1[6] - -# Pipeline b -.subckt shift D=b[0] clk=clk Q=b_st0[0] -.subckt shift D=b_st0[0] clk=clk Q=b_st1[0] -.subckt shift D=b[1] clk=clk Q=b_st0[1] -.subckt shift D=b_st0[1] clk=clk Q=b_st1[1] -.subckt shift D=b[2] clk=clk Q=b_st0[2] -.subckt shift D=b_st0[2] clk=clk Q=b_st1[2] -.subckt shift D=b[3] clk=clk Q=b_st0[3] -.subckt shift D=b_st0[3] clk=clk Q=b_st1[3] -.subckt shift D=b[4] clk=clk Q=b_st0[4] -.subckt shift D=b_st0[4] clk=clk Q=b_st1[4] -.subckt shift D=b[5] clk=clk Q=b_st0[5] -.subckt shift D=b_st0[5] clk=clk Q=b_st1[5] -.subckt shift D=b[6] clk=clk Q=b_st0[6] -.subckt shift D=b_st0[6] clk=clk Q=b_st1[6] - -# Pipeline waddr -.subckt shift D=waddr[0] clk=clk Q=waddr_st0[0] -.subckt shift D=waddr_st0[0] clk=clk Q=waddr_st1[0] -.subckt shift D=waddr[1] clk=clk Q=waddr_st0[1] -.subckt shift D=waddr_st0[1] clk=clk Q=waddr_st1[1] -.subckt shift D=waddr[2] clk=clk Q=waddr_st0[2] -.subckt shift D=waddr_st0[2] clk=clk Q=waddr_st1[2] -.subckt shift D=waddr[3] clk=clk Q=waddr_st0[3] -.subckt shift D=waddr_st0[3] clk=clk Q=waddr_st1[3] -.subckt shift D=waddr[4] clk=clk Q=waddr_st0[4] -.subckt shift D=waddr_st0[4] clk=clk Q=waddr_st1[4] -.subckt shift D=waddr[5] clk=clk Q=waddr_st0[5] -.subckt shift D=waddr_st0[5] clk=clk Q=waddr_st1[5] -# Pipeline wen -.subckt shift D=wen clk=clk Q=wen_st0 -.subckt shift D=wen_st0 clk=clk Q=wen_st1 -# End pipeline - -# Start adder -.subckt adder a=a_st1[0] b=b_st1[0] cin=zero00 cout=cint01 sumout=AplusB[0] -.subckt adder a=a_st1[1] b=b_st1[1] cin=cint01 cout=cint02 sumout=AplusB[1] -.subckt adder a=a_st1[2] b=b_st1[2] cin=cint02 cout=cint03 sumout=AplusB[2] -.subckt adder a=a_st1[3] b=b_st1[3] cin=cint03 cout=cint04 sumout=AplusB[3] -.subckt adder a=a_st1[4] b=b_st1[4] cin=cint04 cout=cint05 sumout=AplusB[4] -.subckt adder a=a_st1[5] b=b_st1[5] cin=cint05 cout=cint06 sumout=AplusB[5] -.subckt adder a=a_st1[6] b=b_st1[6] cin=cint06 cout=cint07 sumout=AplusB[6] -.subckt adder a=zero00 b=zero00 cin=cint07 cout=unconn sumout=AplusB[7] -# End adder - -# Start DPRAM -.subckt dpram clk=clk wen=wen_st1 ren=ren \ -waddr[0]=waddr_st1[0] waddr[1]=waddr_st1[1] waddr[2]=waddr_st1[2] waddr[3]=waddr_st1[3] waddr[4]=waddr_st1[4] \ -waddr[5]=waddr_st1[5] waddr[6]=zero00 waddr[7]=zero00 waddr[8]=zero00 waddr[9]=zero00 waddr[10]==zero00 \ -raddr[0]=raddr[0] raddr[1]=raddr[1] raddr[2]=raddr[2] raddr[3]=raddr[3] raddr[4]=raddr[4] raddr[5]=raddr[5] \ -raddr[6]=zero00 raddr[7]=zero00 raddr[8]=zero00 raddr[9]=zero00 raddr[10]=zero00 \ -d_in[0]=AplusB[0] d_in[1]=AplusB[1] d_in[2]=AplusB[2] d_in[3]=AplusB[3] d_in[4]=AplusB[4] d_in[5]=AplusB[5] \ -d_in[6]=AplusB[6] d_in[7]=AplusB[7] d_in[8]=zero00 d_in[9]=zero00 d_in[10]=zero00 d_in[11]=zero00 \ -d_in[12]=zero00 d_in[13]=zero00 d_in[14]=zero00 d_in[15]=zero00 d_in[16]=zero00 d_in[17]=zero00 \ -d_in[18]=zero00 d_in[19]=zero00 d_in[20]=zero00 d_in[21]=zero00 d_in[22]=zero00 d_in[23]=zero00 \ -d_in[24]=zero00 d_in[25]=zero00 d_in[26]=zero00 d_in[27]=zero00 d_in[28]=zero00 d_in[29]=zero00 \ -d_in[30]=zero00 d_in[31]=zero00 \ -d_in[32]=zero00 d_in[33]=zero00 d_in[34]=zero00 d_in[35]=zero00 d_in[36]=zero00 d_in[37]=zero00 d_in[38]=zero00 d_in[39]=zero00 d_in[40]=zero00 d_in[41]=zero00 d_in[42]=zero00 d_in[43]=zero00 d_in[44]=zero00 d_in[45]=zero00 d_in[46]=zero00 d_in[47]=zero00 d_in[48]=zero00 d_in[49]=zero00 d_in[50]=zero00 d_in[51]=zero00 d_in[52]=zero00 d_in[53]=zero00 d_in[54]=zero00 d_in[55]=zero00 d_in[56]=zero00 d_in[57]=zero00 d_in[58]=zero00 d_in[59]=zero00 d_in[60]=zero00 d_in[61]=zero00 d_in[62]=zero00 d_in[63]=zero00 \ -d_out[0]=q[0] d_out[1]=q[1] d_out[2]=q[2] d_out[3]=q[3] d_out[4]=q[4] d_out[5]=q[5] \ -d_out[6]=q[6] d_out[7]=q[7] d_out[8]=unconn d_out[9]=unconn d_out[10]=unconn \ -d_out[11]=unconn d_out[12]=unconn d_out[13]=unconn d_out[14]=unconn d_out[15]=unconn \ -d_out[16]=unconn d_out[17]=unconn d_out[18]=unconn d_out[19]=unconn d_out[20]=unconn \ -d_out[21]=unconn d_out[22]=unconn d_out[23]=unconn d_out[24]=unconn d_out[25]=unconn \ -d_out[26]=unconn d_out[27]=unconn d_out[28]=unconn d_out[29]=unconn d_out[30]=unconn d_out[31]=unconn \ -d_out[32]=unconn d_out[33]=unconn d_out[34]=unconn d_out[35]=unconn d_out[36]=unconn d_out[37]=unconn d_out[38]=unconn d_out[39]=unconn d_out[40]=unconn d_out[41]=unconn d_out[42]=unconn d_out[43]=unconn d_out[44]=unconn d_out[45]=unconn d_out[46]=unconn d_out[47]=unconn d_out[48]=unconn d_out[49]=unconn d_out[50]=unconn d_out[51]=unconn d_out[52]=unconn d_out[53]=unconn d_out[54]=unconn d_out[55]=unconn d_out[56]=unconn d_out[57]=unconn d_out[58]=unconn d_out[59]=unconn d_out[60]=unconn d_out[61]=unconn d_out[62]=unconn d_out[63]=unconn -# End DPRAM - -# Start global variable -.names zero00 -0 -# End global variable - - -.end - -# Start blackbox definition -.model dpram -.inputs clk wen ren waddr[0] waddr[1] waddr[2] waddr[3] waddr[4] waddr[5] \ - waddr[6] waddr[7] waddr[8] waddr[9] waddr[10] raddr[0] raddr[1] raddr[2] \ - raddr[3] raddr[4] raddr[5] raddr[6] raddr[7] raddr[8] raddr[9] raddr[10] \ - d_in[0] d_in[1] d_in[2] d_in[3] d_in[4] d_in[5] d_in[6] d_in[7] d_in[8] \ - d_in[9] d_in[10] d_in[11] d_in[12] d_in[13] d_in[14] d_in[15] d_in[16] \ - d_in[17] d_in[18] d_in[19] d_in[20] d_in[21] d_in[22] d_in[23] d_in[24] \ - d_in[25] d_in[26] d_in[27] d_in[28] d_in[29] d_in[30] d_in[31] d_in[32] \ - d_in[33] d_in[34] d_in[35] d_in[36] d_in[37] d_in[38] d_in[39] d_in[40] \ - d_in[41] d_in[42] d_in[43] d_in[44] d_in[45] d_in[46] d_in[47] d_in[48] \ - d_in[49] d_in[50] d_in[51] d_in[52] d_in[53] d_in[54] d_in[55] d_in[56] \ - d_in[57] d_in[58] d_in[59] d_in[60] d_in[61] d_in[62] d_in[63] -.outputs d_out[0] d_out[1] d_out[2] d_out[3] d_out[4] d_out[5] d_out[6] \ - d_out[7] d_out[8] d_out[9] d_out[10] d_out[11] d_out[12] d_out[13] \ - d_out[14] d_out[15] d_out[16] d_out[17] d_out[18] d_out[19] d_out[20] \ - d_out[21] d_out[22] d_out[23] d_out[24] d_out[25] d_out[26] d_out[27] \ - d_out[28] d_out[29] d_out[30] d_out[31] d_out[32] d_out[33] d_out[34] \ - d_out[35] d_out[36] d_out[37] d_out[38] d_out[39] d_out[40] d_out[41] \ - d_out[42] d_out[43] d_out[44] d_out[45] d_out[46] d_out[47] d_out[48] \ - d_out[49] d_out[50] d_out[51] d_out[52] d_out[53] d_out[54] d_out[55] \ - d_out[56] d_out[57] d_out[58] d_out[59] d_out[60] d_out[61] d_out[62] \ - d_out[63] -.blackbox -.end - - -.model adder -.inputs a b cin -.outputs cout sumout -.blackbox -.end - - -.model shift -.inputs D clk -.outputs Q -.blackbox -.end -# End blackbox definition diff --git a/ERI_demo/pipelined_8b_adder.v b/ERI_demo/pipelined_8b_adder.v deleted file mode 100644 index 4d8e975cd..000000000 --- a/ERI_demo/pipelined_8b_adder.v +++ /dev/null @@ -1,63 +0,0 @@ -///////////////////////////////////// -// // -// ERI summit demo-benchmark // -// pipelined_8b_adder.v // -// by Aurelien // -// // -///////////////////////////////////// - -`timescale 1 ns/ 1 ps - -module pipelined_8b_adder( - clk, - raddr, - waddr, - ren, - wen, - a, - b, - q ); - - input clk; - input[5:0] raddr; - input[5:0] waddr; - input ren; - input wen; - input[6:0] a; - input[6:0] b; - output[7:0] q; - - reg[63:0] ram[7:0]; - reg[6:0] a_st0; - reg[6:0] a_st1; - reg[6:0] b_st0; - reg[6:0] b_st1; - reg[8:0] waddr_st0; - reg[8:0] waddr_st1; - reg wen_st0; - reg wen_st1; - reg[7:0] q_int; - - wire[7:0] AplusB; - - assign AplusB = a_st1 + b_st1; - assign q = q_int; - - always@(posedge clk) begin - waddr_st0 <= waddr; - waddr_st1 <= waddr_st0; - a_st0 <= a; - a_st1 <= a_st0; - b_st0 <= b; - b_st1 <= b_st0; - wen_st0 <= wen; - wen_st1 <= wen_st0; - if(wen_st1) begin - ram[waddr_st1] <= AplusB; - end - if(ren) begin - q_int <= ram[raddr]; - end - end - -endmodule diff --git a/ERI_demo/pipelined_8b_adder_formal_random_top_tb.v b/ERI_demo/pipelined_8b_adder_formal_random_top_tb.v deleted file mode 100644 index d43a5b694..000000000 --- a/ERI_demo/pipelined_8b_adder_formal_random_top_tb.v +++ /dev/null @@ -1,219 +0,0 @@ -`timescale 1 ns/ 100 ps - -`include "OPENFPGAPATHKEYWORD/ERI_demo/pipelined_8b_adder.v" - -module pipelined_8b_adder_top_formal_verification_random_tb(); - reg clk; - reg[5:0] raddr; - reg[5:0] waddr; - reg ren; - reg wen; - reg[6:0] a; - reg[6:0] b; - wire[7:0] q_gfpga; - wire[7:0] q_bench; - reg[7:0] q_flag; - - pipelined_8b_adder_top_formal_verification DUT( - .clk_fm (clk), - .raddr_0__fm (raddr[0]), - .raddr_1__fm (raddr[1]), - .raddr_2__fm (raddr[2]), - .raddr_3__fm (raddr[3]), - .raddr_4__fm (raddr[4]), - .raddr_5__fm (raddr[5]), - .waddr_0__fm (waddr[0]), - .waddr_1__fm (waddr[1]), - .waddr_2__fm (waddr[2]), - .waddr_3__fm (waddr[3]), - .waddr_4__fm (waddr[4]), - .waddr_5__fm (waddr[5]), - .ren_fm (ren), - .wen_fm (wen), - .a_0__fm (a[0]), - .a_1__fm (a[1]), - .a_2__fm (a[2]), - .a_3__fm (a[3]), - .a_4__fm (a[4]), - .a_5__fm (a[5]), - .a_6__fm (a[6]), - .b_0__fm (b[0]), - .b_1__fm (b[1]), - .b_2__fm (b[2]), - .b_3__fm (b[3]), - .b_4__fm (b[4]), - .b_5__fm (b[5]), - .b_6__fm (b[6]), - .out_q_0__fm (q_gfpga[0]), - .out_q_1__fm (q_gfpga[1]), - .out_q_2__fm (q_gfpga[2]), - .out_q_3__fm (q_gfpga[3]), - .out_q_4__fm (q_gfpga[4]), - .out_q_5__fm (q_gfpga[5]), - .out_q_6__fm (q_gfpga[6]), - .out_q_7__fm (q_gfpga[7]) - ); - - pipelined_8b_adder ref0( - .clk (clk), - .raddr (raddr), - .waddr (waddr), - .ren (ren), - .wen (wen), - .a (a), - .b (b), - .q (q_bench) - ); - - integer nb_error = 0; - integer count = 0; - integer lim_max = 64 - 1; - integer write_complete = 0; - -//----- Initialization - initial begin - clk <= 1'b0; - a <= 7'h00; - b <= 7'h00; - wen <= 1'b0; - ren <= 1'b0; - waddr <= 9'h000; - raddr <= 9'h000; - while(1) begin - #2.5 - clk <= !clk; - end - end - -//----- Input Stimulis - always@(negedge clk) begin - if(write_complete == 0) begin - wen <= 1'b1; - ren <= 1'b0; - count <= count + 1; - waddr <= waddr + 1; - if(count == lim_max) begin - write_complete = 1; - end - end else begin - wen <= $random; - ren <= $random; - waddr <= $random; - raddr <= $random; - end - a <= $random; - b <= $random; - end - - - always@(negedge clk) begin - if(!(q_gfpga[0] === q_bench[0]) && !(q_bench[0] === 1'bx)) begin - q_flag[0] <= 1'b1; - end else begin - q_flag[0] <= 1'b0; - end - if(!(q_gfpga[1] === q_bench[1]) && !(q_bench[1] === 1'bx)) begin - q_flag[1] <= 1'b1; - end else begin - q_flag[1] <= 1'b0; - end - if(!(q_gfpga[2] === q_bench[2]) && !(q_bench[2] === 1'bx)) begin - q_flag[2] <= 1'b1; - end else begin - q_flag[2] <= 1'b0; - end - if(!(q_gfpga[3] === q_bench[3]) && !(q_bench[3] === 1'bx)) begin - q_flag[3] <= 1'b1; - end else begin - q_flag[3] <= 1'b0; - end - if(!(q_gfpga[4] === q_bench[4]) && !(q_bench[4] === 1'bx)) begin - q_flag[4] <= 1'b1; - end else begin - q_flag[4] <= 1'b0; - end - if(!(q_gfpga[5] === q_bench[5]) && !(q_bench[5] === 1'bx)) begin - q_flag[5] <= 1'b1; - end else begin - q_flag[5] <= 1'b0; - end - if(!(q_gfpga[6] === q_bench[6]) && !(q_bench[6] === 1'bx)) begin - q_flag[6] <= 1'b1; - end else begin - q_flag[6] <= 1'b0; - end - if(!(q_gfpga[7] === q_bench[7]) && !(q_bench[7] === 1'bx)) begin - q_flag[7] <= 1'b1; - end else begin - q_flag[7] <= 1'b0; - end - end - - - always@(posedge q_flag[0]) begin - if(q_flag[0]) begin - nb_error = nb_error + 1; - $display("Mismatch on q_gfpga[0] at time = %t", $realtime); - end - end - always@(posedge q_flag[1]) begin - if(q_flag[1]) begin - nb_error = nb_error + 1; - $display("Mismatch on q_gfpga[1] at time = %t", $realtime); - end - end - always@(posedge q_flag[2]) begin - if(q_flag[2]) begin - nb_error = nb_error + 1; - $display("Mismatch on q_gfpga[2] at time = %t", $realtime); - end - end - always@(posedge q_flag[3]) begin - if(q_flag[3]) begin - nb_error = nb_error + 1; - $display("Mismatch on q_gfpga[3] at time = %t", $realtime); - end - end - always@(posedge q_flag[4]) begin - if(q_flag[4]) begin - nb_error = nb_error + 1; - $display("Mismatch on q_gfpga[4] at time = %t", $realtime); - end - end - always@(posedge q_flag[5]) begin - if(q_flag[5]) begin - nb_error = nb_error + 1; - $display("Mismatch on q_gfpga[5] at time = %t", $realtime); - end - end - always@(posedge q_flag[6]) begin - if(q_flag[6]) begin - nb_error = nb_error + 1; - $display("Mismatch on q_gfpga[6] at time = %t", $realtime); - end - end - always@(posedge q_flag[7]) begin - if(q_flag[7]) begin - nb_error = nb_error + 1; - $display("Mismatch on q_gfpga[7] at time = %t", $realtime); - end - end - - initial begin - $dumpfile("pipelined_8b_adder_formal.vcd"); - $dumpvars(1, pipelined_8b_adder_top_formal_verification_random_tb); - end - - initial begin - $timeformat(-9, 2, "ns", 20); - $display("Simulation start"); - #1500 // Can be changed by the user for his need - if(nb_error == 0) begin - $display("Simulation Succeed"); - end else begin - $display("Simulation Failed with %d error(s)", nb_error); - end - $finish; - end - -endmodule diff --git a/fpga_flow/tuto_fpga_flow.sh b/fpga_flow/tuto_fpga_flow.sh index 3ee86966a..a1ca429d8 100755 --- a/fpga_flow/tuto_fpga_flow.sh +++ b/fpga_flow/tuto_fpga_flow.sh @@ -28,6 +28,6 @@ perl rewrite_path_in_file.pl -i $ff_path -k $dir_keyword $verilog_path # Set the # SRAM FPGA # TT case -perl fpga_flow.pl -conf ${config_file} -benchmark ${bench_txt} -rpt ${rpt_file} -N 10 -K 6 -ace_d 0.5 -multi_thread 1 -vpr_fpga_x2p_rename_illegal_port -vpr_fpga_verilog -vpr_fpga_verilog_dir $verilog_path -vpr_fpga_bitstream_generator -vpr_fpga_verilog_print_autocheck_top_testbench -vpr_fpga_verilog_include_timing -vpr_fpga_verilog_include_signal_init -vpr_fpga_verilog_formal_verification_top_netlist -fix_route_chan_width -vpr_fpga_verilog_include_icarus_simulator -power -vpr_fpga_verilog_print_user_defined_template -vpr_fpga_verilog_print_report_timing_tcl -vpr_fpga_verilog_print_sdc_pnr -vpr_fpga_verilog_print_sdc_analysis -vpr_fpga_x2p_compact_routing_hierarchy -end_flow_with_test -vpr_fpga_verilog_explicit_mapping +perl fpga_flow.pl -conf ${config_file} -benchmark ${bench_txt} -rpt ${rpt_file} -N 10 -K 6 -ace_d 0.5 -multi_thread 1 -vpr_fpga_x2p_rename_illegal_port -vpr_fpga_verilog -vpr_fpga_verilog_dir $verilog_path -vpr_fpga_bitstream_generator -vpr_fpga_verilog_print_autocheck_top_testbench -vpr_fpga_verilog_include_timing -vpr_fpga_verilog_include_signal_init -vpr_fpga_verilog_formal_verification_top_netlist -fix_route_chan_width -vpr_fpga_verilog_include_icarus_simulator -power -vpr_fpga_verilog_print_user_defined_template -vpr_fpga_verilog_print_report_timing_tcl -vpr_fpga_verilog_print_sdc_pnr -vpr_fpga_verilog_print_sdc_analysis -vpr_fpga_x2p_compact_routing_hierarchy -end_flow_with_test -vpr_fpga_verilog_explicit_mapping -vpr_fpga_x2p_compact_routing_hierarchy echo "Netlists successfully generated and tested" diff --git a/vpr7_x2p/vpr/regression_verilog.sh b/vpr7_x2p/vpr/regression_verilog.sh index 8007363cf..c93eb7d49 100755 --- a/vpr7_x2p/vpr/regression_verilog.sh +++ b/vpr7_x2p/vpr/regression_verilog.sh @@ -33,7 +33,7 @@ perl rewrite_path_in_file.pl -i $arch_xml_file -k $arch_ff_keyword $new_ff_path cd - # Run VPR -./vpr $arch_xml_file $blif_file --full_stats --nodisp --activity_file $act_file --fpga_verilog --fpga_verilog_dir $verilog_output_dirpath/$verilog_output_dirname --fpga_x2p_rename_illegal_port --fpga_bitstream_generator --fpga_verilog_print_top_testbench --fpga_verilog_print_input_blif_testbench --fpga_verilog_include_timing --fpga_verilog_include_signal_init --fpga_verilog_print_formal_verification_top_netlist --fpga_verilog_print_autocheck_top_testbench $verilog_reference --fpga_verilog_print_user_defined_template --route_chan_width $vpr_route_chan_width --fpga_verilog_include_icarus_simulator --fpga_verilog_print_report_timing_tcl --power --tech_properties $tech_file --fpga_verilog_print_sdc_pnr --fpga_verilog_print_sdc_analysis --fpga_x2p_compact_routing_hierarchy --fpga_verilog_explicit_mapping +./vpr $arch_xml_file $blif_file --full_stats --activity_file $act_file --fpga_verilog --fpga_verilog_dir $verilog_output_dirpath/$verilog_output_dirname --fpga_x2p_rename_illegal_port --fpga_bitstream_generator --fpga_verilog_print_top_testbench --fpga_verilog_print_input_blif_testbench --fpga_verilog_include_timing --fpga_verilog_include_signal_init --fpga_verilog_print_formal_verification_top_netlist --fpga_verilog_print_autocheck_top_testbench $verilog_reference --fpga_verilog_print_user_defined_template --route_chan_width $vpr_route_chan_width --fpga_verilog_include_icarus_simulator --fpga_verilog_print_report_timing_tcl --power --tech_properties $tech_file --fpga_verilog_print_sdc_pnr --fpga_verilog_print_sdc_analysis --fpga_x2p_compact_routing_hierarchy --fpga_verilog_explicit_mapping cd $fpga_flow_scripts perl rewrite_path_in_file.pl -i $ff_path -o $new_ff_path -k $ff_keyword $ff_include_path From d10cc34c9e671a083f4bcdd518ec4b4584ff0591 Mon Sep 17 00:00:00 2001 From: AurelienUoU Date: Fri, 12 Jul 2019 14:56:08 -0600 Subject: [PATCH 02/10] Update Readme and tutorial --- Dockerfile | 2 +- README.md | 11 ++++++----- tutorials/building.md | 5 ++++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4184f0f9c..bcaff4c35 100755 --- a/Dockerfile +++ b/Dockerfile @@ -3,6 +3,6 @@ FROM ubuntu:16.04 RUN apt-get update -qq -y RUN apt-get -y install python3 python3-dev tcl tcl8.6-dev gawk libreadline-dev -RUN apt-get -y install autoconf automake bison build-essential cmake ctags curl doxygen flex fontconfig g++-4.9 gcc-4.9 gdb git gperf iverilog libffi-dev libcairo2-dev libevent-dev libfontconfig1-dev liblist-moreutils-perl libncurses5-dev libx11-dev libxft-dev libxml++2.6-dev perl texinfo time valgrind zip qt5-default +RUN apt-get -y install autoconf automake bison build-essential cmake ctags curl doxygen flex fontconfig g++-4.9 gcc-4.9 gdb git gtkwave gperf iverilog libffi-dev libcairo2-dev libevent-dev libfontconfig1-dev liblist-moreutils-perl libncurses5-dev libx11-dev libxft-dev libxml++2.6-dev perl texinfo time valgrind zip qt5-default diff --git a/README.md b/README.md index e3bb7fb39..8429c4d78 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ ## Introduction -OpenFPGA is an extension to VPR. It is an IP Verilog Generator allowing reliable and fast testing of homogeneous architectures. +The OpenFPGA framework is the **first open-source FPGA IP generator** supporting highly-customizable homogeneous FPGA architectures. OpenFPGA provides a full set of EDA support for customized FPGAs, including Verilog-to-bitstream generation and self-testing verification testbenches/scripts. OpenFPGA opens the door to democratizing FPGA technology and EDA techniques, with agile prototyping approaches and constantly evolving EDA tools for chip designers and researchers.
## Compilation -The different ways of compiling can be found in the **./compilation** folder.
+The different ways of compiling can be found in the [**./compilation**](https://github.com/LNIS-Projects/OpenFPGA/tree/documentation/compilation) folder.
Dependancies and help using docker can be found at [**./tutorials/building.md**](https://github.com/LNIS-Projects/OpenFPGA/blob/documentation/tutorials/building.md). **Compilation steps:** @@ -20,7 +20,7 @@ Dependancies and help using docker can be found at [**./tutorials/building.md**] *We currently implemented OpenFPGA for:* -*1. Ubuntu 18.04* +*1. Ubuntu 16.04* *2. Red Hat 7.5* *3. MacOS High Sierra 10.13.4* @@ -31,9 +31,10 @@ OpenFPGA's [full documentation](https://openfpga.readthedocs.io/en/master/) incl ## Tutorial -You can find in the folder **./tutorials**. This will help you get in touch with the software and test different configurations to see how OpenFPGA reacts to them. +You can find in the folder [**./tutorials**](https://github.com/LNIS-Projects/OpenFPGA/tree/documentation/tutorials). This will help you get in touch with the software and test different configurations to see how OpenFPGA reacts to them. -Through this tutorial users can learn how to use the flow and set the dependancies. +Through this tutorial users can learn how to use the flow and set the dependancies.
+The [tutorial index](https://github.com/LNIS-Projects/OpenFPGA/blob/documentation/tutorials/tutorial_index.md) will diff --git a/tutorials/building.md b/tutorials/building.md index 7f0666313..3e00855c9 100644 --- a/tutorials/building.md +++ b/tutorials/building.md @@ -40,7 +40,10 @@ OpenFPGA requires all the dependancies listed below: ## Docker -If all these dependancies are not installed in your machine you can choose to use a Docker (docker tool need to be installed). To ease customer first experience a Dockerfile is provided in OpenFPGA folder. It can be build using the commands: +If all these dependancies are not installed in your machine you can choose to use a Docker (docker tool need to be installed). To ease customer first experience a Dockerfile is provided in OpenFPGA folder. A container ready to use can be created with the following command: +- docker run -it --rm -v `pwd`:/localfile/OpenFPGA -w=“/localfile/OpenFPGAr” lnis-projects/open_fpga bash + +Or a container where you can build OpenFPGA yourself can be created with the following commands: - docker build . -t open_fpga - docker run -it --rm -v $PWD:/localfile/OpenFPGA -w="/localfile/OpenFPGA" open_fpga bash
[*docker download link*](https://www.docker.com/products/docker-desktop) From 19ccbce9d07c4b4be776f173f7358195d7d4702e Mon Sep 17 00:00:00 2001 From: AurelienUoU Date: Fri, 12 Jul 2019 16:18:28 -0600 Subject: [PATCH 03/10] Rename option to use circuit_model rather than spice_model --- .../k6_N10_sram_chain_HC_template.xml | 218 +++++++++--------- vpr7_x2p/libarchfpga/SRC/read_xml_arch_file.c | 20 +- vpr7_x2p/libarchfpga/SRC/read_xml_spice.c | 30 +-- 3 files changed, 134 insertions(+), 134 deletions(-) diff --git a/fpga_flow/arch/template/k6_N10_sram_chain_HC_template.xml b/fpga_flow/arch/template/k6_N10_sram_chain_HC_template.xml index 8dca26477..c4642ed55 100644 --- a/fpga_flow/arch/template/k6_N10_sram_chain_HC_template.xml +++ b/fpga_flow/arch/template/k6_N10_sram_chain_HC_template.xml @@ -187,8 +187,8 @@ - - + + @@ -198,9 +198,9 @@ 10e-12 - - - + + + @@ -209,9 +209,9 @@ 10e-12 - - - + + + @@ -220,9 +220,9 @@ 10e-12 - - - + + + @@ -231,9 +231,9 @@ 10e-12 - - - + + + @@ -242,8 +242,8 @@ 10e-12 - - + + @@ -253,8 +253,8 @@ 10e-12 - - + + @@ -268,8 +268,8 @@ 10e-12 5e-12 5e-12 - - + + @@ -282,141 +282,141 @@ 10e-12 10e-12 - - + + - - + + - - + + - - + + - + - - + + - - + + - + - - + + - - + + - + - + - + - - - + + + - - + + - - - - - - - + + + + + + + - - - + + + - - - - - - - + + + + + + + - - + + - + - - - + + + - - + + - - - + + + - - + + - + - + - - + + - - + + - - - + + + - + - + - - - + + + @@ -456,7 +456,7 @@ - + @@ -473,25 +473,25 @@ 2.5x when looking up in Jeff's tables. Finally, we choose a switch delay (58 ps) that leads to length 4 wires having a delay equal to that of SIV of 126 ps. This also leads to the switch being 46% of the total wire delay, which is reasonable. --> - + - + - + - + - + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - + 1 1 1 1 1 1 1 1 1 @@ -515,7 +515,7 @@ - + @@ -616,7 +616,7 @@ - - + - + - + - + - + - + - + diff --git a/vpr7_x2p/libarchfpga/SRC/read_xml_arch_file.c b/vpr7_x2p/libarchfpga/SRC/read_xml_arch_file.c index fde8b5472..d852e07dd 100644 --- a/vpr7_x2p/libarchfpga/SRC/read_xml_arch_file.c +++ b/vpr7_x2p/libarchfpga/SRC/read_xml_arch_file.c @@ -1052,9 +1052,9 @@ static void ProcessPb_Type(INOUTP ezxml_t Parent, t_pb_type * pb_type, * We should have a spice_model_name if this mode defines the transistor-level circuit design * Since this is a leaf node */ - pb_type->spice_model_name = my_strdup(FindProperty(Parent, "spice_model_name", FALSE)); + pb_type->spice_model_name = my_strdup(FindProperty(Parent, "circuit_model_name", FALSE)); pb_type->spice_model = NULL; - ezxml_set_attr(Parent, "spice_model_name", NULL); + ezxml_set_attr(Parent, "circuit_model_name", NULL); /* Multi-mode CLB support: * We can read the mode configuration bits if they are defined */ @@ -1400,7 +1400,7 @@ static void ProcessInterconnect(INOUTP ezxml_t Parent, t_mode * mode) { /* Xifan TANG: SPICE Support */ - Prop = FindProperty(Cur, "spice_model_name", FALSE); + Prop = FindProperty(Cur, "circuit_model_name", FALSE); /* Default spice_model will be define later*/ mode->interconnect[i].spice_model_name = my_strdup(Prop); mode->interconnect[i].spice_model = NULL; @@ -1408,7 +1408,7 @@ static void ProcessInterconnect(INOUTP ezxml_t Parent, t_mode * mode) { mode->interconnect[i].fan_in = 0; mode->interconnect[i].fan_out = 0; mode->interconnect[i].num_mux = 0; - ezxml_set_attr(Cur, "spice_model_name", NULL); + ezxml_set_attr(Cur, "circuit_model_name", NULL); /* Get sram offset */ mode->interconnect[i].spice_model_sram_offset = GetIntProperty(Cur, "spice_model_sram_offset", FALSE, 0); ezxml_set_attr(Cur, "spice_model_sram_offset", NULL); @@ -3250,9 +3250,9 @@ static void ProcessSegments(INOUTP ezxml_t Parent, (*Segs)[i].Rmetal = GetFloatProperty(Node, "Rmetal", timing_enabled, 0); (*Segs)[i].Cmetal = GetFloatProperty(Node, "Cmetal", timing_enabled, 0); /* Xifan TANG: SPICE Model Support*/ - (*Segs)[i].spice_model_name = my_strdup(FindProperty(Node, "spice_model_name", FALSE)); + (*Segs)[i].spice_model_name = my_strdup(FindProperty(Node, "circuit_model_name", FALSE)); (*Segs)[i].spice_model = NULL; - ezxml_set_attr(Node, "spice_model_name", NULL); + ezxml_set_attr(Node, "circuit_model_name", NULL); /* Get Power info */ /* (*Segs)[i].Cmetal_per_m = GetFloatProperty(Node, "Cmetal_per_m", FALSE, @@ -3528,9 +3528,9 @@ static void ProcessSwitches(INOUTP ezxml_t Parent, FALSE, 1); /* Xifan TANG: Spice Model Support */ - (*Switches)[i].spice_model_name = my_strdup(FindProperty(Node, "spice_model_name", FALSE)); + (*Switches)[i].spice_model_name = my_strdup(FindProperty(Node, "circuit_model_name", FALSE)); (*Switches)[i].spice_model = NULL; - ezxml_set_attr(Node, "spice_model_name", NULL); + ezxml_set_attr(Node, "circuit_model_name", NULL); /* Xifan TANG : Read in MUX structure*/ /* Default, we use tree */ structure_type = FindProperty(Node, "structure", FALSE); @@ -3643,9 +3643,9 @@ static void ProcessDirects(INOUTP ezxml_t Parent, OUTP t_direct_inf **Directs, /* Spice Model Support: Xifan TANG * We should have a spice_model_name for this direct connection */ - (*Directs)[i].spice_model_name = my_strdup(FindProperty(Node, "spice_model_name", FALSE)); + (*Directs)[i].spice_model_name = my_strdup(FindProperty(Node, "circuit_model_name", FALSE)); (*Directs)[i].spice_model = NULL; - ezxml_set_attr(Node,"spice_model_name",NULL); + ezxml_set_attr(Node,"circuit_model_name",NULL); (*Directs)[i].line = Node->line; diff --git a/vpr7_x2p/libarchfpga/SRC/read_xml_spice.c b/vpr7_x2p/libarchfpga/SRC/read_xml_spice.c index 82560c359..9e3a511bf 100644 --- a/vpr7_x2p/libarchfpga/SRC/read_xml_spice.c +++ b/vpr7_x2p/libarchfpga/SRC/read_xml_spice.c @@ -451,8 +451,8 @@ static void ProcessSpiceModelBuffer(ezxml_t Node, read_spice_model = FALSE; } - buffer->spice_model_name = my_strdup(FindProperty(Node, "spice_model_name", read_spice_model)); - ezxml_set_attr(Node, "spice_model_name", NULL); + buffer->spice_model_name = my_strdup(FindProperty(Node, "circuit_model_name", read_spice_model)); + ezxml_set_attr(Node, "circuit_model_name", NULL); /*Find Type*/ Prop = my_strdup(FindProperty(Node, "topology", read_buf_info)); @@ -475,9 +475,9 @@ static void ProcessSpiceModelBuffer(ezxml_t Node, if (0 == strcmp(Prop,"on")) { buffer->tapered_buf = 1; /* Try to dig more properites ...*/ - buffer->tap_buf_level = GetIntProperty(Node, "tap_buf_level", TRUE, 1); + buffer->tap_buf_level = GetIntProperty(Node, "tap_drive_level", TRUE, 1); buffer->f_per_stage = GetIntProperty(Node, "f_per_stage", FALSE, 4); - ezxml_set_attr(Node, "tap_buf_level", NULL); + ezxml_set_attr(Node, "tap_drive_level", NULL); ezxml_set_attr(Node, "f_per_stage", NULL); } else if (0 == strcmp(FindProperty(Node,"tapered",TRUE),"off")) { buffer->tapered_buf = 0; @@ -752,16 +752,16 @@ static void ProcessSpiceModelPort(ezxml_t Node, ezxml_set_attr(Node, "is_config_enable", NULL); /* Check if this port is linked to another spice_model*/ - port->spice_model_name = my_strdup(FindProperty(Node,"spice_model_name",FALSE)); - ezxml_set_attr(Node, "spice_model_name", NULL); + port->spice_model_name = my_strdup(FindProperty(Node,"circuit_model_name",FALSE)); + ezxml_set_attr(Node, "circuit_model_name", NULL); /* For BL/WL, BLB/WLB ports, we need to get the spice_model for inverters */ if ((SPICE_MODEL_PORT_BL == port->type) ||(SPICE_MODEL_PORT_WL == port->type) ||(SPICE_MODEL_PORT_BLB == port->type) ||(SPICE_MODEL_PORT_WLB == port->type)) { - port->inv_spice_model_name = my_strdup(FindProperty(Node, "inv_spice_model_name", FALSE)); - ezxml_set_attr(Node, "inv_spice_model_name", NULL); + port->inv_spice_model_name = my_strdup(FindProperty(Node, "inv_circuit_model_name", FALSE)); + ezxml_set_attr(Node, "inv_circuit_model_name", NULL); } return; @@ -1042,8 +1042,8 @@ static void ProcessSpiceModel(ezxml_t Parent, if (Node) { spice_model->pass_gate_logic = (t_spice_model_pass_gate_logic*)my_malloc(sizeof(t_spice_model_pass_gate_logic)); /* Find spice_model_name */ - spice_model->pass_gate_logic->spice_model_name = my_strdup(FindProperty(Node, "spice_model_name", TRUE)); - ezxml_set_attr(Node, "spice_model_name", NULL); + spice_model->pass_gate_logic->spice_model_name = my_strdup(FindProperty(Node, "circuit_model_name", TRUE)); + ezxml_set_attr(Node, "circuit_model_name", NULL); FreeNode(Node); } else if ((SPICE_MODEL_MUX == spice_model->type) ||(SPICE_MODEL_LUT == spice_model->type)) { @@ -1106,9 +1106,9 @@ void ProcessSpiceSRAMOrganization(INOUTP ezxml_t Node, return; } - cur_sram_inf_orgz->spice_model_name = my_strdup(FindProperty(Node, "spice_model_name", required)); + cur_sram_inf_orgz->spice_model_name = my_strdup(FindProperty(Node, "circuit_model_name", required)); cur_sram_inf_orgz->spice_model = NULL; - ezxml_set_attr(Node, "spice_model_name", NULL); + ezxml_set_attr(Node, "circuit_model_name", NULL); /* read organization type*/ Prop = FindProperty(Node, "organization", required); @@ -1501,14 +1501,14 @@ void ProcessSpiceSettings(ezxml_t Parent, ProcessSpiceTechLibTransistors(Parent, &(spice->tech_lib)); /* module spice models*/ - Node = FindElement(Parent, "module_spice_models", FALSE); + Node = FindElement(Parent, "module_circuit_models", FALSE); if (Node) { - spice->num_spice_model = CountChildren(Node, "spice_model", 1); + spice->num_spice_model = CountChildren(Node, "circuit_model", 1); /*Alloc*/ spice->spice_models = (t_spice_model*)my_malloc(spice->num_spice_model*sizeof(t_spice_model)); /* Assign each found spice model*/ for (imodel = 0; imodel < spice->num_spice_model; imodel++) { - Cur = FindFirstElement(Node, "spice_model", TRUE); + Cur = FindFirstElement(Node, "circuit_model", TRUE); ProcessSpiceModel(Cur, &(spice->spice_models[imodel])); FreeNode(Cur); } From 1a5c5ff4a64a6d61245946fc1417393f7254b85a Mon Sep 17 00:00:00 2001 From: AurelienUoU Date: Fri, 12 Jul 2019 16:52:54 -0600 Subject: [PATCH 04/10] Update demo simulation result path --- ERI_demo/ERI.sh | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/ERI_demo/ERI.sh b/ERI_demo/ERI.sh index cd812298c..f585d90b2 100755 --- a/ERI_demo/ERI.sh +++ b/ERI_demo/ERI.sh @@ -3,13 +3,13 @@ # Set variables my_pwd=$PWD -fpga_flow_scripts=${my_pwd}/fpga_flow/scripts -vpr_path=${my_pwd}/vpr7_x2p/vpr +fpga_flow_scripts="${my_pwd}/fpga_flow/scripts" +vpr_path="${my_pwd}/vpr7_x2p/vpr" benchmark="test_modes" include_netlists="_include_netlists.v" compiled_file="compiled_$benchmark" tb_formal_postfix="_top_formal_verification_random_tb" -verilog_output_dirname="${vpr_path}${benchmark}_Verilog" +verilog_dirname="${vpr_path}/${benchmark}_Verilog" log_file="${benchmark}_sim.log" new_reg_sh="${PWD}/ERI_demo/my_eri_demo.sh" template_sh="${PWD}/ERI_demo/eri_demo.sh" @@ -28,7 +28,8 @@ cd $my_pwd # Start the script -> run the fpga generation -> run the simulation -> check the log file source $new_reg_sh # Leave us in vpr folder -iverilog -o $compiled_file $verilog_output_dirname/SRC/$benchmark$include_netlists -s $benchmark$tb_formal_postfix +cd $my_pwd +iverilog -o $compiled_file ${verilog_dirname}/SRC/${benchmark}${include_netlists} -s ${benchmark}${tb_formal_postfix} vvp $compiled_file -j 64 >> $log_file result=`grep "Succeed" $log_file` @@ -36,16 +37,13 @@ if ["$result" = ""]; then result=`grep "Failed" $log_file` if ["$result" = ""]; then echo "Unexpected error, Verification didn't run" - cd $my_pwd exit 1 else echo "Verification failed" - cd $my_pwd exit 2 fi else echo "Verification succeed" + gtkwave ${benchmark}_formal.vcd & fi -gtkwave ${benchmark}_formal.vcd & -cd $my_pwd From 1cf4e785024b16f9b24312c69dab00a1f65df678 Mon Sep 17 00:00:00 2001 From: AurelienUoU Date: Mon, 15 Jul 2019 21:16:15 -0600 Subject: [PATCH 05/10] Update documentation and help --- README.md | 18 ++++++++---------- .../fpga_bitstream/command_line_usage.rst | 12 +++++++++++- .../source/fpga_verilog/command_line_usage.rst | 4 ---- tutorials/fpga_flow/folder_organization.md | 4 ++-- tutorials/fpga_flow/how2use.md | 4 ++-- tutorials/tutorial_index.md | 4 ++-- vpr7_x2p/vpr/SRC/base/OptionTokens.c | 2 +- vpr7_x2p/vpr/SRC/base/ReadOptions.c | 4 ++-- vpr7_x2p/vpr/SRC/base/vpr_api.c | 4 ++-- vpr7_x2p/vpr/regression_verilog.sh | 2 +- 10 files changed, 31 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 8429c4d78..903cad90c 100644 --- a/README.md +++ b/README.md @@ -13,17 +13,15 @@ The different ways of compiling can be found in the [**./compilation**](https:// Dependancies and help using docker can be found at [**./tutorials/building.md**](https://github.com/LNIS-Projects/OpenFPGA/blob/documentation/tutorials/building.md). **Compilation steps:** -1. Clone the repository (git clone https://github.com/LNIS-Projects/OpenFPGA.git && cd OpenFPGA) -2. Create a folder named build in OpenPFGA repository (mkdir build && cd build) -3. Create Makefile in this folder using cmake (cmake .. -DCMAKE_BUILD_TYPE=debug) -4. Compile the tool and its dependencies (make) - -*We currently implemented OpenFPGA for:* - -*1. Ubuntu 16.04* -*2. Red Hat 7.5* -*3. MacOS High Sierra 10.13.4* +1. git clone https://github.com/LNIS-Projects/OpenFPGA.git && cd OpenFPGA # *Clone the repository and go into it* +2. mkdir build && cd build # *Create a folder named build in OpenPFGA repository* +3. cmake .. -DCMAKE_BUILD_TYPE=debug # *Create Makefile in this folder using cmake* +4. make # *Compile the tool and its dependencies* +*We currently implemented OpenFPGA for:*
+*1. Ubuntu 16.04*
+*2. Red Hat 7.5*
+*3. MacOS Mojiva 10.13.4*

*Please note that those were the versions we tested the software for. It might work with earlier versions and other distributions.* ## Documentation diff --git a/docs/source/fpga_bitstream/command_line_usage.rst b/docs/source/fpga_bitstream/command_line_usage.rst index 839ac7fa9..278bee494 100644 --- a/docs/source/fpga_bitstream/command_line_usage.rst +++ b/docs/source/fpga_bitstream/command_line_usage.rst @@ -1,4 +1,14 @@ Command-line Options for FPGA Bitstream Generator ================================================= -**Under Construction** \ No newline at end of file +All the command line options of FPGA-Bitstream can be shown by calling the help menu of VPR. Here are all the FPGA-Verilog-related options that you can find: + +FPGA-Verilog Supported Option:: + + --fpga_bitstream_generator + +.. csv-table:: Commmand-line Option of FPGA-Bitstream + :header: "Command Options", "Description" + :widths: 15, 30 + + "--fpga_bitstream_generator", "Turn on the FPGA-Bitstream and output a .bitstream file containing FPGA configuration." diff --git a/docs/source/fpga_verilog/command_line_usage.rst b/docs/source/fpga_verilog/command_line_usage.rst index dfe34eaea..656b2ecef 100644 --- a/docs/source/fpga_verilog/command_line_usage.rst +++ b/docs/source/fpga_verilog/command_line_usage.rst @@ -21,7 +21,6 @@ FPGA-Verilog Supported Options:: :widths: 15, 30 "--fpga_verilog", "Turn on the FPGA-Verilog." -<<<<<<< HEAD "--fpga_verilog_dir ", "Specify the directory that all the Verilog files will be outputted to is the destination directory." "--fpga_verilog_include_timing", "Includes the timings found in the XML file." "--fpga_verilog_init_sim", "Initializes the simulation for ModelSim." @@ -30,7 +29,6 @@ FPGA-Verilog Supported Options:: "--fpga_verilog_print_top_testbench", "Print the full-chip-level testbench for the FPGA. Determines the type of autodeck." "--fpga_verilog_print_top_auto_testbench \ ", "Prints the testbench associated with the given benchmark. Determines the type of autodeck." -======= "--fpga_verilog_dir ", "Specify the directory where all the Verilog files will be outputted to. is the destination directory." "--fpga_verilog_include_timing", "Includes the timings found in the XML architecture description file." "--fpga_verilog_include_signal_init", "Set all nets to random value to be close of a real power-on case" @@ -46,8 +44,6 @@ FPGA-Verilog Supported Options:: "--fpga_verilog_print_sdc_pnr", "Generates SDC constraints to PNR" "--fpga_verilog_print_sdc_analysis", "Generates SDC to run timing analysis in PNR tool" "--fpga_verilog_print_user_defined_template", "Generates a template of hierarchy modules and their port mapping" - "", "" ->>>>>>> f56adc681567b73c7826228641e089482dffc009 .. note:: The selected directory will contain the *Verilog top file* and three other folders. The folders are: diff --git a/tutorials/fpga_flow/folder_organization.md b/tutorials/fpga_flow/folder_organization.md index 095325ad7..172f10782 100644 --- a/tutorials/fpga_flow/folder_organization.md +++ b/tutorials/fpga_flow/folder_organization.md @@ -17,10 +17,10 @@ In this folder are saved the architecture files. These files are Hardware descri This folder contains benchmarks to implement in the FPGA. it's divided in 3 folders: - **Blif**: Contains .blif and .act file to use in OpenFPGA. Benchmarks are divided in folder with the same name as the top module - **Verilog**: Contains Verilog netlist of benchmarks to use in OpenFPGA. Each project is saved in a folder with the same name as the top module. -- **List**: Contains files with a list of benchmarks to run in one flow. More details are available in [fpga_flow tutorial](https://github.com/LNIS-Projects/OpenFPGA/blob/documentation/tutorials/fpga_flow/how2use.md#benchmark-list) +- **List**: Contains files with a list of benchmarks to run in one flow. More details are available in [fpga_flow tutorial](https://github.com/LNIS-Projects/OpenFPGA/blob/master/tutorials/fpga_flow/how2use.md#benchmark-list) ## configs -This folder contains configuration files required by openFPGA flow. They specify path to tools and benchmarks as well as flow utilization mode. More details are available in [fpga_flow tutorial](https://github.com/LNIS-Projects/OpenFPGA/blob/documentation/tutorials/fpga_flow/how2use.md#configuration-file) +This folder contains configuration files required by openFPGA flow. They specify path to tools and benchmarks as well as flow utilization mode. More details are available in [fpga_flow tutorial](https://github.com/LNIS-Projects/OpenFPGA/blob/master/tutorials/fpga_flow/how2use.md#configuration-file) ## scripts This folder contains scripts call by OpenFPGA flow. Some of them can be used out of the flow as **pro_blif.pl** and **rewrite_path_in_file.pl** which respectively rewrite a blif file with 3 members on a ".latch" module to let it have 5 and replace a keyword in a file.
diff --git a/tutorials/fpga_flow/how2use.md b/tutorials/fpga_flow/how2use.md index 27c9b1db6..656953b3e 100644 --- a/tutorials/fpga_flow/how2use.md +++ b/tutorials/fpga_flow/how2use.md @@ -1,7 +1,7 @@ # FPGA flow This tutorial will help the user to understand how to use OpenFPGA flow.
-During this tutorial we consider the user start in the OpenFPGA folder and we'll use tips and informations provided in [tutorial index](https://github.com/LNIS-Projects/OpenFPGA/blob/documentation/tutorials/tutorial_index.md#tips-and-informations). Details on how the folder is organized are available [here](https://github.com/LNIS-Projects/OpenFPGA/blob/documentation/tutorials/fpga_flow/folder_organization.md). +During this tutorial we consider the user start in the OpenFPGA folder and we'll use tips and informations provided in [tutorial index](https://github.com/LNIS-Projects/OpenFPGA/blob/master/tutorials/tutorial_index.md#tips-and-informations). Details on how the folder is organized are available [here](https://github.com/LNIS-Projects/OpenFPGA/blob/master/tutorials/fpga_flow/folder_organization.md). ## Running fpga_flow.pl @@ -16,7 +16,7 @@ cd fpga_flow
By running this script we took an architecture description file, generated its netlist, generated a bitstream to implement a benchmark on it and verified this implementation.
When you open this file you can see that 2 scripts are called. The first one is **rewrite_path_in_file.pl** which allow us to make this tutorial generic by generating full path to dependancies.
-The second one is **fpga_flow.pl**. This script launch OpenFPGA flow and can be used with a lot of [options](https://github.com/LNIS-Projects/OpenFPGA/blob/documentation/tutorials/fpga_flow/options.md).
+The second one is **fpga_flow.pl**. This script launch OpenFPGA flow and can be used with a lot of [options](https://github.com/LNIS-Projects/OpenFPGA/blob/master/tutorials/fpga_flow/options.md).
There is 3 important things to see: - All FPGA-Verilog options have been activated - fpga_flow.pl calls a configuration file through "config_file" variable diff --git a/tutorials/tutorial_index.md b/tutorials/tutorial_index.md index c6013d6dc..8198fb6da 100644 --- a/tutorials/tutorial_index.md +++ b/tutorials/tutorial_index.md @@ -3,8 +3,8 @@ OpenFPGA an IP Verilog Generator allowing reliable and fast testing of homogeneous architectures.
Its main goal is to easily and efficiently generated a complete customizable FPGA. It uses a semi-custom design technic.

These tutorials are organized as follow: -* [Building the tool and his dependancies](https://github.com/LNIS-Projects/OpenFPGA/blob/documentation/tutorials/building.md) -* [Launching the flow and understand how it works](https://github.com/LNIS-Projects/OpenFPGA/blob/documentation/tutorials/fpga_flow/how2use.md) +* [Building the tool and his dependancies](https://github.com/LNIS-Projects/OpenFPGA/blob/master/tutorials/building.md) +* [Launching the flow and understand how it works](https://github.com/LNIS-Projects/OpenFPGA/blob/master/tutorials/fpga_flow/how2use.md) * Architecture modification ## Folder organization diff --git a/vpr7_x2p/vpr/SRC/base/OptionTokens.c b/vpr7_x2p/vpr/SRC/base/OptionTokens.c index a0d765a89..78b956ce3 100644 --- a/vpr7_x2p/vpr/SRC/base/OptionTokens.c +++ b/vpr7_x2p/vpr/SRC/base/OptionTokens.c @@ -102,7 +102,7 @@ struct s_TokenPair OptionBaseTokenList[] = { { "fpga_verilog_print_sdc_analysis", OT_FPGA_VERILOG_SYN_PRINT_SDC_ANALYSIS }, /* Specify the simulator path for Verilog netlists */ /* Xifan Tang: Bitstream generator */ { "fpga_bitstream_generator", OT_FPGA_BITSTREAM_GENERATOR }, /* turn on bitstream generator, and specify the output file */ - { "fpga_bitstream_output_file", OT_FPGA_BITSTREAM_OUTPUT_FILE }, /* turn on bitstream generator, and specify the output file */ + // { "fpga_bitstream_output_file", OT_FPGA_BITSTREAM_OUTPUT_FILE }, /* turn on bitstream generator, and specify the output file */ // AA: temporarily deprecated /* mrFPGA: Xifan TANG */ {"show_sram", OT_SHOW_SRAM}, {"show_pass_trans", OT_SHOW_PASS_TRANS}, diff --git a/vpr7_x2p/vpr/SRC/base/ReadOptions.c b/vpr7_x2p/vpr/SRC/base/ReadOptions.c index b90b90f4f..108e9d355 100644 --- a/vpr7_x2p/vpr/SRC/base/ReadOptions.c +++ b/vpr7_x2p/vpr/SRC/base/ReadOptions.c @@ -562,8 +562,8 @@ ProcessOption(INP char **Args, INOUTP t_options * Options) { /* Xifan TANG: Bitstream generator */ case OT_FPGA_BITSTREAM_GENERATOR: return Args; - case OT_FPGA_BITSTREAM_OUTPUT_FILE: - return ReadString(Args, &Options->fpga_bitstream_file); +// case OT_FPGA_BITSTREAM_OUTPUT_FILE: // AA: temporarily deprecated +// return ReadString(Args, &Options->fpga_bitstream_file); /* mrFPGA: Xifan TANG */ case OT_SHOW_SRAM: case OT_SHOW_PASS_TRANS: diff --git a/vpr7_x2p/vpr/SRC/base/vpr_api.c b/vpr7_x2p/vpr/SRC/base/vpr_api.c index 023b2df92..7d1730883 100644 --- a/vpr7_x2p/vpr/SRC/base/vpr_api.c +++ b/vpr7_x2p/vpr/SRC/base/vpr_api.c @@ -213,8 +213,8 @@ void vpr_print_usage(void) { vpr_printf(TIO_MESSAGE_INFO, "\t--fpga_verilog_print_sdc_analysis\n"); /* Xifan Tang: Bitstream generator */ vpr_printf(TIO_MESSAGE_INFO, "Bitstream Generator Options:\n"); - vpr_printf(TIO_MESSAGE_INFO, "\t--fpga_bitstream_generator \n"); - vpr_printf(TIO_MESSAGE_INFO, "\t--fpga_bitstream_output_file \n"); + vpr_printf(TIO_MESSAGE_INFO, "\t--fpga_bitstream_generator\n"); +// vpr_printf(TIO_MESSAGE_INFO, "\t--fpga_bitstream_output_file \n"); // AA: temporarily deprecated } void vpr_init_file_handler() { diff --git a/vpr7_x2p/vpr/regression_verilog.sh b/vpr7_x2p/vpr/regression_verilog.sh index c93eb7d49..8007363cf 100755 --- a/vpr7_x2p/vpr/regression_verilog.sh +++ b/vpr7_x2p/vpr/regression_verilog.sh @@ -33,7 +33,7 @@ perl rewrite_path_in_file.pl -i $arch_xml_file -k $arch_ff_keyword $new_ff_path cd - # Run VPR -./vpr $arch_xml_file $blif_file --full_stats --activity_file $act_file --fpga_verilog --fpga_verilog_dir $verilog_output_dirpath/$verilog_output_dirname --fpga_x2p_rename_illegal_port --fpga_bitstream_generator --fpga_verilog_print_top_testbench --fpga_verilog_print_input_blif_testbench --fpga_verilog_include_timing --fpga_verilog_include_signal_init --fpga_verilog_print_formal_verification_top_netlist --fpga_verilog_print_autocheck_top_testbench $verilog_reference --fpga_verilog_print_user_defined_template --route_chan_width $vpr_route_chan_width --fpga_verilog_include_icarus_simulator --fpga_verilog_print_report_timing_tcl --power --tech_properties $tech_file --fpga_verilog_print_sdc_pnr --fpga_verilog_print_sdc_analysis --fpga_x2p_compact_routing_hierarchy --fpga_verilog_explicit_mapping +./vpr $arch_xml_file $blif_file --full_stats --nodisp --activity_file $act_file --fpga_verilog --fpga_verilog_dir $verilog_output_dirpath/$verilog_output_dirname --fpga_x2p_rename_illegal_port --fpga_bitstream_generator --fpga_verilog_print_top_testbench --fpga_verilog_print_input_blif_testbench --fpga_verilog_include_timing --fpga_verilog_include_signal_init --fpga_verilog_print_formal_verification_top_netlist --fpga_verilog_print_autocheck_top_testbench $verilog_reference --fpga_verilog_print_user_defined_template --route_chan_width $vpr_route_chan_width --fpga_verilog_include_icarus_simulator --fpga_verilog_print_report_timing_tcl --power --tech_properties $tech_file --fpga_verilog_print_sdc_pnr --fpga_verilog_print_sdc_analysis --fpga_x2p_compact_routing_hierarchy --fpga_verilog_explicit_mapping cd $fpga_flow_scripts perl rewrite_path_in_file.pl -i $ff_path -o $new_ff_path -k $ff_keyword $ff_include_path From b810b5cab9457468cbca53dafc533f9558460da5 Mon Sep 17 00:00:00 2001 From: AurelienUoU Date: Tue, 16 Jul 2019 07:04:45 -0600 Subject: [PATCH 06/10] fpga_flow bug fix + upload k8 architecture --- .../k8_N10_sram_chain_FC_template.xml | 1139 +++++++++++++++++ fpga_flow/scripts/fpga_flow.pl | 6 +- fpga_flow/tuto_fpga_flow.sh | 2 +- vpr7_x2p/vpr/regression_verilog.sh | 2 +- 4 files changed, 1144 insertions(+), 5 deletions(-) create mode 100644 fpga_flow/arch/template/k8_N10_sram_chain_FC_template.xml diff --git a/fpga_flow/arch/template/k8_N10_sram_chain_FC_template.xml b/fpga_flow/arch/template/k8_N10_sram_chain_FC_template.xml new file mode 100644 index 000000000..84d2c3ab3 --- /dev/null +++ b/fpga_flow/arch/template/k8_N10_sram_chain_FC_template.xml @@ -0,0 +1,1139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10e-12 + + + 10e-12 + + + + + + + + + + + + + + + + + + + + + + 10e-12 0e-12 0e-12 + + + 10e-12 0e-12 0e-12 + + + + + + + + + + + 10e-12 + + + 10e-12 + + + 10e-12 + + + 10e-12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 1 1 1 1 + 1 1 1 1 + + + + 1 1 1 + 1 1 + + + + 1 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + io.outpad io.inpad + io.outpad io.inpad + io.outpad io.inpad + io.outpad io.inpad + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 235e-12 + 235e-12 + 235e-12 + 235e-12 + 235e-12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 195e-12 + 195e-12 + 195e-12 + 195e-12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 261e-12 + 261e-12 + 261e-12 + 261e-12 + 261e-12 + 261e-12 + + + + + + + 261e-12 + 261e-12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 261e-12 + 261e-12 + 261e-12 + 261e-12 + + + + + + + 261e-12 + 261e-12 + 261e-12 + 261e-12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 261e-12 + 261e-12 + 261e-12 + 261e-12 + 261e-12 + + + + + + + 261e-12 + 261e-12 + 261e-12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fpga_flow/scripts/fpga_flow.pl b/fpga_flow/scripts/fpga_flow.pl index af547d78c..ffe793267 100644 --- a/fpga_flow/scripts/fpga_flow.pl +++ b/fpga_flow/scripts/fpga_flow.pl @@ -1358,9 +1358,6 @@ sub run_std_vpr($ $ $ $ $ $ $ $ $) if ("on" eq $opt_ptr->{vpr_fpga_x2p_sim_window_size}) { $vpr_spice_opts = $vpr_spice_opts." --fpga_x2p_sim_window_size $opt_ptr->{vpr_fpga_x2p_sim_window_size_val}"; } - if ("on" eq $opt_ptr->{vpr_fpga_x2p_compact_routing_hierarchy}) { - $vpr_spice_opts = $vpr_spice_opts." --fpga_x2p_compact_routing_hierarchy"; - } if ("on" eq $opt_ptr->{vpr_fpga_spice_sim_mt_num}) { $vpr_spice_opts = $vpr_spice_opts." --fpga_spice_sim_mt_num $opt_ptr->{vpr_fpga_spice_sim_mt_num_val}"; } @@ -1446,6 +1443,9 @@ sub run_std_vpr($ $ $ $ $ $ $ $ $) if ("on" eq $opt_ptr->{vpr_fpga_verilog_explicit_mapping}) { $vpr_spice_opts = $vpr_spice_opts." --fpga_verilog_explicit_mapping"; } + if ("on" eq $opt_ptr->{vpr_fpga_x2p_compact_routing_hierarchy}) { + $vpr_spice_opts = $vpr_spice_opts." --fpga_x2p_compact_routing_hierarchy"; + } } # FPGA Bitstream Generator Options diff --git a/fpga_flow/tuto_fpga_flow.sh b/fpga_flow/tuto_fpga_flow.sh index a1ca429d8..3ee86966a 100755 --- a/fpga_flow/tuto_fpga_flow.sh +++ b/fpga_flow/tuto_fpga_flow.sh @@ -28,6 +28,6 @@ perl rewrite_path_in_file.pl -i $ff_path -k $dir_keyword $verilog_path # Set the # SRAM FPGA # TT case -perl fpga_flow.pl -conf ${config_file} -benchmark ${bench_txt} -rpt ${rpt_file} -N 10 -K 6 -ace_d 0.5 -multi_thread 1 -vpr_fpga_x2p_rename_illegal_port -vpr_fpga_verilog -vpr_fpga_verilog_dir $verilog_path -vpr_fpga_bitstream_generator -vpr_fpga_verilog_print_autocheck_top_testbench -vpr_fpga_verilog_include_timing -vpr_fpga_verilog_include_signal_init -vpr_fpga_verilog_formal_verification_top_netlist -fix_route_chan_width -vpr_fpga_verilog_include_icarus_simulator -power -vpr_fpga_verilog_print_user_defined_template -vpr_fpga_verilog_print_report_timing_tcl -vpr_fpga_verilog_print_sdc_pnr -vpr_fpga_verilog_print_sdc_analysis -vpr_fpga_x2p_compact_routing_hierarchy -end_flow_with_test -vpr_fpga_verilog_explicit_mapping -vpr_fpga_x2p_compact_routing_hierarchy +perl fpga_flow.pl -conf ${config_file} -benchmark ${bench_txt} -rpt ${rpt_file} -N 10 -K 6 -ace_d 0.5 -multi_thread 1 -vpr_fpga_x2p_rename_illegal_port -vpr_fpga_verilog -vpr_fpga_verilog_dir $verilog_path -vpr_fpga_bitstream_generator -vpr_fpga_verilog_print_autocheck_top_testbench -vpr_fpga_verilog_include_timing -vpr_fpga_verilog_include_signal_init -vpr_fpga_verilog_formal_verification_top_netlist -fix_route_chan_width -vpr_fpga_verilog_include_icarus_simulator -power -vpr_fpga_verilog_print_user_defined_template -vpr_fpga_verilog_print_report_timing_tcl -vpr_fpga_verilog_print_sdc_pnr -vpr_fpga_verilog_print_sdc_analysis -vpr_fpga_x2p_compact_routing_hierarchy -end_flow_with_test -vpr_fpga_verilog_explicit_mapping echo "Netlists successfully generated and tested" diff --git a/vpr7_x2p/vpr/regression_verilog.sh b/vpr7_x2p/vpr/regression_verilog.sh index 8007363cf..190ae5523 100755 --- a/vpr7_x2p/vpr/regression_verilog.sh +++ b/vpr7_x2p/vpr/regression_verilog.sh @@ -14,7 +14,7 @@ arch_xml_file="${OpenFPGA_path}/fpga_flow/arch/generated/k6_N10_sram_chain_HC.xm blif_file="${OpenFPGA_path}/fpga_flow/benchmarks/Blif/Test_Modes/$benchmark.blif" act_file="${OpenFPGA_path}/fpga_flow/benchmarks/Blif/Test_Modes/$benchmark.act " verilog_reference="${OpenFPGA_path}/fpga_flow/benchmarks/Verilog/Test_Modes/$benchmark.v" -vpr_route_chan_width="200" +vpr_route_chan_width="300" fpga_flow_script="${OpenFPGA_path}/fpga_flow/scripts" ff_path="$vpr_path/VerilogNetlists/ff.v" new_ff_path="$verilog_output_dirpath/$verilog_output_dirname/SRC/ff.v" From 3d079c942159b5d6dd9594785f1f6377e55aab65 Mon Sep 17 00:00:00 2001 From: AurelienUoU Date: Tue, 16 Jul 2019 07:20:21 -0600 Subject: [PATCH 07/10] Add folder creation in tuto_fpga_flow.sh to ease the use --- fpga_flow/tuto_fpga_flow.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fpga_flow/tuto_fpga_flow.sh b/fpga_flow/tuto_fpga_flow.sh index 3ee86966a..72cae371a 100755 --- a/fpga_flow/tuto_fpga_flow.sh +++ b/fpga_flow/tuto_fpga_flow.sh @@ -16,6 +16,9 @@ ff_path="${pwd_path}/../vpr7_x2p/vpr/VerilogNetlists/ff.v" dir_keyword="GENERATED_DIR_KEYWORD" rm -rf ${pwd_path}/results_OpenPithon + +cd ${pwd_path}/arch +mkdir generated # create folder to save rewritten architecture cd ${pwd_path}/scripts # Replace keyword in config and architecture files From a04555419a0d45bc2a92f0200fed9f71a6387ec7 Mon Sep 17 00:00:00 2001 From: AurelienUoU Date: Tue, 16 Jul 2019 07:30:25 -0600 Subject: [PATCH 08/10] Typo fix --- tutorials/building.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/building.md b/tutorials/building.md index 3e00855c9..53a4f096d 100644 --- a/tutorials/building.md +++ b/tutorials/building.md @@ -41,7 +41,7 @@ OpenFPGA requires all the dependancies listed below: ## Docker If all these dependancies are not installed in your machine you can choose to use a Docker (docker tool need to be installed). To ease customer first experience a Dockerfile is provided in OpenFPGA folder. A container ready to use can be created with the following command: -- docker run -it --rm -v `pwd`:/localfile/OpenFPGA -w=“/localfile/OpenFPGAr” lnis-projects/open_fpga bash +- docker run -it --rm -v `pwd`:/localfile/OpenFPGA -w=“/localfile/OpenFPGA” lnis-projects/open_fpga bash Or a container where you can build OpenFPGA yourself can be created with the following commands: - docker build . -t open_fpga From fe218fc207bd947fda19a177b7f58b1dc9549e58 Mon Sep 17 00:00:00 2001 From: AurelienUoU Date: Tue, 16 Jul 2019 11:52:24 -0600 Subject: [PATCH 09/10] Tutorial update --- README.md | 10 ++++---- tutorials/building.md | 3 ++- tutorials/fpga_flow/how2use.md | 22 ++++++++++++++++-- .../architectures_schematics/frac_lut8.pdf | Bin 0 -> 77921 bytes .../architectures_schematics/fract_lut6.pdf | Bin 0 -> 63472 bytes 5 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 tutorials/images/architectures_schematics/frac_lut8.pdf create mode 100644 tutorials/images/architectures_schematics/fract_lut6.pdf diff --git a/README.md b/README.md index 903cad90c..54247b5fd 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ The OpenFPGA framework is the **first open-source FPGA IP generator** supporting ## Compilation -The different ways of compiling can be found in the [**./compilation**](https://github.com/LNIS-Projects/OpenFPGA/tree/documentation/compilation) folder.
-Dependancies and help using docker can be found at [**./tutorials/building.md**](https://github.com/LNIS-Projects/OpenFPGA/blob/documentation/tutorials/building.md). +The different ways of compiling can be found in the [**./compilation**](https://github.com/LNIS-Projects/OpenFPGA/tree/master/compilation) folder.
+Dependancies and help using docker can be found at [**./tutorials/building.md**](https://github.com/LNIS-Projects/OpenFPGA/blob/master/tutorials/building.md). **Compilation steps:** 1. git clone https://github.com/LNIS-Projects/OpenFPGA.git && cd OpenFPGA # *Clone the repository and go into it* @@ -29,10 +29,8 @@ OpenFPGA's [full documentation](https://openfpga.readthedocs.io/en/master/) incl ## Tutorial -You can find in the folder [**./tutorials**](https://github.com/LNIS-Projects/OpenFPGA/tree/documentation/tutorials). This will help you get in touch with the software and test different configurations to see how OpenFPGA reacts to them. +You can find in the folder [**./tutorials**](https://github.com/LNIS-Projects/OpenFPGA/tree/master/tutorials). This will help you get in touch with the software and test different configurations to see how OpenFPGA reacts to them. Through this tutorial users can learn how to use the flow and set the dependancies.
-The [tutorial index](https://github.com/LNIS-Projects/OpenFPGA/blob/documentation/tutorials/tutorial_index.md) will - - +The [tutorial index](https://github.com/LNIS-Projects/OpenFPGA/blob/master/tutorials/tutorial_index.md) will guide you through trainings and explain folder oraganization as well as referencing tips and used keywords. diff --git a/tutorials/building.md b/tutorials/building.md index 53a4f096d..bc7bc28a9 100644 --- a/tutorials/building.md +++ b/tutorials/building.md @@ -41,7 +41,8 @@ OpenFPGA requires all the dependancies listed below: ## Docker If all these dependancies are not installed in your machine you can choose to use a Docker (docker tool need to be installed). To ease customer first experience a Dockerfile is provided in OpenFPGA folder. A container ready to use can be created with the following command: -- docker run -it --rm -v `pwd`:/localfile/OpenFPGA -w=“/localfile/OpenFPGA” lnis-projects/open_fpga bash +- docker run lnis/open_fpga:release
+*Warning: This command is for quick testing. If you want to conserve your work you should certainly use other options as "-v".* Or a container where you can build OpenFPGA yourself can be created with the following commands: - docker build . -t open_fpga diff --git a/tutorials/fpga_flow/how2use.md b/tutorials/fpga_flow/how2use.md index 656953b3e..ab0a3f9f5 100644 --- a/tutorials/fpga_flow/how2use.md +++ b/tutorials/fpga_flow/how2use.md @@ -22,7 +22,7 @@ There is 3 important things to see: - fpga_flow.pl calls a configuration file through "config_file" variable - fpga_flow.pl calls a list of benchmark to implement and test through "bench_txt" variable -## Configuration file +### Configuration file In this file paths have to be full path. Relative path could lead to errors.
The file is organized in 3 parts: @@ -64,7 +64,7 @@ vpr_power_tags = PB Types|Routing|Switch Box|Connection Box|Primitives|Interc St *This example file can be found at OPENFPGAPATHKEYWORD/fpga_flow/configs/tutorial/tuto.conf* -## Benchmark list +### Benchmark list The benchmark folder contains 3 sub-folders: * **Blif**: contains .blif and .act of benchmarks @@ -76,3 +76,21 @@ The benchmark list file can contain as many benchmarks as available in the same top_module/*.v,; where is the number of channel/wire between each block. *This example file can be found at OPENFPGAPATHKEYWORD/fpga_flow/benchmarks/List/tuto_benchmark.txt* + + +## Modifying flow +Once dependancies are understood, we can modify the flow by changing the architecture and the route channel width. + +### Experiment + +* cd OPENFPGAPATHKEYWORD/fpga_flow/configs/tutorial +* replace the architectures "k6_N10_sram_chain_HC_template.xml" and "k6_N10_sram_chain_HC.xml" respectively with "k8_N10_sram_chain_FC_template.xml" and "k8_N10_sram_chain_FC.xml" in tuto.conf +* cd OPENFPGAPATHKEYWORD/fpga_flow/benchmarks/List +* replace "200" with "300" in tuto_benchmark.txt +* cd OPENFPGAPATHKEYWORD/fpga_flow +* replace the architectures "k6_N10_sram_chain_HC_template.xml" and "k6_N10_sram_chain_HC.xml" respectively with "k8_N10_sram_chain_FC_template.xml" and "k8_N10_sram_chain_FC.xml" in tuto_fpga_flow.sh +* ./tuto_fpga_flow.sh + +### Explanation + +With this last experiment we replace the [**K6 architecture**](https://github.com/LNIS-Projects/OpenFPGA/blob/master/tutorials/image/architectures_schematics/frac_lut6.pdf) with a [**K8 architecture**](https://github.com/LNIS-Projects/OpenFPGA/blob/master/tutorials/image/architectures_schematics/frac_lut8.pdf), which means a 8-inputs fracturable LUT (implemented by LUT6 and LUT4 with 2 shared inputs). This architecture provides more modes for the CLB and the crossbar changed from a half-connected to a fully connected, implying bigger multiplexor between the CLB and LUT inputs. These requirement in term of interconnection will lead to the increase in routing channel width. Indeed, if the routing channel is to low, it could be impossible to route a benchmark or the FPGA output can be delayed. diff --git a/tutorials/images/architectures_schematics/frac_lut8.pdf b/tutorials/images/architectures_schematics/frac_lut8.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b79821d2818658bc6f3b4f215c1f1bd2a75c1157 GIT binary patch literal 77921 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

<>KD`7R;t`OXC*Yg;5%obG*Rv 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 literal 0 HcmV?d00001 From 509c1d2c80e3fd5abf619a71017a5eef4c929630 Mon Sep 17 00:00:00 2001 From: AurelienUoU Date: Tue, 16 Jul 2019 13:13:58 -0600 Subject: [PATCH 10/10] Link path correction --- fpga_flow/tuto_fpga_flow.sh | 2 +- tutorials/fpga_flow/how2use.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fpga_flow/tuto_fpga_flow.sh b/fpga_flow/tuto_fpga_flow.sh index 72cae371a..7d70423cd 100755 --- a/fpga_flow/tuto_fpga_flow.sh +++ b/fpga_flow/tuto_fpga_flow.sh @@ -18,7 +18,7 @@ dir_keyword="GENERATED_DIR_KEYWORD" rm -rf ${pwd_path}/results_OpenPithon cd ${pwd_path}/arch -mkdir generated # create folder to save rewritten architecture +mkdir -p generated # create folder to save rewritten architecture cd ${pwd_path}/scripts # Replace keyword in config and architecture files diff --git a/tutorials/fpga_flow/how2use.md b/tutorials/fpga_flow/how2use.md index ab0a3f9f5..0bbe343a0 100644 --- a/tutorials/fpga_flow/how2use.md +++ b/tutorials/fpga_flow/how2use.md @@ -93,4 +93,4 @@ Once dependancies are understood, we can modify the flow by changing the archite ### Explanation -With this last experiment we replace the [**K6 architecture**](https://github.com/LNIS-Projects/OpenFPGA/blob/master/tutorials/image/architectures_schematics/frac_lut6.pdf) with a [**K8 architecture**](https://github.com/LNIS-Projects/OpenFPGA/blob/master/tutorials/image/architectures_schematics/frac_lut8.pdf), which means a 8-inputs fracturable LUT (implemented by LUT6 and LUT4 with 2 shared inputs). This architecture provides more modes for the CLB and the crossbar changed from a half-connected to a fully connected, implying bigger multiplexor between the CLB and LUT inputs. These requirement in term of interconnection will lead to the increase in routing channel width. Indeed, if the routing channel is to low, it could be impossible to route a benchmark or the FPGA output can be delayed. +With this last experiment we replace the [**K6 architecture**](https://github.com/LNIS-Projects/OpenFPGA/blob/master/tutorials/images/architectures_schematics/frac_lut6.pdf) with a [**K8 architecture**](https://github.com/LNIS-Projects/OpenFPGA/blob/master/tutorials/images/architectures_schematics/frac_lut8.pdf), which means a 8-inputs fracturable LUT (implemented by LUT6 and LUT4 with 2 shared inputs). This architecture provides more modes for the CLB and the crossbar changed from a half-connected to a fully connected, implying bigger multiplexor between the CLB and LUT inputs. These requirement in term of interconnection will lead to the increase in routing channel width. Indeed, if the routing channel is to low, it could be impossible to route a benchmark or the FPGA output can be delayed.