From 1d97cbf9b25fae63e187057b74ac2d77e90370ea Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Fri, 9 Apr 2021 08:38:20 -0600 Subject: [PATCH 01/32] Update to improve readability --- .../arch_modeling/open_cell_libraries_tutorial.rst | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst b/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst index 5580ccced..6a1e3fda0 100644 --- a/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst @@ -205,7 +205,7 @@ We have now finished creating the control and viewing the important sections for Clone Skywater PDK into OpenFPGA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -We will be using the open-source Skywater PDK to aid us in creating our circuit model. We start by cloning the Skywater PDK github repository into the OpenFPGA root directory. +We will be using the open-source Skywater PDK to create our circuit model. We start by cloning the Skywater PDK github repository into the OpenFPGA root directory. Run the following command in the root directory of OpenFPGA: .. code-block:: bash @@ -223,15 +223,15 @@ This will take some time to complete due to the size of the libraries. Once the Create and Verify the Standard Cell Library Circuit Model ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -To create the circuit model, we will modify the ``k6_frac_N10_adder_chain_40nm_openfpga.xml`` OpenFPGA architecture file. We will remove the circuit model -for OpenFPGA's **OR2** gate, replace the circuit model with one referencing the Skywater cell library, and modify the LUT that references the old **OR2** +To create the circuit model, we will modify the ``k6_frac_N10_adder_chain_40nm_openfpga.xml`` OpenFPGA architecture file by removing the circuit model +for OpenFPGA's **OR2** gate, replacing the circuit model with one referencing the Skywater cell library, and modifying the LUT that references the old **OR2** circuit model to reference our new circuit model. We begin by running the following command in the root directory: .. code-block:: bash vi openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml -We begin the circuit model creation process by replacing **LINE67** to **LINE81** with the following: +We continue the circuit model creation process by replacing **LINE67** to **LINE81** with the following: .. code-block:: xml @@ -299,7 +299,7 @@ directory, run the following commands: vvp compiled_and2 -With IVerilog complete, we can verify the cell library has been bound correctly by viewing the ``luts.v`` file and the waveforms with GTKWave. +With IVerilog complete, we can verify that the cell library has been bound correctly by viewing the ``luts.v`` file and the waveforms with GTKWave. From the root directory, view the ``luts.v`` file with this command: @@ -471,10 +471,12 @@ The simulation waveforms should look similar to the following :numref:`fig_custo Simulation Waveforms with Skywater PDK Circuit Model -We have now verified that the Skywater PDK Cell Library has been instantiated and bound to the OpenFPGA architecture file. If you have any problems, please reach out to us. +We have now verified that the Skywater PDK Cell Library has been instantiated and bound to the OpenFPGA architecture file. If you have any problems, please `contact`_ us. .. _Verification: https://openfpga.readthedocs.io/en/master/tutorials/design_flow/verilog2verification/ .. _PDK: https://github.com/google/skywater-pdk .. _GTKWave: https://github.com/gtkwave/gtkwave + +.. _contact: https://openfpga.readthedocs.io/en/master/contact/ From c6ae2a9b171334199a96069dfb241d5c2d01e5d4 Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Fri, 9 Apr 2021 09:15:25 -0600 Subject: [PATCH 02/32] Fix opening paragraph --- .../tutorials/arch_modeling/open_cell_libraries_tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst b/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst index 6a1e3fda0..e7d232ca3 100644 --- a/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst @@ -17,7 +17,7 @@ Create and Verify the OpenFPGA Circuit Model .. note:: In this tutorial, we focus on binding a 2-input **OR** gate from a standard cell library to a circuit model in OpenFPGA's architecture description file. Note that the approach can be generalized to any circuit model. -For this tutorial, we start with an example where the HDL netlist of an 2-input **OR** gate that is auto-generated by OpenFPGA. After updating the architecture file, the auto-generated HDL netlist by OpenFPGA will directly instantiate a standard cell from the open-source Skywater 130nm PDK library. +For this tutorial, we start with an example where the HDL netlist of an 2-input **OR** gate that is auto-generated by OpenFPGA. After updating the architecture file, the auto-generated HDL netlist created by OpenFPGA will directly instantiate a standard cell from the open-source Skywater 130nm PDK library. To follow along, go to the root directory of OpenFPGA and enter: .. code-block:: bash From 456a5538841f6e5dca957e0f570ede10ab3d5cca Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Fri, 9 Apr 2021 16:02:37 -0600 Subject: [PATCH 03/32] Add Spypads tutorial --- .../arch_modeling/Spypads_tutorial.rst | 318 ++++++++++++++++++ 1 file changed, 318 insertions(+) create mode 100644 docs/source/tutorials/arch_modeling/Spypads_tutorial.rst diff --git a/docs/source/tutorials/arch_modeling/Spypads_tutorial.rst b/docs/source/tutorials/arch_modeling/Spypads_tutorial.rst new file mode 100644 index 000000000..08c3b2e0d --- /dev/null +++ b/docs/source/tutorials/arch_modeling/Spypads_tutorial.rst @@ -0,0 +1,318 @@ +Creating Spypads Using XML Syntax +================================= + +Introduction +~~~~~~~~~~~~ + +**In this tutorial, we will** + - Show the XML Syntax for Global Outputs + - Showcase an example with Spypads + - Modify an existing architecture to incorporate Spypads + - Verify correctness through GTKWave + +Through this tutorial, we will show how to create Spypads in OpenFPGA + +Spypads are physical output pins on a FPGA chip through which you can read out internal signals when doing silicon-level debugging. The XML syntax for spypads and other +global signals can be found on our :ref:`circuit_library` documentation page. + +To create a spypad, the ``port type`` needs to be set to **output** and ``is_global`` and ``is_io`` need to be set to **true**: + +.. code-block:: XML + + +When the port is syntactically correct, the outputs are independently wired from different instances to separated FPGA outputs and would physically look like + :numref:`fig_gpout`: + +.. _fig_gpout: + +.. figure:: ./figures/gpout_ports.png + :scale: 100% + + Diagram for General Purpose Output + +.. note:: The general-purpose outputs are not applicable to routing multiplexer outputs + +Pre-Built Spypads +~~~~~~~~~~~~~~~~~ + +An OpenFPGA architecture file that contains spypads and has a task that references it is the ``k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml`` +file. We can view ``k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml`` by entering the following command at the root directory of OpenFPGA: + +.. code-block:: bash + emacs openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml + +The spypads are defined from **LINE181** to **LINE183** and belong to the ``frac_lut6_spypad`` ``circuit_model`` that begins at **LINE172** + +.. code-block:: XML + :emphasize-lines: 10, 11, 12 + + + + + + + + + + + + + + + + + +The spypads are instantiated in the top-level verilog module ``fpga_top.v``. ``fpga_top.v`` is automatically generated when we run our task from the OpenFPGA root +directory. However, we need to modify the task configuration file to run the **full testbench** instead of the **formal testbench** to view the spypads' waveforms in +GTKWave. + +.. note:: To read about the differences between the **formal testbench** and the **full testbench**, please visit our page on testbenches: :ref:`testbench`. + +To open the task configuration file, run this command from the root directory of OpenFPGA: + +.. code-block:: bash + emacs openfpga_flow/tasks/fpga_verilog/spypad/config/task.conf + +The last line of the task configuration file (**LINE44**) sets the **formal testbench** to be the desired testbench. To use the **full testbench**, comment out **LINE44**. +The file will look like this when finished: + +.. code-block:: python + :linenos: + :emphasize-lines: 44 + + # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + # Configuration file for running experiments + # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + # timeout_each_job : FPGA Task script splits fpga flow into multiple jobs + # Each job execute fpga_flow script on combination of architecture & benchmark + # timeout_each_job is timeout for each job + # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + + [GENERAL] + run_engine=openfpga_shell + power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml + power_analysis = true + spice_output=false + verilog_output=true + timeout_each_job = 20*60 + fpga_flow=vpr_blif + + [OpenFPGA_SHELL] + openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_shell_scripts/example_script.openfpga + openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml + openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml + + [ARCHITECTURES] + arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/vpr_arch/k6_frac_N10_tileable_adder_register_scan_chain_depop50_spypad_40nm.xml + + [BENCHMARKS] + bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif + # Cannot pass automatically. Need change in .v file to match ports + # When passed, we can replace the and2 benchmark + #bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.blif + + [SYNTHESIS_PARAM] + bench0_top = and2 + bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act + bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v + + #bench0_top = test_mode_low + #bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.act + #bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/test_mode_low/test_mode_low.v + bench0_chan_width = 300 + + [SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] + end_flow_with_test= + #vpr_fpga_verilog_formal_verification_top_netlist= + +Our OpenFPGA task will now run the full testbench. We run the task with the following command from the root directory of OpenFPGA: + +.. code-block:: bash + python3 openfpga_flow/scripts/run_fpga_task.py fpga_verilog/spypad --debug --show_thread_logs + +.. note:: Python 3.8 or later is required to run this task + +We can now see the instantiation of these spypads in ``fpga_top.v`` and ``luts.v``. We will start by viewing ``luts.v`` with the following command: + +.. code-block:: bash + emacs openfpga_flow/tasks/fpga_verilog/spypad/latest/k6_frac_N10_tileable_adder_register_scan_chain_depop50_spypad_40nm/and2/MIN_ROUTE_CHAN_WIDTH/SRC/sub_module/luts.verilog + +The spypads are coming from the ``frac_lut6_spypad`` circuit model. In ``luts.v``, the ``frac_lut6_spypad`` module is defined around **LINE150** and looks as follows: + +.. code-block:: verilog + module frac_lut6_spypad(in, + sram, + sram_inv, + mode, + mode_inv, + lut4_out, + lut5_out, + lut6_out); + //----- INPUT PORTS ----- + input [0:5] in; + //----- INPUT PORTS ----- + input [0:63] sram; + //----- INPUT PORTS ----- + input [0:63] sram_inv; + //----- INPUT PORTS ----- + input [0:1] mode; + //----- INPUT PORTS ----- + input [0:1] mode_inv; + //----- OUTPUT PORTS ----- + output [0:3] lut4_out; + //----- OUTPUT PORTS ----- + output [0:1] lut5_out; + //----- OUTPUT PORTS ----- + output [0:0] lut6_out; + +The ``fpga_top.v`` file has some similarities. We can view the ``fpga_top.v`` file by running the following command: + +.. code-block:: bash + emacs openfpga_flow/tasks/fpga_verilog/spypad/latest/k6_frac_N10_tileable_adder_register_scan_chain_depop50_spypad_40nm/and2/MIN_ROUTE_CHAN_WIDTH/SRC/fpga_top.v + +If we look at the module definition and ports of ``fpga_top.v`` we should see the following: + +..code-block:: verilog + module fpga_top(pReset, + prog_clk, + TESTEN, + set, + reset, + clk, + gfpga_pad_frac_lut6_spypad_lut4_out, + gfpga_pad_frac_lut6_spypad_lut5_out, + gfpga_pad_frac_lut6_spypad_lut6_out, + gfpga_pad_GPIO_PAD, + ccff_head, + ccff_tail); + //----- GLOBAL PORTS ----- + input [0:0] pReset; + //----- GLOBAL PORTS ----- + input [0:0] prog_clk; + //----- GLOBAL PORTS ----- + input [0:0] TESTEN; + //----- GLOBAL PORTS ----- + input [0:0] set; + //----- GLOBAL PORTS ----- + input [0:0] reset; + //----- GLOBAL PORTS ----- + input [0:0] clk; + //----- GPOUT PORTS ----- + output [0:3] gfpga_pad_frac_lut6_spypad_lut4_out; + //----- GPOUT PORTS ----- + output [0:1] gfpga_pad_frac_lut6_spypad_lut5_out; + //----- GPOUT PORTS ----- + output [0:0] gfpga_pad_frac_lut6_spypad_lut6_out; + //----- GPIO PORTS ----- + inout [0:7] gfpga_pad_GPIO_PAD; + //----- INPUT PORTS ----- + input [0:0] ccff_head; + //----- OUTPUT PORTS ----- + output [0:0] ccff_tail; + +Using :numref:`fig_gpout` as a guide, we can relate our task like :numref:`fig_gpout_example` + +.. _fig_gpout: + +.. figure:: ./figures/gpout_ports_example.png + :scale: 100% + + Diagram for ``lut6_out`` + + +We can view testbench waveforms with GTKWave by running the following command from the root directory: + +.. code-block:: bash + gtkwave openfpga_flow/tasks/fpga_verilog/spypad/latest/k6_frac_N10_tileable_adder_register_scan_chain_depop50_spypad_40nm/and2/MIN_ROUTE_CHAN_WIDTH/and2_formal.vcd & + +.. note::Information on GTKWave can be found on our documentation page located here: :ref:`verilog2verification` + +The waveforms will appear similar to :numref:`fig_spypad_waves` + +.. _fig_spypad_waves: + +.. figure:: ./figures/spypad_waveforms.png + :scale: 100% + + Spypad Waveforms + +Building Spypads +~~~~~~~~~~~~~~~~ + +We will modify the``k6_frac_N10_adder_chain_40nm_openfpga.xml`` file found in OpenFPGA to expose the **sumout** output from the **ADDF** module. We can start modifying +the file by running the following command: + +.. code-block:: bash + emacs openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml + +Replace **LINE214** with the following: + +.. code-block:: xml + + +**sumout** is now a global output. **sumout** will show up in the ``fpga_top.v`` file and will have waveforms in GTKWave if we run the **full testbench**. To run the +**full testbench**, we have to modify the ``hard_adder`` configuration file: + +.. code-block:: bash + emacs openfpga_flow/tasks/fpga_verilog/adder/hard_adder/config/task.conf + +Comment out the last line of the file to run the **full testbench**: + +.. code-block:: python + #vpr_fpga_verilog_formal_verification_top_netlist= + +We now run the task to see our changes: + +.. code-block:: bash + python3 openfpga_flow/scripts/run_fpga_task.py fpga_verilog/adder/hard_adder --debug --show_thread_logs + +We can view the global ports in ``fpga_top.v`` by running the following command: + +.. code-block:: bash + emacs openfpga_flow/tasks/fpga_verilog/adder/hard_adder/run064/k6_frac_N10_tileable_adder_chain_40nm/and2/MIN_ROUTE_CHAN_WIDTH/SRC/fpga_top.v + +The ``fpga_top.v`` should have the following in its module definition: + +.. code-block:: verilog + module fpga_top(pReset, + prog_clk, + set, + reset, + clk, + gfpga_pad_ADDF_sumout, + gfpga_pad_GPIO_PAD, + ccff_head, + ccff_tail); + //----- GLOBAL PORTS ----- + input [0:0] pReset; + //----- GLOBAL PORTS ----- + input [0:0] prog_clk; + //----- GLOBAL PORTS ----- + input [0:0] set; + //----- GLOBAL PORTS ----- + input [0:0] reset; + //----- GLOBAL PORTS ----- + input [0:0] clk; + //----- GPOUT PORTS ----- + output [0:19] gfpga_pad_ADDF_sumout; + +We can view the waveform by running GTKWave: + +.. code-block:: bash + gtkwave openfpga_flow/tasks/fpga_verilog/adder/hard_adder/latest/k6_frac_N10_tileable_adder_chain_40nm/and2/MIN_ROUTE_CHAN_WIDTH/and2_formal.vcd & + +The waveform should have some changes to its value. An example of what it may look like is displayed in :numref:`fig_spy_adder` + +.. _fig_spy_adder: + +.. figure:: ./figures/spyadder_waveform.png + :scale: 100% + + Sumout Waveform + +Conclusion +~~~~~~~~~~ + +In this tutorial, we have shown how to build spypads into OpenFPGA Architectures using XML Syntax. If you have any issues, feel free to `contact`_ us. + +.. _contact: https://openfpga.readthedocs.io/en/master/contact/ \ No newline at end of file From ce2e9c177b609cadeb7c9cfd0c7533ff918713be Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Fri, 9 Apr 2021 16:03:41 -0600 Subject: [PATCH 04/32] Add figures for spypads tutorial --- .../arch_modeling/figures/gpout_ports.png | Bin 0 -> 16042 bytes .../figures/gpout_ports_example.png | Bin 0 -> 19860 bytes .../arch_modeling/figures/spyadder_waveform.png | Bin 0 -> 13439 bytes .../arch_modeling/figures/spypad_waveforms.png | Bin 0 -> 24078 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/source/tutorials/arch_modeling/figures/gpout_ports.png create mode 100644 docs/source/tutorials/arch_modeling/figures/gpout_ports_example.png create mode 100644 docs/source/tutorials/arch_modeling/figures/spyadder_waveform.png create mode 100644 docs/source/tutorials/arch_modeling/figures/spypad_waveforms.png diff --git a/docs/source/tutorials/arch_modeling/figures/gpout_ports.png b/docs/source/tutorials/arch_modeling/figures/gpout_ports.png new file mode 100644 index 0000000000000000000000000000000000000000..76b24955a5b87de9ef011975ca7f0d894c446805 GIT binary patch literal 16042 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 literal 0 HcmV?d00001 diff --git a/docs/source/tutorials/arch_modeling/figures/gpout_ports_example.png b/docs/source/tutorials/arch_modeling/figures/gpout_ports_example.png new file mode 100644 index 0000000000000000000000000000000000000000..a862d336545a6d2822cdffbd22a6287673929196 GIT binary patch literal 19860 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 literal 0 HcmV?d00001 diff --git a/docs/source/tutorials/arch_modeling/figures/spyadder_waveform.png b/docs/source/tutorials/arch_modeling/figures/spyadder_waveform.png new file mode 100644 index 0000000000000000000000000000000000000000..54e34a0017aca99e753ae12fdfae1b6b92b48285 GIT binary patch literal 13439 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 literal 0 HcmV?d00001 diff --git a/docs/source/tutorials/arch_modeling/figures/spypad_waveforms.png b/docs/source/tutorials/arch_modeling/figures/spypad_waveforms.png new file mode 100644 index 0000000000000000000000000000000000000000..4ea110f599f9cf9f40dc908f6fbaa21f0febf7b2 GIT binary patch literal 24078 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 z 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 Date: Fri, 9 Apr 2021 16:04:37 -0600 Subject: [PATCH 05/32] Update to include spypads tutorial --- docs/source/tutorials/arch_modeling/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/tutorials/arch_modeling/index.rst b/docs/source/tutorials/arch_modeling/index.rst index c7f53ef3d..b6c27e69e 100644 --- a/docs/source/tutorials/arch_modeling/index.rst +++ b/docs/source/tutorials/arch_modeling/index.rst @@ -10,3 +10,4 @@ Architecture Modeling quick_start user_defined_temp_tutorial open_cell_libraries_tutorial + Spypads_tutorial From 62da6b467dd346fd35b3b18dca1117402d7e8b22 Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Fri, 9 Apr 2021 16:15:44 -0600 Subject: [PATCH 06/32] Update tutorial to correctly display code --- .../arch_modeling/Spypads_tutorial.rst | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/Spypads_tutorial.rst b/docs/source/tutorials/arch_modeling/Spypads_tutorial.rst index 08c3b2e0d..4b426e20c 100644 --- a/docs/source/tutorials/arch_modeling/Spypads_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/Spypads_tutorial.rst @@ -10,18 +10,18 @@ Introduction - Modify an existing architecture to incorporate Spypads - Verify correctness through GTKWave -Through this tutorial, we will show how to create Spypads in OpenFPGA +Through this tutorial, we will show how to create Spypads in OpenFPGA. Spypads are physical output pins on a FPGA chip through which you can read out internal signals when doing silicon-level debugging. The XML syntax for spypads and other global signals can be found on our :ref:`circuit_library` documentation page. To create a spypad, the ``port type`` needs to be set to **output** and ``is_global`` and ``is_io`` need to be set to **true**: -.. code-block:: XML +.. code-block:: xml + -When the port is syntactically correct, the outputs are independently wired from different instances to separated FPGA outputs and would physically look like - :numref:`fig_gpout`: +When the port is syntactically correct, the outputs are independently wired from different instances to separated FPGA outputs and would physically look like :numref:`fig_gpout`: .. _fig_gpout: @@ -39,13 +39,14 @@ An OpenFPGA architecture file that contains spypads and has a task that referenc file. We can view ``k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml`` by entering the following command at the root directory of OpenFPGA: .. code-block:: bash + emacs openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml The spypads are defined from **LINE181** to **LINE183** and belong to the ``frac_lut6_spypad`` ``circuit_model`` that begins at **LINE172** -.. code-block:: XML +.. code-block:: xml :emphasize-lines: 10, 11, 12 - + @@ -60,7 +61,7 @@ The spypads are defined from **LINE181** to **LINE183** and belong to the ``frac - + The spypads are instantiated in the top-level verilog module ``fpga_top.v``. ``fpga_top.v`` is automatically generated when we run our task from the OpenFPGA root directory. However, we need to modify the task configuration file to run the **full testbench** instead of the **formal testbench** to view the spypads' waveforms in @@ -71,6 +72,7 @@ GTKWave. To open the task configuration file, run this command from the root directory of OpenFPGA: .. code-block:: bash + emacs openfpga_flow/tasks/fpga_verilog/spypad/config/task.conf The last line of the task configuration file (**LINE44**) sets the **formal testbench** to be the desired testbench. To use the **full testbench**, comment out **LINE44**. @@ -128,6 +130,7 @@ The file will look like this when finished: Our OpenFPGA task will now run the full testbench. We run the task with the following command from the root directory of OpenFPGA: .. code-block:: bash + python3 openfpga_flow/scripts/run_fpga_task.py fpga_verilog/spypad --debug --show_thread_logs .. note:: Python 3.8 or later is required to run this task @@ -135,11 +138,13 @@ Our OpenFPGA task will now run the full testbench. We run the task with the foll We can now see the instantiation of these spypads in ``fpga_top.v`` and ``luts.v``. We will start by viewing ``luts.v`` with the following command: .. code-block:: bash + emacs openfpga_flow/tasks/fpga_verilog/spypad/latest/k6_frac_N10_tileable_adder_register_scan_chain_depop50_spypad_40nm/and2/MIN_ROUTE_CHAN_WIDTH/SRC/sub_module/luts.verilog The spypads are coming from the ``frac_lut6_spypad`` circuit model. In ``luts.v``, the ``frac_lut6_spypad`` module is defined around **LINE150** and looks as follows: .. code-block:: verilog + module frac_lut6_spypad(in, sram, sram_inv, @@ -168,11 +173,13 @@ The spypads are coming from the ``frac_lut6_spypad`` circuit model. In ``luts.v` The ``fpga_top.v`` file has some similarities. We can view the ``fpga_top.v`` file by running the following command: .. code-block:: bash + emacs openfpga_flow/tasks/fpga_verilog/spypad/latest/k6_frac_N10_tileable_adder_register_scan_chain_depop50_spypad_40nm/and2/MIN_ROUTE_CHAN_WIDTH/SRC/fpga_top.v If we look at the module definition and ports of ``fpga_top.v`` we should see the following: -..code-block:: verilog +.. code-block:: verilog + module fpga_top(pReset, prog_clk, TESTEN, @@ -223,6 +230,7 @@ Using :numref:`fig_gpout` as a guide, we can relate our task like :numref:`fig_g We can view testbench waveforms with GTKWave by running the following command from the root directory: .. code-block:: bash + gtkwave openfpga_flow/tasks/fpga_verilog/spypad/latest/k6_frac_N10_tileable_adder_register_scan_chain_depop50_spypad_40nm/and2/MIN_ROUTE_CHAN_WIDTH/and2_formal.vcd & .. note::Information on GTKWave can be found on our documentation page located here: :ref:`verilog2verification` @@ -243,37 +251,44 @@ We will modify the``k6_frac_N10_adder_chain_40nm_openfpga.xml`` file found in Op the file by running the following command: .. code-block:: bash + emacs openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml Replace **LINE214** with the following: .. code-block:: xml + **sumout** is now a global output. **sumout** will show up in the ``fpga_top.v`` file and will have waveforms in GTKWave if we run the **full testbench**. To run the **full testbench**, we have to modify the ``hard_adder`` configuration file: .. code-block:: bash + emacs openfpga_flow/tasks/fpga_verilog/adder/hard_adder/config/task.conf Comment out the last line of the file to run the **full testbench**: .. code-block:: python + #vpr_fpga_verilog_formal_verification_top_netlist= We now run the task to see our changes: .. code-block:: bash + python3 openfpga_flow/scripts/run_fpga_task.py fpga_verilog/adder/hard_adder --debug --show_thread_logs We can view the global ports in ``fpga_top.v`` by running the following command: .. code-block:: bash + emacs openfpga_flow/tasks/fpga_verilog/adder/hard_adder/run064/k6_frac_N10_tileable_adder_chain_40nm/and2/MIN_ROUTE_CHAN_WIDTH/SRC/fpga_top.v The ``fpga_top.v`` should have the following in its module definition: .. code-block:: verilog + module fpga_top(pReset, prog_clk, set, @@ -299,6 +314,7 @@ The ``fpga_top.v`` should have the following in its module definition: We can view the waveform by running GTKWave: .. code-block:: bash + gtkwave openfpga_flow/tasks/fpga_verilog/adder/hard_adder/latest/k6_frac_N10_tileable_adder_chain_40nm/and2/MIN_ROUTE_CHAN_WIDTH/and2_formal.vcd & The waveform should have some changes to its value. An example of what it may look like is displayed in :numref:`fig_spy_adder` @@ -315,4 +331,4 @@ Conclusion In this tutorial, we have shown how to build spypads into OpenFPGA Architectures using XML Syntax. If you have any issues, feel free to `contact`_ us. -.. _contact: https://openfpga.readthedocs.io/en/master/contact/ \ No newline at end of file +.. _contact: https://openfpga.readthedocs.io/en/master/contact/ From f626b17d04bb9661da12ce2a3f8ccbcdef256461 Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:58:19 -0600 Subject: [PATCH 07/32] Update user_defined_temp_tutorial Change "example" in the beginning of the page to "tutorial" for clarity --- .../tutorials/arch_modeling/user_defined_temp_tutorial.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst index 943993aaa..3f12839d4 100644 --- a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst @@ -5,9 +5,9 @@ Introduction and Setup **In this tutorial, we will** - Provide the motivation for generating the user_defined_template.v verilog file - Go through a generated user_defined_template.v file to demonstrate how to use it -Through this example, we will show how and when to use the ``user_defined_template.v`` file. +Through this tutorial, we will show how and when to use the ``user_defined_template.v`` file. -For this example, we are using a modified version of the hard adder task that comes with OpenFPGA. +To begin the tutorial, we start with a modified version of the hard adder task that comes with OpenFPGA. To follow along, go to the root directory of OpenFPGA and enter: .. code-block:: bash From a2c2b634e60673ae8c4f35763aea877c9da3895f Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 12 Apr 2021 14:00:54 -0600 Subject: [PATCH 08/32] Update link for _user_defined_template.v This ensures it goes to the correct page after pull request 274 no longer works --- .../tutorials/arch_modeling/user_defined_temp_tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst index 3f12839d4..cbc161971 100644 --- a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst @@ -167,4 +167,4 @@ Finally, rerun this command from the OpenFPGA root directory to ensure it is wor python3 openfpga_flow/scripts_run_fpga_task.py fpga_verilog/adder/hard_adder --debug --show_thread_logs -.. _user_defined_template.v: https://openfpga--274.org.readthedocs.build/en/274/manual/fpga_verilog/fabric_netlist/#cmdoption-arg-user_defined_templates.v +.. _user_defined_template.v: https://openfpga.readthedocs.io/en/master/manual/fpga_verilog/fabric_netlist/#cmdoption-arg-user_defined_templates.v From b176ca6c0c67f3d791b7df2145aee75e31d3412a Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 12 Apr 2021 14:13:41 -0600 Subject: [PATCH 09/32] Update to improve readability --- .../arch_modeling/open_cell_libraries_tutorial.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst b/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst index e7d232ca3..d3e7e37d5 100644 --- a/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst @@ -246,8 +246,11 @@ We continue the circuit model creation process by replacing **LINE67** to **LINE .. note:: The name of the circuit model must be consistent with the standard cell! -The most significant differences from the control in this section are changing the ``name`` and ``prefix`` to match the module name from Skywater's cell library and including a path -to the verilog file using ``verilog_netlist``. The second change to ``k6_frac_N10_adder_chain_40nm_openfpga.xml`` is at **LINE160**, where we will be replacing the line with the following: +The most significant differences from the OpenFPGA Circuit Model in this section are: + - Change the ``name`` and ``prefix`` to match the module name from Skywater's cell library + - Include a path to the verilog file using ``verilog_netlist``. + +The second change to ``k6_frac_N10_adder_chain_40nm_openfpga.xml`` is at **LINE160**, where we will be replacing the line with the following: .. code-block:: xml @@ -288,7 +291,7 @@ Replace all the text within ``iverilog_output.txt`` with the following: iverilog -o compiled_and2 ./SRC/and2_include_netlists.v -s and2_top_formal_verification_random_tb -I ${OPENFPGA_PATH}/skywater-pdk/libraries/sky130_fd_sc_ls/latest/cells/or2 -We can now manually rerun IVerilog, a tutorial on manually running IVerilog can be found at our From Verilog to `Verification`_ tutorial. From the root +We can now manually rerun IVerilog, a tutorial on manually running IVerilog can be found at our :ref:`verilog2verification` tutorial. From the root directory, run the following commands: .. code-block:: bash From 198882da8962076ee5bcafec378da5da5917457d Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 12 Apr 2021 14:20:40 -0600 Subject: [PATCH 10/32] Update link to From Verilog to Verification --- .../tutorials/arch_modeling/open_cell_libraries_tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst b/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst index d3e7e37d5..86e8ccaf2 100644 --- a/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst @@ -291,7 +291,7 @@ Replace all the text within ``iverilog_output.txt`` with the following: iverilog -o compiled_and2 ./SRC/and2_include_netlists.v -s and2_top_formal_verification_random_tb -I ${OPENFPGA_PATH}/skywater-pdk/libraries/sky130_fd_sc_ls/latest/cells/or2 -We can now manually rerun IVerilog, a tutorial on manually running IVerilog can be found at our :ref:`verilog2verification` tutorial. From the root +We can now manually rerun IVerilog, a tutorial on manually running IVerilog can be found at our `From Verilog to Verification `_ tutorial. From the root directory, run the following commands: .. code-block:: bash From 90df365259fecb7c7f421022bcd69cacc0ea499e Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 12 Apr 2021 14:21:53 -0600 Subject: [PATCH 11/32] Fix a spacing issue on line 250 --- docs/source/tutorials/arch_modeling/Spypads_tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/tutorials/arch_modeling/Spypads_tutorial.rst b/docs/source/tutorials/arch_modeling/Spypads_tutorial.rst index 4b426e20c..26fbb58e2 100644 --- a/docs/source/tutorials/arch_modeling/Spypads_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/Spypads_tutorial.rst @@ -247,7 +247,7 @@ The waveforms will appear similar to :numref:`fig_spypad_waves` Building Spypads ~~~~~~~~~~~~~~~~ -We will modify the``k6_frac_N10_adder_chain_40nm_openfpga.xml`` file found in OpenFPGA to expose the **sumout** output from the **ADDF** module. We can start modifying +We will modify the ``k6_frac_N10_adder_chain_40nm_openfpga.xml`` file found in OpenFPGA to expose the **sumout** output from the **ADDF** module. We can start modifying the file by running the following command: .. code-block:: bash From 1744ce594eef5890131a35f2bcabaa20fcbf57e1 Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 12 Apr 2021 16:06:44 -0600 Subject: [PATCH 12/32] Rename Spypads_tutorial.rst to spypads_tutorial.rst --- .../arch_modeling/{Spypads_tutorial.rst => spypads_tutorial.rst} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/source/tutorials/arch_modeling/{Spypads_tutorial.rst => spypads_tutorial.rst} (100%) diff --git a/docs/source/tutorials/arch_modeling/Spypads_tutorial.rst b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst similarity index 100% rename from docs/source/tutorials/arch_modeling/Spypads_tutorial.rst rename to docs/source/tutorials/arch_modeling/spypads_tutorial.rst From bad49cdb75c6ff27ed6acaeb486b295c41ac6955 Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 12 Apr 2021 16:07:38 -0600 Subject: [PATCH 13/32] Update to change Spypads to spypads --- docs/source/tutorials/arch_modeling/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/tutorials/arch_modeling/index.rst b/docs/source/tutorials/arch_modeling/index.rst index b6c27e69e..3649516bb 100644 --- a/docs/source/tutorials/arch_modeling/index.rst +++ b/docs/source/tutorials/arch_modeling/index.rst @@ -10,4 +10,4 @@ Architecture Modeling quick_start user_defined_temp_tutorial open_cell_libraries_tutorial - Spypads_tutorial + spypads_tutorial From 64e8e623a54b6e3a8a69ebe7dd40bd10c3c40b04 Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 12 Apr 2021 16:14:00 -0600 Subject: [PATCH 14/32] Update to fix links to proper syntax --- .../arch_modeling/open_cell_libraries_tutorial.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst b/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst index 86e8ccaf2..2255c22f0 100644 --- a/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/open_cell_libraries_tutorial.rst @@ -291,7 +291,7 @@ Replace all the text within ``iverilog_output.txt`` with the following: iverilog -o compiled_and2 ./SRC/and2_include_netlists.v -s and2_top_formal_verification_random_tb -I ${OPENFPGA_PATH}/skywater-pdk/libraries/sky130_fd_sc_ls/latest/cells/or2 -We can now manually rerun IVerilog, a tutorial on manually running IVerilog can be found at our `From Verilog to Verification `_ tutorial. From the root +We can now manually rerun IVerilog, a tutorial on manually running IVerilog can be found at our :ref:`from_verilog_to_verification` tutorial. From the root directory, run the following commands: .. code-block:: bash @@ -474,12 +474,12 @@ The simulation waveforms should look similar to the following :numref:`fig_custo Simulation Waveforms with Skywater PDK Circuit Model -We have now verified that the Skywater PDK Cell Library has been instantiated and bound to the OpenFPGA architecture file. If you have any problems, please `contact`_ us. +We have now verified that the Skywater PDK Cell Library has been instantiated and bound to the OpenFPGA architecture file. If you have any problems, please :ref:`contact` us. + -.. _Verification: https://openfpga.readthedocs.io/en/master/tutorials/design_flow/verilog2verification/ .. _PDK: https://github.com/google/skywater-pdk .. _GTKWave: https://github.com/gtkwave/gtkwave -.. _contact: https://openfpga.readthedocs.io/en/master/contact/ + From a0b01dccc7891a72bab3288f3e9e9b87965107ed Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 12 Apr 2021 17:02:56 -0600 Subject: [PATCH 15/32] Update spypads_tutorial.rst to address comments Add links to github OpenFPGA architecture files, reference fig_gpout_ports, instead of emphasize lines switch to numbering the important lines --- .../arch_modeling/spypads_tutorial.rst | 26 ++++++------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst index 26fbb58e2..48ab5f4b6 100644 --- a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst @@ -21,21 +21,14 @@ To create a spypad, the ``port type`` needs to be set to **output** and ``is_glo -When the port is syntactically correct, the outputs are independently wired from different instances to separated FPGA outputs and would physically look like :numref:`fig_gpout`: +When the port is syntactically correct, the outputs are independently wired from different instances to separated FPGA outputs and would physically look like :ref:`fig_gpout_ports` -.. _fig_gpout: -.. figure:: ./figures/gpout_ports.png - :scale: 100% - - Diagram for General Purpose Output - -.. note:: The general-purpose outputs are not applicable to routing multiplexer outputs Pre-Built Spypads ~~~~~~~~~~~~~~~~~ -An OpenFPGA architecture file that contains spypads and has a task that references it is the ``k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml`` +An OpenFPGA architecture file that contains spypads and has a task that references it is the `k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml `_ file. We can view ``k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml`` by entering the following command at the root directory of OpenFPGA: .. code-block:: bash @@ -45,7 +38,6 @@ file. We can view ``k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_op The spypads are defined from **LINE181** to **LINE183** and belong to the ``frac_lut6_spypad`` ``circuit_model`` that begins at **LINE172** .. code-block:: xml - :emphasize-lines: 10, 11, 12 @@ -56,9 +48,9 @@ The spypads are defined from **LINE181** to **LINE183** and belong to the ``frac - - - + LINE181 + LINE182 + LINE183 @@ -217,7 +209,7 @@ If we look at the module definition and ports of ``fpga_top.v`` we should see th //----- OUTPUT PORTS ----- output [0:0] ccff_tail; -Using :numref:`fig_gpout` as a guide, we can relate our task like :numref:`fig_gpout_example` +Using :ref:`fig_gpout_ports` as a guide, we can relate our task like :numref:`fig_gpout_example` .. _fig_gpout: @@ -247,7 +239,7 @@ The waveforms will appear similar to :numref:`fig_spypad_waves` Building Spypads ~~~~~~~~~~~~~~~~ -We will modify the ``k6_frac_N10_adder_chain_40nm_openfpga.xml`` file found in OpenFPGA to expose the **sumout** output from the **ADDF** module. We can start modifying +We will modify the `k6_frac_N10_adder_chain_40nm_openfpga.xml `_ file found in OpenFPGA to expose the **sumout** output from the **ADDF** module. We can start modifying the file by running the following command: .. code-block:: bash @@ -329,6 +321,4 @@ The waveform should have some changes to its value. An example of what it may lo Conclusion ~~~~~~~~~~ -In this tutorial, we have shown how to build spypads into OpenFPGA Architectures using XML Syntax. If you have any issues, feel free to `contact`_ us. - -.. _contact: https://openfpga.readthedocs.io/en/master/contact/ +In this tutorial, we have shown how to build spypads into OpenFPGA Architectures using XML Syntax. If you have any issues, feel free to :ref:`contact` us. From bb5cd1de47b6d101e46877900f53145317a455e6 Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 12 Apr 2021 17:09:16 -0600 Subject: [PATCH 16/32] Update to fix :numref: error example figure --- docs/source/tutorials/arch_modeling/spypads_tutorial.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst index 48ab5f4b6..1cbbeafe4 100644 --- a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst @@ -211,7 +211,7 @@ If we look at the module definition and ports of ``fpga_top.v`` we should see th Using :ref:`fig_gpout_ports` as a guide, we can relate our task like :numref:`fig_gpout_example` -.. _fig_gpout: +.. _fig_gpout_example: .. figure:: ./figures/gpout_ports_example.png :scale: 100% @@ -225,7 +225,7 @@ We can view testbench waveforms with GTKWave by running the following command fr gtkwave openfpga_flow/tasks/fpga_verilog/spypad/latest/k6_frac_N10_tileable_adder_register_scan_chain_depop50_spypad_40nm/and2/MIN_ROUTE_CHAN_WIDTH/and2_formal.vcd & -.. note::Information on GTKWave can be found on our documentation page located here: :ref:`verilog2verification` +.. note:: Information on GTKWave can be found on our documentation page located here: :ref:`from_verilog_to_verification` The waveforms will appear similar to :numref:`fig_spypad_waves` From 0606479bf8310c1ee360057d0279dec00c18c029 Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 12 Apr 2021 17:53:31 -0600 Subject: [PATCH 17/32] Edit figures to better fit page --- .../figures/gpout_ports_example.png | Bin 19860 -> 19825 bytes .../figures/spyadder_waveform.png | Bin 13439 -> 11849 bytes .../figures/spypad_waveforms.png | Bin 24078 -> 21301 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/figures/gpout_ports_example.png b/docs/source/tutorials/arch_modeling/figures/gpout_ports_example.png index a862d336545a6d2822cdffbd22a6287673929196..c74dad3b4a61c2575b4228d7f5671f1d3b6fddc1 100644 GIT binary patch literal 19825 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 literal 19860 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 diff --git a/docs/source/tutorials/arch_modeling/figures/spyadder_waveform.png b/docs/source/tutorials/arch_modeling/figures/spyadder_waveform.png index 54e34a0017aca99e753ae12fdfae1b6b92b48285..d1fcda277d6fed2f8f677c620e145f537dd085a7 100644 GIT binary patch literal 11849 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 diff --git a/docs/source/tutorials/arch_modeling/figures/spypad_waveforms.png b/docs/source/tutorials/arch_modeling/figures/spypad_waveforms.png index 4ea110f599f9cf9f40dc908f6fbaa21f0febf7b2..948473e2c7af48fef1cc9801247a984cdb833d9a 100644 GIT binary patch literal 21301 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 literal 24078 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 z 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 Date: Mon, 12 Apr 2021 18:10:36 -0600 Subject: [PATCH 18/32] Provide more explanation in Pre-Built Spypads --- docs/source/tutorials/arch_modeling/spypads_tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst index 1cbbeafe4..16b5d81c7 100644 --- a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst @@ -35,7 +35,7 @@ file. We can view ``k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_op emacs openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml -The spypads are defined from **LINE181** to **LINE183** and belong to the ``frac_lut6_spypad`` ``circuit_model`` that begins at **LINE172** +In this architecture file, the output ports of a 6-input Look Up Table (LUT) are defined as spypads using the XML syntax ``is_global`` and ``is_io``. As a result, all of the outputs from the 6-input LUT will be visible in the top-level module. The output ports to the 6-input LUT are declared from **LINE181** to **LINE183** and belong to the ``frac_lut6_spypad`` ``circuit_model`` that begins at **LINE172**. .. code-block:: xml From eff784e77b1fc1e4c9eb73ff167bef161d7a8d7b Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Tue, 13 Apr 2021 15:53:51 -0600 Subject: [PATCH 19/32] Upload new figures for spypad tutorial --- .../tutorials/arch_modeling/figures/ADDF_Example_Spypad.svg | 1 + .../tutorials/arch_modeling/figures/lut6_Example_Spypad.svg | 1 + 2 files changed, 2 insertions(+) create mode 100644 docs/source/tutorials/arch_modeling/figures/ADDF_Example_Spypad.svg create mode 100644 docs/source/tutorials/arch_modeling/figures/lut6_Example_Spypad.svg diff --git a/docs/source/tutorials/arch_modeling/figures/ADDF_Example_Spypad.svg b/docs/source/tutorials/arch_modeling/figures/ADDF_Example_Spypad.svg new file mode 100644 index 000000000..93f9801ac --- /dev/null +++ b/docs/source/tutorials/arch_modeling/figures/ADDF_Example_Spypad.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/source/tutorials/arch_modeling/figures/lut6_Example_Spypad.svg b/docs/source/tutorials/arch_modeling/figures/lut6_Example_Spypad.svg new file mode 100644 index 000000000..1f2e8da11 --- /dev/null +++ b/docs/source/tutorials/arch_modeling/figures/lut6_Example_Spypad.svg @@ -0,0 +1 @@ + \ No newline at end of file From 423d814730adcba59c1b1c34692e61d83ebd4f84 Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Tue, 13 Apr 2021 16:04:20 -0600 Subject: [PATCH 20/32] Update to include new figures --- .../tutorials/arch_modeling/spypads_tutorial.rst | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst index 16b5d81c7..8683054ab 100644 --- a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst @@ -213,10 +213,10 @@ Using :ref:`fig_gpout_ports` as a guide, we can relate our task like :numref:`fi .. _fig_gpout_example: -.. figure:: ./figures/gpout_ports_example.png +.. figure:: ./figures/lut6_Example_Spypad.svg :scale: 100% - Diagram for ``lut6_out`` + Diagram for ``frac_lut6_spypad`` We can view testbench waveforms with GTKWave by running the following command from the root directory: @@ -302,6 +302,15 @@ The ``fpga_top.v`` should have the following in its module definition: input [0:0] clk; //----- GPOUT PORTS ----- output [0:19] gfpga_pad_ADDF_sumout; + +The architecture will now look like :numref:`fig_addf_example` + +.. _fig_addf_example: + +.. figure:: ./figures/ADDF_Example_Spypad.svg + :scale: 100% + + Diagram for ``ADDF`` We can view the waveform by running GTKWave: From 221822f0f02db199eb3594a835f25c39dc154f10 Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Fri, 16 Apr 2021 11:33:01 -0600 Subject: [PATCH 21/32] update figures to correctly display out ports --- .../tutorials/arch_modeling/figures/ADDF_Example_Spypad.svg | 2 +- .../tutorials/arch_modeling/figures/lut6_Example_Spypad.svg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/figures/ADDF_Example_Spypad.svg b/docs/source/tutorials/arch_modeling/figures/ADDF_Example_Spypad.svg index 93f9801ac..4d5affee6 100644 --- a/docs/source/tutorials/arch_modeling/figures/ADDF_Example_Spypad.svg +++ b/docs/source/tutorials/arch_modeling/figures/ADDF_Example_Spypad.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/source/tutorials/arch_modeling/figures/lut6_Example_Spypad.svg b/docs/source/tutorials/arch_modeling/figures/lut6_Example_Spypad.svg index 1f2e8da11..a82cd267b 100644 --- a/docs/source/tutorials/arch_modeling/figures/lut6_Example_Spypad.svg +++ b/docs/source/tutorials/arch_modeling/figures/lut6_Example_Spypad.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 410c6a12ff4b11b0af4c404c511cdcb5a3c06b4a Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Fri, 16 Apr 2021 11:46:12 -0600 Subject: [PATCH 22/32] Update figures to be more accurate and clean --- .../tutorials/arch_modeling/spypads_tutorial.rst | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst index 8683054ab..973a41f9f 100644 --- a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst @@ -72,7 +72,6 @@ The file will look like this when finished: .. code-block:: python :linenos: - :emphasize-lines: 44 # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = # Configuration file for running experiments @@ -117,7 +116,7 @@ The file will look like this when finished: [SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] end_flow_with_test= - #vpr_fpga_verilog_formal_verification_top_netlist= + #LINE44 vpr_fpga_verilog_formal_verification_top_netlist= Our OpenFPGA task will now run the full testbench. We run the task with the following command from the root directory of OpenFPGA: @@ -216,7 +215,7 @@ Using :ref:`fig_gpout_ports` as a guide, we can relate our task like :numref:`fi .. figure:: ./figures/lut6_Example_Spypad.svg :scale: 100% - Diagram for ``frac_lut6_spypad`` + An illustrative example of the ``lut6`` spypad sourced from inside a logic element. We can view testbench waveforms with GTKWave by running the following command from the root directory: @@ -232,9 +231,9 @@ The waveforms will appear similar to :numref:`fig_spypad_waves` .. _fig_spypad_waves: .. figure:: ./figures/spypad_waveforms.png - :scale: 100% + :width: 75% - Spypad Waveforms + Waveforms of ``frac_lut6`` Spypads Building Spypads ~~~~~~~~~~~~~~~~ @@ -310,7 +309,7 @@ The architecture will now look like :numref:`fig_addf_example` .. figure:: ./figures/ADDF_Example_Spypad.svg :scale: 100% - Diagram for ``ADDF`` + An illustrative example of the sumout spypad sourced from an adder inside a logic element. There are 10 logic elements in a CLB, and we are looking at the 1st logic element. We can view the waveform by running GTKWave: @@ -325,7 +324,7 @@ The waveform should have some changes to its value. An example of what it may lo .. figure:: ./figures/spyadder_waveform.png :scale: 100% - Sumout Waveform + Waveforms of ``sumout`` Spypad Conclusion ~~~~~~~~~~ From beed1ce31e40540d42775a709bcab371a1bbeb44 Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 19 Apr 2021 08:38:09 -0600 Subject: [PATCH 23/32] replace hyperlink with more stable :ref: link --- .../tutorials/arch_modeling/user_defined_temp_tutorial.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst index cbc161971..6e55bbddf 100644 --- a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst @@ -5,7 +5,7 @@ Introduction and Setup **In this tutorial, we will** - Provide the motivation for generating the user_defined_template.v verilog file - Go through a generated user_defined_template.v file to demonstrate how to use it -Through this tutorial, we will show how and when to use the ``user_defined_template.v`` file. +Through this tutorial, we will show how and when to use the :ref:`cmdoption-arg-user_defined_templates.v` file. To begin the tutorial, we start with a modified version of the hard adder task that comes with OpenFPGA. To follow along, go to the root directory of OpenFPGA and enter: @@ -85,7 +85,7 @@ The task should now complete without any errors. Fixing the Error with user_defined_template.v ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The `user_defined_template.v`_ file can be found starting from the root directory and entering: +The :ref:`cmdoption-arg-user_defined_templates.v` file can be found starting from the root directory and entering: .. code-block:: bash @@ -167,4 +167,3 @@ Finally, rerun this command from the OpenFPGA root directory to ensure it is wor python3 openfpga_flow/scripts_run_fpga_task.py fpga_verilog/adder/hard_adder --debug --show_thread_logs -.. _user_defined_template.v: https://openfpga.readthedocs.io/en/master/manual/fpga_verilog/fabric_netlist/#cmdoption-arg-user_defined_templates.v From 291638ee0f05f14bf074ddb69759eb2397114cea Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 19 Apr 2021 08:45:02 -0600 Subject: [PATCH 24/32] Trying to resolve hyperlink to right location --- .../tutorials/arch_modeling/user_defined_temp_tutorial.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst index 6e55bbddf..67e7fd9d2 100644 --- a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst @@ -5,7 +5,7 @@ Introduction and Setup **In this tutorial, we will** - Provide the motivation for generating the user_defined_template.v verilog file - Go through a generated user_defined_template.v file to demonstrate how to use it -Through this tutorial, we will show how and when to use the :ref:`cmdoption-arg-user_defined_templates.v` file. +Through this tutorial, we will show how and when to use the :ref:`user_defined_templates.v` file. To begin the tutorial, we start with a modified version of the hard adder task that comes with OpenFPGA. To follow along, go to the root directory of OpenFPGA and enter: @@ -85,7 +85,7 @@ The task should now complete without any errors. Fixing the Error with user_defined_template.v ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The :ref:`cmdoption-arg-user_defined_templates.v` file can be found starting from the root directory and entering: +The :ref:`user_defined_templates.v` file can be found starting from the root directory and entering: .. code-block:: bash From 5010fb1e7ffdcd74fb934a36b7ad4c59ed2d9cba Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 19 Apr 2021 08:52:05 -0600 Subject: [PATCH 25/32] Update hyperlinks --- .../tutorials/arch_modeling/user_defined_temp_tutorial.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst index 67e7fd9d2..6e55bbddf 100644 --- a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst @@ -5,7 +5,7 @@ Introduction and Setup **In this tutorial, we will** - Provide the motivation for generating the user_defined_template.v verilog file - Go through a generated user_defined_template.v file to demonstrate how to use it -Through this tutorial, we will show how and when to use the :ref:`user_defined_templates.v` file. +Through this tutorial, we will show how and when to use the :ref:`cmdoption-arg-user_defined_templates.v` file. To begin the tutorial, we start with a modified version of the hard adder task that comes with OpenFPGA. To follow along, go to the root directory of OpenFPGA and enter: @@ -85,7 +85,7 @@ The task should now complete without any errors. Fixing the Error with user_defined_template.v ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The :ref:`user_defined_templates.v` file can be found starting from the root directory and entering: +The :ref:`cmdoption-arg-user_defined_templates.v` file can be found starting from the root directory and entering: .. code-block:: bash From fcb7ee3283e1c9238a80e34c39107a3d6710a1ce Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 19 Apr 2021 09:05:30 -0600 Subject: [PATCH 26/32] Update to properly reference fabric netlist page --- .../tutorials/arch_modeling/user_defined_temp_tutorial.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst index 6e55bbddf..f94b9e22c 100644 --- a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst @@ -5,7 +5,7 @@ Introduction and Setup **In this tutorial, we will** - Provide the motivation for generating the user_defined_template.v verilog file - Go through a generated user_defined_template.v file to demonstrate how to use it -Through this tutorial, we will show how and when to use the :ref:`cmdoption-arg-user_defined_templates.v` file. +Through this tutorial, we will show how and when to use the :ref:`user_defined_templates.v ` file. To begin the tutorial, we start with a modified version of the hard adder task that comes with OpenFPGA. To follow along, go to the root directory of OpenFPGA and enter: @@ -85,7 +85,7 @@ The task should now complete without any errors. Fixing the Error with user_defined_template.v ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The :ref:`cmdoption-arg-user_defined_templates.v` file can be found starting from the root directory and entering: +The :ref:`user_defined_templates.v ` file can be found starting from the root directory and entering: .. code-block:: bash From f8810940c35d4597f05c5a75c64b9fe513fd818a Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 19 Apr 2021 09:10:17 -0600 Subject: [PATCH 27/32] Update links --- .../tutorials/arch_modeling/user_defined_temp_tutorial.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst index f94b9e22c..f0ea3fa4e 100644 --- a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst @@ -5,7 +5,7 @@ Introduction and Setup **In this tutorial, we will** - Provide the motivation for generating the user_defined_template.v verilog file - Go through a generated user_defined_template.v file to demonstrate how to use it -Through this tutorial, we will show how and when to use the :ref:`user_defined_templates.v ` file. +Through this tutorial, we will show how and when to use the :ref:`user_defined_templates.v ` file. To begin the tutorial, we start with a modified version of the hard adder task that comes with OpenFPGA. To follow along, go to the root directory of OpenFPGA and enter: @@ -85,7 +85,7 @@ The task should now complete without any errors. Fixing the Error with user_defined_template.v ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The :ref:`user_defined_templates.v ` file can be found starting from the root directory and entering: +The :ref:`user_defined_templates.v ` file can be found starting from the root directory and entering: .. code-block:: bash From cd6beb57898adec6fa402cbb8dfc88a42f6f3630 Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 19 Apr 2021 09:14:47 -0600 Subject: [PATCH 28/32] Add one more link to fabric_netlists --- .../tutorials/arch_modeling/user_defined_temp_tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst index f0ea3fa4e..a1b59d27e 100644 --- a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst @@ -74,7 +74,7 @@ This error can be resolved by replacing the **LINE187** of ``k6_frac_N10_adder_c -The above line provides a path to generate the ``user_defined_template.v`` file. +The above line provides a path to generate the :ref:`user_defined_templates.v ` file. Now we can return to the root directory and run this command again: .. code-block:: bash From 86c856d35a25cb55045e52a4117dd4988d53d295 Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 19 Apr 2021 09:25:54 -0600 Subject: [PATCH 29/32] Fix reference links --- .../tutorials/arch_modeling/user_defined_temp_tutorial.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst index a1b59d27e..ea874f15f 100644 --- a/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/user_defined_temp_tutorial.rst @@ -5,7 +5,7 @@ Introduction and Setup **In this tutorial, we will** - Provide the motivation for generating the user_defined_template.v verilog file - Go through a generated user_defined_template.v file to demonstrate how to use it -Through this tutorial, we will show how and when to use the :ref:`user_defined_templates.v ` file. +Through this tutorial, we will show how and when to use the :ref:`user_defined_template.v ` file. To begin the tutorial, we start with a modified version of the hard adder task that comes with OpenFPGA. To follow along, go to the root directory of OpenFPGA and enter: @@ -74,7 +74,7 @@ This error can be resolved by replacing the **LINE187** of ``k6_frac_N10_adder_c -The above line provides a path to generate the :ref:`user_defined_templates.v ` file. +The above line provides a path to generate the :ref:`user_defined_template.v ` file. Now we can return to the root directory and run this command again: .. code-block:: bash @@ -85,7 +85,7 @@ The task should now complete without any errors. Fixing the Error with user_defined_template.v ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The :ref:`user_defined_templates.v ` file can be found starting from the root directory and entering: +The :ref:`user_defined_template.v ` file can be found starting from the root directory and entering: .. code-block:: bash From 8431337f3980f34fa8982b7bb3de9d284e55d77b Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 19 Apr 2021 09:36:13 -0600 Subject: [PATCH 30/32] Fix grammar errors in fig captions and elsewhere --- .../tutorials/arch_modeling/spypads_tutorial.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst index 973a41f9f..b809a3b23 100644 --- a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst @@ -10,7 +10,7 @@ Introduction - Modify an existing architecture to incorporate Spypads - Verify correctness through GTKWave -Through this tutorial, we will show how to create Spypads in OpenFPGA. +Through this tutorial, we will show how to create spypads in OpenFPGA. Spypads are physical output pins on a FPGA chip through which you can read out internal signals when doing silicon-level debugging. The XML syntax for spypads and other global signals can be found on our :ref:`circuit_library` documentation page. @@ -35,7 +35,7 @@ file. We can view ``k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_op emacs openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml -In this architecture file, the output ports of a 6-input Look Up Table (LUT) are defined as spypads using the XML syntax ``is_global`` and ``is_io``. As a result, all of the outputs from the 6-input LUT will be visible in the top-level module. The output ports to the 6-input LUT are declared from **LINE181** to **LINE183** and belong to the ``frac_lut6_spypad`` ``circuit_model`` that begins at **LINE172**. +In this architecture file, the output ports of a 6-input lookup table (LUT) are defined as spypads using the XML syntax ``is_global`` and ``is_io``. As a result, all of the outputs from the 6-input LUT will be visible in the top-level module. The output ports to the 6-input LUT are declared from **LINE181** to **LINE183** and belong to the ``frac_lut6_spypad`` ``circuit_model`` that begins at **LINE172**. .. code-block:: xml @@ -116,7 +116,7 @@ The file will look like this when finished: [SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] end_flow_with_test= - #LINE44 vpr_fpga_verilog_formal_verification_top_netlist= + #vpr_fpga_verilog_formal_verification_top_netlist= Our OpenFPGA task will now run the full testbench. We run the task with the following command from the root directory of OpenFPGA: @@ -231,9 +231,9 @@ The waveforms will appear similar to :numref:`fig_spypad_waves` .. _fig_spypad_waves: .. figure:: ./figures/spypad_waveforms.png - :width: 75% + :width: 100% - Waveforms of ``frac_lut6`` Spypads + Waveforms of ``frac_lut6`` spypads Building Spypads ~~~~~~~~~~~~~~~~ @@ -322,9 +322,9 @@ The waveform should have some changes to its value. An example of what it may lo .. _fig_spy_adder: .. figure:: ./figures/spyadder_waveform.png - :scale: 100% + :width: 100% - Waveforms of ``sumout`` Spypad + Waveforms of ``sumout`` spypad Conclusion ~~~~~~~~~~ From bc6e9746c2c8e659cae6e8a540a18a741cc06232 Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 19 Apr 2021 09:48:42 -0600 Subject: [PATCH 31/32] Fix more grammar mistakes --- docs/source/tutorials/arch_modeling/spypads_tutorial.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst index b809a3b23..dc82673b0 100644 --- a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst @@ -5,9 +5,9 @@ Introduction ~~~~~~~~~~~~ **In this tutorial, we will** - - Show the XML Syntax for Global Outputs - - Showcase an example with Spypads - - Modify an existing architecture to incorporate Spypads + - Show the XML syntax for global outputs + - Showcase an example with spypads + - Modify an existing architecture to incorporate spypads - Verify correctness through GTKWave Through this tutorial, we will show how to create spypads in OpenFPGA. From 986ea492f6ca463c7a64724dd266a92174d7d9a4 Mon Sep 17 00:00:00 2001 From: bbleaptrot <35536624+bbleaptrot@users.noreply.github.com> Date: Mon, 19 Apr 2021 14:16:40 -0600 Subject: [PATCH 32/32] Fix grammar line 38: lookup table ->Look-Up Table --- docs/source/tutorials/arch_modeling/spypads_tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst index dc82673b0..5ffd5ddae 100644 --- a/docs/source/tutorials/arch_modeling/spypads_tutorial.rst +++ b/docs/source/tutorials/arch_modeling/spypads_tutorial.rst @@ -35,7 +35,7 @@ file. We can view ``k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_op emacs openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml -In this architecture file, the output ports of a 6-input lookup table (LUT) are defined as spypads using the XML syntax ``is_global`` and ``is_io``. As a result, all of the outputs from the 6-input LUT will be visible in the top-level module. The output ports to the 6-input LUT are declared from **LINE181** to **LINE183** and belong to the ``frac_lut6_spypad`` ``circuit_model`` that begins at **LINE172**. +In this architecture file, the output ports of a 6-input Look-Up Table (LUT) are defined as spypads using the XML syntax ``is_global`` and ``is_io``. As a result, all of the outputs from the 6-input LUT will be visible in the top-level module. The output ports to the 6-input LUT are declared from **LINE181** to **LINE183** and belong to the ``frac_lut6_spypad`` ``circuit_model`` that begins at **LINE172**. .. code-block:: xml