From a102e12540b1e18956b74d17f803fdcc7deb404c Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Wed, 13 May 2026 10:28:15 +0200 Subject: [PATCH 1/4] Pipeline improvements. --- .github/workflows/Pipeline.yml | 15 +++++++++++++-- .github/workflows/Simulate.yml | 28 ++++++++++++++-------------- .sigasi/project.sigasi | 9 ++++++--- docs/conf.py | 8 ++------ tools/OSVVM/poc.tcl | 1 + 5 files changed, 36 insertions(+), 25 deletions(-) diff --git a/.github/workflows/Pipeline.yml b/.github/workflows/Pipeline.yml index a541634c2..1e9f56f6f 100644 --- a/.github/workflows/Pipeline.yml +++ b/.github/workflows/Pipeline.yml @@ -59,7 +59,7 @@ jobs: # if: success() || failure() steps: - name: 🗑️ Delete YAML artifacts from matrix jobs - uses: geekyeggo/delete-artifact@v5 + uses: geekyeggo/delete-artifact@v6 continue-on-error: true with: name: | @@ -67,13 +67,23 @@ jobs: PoC-Report-YAML-* - name: 🗑️ Delete JUnit XML artifacts from matrix jobs - uses: geekyeggo/delete-artifact@v5 + uses: geekyeggo/delete-artifact@v6 continue-on-error: true with: name: | OSVVM-Report-XML-* PoC-Report-XML-* +# IntermediateCleanUp: +# uses: pyTooling/Actions/.github/workflows/CleanupArtifacts.yml@r7 +# needs: +# - PublishCoverageResults +# - PublishPytestResults +# with: +# others: | +# pyGHDL-Coverage-SQLite-* +# pyGHDL-Unittest-XML-* + Documentation: uses: pyTooling/Actions/.github/workflows/SphinxDocumentation.yml@r7 needs: @@ -137,6 +147,7 @@ jobs: Release: uses: pyTooling/Actions/.github/workflows/PublishReleaseNotes.yml@r7 needs: + - Prepare - PublishToGitHubPages if: needs.Prepare.outputs.is_release_tag == 'true' permissions: diff --git a/.github/workflows/Simulate.yml b/.github/workflows/Simulate.yml index b3431f750..575f3b330 100644 --- a/.github/workflows/Simulate.yml +++ b/.github/workflows/Simulate.yml @@ -151,10 +151,10 @@ jobs: if: inputs.simulator == 'nvc' run: | cd "${{ needs.Parameters.outputs.tempDirectory }}" - nvc --ignore-time --do run.tcl + nvc --do run.tcl - name: 📤 Upload '${{ needs.Parameters.outputs.osvvmReportHTML }}' artifacts - uses: pyTooling/upload-artifact@v4 + uses: pyTooling/upload-artifact@v7 continue-on-error: true with: name: ${{ needs.Parameters.outputs.osvvmReportHTML }} @@ -168,7 +168,7 @@ jobs: retention-days: 1 - name: 📤 Upload '${{ needs.Parameters.outputs.osvvmReportYAML }}' artifacts - uses: pyTooling/upload-artifact@v4 + uses: pyTooling/upload-artifact@v7 continue-on-error: true with: name: ${{ needs.Parameters.outputs.osvvmReportYAML }} @@ -178,7 +178,7 @@ jobs: retention-days: 1 - name: 📤 Upload '${{ needs.Parameters.outputs.osvvmReportXML }}' artifacts - uses: pyTooling/upload-artifact@v4 + uses: pyTooling/upload-artifact@v7 continue-on-error: true with: name: ${{ needs.Parameters.outputs.osvvmReportXML }} @@ -188,7 +188,7 @@ jobs: retention-days: 1 - name: 📤 Upload '${{ needs.Parameters.outputs.osvvmLibraries }}' artifacts - uses: pyTooling/upload-artifact@v4 + uses: pyTooling/upload-artifact@v7 with: name: ${{ needs.Parameters.outputs.osvvmLibraries }} working-directory: '${{ needs.Parameters.outputs.tempDirectory }}' @@ -197,7 +197,7 @@ jobs: retention-days: 1 - name: 📤 Upload '${{ needs.Parameters.outputs.osvvmGenerated }}' artifacts - uses: pyTooling/upload-artifact@v4 + uses: pyTooling/upload-artifact@v7 continue-on-error: true with: name: ${{ needs.Parameters.outputs.osvvmGenerated }} @@ -243,13 +243,13 @@ jobs: mv src/common/my_project.vhdl.template tb/common/my_project.vhdl - name: 📥 Download artifacts '${{ needs.Parameters.outputs.osvvmLibraries }}' from 'Build-OSVVM' job - uses: pyTooling/download-artifact@v4 + uses: pyTooling/download-artifact@v8 with: name: ${{ needs.Parameters.outputs.osvvmLibraries }} path: "${{ needs.Parameters.outputs.tempDirectory }}" - name: 📥 Download artifacts '${{ needs.Parameters.outputs.osvvmGenerated }}' from 'Build-OSVVM' job - uses: pyTooling/download-artifact@v4 + uses: pyTooling/download-artifact@v8 with: name: ${{ needs.Parameters.outputs.osvvmGenerated }} @@ -280,7 +280,7 @@ jobs: if: inputs.simulator == 'nvc' run: | cd "${{ needs.Parameters.outputs.tempDirectory }}" - nvc --ignore-time --do build.tcl + nvc --do build.tcl - name: 📈 Generate simulate.tcl for simulate if: always() @@ -308,10 +308,10 @@ jobs: if: always() && inputs.simulator == 'nvc' run: | cd "${{ needs.Parameters.outputs.tempDirectory }}" - nvc --ignore-time --do simulate.tcl + nvc --do simulate.tcl - name: 📤 Upload '${{ needs.Parameters.outputs.pocReportHTML }}' artifacts - uses: pyTooling/upload-artifact@v4 + uses: pyTooling/upload-artifact@v7 continue-on-error: true with: name: ${{ needs.Parameters.outputs.pocReportHTML }} @@ -330,7 +330,7 @@ jobs: retention-days: 1 - name: 📤 Upload '${{ needs.Parameters.outputs.pocReportYAML }}' artifacts - uses: pyTooling/upload-artifact@v4 + uses: pyTooling/upload-artifact@v7 continue-on-error: true with: name: ${{ needs.Parameters.outputs.pocReportYAML }} @@ -340,7 +340,7 @@ jobs: retention-days: 1 - name: 📤 Upload '${{ needs.Parameters.outputs.pocReportXML }}' artifacts - uses: pyTooling/upload-artifact@v4 + uses: pyTooling/upload-artifact@v7 continue-on-error: true with: name: ${{ needs.Parameters.outputs.pocReportXML }} @@ -350,7 +350,7 @@ jobs: retention-days: 1 # - name: 📤 Upload '${{ needs.Parameters.outputs.pocLibraries }}' artifacts -# uses: pyTooling/upload-artifact@v4 +# uses: pyTooling/upload-artifact@v7 # with: # name: ${{ needs.Parameters.outputs.pocLibraries }} # working-directory: '${{ needs.Parameters.outputs.tempDirectory }}' diff --git a/.sigasi/project.sigasi b/.sigasi/project.sigasi index b88099dbb..ecbf27169 100644 --- a/.sigasi/project.sigasi +++ b/.sigasi/project.sigasi @@ -26,9 +26,12 @@ ], "dependencies": [ { - "Quartus25.3": [ - "altera_mf" - ] + "Quartus": { + "version": "Quartus25.3", + "targets": [ + "altera_mf" + ] + } } ] }, diff --git a/docs/conf.py b/docs/conf.py index cb6db09cc..3a7cd8148 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -4,8 +4,9 @@ from sys import path as sys_path from os.path import abspath from pathlib import Path +from textwrap import dedent -from pyTooling.Packaging import extractVersionInformation +# from pyTooling.Packaging import extractVersionInformation ROOT = Path(__file__).resolve().parent @@ -154,11 +155,6 @@ def _LatestTagName(): f"{project}." ] -# ============================================================================== -# Options for LaTeX / PDF output -# ============================================================================== -from textwrap import dedent - # ============================================================================== # Options for LaTeX / PDF output # ============================================================================== diff --git a/tools/OSVVM/poc.tcl b/tools/OSVVM/poc.tcl index ce0856e79..cba31804e 100644 --- a/tools/OSVVM/poc.tcl +++ b/tools/OSVVM/poc.tcl @@ -94,6 +94,7 @@ namespace eval ::poc { set RivieraSimOptions {-unbounderror} } elseif {$::osvvm::ToolName eq "NVC"} { + append ::osvvm::ExtendedGlobalOptions " --ignore-time" SetExtendedAnalyzeOptions {--relaxed} } elseif {$::osvvm::ToolName eq "Sigasi"} { From b8eed656ddcbc6bcfa3f7bf7a5e1abde90a2605c Mon Sep 17 00:00:00 2001 From: stefanunrein Date: Thu, 18 Jun 2026 17:38:03 +0200 Subject: [PATCH 2/4] AXI4/AXI4-Lite multiplexers and demultiplexers (#42) * * Refactor PoC file names and signal names * Add AXI components * Add more test cases Co-Authored-By: Patrick Lehmann Co-Authored-By: Adrian Weiland Co-Authored-By: Iqbal Asif * * use integer'image instead of to_string because GHDL can not determine overload * disable axi4lite_OCRAM test bench for GHDL because llvm can not handle external names * Apply suggestions from code review Co-authored-by: Patrick Lehmann * Apply suggestions from code review Co-authored-by: Patrick Lehmann * Some more naming fixes. * replace all VLSI-EDA URL's with github.com/VHDL/PoC * cleanup of filenames for missed components * separate file list for ddrio * rename mem files in build.pro * apply suggestions from review * Update docs/IPCores/cache/index.rst Co-authored-by: Patrick Lehmann (cherry picked from commit d543af480864bf984b5d413b9e2dae0b0b830656) # Conflicts: # docs/IPCores/cache/index.rst * renaming * renaming * fix compile order, spelling updated regression tcl for with possibility to run only selected steps, added updated ci yaml with stages * Updated interfaces in _wf (_WriteFirst) OCRAMs. * Removed pyIPCMI configuration files. * Adjusted port names in OCRAM simulation model. * Use new regression.tcl with steps feature. * Apply suggestions from code review Co-authored-by: Patrick Lehmann Apply suggestions from code review 4 Co-authored-by: Patrick Lehmann Apply suggestion from @Paebbels Apply suggestions from code review 3 Co-authored-by: Patrick Lehmann Apply suggestions from code review 2 Co-authored-by: Patrick Lehmann Apply suggestions from code review 1 Co-authored-by: Patrick Lehmann * Changed references to branch 'master' to 'main'. * Apply suggestions from code review 2.1 Co-authored-by: Patrick Lehmann * Fixed ReST table. * Run NVC on older Ubuntu 24.04 images. * Rename BasicProc to ControlProc * cleanup clock and reset name * * remove py folder * remove sim folder with old waveform config files * rename My_config and my_project to project_configuration and local_configuration * process name conflict * add missing files * rename axi4stream testcases * renaming * move arith test benches to correct named folders * apply suggestions * fix restructured text header underlines * fix copyright * fix log2ceil function to work until integer'high fixes VHDL/PoC/issues/41 * Update tb/bus/axi4stream/DeMux/TC_DeMux_e.vhdl (cherry picked from commit 9e614765cf3720a04e96c75c6e6ecff772dc8442) * change myConfig and myProject in tcl scripting * move poc.tcl to tools * fix naming of axi4stream termination modules * pass project root to poc-tcl scripting * remove old config files * remove test code from contributed test-case Co-Authored-By: Markus Leiter --------- Co-authored-by: Patrick Lehmann Co-authored-by: Adrian Weiland Co-authored-by: Iqbal Asif Co-authored-by: Patrick Lehmann --- .github/workflows/Pipeline.yml | 25 +- .github/workflows/Simulate.yml | 70 +- .gitignore | 2 +- .gitlab-ci.yml | 235 +-- .pyIPCMI/Hooks/README.md | 75 - .pyIPCMI/config.boards.ini | 292 ---- .pyIPCMI/config.defaults.ini | 400 ----- .pyIPCMI/config.entity.ini | 1203 -------------- .pyIPCMI/config.structure.ini | 405 ----- PoC.pro | 1 + README.md | 57 +- docs/Entity.template | 4 +- docs/GetInvolved/index.rst | 16 +- docs/IPCores/arith/arith.pkg.rst | 20 +- .../{arith_addw.rst => arith_Adder_Wide.rst} | 18 +- ...chain_inc.rst => arith_CarryChain_inc.rst} | 16 +- .../arith/arith_Convert_Binary2BCD.rst | 38 + ..._counter_bcd.rst => arith_Counter_BCD.rst} | 16 +- ...ounter_free.rst => arith_Counter_Free.rst} | 16 +- docs/IPCores/arith/arith_Counter_Gray.rst | 38 + ...ounter_ring.rst => arith_Counter_Ring.rst} | 16 +- .../{arith_div.rst => arith_Divider.rst} | 18 +- ...{arith_firstone.rst => arith_FirstOne.rst} | 16 +- .../arith/{arith_prng.rst => arith_PRNG.rst} | 16 +- ...th_prefix_and.rst => arith_Prefix_And.rst} | 16 +- ...rith_prefix_or.rst => arith_Prefix_Or.rst} | 16 +- .../arith/{arith_same.rst => arith_Same.rst} | 16 +- .../{arith_scaler.rst => arith_Scaler.rst} | 16 +- ...er_barrel.rst => arith_Shifter_Barrel.rst} | 16 +- docs/IPCores/arith/arith_SquareRoot.rst | 40 + docs/IPCores/arith/arith_bcdcollect.rst | 4 +- docs/IPCores/arith/arith_cca.rst | 2 +- docs/IPCores/arith/arith_convert_bin2bcd.rst | 38 - docs/IPCores/arith/arith_counter_gray.rst | 38 - docs/IPCores/arith/arith_sqrt.rst | 40 - docs/IPCores/arith/index.rst | 64 +- ...I4Lite.rst => axi4_AXI4Lite_Converter.rst} | 40 +- .../{axi4_FIFO_cdc.rst => axi4_FIFO_CDC.rst} | 46 +- docs/IPCores/bus/axi4/index.rst | 8 +- ...ite_FIFO_cdc.rst => axi4lite_FIFO_CDC.rst} | 46 +- .../axi4lite/axi4lite_GitVersionRegister.rst | 8 +- .../axi4lite/axi4lite_HighResolutionClock.rst | 2 +- .../bus/axi4lite/axi4lite_Ocram_Adapter.rst | 50 +- .../bus/axi4lite/axi4lite_Register.rst | 14 +- docs/IPCores/bus/axi4lite/axi4lite_UART.rst | 72 +- docs/IPCores/bus/axi4lite/index.rst | 8 +- .../bus/axi4stream/axi4stream_FIFO.rst | 8 +- ...m_FIFO_cdc.rst => axi4stream_FIFO_CDC.rst} | 54 +- docs/IPCores/bus/axi4stream/index.rst | 12 +- docs/IPCores/bus/bus_Arbiter.rst | 4 +- docs/IPCores/bus/stream/stream.pkg.rst | 2 +- docs/IPCores/bus/stream/stream_DeMux.rst | 4 +- docs/IPCores/bus/stream/stream_FIFO.rst | 4 +- .../bus/stream/stream_FrameGenerator.rst | 4 +- docs/IPCores/bus/stream/stream_Mirror.rst | 4 +- docs/IPCores/bus/stream/stream_Mux.rst | 4 +- docs/IPCores/bus/stream/stream_Sink.rst | 4 +- docs/IPCores/bus/stream/stream_Source.rst | 4 +- docs/IPCores/bus/wb/wb.pkg.rst | 2 +- docs/IPCores/bus/wb/wb_fifo_adapter.rst | 4 +- docs/IPCores/bus/wb/wb_ocram.rst | 4 +- docs/IPCores/bus/wb/wb_uart_wrapper.rst | 8 +- .../cache/{cache_cpu.rst => cache_CPU.rst} | 22 +- .../cache/{cache_mem.rst => cache_Memory.rst} | 24 +- .../{cache_par.rst => cache_Parallel.rst} | 20 +- .../{cache_par2.rst => cache_Parallel2.rst} | 20 +- ...nit_par.rst => cache_TagUnit_Parallel.rst} | 18 +- .../cache/cache_TagUnit_Sequential.rst | 38 + .../cache/cache_replacement_policy.rst | 4 +- docs/IPCores/cache/cache_tagunit_seq.rst | 38 - docs/IPCores/cache/index.rst | 47 +- docs/IPCores/comm/comm.pkg.rst | 2 +- docs/IPCores/comm/comm_crc.rst | 14 +- docs/IPCores/comm/comm_scramble.rst | 14 +- docs/IPCores/comm/index.rst | 4 +- docs/IPCores/comm/remote/index.rst | 2 +- .../comm/remote/remote_TerminalControl.rst | 36 + .../comm/remote/remote_terminal_control.rst | 36 - ...deque.rst => dstruct_DoubleEndedQueue.rst} | 18 +- .../{dstruct_stack.rst => dstruct_Stack.rst} | 14 +- docs/IPCores/dstruct/index.rst | 8 +- docs/IPCores/fifo/fifo.pkg.rst | 2 +- docs/IPCores/fifo/fifo_cc_got.rst | 4 +- docs/IPCores/fifo/fifo_cc_got_tempgot.rst | 4 +- docs/IPCores/fifo/fifo_cc_got_tempput.rst | 4 +- docs/IPCores/fifo/fifo_ic_assembly.rst | 4 +- docs/IPCores/fifo/fifo_ic_got.rst | 4 +- docs/IPCores/fifo/fifo_shift.rst | 14 +- docs/IPCores/fifo/fifo_stage.rst | 10 +- docs/IPCores/fifo/index.rst | 8 +- docs/IPCores/io/ddrio/ddrio.pkg.rst | 2 +- .../io/ddrio/{ddrio_in.rst => ddrio_In.rst} | 16 +- .../{ddrio_inout.rst => ddrio_InOut.rst} | 16 +- .../io/ddrio/{ddrio_out.rst => ddrio_Out.rst} | 16 +- docs/IPCores/io/ddrio/index.rst | 12 +- docs/IPCores/io/iic/iic.pkg.rst | 2 +- docs/IPCores/io/iic/iic_BusController.rst | 4 +- docs/IPCores/io/iic/iic_Controller.rst | 4 +- .../IPCores/io/iic/iic_Controller_SFF8431.rst | 4 +- docs/IPCores/io/iic/iic_Switch_PCA9548A.rst | 4 +- docs/IPCores/io/io.pkg.rst | 2 +- docs/IPCores/io/io_7SegmentMux_BCD.rst | 4 +- docs/IPCores/io/io_7SegmentMux_HEX.rst | 4 +- docs/IPCores/io/io_Debounce.rst | 4 +- docs/IPCores/io/io_FanControl.rst | 4 +- docs/IPCores/io/io_FrequencyCounter.rst | 4 +- docs/IPCores/io/io_GlitchFilter.rst | 4 +- docs/IPCores/io/io_KeyPadScanner.rst | 4 +- docs/IPCores/io/io_PulseWidthModulation.rst | 4 +- docs/IPCores/io/io_TimingCounter.rst | 4 +- docs/IPCores/io/lcd/BCDDigit.rst | 2 +- docs/IPCores/io/lcd/lcd.pkg.rst | 2 +- docs/IPCores/io/lcd/lcd_LCDBuffer.rst | 4 +- docs/IPCores/io/lcd/lcd_LCDBusController.rst | 4 +- .../io/lcd/lcd_LCDController_KS0066U.rst | 4 +- docs/IPCores/io/lcd/lcd_LCDSynchronizer.rst | 4 +- docs/IPCores/io/lcd/lcd_dotmatrix.rst | 4 +- docs/IPCores/io/mdio/mdio_Controller.rst | 4 +- docs/IPCores/io/mdio/mdio_IIC_Adapter.rst | 4 +- docs/IPCores/io/pio/pio_fifo_in.rst | 4 +- docs/IPCores/io/pio/pio_fifo_out.rst | 4 +- docs/IPCores/io/pio/pio_in.rst | 4 +- docs/IPCores/io/pio/pio_out.rst | 4 +- docs/IPCores/io/pmod/pmod.pkg.rst | 2 +- docs/IPCores/io/pmod/pmod_KYPD.rst | 4 +- docs/IPCores/io/pmod/pmod_SSD.rst | 6 +- docs/IPCores/io/pmod/pmod_USBUART.rst | 6 +- docs/IPCores/io/uart/index.rst | 16 +- docs/IPCores/io/uart/uart.pkg.rst | 2 +- .../uart/{uart_bclk.rst => uart_BitClock.rst} | 18 +- docs/IPCores/io/uart/uart_FT245.rst | 38 + .../io/uart/{uart_rx.rst => uart_RX.rst} | 14 +- .../io/uart/{uart_tx.rst => uart_TX.rst} | 14 +- docs/IPCores/io/uart/uart_fifo.rst | 14 +- docs/IPCores/io/uart/uart_ft245.rst | 38 - docs/IPCores/io/vga/vga.pkg.rst | 2 +- docs/IPCores/io/vga/vga_phy.rst | 4 +- docs/IPCores/io/vga/vga_phy_ch7301c.rst | 4 +- docs/IPCores/io/vga/vga_timing.rst | 4 +- docs/IPCores/mem/lut/lut_Sine.rst | 4 +- docs/IPCores/mem/mem.pkg.rst | 2 +- docs/IPCores/mem/ocram/index.rst | 28 +- docs/IPCores/mem/ocram/ocram.pkg.rst | 2 +- ...p.rst => ocram_EnhancedSimpleDualPort.rst} | 23 +- ...ocram_sdp.rst => ocram_SimpleDualPort.rst} | 20 +- ...sdp_wf.rst => ocram_SimpleDualPort_wf.rst} | 18 +- .../{ocram_sp.rst => ocram_SinglePort.rst} | 18 +- .../{ocram_tdp.rst => ocram_TrueDualPort.rst} | 20 +- ...tdp_sim.rst => ocram_TrueDualPort_sim.rst} | 18 +- ...m_tdp_wf.rst => ocram_TrueDualPort_wf.rst} | 20 +- docs/IPCores/mem/ocrom/index.rst | 8 +- docs/IPCores/mem/ocrom/ocrom.pkg.rst | 2 +- .../{ocrom_dp.rst => ocrom_DualPort.rst} | 18 +- docs/IPCores/mem/ocrom/ocrom_SinglePort.rst | 42 + docs/IPCores/mem/ocrom/ocrom_sp.rst | 42 - docs/IPCores/mem/sdram/index.rst | 2 +- docs/IPCores/mem/sdram/sdram_ctrl_de0.rst | 4 +- docs/IPCores/mem/sdram/sdram_ctrl_fsm.rst | 4 +- docs/IPCores/mem/sdram/sdram_ctrl_phy_de0.rst | 4 +- .../mem/sdram/sdram_ctrl_phy_s3esk.rst | 4 +- docs/IPCores/mem/sdram/sdram_ctrl_s3esk.rst | 4 +- docs/IPCores/misc/filter/filter_And.rst | 38 + docs/IPCores/misc/filter/filter_Mean.rst | 38 + docs/IPCores/misc/filter/filter_Or.rst | 38 + docs/IPCores/misc/filter/filter_and.rst | 38 - docs/IPCores/misc/filter/filter_mean.rst | 38 - docs/IPCores/misc/filter/filter_or.rst | 38 - docs/IPCores/misc/filter/index.rst | 12 +- ...earbox_down_cc.rst => gearbox_Down_cc.rst} | 14 +- ...earbox_down_dc.rst => gearbox_Down_dc.rst} | 14 +- .../{gearbox_up_cc.rst => gearbox_Up_cc.rst} | 14 +- .../{gearbox_up_dc.rst => gearbox_Up_dc.rst} | 14 +- docs/IPCores/misc/gearbox/index.rst | 16 +- docs/IPCores/misc/misc.pkg.rst | 2 +- docs/IPCores/misc/misc_BitwidthConverter.rst | 4 +- docs/IPCores/misc/misc_ByteAligner.rst | 4 +- docs/IPCores/misc/misc_Delay.rst | 4 +- .../misc/misc_FrequencyMeasurement.rst | 4 +- docs/IPCores/misc/misc_PulseTrain.rst | 4 +- docs/IPCores/misc/misc_Sequencer.rst | 4 +- docs/IPCores/misc/misc_StrobeGenerator.rst | 4 +- docs/IPCores/misc/misc_StrobeLimiter.rst | 4 +- docs/IPCores/misc/misc_WordAligner.rst | 2 +- docs/IPCores/misc/misc_bit_lz.rst | 4 +- docs/IPCores/misc/stat/stat_Average.rst | 4 +- docs/IPCores/misc/stat/stat_Histogram.rst | 4 +- docs/IPCores/misc/stat/stat_Maximum.rst | 4 +- docs/IPCores/misc/stat/stat_Minimum.rst | 4 +- .../net/arp/arp_BroadCast_Receiver.rst | 4 +- .../net/arp/arp_BroadCast_Requester.rst | 4 +- docs/IPCores/net/arp/arp_Cache.rst | 4 +- docs/IPCores/net/arp/arp_IPPool.rst | 4 +- docs/IPCores/net/arp/arp_Tester.rst | 4 +- docs/IPCores/net/arp/arp_UniCast_Receiver.rst | 4 +- .../IPCores/net/arp/arp_UniCast_Responder.rst | 4 +- docs/IPCores/net/arp/arp_Wrapper.rst | 4 +- docs/IPCores/net/eth/eth_GEMAC_GMII.rst | 4 +- docs/IPCores/net/eth/eth_GEMAC_RX.rst | 4 +- docs/IPCores/net/eth/eth_GEMAC_TX.rst | 4 +- docs/IPCores/net/eth/eth_PHYController.rst | 4 +- .../eth/eth_PHYController_Marvell_88E1111.rst | 4 +- docs/IPCores/net/eth/eth_Wrapper.rst | 4 +- docs/IPCores/net/icmpv4/icmpv4_RX.rst | 4 +- docs/IPCores/net/icmpv4/icmpv4_TX.rst | 4 +- docs/IPCores/net/icmpv4/icmpv4_Wrapper.rst | 4 +- docs/IPCores/net/icmpv6/icmpv6_RX.rst | 4 +- docs/IPCores/net/icmpv6/icmpv6_TX.rst | 4 +- docs/IPCores/net/icmpv6/icmpv6_Wrapper.rst | 4 +- docs/IPCores/net/ipv4/ipv4_FrameLoopback.rst | 4 +- docs/IPCores/net/ipv4/ipv4_RX.rst | 4 +- docs/IPCores/net/ipv4/ipv4_TX.rst | 4 +- docs/IPCores/net/ipv4/ipv4_Wrapper.rst | 4 +- docs/IPCores/net/ipv6/ipv6_FrameLoopback.rst | 4 +- docs/IPCores/net/ipv6/ipv6_RX.rst | 4 +- docs/IPCores/net/ipv6/ipv6_TX.rst | 4 +- docs/IPCores/net/ipv6/ipv6_Wrapper.rst | 4 +- docs/IPCores/net/mac/mac_FrameLoopback.rst | 4 +- .../IPCores/net/mac/mac_RX_DestMAC_Switch.rst | 4 +- docs/IPCores/net/mac/mac_RX_SrcMAC_Filter.rst | 4 +- docs/IPCores/net/mac/mac_RX_Type_Switch.rst | 4 +- .../net/mac/mac_TX_DestMAC_Prepender.rst | 4 +- .../net/mac/mac_TX_SrcMAC_Prepender.rst | 4 +- .../IPCores/net/mac/mac_TX_Type_Prepender.rst | 4 +- docs/IPCores/net/mac/mac_Wrapper.rst | 4 +- docs/IPCores/net/ndp/ndp_DestinationCache.rst | 4 +- docs/IPCores/net/ndp/ndp_FSMQuery.rst | 4 +- docs/IPCores/net/ndp/ndp_NeighborCache.rst | 4 +- docs/IPCores/net/ndp/ndp_Wrapper.rst | 4 +- docs/IPCores/net/net.pkg.rst | 2 +- docs/IPCores/net/net_FrameChecksum.rst | 4 +- docs/IPCores/net/net_FrameLoopback.rst | 4 +- .../net/net_FramePerformanceCounter.rst | 4 +- docs/IPCores/net/stack/stack_UDPv4.rst | 4 +- docs/IPCores/net/udp/udp_FrameLoopback.rst | 4 +- docs/IPCores/net/udp/udp_RX.rst | 4 +- docs/IPCores/net/udp/udp_TX.rst | 4 +- docs/IPCores/net/udp/udp_Wrapper.rst | 4 +- docs/IPCores/sort/index.rst | 8 +- docs/IPCores/sort/sort_ExpireList.rst | 4 +- docs/IPCores/sort/sort_InsertSort.rst | 4 +- .../IPCores/sort/sort_LeastFrequentlyUsed.rst | 4 +- ...e.rst => sort_LeastRecentlyUsed_Cache.rst} | 20 +- ...st.rst => sort_LeastRecentlyUsed_List.rst} | 18 +- docs/IPCores/sort/sortnet/sortnet.pkg.rst | 2 +- .../sort/sortnet/sortnet_BitonicSort.rst | 4 +- .../sortnet/sortnet_MergeSort_Streamed.rst | 4 +- .../sort/sortnet/sortnet_OddEvenMergeSort.rst | 4 +- .../sort/sortnet/sortnet_OddEvenSort.rst | 4 +- .../sort/sortnet/sortnet_Stream_Adapter.rst | 4 +- .../sort/sortnet/sortnet_Stream_Adapter2.rst | 4 +- .../sort/sortnet/sortnet_Transform.rst | 4 +- docs/IPCores/sync/index.rst | 2 +- docs/IPCores/sync/sync.pkg.rst | 2 +- docs/IPCores/sync/sync_Bits.rst | 4 +- docs/IPCores/sync/sync_Command.rst | 4 +- docs/IPCores/sync/sync_Pulse.rst | 4 +- docs/IPCores/sync/sync_Reset.rst | 4 +- docs/IPCores/sync/sync_Strobe.rst | 4 +- docs/IPCores/sync/sync_Vector.rst | 4 +- docs/IPCores/xil/reconfig/index.rst | 8 +- ...fig_icap_fsm.rst => reconfig_ICAP_FSM.rst} | 16 +- ..._wrapper.rst => reconfig_ICAP_Wrapper.rst} | 16 +- docs/IPCores/xil/xil.pkg.rst | 2 +- docs/IPCores/xil/xil_BSCAN.rst | 4 +- docs/IPCores/xil/xil_DRP_BusMux.rst | 4 +- docs/IPCores/xil/xil_DRP_BusSync.rst | 4 +- docs/IPCores/xil/xil_ICAP.rst | 4 +- docs/IPCores/xil/xil_Reconfigurator.rst | 4 +- docs/IPCores/xil/xil_SystemMonitor.rst | 4 +- docs/QuickStart.rst | 33 +- docs/References/Database.rst | 2 +- docs/References/FileFormats/RulesFormat.rst | 6 +- docs/References/NamingConventions.rst | 18 +- docs/UsingPoC/Download.rst | 14 +- docs/UsingPoC/Integration.rst | 33 +- docs/UsingPoC/Miscellaneous.rst | 4 +- docs/UsingPoC/PrecompilingVendorLibraries.rst | 6 +- docs/UsingPoC/Requirements.rst | 2 +- docs/UsingPoC/Simulation.rst | 16 +- docs/UsingPoC/Synthesis.rst | 10 +- docs/UsingPoC/VHDLConfiguration.rst | 39 +- docs/WhatIsPoC/WhoUsesPoC.rst | 2 +- ...rng_tb.posh.png => arith_PRNG_tb.posh.png} | Bin .../{arith_prng_tb.png => arith_PRNG_tb.png} | Bin ...rith_prng.posh.png => arith_PRNG.posh.png} | Bin docs/conf.py | 6 +- lib/OSVVM-AXI4 | 2 +- lib/OSVVM-Common | 2 +- lib/OSVVM-Scripts | 2 +- lib/OSVVM-UART | 2 +- lib/osvvm | 2 +- poc.ps1 | 112 -- poc.sh | 72 - prj/TerosHDL/PileOfCores_TerosHDL.yml | 1396 +++++++++++++++-- py/.idea/.name | 1 - py/.idea/codeStyleSettings.xml | 9 - py/.idea/codeStyles/codeStyleConfig.xml | 5 - py/.idea/encodings.xml | 6 - .../inspectionProfiles/Project_Default.xml | 6 - py/.idea/markdown-exported-files.xml | 8 - py/.idea/markdown-navigator.xml | 71 - .../markdown-navigator/profiles_settings.xml | 3 - py/.idea/misc.xml | 4 - py/.idea/modules.xml | 8 - py/.idea/py.iml | 15 - .../__dryrun_ghdl_PoC_arith_prng.xml | 22 - .../__dryrun_isim_PoC_arith_prng.xml | 23 - .../__dryrun_rpro_PoC_arith_prng.xml | 22 - .../__dryrun_xsim_PoC_arith_prng.xml | 23 - .../runConfigurations/asim_PoC_arith_prng.xml | 22 - py/.idea/runConfigurations/configure.xml | 22 - .../configure___set_default_tools.xml | 22 - .../runConfigurations/configure_altera.xml | 22 - py/.idea/runConfigurations/configure_ghdl.xml | 22 - py/.idea/runConfigurations/configure_git.xml | 22 - .../runConfigurations/configure_intel.xml | 22 - .../runConfigurations/configure_lattice.xml | 22 - .../configure_mentor_modelsim.xml | 22 - .../coregen_PoC_xil_mig_Atlys_1x128.xml | 23 - .../runConfigurations/ghdl_PoC_arith_prng.xml | 22 - .../runConfigurations/isim_PoC_arith_prng.xml | 23 - .../runConfigurations/list_netlist_PoC__.xml | 22 - .../list_testbench_PoC__.xml | 22 - ...ist_testbench_PoC_sort_____kind_cocotb.xml | 22 - .../runConfigurations/lse_PoC_arith_prng.xml | 22 - .../quartus_PoC_arith_prng.xml | 22 - .../query_Xilinx_ISE_SettingsFile.xml | 22 - .../runConfigurations/rpro_PoC_arith_prng.xml | 22 - .../runConfigurations/vsim_PoC_arith_prng.xml | 22 - .../xsim_PoC_arith_prng___std_08.xml | 23 - .../runConfigurations/xst_PoC_cache_par.xml | 23 - py/.idea/vcs.xml | 6 - py/.idea/workspace.xml | 1119 ------------- regression.tcl | 90 +- rename_strings.sh | 155 ++ sim/README.md | 3 - sim/aSim.batch.tcl | 3 - sim/aSim.gui.tcl | 5 - sim/arith/arith_addw_tb.gtkw | 37 - sim/arith/arith_addw_tb.wcfg | 56 - sim/arith/arith_convert_bin2bcd_tb.ghdl | 46 - sim/arith/arith_convert_bin2bcd_tb.gtkw | 68 - sim/arith/arith_convert_bin2bcd_tb.wcfg | 298 ---- sim/arith/arith_convert_bin2bcd_tb.wdo | 28 - sim/arith/arith_counter_gray_tb.wcfg | 55 - sim/arith/arith_prefix_and_tb.ghdl | 8 - sim/arith/arith_prefix_and_tb.gtkw | 46 - sim/arith/arith_prefix_or_tb.ghdl | 8 - sim/arith/arith_prefix_or_tb.gtkw | 35 - sim/arith/arith_prng_tb.ghdl | 3 - sim/arith/arith_prng_tb.gtkw | 36 - sim/arith/arith_prng_tb.wcfg | 47 - sim/arith/arith_prng_tb.wdo | 24 - sim/dstruct/dstruct_deque_tb.ghdl | 48 - sim/dstruct/dstruct_deque_tb.gtkw | 58 - sim/dstruct/dstruct_stack_tb.ghdl | 32 - sim/dstruct/dstruct_stack_tb.gtkw | 43 - sim/iSim.batch.tcl | 3 - sim/iSim.gui.tcl | 2 - sim/io/uart/uart_rx_tb.ghdl | 20 - sim/io/uart/uart_rx_tb.gtkw | 31 - sim/io/uart/uart_rx_tb.wcfg | 57 - sim/mem/lut/lut_Sine_tb.ghdl | 24 - sim/mem/lut/lut_Sine_tb.gtkw | 46 - sim/mem/lut/lut_Sine_tb.wcfg | 48 - sim/mem/lut/lut_Sine_tb.wdo | 26 - sim/mem/ocram/ocram_sdp_tb.ghdl | 13 - sim/mem/ocram/ocram_sdp_tb.gtkw | 67 - sim/misc/gearbox/gearbox_down_cc_tb.ghdl | 237 --- sim/misc/gearbox/gearbox_down_cc_tb.gtkw | 174 -- sim/misc/gearbox/gearbox_down_cc_tb.wdo | 61 - sim/misc/gearbox/gearbox_down_dc_tb.ghdl | 41 - sim/misc/gearbox/gearbox_down_dc_tb.gtkw | 41 - sim/misc/gearbox/gearbox_down_dc_tb.wdo | 28 - sim/misc/gearbox/gearbox_up_cc_tb.ghdl | 246 --- sim/misc/gearbox/gearbox_up_cc_tb.gtkw | 186 --- sim/misc/gearbox/gearbox_up_cc_tb.wdo | 61 - sim/misc/gearbox/gearbox_up_dc_tb.ghdl | 53 - sim/misc/gearbox/gearbox_up_dc_tb.gtkw | 46 - sim/misc/gearbox/gearbox_up_dc_tb.wdo | 32 - sim/misc/stat/stat_Maximum_tb.ghdl | 28 - sim/misc/stat/stat_Maximum_tb.gtkw | 44 - sim/misc/stat/stat_Maximum_tb.wcfg | 135 -- sim/misc/stat/stat_Minimum_tb.ghdl | 28 - sim/misc/stat/stat_Minimum_tb.gtkw | 65 - sim/misc/stat/stat_Minimum_tb.wcfg | 135 -- sim/misc/sync/sync_Bits_tb.ghdl | 9 - sim/misc/sync/sync_Bits_tb.gtkw | 23 - sim/misc/sync/sync_Command_tb.ghdl | 11 - sim/misc/sync/sync_Command_tb.gtkw | 25 - sim/misc/sync/sync_Command_tb.wcfg | 98 -- sim/misc/sync/sync_Reset_tb.ghdl | 9 - sim/misc/sync/sync_Reset_tb.gtkw | 25 - sim/misc/sync/sync_Reset_tb.wcfg | 78 - sim/misc/sync/sync_Strobe_tb.ghdl | 10 - sim/misc/sync/sync_Strobe_tb.gtkw | 26 - sim/misc/sync/sync_Strobe_tb.wcfg | 90 -- sim/misc/sync/sync_Vector_tb.ghdl | 11 - sim/misc/sync/sync_Vector_tb.gtkw | 34 - sim/misc/sync/sync_Vector_tb.wcfg | 104 -- sim/sort/sortnet/sortnet_BitonicSort_tb.ghdl | 35 - sim/sort/sortnet/sortnet_BitonicSort_tb.gtkw | 82 - sim/sort/sortnet/sortnet_BitonicSort_tb.wcfg | 213 --- sim/sort/sortnet/sortnet_BitonicSort_tb.wdo | 70 - .../sortnet/sortnet_OddEvenMergeSort_tb.ghdl | 35 - .../sortnet/sortnet_OddEvenMergeSort_tb.gtkw | 64 - .../sortnet/sortnet_OddEvenMergeSort_tb.wdo | 31 - sim/sort/sortnet/sortnet_OddEvenSort_tb.ghdl | 35 - sim/sort/sortnet/sortnet_OddEvenSort_tb.gtkw | 66 - sim/sort/sortnet/sortnet_OddEvenSort_tb.wcfg | 123 -- sim/sort/sortnet/sortnet_OddEvenSort_tb.wdo | 31 - .../sortnet/sortnet_Stream_Adapter2_tb.ghdl | 168 -- .../sortnet/sortnet_Stream_Adapter2_tb.gtkw | 265 ---- .../sortnet/sortnet_Stream_Adapter_tb.ghdl | 115 -- .../sortnet/sortnet_Stream_Adapter_tb.gtkw | 436 ----- sim/vSim.batch.tcl | 3 - sim/vSim.default.wdo | 1 - sim/vSim.gui.tcl | 6 - sim/xSim.batch.tcl | 2 - sim/xSim.gui.tcl | 1 - src/arith/README.md | 64 +- src/arith/arith.pkg.vhdl | 196 ++- src/arith/arith_Adder_Wide.vhdl | 346 ++++ ...ain_inc.vhdl => arith_CarryChain_inc.vhdl} | 39 +- ...bcd.vhdl => arith_Convert_Binary2BCD.vhdl} | 32 +- ...ounter_bcd.vhdl => arith_Counter_BCD.vhdl} | 57 +- ...nter_free.vhdl => arith_Counter_Free.vhdl} | 57 +- ...nter_gray.vhdl => arith_Counter_Gray.vhdl} | 84 +- src/arith/arith_Counter_Ring.vhdl | 73 + src/arith/arith_Divider.vhdl | 232 +++ src/arith/arith_FirstOne.vhdl | 160 ++ .../{arith_prng.vhdl => arith_PRNG.vhdl} | 64 +- ..._prefix_and.vhdl => arith_Prefix_And.vhdl} | 49 +- ...th_prefix_or.vhdl => arith_Prefix_Or.vhdl} | 49 +- .../{arith_same.vhdl => arith_Same.vhdl} | 39 +- .../{arith_scaler.vhdl => arith_Scaler.vhdl} | 112 +- ..._barrel.vhdl => arith_Shifter_Barrel.vhdl} | 58 +- ...{arith_sqrt.vhdl => arith_SquareRoot.vhdl} | 65 +- .../{arith_trng.vhdl => arith_TRNG.vhdl} | 44 +- src/arith/arith_addw.vhdl | 345 ---- src/arith/arith_cca.vhdl | 273 ++-- src/arith/arith_counter_ring.vhdl | 73 - src/arith/arith_div.vhdl | 231 --- src/arith/arith_firstone.vhdl | 160 -- src/arith/{arith.pro => build.pro} | 49 +- ...linx.vhdl => arith_Adder_Wide_Xilinx.vhdl} | 396 ++--- ....vhdl => arith_CarryChain_inc_Xilinx.vhdl} | 46 +- ...linx.vhdl => arith_Prefix_And_Xilinx.vhdl} | 53 +- ...ilinx.vhdl => arith_Prefix_Or_Xilinx.vhdl} | 55 +- src/arith/xilinx/arith_cca_xilinx.vhdl | 356 +++-- src/arith/xilinx/arith_inc_ovcy_xilinx.vhdl | 57 +- src/{PoC.pro => build.pro} | 47 +- src/bus/axi4/AXI4Lite/AXI4Lite_FIFO_cdc.vhdl | 250 --- src/bus/axi4/AXI4_FIFO_cdc.vhdl | 392 ----- src/bus/axi4/axi4.pkg.vhdl | 78 +- src/bus/axi4/axi4.pro | 93 -- ...Lite.vhdl => axi4_AXI4Lite_Converter.vhdl} | 60 +- ...4_Common.pkg.vhdl => axi4_Common.pkg.vhdl} | 2 +- src/bus/axi4/axi4_DeMux.vhdl | 738 +++++++++ .../axi4/{AXI4_FIFO.vhdl => axi4_FIFO.vhdl} | 212 +-- src/bus/axi4/axi4_FIFO_CDC.vhdl | 392 +++++ ...{AXI4_Full.pkg.vhdl => axi4_Full.pkg.vhdl} | 182 ++- src/bus/axi4/axi4_Mux.vhdl | 607 +++++++ ...XI4_OSVVM.pkg.vhdl => axi4_OSVVM.pkg.vhdl} | 6 +- src/bus/axi4/axi4_Sink.vhdl | 261 +++ ...ger.vhdl => axi4_Termination_Manager.vhdl} | 4 +- ...vhdl => axi4_Termination_Subordinate.vhdl} | 63 +- src/bus/axi4/build.pro | 40 + .../axi4lite.pkg.vhdl} | 311 ++-- src/bus/axi4lite/axi4lite_DeMux.vhdl | 120 ++ .../axi4lite_FIFO.vhdl} | 112 +- src/bus/axi4lite/axi4lite_FIFO_CDC.vhdl | 250 +++ .../axi4lite_GitVersionRegister.vhdl} | 10 +- .../axi4lite_HighResolutionClock.vhdl} | 28 +- .../axi4lite_OCRAM_Adapter.vhdl} | 38 +- .../axi4lite_OSVVM.pkg.vhdl} | 10 +- .../axi4lite_Register.vhdl} | 56 +- .../axi4lite_Termination_Manager.vhdl} | 8 +- .../axi4lite_Termination_Subordinate.vhdl} | 56 +- .../axi4lite_UART.vhdl} | 56 +- src/bus/axi4lite/build.pro | 43 + .../axi4stream.pkg.vhdl} | 100 +- .../axi4stream_DeMux.vhdl} | 18 +- .../axi4stream_FIFO.vhdl} | 142 +- .../axi4stream_FIFO_CDC.vhdl} | 24 +- .../axi4stream_FIFO_TempGot.vhdl} | 154 +- .../axi4stream_FIFO_TempPut.vhdl} | 88 +- .../axi4stream_Mux.vhdl} | 9 +- src/bus/axi4stream/axi4stream_Pause.vhdl | 135 ++ .../axi4stream_Stage.vhdl} | 30 +- .../axi4stream_Termination_Receiver.vhdl | 55 + .../axi4stream_Termination_Transmitter.vhdl | 58 + src/bus/axi4stream/build.pro | 48 + src/bus/{bus.pro => build.pro} | 12 +- src/bus/bus_Arbiter.vhdl | 133 +- src/bus/drp/drp.generic.vhdl | 7 +- src/bus/drp/drp.pkg.vhdl | 74 +- ...e_Bridge.vhdl => drp_AXI4Lite_Bridge.vhdl} | 25 +- src/bus/stream/README.md | 11 +- src/bus/stream/{stream.pro => build.pro} | 0 src/bus/stream/stream.pkg.vhdl | 414 ++--- src/bus/stream/stream_DeMux.vhdl | 160 +- src/bus/stream/stream_FIFO.vhdl | 64 +- src/bus/stream/stream_FrameGenerator.vhdl | 6 +- src/bus/stream/stream_Mirror.vhdl | 62 +- src/bus/stream/stream_Mux.vhdl | 4 +- src/bus/stream/stream_Source.vhdl | 86 +- src/bus/wb/README.md | 5 +- src/cache/README.md | 24 +- src/cache/{cache.pro => build.pro} | 14 +- src/cache/cache.pkg.vhdl | 14 +- src/cache/{cache_cpu.vhdl => cache_CPU.vhdl} | 196 +-- .../{cache_mem.vhdl => cache_Memory.vhdl} | 170 +- .../{cache_par.vhdl => cache_Parallel.vhdl} | 88 +- .../{cache_par2.vhdl => cache_Parallel2.vhdl} | 114 +- ...licy.vhdl => cache_ReplacementPolicy.vhdl} | 140 +- ...t_par.vhdl => cache_TagUnit_Parallel.vhdl} | 196 +-- ...seq.vhdl => cache_TagUnit_Sequential.vhdl} | 44 +- src/comm/README.md | 8 +- src/comm/{comm.pro => build.pro} | 6 +- src/comm/comm.pkg.vhdl | 50 +- src/comm/{comm_crc.vhdl => comm_CRC.vhdl} | 63 +- ...{comm_scramble.vhdl => comm_Scramble.vhdl} | 40 +- ...ntrol.vhdl => remote_TerminalControl.vhdl} | 79 +- src/common/README.md | 8 +- src/common/{common.pro => build.pro} | 1 - src/common/common.vhdl | 28 +- src/common/components.vhdl | 4 +- src/common/config.vhdl | 17 +- src/common/debug.vhdl | 82 - ...late => local_configuration.vhdl.template} | 29 +- src/common/math.vhdl | 12 +- src/common/physical.vhdl | 44 +- ...te => project_configuration.vhdl.template} | 98 +- src/common/protected.v08.vhdl | 105 +- src/common/strings.vhdl | 30 +- src/common/utils.vhdl | 262 ++-- src/common/vectors.vhdl | 140 +- src/dstruct/README.md | 8 +- src/dstruct/{dstruct.pro => build.pro} | 6 +- src/dstruct/dstruct.pkg.vhdl | 88 +- src/dstruct/dstruct_DoubleEndedQueue.vhdl | 744 +++++++++ src/dstruct/dstruct_OutOfOrderBuffer.vhdl | 130 ++ src/dstruct/dstruct_Stack.vhdl | 193 +++ src/dstruct/dstruct_deque.vhdl | 769 --------- src/dstruct/dstruct_stack.vhdl | 197 --- src/fifo/README.md | 8 +- src/fifo/{fifo.pro => build.pro} | 4 +- src/fifo/fifo.pkg.vhdl | 364 ++--- src/fifo/{fifo_shift.vhdl => fifo_Shift.vhdl} | 65 +- src/fifo/{fifo_stage.vhdl => fifo_Stage.vhdl} | 74 +- src/fifo/fifo_cc_got.vhdl | 195 +-- src/fifo/fifo_cc_got_tempgot.vhdl | 198 +-- src/fifo/fifo_cc_got_tempput.vhdl | 195 +-- src/fifo/fifo_ic_assembly.vhdl | 44 +- src/fifo/fifo_ic_got.vhdl | 634 ++++---- src/io/{io.pro => build.pro} | 22 +- src/io/ddrio/README.md | 46 +- src/io/ddrio/build.pro | 39 + src/io/ddrio/ddrio.pkg.vhdl | 196 +-- src/io/ddrio/{ddrio_in.vhdl => ddrio_In.vhdl} | 80 +- .../{ddrio_inout.vhdl => ddrio_InOut.vhdl} | 134 +- src/io/ddrio/ddrio_InOut_Altera.vhdl | 82 + ...ut_xilinx.vhdl => ddrio_InOut_Xilinx.vhdl} | 98 +- ...io_in_altera.vhdl => ddrio_In_Altera.vhdl} | 46 +- ...io_in_xilinx.vhdl => ddrio_In_Xilinx.vhdl} | 54 +- .../ddrio/{ddrio_out.vhdl => ddrio_Out.vhdl} | 100 +- ..._out_altera.vhdl => ddrio_Out_Altera.vhdl} | 58 +- ..._out_xilinx.vhdl => ddrio_Out_Xilinx.vhdl} | 76 +- src/io/ddrio/ddrio_inout_altera.vhdl | 82 - src/io/iic/{iic.pro => build.pro} | 0 src/io/iic/iic.pkg.vhdl | 6 +- src/io/io.pkg.vhdl | 14 +- src/io/io_7SegmentMux_BCD.vhdl | 14 +- src/io/io_7SegmentMux_HEX.vhdl | 8 +- src/io/io_Debounce.vhdl | 14 +- src/io/io_FanControl.vhdl | 6 +- src/io/io_FrequencyCounter.vhdl | 28 +- src/io/io_GlitchFilter.vhdl | 90 +- src/io/io_KeyPadScanner.vhdl | 74 +- src/io/io_PulseWidthModulation.vhdl | 8 +- src/io/io_TimingCounter.vhdl | 36 +- src/io/pmod/pmod.pkg.vhdl | 8 +- src/io/pmod/pmod_KYPD.vhdl | 114 +- src/io/pmod/pmod_SSD.vhdl | 70 +- src/io/pmod/pmod_USBUART.vhdl | 86 +- src/io/spi/spi.pro | 14 - src/io/uart/README.md | 16 +- src/io/uart/{uart.pro => build.pro} | 11 +- src/io/uart/uart.pkg.vhdl | 211 +-- src/io/uart/uart_BitClock.vhdl | 104 ++ .../uart/{uart_fifo.vhdl => uart_FIFO.vhdl} | 156 +- src/io/uart/uart_FT245.vhdl | 258 +++ src/io/uart/{uart_rx.vhdl => uart_RX.vhdl} | 121 +- src/io/uart/{uart_tx.vhdl => uart_TX.vhdl} | 74 +- src/io/uart/uart_bclk.vhdl | 103 -- src/io/uart/uart_ft245.vhdl | 259 --- .../{list_expire.vhdl => list_Expire.vhdl} | 38 +- src/mem/{mem.pro => build.pro} | 24 +- src/mem/lut/lut_Sine.vhdl | 33 +- src/mem/mem.pkg.vhdl | 67 +- src/mem/mem_GitVersionRegister.pkg.vhdl | 14 +- .../ocram/altera/ocram_SimplePort_Altera.vhdl | 90 ++ .../altera/ocram_TrueDualPort_Altera.vhdl | 115 ++ src/mem/ocram/altera/ocram_sp_altera.vhdl | 97 -- src/mem/ocram/altera/ocram_tdp_altera.vhdl | 123 -- src/mem/ocram/ocram.pkg.vhdl | 243 ++- .../ocram/ocram_EnhancedSimpleDualPort.vhdl | 195 +++ src/mem/ocram/ocram_SimpleDualPort.vhdl | 150 ++ .../ocram/ocram_SimpleDualPort_Optimized.vhdl | 197 +++ ...l => ocram_SimpleDualPort_WriteFirst.vhdl} | 129 +- src/mem/ocram/ocram_SinglePort.vhdl | 141 ++ src/mem/ocram/ocram_TrueDualPort.vhdl | 190 +++ ...hdl => ocram_TrueDualPort_Simulation.vhdl} | 192 +-- ...hdl => ocram_TrueDualPort_WriteFirst.vhdl} | 132 +- src/mem/ocram/ocram_esdp.vhdl | 237 --- src/mem/ocram/ocram_sdp.vhdl | 198 --- src/mem/ocram/ocram_sdp_optimized.vhdl | 196 --- src/mem/ocram/ocram_sp.vhdl | 173 -- src/mem/ocram/ocram_tdp.vhdl | 262 ---- src/mem/ocrom/ocrom.pkg.vhdl | 58 +- src/mem/ocrom/ocrom_DualPort.vhdl | 135 ++ src/mem/ocrom/ocrom_SinglePort.vhdl | 104 ++ src/mem/ocrom/ocrom_dp.vhdl | 185 --- src/mem/ocrom/ocrom_sp.vhdl | 149 -- src/mem/sdram/sdram_ctrl_de0.vhdl | 264 ++-- src/mem/sdram/sdram_ctrl_fsm.vhdl | 1306 +++++++-------- src/mem/sdram/sdram_ctrl_phy_de0.vhdl | 308 ++-- src/mem/sdram/sdram_ctrl_phy_s3esk.vhdl | 692 ++++---- src/mem/sdram/sdram_ctrl_s3esk.vhdl | 306 ++-- src/misc/{misc.pro => build.pro} | 6 +- src/misc/clock/clock.pkg.vhdl | 8 +- src/misc/clock/clock_Counter.vhdl | 4 +- src/misc/clock/clock_HighResolution.vhdl | 20 +- src/misc/clock/clock_Timer.vhdl | 8 +- src/misc/filter/README.md | 12 +- src/misc/filter/build.pro | 25 + src/misc/filter/filter.pro | 3 - .../{filter_and.vhdl => filter_And.vhdl} | 44 +- .../{filter_mean.vhdl => filter_Mean.vhdl} | 46 +- .../filter/{filter_or.vhdl => filter_Or.vhdl} | 44 +- src/misc/gearbox/README.md | 20 +- src/misc/gearbox/{gearbox.pro => build.pro} | 8 +- src/misc/gearbox/gearbox_Down_cc.vhdl | 262 ++++ src/misc/gearbox/gearbox_Down_dc.vhdl | 108 ++ src/misc/gearbox/gearbox_Up_cc.vhdl | 325 ++++ src/misc/gearbox/gearbox_Up_dc.vhdl | 151 ++ src/misc/gearbox/gearbox_down_cc.vhdl | 262 ---- src/misc/gearbox/gearbox_down_dc.vhdl | 108 -- src/misc/gearbox/gearbox_up_cc.vhdl | 325 ---- src/misc/gearbox/gearbox_up_dc.vhdl | 151 -- src/misc/misc_Delay.vhdl | 44 +- src/misc/misc_FrequencyMeasurement.vhdl | 118 +- src/misc/misc_Sequencer.vhdl | 6 +- src/misc/misc_StrobeGenerator.vhdl | 6 +- src/misc/misc_StrobeLimiter.vhdl | 8 +- src/misc/misc_StrobeStretcher.vhdl | 6 +- src/misc/misc_bit_lz.vhdl | 336 ++-- src/misc/stat/{stat.pro => build.pro} | 3 + src/misc/stat/stat_Average.vhdl | 128 +- src/misc/stat/stat_Histogram.vhdl | 41 +- src/misc/stat/stat_Maximum.vhdl | 100 +- src/misc/stat/stat_Minimum.vhdl | 100 +- src/net/arp/arp_BroadCast_Receiver.vhdl | 400 ++--- src/net/arp/arp_BroadCast_Requester.vhdl | 550 +++---- src/net/arp/arp_Cache.vhdl | 369 +++-- src/net/arp/arp_IPPool.vhdl | 179 ++- src/net/arp/arp_UniCast_Receiver.vhdl | 432 ++--- src/net/arp/arp_UniCast_Responder.vhdl | 298 ++-- src/net/arp/arp_Wrapper.vhdl | 1050 ++++++------- src/net/arp/{arp.pro => build.pro} | 0 src/net/{net.pro => build.pro} | 12 +- src/net/icmpv4/{icmpv4.pro => build.pro} | 0 src/net/icmpv4/icmpv4_RX.vhdl | 416 ++--- src/net/icmpv4/icmpv4_TX.vhdl | 268 ++-- src/net/icmpv4/icmpv4_Wrapper.vhdl | 486 +++--- src/net/ipv4/{ipv4.pro => build.pro} | 0 src/net/ipv4/ipv4_FrameLoopback.vhdl | 166 +- src/net/ipv4/ipv4_RX.vhdl | 534 +++---- src/net/ipv4/ipv4_TX.vhdl | 576 +++---- src/net/ipv4/ipv4_Wrapper.vhdl | 740 ++++----- src/net/ipv6/{ipv6.pro => build.pro} | 0 src/net/ipv6/ipv6_FrameLoopback.vhdl | 166 +- src/net/ipv6/ipv6_RX.vhdl | 456 +++--- src/net/ipv6/ipv6_TX.vhdl | 294 ++-- src/net/ipv6/ipv6_Wrapper.vhdl | 762 ++++----- src/net/mac/{mac.pro => build.pro} | 0 src/net/mac/mac_FrameLoopback.vhdl | 148 +- src/net/mac/mac_RX_DestMAC_Switch.vhdl | 296 ++-- src/net/mac/mac_RX_SrcMAC_Filter.vhdl | 310 ++-- src/net/mac/mac_RX_Type_Switch.vhdl | 268 ++-- src/net/mac/mac_TX_DestMAC_Prepender.vhdl | 164 +- src/net/mac/mac_TX_SrcMAC_Prepender.vhdl | 260 +-- src/net/mac/mac_TX_Type_Prepender.vhdl | 4 +- src/net/mac/mac_Wrapper.vhdl | 464 +++--- src/net/net.pkg.vhdl | 268 ++-- src/net/net_FrameChecksum.vhdl | 484 +++--- src/net/udp/{udp.pro => build.pro} | 0 src/net/udp/udp_FrameLoopback.vhdl | 188 +-- src/net/udp/udp_RX.vhdl | 442 +++--- src/net/udp/udp_TX.vhdl | 580 +++---- src/net/udp/udp_Wrapper.vhdl | 824 +++++----- src/sim/{sim.pro => build.pro} | 0 src/sim/sim_VCDParser.vhdl | 36 +- src/sort/README.md | 8 +- src/sort/{sort.pro => build.pro} | 6 +- ...vhdl => sort_LeastRecentlyUsed_Cache.vhdl} | 85 +- src/sort/sort_LeastRecentlyUsed_List.vhdl | 176 +++ src/sort/sort_lru_list.vhdl | 176 --- src/sort/sortnet/{sortnet.pro => build.pro} | 0 src/sort/sortnet/sortnet.pkg.vhdl | 12 +- src/sort/sortnet/sortnet_BitonicSort.vhdl | 170 +- .../sortnet/sortnet_MergeSort_Streamed.vhdl | 296 ++-- .../sortnet/sortnet_OddEvenMergeSort.vhdl | 184 +-- src/sort/sortnet/sortnet_OddEvenSort.vhdl | 208 +-- src/sort/sortnet/sortnet_Stream_Adapter.vhdl | 286 ++-- src/sort/sortnet/sortnet_Stream_Adapter2.vhdl | 498 +++--- src/sort/sortnet/sortnet_Transform.vhdl | 100 +- src/sync/README.md | 4 +- src/sync/{sync.pro => build.pro} | 2 + src/sync/sync.pkg.vhdl | 10 +- src/sync/sync_Bits.vhdl | 2 +- src/sync/sync_Bits_Altera.vhdl | 2 +- src/sync/sync_Command.vhdl | 4 +- src/sync/sync_Pulse.vhdl | 2 +- src/sync/sync_Pulse_Altera.vhdl | 2 +- src/sync/sync_Pulse_Xilinx.vhdl | 78 +- src/sync/sync_Reset.vhdl | 2 +- src/sync/sync_Reset_Altera.vhdl | 2 +- src/sync/sync_Reset_Xilinx.vhdl | 2 +- src/sync/sync_Strobe.vhdl | 6 +- src/sync/sync_Vector.vhdl | 6 +- src/xil/{xil.pro => build.pro} | 14 +- ...g_icap_fsm.vhdl => reconfig_ICAP_FSM.vhdl} | 163 +- src/xil/reconfig/reconfig_ICAP_Wrapper.vhdl | 242 +++ src/xil/reconfig/reconfig_icap_wrapper.vhdl | 244 --- src/xil/xil.pkg.vhdl | 16 +- src/xil/xil_BSCAN.vhdl | 168 +- src/xil/xil_DNAPort.vhdl | 108 +- src/xil/xil_ICAP.vhdl | 165 +- src/xil/xil_Reconfigurator.vhdl | 162 +- src/xil/xil_SystemMonitor.vhdl | 230 +-- tb/README.md | 14 +- tb/RunAllTests.pro | 17 +- tb/arith/Adder_Wide/RunAllTests.pro | 31 + .../Adder_Wide/arith_Adder_Wide_Simple.vhdl | 143 ++ .../arith_Adder_Wide_TestController.vhdl} | 34 +- .../arith_Adder_Wide_TestController_pkg.vhdl} | 24 +- .../arith_Adder_Wide_TestHarness.vhdl | 132 ++ .../RunAllTests.pro | 10 +- .../arith_CarryChain_inc_Simple.vhdl} | 18 +- .../arith_CarryChain_inc_TestController.vhdl} | 10 +- .../arith_CarryChain_inc_TestHarness.vhdl} | 22 +- .../RunAllTests.pro | 10 +- .../arith_Convert_Binary2BCD_Simple.vhdl | 166 ++ ...th_Convert_Binary2BCD_TestController.vhdl} | 54 +- .../arith_Convert_Binary2BCD_TestHarness.vhdl | 157 ++ .../RunAllTests.pro | 10 +- .../Counter_BCD/arith_Counter_BCD_Simple.vhdl | 137 ++ .../arith_Counter_BCD_TestController.vhdl} | 36 +- .../arith_Counter_BCD_TestHarness.vhdl | 105 ++ .../RunAllTests.pro | 10 +- .../arith_Counter_Free_Simple.vhdl} | 18 +- .../arith_Counter_Free_TestController.vhdl} | 10 +- .../arith_Counter_Free_TestHarness.vhdl} | 24 +- .../RunAllTests.pro | 10 +- .../arith_Counter_Gray_Simple.vhdl} | 18 +- .../arith_Counter_Gray_TestController.vhdl} | 10 +- .../arith_Counter_Gray_TestHarness.vhdl} | 28 +- .../RunAllTests.pro | 10 +- .../arith_Counter_Ring_Simple.vhdl} | 18 +- .../arith_Counter_Ring_TestController.vhdl} | 10 +- .../arith_Counter_Ring_TestHarness.vhdl} | 24 +- tb/arith/{div => Divider}/RunAllTests.pro | 10 +- tb/arith/Divider/arith_Divider_Simple.vhdl | 172 ++ .../arith_Divider_TestController.vhdl} | 32 +- .../Divider/arith_Divider_TestHarness.vhdl | 149 ++ .../{firstone => FirstOne}/RunAllTests.pro | 10 +- tb/arith/FirstOne/arith_FirstOne_Simple.vhdl | 152 ++ .../arith_FirstOne_TestController.vhdl} | 38 +- .../FirstOne/arith_FirstOne_TestHarness.vhdl | 109 ++ tb/arith/{prng => PRNG}/RunAllTests.pro | 10 +- .../arith_PRNG_Simple.vhdl} | 24 +- .../arith_PRNG_TestController.vhdl} | 8 +- .../arith_PRNG_TestHarness.vhdl} | 18 +- .../RunAllTests.pro | 12 +- .../arith_Prefix_And_Exhaustive.vhdl | 120 ++ .../Prefix_And/arith_Prefix_And_Simple.vhdl | 234 +++ .../arith_Prefix_And_TestController.vhdl} | 22 +- .../arith_Prefix_And_TestHarness.vhdl | 94 ++ .../{prefix_or => Prefix_Or}/RunAllTests.pro | 12 +- .../arith_Prefix_Or_Exhaustive.vhdl} | 18 +- .../Prefix_Or/arith_Prefix_Or_Simple.vhdl | 236 +++ .../arith_Prefix_Or_TestController.vhdl} | 8 +- .../arith_Prefix_Or_TestHarness.vhdl} | 18 +- tb/arith/RunAllTests.pro | 34 +- tb/arith/{same => Same}/RunAllTests.pro | 10 +- .../arith_Same_Simple.vhdl} | 18 +- .../arith_Same_TestController.vhdl} | 10 +- .../arith_Same_TestHarness.vhdl} | 18 +- tb/arith/{scaler => Scaler}/RunAllTests.pro | 10 +- tb/arith/Scaler/arith_Scaler_Simple.vhdl | 138 ++ .../arith_Scaler_TestController.vhdl} | 44 +- tb/arith/Scaler/arith_Scaler_TestHarness.vhdl | 125 ++ .../{addw => Shifter_Barrel}/RunAllTests.pro | 11 +- .../arith_Shifter_Barrel_Simple.vhdl} | 18 +- .../arith_Shifter_Barrel_TestController.vhdl} | 10 +- .../arith_Shifter_Barrel_TestHarness.vhdl} | 16 +- tb/arith/{sqrt => SquareRoot}/RunAllTests.pro | 10 +- .../arith_SquareRoot_Simple.vhdl} | 18 +- .../arith_SquareRoot_TestController.vhdl} | 10 +- .../arith_SquareRoot_TestHarness.vhdl} | 30 +- tb/arith/{trng => TRNG}/RunAllTests.pro | 10 +- .../arith_TRNG_Simple.vhdl} | 18 +- .../arith_TRNG_TestController.vhdl} | 10 +- .../arith_TRNG_TestHarness.vhdl} | 20 +- tb/arith/addw/arith_addw_Simple.vhdl | 143 -- tb/arith/addw/arith_addw_TestHarness.vhdl | 132 -- tb/arith/cca/arith_cca_Simple.vhdl | 6 +- tb/arith/cca/arith_cca_TestController.vhdl | 6 +- tb/arith/cca/arith_cca_TestHarness.vhdl | 4 +- .../arith_convert_bin2bcd_Simple.vhdl | 166 -- .../arith_convert_bin2bcd_TestHarness.vhdl | 157 -- .../counter_bcd/arith_counter_bcd_Simple.vhdl | 137 -- .../arith_counter_bcd_TestHarness.vhdl | 105 -- tb/arith/div/arith_div_Simple.vhdl | 172 -- tb/arith/div/arith_div_TestHarness.vhdl | 149 -- tb/arith/firstone/arith_firstone_Simple.vhdl | 152 -- .../firstone/arith_firstone_TestHarness.vhdl | 109 -- .../arith_prefix_and_Exhaustive.vhdl | 120 -- .../prefix_and/arith_prefix_and_Simple.vhdl | 234 --- .../arith_prefix_and_TestHarness.vhdl | 94 -- .../prefix_or/arith_prefix_or_Simple.vhdl | 236 --- tb/arith/scaler/arith_scaler_Simple.vhdl | 138 -- tb/arith/scaler/arith_scaler_TestHarness.vhdl | 125 -- tb/arith/shifter_barrel/RunAllTests.pro | 30 - tb/bus/RunAllTests.pro | 2 + ...AXI4Lite_OCRAM_Adapter_TestController.vhdl | 51 - tb/bus/axi4/AXI4Lite/RunAllTests.pro | 32 - tb/bus/axi4/DeMux/RunAllTests.pro | 32 + tb/bus/axi4/DeMux/TC_SimpleReadWrite.tcl | 23 + tb/bus/axi4/DeMux/TC_SimpleReadWrite.vhdl | 199 +++ .../axi4/DeMux/TC_SimpleReadWrite_delay.tcl | 51 + .../axi4/DeMux/TC_SimpleReadWrite_delay.vhdl | 213 +++ .../DeMux/TC_SimpleReadWrite_multiID.vhdl | 207 +++ .../TC_SimpleReadWrite_multiID_randDelay.vhdl | 181 +++ .../axi4/DeMux/axi4_DeMux_TestController.vhdl | 47 + tb/bus/axi4/DeMux/axi4_DeMux_TestHarness.vhdl | 218 +++ tb/bus/axi4/Mux/RunAllTests.pro | 32 + tb/bus/axi4/Mux/TC_SimpleReadWrite.tcl | 19 + tb/bus/axi4/Mux/TC_SimpleReadWrite.vhdl | 134 ++ .../axi4/Mux/TC_SimpleReadWrite_multiID.vhdl | 157 ++ .../TC_SimpleReadWrite_multiID_randDelay.tcl | 64 + .../TC_SimpleReadWrite_multiID_randDelay.vhdl | 178 +++ tb/bus/axi4/Mux/axi4_Mux_TestController.vhdl | 41 + tb/bus/axi4/Mux/axi4_Mux_TestHarness.vhdl | 254 +++ tb/bus/axi4/RunAllTests.pro | 16 +- .../Demux}/RunAllTests.pro | 13 +- tb/bus/axi4lite/Demux/TC_SimpleReadWrite.tcl | 2 + tb/bus/axi4lite/Demux/TC_SimpleReadWrite.vhdl | 154 ++ .../axi4lite/Demux/TC_SimpleReadWrite_02.tcl | 2 + .../axi4lite/Demux/TC_SimpleReadWrite_02.vhdl | 155 ++ .../Demux/axi4lite_Demux_TestController.vhdl | 47 + .../Demux/axi4lite_Demux_TestHarness.vhdl | 204 +++ .../HighResolutionClock}/RunAllTests.pro | 2 +- ...xi4lite_HighResolutionClock_correction.tcl | 0 ...i4lite_HighResolutionClock_correction.vhdl | 4 +- ...xi4lite_HighResolutionClock_load_times.tcl | 0 ...i4lite_HighResolutionClock_load_times.vhdl | 36 +- .../axi4lite_HighResolutionClock_tb_pkg.vhdl | 2 +- .../axi4lite_HighResolutionClock_tc.vhdl | 12 +- .../axi4lite_HighResolutionClock_th.vhdl | 22 +- tb/bus/axi4lite/OCRAM_Adapter/RunAllTests.pro | 38 + .../OCRAM_Adapter}/TC_AsyncReadWrite.vhdl | 38 +- .../axi4lite/OCRAM_Adapter/TC_InitMemory.vhdl | 112 ++ .../OCRAM_Adapter}/TC_SimpleReadWrite.vhdl | 30 +- .../OCRAM_Adapter/axi4lite_OCRAM_Adapter.hex | 260 +++ ...axi4lite_OCRAM_Adapter_TestController.vhdl | 69 + .../axi4lite_OCRAM_Adapter_TestHarness.vhdl} | 138 +- .../Register}/RunAllTests.pro | 13 +- .../axi4lite/Register/TC_RandomReadWrite.vhdl | 139 ++ .../Register/axi4lite_Register_Initial.vhdl} | 10 +- .../axi4lite_Register_ReadWrite.vhdl} | 10 +- .../axi4lite_Register_TestController.vhdl} | 18 +- .../axi4lite_Register_TestHarness.vhdl} | 34 +- .../Register/axi4lite_Register_pkg.vhdl} | 6 +- tb/bus/axi4lite/RunAllTests.pro | 28 + .../UART}/RunAllTests.pro | 2 +- .../UART}/axi4lite_UART_SWFC.vhdl | 54 +- .../UART}/axi4lite_UART_receive.vhdl | 0 .../UART}/axi4lite_UART_receive_burst.vhdl | 36 +- .../UART}/axi4lite_UART_receive_parity.vhdl | 12 +- .../UART}/axi4lite_UART_tc.vhdl | 6 +- .../UART}/axi4lite_UART_th.vhdl | 16 +- .../UART}/axi4lite_UART_transmit_burst.vhdl | 12 +- tb/bus/axi4stream/DeMux/DeMux_Harness.vhdl | 258 +++ tb/bus/axi4stream/DeMux/RunAllTests.pro | 33 + tb/bus/axi4stream/DeMux/TC_DeMux_e.vhdl | 58 + tb/bus/axi4stream/DeMux/TC_DeMux_random.vhdl | 220 +++ .../DeMux/TC_DeMux_random_mirror.vhdl | 220 +++ .../TC_DeMux_random_mirror_multiDest.vhdl | 223 +++ .../DeMux/TC_DeMux_random_withGlue.vhdl | 220 +++ .../axi4stream/FIFO/FIFO_TestController.vhdl | 50 + tb/bus/axi4stream/FIFO/FIFO_TestHarness.vhdl | 189 +++ tb/bus/axi4stream/FIFO/RunAllTests.pro | 29 + tb/bus/axi4stream/FIFO/TC_Randomized.vhdl | 238 +++ .../FIFO_CDC/FIFO_CDC_TestController.vhdl | 54 + .../FIFO_CDC/FIFO_CDC_TestHarness.vhdl | 230 +++ tb/bus/axi4stream/FIFO_CDC/RunAllTests.pro | 30 + tb/bus/axi4stream/FIFO_CDC/TC_Randomized.vhdl | 272 ++++ tb/bus/axi4stream/Mux/RunAllTests.pro | 31 + tb/bus/axi4stream/Mux/TC_RandomTransfer.tcl | 32 + tb/bus/axi4stream/Mux/TC_RandomTransfer.vhdl | 192 +++ .../Mux/TC_RandomTransfer_delay.tcl | 32 + .../Mux/TC_RandomTransfer_delay.vhdl | 194 +++ tb/bus/axi4stream/Mux/TestController_e.vhdl | 59 + tb/bus/axi4stream/Mux/tb_axi4stream_mux.vhdl | 261 +++ tb/bus/axi4stream/RunAllTests.pro | 28 + .../{cache_cpu_tb.vhdl => cache_CPU_tb.vhdl} | 142 +- ...cache_mem_tb.vhdl => cache_Memory_tb.vhdl} | 232 +-- ...r2_cocotb.py => cache_Parallel2_cocotb.py} | 2 +- ...par_cocotb.py => cache_Parallel_cocotb.py} | 2 +- tb/common/RunAllTests.pro | 24 + tb/common/config_tb.vhdl | 68 +- tb/common/my_config_DE0.vhdl | 43 - tb/common/my_config_DE4.vhdl | 43 - tb/common/my_config_DE5.vhdl | 43 - tb/common/my_config_ECP5Versa.vhdl | 43 - tb/common/my_config_KC705.vhdl | 43 - tb/common/my_config_ML505.vhdl | 43 - tb/common/my_config_ML506.vhdl | 48 - tb/common/my_config_ML605.vhdl | 43 - tb/common/my_config_S2GXAV.vhdl | 43 - tb/common/my_config_S3ESK500.vhdl | 51 - tb/common/my_config_S3SK1000.vhdl | 51 - tb/common/my_config_VC707.vhdl | 43 - tb/common/my_config_VC709.vhdl | 43 - tb/common/my_config_XUPV5.vhdl | 48 - tb/common/my_config_ZC706.vhdl | 43 - tb/common/my_config_ZedBoard.vhdl | 43 - tb/common/physical_tb.vhdl | 24 +- ....vhdl => project_configuration_AC701.vhdl} | 16 +- tb/common/project_configuration_Arty.vhdl | 43 + tb/common/project_configuration_ArtyS7.vhdl | 43 + ...l => project_configuration_ECP5Versa.vhdl} | 16 +- ...hdl => project_configuration_GENERIC.vhdl} | 16 +- tb/common/project_configuration_KC705.vhdl | 43 + ...vhdl => project_configuration_Nexys4.vhdl} | 14 +- ...l => project_configuration_Nexys4DDR.vhdl} | 14 +- ....vhdl => project_configuration_VC707.vhdl} | 16 +- tb/common/project_configuration_VC709.vhdl | 43 + tb/common/project_configuration_ZC706.vhdl | 43 + ...dl => project_configuration_ZedBoard.vhdl} | 16 +- tb/common/strings_tb.vhdl | 122 +- tb/common/utils-pkg/RunAllTests.pro | 26 + .../utils-pkg/Tb_common_utils_log2ceil.vhdl | 88 ++ tb/dstruct/OutOfOrderBuffer/RunAllTests.pro | 39 + .../TbOutOfOrderBuffer_WriteRead.tcl | 3 + .../TbOutOfOrderBuffer_WriteRead.vhdl | 196 +++ ...truct_OutOfOrderBuffer_TestController.vhdl | 69 + .../OutOfOrderBuffer/tb_OutOfOrderBuffer.vhdl | 152 ++ tb/dstruct/RunAllTests.pro | 25 + ....vhdl => dstruct_DoubleEndedQueue_tb.vhdl} | 106 +- ...ct_stack_tb.vhdl => dstruct_Stack_tb.vhdl} | 124 +- tb/fifo/fifo_cc_got_tb.vhdl | 210 +-- tb/fifo/fifo_cc_got_tempput_tb.vhdl | 334 ++-- tb/fifo/fifo_ic_assembly_tb.vhdl | 122 +- tb/fifo/fifo_ic_got_tb.vhdl | 394 ++--- ...drio_inout_tb.vhdl => ddrio_InOut_tb.vhdl} | 138 +- .../{ddrio_in_tb.vhdl => ddrio_In_tb.vhdl} | 102 +- .../{ddrio_out_tb.vhdl => ddrio_Out_tb.vhdl} | 146 +- tb/io/io_Debounce_tb.vhdl | 86 +- .../uart/{uart_rx_tb.vhdl => uart_RX_tb.vhdl} | 94 +- tb/mem/lut/lut_Sine_tb.vhdl | 126 +- tb/mem/mem_model.vhdl | 48 +- ...l => ocram_EnhancedSimpleDualPort_tb.vhdl} | 168 +- ...p_tb.vhdl => ocram_SimpleDualPort_tb.vhdl} | 162 +- ...b.vhdl => ocram_SimpleDualPort_wf_tb.vhdl} | 114 +- ...am_sp_tb.vhdl => ocram_SinglePort_tb.vhdl} | 58 +- ...tdp_tb.vhdl => ocram_TrueDualPort_tb.vhdl} | 336 ++-- ..._tb.vhdl => ocram_TrueDualPort_wf_tb.vhdl} | 262 ++-- tb/misc/clock/clock_HighResolution_load.vhdl | 37 +- tb/misc/clock/clock_HighResolution_tc.vhdl | 10 +- tb/misc/clock/clock_HighResolution_th.vhdl | 22 +- tb/misc/gearbox/gearbox_Down_cc_tb.vhdl | 227 +++ tb/misc/gearbox/gearbox_Down_dc_tb.vhdl | 169 ++ tb/misc/gearbox/gearbox_Up_cc_tb.vhdl | 225 +++ tb/misc/gearbox/gearbox_Up_dc_tb.vhdl | 182 +++ tb/misc/gearbox/gearbox_down_cc_tb.vhdl | 227 --- tb/misc/gearbox/gearbox_down_dc_tb.vhdl | 169 -- tb/misc/gearbox/gearbox_up_cc_tb.vhdl | 225 --- tb/misc/gearbox/gearbox_up_dc_tb.vhdl | 182 --- tb/misc/misc_bit_lz_tb.vhdl | 244 +-- tb/misc/stat/stat_Average_tb.vhdl | 124 +- tb/misc/stat/stat_Histogram_tb.vhdl | 134 +- tb/misc/stat/stat_Maximum_tb.vhdl | 152 +- tb/misc/stat/stat_Minimum_tb.vhdl | 152 +- tb/sim/sim_ClockGenerator_tb.vhdl | 337 ---- tb/sim/sim_VCDParser_tb.vhdl | 78 +- tb/sim/sim_Waveform_tb.vhdl | 132 -- ...=> sort_LeastRecentlyUsed_Cache_cocotb.py} | 0 tb/sort/sort_LeastRecentlyUsed_Cache_tb.vhdl | 130 ++ ... => sort_LeastRecentlyUsed_List_cocotb.py} | 0 tb/sort/sort_lru_cache_tb.vhdl | 130 -- tb/sort/sortnet/sortnet_BitonicSort_tb.vhdl | 202 +-- .../sortnet/sortnet_OddEvenMergeSort_tb.vhdl | 204 +-- tb/sort/sortnet/sortnet_OddEvenSort_tb.vhdl | 202 +-- .../sortnet/sortnet_Stream_Adapter2_tb.vhdl | 210 +-- .../sortnet/sortnet_Stream_Adapter_tb.vhdl | 170 +- tb/sort/sortnet/sortnet_tb.pkg.vhdl | 46 +- tb/sync/Bits/sync_Bits_Simple.vhdl | 2 +- tb/sync/Bits/sync_Bits_TestController.vhdl | 2 +- tb/sync/Bits/sync_Bits_TestHarness.vhdl | 2 +- tb/sync/Command/sync_Command_Simple.vhdl | 2 +- .../Command/sync_Command_TestController.vhdl | 2 +- tb/sync/Command/sync_Command_TestHarness.vhdl | 2 +- tb/sync/Reset/sync_Reset_Simple.vhdl | 2 +- tb/sync/Reset/sync_Reset_TestController.vhdl | 2 +- tb/sync/Reset/sync_Reset_TestHarness.vhdl | 2 +- tb/sync/Strobe/sync_Strobe_Simple.vhdl | 2 +- .../Strobe/sync_Strobe_TestController.vhdl | 2 +- tb/sync/Strobe/sync_Strobe_TestHarness.vhdl | 2 +- tb/sync/Vector/sync_Vector_Simple.vhdl | 2 +- .../Vector/sync_Vector_TestController.vhdl | 2 +- tb/sync/Vector/sync_Vector_TestHarness.vhdl | 2 +- tcl/README.md | 15 - tcl/common/utils.tcl | 53 - tcl/vivado/utils.tcl | 40 - tools/GitLab-CI/config.private.ini | 146 -- tools/GitLab-CI/ghdl.setup.sh | 87 - tools/GitLab-CI/grc.setup.sh | 68 - tools/GitLab-CI/modelsim.ini | 2 - tools/GitLab-CI/my_project.vhdl | 47 - tools/GitLab-CI/poc.run.sh | 64 - tools/GitLab-CI/poc.setup.sh | 53 - tools/GitLab-CI/requirements.txt | 1 - tools/README.md | 4 +- .../postWriteBitstream_ExportXSA.tcl.template | 1 + .../preSynth_GitVersionRegister_Vivado.tcl | 7 +- tools/git/build_md.py | 64 - tools/git/filters/normalize.pl | 142 -- tools/git/hooks/pre-commit.d/whitespace.sh | 30 - tools/git/hooks/run-hook.sh | 36 - tools/{OSVVM => }/poc.tcl | 152 +- ucf/arith/{arith_trng.xdc => arith_TRNG.xdc} | 0 vhdl_coding.md | 6 +- 1046 files changed, 41356 insertions(+), 42715 deletions(-) delete mode 100644 .pyIPCMI/Hooks/README.md delete mode 100644 .pyIPCMI/config.boards.ini delete mode 100644 .pyIPCMI/config.defaults.ini delete mode 100644 .pyIPCMI/config.entity.ini delete mode 100644 .pyIPCMI/config.structure.ini create mode 100644 PoC.pro rename docs/IPCores/arith/{arith_addw.rst => arith_Adder_Wide.rst} (63%) rename docs/IPCores/arith/{arith_carrychain_inc.rst => arith_CarryChain_inc.rst} (50%) create mode 100644 docs/IPCores/arith/arith_Convert_Binary2BCD.rst rename docs/IPCores/arith/{arith_counter_bcd.rst => arith_Counter_BCD.rst} (63%) rename docs/IPCores/arith/{arith_counter_free.rst => arith_Counter_Free.rst} (62%) create mode 100644 docs/IPCores/arith/arith_Counter_Gray.rst rename docs/IPCores/arith/{arith_counter_ring.rst => arith_Counter_Ring.rst} (56%) rename docs/IPCores/arith/{arith_div.rst => arith_Divider.rst} (60%) rename docs/IPCores/arith/{arith_firstone.rst => arith_FirstOne.rst} (70%) rename docs/IPCores/arith/{arith_prng.rst => arith_PRNG.rst} (64%) rename docs/IPCores/arith/{arith_prefix_and.rst => arith_Prefix_And.rst} (54%) rename docs/IPCores/arith/{arith_prefix_or.rst => arith_Prefix_Or.rst} (54%) rename docs/IPCores/arith/{arith_same.rst => arith_Same.rst} (66%) rename docs/IPCores/arith/{arith_scaler.rst => arith_Scaler.rst} (73%) rename docs/IPCores/arith/{arith_shifter_barrel.rst => arith_Shifter_Barrel.rst} (55%) create mode 100644 docs/IPCores/arith/arith_SquareRoot.rst delete mode 100644 docs/IPCores/arith/arith_convert_bin2bcd.rst delete mode 100644 docs/IPCores/arith/arith_counter_gray.rst delete mode 100644 docs/IPCores/arith/arith_sqrt.rst rename docs/IPCores/bus/axi4/{axi4_to_AXI4Lite.rst => axi4_AXI4Lite_Converter.rst} (71%) rename docs/IPCores/bus/axi4/{axi4_FIFO_cdc.rst => axi4_FIFO_CDC.rst} (79%) rename docs/IPCores/bus/axi4lite/{axi4lite_FIFO_cdc.rst => axi4lite_FIFO_CDC.rst} (77%) rename docs/IPCores/bus/axi4stream/{axi4stream_FIFO_cdc.rst => axi4stream_FIFO_CDC.rst} (71%) rename docs/IPCores/cache/{cache_cpu.rst => cache_CPU.rst} (91%) rename docs/IPCores/cache/{cache_mem.rst => cache_Memory.rst} (88%) rename docs/IPCores/cache/{cache_par.rst => cache_Parallel.rst} (83%) rename docs/IPCores/cache/{cache_par2.rst => cache_Parallel2.rst} (89%) rename docs/IPCores/cache/{cache_tagunit_par.rst => cache_TagUnit_Parallel.rst} (87%) create mode 100644 docs/IPCores/cache/cache_TagUnit_Sequential.rst delete mode 100644 docs/IPCores/cache/cache_tagunit_seq.rst create mode 100644 docs/IPCores/comm/remote/remote_TerminalControl.rst delete mode 100644 docs/IPCores/comm/remote/remote_terminal_control.rst rename docs/IPCores/dstruct/{dstruct_deque.rst => dstruct_DoubleEndedQueue.rst} (50%) rename docs/IPCores/dstruct/{dstruct_stack.rst => dstruct_Stack.rst} (51%) rename docs/IPCores/io/ddrio/{ddrio_in.rst => ddrio_In.rst} (79%) rename docs/IPCores/io/ddrio/{ddrio_inout.rst => ddrio_InOut.rst} (84%) rename docs/IPCores/io/ddrio/{ddrio_out.rst => ddrio_Out.rst} (80%) rename docs/IPCores/io/uart/{uart_bclk.rst => uart_BitClock.rst} (54%) create mode 100644 docs/IPCores/io/uart/uart_FT245.rst rename docs/IPCores/io/uart/{uart_rx.rst => uart_RX.rst} (55%) rename docs/IPCores/io/uart/{uart_tx.rst => uart_TX.rst} (55%) delete mode 100644 docs/IPCores/io/uart/uart_ft245.rst rename docs/IPCores/mem/ocram/{ocram_esdp.rst => ocram_EnhancedSimpleDualPort.rst} (71%) rename docs/IPCores/mem/ocram/{ocram_sdp.rst => ocram_SimpleDualPort.rst} (66%) rename docs/IPCores/mem/ocram/{ocram_sdp_wf.rst => ocram_SimpleDualPort_wf.rst} (62%) rename docs/IPCores/mem/ocram/{ocram_sp.rst => ocram_SinglePort.rst} (67%) rename docs/IPCores/mem/ocram/{ocram_tdp.rst => ocram_TrueDualPort.rst} (73%) rename docs/IPCores/mem/ocram/{ocram_tdp_sim.rst => ocram_TrueDualPort_sim.rst} (53%) rename docs/IPCores/mem/ocram/{ocram_tdp_wf.rst => ocram_TrueDualPort_wf.rst} (72%) rename docs/IPCores/mem/ocrom/{ocrom_dp.rst => ocrom_DualPort.rst} (59%) create mode 100644 docs/IPCores/mem/ocrom/ocrom_SinglePort.rst delete mode 100644 docs/IPCores/mem/ocrom/ocrom_sp.rst create mode 100644 docs/IPCores/misc/filter/filter_And.rst create mode 100644 docs/IPCores/misc/filter/filter_Mean.rst create mode 100644 docs/IPCores/misc/filter/filter_Or.rst delete mode 100644 docs/IPCores/misc/filter/filter_and.rst delete mode 100644 docs/IPCores/misc/filter/filter_mean.rst delete mode 100644 docs/IPCores/misc/filter/filter_or.rst rename docs/IPCores/misc/gearbox/{gearbox_down_cc.rst => gearbox_Down_cc.rst} (61%) rename docs/IPCores/misc/gearbox/{gearbox_down_dc.rst => gearbox_Down_dc.rst} (66%) rename docs/IPCores/misc/gearbox/{gearbox_up_cc.rst => gearbox_Up_cc.rst} (61%) rename docs/IPCores/misc/gearbox/{gearbox_up_dc.rst => gearbox_Up_dc.rst} (67%) rename docs/IPCores/sort/{sort_lru_cache.rst => sort_LeastRecentlyUsed_Cache.rst} (59%) rename docs/IPCores/sort/{sort_lru_list.rst => sort_LeastRecentlyUsed_List.rst} (63%) rename docs/IPCores/xil/reconfig/{reconfig_icap_fsm.rst => reconfig_ICAP_FSM.rst} (51%) rename docs/IPCores/xil/reconfig/{reconfig_icap_wrapper.rst => reconfig_ICAP_Wrapper.rst} (51%) rename docs/_static/images/ghdl/{arith_prng_tb.posh.png => arith_PRNG_tb.posh.png} (100%) rename docs/_static/images/gtkwave/{arith_prng_tb.png => arith_PRNG_tb.png} (100%) rename docs/_static/images/xst/{arith_prng.posh.png => arith_PRNG.posh.png} (100%) delete mode 100644 poc.ps1 delete mode 100755 poc.sh delete mode 100644 py/.idea/.name delete mode 100644 py/.idea/codeStyleSettings.xml delete mode 100644 py/.idea/codeStyles/codeStyleConfig.xml delete mode 100644 py/.idea/encodings.xml delete mode 100644 py/.idea/inspectionProfiles/Project_Default.xml delete mode 100644 py/.idea/markdown-exported-files.xml delete mode 100644 py/.idea/markdown-navigator.xml delete mode 100644 py/.idea/markdown-navigator/profiles_settings.xml delete mode 100644 py/.idea/misc.xml delete mode 100644 py/.idea/modules.xml delete mode 100644 py/.idea/py.iml delete mode 100644 py/.idea/runConfigurations/__dryrun_ghdl_PoC_arith_prng.xml delete mode 100644 py/.idea/runConfigurations/__dryrun_isim_PoC_arith_prng.xml delete mode 100644 py/.idea/runConfigurations/__dryrun_rpro_PoC_arith_prng.xml delete mode 100644 py/.idea/runConfigurations/__dryrun_xsim_PoC_arith_prng.xml delete mode 100644 py/.idea/runConfigurations/asim_PoC_arith_prng.xml delete mode 100644 py/.idea/runConfigurations/configure.xml delete mode 100644 py/.idea/runConfigurations/configure___set_default_tools.xml delete mode 100644 py/.idea/runConfigurations/configure_altera.xml delete mode 100644 py/.idea/runConfigurations/configure_ghdl.xml delete mode 100644 py/.idea/runConfigurations/configure_git.xml delete mode 100644 py/.idea/runConfigurations/configure_intel.xml delete mode 100644 py/.idea/runConfigurations/configure_lattice.xml delete mode 100644 py/.idea/runConfigurations/configure_mentor_modelsim.xml delete mode 100644 py/.idea/runConfigurations/coregen_PoC_xil_mig_Atlys_1x128.xml delete mode 100644 py/.idea/runConfigurations/ghdl_PoC_arith_prng.xml delete mode 100644 py/.idea/runConfigurations/isim_PoC_arith_prng.xml delete mode 100644 py/.idea/runConfigurations/list_netlist_PoC__.xml delete mode 100644 py/.idea/runConfigurations/list_testbench_PoC__.xml delete mode 100644 py/.idea/runConfigurations/list_testbench_PoC_sort_____kind_cocotb.xml delete mode 100644 py/.idea/runConfigurations/lse_PoC_arith_prng.xml delete mode 100644 py/.idea/runConfigurations/quartus_PoC_arith_prng.xml delete mode 100644 py/.idea/runConfigurations/query_Xilinx_ISE_SettingsFile.xml delete mode 100644 py/.idea/runConfigurations/rpro_PoC_arith_prng.xml delete mode 100644 py/.idea/runConfigurations/vsim_PoC_arith_prng.xml delete mode 100644 py/.idea/runConfigurations/xsim_PoC_arith_prng___std_08.xml delete mode 100644 py/.idea/runConfigurations/xst_PoC_cache_par.xml delete mode 100644 py/.idea/vcs.xml delete mode 100644 py/.idea/workspace.xml create mode 100644 rename_strings.sh delete mode 100644 sim/README.md delete mode 100644 sim/aSim.batch.tcl delete mode 100644 sim/aSim.gui.tcl delete mode 100644 sim/arith/arith_addw_tb.gtkw delete mode 100644 sim/arith/arith_addw_tb.wcfg delete mode 100644 sim/arith/arith_convert_bin2bcd_tb.ghdl delete mode 100644 sim/arith/arith_convert_bin2bcd_tb.gtkw delete mode 100644 sim/arith/arith_convert_bin2bcd_tb.wcfg delete mode 100644 sim/arith/arith_convert_bin2bcd_tb.wdo delete mode 100644 sim/arith/arith_counter_gray_tb.wcfg delete mode 100644 sim/arith/arith_prefix_and_tb.ghdl delete mode 100644 sim/arith/arith_prefix_and_tb.gtkw delete mode 100644 sim/arith/arith_prefix_or_tb.ghdl delete mode 100644 sim/arith/arith_prefix_or_tb.gtkw delete mode 100644 sim/arith/arith_prng_tb.ghdl delete mode 100644 sim/arith/arith_prng_tb.gtkw delete mode 100644 sim/arith/arith_prng_tb.wcfg delete mode 100644 sim/arith/arith_prng_tb.wdo delete mode 100644 sim/dstruct/dstruct_deque_tb.ghdl delete mode 100644 sim/dstruct/dstruct_deque_tb.gtkw delete mode 100644 sim/dstruct/dstruct_stack_tb.ghdl delete mode 100644 sim/dstruct/dstruct_stack_tb.gtkw delete mode 100644 sim/iSim.batch.tcl delete mode 100644 sim/iSim.gui.tcl delete mode 100644 sim/io/uart/uart_rx_tb.ghdl delete mode 100644 sim/io/uart/uart_rx_tb.gtkw delete mode 100644 sim/io/uart/uart_rx_tb.wcfg delete mode 100644 sim/mem/lut/lut_Sine_tb.ghdl delete mode 100644 sim/mem/lut/lut_Sine_tb.gtkw delete mode 100644 sim/mem/lut/lut_Sine_tb.wcfg delete mode 100644 sim/mem/lut/lut_Sine_tb.wdo delete mode 100644 sim/mem/ocram/ocram_sdp_tb.ghdl delete mode 100644 sim/mem/ocram/ocram_sdp_tb.gtkw delete mode 100644 sim/misc/gearbox/gearbox_down_cc_tb.ghdl delete mode 100644 sim/misc/gearbox/gearbox_down_cc_tb.gtkw delete mode 100644 sim/misc/gearbox/gearbox_down_cc_tb.wdo delete mode 100644 sim/misc/gearbox/gearbox_down_dc_tb.ghdl delete mode 100644 sim/misc/gearbox/gearbox_down_dc_tb.gtkw delete mode 100644 sim/misc/gearbox/gearbox_down_dc_tb.wdo delete mode 100644 sim/misc/gearbox/gearbox_up_cc_tb.ghdl delete mode 100644 sim/misc/gearbox/gearbox_up_cc_tb.gtkw delete mode 100644 sim/misc/gearbox/gearbox_up_cc_tb.wdo delete mode 100644 sim/misc/gearbox/gearbox_up_dc_tb.ghdl delete mode 100644 sim/misc/gearbox/gearbox_up_dc_tb.gtkw delete mode 100644 sim/misc/gearbox/gearbox_up_dc_tb.wdo delete mode 100644 sim/misc/stat/stat_Maximum_tb.ghdl delete mode 100644 sim/misc/stat/stat_Maximum_tb.gtkw delete mode 100644 sim/misc/stat/stat_Maximum_tb.wcfg delete mode 100644 sim/misc/stat/stat_Minimum_tb.ghdl delete mode 100644 sim/misc/stat/stat_Minimum_tb.gtkw delete mode 100644 sim/misc/stat/stat_Minimum_tb.wcfg delete mode 100644 sim/misc/sync/sync_Bits_tb.ghdl delete mode 100644 sim/misc/sync/sync_Bits_tb.gtkw delete mode 100644 sim/misc/sync/sync_Command_tb.ghdl delete mode 100644 sim/misc/sync/sync_Command_tb.gtkw delete mode 100644 sim/misc/sync/sync_Command_tb.wcfg delete mode 100644 sim/misc/sync/sync_Reset_tb.ghdl delete mode 100644 sim/misc/sync/sync_Reset_tb.gtkw delete mode 100644 sim/misc/sync/sync_Reset_tb.wcfg delete mode 100644 sim/misc/sync/sync_Strobe_tb.ghdl delete mode 100644 sim/misc/sync/sync_Strobe_tb.gtkw delete mode 100644 sim/misc/sync/sync_Strobe_tb.wcfg delete mode 100644 sim/misc/sync/sync_Vector_tb.ghdl delete mode 100644 sim/misc/sync/sync_Vector_tb.gtkw delete mode 100644 sim/misc/sync/sync_Vector_tb.wcfg delete mode 100644 sim/sort/sortnet/sortnet_BitonicSort_tb.ghdl delete mode 100644 sim/sort/sortnet/sortnet_BitonicSort_tb.gtkw delete mode 100644 sim/sort/sortnet/sortnet_BitonicSort_tb.wcfg delete mode 100644 sim/sort/sortnet/sortnet_BitonicSort_tb.wdo delete mode 100644 sim/sort/sortnet/sortnet_OddEvenMergeSort_tb.ghdl delete mode 100644 sim/sort/sortnet/sortnet_OddEvenMergeSort_tb.gtkw delete mode 100644 sim/sort/sortnet/sortnet_OddEvenMergeSort_tb.wdo delete mode 100644 sim/sort/sortnet/sortnet_OddEvenSort_tb.ghdl delete mode 100644 sim/sort/sortnet/sortnet_OddEvenSort_tb.gtkw delete mode 100644 sim/sort/sortnet/sortnet_OddEvenSort_tb.wcfg delete mode 100644 sim/sort/sortnet/sortnet_OddEvenSort_tb.wdo delete mode 100644 sim/sort/sortnet/sortnet_Stream_Adapter2_tb.ghdl delete mode 100644 sim/sort/sortnet/sortnet_Stream_Adapter2_tb.gtkw delete mode 100644 sim/sort/sortnet/sortnet_Stream_Adapter_tb.ghdl delete mode 100644 sim/sort/sortnet/sortnet_Stream_Adapter_tb.gtkw delete mode 100644 sim/vSim.batch.tcl delete mode 100644 sim/vSim.default.wdo delete mode 100644 sim/vSim.gui.tcl delete mode 100644 sim/xSim.batch.tcl delete mode 100644 sim/xSim.gui.tcl create mode 100644 src/arith/arith_Adder_Wide.vhdl rename src/arith/{arith_carrychain_inc.vhdl => arith_CarryChain_inc.vhdl} (62%) rename src/arith/{arith_convert_bin2bcd.vhdl => arith_Convert_Binary2BCD.vhdl} (86%) rename src/arith/{arith_counter_bcd.vhdl => arith_Counter_BCD.vhdl} (55%) rename src/arith/{arith_counter_free.vhdl => arith_Counter_Free.vhdl} (65%) rename src/arith/{arith_counter_gray.vhdl => arith_Counter_Gray.vhdl} (57%) create mode 100644 src/arith/arith_Counter_Ring.vhdl create mode 100644 src/arith/arith_Divider.vhdl create mode 100644 src/arith/arith_FirstOne.vhdl rename src/arith/{arith_prng.vhdl => arith_PRNG.vhdl} (59%) rename src/arith/{arith_prefix_and.vhdl => arith_Prefix_And.vhdl} (62%) rename src/arith/{arith_prefix_or.vhdl => arith_Prefix_Or.vhdl} (62%) rename src/arith/{arith_same.vhdl => arith_Same.vhdl} (68%) rename src/arith/{arith_scaler.vhdl => arith_Scaler.vhdl} (67%) rename src/arith/{arith_shifter_barrel.vhdl => arith_Shifter_Barrel.vhdl} (57%) rename src/arith/{arith_sqrt.vhdl => arith_SquareRoot.vhdl} (56%) rename src/arith/{arith_trng.vhdl => arith_TRNG.vhdl} (68%) delete mode 100644 src/arith/arith_addw.vhdl delete mode 100644 src/arith/arith_counter_ring.vhdl delete mode 100644 src/arith/arith_div.vhdl delete mode 100644 src/arith/arith_firstone.vhdl rename src/arith/{arith.pro => build.pro} (58%) rename src/arith/xilinx/{arith_addw_xilinx.vhdl => arith_Adder_Wide_Xilinx.vhdl} (53%) rename src/arith/xilinx/{arith_carrychain_inc_xilinx.vhdl => arith_CarryChain_inc_Xilinx.vhdl} (57%) rename src/arith/xilinx/{arith_prefix_and_xilinx.vhdl => arith_Prefix_And_Xilinx.vhdl} (53%) rename src/arith/xilinx/{arith_prefix_or_xilinx.vhdl => arith_Prefix_Or_Xilinx.vhdl} (51%) rename src/{PoC.pro => build.pro} (60%) delete mode 100644 src/bus/axi4/AXI4Lite/AXI4Lite_FIFO_cdc.vhdl delete mode 100644 src/bus/axi4/AXI4_FIFO_cdc.vhdl delete mode 100644 src/bus/axi4/axi4.pro rename src/bus/axi4/{AXI4_to_AXI4Lite.vhdl => axi4_AXI4Lite_Converter.vhdl} (74%) rename src/bus/axi4/{AXI4_Common.pkg.vhdl => axi4_Common.pkg.vhdl} (99%) create mode 100644 src/bus/axi4/axi4_DeMux.vhdl rename src/bus/axi4/{AXI4_FIFO.vhdl => axi4_FIFO.vhdl} (60%) create mode 100644 src/bus/axi4/axi4_FIFO_CDC.vhdl rename src/bus/axi4/{AXI4_Full.pkg.vhdl => axi4_Full.pkg.vhdl} (82%) create mode 100644 src/bus/axi4/axi4_Mux.vhdl rename src/bus/axi4/{AXI4_OSVVM.pkg.vhdl => axi4_OSVVM.pkg.vhdl} (98%) create mode 100644 src/bus/axi4/axi4_Sink.vhdl rename src/bus/axi4/{AXI4_Termination_Manager.vhdl => axi4_Termination_Manager.vhdl} (95%) rename src/bus/axi4/{AXI4_Termination_Subordinate.vhdl => axi4_Termination_Subordinate.vhdl} (70%) create mode 100644 src/bus/axi4/build.pro rename src/bus/{axi4/AXI4Lite/AXI4Lite.pkg.vhdl => axi4lite/axi4lite.pkg.vhdl} (73%) create mode 100644 src/bus/axi4lite/axi4lite_DeMux.vhdl rename src/bus/{axi4/AXI4Lite/AXI4Lite_FIFO.vhdl => axi4lite/axi4lite_FIFO.vhdl} (71%) create mode 100644 src/bus/axi4lite/axi4lite_FIFO_CDC.vhdl rename src/bus/{axi4/AXI4Lite/AXI4Lite_GitVersionRegister.vhdl => axi4lite/axi4lite_GitVersionRegister.vhdl} (95%) rename src/bus/{axi4/AXI4Lite/AXI4Lite_HighResolutionClock.vhdl => axi4lite/axi4lite_HighResolutionClock.vhdl} (94%) rename src/bus/{axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter.vhdl => axi4lite/axi4lite_OCRAM_Adapter.vhdl} (89%) rename src/bus/{axi4/AXI4Lite/AXI4Lite_OSVVM.pkg.vhdl => axi4lite/axi4lite_OSVVM.pkg.vhdl} (95%) rename src/bus/{axi4/AXI4Lite/AXI4Lite_Register.vhdl => axi4lite/axi4lite_Register.vhdl} (94%) rename src/bus/{axi4/AXI4Lite/AXI4Lite_Termination_Manager.vhdl => axi4lite/axi4lite_Termination_Manager.vhdl} (88%) rename src/bus/{axi4/AXI4Lite/AXI4Lite_Termination_Subordinate.vhdl => axi4lite/axi4lite_Termination_Subordinate.vhdl} (72%) rename src/bus/{axi4/AXI4Lite/AXI4Lite_UART.vhdl => axi4lite/axi4lite_UART.vhdl} (85%) create mode 100644 src/bus/axi4lite/build.pro rename src/bus/{axi4/AXI4Stream/AXI4Stream.pkg.vhdl => axi4stream/axi4stream.pkg.vhdl} (64%) rename src/bus/{axi4/AXI4Stream/AXI4Stream_DeMux.vhdl => axi4stream/axi4stream_DeMux.vhdl} (88%) rename src/bus/{axi4/AXI4Stream/AXI4Stream_FIFO.vhdl => axi4stream/axi4stream_FIFO.vhdl} (67%) rename src/bus/{axi4/AXI4Stream/AXI4Stream_FIFO_cdc.vhdl => axi4stream/axi4stream_FIFO_CDC.vhdl} (91%) rename src/bus/{axi4/AXI4Stream/AXI4Stream_FIFO_tempgot.vhdl => axi4stream/axi4stream_FIFO_TempGot.vhdl} (62%) rename src/bus/{axi4/AXI4Stream/AXI4Stream_FIFO_tempput.vhdl => axi4stream/axi4stream_FIFO_TempPut.vhdl} (80%) rename src/bus/{axi4/AXI4Stream/AXI4Stream_Mux.vhdl => axi4stream/axi4stream_Mux.vhdl} (96%) create mode 100644 src/bus/axi4stream/axi4stream_Pause.vhdl rename src/bus/{axi4/AXI4Stream/AXI4Stream_Stage.vhdl => axi4stream/axi4stream_Stage.vhdl} (85%) create mode 100644 src/bus/axi4stream/axi4stream_Termination_Receiver.vhdl create mode 100644 src/bus/axi4stream/axi4stream_Termination_Transmitter.vhdl create mode 100644 src/bus/axi4stream/build.pro rename src/bus/{bus.pro => build.pro} (81%) rename src/bus/drp/{DRP_AXI4Lite_Bridge.vhdl => drp_AXI4Lite_Bridge.vhdl} (94%) rename src/bus/stream/{stream.pro => build.pro} (100%) rename src/cache/{cache.pro => build.pro} (80%) rename src/cache/{cache_cpu.vhdl => cache_CPU.vhdl} (74%) rename src/cache/{cache_mem.vhdl => cache_Memory.vhdl} (78%) rename src/cache/{cache_par.vhdl => cache_Parallel.vhdl} (73%) rename src/cache/{cache_par2.vhdl => cache_Parallel2.vhdl} (76%) rename src/cache/{cache_replacement_policy.vhdl => cache_ReplacementPolicy.vhdl} (68%) rename src/cache/{cache_tagunit_par.vhdl => cache_TagUnit_Parallel.vhdl} (78%) rename src/cache/{cache_tagunit_seq.vhdl => cache_TagUnit_Sequential.vhdl} (93%) rename src/comm/{comm.pro => build.pro} (90%) rename src/comm/{comm_crc.vhdl => comm_CRC.vhdl} (64%) rename src/comm/{comm_scramble.vhdl => comm_Scramble.vhdl} (69%) rename src/comm/remote/{remote_terminal_control.vhdl => remote_TerminalControl.vhdl} (92%) rename src/common/{common.pro => build.pro} (98%) delete mode 100644 src/common/debug.vhdl rename src/common/{my_project.vhdl.template => local_configuration.vhdl.template} (58%) rename src/common/{my_config.vhdl.template => project_configuration.vhdl.template} (76%) rename src/dstruct/{dstruct.pro => build.pro} (67%) create mode 100644 src/dstruct/dstruct_DoubleEndedQueue.vhdl create mode 100644 src/dstruct/dstruct_OutOfOrderBuffer.vhdl create mode 100644 src/dstruct/dstruct_Stack.vhdl delete mode 100644 src/dstruct/dstruct_deque.vhdl delete mode 100644 src/dstruct/dstruct_stack.vhdl rename src/fifo/{fifo.pro => build.pro} (96%) rename src/fifo/{fifo_shift.vhdl => fifo_Shift.vhdl} (60%) rename src/fifo/{fifo_stage.vhdl => fifo_Stage.vhdl} (75%) rename src/io/{io.pro => build.pro} (71%) create mode 100644 src/io/ddrio/build.pro rename src/io/ddrio/{ddrio_in.vhdl => ddrio_In.vhdl} (64%) rename src/io/ddrio/{ddrio_inout.vhdl => ddrio_InOut.vhdl} (59%) create mode 100644 src/io/ddrio/ddrio_InOut_Altera.vhdl rename src/io/ddrio/{ddrio_inout_xilinx.vhdl => ddrio_InOut_Xilinx.vhdl} (50%) rename src/io/ddrio/{ddrio_in_altera.vhdl => ddrio_In_Altera.vhdl} (59%) rename src/io/ddrio/{ddrio_in_xilinx.vhdl => ddrio_In_Xilinx.vhdl} (53%) rename src/io/ddrio/{ddrio_out.vhdl => ddrio_Out.vhdl} (61%) rename src/io/ddrio/{ddrio_out_altera.vhdl => ddrio_Out_Altera.vhdl} (57%) rename src/io/ddrio/{ddrio_out_xilinx.vhdl => ddrio_Out_Xilinx.vhdl} (56%) delete mode 100644 src/io/ddrio/ddrio_inout_altera.vhdl rename src/io/iic/{iic.pro => build.pro} (100%) delete mode 100644 src/io/spi/spi.pro rename src/io/uart/{uart.pro => build.pro} (86%) create mode 100644 src/io/uart/uart_BitClock.vhdl rename src/io/uart/{uart_fifo.vhdl => uart_FIFO.vhdl} (78%) create mode 100644 src/io/uart/uart_FT245.vhdl rename src/io/uart/{uart_rx.vhdl => uart_RX.vhdl} (66%) rename src/io/uart/{uart_tx.vhdl => uart_TX.vhdl} (70%) delete mode 100644 src/io/uart/uart_bclk.vhdl delete mode 100644 src/io/uart/uart_ft245.vhdl rename src/list/{list_expire.vhdl => list_Expire.vhdl} (82%) rename src/mem/{mem.pro => build.pro} (75%) create mode 100644 src/mem/ocram/altera/ocram_SimplePort_Altera.vhdl create mode 100644 src/mem/ocram/altera/ocram_TrueDualPort_Altera.vhdl delete mode 100644 src/mem/ocram/altera/ocram_sp_altera.vhdl delete mode 100644 src/mem/ocram/altera/ocram_tdp_altera.vhdl create mode 100644 src/mem/ocram/ocram_EnhancedSimpleDualPort.vhdl create mode 100644 src/mem/ocram/ocram_SimpleDualPort.vhdl create mode 100644 src/mem/ocram/ocram_SimpleDualPort_Optimized.vhdl rename src/mem/ocram/{ocram_sdp_wf.vhdl => ocram_SimpleDualPort_WriteFirst.vhdl} (53%) create mode 100644 src/mem/ocram/ocram_SinglePort.vhdl create mode 100644 src/mem/ocram/ocram_TrueDualPort.vhdl rename src/mem/ocram/{ocram_tdp_sim.vhdl => ocram_TrueDualPort_Simulation.vhdl} (54%) rename src/mem/ocram/{ocram_tdp_wf.vhdl => ocram_TrueDualPort_WriteFirst.vhdl} (54%) delete mode 100644 src/mem/ocram/ocram_esdp.vhdl delete mode 100644 src/mem/ocram/ocram_sdp.vhdl delete mode 100644 src/mem/ocram/ocram_sdp_optimized.vhdl delete mode 100644 src/mem/ocram/ocram_sp.vhdl delete mode 100644 src/mem/ocram/ocram_tdp.vhdl create mode 100644 src/mem/ocrom/ocrom_DualPort.vhdl create mode 100644 src/mem/ocrom/ocrom_SinglePort.vhdl delete mode 100644 src/mem/ocrom/ocrom_dp.vhdl delete mode 100644 src/mem/ocrom/ocrom_sp.vhdl rename src/misc/{misc.pro => build.pro} (94%) create mode 100644 src/misc/filter/build.pro delete mode 100644 src/misc/filter/filter.pro rename src/misc/filter/{filter_and.vhdl => filter_And.vhdl} (52%) rename src/misc/filter/{filter_mean.vhdl => filter_Mean.vhdl} (55%) rename src/misc/filter/{filter_or.vhdl => filter_Or.vhdl} (52%) rename src/misc/gearbox/{gearbox.pro => build.pro} (83%) create mode 100644 src/misc/gearbox/gearbox_Down_cc.vhdl create mode 100644 src/misc/gearbox/gearbox_Down_dc.vhdl create mode 100644 src/misc/gearbox/gearbox_Up_cc.vhdl create mode 100644 src/misc/gearbox/gearbox_Up_dc.vhdl delete mode 100644 src/misc/gearbox/gearbox_down_cc.vhdl delete mode 100644 src/misc/gearbox/gearbox_down_dc.vhdl delete mode 100644 src/misc/gearbox/gearbox_up_cc.vhdl delete mode 100644 src/misc/gearbox/gearbox_up_dc.vhdl rename src/misc/stat/{stat.pro => build.pro} (90%) rename src/net/arp/{arp.pro => build.pro} (100%) rename src/net/{net.pro => build.pro} (86%) rename src/net/icmpv4/{icmpv4.pro => build.pro} (100%) rename src/net/ipv4/{ipv4.pro => build.pro} (100%) rename src/net/ipv6/{ipv6.pro => build.pro} (100%) rename src/net/mac/{mac.pro => build.pro} (100%) rename src/net/udp/{udp.pro => build.pro} (100%) rename src/sim/{sim.pro => build.pro} (100%) rename src/sort/{sort.pro => build.pro} (89%) rename src/sort/{sort_lru_cache.vhdl => sort_LeastRecentlyUsed_Cache.vhdl} (58%) create mode 100644 src/sort/sort_LeastRecentlyUsed_List.vhdl delete mode 100644 src/sort/sort_lru_list.vhdl rename src/sort/sortnet/{sortnet.pro => build.pro} (100%) rename src/sync/{sync.pro => build.pro} (98%) rename src/xil/{xil.pro => build.pro} (75%) rename src/xil/reconfig/{reconfig_icap_fsm.vhdl => reconfig_ICAP_FSM.vhdl} (57%) create mode 100644 src/xil/reconfig/reconfig_ICAP_Wrapper.vhdl delete mode 100644 src/xil/reconfig/reconfig_icap_wrapper.vhdl create mode 100644 tb/arith/Adder_Wide/RunAllTests.pro create mode 100644 tb/arith/Adder_Wide/arith_Adder_Wide_Simple.vhdl rename tb/arith/{addw/arith_addw_TestController.vhdl => Adder_Wide/arith_Adder_Wide_TestController.vhdl} (67%) rename tb/arith/{addw/arith_addw_TestController_pkg.vhdl => Adder_Wide/arith_Adder_Wide_TestController_pkg.vhdl} (64%) create mode 100644 tb/arith/Adder_Wide/arith_Adder_Wide_TestHarness.vhdl rename tb/arith/{carrychain_inc => CarryChain_inc}/RunAllTests.pro (81%) rename tb/arith/{carrychain_inc/arith_carrychain_inc_Simple.vhdl => CarryChain_inc/arith_CarryChain_inc_Simple.vhdl} (87%) rename tb/arith/{carrychain_inc/arith_carrychain_inc_TestController.vhdl => CarryChain_inc/arith_CarryChain_inc_TestController.vhdl} (82%) rename tb/arith/{carrychain_inc/arith_carrychain_inc_TestHarness.vhdl => CarryChain_inc/arith_CarryChain_inc_TestHarness.vhdl} (81%) rename tb/arith/{convert_bin2bcd => Convert_Binary2BCD}/RunAllTests.pro (79%) create mode 100644 tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_Simple.vhdl rename tb/arith/{convert_bin2bcd/arith_convert_bin2bcd_TestController.vhdl => Convert_Binary2BCD/arith_Convert_Binary2BCD_TestController.vhdl} (56%) create mode 100644 tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_TestHarness.vhdl rename tb/arith/{counter_bcd => Counter_BCD}/RunAllTests.pro (82%) create mode 100644 tb/arith/Counter_BCD/arith_Counter_BCD_Simple.vhdl rename tb/arith/{counter_bcd/arith_counter_bcd_TestController.vhdl => Counter_BCD/arith_Counter_BCD_TestController.vhdl} (68%) create mode 100644 tb/arith/Counter_BCD/arith_Counter_BCD_TestHarness.vhdl rename tb/arith/{counter_ring => Counter_Free}/RunAllTests.pro (82%) rename tb/arith/{counter_free/arith_counter_free_Simple.vhdl => Counter_Free/arith_Counter_Free_Simple.vhdl} (87%) rename tb/arith/{counter_free/arith_counter_free_TestController.vhdl => Counter_Free/arith_Counter_Free_TestController.vhdl} (82%) rename tb/arith/{counter_free/arith_counter_free_TestHarness.vhdl => Counter_Free/arith_Counter_Free_TestHarness.vhdl} (79%) rename tb/arith/{counter_gray => Counter_Gray}/RunAllTests.pro (82%) rename tb/arith/{counter_gray/arith_counter_gray_Simple.vhdl => Counter_Gray/arith_Counter_Gray_Simple.vhdl} (89%) rename tb/arith/{counter_gray/arith_counter_gray_TestController.vhdl => Counter_Gray/arith_Counter_Gray_TestController.vhdl} (83%) rename tb/arith/{counter_gray/arith_counter_gray_TestHarness.vhdl => Counter_Gray/arith_Counter_Gray_TestHarness.vhdl} (80%) rename tb/arith/{counter_free => Counter_Ring}/RunAllTests.pro (82%) rename tb/arith/{counter_ring/arith_counter_ring_Simple.vhdl => Counter_Ring/arith_Counter_Ring_Simple.vhdl} (90%) rename tb/arith/{counter_ring/arith_counter_ring_TestController.vhdl => Counter_Ring/arith_Counter_Ring_TestController.vhdl} (82%) rename tb/arith/{counter_ring/arith_counter_ring_TestHarness.vhdl => Counter_Ring/arith_Counter_Ring_TestHarness.vhdl} (81%) rename tb/arith/{div => Divider}/RunAllTests.pro (84%) create mode 100644 tb/arith/Divider/arith_Divider_Simple.vhdl rename tb/arith/{div/arith_div_TestController.vhdl => Divider/arith_Divider_TestController.vhdl} (71%) create mode 100644 tb/arith/Divider/arith_Divider_TestHarness.vhdl rename tb/arith/{firstone => FirstOne}/RunAllTests.pro (83%) create mode 100644 tb/arith/FirstOne/arith_FirstOne_Simple.vhdl rename tb/arith/{firstone/arith_firstone_TestController.vhdl => FirstOne/arith_FirstOne_TestController.vhdl} (66%) create mode 100644 tb/arith/FirstOne/arith_FirstOne_TestHarness.vhdl rename tb/arith/{prng => PRNG}/RunAllTests.pro (57%) rename tb/arith/{prng/arith_prng_Simple.vhdl => PRNG/arith_PRNG_Simple.vhdl} (89%) rename tb/arith/{prng/arith_prng_TestController.vhdl => PRNG/arith_PRNG_TestController.vhdl} (87%) rename tb/arith/{prng/arith_prng_TestHarness.vhdl => PRNG/arith_PRNG_TestHarness.vhdl} (85%) rename tb/arith/{prefix_and => Prefix_And}/RunAllTests.pro (80%) create mode 100644 tb/arith/Prefix_And/arith_Prefix_And_Exhaustive.vhdl create mode 100644 tb/arith/Prefix_And/arith_Prefix_And_Simple.vhdl rename tb/arith/{prefix_and/arith_prefix_and_TestController.vhdl => Prefix_And/arith_Prefix_And_TestController.vhdl} (75%) create mode 100644 tb/arith/Prefix_And/arith_Prefix_And_TestHarness.vhdl rename tb/arith/{prefix_or => Prefix_Or}/RunAllTests.pro (80%) rename tb/arith/{prefix_or/arith_prefix_or_Exhaustive.vhdl => Prefix_Or/arith_Prefix_Or_Exhaustive.vhdl} (87%) create mode 100644 tb/arith/Prefix_Or/arith_Prefix_Or_Simple.vhdl rename tb/arith/{prefix_or/arith_prefix_or_TestController.vhdl => Prefix_Or/arith_Prefix_Or_TestController.vhdl} (87%) rename tb/arith/{prefix_or/arith_prefix_or_TestHarness.vhdl => Prefix_Or/arith_Prefix_Or_TestHarness.vhdl} (83%) rename tb/arith/{same => Same}/RunAllTests.pro (85%) rename tb/arith/{same/arith_same_Simple.vhdl => Same/arith_Same_Simple.vhdl} (88%) rename tb/arith/{same/arith_same_TestController.vhdl => Same/arith_Same_TestController.vhdl} (84%) rename tb/arith/{same/arith_same_TestHarness.vhdl => Same/arith_Same_TestHarness.vhdl} (84%) rename tb/arith/{scaler => Scaler}/RunAllTests.pro (84%) create mode 100644 tb/arith/Scaler/arith_Scaler_Simple.vhdl rename tb/arith/{scaler/arith_scaler_TestController.vhdl => Scaler/arith_Scaler_TestController.vhdl} (60%) create mode 100644 tb/arith/Scaler/arith_Scaler_TestHarness.vhdl rename tb/arith/{addw => Shifter_Barrel}/RunAllTests.pro (81%) rename tb/arith/{shifter_barrel/arith_shifter_barrel_Simple.vhdl => Shifter_Barrel/arith_Shifter_Barrel_Simple.vhdl} (90%) rename tb/arith/{shifter_barrel/arith_shifter_barrel_TestController.vhdl => Shifter_Barrel/arith_Shifter_Barrel_TestController.vhdl} (84%) rename tb/arith/{shifter_barrel/arith_shifter_barrel_TestHarness.vhdl => Shifter_Barrel/arith_Shifter_Barrel_TestHarness.vhdl} (86%) rename tb/arith/{sqrt => SquareRoot}/RunAllTests.pro (82%) rename tb/arith/{sqrt/arith_sqrt_Simple.vhdl => SquareRoot/arith_SquareRoot_Simple.vhdl} (87%) rename tb/arith/{sqrt/arith_sqrt_TestController.vhdl => SquareRoot/arith_SquareRoot_TestController.vhdl} (83%) rename tb/arith/{sqrt/arith_sqrt_TestHarness.vhdl => SquareRoot/arith_SquareRoot_TestHarness.vhdl} (79%) rename tb/arith/{trng => TRNG}/RunAllTests.pro (85%) rename tb/arith/{trng/arith_trng_Simple.vhdl => TRNG/arith_TRNG_Simple.vhdl} (89%) rename tb/arith/{trng/arith_trng_TestController.vhdl => TRNG/arith_TRNG_TestController.vhdl} (83%) rename tb/arith/{trng/arith_trng_TestHarness.vhdl => TRNG/arith_TRNG_TestHarness.vhdl} (82%) delete mode 100644 tb/arith/addw/arith_addw_Simple.vhdl delete mode 100644 tb/arith/addw/arith_addw_TestHarness.vhdl delete mode 100644 tb/arith/convert_bin2bcd/arith_convert_bin2bcd_Simple.vhdl delete mode 100644 tb/arith/convert_bin2bcd/arith_convert_bin2bcd_TestHarness.vhdl delete mode 100644 tb/arith/counter_bcd/arith_counter_bcd_Simple.vhdl delete mode 100644 tb/arith/counter_bcd/arith_counter_bcd_TestHarness.vhdl delete mode 100644 tb/arith/div/arith_div_Simple.vhdl delete mode 100644 tb/arith/div/arith_div_TestHarness.vhdl delete mode 100644 tb/arith/firstone/arith_firstone_Simple.vhdl delete mode 100644 tb/arith/firstone/arith_firstone_TestHarness.vhdl delete mode 100644 tb/arith/prefix_and/arith_prefix_and_Exhaustive.vhdl delete mode 100644 tb/arith/prefix_and/arith_prefix_and_Simple.vhdl delete mode 100644 tb/arith/prefix_and/arith_prefix_and_TestHarness.vhdl delete mode 100644 tb/arith/prefix_or/arith_prefix_or_Simple.vhdl delete mode 100644 tb/arith/scaler/arith_scaler_Simple.vhdl delete mode 100644 tb/arith/scaler/arith_scaler_TestHarness.vhdl delete mode 100644 tb/arith/shifter_barrel/RunAllTests.pro delete mode 100644 tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/AXI4Lite_OCRAM_Adapter_TestController.vhdl delete mode 100644 tb/bus/axi4/AXI4Lite/RunAllTests.pro create mode 100644 tb/bus/axi4/DeMux/RunAllTests.pro create mode 100644 tb/bus/axi4/DeMux/TC_SimpleReadWrite.tcl create mode 100644 tb/bus/axi4/DeMux/TC_SimpleReadWrite.vhdl create mode 100644 tb/bus/axi4/DeMux/TC_SimpleReadWrite_delay.tcl create mode 100644 tb/bus/axi4/DeMux/TC_SimpleReadWrite_delay.vhdl create mode 100644 tb/bus/axi4/DeMux/TC_SimpleReadWrite_multiID.vhdl create mode 100644 tb/bus/axi4/DeMux/TC_SimpleReadWrite_multiID_randDelay.vhdl create mode 100644 tb/bus/axi4/DeMux/axi4_DeMux_TestController.vhdl create mode 100644 tb/bus/axi4/DeMux/axi4_DeMux_TestHarness.vhdl create mode 100644 tb/bus/axi4/Mux/RunAllTests.pro create mode 100644 tb/bus/axi4/Mux/TC_SimpleReadWrite.tcl create mode 100644 tb/bus/axi4/Mux/TC_SimpleReadWrite.vhdl create mode 100644 tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID.vhdl create mode 100644 tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID_randDelay.tcl create mode 100644 tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID_randDelay.vhdl create mode 100644 tb/bus/axi4/Mux/axi4_Mux_TestController.vhdl create mode 100644 tb/bus/axi4/Mux/axi4_Mux_TestHarness.vhdl rename tb/bus/{axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter => axi4lite/Demux}/RunAllTests.pro (74%) create mode 100644 tb/bus/axi4lite/Demux/TC_SimpleReadWrite.tcl create mode 100644 tb/bus/axi4lite/Demux/TC_SimpleReadWrite.vhdl create mode 100644 tb/bus/axi4lite/Demux/TC_SimpleReadWrite_02.tcl create mode 100644 tb/bus/axi4lite/Demux/TC_SimpleReadWrite_02.vhdl create mode 100644 tb/bus/axi4lite/Demux/axi4lite_Demux_TestController.vhdl create mode 100644 tb/bus/axi4lite/Demux/axi4lite_Demux_TestHarness.vhdl rename tb/bus/{axi4/AXI4Lite/AXI4Lite_HighResolutionClock => axi4lite/HighResolutionClock}/RunAllTests.pro (95%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_HighResolutionClock => axi4lite/HighResolutionClock}/axi4lite_HighResolutionClock_correction.tcl (100%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_HighResolutionClock => axi4lite/HighResolutionClock}/axi4lite_HighResolutionClock_correction.vhdl (97%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_HighResolutionClock => axi4lite/HighResolutionClock}/axi4lite_HighResolutionClock_load_times.tcl (100%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_HighResolutionClock => axi4lite/HighResolutionClock}/axi4lite_HighResolutionClock_load_times.vhdl (87%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_HighResolutionClock => axi4lite/HighResolutionClock}/axi4lite_HighResolutionClock_tb_pkg.vhdl (97%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_HighResolutionClock => axi4lite/HighResolutionClock}/axi4lite_HighResolutionClock_tc.vhdl (88%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_HighResolutionClock => axi4lite/HighResolutionClock}/axi4lite_HighResolutionClock_th.vhdl (95%) create mode 100644 tb/bus/axi4lite/OCRAM_Adapter/RunAllTests.pro rename tb/bus/{axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter => axi4lite/OCRAM_Adapter}/TC_AsyncReadWrite.vhdl (79%) create mode 100644 tb/bus/axi4lite/OCRAM_Adapter/TC_InitMemory.vhdl rename tb/bus/{axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter => axi4lite/OCRAM_Adapter}/TC_SimpleReadWrite.vhdl (74%) create mode 100644 tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter.hex create mode 100644 tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter_TestController.vhdl rename tb/bus/{axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/AXI4Lite_OCRAM_Adapter_TestHarness.vhdl => axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter_TestHarness.vhdl} (59%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_Register => axi4lite/Register}/RunAllTests.pro (79%) create mode 100644 tb/bus/axi4lite/Register/TC_RandomReadWrite.vhdl rename tb/bus/{axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_Initial.vhdl => axi4lite/Register/axi4lite_Register_Initial.vhdl} (94%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_ReadWrite.vhdl => axi4lite/Register/axi4lite_Register_ReadWrite.vhdl} (90%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_TestController.vhdl => axi4lite/Register/axi4lite_Register_TestController.vhdl} (82%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_TestHarness.vhdl => axi4lite/Register/axi4lite_Register_TestHarness.vhdl} (92%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_pkg.vhdl => axi4lite/Register/axi4lite_Register_pkg.vhdl} (97%) create mode 100644 tb/bus/axi4lite/RunAllTests.pro rename tb/bus/{axi4/AXI4Lite/AXI4Lite_UART => axi4lite/UART}/RunAllTests.pro (96%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_UART => axi4lite/UART}/axi4lite_UART_SWFC.vhdl (81%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_UART => axi4lite/UART}/axi4lite_UART_receive.vhdl (100%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_UART => axi4lite/UART}/axi4lite_UART_receive_burst.vhdl (85%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_UART => axi4lite/UART}/axi4lite_UART_receive_parity.vhdl (91%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_UART => axi4lite/UART}/axi4lite_UART_tc.vhdl (94%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_UART => axi4lite/UART}/axi4lite_UART_th.vhdl (95%) rename tb/bus/{axi4/AXI4Lite/AXI4Lite_UART => axi4lite/UART}/axi4lite_UART_transmit_burst.vhdl (86%) create mode 100644 tb/bus/axi4stream/DeMux/DeMux_Harness.vhdl create mode 100644 tb/bus/axi4stream/DeMux/RunAllTests.pro create mode 100644 tb/bus/axi4stream/DeMux/TC_DeMux_e.vhdl create mode 100644 tb/bus/axi4stream/DeMux/TC_DeMux_random.vhdl create mode 100644 tb/bus/axi4stream/DeMux/TC_DeMux_random_mirror.vhdl create mode 100644 tb/bus/axi4stream/DeMux/TC_DeMux_random_mirror_multiDest.vhdl create mode 100644 tb/bus/axi4stream/DeMux/TC_DeMux_random_withGlue.vhdl create mode 100644 tb/bus/axi4stream/FIFO/FIFO_TestController.vhdl create mode 100644 tb/bus/axi4stream/FIFO/FIFO_TestHarness.vhdl create mode 100644 tb/bus/axi4stream/FIFO/RunAllTests.pro create mode 100644 tb/bus/axi4stream/FIFO/TC_Randomized.vhdl create mode 100644 tb/bus/axi4stream/FIFO_CDC/FIFO_CDC_TestController.vhdl create mode 100644 tb/bus/axi4stream/FIFO_CDC/FIFO_CDC_TestHarness.vhdl create mode 100644 tb/bus/axi4stream/FIFO_CDC/RunAllTests.pro create mode 100644 tb/bus/axi4stream/FIFO_CDC/TC_Randomized.vhdl create mode 100644 tb/bus/axi4stream/Mux/RunAllTests.pro create mode 100644 tb/bus/axi4stream/Mux/TC_RandomTransfer.tcl create mode 100644 tb/bus/axi4stream/Mux/TC_RandomTransfer.vhdl create mode 100644 tb/bus/axi4stream/Mux/TC_RandomTransfer_delay.tcl create mode 100644 tb/bus/axi4stream/Mux/TC_RandomTransfer_delay.vhdl create mode 100644 tb/bus/axi4stream/Mux/TestController_e.vhdl create mode 100644 tb/bus/axi4stream/Mux/tb_axi4stream_mux.vhdl create mode 100644 tb/bus/axi4stream/RunAllTests.pro rename tb/cache/{cache_cpu_tb.vhdl => cache_CPU_tb.vhdl} (81%) rename tb/cache/{cache_mem_tb.vhdl => cache_Memory_tb.vhdl} (71%) rename tb/cache/{cache_par2_cocotb.py => cache_Parallel2_cocotb.py} (99%) rename tb/cache/{cache_par_cocotb.py => cache_Parallel_cocotb.py} (99%) create mode 100644 tb/common/RunAllTests.pro delete mode 100644 tb/common/my_config_DE0.vhdl delete mode 100644 tb/common/my_config_DE4.vhdl delete mode 100644 tb/common/my_config_DE5.vhdl delete mode 100644 tb/common/my_config_ECP5Versa.vhdl delete mode 100644 tb/common/my_config_KC705.vhdl delete mode 100644 tb/common/my_config_ML505.vhdl delete mode 100644 tb/common/my_config_ML506.vhdl delete mode 100644 tb/common/my_config_ML605.vhdl delete mode 100644 tb/common/my_config_S2GXAV.vhdl delete mode 100644 tb/common/my_config_S3ESK500.vhdl delete mode 100644 tb/common/my_config_S3SK1000.vhdl delete mode 100644 tb/common/my_config_VC707.vhdl delete mode 100644 tb/common/my_config_VC709.vhdl delete mode 100644 tb/common/my_config_XUPV5.vhdl delete mode 100644 tb/common/my_config_ZC706.vhdl delete mode 100644 tb/common/my_config_ZedBoard.vhdl rename tb/common/{my_config_Arty.vhdl => project_configuration_AC701.vhdl} (70%) create mode 100644 tb/common/project_configuration_Arty.vhdl create mode 100644 tb/common/project_configuration_ArtyS7.vhdl rename tb/common/{my_config_ArtyS7.vhdl => project_configuration_ECP5Versa.vhdl} (70%) rename tb/common/{my_config_GENERIC.vhdl => project_configuration_GENERIC.vhdl} (70%) create mode 100644 tb/common/project_configuration_KC705.vhdl rename tb/common/{my_config_Nexys4.vhdl => project_configuration_Nexys4.vhdl} (76%) rename tb/common/{my_config_Nexys4DDR.vhdl => project_configuration_Nexys4DDR.vhdl} (75%) rename tb/common/{my_config_Atlys.vhdl => project_configuration_VC707.vhdl} (70%) create mode 100644 tb/common/project_configuration_VC709.vhdl create mode 100644 tb/common/project_configuration_ZC706.vhdl rename tb/common/{my_config_AC701.vhdl => project_configuration_ZedBoard.vhdl} (70%) create mode 100644 tb/common/utils-pkg/RunAllTests.pro create mode 100644 tb/common/utils-pkg/Tb_common_utils_log2ceil.vhdl create mode 100644 tb/dstruct/OutOfOrderBuffer/RunAllTests.pro create mode 100644 tb/dstruct/OutOfOrderBuffer/TbOutOfOrderBuffer_WriteRead.tcl create mode 100644 tb/dstruct/OutOfOrderBuffer/TbOutOfOrderBuffer_WriteRead.vhdl create mode 100644 tb/dstruct/OutOfOrderBuffer/dstruct_OutOfOrderBuffer_TestController.vhdl create mode 100644 tb/dstruct/OutOfOrderBuffer/tb_OutOfOrderBuffer.vhdl create mode 100644 tb/dstruct/RunAllTests.pro rename tb/dstruct/{dstruct_deque_tb.vhdl => dstruct_DoubleEndedQueue_tb.vhdl} (98%) rename tb/dstruct/{dstruct_stack_tb.vhdl => dstruct_Stack_tb.vhdl} (66%) rename tb/io/ddrio/{ddrio_inout_tb.vhdl => ddrio_InOut_tb.vhdl} (57%) rename tb/io/ddrio/{ddrio_in_tb.vhdl => ddrio_In_tb.vhdl} (59%) rename tb/io/ddrio/{ddrio_out_tb.vhdl => ddrio_Out_tb.vhdl} (54%) rename tb/io/uart/{uart_rx_tb.vhdl => uart_RX_tb.vhdl} (57%) rename tb/mem/ocram/{ocram_esdp_tb.vhdl => ocram_EnhancedSimpleDualPort_tb.vhdl} (74%) rename tb/mem/ocram/{ocram_sdp_tb.vhdl => ocram_SimpleDualPort_tb.vhdl} (74%) rename tb/mem/ocram/{ocram_sdp_wf_tb.vhdl => ocram_SimpleDualPort_wf_tb.vhdl} (78%) rename tb/mem/ocram/{ocram_sp_tb.vhdl => ocram_SinglePort_tb.vhdl} (80%) rename tb/mem/ocram/{ocram_tdp_tb.vhdl => ocram_TrueDualPort_tb.vhdl} (74%) rename tb/mem/ocram/{ocram_tdp_wf_tb.vhdl => ocram_TrueDualPort_wf_tb.vhdl} (76%) create mode 100644 tb/misc/gearbox/gearbox_Down_cc_tb.vhdl create mode 100644 tb/misc/gearbox/gearbox_Down_dc_tb.vhdl create mode 100644 tb/misc/gearbox/gearbox_Up_cc_tb.vhdl create mode 100644 tb/misc/gearbox/gearbox_Up_dc_tb.vhdl delete mode 100644 tb/misc/gearbox/gearbox_down_cc_tb.vhdl delete mode 100644 tb/misc/gearbox/gearbox_down_dc_tb.vhdl delete mode 100644 tb/misc/gearbox/gearbox_up_cc_tb.vhdl delete mode 100644 tb/misc/gearbox/gearbox_up_dc_tb.vhdl delete mode 100644 tb/sim/sim_ClockGenerator_tb.vhdl delete mode 100644 tb/sim/sim_Waveform_tb.vhdl rename tb/sort/{sort_lru_cache_cocotb.py => sort_LeastRecentlyUsed_Cache_cocotb.py} (100%) create mode 100644 tb/sort/sort_LeastRecentlyUsed_Cache_tb.vhdl rename tb/sort/{sort_lru_list_cocotb.py => sort_LeastRecentlyUsed_List_cocotb.py} (100%) delete mode 100644 tb/sort/sort_lru_cache_tb.vhdl delete mode 100644 tcl/README.md delete mode 100644 tcl/common/utils.tcl delete mode 100644 tcl/vivado/utils.tcl delete mode 100644 tools/GitLab-CI/config.private.ini delete mode 100755 tools/GitLab-CI/ghdl.setup.sh delete mode 100644 tools/GitLab-CI/grc.setup.sh delete mode 100644 tools/GitLab-CI/modelsim.ini delete mode 100644 tools/GitLab-CI/my_project.vhdl delete mode 100755 tools/GitLab-CI/poc.run.sh delete mode 100755 tools/GitLab-CI/poc.setup.sh delete mode 100644 tools/GitLab-CI/requirements.txt create mode 100644 tools/Vivado/postWriteBitstream_ExportXSA.tcl.template rename tools/{git => Vivado}/preSynth_GitVersionRegister_Vivado.tcl (94%) delete mode 100644 tools/git/build_md.py delete mode 100755 tools/git/filters/normalize.pl delete mode 100755 tools/git/hooks/pre-commit.d/whitespace.sh delete mode 100755 tools/git/hooks/run-hook.sh rename tools/{OSVVM => }/poc.tcl (50%) rename ucf/arith/{arith_trng.xdc => arith_TRNG.xdc} (100%) diff --git a/.github/workflows/Pipeline.yml b/.github/workflows/Pipeline.yml index 1e9f56f6f..89ca653b3 100644 --- a/.github/workflows/Pipeline.yml +++ b/.github/workflows/Pipeline.yml @@ -15,8 +15,8 @@ jobs: Prepare: uses: pyTooling/Actions/.github/workflows/PrepareJob.yml@r7 with: - main_branch: 'master' - release_branch: 'master' + main_branch: 'main' + release_branch: 'main' Simulate: uses: ./.github/workflows/Simulate.yml @@ -24,15 +24,16 @@ jobs: fail-fast: false matrix: include: - - { simulator: 'nvc', backend: '', version: 'latest', can-fail: false } -# - { simulator: 'ghdl', backend: 'mcode', version: 'latest', can-fail: false } - - { simulator: 'ghdl', backend: 'llvm', version: 'latest', can-fail: false } + - {ubuntu-version: 'ubuntu-24.04', simulator: 'nvc', backend: '', version: 'latest', can-fail: false} + - {ubuntu-version: 'ubuntu-26.04', simulator: 'ghdl', backend: 'mcode', version: 'nightly', can-fail: false} + - {ubuntu-version: 'ubuntu-26.04', simulator: 'ghdl', backend: 'llvm', version: 'nightly', can-fail: false} with: - simulator: ${{ matrix.simulator }} - ghdl-version: ${{ matrix.version }} - ghdl-backend: ${{ matrix.backend }} - nvc-version: ${{ matrix.version }} - can-fail: ${{ matrix.can-fail }} + ubuntu-version: ${{ matrix.ubuntu-version }} + simulator: ${{ matrix.simulator }} + ghdl-version: ${{ matrix.version }} + ghdl-backend: ${{ matrix.backend }} + nvc-version: ${{ matrix.version }} + can-fail: ${{ matrix.can-fail }} PublishTestResults: uses: pyTooling/Actions/.github/workflows/PublishTestResults.yml@r7 @@ -52,7 +53,7 @@ jobs: IntermediateCleanUp: name: 🗑️ Intermediate Artifact Cleanup - runs-on: 'ubuntu-24.04' + runs-on: 'ubuntu-26.04' needs: - Simulate - PublishTestResults @@ -97,7 +98,7 @@ jobs: latex_artifact: 'PoC-LaTeX' Test: - runs-on: 'ubuntu-24.04' + runs-on: 'ubuntu-26.04' needs: - Simulate - PublishTestResults diff --git a/.github/workflows/Simulate.yml b/.github/workflows/Simulate.yml index 575f3b330..e4ed538df 100644 --- a/.github/workflows/Simulate.yml +++ b/.github/workflows/Simulate.yml @@ -6,7 +6,7 @@ on: ubuntu-version: description: 'Version of the Ubuntu image.' required: false - default: 'ubuntu-24.04' + default: 'ubuntu-26.04' type: string can-fail: description: 'Allow a job combination to fail.' @@ -132,26 +132,17 @@ jobs: run: | mkdir -p ${{ needs.Parameters.outputs.tempDirectory }} - - name: 🔨 Prepare Script - run: | - cd "${{ needs.Parameters.outputs.tempDirectory }}" - - tee run.tcl < set the stop counts to - # -d -debug enable debugging - # -w -waves save waveforms - configureOSVVM - EOF - - tee eval_prefix.tcl < $CI_PROJECT_DIR/temp/$SIMULATOR/full_build_name.txt after_script: - - FullBuildName=$(cat temp/$SIMULATOR/full_build_name.txt) - mkdir -p temp/junit - - CopyFile "temp/$SIMULATOR/$FullBuildName/$FullBuildName.xml" "temp/junit" - - CopyFile "temp/$SIMULATOR/$FullBuildName/$FullBuildName.yml" "temp/junit" - -.compile: - extends: - - .SimulationWrapper - script: - - | - if [ "$SIMULATOR" = "NVC" ]; then - # before_script and script are running in the same shell; therefore no need to change the directory - nvc --do ../${TCL_FILE} - else - exec-$SIMULATOR.sh -n --tcl-file=temp/${TCL_FILE} - fi + - CopyFile "temp/$SIMULATOR/*/*.xml" "temp/junit" + - CopyFile "temp/$SIMULATOR/*/*.yml" "temp/junit" artifacts: paths: - temp/$SIMULATOR - temp/junit - lib/osvvm/*_generated.vhd - expire_in: 1 week - when: always - -.simulate: - extends: - - .SimulationWrapper - script: - - | - if [ "$SIMULATOR" = "NVC" ]; then - # before_script and script are running in the same shell; therefore no need to change the directory - nvc --do ../${TCL_FILE} - else - exec-$SIMULATOR.sh -n --tcl-file=temp/${TCL_FILE} - fi - allow_failure: true # if case the Riviera license is in use - artifacts: - paths: - - temp/junit - - temp/$SIMULATOR reports: junit: "temp/junit/*.xml" expire_in: 1 week @@ -141,104 +57,104 @@ Scripts: matrix: - GHDL_BACKEND: ["llvm", "mcode"] image: ${CI_REGISTRY}/docker-images/ghdl:${GHDL_BACKEND} + extends: + - .run variables: SIMULATOR: "GHDL" -GHDL_OSVVM_compile: +GHDL_OSVVM_run: + stage: build_osvvm extends: - .GHDL - - .compile needs: job: Scripts artifacts: true variables: - TCL_FILE: "osvvm_compile.tcl" + REGRESSION_STEP: "osvvm" -GHDL_PoC_compile: +GHDL_PoC_run: + stage: build_poc extends: - .GHDL - - .compile needs: - job: Scripts artifacts: true - - job: GHDL_OSVVM_compile + - job: GHDL_OSVVM_run artifacts: true variables: - TCL_FILE: "poc_compile.tcl" - RESULT_NAME: "$COMPILE_POC_NAME" + REGRESSION_STEP: "poc" -GHDL_OSVVM_sim: +.GHDL_OSVVM_sim: # step has to be added to regression.tcl + stage: test extends: - .GHDL - - .simulate needs: - job: Scripts artifacts: true - - job: GHDL_OSVVM_compile + - job: GHDL_OSVVM_run artifacts: true only: - main - master - dev variables: - TCL_FILE: "osvvm_sim.tcl" - RESULT_NAME: "$SIMULATE_OSVVM_NAME" + REGRESSION_STEP: "osvvm_test" # todo: add this to regression.tcl GHDL_PoC_sim: + stage: test extends: - .GHDL - - .simulate needs: - job: Scripts artifacts: true - - job: GHDL_PoC_compile + - job: GHDL_PoC_run artifacts: true + allow_failure: true # todo: fix llvm error variables: - TCL_FILE: "poc_sim.tcl" - RESULT_NAME: "$SIMULATE_POC_NAME" + REGRESSION_STEP: "test" # ------------------ # ---- Riviera ----- # ------------------ .RIVIERA-PRO: - image: ${CI_REGISTRY}/docker-images/rivierapro:latest + image: ${CI_REGISTRY}/docker-images/rivierapro:2024.10 + extends: + - .run variables: SIMULATOR: "Riviera-PRO" -RIVIERA_OSVVM_compile: +RIVIERA_OSVVM_run: + stage: build_osvvm extends: - .RIVIERA-PRO - - .compile needs: job: Scripts artifacts: true variables: - TCL_FILE: "osvvm_compile.tcl" - RESULT_NAME: "$COMPILE_OSVVM_NAME" + REGRESSION_STEP: "osvvm" -RIVIERA_PoC_compile: +RIVIERA_PoC_run: + stage: build_poc extends: - .RIVIERA-PRO - - .compile needs: - job: Scripts artifacts: true - - job: RIVIERA_OSVVM_compile + - job: RIVIERA_OSVVM_run artifacts: true variables: - TCL_FILE: "poc_compile.tcl" - RESULT_NAME: "$COMPILE_POC_NAME" + REGRESSION_STEP: "poc" -RIVIERA_OSVVM_sim: +.RIVIERA_OSVVM_sim: + stage: test extends: - .RIVIERA-PRO - - .simulate needs: - job: Scripts artifacts: true - - job: RIVIERA_OSVVM_compile + - job: RIVIERA_OSVVM_run artifacts: true - - job: RIVIERA_PoC_compile # avoid license blocking + - job: RIVIERA_PoC_run # avoid license blocking artifacts: true only: - main @@ -246,24 +162,23 @@ RIVIERA_OSVVM_sim: - dev allow_failure: true variables: - TCL_FILE: "osvvm_sim.tcl" - RESULT_NAME: "$SIMULATE_OSVVM_NAME" + REGRESSION_STEP: "osvvm_test" RIVIERA_PoC_sim: + stage: test extends: - .RIVIERA-PRO - - .simulate needs: - job: Scripts artifacts: true - - job: RIVIERA_PoC_compile + - job: RIVIERA_PoC_run artifacts: true - job: RIVIERA_OSVVM_sim # avoid license blocking optional: true artifacts: false + allow_failure: true # if license is in use variables: - TCL_FILE: "poc_sim.tcl" - RESULT_NAME: "$SIMULATE_POC_NAME" + REGRESSION_STEP: "test" # -------------- @@ -271,62 +186,60 @@ RIVIERA_PoC_sim: # -------------- .NVC: image: ${CI_REGISTRY}/docker-images/nvc:latest + extends: + - .run variables: SIMULATOR: "NVC" -NVC_OSVVM_compile: +NVC_OSVVM_run: + stage: build_osvvm extends: - .NVC - - .compile needs: job: Scripts artifacts: true variables: - TCL_FILE: "osvvm_compile.tcl" - RESULT_NAME: "$COMPILE_OSVVM_NAME" + REGRESSION_STEP: "osvvm" -NVC_PoC_compile: +NVC_PoC_run: + stage: build_poc extends: - .NVC - - .compile needs: - job: Scripts artifacts: true - - job: NVC_OSVVM_compile + - job: NVC_OSVVM_run artifacts: true variables: - TCL_FILE: "poc_compile.tcl" - RESULT_NAME: "$COMPILE_POC_NAME" + REGRESSION_STEP: "poc" -NVC_OSVVM_sim: +.NVC_OSVVM_sim: + stage: test extends: - .NVC - - .simulate needs: - job: Scripts artifacts: - - job: NVC_OSVVM_compile + - job: NVC_OSVVM_run artifacts: true only: - main - master - dev variables: - TCL_FILE: "osvvm_sim.tcl" - RESULT_NAME: "$SIMULATE_OSVVM_NAME" + REGRESSION_STEP: "osvvm_test" NVC_PoC_sim: + stage: test extends: - .NVC - - .simulate needs: - job: Scripts artifacts: true - - job: NVC_PoC_compile + - job: NVC_PoC_run artifacts: true variables: - TCL_FILE: "poc_sim.tcl" - RESULT_NAME: "$SIMULATE_POC_NAME" + REGRESSION_STEP: "test" # -------------------------- @@ -334,6 +247,7 @@ NVC_PoC_sim: # -------------------------- MergeReports: image: ${CI_REGISTRY}/docker-images/base-image:alpine + stage: documentation needs: - job: GHDL_PoC_sim artifacts: true @@ -353,6 +267,7 @@ MergeReports: Sphinx: image: ${CI_REGISTRY}/docker-images/base-image:alpine + stage: documentation needs: - job: MergeReports artifacts: true @@ -369,13 +284,14 @@ Sphinx: - docs/_build/${SPHINX_BUILDER} MikTeX: + image: ${CI_REGISTRY}/docker-images/miktex:sphinx needs: - job: Sphinx parallel: matrix: - SPHINX_BUILDER: "latex" artifacts: true - image: ${CI_REGISTRY}/docker-images/miktex:sphinx + stage: documentation script: - cd docs/_build/latex - exec-LaTeX.sh --xelatex "PoC.tex" @@ -392,6 +308,7 @@ MikTeX: # ------------------ .pages: image: ${CI_REGISTRY}/docker-images/base-image:alpine + stage: pages variables: GIT_SUBMODULE_STRATEGY: normal pages: true diff --git a/.pyIPCMI/Hooks/README.md b/.pyIPCMI/Hooks/README.md deleted file mode 100644 index 993381cfa..000000000 --- a/.pyIPCMI/Hooks/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# pyIPCMI Hook Files - -This folder contains "hook files", which are sourced: - - before (`PreHookFile`) and - - after (`PostHostFile`) - -a pyIPCMI command gets executed with `pyIPCMI.sh` or `pyIPCMI.ps1`. A common use case is the preparation -of special vendor or tool chain environments. E.g. many EDA tools are using FlexLM -as a license manager, which needs the environments variable `LM_LICENSE_FILE` to be -set. A `PreHookFile` can be used to load/export such an environment variable. - - -## Hook Files - -The pyIPCMI's wrapper script parses the command line argument list for a known command. If such -a command is found, a pre- and post load event is triggered for a vendor hook file and a -tool hook file. - - -#### Example Mentor QuestaSim on Linux: - -The pyIPCMI infrastructure is called with this command line: - -```Bash -./pyIPCMI.sh -v vsim pyIPCMI.namespace.core -``` - -The `vsim` command is recognized and the following events are scheduled: - - 1. `source ./Mentor.pre.sh` - 2. `source ./Mentor.QuestaSim.pre.sh` - 3. Execute `./py/pyIPCMI.py -v vsim LIB.namespace.core` - 4. `source ./Mentor.QuestaSim.post.sh` - 5. `source ./Mentor.post.sh` - -If a hook files doesn't exist, it's skipped. - - -#### Example Mentor QuestaSim on Windows: - -The pyIPCMI infrastructure is called with this command line: - -```PowerShell -.\pyIPCMI.ps1 -v vsim LIB.namespace.core -``` - -The `vsim` command is recognized and the following events are scheduled: - - 1. `. .\Mentor.pre.ps1` - 2. `. .\Mentor.QuestaSim.pre.ps1` - 3. Execute `.\py\pyIPCMI.py -v vsim pyIPCMI.namespace.core` - 4. `. .\Mentor.QuestaSim.post.ps1` - 5. `. .\Mentor.post.ps1` - -If a hook files doesn't exist, it's skipped. - -## FlexLM - -Many EDA tools require an environment variable called `LM_LICENSE_FILE`. -If no other tool settings are required, a common `FlexLM.sh` can be -generated. This file is used as a symlink target for each tool specific -hook file. - -**Content of the `FlexLM.sh` script:** - -```Bash -export LM_LICENSE_FILE=1234@flexlm.company.com -``` - -**Create symlinks:** - -```Bash -ln -s FlexLM.sh Altera.Quartus.pre.sh -ln -s FlexLM.sh Mentor.QuestaSim.pre.sh -``` diff --git a/.pyIPCMI/config.boards.ini b/.pyIPCMI/config.boards.ini deleted file mode 100644 index df83da250..000000000 --- a/.pyIPCMI/config.boards.ini +++ /dev/null @@ -1,292 +0,0 @@ -# EMACS settings: -*- tab-width: 2indent-tabs-mode: t -*- -# vim: tabstop=2:shiftwidth=2:noexpandtab -# kate: tab-width 2replace-tabs offindent-width 2; -# -# ============================================================================== -# Authors: Patrick Lehmann -# -# Supported Boards: This file stores all supported boards and it's settings. -# -# Description: -# ------------------------------------ -# -# License: -# ============================================================================== -# Copyright 2007-2016 Technische Universitaet Dresden - Germany -# Chair of VLSI-Design, Diagnostics and Architecture -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -# -[BOARDS] -GENERIC = BOARD.GENERIC - -# virtual boards per vendor -Altera = BOARD.DE4 -Lattice = BOARD.ECP5Versa -Xilinx = BOARD.KC705 - -# Altera boards -DE0 = BOARD.DE0 -DE4 = BOARD.DE4 -DE5 = BOARD.DE5 -S2GXAV = BOARD.S2GXAV - -# Lattice boards -ECP5Versa = BOARD.ECP5Versa - -# Xilinx boards -S3SK = BOARD.S3SK200 -S3SK200 = BOARD.S3SK200 -S3SK500 = BOARD.S3SK500 -S3SK1000 = BOARD.S3SK1000 -S3ESK = BOARD.S3ESK500 -S3ESK500 = BOARD.S3ESK500 -S3ESK1600 = BOARD.S3ESK1600 -ML505 = BOARD.ML505 -ML506 = BOARD.ML505 -ML507 = BOARD.ML507 -Atlys = BOARD.Atlys -ArtyS7 = BOARD.ArtyS7 -ML605 = BOARD.ML605 -AC701 = BOARD.AC701 -Nexys4 = BOARD.Nexys4 -Nexys4DDR = BOARD.Nexys4DDR -Arty = BOARD.Arty -KC705 = BOARD.KC705 -VC707 = BOARD.VC707 -VC709 = BOARD.VC709 -ZC706 = BOARD.ZC706 -ZedBoard = BOARD.ZedBoard -ArtyZ7 = BOARD.ArtyZ7 - -[BOARD.GENERIC] -FPGA = GENERIC - -[BOARD.DE0] -FPGA = EP3C16F484C6 - -[BOARD.S2GXAV] -FPGA = EP2SGX90FF1508C3 - -[BOARD.DE4] -FPGA = EP4SGX230KF40C2 - -[BOARD.DE5] -FPGA = EP5SGXEA7N2F45C2 - -[BOARD.ECP5Versa] -FPGA = LFE5UM-45F-6BG381C - -[BOARD.S3SK200] -FPGA = XC3S200-4FT256 - -[BOARD.S3SK500] -FPGA = XC3S500-4FT256 - -[BOARD.S3SK1000] -FPGA = XC3S1000-4FT256 - -[BOARD.S3ESK500] -FPGA = XC3S500E-4FG320 - -[BOARD.S3ESK1600] -FPGA = XC3S1600E-4FG320 - -[BOARD.ML505] -FPGA = XC5VLX50T-1FF1136 -UCF = XilinxISEConstraints - -[CONST.ML505.UCF] -Default.ucf = ${ConstraintDir}/Default.ucf -Clock.SMA = ${ConstraintDir}/Clock.SMA.ucf -Clock.SystemClock = ${ConstraintDir}/Clock.SystemClock.ucf -Clock.UserClock = ${ConstraintDir}/Clock.UserClock.ucf -GPIO.Button.Cursor = ${ConstraintDir}/GPIO.Button.Cursor.ucf -GPIO.Button.Special = ${ConstraintDir}/GPIO.Button.Special.ucf -GPIO.Switch = ${ConstraintDir}/GPIO.Switch.ucf -GPIO.LED = ${ConstraintDir}/GPIO.LED.ucf -GPIO.LED.Cursor = ${ConstraintDir}/GPIO.LED.Cursor.ucf -GPIO.LED.Error = ${ConstraintDir}/GPIO.LED.Error.ucf -GPIO.Rotary = ${ConstraintDir}/GPIO.Rotary.ucf -UART = ${ConstraintDir}/UART.ucf -Bus.LCDisplay = ${ConstraintDir}/Bus.LCDisplay.ucf -Bus.PS2.Keyboard = ${ConstraintDir}/Bus.PS2.Keyboard.ucf -Bus.PS2.Mouse = ${ConstraintDir}/Bus.PS2.Mouse.ucf -Bus.IIC.Main = ${ConstraintDir}/Bus.IIC.Main.ucf -Bus.IIC.Monitor = ${ConstraintDir}/Bus.IIC.Monitor.ucf -EthernetPHY = ${ConstraintDir}/EthernetPHY.ucf -EthernetPHY.GMII = ${ConstraintDir}/EthernetPHY.GMII.ucf -EthernetPHY.RGMII = ${ConstraintDir}/EthernetPHY.RGMII.ucf -EthernetPHY.SGMII = ${ConstraintDir}/EthernetPHY.SGMII.ucf -Monitor.DVI.Output = ${ConstraintDir}/Monitor.DVI.Output.ucf -PCIe = ${ConstraintDir}/PCIe.ucf -Transceiver.SFP = ${ConstraintDir}/Transceiver.SFP.ucf -Transceiver.SMA = ${ConstraintDir}/Transceiver.SMA.ucf -Transceiver.SMA_RefClock = ${ConstraintDir}/Transceiver.SMA_RefClock.ucf - - -[BOARD.ML506] -FPGA = XC5VSX50T-1FFG1136 - -[BOARD.ML507] -FPGA = XC5VFX70T-1FFG1136 - -[BOARD.XUPV5] -FPGA = XC5VLX110T-1FF1136 - -[BOARD.Atlys] -FPGA = XC6SLX45-3CSG324 - -[BOARD.ArtyS7] -FPGA = XC7S25-1CSGA324C - -[BOARD.ML605] -FPGA = XC6VLX240T-1FF1156 -UCF = XilinxISEConstraints - -[CONST.ML605.UCF] -Default.ucf = ${ConstraintDir}/Default.ucf -Clock.SystemClock = ${ConstraintDir}/Clock.SystemClock.ucf -Clock.UserClock = ${ConstraintDir}/Clock.UserClock.ucf -GPIO.Button.Cursor = ${ConstraintDir}/GPIO.Button.Cursor.ucf -GPIO.Button.Special = ${ConstraintDir}/GPIO.Button.Special.ucf -GPIO.Switch = ${ConstraintDir}/GPIO.Switch.ucf -GPIO.LED = ${ConstraintDir}/GPIO.LED.ucf -GPIO.LED.Cursor = ${ConstraintDir}/GPIO.LED.Cursor.ucf -GPIO.Rotary = ${ConstraintDir}/GPIO.Rotary.ucf -USB_UART = ${ConstraintDir}/USB_UART.ucf -Bus.LCDisplay = ${ConstraintDir}/Bus.LCDisplay.ucf -Bus.IIC = ${ConstraintDir}/Bus.IIC.ucf -Bus.PMBus = ${ConstraintDir}/Bus.PMBus.ucf -EthernetPHY = ${ConstraintDir}/EthernetPHY.ucf -EthernetPHY.GMII = ${ConstraintDir}/EthernetPHY.GMII.ucf -EthernetPHY.RGMII = ${ConstraintDir}/EthernetPHY.RGMII.ucf -EthernetPHY.SGMII = ${ConstraintDir}/EthernetPHY.SGMII.ucf -Monitor.DVI.Output = ${ConstraintDir}/Monitor.DVI.Output.ucf -PCIe = ${ConstraintDir}/PCIe.ucf -Transceiver.SFP = ${ConstraintDir}/Transceiver.SFP.ucf -Transceiver.SMA = ${ConstraintDir}/Transceiver.SMA.ucf -Transceiver.SMA_RefClock = ${ConstraintDir}/Transceiver.SMA_RefClock.ucf - -[BOARD.AC701] -FPGA = XC7A200T-2FBG676 - -[BOARD.Nexys4] -FPGA = XC7A100T-1CG324C - -[BOARD.Nexys4DDR] -FPGA = XC7A100T-1CG324C - -[BOARD.Arty] -FPGA = XC7A35T-L1CSG324I - -[BOARD.KC705] -FPGA = XC7K325T-2FFG900 -UCF = XilinxISEConstraints -XDC = XilinxvivadoConstraints - -[CONST.KC705.UCF] -Default = ${ConstraintDir}/Default.ucf -Clock.SystemClock = ${ConstraintDir}/Clock.SystemClock.ucf -Clock.ProgUserClock = ${ConstraintDir}/Clock.ProgUserClock.ucf -Clock.SMAClock = ${ConstraintDir}/Clock.SMAClock.ucf -Clock.Si5324 = ${ConstraintDir}/Clock.Si5324.ucf -Bus.LCDisplay = ${ConstraintDir}/Bus.LCDisplay.ucf -Bus.IIC = ${ConstraintDir}/Bus.IIC.ucf -Bus.PMBus = ${ConstraintDir}/Bus.PMBus.ucf -EthernetPHY = ${ConstraintDir}/EthernetPHY.ucf -EthernetPHY.GMII = ${ConstraintDir}/EthernetPHY.GMII.ucf -EthernetPHY.RGMII = ${ConstraintDir}/EthernetPHY.RGMII.ucf -EthernetPHY.SGMII = ${ConstraintDir}/EthernetPHY.SGMII.ucf -GPIO.Button.Cursor = ${ConstraintDir}/GPIO.Button.Cursor.ucf -GPIO.Button.Special = ${ConstraintDir}/GPIO.Button.Special.ucf -GPIO.Switch = ${ConstraintDir}/GPIO.Switch.ucf -GPIO.LED = ${ConstraintDir}/GPIO.LED.ucf -GPIO.Rotary = ${ConstraintDir}/GPIO.Rotary.ucf -GPIO.SMA = ${ConstraintDir}/GPIO.SMA.ucf -FanControl = ${ConstraintDir}/FanControl.ucf -PCIe = ${ConstraintDir}/PCIe.ucf -Transceiver.SFP = ${ConstraintDir}/Transceiver.SFP.ucf -Transceiver.SMA = ${ConstraintDir}/Transceiver.SMA.ucf -Transceiver.SMA_RefClock = ${ConstraintDir}/Transceiver.SMA_RefClock.ucf -USB_UART = ${ConstraintDir}/USB_UART.ucf - -[CONST.KC705.XDC] -Bus.IIC = ${ConstraintDir}/Bus.IIC.xdc -Clock.ProgUserClock = ${ConstraintDir}/Clock.ProgUserClock.xdc -Clock.SystemClock = ${ConstraintDir}/Clock.SystemClock.xdc -FanControl = ${ConstraintDir}/FanControl.xdc -GPIO.Button.Cursor = ${ConstraintDir}/GPIO.Button.Cursor.xdc -GPIO.Button.Special = ${ConstraintDir}/GPIO.Button.Special.xdc -GPIO.LED = ${ConstraintDir}/GPIO.LED.xdc -GPIO.Rotary = ${ConstraintDir}/GPIO.Rotary.xdc -GPIO.Switch = ${ConstraintDir}/GPIO.Switch.xdc -Transceiver.SFP = ${ConstraintDir}/Transceiver.SFP.xdc -USB_UART = ${ConstraintDir}/USB_UART.xdc - -[BOARD.VC707] -FPGA = XC7VX485T-2FFG1761 -UCF = XilinxISEConstraints -XDC = XilinxvivadoConstraints - -[CONST.VC707.UCF] -Default = ${ConstraintDir}/Default.ucf -Clock.SystemClock = ${ConstraintDir}/Clock.SystemClock.ucf -Clock.ProgUserClock = ${ConstraintDir}/Clock.ProgUserClock.ucf -Clock.SMAClock = ${ConstraintDir}/Clock.SMAClock.ucf -Clock.Si5324 = ${ConstraintDir}/Clock.Si5324.ucf -Bus.LCDisplay = ${ConstraintDir}/Bus.LCDisplay.ucf -Bus.IIC = ${ConstraintDir}/Bus.IIC.ucf -Bus.PMBus = ${ConstraintDir}/Bus.PMBus.ucf -EthernetPHY = ${ConstraintDir}/EthernetPHY.ucf -EthernetPHY.GMII = ${ConstraintDir}/EthernetPHY.GMII.ucf -EthernetPHY.RGMII = ${ConstraintDir}/EthernetPHY.RGMII.ucf -EthernetPHY.SGMII = ${ConstraintDir}/EthernetPHY.SGMII.ucf -GPIO.Button.Cursor = ${ConstraintDir}/GPIO.Button.Cursor.ucf -GPIO.Button.Special = ${ConstraintDir}/GPIO.Button.Special.ucf -GPIO.Switch = ${ConstraintDir}/GPIO.Switch.ucf -GPIO.LED = ${ConstraintDir}/GPIO.LED.ucf -GPIO.Rotary = ${ConstraintDir}/GPIO.Rotary.ucf -GPIO.SMA = ${ConstraintDir}/GPIO.SMA.ucf -FanControl = ${ConstraintDir}/FanControl.ucf -PCIe = ${ConstraintDir}/PCIe.ucf -Transceiver.SFP = ${ConstraintDir}/Transceiver.SFP.ucf -Transceiver.SMA = ${ConstraintDir}/Transceiver.SMA.ucf -Transceiver.SMA_RefClock = ${ConstraintDir}/Transceiver.SMA_RefClock.ucf -USB_UART = ${ConstraintDir}/USB_UART.ucf - -[CONST.VC707.XDC] -Bus.IIC = ${ConstraintDir}/Bus.IIC.xdc -Clock.ProgUserClock = ${ConstraintDir}/Clock.ProgUserClock.xdc -Clock.SystemClock = ${ConstraintDir}/Clock.SystemClock.xdc -FanControl = ${ConstraintDir}/FanControl.xdc -GPIO.Button.Cursor = ${ConstraintDir}/GPIO.Button.Cursor.xdc -GPIO.Button.Special = ${ConstraintDir}/GPIO.Button.Special.xdc -GPIO.LED = ${ConstraintDir}/GPIO.LED.xdc -GPIO.Rotary = ${ConstraintDir}/GPIO.Rotary.xdc -GPIO.Switch = ${ConstraintDir}/GPIO.Switch.xdc -Transceiver.SFP = ${ConstraintDir}/Transceiver.SFP.xdc -USB_UART = ${ConstraintDir}/USB_UART.xdc - -[BOARD.VC709] -FPGA = XC7VX690T-2FFG1761C - -[BOARD.ZC706] -FPGA = XC7Z045-2FFG900 - -[BOARD.ZedBoard] -FPGA = XC7Z020-1CLG484 - -[BOARD.ArtyZ7] -FPGA = XC7Z020-1CLG400C diff --git a/.pyIPCMI/config.defaults.ini b/.pyIPCMI/config.defaults.ini deleted file mode 100644 index 742c99500..000000000 --- a/.pyIPCMI/config.defaults.ini +++ /dev/null @@ -1,400 +0,0 @@ -# EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- -# vim: tabstop=2:shiftwidth=2:noexpandtab -# kate: tab-width 2; replace-tabs off; indent-width 2; -# -# ============================================================================== -# Authors: Patrick Lehmann -# -# Config file: Global configuration file -# -# Description: -# ------------------------------------ -# This file defines: -# - default option values for sections -# -# License: -# ============================================================================== -# Copyright 2007-2016 Technische Universitaet Dresden - Germany -# Chair of VLSI-Design, Diagnostics and Architecture -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -# -[CONFIG.DirectoryNames] -HDLSourceFiles = src -TestbenchFiles = tb -NetlistFiles = netlist -ConstraintFiles = ucf -SimulatorFiles = sim -TemporaryFiles = temp -PrecompiledFiles = ${TemporaryFiles}/precompiled - -# Aldec files -ActiveHDLFiles = activehdl -RivieraPROFiles = rivierapro - -# Altera files -AlteraSpecificFiles = altera -QuartusSynthesisFiles = quartus - -# Cocotb files -CocotbFiles = cocotb - -# GHDL/GTKWave files -GHDLFiles = ghdl -# GTKWaveFiles = gtkw - -# Lattice files -LatticeSpecificFiles = lattice -LatticeSynthesisFiles = lse - -# Mentor files -ModelSimFiles = vsim -QuestaSimFiles = ${ModelSimFiles} - -# Synopsys files - -# Xilinx files -XilinxSpecificFiles = xilinx -ISESynthesisFiles = xst -ISECoreGeneratorFiles = coregen -ISESimulatorFiles = isim -VivadoSimulatorFiles = xsim -VivadoSynthesisFiles = vivado -VivadoIPCatalogFiles = xci - - -[BOARD.DEFAULT] -Name = %{Name} -ConstraintDir = ${%{ParentWithRoot}:Name} - - -[PoC.DEFAULT] -Visibility = Public -Name = %{Name} -DirectoryName = ${Name} -Prefix = ${%{ParentWithRoot}:Name} -# build directories recursively from parent + directory name of the sub-namespace -RelDir = ${%{ParentWithRoot}:RelDir}/${DirectoryName} -SrcDir = ${%{ParentWithRoot}:SrcDir}/${DirectoryName} -TBDir = ${%{ParentWithRoot}:TBDir}/${DirectoryName} -SimDir = ${%{ParentWithRoot}:SimDir}/${DirectoryName} -NLDir = ${%{ParentWithRoot}:NLDir}/${DirectoryName} -XSTDir = ${%{ParentWithRoot}:XSTDir}/${DirectoryName} -QMAPDir = ${%{ParentWithRoot}:QMAPDir}/${DirectoryName} - - -[IP.DEFAULT] -Visibility = Public -Name = %{Name} -EntityPrefix = ${PoC.%{Parent}:Name} -FilesFile = ${SrcDir}/${EntityPrefix}_${Name}.files -# inherit directories from IP core section -RelDir = ${PoC.%{Parent}:RelDir} -SrcDir = ${PoC.%{Parent}:SrcDir} -TBDir = ${PoC.%{Parent}:TBDir} -SimDir = ${PoC.%{Parent}:SimDir} -NLDir = ${PoC.%{Parent}:NLDir} -XSTDir = ${PoC.%{Parent}:XSTDir} -QMAPDir = ${PoC.%{Parent}:QMAPDir} -Dependencies = -# VHDL Generics or Verilog Parameters, Example: key1=value1; key2=value2 -HDLParameters = - - -[TB.DEFAULT] -Visibility = Public -TBName = ${PoC.%{GrantParent}:Name}_${IP.%{Parent}:Name} -TestbenchModule = ${TBName}_tb -FilesFile = ${TBDir}/${TestbenchModule}.files -# inherit directories from IP core section -SrcDir = ${IP.%{Parent}:SrcDir} -TBDir = ${IP.%{Parent}:TBDir} -SimDir = ${IP.%{Parent}:SimDir} -# vendor specific simulator files -# Aldec -aSimBatchScript = ${PoC:SimDir}/aSim.batch.tcl -aSimGUIScript = ${PoC:SimDir}/aSim.gui.tcl -aSimWaveScript = ${SimDir}/${TestbenchModule}.awc -# GHDL / GTKWave -ghdlWaveformOptionFile = ${SimDir}/${TestbenchModule}.ghdl -ghdlWaveformFileFormat = ghw -gtkwSaveFile = ${SimDir}/${TestbenchModule}.gtkw -# ModelSim / QuestaSim -vSimBatchScript = ${SimDir}/${TestbenchModule}.vsim.batch.tcl -vSimGUIScript = ${SimDir}/${TestbenchModule}.vsim.gui.tcl -vSimWaveScript = ${SimDir}/${TestbenchModule}.wdo -vSimDefaultBatchScript = ${PoC:SimDir}/vSim.batch.tcl -vSimDefaultGUIScript = ${PoC:SimDir}/vSim.gui.tcl -vSimDefaultWaveScript = ${PoC:SimDir}/vSim.default.wdo -# Xilinx ISE -iSimBatchScript = ${PoC:SimDir}/iSim.batch.tcl -iSimGUIScript = ${PoC:SimDir}/iSim.gui.tcl -iSimWaveformConfigFile = ${SimDir}/${TestbenchModule}.wcfg -# Xilinx Vivado -xSimBatchScript = ${PoC:SimDir}/xSim.batch.tcl -xSimGUIScript = ${PoC:SimDir}/xSim.gui.tcl -xSimWaveformConfigFile = ${SimDir}/${TestbenchModule}.wcfg - - -[VSIM.DEFAULT] - - -[ASIM.DEFAULT] - - -[RPRO.DEFAULT] - - -[QSIM.DEFAULT] - - -[ISIM.DEFAULT] - - -[XSIM.DEFAULT] - - -[GHDL.DEFAULT] - - -[COCOTB.DEFAULT] -Visibility = Public -TBName = ${PoC.%{GrantParent}:Name}_${IP.%{Parent}:Name} -TopLevel = ${TBName} -TestbenchModule = ${TBName}_cocotb -FilesFile = ${TBDir}/${TBName}_tb.files -CocotbMakefile = ${PoC:SimDir}/Cocotb.Makefile -# inherit directories from IP core section -SrcDir = ${IP.%{Parent}:SrcDir} -TBDir = ${IP.%{Parent}:TBDir} -SimDir = ${IP.%{Parent}:SimDir} - - -[CG.DEFAULT] -Visibility = Public -TopLevel = ${PoC.%{GrantParent}:Name}_${IP.%{Parent}:Name} -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -RulesFile = -Dependencies = -# inherit directories from IP core section -RelDir = ${IP.%{Parent}:RelDir} -SrcDir = ${IP.%{Parent}:SrcDir} -NLDir = ${IP.%{Parent}:NLDir} - -# empty task lists -PreCopyRules = -PreReplaceRules = -PostCopyRules = -PostReplaceRules = -PostDeleteRules = -# Use these predefined options to override a value -# ------------------------------------------------------------------------------ -DefaultRulesFile = ${SrcDir}/${IP.%{Parent}:EntityPrefix}_${IP.%{Parent}:Name}.rules -DefaultPostCopyNGC = ${SPECIAL:OutputDir}/${TopLevel}.ngc -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.ngc -DefaultPostCopyVHDL = ${SPECIAL:OutputDir}/${TopLevel}.vhd -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.vhdl -DefaultPostCopyNCF = ${SPECIAL:OutputDir}/${TopLevel}.ncf -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.ncf - - -[LSE.DEFAULT] -Visibility = Public -TopLevel = ${PoC.%{GrantParent}:Name}_${IP.%{Parent}:Name} -FilesFile = ${SrcDir}/${IP.%{Parent}:EntityPrefix}_${IP.%{Parent}:Name}.files -RulesFile = -Dependencies = -# inherit directories from IP core section -RelDir = ${IP.%{Parent}:RelDir} -SrcDir = ${IP.%{Parent}:SrcDir} -NLDir = ${IP.%{Parent}:NLDir} -# if no rules file is given, check these rules -PreCopyRules = -PreReplaceRules = -PostCopyRules = -PostReplaceRules = -PostDeleteRules = -# HDLParameter inheritance, see also IP.DEFAULT -HDLParameters = ${IP.%{Parent}:HDLParameters} - -[QMAP.DEFAULT] -Visibility = Public -TopLevel = ${PoC.%{GrantParent}:Name}_${IP.%{Parent}:Name} -FilesFile = ${SrcDir}/${IP.%{Parent}:EntityPrefix}_${IP.%{Parent}:Name}.files -RulesFile = -Dependencies = -# inherit directories from IP core section -RelDir = ${IP.%{Parent}:RelDir} -SrcDir = ${IP.%{Parent}:SrcDir} -NLDir = ${IP.%{Parent}:NLDir} -QMAPDir = ${IP.%{Parent}:QMAPDir} -# if no rules file is given, check these rules -PreCopyRules = -PreReplaceRules = -PostCopyRules = -PostReplaceRules = -PostDeleteRules = -# HDLParameter inheritance, see also IP.DEFAULT -HDLParameters = ${IP.%{Parent}:HDLParameters} - - -[XST.DEFAULT] -Visibility = Public -TopLevel = ${PoC.%{GrantParent}:Name}_${IP.%{Parent}:Name} -# QUESTION: where to store these files? in src or xst dir? -# FilesFile = ${IP.%{Parent}:FilesFile} -FilesFile = ${SrcDir}/${IP.%{Parent}:EntityPrefix}_${IP.%{Parent}:Name}.files -RulesFile = -Dependencies = -# Note: If a *.rules file should be used, then set its value to ${DefaultRulesFile} - -# inherit directories from IP core section -RelDir = ${IP.%{Parent}:RelDir} -SrcDir = ${IP.%{Parent}:SrcDir} -NLDir = ${IP.%{Parent}:NLDir} -XSTDir = ${IP.%{Parent}:XSTDir} -# if no rules file is given, check these rules -PreCopyRules = -PreReplaceRules = -PostCopyRules = ${SPECIAL:OutputDir}/${TopLevel}.ngc -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.ngc -PostReplaceRules = -PostDeleteRules = -# Use these predefined options to override a value -# ------------------------------------------------------------------------------ -DefaultRulesFile = ${XSTDir}/${IP.%{Parent}:EntityPrefix}_${IP.%{Parent}:Name}.rules -DefaultPostCopyNGC = ${SPECIAL:OutputDir}/${TopLevel}.ngc -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.ngc -# DefaultPostCopyVHDL = ${SPECIAL:OutputDir}/${TopLevel}.vhd -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.vhdl -# DefaultPostCopyNCF = ${SPECIAL:OutputDir}/${TopLevel}.ncf -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.ncf -XSTNoConstraintsFile = ${PoC:XSTDir}/empty.xcf -# Xilinx XST specific files -XSTConstraintsFile = ${XSTNoConstraintsFile} -XSTOptionsFile = ${PoC:XSTDir}/${SPECIAL:DeviceSeries}.xst -XSTFilterFile = ${PoC:XSTDir}/default.filter -# HDLParameter inheritance, see also IP.DEFAULT -HDLParameters = ${IP.%{Parent}:HDLParameters} -# Overrideable XST options -XSTOption.UseNewParser = YES -XSTOption.InputFormat = mixed -XSTOption.OutputFormat = NGC -XSTOption.OptimizationMode = Speed -XSTOption.OptimizationLevel = 2 -XSTOption.PowerReduction = NO -XSTOption.IgnoreSynthesisConstraintsFile = NO -XSTOption.KeepHierarchy = Soft -XSTOption.NetListHierarchy = As_Optimized -XSTOption.GenerateRTLView = NO -XSTOption.Globaloptimization = AllClockNets -XSTOption.ReadCores = YES -XSTOption.WriteTimingConstraints = NO -XSTOption.CrossClockAnalysis = YES -XSTOption.HierarchySeparator = / -XSTOption.BusDelimiter = <> -XSTOption.Case = Maintain -XSTOption.SliceUtilizationRatio = 100 -XSTOption.BRAMUtilizationRatio = 100 -XSTOption.DSPUtilizationRatio = 100 -XSTOption.LUTCombining = Auto -XSTOption.ReduceControlSets = Auto -XSTOption.Verilog2001 = YES -XSTOption.FSMExtract = YES -XSTOption.FSMEncoding = Auto -XSTOption.FSMSafeImplementation = NO -XSTOption.FSMStyle = LUT -XSTOption.RAMExtract = YES -XSTOption.RAMStyle = Auto -XSTOption.ROMExtract = YES -XSTOption.ROMStyle = Auto -XSTOption.MUXExtract = YES -XSTOption.MUXStyle = Auto -XSTOption.DecoderExtract = YES -XSTOption.PriorityExtract = YES -XSTOption.ShRegExtract = YES -XSTOption.ShiftExtract = YES -XSTOption.XorCollapse = YES -XSTOption.AutoBRAMPacking = NO -XSTOption.ResourceSharing = YES -XSTOption.ASyncToSync = NO -XSTOption.UseDSP48 = Auto -XSTOption.IOBuf = NO -XSTOption.MaxFanOut = 100000 -XSTOption.BufG = 32 -XSTOption.RegisterDuplication = YES -XSTOption.RegisterBalancing = NO -XSTOption.SlicePacking = YES -XSTOption.OptimizePrimitives = NO -XSTOption.UseClockEnable = Auto -XSTOption.UseSyncSet = Auto -XSTOption.UseSyncReset = Auto -XSTOption.PackIORegistersIntoIOBs = Auto -XSTOption.EquivalentRegisterRemoval = YES -XSTOption.SliceUtilizationRatioMaxMargin = 5 - - -[VIVADO.DEFAULT] -Visibility = Public -TopLevel = ${PoC.%{GrantParent}:Name}_${IP.%{Parent}:Name} -# QUESTION: where to store these files? in src or xst dir? -# FilesFile = ${IP.%{Parent}:FilesFile} -FilesFile = ${SrcDir}/${IP.%{Parent}:EntityPrefix}_${IP.%{Parent}:Name}.files -RulesFile = -Dependencies = -# Note: If a *.rules file should be used, then set its value to ${DefaultRulesFile} - -# inherit directories from IP core section -RelDir = ${IP.%{Parent}:RelDir} -SrcDir = ${IP.%{Parent}:SrcDir} -NLDir = ${IP.%{Parent}:NLDir} -# if no rules file is given, check these rules -PreCopyRules = -PreReplaceRules = -PostCopyRules = ${SPECIAL:OutputDir}/${TopLevel}.dcp -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.dcp -PostReplaceRules = -PostDeleteRules = -# Use these predefined options to override a value -# ------------------------------------------------------------------------------ -DefaultRulesFile = ${XSTDir}/${IP.%{Parent}:EntityPrefix}_${IP.%{Parent}:Name}.rules -DefaultPostCopyDCP = ${SPECIAL:OutputDir}/${TopLevel}.dcp -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.dcp -# DefaultPostCopyVHDL = ${SPECIAL:OutputDir}/${TopLevel}.vhd -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.vhdl -# DefaultPostCopyNCF = ${SPECIAL:OutputDir}/${TopLevel}.ncf -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.ncf -# HDLParameter inheritance, see also IP.DEFAULT -HDLParameters = ${IP.%{Parent}:HDLParameters} -SimHDLParameters = ${IP.%{Parent}:SimHDLParameters} -SynthHDLParameters = ${IP.%{Parent}:SynthHDLParameters} - -[XCI.DEFAULT] -Visibility = Public -TopLevel = ${PoC.%{GrantParent}:Name}_${IP.%{Parent}:Name} -IPCatalogFile = ${SrcDir}/${TopLevel}.xci -RulesFile = -Dependencies = -# inherit directories from IP core section -RelDir = ${IP.%{Parent}:RelDir} -SrcDir = ${IP.%{Parent}:SrcDir} -NLDir = ${IP.%{Parent}:NLDir} - -# empty task lists -PreCopyRules = -PreReplaceRules = -PostCopyRules = -PostReplaceRules = -PostDeleteRules = -# Use these predefined options to override a value -# ------------------------------------------------------------------------------ -DefaultRulesFile = ${SrcDir}/${IP.%{Parent}:EntityPrefix}_${IP.%{Parent}:Name}.rules -DefaultPostCopyDCP = ${SPECIAL:OutputDir}/${TopLevel}.ngc -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.dcp -DefaultPostCopyVHDL = ${SPECIAL:OutputDir}/${TopLevel}.vhd -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.vhdl -DefaultPostCopyXDC = ${SPECIAL:OutputDir}/${TopLevel}.ncf -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.xdc - - -[SPECIAL] -Device = ERROR -DeviceSeries = ERROR -OutputDir = ERROR diff --git a/.pyIPCMI/config.entity.ini b/.pyIPCMI/config.entity.ini deleted file mode 100644 index e80f48e8b..000000000 --- a/.pyIPCMI/config.entity.ini +++ /dev/null @@ -1,1203 +0,0 @@ -# EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- -# vim: tabstop=2:shiftwidth=2:noexpandtab -# kate: tab-width 2; replace-tabs off; indent-width 2; -# -# ============================================================================== -# Authors: Patrick Lehmann -# -# Config file: Global configuration file -# -# Description: -# ------------------------------------ -# This file defines: -# - common directory names -# - directory names for sub namespaces -# - prefixes for namespaces -# -# License: -# ============================================================================== -# Copyright 2007-2016 Technische Universitaet Dresden - Germany -# Chair of VLSI-Design, Diagnostics and Architecture -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -# -# PoC.alt -# ============================================================================== - -# PoC.arith -# ============================================================================== -[IP.arith.addw] -Description = Adder for wide inputs -tb = VHDLTestbench -[TB.arith.addw.tb] - - -[IP.arith.carrychain_inc] -# tb = VHDLTestbench -# [TB.arith.carrychain_inc.tb] - - -[IP.arith.counter_free] - - -[IP.arith.counter_bcd] -tb = VHDLTestbench -HDLParameters = DIGITS=9 -[TB.arith.counter_bcd.tb] -[XST.arith.counter_bcd.nl] - - -[IP.arith.counter_gray] - - -[IP.arith.counter_ring] - - -[IP.arith.convert_bin2bcd] -tb = VHDLTestbench -[TB.arith.convert_bin2bcd.tb] - - -[IP.arith.div] -tb = VHDLTestbench -[TB.arith.div.tb] - - -[IP.arith.firstone] -tb = VHDLTestbench -[TB.arith.firstone.tb] - - -[IP.arith.muls_wide] - - -[IP.arith.prefix_and] -tb = VHDLTestbench -[TB.arith.prefix_and.tb] - - -[IP.arith.prefix_or] -tb = VHDLTestbench -[TB.arith.prefix_or.tb] - - -[IP.arith.prng] -Description = Pseudo Random Number Generator (PRNG) -tb = VHDLTestbench -nl1 = QuartusNetlist -nl2 = XSTNetlist -nl3 = LSENetlist -nl4 = VivadoNetlist -[TB.arith.prng.tb] -tb = VHDLTestbenchArchitecture -[QMAP.arith.prng.nl1] -[XST.arith.prng.nl2] -[LSE.arith.prng.nl3] -[VIVADO.arith.prng.nl4] - - -[IP.arith.same] - - -[IP.arith.scaler] -tb = VHDLTestbench -[TB.arith.scaler.tb] - - -[IP.arith.shifter_barrel] -nl = XSTNetlist -HDLParameters = BITS=32 -[XST.arith.shifter_barrel.nl] - - -[IP.arith.sqrt] - -# PoC.bus -# ============================================================================== -[IP.bus.Arbiter] -# tb = VHDLTestbench -# [TB.bus.Arbiter.tb] - -# PoC.bus.stream -# ------------------------------------------------------------------------------ -[IP.bus.stream.Buffer] - - -[IP.bus.stream.DeMux] - - -[IP.bus.stream.FrameGenerator] - - -[IP.bus.stream.Mirror] - - -[IP.bus.stream.Mux] - - -[IP.bus.stream.Sink] - - -[IP.bus.stream.Source] - -# PoC.bus.wb -# ------------------------------------------------------------------------------ -[IP.bus.wb.fifo_adapter] - - -[IP.bus.wb.ocram_adapter] - - -[IP.bus.wb.uart_wrapper] - -# PoC.cache -# ============================================================================== -[IP.cache.cpu] -tb = VHDLTestbench -nl1 = XSTNetlist -nl2 = QuartusNetlist -nl3 = LSENetlist -nl4 = VivadoNetlist -# 64 KiByte 4-way set-associative, 4 GiB RAM (2**26 x 512 bit), 64 bytes per cache line -HDLParameters = CACHE_LINES=1024; ASSOCIATIVITY=4; MEM_ADDR_BITS=26; MEM_DATA_BITS=512; CPU_DATA_BITS=32 -[TB.cache.cpu.tb] -[XST.cache.cpu.nl1] -[QMAP.cache.cpu.nl2] -[LSE.cache.cpu.nl3] -[VIVADO.cache.cpu.nl4] - -[IP.cache.mem] -tb = VHDLTestbench -nl1 = XSTNetlist -nl2 = QuartusNetlist -nl3 = LSENetlist -nl4 = VivadoNetlist -# 64 KiByte 4-way set-associative, 4 GiB RAM (2**26 x 512 bit), 64 bytes per cache line -HDLParameters = CACHE_LINES=1024; ASSOCIATIVITY=4; MEM_ADDR_BITS=26; MEM_DATA_BITS=512; CPU_DATA_BITS=32 -[TB.cache.mem.tb] -[XST.cache.mem.nl1] -[QMAP.cache.mem.nl2] -[LSE.cache.mem.nl3] -[VIVADO.cache.mem.nl4] - -[IP.cache.par] -cocotb = CocoTestbench -nl1 = XSTNetlist -nl2 = QuartusNetlist -nl3 = LSENetlist -nl4 = VivadoNetlist -# 64 KiByte 4-way set-associative, 32-bit address space, 64 bytes per cache line -HDLParameters = CACHE_LINES=1024; ASSOCIATIVITY=4; ADDRESS_BITS=26; DATA_BITS=512 -[COCOTB.cache.par.cocotb] -[XST.cache.par.nl1] -[QMAP.cache.par.nl2] -[LSE.cache.par.nl3] -[VIVADO.cache.par.nl4] - -[IP.cache.par2] -cocotb = CocoTestbench -nl1 = XSTNetlist -nl2 = QuartusNetlist -nl3 = LSENetlist -nl4 = VivadoNetlist -# 64 KiByte 4-way set-associative, 32-bit address space, 64 bytes per cache line -HDLParameters = CACHE_LINES=1024; ASSOCIATIVITY=4; ADDR_BITS=32; BYTE_ADDR_BITS=6; DATA_BITS=512 -[COCOTB.cache.par2.cocotb] -[XST.cache.par2.nl1] -[QMAP.cache.par2.nl2] -[LSE.cache.par2.nl3] -[VIVADO.cache.par2.nl4] - -[IP.cache.replacement_policy] -# tb = VHDLTestbench -# [TB.cache.replacement_policy.tb] - -[IP.cache.tagunit_par] -# tb = VHDLTestbench -# [TB.cache.tagunit_par.tb] - -[IP.cache.tagunit_seq] -# tb = VHDLTestbench -# [TB.cache.tagunit_seq.tb] - -# PoC.comm -# ============================================================================== -[IP.comm.crc] - - -[IP.comm.scamble] - -# PoC.common -# ============================================================================== -[IP.common.config] -tb = VHDLTestbench -[TB.common.config.tb] -TBName = ${IP.%{Parent}:Name} - -[IP.common.strings] -tb = VHDLTestbench -[TB.common.strings.tb] -TBName = ${IP.%{Parent}:Name} - -[IP.common.physical] -tb = VHDLTestbench -[TB.common.physical.tb] -TBName = ${IP.%{Parent}:Name} - - -# PoC.dstruct -# ============================================================================== -[IP.dstruct.deque] -tb = VHDLTestbench -[TB.dstruct.deque.tb] - -[IP.dstruct.stack] -tb = VHDLTestbench -[TB.dstruct.stack.tb] - -# PoC.fifo -# ============================================================================== -[IP.fifo.cc_got] -tb = VHDLTestbench -[TB.fifo.cc_got.tb] - -[IP.fifo.cc_got_tempgot] -# tb = VHDLTestbench -# [TB.fifo.cc_got_tempgot.tb] -# Visibility = Private - -[IP.fifo.cc_got_tempput] -tb = VHDLTestbench -[TB.fifo.cc_got_tempput.tb] - -[IP.fifo.dc_got] - - -[IP.fifo.ic_got] -tb = VHDLTestbench -[TB.fifo.ic_got.tb] - -[IP.fifo.ic_assembly] -tb = VHDLTestbench -[TB.fifo.ic_assembly.tb] - -[IP.fifo.glue] -# tb = VHDLTestbench -# [TB.fifo.glue.tb] - -# PoC.io -# ============================================================================== -[IP.io.Debounce] -tb = VHDLTestbench -[TB.io.Debounce.tb] - -[IP.io.7SegmentMux_BCD] - - -[IP.io.7SegmentMux_HEX] - - -[IP.io.FanControl] -nl = XSTNetlist -HDLParameters = CLOCK_FREQ=100MHz; ADD_INPUT_SYNCHRONIZERS=TRUE; ENABLE_TACHO=FALSE -[XST.io.FanControl.nl] - -[IP.io.FrequencyCounter] - - -[IP.io.GlitchFilter] - - -[IP.io.PulseWidthModulation] - - -[IP.io.TimingCounter] - -# PoC.io.ddrio -# ------------------------------------------------------------------------------ -[IP.io.ddrio.in] -tb = VHDLTestbench -[TB.io.ddrio.in.tb] - -[IP.io.ddrio.inout] -tb = VHDLTestbench -nl1 = XSTNetlist -nl2 = VivadoNetlist -HDLParameters = BITS=2 -[TB.io.ddrio.inout.tb] -[XST.io.ddrio.inout.nl1] -[VIVADO.io.ddrio.inout.nl2] - -[IP.io.ddrio.out] -tb = VHDLTestbench -nl1 = XSTNetlist -nl2 = VivadoNetlist -HDLParameters = BITS=2 -[TB.io.ddrio.out.tb] -[XST.io.ddrio.out.nl1] -[VIVADO.io.ddrio.out.nl2] - - -# PoC.io.device -# ------------------------------------------------------------------------------ - -# PoC.io.iic -# ------------------------------------------------------------------------------ -[IP.io.iic.BusController] -Visibility = Private - -[IP.io.iic.Controller] -Visibility = Private -tb = VHDLTestbench -[TB.io.iic.Controller.tb] - - -[IP.io.iic.Switch_PCA9548A] -Visibility = Private - -# PoC.io.jtag -# ------------------------------------------------------------------------------ - -# PoC.io.lcd -# ------------------------------------------------------------------------------ -[IP.io.lcd.dotmatrix] - - -[IP.io.lcd.LCDBuffer] - - -[IP.io.lcd.LCDSynchronizer] - -[IP.io.lcd.ChipScopeVIO] -cg = CoreGenNetlist -[CG.io.lcd.ChipScopeVIO.cg] -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} - - -# PoC.io.mdio -# ------------------------------------------------------------------------------ -[IP.io.mdio.IIC_Adapter] - - -[IP.io.mdio.Controller] - -# PoC.io.ow -# ------------------------------------------------------------------------------ -[IP.io.ow.BusController] - - -[IP.io.ow.Controller] - -# PoC.io.pio -# ------------------------------------------------------------------------------ -[IP.io.pio.fifo] -tb = VHDLTestbench -[TB.io.pio.fifo.tb] - -# PoC.io.pmod -# ------------------------------------------------------------------------------ -[IP.io.pmod.KYPD] - - -[IP.io.pmod.SSD] - - -[IP.io.pmod.USBUART] - -# PoC.io.uart -# ------------------------------------------------------------------------------ -[IP.io.uart.rx] -tb = VHDLTestbench -[TB.io.uart.rx.tb] - -[IP.io.uart.tx] - -[IP.io.uart.fifo] -nl1 = QuartusNetlist -nl2 = XSTNetlist -nl3 = VivadoNetlist -nl4 = LSENetlist -HDLParameters = CLOCK_FREQ=100MHz; BAUDRATE=115200Bd -[QMAP.io.uart.fifo.nl1] -[XST.io.uart.fifo.nl2] -[VIVADO.io.uart.fifo.nl3] -[LSE.io.uart.fifo.nl4] - -[IP.io.uart.ft245] - -# PoC.mem -# ============================================================================== - -# PoC.mem.ddr2 -# ------------------------------------------------------------------------------ -[IP.mem.ddr2.mem2mig_adapter_Spartan6] - -# PoC.mem.ddr3 -# ------------------------------------------------------------------------------ -[IP.mem.ddr3.mem2mig_adapter_Series7] - -# PoC.mem.lut -# ------------------------------------------------------------------------------ -[IP.mem.lut.Sine] -tb = VHDLTestbench -[TB.mem.lut.Sine.tb] - -# PoC.mem.ocram -# ------------------------------------------------------------------------------ -[IP.mem.ocram.esdp] -tb = VHDLTestbench -nl1 = LSENetlist -nl2 = QuartusNetlist -nl3 = XSTNetlist -nl4 = VivadoNetlist -HDLParameters = A_BITS=12; D_BITS=16 -[TB.mem.ocram.esdp.tb] -[LSE.mem.ocram.esdp.nl1] -[QMAP.mem.ocram.esdp.nl2] -[XST.mem.ocram.esdp.nl3] -[VIVADO.mem.ocram.esdp.nl4] - - -[IP.mem.ocram.sdp] -tb = VHDLTestbench -nl1 = LSENetlist -nl2 = QuartusNetlist -nl3 = XSTNetlist -nl4 = VivadoNetlist -HDLParameters = A_BITS=12; D_BITS=16 -[TB.mem.ocram.sdp.tb] -[LSE.mem.ocram.sdp.nl1] -[QMAP.mem.ocram.sdp.nl2] -[XST.mem.ocram.sdp.nl3] -[VIVADO.mem.ocram.sdp.nl4] - -[IP.mem.ocram.sdp_wf] -tb = VHDLTestbench -nl1 = LSENetlist -nl2 = QuartusNetlist -nl3 = XSTNetlist -nl4 = VivadoNetlist -HDLParameters = A_BITS=12; D_BITS=16 -[TB.mem.ocram.sdp_wf.tb] -[LSE.mem.ocram.sdp_wf.nl1] -[QMAP.mem.ocram.sdp_wf.nl2] -[XST.mem.ocram.sdp_wf.nl3] -[VIVADO.mem.ocram.sdp_wf.nl4] - -[IP.mem.ocram.sp] -tb = VHDLTestbench -nl1 = LSENetlist -nl2 = QuartusNetlist -nl3 = XSTNetlist -nl4 = VivadoNetlist -HDLParameters = A_BITS=12; D_BITS=16 -[TB.mem.ocram.sp.tb] -[LSE.mem.ocram.sp.nl1] -[QMAP.mem.ocram.sp.nl2] -[XST.mem.ocram.sp.nl3] -[VIVADO.mem.ocram.sp.nl4] - - -[IP.mem.ocram.tdp] -tb = VHDLTestbench -nl1 = LSENetlist -nl2 = QuartusNetlist -nl3 = XSTNetlist -nl4 = VivadoNetlist -HDLParameters = A_BITS=12; D_BITS=16 -[TB.mem.ocram.tdp.tb] -[LSE.mem.ocram.tdp.nl1] -[QMAP.mem.ocram.tdp.nl2] -[XST.mem.ocram.tdp.nl3] -[VIVADO.mem.ocram.tdp.nl4] - -[IP.mem.ocram.tdp_wf] -tb = VHDLTestbench -nl1 = LSENetlist -nl2 = QuartusNetlist -nl3 = XSTNetlist -nl4 = VivadoNetlist -HDLParameters = A_BITS=12; D_BITS=16 -[TB.mem.ocram.tdp_wf.tb] -[LSE.mem.ocram.tdp_wf.nl1] -[QMAP.mem.ocram.tdp_wf.nl2] -[XST.mem.ocram.tdp_wf.nl3] -[VIVADO.mem.ocram.tdp_wf.nl4] - - -# PoC.mem.ocrom -# ------------------------------------------------------------------------------ -[IP.mem.ocrom.sp] - - -[IP.mem.ocrom.dp] - -# PoC.mem.sdram -# ------------------------------------------------------------------------------ -[IP.mem.sdram.ctrl_s3esk] -nl = XSTNetlist -HDLParameters = CLK_PERIOD=10.0; BL=2 -[XST.mem.sdram.ctrl_s3esk.nl] - - -[IP.mem.sdram.ctrl_de0] -nl = QuartusNetlist -HDLParameters = CLK_PERIOD=7.5; CL=2; BL=1 -[QMAP.mem.sdram.ctrl_de0.nl] - - -# PoC.misc -# ============================================================================== -[IP.misc.Delay] - - -[IP.misc.FrequencyMeasurement] - - -[IP.misc.PulseTrain] - - -[IP.misc.Sequencer] - - -[IP.misc.StrobeGenerator] - - -[IP.misc.StrobeLimiter] - - -[IP.misc.WorkAligner] - -# PoC.misc.filter -# ------------------------------------------------------------------------------ -[IP.misc.filter.and] - - -[IP.misc.filter.mean] - - -[IP.misc.filter.or] - -# PoC.misc.gearbox -# ------------------------------------------------------------------------------ -[IP.misc.gearbox.down_cc] -tb = VHDLTestbench -nl = XSTNetlist -HDLParameters = INPUT_BITS=32; OUTPUT_BITS=8; ADD_INPUT_REGISTERS=TRUE; ADD_OUTPUT_REGISTERS=TRUE -[TB.misc.gearbox.down_cc.tb] -[XST.misc.gearbox.down_cc.nl] -XSTConstraintsFile = ${XSTNoConstraintsFile} - - -[IP.misc.gearbox.down_dc] -tb = VHDLTestbench -nl = XSTNetlist -HDLParameters = INPUT_BITS=32; OUTPUT_BITS=8; ADD_INPUT_REGISTERS=TRUE; ADD_OUTPUT_REGISTERS=TRUE -[TB.misc.gearbox.down_dc.tb] -[XST.misc.gearbox.down_dc.nl] -XSTConstraintsFile = ${XSTNoConstraintsFile} - -[IP.misc.gearbox.up_cc] -tb = VHDLTestbench -nl = XSTNetlist -HDLParameters = INPUT_BITS=8; OUTPUT_BITS=32; ADD_INPUT_REGISTERS=TRUE -[TB.misc.gearbox.up_cc.tb] -[XST.misc.gearbox.up_cc.nl] -XSTConstraintsFile = ${XSTNoConstraintsFile} - - -[IP.misc.gearbox.up_dc] -tb = VHDLTestbench -nl = XSTNetlist -HDLParameters = INPUT_BITS=8; OUTPUT_BITS=32; ADD_INPUT_REGISTERS=TRUE -[TB.misc.gearbox.up_dc.tb] -[XST.misc.gearbox.up_dc.nl] -XSTConstraintsFile = ${XSTNoConstraintsFile} - - -# PoC.misc.stat -# ------------------------------------------------------------------------------ -[IP.misc.stat.Average] -tb = VHDLTestbench -[TB.misc.stat.Average.tb] - -[IP.misc.stat.Histogram] -tb = VHDLTestbench -[TB.misc.stat.Histogram.tb] - -[IP.misc.stat.Minimum] -tb = VHDLTestbench -[TB.misc.stat.Minimum.tb] - -[IP.misc.stat.Maximum] -tb = VHDLTestbench -[TB.misc.stat.Maximum.tb] - -# PoC.misc.sync -# ------------------------------------------------------------------------------ -[IP.misc.sync.Bits] -tb = VHDLTestbench -nl1 = QuartusNetlist -nl2 = XSTNetlist -nl3 = VivadoNetlist -nl4 = LSENetlist -[TB.misc.sync.Bits.tb] -[QMAP.misc.sync.Bits.nl1] -[XST.misc.sync.Bits.nl2] -[VIVADO.misc.sync.Bits.nl3] -[LSE.misc.sync.Bits.nl4] - -[IP.misc.sync.Reset] -tb = VHDLTestbench -[TB.misc.sync.Reset.tb] - -[IP.misc.sync.Pulse] -# tb = VHDLTestbench -[TB.misc.sync.Pulse.tb] - -[IP.misc.sync.Strobe] -tb = VHDLTestbench -[TB.misc.sync.Strobe.tb] - -[IP.misc.sync.Vector] -tb = VHDLTestbench -[TB.misc.sync.Vector.tb] - -[IP.misc.sync.Command] -tb = VHDLTestbench -[TB.misc.sync.Command.tb] - -# PoC.net -# ============================================================================== -[IP.net.FrameChecksum] - - -[IP.net.FrameLoopback] - -# PoC.net.arp -# ------------------------------------------------------------------------------ -[IP.net.arp.BroadCast_Receiver] - - -[IP.net.arp.BroadCast_Requester] - - -[IP.net.arp.Cache] - - -[IP.net.arp.IPPool] - - -[IP.net.arp.Tester] - - -[IP.net.arp.UniCast_Receiver] - - -[IP.net.arp.UniCast_Responder] - - -[IP.net.arp.Wrapper] - -# PoC.net.eth -# ------------------------------------------------------------------------------ -[IP.net.eth.GEMAC_GMII] - - -[IP.net.eth.GEMAC_RX] - - -[IP.net.eth.GEMAC_TX] - -[IP.net.eth.GMII_SGMII_PCS_Virtex5] -cg = CoreGenNetlist -[XST.net.eth.GMII_SGMII_PCS_Virtex5.nl] -CoreGeneratorFile = ${SrcDir}/Xilinx/Virtex5/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - - -[IP.net.eth.GMII_SGMII_PCS_Virtex6] -cg = CoreGenNetlist -[XST.net.eth.GMII_SGMII_PCS_Virtex6.nl] -CoreGeneratorFile = ${SrcDir}/Xilinx/Virtex6/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - -[IP.net.eth.GMII_SGMII_PCS_Series7] -cg = CoreGenNetlist -[XST.net.eth.GMII_SGMII_PCS_Series7.nl] -CoreGeneratorFile = ${SrcDir}/Xilinx/Series7/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - - -[IP.net.eth.PHYController] - - -[IP.net.eth.PHYController_Marvell_88E1111] - - -[IP.net.eth.Wrapper] - -# PoC.net.eth10g -# ------------------------------------------------------------------------------ -[IP.net.eth10g.PCS_PMA_Series7] -nl = CoreGenNetlist -[XST.net.eth10g.PCS_PMA_Series7.nl] -CoreGeneratorFile = ${SrcDir}/Xilinx/Series7/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${SPECIAL:OutputDir}/${TopLevel}/example_design/${TopLevel}_block.vhd -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}_block.vhdl - ${SPECIAL:OutputDir}/${TopLevel}/example_design/gtx/${TopLevel}_gtwizard_10gbaser.vhd -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}_gtwizard_10gbaser.vhdl - ${SPECIAL:OutputDir}/${TopLevel}/example_design/gtx/${TopLevel}_gtwizard_10gbaser_gt.vhd -> ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}_gtwizard_10gbaser_gt.vhdl -PostReplaceRules = ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.vhdl :: "-- synthesis translate_off\n" -> "" - ${PoC:NLDir}/${SPECIAL:Device}/${RelDir}/${TopLevel}.vhdl :: "end eth10g_PCS_PMA_Series7;\n" -> "end eth10g_PCS_PMA_Series7;\n\n-- synthesis translate_off" - -# PoC.net.icmpv4 -# ------------------------------------------------------------------------------ -[IP.net.icmpv4.RX] - - -[IP.net.icmpv4.TX] - - -[IP.net.icmpv4.Wrapper] - -# PoC.net.icmpv6 -# ------------------------------------------------------------------------------ -[IP.net.icmpv6.RX] - - -[IP.net.icmpv6.TX] - - -[IP.net.icmpv6.Wrapper] - -# PoC.net.ipv4 -# ------------------------------------------------------------------------------ -[IP.net.ipv4.FrameLoopback] - - -[IP.net.ipv4.RX] - - -[IP.net.ipv4.TX] - - -[IP.net.ipv4.Wrapper] - -# PoC.net.ipv6 -# ------------------------------------------------------------------------------ -[IP.net.ipv6.FrameLoopback] - - -[IP.net.ipv6.RX] - - -[IP.net.ipv6.TX] - - -[IP.net.ipv6.Wrapper] - -# PoC.net.mac -# ------------------------------------------------------------------------------ -[IP.net.mac.FrameLoopback] - - -[IP.net.mac.RX_DestMAC_Switch] - - -[IP.net.mac.RX_SrcMAC_Filter] - - -[IP.net.mac.RX_Type_Switch] - - -[IP.net.mac.TX_DestMAC_Prepender] - - -[IP.net.mac.TX_SrcMAC_Prepender] - - -[IP.net.mac.TX_Type_Prepender] - - -[IP.net.mac.Wrapper] - -# PoC.net.ndp -# ------------------------------------------------------------------------------ -[IP.net.ndp.DestinationCache] - - -[IP.net.ndp.FSMQuery] - - -[IP.net.ndp.NeighborCache] - - -[IP.net.ndp.Wrapper] - -# PoC.net.stack -# ------------------------------------------------------------------------------ -[IP.net.stack.MAC] - - -[IP.net.stack.IPv4] - - -[IP.net.stack.IPv6] - - -[IP.net.stack.UDPv4] - - -[IP.net.stack.UDPv6] - -# PoC.net.udp -# ------------------------------------------------------------------------------ -[IP.net.udp.FrameLoopback] - - -[IP.net.udp.RX] - - -[IP.net.udp.TX] - - -[IP.net.udp.Wrapper] - - -# PoC.sim -# ============================================================================== -[IP.sim.ClockGenerator] -Visibility = Private -tb = VHDLTestbench -[TB.sim.ClockGenerator.tb] - -[IP.sim.VCDParser] -tb = VHDLTestbench -[TB.sim.VCDParser.tb] - -[IP.sim.Waveform] -Visibility = Private -tb = VHDLTestbench -[TB.sim.Waveform.tb] - -# PoC.sort -# ============================================================================== -[IP.sort.ExpireList] -tb = VHDLTestbench -[TB.sort.ExpireList.tb] - -[IP.sort.InsertSort] -tb = VHDLTestbench -[TB.sort.InsertSort.tb] - -[IP.sort.LeastFrequentlyUsed] -tb = VHDLTestbench -[TB.sort.LeastFrequentlyUsed.tb] - -[IP.sort.lru_cache] -tb = VHDLTestbench -cocotb = CocoTestbench -[TB.sort.lru_cache.tb] -[COCOTB.sort.lru_cache.cocotb] - -[IP.sort.lru_list] -# tb = VHDLTestbench -cocotb = CocoTestbench -# [TB.sort.lru_list.tb] -[COCOTB.sort.lru_list.cocotb] - -# PoC.sort.sortnet -# ------------------------------------------------------------------------------ -[IP.sort.sortnet.BitonicSort] -tb = VHDLTestbench -nl1 = LSENetlist -nl2 = QuartusNetlist -nl3 = XSTNetlist -nl4 = VivadoNetlist -HDLParameters = INPUTS=32; KEY_BITS=32; DATA_BITS=64; PIPELINE_STAGE_AFTER=2 -[TB.sort.sortnet.BitonicSort.tb] -[LSE.sort.sortnet.BitonicSort.nl1] -# VHDLGenerics = INPUTS=32; KEY_BITS=33; DATA_BITS=65; PIPELINE_STAGE_AFTER=2 -[QMAP.sort.sortnet.BitonicSort.nl2] -[XST.sort.sortnet.BitonicSort.nl3] -[VIVADO.sort.sortnet.BitonicSort.nl4] - - -[IP.sort.sortnet.OddEvenMergeSort] -tb = VHDLTestbench -nl1 = LSENetlist -nl2 = QuartusNetlist -nl3 = XSTNetlist -nl4 = VivadoNetlist -HDLParameters = INPUTS=32; KEY_BITS=32; DATA_BITS=64; PIPELINE_STAGE_AFTER=2 -[TB.sort.sortnet.OddEvenMergeSort.tb] -[LSE.sort.sortnet.OddEvenMergeSort.nl1] -[QMAP.sort.sortnet.OddEvenMergeSort.nl2] -[XST.sort.sortnet.OddEvenMergeSort.nl3] -[VIVADO.sort.sortnet.OddEvenMergeSort.nl4] - -[IP.sort.sortnet.OddEvenSort] -tb = VHDLTestbench -nl1 = LSENetlist -nl2 = QuartusNetlist -nl3 = XSTNetlist -nl4 = VivadoNetlist -HDLParameters = INPUTS=32; KEY_BITS=32; DATA_BITS=64; PIPELINE_STAGE_AFTER=2 -[TB.sort.sortnet.OddEvenSort.tb] -[LSE.sort.sortnet.OddEvenSort.nl1] -[QMAP.sort.sortnet.OddEvenSort.nl2] -[XST.sort.sortnet.OddEvenSort.nl3] -[VIVADO.sort.sortnet.OddEvenSort.nl4] - - -[IP.sort.sortnet.MergeSort_Streamed] - - -[IP.sort.sortnet.Transform] - - -[IP.sort.sortnet.Stream_Adapter] -tb = VHDLTestbench -[TB.sort.sortnet.Stream_Adapter.tb] - -[IP.sort.sortnet.Stream_Adapter2] -tb = VHDLTestbench -[TB.sort.sortnet.Stream_Adapter2.tb] - -# PoC.xil -# ============================================================================== -[IP.xil.BSCAN] - - -[IP.xil.ChipScopeICON] -Dependencies = CG:PoC.xil.ChipScopeICON_1 - CG:PoC.xil.ChipScopeICON_2 - CG:PoC.xil.ChipScopeICON_3 - CG:PoC.xil.ChipScopeICON_4 - CG:PoC.xil.ChipScopeICON_5 - CG:PoC.xil.ChipScopeICON_6 - CG:PoC.xil.ChipScopeICON_7 - CG:PoC.xil.ChipScopeICON_8 - CG:PoC.xil.ChipScopeICON_9 - CG:PoC.xil.ChipScopeICON_10 - CG:PoC.xil.ChipScopeICON_11 - CG:PoC.xil.ChipScopeICON_12 - CG:PoC.xil.ChipScopeICON_13 - CG:PoC.xil.ChipScopeICON_14 - CG:PoC.xil.ChipScopeICON_15 - -[IP.xil.ChipScopeICON_1] -cg = CoreGenNetlist -[CG.xil.ChipScopeICON_1.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} -[IP.xil.ChipScopeICON_2] -cg = CoreGenNetlist -[CG.xil.ChipScopeICON_2.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} -[IP.xil.ChipScopeICON_3] -cg = CoreGenNetlist -[CG.xil.ChipScopeICON_3.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} -[IP.xil.ChipScopeICON_4] -cg = CoreGenNetlist -[CG.xil.ChipScopeICON_4.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} -[IP.xil.ChipScopeICON_5] -cg = CoreGenNetlist -[CG.xil.ChipScopeICON_5.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} -[IP.xil.ChipScopeICON_6] -cg = CoreGenNetlist -[CG.xil.ChipScopeICON_6.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} -[IP.xil.ChipScopeICON_7] -cg = CoreGenNetlist -[CG.xil.ChipScopeICON_7.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} -[IP.xil.ChipScopeICON_8] -cg = CoreGenNetlist -[CG.xil.ChipScopeICON_8.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} -[IP.xil.ChipScopeICON_9] -cg = CoreGenNetlist -[CG.xil.ChipScopeICON_9.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} -[IP.xil.ChipScopeICON_10] -cg = CoreGenNetlist -[CG.xil.ChipScopeICON_10.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} -[IP.xil.ChipScopeICON_11] -cg = CoreGenNetlist -[CG.xil.ChipScopeICON_11.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} -[IP.xil.ChipScopeICON_12] -cg = CoreGenNetlist -[CG.xil.ChipScopeICON_12.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} -[IP.xil.ChipScopeICON_13] -cg = CoreGenNetlist -[CG.xil.ChipScopeICON_13.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} -[IP.xil.ChipScopeICON_14] -cg = CoreGenNetlist -[CG.xil.ChipScopeICON_14.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} -[IP.xil.ChipScopeICON_15] -cg = CoreGenNetlist -[CG.xil.ChipScopeICON_15.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} - -[IP.xil.ChipScopeILA_8x4k] -cg = CoreGenNetlist -[CG.xil.ChipScopeILA_8x4k.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} - -[IP.xil.ChipScopeILA_8x32k] -cg = CoreGenNetlist -[CG.xil.ChipScopeILA_8x32k.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} - -[IP.xil.ChipScopeILA_16x4k] -cg = CoreGenNetlist -[CG.xil.ChipScopeILA_16x4k.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} - -[IP.xil.ChipScopeILA_32x4k] -cg = CoreGenNetlist -[CG.xil.ChipScopeILA_32x4k.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} - -[IP.xil.ChipScopeILA_64x4k] -cg = CoreGenNetlist -[CG.xil.ChipScopeILA_64x4k.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} - -[IP.xil.ChipScopeVIO_8x8] -cg = CoreGenNetlist -[CG.xil.ChipScopeVIO_8x8.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -PostCopyRules = ${DefaultPostCopyNGC} - ${DefaultPostCopyVHDL} - ${DefaultPostCopyNCF} - -[IP.xil.Reconfigurator] - - -[IP.xil.SystemMonitor] - -# PoC.xil.mig -# ------------------------------------------------------------------------------ -[IP.xil.mig.Atlys_1x128] -nl = XSTNetlist -cg = CoreGenNetlist -# step 1: coregen -[CG.xil.mig.Atlys_1x128.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -RulesFile = ${DefaultRulesFile} -# step 2: generate netlist -[XST.xil.mig.Atlys_1x128.nl] -Dependencies = CG.xil.mig.Atlys_1x128.cg -# use .files file from "xst" directory -FilesFile = ${XSTDir}/${IP.%{Parent}:EntityPrefix}_${IP.%{Parent}:Name}.files -RulesFile = ${DefaultRulesFile} -XSTConstraintsFile = ${XSTDir}/${TopLevel}.xcf -# example for different clock and no clock buffer -#HDLParameters = C3_CLKOUT2_DIVIDE=8; C3_INPUT_CLK_TYPE="NONE" - - -[IP.xil.mig.KC705_MT8JTF12864HZ_1G6] -nl = XSTNetlist -cg = CoreGenNetlist -# step 1: coregen -[CG.xil.mig.KC705_MT8JTF12864HZ_1G6.cg] -CoreGeneratorFile = ${SrcDir}/${TopLevel}.xco -RulesFile = ${DefaultRulesFile} -tempDir = ${SPECIAL:OutputDir}/${TopLevel} -dstDir = ${PoC:NLDir}/${SPECIAL:Device}/${RelDir} -# step 2: generate netlist -[XST.xil.mig.KC705_MT8JTF12864HZ_1G6.nl] -Dependencies = CG.xil.mig.KC705_MT8JTF12864HZ_1G6.cg -# use .files file from "xst" directory -FilesFile = ${XSTDir}/${IP.%{Parent}:EntityPrefix}_${IP.%{Parent}:Name}.files -RulesFile = ${DefaultRulesFile} -netlistDir = ${PoC:NLDir}/${SPECIAL:Device}/${RelDir} -XSTConstraintsFile = ${netlistDir}/${TopLevel}.xcf -# set TEMP_MON_CONTROL="EXTERNAL" if the temperature is supplied by an external XADC instance -HDLParameters = TEMP_MON_CONTROL="INTERNAL" diff --git a/.pyIPCMI/config.structure.ini b/.pyIPCMI/config.structure.ini deleted file mode 100644 index 4ef1f0a00..000000000 --- a/.pyIPCMI/config.structure.ini +++ /dev/null @@ -1,405 +0,0 @@ -# EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- -# vim: tabstop=2:shiftwidth=2:noexpandtab -# kate: tab-width 2; replace-tabs off; indent-width 2; -# -# ============================================================================== -# Authors: Patrick Lehmann -# -# Config file: Global configuration file -# -# Description: -# ------------------------------------ -# This file defines: -# - common directory names -# - directory names for sub namespaces -# - prefixes for namespaces -# -# License: -# ============================================================================== -# Copyright 2007-2016 Technische Universitaet Dresden - Germany -# Chair of VLSI-Design, Diagnostics and Architecture -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -# -[PoC] -Name = -DirectoryName = -# Path = -Prefix = -EntityPrefix = -RelDir = -SrcDir = ${INSTALL.PoC:InstallationDirectory}/${CONFIG.DirectoryNames:HDLSourceFiles} -TBDir = ${INSTALL.PoC:InstallationDirectory}/${CONFIG.DirectoryNames:TestbenchFiles} -SimDir = ${INSTALL.PoC:InstallationDirectory}/${CONFIG.DirectoryNames:SimulatorFiles} -NLDir = ${INSTALL.PoC:InstallationDirectory}/${CONFIG.DirectoryNames:NetlistFiles} -XSTDir = ${INSTALL.PoC:InstallationDirectory}/${CONFIG.DirectoryNames:ISESynthesisFiles} -QMAPDir = ${INSTALL.PoC:InstallationDirectory}/${CONFIG.DirectoryNames:QuartusSynthesisFiles} -alt = Namespace -arith = Namespace -bus = Namespace -cache = Namespace -comm = Namespace -common = Namespace -dstruct = Namespace -fifo = Namespace -io = Namespace -lib = Namespace -mem = Namespace -misc = Namespace -net = Namespace -sim = Namespace -sort = Namespace -xil = Namespace - -[PoC.alt] - -[PoC.arith] -addw = Entity -carrychain_inc = Entity -convert_bin2bcd = Entity -counter_bcd = Entity -counter_free = Entity -counter_gray = Entity -counter_ring = Entity -div = Entity -firstone = Entity -muls_wide = Entity -prefix_and = Entity -prefix_or = Entity -prng = Entity -same = Entity -scaler = Entity -shifter_barrel = Entity -sqrt = Entity - -[PoC.bus] -stream = Namespace -wb = Namespace -Arbiter = Entity - -[PoC.bus.stream] -Buffer = Entity -DeMux = Entity -FrameGenerator = Entity -Mirror = Entity -Mux = Entity -Sink = Entity -Source = Entity - -[PoC.bus.wb] -fifo_adapter = Entity -ocram_adapter = Entity -uart_wrapper = Entity - -[PoC.cache] -cpu = Entity -mem = Entity -par = Entity -par2 = Entity -replacement_policy = Entity -tagunit_par = Entity -tagunit_seq = Entity - -[PoC.comm] -crc = Entity -scamble = Entity - -[PoC.common] -config = Entity -strings = Entity -physical = Entity - -[PoC.dstruct] -deque = Entity -stack = Entity - -[PoC.fifo] -cc_got = Entity -cc_got_tempgot = Entity -cc_got_tempput = Entity -ic_assembly = Entity -ic_got = Entity -glue = Entity - -[PoC.io] -ddrio = Namespace -device = Namespace -iic = Namespace -jtag = Namespace -lcd = Namespace -mdio = Namespace -ow = Namespace -pio = Namespace -pmod = Namespace -uart = Namespace -Debounce = Entity -7SegmentMux_BCD = Entity -7SegmentMux_HEX = Entity -FanControl = Entity -FrequencyCounter = Entity -GlitchFilter = Entity -PulseWidthModulation = Entity -TimingCounter = Entity - -[PoC.io.ddrio] -in = Entity -inout = Entity -out = Entity - -[PoC.io.device] -# DS1820Controller = Entity - -[PoC.io.iic] -BusController = Entity -Controller = Entity -Switch_PCA9548A = Entity - -[PoC.io.jtag] - -[PoC.io.lcd] -dotmatrix = Entity -LCDBuffer = Entity -LCDSynchronizer = Entity - -[PoC.io.mdio] -IIC_Adapter = Entity -Controller = Entity - -[PoC.io.ow] -BusController = Entity -Controller = Entity - -[PoC.io.pio] - -[PoC.io.pmod] -KYPD = Entity -SSD = Entity -USBUART = Entity - -[PoC.io.uart] -rx = Entity -tx = Entity -fifo = Entity -ft245 = Entity - -[PoC.lib] - -[PoC.mem] -ddr2 = Namespace -ddr3 = Namespace -lut = Namespace -ocram = Namespace -ocrom = Namespace -sdram = Namespace - -[PoC.mem.ddr2] -mem2mig_adapter_Spartan6 = Entity - -[PoC.mem.ddr3] -mem2mig_adapter_Series7 = Entity - -[PoC.mem.lut] -Sine = Entity - -[PoC.mem.ocram] -esdp = Entity -sdp = Entity -sdp_wf = Entity -sp = Entity -tdp = Entity -tdp_wf = Entity - -[PoC.mem.ocrom] -sp = Entity -dp = Entity - -[PoC.mem.sdram] -ctrl_s3esk = Entity -ctrl_de0 = Entity - -[PoC.misc] -filter = Namespace -gearbox = Namespace -stat = Namespace -sync = Namespace -Delay = Entity -FrequencyMeasurement = Entity -PulseTrain = Entity -Sequencer = Entity -StrobeGenerator = Entity -StrobeLimiter = Entity -WorkAligner = Entity - -[PoC.misc.filter] -and = Entity -mean = Entity -or = Entity - -[PoC.misc.gearbox] -down_cc = Entity -down_dc = Entity -up_cc = Entity -up_dc = Entity - -[PoC.misc.stat] -Average = Entity -Histogram = Entity -Minimum = Entity -Maximum = Entity - -[PoC.misc.sync] -Bits = Entity -Pulse = Entity -Reset = Entity -Strobe = Entity -Vector = Entity -Command = Entity - -[PoC.net] -arp = Namespace -eth = Namespace -eth10g = Namespace -icmpv4 = Namespace -icmpv6 = Namespace -ipv4 = Namespace -ipv6 = Namespace -mac = Namespace -ndp = Namespace -stack = Namespace -udp = Namespace -FrameChecksum = Entity -FrameLoopback = Entity - -[PoC.net.arp] -BroadCast_Receiver = Entity -BroadCast_Requester = Entity -Cache = Entity -IPPool = Entity -Tester = Entity -UniCast_Receiver = Entity -UniCast_Responder = Entity -Wrapper = Entity - -[PoC.net.eth] -GEMAC_GMII = Entity -GEMAC_RX = Entity -GEMAC_TX = Entity -PHYController = Entity -PHYController_Marvell_88E1111 = Entity -Wrapper = Entity - -[PoC.net.eth10g] - -[PoC.net.icmpv4] -RX = Entity -TX = Entity -Wrapper = Entity - -[PoC.net.icmpv6] -TX = Entity -RX = Entity -Wrapper = Entity - -[PoC.net.ipv4] -FrameLoopback = Entity -RX = Entity -TX = Entity -Wrapper = Entity - -[PoC.net.ipv6] -FrameLoopback = Entity -RX = Entity -TX = Entity -Wrapper = Entity - -[PoC.net.mac] -FrameLoopback = Entity -RX_DestMAC_Switch = Entity -RX_SrcMAC_Filter = Entity -RX_Type_Switch = Entity -TX_DestMAC_Prepender = Entity -TX_SrcMAC_Prepender = Entity -TX_Type_Prepender = Entity -Wrapper = Entity - -[PoC.net.ndp] -DestinationCache = Entity -FSMQuery = Entity -NeighborCache = Entity -Wrapper = Entity - -[PoC.net.stack] -MAC = Entity -IPv4 = Entity -IPv6 = Entity -UDPv4 = Entity -UDPv6 = Entity - -[PoC.net.udp] -FrameLoopback = Entity -RX = Entity -TX = Entity -Wrapper = Entity - - -[PoC.sim] -ClockGenerator = Entity -VCDParser = Entity -Waveform = Entity - -[PoC.sort] -sortnet = Namespace -lru_cache = Entity -lru_list = Entity - -[PoC.sort.sortnet] -BitonicSort = Entity -OddEvenSort = Entity -OddEvenMergeSort = Entity -MergeSort_Streamed = Entity -Stream_Adapter = Entity -Stream_Adapter2 = Entity -Transform = Entity - -[PoC.xil] -mig = Namespace -BSCAN = Entity -ChipScopeICON = Entity -ChipScopeICON_1 = Entity -ChipScopeICON_2 = Entity -ChipScopeICON_3 = Entity -ChipScopeICON_4 = Entity -ChipScopeICON_5 = Entity -ChipScopeICON_6 = Entity -ChipScopeICON_7 = Entity -ChipScopeICON_8 = Entity -ChipScopeICON_9 = Entity -ChipScopeICON_10 = Entity -ChipScopeICON_11 = Entity -ChipScopeICON_12 = Entity -ChipScopeICON_13 = Entity -ChipScopeICON_14 = Entity -ChipScopeICON_15 = Entity -ChipScopeILA_8x4k = Entity -ChipScopeILA_8x32k = Entity -ChipScopeILA_16x4k = Entity -ChipScopeILA_32x4k = Entity -ChipScopeILA_64x4k = Entity -ChipScopeVIO_8x8 = Entity -Reconfigurator = Entity -SystemMonitor = Entity - -[PoC.xil.mig] -Atlys_1x128 = Entity -KC705_MT8JTF12864HZ_1G6 = Entity diff --git a/PoC.pro b/PoC.pro new file mode 100644 index 000000000..cafa35470 --- /dev/null +++ b/PoC.pro @@ -0,0 +1 @@ +include ./src diff --git a/README.md b/README.md index 1e8a6638a..fd17d0340 100644 --- a/README.md +++ b/README.md @@ -114,16 +114,10 @@ SSH | `git clone --recursive ssh://git@github.com:VHDL/PoC.git PoC` To explore PoC's full potential, it's required to configure some paths and synthesis or simulation tool chains. The following commands start a guided configuration process. Please follow the instructions on screen. It's possible to relaunch the process at any time, for example to register new tools or to update -tool versions. See [Configuration][231] for more details. Run the following command line instructions to -configure PoC on your local system: +tool versions. See [Configuration][231] for more details. -```PowerShell -cd PoCRoot -.\poc.ps1 configure -``` - -Use the keyboard buttons: `Y` to accept, `N` to decline, `P` to skip/pass a step and `Return` to accept -a default value displayed in brackets. +> [!CAUTION] +> Outdated, needs refinement [231]: http://VHDL.github.io/PoC/UsingPoC/PoCConfiguration.html @@ -154,19 +148,7 @@ git commit -m "Added new git submodule PoC in 'lib\PoC' (PoC-Library)." [2411]: http://git-scm.com/book/en/v2/Git-Tools-Submodules [2412]: http://VHDL.github.io/PoC/UsingPoC/Integration.html -#### b) Configuring PoC - -The PoC-Library should be configured to explore its full potential. See [Configuration][2421] for more -details. The following command lines will start the configuration process: - -```powershell -cd ProjectRoot -.\lib\PoC\poc.ps1 configure -``` - -[2421]: http://VHDL.github.io/PoC/UsingPoC/PoCConfiguration.html - -#### c) Creating PoC's `my_config.vhdl` and `my_project.vhdl` Files +#### b) Creating PoC's `project_configuration.vhdl` and `local_configuration.vhdl` Files The PoC-Library needs two VHDL files for its configuration. These files are used to determine the most suitable implementation depending on the provided target information. Copy the following two template @@ -175,11 +157,11 @@ in the files: ```powershell cd ProjectRoot -cp lib\PoC\src\common\my_config.vhdl.template src\common\my_config.vhdl -cp lib\PoC\src\common\my_project.vhdl.template src\common\my_project.vhdl +cp lib\PoC\src\common\project_configuration.vhdl.template src\common\project_configuration.vhdl +cp lib\PoC\src\common\local_configuration.vhdl.template src\common\local_configuration.vhdl ``` -[my_config.vhdl](https://github.com/VHDL/PoC/blob/Vivado/src/common/my_config.vhdl.template) defines +[project_configuration.vhdl](https://github.com/VHDL/PoC/blob/Vivado/src/common/project_configuration.vhdl.template) defines two global constants, which need to be adjusted: ```vhdl @@ -187,34 +169,25 @@ constant MY_BOARD : string := "CHANGE THIS"; -- e.g. Custom, ML505, K constant MY_DEVICE : string := "CHANGE THIS"; -- e.g. None, XC5VLX50T-1FF1136, EP2SGX90FF1508C3 ``` -[my_project.vhdl](https://github.com/VHDL/PoC/blob/Vivado/src/common/my_project.vhdl.template) also +[local_configuration.vhdl](https://github.com/VHDL/PoC/blob/Vivado/src/common/local_configuration.vhdl.template) also defines two global constants, which need to be adjusted: ```vhdl -constant MY_PROJECT_DIR : string := "CHANGE THIS"; -- e.g. d:/vhdl/myproject/, /home/me/projects/myproject/" -constant MY_OPERATING_SYSTEM : string := "CHANGE THIS"; -- e.g. WINDOWS, LINUX +constant LOCAL_PROJECT_DIR : string := "CHANGE THIS"; -- e.g. d:/vhdl/myproject/, /home/me/projects/myproject/" ``` -Further informations are provided at [Creating my_config/my_project.vhdl][2431]. +Further informations are provided at [Creating project_configuration/local_configuration.vhdl][2431]. [2431]: http://VHDL.github.io/PoC/UsingPoC/VHDLConfiguration.html -#### d) Adding PoC's Common Packages to a Synthesis or Simulation Project +#### c) Adding PoC's Common Packages to a Synthesis or Simulation Project PoC is shipped with a set of common packages, which are used by most of its modules. These packages are stored in the `PoCRoot\src\common` directory. PoC also provides a VHDL context in `common.vhdl` , which can be used to reference all packages at once. -#### e) Adding PoC's Simulation Packages to a Simulation Project - -Simulation projects additionally require PoC's simulation helper packages, which are located in the -`PoCRoot\src\sim` directory. Because some VHDL version are incompatible among each other, PoC uses -version suffixes like `*.v93.vhdl` or `*.v08.vhdl` in the file name to denote the supported VHDL version -of a file. - - -#### f) Compiling Shipped IP Cores +#### d) Compiling Shipped IP Cores Some IP Cores are shipped as pre-configured vendor IP Cores. If such IP cores shall be used in a HDL project, it's recommended to use PoC to create, compile and if needed patch these IP cores. See @@ -256,17 +229,11 @@ is always the same and based on PoC's sub-namespace tree. **Main directory overview:** - [`lib`](lib) - Embedded or linked external libraries. - - [`netlist`](netlist) - Configuration files and output directory for pre-configured netlist synthesis - results from vendor IP cores or from complex PoC controllers. - - [`py`](py) - Supporting Python scripts. - - [`sim`](sim) - Pre-configured waveform views for selected testbenches. - [`src`](src) - PoC's source files grouped into sub-folders according to the sub-namespace tree. - [`tb`](tb) - Testbench files. - - [`tcl`](tcl) - Tcl files. - [`temp`](temp) - Automatically created temporary directors for various tools used by PoC's Python scripts. - [`tools`](tools) - Settings/highlighting files and helpers for supported tools. - [`ucf`](ucf) - Pre-configured constraint files (\*.ucf, \*.xdc, \*.sdc) for supported FPGA boards. - - [`xst`](xst) - Configuration files to synthesize PoC modules with Xilinx XST into a netlist. All VHDL source files should be compiled into the VHDL library `PoC`. If not indicated otherwise, all diff --git a/docs/Entity.template b/docs/Entity.template index 1f5f5b04d..203ae7158 100644 --- a/docs/Entity.template +++ b/docs/Entity.template @@ -7,11 +7,11 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/{SourceRelPath} + :target: https://github.com/VHDL/PoC/blob/main/src/{SourceRelPath} :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/{TestbenchRelPath} + :target: https://github.com/VHDL/PoC/blob/main/tb/{TestbenchRelPath} :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/GetInvolved/index.rst b/docs/GetInvolved/index.rst index 1991dd47d..2dd7c6c3e 100644 --- a/docs/GetInvolved/index.rst +++ b/docs/GetInvolved/index.rst @@ -29,15 +29,15 @@ Report a Bug ************ .. #image:: https://img.shields.io/github/issues/VLSI-EDA/PoC.svg - :target: https://github.com/VLSI-EDA/PoC/issues + :target: https://github.com/VHDL/PoC/issues .. #image:: https://img.shields.io/github/issues-closed/VLSI-EDA/PoC.svg - :target: https://github.com/VLSI-EDA/PoC/issues + :target: https://github.com/VHDL/PoC/issues Please report issues of any kind in our Git provider's issue tracker. This allows us to categorize issues into groups and assign developers to them. You can track the issue's state and see how it's getting solved. All enhancements and feature requests are tracked on GitHub at -`GitHub Issues `_. +`GitHub Issues `_. Feature Request @@ -47,7 +47,7 @@ Please report missing features of any kind. We are allways looking forward to provide a full feature set. Please use our Git provider's issue tracker to report enhancements and feature requests, so you can track the request's status and implementation. All enhancements and feature requests are tracked on GitHub at -`GitHub Issues `_. +`GitHub Issues `_. Talk to us on Gitter @@ -93,7 +93,7 @@ your proposed changes and integrate them into our repository. ========================== .. #image:: https://img.shields.io/github/forks/VLSI-EDA/PoC.svg - :target: https://github.com/VLSI-EDA/PoC/network/members + :target: https://github.com/VHDL/PoC/network/members Git repositories can be cloned on a Git provider's server. This procedure is called *forking*. This allows Git providers to track the repository's network, @@ -209,12 +209,12 @@ Commit your porposed changes onto your feature branch and push all changes to Gi ======================== .. #image:: https://img.shields.io/github/issues-pr/VLSI-EDA/PoC.svg - :target: https://github.com/VLSI-EDA/PoC/pulls + :target: https://github.com/VHDL/PoC/pulls .. #image:: https://img.shields.io/github/issues-pr-closed/VLSI-EDA/PoC.svg - :target: https://github.com/VLSI-EDA/PoC/pulls + :target: https://github.com/VHDL/PoC/pulls Go to your forked repository and klick on "Compare and Pull-Request" or go to -our PoC repository and create a new `pull request `_. +our PoC repository and create a new `pull request `_. If this is your first Pull-Request, you need to sign our Contributers License Agreement (CLA). diff --git a/docs/IPCores/arith/arith.pkg.rst b/docs/IPCores/arith/arith.pkg.rst index 9e207bdf1..35d3c7e06 100644 --- a/docs/IPCores/arith/arith.pkg.rst +++ b/docs/IPCores/arith/arith.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links @@ -24,23 +24,23 @@ This package holds all component declarations for this namespace. .. rubric:: Exported Functions -* ``arith_div_latency`` +* ``arith_Divider_latency`` .. rubric:: Exported Components -* :ref:`PoC.arith.addw ` +* :ref:`PoC.arith.Adder_Wide ` * PoC.arith.carrychain_inc_xilinx -* :ref:`PoC.arith.counter_bcd ` -* :ref:`PoC.arith.counter_gray ` -* :ref:`PoC.arith.div ` -* :ref:`PoC.arith.firstone ` +* :ref:`PoC.arith.Counter_BCD ` +* :ref:`PoC.arith.Counter_Gray ` +* :ref:`PoC.arith.Divider ` +* :ref:`PoC.arith.firstone ` * PoC.arith.inc_ovcy_xilinx * :ref:`PoC.arith.muls_wide ` * PoC.arith.prefix_and_xilinx * PoC.arith.prefix_or_xilinx -* :ref:`PoC.arith.prng ` -* :ref:`PoC.arith.same ` -* :ref:`PoC.arith.sqrt ` +* :ref:`PoC.arith.prng ` +* :ref:`PoC.arith.same ` +* :ref:`PoC.arith.sqrt ` .. only:: latex diff --git a/docs/IPCores/arith/arith_addw.rst b/docs/IPCores/arith/arith_Adder_Wide.rst similarity index 63% rename from docs/IPCores/arith/arith_addw.rst rename to docs/IPCores/arith/arith_Adder_Wide.rst index 5bc595a43..402c02754 100644 --- a/docs/IPCores/arith/arith_addw.rst +++ b/docs/IPCores/arith/arith_Adder_Wide.rst @@ -1,23 +1,23 @@ -.. _IP/arith_addw: +.. _IP/arith_Adder_Wide: -PoC.arith.addw -############## +PoC.arith.Adder_Wide +#################### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_addw.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_Adder_Wide.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_addw_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_Adder_Wide_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Implements wide addition providing several options all based on an adaptation of a carry-select approach. @@ -40,7 +40,7 @@ References: .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/arith/arith_addw.vhdl +.. literalinclude:: ../../../src/arith/arith_Adder_Wide.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -50,4 +50,4 @@ References: .. only:: latex - Source file: :pocsrc:`arith/arith_addw.vhdl ` + Source file: :pocsrc:`arith/arith_Adder_Wide.vhdl ` diff --git a/docs/IPCores/arith/arith_carrychain_inc.rst b/docs/IPCores/arith/arith_CarryChain_inc.rst similarity index 50% rename from docs/IPCores/arith/arith_carrychain_inc.rst rename to docs/IPCores/arith/arith_CarryChain_inc.rst index 8fd23ea4d..ded328b8f 100644 --- a/docs/IPCores/arith/arith_carrychain_inc.rst +++ b/docs/IPCores/arith/arith_CarryChain_inc.rst @@ -1,23 +1,23 @@ -.. _IP/arith_carrychain_inc: +.. _IP/arith_CarryChain_inc: -PoC.arith.carrychain_inc +PoC.arith.CarryChain_inc ######################## .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_carrychain_inc.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_CarryChain_inc.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_carrychain_inc_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_CarryChain_inc_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` This is a generic carry-chain abstraction for increment by one operations. @@ -27,7 +27,7 @@ Y <= X + (0...0) & Cin .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/arith/arith_carrychain_inc.vhdl +.. literalinclude:: ../../../src/arith/arith_CarryChain_inc.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -37,4 +37,4 @@ Y <= X + (0...0) & Cin .. only:: latex - Source file: :pocsrc:`arith/arith_carrychain_inc.vhdl ` + Source file: :pocsrc:`arith/arith_CarryChain_inc.vhdl ` diff --git a/docs/IPCores/arith/arith_Convert_Binary2BCD.rst b/docs/IPCores/arith/arith_Convert_Binary2BCD.rst new file mode 100644 index 000000000..d2f405617 --- /dev/null +++ b/docs/IPCores/arith/arith_Convert_Binary2BCD.rst @@ -0,0 +1,38 @@ +.. _IP/arith_Convert_Binary2BCD: + +PoC.arith.Convert_Binary2BCD +############################ + +.. only:: html + + .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_Convert_Binary2BCD.vhdl + :alt: Source Code on GitHub + .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_Convert_Binary2BCD_tb.vhdl + :alt: Source Code on GitHub + + .. sidebar:: GitHub Links + + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` + +.. TODO:: No documentation available. + + + +.. rubric:: Entity Declaration: + +.. literalinclude:: ../../../src/arith/arith_Convert_Binary2BCD.vhdl + :language: vhdl + :tab-width: 2 + :linenos: + :lines: 40-58 + + + +.. only:: latex + + Source file: :pocsrc:`arith/arith_Convert_Binary2BCD.vhdl ` diff --git a/docs/IPCores/arith/arith_counter_bcd.rst b/docs/IPCores/arith/arith_Counter_BCD.rst similarity index 63% rename from docs/IPCores/arith/arith_counter_bcd.rst rename to docs/IPCores/arith/arith_Counter_BCD.rst index 9c83841de..48f97d88f 100644 --- a/docs/IPCores/arith/arith_counter_bcd.rst +++ b/docs/IPCores/arith/arith_Counter_BCD.rst @@ -1,23 +1,23 @@ -.. _IP/arith_counter_bcd: +.. _IP/arith_Counter_BCD: -PoC.arith.counter_bcd +PoC.arith.Counter_BCD ##################### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_counter_bcd.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_Counter_BCD.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_counter_bcd_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_Counter_BCD_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Counter with output in binary coded decimal (BCD). The number of BCD digits is configurable by ``DIGITS``. @@ -36,7 +36,7 @@ is specified by ``val(3 downto 0)``. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/arith/arith_counter_bcd.vhdl +.. literalinclude:: ../../../src/arith/arith_Counter_BCD.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -46,4 +46,4 @@ is specified by ``val(3 downto 0)``. .. only:: latex - Source file: :pocsrc:`arith/arith_counter_bcd.vhdl ` + Source file: :pocsrc:`arith/arith_Counter_BCD.vhdl ` diff --git a/docs/IPCores/arith/arith_counter_free.rst b/docs/IPCores/arith/arith_Counter_Free.rst similarity index 62% rename from docs/IPCores/arith/arith_counter_free.rst rename to docs/IPCores/arith/arith_Counter_Free.rst index 36af6d9d4..9ce7e0766 100644 --- a/docs/IPCores/arith/arith_counter_free.rst +++ b/docs/IPCores/arith/arith_Counter_Free.rst @@ -1,23 +1,23 @@ -.. _IP/arith_counter_free: +.. _IP/arith_Counter_Free: -PoC.arith.counter_free +PoC.arith.Counter_Free ###################### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_counter_free.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_Counter_Free.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_counter_free_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_Counter_Free_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Implements a free-running counter that generates a strobe signal every DIVIDER-th cycle the increment input was asserted. There is deliberately no @@ -32,7 +32,7 @@ input have been observed. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/arith/arith_counter_free.vhdl +.. literalinclude:: ../../../src/arith/arith_Counter_Free.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -42,4 +42,4 @@ input have been observed. .. only:: latex - Source file: :pocsrc:`arith/arith_counter_free.vhdl ` + Source file: :pocsrc:`arith/arith_Counter_Free.vhdl ` diff --git a/docs/IPCores/arith/arith_Counter_Gray.rst b/docs/IPCores/arith/arith_Counter_Gray.rst new file mode 100644 index 000000000..f521ba242 --- /dev/null +++ b/docs/IPCores/arith/arith_Counter_Gray.rst @@ -0,0 +1,38 @@ +.. _IP/arith_Counter_Gray: + +PoC.arith.Counter_Gray +###################### + +.. only:: html + + .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_Counter_Gray.vhdl + :alt: Source Code on GitHub + .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_Counter_Gray_tb.vhdl + :alt: Source Code on GitHub + + .. sidebar:: GitHub Links + + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` + +.. TODO:: No documentation available. + + + +.. rubric:: Entity Declaration: + +.. literalinclude:: ../../../src/arith/arith_Counter_Gray.vhdl + :language: vhdl + :tab-width: 2 + :linenos: + :lines: 38-51 + + + +.. only:: latex + + Source file: :pocsrc:`arith/arith_Counter_Gray.vhdl ` diff --git a/docs/IPCores/arith/arith_counter_ring.rst b/docs/IPCores/arith/arith_Counter_Ring.rst similarity index 56% rename from docs/IPCores/arith/arith_counter_ring.rst rename to docs/IPCores/arith/arith_Counter_Ring.rst index bc36071df..88a693e34 100644 --- a/docs/IPCores/arith/arith_counter_ring.rst +++ b/docs/IPCores/arith/arith_Counter_Ring.rst @@ -1,23 +1,23 @@ -.. _IP/arith_counter_ring: +.. _IP/arith_Counter_Ring: -PoC.arith.counter_ring +PoC.arith.Counter_Ring ###################### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_counter_ring.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_Counter_Ring.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_counter_ring_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_Counter_Ring_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` This module implements an up/down ring-counter with loadable initial value (``seed``) on reset. The counter can be configured to a Johnson counter by @@ -28,7 +28,7 @@ enabling ``INVERT_FEEDBACK``. The number of counter bits is configurable with .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/arith/arith_counter_ring.vhdl +.. literalinclude:: ../../../src/arith/arith_Counter_Ring.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -38,4 +38,4 @@ enabling ``INVERT_FEEDBACK``. The number of counter bits is configurable with .. only:: latex - Source file: :pocsrc:`arith/arith_counter_ring.vhdl ` + Source file: :pocsrc:`arith/arith_Counter_Ring.vhdl ` diff --git a/docs/IPCores/arith/arith_div.rst b/docs/IPCores/arith/arith_Divider.rst similarity index 60% rename from docs/IPCores/arith/arith_div.rst rename to docs/IPCores/arith/arith_Divider.rst index 3d7aae38a..1081edc82 100644 --- a/docs/IPCores/arith/arith_div.rst +++ b/docs/IPCores/arith/arith_Divider.rst @@ -1,23 +1,23 @@ -.. _IP/arith_div: +.. _IP/arith_Divider: -PoC.arith.div -############# +PoC.arith.Divider +################# .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_div.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_Divider.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_div_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_Divider_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Implementation of a Non-Performing restoring divider with a configurable radix. The multi-cycle division is controlled by 'start' / 'rdy'. A new division is @@ -29,7 +29,7 @@ outputs are undefined in this case. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/arith/arith_div.vhdl +.. literalinclude:: ../../../src/arith/arith_Divider.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -39,4 +39,4 @@ outputs are undefined in this case. .. only:: latex - Source file: :pocsrc:`arith/arith_div.vhdl ` + Source file: :pocsrc:`arith/arith_Divider.vhdl ` diff --git a/docs/IPCores/arith/arith_firstone.rst b/docs/IPCores/arith/arith_FirstOne.rst similarity index 70% rename from docs/IPCores/arith/arith_firstone.rst rename to docs/IPCores/arith/arith_FirstOne.rst index 2db747f72..ff92e5ba9 100644 --- a/docs/IPCores/arith/arith_firstone.rst +++ b/docs/IPCores/arith/arith_FirstOne.rst @@ -1,23 +1,23 @@ -.. _IP/arith_firstone: +.. _IP/arith_FirstOne: -PoC.arith.firstone +PoC.arith.FirstOne ################## .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_firstone.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_FirstOne.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_firstone_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_FirstOne_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Computes from an input word, a word of the same size that has, at most, one bit set. The output contains a set bit at the position of the rightmost @@ -38,7 +38,7 @@ This implementation uses carry chains for wider implementations. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/arith/arith_firstone.vhdl +.. literalinclude:: ../../../src/arith/arith_FirstOne.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -48,4 +48,4 @@ This implementation uses carry chains for wider implementations. .. only:: latex - Source file: :pocsrc:`arith/arith_firstone.vhdl ` + Source file: :pocsrc:`arith/arith_FirstOne.vhdl ` diff --git a/docs/IPCores/arith/arith_prng.rst b/docs/IPCores/arith/arith_PRNG.rst similarity index 64% rename from docs/IPCores/arith/arith_prng.rst rename to docs/IPCores/arith/arith_PRNG.rst index cd1da4e56..b0f49541c 100644 --- a/docs/IPCores/arith/arith_prng.rst +++ b/docs/IPCores/arith/arith_PRNG.rst @@ -1,23 +1,23 @@ -.. _IP/arith_prng: +.. _IP/arith_PRNG: -PoC.arith.prng +PoC.arith.PRNG ############## .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_prng.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_PRNG.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_prng_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_PRNG_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` This module implementes a Pseudo-Random Number Generator (PRNG) with configurable bit count (``BITS``). This module uses an internal list of FPGA @@ -31,7 +31,7 @@ The generated number sequence includes the value all-zeros, but not all-ones. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/arith/arith_prng.vhdl +.. literalinclude:: ../../../src/arith/arith_PRNG.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -41,4 +41,4 @@ The generated number sequence includes the value all-zeros, but not all-ones. .. only:: latex - Source file: :pocsrc:`arith/arith_prng.vhdl ` + Source file: :pocsrc:`arith/arith_PRNG.vhdl ` diff --git a/docs/IPCores/arith/arith_prefix_and.rst b/docs/IPCores/arith/arith_Prefix_And.rst similarity index 54% rename from docs/IPCores/arith/arith_prefix_and.rst rename to docs/IPCores/arith/arith_Prefix_And.rst index bfbb17bb5..f0b46cac8 100644 --- a/docs/IPCores/arith/arith_prefix_and.rst +++ b/docs/IPCores/arith/arith_Prefix_And.rst @@ -1,23 +1,23 @@ -.. _IP/arith_prefix_and: +.. _IP/arith_Prefix_And: -PoC.arith.prefix_and +PoC.arith.Prefix_And #################### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_prefix_and.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_Prefix_And.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_prefix_and_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_Prefix_And_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Prefix AND computation: ``y(i) <= '1' when x(i downto 0) = (i downto 0 => '1') else '0';`` @@ -27,7 +27,7 @@ This implementation uses carry chains for wider implementations. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/arith/arith_prefix_and.vhdl +.. literalinclude:: ../../../src/arith/arith_Prefix_And.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -37,4 +37,4 @@ This implementation uses carry chains for wider implementations. .. only:: latex - Source file: :pocsrc:`arith/arith_prefix_and.vhdl ` + Source file: :pocsrc:`arith/arith_Prefix_And.vhdl ` diff --git a/docs/IPCores/arith/arith_prefix_or.rst b/docs/IPCores/arith/arith_Prefix_Or.rst similarity index 54% rename from docs/IPCores/arith/arith_prefix_or.rst rename to docs/IPCores/arith/arith_Prefix_Or.rst index 91c4fae6d..d4cf1bb1f 100644 --- a/docs/IPCores/arith/arith_prefix_or.rst +++ b/docs/IPCores/arith/arith_Prefix_Or.rst @@ -1,23 +1,23 @@ -.. _IP/arith_prefix_or: +.. _IP/arith_Prefix_Or: -PoC.arith.prefix_or +PoC.arith.Prefix_Or ################### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_prefix_or.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_Prefix_Or.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_prefix_or_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_Prefix_Or_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Prefix OR computation: ``y(i) <= '0' when x(i downto 0) = (i downto 0 => '0') else '1';`` @@ -27,7 +27,7 @@ This implementation uses carry chains for wider implementations. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/arith/arith_prefix_or.vhdl +.. literalinclude:: ../../../src/arith/arith_Prefix_Or.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -37,4 +37,4 @@ This implementation uses carry chains for wider implementations. .. only:: latex - Source file: :pocsrc:`arith/arith_prefix_or.vhdl ` + Source file: :pocsrc:`arith/arith_Prefix_Or.vhdl ` diff --git a/docs/IPCores/arith/arith_same.rst b/docs/IPCores/arith/arith_Same.rst similarity index 66% rename from docs/IPCores/arith/arith_same.rst rename to docs/IPCores/arith/arith_Same.rst index bc3e51df1..03134bff7 100644 --- a/docs/IPCores/arith/arith_same.rst +++ b/docs/IPCores/arith/arith_Same.rst @@ -1,23 +1,23 @@ -.. _IP/arith_same: +.. _IP/arith_Same: -PoC.arith.same +PoC.arith.Same ############## .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_same.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_Same.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_same_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_Same_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` This circuit may, for instance, be used to detect the first sign change and, thus, the range of a two's complement number. @@ -32,7 +32,7 @@ bit position as to avoid an undetected sign change between the slices. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/arith/arith_same.vhdl +.. literalinclude:: ../../../src/arith/arith_Same.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -42,4 +42,4 @@ bit position as to avoid an undetected sign change between the slices. .. only:: latex - Source file: :pocsrc:`arith/arith_same.vhdl ` + Source file: :pocsrc:`arith/arith_Same.vhdl ` diff --git a/docs/IPCores/arith/arith_scaler.rst b/docs/IPCores/arith/arith_Scaler.rst similarity index 73% rename from docs/IPCores/arith/arith_scaler.rst rename to docs/IPCores/arith/arith_Scaler.rst index 535f5aad2..7b300615b 100644 --- a/docs/IPCores/arith/arith_scaler.rst +++ b/docs/IPCores/arith/arith_Scaler.rst @@ -1,23 +1,23 @@ -.. _IP/arith_scaler: +.. _IP/arith_Scaler: -PoC.arith.scaler +PoC.arith.Scaler ################ .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_scaler.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_Scaler.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_scaler_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_Scaler_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` A flexible scaler for fixed-point values. The scaler is implemented for a set of multiplier and divider values. Each individual scaling operation can @@ -39,7 +39,7 @@ highest scaling ratio to be used in order to avoid a truncation overflow. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/arith/arith_scaler.vhdl +.. literalinclude:: ../../../src/arith/arith_Scaler.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -49,4 +49,4 @@ highest scaling ratio to be used in order to avoid a truncation overflow. .. only:: latex - Source file: :pocsrc:`arith/arith_scaler.vhdl ` + Source file: :pocsrc:`arith/arith_Scaler.vhdl ` diff --git a/docs/IPCores/arith/arith_shifter_barrel.rst b/docs/IPCores/arith/arith_Shifter_Barrel.rst similarity index 55% rename from docs/IPCores/arith/arith_shifter_barrel.rst rename to docs/IPCores/arith/arith_Shifter_Barrel.rst index 27f5bae85..c3a0749da 100644 --- a/docs/IPCores/arith/arith_shifter_barrel.rst +++ b/docs/IPCores/arith/arith_Shifter_Barrel.rst @@ -1,23 +1,23 @@ -.. _IP/arith_shifter_barrel: +.. _IP/arith_Shifter_Barrel: -PoC.arith.shifter_barrel +PoC.arith.Shifter_Barrel ######################## .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_shifter_barrel.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_Shifter_Barrel.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_shifter_barrel_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_Shifter_Barrel_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` This Barrel-Shifter supports: @@ -31,7 +31,7 @@ This is equivalent to the CPU instructions: SLL, SLA, SRL, SRA, RL, RR .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/arith/arith_shifter_barrel.vhdl +.. literalinclude:: ../../../src/arith/arith_Shifter_Barrel.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -41,4 +41,4 @@ This is equivalent to the CPU instructions: SLL, SLA, SRL, SRA, RL, RR .. only:: latex - Source file: :pocsrc:`arith/arith_shifter_barrel.vhdl ` + Source file: :pocsrc:`arith/arith_Shifter_Barrel.vhdl ` diff --git a/docs/IPCores/arith/arith_SquareRoot.rst b/docs/IPCores/arith/arith_SquareRoot.rst new file mode 100644 index 000000000..117068ab8 --- /dev/null +++ b/docs/IPCores/arith/arith_SquareRoot.rst @@ -0,0 +1,40 @@ +.. _IP/arith_SquareRoot: + +PoC.arith.SquareRoot +#################### + +.. only:: html + + .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_SquareRoot.vhdl + :alt: Source Code on GitHub + .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_SquareRoot_tb.vhdl + :alt: Source Code on GitHub + + .. sidebar:: GitHub Links + + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` + +Iterative Square Root Extractor. + +Its computation requires (N+1)/2 steps for an argument bit width of N. + + + +.. rubric:: Entity Declaration: + +.. literalinclude:: ../../../src/arith/arith_SquareRoot.vhdl + :language: vhdl + :tab-width: 2 + :linenos: + :lines: 38-55 + + + +.. only:: latex + + Source file: :pocsrc:`arith/arith_SquareRoot.vhdl ` diff --git a/docs/IPCores/arith/arith_bcdcollect.rst b/docs/IPCores/arith/arith_bcdcollect.rst index df101bfc9..072c1607f 100644 --- a/docs/IPCores/arith/arith_bcdcollect.rst +++ b/docs/IPCores/arith/arith_bcdcollect.rst @@ -7,11 +7,11 @@ PoC.arith.bcdcollect .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_bcdcollect.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/arith/arith_bcdcollect.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_bcdcollect_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/arith/arith_bcdcollect_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/arith/arith_cca.rst b/docs/IPCores/arith/arith_cca.rst index c1ffd14bf..1f39fcd2a 100644 --- a/docs/IPCores/arith/arith_cca.rst +++ b/docs/IPCores/arith/arith_cca.rst @@ -49,7 +49,7 @@ limitations under the License. :linenos: :lines: 49-61 -Source file: `arith/arith_cca.vhdl `_ +Source file: `arith/arith_cca.vhdl `_ diff --git a/docs/IPCores/arith/arith_convert_bin2bcd.rst b/docs/IPCores/arith/arith_convert_bin2bcd.rst deleted file mode 100644 index 7443bf360..000000000 --- a/docs/IPCores/arith/arith_convert_bin2bcd.rst +++ /dev/null @@ -1,38 +0,0 @@ -.. _IP/arith_convert_bin2bcd: - -PoC.arith.convert_bin2bcd -######################### - -.. only:: html - - .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_convert_bin2bcd.vhdl - :alt: Source Code on GitHub - .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_convert_bin2bcd_tb.vhdl - :alt: Source Code on GitHub - - .. sidebar:: GitHub Links - - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` - -.. TODO:: No documentation available. - - - -.. rubric:: Entity Declaration: - -.. literalinclude:: ../../../src/arith/arith_convert_bin2bcd.vhdl - :language: vhdl - :tab-width: 2 - :linenos: - :lines: 40-58 - - - -.. only:: latex - - Source file: :pocsrc:`arith/arith_convert_bin2bcd.vhdl ` diff --git a/docs/IPCores/arith/arith_counter_gray.rst b/docs/IPCores/arith/arith_counter_gray.rst deleted file mode 100644 index 072eea5ad..000000000 --- a/docs/IPCores/arith/arith_counter_gray.rst +++ /dev/null @@ -1,38 +0,0 @@ -.. _IP/arith_counter_gray: - -PoC.arith.counter_gray -###################### - -.. only:: html - - .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_counter_gray.vhdl - :alt: Source Code on GitHub - .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_counter_gray_tb.vhdl - :alt: Source Code on GitHub - - .. sidebar:: GitHub Links - - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` - -.. TODO:: No documentation available. - - - -.. rubric:: Entity Declaration: - -.. literalinclude:: ../../../src/arith/arith_counter_gray.vhdl - :language: vhdl - :tab-width: 2 - :linenos: - :lines: 38-51 - - - -.. only:: latex - - Source file: :pocsrc:`arith/arith_counter_gray.vhdl ` diff --git a/docs/IPCores/arith/arith_sqrt.rst b/docs/IPCores/arith/arith_sqrt.rst deleted file mode 100644 index a650c787d..000000000 --- a/docs/IPCores/arith/arith_sqrt.rst +++ /dev/null @@ -1,40 +0,0 @@ -.. _IP/arith_sqrt: - -PoC.arith.sqrt -############## - -.. only:: html - - .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_sqrt.vhdl - :alt: Source Code on GitHub - .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/arith/arith_sqrt_tb.vhdl - :alt: Source Code on GitHub - - .. sidebar:: GitHub Links - - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` - -Iterative Square Root Extractor. - -Its computation requires (N+1)/2 steps for an argument bit width of N. - - - -.. rubric:: Entity Declaration: - -.. literalinclude:: ../../../src/arith/arith_sqrt.vhdl - :language: vhdl - :tab-width: 2 - :linenos: - :lines: 38-55 - - - -.. only:: latex - - Source file: :pocsrc:`arith/arith_sqrt.vhdl ` diff --git a/docs/IPCores/arith/index.rst b/docs/IPCores/arith/index.rst index 7c48fa07c..9d71669c2 100644 --- a/docs/IPCores/arith/index.rst +++ b/docs/IPCores/arith/index.rst @@ -11,23 +11,23 @@ These are arithmetic entities.... **Entities** - * :ref:`IP/arith_addw` - * :ref:`IP/arith_carrychain_inc` - * :ref:`IP/arith_convert_bin2bcd` - * :ref:`IP/arith_counter_bcd` - * :ref:`IP/arith_counter_free` - * :ref:`IP/arith_counter_gray` - * :ref:`IP/arith_counter_ring` - * :ref:`IP/arith_div` - * :ref:`IP/arith_firstone` + * :ref:`IP/arith_Adder_Wide` + * :ref:`IP/arith_CarryChain_inc` + * :ref:`IP/arith_Convert_Binary2BCD` + * :ref:`IP/arith_Counter_BCD` + * :ref:`IP/arith_Counter_Free` + * :ref:`IP/arith_Counter_Gray` + * :ref:`IP/arith_Counter_Ring` + * :ref:`IP/arith_Divider` + * :ref:`IP/arith_FirstOne` * :ref:`IP/arith_muls_wide` - * :ref:`IP/arith_prefix_and` - * :ref:`IP/arith_prefix_or` - * :ref:`IP/arith_prng` - * :ref:`IP/arith_same` - * :ref:`IP/arith_scaler` - * :ref:`IP/arith_shifter_barrel` - * :ref:`IP/arith_sqrt` + * :ref:`IP/arith_Prefix_And` + * :ref:`IP/arith_Prefix_Or` + * :ref:`IP/arith_PRNG` + * :ref:`IP/arith_Same` + * :ref:`IP/arith_Scaler` + * :ref:`IP/arith_Shifter_Barrel` + * :ref:`IP/arith_SquareRoot` .. toctree:: @@ -38,20 +38,20 @@ These are arithmetic entities.... .. toctree:: :hidden: - arith_addw - arith_carrychain_inc - arith_convert_bin2bcd - arith_counter_bcd - arith_counter_free - arith_counter_gray - arith_counter_ring - arith_div - arith_firstone + arith_Adder_Wide + arith_CarryChain_inc + arith_Convert_Binary2BCD + arith_Counter_BCD + arith_Counter_Free + arith_Counter_Gray + arith_Counter_Ring + arith_Divider + arith_FirstOne arith_muls_wide - arith_prefix_and - arith_prefix_or - arith_prng - arith_same - arith_scaler - arith_shifter_barrel - arith_sqrt + arith_Prefix_And + arith_Prefix_Or + arith_PRNG + arith_Same + arith_Scaler + arith_Shifter_Barrel + arith_SquareRoot diff --git a/docs/IPCores/bus/axi4/axi4_to_AXI4Lite.rst b/docs/IPCores/bus/axi4/axi4_AXI4Lite_Converter.rst similarity index 71% rename from docs/IPCores/bus/axi4/axi4_to_AXI4Lite.rst rename to docs/IPCores/bus/axi4/axi4_AXI4Lite_Converter.rst index f19cc3ba6..8fac66ad0 100644 --- a/docs/IPCores/bus/axi4/axi4_to_AXI4Lite.rst +++ b/docs/IPCores/bus/axi4/axi4_AXI4Lite_Converter.rst @@ -1,27 +1,27 @@ -.. _IP/axi4_to_AXI4Lite: +.. _IP/axi4_AXI4Lite_Converter: .. index:: - single: AXI4; axi4_to_AXI4Lite + single: AXI4; axi4_AXI4Lite_Converter -axi4_to_AXI4Lite -################ +axi4_AXI4Lite_Converter +####################### -.. _IP/axi4_to_AXI4Lite/goals: +.. _IP/axi4_AXI4Lite_Converter/goals: .. topic:: Design Goals * tbd -.. _IP/axi4_to_AXI4Lite/features: +.. _IP/axi4_AXI4Lite_Converter/features: .. topic:: Features * tbd -.. _IP/axi4_to_AXI4Lite/instantiation: +.. _IP/axi4_AXI4Lite_Converter/instantiation: Instantiation ************* @@ -38,7 +38,7 @@ Instantiation .. code-block:: vhdl - FIFO : entity PoC.axi4_to_AXI4Lite + FIFO : entity PoC.axi4_AXI4Lite_Converter port map ( Clock => Clock, Reset => Reset, @@ -51,17 +51,17 @@ Instantiation ); -.. _IP/axi4_to_AXI4Lite/interface: +.. _IP/axi4_AXI4Lite_Converter/interface: Interface ********* -.. _IP/axi4_to_AXI4Lite/generics: +.. _IP/axi4_AXI4Lite_Converter/generics: Generics ======== -.. _IP/axi4_FIFO_cdc/gen/RESPONSE_FIFO_DEPTH: +.. _IP/axi4_FIFO_CDC/gen/RESPONSE_FIFO_DEPTH: :generic:`RESPONSE_FIFO_DEPTH` ------------------------------ @@ -72,12 +72,12 @@ Generics :Description: tbd -.. _IP/axi4_to_AXI4Lite/ports: +.. _IP/axi4_AXI4Lite_Converter/ports: Ports ===== -.. _IP/axi4_to_AXI4Lite/port/Clock: +.. _IP/axi4_AXI4Lite_Converter/port/Clock: :port:`Clock` ------------- @@ -89,7 +89,7 @@ Ports :Description: Clock -.. _IP/axi4_to_AXI4Lite/port/Reset: +.. _IP/axi4_AXI4Lite_Converter/port/Reset: :port:`Reset` ------------- @@ -101,7 +101,7 @@ Ports :Description: synchronous high-active reset -.. _IP/axi4_to_AXI4Lite/port/In_m2s: +.. _IP/axi4_AXI4Lite_Converter/port/In_m2s: :port:`In_m2s` -------------- @@ -113,7 +113,7 @@ Ports :Description: AXI4 manager to subordinate signals. -.. _IP/axi4_to_AXI4Lite/port/In_s2m: +.. _IP/axi4_AXI4Lite_Converter/port/In_s2m: :port:`In_s2m` -------------- @@ -125,7 +125,7 @@ Ports :Description: AXI4 subordinate to manager signals. -.. _IP/axi4_to_AXI4Lite/port/Out_m2s: +.. _IP/axi4_AXI4Lite_Converter/port/Out_m2s: :port:`Out_m2s` --------------- @@ -137,7 +137,7 @@ Ports :Description: AXI4-Lite manager to subordinate signals. -.. _IP/axi4_to_AXI4Lite/port/Out_s2m: +.. _IP/axi4_AXI4Lite_Converter/port/Out_s2m: :port:`Out_s2m` --------------- @@ -149,7 +149,7 @@ Ports :Description: AXI4-Lite subordinate to manager signals. -.. _IP/axi4_to_AXI4Lite/configuration: +.. _IP/axi4_AXI4Lite_Converter/configuration: Configuration ************* @@ -157,7 +157,7 @@ Configuration .. todo:: tbd -.. _IP/axi4_to_AXI4Lite/UsedIn: +.. _IP/axi4_AXI4Lite_Converter/UsedIn: Use in ****** diff --git a/docs/IPCores/bus/axi4/axi4_FIFO_cdc.rst b/docs/IPCores/bus/axi4/axi4_FIFO_CDC.rst similarity index 79% rename from docs/IPCores/bus/axi4/axi4_FIFO_cdc.rst rename to docs/IPCores/bus/axi4/axi4_FIFO_CDC.rst index 9e6d14d01..8fd28e533 100644 --- a/docs/IPCores/bus/axi4/axi4_FIFO_cdc.rst +++ b/docs/IPCores/bus/axi4/axi4_FIFO_CDC.rst @@ -1,29 +1,29 @@ -.. _IP/axi4_FIFO_cdc: +.. _IP/axi4_FIFO_CDC: .. index:: - single: AXI4; axi4_FIFO_cdc + single: AXI4; axi4_FIFO_CDC -axi4_FIFO_cdc +axi4_FIFO_CDC ############# Based on :ref:`IP/fifo_ic_got` -.. _IP/axi4_FIFO_cdc/goals: +.. _IP/axi4_FIFO_CDC/goals: .. topic:: Design Goals * tbd -.. _IP/axi4_FIFO_cdc/features: +.. _IP/axi4_FIFO_CDC/features: .. topic:: Features * tbd -.. _IP/axi4_FIFO_cdc/instantiation: +.. _IP/axi4_FIFO_CDC/instantiation: Instantiation ************* @@ -40,7 +40,7 @@ Instantiation .. code-block:: vhdl - FIFO : entity PoC.axi4_FIFO_cdc + FIFO : entity PoC.axi4_FIFO_CDC generic map ( FRAMES => 64 ) @@ -57,17 +57,17 @@ Instantiation ); -.. _IP/axi4_FIFO_cdc/interface: +.. _IP/axi4_FIFO_CDC/interface: Interface ********* -.. _IP/axi4_FIFO_cdc/generics: +.. _IP/axi4_FIFO_CDC/generics: Generics ======== -.. _IP/axi4_FIFO_cdc/gen/FRAMES: +.. _IP/axi4_FIFO_CDC/gen/FRAMES: :generic:`FRAMES` ----------------- @@ -78,7 +78,7 @@ Generics :Description: tbd -.. _IP/axi4_FIFO_cdc/gen/DATA_REG: +.. _IP/axi4_FIFO_CDC/gen/DATA_REG: :generic:`DATA_REG` ----------------------- @@ -89,7 +89,7 @@ Generics :Description: tbd -.. _IP/axi4_FIFO_cdc/gen/OUTPUT_REG: +.. _IP/axi4_FIFO_CDC/gen/OUTPUT_REG: :generic:`OUTPUT_REG` ----------------------- @@ -100,12 +100,12 @@ Generics :Description: tbd -.. _IP/axi4_FIFO_cdc/ports: +.. _IP/axi4_FIFO_CDC/ports: Ports ===== -.. _IP/axi4_FIFO_cdc/port/In_Clock: +.. _IP/axi4_FIFO_CDC/port/In_Clock: :port:`In_Clock` ---------------- @@ -117,7 +117,7 @@ Ports :Description: Clock -.. _IP/axi4_FIFO_cdc/port/In_Reset: +.. _IP/axi4_FIFO_CDC/port/In_Reset: :port:`In_Reset` ---------------- @@ -129,7 +129,7 @@ Ports :Description: synchronous high-active reset -.. _IP/axi4_FIFO_cdc/port/In_m2s: +.. _IP/axi4_FIFO_CDC/port/In_m2s: :port:`In_m2s` -------------- @@ -141,7 +141,7 @@ Ports :Description: AXI4-Lite manager to subordinate signals. -.. _IP/axi4_FIFO_cdc/port/In_s2m: +.. _IP/axi4_FIFO_CDC/port/In_s2m: :port:`In_s2m` -------------- @@ -153,7 +153,7 @@ Ports :Description: AXI4-Lite subordinate to manager signals. -.. _IP/axi4_FIFO_cdc/port/Out_Clock: +.. _IP/axi4_FIFO_CDC/port/Out_Clock: :port:`Out_Clock` ----------------- @@ -165,7 +165,7 @@ Ports :Description: Clock -.. _IP/axi4_FIFO_cdc/port/Out_Reset: +.. _IP/axi4_FIFO_CDC/port/Out_Reset: :port:`Out_Reset` ----------------- @@ -177,7 +177,7 @@ Ports :Description: synchronous high-active reset -.. _IP/axi4_FIFO_cdc/port/Out_m2s: +.. _IP/axi4_FIFO_CDC/port/Out_m2s: :port:`Out_m2s` --------------- @@ -189,7 +189,7 @@ Ports :Description: AXI4-Lite manager to subordinate signals. -.. _IP/axi4_FIFO_cdc/port/Out_s2m: +.. _IP/axi4_FIFO_CDC/port/Out_s2m: :port:`Out_s2m` --------------- @@ -201,7 +201,7 @@ Ports :Description: AXI4-Lite subordinate to manager signals. -.. _IP/axi4_FIFO_cdc/configuration: +.. _IP/axi4_FIFO_CDC/configuration: Configuration ************* @@ -209,7 +209,7 @@ Configuration .. todo:: tbd -.. _IP/axi4_FIFO_cdc/UsedIn: +.. _IP/axi4_FIFO_CDC/UsedIn: Use in ****** diff --git a/docs/IPCores/bus/axi4/index.rst b/docs/IPCores/bus/axi4/index.rst index 6c38d3c43..11b953754 100644 --- a/docs/IPCores/bus/axi4/index.rst +++ b/docs/IPCores/bus/axi4/index.rst @@ -13,8 +13,8 @@ PoC.bus.axi4 .. topic:: Entities * :ref:`IP/axi4_FIFO` - * :ref:`IP/axi4_FIFO_cdc` - * :ref:`IP/axi4_to_AXI4Lite` + * :ref:`IP/axi4_FIFO_CDC` + * :ref:`IP/axi4_AXI4Lite_Converter` .. toctree:: :hidden: @@ -22,5 +22,5 @@ PoC.bus.axi4 axi4 Package axi4_OSVVM Package FIFO - FIFO_cdc - to_AXI4Lite + FIFO_CDC + AXI4Lite_Converter diff --git a/docs/IPCores/bus/axi4lite/axi4lite_FIFO_cdc.rst b/docs/IPCores/bus/axi4lite/axi4lite_FIFO_CDC.rst similarity index 77% rename from docs/IPCores/bus/axi4lite/axi4lite_FIFO_cdc.rst rename to docs/IPCores/bus/axi4lite/axi4lite_FIFO_CDC.rst index 281f79673..e66192a34 100644 --- a/docs/IPCores/bus/axi4lite/axi4lite_FIFO_cdc.rst +++ b/docs/IPCores/bus/axi4lite/axi4lite_FIFO_CDC.rst @@ -1,29 +1,29 @@ -.. _IP/axi4lite_FIFO_cdc: +.. _IP/axi4lite_FIFO_CDC: .. index:: - single: AXI4-Lite; axi4lite_FIFO_cdc + single: AXI4-Lite; axi4lite_FIFO_CDC -axi4lite_FIFO_cdc +axi4lite_FIFO_CDC ################# Based on :ref:`IP/fifo_ic_got` -.. _IP/axi4lite_FIFO_cdc/goals: +.. _IP/axi4lite_FIFO_CDC/goals: .. topic:: Design Goals * tbd -.. _IP/axi4lite_FIFO_cdc/features: +.. _IP/axi4lite_FIFO_CDC/features: .. topic:: Features * tbd -.. _IP/axi4lite_FIFO_cdc/instantiation: +.. _IP/axi4lite_FIFO_CDC/instantiation: Instantiation ************* @@ -40,7 +40,7 @@ Instantiation .. code-block:: vhdl - FIFO : entity PoC.axi4lite_FIFO_cdc + FIFO : entity PoC.axi4lite_FIFO_CDC generic map ( TRANSACTIONS => 64 ) @@ -57,17 +57,17 @@ Instantiation ); -.. _IP/axi4lite_FIFO_cdc/interface: +.. _IP/axi4lite_FIFO_CDC/interface: Interface ********* -.. _IP/axi4lite_FIFO_cdc/generics: +.. _IP/axi4lite_FIFO_CDC/generics: Generics ======== -.. _IP/axi4lite_FIFO_cdc/gen/TRANSACTIONS: +.. _IP/axi4lite_FIFO_CDC/gen/TRANSACTIONS: :generic:`TRANSACTIONS` ----------------------- @@ -78,7 +78,7 @@ Generics :Description: tbd -.. _IP/axi4lite_FIFO_cdc/gen/DATA_REG: +.. _IP/axi4lite_FIFO_CDC/gen/DATA_REG: :generic:`DATA_REG` ----------------------- @@ -89,7 +89,7 @@ Generics :Description: tbd -.. _IP/axi4lite_FIFO_cdc/gen/OUTPUT_REG: +.. _IP/axi4lite_FIFO_CDC/gen/OUTPUT_REG: :generic:`OUTPUT_REG` ----------------------- @@ -100,12 +100,12 @@ Generics :Description: tbd -.. _IP/axi4lite_FIFO_cdc/ports: +.. _IP/axi4lite_FIFO_CDC/ports: Ports ===== -.. _IP/axi4lite_FIFO_cdc/port/In_Clock: +.. _IP/axi4lite_FIFO_CDC/port/In_Clock: :port:`In_Clock` ---------------- @@ -117,7 +117,7 @@ Ports :Description: Clock -.. _IP/axi4lite_FIFO_cdc/port/In_Reset: +.. _IP/axi4lite_FIFO_CDC/port/In_Reset: :port:`In_Reset` ---------------- @@ -129,7 +129,7 @@ Ports :Description: synchronous high-active reset -.. _IP/axi4lite_FIFO_cdc/port/In_m2s: +.. _IP/axi4lite_FIFO_CDC/port/In_m2s: :port:`In_m2s` -------------- @@ -141,7 +141,7 @@ Ports :Description: AXI4-Lite manager to subordinate signals. -.. _IP/axi4lite_FIFO_cdc/port/In_s2m: +.. _IP/axi4lite_FIFO_CDC/port/In_s2m: :port:`In_s2m` -------------- @@ -153,7 +153,7 @@ Ports :Description: AXI4-Lite subordinate to manager signals. -.. _IP/axi4lite_FIFO_cdc/port/Out_Clock: +.. _IP/axi4lite_FIFO_CDC/port/Out_Clock: :port:`Out_Clock` ----------------- @@ -165,7 +165,7 @@ Ports :Description: Clock -.. _IP/axi4lite_FIFO_cdc/port/Out_Reset: +.. _IP/axi4lite_FIFO_CDC/port/Out_Reset: :port:`Out_Reset` ----------------- @@ -177,7 +177,7 @@ Ports :Description: synchronous high-active reset -.. _IP/axi4lite_FIFO_cdc/port/Out_m2s: +.. _IP/axi4lite_FIFO_CDC/port/Out_m2s: :port:`Out_m2s` --------------- @@ -189,7 +189,7 @@ Ports :Description: AXI4-Lite manager to subordinate signals. -.. _IP/axi4lite_FIFO_cdc/port/Out_s2m: +.. _IP/axi4lite_FIFO_CDC/port/Out_s2m: :port:`Out_s2m` --------------- @@ -201,7 +201,7 @@ Ports :Description: AXI4-Lite subordinate to manager signals. -.. _IP/axi4lite_FIFO_cdc/configuration: +.. _IP/axi4lite_FIFO_CDC/configuration: Configuration ************* @@ -209,7 +209,7 @@ Configuration .. todo:: tbd -.. _IP/axi4lite_FIFO_cdc/UsedIn: +.. _IP/axi4lite_FIFO_CDC/UsedIn: Use in ****** diff --git a/docs/IPCores/bus/axi4lite/axi4lite_GitVersionRegister.rst b/docs/IPCores/bus/axi4lite/axi4lite_GitVersionRegister.rst index e8cbe52cb..d8d21b657 100644 --- a/docs/IPCores/bus/axi4lite/axi4lite_GitVersionRegister.rst +++ b/docs/IPCores/bus/axi4lite/axi4lite_GitVersionRegister.rst @@ -132,8 +132,8 @@ Generics :Name: :generic:`VERSION_FILE_NAME` :Type: :type:`string` :Default Value: — — — — -:Description: Path to the Version-mem-file created by `set_BuildVersion.tcl`. Relative to ``constant MY_PROJECT_DIR`` - in ``src/PoC/my_project.vhdl`` +:Description: Path to the Version-mem-file created by `set_BuildVersion.tcl`. Relative to ``constant LOCAL_PROJECT_DIR`` + in ``src/PoC/local_configuration.vhdl`` .. _IP/axi4lite_GitVersionRegister/gen/HEADER_FILE_NAME: @@ -145,7 +145,7 @@ Generics :Type: :type:`string` :Default Value: — — — — :Description: If csv-file with all register spaces is needed, put here the name/path of csv-file. Relative to - ``constant MY_PROJECT_DIR`` in ``src/PoC/my_project.vhdl`` + ``constant LOCAL_PROJECT_DIR`` in ``src/PoC/local_configuration.vhdl`` .. _IP/axi4lite_GitVersionRegister/gen/INCLUDE_XIL_DNA: @@ -269,7 +269,7 @@ All registers are read-only. Version Register should always start with offset `` +--------+-----------------------------------------+-------------------------------------------------------------------+ | 0x008 | Common.VivadoVersion | 31:16 Major |br| 15:8 Minor |br| 7:0 Patch | +--------+-----------------------------------------+-------------------------------------------------------------------+ -| 0x00C | Common.ProjektName | ``String`` Project-Name (20 bytes) | +| 0x00C | Common.ProjectName | ``String`` Project-Name (20 bytes) | +--------+-----------------------------------------+-------------------------------------------------------------------+ | 0x020 | Top.Version | 31:24 Major |br| 23:16 Minor |br| 15:8 Patch |br| | | | | 7:2 Commits-to-Tag(dev-build) |br| 1 Dirty_untracked |br| | diff --git a/docs/IPCores/bus/axi4lite/axi4lite_HighResolutionClock.rst b/docs/IPCores/bus/axi4lite/axi4lite_HighResolutionClock.rst index ff0b8245a..c8eb2a32a 100644 --- a/docs/IPCores/bus/axi4lite/axi4lite_HighResolutionClock.rst +++ b/docs/IPCores/bus/axi4lite/axi4lite_HighResolutionClock.rst @@ -3,7 +3,7 @@ single: AXI4-Lite; axi4lite_HighResolutionClock axi4lite_HighResolutionClock -########################### +############################ Based on :ref:`IP/axi4lite_Register`, :ref:`IP/clock_highresolution` diff --git a/docs/IPCores/bus/axi4lite/axi4lite_Ocram_Adapter.rst b/docs/IPCores/bus/axi4lite/axi4lite_Ocram_Adapter.rst index c13f85306..f1c0b7bcb 100644 --- a/docs/IPCores/bus/axi4lite/axi4lite_Ocram_Adapter.rst +++ b/docs/IPCores/bus/axi4lite/axi4lite_Ocram_Adapter.rst @@ -1,32 +1,32 @@ -.. _IP/AXI4Lite_Ocram_Adapter: +.. _IP/axi4lite_OCRAM_Adapter: .. index:: - single: AXI4-Lite; AXI4Lite_Ocram_Adapter + single: AXI4-Lite; axi4lite_OCRAM_Adapter -AXI4Lite_Ocram_Adapter -########################### +axi4lite_OCRAM_Adapter +###################### .. todo:: -.. _IP/AXI4Lite_Ocram_Adapter/goals: +.. _IP/axi4lite_OCRAM_Adapter/goals: .. topic:: Design Goals * *tbd* -.. _IP/AXI4Lite_Ocram_Adapter/features: +.. _IP/axi4lite_OCRAM_Adapter/features: .. topic:: Features * *tbd* -.. _IP/AXI4Lite_Ocram_Adapter/instantiation: +.. _IP/axi4lite_OCRAM_Adapter/instantiation: Instantiation ************* -.. _IP/AXI4Lite_Ocram_Adapter/inst/Simple: +.. _IP/axi4lite_OCRAM_Adapter/inst/Simple: .. grid:: 2 @@ -40,7 +40,7 @@ Instantiation .. code-block:: vhdl - Ocram_Adapter : entity PoC.AXI4Lite_Ocram_Adapter + Ocram_Adapter : entity PoC.axi4lite_OCRAM_Adapter generic map ( OCRAM_ADDRESS_BITS => 10, OCRAM_DATA_BITS => 32 @@ -57,18 +57,18 @@ Instantiation Data_Out => Data_Out ); -.. _IP/AXI4Lite_Ocram_Adapter/inst/Xilinx: +.. _IP/axi4lite_OCRAM_Adapter/inst/Xilinx: Interface ********* -.. _IP/AXI4Lite_Ocram_Adapter/generics: +.. _IP/axi4lite_OCRAM_Adapter/generics: Generics ======== -.. _IP/AXI4Lite_Ocram_Adapter/gen/OCRAM_ADDRESS_BITS: +.. _IP/axi4lite_OCRAM_Adapter/gen/OCRAM_ADDRESS_BITS: :generic:`OCRAM_ADDRESS_BITS` ---------------------------- @@ -79,7 +79,7 @@ Generics :Description: *tbd* -.. _IP/AXI4Lite_Ocram_Adapter/gen/OCRAM_DATA_BITS: +.. _IP/axi4lite_OCRAM_Adapter/gen/OCRAM_DATA_BITS: :generic:`OCRAM_DATA_BITS` --------------------------- @@ -90,7 +90,7 @@ Generics :Description: *tbd* -.. _IP/AXI4Lite_Ocram_Adapter/gen/PREFFERED_READ_ACCESS: +.. _IP/axi4lite_OCRAM_Adapter/gen/PREFFERED_READ_ACCESS: :generic:`PREFFERED_READ_ACCESS` -------------------------- @@ -101,12 +101,12 @@ Generics :Description: *tbd* -.. _IP/AXI4Lite_Ocram_Adapter/ports: +.. _IP/axi4lite_OCRAM_Adapter/ports: Ports ===== -.. _IP/AXI4Lite_Ocram_Adapter/port/Clock: +.. _IP/axi4lite_OCRAM_Adapter/port/Clock: :port:`Clock` ------------- @@ -118,7 +118,7 @@ Ports :Description: Clock -.. _IP/AXI4Lite_Ocram_Adapter/port/Reset: +.. _IP/axi4lite_OCRAM_Adapter/port/Reset: :port:`Reset` ------------- @@ -130,7 +130,7 @@ Ports :Description: synchronous high-active reset -.. _IP/AXI4Lite_Ocram_Adapter/port/AXI4Lite_M2S: +.. _IP/axi4lite_OCRAM_Adapter/port/AXI4Lite_M2S: :port:`AXI4Lite_M2S` -------------------- @@ -142,7 +142,7 @@ Ports :Description: AXI4-Lite manager to subordinate signals. -.. _IP/AXI4Lite_Ocram_Adapter/port/AXI4Lite_s2m: +.. _IP/axi4lite_OCRAM_Adapter/port/AXI4Lite_s2m: :port:`AXI4Lite_s2m` -------------------- @@ -154,7 +154,7 @@ Ports :Description: AXI4-Lite subordinate to manager signals. -.. _IP/AXI4Lite_Ocram_Adapter/port/Write_En: +.. _IP/axi4lite_OCRAM_Adapter/port/Write_En: :port:`Write_En` -------------------- @@ -166,7 +166,7 @@ Ports :Description: Write enable. -.. _IP/AXI4Lite_Ocram_Adapter/port/Address: +.. _IP/axi4lite_OCRAM_Adapter/port/Address: :port:`Address` -------------------- @@ -178,7 +178,7 @@ Ports :Description: *tbd* -.. _IP/AXI4Lite_Ocram_Adapter/port/Data_In: +.. _IP/axi4lite_OCRAM_Adapter/port/Data_In: :port:`Data_In` -------------------- @@ -190,7 +190,7 @@ Ports :Description: *tbd* -.. _IP/AXI4Lite_Ocram_Adapter/port/Data_Out: +.. _IP/axi4lite_OCRAM_Adapter/port/Data_Out: :port:`Data_Out` -------------------- @@ -202,12 +202,12 @@ Ports :Description: *tbd* -.. _IP/AXI4Lite_Ocram_Adapter/configuration: +.. _IP/axi4lite_OCRAM_Adapter/configuration: Configuration ************* -.. _IP/AXI4Lite_Ocram_Adapter/config/User: +.. _IP/axi4lite_OCRAM_Adapter/config/User: User defined Word ================= diff --git a/docs/IPCores/bus/axi4lite/axi4lite_Register.rst b/docs/IPCores/bus/axi4lite/axi4lite_Register.rst index cf04c243d..8e07477c9 100644 --- a/docs/IPCores/bus/axi4lite/axi4lite_Register.rst +++ b/docs/IPCores/bus/axi4lite/axi4lite_Register.rst @@ -559,7 +559,7 @@ Record Data Structure --------------------- The configuration specified via :ref:`IP/axi4lite_Register/gen/CONFIG` generic determines the functionality of the -register. It's an array of the ``AXI4Lite.pkg:T_AXI4_Register_Description``. This record has the following elements: +register. It's an array of the ``axi4lite.pkg:T_AXI4_Register_Description``. This record has the following elements: +-----------------------+-------------------------------+--------------------------------------------------------------+ | Field | Type | Description | @@ -880,7 +880,7 @@ Atomic Register An ``Atomic Register`` is an external wiring. This is used to avoid read-modify-write operations from software by introducing a `clear-bit-register`, ``set-bit-register`` and `toggle-bit-register`. A constant is prepared for this -register inside ``AXI4Lite.pkg.vhdl`` called `Atomic_RegisterDescription_Vector`. It can be mapped/created inside of the +register inside ``axi4lite.pkg.vhdl`` called `Atomic_RegisterDescription_Vector`. It can be mapped/created inside of the ``gen_config`` function like this: .. code-block:: vhdl @@ -1016,7 +1016,7 @@ Write Register CSV File (deprecated) A csv file can be written out of the configuration with the function `write_csv_file`. It is commanded to use it with an enabled ``assert`` statement or writing it into a constant. With assert, you can also see in the synthesis log if -everything was successfully. ``PROJECT_DIR`` is a constant inside ``my_project.vhdl`` normally located at `src/PoC/`. +everything was successfully. ``PROJECT_DIR`` is a constant inside ``local_configuration.vhdl`` normally located at `src/PoC/`. .. code-block:: vhdl @@ -1032,7 +1032,7 @@ Create C-Header File from CSV A big advantage of this register is the automatic register handover to the Software. This is done by converting the freshly generated csv file and converting it into a C-Header file. The registers specified in the config are combined -into struct's. The final struct can than be layed over the AXI4Lite-Register Address. +into struct's. The final struct can than be layed over the axi4lite_Register Address. The conversion is done by a python-script from *************************. This python script works but has currently a lot of limitations. @@ -1048,10 +1048,10 @@ lot of limitations. .. # - AXI4Lite Register Split + axi4lite Register Split ======================= - The moduel ``axi4lite_Register_split`` is an addition to the normal register. It splits up a big register into multiple smaller ones, that can then better acheave timing. This is done by the Address-Demultiplexer `AXI4Lite_DeMux`. + The moduel ``axi4lite_Register_split`` is an addition to the normal register. It splits up a big register into multiple smaller ones, that can then better acheave timing. This is done by the Address-Demultiplexer `axi4lite_DeMux`. This module adds the following generics: | Name | Type | Default | Description | @@ -1063,7 +1063,7 @@ lot of limitations. {-Interrupts are currently not working for this module fully! It is only working if all interrupt-registers are in one sub-register and the Interrupt match and enable register addresses are located in the same sub-register.-} - ## AXI4Lite Register Single-Access (BRAM AXI4Lite Register) + ## axi4lite Register Single-Access (BRAM axi4lite Register) {-Experimental Module-} This module is a variant with singel access from PL instead parallel. With this restriction, it is possible to put the register completally into Lut-Ram or BRAM and save a lot of ressources. 1 BRAM can store in total 1k registers without timing problems. diff --git a/docs/IPCores/bus/axi4lite/axi4lite_UART.rst b/docs/IPCores/bus/axi4lite/axi4lite_UART.rst index 719c19b24..027f75f2c 100644 --- a/docs/IPCores/bus/axi4lite/axi4lite_UART.rst +++ b/docs/IPCores/bus/axi4lite/axi4lite_UART.rst @@ -1,34 +1,34 @@ -.. _IP/AXI4Lite_UART: +.. _IP/axi4lite_UART: .. index:: - single: AXI4-Lite; AXI4Lite_UART + single: AXI4-Lite; axi4lite_UART -AXI4Lite_UART -########################### +axi4lite_UART +############# -Based on :ref:`IP/axi4lite_Register`, :ref:`IP/uart_fifo` +Based on :ref:`IP/axi4lite_Register`, :ref:`IP/uart_FIFO` .. todo:: -.. _IP/AXI4Lite_UART/goals: +.. _IP/axi4lite_UART/goals: .. topic:: Design Goals * *tbd* -.. _IP/AXI4Lite_UART/features: +.. _IP/axi4lite_UART/features: .. topic:: Features * *tbd* -.. _IP/AXI4Lite_UART/instantiation: +.. _IP/axi4lite_UART/instantiation: Instantiation ************* -.. _IP/AXI4Lite_UART/inst/Simple: +.. _IP/axi4lite_UART/inst/Simple: .. grid:: 2 @@ -42,7 +42,7 @@ Instantiation .. code-block:: vhdl - UART : entity PoC.AXI4Lite_UART + UART : entity PoC.axi4lite_UART generic map ( CLOCK_FREQ => 100 MHz, BAUDRATE => 115.200 kBd @@ -61,18 +61,18 @@ Instantiation UART_CTS => UART_CTS ); -.. _IP/AXI4Lite_UART/inst/Xilinx: +.. _IP/axi4lite_UART/inst/Xilinx: Interface ********* -.. _IP/AXI4Lite_UART/generics: +.. _IP/axi4lite_UART/generics: Generics ======== -.. _IP/AXI4Lite_UART/gen/CLOCK_FREQ: +.. _IP/axi4lite_UART/gen/CLOCK_FREQ: :generic:`CLOCK_FREQ` ---------------------------- @@ -83,7 +83,7 @@ Generics :Description: Frequency of input clock. -.. _IP/AXI4Lite_UART/gen/BAUDRATE: +.. _IP/axi4lite_UART/gen/BAUDRATE: :generic:`BAUDRATE` ---------------------------- @@ -93,7 +93,7 @@ Generics :Default Value: 115.200 kBd :Description: *tbd* -.. _IP/AXI4Lite_UART/gen/PARITY: +.. _IP/axi4lite_UART/gen/PARITY: :generic:`PARITY` --------------------------- @@ -104,7 +104,7 @@ Generics :Description: ``PARITY_EVEN``, ``PARITY_ODD``, ``PARITY_NONE`` -.. _IP/AXI4Lite_UART/gen/PARITY_ERROR_HANDLING: +.. _IP/axi4lite_UART/gen/PARITY_ERROR_HANDLING: :generic:`PARITY_ERROR_HANDLING` -------------------------- @@ -115,7 +115,7 @@ Generics :Description: ``PASSTHROUGH_ERROR_BYTE``, ``REPLACE_ERROR_BYTE``, ``DROP_ERROR_BYTE`` -.. _IP/AXI4Lite_UART/gen/PARITY_ERROR_IDENTIFIER: +.. _IP/axi4lite_UART/gen/PARITY_ERROR_IDENTIFIER: :generic:`PARITY_ERROR_IDENTIFIER` -------------------------------- @@ -126,7 +126,7 @@ Generics :Description: *tbd* -.. _IP/AXI4Lite_UART/gen/ADD_INPUT_SYNCHRONIZERS: +.. _IP/axi4lite_UART/gen/ADD_INPUT_SYNCHRONIZERS: :generic:`ADD_INPUT_SYNCHRONIZERS` -------------------------------- @@ -137,7 +137,7 @@ Generics :Description: *tbd* -.. _IP/AXI4Lite_UART/gen/TX_FIFO_DEPTH: +.. _IP/axi4lite_UART/gen/TX_FIFO_DEPTH: :generic:`TX_FIFO_DEPTH` -------------------------------- @@ -148,7 +148,7 @@ Generics :Description: *tbd** -.. _IP/AXI4Lite_UART/gen/RX_FIFO_DEPTH: +.. _IP/axi4lite_UART/gen/RX_FIFO_DEPTH: :generic:`RX_FIFO_DEPTH` -------------------------------- @@ -159,7 +159,7 @@ Generics :Description: *tbd* -.. _IP/AXI4Lite_UART/gen/FLOWCONTROL: +.. _IP/axi4lite_UART/gen/FLOWCONTROL: :generic:`FLOWCONTROL` -------------------------------- @@ -170,7 +170,7 @@ Generics :Description: *tbd* -.. _IP/AXI4Lite_UART/gen/SWFC_XON_CHAR: +.. _IP/axi4lite_UART/gen/SWFC_XON_CHAR: :generic:`SWFC_XON_CHAR` -------------------------------- @@ -181,7 +181,7 @@ Generics :Description: *tbd* -.. _IP/AXI4Lite_UART/gen/SWFC_XOFF_CHAR: +.. _IP/axi4lite_UART/gen/SWFC_XOFF_CHAR: :generic:`SWFC_XOFF_CHAR` -------------------------------- @@ -192,12 +192,12 @@ Generics :Description: *tbd* -.. _IP/AXI4Lite_UART/ports: +.. _IP/axi4lite_UART/ports: Ports ===== -.. _IP/AXI4Lite_UART/port/Clock: +.. _IP/axi4lite_UART/port/Clock: :port:`Clock` ------------- @@ -209,7 +209,7 @@ Ports :Description: Clock -.. _IP/AXI4Lite_UART/port/Reset: +.. _IP/axi4lite_UART/port/Reset: :port:`Reset` ------------- @@ -221,7 +221,7 @@ Ports :Description: synchronous high-active reset -.. _IP/AXI4Lite_UART/port/AXI4Lite_m2s: +.. _IP/axi4lite_UART/port/axi4lite_m2s: :port:`AXI4Lite_m2s` -------------------- @@ -233,7 +233,7 @@ Ports :Description: AXI4-Lite manager to subordinate signals. -.. _IP/AXI4Lite_UART/port/AXI4Lite_s2m: +.. _IP/axi4lite_UART/port/axi4lite_s2m: :port:`AXI4Lite_s2m` -------------------- @@ -245,7 +245,7 @@ Ports :Description: AXI4-Lite subordinate to manager signals. -.. _IP/AXI4Lite_UART/port/Config_irq: +.. _IP/axi4lite_UART/port/Config_irq: :port:`Config_irq` -------------------- @@ -257,7 +257,7 @@ Ports :Description: AXI4-Lite subordinate to manager signals. -.. _IP/AXI4Lite_UART/port/UART_TX: +.. _IP/axi4lite_UART/port/UART_TX: :port:`UART_TX` -------------------- @@ -269,7 +269,7 @@ Ports :Description: *tbd*. -.. _IP/AXI4Lite_UART/port/UART_RX: +.. _IP/axi4lite_UART/port/UART_RX: :port:`UART_RX` -------------------- @@ -281,7 +281,7 @@ Ports :Description: *tbd*. -.. _IP/AXI4Lite_UART/port/UART_RTS: +.. _IP/axi4lite_UART/port/UART_RTS: :port:`UART_RTS` -------------------- @@ -293,7 +293,7 @@ Ports :Description: *tbd*. -.. _IP/AXI4Lite_UART/port/UART_CTS: +.. _IP/axi4lite_UART/port/UART_CTS: :port:`UART_CTS` -------------------- @@ -305,12 +305,12 @@ Ports :Description: *tbd*. -.. _IP/AXI4Lite_UART/configuration: +.. _IP/axi4lite_UART/configuration: Configuration ************* -.. _IP/AXI4Lite_UART/config/User: +.. _IP/axi4lite_UART/config/User: User defined Word ================= @@ -318,7 +318,7 @@ User defined Word .. todo:: tbd -.. _IP/AXI4Lite_UART/RegisterMap: +.. _IP/axi4lite_UART/RegisterMap: Register Map ************ diff --git a/docs/IPCores/bus/axi4lite/index.rst b/docs/IPCores/bus/axi4lite/index.rst index 86353b0a7..30978315e 100644 --- a/docs/IPCores/bus/axi4lite/index.rst +++ b/docs/IPCores/bus/axi4lite/index.rst @@ -13,11 +13,11 @@ PoC.bus.axi4lite .. topic:: Entities * :ref:`IP/axi4lite_FIFO` - * :ref:`IP/axi4lite_FIFO_cdc` + * :ref:`IP/axi4lite_FIFO_CDC` * :ref:`IP/axi4lite_Register` * :ref:`IP/axi4lite_GitVersionRegister` * :ref:`IP/axi4lite_HighResolutionClock` - * :ref:`IP/axi4lite_Ocram_Adapter` + * :ref:`IP/axi4lite_OCRAM_Adapter` * :ref:`IP/axi4lite_UART` .. toctree:: @@ -26,9 +26,9 @@ PoC.bus.axi4lite axi4lite Package axi4lite_OSVVM Package FIFO - FIFO_cdc + FIFO_CDC Register GitVersionRegister HighResolutionClock - Ocram_Adapter + Ocram_Adapter UART diff --git a/docs/IPCores/bus/axi4stream/axi4stream_FIFO.rst b/docs/IPCores/bus/axi4stream/axi4stream_FIFO.rst index b76127616..c7ff84d4f 100644 --- a/docs/IPCores/bus/axi4stream/axi4stream_FIFO.rst +++ b/docs/IPCores/bus/axi4stream/axi4stream_FIFO.rst @@ -112,7 +112,7 @@ Ports -------------- :Name: ``In_m2s`` -:Type: ``axi4stream.T_AXI4stream_Bus_m2s`` +:Type: ``axi4stream.T_AXI4Stream_m2s`` :Mode: in :Default Value: — — — — :Description: AXI4-stream manager to subordinate signals. @@ -124,7 +124,7 @@ Ports -------------- :Name: ``In_s2m`` -:Type: ``axi4stream.T_AXI4stream_Bus_s2m`` +:Type: ``axi4stream.T_AXI4Stream_s2m`` :Mode: out :Default Value: — — — — :Description: AXI4-stream subordinate to manager signals. @@ -136,7 +136,7 @@ Ports --------------- :Name: ``Out_m2s`` -:Type: ``axi4stream.T_AXI4stream_Bus_m2s`` +:Type: ``axi4stream.T_AXI4Stream_m2s`` :Mode: out :Default Value: — — — — :Description: AXI4-stream manager to subordinate signals. @@ -148,7 +148,7 @@ Ports --------------- :Name: ``Out_s2m`` -:Type: ``axi4stream.T_AXI4stream_Bus_s2m`` +:Type: ``axi4stream.T_AXI4Stream_s2m`` :Mode: in :Default Value: — — — — :Description: AXI4-stream subordinate to manager signals. diff --git a/docs/IPCores/bus/axi4stream/axi4stream_FIFO_cdc.rst b/docs/IPCores/bus/axi4stream/axi4stream_FIFO_CDC.rst similarity index 71% rename from docs/IPCores/bus/axi4stream/axi4stream_FIFO_cdc.rst rename to docs/IPCores/bus/axi4stream/axi4stream_FIFO_CDC.rst index 4c9ffd67b..8c4e40a2b 100644 --- a/docs/IPCores/bus/axi4stream/axi4stream_FIFO_cdc.rst +++ b/docs/IPCores/bus/axi4stream/axi4stream_FIFO_CDC.rst @@ -1,29 +1,29 @@ -.. _IP/axi4stream_FIFO_cdc: +.. _IP/axi4stream_FIFO_CDC: .. index:: - single: AXI4-Stream; axi4stream_FIFO_cdc + single: AXI4-Stream; axi4stream_FIFO_CDC -axi4stream_FIFO_cdc +axi4stream_FIFO_CDC ################### Based on :ref:`IP/fifo_ic_got` -.. _IP/axi4stream_FIFO_cdc/goals: +.. _IP/axi4stream_FIFO_CDC/goals: .. topic:: Design Goals * tbd -.. _IP/axi4stream_FIFO_cdc/features: +.. _IP/axi4stream_FIFO_CDC/features: .. topic:: Features * tbd -.. _IP/axi4stream_FIFO_cdc/instantiation: +.. _IP/axi4stream_FIFO_CDC/instantiation: Instantiation ************* @@ -40,7 +40,7 @@ Instantiation .. code-block:: vhdl - FIFO : entity PoC.axi4stream_FIFO_cdc + FIFO : entity PoC.axi4stream_FIFO_CDC generic map ( TRANSACTIONS => 64 ) @@ -57,17 +57,17 @@ Instantiation ); -.. _IP/axi4stream_FIFO_cdc/interface: +.. _IP/axi4stream_FIFO_CDC/interface: Interface ********* -.. _IP/axi4stream_FIFO_cdc/generics: +.. _IP/axi4stream_FIFO_CDC/generics: Generics ======== -.. _IP/axi4stream_FIFO_cdc/gen/TRANSACTIONS: +.. _IP/axi4stream_FIFO_CDC/gen/TRANSACTIONS: :generic:`TRANSACTIONS` ----------------------- @@ -78,7 +78,7 @@ Generics :Description: tbd -.. _IP/axi4stream_FIFO_cdc/gen/DATA_REG: +.. _IP/axi4stream_FIFO_CDC/gen/DATA_REG: :generic:`DATA_REG` ----------------------- @@ -89,7 +89,7 @@ Generics :Description: tbd -.. _IP/axi4stream_FIFO_cdc/gen/OUTPUT_REG: +.. _IP/axi4stream_FIFO_CDC/gen/OUTPUT_REG: :generic:`OUTPUT_REG` ----------------------- @@ -100,12 +100,12 @@ Generics :Description: tbd -.. _IP/axi4stream_FIFO_cdc/ports: +.. _IP/axi4stream_FIFO_CDC/ports: Ports ===== -.. _IP/axi4stream_FIFO_cdc/port/In_Clock: +.. _IP/axi4stream_FIFO_CDC/port/In_Clock: :port:`In_Clock` ---------------- @@ -117,7 +117,7 @@ Ports :Description: Clock -.. _IP/axi4stream_FIFO_cdc/port/In_Reset: +.. _IP/axi4stream_FIFO_CDC/port/In_Reset: :port:`In_Reset` ---------------- @@ -129,31 +129,31 @@ Ports :Description: synchronous high-active reset -.. _IP/axi4stream_FIFO_cdc/port/In_m2s: +.. _IP/axi4stream_FIFO_CDC/port/In_m2s: :port:`In_m2s` -------------- :Name: ``In_m2s`` -:Type: ``axi4stream.T_AXI4stream_Bus_m2s`` +:Type: ``axi4stream.T_AXI4Stream_m2s`` :Mode: in :Default Value: — — — — :Description: AXI4-stream manager to subordinate signals. -.. _IP/axi4stream_FIFO_cdc/port/In_s2m: +.. _IP/axi4stream_FIFO_CDC/port/In_s2m: :port:`In_s2m` -------------- :Name: ``In_s2m`` -:Type: ``axi4stream.T_AXI4stream_Bus_s2m`` +:Type: ``axi4stream.T_AXI4Stream_s2m`` :Mode: out :Default Value: — — — — :Description: AXI4-stream subordinate to manager signals. -.. _IP/axi4stream_FIFO_cdc/port/Out_Clock: +.. _IP/axi4stream_FIFO_CDC/port/Out_Clock: :port:`Out_Clock` ----------------- @@ -165,7 +165,7 @@ Ports :Description: Clock -.. _IP/axi4stream_FIFO_cdc/port/Out_Reset: +.. _IP/axi4stream_FIFO_CDC/port/Out_Reset: :port:`Out_Reset` ----------------- @@ -177,31 +177,31 @@ Ports :Description: synchronous high-active reset -.. _IP/axi4stream_FIFO_cdc/port/Out_m2s: +.. _IP/axi4stream_FIFO_CDC/port/Out_m2s: :port:`Out_m2s` --------------- :Name: ``Out_m2s`` -:Type: ``axi4stream.T_AXI4stream_Bus_m2s`` +:Type: ``axi4stream.T_AXI4Stream_m2s`` :Mode: out :Default Value: — — — — :Description: AXI4-stream manager to subordinate signals. -.. _IP/axi4stream_FIFO_cdc/port/Out_s2m: +.. _IP/axi4stream_FIFO_CDC/port/Out_s2m: :port:`Out_s2m` --------------- :Name: ``Out_s2m`` -:Type: ``axi4stream.T_AXI4stream_Bus_s2m`` +:Type: ``axi4stream.T_AXI4Stream_s2m`` :Mode: in :Default Value: — — — — :Description: AXI4-stream subordinate to manager signals. -.. _IP/axi4stream_FIFO_cdc/configuration: +.. _IP/axi4stream_FIFO_CDC/configuration: Configuration ************* @@ -209,7 +209,7 @@ Configuration .. todo:: tbd -.. _IP/axi4stream_FIFO_cdc/UsedIn: +.. _IP/axi4stream_FIFO_CDC/UsedIn: Use in ****** diff --git a/docs/IPCores/bus/axi4stream/index.rst b/docs/IPCores/bus/axi4stream/index.rst index fcb960958..d0e2fb655 100644 --- a/docs/IPCores/bus/axi4stream/index.rst +++ b/docs/IPCores/bus/axi4stream/index.rst @@ -15,9 +15,9 @@ PoC.bus.axi4stream * :ref:`IP/axi4stream_DeMux` * :ref:`IP/axi4stream_Stage` * :ref:`IP/axi4stream_FIFO` - * :ref:`IP/axi4stream_FIFO_cdc` - * :ref:`IP/axi4stream_FIFO_tempput` - * :ref:`IP/axi4stream_FIFO_tempgot` + * :ref:`IP/axi4stream_FIFO_CDC` + * :ref:`IP/axi4stream_FIFO_TempPut` + * :ref:`IP/axi4stream_FIFO_TempGot` .. toctree:: :hidden: @@ -27,6 +27,6 @@ PoC.bus.axi4stream DeMux Stage FIFO - FIFO_cdc - FIFO_tempput - FIFO_tempgot + FIFO_CDC + FIFO_tempput + FIFO_tempgot diff --git a/docs/IPCores/bus/bus_Arbiter.rst b/docs/IPCores/bus/bus_Arbiter.rst index ce545e673..3083be281 100644 --- a/docs/IPCores/bus/bus_Arbiter.rst +++ b/docs/IPCores/bus/bus_Arbiter.rst @@ -7,11 +7,11 @@ PoC.bus.Arbiter .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/bus/bus_Arbiter.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/bus/bus_Arbiter.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/tb/bus/bus_Arbiter_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/bus/bus_Arbiter_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/bus/stream/stream.pkg.rst b/docs/IPCores/bus/stream/stream.pkg.rst index dc875a127..5ab737eb3 100644 --- a/docs/IPCores/bus/stream/stream.pkg.rst +++ b/docs/IPCores/bus/stream/stream.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/bus/stream/stream.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/bus/stream/stream.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/bus/stream/stream_DeMux.rst b/docs/IPCores/bus/stream/stream_DeMux.rst index 412100b1e..3267ef91c 100644 --- a/docs/IPCores/bus/stream/stream_DeMux.rst +++ b/docs/IPCores/bus/stream/stream_DeMux.rst @@ -7,11 +7,11 @@ PoC.bus.stream.DeMux .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/bus/stream/stream_DeMux.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/bus/stream/stream_DeMux.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/bus/stream/stream_DeMux_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/bus/stream/stream_DeMux_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/bus/stream/stream_FIFO.rst b/docs/IPCores/bus/stream/stream_FIFO.rst index 48779a136..6ed8bccfa 100644 --- a/docs/IPCores/bus/stream/stream_FIFO.rst +++ b/docs/IPCores/bus/stream/stream_FIFO.rst @@ -7,11 +7,11 @@ PoC.bus.stream.FIFO .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/bus/stream/stream_FIFO.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/bus/stream/stream_FIFO.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/bus/stream/stream_FIFO_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/bus/stream/stream_FIFO_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/bus/stream/stream_FrameGenerator.rst b/docs/IPCores/bus/stream/stream_FrameGenerator.rst index 030de6d77..9347e2942 100644 --- a/docs/IPCores/bus/stream/stream_FrameGenerator.rst +++ b/docs/IPCores/bus/stream/stream_FrameGenerator.rst @@ -7,11 +7,11 @@ PoC.bus.stream.FrameGenerator .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/bus/stream/stream_FrameGenerator.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/bus/stream/stream_FrameGenerator.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/bus/stream/stream_FrameGenerator_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/bus/stream/stream_FrameGenerator_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/bus/stream/stream_Mirror.rst b/docs/IPCores/bus/stream/stream_Mirror.rst index 8683c4602..f7c7b37c5 100644 --- a/docs/IPCores/bus/stream/stream_Mirror.rst +++ b/docs/IPCores/bus/stream/stream_Mirror.rst @@ -7,11 +7,11 @@ PoC.bus.stream.Mirror .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/bus/stream/stream_Mirror.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/bus/stream/stream_Mirror.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/bus/stream/stream_Mirror_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/bus/stream/stream_Mirror_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/bus/stream/stream_Mux.rst b/docs/IPCores/bus/stream/stream_Mux.rst index 824d92774..17a7ed872 100644 --- a/docs/IPCores/bus/stream/stream_Mux.rst +++ b/docs/IPCores/bus/stream/stream_Mux.rst @@ -7,11 +7,11 @@ PoC.bus.stream.Mux .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/bus/stream/stream_Mux.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/bus/stream/stream_Mux.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/bus/stream/stream_Mux_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/bus/stream/stream_Mux_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/bus/stream/stream_Sink.rst b/docs/IPCores/bus/stream/stream_Sink.rst index b67f481b3..121349929 100644 --- a/docs/IPCores/bus/stream/stream_Sink.rst +++ b/docs/IPCores/bus/stream/stream_Sink.rst @@ -7,11 +7,11 @@ PoC.bus.stream.Sink .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/bus/stream/stream_Sink.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/bus/stream/stream_Sink.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/bus/stream/stream_Sink_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/bus/stream/stream_Sink_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/bus/stream/stream_Source.rst b/docs/IPCores/bus/stream/stream_Source.rst index 723622a1e..3d50013bc 100644 --- a/docs/IPCores/bus/stream/stream_Source.rst +++ b/docs/IPCores/bus/stream/stream_Source.rst @@ -7,11 +7,11 @@ PoC.bus.stream.Source .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/bus/stream/stream_Source.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/bus/stream/stream_Source.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/bus/stream/stream_Source_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/bus/stream/stream_Source_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/bus/wb/wb.pkg.rst b/docs/IPCores/bus/wb/wb.pkg.rst index cd2ee2b95..dd372448d 100644 --- a/docs/IPCores/bus/wb/wb.pkg.rst +++ b/docs/IPCores/bus/wb/wb.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/bus/wb/wb.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/bus/wb/wb.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/bus/wb/wb_fifo_adapter.rst b/docs/IPCores/bus/wb/wb_fifo_adapter.rst index 17b3ba42a..f546bc948 100644 --- a/docs/IPCores/bus/wb/wb_fifo_adapter.rst +++ b/docs/IPCores/bus/wb/wb_fifo_adapter.rst @@ -7,11 +7,11 @@ PoC.bus.wb.fifo_adapter .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/bus/wb/wb_fifo_adapter.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/bus/wb/wb_fifo_adapter.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/bus/wb/wb_fifo_adapter_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/bus/wb/wb_fifo_adapter_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/bus/wb/wb_ocram.rst b/docs/IPCores/bus/wb/wb_ocram.rst index 8a03901bf..6f670b176 100644 --- a/docs/IPCores/bus/wb/wb_ocram.rst +++ b/docs/IPCores/bus/wb/wb_ocram.rst @@ -7,11 +7,11 @@ PoC.bus.wb.ocram .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/bus/wb/wb_ocram.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/bus/wb/wb_ocram.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/bus/wb/wb_ocram_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/bus/wb/wb_ocram_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/bus/wb/wb_uart_wrapper.rst b/docs/IPCores/bus/wb/wb_uart_wrapper.rst index 78bdf6f69..46765f09f 100644 --- a/docs/IPCores/bus/wb/wb_uart_wrapper.rst +++ b/docs/IPCores/bus/wb/wb_uart_wrapper.rst @@ -7,11 +7,11 @@ PoC.bus.wb.uart_wrapper .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/bus/wb/wb_uart_wrapper.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/bus/wb/wb_uart_wrapper.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/bus/wb/wb_uart_wrapper_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/bus/wb/wb_uart_wrapper_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links @@ -19,8 +19,8 @@ PoC.bus.wb.uart_wrapper * |gh-src| :pocsrc:`Sourcecode ` * |gh-tb| :poctb:`Testbench ` -Wrapper module for :doc:`PoC.io.uart.rx ` and -:doc:`PoC.io.uart.tx ` to support the Wishbone +Wrapper module for :doc:`PoC.io.uart.rx ` and +:doc:`PoC.io.uart.tx ` to support the Wishbone interface. Synchronized reset is used. diff --git a/docs/IPCores/cache/cache_cpu.rst b/docs/IPCores/cache/cache_CPU.rst similarity index 91% rename from docs/IPCores/cache/cache_cpu.rst rename to docs/IPCores/cache/cache_CPU.rst index 1663a2a18..ec73c42ef 100644 --- a/docs/IPCores/cache/cache_cpu.rst +++ b/docs/IPCores/cache/cache_CPU.rst @@ -1,25 +1,25 @@ -.. _IP/cache_cpu: +.. _IP/cache_CPU: -PoC.cache.cpu +PoC.cache.CPU ############# .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/cache/cache_cpu.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/cache/cache_CPU.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/cache/cache_cpu_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/cache/cache_CPU_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` -This unit provides a cache (:ref:`IP/cache_par2`) together +This unit provides a cache (:ref:`IP/cache_Parallel2`) together with a cache controller which reads / writes cache lines from / to memory. The memory is accessed using a :ref:`INT:PoC.Mem` interfaces, the related ports and parameters are prefixed with ``mem_``. @@ -53,7 +53,7 @@ directly fed by the address caculator. But be aware of the high setup time of this unit and high propate time for ``cpu_got``. This unit supports only one outstanding CPU request. More outstanding -requests are provided by :ref:`IP/cache_mem`. +requests are provided by :ref:`IP/cache_Memory`. Configuration @@ -159,7 +159,7 @@ cycles and acknowledged when the data has been issued to the memory. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/cache/cache_cpu.vhdl +.. literalinclude:: ../../../src/cache/cache_CPU.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -167,10 +167,10 @@ cycles and acknowledged when the data has been issued to the memory. .. seealso:: - :ref:`IP/cache_mem` + :ref:`IP/cache_Memory` .. only:: latex - Source file: :pocsrc:`cache/cache_cpu.vhdl ` + Source file: :pocsrc:`cache/cache_CPU.vhdl ` diff --git a/docs/IPCores/cache/cache_mem.rst b/docs/IPCores/cache/cache_Memory.rst similarity index 88% rename from docs/IPCores/cache/cache_mem.rst rename to docs/IPCores/cache/cache_Memory.rst index 556d739c9..7ba601dc0 100644 --- a/docs/IPCores/cache/cache_mem.rst +++ b/docs/IPCores/cache/cache_Memory.rst @@ -1,25 +1,25 @@ -.. _IP/cache_mem: +.. _IP/cache_Memory: -PoC.cache.mem -############# +PoC.cache.Memory +################ .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/cache/cache_mem.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/cache/cache_Memory.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/cache/cache_mem_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/cache/cache_Memory_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` -This unit provides a cache (:ref:`IP/cache_par2`) together +This unit provides a cache (:ref:`IP/cache_Parallel2`) together with a cache controller which reads / writes cache lines from / to memory. It has two :ref:`INT:PoC.Mem` interfaces: @@ -28,7 +28,7 @@ It has two :ref:`INT:PoC.Mem` interfaces: Thus, this unit can be placed into an already available memory path between the CPU and the memory (controller). If you want to plugin a cache into a -CPU pipeline, see :ref:`IP/cache_cpu`. +CPU pipeline, see :ref:`IP/cache_CPU`. Configuration @@ -119,7 +119,7 @@ The interface is documented in detail :ref:`here `. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/cache/cache_mem.vhdl +.. literalinclude:: ../../../src/cache/cache_Memory.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -127,10 +127,10 @@ The interface is documented in detail :ref:`here `. .. seealso:: - :ref:`IP/cache_cpu` + :ref:`IP/cache_CPU` .. only:: latex - Source file: :pocsrc:`cache/cache_mem.vhdl ` + Source file: :pocsrc:`cache/cache_Memory.vhdl ` diff --git a/docs/IPCores/cache/cache_par.rst b/docs/IPCores/cache/cache_Parallel.rst similarity index 83% rename from docs/IPCores/cache/cache_par.rst rename to docs/IPCores/cache/cache_Parallel.rst index daa471d36..972cb7d0a 100644 --- a/docs/IPCores/cache/cache_par.rst +++ b/docs/IPCores/cache/cache_Parallel.rst @@ -1,23 +1,23 @@ -.. _IP/cache_par: +.. _IP/cache_Parallel: -PoC.cache.par -############# +PoC.cache.Parallel +################## .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/cache/cache_par.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/cache/cache_Parallel.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/cache/cache_par_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/cache/cache_Parallel_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Implements a cache with parallel tag-unit and data memory. @@ -26,7 +26,7 @@ Implements a cache with parallel tag-unit and data memory. is, upon writes the old-data is returned on the read output. Such memory (e.g. LUT-RAM) is not available on all devices. Thus, synthesis may infer a lot of flip-flops plus multiplexers instead, which is very inefficient. - It is recommended to use :doc:`PoC.cache.par2 ` instead which has a + It is recommended to use :doc:`PoC.cache.par2 ` instead which has a slightly different interface. All inputs are synchronous to the rising-edge of the clock `clock`. @@ -75,7 +75,7 @@ both with a latency of one clock cycle. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/cache/cache_par.vhdl +.. literalinclude:: ../../../src/cache/cache_Parallel.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -85,4 +85,4 @@ both with a latency of one clock cycle. .. only:: latex - Source file: :pocsrc:`cache/cache_par.vhdl ` + Source file: :pocsrc:`cache/cache_Parallel.vhdl ` diff --git a/docs/IPCores/cache/cache_par2.rst b/docs/IPCores/cache/cache_Parallel2.rst similarity index 89% rename from docs/IPCores/cache/cache_par2.rst rename to docs/IPCores/cache/cache_Parallel2.rst index 0bca93608..0508e3021 100644 --- a/docs/IPCores/cache/cache_par2.rst +++ b/docs/IPCores/cache/cache_Parallel2.rst @@ -1,26 +1,26 @@ -.. _IP/cache_par2: +.. _IP/cache_Parallel2: -PoC.cache.par2 -############## +PoC.cache.Parallel2 +################### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/cache/cache_par2.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/cache/cache_Parallel2.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/cache/cache_par2_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/cache/cache_Parallel2_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Cache with parallel tag-unit and data memory. For the data memory, -:ref:`IP/ocram_sp` is used. +:ref:`IP/ocram_SinglePort` is used. Configuration ************* @@ -107,7 +107,7 @@ Replacing a cache line requires two steps, both with ``Replace = '1'``: .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/cache/cache_par2.vhdl +.. literalinclude:: ../../../src/cache/cache_Parallel2.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -117,4 +117,4 @@ Replacing a cache line requires two steps, both with ``Replace = '1'``: .. only:: latex - Source file: :pocsrc:`cache/cache_par2.vhdl ` + Source file: :pocsrc:`cache/cache_Parallel2.vhdl ` diff --git a/docs/IPCores/cache/cache_tagunit_par.rst b/docs/IPCores/cache/cache_TagUnit_Parallel.rst similarity index 87% rename from docs/IPCores/cache/cache_tagunit_par.rst rename to docs/IPCores/cache/cache_TagUnit_Parallel.rst index 8d6470c4d..71dfd9fc6 100644 --- a/docs/IPCores/cache/cache_tagunit_par.rst +++ b/docs/IPCores/cache/cache_TagUnit_Parallel.rst @@ -1,23 +1,23 @@ -.. _IP/cache_tagunit_par: +.. _IP/cache_TagUnit_Parallel: -PoC.cache.tagunit_par -##################### +PoC.cache.tagunit_Parallel +########################## .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/cache/cache_tagunit_par.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/cache/cache_TagUnit_Parallel.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/cache/cache_tagunit_par_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/cache/cache_TagUnit_Parallel_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Tag-unit with fully-parallel compare of tag. @@ -99,7 +99,7 @@ must be a power of 2. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/cache/cache_tagunit_par.vhdl +.. literalinclude:: ../../../src/cache/cache_TagUnit_Parallel.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -109,4 +109,4 @@ must be a power of 2. .. only:: latex - Source file: :pocsrc:`cache/cache_tagunit_par.vhdl ` + Source file: :pocsrc:`cache/cache_TagUnit_Parallel.vhdl ` diff --git a/docs/IPCores/cache/cache_TagUnit_Sequential.rst b/docs/IPCores/cache/cache_TagUnit_Sequential.rst new file mode 100644 index 000000000..174cf7f06 --- /dev/null +++ b/docs/IPCores/cache/cache_TagUnit_Sequential.rst @@ -0,0 +1,38 @@ +.. _IP/cache_TagUnit_Sequential: + +PoC.cache.TagUnit_Sequential +############################ + +.. only:: html + + .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/src/cache/cache_TagUnit_Sequential.vhdl + :alt: Source Code on GitHub + .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/tb/cache/cache_TagUnit_Sequential_tb.vhdl + :alt: Source Code on GitHub + + .. sidebar:: GitHub Links + + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` + +.. TODO:: No documentation available. + + + +.. rubric:: Entity Declaration: + +.. literalinclude:: ../../../src/cache/cache_TagUnit_Sequential.vhdl + :language: vhdl + :tab-width: 2 + :linenos: + :lines: 39-73 + + + +.. only:: latex + + Source file: :pocsrc:`cache/cache_TagUnit_Sequential.vhdl ` diff --git a/docs/IPCores/cache/cache_replacement_policy.rst b/docs/IPCores/cache/cache_replacement_policy.rst index 36dc43c62..3562ca22e 100644 --- a/docs/IPCores/cache/cache_replacement_policy.rst +++ b/docs/IPCores/cache/cache_replacement_policy.rst @@ -7,11 +7,11 @@ PoC.cache.replacement_policy .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/cache/cache_replacement_policy.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/cache/cache_replacement_policy.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/cache/cache_replacement_policy_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/cache/cache_replacement_policy_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/cache/cache_tagunit_seq.rst b/docs/IPCores/cache/cache_tagunit_seq.rst deleted file mode 100644 index de8fe6fbf..000000000 --- a/docs/IPCores/cache/cache_tagunit_seq.rst +++ /dev/null @@ -1,38 +0,0 @@ -.. _IP/cache_tagunit_seq: - -PoC.cache.tagunit_seq -##################### - -.. only:: html - - .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/cache/cache_tagunit_seq.vhdl - :alt: Source Code on GitHub - .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/cache/cache_tagunit_seq_tb.vhdl - :alt: Source Code on GitHub - - .. sidebar:: GitHub Links - - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` - -.. TODO:: No documentation available. - - - -.. rubric:: Entity Declaration: - -.. literalinclude:: ../../../src/cache/cache_tagunit_seq.vhdl - :language: vhdl - :tab-width: 2 - :linenos: - :lines: 39-73 - - - -.. only:: latex - - Source file: :pocsrc:`cache/cache_tagunit_seq.vhdl ` diff --git a/docs/IPCores/cache/index.rst b/docs/IPCores/cache/index.rst index a8fad4124..7c259e24d 100644 --- a/docs/IPCores/cache/index.rst +++ b/docs/IPCores/cache/index.rst @@ -7,39 +7,34 @@ The namespace `PoC.cache` offers different cache implementations. **Entities** - * :ref:`IP/cache_cpu`: Cache with cache controller to be used within a CPU. + * :ref:`IP/cache_CPU`: Cache with cache controller to be used within a CPU. - * :ref:`IP/cache_mem`: Cache with :ref:`INT:PoC.Mem` interface on the "CPU" side. + * :ref:`IP/cache_Memory`: Cache with :ref:`INT:PoC.Memory` interface on the "CPU" side. - * :ref:`IP/cache_par`: Cache with parallel tag-unit and - data memory (using infered memory). + * :ref:`IP/cache_Parallel`: Cache with parallel tag-unit and data memory (using infered memory). - * :ref:`IP/cache_par2`: Cache with parallel tag-unit and - data memory (using :ref:`IP/ocram_sp`). + * :ref:`IP/cache_Parallel2`: Cache with parallel tag-unit and data memory (using :ref:`IP/ocram_SinglePort`). - * :ref:`IP/cache_tagunit_par`: Tag-Unit with - parallel tag comparison. Configurable as: + * :ref:`IP/cache_TagUnit_Parallel`: Tag-Unit with parallel tag comparison. Configurable as: +* Full-associative cache, +* Direct-mapped cache, or +* Set-associative cache. - * Full-associative cache, - * Direct-mapped cache, or - * Set-associative cache. + * :ref:`IP/cache_TagUnit_Sequential`: Tag-Unit with sequential tag comparison. Configurable as: - * :ref:`IP/cache_tagunit_seq`: Tag-Unit with - sequential tag comparison. Configurable as: - - * Full-associative cache, - * Direct-mapped cache, or - * Set-associative cache. +* Full-associative cache, +* Direct-mapped cache, or +* Set-associative cache. .. toctree:: - :hidden: - - cache_cpu - cache_mem - cache_par - cache_par2 - cache_replacement_policy - cache_tagunit_par - cache_tagunit_seq +:hidden: + + cache_CPU + cache_Memory + cache_Parallel + cache_Parallel2 + cache_ReplacementPolicy + cache_TagUnit_Parallel + cache_TagUnit_Sequential diff --git a/docs/IPCores/comm/comm.pkg.rst b/docs/IPCores/comm/comm.pkg.rst index 2d1134ccb..c6cfe71a5 100644 --- a/docs/IPCores/comm/comm.pkg.rst +++ b/docs/IPCores/comm/comm.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/comm/comm.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/comm/comm.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/comm/comm_crc.rst b/docs/IPCores/comm/comm_crc.rst index 4977da3ff..5ef3bb3c2 100644 --- a/docs/IPCores/comm/comm_crc.rst +++ b/docs/IPCores/comm/comm_crc.rst @@ -1,22 +1,22 @@ -.. _IP/comm_crc: +.. _IP/comm_CRC: -PoC.comm.crc +PoC.comm.CRC ############ .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/comm/comm_crc.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/comm/comm_CRC.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/comm/comm_crc_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/comm/comm_crc_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` + * |gh-src| :pocsrc:`Sourcecode ` * |gh-tb| :poctb:`Testbench ` Computes the Cyclic Redundancy Check (CRC) for a data packet as remainder @@ -31,7 +31,7 @@ processing width. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/comm/comm_crc.vhdl +.. literalinclude:: ../../../src/comm/comm_CRC.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -41,4 +41,4 @@ processing width. .. only:: latex - Source file: :pocsrc:`comm/comm_crc.vhdl ` + Source file: :pocsrc:`comm/comm_CRC.vhdl ` diff --git a/docs/IPCores/comm/comm_scramble.rst b/docs/IPCores/comm/comm_scramble.rst index 111afa020..6a65f98b0 100644 --- a/docs/IPCores/comm/comm_scramble.rst +++ b/docs/IPCores/comm/comm_scramble.rst @@ -1,22 +1,22 @@ -.. _IP/comm_scramble: +.. _IP/comm_Scramble: -PoC.comm.scramble +PoC.comm.Scramble ################# .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/comm/comm_scramble.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/comm/comm_Scramble.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/comm/comm_scramble_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/comm/comm_scramble_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` + * |gh-src| :pocsrc:`Sourcecode ` * |gh-tb| :poctb:`Testbench ` The LFSR computation is unrolled to generate an arbitrary number of mask @@ -27,7 +27,7 @@ sequence is independent from the chosen output width. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/comm/comm_scramble.vhdl +.. literalinclude:: ../../../src/comm/comm_Scramble.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -37,4 +37,4 @@ sequence is independent from the chosen output width. .. only:: latex - Source file: :pocsrc:`comm/comm_scramble.vhdl ` + Source file: :pocsrc:`comm/comm_Scramble.vhdl ` diff --git a/docs/IPCores/comm/index.rst b/docs/IPCores/comm/index.rst index 49d75e876..6052425b7 100644 --- a/docs/IPCores/comm/index.rst +++ b/docs/IPCores/comm/index.rst @@ -13,5 +13,5 @@ These are communication entities.... .. toctree:: :hidden: - comm_crc - comm_scramble + comm_CRC + comm_Scramble diff --git a/docs/IPCores/comm/remote/index.rst b/docs/IPCores/comm/remote/index.rst index bce0b74ca..66779da63 100644 --- a/docs/IPCores/comm/remote/index.rst +++ b/docs/IPCores/comm/remote/index.rst @@ -14,4 +14,4 @@ These are communication entities.... .. toctree:: :hidden: - remote_terminal_control + remote_TerminalControl diff --git a/docs/IPCores/comm/remote/remote_TerminalControl.rst b/docs/IPCores/comm/remote/remote_TerminalControl.rst new file mode 100644 index 000000000..13601d889 --- /dev/null +++ b/docs/IPCores/comm/remote/remote_TerminalControl.rst @@ -0,0 +1,36 @@ +.. _IP/remote_TerminalControl: + +PoC.comm.remote.TerminalControl +############################### + +.. only:: html + + .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/src/comm/remote/remote_TerminalControl.vhdl + :alt: Source Code on GitHub + .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/tb/comm/remote/remote_TerminalControl_tb.vhdl + :alt: Source Code on GitHub + + .. sidebar:: GitHub Links + + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` + + + +.. rubric:: Entity Declaration: + +.. literalinclude:: ../../../../src/comm/remote/remote_TerminalControl.vhdl + :language: vhdl + :tab-width: 2 + :linenos: + :lines: 86-117 + + + +.. only:: latex + + Source file: :pocsrc:`comm/remote/remote_TerminalControl.vhdl ` diff --git a/docs/IPCores/comm/remote/remote_terminal_control.rst b/docs/IPCores/comm/remote/remote_terminal_control.rst deleted file mode 100644 index d989a67cf..000000000 --- a/docs/IPCores/comm/remote/remote_terminal_control.rst +++ /dev/null @@ -1,36 +0,0 @@ -.. _IP/remote_terminal_control: - -PoC.comm.remote.terminal_control -################################ - -.. only:: html - - .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/comm/remote/remote_terminal_control.vhdl - :alt: Source Code on GitHub - .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/comm/remote/remote_terminal_control_tb.vhdl - :alt: Source Code on GitHub - - .. sidebar:: GitHub Links - - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` - - - -.. rubric:: Entity Declaration: - -.. literalinclude:: ../../../../src/comm/remote/remote_terminal_control.vhdl - :language: vhdl - :tab-width: 2 - :linenos: - :lines: 86-117 - - - -.. only:: latex - - Source file: :pocsrc:`comm/remote/remote_terminal_control.vhdl ` diff --git a/docs/IPCores/dstruct/dstruct_deque.rst b/docs/IPCores/dstruct/dstruct_DoubleEndedQueue.rst similarity index 50% rename from docs/IPCores/dstruct/dstruct_deque.rst rename to docs/IPCores/dstruct/dstruct_DoubleEndedQueue.rst index a916fb9a0..6cb4a52b0 100644 --- a/docs/IPCores/dstruct/dstruct_deque.rst +++ b/docs/IPCores/dstruct/dstruct_DoubleEndedQueue.rst @@ -1,23 +1,23 @@ -.. _IP/dstruct_deque: +.. _IP/dstruct_DoubleEndedQueue: -PoC.dstruct.deque -################# +PoC.dstruct.DoubleEndedQueue +############################ .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/dstruct/dstruct_deque.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/dstruct/dstruct_DoubleEndedQueue.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/dstruct/dstruct_deque_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/dstruct/dstruct_DoubleEndedQueue_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Implements a deque (double-ended queue). This data structure allows two acting entities to queue data elements for the consumption by the other while @@ -27,7 +27,7 @@ still being able to unqueue untaken ones in LIFO fashion. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/dstruct/dstruct_deque.vhdl +.. literalinclude:: ../../../src/dstruct/dstruct_DoubleEndedQueue.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -37,4 +37,4 @@ still being able to unqueue untaken ones in LIFO fashion. .. only:: latex - Source file: :pocsrc:`dstruct/dstruct_deque.vhdl ` + Source file: :pocsrc:`dstruct/dstruct_DoubleEndedQueue.vhdl ` diff --git a/docs/IPCores/dstruct/dstruct_stack.rst b/docs/IPCores/dstruct/dstruct_Stack.rst similarity index 51% rename from docs/IPCores/dstruct/dstruct_stack.rst rename to docs/IPCores/dstruct/dstruct_Stack.rst index 3ae960627..c5d1e2a13 100644 --- a/docs/IPCores/dstruct/dstruct_stack.rst +++ b/docs/IPCores/dstruct/dstruct_Stack.rst @@ -1,4 +1,4 @@ -.. _IP/dstruct_stack: +.. _IP/dstruct_Stack: PoC.dstruct.stack ################# @@ -7,17 +7,17 @@ PoC.dstruct.stack .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/dstruct/dstruct_stack.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/dstruct/dstruct_Stack.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/dstruct/dstruct_stack_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/dstruct/dstruct_Stack_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Implements a stack, a LIFO storage abstraction. @@ -25,7 +25,7 @@ Implements a stack, a LIFO storage abstraction. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/dstruct/dstruct_stack.vhdl +.. literalinclude:: ../../../src/dstruct/dstruct_Stack.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -35,4 +35,4 @@ Implements a stack, a LIFO storage abstraction. .. only:: latex - Source file: :pocsrc:`dstruct/dstruct_stack.vhdl ` + Source file: :pocsrc:`dstruct/dstruct_Stack.vhdl ` diff --git a/docs/IPCores/dstruct/index.rst b/docs/IPCores/dstruct/index.rst index c858dbb1e..11f8395f4 100644 --- a/docs/IPCores/dstruct/index.rst +++ b/docs/IPCores/dstruct/index.rst @@ -11,8 +11,8 @@ The package :ref:`NS/dstruct` holds all component declarations for this namespac **Entities** - * :ref:`IP/dstruct_deque` implements a deque (two-sided FIFO). - * :ref:`IP/dstruct_stack` implements a regular stack. + * :ref:`IP/dstruct_DoubleEndedQueue` implements a deque (two-sided FIFO). + * :ref:`IP/dstruct_Stack` implements a regular stack. .. toctree:: :hidden: @@ -22,5 +22,5 @@ The package :ref:`NS/dstruct` holds all component declarations for this namespac .. toctree:: :hidden: - dstruct_deque - dstruct_stack + dstruct_DoubleEndedQueue + dstruct_Stack diff --git a/docs/IPCores/fifo/fifo.pkg.rst b/docs/IPCores/fifo/fifo.pkg.rst index ecb872b7f..1f1e027d1 100644 --- a/docs/IPCores/fifo/fifo.pkg.rst +++ b/docs/IPCores/fifo/fifo.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/fifo/fifo.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/fifo/fifo.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/fifo/fifo_cc_got.rst b/docs/IPCores/fifo/fifo_cc_got.rst index faa9fdd96..ade671852 100644 --- a/docs/IPCores/fifo/fifo_cc_got.rst +++ b/docs/IPCores/fifo/fifo_cc_got.rst @@ -7,11 +7,11 @@ PoC.fifo.cc_got .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/fifo/fifo_cc_got.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/fifo/fifo_cc_got.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/fifo/fifo_cc_got_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/fifo/fifo_cc_got_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/fifo/fifo_cc_got_tempgot.rst b/docs/IPCores/fifo/fifo_cc_got_tempgot.rst index 005d743b0..ace1b02c8 100644 --- a/docs/IPCores/fifo/fifo_cc_got_tempgot.rst +++ b/docs/IPCores/fifo/fifo_cc_got_tempgot.rst @@ -7,11 +7,11 @@ PoC.fifo.cc_got_tempgot .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/fifo/fifo_cc_got_tempgot.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/fifo/fifo_cc_got_tempgot.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/fifo/fifo_cc_got_tempgot_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/fifo/fifo_cc_got_tempgot_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/fifo/fifo_cc_got_tempput.rst b/docs/IPCores/fifo/fifo_cc_got_tempput.rst index e2c082151..500c1a268 100644 --- a/docs/IPCores/fifo/fifo_cc_got_tempput.rst +++ b/docs/IPCores/fifo/fifo_cc_got_tempput.rst @@ -7,11 +7,11 @@ PoC.fifo.cc_got_tempput .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/fifo/fifo_cc_got_tempput.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/fifo/fifo_cc_got_tempput.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/fifo/fifo_cc_got_tempput_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/fifo/fifo_cc_got_tempput_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/fifo/fifo_ic_assembly.rst b/docs/IPCores/fifo/fifo_ic_assembly.rst index ca2f34238..7d95637c6 100644 --- a/docs/IPCores/fifo/fifo_ic_assembly.rst +++ b/docs/IPCores/fifo/fifo_ic_assembly.rst @@ -7,11 +7,11 @@ PoC.fifo.ic_assembly .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/fifo/fifo_ic_assembly.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/fifo/fifo_ic_assembly.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/fifo/fifo_ic_assembly_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/fifo/fifo_ic_assembly_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/fifo/fifo_ic_got.rst b/docs/IPCores/fifo/fifo_ic_got.rst index 499ee6aec..798d13d35 100644 --- a/docs/IPCores/fifo/fifo_ic_got.rst +++ b/docs/IPCores/fifo/fifo_ic_got.rst @@ -7,11 +7,11 @@ PoC.fifo.ic_got .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/fifo/fifo_ic_got.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/fifo/fifo_ic_got.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/fifo/fifo_ic_got_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/fifo/fifo_ic_got_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/fifo/fifo_shift.rst b/docs/IPCores/fifo/fifo_shift.rst index 9d5010f38..6309ad35d 100644 --- a/docs/IPCores/fifo/fifo_shift.rst +++ b/docs/IPCores/fifo/fifo_shift.rst @@ -1,22 +1,22 @@ -.. _IP/fifo_shift: +.. _IP/fifo_Shift: -PoC.fifo.shift +PoC.fifo.Shift ############## .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/fifo/fifo_shift.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/fifo/fifo_Shift.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/fifo/fifo_shift_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/fifo/fifo_shift_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` + * |gh-src| :pocsrc:`Sourcecode ` * |gh-tb| :poctb:`Testbench ` This FIFO implementation is based on an internal shift register. This is @@ -31,7 +31,7 @@ The specified depth (``MIN_DEPTH``) is rounded up to the next suitable value. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/fifo/fifo_shift.vhdl +.. literalinclude:: ../../../src/fifo/fifo_Shift.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -41,4 +41,4 @@ The specified depth (``MIN_DEPTH``) is rounded up to the next suitable value. .. only:: latex - Source file: :pocsrc:`fifo/fifo_shift.vhdl ` + Source file: :pocsrc:`fifo/fifo_Shift.vhdl ` diff --git a/docs/IPCores/fifo/fifo_stage.rst b/docs/IPCores/fifo/fifo_stage.rst index 440df8333..47de2c75a 100644 --- a/docs/IPCores/fifo/fifo_stage.rst +++ b/docs/IPCores/fifo/fifo_stage.rst @@ -7,16 +7,16 @@ PoC.fifo.Stage .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/fifo/fifo_stage.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/fifo/fifo_Stage.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/fifo/fifo_stage_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/fifo/fifo_stage_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` + * |gh-src| :pocsrc:`Sourcecode ` * |gh-tb| :poctb:`Testbench ` Its primary use is the decoupling of enable domains in a processing @@ -27,7 +27,7 @@ the ``ful`` and the ``vld`` indicators to be driven by registers. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/fifo/fifo_stage.vhdl +.. literalinclude:: ../../../src/fifo/fifo_Stage.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -37,4 +37,4 @@ the ``ful`` and the ``vld`` indicators to be driven by registers. .. only:: latex - Source file: :pocsrc:`fifo/fifo_stage.vhdl ` + Source file: :pocsrc:`fifo/fifo_Stage.vhdl ` diff --git a/docs/IPCores/fifo/index.rst b/docs/IPCores/fifo/index.rst index 9339f4a2c..2a41db7a2 100644 --- a/docs/IPCores/fifo/index.rst +++ b/docs/IPCores/fifo/index.rst @@ -30,9 +30,9 @@ clock) refer to the write- and read-side clock relationship. got-interface), extended by a transactional `tempput`-interface (write-side). * :ref:`IP/fifo_ic_got` implements a cross-clock FIFO (two independent clocks, got-interface) - * :ref:`IP/fifo_stage` implements a two-stage FIFO (one common clock, + * :ref:`IP/fifo_Stage` implements a two-stage FIFO (one common clock, got-interface) - * :ref:`IP/fifo_shift` implements a regular FIFO (one common clock, + * :ref:`IP/fifo_Shift` implements a regular FIFO (one common clock, got-interface, optimized for FPGAs with shifter primitives) .. toctree:: @@ -46,7 +46,7 @@ clock) refer to the write- and read-side clock relationship. fifo_cc_got fifo_cc_got_tempgot fifo_cc_got_tempput - fifo_stage + fifo_Stage fifo_ic_assembly fifo_ic_got - fifo_shift + fifo_Shift diff --git a/docs/IPCores/io/ddrio/ddrio.pkg.rst b/docs/IPCores/io/ddrio/ddrio.pkg.rst index 255361223..1e95f76c8 100644 --- a/docs/IPCores/io/ddrio/ddrio.pkg.rst +++ b/docs/IPCores/io/ddrio/ddrio.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/ddrio/ddrio.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/ddrio/ddrio.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/ddrio/ddrio_in.rst b/docs/IPCores/io/ddrio/ddrio_In.rst similarity index 79% rename from docs/IPCores/io/ddrio/ddrio_in.rst rename to docs/IPCores/io/ddrio/ddrio_In.rst index 8f2478ae3..02a7c6550 100644 --- a/docs/IPCores/io/ddrio/ddrio_in.rst +++ b/docs/IPCores/io/ddrio/ddrio_In.rst @@ -1,23 +1,23 @@ -.. _IP/ddrio_in: +.. _IP/ddrio_In: -PoC.io.ddrio.in +PoC.io.ddrio.In ############### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/ddrio/ddrio_in.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/ddrio/ddrio_In.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/ddrio/ddrio_in_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/ddrio/ddrio_In_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Instantiates chip-specific :abbr:`DDR (Double Data Rate)` input registers. @@ -57,7 +57,7 @@ IOBs. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/io/ddrio/ddrio_in.vhdl +.. literalinclude:: ../../../../src/io/ddrio/ddrio_In.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -67,4 +67,4 @@ IOBs. .. only:: latex - Source file: :pocsrc:`io/ddrio/ddrio_in.vhdl ` + Source file: :pocsrc:`io/ddrio/ddrio_In.vhdl ` diff --git a/docs/IPCores/io/ddrio/ddrio_inout.rst b/docs/IPCores/io/ddrio/ddrio_InOut.rst similarity index 84% rename from docs/IPCores/io/ddrio/ddrio_inout.rst rename to docs/IPCores/io/ddrio/ddrio_InOut.rst index 65923d209..2b1b92ac9 100644 --- a/docs/IPCores/io/ddrio/ddrio_inout.rst +++ b/docs/IPCores/io/ddrio/ddrio_InOut.rst @@ -1,23 +1,23 @@ -.. _IP/ddrio_inout: +.. _IP/ddrio_InOut: -PoC.io.ddrio.inout +PoC.io.ddrio.InOut ################## .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/ddrio/ddrio_inout.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/ddrio/ddrio_InOut.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/ddrio/ddrio_inout_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/ddrio/ddrio_InOut_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Instantiates chip-specific :abbr:`DDR (Double Data Rate)` input and output registers. @@ -72,7 +72,7 @@ IOBs. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/io/ddrio/ddrio_inout.vhdl +.. literalinclude:: ../../../../src/io/ddrio/ddrio_InOut.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -82,4 +82,4 @@ IOBs. .. only:: latex - Source file: :pocsrc:`io/ddrio/ddrio_inout.vhdl ` + Source file: :pocsrc:`io/ddrio/ddrio_InOut.vhdl ` diff --git a/docs/IPCores/io/ddrio/ddrio_out.rst b/docs/IPCores/io/ddrio/ddrio_Out.rst similarity index 80% rename from docs/IPCores/io/ddrio/ddrio_out.rst rename to docs/IPCores/io/ddrio/ddrio_Out.rst index f6e0b49e0..6c4779e8b 100644 --- a/docs/IPCores/io/ddrio/ddrio_out.rst +++ b/docs/IPCores/io/ddrio/ddrio_Out.rst @@ -1,23 +1,23 @@ -.. _IP/ddrio_out: +.. _IP/ddrio_Out: -PoC.io.ddrio.out +PoC.io.ddrio.Out ################ .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/ddrio/ddrio_out.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/ddrio/ddrio_Out.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/ddrio/ddrio_out_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/ddrio/ddrio_Out_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Instantiates chip-specific :abbr:`DDR (Double Data Rate)` output registers. @@ -62,7 +62,7 @@ IOBs. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/io/ddrio/ddrio_out.vhdl +.. literalinclude:: ../../../../src/io/ddrio/ddrio_Out.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -72,4 +72,4 @@ IOBs. .. only:: latex - Source file: :pocsrc:`io/ddrio/ddrio_out.vhdl ` + Source file: :pocsrc:`io/ddrio/ddrio_Out.vhdl ` diff --git a/docs/IPCores/io/ddrio/index.rst b/docs/IPCores/io/ddrio/index.rst index 79e1c84c7..d1ddd66e7 100644 --- a/docs/IPCores/io/ddrio/index.rst +++ b/docs/IPCores/io/ddrio/index.rst @@ -7,9 +7,9 @@ These are :abbr:`DDR-I/O (Double Data Rate - Input/Output)` entities.... **Entities** - * :ref:`IP/ddrio_in` - * :ref:`IP/ddrio_inout` - * :ref:`IP/ddrio_out` + * :ref:`IP/ddrio_In` + * :ref:`IP/ddrio_InOut` + * :ref:`IP/ddrio_Out` .. toctree:: @@ -20,6 +20,6 @@ These are :abbr:`DDR-I/O (Double Data Rate - Input/Output)` entities.... .. toctree:: :hidden: - ddrio_in - ddrio_inout - ddrio_out + ddrio_In + ddrio_InOut + ddrio_Out diff --git a/docs/IPCores/io/iic/iic.pkg.rst b/docs/IPCores/io/iic/iic.pkg.rst index 8bb9b6ecf..b37781a32 100644 --- a/docs/IPCores/io/iic/iic.pkg.rst +++ b/docs/IPCores/io/iic/iic.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/iic/iic.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/iic/iic.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/iic/iic_BusController.rst b/docs/IPCores/io/iic/iic_BusController.rst index f4bbf319c..6c7a3ddf2 100644 --- a/docs/IPCores/io/iic/iic_BusController.rst +++ b/docs/IPCores/io/iic/iic_BusController.rst @@ -7,11 +7,11 @@ PoC.io.iic.BusController .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/iic/iic_BusController.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/iic/iic_BusController.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/iic/iic_BusController_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/iic/iic_BusController_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/iic/iic_Controller.rst b/docs/IPCores/io/iic/iic_Controller.rst index 5a7b78cd4..29cd62dcc 100644 --- a/docs/IPCores/io/iic/iic_Controller.rst +++ b/docs/IPCores/io/iic/iic_Controller.rst @@ -7,11 +7,11 @@ PoC.io.iic.Controller .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/iic/iic_Controller.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/iic/iic_Controller.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/iic/iic_Controller_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/iic/iic_Controller_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/iic/iic_Controller_SFF8431.rst b/docs/IPCores/io/iic/iic_Controller_SFF8431.rst index ccff649ce..a901cff7b 100644 --- a/docs/IPCores/io/iic/iic_Controller_SFF8431.rst +++ b/docs/IPCores/io/iic/iic_Controller_SFF8431.rst @@ -7,11 +7,11 @@ PoC.io.iic.Controller_SFF8431 .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/iic/iic_Controller_SFF8431.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/iic/iic_Controller_SFF8431.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/iic/iic_Controller_SFF8431_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/iic/iic_Controller_SFF8431_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/iic/iic_Switch_PCA9548A.rst b/docs/IPCores/io/iic/iic_Switch_PCA9548A.rst index efb8ea654..21048259f 100644 --- a/docs/IPCores/io/iic/iic_Switch_PCA9548A.rst +++ b/docs/IPCores/io/iic/iic_Switch_PCA9548A.rst @@ -7,11 +7,11 @@ PoC.io.iic.Switch_PCA9548A .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/iic/iic_Switch_PCA9548A.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/iic/iic_Switch_PCA9548A.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/iic/iic_Switch_PCA9548A_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/iic/iic_Switch_PCA9548A_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/io.pkg.rst b/docs/IPCores/io/io.pkg.rst index a28733b7b..573fcdeac 100644 --- a/docs/IPCores/io/io.pkg.rst +++ b/docs/IPCores/io/io.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/io/io.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/io.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/io_7SegmentMux_BCD.rst b/docs/IPCores/io/io_7SegmentMux_BCD.rst index 8885df5a4..a8240cf4f 100644 --- a/docs/IPCores/io/io_7SegmentMux_BCD.rst +++ b/docs/IPCores/io/io_7SegmentMux_BCD.rst @@ -7,11 +7,11 @@ PoC.io.7SegmentMux_BCD .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/io/io_7SegmentMux_BCD.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/io_7SegmentMux_BCD.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/tb/io/io_7SegmentMux_BCD_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/io_7SegmentMux_BCD_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/io_7SegmentMux_HEX.rst b/docs/IPCores/io/io_7SegmentMux_HEX.rst index 14801d529..e22f0de23 100644 --- a/docs/IPCores/io/io_7SegmentMux_HEX.rst +++ b/docs/IPCores/io/io_7SegmentMux_HEX.rst @@ -7,11 +7,11 @@ PoC.io.7SegmentMux_HEX .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/io/io_7SegmentMux_HEX.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/io_7SegmentMux_HEX.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/tb/io/io_7SegmentMux_HEX_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/io_7SegmentMux_HEX_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/io_Debounce.rst b/docs/IPCores/io/io_Debounce.rst index a7c1d68f3..d254db8c8 100644 --- a/docs/IPCores/io/io_Debounce.rst +++ b/docs/IPCores/io/io_Debounce.rst @@ -7,11 +7,11 @@ PoC.io.Debounce .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/io/io_Debounce.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/io_Debounce.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/tb/io/io_Debounce_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/io_Debounce_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/io_FanControl.rst b/docs/IPCores/io/io_FanControl.rst index 459f57563..ecace5de8 100644 --- a/docs/IPCores/io/io_FanControl.rst +++ b/docs/IPCores/io/io_FanControl.rst @@ -7,11 +7,11 @@ PoC.io.FanControl .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/io/io_FanControl.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/io_FanControl.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/tb/io/io_FanControl_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/io_FanControl_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/io_FrequencyCounter.rst b/docs/IPCores/io/io_FrequencyCounter.rst index 68403b108..e258fe84f 100644 --- a/docs/IPCores/io/io_FrequencyCounter.rst +++ b/docs/IPCores/io/io_FrequencyCounter.rst @@ -7,11 +7,11 @@ PoC.io.FrequencyCounter .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/io/io_FrequencyCounter.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/io_FrequencyCounter.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/tb/io/io_FrequencyCounter_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/io_FrequencyCounter_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/io_GlitchFilter.rst b/docs/IPCores/io/io_GlitchFilter.rst index fb53a7f17..260a39a02 100644 --- a/docs/IPCores/io/io_GlitchFilter.rst +++ b/docs/IPCores/io/io_GlitchFilter.rst @@ -7,11 +7,11 @@ PoC.io.GlitchFilter .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/io/io_GlitchFilter.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/io_GlitchFilter.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/io_GlitchFilter_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/io_GlitchFilter_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/io_KeyPadScanner.rst b/docs/IPCores/io/io_KeyPadScanner.rst index e4287c011..c75a7b4c8 100644 --- a/docs/IPCores/io/io_KeyPadScanner.rst +++ b/docs/IPCores/io/io_KeyPadScanner.rst @@ -7,11 +7,11 @@ PoC.io.KeyPadScanner .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/io/io_KeyPadScanner.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/io_KeyPadScanner.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/tb/io/io_KeyPadScanner_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/io_KeyPadScanner_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/io_PulseWidthModulation.rst b/docs/IPCores/io/io_PulseWidthModulation.rst index 5aca56715..b9aad0f86 100644 --- a/docs/IPCores/io/io_PulseWidthModulation.rst +++ b/docs/IPCores/io/io_PulseWidthModulation.rst @@ -7,11 +7,11 @@ PoC.io.PulseWidthModulation .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/io/io_PulseWidthModulation.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/io_PulseWidthModulation.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/tb/io/io_PulseWidthModulation_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/io_PulseWidthModulation_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/io_TimingCounter.rst b/docs/IPCores/io/io_TimingCounter.rst index ff02013bf..b13ff4ac6 100644 --- a/docs/IPCores/io/io_TimingCounter.rst +++ b/docs/IPCores/io/io_TimingCounter.rst @@ -7,11 +7,11 @@ PoC.io.TimingCounter .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/io/io_TimingCounter.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/io_TimingCounter.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/tb/io/io_TimingCounter_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/io_TimingCounter_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/lcd/BCDDigit.rst b/docs/IPCores/io/lcd/BCDDigit.rst index ac5e9eea4..4c1a7213c 100644 --- a/docs/IPCores/io/lcd/BCDDigit.rst +++ b/docs/IPCores/io/lcd/BCDDigit.rst @@ -12,7 +12,7 @@ BCDDigit :linenos: :lines: 10-22 -Source file: `io/lcd/BCDDigit.vhdl `_ +Source file: `io/lcd/BCDDigit.vhdl `_ diff --git a/docs/IPCores/io/lcd/lcd.pkg.rst b/docs/IPCores/io/lcd/lcd.pkg.rst index b171e296f..0b188d0cf 100644 --- a/docs/IPCores/io/lcd/lcd.pkg.rst +++ b/docs/IPCores/io/lcd/lcd.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/lcd/lcd.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/lcd/lcd.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/lcd/lcd_LCDBuffer.rst b/docs/IPCores/io/lcd/lcd_LCDBuffer.rst index 9fefc5735..9cfbc32cb 100644 --- a/docs/IPCores/io/lcd/lcd_LCDBuffer.rst +++ b/docs/IPCores/io/lcd/lcd_LCDBuffer.rst @@ -7,11 +7,11 @@ PoC.io.lcd.LCDBuffer .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/lcd/lcd_LCDBuffer.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/lcd/lcd_LCDBuffer.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/lcd/lcd_LCDBuffer_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/lcd/lcd_LCDBuffer_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/lcd/lcd_LCDBusController.rst b/docs/IPCores/io/lcd/lcd_LCDBusController.rst index b97c804e1..fae0f6ef1 100644 --- a/docs/IPCores/io/lcd/lcd_LCDBusController.rst +++ b/docs/IPCores/io/lcd/lcd_LCDBusController.rst @@ -7,11 +7,11 @@ PoC.io.lcd.LCDBusController .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/lcd/lcd_LCDBusController.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/lcd/lcd_LCDBusController.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/lcd/lcd_LCDBusController_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/lcd/lcd_LCDBusController_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/lcd/lcd_LCDController_KS0066U.rst b/docs/IPCores/io/lcd/lcd_LCDController_KS0066U.rst index d0b941e02..5088d4424 100644 --- a/docs/IPCores/io/lcd/lcd_LCDController_KS0066U.rst +++ b/docs/IPCores/io/lcd/lcd_LCDController_KS0066U.rst @@ -7,11 +7,11 @@ PoC.io.lcd.LCDController_KS0066U .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/lcd/lcd_LCDController_KS0066U.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/lcd/lcd_LCDController_KS0066U.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/lcd/lcd_LCDController_KS0066U_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/lcd/lcd_LCDController_KS0066U_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/lcd/lcd_LCDSynchronizer.rst b/docs/IPCores/io/lcd/lcd_LCDSynchronizer.rst index c6c30ba83..26a8ad4de 100644 --- a/docs/IPCores/io/lcd/lcd_LCDSynchronizer.rst +++ b/docs/IPCores/io/lcd/lcd_LCDSynchronizer.rst @@ -7,11 +7,11 @@ PoC.io.lcd.LCDSynchronizer .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/lcd/lcd_LCDSynchronizer.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/lcd/lcd_LCDSynchronizer.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/lcd/lcd_LCDSynchronizer_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/lcd/lcd_LCDSynchronizer_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/lcd/lcd_dotmatrix.rst b/docs/IPCores/io/lcd/lcd_dotmatrix.rst index 0c830d2ef..9c21ef957 100644 --- a/docs/IPCores/io/lcd/lcd_dotmatrix.rst +++ b/docs/IPCores/io/lcd/lcd_dotmatrix.rst @@ -7,11 +7,11 @@ PoC.io.lcd.dotmatrix .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/lcd/lcd_dotmatrix.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/lcd/lcd_dotmatrix.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/lcd/lcd_dotmatrix_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/lcd/lcd_dotmatrix_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/mdio/mdio_Controller.rst b/docs/IPCores/io/mdio/mdio_Controller.rst index 1046036b1..ef04c4652 100644 --- a/docs/IPCores/io/mdio/mdio_Controller.rst +++ b/docs/IPCores/io/mdio/mdio_Controller.rst @@ -7,11 +7,11 @@ PoC.io.mdio.Controller .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/mdio/mdio_Controller.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/mdio/mdio_Controller.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/mdio/mdio_Controller_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/mdio/mdio_Controller_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/mdio/mdio_IIC_Adapter.rst b/docs/IPCores/io/mdio/mdio_IIC_Adapter.rst index d84bdc5d8..bb156bb9b 100644 --- a/docs/IPCores/io/mdio/mdio_IIC_Adapter.rst +++ b/docs/IPCores/io/mdio/mdio_IIC_Adapter.rst @@ -7,11 +7,11 @@ PoC.io.mdio.IIC_Adapter .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/mdio/mdio_IIC_Adapter.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/mdio/mdio_IIC_Adapter.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/mdio/mdio_IIC_Adapter_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/mdio/mdio_IIC_Adapter_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/pio/pio_fifo_in.rst b/docs/IPCores/io/pio/pio_fifo_in.rst index 32c77dd34..b60691cfc 100644 --- a/docs/IPCores/io/pio/pio_fifo_in.rst +++ b/docs/IPCores/io/pio/pio_fifo_in.rst @@ -7,11 +7,11 @@ PoC.io.pio.fifo_in .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/pio/pio_fifo_in.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/pio/pio_fifo_in.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/pio/pio_fifo_in_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/pio/pio_fifo_in_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/pio/pio_fifo_out.rst b/docs/IPCores/io/pio/pio_fifo_out.rst index e91c8a4e7..26108349e 100644 --- a/docs/IPCores/io/pio/pio_fifo_out.rst +++ b/docs/IPCores/io/pio/pio_fifo_out.rst @@ -7,11 +7,11 @@ PoC.io.pio.fifo_out .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/pio/pio_fifo_out.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/pio/pio_fifo_out.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/pio/pio_fifo_out_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/pio/pio_fifo_out_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/pio/pio_in.rst b/docs/IPCores/io/pio/pio_in.rst index 514ca3624..90f994071 100644 --- a/docs/IPCores/io/pio/pio_in.rst +++ b/docs/IPCores/io/pio/pio_in.rst @@ -7,11 +7,11 @@ PoC.io.pio.in .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/pio/pio_in.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/pio/pio_in.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/pio/pio_in_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/pio/pio_in_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/pio/pio_out.rst b/docs/IPCores/io/pio/pio_out.rst index 60e769d1b..6d69909b7 100644 --- a/docs/IPCores/io/pio/pio_out.rst +++ b/docs/IPCores/io/pio/pio_out.rst @@ -7,11 +7,11 @@ PoC.io.pio.out .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/pio/pio_out.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/pio/pio_out.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/pio/pio_out_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/pio/pio_out_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/pmod/pmod.pkg.rst b/docs/IPCores/io/pmod/pmod.pkg.rst index bc99e8503..858e46308 100644 --- a/docs/IPCores/io/pmod/pmod.pkg.rst +++ b/docs/IPCores/io/pmod/pmod.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/pmod/pmod.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/pmod/pmod.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/pmod/pmod_KYPD.rst b/docs/IPCores/io/pmod/pmod_KYPD.rst index b53ace4df..79b6a41c7 100644 --- a/docs/IPCores/io/pmod/pmod_KYPD.rst +++ b/docs/IPCores/io/pmod/pmod_KYPD.rst @@ -7,11 +7,11 @@ PoC.io.pmod.KYPD .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/pmod/pmod_KYPD.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/pmod/pmod_KYPD.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/pmod/pmod_KYPD_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/pmod/pmod_KYPD_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/pmod/pmod_SSD.rst b/docs/IPCores/io/pmod/pmod_SSD.rst index b3a5d211a..8cb14f218 100644 --- a/docs/IPCores/io/pmod/pmod_SSD.rst +++ b/docs/IPCores/io/pmod/pmod_SSD.rst @@ -7,11 +7,11 @@ PoC.io.pmod.SSD .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/pmod/pmod_SSD.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/pmod/pmod_SSD.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/pmod/pmod_SSD_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/pmod/pmod_SSD_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links @@ -19,7 +19,7 @@ PoC.io.pmod.SSD * |gh-src| :pocsrc:`Sourcecode ` * |gh-tb| :poctb:`Testbench ` -This module drives a dual-digit 7-segment display (Pmod_SSD). The module +This module drives a dual-digit 7-segment display (pmod_SSD). The module expects two binary encoded 4-bit ``Digit`` signals and drives a 2x6 bit Pmod connector (7 anode bits, 1 cathode bit). diff --git a/docs/IPCores/io/pmod/pmod_USBUART.rst b/docs/IPCores/io/pmod/pmod_USBUART.rst index 0f329ab24..8f107576f 100644 --- a/docs/IPCores/io/pmod/pmod_USBUART.rst +++ b/docs/IPCores/io/pmod/pmod_USBUART.rst @@ -7,11 +7,11 @@ PoC.io.pmod.USBUART .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/pmod/pmod_USBUART.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/pmod/pmod_USBUART.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/pmod/pmod_USBUART_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/pmod/pmod_USBUART_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links @@ -20,7 +20,7 @@ PoC.io.pmod.USBUART * |gh-tb| :poctb:`Testbench ` This module abstracts a FTDI FT232R USB-UART bridge by instantiating a -:doc:`PoC.io.uart.fifo <../uart/uart_fifo>`. The FT232R supports up to +:doc:`PoC.io.uart.fifo <../uart/uart_FIFO>`. The FT232R supports up to 3 MBaud. A synchronous FIFO interface with a 32 words buffer is provided. Hardware flow control (RTS_CTS) is enabled. diff --git a/docs/IPCores/io/uart/index.rst b/docs/IPCores/io/uart/index.rst index f60888c91..b987e2c09 100644 --- a/docs/IPCores/io/uart/index.rst +++ b/docs/IPCores/io/uart/index.rst @@ -7,10 +7,10 @@ These are :abbr:`UART (Universal Asynchronous Receiver Transmitter)` entities... **Entities** - * :ref:`IP/uart_bclk` - * :ref:`IP/uart_rx` - * :ref:`IP/uart_tx` - * :ref:`IP/uart_fifo` + * :ref:`IP/uart_BitClock` + * :ref:`IP/uart_RX` + * :ref:`IP/uart_TX` + * :ref:`IP/uart_FIFO` .. toctree:: @@ -21,7 +21,7 @@ These are :abbr:`UART (Universal Asynchronous Receiver Transmitter)` entities... .. toctree:: :hidden: - uart_bclk - uart_rx - uart_tx - uart_fifo + uart_BitClock + uart_RX + uart_TX + uart_FIFO diff --git a/docs/IPCores/io/uart/uart.pkg.rst b/docs/IPCores/io/uart/uart.pkg.rst index bc0e71e80..89302e643 100644 --- a/docs/IPCores/io/uart/uart.pkg.rst +++ b/docs/IPCores/io/uart/uart.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/uart/uart.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/uart/uart.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/uart/uart_bclk.rst b/docs/IPCores/io/uart/uart_BitClock.rst similarity index 54% rename from docs/IPCores/io/uart/uart_bclk.rst rename to docs/IPCores/io/uart/uart_BitClock.rst index 404f1ef0f..41de4d870 100644 --- a/docs/IPCores/io/uart/uart_bclk.rst +++ b/docs/IPCores/io/uart/uart_BitClock.rst @@ -1,23 +1,23 @@ -.. _IP/uart_bclk: +.. _IP/uart_BitClock: -PoC.io.uart.bclk -################ +PoC.io.uart.BitClock +#################### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/uart/uart_bclk.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/uart/uart_BitClock.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/uart/uart_bclk_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/uart/uart_BitClock_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` .. TODO:: No documentation available. @@ -31,7 +31,7 @@ old comments: .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/io/uart/uart_bclk.vhdl +.. literalinclude:: ../../../../src/io/uart/uart_BitClock.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -41,4 +41,4 @@ old comments: .. only:: latex - Source file: :pocsrc:`io/uart/uart_bclk.vhdl ` + Source file: :pocsrc:`io/uart/uart_BitClock.vhdl ` diff --git a/docs/IPCores/io/uart/uart_FT245.rst b/docs/IPCores/io/uart/uart_FT245.rst new file mode 100644 index 000000000..4bd5ac978 --- /dev/null +++ b/docs/IPCores/io/uart/uart_FT245.rst @@ -0,0 +1,38 @@ +.. _IP/uart_FT245: + +PoC.io.uart.FT245 +################# + +.. only:: html + + .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/src/io/uart/uart_FT245.vhdl + :alt: Source Code on GitHub + .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/tb/io/uart/uart_FT245_tb.vhdl + :alt: Source Code on GitHub + + .. sidebar:: GitHub Links + + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` + +.. TODO:: No documentation available. + + + +.. rubric:: Entity Declaration: + +.. literalinclude:: ../../../../src/io/uart/uart_FT245.vhdl + :language: vhdl + :tab-width: 2 + :linenos: + :lines: 37-63 + + + +.. only:: latex + + Source file: :pocsrc:`io/uart/uart_FT245.vhdl ` diff --git a/docs/IPCores/io/uart/uart_rx.rst b/docs/IPCores/io/uart/uart_RX.rst similarity index 55% rename from docs/IPCores/io/uart/uart_rx.rst rename to docs/IPCores/io/uart/uart_RX.rst index aef156fce..32e5c07f6 100644 --- a/docs/IPCores/io/uart/uart_rx.rst +++ b/docs/IPCores/io/uart/uart_RX.rst @@ -1,4 +1,4 @@ -.. _IP/uart_rx: +.. _IP/uart_RX: PoC.io.uart.rx ############## @@ -7,17 +7,17 @@ PoC.io.uart.rx .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/uart/uart_rx.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/uart/uart_RX.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/uart/uart_rx_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/uart/uart_RX_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` :abbr:`UART (Universal Asynchronous Receiver Transmitter)` Receiver: 1 Start + 8 Data + 1 Stop @@ -26,7 +26,7 @@ PoC.io.uart.rx .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/io/uart/uart_rx.vhdl +.. literalinclude:: ../../../../src/io/uart/uart_RX.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -36,4 +36,4 @@ PoC.io.uart.rx .. only:: latex - Source file: :pocsrc:`io/uart/uart_rx.vhdl ` + Source file: :pocsrc:`io/uart/uart_RX.vhdl ` diff --git a/docs/IPCores/io/uart/uart_tx.rst b/docs/IPCores/io/uart/uart_TX.rst similarity index 55% rename from docs/IPCores/io/uart/uart_tx.rst rename to docs/IPCores/io/uart/uart_TX.rst index 84795387f..f6d5829ff 100644 --- a/docs/IPCores/io/uart/uart_tx.rst +++ b/docs/IPCores/io/uart/uart_TX.rst @@ -1,4 +1,4 @@ -.. _IP/uart_tx: +.. _IP/uart_TX: PoC.io.uart.tx ############## @@ -7,17 +7,17 @@ PoC.io.uart.tx .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/uart/uart_tx.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/uart/uart_TX.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/uart/uart_tx_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/uart/uart_TX_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` :abbr:`UART (Universal Asynchronous Receiver Transmitter)` Transmitter: 1 Start + 8 Data + 1 Stop @@ -26,7 +26,7 @@ PoC.io.uart.tx .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/io/uart/uart_tx.vhdl +.. literalinclude:: ../../../../src/io/uart/uart_TX.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -36,4 +36,4 @@ PoC.io.uart.tx .. only:: latex - Source file: :pocsrc:`io/uart/uart_tx.vhdl ` + Source file: :pocsrc:`io/uart/uart_TX.vhdl ` diff --git a/docs/IPCores/io/uart/uart_fifo.rst b/docs/IPCores/io/uart/uart_fifo.rst index 0532934c8..83afd7c09 100644 --- a/docs/IPCores/io/uart/uart_fifo.rst +++ b/docs/IPCores/io/uart/uart_fifo.rst @@ -1,22 +1,22 @@ -.. _IP/uart_fifo: +.. _IP/uart_FIFO: -PoC.io.uart.fifo +PoC.io.uart.FIFO ################ .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/uart/uart_fifo.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/uart/uart_FIFO.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/uart/uart_fifo_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/uart/uart_fifo_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` + * |gh-src| :pocsrc:`Sourcecode ` * |gh-tb| :poctb:`Testbench ` Small :abbr:`FIFO (first-in, first-out)` s are included in this module, if @@ -33,7 +33,7 @@ old comments: .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/io/uart/uart_fifo.vhdl +.. literalinclude:: ../../../../src/io/uart/uart_FIFO.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -43,4 +43,4 @@ old comments: .. only:: latex - Source file: :pocsrc:`io/uart/uart_fifo.vhdl ` + Source file: :pocsrc:`io/uart/uart_FIFO.vhdl ` diff --git a/docs/IPCores/io/uart/uart_ft245.rst b/docs/IPCores/io/uart/uart_ft245.rst deleted file mode 100644 index f61e3f853..000000000 --- a/docs/IPCores/io/uart/uart_ft245.rst +++ /dev/null @@ -1,38 +0,0 @@ -.. _IP/uart_ft245: - -PoC.io.uart.ft245 -################# - -.. only:: html - - .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/uart/uart_ft245.vhdl - :alt: Source Code on GitHub - .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/uart/uart_ft245_tb.vhdl - :alt: Source Code on GitHub - - .. sidebar:: GitHub Links - - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` - -.. TODO:: No documentation available. - - - -.. rubric:: Entity Declaration: - -.. literalinclude:: ../../../../src/io/uart/uart_ft245.vhdl - :language: vhdl - :tab-width: 2 - :linenos: - :lines: 37-63 - - - -.. only:: latex - - Source file: :pocsrc:`io/uart/uart_ft245.vhdl ` diff --git a/docs/IPCores/io/vga/vga.pkg.rst b/docs/IPCores/io/vga/vga.pkg.rst index ff3ff7e00..405e7545c 100644 --- a/docs/IPCores/io/vga/vga.pkg.rst +++ b/docs/IPCores/io/vga/vga.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/vga/vga.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/vga/vga.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/vga/vga_phy.rst b/docs/IPCores/io/vga/vga_phy.rst index 3aa8ef36b..fb6766aa0 100644 --- a/docs/IPCores/io/vga/vga_phy.rst +++ b/docs/IPCores/io/vga/vga_phy.rst @@ -7,11 +7,11 @@ PoC.io.vga.phy .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/vga/vga_phy.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/vga/vga_phy.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/vga/vga_phy_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/vga/vga_phy_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/vga/vga_phy_ch7301c.rst b/docs/IPCores/io/vga/vga_phy_ch7301c.rst index f585cd474..10fc90cf3 100644 --- a/docs/IPCores/io/vga/vga_phy_ch7301c.rst +++ b/docs/IPCores/io/vga/vga_phy_ch7301c.rst @@ -7,11 +7,11 @@ PoC.io.vga.phy_ch7301c .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/vga/vga_phy_ch7301c.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/vga/vga_phy_ch7301c.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/vga/vga_phy_ch7301c_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/vga/vga_phy_ch7301c_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/io/vga/vga_timing.rst b/docs/IPCores/io/vga/vga_timing.rst index 5694a0a52..d2f0fbdae 100644 --- a/docs/IPCores/io/vga/vga_timing.rst +++ b/docs/IPCores/io/vga/vga_timing.rst @@ -7,11 +7,11 @@ PoC.io.vga.timing .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/io/vga/vga_timing.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/io/vga/vga_timing.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/io/vga/vga_timing_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/io/vga/vga_timing_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/mem/lut/lut_Sine.rst b/docs/IPCores/mem/lut/lut_Sine.rst index 7b33bd0e1..03fffca58 100644 --- a/docs/IPCores/mem/lut/lut_Sine.rst +++ b/docs/IPCores/mem/lut/lut_Sine.rst @@ -7,11 +7,11 @@ PoC.mem.lut.Sine .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/lut/lut_Sine.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/lut/lut_Sine.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/mem/lut/lut_Sine_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/mem/lut/lut_Sine_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/mem/mem.pkg.rst b/docs/IPCores/mem/mem.pkg.rst index 8abcee2b0..70905f0a2 100644 --- a/docs/IPCores/mem/mem.pkg.rst +++ b/docs/IPCores/mem/mem.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/mem/mem.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/mem.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/mem/ocram/index.rst b/docs/IPCores/mem/ocram/index.rst index 36cce0e6c..92f3a5261 100644 --- a/docs/IPCores/mem/ocram/index.rst +++ b/docs/IPCores/mem/ocram/index.rst @@ -17,21 +17,21 @@ The package PoC.mem.ocram holds all component declarations for this namespace. **Entities** - * :ref:`IP/ocram_sp` - An on-chip RAM with a single port interface. - * :ref:`IP/ocram_sdp` - An on-chip RAM with a simple dual-port interface. - * :ref:`IP/ocram_sdp_wf` - An on-chip RAM with a simple dual-port + * :ref:`IP/ocram_SinglePort` - An on-chip RAM with a single port interface. + * :ref:`IP/ocram_SimpleDualPort` - An on-chip RAM with a simple dual-port interface. + * :ref:`IP/ocram_SimpleDualPort_WriteFirst` - An on-chip RAM with a simple dual-port interface and write-first behavior. - * :ref:`IP/ocram_tdp` - An on-chip RAM with a true dual-port interface. - * :ref:`IP/ocram_tdp_wf` - An on-chip RAM with a true dual-port + * :ref:`IP/ocram_TrueDualPort` - An on-chip RAM with a true dual-port interface. + * :ref:`IP/ocram_TrueDualPort_WriteFirst` - An on-chip RAM with a true dual-port interface and write-first behavior. **Simulation Helper** - * :ref:`IP/ocram_tdp_sim` - Simulation model of on-chip RAM with a true dual port interface. + * :ref:`IP/ocram_TrueDualPort_Simulation` - Simulation model of on-chip RAM with a true dual port interface. **Deprecated Entities** - * :ref:`IP/ocram_esdp` - An on-chip RAM with an extended simple dual port interface. + * :ref:`IP/ocram_EnhancedSimpleDualPort` - An on-chip RAM with an extended simple dual port interface. .. toctree:: @@ -42,18 +42,18 @@ The package PoC.mem.ocram holds all component declarations for this namespace. .. toctree:: :hidden: - ocram_sp - ocram_sdp - ocram_sdp_wf - ocram_tdp - ocram_tdp_wf + ocram_SinglePort + ocram_SimpleDualPort + ocram_SimpleDualPort_WriteFirst + ocram_TrueDualPort + ocram_TrueDualPort_WriteFirst .. toctree:: :hidden: - ocram_tdp_sim + ocram_TrueDualPort_Simulation .. toctree:: :hidden: - ocram_esdp + ocram_EnhancedSimpleDualPort diff --git a/docs/IPCores/mem/ocram/ocram.pkg.rst b/docs/IPCores/mem/ocram/ocram.pkg.rst index c919a5ea1..7b9d1b508 100644 --- a/docs/IPCores/mem/ocram/ocram.pkg.rst +++ b/docs/IPCores/mem/ocram/ocram.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/ocram/ocram.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/ocram/ocram.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/mem/ocram/ocram_esdp.rst b/docs/IPCores/mem/ocram/ocram_EnhancedSimpleDualPort.rst similarity index 71% rename from docs/IPCores/mem/ocram/ocram_esdp.rst rename to docs/IPCores/mem/ocram/ocram_EnhancedSimpleDualPort.rst index 1105fecef..8c3b21c8e 100644 --- a/docs/IPCores/mem/ocram/ocram_esdp.rst +++ b/docs/IPCores/mem/ocram/ocram_EnhancedSimpleDualPort.rst @@ -1,23 +1,26 @@ -.. _IP/ocram_esdp: +.. _IP/ocram_EnhancedSimpleDualPort: PoC.mem.ocram.esdp -################## +.. _IP/ocram_EnhancedSimpleDualPort: + +PoC.mem.ocram.EnhancedSimpleDualPort +#################################### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/ocram/ocram_esdp.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/ocram/ocram_EnhancedSimpleDualPort.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/mem/ocram/ocram_esdp_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/mem/ocram/ocram_EnhancedSimpleDualPort_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Inferring / instantiating enhanced simple dual-port memory, with: @@ -26,7 +29,7 @@ Inferring / instantiating enhanced simple dual-port memory, with: .. deprecated:: 1.1 - **Please use** :ref:`IP/ocram_tdp` **for new designs. + **Please use** :ref:`IP/ocram_TrueDualPort` **for new designs. This component has been provided because older FPGA compilers where not able to infer true dual-port memory from an RTL description.** @@ -68,14 +71,14 @@ Mixed-Port Read-During-Write rising-edge of the write clock (``clk1``) and (in the worst case) extends until the next rising-edge of the write clock. -For simulation, always our dedicated simulation model :ref:`IP/ocram_tdp_sim` +For simulation, always our dedicated simulation model :ref:`IP/ocram_TrueDualPort_Simulation` is used. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/mem/ocram/ocram_esdp.vhdl +.. literalinclude:: ../../../../src/mem/ocram/ocram_EnhancedSimpleDualPort.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -85,4 +88,4 @@ is used. .. only:: latex - Source file: :pocsrc:`mem/ocram/ocram_esdp.vhdl ` + Source file: :pocsrc:`mem/ocram/ocram_EnhancedSimpleDualPort.vhdl ` diff --git a/docs/IPCores/mem/ocram/ocram_sdp.rst b/docs/IPCores/mem/ocram/ocram_SimpleDualPort.rst similarity index 66% rename from docs/IPCores/mem/ocram/ocram_sdp.rst rename to docs/IPCores/mem/ocram/ocram_SimpleDualPort.rst index 7c029c6f7..1c55fa601 100644 --- a/docs/IPCores/mem/ocram/ocram_sdp.rst +++ b/docs/IPCores/mem/ocram/ocram_SimpleDualPort.rst @@ -1,23 +1,23 @@ -.. _IP/ocram_sdp: +.. _IP/ocram_SimpleDualPort: -PoC.mem.ocram.sdp -################# +PoC.mem.ocram.SimpleDualPort +############################ .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/ocram/ocram_sdp.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/ocram/ocram_SimpleDualPort.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/mem/ocram/ocram_sdp_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/mem/ocram/ocram_SimpleDualPort_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Inferring / instantiating simple dual-port memory, with: @@ -38,14 +38,14 @@ Mixed-Port Read-During-Write rising-edge of the write clock and (in the worst case) extends until the next rising-edge of the write clock. -For simulation, always our dedicated simulation model :ref:`IP/ocram_tdp_sim` +For simulation, always our dedicated simulation model :ref:`IP/ocram_TrueDualPort_Simulation` is used. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/mem/ocram/ocram_sdp.vhdl +.. literalinclude:: ../../../../src/mem/ocram/ocram_SimpleDualPort.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -55,4 +55,4 @@ is used. .. only:: latex - Source file: :pocsrc:`mem/ocram/ocram_sdp.vhdl ` + Source file: :pocsrc:`mem/ocram/ocram_SimpleDualPort.vhdl ` diff --git a/docs/IPCores/mem/ocram/ocram_sdp_wf.rst b/docs/IPCores/mem/ocram/ocram_SimpleDualPort_wf.rst similarity index 62% rename from docs/IPCores/mem/ocram/ocram_sdp_wf.rst rename to docs/IPCores/mem/ocram/ocram_SimpleDualPort_wf.rst index 3dd2a098a..2cf073f73 100644 --- a/docs/IPCores/mem/ocram/ocram_sdp_wf.rst +++ b/docs/IPCores/mem/ocram/ocram_SimpleDualPort_wf.rst @@ -1,23 +1,23 @@ -.. _IP/ocram_sdp_wf: +.. _IP/ocram_SimpleDualPort_WriteFirst: -PoC.mem.ocram.sdp_wf -#################### +PoC.mem.ocram.SimpleDualPort_WriteFirst +####################################### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/ocram/ocram_sdp_wf.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/ocram/ocram_SimpleDualPort_WriteFirst.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/mem/ocram/ocram_sdp_wf_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/mem/ocram/ocram_SimpleDualPort_WriteFirst_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Inferring / instantiating simple dual-port memory, with: @@ -47,7 +47,7 @@ Mixed-Port Read-During-Write .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/mem/ocram/ocram_sdp_wf.vhdl +.. literalinclude:: ../../../../src/mem/ocram/ocram_SimpleDualPort_WriteFirst.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -57,4 +57,4 @@ Mixed-Port Read-During-Write .. only:: latex - Source file: :pocsrc:`mem/ocram/ocram_sdp_wf.vhdl ` + Source file: :pocsrc:`mem/ocram/ocram_SimpleDualPort_WriteFirst.vhdl ` diff --git a/docs/IPCores/mem/ocram/ocram_sp.rst b/docs/IPCores/mem/ocram/ocram_SinglePort.rst similarity index 67% rename from docs/IPCores/mem/ocram/ocram_sp.rst rename to docs/IPCores/mem/ocram/ocram_SinglePort.rst index 07aa9bf3c..7ce9714c6 100644 --- a/docs/IPCores/mem/ocram/ocram_sp.rst +++ b/docs/IPCores/mem/ocram/ocram_SinglePort.rst @@ -1,23 +1,23 @@ -.. _IP/ocram_sp: +.. _IP/ocram_SinglePort: -PoC.mem.ocram.sp -################ +PoC.mem.ocram.SinglePort +######################## .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/ocram/ocram_sp.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/ocram/ocram_SinglePort.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/mem/ocram/ocram_sp_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/mem/ocram/ocram_SinglePort_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Inferring / instantiating single port memory, with: @@ -48,7 +48,7 @@ also applies to Altera M20K memory blocks as described in the Altera: .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/mem/ocram/ocram_sp.vhdl +.. literalinclude:: ../../../../src/mem/ocram/ocram_SinglePort.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -58,4 +58,4 @@ also applies to Altera M20K memory blocks as described in the Altera: .. only:: latex - Source file: :pocsrc:`mem/ocram/ocram_sp.vhdl ` + Source file: :pocsrc:`mem/ocram/ocram_SinglePort.vhdl ` diff --git a/docs/IPCores/mem/ocram/ocram_tdp.rst b/docs/IPCores/mem/ocram/ocram_TrueDualPort.rst similarity index 73% rename from docs/IPCores/mem/ocram/ocram_tdp.rst rename to docs/IPCores/mem/ocram/ocram_TrueDualPort.rst index 6764b0b52..a66b4aa5e 100644 --- a/docs/IPCores/mem/ocram/ocram_tdp.rst +++ b/docs/IPCores/mem/ocram/ocram_TrueDualPort.rst @@ -1,23 +1,23 @@ -.. _IP/ocram_tdp: +.. _IP/ocram_TrueDualPort: -PoC.mem.ocram.tdp -################# +PoC.mem.ocram.TrueDualPort +########################## .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/ocram/ocram_tdp.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/ocram/ocram_TrueDualPort.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/mem/ocram/ocram_tdp_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/mem/ocram/ocram_TrueDualPort_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Inferring / instantiating true dual-port memory, with: @@ -55,14 +55,14 @@ Mixed-Port Read-During-Write rising-edge of the write clock and (in the worst case) extends until the next rising-edge of that write clock. -For simulation, always our dedicated simulation model :ref:`IP/ocram_tdp_sim` +For simulation, always our dedicated simulation model :ref:`IP/ocram_TrueDualPort_sim` is used. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/mem/ocram/ocram_tdp.vhdl +.. literalinclude:: ../../../../src/mem/ocram/ocram_TrueDualPort.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -72,4 +72,4 @@ is used. .. only:: latex - Source file: :pocsrc:`mem/ocram/ocram_tdp.vhdl ` + Source file: :pocsrc:`mem/ocram/ocram_TrueDualPort.vhdl ` diff --git a/docs/IPCores/mem/ocram/ocram_tdp_sim.rst b/docs/IPCores/mem/ocram/ocram_TrueDualPort_sim.rst similarity index 53% rename from docs/IPCores/mem/ocram/ocram_tdp_sim.rst rename to docs/IPCores/mem/ocram/ocram_TrueDualPort_sim.rst index 388e7d4eb..64a77d0d4 100644 --- a/docs/IPCores/mem/ocram/ocram_tdp_sim.rst +++ b/docs/IPCores/mem/ocram/ocram_TrueDualPort_sim.rst @@ -1,23 +1,23 @@ -.. _IP/ocram_tdp_sim: +.. _IP/ocram_TrueDualPort_Simulation: -PoC.mem.ocram.tdp_sim -##################### +PoC.mem.ocram.TrueDualPort_Simulation +##################################### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/ocram/ocram_tdp_sim.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/ocram/ocram_TrueDualPort_Simulation.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/mem/ocram/ocram_tdp_sim_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/mem/ocram/ocram_TrueDualPort_Simulation_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Simulation model for true dual-port memory, with: @@ -33,7 +33,7 @@ correct Mixed-Port Read-During-Write Behavior and handles X propagation. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/mem/ocram/ocram_tdp_sim.vhdl +.. literalinclude:: ../../../../src/mem/ocram/ocram_TrueDualPort_Simulation.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -43,4 +43,4 @@ correct Mixed-Port Read-During-Write Behavior and handles X propagation. .. only:: latex - Source file: :pocsrc:`mem/ocram/ocram_tdp_sim.vhdl ` + Source file: :pocsrc:`mem/ocram/ocram_TrueDualPort_simSimulation.vhdl ` diff --git a/docs/IPCores/mem/ocram/ocram_tdp_wf.rst b/docs/IPCores/mem/ocram/ocram_TrueDualPort_wf.rst similarity index 72% rename from docs/IPCores/mem/ocram/ocram_tdp_wf.rst rename to docs/IPCores/mem/ocram/ocram_TrueDualPort_wf.rst index a7e1c1605..80bebca59 100644 --- a/docs/IPCores/mem/ocram/ocram_tdp_wf.rst +++ b/docs/IPCores/mem/ocram/ocram_TrueDualPort_wf.rst @@ -1,23 +1,23 @@ -.. _IP/ocram_tdp_wf: +.. _IP/ocram_TrueDualPort_WriteFirst: -PoC.mem.ocram.tdp_wf -#################### +PoC.mem.ocram.TrueDualPort_WriteFirst +##################################### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/ocram/ocram_tdp_wf.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/ocram/ocram_TrueDualPort_wf.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/mem/ocram/ocram_tdp_wf_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/mem/ocram/ocram_TrueDualPort_wf_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Inferring / instantiating true dual-port memory, with: @@ -56,14 +56,14 @@ Mixed-Port Read-During-Write If a write is issued on both ports to the same address, then the output of this unit and the content of the addressed memory cell are undefined. -For simulation, always our dedicated simulation model :ref:`IP/ocram_tdp_sim` +For simulation, always our dedicated simulation model :ref:`IP/ocram_TrueDualPort_Simulation` is used. .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/mem/ocram/ocram_tdp_wf.vhdl +.. literalinclude:: ../../../../src/mem/ocram/ocram_TrueDualPort_WriteFirst.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -73,4 +73,4 @@ is used. .. only:: latex - Source file: :pocsrc:`mem/ocram/ocram_tdp_wf.vhdl ` + Source file: :pocsrc:`mem/ocram/ocram_TrueDualPort_WriteFirst.vhdl ` diff --git a/docs/IPCores/mem/ocrom/index.rst b/docs/IPCores/mem/ocrom/index.rst index a34083624..08678f733 100644 --- a/docs/IPCores/mem/ocrom/index.rst +++ b/docs/IPCores/mem/ocrom/index.rst @@ -17,8 +17,8 @@ The package PoC.mem.ocrom holds all component declarations for this namespace. **Entities** - - :ref:`ocrom_sp ` is a on-chip RAM with a single port interface. - - :ref:`ocrom_dp ` is a on-chip RAM with a dual port interface. + - :ref:`ocrom_SinglePort ` is a on-chip RAM with a single port interface. + - :ref:`ocrom_DualPort ` is a on-chip RAM with a dual port interface. .. toctree:: @@ -29,5 +29,5 @@ The package PoC.mem.ocrom holds all component declarations for this namespace. .. toctree:: :hidden: - ocrom_sp - ocrom_dp + ocrom_SinglePort + ocrom_DualPort diff --git a/docs/IPCores/mem/ocrom/ocrom.pkg.rst b/docs/IPCores/mem/ocrom/ocrom.pkg.rst index 374c95b65..0923111d6 100644 --- a/docs/IPCores/mem/ocrom/ocrom.pkg.rst +++ b/docs/IPCores/mem/ocrom/ocrom.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/ocrom/ocrom.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/ocrom/ocrom.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/mem/ocrom/ocrom_dp.rst b/docs/IPCores/mem/ocrom/ocrom_DualPort.rst similarity index 59% rename from docs/IPCores/mem/ocrom/ocrom_dp.rst rename to docs/IPCores/mem/ocrom/ocrom_DualPort.rst index 1d0c98b8d..41b0fec5b 100644 --- a/docs/IPCores/mem/ocrom/ocrom_dp.rst +++ b/docs/IPCores/mem/ocrom/ocrom_DualPort.rst @@ -1,23 +1,23 @@ -.. _IP/ocrom_dp: +.. _IP/ocrom_DualPort: -PoC.mem.ocrom.dp -################ +PoC.mem.ocrom.DualPort +###################### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/ocrom/ocrom_dp.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/ocrom/ocrom_DualPort.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/mem/ocrom/ocrom_dp_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/mem/ocrom/ocrom_DualPort_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` Inferring / instantiating dual-port read-only memory, with: @@ -36,7 +36,7 @@ TODO: implement correct behavior for RT-level simulation .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/mem/ocrom/ocrom_dp.vhdl +.. literalinclude:: ../../../../src/mem/ocrom/ocrom_DualPort.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -46,4 +46,4 @@ TODO: implement correct behavior for RT-level simulation .. only:: latex - Source file: :pocsrc:`mem/ocrom/ocrom_dp.vhdl ` + Source file: :pocsrc:`mem/ocrom/ocrom_DualPort.vhdl ` diff --git a/docs/IPCores/mem/ocrom/ocrom_SinglePort.rst b/docs/IPCores/mem/ocrom/ocrom_SinglePort.rst new file mode 100644 index 000000000..1e186a688 --- /dev/null +++ b/docs/IPCores/mem/ocrom/ocrom_SinglePort.rst @@ -0,0 +1,42 @@ +.. _IP/ocrom_SinglePort: + +PoC.mem.ocrom.SinglePort +######################## + +.. only:: html + + .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/src/mem/ocrom/ocrom_SinglePort.vhdl + :alt: Source Code on GitHub + .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/tb/mem/ocrom/ocrom_SinglePort_tb.vhdl + :alt: Source Code on GitHub + + .. sidebar:: GitHub Links + + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` + +Inferring / instantiating single-port read-only memory + +- single clock, clock enable +- 1 read port + + + + +.. rubric:: Entity Declaration: + +.. literalinclude:: ../../../../src/mem/ocrom/ocrom_SinglePort.vhdl + :language: vhdl + :tab-width: 2 + :linenos: + :lines: 53-65 + + + +.. only:: latex + + Source file: :pocsrc:`mem/ocrom/ocrom_SinglePort.vhdl ` diff --git a/docs/IPCores/mem/ocrom/ocrom_sp.rst b/docs/IPCores/mem/ocrom/ocrom_sp.rst deleted file mode 100644 index 528bd18e6..000000000 --- a/docs/IPCores/mem/ocrom/ocrom_sp.rst +++ /dev/null @@ -1,42 +0,0 @@ -.. _IP/ocrom_sp: - -PoC.mem.ocrom.sp -################ - -.. only:: html - - .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/ocrom/ocrom_sp.vhdl - :alt: Source Code on GitHub - .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/mem/ocrom/ocrom_sp_tb.vhdl - :alt: Source Code on GitHub - - .. sidebar:: GitHub Links - - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` - -Inferring / instantiating single-port read-only memory - -- single clock, clock enable -- 1 read port - - - - -.. rubric:: Entity Declaration: - -.. literalinclude:: ../../../../src/mem/ocrom/ocrom_sp.vhdl - :language: vhdl - :tab-width: 2 - :linenos: - :lines: 53-65 - - - -.. only:: latex - - Source file: :pocsrc:`mem/ocrom/ocrom_sp.vhdl ` diff --git a/docs/IPCores/mem/sdram/index.rst b/docs/IPCores/mem/sdram/index.rst index f59a9321f..4488c9c8f 100644 --- a/docs/IPCores/mem/sdram/index.rst +++ b/docs/IPCores/mem/sdram/index.rst @@ -32,7 +32,7 @@ example is given in PoC-Examples_. -.. _PoC-Examples: https://github.com/VLSI-EDA/PoC-Examples +.. _PoC-Examples: https://github.com/VHDL/PoC-Examples .. toctree:: :hidden: diff --git a/docs/IPCores/mem/sdram/sdram_ctrl_de0.rst b/docs/IPCores/mem/sdram/sdram_ctrl_de0.rst index cde6c9ead..029ee4c79 100644 --- a/docs/IPCores/mem/sdram/sdram_ctrl_de0.rst +++ b/docs/IPCores/mem/sdram/sdram_ctrl_de0.rst @@ -7,11 +7,11 @@ PoC.mem.sdram.ctrl_de0 .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/sdram/sdram_ctrl_de0.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/sdram/sdram_ctrl_de0.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/mem/sdram/sdram_ctrl_de0_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/mem/sdram/sdram_ctrl_de0_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/mem/sdram/sdram_ctrl_fsm.rst b/docs/IPCores/mem/sdram/sdram_ctrl_fsm.rst index 10049a6ae..c5c2244f6 100644 --- a/docs/IPCores/mem/sdram/sdram_ctrl_fsm.rst +++ b/docs/IPCores/mem/sdram/sdram_ctrl_fsm.rst @@ -7,11 +7,11 @@ PoC.mem.sdram.ctrl_fsm .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/sdram/sdram_ctrl_fsm.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/sdram/sdram_ctrl_fsm.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/mem/sdram/sdram_ctrl_fsm_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/mem/sdram/sdram_ctrl_fsm_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/mem/sdram/sdram_ctrl_phy_de0.rst b/docs/IPCores/mem/sdram/sdram_ctrl_phy_de0.rst index a3acdab8b..a134678f0 100644 --- a/docs/IPCores/mem/sdram/sdram_ctrl_phy_de0.rst +++ b/docs/IPCores/mem/sdram/sdram_ctrl_phy_de0.rst @@ -7,11 +7,11 @@ PoC.mem.sdram.ctrl_phy_de0 .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/sdram/sdram_ctrl_phy_de0.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/sdram/sdram_ctrl_phy_de0.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/mem/sdram/sdram_ctrl_phy_de0_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/mem/sdram/sdram_ctrl_phy_de0_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/mem/sdram/sdram_ctrl_phy_s3esk.rst b/docs/IPCores/mem/sdram/sdram_ctrl_phy_s3esk.rst index aa28e6a82..afd29d9f4 100644 --- a/docs/IPCores/mem/sdram/sdram_ctrl_phy_s3esk.rst +++ b/docs/IPCores/mem/sdram/sdram_ctrl_phy_s3esk.rst @@ -7,11 +7,11 @@ PoC.mem.sdram.ctrl_phy_s3esk .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/sdram/sdram_ctrl_phy_s3esk.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/sdram/sdram_ctrl_phy_s3esk.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/mem/sdram/sdram_ctrl_phy_s3esk_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/mem/sdram/sdram_ctrl_phy_s3esk_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/mem/sdram/sdram_ctrl_s3esk.rst b/docs/IPCores/mem/sdram/sdram_ctrl_s3esk.rst index 01a374d16..838fc10c5 100644 --- a/docs/IPCores/mem/sdram/sdram_ctrl_s3esk.rst +++ b/docs/IPCores/mem/sdram/sdram_ctrl_s3esk.rst @@ -7,11 +7,11 @@ PoC.mem.sdram.ctrl_s3esk .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/mem/sdram/sdram_ctrl_s3esk.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/mem/sdram/sdram_ctrl_s3esk.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/mem/sdram/sdram_ctrl_s3esk_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/mem/sdram/sdram_ctrl_s3esk_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/misc/filter/filter_And.rst b/docs/IPCores/misc/filter/filter_And.rst new file mode 100644 index 000000000..3fe1f4115 --- /dev/null +++ b/docs/IPCores/misc/filter/filter_And.rst @@ -0,0 +1,38 @@ +.. _IP/filter_And: + +PoC.misc.filter.And +################### + +.. only:: html + + .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/src/misc/filter/filter_And.vhdl + :alt: Source Code on GitHub + .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/filter/filter_And_tb.vhdl + :alt: Source Code on GitHub + + .. sidebar:: GitHub Links + + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` + +.. TODO:: No documentation available. + + + +.. rubric:: Entity Declaration: + +.. literalinclude:: ../../../../src/misc/filter/filter_And.vhdl + :language: vhdl + :tab-width: 2 + :linenos: + :lines: 37-48 + + + +.. only:: latex + + Source file: :pocsrc:`misc/filter/filter_And.vhdl ` diff --git a/docs/IPCores/misc/filter/filter_Mean.rst b/docs/IPCores/misc/filter/filter_Mean.rst new file mode 100644 index 000000000..928ed9e28 --- /dev/null +++ b/docs/IPCores/misc/filter/filter_Mean.rst @@ -0,0 +1,38 @@ +.. _IP/filter_Mean: + +PoC.misc.filter.Mean +#################### + +.. only:: html + + .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/src/misc/filter/filter_Mean.vhdl + :alt: Source Code on GitHub + .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/filter/filter_Mean_tb.vhdl + :alt: Source Code on GitHub + + .. sidebar:: GitHub Links + + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` + +.. TODO:: No documentation available. + + + +.. rubric:: Entity Declaration: + +.. literalinclude:: ../../../../src/misc/filter/filter_Mean.vhdl + :language: vhdl + :tab-width: 2 + :linenos: + :lines: 37-48 + + + +.. only:: latex + + Source file: :pocsrc:`misc/filter/filter_Mean.vhdl ` diff --git a/docs/IPCores/misc/filter/filter_Or.rst b/docs/IPCores/misc/filter/filter_Or.rst new file mode 100644 index 000000000..ffe10d6c9 --- /dev/null +++ b/docs/IPCores/misc/filter/filter_Or.rst @@ -0,0 +1,38 @@ +.. _IP/filter_Or: + +PoC.misc.filter.Or +################## + +.. only:: html + + .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/src/misc/filter/filter_Or.vhdl + :alt: Source Code on GitHub + .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png + :scale: 40 + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/filter/filter_Or_tb.vhdl + :alt: Source Code on GitHub + + .. sidebar:: GitHub Links + + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` + +.. TODO:: No documentation available. + + + +.. rubric:: Entity Declaration: + +.. literalinclude:: ../../../../src/misc/filter/filter_Or.vhdl + :language: vhdl + :tab-width: 2 + :linenos: + :lines: 37-48 + + + +.. only:: latex + + Source file: :pocsrc:`misc/filter/filter_Or.vhdl ` diff --git a/docs/IPCores/misc/filter/filter_and.rst b/docs/IPCores/misc/filter/filter_and.rst deleted file mode 100644 index b880c5242..000000000 --- a/docs/IPCores/misc/filter/filter_and.rst +++ /dev/null @@ -1,38 +0,0 @@ -.. _IP/filter_and: - -PoC.misc.filter.and -################### - -.. only:: html - - .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/filter/filter_and.vhdl - :alt: Source Code on GitHub - .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/filter/filter_and_tb.vhdl - :alt: Source Code on GitHub - - .. sidebar:: GitHub Links - - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` - -.. TODO:: No documentation available. - - - -.. rubric:: Entity Declaration: - -.. literalinclude:: ../../../../src/misc/filter/filter_and.vhdl - :language: vhdl - :tab-width: 2 - :linenos: - :lines: 37-48 - - - -.. only:: latex - - Source file: :pocsrc:`misc/filter/filter_and.vhdl ` diff --git a/docs/IPCores/misc/filter/filter_mean.rst b/docs/IPCores/misc/filter/filter_mean.rst deleted file mode 100644 index 42213f9ee..000000000 --- a/docs/IPCores/misc/filter/filter_mean.rst +++ /dev/null @@ -1,38 +0,0 @@ -.. _IP/filter_mean: - -PoC.misc.filter.mean -#################### - -.. only:: html - - .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/filter/filter_mean.vhdl - :alt: Source Code on GitHub - .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/filter/filter_mean_tb.vhdl - :alt: Source Code on GitHub - - .. sidebar:: GitHub Links - - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` - -.. TODO:: No documentation available. - - - -.. rubric:: Entity Declaration: - -.. literalinclude:: ../../../../src/misc/filter/filter_mean.vhdl - :language: vhdl - :tab-width: 2 - :linenos: - :lines: 37-48 - - - -.. only:: latex - - Source file: :pocsrc:`misc/filter/filter_mean.vhdl ` diff --git a/docs/IPCores/misc/filter/filter_or.rst b/docs/IPCores/misc/filter/filter_or.rst deleted file mode 100644 index 2a6cbce9c..000000000 --- a/docs/IPCores/misc/filter/filter_or.rst +++ /dev/null @@ -1,38 +0,0 @@ -.. _IP/filter_or: - -PoC.misc.filter.or -################## - -.. only:: html - - .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/filter/filter_or.vhdl - :alt: Source Code on GitHub - .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png - :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/filter/filter_or_tb.vhdl - :alt: Source Code on GitHub - - .. sidebar:: GitHub Links - - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` - -.. TODO:: No documentation available. - - - -.. rubric:: Entity Declaration: - -.. literalinclude:: ../../../../src/misc/filter/filter_or.vhdl - :language: vhdl - :tab-width: 2 - :linenos: - :lines: 37-48 - - - -.. only:: latex - - Source file: :pocsrc:`misc/filter/filter_or.vhdl ` diff --git a/docs/IPCores/misc/filter/index.rst b/docs/IPCores/misc/filter/index.rst index 83cabd449..f86286bb3 100644 --- a/docs/IPCores/misc/filter/index.rst +++ b/docs/IPCores/misc/filter/index.rst @@ -7,13 +7,13 @@ These are filter entities.... **Entities** - * :ref:`IP/filter_and` - * :ref:`IP/filter_mean` - * :ref:`IP/filter_or` + * :ref:`IP/filter_And` + * :ref:`IP/filter_Mean` + * :ref:`IP/filter_Or` .. toctree:: :hidden: - filter_and - filter_mean - filter_or + filter_And + filter_Mean + filter_Or diff --git a/docs/IPCores/misc/gearbox/gearbox_down_cc.rst b/docs/IPCores/misc/gearbox/gearbox_Down_cc.rst similarity index 61% rename from docs/IPCores/misc/gearbox/gearbox_down_cc.rst rename to docs/IPCores/misc/gearbox/gearbox_Down_cc.rst index 1b7351dd7..6d3b4c8f8 100644 --- a/docs/IPCores/misc/gearbox/gearbox_down_cc.rst +++ b/docs/IPCores/misc/gearbox/gearbox_Down_cc.rst @@ -1,4 +1,4 @@ -.. _IP/gearbox_down_cc: +.. _IP/gearbox_Down_cc: PoC.misc.gearbox.down_cc ######################## @@ -7,17 +7,17 @@ PoC.misc.gearbox.down_cc .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/gearbox/gearbox_down_cc.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/gearbox/gearbox_Down_cc.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/gearbox/gearbox_down_cc_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/gearbox/gearbox_Down_cc_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` This module provides a downscaling gearbox with a common clock (cc) interface. It perfoems a 'word' to 'byte' splitting. The default order is @@ -29,7 +29,7 @@ can be added by enabling (ADD_***PUT_REGISTERS = TRUE). .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/misc/gearbox/gearbox_down_cc.vhdl +.. literalinclude:: ../../../../src/misc/gearbox/gearbox_Down_cc.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -39,4 +39,4 @@ can be added by enabling (ADD_***PUT_REGISTERS = TRUE). .. only:: latex - Source file: :pocsrc:`misc/gearbox/gearbox_down_cc.vhdl ` + Source file: :pocsrc:`misc/gearbox/gearbox_Down_cc.vhdl ` diff --git a/docs/IPCores/misc/gearbox/gearbox_down_dc.rst b/docs/IPCores/misc/gearbox/gearbox_Down_dc.rst similarity index 66% rename from docs/IPCores/misc/gearbox/gearbox_down_dc.rst rename to docs/IPCores/misc/gearbox/gearbox_Down_dc.rst index ed1929929..932e35723 100644 --- a/docs/IPCores/misc/gearbox/gearbox_down_dc.rst +++ b/docs/IPCores/misc/gearbox/gearbox_Down_dc.rst @@ -1,4 +1,4 @@ -.. _IP/gearbox_down_dc: +.. _IP/gearbox_Down_dc: PoC.misc.gearbox.down_dc ######################## @@ -7,17 +7,17 @@ PoC.misc.gearbox.down_dc .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/gearbox/gearbox_down_dc.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/gearbox/gearbox_Down_dc.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/gearbox/gearbox_down_dc_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/gearbox/gearbox_Down_dc_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` This module provides a downscaling gearbox with a dependent clock (dc) interface. It perfoems a 'word' to 'byte' splitting. The default order is @@ -34,7 +34,7 @@ Assertions: .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/misc/gearbox/gearbox_down_dc.vhdl +.. literalinclude:: ../../../../src/misc/gearbox/gearbox_Down_dc.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -44,4 +44,4 @@ Assertions: .. only:: latex - Source file: :pocsrc:`misc/gearbox/gearbox_down_dc.vhdl ` + Source file: :pocsrc:`misc/gearbox/gearbox_Down_dc.vhdl ` diff --git a/docs/IPCores/misc/gearbox/gearbox_up_cc.rst b/docs/IPCores/misc/gearbox/gearbox_Up_cc.rst similarity index 61% rename from docs/IPCores/misc/gearbox/gearbox_up_cc.rst rename to docs/IPCores/misc/gearbox/gearbox_Up_cc.rst index 086b29adc..872e9dca8 100644 --- a/docs/IPCores/misc/gearbox/gearbox_up_cc.rst +++ b/docs/IPCores/misc/gearbox/gearbox_Up_cc.rst @@ -1,4 +1,4 @@ -.. _IP/gearbox_up_cc: +.. _IP/gearbox_Up_cc: PoC.misc.gearbox.up_cc ###################### @@ -7,17 +7,17 @@ PoC.misc.gearbox.up_cc .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/gearbox/gearbox_up_cc.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/gearbox/gearbox_Up_cc.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/gearbox/gearbox_up_cc_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/gearbox/gearbox_Up_cc_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` This module provides a downscaling gearbox with a common clock (cc) interface. It perfoems a 'byte' to 'word' collection. The default order is @@ -29,7 +29,7 @@ can be added by enabling (ADD_***PUT_REGISTERS = TRUE). .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/misc/gearbox/gearbox_up_cc.vhdl +.. literalinclude:: ../../../../src/misc/gearbox/gearbox_Up_cc.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -39,4 +39,4 @@ can be added by enabling (ADD_***PUT_REGISTERS = TRUE). .. only:: latex - Source file: :pocsrc:`misc/gearbox/gearbox_up_cc.vhdl ` + Source file: :pocsrc:`misc/gearbox/gearbox_Up_cc.vhdl ` diff --git a/docs/IPCores/misc/gearbox/gearbox_up_dc.rst b/docs/IPCores/misc/gearbox/gearbox_Up_dc.rst similarity index 67% rename from docs/IPCores/misc/gearbox/gearbox_up_dc.rst rename to docs/IPCores/misc/gearbox/gearbox_Up_dc.rst index 32f62a770..2c33168c0 100644 --- a/docs/IPCores/misc/gearbox/gearbox_up_dc.rst +++ b/docs/IPCores/misc/gearbox/gearbox_Up_dc.rst @@ -1,4 +1,4 @@ -.. _IP/gearbox_up_dc: +.. _IP/gearbox_Up_dc: PoC.misc.gearbox.up_dc ###################### @@ -7,17 +7,17 @@ PoC.misc.gearbox.up_dc .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/gearbox/gearbox_up_dc.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/gearbox/gearbox_Up_dc.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/gearbox/gearbox_up_dc_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/gearbox/gearbox_Up_dc_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` This module provides a upscaling gearbox with a dependent clock (dc) interface. It perfoems a 'byte' to 'word' collection. The default order is @@ -35,7 +35,7 @@ Assertions: .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/misc/gearbox/gearbox_up_dc.vhdl +.. literalinclude:: ../../../../src/misc/gearbox/gearbox_Up_dc.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -45,4 +45,4 @@ Assertions: .. only:: latex - Source file: :pocsrc:`misc/gearbox/gearbox_up_dc.vhdl ` + Source file: :pocsrc:`misc/gearbox/gearbox_Up_dc.vhdl ` diff --git a/docs/IPCores/misc/gearbox/index.rst b/docs/IPCores/misc/gearbox/index.rst index dceef97e6..726b5f2a3 100644 --- a/docs/IPCores/misc/gearbox/index.rst +++ b/docs/IPCores/misc/gearbox/index.rst @@ -7,15 +7,15 @@ These are gearbox entities.... **Entities** - * :ref:`IP/gearbox_down_cc` - * :ref:`IP/gearbox_down_dc` - * :ref:`IP/gearbox_up_cc` - * :ref:`IP/gearbox_up_dc` + * :ref:`IP/gearbox_Down_cc` + * :ref:`IP/gearbox_Down_dc` + * :ref:`IP/gearbox_Up_cc` + * :ref:`IP/gearbox_Up_dc` .. toctree:: :hidden: - gearbox_down_cc - gearbox_down_dc - gearbox_up_cc - gearbox_up_dc + gearbox_Down_cc + gearbox_Down_dc + gearbox_Up_cc + gearbox_Up_dc diff --git a/docs/IPCores/misc/misc.pkg.rst b/docs/IPCores/misc/misc.pkg.rst index 0970eb13d..e099c515a 100644 --- a/docs/IPCores/misc/misc.pkg.rst +++ b/docs/IPCores/misc/misc.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/misc.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/misc.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/misc/misc_BitwidthConverter.rst b/docs/IPCores/misc/misc_BitwidthConverter.rst index 0130973bc..3c4529d31 100644 --- a/docs/IPCores/misc/misc_BitwidthConverter.rst +++ b/docs/IPCores/misc/misc_BitwidthConverter.rst @@ -7,11 +7,11 @@ PoC.misc.BitwidthConverter .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/misc_BitwidthConverter.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/misc_BitwidthConverter.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/misc_BitwidthConverter_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/misc_BitwidthConverter_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/misc/misc_ByteAligner.rst b/docs/IPCores/misc/misc_ByteAligner.rst index 11434d66f..e3c0f302e 100644 --- a/docs/IPCores/misc/misc_ByteAligner.rst +++ b/docs/IPCores/misc/misc_ByteAligner.rst @@ -7,11 +7,11 @@ PoC.misc.ByteAligner .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/misc_ByteAligner.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/misc_ByteAligner.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/misc_ByteAligner_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/misc_ByteAligner_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/misc/misc_Delay.rst b/docs/IPCores/misc/misc_Delay.rst index 2b1468908..f51112520 100644 --- a/docs/IPCores/misc/misc_Delay.rst +++ b/docs/IPCores/misc/misc_Delay.rst @@ -7,11 +7,11 @@ PoC.misc.Delay .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/misc_Delay.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/misc_Delay.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/misc_Delay_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/misc_Delay_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/misc/misc_FrequencyMeasurement.rst b/docs/IPCores/misc/misc_FrequencyMeasurement.rst index 857373da9..771698bf5 100644 --- a/docs/IPCores/misc/misc_FrequencyMeasurement.rst +++ b/docs/IPCores/misc/misc_FrequencyMeasurement.rst @@ -7,11 +7,11 @@ PoC.misc.FrequencyMeasurement .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/misc_FrequencyMeasurement.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/misc_FrequencyMeasurement.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/misc_FrequencyMeasurement_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/misc_FrequencyMeasurement_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/misc/misc_PulseTrain.rst b/docs/IPCores/misc/misc_PulseTrain.rst index cb3c98812..0af7376b0 100644 --- a/docs/IPCores/misc/misc_PulseTrain.rst +++ b/docs/IPCores/misc/misc_PulseTrain.rst @@ -7,11 +7,11 @@ PoC.misc.PulseTrain .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/misc_PulseTrain.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/misc_PulseTrain.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/misc_PulseTrain_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/misc_PulseTrain_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/misc/misc_Sequencer.rst b/docs/IPCores/misc/misc_Sequencer.rst index 871dc4fb6..c72efaab2 100644 --- a/docs/IPCores/misc/misc_Sequencer.rst +++ b/docs/IPCores/misc/misc_Sequencer.rst @@ -7,11 +7,11 @@ PoC.misc.Sequencer .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/misc_Sequencer.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/misc_Sequencer.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/misc_Sequencer_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/misc_Sequencer_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/misc/misc_StrobeGenerator.rst b/docs/IPCores/misc/misc_StrobeGenerator.rst index 54a2fa38a..894fc9b45 100644 --- a/docs/IPCores/misc/misc_StrobeGenerator.rst +++ b/docs/IPCores/misc/misc_StrobeGenerator.rst @@ -7,11 +7,11 @@ PoC.misc.StrobeGenerator .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/misc_StrobeGenerator.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/misc_StrobeGenerator.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/misc_StrobeGenerator_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/misc_StrobeGenerator_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/misc/misc_StrobeLimiter.rst b/docs/IPCores/misc/misc_StrobeLimiter.rst index e21f3bd56..672a46e14 100644 --- a/docs/IPCores/misc/misc_StrobeLimiter.rst +++ b/docs/IPCores/misc/misc_StrobeLimiter.rst @@ -7,11 +7,11 @@ PoC.misc.StrobeLimiter .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/misc_StrobeLimiter.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/misc_StrobeLimiter.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/misc_StrobeLimiter_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/misc_StrobeLimiter_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/misc/misc_WordAligner.rst b/docs/IPCores/misc/misc_WordAligner.rst index 1935ba6fd..885582182 100644 --- a/docs/IPCores/misc/misc_WordAligner.rst +++ b/docs/IPCores/misc/misc_WordAligner.rst @@ -14,7 +14,7 @@ WordAligner :linenos: :lines: 39-52 -Source file: `misc/misc_WordAligner.vhdl `_ +Source file: `misc/misc_WordAligner.vhdl `_ diff --git a/docs/IPCores/misc/misc_bit_lz.rst b/docs/IPCores/misc/misc_bit_lz.rst index 9c854faa2..22678e4bb 100644 --- a/docs/IPCores/misc/misc_bit_lz.rst +++ b/docs/IPCores/misc/misc_bit_lz.rst @@ -7,11 +7,11 @@ PoC.misc.bit_lz .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/misc_bit_lz.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/misc_bit_lz.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/misc_bit_lz_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/misc_bit_lz_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/misc/stat/stat_Average.rst b/docs/IPCores/misc/stat/stat_Average.rst index bc17f5d12..75fb0c19f 100644 --- a/docs/IPCores/misc/stat/stat_Average.rst +++ b/docs/IPCores/misc/stat/stat_Average.rst @@ -7,11 +7,11 @@ PoC.misc.stat.Average .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/stat/stat_Average.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/stat/stat_Average.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/stat/stat_Average_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/stat/stat_Average_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/misc/stat/stat_Histogram.rst b/docs/IPCores/misc/stat/stat_Histogram.rst index 5d1534613..4b3976dec 100644 --- a/docs/IPCores/misc/stat/stat_Histogram.rst +++ b/docs/IPCores/misc/stat/stat_Histogram.rst @@ -7,11 +7,11 @@ PoC.misc.stat.Histogram .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/stat/stat_Histogram.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/stat/stat_Histogram.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/stat/stat_Histogram_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/stat/stat_Histogram_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/misc/stat/stat_Maximum.rst b/docs/IPCores/misc/stat/stat_Maximum.rst index 8b2b123a4..b97f3f597 100644 --- a/docs/IPCores/misc/stat/stat_Maximum.rst +++ b/docs/IPCores/misc/stat/stat_Maximum.rst @@ -7,11 +7,11 @@ PoC.misc.stat.Maximum .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/stat/stat_Maximum.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/stat/stat_Maximum.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/stat/stat_Maximum_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/stat/stat_Maximum_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/misc/stat/stat_Minimum.rst b/docs/IPCores/misc/stat/stat_Minimum.rst index a3cdf81c3..9a7525b73 100644 --- a/docs/IPCores/misc/stat/stat_Minimum.rst +++ b/docs/IPCores/misc/stat/stat_Minimum.rst @@ -7,11 +7,11 @@ PoC.misc.stat.Minimum .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/misc/stat/stat_Minimum.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/misc/stat/stat_Minimum.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/misc/stat/stat_Minimum_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/misc/stat/stat_Minimum_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/arp/arp_BroadCast_Receiver.rst b/docs/IPCores/net/arp/arp_BroadCast_Receiver.rst index f3e200dc4..92e8934c5 100644 --- a/docs/IPCores/net/arp/arp_BroadCast_Receiver.rst +++ b/docs/IPCores/net/arp/arp_BroadCast_Receiver.rst @@ -7,11 +7,11 @@ PoC.net.arp.BroadCast_Receiver .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/arp/arp_BroadCast_Receiver.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/arp/arp_BroadCast_Receiver.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/arp/arp_BroadCast_Receiver_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/arp/arp_BroadCast_Receiver_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/arp/arp_BroadCast_Requester.rst b/docs/IPCores/net/arp/arp_BroadCast_Requester.rst index 0fc6d86fc..a724b022b 100644 --- a/docs/IPCores/net/arp/arp_BroadCast_Requester.rst +++ b/docs/IPCores/net/arp/arp_BroadCast_Requester.rst @@ -7,11 +7,11 @@ PoC.net.arp.BroadCast_Requester .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/arp/arp_BroadCast_Requester.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/arp/arp_BroadCast_Requester.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/arp/arp_BroadCast_Requester_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/arp/arp_BroadCast_Requester_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/arp/arp_Cache.rst b/docs/IPCores/net/arp/arp_Cache.rst index 0fbd274c6..db329775e 100644 --- a/docs/IPCores/net/arp/arp_Cache.rst +++ b/docs/IPCores/net/arp/arp_Cache.rst @@ -7,11 +7,11 @@ PoC.net.arp.Cache .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/arp/arp_Cache.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/arp/arp_Cache.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/arp/arp_Cache_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/arp/arp_Cache_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/arp/arp_IPPool.rst b/docs/IPCores/net/arp/arp_IPPool.rst index ea8bc8168..7c3ada114 100644 --- a/docs/IPCores/net/arp/arp_IPPool.rst +++ b/docs/IPCores/net/arp/arp_IPPool.rst @@ -7,11 +7,11 @@ PoC.net.arp.IPPool .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/arp/arp_IPPool.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/arp/arp_IPPool.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/arp/arp_IPPool_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/arp/arp_IPPool_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/arp/arp_Tester.rst b/docs/IPCores/net/arp/arp_Tester.rst index bc5d2f444..aac547262 100644 --- a/docs/IPCores/net/arp/arp_Tester.rst +++ b/docs/IPCores/net/arp/arp_Tester.rst @@ -7,11 +7,11 @@ PoC.net.arp.Tester .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/arp/arp_Tester.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/arp/arp_Tester.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/arp/arp_Tester_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/arp/arp_Tester_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/arp/arp_UniCast_Receiver.rst b/docs/IPCores/net/arp/arp_UniCast_Receiver.rst index 9de1c9603..682e5fe3e 100644 --- a/docs/IPCores/net/arp/arp_UniCast_Receiver.rst +++ b/docs/IPCores/net/arp/arp_UniCast_Receiver.rst @@ -7,11 +7,11 @@ PoC.net.arp.UniCast_Receiver .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/arp/arp_UniCast_Receiver.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/arp/arp_UniCast_Receiver.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/arp/arp_UniCast_Receiver_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/arp/arp_UniCast_Receiver_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/arp/arp_UniCast_Responder.rst b/docs/IPCores/net/arp/arp_UniCast_Responder.rst index 7d6f6ae88..5e740f52c 100644 --- a/docs/IPCores/net/arp/arp_UniCast_Responder.rst +++ b/docs/IPCores/net/arp/arp_UniCast_Responder.rst @@ -7,11 +7,11 @@ PoC.net.arp.UniCast_Responder .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/arp/arp_UniCast_Responder.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/arp/arp_UniCast_Responder.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/arp/arp_UniCast_Responder_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/arp/arp_UniCast_Responder_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/arp/arp_Wrapper.rst b/docs/IPCores/net/arp/arp_Wrapper.rst index fbf63b875..6c5d28738 100644 --- a/docs/IPCores/net/arp/arp_Wrapper.rst +++ b/docs/IPCores/net/arp/arp_Wrapper.rst @@ -7,11 +7,11 @@ PoC.net.arp.Wrapper .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/arp/arp_Wrapper.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/arp/arp_Wrapper.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/arp/arp_Wrapper_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/arp/arp_Wrapper_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/eth/eth_GEMAC_GMII.rst b/docs/IPCores/net/eth/eth_GEMAC_GMII.rst index 68d767f8f..ef886565f 100644 --- a/docs/IPCores/net/eth/eth_GEMAC_GMII.rst +++ b/docs/IPCores/net/eth/eth_GEMAC_GMII.rst @@ -7,11 +7,11 @@ PoC.net.eth.GEMAC_GMII .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/eth/eth_GEMAC_GMII.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/eth/eth_GEMAC_GMII.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/eth/eth_GEMAC_GMII_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/eth/eth_GEMAC_GMII_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/eth/eth_GEMAC_RX.rst b/docs/IPCores/net/eth/eth_GEMAC_RX.rst index 837cb94ee..468d001cb 100644 --- a/docs/IPCores/net/eth/eth_GEMAC_RX.rst +++ b/docs/IPCores/net/eth/eth_GEMAC_RX.rst @@ -7,11 +7,11 @@ PoC.net.eth.GEMAC_RX .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/eth/eth_GEMAC_RX.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/eth/eth_GEMAC_RX.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/eth/eth_GEMAC_RX_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/eth/eth_GEMAC_RX_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/eth/eth_GEMAC_TX.rst b/docs/IPCores/net/eth/eth_GEMAC_TX.rst index 5ae2accbf..074a4d43d 100644 --- a/docs/IPCores/net/eth/eth_GEMAC_TX.rst +++ b/docs/IPCores/net/eth/eth_GEMAC_TX.rst @@ -7,11 +7,11 @@ PoC.net.eth.GEMAC_TX .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/eth/eth_GEMAC_TX.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/eth/eth_GEMAC_TX.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/eth/eth_GEMAC_TX_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/eth/eth_GEMAC_TX_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/eth/eth_PHYController.rst b/docs/IPCores/net/eth/eth_PHYController.rst index 714f5c0a4..fe200b449 100644 --- a/docs/IPCores/net/eth/eth_PHYController.rst +++ b/docs/IPCores/net/eth/eth_PHYController.rst @@ -7,11 +7,11 @@ PoC.net.eth.PHYController .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/eth/eth_PHYController.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/eth/eth_PHYController.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/eth/eth_PHYController_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/eth/eth_PHYController_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/eth/eth_PHYController_Marvell_88E1111.rst b/docs/IPCores/net/eth/eth_PHYController_Marvell_88E1111.rst index 11446eff7..c394d33f5 100644 --- a/docs/IPCores/net/eth/eth_PHYController_Marvell_88E1111.rst +++ b/docs/IPCores/net/eth/eth_PHYController_Marvell_88E1111.rst @@ -7,11 +7,11 @@ PoC.net.eth.PHYController_Marvell_88E1111 .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/eth/eth_PHYController_Marvell_88E1111.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/eth/eth_PHYController_Marvell_88E1111.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/eth/eth_PHYController_Marvell_88E1111_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/eth/eth_PHYController_Marvell_88E1111_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/eth/eth_Wrapper.rst b/docs/IPCores/net/eth/eth_Wrapper.rst index 1da5c07f1..4152acb1d 100644 --- a/docs/IPCores/net/eth/eth_Wrapper.rst +++ b/docs/IPCores/net/eth/eth_Wrapper.rst @@ -7,11 +7,11 @@ PoC.net.eth.Wrapper .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/eth/eth_Wrapper.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/eth/eth_Wrapper.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/eth/eth_Wrapper_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/eth/eth_Wrapper_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/icmpv4/icmpv4_RX.rst b/docs/IPCores/net/icmpv4/icmpv4_RX.rst index c109e221c..52276d93c 100644 --- a/docs/IPCores/net/icmpv4/icmpv4_RX.rst +++ b/docs/IPCores/net/icmpv4/icmpv4_RX.rst @@ -7,11 +7,11 @@ PoC.net.icmpv4.RX .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/icmpv4/icmpv4_RX.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/icmpv4/icmpv4_RX.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/icmpv4/icmpv4_RX_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/icmpv4/icmpv4_RX_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/icmpv4/icmpv4_TX.rst b/docs/IPCores/net/icmpv4/icmpv4_TX.rst index bdb6a0a2c..b673ffae0 100644 --- a/docs/IPCores/net/icmpv4/icmpv4_TX.rst +++ b/docs/IPCores/net/icmpv4/icmpv4_TX.rst @@ -7,11 +7,11 @@ PoC.net.icmpv4.TX .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/icmpv4/icmpv4_TX.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/icmpv4/icmpv4_TX.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/icmpv4/icmpv4_TX_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/icmpv4/icmpv4_TX_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/icmpv4/icmpv4_Wrapper.rst b/docs/IPCores/net/icmpv4/icmpv4_Wrapper.rst index 26d03fc82..dcb9feebc 100644 --- a/docs/IPCores/net/icmpv4/icmpv4_Wrapper.rst +++ b/docs/IPCores/net/icmpv4/icmpv4_Wrapper.rst @@ -7,11 +7,11 @@ PoC.net.icmpv4.Wrapper .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/icmpv4/icmpv4_Wrapper.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/icmpv4/icmpv4_Wrapper.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/icmpv4/icmpv4_Wrapper_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/icmpv4/icmpv4_Wrapper_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/icmpv6/icmpv6_RX.rst b/docs/IPCores/net/icmpv6/icmpv6_RX.rst index c4ee75257..bf9aac2bb 100644 --- a/docs/IPCores/net/icmpv6/icmpv6_RX.rst +++ b/docs/IPCores/net/icmpv6/icmpv6_RX.rst @@ -7,11 +7,11 @@ PoC.net.icmpv6.RX .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/icmpv6/icmpv6_RX.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/icmpv6/icmpv6_RX.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/icmpv6/icmpv6_RX_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/icmpv6/icmpv6_RX_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/icmpv6/icmpv6_TX.rst b/docs/IPCores/net/icmpv6/icmpv6_TX.rst index 105e09ffe..3e65a7a88 100644 --- a/docs/IPCores/net/icmpv6/icmpv6_TX.rst +++ b/docs/IPCores/net/icmpv6/icmpv6_TX.rst @@ -7,11 +7,11 @@ PoC.net.icmpv6.TX .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/icmpv6/icmpv6_TX.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/icmpv6/icmpv6_TX.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/icmpv6/icmpv6_TX_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/icmpv6/icmpv6_TX_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/icmpv6/icmpv6_Wrapper.rst b/docs/IPCores/net/icmpv6/icmpv6_Wrapper.rst index 319b04bf9..236a38043 100644 --- a/docs/IPCores/net/icmpv6/icmpv6_Wrapper.rst +++ b/docs/IPCores/net/icmpv6/icmpv6_Wrapper.rst @@ -7,11 +7,11 @@ PoC.net.icmpv6.Wrapper .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/icmpv6/icmpv6_Wrapper.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/icmpv6/icmpv6_Wrapper.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/icmpv6/icmpv6_Wrapper_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/icmpv6/icmpv6_Wrapper_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/ipv4/ipv4_FrameLoopback.rst b/docs/IPCores/net/ipv4/ipv4_FrameLoopback.rst index 1bab4b963..5fe7ceab0 100644 --- a/docs/IPCores/net/ipv4/ipv4_FrameLoopback.rst +++ b/docs/IPCores/net/ipv4/ipv4_FrameLoopback.rst @@ -7,11 +7,11 @@ PoC.net.ipv4.FrameLoopback .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/ipv4/ipv4_FrameLoopback.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/ipv4/ipv4_FrameLoopback.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/ipv4/ipv4_FrameLoopback_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/ipv4/ipv4_FrameLoopback_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/ipv4/ipv4_RX.rst b/docs/IPCores/net/ipv4/ipv4_RX.rst index 5448effa7..d64972f39 100644 --- a/docs/IPCores/net/ipv4/ipv4_RX.rst +++ b/docs/IPCores/net/ipv4/ipv4_RX.rst @@ -7,11 +7,11 @@ PoC.net.ipv4.RX .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/ipv4/ipv4_RX.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/ipv4/ipv4_RX.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/ipv4/ipv4_RX_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/ipv4/ipv4_RX_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/ipv4/ipv4_TX.rst b/docs/IPCores/net/ipv4/ipv4_TX.rst index 9dcced7e7..50234e43b 100644 --- a/docs/IPCores/net/ipv4/ipv4_TX.rst +++ b/docs/IPCores/net/ipv4/ipv4_TX.rst @@ -7,11 +7,11 @@ PoC.net.ipv4.TX .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/ipv4/ipv4_TX.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/ipv4/ipv4_TX.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/ipv4/ipv4_TX_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/ipv4/ipv4_TX_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/ipv4/ipv4_Wrapper.rst b/docs/IPCores/net/ipv4/ipv4_Wrapper.rst index 34a9d9d78..9dd205ee2 100644 --- a/docs/IPCores/net/ipv4/ipv4_Wrapper.rst +++ b/docs/IPCores/net/ipv4/ipv4_Wrapper.rst @@ -7,11 +7,11 @@ PoC.net.ipv4.Wrapper .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/ipv4/ipv4_Wrapper.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/ipv4/ipv4_Wrapper.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/ipv4/ipv4_Wrapper_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/ipv4/ipv4_Wrapper_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/ipv6/ipv6_FrameLoopback.rst b/docs/IPCores/net/ipv6/ipv6_FrameLoopback.rst index 1e48f71d4..9a239d189 100644 --- a/docs/IPCores/net/ipv6/ipv6_FrameLoopback.rst +++ b/docs/IPCores/net/ipv6/ipv6_FrameLoopback.rst @@ -7,11 +7,11 @@ PoC.net.ipv6.FrameLoopback .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/ipv6/ipv6_FrameLoopback.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/ipv6/ipv6_FrameLoopback.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/ipv6/ipv6_FrameLoopback_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/ipv6/ipv6_FrameLoopback_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/ipv6/ipv6_RX.rst b/docs/IPCores/net/ipv6/ipv6_RX.rst index 533571440..aa0b3dbe5 100644 --- a/docs/IPCores/net/ipv6/ipv6_RX.rst +++ b/docs/IPCores/net/ipv6/ipv6_RX.rst @@ -7,11 +7,11 @@ PoC.net.ipv6.RX .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/ipv6/ipv6_RX.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/ipv6/ipv6_RX.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/ipv6/ipv6_RX_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/ipv6/ipv6_RX_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/ipv6/ipv6_TX.rst b/docs/IPCores/net/ipv6/ipv6_TX.rst index b1fdb4b52..e239aea7d 100644 --- a/docs/IPCores/net/ipv6/ipv6_TX.rst +++ b/docs/IPCores/net/ipv6/ipv6_TX.rst @@ -7,11 +7,11 @@ PoC.net.ipv6.TX .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/ipv6/ipv6_TX.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/ipv6/ipv6_TX.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/ipv6/ipv6_TX_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/ipv6/ipv6_TX_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/ipv6/ipv6_Wrapper.rst b/docs/IPCores/net/ipv6/ipv6_Wrapper.rst index 004d10eee..80a5c36e9 100644 --- a/docs/IPCores/net/ipv6/ipv6_Wrapper.rst +++ b/docs/IPCores/net/ipv6/ipv6_Wrapper.rst @@ -7,11 +7,11 @@ PoC.net.ipv6.Wrapper .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/ipv6/ipv6_Wrapper.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/ipv6/ipv6_Wrapper.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/ipv6/ipv6_Wrapper_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/ipv6/ipv6_Wrapper_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/mac/mac_FrameLoopback.rst b/docs/IPCores/net/mac/mac_FrameLoopback.rst index 3f658b0eb..84623d046 100644 --- a/docs/IPCores/net/mac/mac_FrameLoopback.rst +++ b/docs/IPCores/net/mac/mac_FrameLoopback.rst @@ -7,11 +7,11 @@ PoC.net.mac.FrameLoopback .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/mac/mac_FrameLoopback.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/mac/mac_FrameLoopback.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/mac/mac_FrameLoopback_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/mac/mac_FrameLoopback_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/mac/mac_RX_DestMAC_Switch.rst b/docs/IPCores/net/mac/mac_RX_DestMAC_Switch.rst index e8d76049f..8e8cd55e0 100644 --- a/docs/IPCores/net/mac/mac_RX_DestMAC_Switch.rst +++ b/docs/IPCores/net/mac/mac_RX_DestMAC_Switch.rst @@ -7,11 +7,11 @@ PoC.net.mac.RX_DestMAC_Switch .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/mac/mac_RX_DestMAC_Switch.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/mac/mac_RX_DestMAC_Switch.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/mac/mac_RX_DestMAC_Switch_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/mac/mac_RX_DestMAC_Switch_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/mac/mac_RX_SrcMAC_Filter.rst b/docs/IPCores/net/mac/mac_RX_SrcMAC_Filter.rst index 5bbf885d7..e9f6542ac 100644 --- a/docs/IPCores/net/mac/mac_RX_SrcMAC_Filter.rst +++ b/docs/IPCores/net/mac/mac_RX_SrcMAC_Filter.rst @@ -7,11 +7,11 @@ PoC.net.mac.RX_SrcMAC_Filter .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/mac/mac_RX_SrcMAC_Filter.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/mac/mac_RX_SrcMAC_Filter.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/mac/mac_RX_SrcMAC_Filter_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/mac/mac_RX_SrcMAC_Filter_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/mac/mac_RX_Type_Switch.rst b/docs/IPCores/net/mac/mac_RX_Type_Switch.rst index 6c582ddc2..af0e8a00b 100644 --- a/docs/IPCores/net/mac/mac_RX_Type_Switch.rst +++ b/docs/IPCores/net/mac/mac_RX_Type_Switch.rst @@ -7,11 +7,11 @@ PoC.net.mac.RX_Type_Switch .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/mac/mac_RX_Type_Switch.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/mac/mac_RX_Type_Switch.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/mac/mac_RX_Type_Switch_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/mac/mac_RX_Type_Switch_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/mac/mac_TX_DestMAC_Prepender.rst b/docs/IPCores/net/mac/mac_TX_DestMAC_Prepender.rst index b12a2ac75..5422095a1 100644 --- a/docs/IPCores/net/mac/mac_TX_DestMAC_Prepender.rst +++ b/docs/IPCores/net/mac/mac_TX_DestMAC_Prepender.rst @@ -7,11 +7,11 @@ PoC.net.mac.TX_DestMAC_Prepender .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/mac/mac_TX_DestMAC_Prepender.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/mac/mac_TX_DestMAC_Prepender.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/mac/mac_TX_DestMAC_Prepender_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/mac/mac_TX_DestMAC_Prepender_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/mac/mac_TX_SrcMAC_Prepender.rst b/docs/IPCores/net/mac/mac_TX_SrcMAC_Prepender.rst index 31cf44f09..0c6cf4c25 100644 --- a/docs/IPCores/net/mac/mac_TX_SrcMAC_Prepender.rst +++ b/docs/IPCores/net/mac/mac_TX_SrcMAC_Prepender.rst @@ -7,11 +7,11 @@ PoC.net.mac.TX_SrcMAC_Prepender .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/mac/mac_TX_SrcMAC_Prepender.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/mac/mac_TX_SrcMAC_Prepender.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/mac/mac_TX_SrcMAC_Prepender_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/mac/mac_TX_SrcMAC_Prepender_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/mac/mac_TX_Type_Prepender.rst b/docs/IPCores/net/mac/mac_TX_Type_Prepender.rst index fc20694df..609784d6e 100644 --- a/docs/IPCores/net/mac/mac_TX_Type_Prepender.rst +++ b/docs/IPCores/net/mac/mac_TX_Type_Prepender.rst @@ -7,11 +7,11 @@ PoC.net.mac.TX_Type_Prepender .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/mac/mac_TX_Type_Prepender.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/mac/mac_TX_Type_Prepender.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/mac/mac_TX_Type_Prepender_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/mac/mac_TX_Type_Prepender_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/mac/mac_Wrapper.rst b/docs/IPCores/net/mac/mac_Wrapper.rst index 1bcc82b88..320a2244a 100644 --- a/docs/IPCores/net/mac/mac_Wrapper.rst +++ b/docs/IPCores/net/mac/mac_Wrapper.rst @@ -7,11 +7,11 @@ PoC.net.mac.Wrapper .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/mac/mac_Wrapper.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/mac/mac_Wrapper.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/mac/mac_Wrapper_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/mac/mac_Wrapper_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/ndp/ndp_DestinationCache.rst b/docs/IPCores/net/ndp/ndp_DestinationCache.rst index 155f0f986..942c0a26c 100644 --- a/docs/IPCores/net/ndp/ndp_DestinationCache.rst +++ b/docs/IPCores/net/ndp/ndp_DestinationCache.rst @@ -7,11 +7,11 @@ PoC.net.ndp.DestinationCache .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/ndp/ndp_DestinationCache.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/ndp/ndp_DestinationCache.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/ndp/ndp_DestinationCache_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/ndp/ndp_DestinationCache_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/ndp/ndp_FSMQuery.rst b/docs/IPCores/net/ndp/ndp_FSMQuery.rst index c684d8431..237d4eb88 100644 --- a/docs/IPCores/net/ndp/ndp_FSMQuery.rst +++ b/docs/IPCores/net/ndp/ndp_FSMQuery.rst @@ -7,11 +7,11 @@ PoC.net.ndp.FSMQuery .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/ndp/ndp_FSMQuery.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/ndp/ndp_FSMQuery.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/ndp/ndp_FSMQuery_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/ndp/ndp_FSMQuery_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/ndp/ndp_NeighborCache.rst b/docs/IPCores/net/ndp/ndp_NeighborCache.rst index 733632024..94997be9a 100644 --- a/docs/IPCores/net/ndp/ndp_NeighborCache.rst +++ b/docs/IPCores/net/ndp/ndp_NeighborCache.rst @@ -7,11 +7,11 @@ PoC.net.ndp.NeighborCache .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/ndp/ndp_NeighborCache.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/ndp/ndp_NeighborCache.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/ndp/ndp_NeighborCache_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/ndp/ndp_NeighborCache_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/ndp/ndp_Wrapper.rst b/docs/IPCores/net/ndp/ndp_Wrapper.rst index bdee23131..f7730a508 100644 --- a/docs/IPCores/net/ndp/ndp_Wrapper.rst +++ b/docs/IPCores/net/ndp/ndp_Wrapper.rst @@ -7,11 +7,11 @@ PoC.net.ndp.Wrapper .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/ndp/ndp_Wrapper.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/ndp/ndp_Wrapper.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/ndp/ndp_Wrapper_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/ndp/ndp_Wrapper_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/net.pkg.rst b/docs/IPCores/net/net.pkg.rst index aef13b1a7..c64124f2c 100644 --- a/docs/IPCores/net/net.pkg.rst +++ b/docs/IPCores/net/net.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/net/net.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/net.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/net_FrameChecksum.rst b/docs/IPCores/net/net_FrameChecksum.rst index 17654d230..a57ff9fe2 100644 --- a/docs/IPCores/net/net_FrameChecksum.rst +++ b/docs/IPCores/net/net_FrameChecksum.rst @@ -7,11 +7,11 @@ PoC.net.FrameChecksum .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/net/net_FrameChecksum.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/net_FrameChecksum.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/net_FrameChecksum_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/net_FrameChecksum_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/net_FrameLoopback.rst b/docs/IPCores/net/net_FrameLoopback.rst index 074e435d0..395426147 100644 --- a/docs/IPCores/net/net_FrameLoopback.rst +++ b/docs/IPCores/net/net_FrameLoopback.rst @@ -7,11 +7,11 @@ PoC.net.FrameLoopback .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/net/net_FrameLoopback.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/net_FrameLoopback.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/tb/net/net_FrameLoopback_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/net_FrameLoopback_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/net_FramePerformanceCounter.rst b/docs/IPCores/net/net_FramePerformanceCounter.rst index 396ffaf49..a062fcf7d 100644 --- a/docs/IPCores/net/net_FramePerformanceCounter.rst +++ b/docs/IPCores/net/net_FramePerformanceCounter.rst @@ -7,11 +7,11 @@ PoC.net.FramePerformanceCounter .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/net/net_FramePerformanceCounter.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/net_FramePerformanceCounter.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/net_FramePerformanceCounter_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/net_FramePerformanceCounter_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/stack/stack_UDPv4.rst b/docs/IPCores/net/stack/stack_UDPv4.rst index 67474b7b4..2c9a207db 100644 --- a/docs/IPCores/net/stack/stack_UDPv4.rst +++ b/docs/IPCores/net/stack/stack_UDPv4.rst @@ -7,11 +7,11 @@ PoC.net.stack.UDPv4 .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/stack/stack_UDPv4.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/stack/stack_UDPv4.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/stack/stack_UDPv4_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/stack/stack_UDPv4_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/udp/udp_FrameLoopback.rst b/docs/IPCores/net/udp/udp_FrameLoopback.rst index 0e8bcbd42..3cc9297e6 100644 --- a/docs/IPCores/net/udp/udp_FrameLoopback.rst +++ b/docs/IPCores/net/udp/udp_FrameLoopback.rst @@ -7,11 +7,11 @@ PoC.net.udp.FrameLoopback .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/udp/udp_FrameLoopback.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/udp/udp_FrameLoopback.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/udp/udp_FrameLoopback_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/udp/udp_FrameLoopback_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/udp/udp_RX.rst b/docs/IPCores/net/udp/udp_RX.rst index 716d391a7..52e1f1f54 100644 --- a/docs/IPCores/net/udp/udp_RX.rst +++ b/docs/IPCores/net/udp/udp_RX.rst @@ -7,11 +7,11 @@ PoC.net.udp.RX .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/udp/udp_RX.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/udp/udp_RX.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/udp/udp_RX_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/udp/udp_RX_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/udp/udp_TX.rst b/docs/IPCores/net/udp/udp_TX.rst index 70a66ecb4..f48ac66d6 100644 --- a/docs/IPCores/net/udp/udp_TX.rst +++ b/docs/IPCores/net/udp/udp_TX.rst @@ -7,11 +7,11 @@ PoC.net.udp.TX .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/udp/udp_TX.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/udp/udp_TX.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/udp/udp_TX_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/udp/udp_TX_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/net/udp/udp_Wrapper.rst b/docs/IPCores/net/udp/udp_Wrapper.rst index 823bb5892..ac4230d07 100644 --- a/docs/IPCores/net/udp/udp_Wrapper.rst +++ b/docs/IPCores/net/udp/udp_Wrapper.rst @@ -7,11 +7,11 @@ PoC.net.udp.Wrapper .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/net/udp/udp_Wrapper.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/net/udp/udp_Wrapper.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/net/udp/udp_Wrapper_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/net/udp/udp_Wrapper_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sort/index.rst b/docs/IPCores/sort/index.rst index 1746ea409..ed37a6445 100644 --- a/docs/IPCores/sort/index.rst +++ b/docs/IPCores/sort/index.rst @@ -14,8 +14,8 @@ These are sorting entities.... * :ref:`IP/sort_ExpireList` * :ref:`IP/sort_InsertSort` * :ref:`IP/sort_LeastFrequentlyUsed` - * :ref:`IP/sort_lru_cache` - * :ref:`IP/sort_lru_list` + * :ref:`IP/sort_LeastRecentlyUsed_Cache` + * :ref:`IP/sort_LeastRecentlyUsed_List` .. toctree:: :hidden: @@ -28,5 +28,5 @@ These are sorting entities.... sort_ExpireList sort_InsertSort sort_LeastFrequentlyUsed - sort_lru_cache - sort_lru_list + sort_LeastRecentlyUsed_Cache + sort_LeastRecentlyUsed_List diff --git a/docs/IPCores/sort/sort_ExpireList.rst b/docs/IPCores/sort/sort_ExpireList.rst index a4800d431..b4acd5908 100644 --- a/docs/IPCores/sort/sort_ExpireList.rst +++ b/docs/IPCores/sort/sort_ExpireList.rst @@ -7,11 +7,11 @@ PoC.sort.ExpireList .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sort/sort_ExpireList.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sort/sort_ExpireList.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sort/sort_ExpireList_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sort/sort_ExpireList_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sort/sort_InsertSort.rst b/docs/IPCores/sort/sort_InsertSort.rst index fc63b92f7..61e36c305 100644 --- a/docs/IPCores/sort/sort_InsertSort.rst +++ b/docs/IPCores/sort/sort_InsertSort.rst @@ -7,11 +7,11 @@ PoC.sort.InsertSort .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sort/sort_InsertSort.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sort/sort_InsertSort.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sort/sort_InsertSort_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sort/sort_InsertSort_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sort/sort_LeastFrequentlyUsed.rst b/docs/IPCores/sort/sort_LeastFrequentlyUsed.rst index 535019369..ad6c1c518 100644 --- a/docs/IPCores/sort/sort_LeastFrequentlyUsed.rst +++ b/docs/IPCores/sort/sort_LeastFrequentlyUsed.rst @@ -7,11 +7,11 @@ PoC.sort.LeastFrequentlyUsed .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sort/sort_LeastFrequentlyUsed.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sort/sort_LeastFrequentlyUsed.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sort/sort_LeastFrequentlyUsed_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sort/sort_LeastFrequentlyUsed_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sort/sort_lru_cache.rst b/docs/IPCores/sort/sort_LeastRecentlyUsed_Cache.rst similarity index 59% rename from docs/IPCores/sort/sort_lru_cache.rst rename to docs/IPCores/sort/sort_LeastRecentlyUsed_Cache.rst index 5eb05c37d..4da70c7a6 100644 --- a/docs/IPCores/sort/sort_lru_cache.rst +++ b/docs/IPCores/sort/sort_LeastRecentlyUsed_Cache.rst @@ -1,25 +1,25 @@ -.. _IP/sort_lru_cache: +.. _IP/sort_LeastRecentlyUsed_Cache: -PoC.sort.lru_cache -################## +PoC.sort.LeastRecentlyUsed_Cache +################################ .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sort/sort_lru_cache.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sort/sort_LeastRecentlyUsed_Cache.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sort/sort_lru_cache_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sort/sort_LeastRecentlyUsed_Cache_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` -This is an optimized implementation of ``sort_lru_list`` to be used for caches. +This is an optimized implementation of ``sort_LeastRecentlyUsed_List`` to be used for caches. Only keys are stored within this list, and these keys are the index of the cache lines. The list initially contains all indizes from 0 to ELEMENTS-1. The least-recently used index ``KeyOut`` is always valid. @@ -39,7 +39,7 @@ Supported operations: .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/sort/sort_lru_cache.vhdl +.. literalinclude:: ../../../src/sort/sort_LeastRecentlyUsed_Cache.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -49,4 +49,4 @@ Supported operations: .. only:: latex - Source file: :pocsrc:`sort/sort_lru_cache.vhdl ` + Source file: :pocsrc:`sort/sort_LeastRecentlyUsed_Cache.vhdl ` diff --git a/docs/IPCores/sort/sort_lru_list.rst b/docs/IPCores/sort/sort_LeastRecentlyUsed_List.rst similarity index 63% rename from docs/IPCores/sort/sort_lru_list.rst rename to docs/IPCores/sort/sort_LeastRecentlyUsed_List.rst index 765706784..c2f2d746c 100644 --- a/docs/IPCores/sort/sort_lru_list.rst +++ b/docs/IPCores/sort/sort_LeastRecentlyUsed_List.rst @@ -1,23 +1,23 @@ -.. _IP/sort_lru_list: +.. _IP/sort_LeastRecentlyUsed_List: -PoC.sort.lru_list -################# +PoC.sort.LeastRecentlyUsed_List +############################### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sort/sort_lru_list.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sort/sort_LeastRecentlyUsed_List.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sort/sort_lru_list_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sort/sort_LeastRecentlyUsed_List_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` List storing ``(key, value)`` pairs. The least-recently inserted pair is outputed on ``DataOut`` if ``Valid = '1'``. If ``Valid = '0'``, then the list @@ -37,7 +37,7 @@ Supported operations: .. rubric:: Entity Declaration: -.. literalinclude:: ../../../src/sort/sort_lru_list.vhdl +.. literalinclude:: ../../../src/sort/sort_LeastRecentlyUsed_List.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -47,4 +47,4 @@ Supported operations: .. only:: latex - Source file: :pocsrc:`sort/sort_lru_list.vhdl ` + Source file: :pocsrc:`sort/sort_LeastRecentlyUsed_List.vhdl ` diff --git a/docs/IPCores/sort/sortnet/sortnet.pkg.rst b/docs/IPCores/sort/sortnet/sortnet.pkg.rst index 5b43bde55..e994cc359 100644 --- a/docs/IPCores/sort/sortnet/sortnet.pkg.rst +++ b/docs/IPCores/sort/sortnet/sortnet.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sort/sortnet/sortnet.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sort/sortnet/sortnet.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sort/sortnet/sortnet_BitonicSort.rst b/docs/IPCores/sort/sortnet/sortnet_BitonicSort.rst index d53e71343..6643cdbf0 100644 --- a/docs/IPCores/sort/sortnet/sortnet_BitonicSort.rst +++ b/docs/IPCores/sort/sortnet/sortnet_BitonicSort.rst @@ -7,11 +7,11 @@ PoC.sort.sortnet.BitonicSort .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sort/sortnet/sortnet_BitonicSort.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sort/sortnet/sortnet_BitonicSort.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sort/sortnet/sortnet_BitonicSort_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sort/sortnet/sortnet_BitonicSort_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sort/sortnet/sortnet_MergeSort_Streamed.rst b/docs/IPCores/sort/sortnet/sortnet_MergeSort_Streamed.rst index bb509e05b..e65621a24 100644 --- a/docs/IPCores/sort/sortnet/sortnet_MergeSort_Streamed.rst +++ b/docs/IPCores/sort/sortnet/sortnet_MergeSort_Streamed.rst @@ -7,11 +7,11 @@ PoC.sort.sortnet.MergeSort_Streamed .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sort/sortnet/sortnet_MergeSort_Streamed.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sort/sortnet/sortnet_MergeSort_Streamed.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sort/sortnet/sortnet_MergeSort_Streamed_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sort/sortnet/sortnet_MergeSort_Streamed_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sort/sortnet/sortnet_OddEvenMergeSort.rst b/docs/IPCores/sort/sortnet/sortnet_OddEvenMergeSort.rst index 468c14060..289a1c904 100644 --- a/docs/IPCores/sort/sortnet/sortnet_OddEvenMergeSort.rst +++ b/docs/IPCores/sort/sortnet/sortnet_OddEvenMergeSort.rst @@ -7,11 +7,11 @@ PoC.sort.sortnet.OddEvenMergeSort .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sort/sortnet/sortnet_OddEvenMergeSort.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sort/sortnet/sortnet_OddEvenMergeSort.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sort/sortnet/sortnet_OddEvenMergeSort_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sort/sortnet/sortnet_OddEvenMergeSort_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sort/sortnet/sortnet_OddEvenSort.rst b/docs/IPCores/sort/sortnet/sortnet_OddEvenSort.rst index c33fffd0d..96c7392ab 100644 --- a/docs/IPCores/sort/sortnet/sortnet_OddEvenSort.rst +++ b/docs/IPCores/sort/sortnet/sortnet_OddEvenSort.rst @@ -7,11 +7,11 @@ PoC.sort.sortnet.OddEvenSort .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sort/sortnet/sortnet_OddEvenSort.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sort/sortnet/sortnet_OddEvenSort.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sort/sortnet/sortnet_OddEvenSort_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sort/sortnet/sortnet_OddEvenSort_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sort/sortnet/sortnet_Stream_Adapter.rst b/docs/IPCores/sort/sortnet/sortnet_Stream_Adapter.rst index 6e9278ae9..fd6aa7a15 100644 --- a/docs/IPCores/sort/sortnet/sortnet_Stream_Adapter.rst +++ b/docs/IPCores/sort/sortnet/sortnet_Stream_Adapter.rst @@ -7,11 +7,11 @@ PoC.sort.sortnet.Stream_Adapter .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sort/sortnet/sortnet_Stream_Adapter.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sort/sortnet/sortnet_Stream_Adapter.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sort/sortnet/sortnet_Stream_Adapter_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sort/sortnet/sortnet_Stream_Adapter_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sort/sortnet/sortnet_Stream_Adapter2.rst b/docs/IPCores/sort/sortnet/sortnet_Stream_Adapter2.rst index 26c1b1d0f..6761a9338 100644 --- a/docs/IPCores/sort/sortnet/sortnet_Stream_Adapter2.rst +++ b/docs/IPCores/sort/sortnet/sortnet_Stream_Adapter2.rst @@ -7,11 +7,11 @@ PoC.sort.sortnet.Stream_Adapter2 .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sort/sortnet/sortnet_Stream_Adapter2.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sort/sortnet/sortnet_Stream_Adapter2.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sort/sortnet/sortnet_Stream_Adapter2_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sort/sortnet/sortnet_Stream_Adapter2_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sort/sortnet/sortnet_Transform.rst b/docs/IPCores/sort/sortnet/sortnet_Transform.rst index 0abe6e479..8f6739e82 100644 --- a/docs/IPCores/sort/sortnet/sortnet_Transform.rst +++ b/docs/IPCores/sort/sortnet/sortnet_Transform.rst @@ -7,11 +7,11 @@ PoC.sort.sortnet.Transform .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sort/sortnet/sortnet_Transform.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sort/sortnet/sortnet_Transform.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sort/sortnet/sortnet_Transform_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sort/sortnet/sortnet_Transform_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sync/index.rst b/docs/IPCores/sync/index.rst index f4b4ffad4..a9108e7b8 100644 --- a/docs/IPCores/sync/index.rst +++ b/docs/IPCores/sync/index.rst @@ -7,7 +7,7 @@ The namespace ``PoC.sync`` offers different clock-domain-crossing (CDC) synchronizer circuits. All synchronizers are based on the basic 2 flip-flop synchonizer called :ref:`sync_Bits `. PoC has two platform specific implementations for Altera and Xilinx, which are choosen, -if the appropriate ``MY_DEVICE`` constant is configured in ``my_config.vhdl``. +if the appropriate ``MY_DEVICE`` constant is configured in ``project_configuration.vhdl``. **Decision Table:** diff --git a/docs/IPCores/sync/sync.pkg.rst b/docs/IPCores/sync/sync.pkg.rst index 994fc861d..39be98b8c 100644 --- a/docs/IPCores/sync/sync.pkg.rst +++ b/docs/IPCores/sync/sync.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sync/sync.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sync/sync.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sync/sync_Bits.rst b/docs/IPCores/sync/sync_Bits.rst index b9b951201..a7db61721 100644 --- a/docs/IPCores/sync/sync_Bits.rst +++ b/docs/IPCores/sync/sync_Bits.rst @@ -7,11 +7,11 @@ PoC.sync.Bits .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sync/sync_Bits.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sync/sync_Bits.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sync/sync_Bits_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sync/sync_Bits_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sync/sync_Command.rst b/docs/IPCores/sync/sync_Command.rst index c83359b7e..649a66653 100644 --- a/docs/IPCores/sync/sync_Command.rst +++ b/docs/IPCores/sync/sync_Command.rst @@ -7,11 +7,11 @@ PoC.sync.Command .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sync/sync_Command.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sync/sync_Command.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sync/sync_Command_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sync/sync_Command_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sync/sync_Pulse.rst b/docs/IPCores/sync/sync_Pulse.rst index 7dcd0fc56..68aa9339c 100644 --- a/docs/IPCores/sync/sync_Pulse.rst +++ b/docs/IPCores/sync/sync_Pulse.rst @@ -7,11 +7,11 @@ PoC.sync.Pulse .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sync/sync_Pulse.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sync/sync_Pulse.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sync/sync_Pulse_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sync/sync_Pulse_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sync/sync_Reset.rst b/docs/IPCores/sync/sync_Reset.rst index 8fceeff98..4c9f3249d 100644 --- a/docs/IPCores/sync/sync_Reset.rst +++ b/docs/IPCores/sync/sync_Reset.rst @@ -7,11 +7,11 @@ PoC.sync.Reset .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sync/sync_Reset.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sync/sync_Reset.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sync/sync_Reset_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sync/sync_Reset_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sync/sync_Strobe.rst b/docs/IPCores/sync/sync_Strobe.rst index 42d1448d0..96534d297 100644 --- a/docs/IPCores/sync/sync_Strobe.rst +++ b/docs/IPCores/sync/sync_Strobe.rst @@ -7,11 +7,11 @@ PoC.sync.Strobe .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sync/sync_Strobe.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sync/sync_Strobe.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sync/sync_Strobe_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sync/sync_Strobe_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/sync/sync_Vector.rst b/docs/IPCores/sync/sync_Vector.rst index c858c4737..bc7d5c839 100644 --- a/docs/IPCores/sync/sync_Vector.rst +++ b/docs/IPCores/sync/sync_Vector.rst @@ -7,11 +7,11 @@ PoC.sync.Vector .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/sync/sync_Vector.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/sync/sync_Vector.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/sync/sync_Vector_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/sync/sync_Vector_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/xil/reconfig/index.rst b/docs/IPCores/xil/reconfig/index.rst index 659d6b18e..fe0069b75 100644 --- a/docs/IPCores/xil/reconfig/index.rst +++ b/docs/IPCores/xil/reconfig/index.rst @@ -7,11 +7,11 @@ These are reconfig entities.... **Entities** - * :ref:`IP/reconfig_icap_fsm` - * :ref:`IP/reconfig_icap_wrapper` + * :ref:`IP/reconfig_ICAP_FSM` + * :ref:`IP/reconfig_ICAP_Wrapper` .. toctree:: :hidden: - reconfig_icap_fsm - reconfig_icap_wrapper + reconfig_ICAP_FSM + reconfig_ICAP_Wrapper diff --git a/docs/IPCores/xil/reconfig/reconfig_icap_fsm.rst b/docs/IPCores/xil/reconfig/reconfig_ICAP_FSM.rst similarity index 51% rename from docs/IPCores/xil/reconfig/reconfig_icap_fsm.rst rename to docs/IPCores/xil/reconfig/reconfig_ICAP_FSM.rst index f063e7c03..85515f050 100644 --- a/docs/IPCores/xil/reconfig/reconfig_icap_fsm.rst +++ b/docs/IPCores/xil/reconfig/reconfig_ICAP_FSM.rst @@ -1,23 +1,23 @@ -.. _IP/reconfig_icap_fsm: +.. _IP/reconfig_ICAP_FSM: -PoC.xil.reconfig.icap_fsm +PoC.xil.reconfig.ICAP_FSM ######################### .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/xil/reconfig/reconfig_icap_fsm.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/xil/reconfig/reconfig_ICAP_FSM.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/xil/reconfig/reconfig_icap_fsm_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/xil/reconfig/reconfig_ICAP_FSM_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` This module parses the data stream to the Xilinx "Internal Configuration Access Port" (ICAP) primitives to generate control signals. Tested on: @@ -29,7 +29,7 @@ primitives to generate control signals. Tested on: .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/xil/reconfig/reconfig_icap_fsm.vhdl +.. literalinclude:: ../../../../src/xil/reconfig/reconfig_ICAP_FSM.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -39,4 +39,4 @@ primitives to generate control signals. Tested on: .. only:: latex - Source file: :pocsrc:`xil/reconfig/reconfig_icap_fsm.vhdl ` + Source file: :pocsrc:`xil/reconfig/reconfig_ICAP_FSM.vhdl ` diff --git a/docs/IPCores/xil/reconfig/reconfig_icap_wrapper.rst b/docs/IPCores/xil/reconfig/reconfig_ICAP_Wrapper.rst similarity index 51% rename from docs/IPCores/xil/reconfig/reconfig_icap_wrapper.rst rename to docs/IPCores/xil/reconfig/reconfig_ICAP_Wrapper.rst index 8a22b5dd1..7ae5078d7 100644 --- a/docs/IPCores/xil/reconfig/reconfig_icap_wrapper.rst +++ b/docs/IPCores/xil/reconfig/reconfig_ICAP_Wrapper.rst @@ -1,23 +1,23 @@ -.. _IP/reconfig_icap_wrapper: +.. _IP/reconfig_ICAP_Wrapper: -PoC.xil.reconfig.icap_wrapper +PoC.xil.reconfig.ICAP_Wrapper ############################# .. only:: html .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/xil/reconfig/reconfig_icap_wrapper.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/xil/reconfig/reconfig_ICAP_Wrapper.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/xil/reconfig/reconfig_icap_wrapper_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/xil/reconfig/reconfig_ICAP_Wrapper_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links - * |gh-src| :pocsrc:`Sourcecode ` - * |gh-tb| :poctb:`Testbench ` + * |gh-src| :pocsrc:`Sourcecode ` + * |gh-tb| :poctb:`Testbench ` This module was designed to connect the Xilinx "Internal Configuration Access Port" (ICAP) to a PCIe endpoint on a Dini board. Tested on: @@ -28,7 +28,7 @@ tbd .. rubric:: Entity Declaration: -.. literalinclude:: ../../../../src/xil/reconfig/reconfig_icap_wrapper.vhdl +.. literalinclude:: ../../../../src/xil/reconfig/reconfig_ICAP_Wrapper.vhdl :language: vhdl :tab-width: 2 :linenos: @@ -38,4 +38,4 @@ tbd .. only:: latex - Source file: :pocsrc:`xil/reconfig/reconfig_icap_wrapper.vhdl ` + Source file: :pocsrc:`xil/reconfig/reconfig_ICAP_Wrapper.vhdl ` diff --git a/docs/IPCores/xil/xil.pkg.rst b/docs/IPCores/xil/xil.pkg.rst index d2e794084..c6d988dcf 100644 --- a/docs/IPCores/xil/xil.pkg.rst +++ b/docs/IPCores/xil/xil.pkg.rst @@ -2,7 +2,7 @@ .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/xil/xil.pkg.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/xil/xil.pkg.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/xil/xil_BSCAN.rst b/docs/IPCores/xil/xil_BSCAN.rst index 33e316b13..e6797c0c8 100644 --- a/docs/IPCores/xil/xil_BSCAN.rst +++ b/docs/IPCores/xil/xil_BSCAN.rst @@ -7,11 +7,11 @@ PoC.xil.BSCAN .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/xil/xil_BSCAN.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/xil/xil_BSCAN.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/xil/xil_BSCAN_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/xil/xil_BSCAN_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/xil/xil_DRP_BusMux.rst b/docs/IPCores/xil/xil_DRP_BusMux.rst index c05d89f00..697fab255 100644 --- a/docs/IPCores/xil/xil_DRP_BusMux.rst +++ b/docs/IPCores/xil/xil_DRP_BusMux.rst @@ -7,11 +7,11 @@ PoC.xil.DRP_BusMux .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/xil/xil_DRP_BusMux.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/xil/xil_DRP_BusMux.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/xil/xil_DRP_BusMux_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/xil/xil_DRP_BusMux_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/xil/xil_DRP_BusSync.rst b/docs/IPCores/xil/xil_DRP_BusSync.rst index fb494b452..c5196a827 100644 --- a/docs/IPCores/xil/xil_DRP_BusSync.rst +++ b/docs/IPCores/xil/xil_DRP_BusSync.rst @@ -7,11 +7,11 @@ PoC.xil.DRP_BusSync .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/xil/xil_DRP_BusSync.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/xil/xil_DRP_BusSync.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/xil/xil_DRP_BusSync_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/xil/xil_DRP_BusSync_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/xil/xil_ICAP.rst b/docs/IPCores/xil/xil_ICAP.rst index 75cacfe48..3c5af976a 100644 --- a/docs/IPCores/xil/xil_ICAP.rst +++ b/docs/IPCores/xil/xil_ICAP.rst @@ -7,11 +7,11 @@ PoC.xil.ICAP .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/xil/xil_ICAP.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/xil/xil_ICAP.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/xil/xil_ICAP_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/xil/xil_ICAP_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/xil/xil_Reconfigurator.rst b/docs/IPCores/xil/xil_Reconfigurator.rst index 7c18df31b..cd0eaadac 100644 --- a/docs/IPCores/xil/xil_Reconfigurator.rst +++ b/docs/IPCores/xil/xil_Reconfigurator.rst @@ -7,11 +7,11 @@ PoC.xil.Reconfigurator .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/src/xil/xil_Reconfigurator.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/xil/xil_Reconfigurator.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/blob/master/tb/xil/xil_Reconfigurator_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/xil/xil_Reconfigurator_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/IPCores/xil/xil_SystemMonitor.rst b/docs/IPCores/xil/xil_SystemMonitor.rst index 1aabc349b..a32de49d4 100644 --- a/docs/IPCores/xil/xil_SystemMonitor.rst +++ b/docs/IPCores/xil/xil_SystemMonitor.rst @@ -7,11 +7,11 @@ PoC.xil.SystemMonitor .. |gh-src| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/src/xil/xil_SystemMonitor.vhdl + :target: https://github.com/VHDL/PoC/blob/main/src/xil/xil_SystemMonitor.vhdl :alt: Source Code on GitHub .. |gh-tb| image:: /_static/logos/GitHub-Mark-32px.png :scale: 40 - :target: https://github.com/VHDL/PoC/blob/master/tb/xil/xil_SystemMonitor_tb.vhdl + :target: https://github.com/VHDL/PoC/blob/main/tb/xil/xil_SystemMonitor_tb.vhdl :alt: Source Code on GitHub .. sidebar:: GitHub Links diff --git a/docs/QuickStart.rst b/docs/QuickStart.rst index 5db085bf5..fcee4489f 100644 --- a/docs/QuickStart.rst +++ b/docs/QuickStart.rst @@ -180,7 +180,7 @@ following command lines will start the configuration process: .\lib\PoC\poc.ps1 configure -.. rubric:: 3. Creating PoC's ``my_config.vhdl`` and ``my_project.vhdl`` Files +.. rubric:: 3. Creating PoC's ``project_configuration.vhdl`` and ``local_configuration.vhdl`` Files The PoC-Library needs two VHDL files for its configuration. These files are used to determine the most suitable implementation depending on the provided @@ -191,26 +191,25 @@ in the files: .. code-block:: PowerShell cd ProjectRoot - cp lib\PoC\src\common\my_config.vhdl.template src\common\my_config.vhdl - cp lib\PoC\src\common\my_project.vhdl.template src\common\my_project.vhdl + cp lib\PoC\src\common\project_configuration.vhdl.template src\common\project_configuration.vhdl + cp lib\PoC\src\common\local_configuration.vhdl.template src\common\local_configuration.vhdl -`my_config.vhdl `_ defines two global constants, which need to be adjusted: +`project_configuration.vhdl `_ defines two global constants, which need to be adjusted: .. code-block:: vhdl constant MY_BOARD : string := "CHANGE THIS"; -- e.g. Custom, ML505, KC705, Atlys constant MY_DEVICE : string := "CHANGE THIS"; -- e.g. None, XC5VLX50T-1FF1136, EP2SGX90FF1508C3 -`my_project.vhdl `_ +`local_configuration.vhdl `_ also defines two global constants, which need to be adjusted: .. code-block:: vhdl - constant MY_PROJECT_DIR : string := "CHANGE THIS"; -- e.g. d:/vhdl/myproject/, /home/me/projects/myproject/" - constant MY_OPERATING_SYSTEM : string := "CHANGE THIS"; -- e.g. WINDOWS, LINUX + constant LOCAL_PROJECT_DIR : string := "CHANGE THIS"; -- e.g. d:/vhdl/myproject/, /home/me/projects/myproject/" Further informations are provided at -:doc:`Creating my_config/my_project.vhdl `. +:doc:`Creating project_configuration/local_configuration.vhdl `. .. rubric:: 4. Adding PoC's Common Packages to a Synthesis or Simulation Project @@ -242,8 +241,8 @@ Run a Simulation **************** The following quick example uses the GHDL Simulator to analyze, elaborate and -simulate a testbench for the module ``arith_prng`` (Pseudo Random Number -Generator - PRNG). The VHDL file ``arith_prng.vhdl`` is located at +simulate a testbench for the module ``arith_PRNG`` (Pseudo Random Number +Generator - PRNG). The VHDL file ``arith_PRNG.vhdl`` is located at ``PoCRoot\src\arith`` and virtually a member in the `PoC.arith` namespace. So the module can be identified by an unique name: ``PoC.arith.prng``, which is passed to the frontend script. @@ -261,8 +260,8 @@ to the tool. All required source file are gathered and compiled to an executable. Afterwards this executable is launched in CLI mode and its outputs are displayed in console: -.. image:: /_static/images/ghdl/arith_prng_tb.posh.png - :target: /_static/images/ghdl/arith_prng_tb.posh.png +.. image:: /_static/images/ghdl/arith_PRNG_tb.posh.png + :target: /_static/images/ghdl/arith_PRNG_tb.posh.png :alt: PowerShell console output after running PoC.arith.prng with GHDL. Each testbench uses PoC's simulation helper packages to count asserts and to @@ -280,8 +279,8 @@ Run a Synthesis *************** The following quick example uses the Xilinx Systesis Tool (XST) to synthesize a -netlist for IP core ``arith_prng`` (Pseudo Random Number Generator - PRNG). The -VHDL file ``arith_prng.vhdl`` is located at ``PoCRoot\src\arith`` and virtually +netlist for IP core ``arith_PRNG`` (Pseudo Random Number Generator - PRNG). The +VHDL file ``arith_PRNG.vhdl`` is located at ``PoCRoot\src\arith`` and virtually a member in the `PoC.arith` namespace. So the module can be identified by an unique name: ``PoC.arith.prng``, which is passed to the frontend script. @@ -295,11 +294,11 @@ unique name: ``PoC.arith.prng``, which is passed to the frontend script. The CLI command ``xst`` chooses *Xilinx Synthesis Tool* as the synthesizer and passes the fully qualified PoC entity name ``PoC.arith.prng`` as a parameter to the tool. Additionally, the development board name is required to load the -correct ``my_config.vhdl`` file. All required source file are gathered and +correct ``project_configuration.vhdl`` file. All required source file are gathered and synthesized to a netlist. -.. image:: /_static/images/xst/arith_prng.posh.png - :target: /_static/images/xst/arith_prng.posh.png +.. image:: /_static/images/xst/arith_PRNG.posh.png + :target: /_static/images/xst/arith_PRNG.posh.png :alt: PowerShell console output after running PoC.arith.prng with XST. diff --git a/docs/References/Database.rst b/docs/References/Database.rst index 6b55de120..6f92b9bff 100644 --- a/docs/References/Database.rst +++ b/docs/References/Database.rst @@ -107,7 +107,7 @@ context. bus = Namespace [PoC.arith] - addw = Entity + Adder_Wide = Entity prng = Entity [PoC.bus] diff --git a/docs/References/FileFormats/RulesFormat.rst b/docs/References/FileFormats/RulesFormat.rst index 0c0c910ca..4ce59cb21 100644 --- a/docs/References/FileFormats/RulesFormat.rst +++ b/docs/References/FileFormats/RulesFormat.rst @@ -7,7 +7,7 @@ Headline 1 -********************** +********** Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor @@ -16,7 +16,7 @@ accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea taki Headline 2 -********************** +********** Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor @@ -25,7 +25,7 @@ accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea taki Headline 3 -******************* +********** Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor diff --git a/docs/References/NamingConventions.rst b/docs/References/NamingConventions.rst index cf6a715ca..ad1b3075a 100644 --- a/docs/References/NamingConventions.rst +++ b/docs/References/NamingConventions.rst @@ -26,8 +26,8 @@ also referred to as ``PoCRoot``. like \*.xco files from Xilinx Core Generator. Generated IP cores are stored in device sub-directories, because most netlists formats are device specific. For example the IP core ``PoC.arith.prng`` created from source file - ``src\arith\arith_prng.vhdl`` generated for a Kintex-7 325T mounted on a - KC705 board will be copied to ``netlist\XC7K325T-2FFG900\arith\arith_prng.ngc`` + ``src\arith\arith_PRNG.vhdl`` generated for a Kintex-7 325T mounted on a + KC705 board will be copied to ``netlist\XC7K325T-2FFG900\arith\arith_PRNG.ngc`` if Xilinx ISE XST is used for synthesis. * ``py`` The supporting Python infrastructure, the configuration files and the IP @@ -152,19 +152,19 @@ Other implementation variants are: +============================+===============================================+ | Fully Qualified Name | PoC.mem.ocram.tdp | +----------------------------+-----------------------------------------------+ -| VHDL entity name | ocram_tdp | +| VHDL entity name | ocram_TrueDualPort | +----------------------------+-----------------------------------------------+ -| File name | ocram_tdp.vhdl | +| File name | ocram_TrueDualPort.vhdl | +----------------------------+-----------------------------------------------+ -| IP Core Description File | \\src\\mem\\ocram\\ocram_tdp.files | +| IP Core Description File | \\src\\mem\\ocram\\ocram_TrueDualPort.files | +----------------------------+-----------------------------------------------+ -| Source File Location | \\src\\mem\\ocram\\ocram_tdp.vhdl | +| Source File Location | \\src\\mem\\ocram\\ocram_TrueDualPort.vhdl | +----------------------------+-----------------------------------------------+ -| Testbench Location | \\tb\\mem\\ocram\\ocram_tdp_tb.vhdl | +| Testbench Location | \\tb\\mem\\ocram\\ocram_TrueDualPort_tb.vhdl | +----------------------------+-----------------------------------------------+ -| Testbench Description File | \\tb\\mem\\ocram\\ocram_tdp_tb.files | +| Testbench Description File | \\tb\\mem\\ocram\\ocram_TrueDualPort_tb.files | +----------------------------+-----------------------------------------------+ -| Waveform Description Files | \\sim\\mem\\ocram\\ocram_tdp_tb.* | +| Waveform Description Files | \\sim\\mem\\ocram\\ocram_TrueDualPort_tb.* | +----------------------------+-----------------------------------------------+ diff --git a/docs/UsingPoC/Download.rst b/docs/UsingPoC/Download.rst index aba43760c..d7cd26586 100644 --- a/docs/UsingPoC/Download.rst +++ b/docs/UsingPoC/Download.rst @@ -17,11 +17,11 @@ table, to choose your desired git branch. .. |zip-master| image:: /_static/icons/ZIP.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/archive/master.zip + :target: https://github.com/VHDL/PoC/archive/main.zip :alt: Source Code from GitHub - 'master' branch. .. |zip-release| image:: /_static/icons/ZIP.png :scale: 40 - :target: https://github.com/VLSI-EDA/PoC/archive/release.zip + :target: https://github.com/VHDL/PoC/archive/release.zip :alt: Source Code from GitHub - 'release' branch. +----------+------------------------+ @@ -49,7 +49,7 @@ instructions or on other pages in this documentation. +----------+----------------------------------------+ | Protocol | GitHub Repository URL | +==========+========================================+ -| HTTPS | https://github.com/VLSI-EDA/PoC.git | +| HTTPS | https://github.com/VHDL/PoC.git | +----------+----------------------------------------+ | SSH | ssh://git@github.com:VLSI-EDA/PoC.git | +----------+----------------------------------------+ @@ -64,7 +64,7 @@ HTTPS protocol: .. code-block:: Bash cd GitRoot - git clone --recursive "https://github.com/VLSI-EDA/PoC.git" PoC + git clone --recursive "https://github.com/VHDL/PoC.git" PoC cd PoC git remote rename origin github @@ -102,7 +102,7 @@ HTTPS protocol: .. code-block:: PowerShell cd GitRoot - git clone --recursive "https://github.com/VLSI-EDA/PoC.git" PoC + git clone --recursive "https://github.com/VHDL/PoC.git" PoC cd PoC git remote rename origin github @@ -146,7 +146,7 @@ HTTPS protocol: cd ProjectRoot mkdir lib - git submodule add "https://github.com/VLSI-EDA/PoC.git" lib/PoC + git submodule add "https://github.com/VHDL/PoC.git" lib/PoC cd lib/PoC git remote rename origin github cd ../.. @@ -192,7 +192,7 @@ HTTPS protocol: cd mkdir lib | cd - git submodule add "https://github.com/VLSI-EDA/PoC.git" PoC + git submodule add "https://github.com/VHDL/PoC.git" PoC cd PoC git remote rename origin github cd ..\.. diff --git a/docs/UsingPoC/Integration.rst b/docs/UsingPoC/Integration.rst index 360eaed35..bd4077576 100644 --- a/docs/UsingPoC/Integration.rst +++ b/docs/UsingPoC/Integration.rst @@ -26,7 +26,7 @@ On Linux cd ProjectRoot mkdir lib cd lib - git submodule add https://github.com/VLSI-EDA/PoC.git PoC + git submodule add https://github.com/VHDL/PoC.git PoC cd PoC git remote rename origin github cd ../.. @@ -54,7 +54,7 @@ On Windows cd ProjectRoot mkdir lib | cd - git submodule add https://github.com/VLSI-EDA/PoC.git PoC + git submodule add https://github.com/VHDL/PoC.git PoC cd PoC git remote rename origin github cd ..\.. @@ -70,18 +70,18 @@ On Windows .. # - ## 3. Creating PoC's my_config and my_project Files + ## 3. Creating PoC's project_configuration and local_configuration Files The PoC-Library needs two VHDL files for it's configuration. These files are used to determine the most suitable implementation depending on the provided platform information. - 1. The **my_config** file can easily be created from a template file provided by - PoC in `\src\common\my_config.vhdl.template`. + 1. The **project_configuration** file can easily be created from a template file provided by + PoC in `\src\common\project_configuration.vhdl.template`. The file should to be copyed into a projects source directory and rename into - `my_config.vhdl`. This file should be included into version control systems - and shared with other systems. my_config.vhdl defines two global constants, + `project_configuration.vhdl`. This file should be included into version control systems + and shared with other systems. project_configuration.vhdl defines two global constants, which need to be adjusted: ```VHDL @@ -90,7 +90,7 @@ On Windows ``` - Source file: `common/my_config.vhdl.template `_ + Source file: `common/project_configuration.vhdl.template `_ The easiest way is to define a board name and set `MY_DEVICE` to `None`. So @@ -112,31 +112,28 @@ On Windows constant MY_DEVICE : string := "XC6SLX45-3CSG324"; ``` - 2. The **my_project** file can also be created from a template provided by PoC - in `\src\common\my_project.vhdl.template`. + 2. The **local_configuration** file can also be created from a template provided by PoC + in `\src\common\local_configuration.vhdl.template`. The file should to be copyed into a projects source directory and rename into - `my_project.vhdl`. This file **must not** be included into version control - systems - it's private to a host computer. my_project.vhdl defines two global + `local_configuration.vhdl`. This file **must not** be included into version control + systems - it's private to a host computer. local_configuration.vhdl defines two global constants, which need to be adjusted: ```VHDL - constant MY_PROJECT_DIR : string := "CHANGE THIS"; -- e.g. "d:/vhdl/myproject/", "/home/me/projects/myproject/" - constant MY_OPERATING_SYSTEM : string := "CHANGE THIS"; -- e.g. "WINDOWS", "LINUX" + constant LOCAL_PROJECT_DIR : string := "CHANGE THIS"; -- e.g. "d:/vhdl/myproject/", "/home/me/projects/myproject/" ``` ##### Example 1: A Windows System: ```VHDL - constant MY_PROJECT_DIR : string := "D:/git/GitHub/PoC/"; - constant MY_OPERATING_SYSTEM : string := "WINDOWS"; + constant LOCAL_PROJECT_DIR : string := "D:/git/GitHub/PoC/"; ``` ##### Example 2: A Debian System: ```VHDL - constant MY_PROJECT_DIR : string := "/home/lehmann/git/GitHub/PoC/"; - constant MY_OPERATING_SYSTEM : string := "LINUX"; + constant LOCAL_PROJECT_DIR : string := "/home/lehmann/git/GitHub/PoC/"; ``` ## 4. Compiling shipped Xilinx IP cores to Netlists diff --git a/docs/UsingPoC/Miscellaneous.rst b/docs/UsingPoC/Miscellaneous.rst index b73c3e76c..7fb9ca685 100644 --- a/docs/UsingPoC/Miscellaneous.rst +++ b/docs/UsingPoC/Miscellaneous.rst @@ -25,7 +25,7 @@ Git git config --global alias.tree 'log --decorate --pretty=oneline --abbrev-commit --date-order --graph' git config --global alias.tree 'log --decorate --pretty=oneline --abbrev-commit --date-order --graph --all' -Browse the `Git directory `_. +Browse the `Git directory `_. Notepad++ @@ -39,6 +39,6 @@ The following additional file types are supported: * PoC *.Rules Files (*.rules) * Xilinx User Constraint Files (*.ucf): ``Syntax Highlighting - Xilinx UCF`` -Browse the `Notepad++ directory `_. +Browse the `Notepad++ directory `_. diff --git a/docs/UsingPoC/PrecompilingVendorLibraries.rst b/docs/UsingPoC/PrecompilingVendorLibraries.rst index 54d930640..9ec070a28 100644 --- a/docs/UsingPoC/PrecompilingVendorLibraries.rst +++ b/docs/UsingPoC/PrecompilingVendorLibraries.rst @@ -65,7 +65,7 @@ The current set of pre-compile scripts support these simulators: .. _USING/PreCompile/Primitives: FPGA Vendor's Primitive Libraries -**************************************************************************************************************************************************************** +********************************* .. # =========================================================================================================================================================== .. index:: @@ -363,7 +363,7 @@ On Windows .. _USING/PreCompile/ThirdParty: Third-Party Libraries -**************************************************************************************************************************************************************** +********************* .. # =========================================================================================================================================================== .. index:: @@ -612,7 +612,7 @@ On Windows .. _USING/PreCompile/Adapter: Simulator Adapters -**************************************************************************************************************************************************************** +****************** .. index:: pair: Pre-compilation; Cocotb diff --git a/docs/UsingPoC/Requirements.rst b/docs/UsingPoC/Requirements.rst index b2a9b58da..cfd493ba8 100644 --- a/docs/UsingPoC/Requirements.rst +++ b/docs/UsingPoC/Requirements.rst @@ -23,7 +23,7 @@ Programming Languages and Runtime Environments: * `colorama `_ * `py-flags `_ - All Python requirements are listed in `requirements.txt `_ and can be installed via: |br| + All Python requirements are listed in `requirements.txt `_ and can be installed via: |br| ``sudo python3.5 -m pip install -r requirements.txt`` Synthesis tool chains: * Altera Quartus Prime |geq| 15.1 or diff --git a/docs/UsingPoC/Simulation.rst b/docs/UsingPoC/Simulation.rst index 4f780b4c8..4022dd260 100644 --- a/docs/UsingPoC/Simulation.rst +++ b/docs/UsingPoC/Simulation.rst @@ -43,8 +43,8 @@ Quick Example ************* The following quick example uses the GHDL Simulator to analyze, elaborate and -simulate a testbench for the module ``arith_prng`` (Pseudo Random Number -Generator - PRNG). The VHDL file ``arith_prng.vhdl`` is located at +simulate a testbench for the module ``arith_PRNG`` (Pseudo Random Number +Generator - PRNG). The VHDL file ``arith_PRNG.vhdl`` is located at ``PoCRoot\src\arith`` and virtually a member in the `PoC.arith` namespace. So the module can be identified by an unique name: ``PoC.arith.prng``, which is passed to the frontend script. @@ -62,8 +62,8 @@ to the tool. All required source file are gathered and compiled to an executable. Afterwards this executable is launched in CLI mode and it's outputs are displayed in console: -.. image:: /_static/images/ghdl/arith_prng_tb.posh.png - :target: /_static/images/ghdl/arith_prng_tb.posh.png +.. image:: /_static/images/ghdl/arith_PRNG_tb.posh.png + :target: /_static/images/ghdl/arith_PRNG_tb.posh.png :alt: PowerShell console output after running PoC.arith.prng with GHDL. Each testbench uses PoC's simulation helper packages to count asserts and to @@ -86,8 +86,8 @@ file for GTKWave), then it is preloaded into the simulator's waveform viewer. The opened waveform viewer and displayed waveform should look like this: -.. image:: /_static/images/gtkwave/arith_prng_tb.png - :target: /_static/images/gtkwave/arith_prng_tb.png +.. image:: /_static/images/gtkwave/arith_PRNG_tb.png + :target: /_static/images/gtkwave/arith_PRNG_tb.png :alt: GTKWave waveform view of PoC.arith.prng. @@ -365,11 +365,11 @@ current namespace and all sub-namespaces. +--------------------------------------+-----------------------------------------------------------------------------------+ | PoC entity list | Description | +======================================+===================================================================================+ -| PoC.arith.prng | A single PoC entity: ``arith_prng`` | +| PoC.arith.prng | A single PoC entity: ``arith_PRNG`` | +--------------------------------------+-----------------------------------------------------------------------------------+ | PoC.* | All entities in the whole library | +--------------------------------------+-----------------------------------------------------------------------------------+ -| PoC.io.ddrio.? | All entities in ``PoC.io.ddrio``: ``ddrio_in``, ``ddrio_inout``, ``ddrio_out`` | +| PoC.io.ddrio.? | All entities in ``PoC.io.ddrio``: ``ddrio_In``, ``ddrio_InOut``, ``ddrio_Out`` | +--------------------------------------+-----------------------------------------------------------------------------------+ | PoC.fifo.* PoC.cache.* PoC.dstruct.* | All FIFO, cache and data-structure testbenches. | +--------------------------------------+-----------------------------------------------------------------------------------+ diff --git a/docs/UsingPoC/Synthesis.rst b/docs/UsingPoC/Synthesis.rst index b68a448c2..72d5f3be9 100644 --- a/docs/UsingPoC/Synthesis.rst +++ b/docs/UsingPoC/Synthesis.rst @@ -48,8 +48,8 @@ Quick Example ************* The following quick example uses the Xilinx Systesis Tool (XST) to synthesize a -netlist for IP core ``arith_prng`` (Pseudo Random Number Generator - PRNG). The -VHDL file ``arith_prng.vhdl`` is located at ``PoCRoot\src\arith`` and +netlist for IP core ``arith_PRNG`` (Pseudo Random Number Generator - PRNG). The +VHDL file ``arith_PRNG.vhdl`` is located at ``PoCRoot\src\arith`` and virtually a member in the `PoC.arith` namespace. So the module can be identified by an unique name: ``PoC.arith.prng``, which is passed to the frontend script. @@ -63,11 +63,11 @@ by an unique name: ``PoC.arith.prng``, which is passed to the frontend script. The CLI command ``xst`` chooses *Xilinx Synthesis Tool* as the synthesizer and passes the fully qualified PoC entity name ``PoC.arith.prng`` as a parameter to the tool. Additionally, the development board name is required to load the -correct ``my_config.vhdl`` file. All required source file are gathered and +correct ``project_configuration.vhdl`` file. All required source file are gathered and synthesized to a netlist. -.. image:: /_static/images/xst/arith_prng.posh.png - :target: /_static/images/xst/arith_prng.posh.png +.. image:: /_static/images/xst/arith_PRNG.posh.png + :target: /_static/images/xst/arith_PRNG.posh.png :alt: PowerShell console output after running PoC.arith.prng with XST. diff --git a/docs/UsingPoC/VHDLConfiguration.rst b/docs/UsingPoC/VHDLConfiguration.rst index 17388fdfa..a1a686326 100644 --- a/docs/UsingPoC/VHDLConfiguration.rst +++ b/docs/UsingPoC/VHDLConfiguration.rst @@ -1,7 +1,7 @@ .. _USING/VHDLConf: -Creating my_config/my_project.vhdl -################################## +Creating project_configuration/local_configuration.vhdl +####################################################### The PoC-Library needs two VHDL files for its configuration. These files are used to determine the most suitable implementation depending on the provided @@ -11,17 +11,17 @@ arounds. .. _USING/VHDLConf/myconfig: -Create my_config.vhdl -********************* +Create project_configuration.vhdl +********************************* -The **my_config.vhdl** file can easily be created from the template file -``my_config.vhdl.template`` provided by PoC in ``PoCRoot\src\common``. -(View source on `GitHub `_.) +The **project_configuration.vhdl** file can easily be created from the template file +``project_configuration.vhdl.template`` provided by PoC in ``PoCRoot\src\common``. +(View source on `GitHub `_.) Copy this file into the project's source directory and rename it to -``my_config.vhdl``. +``project_configuration.vhdl``. This file should be included in version control systems and shared with other -systems. ``my_config.vhdl`` defines three global constants, which need to be +systems. ``project_configuration.vhdl`` defines three global constants, which need to be adjusted: .. code-block:: VHDL @@ -52,35 +52,32 @@ If the requested board is not known to PoC or it's custom made, then set .. _USING/VHDLConf/myproject: -Create my_project.vhdl -********************** +Create local_configuration.vhdl +******************************* -The **my_project.vhdl** file can also be created from a template file -``my_project.vhdl.template`` provided by PoC in ``PoCRoot\src\common``. +The **local_configuration.vhdl** file can also be created from a template file +``local_configuration.vhdl.template`` provided by PoC in ``PoCRoot\src\common``. The file should to be copyed into a projects source directory and renamed -into ``my_project.vhdl``. This file **must not** be included into version -control systems -- it's private to a computer. ``my_project.vhdl`` defines two +into ``local_configuration.vhdl``. This file **must not** be included into version +control systems -- it's private to a computer. ``local_configuration.vhdl`` defines two global constants, which need to be adjusted: .. code-block:: VHDL - constant MY_PROJECT_DIR : string := "CHANGE THIS"; -- e.g. "d:/vhdl/myproject/", "/home/me/projects/myproject/" - constant MY_OPERATING_SYSTEM : string := "CHANGE THIS"; -- e.g. "WINDOWS", "LINUX" + constant LOCAL_PROJECT_DIR : string := "CHANGE THIS"; -- e.g. "d:/vhdl/myproject/", "/home/me/projects/myproject/" **Example 1: A Windows System:** .. code-block:: VHDL - constant MY_PROJECT_DIR : string := "D:/git/GitHub/PoC/"; - constant MY_OPERATING_SYSTEM : string := "WINDOWS"; + constant LOCAL_PROJECT_DIR : string := "D:/git/GitHub/PoC/"; **Example 2: A Debian System:** .. code-block:: VHDL - constant MY_PROJECT_DIR : string := "/home/paebbels/git/GitHub/PoC/"; - constant MY_OPERATING_SYSTEM : string := "LINUX"; + constant LOCAL_PROJECT_DIR : string := "/home/paebbels/git/GitHub/PoC/"; .. seealso:: :doc:`Running one or more testbenches ` diff --git a/docs/WhatIsPoC/WhoUsesPoC.rst b/docs/WhatIsPoC/WhoUsesPoC.rst index fcf99b89c..d43c76f93 100644 --- a/docs/WhatIsPoC/WhoUsesPoC.rst +++ b/docs/WhatIsPoC/WhoUsesPoC.rst @@ -1,7 +1,7 @@ Who uses PoC? ############# -PoC has a related Git repository called `PoC-Examples `_ +PoC has a related Git repository called `PoC-Examples `_ on GitHub. This repository hosts a list of example and reference implementations of the PoC-Library. Additional to reading an IP cores documentation and viewing its characteristic stimulus waveform in a simulation, it can helper to diff --git a/docs/_static/images/ghdl/arith_prng_tb.posh.png b/docs/_static/images/ghdl/arith_PRNG_tb.posh.png similarity index 100% rename from docs/_static/images/ghdl/arith_prng_tb.posh.png rename to docs/_static/images/ghdl/arith_PRNG_tb.posh.png diff --git a/docs/_static/images/gtkwave/arith_prng_tb.png b/docs/_static/images/gtkwave/arith_PRNG_tb.png similarity index 100% rename from docs/_static/images/gtkwave/arith_prng_tb.png rename to docs/_static/images/gtkwave/arith_PRNG_tb.png diff --git a/docs/_static/images/xst/arith_prng.posh.png b/docs/_static/images/xst/arith_PRNG.posh.png similarity index 100% rename from docs/_static/images/xst/arith_prng.posh.png rename to docs/_static/images/xst/arith_PRNG.posh.png diff --git a/docs/conf.py b/docs/conf.py index 3a7cd8148..9765a19ec 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -268,13 +268,13 @@ def _LatestTagName(): "gh": (f"https://GitHub.com/%s", "gh:%s"), "ghissue": (f"https://GitHub.com/{githubNamespace}/{project}/issues/%s", "issue #%s"), "ghpull": (f"https://GitHub.com/{githubNamespace}/{project}/pull/%s", "pull request #%s"), - "ghsrc": (f"https://GitHub.com/{githubNamespace}/{project}/blob/master/%s", None), + "ghsrc": (f"https://GitHub.com/{githubNamespace}/{project}/blob/main/%s", None), "wiki": (f"https://en.wikipedia.org/wiki/%s", None), "pocissue": (f"https://github.com/{githubNamespace}/{project}/issues/%s", 'issue #%s'), # => replace by ghissue "pocpull": (f"https://github.com/{githubNamespace}/{project}/pull/%s", 'pull request #%s'), # => replace by ghpull - "pocsrc": (f"https://github.com/{githubNamespace}/{project}/blob/master/src/%s?ts=2", None), # => replace by ghsrc - "poctb": (f"https://github.com/{githubNamespace}/{project}/blob/master/tb/%s?ts=2", None) + "pocsrc": (f"https://github.com/{githubNamespace}/{project}/blob/main/src/%s?ts=2", None), # => replace by ghsrc + "poctb": (f"https://github.com/{githubNamespace}/{project}/blob/main/tb/%s?ts=2", None) } diff --git a/lib/OSVVM-AXI4 b/lib/OSVVM-AXI4 index 0c00f2a26..70b906124 160000 --- a/lib/OSVVM-AXI4 +++ b/lib/OSVVM-AXI4 @@ -1 +1 @@ -Subproject commit 0c00f2a26b6f03488d2f1e29196cdaad6d2746bb +Subproject commit 70b906124f3f369bead730e1ed60d5069fcb5c78 diff --git a/lib/OSVVM-Common b/lib/OSVVM-Common index cb4fc80da..b2ec7481e 160000 --- a/lib/OSVVM-Common +++ b/lib/OSVVM-Common @@ -1 +1 @@ -Subproject commit cb4fc80da5da1fb3a6761c58df2812173828c3c2 +Subproject commit b2ec7481e6744427d2f6ca5ba6cc8d1966a9aeba diff --git a/lib/OSVVM-Scripts b/lib/OSVVM-Scripts index e53eaf6c6..60a2751c1 160000 --- a/lib/OSVVM-Scripts +++ b/lib/OSVVM-Scripts @@ -1 +1 @@ -Subproject commit e53eaf6c61ae95b52c31d2f15b0362fd12702613 +Subproject commit 60a2751c1d2087e6e58671585d3649cd5eb0b93d diff --git a/lib/OSVVM-UART b/lib/OSVVM-UART index acc635a9f..f214a00ab 160000 --- a/lib/OSVVM-UART +++ b/lib/OSVVM-UART @@ -1 +1 @@ -Subproject commit acc635a9f8dbc9ac8fb65b38d87cfb5d68d16e91 +Subproject commit f214a00ab65c45e9c351a73ee7d5c796430329ce diff --git a/lib/osvvm b/lib/osvvm index fadaece0b..dd5f7fd76 160000 --- a/lib/osvvm +++ b/lib/osvvm @@ -1 +1 @@ -Subproject commit fadaece0b318dfa07451ce719a1f6cd42f4c2534 +Subproject commit dd5f7fd76996d1ed9a18a9a93ff53d5c6bb1171a diff --git a/poc.ps1 b/poc.ps1 deleted file mode 100644 index 0fc5114d3..000000000 --- a/poc.ps1 +++ /dev/null @@ -1,112 +0,0 @@ -# EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- -# vim: tabstop=2:shiftwidth=2:noexpandtab -# kate: tab-width 2; replace-tabs off; indent-width 2; -# -# ============================================================================== -# Authors: Patrick Lehmann -# -# PowerShell Script: Wrapper Script to execute /lib/pyIPCMI/pyIPCMI.py -# -# Description: -# ------------------------------------ -# This is a bash wrapper script (executable) which: -# - saves the current working directory as an environment variable -# - delegates the call to /lib/pyIPCMI/Wrapper/wrapper.sh -# -# License: -# ============================================================================== -# Copyright 2025-2026 The PoC-Library Authors -# Copyright 2007-2016 Technische Universitaet Dresden - Germany -# Chair of VLSI-Design, Diagnostics and Architecture -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -# -# Change this, if pyIPCMI solutions and pyIPCMI projects are used -$Library_RelPath = "." # relative path to PoC root directory -$Library = "PoC" # library name -$Solution = "" # solution name -$Project = "" # project name - -# Configure pyIPCMI environment here -$pyIPCMI_Dir = "lib\pyIPCMI" -$pyIPCMI_PSModule = "pyIPCMI" - - -# save parameters and current working directory -$Wrapper_WorkingDirectory = Get-Location -$Library_RootDirectory = Convert-Path (Resolve-Path ($PSScriptRoot + "\" + $Library_RelPath)) - -# load pyIPCMI module -Import-Module "$Library_RootDirectory\$pyIPCMI_Dir\$pyIPCMI_PSModule.psm1" -ArgumentList @( - $Library_RootDirectory, - $Library, - $pyIPCMI_Dir, - $pyIPCMI_PSModule, - $Solution -) - -# scan script parameters and mark environment to be loaded -$Debug, $PyWrapper_LoadEnv = Get-PyIPCMIEnvironmentArray $args -# execute vendor and tool pre-hook files if present -Invoke-OpenEnvironment $PyWrapper_LoadEnv | Out-Null - -# print debug messages -if ($Debug -eq $true ) { - Write-Host "This is the PoC-Library script wrapper operating in debug mode." -ForegroundColor Yellow - Write-Host "" - Write-Host "Directories:" -ForegroundColor Yellow - Write-Host " Library Root $Library_RootDirectory" -ForegroundColor Yellow - Write-Host " pyIPCMI Root $pyIPCMI_RootDirectory" -ForegroundColor Yellow - Write-Host " Working $Wrapper_WorkingDirectory" -ForegroundColor Yellow - Write-Host "Script:" -ForegroundColor Yellow - Write-Host " Filename $pyIPCMI_FrontEndPy" -ForegroundColor Yellow - Write-Host " Library $Library" -ForegroundColor Yellow - Write-Host " Solution $Solution" -ForegroundColor Yellow - Write-Host " Project $Project" -ForegroundColor Yellow - Write-Host " Parameters $args" -ForegroundColor Yellow - Write-Host "Load Environment:" -ForegroundColor Yellow - Write-Host " Lattice Diamond $($PyWrapper_LoadEnv['Lattice']['Tools']['Diamond']['Load'])" -ForegroundColor Yellow - Write-Host " Xilinx ISE $($PyWrapper_LoadEnv['Xilinx']['Tools']['ISE']['Load'])" -ForegroundColor Yellow - Write-Host " Xilinx Vivado $($PyWrapper_LoadEnv['Xilinx']['Tools']['Vivado']['Load'])" -ForegroundColor Yellow - Write-Host "" -} - -# execute script with appropriate Python interpreter and all given parameters -if ($Solution -eq "") -{ $Command = "$Python_Interpreter $Python_Parameters $pyIPCMI_FrontEndPy $args" } -else -{ $Command = "$Python_Interpreter $Python_Parameters $pyIPCMI_FrontEndPy --sln=$Solution $args" } - -# execute script with appropriate Python interpreter and all given parameters -if ($Debug -eq $true) { Write-Host "launching: '$Command'" -ForegroundColor Yellow } -Invoke-Expression $Command -$PyWrapper_ExitCode = $LastExitCode - - -Invoke-CloseEnvironment $PyWrapper_LoadEnv | Out-Null - -# unload PowerShell module -Remove-Module $pyIPCMI_PSModule -# clean up environment variables -$env:LibraryRootDirectory = $null -$env:Library = $null -$env:pyIPCMIRootDirectory = $null -$env:pyIPCMIConfigDirectory = $null -$env:pyIPCMIFrontEnd = $null - -# restore working directory if changed -Set-Location $Wrapper_WorkingDirectory - -# return exit status -exit $PyWrapper_ExitCode diff --git a/poc.sh b/poc.sh deleted file mode 100755 index f89b50b7f..000000000 --- a/poc.sh +++ /dev/null @@ -1,72 +0,0 @@ -#! /usr/bin/env bash -# EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- -# vim: tabstop=2:shiftwidth=2:noexpandtab -# kate: tab-width 2; replace-tabs off; indent-width 2; -# -# PYTHON_ARGCOMPLETE_OK -# -# ============================================================================== -# Authors: Patrick Lehmann -# Martin Zabel -# -# Bash Script: Wrapper Script to execute /py/PoC.py -# -# Description: -# ------------------------------------ -# This is a bash wrapper script (executable) which: -# - saves the current working directory as an environment variable -# - delegates the call to /py/wrapper.sh -# -# License: -# ============================================================================== -# Copyright 2025-2026 The PoC-Library Authors -# Copyright 2007-2016 Technische Universitaet Dresden - Germany -# Chair of VLSI-Design, Diagnostics and Architecture -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -# -# Change this, if pyIPCMI solutions and pyIPCMI projects are used -Library_RelPath="." # relative path to PoC root directory -Library="PoC" # library name -Solution="" # solution name -Project="" # project name - -# Configure pyIPCMI environment here -pyIPCMI_Dir="lib/pyIPCMI" -pyIPCMI_BashModule="pyIPCMI" - -# work around for Darwin (Mac OS) -READLINK=readlink; if [[ $(uname) == "Darwin" ]]; then READLINK=greadlink; fi - -# resolve script directory -# solution is from http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in -SOURCE="${BASH_SOURCE[0]}" -while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink - DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - SOURCE="$($READLINK "$SOURCE")" - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located -done -SCRIPT_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - -# save parameters and script directory -Wrapper_Parameters=$@ -Wrapper_WorkingDirectory=$(pwd) -Library_RootDir_RelPath="$SCRIPT_DIR/." -Library_RootDirectory=$(cd "$Library_RootDir_RelPath/$Library_RelPath" && pwd) - -# invoke main wrapper -source "$Library_RootDirectory/$pyIPCMI_Dir/$pyIPCMI_BashModule.sh" - -# return exit status -exit $PoC_ExitCode diff --git a/prj/TerosHDL/PileOfCores_TerosHDL.yml b/prj/TerosHDL/PileOfCores_TerosHDL.yml index bd9cf8000..a8132d3d7 100644 --- a/prj/TerosHDL/PileOfCores_TerosHDL.yml +++ b/prj/TerosHDL/PileOfCores_TerosHDL.yml @@ -1,7 +1,7 @@ name: PileOfCores project_disk_path: '' project_type: genericProject -toplevel: ../../src/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock.vhdl +toplevel: ../../src/bus/axi4lite/axi4lite_HighResolutionClock.vhdl files: - name: ../../src/common/common.vhdl file_type: vhdlSource @@ -59,7 +59,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/common/my_config.vhdl.template + - name: ../../src/common/project_configuration.vhdl.template file_type: none file_version: ! '' is_include_file: false @@ -67,7 +67,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/common/my_project.vhdl.template + - name: ../../src/common/local_configuration.vhdl.template file_type: none file_version: ! '' is_include_file: false @@ -123,7 +123,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_addw.vhdl + - name: ../../src/arith/arith_Adder_Wide.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -131,7 +131,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_carrychain_inc.vhdl + - name: ../../src/arith/arith_CarryChain_inc.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -147,7 +147,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_convert_bin2bcd.vhdl + - name: ../../src/arith/arith_Convert_Binary2BCD.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -155,7 +155,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_counter_bcd.vhdl + - name: ../../src/arith/arith_Counter_BCD.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -163,7 +163,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_counter_free.vhdl + - name: ../../src/arith/arith_Counter_Free.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -171,7 +171,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_counter_gray.vhdl + - name: ../../src/arith/arith_Counter_Gray.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -179,7 +179,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_counter_ring.vhdl + - name: ../../src/arith/arith_Counter_Ring.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -187,7 +187,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_div.vhdl + - name: ../../src/arith/arith_Divider.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -195,7 +195,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_firstone.vhdl + - name: ../../src/arith/arith_FirstOne.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -203,7 +203,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_prefix_and.vhdl + - name: ../../src/arith/arith_Prefix_And.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -211,7 +211,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_prefix_or.vhdl + - name: ../../src/arith/arith_Prefix_Or.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -219,7 +219,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_prng.vhdl + - name: ../../src/arith/arith_PRNG.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -227,7 +227,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_same.vhdl + - name: ../../src/arith/arith_Same.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -235,7 +235,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_scaler.vhdl + - name: ../../src/arith/arith_Scaler.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -243,7 +243,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_shifter_barrel.vhdl + - name: ../../src/arith/arith_Shifter_Barrel.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -251,7 +251,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_sqrt.vhdl + - name: ../../src/arith/arith_SquareRoot.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -259,7 +259,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/arith_trng.vhdl + - name: ../../src/arith/arith_TRNG.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -267,7 +267,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/xilinx/arith_addw_xilinx.vhdl + - name: ../../src/arith/xilinx/arith_Adder_Wide_xilinx.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -275,7 +275,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/xilinx/arith_carrychain_inc_xilinx.vhdl + - name: ../../src/arith/xilinx/arith_CarryChain_inc_Xilinx.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -299,7 +299,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/xilinx/arith_prefix_and_xilinx.vhdl + - name: ../../src/arith/xilinx/arith_Prefix_And_Xilinx.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -307,7 +307,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/arith/xilinx/arith_prefix_or_xilinx.vhdl + - name: ../../src/arith/xilinx/arith_Prefix_Or_Xilinx.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -395,7 +395,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4_FIFO.vhdl + - name: ../../src/bus/axi4/axi4_FIFO.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -403,7 +403,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4_FIFO_cdc.vhdl + - name: ../../src/bus/axi4/axi4_FIFO_CDC.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -419,7 +419,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4_Termination_Manager.vhdl + - name: ../../src/bus/axi4/axi4_Termination_Manager.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -427,7 +427,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4_Termination_Subordinate.vhdl + - name: ../../src/bus/axi4/axi4_Termination_Subordinate.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -435,7 +435,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4_to_AXI4Lite.vhdl + - name: ../../src/bus/axi4/axi4_AXI4Lite_Converter.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -443,7 +443,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Stream/AXI4Stream.pkg.vhdl + - name: ../../src/bus/axi4stream/axi4stream.pkg.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -451,7 +451,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Stream/AXI4Stream_FIFO.vhdl + - name: ../../src/bus/axi4stream/axi4stream_FIFO.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -459,7 +459,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Stream/AXI4Stream_FIFO_cdc.vhdl + - name: ../../src/bus/axi4stream/axi4stream_FIFO_CDC.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -467,7 +467,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Stream/AXI4Stream_FIFO_tempgot.vhdl + - name: ../../src/bus/axi4stream/axi4stream_FIFO_TempGot.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -475,7 +475,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Stream/AXI4Stream_FIFO_tempput.vhdl + - name: ../../src/bus/axi4stream/axi4stream_FIFO_TempPut.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -483,7 +483,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Stream/AXI4Stream_DeMux.vhdl + - name: ../../src/bus/axi4stream/axi4stream_DeMux.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -491,7 +491,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Stream/AXI4Stream_Stage.vhdl + - name: ../../src/bus/axi4stream/axi4stream_Stage.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -499,7 +499,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Stream/AXI4Stream_Mux.vhdl + - name: ../../src/bus/axi4stream/axi4stream_Mux.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -507,7 +507,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Lite/AXI4Lite.pkg.vhdl + - name: ../../src/bus/axi4lite/axi4lite.pkg.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -515,7 +515,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Lite/AXI4Lite_FIFO.vhdl + - name: ../../src/bus/axi4lite/axi4lite_FIFO.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -523,7 +523,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Lite/AXI4Lite_FIFO_cdc.vhdl + - name: ../../src/bus/axi4lite/axi4lite_FIFO_CDC.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -531,7 +531,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Lite/AXI4Lite_OSVVM.pkg.vhdl + - name: ../../src/bus/axi4lite/axi4lite_OSVVM.pkg.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -539,7 +539,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Lite/AXI4Lite_Register.vhdl + - name: ../../src/bus/axi4lite/axi4lite_Register.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -547,7 +547,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Lite/AXI4Lite_Termination_Manager.vhdl + - name: ../../src/bus/axi4lite/axi4lite_Termination_Manager.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -555,7 +555,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Lite/AXI4Lite_Termination_Subordinate.vhdl + - name: ../../src/bus/axi4lite/axi4lite_Termination_Subordinate.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -571,7 +571,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/cache/cache_cpu.vhdl + - name: ../../src/cache/cache_CPU.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -579,7 +579,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/cache/cache_mem.vhdl + - name: ../../src/cache/cache_Memory.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -587,7 +587,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/cache/cache_par.vhdl + - name: ../../src/cache/cache_Parallel.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -595,7 +595,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/cache/cache_par2.vhdl + - name: ../../src/cache/cache_Parallel2.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -603,7 +603,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/cache/cache_replacement_policy.vhdl + - name: ../../src/cache/cache_ReplacementPolicy.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -611,7 +611,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/cache/cache_tagunit_par.vhdl + - name: ../../src/cache/cache_TagUnit_Parallel.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -619,7 +619,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/cache/cache_tagunit_seq.vhdl + - name: ../../src/cache/cache_TagUnit_Sequential.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -635,7 +635,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/comm/comm_crc.vhdl + - name: ../../src/comm/comm_CRC.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -643,7 +643,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/comm/comm_scramble.vhdl + - name: ../../src/comm/comm_Scramble.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -651,7 +651,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/comm/remote/remote_terminal_control.vhdl + - name: ../../src/comm/remote/remote_TerminalControl.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -667,7 +667,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/dstruct/dstruct_deque.vhdl + - name: ../../src/dstruct/dstruct_DoubleEndedQueue.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -675,7 +675,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/dstruct/dstruct_stack.vhdl + - name: ../../src/dstruct/dstruct_Stack.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -715,7 +715,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/fifo/fifo_stage.vhdl + - name: ../../src/fifo/fifo_Stage.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -739,7 +739,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/fifo/fifo_shift.vhdl + - name: ../../src/fifo/fifo_Shift.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -835,7 +835,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/io/uart/uart_bclk.vhdl + - name: ../../src/io/uart/uart_BitClock.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -843,7 +843,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/io/uart/uart_fifo.vhdl + - name: ../../src/io/uart/uart_FIFO.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -851,7 +851,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/io/uart/uart_ft245.vhdl + - name: ../../src/io/uart/uart_FT245.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -859,7 +859,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/io/uart/uart_rx.vhdl + - name: ../../src/io/uart/uart_RX.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -867,7 +867,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/io/uart/uart_tx.vhdl + - name: ../../src/io/uart/uart_TX.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -923,7 +923,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/io/ddrio/ddrio_in.vhdl + - name: ../../src/io/ddrio/ddrio_In.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -931,7 +931,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/io/ddrio/ddrio_in_altera.vhdl + - name: ../../src/io/ddrio/ddrio_In_Altera.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -939,7 +939,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/io/ddrio/ddrio_inout.vhdl + - name: ../../src/io/ddrio/ddrio_InOut.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -947,7 +947,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/io/ddrio/ddrio_inout_altera.vhdl + - name: ../../src/io/ddrio/ddrio_InOut_Altera.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -955,7 +955,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/io/ddrio/ddrio_inout_xilinx.vhdl + - name: ../../src/io/ddrio/ddrio_InOut_Xilinx.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -963,7 +963,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/io/ddrio/ddrio_in_xilinx.vhdl + - name: ../../src/io/ddrio/ddrio_In_Xilinx.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -971,7 +971,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/io/ddrio/ddrio_out.vhdl + - name: ../../src/io/ddrio/ddrio_Out.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -979,7 +979,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/io/ddrio/ddrio_out_altera.vhdl + - name: ../../src/io/ddrio/ddrio_Out_Altera.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -987,7 +987,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/io/ddrio/ddrio_out_xilinx.vhdl + - name: ../../src/io/ddrio/ddrio_Out_Xilinx.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1051,7 +1051,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/mem/ocrom/ocrom_dp.vhdl + - name: ../../src/mem/ocrom/ocrom_DualPort.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1059,7 +1059,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/mem/ocrom/ocrom_sp.vhdl + - name: ../../src/mem/ocrom/ocrom_SinglePort.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1075,7 +1075,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/mem/ocram/ocram_esdp.vhdl + - name: ../../src/mem/ocram/ocram_EnhancedSimpleDualPort.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1083,7 +1083,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/mem/ocram/ocram_sdp.vhdl + - name: ../../src/mem/ocram/ocram_SimpleDualPort.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1091,7 +1091,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/mem/ocram/ocram_sdp_wf.vhdl + - name: ../../src/mem/ocram/ocram_SimpleDualPort_wf.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1099,7 +1099,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/mem/ocram/ocram_sp.vhdl + - name: ../../src/mem/ocram/ocram_SinglePort.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1107,7 +1107,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/mem/ocram/ocram_tdp.vhdl + - name: ../../src/mem/ocram/ocram_TrueDualPort.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1115,7 +1115,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/mem/ocram/ocram_tdp_sim.vhdl + - name: ../../src/mem/ocram/ocram_TrueDualPort_sim.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1123,7 +1123,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/mem/ocram/ocram_tdp_wf.vhdl + - name: ../../src/mem/ocram/ocram_TrueDualPort_wf.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1131,7 +1131,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/mem/ocram/altera/ocram_sp_altera.vhdl + - name: ../../src/mem/ocram/altera/ocram_SinglePort_altera.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1139,7 +1139,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/mem/ocram/altera/ocram_tdp_altera.vhdl + - name: ../../src/mem/ocram/altera/ocram_TrueDualPort_Altera.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1195,7 +1195,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/misc/filter/filter_and.vhdl + - name: ../../src/misc/filter/filter_And.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1203,7 +1203,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/misc/filter/filter_mean.vhdl + - name: ../../src/misc/filter/filter_Mean.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1211,7 +1211,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/misc/filter/filter_or.vhdl + - name: ../../src/misc/filter/filter_Or.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1251,7 +1251,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/misc/gearbox/gearbox_down_cc.vhdl + - name: ../../src/misc/gearbox/gearbox_Down_cc.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1259,7 +1259,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/misc/gearbox/gearbox_down_dc.vhdl + - name: ../../src/misc/gearbox/gearbox_Down_dc.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1267,7 +1267,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/misc/gearbox/gearbox_up_cc.vhdl + - name: ../../src/misc/gearbox/gearbox_Up_cc.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1275,7 +1275,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/misc/gearbox/gearbox_up_dc.vhdl + - name: ../../src/misc/gearbox/gearbox_Up_dc.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1283,7 +1283,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/sort/sort_lru_cache.vhdl + - name: ../../src/sort/sort_LeastRecentlyUsed_Cache.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1291,7 +1291,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/sort/sort_lru_list.vhdl + - name: ../../src/sort/sort_LeastRecentlyUsed_List.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1515,7 +1515,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/xil/reconfig/reconfig_icap_fsm.vhdl + - name: ../../src/xil/reconfig/reconfig_ICAP_FSM.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1523,7 +1523,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/xil/reconfig/reconfig_icap_wrapper.vhdl + - name: ../../src/xil/reconfig/reconfig_ICAP_Wrapper.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1875,33 +1875,31 @@ files: logical_name: PoC is_manual: true source_type: none - - name: >- - ../../tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_TestController.vhdl + - name: ../../src/mem/ocram/ocram_SimpleDualPort_optimized.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false include_path: '' - logical_name: TB + logical_name: PoC is_manual: true source_type: none - - name: >- - ../../tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_TestHarness.vhdl + - name: ../../src/bus/axi4lite/axi4lite_GitVersionRegister.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false include_path: '' - logical_name: TB + logical_name: PoC is_manual: true source_type: none - - name: ../../tb/bus/axi4/AXI4Lite/AXI4Lite_Register/TC_RandomReadWrite.vhdl + - name: ../../src/mem/mem_GitVersionRegister.pkg.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false include_path: '' - logical_name: TB + logical_name: PoC is_manual: true source_type: none - - name: ../../src/mem/ocram/ocram_sdp_optimized.vhdl + - name: ../../src/bus/axi4lite/axi4lite_HighResolutionClock.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1909,7 +1907,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Lite/AXI4Lite_GitVersionRegister.vhdl + - name: ../../src/misc/clock/clock.pkg.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1917,7 +1915,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/mem/mem_GitVersionRegister.pkg.vhdl + - name: ../../src/misc/clock/clock_Counter.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1925,7 +1923,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock.vhdl + - name: ../../src/misc/clock/clock_HighResolution.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1933,7 +1931,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/misc/clock/clock.pkg.vhdl + - name: ../../src/misc/clock/clock_Timer.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1941,7 +1939,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/misc/clock/clock_Counter.vhdl + - name: ../../src/bus/axi4lite/axi4lite_OCRAM_Adapter.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1949,7 +1947,7 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/misc/clock/clock_HighResolution.vhdl + - name: ../../src/bus/axi4lite/axi4lite_UART.vhdl file_type: vhdlSource file_version: '2008' is_include_file: false @@ -1957,28 +1955,1196 @@ files: logical_name: PoC is_manual: true source_type: none - - name: ../../src/misc/clock/clock_Timer.vhdl + - name: ../../lib/osvvm/AlertLogPkg.vhd file_type: vhdlSource file_version: '2008' is_include_file: false include_path: '' - logical_name: PoC + logical_name: osvvm is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter.vhdl + - name: ../../lib/osvvm/AssertApiPkg.vhd file_type: vhdlSource file_version: '2008' is_include_file: false include_path: '' - logical_name: PoC + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/AUTHORS.md + file_type: none + file_version: ! '' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/CHANGELOG.md + file_type: none + file_version: ! '' + is_include_file: false + include_path: '' + logical_name: osvvm is_manual: true source_type: none - - name: ../../src/bus/axi4/AXI4Lite/AXI4Lite_UART.vhdl + - name: ../../lib/osvvm/ClockResetPkg.vhd file_type: vhdlSource file_version: '2008' is_include_file: false include_path: '' - logical_name: PoC + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/CoveragePkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/CoverageVendorApiPkg_Aldec.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/CoverageVendorApiPkg_default.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/CoverageVendorApiPkg_NVC.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/DelayCoveragePkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/FileLinePathPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/FileUtilPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/IfElsePkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/LanguageSupport2019Pkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/LICENSE.md + file_type: none + file_version: ! '' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/MemoryGenericPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/MemoryPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/MemorySupportPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/MessageListPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/MessagePkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/NamePkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/NameStorePkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/osvvm.pro + file_type: osvvmProject + file_version: ! '' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/OsvvmContext.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/OsvvmGlobalPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/osvvm_old.tcl + file_type: tclSource + file_version: ! '' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/OsvvmScriptSettingsPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/OsvvmScriptSettingsPkg_default.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/OsvvmScriptSettingsPkg_generated.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/OsvvmSettingsPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/OsvvmSettingsPkg_default.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/OsvvmTypesPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/OsvvmVhdlSettings.pro + file_type: osvvmProject + file_version: ! '' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/RandomBasePkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/RandomPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/RandomPkg2019.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/RandomProcedurePkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/README.md + file_type: none + file_version: ! '' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/ReportPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/ResizePkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/ResolutionPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/ScoreboardGenericPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/ScoreboardPkg_int.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/ScoreboardPkg_IntV.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/ScoreboardPkg_signed.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/ScoreboardPkg_slv.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/ScoreboardPkg_unsigned.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/SortListPkg_int.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/TbUtilPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/TextUtilPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/osvvm/TranscriptPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/AddressBusModeViewPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/AddressBusResponderTransactionArrayPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/AddressBusResponderTransactionPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/AddressBusTransactionArrayPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/AddressBusTransactionPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/AddressBusVersionCompatibilityPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/build.pro + file_type: osvvmProject + file_version: ! '' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/build_one.pro + file_type: osvvmProject + file_version: ! '' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/FifoFillPkg_slv.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/FifoFillPtPkg_slv.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/InterruptGeneratorBit.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/InterruptGeneratorBitVti.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/InterruptGeneratorComponentPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/InterruptGlobalSignalPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/InterruptHandler.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/InterruptHandlerComponentPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/ModelParametersPtPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/ModelParametersSingletonPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/OsvvmCommonContext.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/StreamModeViewPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/StreamTransactionArrayPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-Common/src/StreamTransactionPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_common + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/common/src/Axi4CommonPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/common/src/Axi4InterfaceCommonPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/common/src/Axi4ModelPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/common/src/Axi4OptionsArrayPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/common/src/Axi4OptionsPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/common/src/Axi4VersionCompatibilityPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/Axi4/src/Axi4ComponentPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/Axi4/src/Axi4Context.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/Axi4/src/Axi4GenericSignalsPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/Axi4/src/Axi4InterfaceModeViewPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/Axi4/src/Axi4InterfacePkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/Axi4/src/Axi4Manager_a.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/Axi4/src/Axi4Manager_e.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/Axi4/src/Axi4Memory_a.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/Axi4/src/Axi4Memory_e.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/Axi4/src/Axi4Monitor_dummy.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/Axi4/src/Axi4PassThru.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/Axi4/src/axi4subordinate_a.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/Axi4/src/axi4subordinate_e.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-axi4lite/src/axi4liteComponentPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-axi4lite/src/axi4liteComponentVtiPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-axi4lite/src/axi4liteContext.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-axi4lite/src/axi4liteInterfacePkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-axi4lite/src/axi4liteManager.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-axi4lite/src/axi4liteManagerVti.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-axi4lite/src/axi4liteMemory.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-axi4lite/src/axi4liteMemoryVti.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-axi4lite/src/axi4liteMonitor_dummy.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-axi4lite/src/axi4litePassThru.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-axi4lite/src/axi4liteSubordinate.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-axi4lite/src/axi4liteSubordinateVti.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/AxiStream/src/AxiStreamComponentPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/AxiStream/src/AxiStreamContext.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/AxiStream/src/AxiStreamGenericSignalsPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/AxiStream/src/AxiStreamMonitor.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/AxiStream/src/AxiStreamOptionsArrayPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/AxiStream/src/AxiStreamOptionsPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/AxiStream/src/AxiStreamReceiver.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/AxiStream/src/AxiStreamReceiverVti.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/AxiStream/src/AxiStreamSignalsPkg_32.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/AxiStream/src/AxiStreamTbPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/AxiStream/src/AxiStreamTransmitter.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-AXI4/AxiStream/src/AxiStreamTransmitterVti.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_axi4 + is_manual: true + source_type: none + - name: ../../lib/OSVVM-UART/src/ScoreboardPkg_Uart.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_uart + is_manual: true + source_type: none + - name: ../../lib/OSVVM-UART/src/UartContext.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_uart + is_manual: true + source_type: none + - name: ../../lib/OSVVM-UART/src/UartRx.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_uart + is_manual: true + source_type: none + - name: ../../lib/OSVVM-UART/src/UartRxComponentPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_uart + is_manual: true + source_type: none + - name: ../../lib/OSVVM-UART/src/UartTbPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_uart + is_manual: true + source_type: none + - name: ../../lib/OSVVM-UART/src/UartTx.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_uart + is_manual: true + source_type: none + - name: ../../lib/OSVVM-UART/src/UartTxComponentPkg.vhd + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: osvvm_uart + is_manual: true + source_type: none + - name: ../../src/bus/axi4/AXI4_OSVVM.pkg.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: PoC + is_manual: true + source_type: none + - name: ../../tb/bus/axi4/axi4_Mux/axi4_Mux_TestController.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4_Mux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4/axi4_Mux/axi4_Mux_TestHarness.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4_Mux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4/axi4_Mux/TC_SimpleReadWrite.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4_Mux + is_manual: true + source_type: none + - name: ../../src/bus/axi4/axi4_DeMux.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: PoC + is_manual: true + source_type: none + - name: ../../src/bus/axi4/axi4_Mux.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: PoC + is_manual: true + source_type: none + - name: ../../tb/bus/axi4/axi4_DeMux/axi4_DeMux_TestController.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4_DeMux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4/axi4_DeMux/axi4_DeMux_TestHarness.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4_DeMux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4/axi4_DeMux/TC_SimpleReadWrite.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4_DeMux + is_manual: true + source_type: none + - name: ../../src/dstruct/dstruct_OutOfOrderBuffer.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: PoC + is_manual: true + source_type: none + - name: ../../src/bus/axi4lite/axi4lite_DeMux.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: PoC + is_manual: true + source_type: none + - name: ../../tb/bus/axi4/axi4_DeMux/RunAllTests.pro + file_type: osvvmProject + file_version: ! '' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4_DeMux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4/axi4_DeMux/TC_SimpleReadWrite_delay.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4_DeMux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4/axi4_DeMux/TC_SimpleReadWrite_multiID.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4_DeMux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4stream/Mux/RunAllTests.pro + file_type: osvvmProject + file_version: ! '' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4stream_Mux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4stream/Mux/tb_axi4stream_mux.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4stream_Mux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4stream/Mux/TestController_e.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4stream_Mux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4stream/DeMux/DeMux_Harness.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4stream_DeMux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4stream/DeMux/RunAllTests.pro + file_type: osvvmProject + file_version: ! '' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4stream_DeMux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4stream/DeMux/TC_DeMux_a1.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4stream_DeMux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4stream/DeMux/TC_DeMux_a2.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4stream_DeMux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4stream/DeMux/TC_DeMux_a3.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4stream_DeMux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4stream/DeMux/TC_DeMux_a4.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4stream_DeMux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4stream/DeMux/TC_DeMux_e.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4stream_DeMux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4stream/Mux/TC_RandomTransfer.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4stream_Mux + is_manual: true + source_type: none + - name: ../../tb/bus/axi4/axi4_DeMux/TC_SimpleReadWrite_multiID_randDelay.vhdl + file_type: vhdlSource + file_version: '2008' + is_include_file: false + include_path: '' + logical_name: TB_bus.axi4.axi4_DeMux is_manual: true source_type: none hooks: diff --git a/py/.idea/.name b/py/.idea/.name deleted file mode 100644 index ce5cb5f4c..000000000 --- a/py/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -py \ No newline at end of file diff --git a/py/.idea/codeStyleSettings.xml b/py/.idea/codeStyleSettings.xml deleted file mode 100644 index 5555dd266..000000000 --- a/py/.idea/codeStyleSettings.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/py/.idea/codeStyles/codeStyleConfig.xml b/py/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index a55e7a179..000000000 --- a/py/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/encodings.xml b/py/.idea/encodings.xml deleted file mode 100644 index 97626ba45..000000000 --- a/py/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/py/.idea/inspectionProfiles/Project_Default.xml b/py/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 9940ce427..000000000 --- a/py/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/markdown-exported-files.xml b/py/.idea/markdown-exported-files.xml deleted file mode 100644 index 5d1f1293c..000000000 --- a/py/.idea/markdown-exported-files.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/py/.idea/markdown-navigator.xml b/py/.idea/markdown-navigator.xml deleted file mode 100644 index bad3adfcd..000000000 --- a/py/.idea/markdown-navigator.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/py/.idea/markdown-navigator/profiles_settings.xml b/py/.idea/markdown-navigator/profiles_settings.xml deleted file mode 100644 index 57927c5a7..000000000 --- a/py/.idea/markdown-navigator/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/py/.idea/misc.xml b/py/.idea/misc.xml deleted file mode 100644 index 65531ca99..000000000 --- a/py/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/modules.xml b/py/.idea/modules.xml deleted file mode 100644 index 3a6548850..000000000 --- a/py/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/py/.idea/py.iml b/py/.idea/py.iml deleted file mode 100644 index 9c24bc10a..000000000 --- a/py/.idea/py.iml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/__dryrun_ghdl_PoC_arith_prng.xml b/py/.idea/runConfigurations/__dryrun_ghdl_PoC_arith_prng.xml deleted file mode 100644 index 599ec4a1a..000000000 --- a/py/.idea/runConfigurations/__dryrun_ghdl_PoC_arith_prng.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/__dryrun_isim_PoC_arith_prng.xml b/py/.idea/runConfigurations/__dryrun_isim_PoC_arith_prng.xml deleted file mode 100644 index 62611a96b..000000000 --- a/py/.idea/runConfigurations/__dryrun_isim_PoC_arith_prng.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/__dryrun_rpro_PoC_arith_prng.xml b/py/.idea/runConfigurations/__dryrun_rpro_PoC_arith_prng.xml deleted file mode 100644 index f26e2198a..000000000 --- a/py/.idea/runConfigurations/__dryrun_rpro_PoC_arith_prng.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/__dryrun_xsim_PoC_arith_prng.xml b/py/.idea/runConfigurations/__dryrun_xsim_PoC_arith_prng.xml deleted file mode 100644 index 2d0a7457e..000000000 --- a/py/.idea/runConfigurations/__dryrun_xsim_PoC_arith_prng.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/asim_PoC_arith_prng.xml b/py/.idea/runConfigurations/asim_PoC_arith_prng.xml deleted file mode 100644 index ccec218e5..000000000 --- a/py/.idea/runConfigurations/asim_PoC_arith_prng.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/configure.xml b/py/.idea/runConfigurations/configure.xml deleted file mode 100644 index c9e6ef034..000000000 --- a/py/.idea/runConfigurations/configure.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/configure___set_default_tools.xml b/py/.idea/runConfigurations/configure___set_default_tools.xml deleted file mode 100644 index e55508ee5..000000000 --- a/py/.idea/runConfigurations/configure___set_default_tools.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/configure_altera.xml b/py/.idea/runConfigurations/configure_altera.xml deleted file mode 100644 index 40ba0a426..000000000 --- a/py/.idea/runConfigurations/configure_altera.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/configure_ghdl.xml b/py/.idea/runConfigurations/configure_ghdl.xml deleted file mode 100644 index 1efbb1d18..000000000 --- a/py/.idea/runConfigurations/configure_ghdl.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/configure_git.xml b/py/.idea/runConfigurations/configure_git.xml deleted file mode 100644 index 1b0908781..000000000 --- a/py/.idea/runConfigurations/configure_git.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/configure_intel.xml b/py/.idea/runConfigurations/configure_intel.xml deleted file mode 100644 index 405e6816d..000000000 --- a/py/.idea/runConfigurations/configure_intel.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/configure_lattice.xml b/py/.idea/runConfigurations/configure_lattice.xml deleted file mode 100644 index 0cce071db..000000000 --- a/py/.idea/runConfigurations/configure_lattice.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/configure_mentor_modelsim.xml b/py/.idea/runConfigurations/configure_mentor_modelsim.xml deleted file mode 100644 index ce1fe339f..000000000 --- a/py/.idea/runConfigurations/configure_mentor_modelsim.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/coregen_PoC_xil_mig_Atlys_1x128.xml b/py/.idea/runConfigurations/coregen_PoC_xil_mig_Atlys_1x128.xml deleted file mode 100644 index 7859da9eb..000000000 --- a/py/.idea/runConfigurations/coregen_PoC_xil_mig_Atlys_1x128.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/ghdl_PoC_arith_prng.xml b/py/.idea/runConfigurations/ghdl_PoC_arith_prng.xml deleted file mode 100644 index 0e97a4c7f..000000000 --- a/py/.idea/runConfigurations/ghdl_PoC_arith_prng.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/isim_PoC_arith_prng.xml b/py/.idea/runConfigurations/isim_PoC_arith_prng.xml deleted file mode 100644 index d53a861df..000000000 --- a/py/.idea/runConfigurations/isim_PoC_arith_prng.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/list_netlist_PoC__.xml b/py/.idea/runConfigurations/list_netlist_PoC__.xml deleted file mode 100644 index e48b77f48..000000000 --- a/py/.idea/runConfigurations/list_netlist_PoC__.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/list_testbench_PoC__.xml b/py/.idea/runConfigurations/list_testbench_PoC__.xml deleted file mode 100644 index 6a5b727d2..000000000 --- a/py/.idea/runConfigurations/list_testbench_PoC__.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/list_testbench_PoC_sort_____kind_cocotb.xml b/py/.idea/runConfigurations/list_testbench_PoC_sort_____kind_cocotb.xml deleted file mode 100644 index 487e0c72b..000000000 --- a/py/.idea/runConfigurations/list_testbench_PoC_sort_____kind_cocotb.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/lse_PoC_arith_prng.xml b/py/.idea/runConfigurations/lse_PoC_arith_prng.xml deleted file mode 100644 index ea811f072..000000000 --- a/py/.idea/runConfigurations/lse_PoC_arith_prng.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/quartus_PoC_arith_prng.xml b/py/.idea/runConfigurations/quartus_PoC_arith_prng.xml deleted file mode 100644 index 4cb93fe43..000000000 --- a/py/.idea/runConfigurations/quartus_PoC_arith_prng.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/query_Xilinx_ISE_SettingsFile.xml b/py/.idea/runConfigurations/query_Xilinx_ISE_SettingsFile.xml deleted file mode 100644 index 5fef17e82..000000000 --- a/py/.idea/runConfigurations/query_Xilinx_ISE_SettingsFile.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/rpro_PoC_arith_prng.xml b/py/.idea/runConfigurations/rpro_PoC_arith_prng.xml deleted file mode 100644 index cc4077b96..000000000 --- a/py/.idea/runConfigurations/rpro_PoC_arith_prng.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/vsim_PoC_arith_prng.xml b/py/.idea/runConfigurations/vsim_PoC_arith_prng.xml deleted file mode 100644 index 2004877a8..000000000 --- a/py/.idea/runConfigurations/vsim_PoC_arith_prng.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/xsim_PoC_arith_prng___std_08.xml b/py/.idea/runConfigurations/xsim_PoC_arith_prng___std_08.xml deleted file mode 100644 index a99407e83..000000000 --- a/py/.idea/runConfigurations/xsim_PoC_arith_prng___std_08.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/runConfigurations/xst_PoC_cache_par.xml b/py/.idea/runConfigurations/xst_PoC_cache_par.xml deleted file mode 100644 index 880028b7a..000000000 --- a/py/.idea/runConfigurations/xst_PoC_cache_par.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - \ No newline at end of file diff --git a/py/.idea/vcs.xml b/py/.idea/vcs.xml deleted file mode 100644 index 6c0b86358..000000000 --- a/py/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/py/.idea/workspace.xml b/py/.idea/workspace.xml deleted file mode 100644 index ba4cb901f..000000000 --- a/py/.idea/workspace.xml +++ /dev/null @@ -1,1119 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - project - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1458584314941 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - file://$PROJECT_DIR$/Base/Configuration.py - 317 - - - file://$PROJECT_DIR$/ToolChain/Intel/ModelSim.py - 93 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/regression.tcl b/regression.tcl index 749f71bc3..c2239fb82 100644 --- a/regression.tcl +++ b/regression.tcl @@ -5,6 +5,34 @@ # Patrick Lehmann # Adrian Weiland # +# Description: +# This file is structured in a way that it can run in different modes locally +# and on the CI server. Parameters can be set through arguments (a) if used +# interactively and through environment variables (b). +# +# (a) When in interactive mode, arguments can be set as shown below: +# set ::argv ; set ::argc 1 +# (it has been tested with Riviera-PRO interactive, NVC interactive and tclsh with GHDL) +# +# (b) One of the following environment variables can be set - REGRESSION_STEP has priority: +# REGRESSION_FROM : (similar to variant a) +# REGRESSION_STEP : - Execute only the selected step +# +# Afterwards the file can be sourced as usual. +# Note that (a) always has priority over (b). If none are specified all steps +# are executed and everything is built. +# +# Examples: +# Riviera-PRO: +# 'set ::argv {poc}; set ::argc 1; source ../regression.tcl' +# This will built everything starting with the PoC. +# exec-NVC: +# - 'REGRESSION_FROM="poc" exec-NVC.sh -n --tcl-file=regression.tcl' +# This will build everything starting from the poc +# - 'REGRESSION_STEP="test" exec-NVC.sh -n --tcl-file=regression.tcl' +# 'REGRESSION_FROM="poc" REGRESSION_STEP="test" exec-NVC.sh -n --tcl-file=regression.tcl' +# This will only run the tests. +# # License: # ============================================================================= # Copyright 2025-2026 The PoC-Library Authors @@ -22,36 +50,54 @@ # limitations under the License. # ============================================================================= -source ../lib/OSVVM-Scripts/StartUp.tcl -source ../tools/OSVVM/poc.tcl +set root [file dirname [info script]] +# noqa: W300 +source ${root}/lib/OSVVM-Scripts/StartUp.tcl +# noqa: W300 +source ${root}/tools/poc.tcl namespace import ::poc::* +namespace import ::regression::* -# Skip report generation if executed within Sigasi/VS Code -if {[info exists ::env(OSVVM_TOOL)] && $::env(OSVVM_TOOL) eq "Sigasi"} { - set ::osvvm::GenerateOsvvmReports "false" -} -if {[info exists ::env(GITLAB_CI)]} { - set buildNamePrefix "" -} else { - set buildNamePrefix "${::osvvm::ToolNameVersion}-" -} - -namespace eval ::poc { - variable myConfigFile "../tb/common/my_config_${boardName}.vhdl" - variable myProjectFile "../tb/common/my_project.vhdl" -} +#---------------------# +# Configuration space # +#---------------------# +set defaultStep "all" +set regressionLevels [createRegressionLevels osvvm poc test] ; # all -build ../lib/OsvvmLibraries.pro [BuildName "${::poc::buildNamePrefix}OsvvmLibraries"] -checkForBuildErrors +# -P -projectRoot set project folder root for poc scripting +# -g -gui disables system exit (i.e. on errors) +# -v -vendor Vendor name +# -b -board Board name +# -p -projectFile Path to the local_configuration file +# -c -configFile Path to the project_configuration file +configurePoC -P ${root} -g # -s -stop set the stop counts to # -d -debug enable debugging # -w -waves save waveforms -# -g -gui disables system exit (i.e. on errors) configureOSVVM -stop 1 ; -build ../src/PoC.pro [BuildName "${::poc::buildNamePrefix}PoC"] -checkForBuildErrors +#---------------------# + +evaluateRegressionLevel $defaultStep $regressionLevels -build ../tb/RunAllTests.pro [BuildName "${::poc::buildNamePrefix}RunAllTests"] +if {$::regression::level <= 0} { + build ${root}/lib/OsvvmLibraries.pro [BuildName "${::poc::buildNamePrefix}OsvvmLibraries"] + if {[checkForBuildErrors] || $::regression::executeSingleStep} { + return + } +} + +if {$::regression::level <= 1} { + build ${root}/PoC.pro [BuildName "${::poc::buildNamePrefix}PoC"] + if {[checkForBuildErrors] || $::regression::executeSingleStep} { + return + } +} +if {$::regression::level <= 2} { + build ${root}/tb/RunAllTests.pro [BuildName "${::poc::buildNamePrefix}RunAllTests"] + if {[checkForRunErrors] || $::regression::executeSingleStep} { + return + } +} diff --git a/rename_strings.sh b/rename_strings.sh new file mode 100644 index 000000000..35b4994c4 --- /dev/null +++ b/rename_strings.sh @@ -0,0 +1,155 @@ +#!/usr/bin/env bash +# +# rename_strings.sh (v4) — recursively replace OLD with NEW both INSIDE FILES +# and in FILE/FOLDER NAMES, for one or more OLD/NEW pairs. Matching of OLD is +# CASE-INSENSITIVE; the result is written in the exact casing of NEW. Case-only +# changes (e.g. addw -> ADDW) are supported. +# +# Usage: +# ./rename_strings.sh [options] OLD1 NEW1 [OLD2 NEW2 ...] +# -n, --dry-run show what would change, modify nothing +# --names-only only rename files/folders (skip file contents) +# --content-only only edit file contents (skip renaming) +# +# Example: +# ./rename_strings.sh cache_TagUnit_Par cache_TagUnit_Parallel addw Adder_Wide +# +# Safeguards (stop a partial match like cache_TagUnit_Par -> ..._Parallel from +# being applied twice): +# * Contents: an occurrence is replaced only when it is NOT already the start +# of NEW (negative lookahead on NEW's trailing part). A file can therefore +# contain both OLD and NEW; only the OLD ones change. +# * Names: an entry whose name already contains NEW is skipped. The name +# check is case-insensitive for a normal pair (an already-NEW name in any +# casing is protected) and case-sensitive for a case-only pair (so the +# files actually get re-cased). +# Binaries and .git are skipped. Files with no real change are not rewritten. +# +# Requires bash >= 4 and perl. + +set -uo pipefail +shopt -s nocasematch + +# Fail clearly on a bash too old for case-insensitive ${var//...} (e.g. macOS +# system bash 3.2) instead of silently skipping files. +_probe="ABC" +if [[ "${_probe//abc/X}" != "X" ]]; then + echo "error: this bash lacks case-insensitive \${var//...}; use bash >= 4." >&2 + exit 1 +fi +command -v perl >/dev/null || { echo "error: perl is required." >&2; exit 1; } + +dry_run=0 +do_names=1 +do_content=1 +while [[ "${1:-}" == -* ]]; do + case "$1" in + -n|--dry-run) dry_run=1 ;; + --names-only) do_content=0 ;; + --content-only) do_names=0 ;; + --) shift; break ;; + *) echo "unknown option: $1" >&2; exit 1 ;; + esac + shift +done + +if [[ $do_names -eq 0 && $do_content -eq 0 ]]; then + echo "error: --names-only and --content-only are mutually exclusive." >&2 + exit 1 +fi +if [[ $# -lt 2 || $(( $# % 2 )) -ne 0 ]]; then + echo "Usage: $0 [-n|--dry-run] [--names-only|--content-only] OLD1 NEW1 ..." >&2 + exit 1 +fi + +# perl program: build a case-insensitive regex for OLD. If LOOK=1, add a +# negative lookahead on SUF so an already-NEW occurrence is left alone. +read -r -d '' PERL_SUBST <<'PERL' || true +BEGIN { $o = $ENV{OLD}; $s = $ENV{SUF}; $n = $ENV{NEW}; + $re = ($ENV{LOOK} eq "1") ? qr/\Q$o\E(?!\Q$s\E)/i : qr/\Q$o\E/i; } +s/$re/$n/g; +PERL +read -r -d '' PERL_COUNT <<'PERL' || true +BEGIN { $o = $ENV{OLD}; $s = $ENV{SUF}; + $re = ($ENV{LOOK} eq "1") ? qr/\Q$o\E(?!\Q$s\E)/i : qr/\Q$o\E/i; } +my $c = () = /$re/g; print $c; +PERL + +while [[ $# -ge 2 ]]; do + old=$1 + new=$2 + shift 2 + + if [[ -z "$old" ]]; then + echo "skip: empty OLD string" >&2 + continue + fi + # True duplicate (byte-identical) -> nothing to do. [ = ] stays + # case-sensitive regardless of nocasematch, so a case-only pair is kept. + if [ "$old" = "$new" ]; then + echo "skip: OLD == NEW ('$old')" >&2 + continue + fi + + # Lookahead only when NEW is strictly longer than OLD and starts with OLD + # (case-insensitively) -- the prefix-collision case (Par -> Parallel). + suffix="" + look=0 + old_lc=${old,,} + new_lc=${new,,} + if [[ ${#new} -gt ${#old} && "${new_lc:0:${#old}}" == "$old_lc" ]]; then + suffix=${new:${#old}} + look=1 + fi + + echo "== pair: '$old' -> '$new' (case-insensitive match) ==" + + # ---- contents ---- + if [[ $do_content -eq 1 ]]; then + # -I skips binaries, -i case-insensitive, -F literal OLD, -Z null output. + grep -rlIiFZ --exclude-dir=.git -e "$old" . 2>/dev/null | + while IFS= read -r -d '' file; do + n=$(OLD="$old" SUF="$suffix" LOOK="$look" perl -0777 -ne "$PERL_COUNT" "$file" 2>/dev/null) + n=${n:-0} + [[ "$n" =~ ^[0-9]+$ ]] || n=0 + [[ "$n" -gt 0 ]] || continue # only already-NEW occurrences: skip rewrite + if [[ $dry_run -eq 1 ]]; then + printf 'edit (dry): %s replacement(s) in %s\n' "$n" "$file" + else + OLD="$old" NEW="$new" SUF="$suffix" LOOK="$look" \ + perl -0777 -i -pe "$PERL_SUBST" "$file" && + printf 'edited: %s replacement(s) in %s\n' "$n" "$file" + fi + done + fi + + # ---- names ---- + if [[ $do_names -eq 1 ]]; then + # Name-safeguard sensitivity: case-sensitive for a case-only pair (so files + # get re-cased), case-insensitive otherwise (protect already-NEW names). + if [[ "$old" == "$new" ]]; then + guard_flags=(-qF) + else + guard_flags=(-qiF) + fi + # -depth: rename children before parents. -iname: match basename, any case. + find . -depth -not -path './.git/*' -iname "*$old*" -print0 | + while IFS= read -r -d '' path; do + base=$(basename "$path") + if printf '%s' "$base" | grep "${guard_flags[@]}" -e "$new"; then + continue + fi + newbase=${base//"$old"/"$new"} + newpath="$(dirname "$path")/$newbase" + if [[ -e "$newpath" ]]; then + echo "skip: target already exists: $newpath" >&2 + continue + fi + if [[ $dry_run -eq 1 ]]; then + printf 'rename (dry): %s -> %s\n' "$path" "$newpath" + else + mv -- "$path" "$newpath" && printf 'renamed: %s -> %s\n' "$path" "$newpath" + fi + done + fi +done diff --git a/sim/README.md b/sim/README.md deleted file mode 100644 index bbdeb6e0f..000000000 --- a/sim/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Simulator and Waveform Files - -*No documentation available.* \ No newline at end of file diff --git a/sim/aSim.batch.tcl b/sim/aSim.batch.tcl deleted file mode 100644 index 1bf1c5f59..000000000 --- a/sim/aSim.batch.tcl +++ /dev/null @@ -1,3 +0,0 @@ -asim -lib {VHDLLibraryName} -asdb {TestbenchName}.asdb -log {TestbenchName}.asim.log -t 1fs -ieee_nowarn {TestbenchName} -run -all -bye diff --git a/sim/aSim.gui.tcl b/sim/aSim.gui.tcl deleted file mode 100644 index 2adc72bcb..000000000 --- a/sim/aSim.gui.tcl +++ /dev/null @@ -1,5 +0,0 @@ -asim -lib {VHDLLibraryName} -asdb {TestbenchName}.asdb -log {TestbenchName}.asim.log -t 1fs -ieee_nowarn {TestbenchName} -trace -rec add * -run -all -asdb2vcd {TestbenchName}.asdb {TestbenchName}.vcd -bye diff --git a/sim/arith/arith_addw_tb.gtkw b/sim/arith/arith_addw_tb.gtkw deleted file mode 100644 index 3927e3d53..000000000 --- a/sim/arith/arith_addw_tb.gtkw +++ /dev/null @@ -1,37 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.69 (w)1999-2016 BSI -[*] Tue Feb 09 01:50:32 2016 -[*] -[dumpfile_mtime] "Tue Feb 09 01:47:51 2016" -[dumpfile_size] 108986677 -[timestart] 0 -[size] 1680 997 -[pos] -217 -217 -*-38.495441 -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 -[treeopen] top. -[treeopen] top.arith_addw_tb. -[sst_width] 197 -[signals_width] 78 -[sst_expanded] 1 -[sst_vpaned_height] 293 -@28 -top.arith_addw_tb.cin -top.arith_addw_tb.clock -@c00023 -#{top.arith_addw_tb.a[8:0]} top.arith_addw_tb.a[8] top.arith_addw_tb.a[7] top.arith_addw_tb.a[6] top.arith_addw_tb.a[5] top.arith_addw_tb.a[4] top.arith_addw_tb.a[3] top.arith_addw_tb.a[2] top.arith_addw_tb.a[1] top.arith_addw_tb.a[0] -@28 -top.arith_addw_tb.a[8] -top.arith_addw_tb.a[7] -top.arith_addw_tb.a[6] -top.arith_addw_tb.a[5] -top.arith_addw_tb.a[4] -top.arith_addw_tb.a[3] -top.arith_addw_tb.a[2] -top.arith_addw_tb.a[1] -top.arith_addw_tb.a[0] -@1401201 --group_end -@22 -#{top.arith_addw_tb.b[8:0]} top.arith_addw_tb.b[8] top.arith_addw_tb.b[7] top.arith_addw_tb.b[6] top.arith_addw_tb.b[5] top.arith_addw_tb.b[4] top.arith_addw_tb.b[3] top.arith_addw_tb.b[2] top.arith_addw_tb.b[1] top.arith_addw_tb.b[0] -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/arith/arith_addw_tb.wcfg b/sim/arith/arith_addw_tb.wcfg deleted file mode 100644 index e74c6612a..000000000 --- a/sim/arith/arith_addw_tb.wcfg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - clock - clock - - - a[8:0] - a[8:0] - UNSIGNEDDECRADIX - - - b[8:0] - b[8:0] - UNSIGNEDDECRADIX - - - cin - cin - - - s[0:3] - s[0:3] - - - cout[0:3] - cout[0:3] - - diff --git a/sim/arith/arith_convert_bin2bcd_tb.ghdl b/sim/arith/arith_convert_bin2bcd_tb.ghdl deleted file mode 100644 index 7bdf6ad9e..000000000 --- a/sim/arith/arith_convert_bin2bcd_tb.ghdl +++ /dev/null @@ -1,46 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/arith_convert_bin2bcd_tb/clock -/arith_convert_bin2bcd_tb/reset -/arith_convert_bin2bcd_tb/start -/arith_convert_bin2bcd_tb/conv1_binary -/arith_convert_bin2bcd_tb/conv1_bcddigits -/arith_convert_bin2bcd_tb/conv1_sign -/arith_convert_bin2bcd_tb/conv2_binary -/arith_convert_bin2bcd_tb/conv2_bcddigits -/arith_convert_bin2bcd_tb/conv2_sign -/arith_convert_bin2bcd_tb/conv1/clock -/arith_convert_bin2bcd_tb/conv1/reset -/arith_convert_bin2bcd_tb/conv1/start -/arith_convert_bin2bcd_tb/conv1/busy -/arith_convert_bin2bcd_tb/conv1/binary -/arith_convert_bin2bcd_tb/conv1/issigned -/arith_convert_bin2bcd_tb/conv1/bcddigits -/arith_convert_bin2bcd_tb/conv1/sign -/arith_convert_bin2bcd_tb/conv1/digit_shift_rst -/arith_convert_bin2bcd_tb/conv1/digit_shift_en -/arith_convert_bin2bcd_tb/conv1/digit_shift_in -/arith_convert_bin2bcd_tb/conv1/binary_en -/arith_convert_bin2bcd_tb/conv1/binary_rl -/arith_convert_bin2bcd_tb/conv1/binary_d -/arith_convert_bin2bcd_tb/conv1/sign_d -/arith_convert_bin2bcd_tb/conv1/delayshifter -/arith_convert_bin2bcd_tb/conv2/clock -/arith_convert_bin2bcd_tb/conv2/reset -/arith_convert_bin2bcd_tb/conv2/start -/arith_convert_bin2bcd_tb/conv2/busy -/arith_convert_bin2bcd_tb/conv2/binary -/arith_convert_bin2bcd_tb/conv2/issigned -/arith_convert_bin2bcd_tb/conv2/bcddigits -/arith_convert_bin2bcd_tb/conv2/sign -/arith_convert_bin2bcd_tb/conv2/digit_shift_rst -/arith_convert_bin2bcd_tb/conv2/digit_shift_en -/arith_convert_bin2bcd_tb/conv2/digit_shift_in -/arith_convert_bin2bcd_tb/conv2/binary_en -/arith_convert_bin2bcd_tb/conv2/binary_rl -/arith_convert_bin2bcd_tb/conv2/binary_d -/arith_convert_bin2bcd_tb/conv2/sign_d -/arith_convert_bin2bcd_tb/conv2/delayshifter diff --git a/sim/arith/arith_convert_bin2bcd_tb.gtkw b/sim/arith/arith_convert_bin2bcd_tb.gtkw deleted file mode 100644 index d898a6af6..000000000 --- a/sim/arith/arith_convert_bin2bcd_tb.gtkw +++ /dev/null @@ -1,68 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.69 (w)1999-2016 BSI -[*] Sat Mar 19 22:06:18 2016 -[*] -[dumpfile_mtime] "Sat Mar 19 22:01:58 2016" -[dumpfile_size] 16168 -[timestart] 0 -[size] 1680 996 -[pos] -1 -1 -*-27.066833 171500000 -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 -[treeopen] top. -[treeopen] top.arith_convert_bin2bcd_tb. -[treeopen] top.arith_convert_bin2bcd_tb.conv1_bcddigits. -[treeopen] top.arith_convert_bin2bcd_tb.conv2_bcddigits. -[sst_width] 197 -[signals_width] 252 -[sst_expanded] 1 -[sst_vpaned_height] 292 -@28 -top.arith_convert_bin2bcd_tb.clock -top.arith_convert_bin2bcd_tb.reset -top.arith_convert_bin2bcd_tb.start -@800200 --Conv1 -@24 -#{top.arith_convert_bin2bcd_tb.conv1_binary[29:0]} top.arith_convert_bin2bcd_tb.conv1_binary[29] top.arith_convert_bin2bcd_tb.conv1_binary[28] top.arith_convert_bin2bcd_tb.conv1_binary[27] top.arith_convert_bin2bcd_tb.conv1_binary[26] top.arith_convert_bin2bcd_tb.conv1_binary[25] top.arith_convert_bin2bcd_tb.conv1_binary[24] top.arith_convert_bin2bcd_tb.conv1_binary[23] top.arith_convert_bin2bcd_tb.conv1_binary[22] top.arith_convert_bin2bcd_tb.conv1_binary[21] top.arith_convert_bin2bcd_tb.conv1_binary[20] top.arith_convert_bin2bcd_tb.conv1_binary[19] top.arith_convert_bin2bcd_tb.conv1_binary[18] top.arith_convert_bin2bcd_tb.conv1_binary[17] top.arith_convert_bin2bcd_tb.conv1_binary[16] top.arith_convert_bin2bcd_tb.conv1_binary[15] top.arith_convert_bin2bcd_tb.conv1_binary[14] top.arith_convert_bin2bcd_tb.conv1_binary[13] top.arith_convert_bin2bcd_tb.conv1_binary[12] top.arith_convert_bin2bcd_tb.conv1_binary[11] top.arith_convert_bin2bcd_tb.conv1_binary[10] top.arith_convert_bin2bcd_tb.conv1_binary[9] top.arith_convert_bin2bcd_tb.conv1_binary[8] top.arith_convert_bin2bcd_tb.conv1_binary[7] top.arith_convert_bin2bcd_tb.conv1_binary[6] top.arith_convert_bin2bcd_tb.conv1_binary[5] top.arith_convert_bin2bcd_tb.conv1_binary[4] top.arith_convert_bin2bcd_tb.conv1_binary[3] top.arith_convert_bin2bcd_tb.conv1_binary[2] top.arith_convert_bin2bcd_tb.conv1_binary[1] top.arith_convert_bin2bcd_tb.conv1_binary[0] -@28 -top.arith_convert_bin2bcd_tb.conv1_sign -@22 -#{top.arith_convert_bin2bcd_tb.conv1_bcddigits[0][3:0]} top.arith_convert_bin2bcd_tb.conv1_bcddigits[0][3] top.arith_convert_bin2bcd_tb.conv1_bcddigits[0][2] top.arith_convert_bin2bcd_tb.conv1_bcddigits[0][1] top.arith_convert_bin2bcd_tb.conv1_bcddigits[0][0] -@c00022 -#{top.arith_convert_bin2bcd_tb.conv1_bcddigits[1][3:0]} top.arith_convert_bin2bcd_tb.conv1_bcddigits[1][3] top.arith_convert_bin2bcd_tb.conv1_bcddigits[1][2] top.arith_convert_bin2bcd_tb.conv1_bcddigits[1][1] top.arith_convert_bin2bcd_tb.conv1_bcddigits[1][0] -@28 -top.arith_convert_bin2bcd_tb.conv1_bcddigits[1][3] -top.arith_convert_bin2bcd_tb.conv1_bcddigits[1][2] -top.arith_convert_bin2bcd_tb.conv1_bcddigits[1][1] -top.arith_convert_bin2bcd_tb.conv1_bcddigits[1][0] -@1401200 --group_end -@22 -#{top.arith_convert_bin2bcd_tb.conv1_bcddigits[2][3:0]} top.arith_convert_bin2bcd_tb.conv1_bcddigits[2][3] top.arith_convert_bin2bcd_tb.conv1_bcddigits[2][2] top.arith_convert_bin2bcd_tb.conv1_bcddigits[2][1] top.arith_convert_bin2bcd_tb.conv1_bcddigits[2][0] -#{top.arith_convert_bin2bcd_tb.conv1_bcddigits[3][3:0]} top.arith_convert_bin2bcd_tb.conv1_bcddigits[3][3] top.arith_convert_bin2bcd_tb.conv1_bcddigits[3][2] top.arith_convert_bin2bcd_tb.conv1_bcddigits[3][1] top.arith_convert_bin2bcd_tb.conv1_bcddigits[3][0] -#{top.arith_convert_bin2bcd_tb.conv1_bcddigits[4][3:0]} top.arith_convert_bin2bcd_tb.conv1_bcddigits[4][3] top.arith_convert_bin2bcd_tb.conv1_bcddigits[4][2] top.arith_convert_bin2bcd_tb.conv1_bcddigits[4][1] top.arith_convert_bin2bcd_tb.conv1_bcddigits[4][0] -#{top.arith_convert_bin2bcd_tb.conv1_bcddigits[5][3:0]} top.arith_convert_bin2bcd_tb.conv1_bcddigits[5][3] top.arith_convert_bin2bcd_tb.conv1_bcddigits[5][2] top.arith_convert_bin2bcd_tb.conv1_bcddigits[5][1] top.arith_convert_bin2bcd_tb.conv1_bcddigits[5][0] -#{top.arith_convert_bin2bcd_tb.conv1_bcddigits[6][3:0]} top.arith_convert_bin2bcd_tb.conv1_bcddigits[6][3] top.arith_convert_bin2bcd_tb.conv1_bcddigits[6][2] top.arith_convert_bin2bcd_tb.conv1_bcddigits[6][1] top.arith_convert_bin2bcd_tb.conv1_bcddigits[6][0] -#{top.arith_convert_bin2bcd_tb.conv1_bcddigits[7][3:0]} top.arith_convert_bin2bcd_tb.conv1_bcddigits[7][3] top.arith_convert_bin2bcd_tb.conv1_bcddigits[7][2] top.arith_convert_bin2bcd_tb.conv1_bcddigits[7][1] top.arith_convert_bin2bcd_tb.conv1_bcddigits[7][0] -@1000200 --Conv1 -@800200 --Conv2 -@420 -#{top.arith_convert_bin2bcd_tb.conv2_binary[26:0]} top.arith_convert_bin2bcd_tb.conv2_binary[26] top.arith_convert_bin2bcd_tb.conv2_binary[25] top.arith_convert_bin2bcd_tb.conv2_binary[24] top.arith_convert_bin2bcd_tb.conv2_binary[23] top.arith_convert_bin2bcd_tb.conv2_binary[22] top.arith_convert_bin2bcd_tb.conv2_binary[21] top.arith_convert_bin2bcd_tb.conv2_binary[20] top.arith_convert_bin2bcd_tb.conv2_binary[19] top.arith_convert_bin2bcd_tb.conv2_binary[18] top.arith_convert_bin2bcd_tb.conv2_binary[17] top.arith_convert_bin2bcd_tb.conv2_binary[16] top.arith_convert_bin2bcd_tb.conv2_binary[15] top.arith_convert_bin2bcd_tb.conv2_binary[14] top.arith_convert_bin2bcd_tb.conv2_binary[13] top.arith_convert_bin2bcd_tb.conv2_binary[12] top.arith_convert_bin2bcd_tb.conv2_binary[11] top.arith_convert_bin2bcd_tb.conv2_binary[10] top.arith_convert_bin2bcd_tb.conv2_binary[9] top.arith_convert_bin2bcd_tb.conv2_binary[8] top.arith_convert_bin2bcd_tb.conv2_binary[7] top.arith_convert_bin2bcd_tb.conv2_binary[6] top.arith_convert_bin2bcd_tb.conv2_binary[5] top.arith_convert_bin2bcd_tb.conv2_binary[4] top.arith_convert_bin2bcd_tb.conv2_binary[3] top.arith_convert_bin2bcd_tb.conv2_binary[2] top.arith_convert_bin2bcd_tb.conv2_binary[1] top.arith_convert_bin2bcd_tb.conv2_binary[0] -@28 -top.arith_convert_bin2bcd_tb.conv2_sign -@22 -#{top.arith_convert_bin2bcd_tb.conv2_bcddigits[0][3:0]} top.arith_convert_bin2bcd_tb.conv2_bcddigits[0][3] top.arith_convert_bin2bcd_tb.conv2_bcddigits[0][2] top.arith_convert_bin2bcd_tb.conv2_bcddigits[0][1] top.arith_convert_bin2bcd_tb.conv2_bcddigits[0][0] -#{top.arith_convert_bin2bcd_tb.conv2_bcddigits[1][3:0]} top.arith_convert_bin2bcd_tb.conv2_bcddigits[1][3] top.arith_convert_bin2bcd_tb.conv2_bcddigits[1][2] top.arith_convert_bin2bcd_tb.conv2_bcddigits[1][1] top.arith_convert_bin2bcd_tb.conv2_bcddigits[1][0] -#{top.arith_convert_bin2bcd_tb.conv2_bcddigits[2][3:0]} top.arith_convert_bin2bcd_tb.conv2_bcddigits[2][3] top.arith_convert_bin2bcd_tb.conv2_bcddigits[2][2] top.arith_convert_bin2bcd_tb.conv2_bcddigits[2][1] top.arith_convert_bin2bcd_tb.conv2_bcddigits[2][0] -#{top.arith_convert_bin2bcd_tb.conv2_bcddigits[3][3:0]} top.arith_convert_bin2bcd_tb.conv2_bcddigits[3][3] top.arith_convert_bin2bcd_tb.conv2_bcddigits[3][2] top.arith_convert_bin2bcd_tb.conv2_bcddigits[3][1] top.arith_convert_bin2bcd_tb.conv2_bcddigits[3][0] -#{top.arith_convert_bin2bcd_tb.conv2_bcddigits[4][3:0]} top.arith_convert_bin2bcd_tb.conv2_bcddigits[4][3] top.arith_convert_bin2bcd_tb.conv2_bcddigits[4][2] top.arith_convert_bin2bcd_tb.conv2_bcddigits[4][1] top.arith_convert_bin2bcd_tb.conv2_bcddigits[4][0] -#{top.arith_convert_bin2bcd_tb.conv2_bcddigits[5][3:0]} top.arith_convert_bin2bcd_tb.conv2_bcddigits[5][3] top.arith_convert_bin2bcd_tb.conv2_bcddigits[5][2] top.arith_convert_bin2bcd_tb.conv2_bcddigits[5][1] top.arith_convert_bin2bcd_tb.conv2_bcddigits[5][0] -#{top.arith_convert_bin2bcd_tb.conv2_bcddigits[6][3:0]} top.arith_convert_bin2bcd_tb.conv2_bcddigits[6][3] top.arith_convert_bin2bcd_tb.conv2_bcddigits[6][2] top.arith_convert_bin2bcd_tb.conv2_bcddigits[6][1] top.arith_convert_bin2bcd_tb.conv2_bcddigits[6][0] -@23 -#{top.arith_convert_bin2bcd_tb.conv2_bcddigits[7][3:0]} top.arith_convert_bin2bcd_tb.conv2_bcddigits[7][3] top.arith_convert_bin2bcd_tb.conv2_bcddigits[7][2] top.arith_convert_bin2bcd_tb.conv2_bcddigits[7][1] top.arith_convert_bin2bcd_tb.conv2_bcddigits[7][0] -@1000200 --Conv2 -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/arith/arith_convert_bin2bcd_tb.wcfg b/sim/arith/arith_convert_bin2bcd_tb.wcfg deleted file mode 100644 index 3ee56a5d9..000000000 --- a/sim/arith/arith_convert_bin2bcd_tb.wcfg +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - clock - clock - - - reset - reset - - - start - start - - - Converter 1 - label - 128 128 255 - 230 230 230 - - - busy - busy - - - binary[29:0] - binary[29:0] - UNSIGNEDDECRADIX - - - issigned - issigned - - - bcddigits[7:0] - bcddigits[7:0] - UNSIGNEDDECRADIX - - [7] - bcddigits[7] - UNSIGNEDDECRADIX - - - [6] - bcddigits[6] - UNSIGNEDDECRADIX - - - [5] - bcddigits[5] - UNSIGNEDDECRADIX - - - [4] - bcddigits[4] - UNSIGNEDDECRADIX - - - [3] - bcddigits[3] - UNSIGNEDDECRADIX - - - [2] - bcddigits[2] - UNSIGNEDDECRADIX - - - [1] - bcddigits[1] - UNSIGNEDDECRADIX - - - [0] - bcddigits[0] - UNSIGNEDDECRADIX - - - - sign - sign - - - internal - label - - label - digit_d[3:0] - digit_d[3:0] - Digit 0 - UNSIGNEDDECRADIX - - - label - digit_d[3:0] - digit_d[3:0] - Digit 1 - UNSIGNEDDECRADIX - - - label - digit_d[3:0] - digit_d[3:0] - Digit 2 - UNSIGNEDDECRADIX - - - label - digit_d[3:0] - digit_d[3:0] - Digit 3 - UNSIGNEDDECRADIX - - - label - digit_d[3:0] - digit_d[3:0] - Digit 4 - UNSIGNEDDECRADIX - - - label - digit_d[3:0] - digit_d[3:0] - Digit 5 - UNSIGNEDDECRADIX - - - label - digit_d[3:0] - digit_d[3:0] - Digit 6 - UNSIGNEDDECRADIX - - - label - digit_d[3:0] - digit_d[3:0] - Digit 7 - UNSIGNEDDECRADIX - - - - Converter 2 - label - 128 128 255 - 230 230 230 - - - busy - busy - - - binary[26:0] - binary[26:0] - UNSIGNEDDECRADIX - - - issigned - issigned - - - bcddigits[7:0] - bcddigits[7:0] - UNSIGNEDDECRADIX - - [7] - bcddigits[7] - UNSIGNEDDECRADIX - - - [6] - bcddigits[6] - UNSIGNEDDECRADIX - - - [5] - bcddigits[5] - UNSIGNEDDECRADIX - - - [4] - bcddigits[4] - UNSIGNEDDECRADIX - - - [3] - bcddigits[3] - UNSIGNEDDECRADIX - - - [2] - bcddigits[2] - UNSIGNEDDECRADIX - - - [1] - bcddigits[1] - UNSIGNEDDECRADIX - - - [0] - bcddigits[0] - UNSIGNEDDECRADIX - - - - sign - sign - - - internal - label - - label - digit_d[3:0] - digit_d[3:0] - UNSIGNEDDECRADIX - Digit 0 - - - label - digit_d[3:0] - digit_d[3:0] - UNSIGNEDDECRADIX - Digit 1 - - - label - digit_d[3:0] - digit_d[3:0] - UNSIGNEDDECRADIX - Digit 2 - - - label - digit_d[3:0] - digit_d[3:0] - UNSIGNEDDECRADIX - Digit 3 - - - label - digit_d[3:0] - digit_d[3:0] - UNSIGNEDDECRADIX - Digit 4 - - - label - digit_d[3:0] - digit_d[3:0] - UNSIGNEDDECRADIX - Digit 5 - - - label - digit_d[3:0] - digit_d[3:0] - UNSIGNEDDECRADIX - Digit 6 - - - label - digit_d[3:0] - digit_d[3:0] - UNSIGNEDDECRADIX - Digit 7 - - - diff --git a/sim/arith/arith_convert_bin2bcd_tb.wdo b/sim/arith/arith_convert_bin2bcd_tb.wdo deleted file mode 100644 index 339a6161e..000000000 --- a/sim/arith/arith_convert_bin2bcd_tb.wdo +++ /dev/null @@ -1,28 +0,0 @@ -onerror {resume} -quietly WaveActivateNextPane {} 0 -add wave -noupdate /arith_convert_bin2bcd_tb/Clock -add wave -noupdate /arith_convert_bin2bcd_tb/Reset -add wave -noupdate /arith_convert_bin2bcd_tb/Start -add wave -noupdate -radix decimal /arith_convert_bin2bcd_tb/Conv1_Binary -add wave -noupdate -expand /arith_convert_bin2bcd_tb/Conv1_BCDDigits -add wave -noupdate -radix decimal /arith_convert_bin2bcd_tb/Conv2_Binary -add wave -noupdate -expand /arith_convert_bin2bcd_tb/Conv2_BCDDigits -add wave -noupdate /arith_convert_bin2bcd_tb/Conv2_Sign -TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 1} {0 fs} 0} -quietly wave cursor active 0 -configure wave -namecolwidth 279 -configure wave -valuecolwidth 130 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 -configure wave -gridoffset 0 -configure wave -gridperiod 1 -configure wave -griddelta 40 -configure wave -timeline 0 -configure wave -timelineunits ns -update -WaveRestoreZoom {0 fs} {1113 ns} diff --git a/sim/arith/arith_counter_gray_tb.wcfg b/sim/arith/arith_counter_gray_tb.wcfg deleted file mode 100644 index 47af2b5a5..000000000 --- a/sim/arith/arith_counter_gray_tb.wcfg +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - clk - clk - - - rst - rst - - - inc - inc - - - dec - dec - - - val[7:0] - val[7:0] - - - cry - cry - - - isim_i[7:0] - isim_i[7:0] - UNSIGNEDDECRADIX - - diff --git a/sim/arith/arith_prefix_and_tb.ghdl b/sim/arith/arith_prefix_and_tb.ghdl deleted file mode 100644 index cd25c9928..000000000 --- a/sim/arith/arith_prefix_and_tb.ghdl +++ /dev/null @@ -1,8 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/arith_prefix_and_tb/clock -/arith_prefix_and_tb/x -/arith_prefix_and_tb/y diff --git a/sim/arith/arith_prefix_and_tb.gtkw b/sim/arith/arith_prefix_and_tb.gtkw deleted file mode 100644 index 3bbf833ee..000000000 --- a/sim/arith/arith_prefix_and_tb.gtkw +++ /dev/null @@ -1,46 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.61 (w)1999-2014 BSI -[*] Sat Feb 06 00:35:00 2016 -[*] -[dumpfile_mtime] "Sat Feb 06 00:31:35 2016" -[dumpfile_size] 9001 -[timestart] 0 -[size] 1680 997 -[pos] -113 -113 -*-28.571043 -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 -[treeopen] top. -[treeopen] top.arith_prefix_and_tb. -[sst_width] 197 -[signals_width] 112 -[sst_expanded] 1 -[sst_vpaned_height] 293 -@28 -top.arith_prefix_and_tb.clock -@c00023 -#{top.arith_prefix_and_tb.x[7:0]} top.arith_prefix_and_tb.x[7] top.arith_prefix_and_tb.x[6] top.arith_prefix_and_tb.x[5] top.arith_prefix_and_tb.x[4] top.arith_prefix_and_tb.x[3] top.arith_prefix_and_tb.x[2] top.arith_prefix_and_tb.x[1] top.arith_prefix_and_tb.x[0] -@28 -top.arith_prefix_and_tb.x[7] -top.arith_prefix_and_tb.x[6] -top.arith_prefix_and_tb.x[5] -top.arith_prefix_and_tb.x[4] -top.arith_prefix_and_tb.x[3] -top.arith_prefix_and_tb.x[2] -top.arith_prefix_and_tb.x[1] -top.arith_prefix_and_tb.x[0] -@1401201 --group_end -@800022 -#{top.arith_prefix_and_tb.y[7:0]} top.arith_prefix_and_tb.y[7] top.arith_prefix_and_tb.y[6] top.arith_prefix_and_tb.y[5] top.arith_prefix_and_tb.y[4] top.arith_prefix_and_tb.y[3] top.arith_prefix_and_tb.y[2] top.arith_prefix_and_tb.y[1] top.arith_prefix_and_tb.y[0] -@28 -top.arith_prefix_and_tb.y[7] -top.arith_prefix_and_tb.y[6] -top.arith_prefix_and_tb.y[5] -top.arith_prefix_and_tb.y[4] -top.arith_prefix_and_tb.y[3] -top.arith_prefix_and_tb.y[2] -top.arith_prefix_and_tb.y[1] -top.arith_prefix_and_tb.y[0] -@1001200 --group_end -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/arith/arith_prefix_or_tb.ghdl b/sim/arith/arith_prefix_or_tb.ghdl deleted file mode 100644 index fd6d51489..000000000 --- a/sim/arith/arith_prefix_or_tb.ghdl +++ /dev/null @@ -1,8 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/arith_prefix_or_tb/clock -/arith_prefix_or_tb/x -/arith_prefix_or_tb/y diff --git a/sim/arith/arith_prefix_or_tb.gtkw b/sim/arith/arith_prefix_or_tb.gtkw deleted file mode 100644 index 5066a0de2..000000000 --- a/sim/arith/arith_prefix_or_tb.gtkw +++ /dev/null @@ -1,35 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.61 (w)1999-2014 BSI -[*] Sat Feb 06 00:36:50 2016 -[*] -[dumpfile_mtime] "Sat Feb 06 00:35:46 2016" -[dumpfile_size] 8242 -[timestart] 0 -[size] 1680 997 -[pos] -217 -217 -*-28.564495 -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 -[treeopen] top. -[treeopen] top.arith_prefix_or_tb. -[sst_width] 197 -[signals_width] 106 -[sst_expanded] 1 -[sst_vpaned_height] 293 -@28 -top.arith_prefix_or_tb.clock -@22 -#{top.arith_prefix_or_tb.x[7:0]} top.arith_prefix_or_tb.x[7] top.arith_prefix_or_tb.x[6] top.arith_prefix_or_tb.x[5] top.arith_prefix_or_tb.x[4] top.arith_prefix_or_tb.x[3] top.arith_prefix_or_tb.x[2] top.arith_prefix_or_tb.x[1] top.arith_prefix_or_tb.x[0] -@800023 -#{top.arith_prefix_or_tb.y[7:0]} top.arith_prefix_or_tb.y[7] top.arith_prefix_or_tb.y[6] top.arith_prefix_or_tb.y[5] top.arith_prefix_or_tb.y[4] top.arith_prefix_or_tb.y[3] top.arith_prefix_or_tb.y[2] top.arith_prefix_or_tb.y[1] top.arith_prefix_or_tb.y[0] -@29 -top.arith_prefix_or_tb.y[7] -top.arith_prefix_or_tb.y[6] -top.arith_prefix_or_tb.y[5] -top.arith_prefix_or_tb.y[4] -top.arith_prefix_or_tb.y[3] -top.arith_prefix_or_tb.y[2] -top.arith_prefix_or_tb.y[1] -top.arith_prefix_or_tb.y[0] -@1001201 --group_end -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/arith/arith_prng_tb.ghdl b/sim/arith/arith_prng_tb.ghdl deleted file mode 100644 index 4b40cab35..000000000 --- a/sim/arith/arith_prng_tb.ghdl +++ /dev/null @@ -1,3 +0,0 @@ -$ version 1.1 - -/arith_prng_tb/* diff --git a/sim/arith/arith_prng_tb.gtkw b/sim/arith/arith_prng_tb.gtkw deleted file mode 100644 index ddda501c6..000000000 --- a/sim/arith/arith_prng_tb.gtkw +++ /dev/null @@ -1,36 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.69 (w)1999-2016 BSI -[*] Sun Mar 20 22:40:35 2016 -[*] -[dumpfile_mtime] "Sun Mar 20 22:40:32 2016" -[dumpfile_size] 8919 -[timestart] 0 -[size] 1676 996 -[pos] -1 -1 -*-28.718517 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 -[treeopen] top. -[treeopen] top.arith_prng_tb. -[sst_width] 197 -[signals_width] 209 -[sst_expanded] 1 -[sst_vpaned_height] 292 -@28 -top.arith_prng_tb.clock -top.arith_prng_tb.reset -@c00022 -#{top.arith_prng_tb.prng_value[7:0]} top.arith_prng_tb.prng_value[7] top.arith_prng_tb.prng_value[6] top.arith_prng_tb.prng_value[5] top.arith_prng_tb.prng_value[4] top.arith_prng_tb.prng_value[3] top.arith_prng_tb.prng_value[2] top.arith_prng_tb.prng_value[1] top.arith_prng_tb.prng_value[0] -@28 -top.arith_prng_tb.prng_value[7] -top.arith_prng_tb.prng_value[6] -top.arith_prng_tb.prng_value[5] -top.arith_prng_tb.prng_value[4] -top.arith_prng_tb.prng_value[3] -top.arith_prng_tb.prng_value[2] -top.arith_prng_tb.prng_value[1] -top.arith_prng_tb.prng_value[0] -@1401200 --group_end -@29 -top.arith_prng_tb.test_got -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/arith/arith_prng_tb.wcfg b/sim/arith/arith_prng_tb.wcfg deleted file mode 100644 index a4b0cc384..000000000 --- a/sim/arith/arith_prng_tb.wcfg +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - clock - clock - - - reset - reset - - - test_got - test_got - - - prng_value[7:0] - prng_value[7:0] - UNSIGNEDDECRADIX - - diff --git a/sim/arith/arith_prng_tb.wdo b/sim/arith/arith_prng_tb.wdo deleted file mode 100644 index e6a318eed..000000000 --- a/sim/arith/arith_prng_tb.wdo +++ /dev/null @@ -1,24 +0,0 @@ -onerror {resume} -quietly WaveActivateNextPane {} 0 -add wave -noupdate /arith_prng_tb/Clock -add wave -noupdate /arith_prng_tb/Reset -add wave -noupdate /arith_prng_tb/PRNG_Value -add wave -noupdate /arith_prng_tb/Test_got -TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 1} {2594999323 fs} 0} -quietly wave cursor active 1 -configure wave -namecolwidth 199 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 -configure wave -gridoffset 0 -configure wave -gridperiod 1 -configure wave -griddelta 40 -configure wave -timeline 0 -configure wave -timelineunits ns -update -WaveRestoreZoom {0 fs} {2824500 ps} diff --git a/sim/dstruct/dstruct_deque_tb.ghdl b/sim/dstruct/dstruct_deque_tb.ghdl deleted file mode 100644 index 927685810..000000000 --- a/sim/dstruct/dstruct_deque_tb.ghdl +++ /dev/null @@ -1,48 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/dstruct_deque_tb/clk -/dstruct_deque_tb/rst -/dstruct_deque_tb/dina -/dstruct_deque_tb/puta -/dstruct_deque_tb/gota -/dstruct_deque_tb/douta -/dstruct_deque_tb/fulla -/dstruct_deque_tb/valida -/dstruct_deque_tb/dinb -/dstruct_deque_tb/putb -/dstruct_deque_tb/gotb -/dstruct_deque_tb/doutb -/dstruct_deque_tb/validb -/dstruct_deque_tb/fullb -/dstruct_deque_tb/dut/clk -/dstruct_deque_tb/dut/rst -/dstruct_deque_tb/dut/dina -/dstruct_deque_tb/dut/puta -/dstruct_deque_tb/dut/gota -/dstruct_deque_tb/dut/douta -/dstruct_deque_tb/dut/valida -/dstruct_deque_tb/dut/fulla -/dstruct_deque_tb/dut/dinb -/dstruct_deque_tb/dut/putb -/dstruct_deque_tb/dut/gotb -/dstruct_deque_tb/dut/doutb -/dstruct_deque_tb/dut/validb -/dstruct_deque_tb/dut/fullb -/dstruct_deque_tb/dut/combined -/dstruct_deque_tb/dut/ctrl -/dstruct_deque_tb/dut/sub -/dstruct_deque_tb/dut/last_operation -/dstruct_deque_tb/dut/last_op_ctrl -/dstruct_deque_tb/dut/delayed_valid -/dstruct_deque_tb/dut/delay -/dstruct_deque_tb/dut/stackpointera -/dstruct_deque_tb/dut/wea -/dstruct_deque_tb/dut/stackpointerb -/dstruct_deque_tb/dut/web -/dstruct_deque_tb/dut/ctrla -/dstruct_deque_tb/dut/ctrlb -/dstruct_deque_tb/dut/adra -/dstruct_deque_tb/dut/adrb diff --git a/sim/dstruct/dstruct_deque_tb.gtkw b/sim/dstruct/dstruct_deque_tb.gtkw deleted file mode 100644 index 2d156f63d..000000000 --- a/sim/dstruct/dstruct_deque_tb.gtkw +++ /dev/null @@ -1,58 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.62 (w)1999-2014 BSI -[*] Tue Feb 16 19:54:18 2016 -[*] -[timestart] 0 -[size] 1680 1050 -[pos] -1 -1 -*-32.757900 0 -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 -[treeopen] top. -[treeopen] top.dstruct_deque_tb. -[treeopen] top.dstruct_deque_tb.dut. -[treeopen] top.dstruct_deque_tb.dut.ram. -[sst_width] 210 -[signals_width] 214 -[sst_expanded] 1 -[sst_vpaned_height] 326 -@28 -top.dstruct_deque_tb.clk -top.dstruct_deque_tb.rst -@200 --Deque -@22 -#{top.dstruct_deque_tb.dina[15:0]} top.dstruct_deque_tb.dina[15] top.dstruct_deque_tb.dina[14] top.dstruct_deque_tb.dina[13] top.dstruct_deque_tb.dina[12] top.dstruct_deque_tb.dina[11] top.dstruct_deque_tb.dina[10] top.dstruct_deque_tb.dina[9] top.dstruct_deque_tb.dina[8] top.dstruct_deque_tb.dina[7] top.dstruct_deque_tb.dina[6] top.dstruct_deque_tb.dina[5] top.dstruct_deque_tb.dina[4] top.dstruct_deque_tb.dina[3] top.dstruct_deque_tb.dina[2] top.dstruct_deque_tb.dina[1] top.dstruct_deque_tb.dina[0] -@28 -top.dstruct_deque_tb.fulla -top.dstruct_deque_tb.puta -@22 -#{top.dstruct_deque_tb.douta[15:0]} top.dstruct_deque_tb.douta[15] top.dstruct_deque_tb.douta[14] top.dstruct_deque_tb.douta[13] top.dstruct_deque_tb.douta[12] top.dstruct_deque_tb.douta[11] top.dstruct_deque_tb.douta[10] top.dstruct_deque_tb.douta[9] top.dstruct_deque_tb.douta[8] top.dstruct_deque_tb.douta[7] top.dstruct_deque_tb.douta[6] top.dstruct_deque_tb.douta[5] top.dstruct_deque_tb.douta[4] top.dstruct_deque_tb.douta[3] top.dstruct_deque_tb.douta[2] top.dstruct_deque_tb.douta[1] top.dstruct_deque_tb.douta[0] -@28 -top.dstruct_deque_tb.valida -top.dstruct_deque_tb.gota -@22 -#{top.dstruct_deque_tb.dinb[15:0]} top.dstruct_deque_tb.dinb[15] top.dstruct_deque_tb.dinb[14] top.dstruct_deque_tb.dinb[13] top.dstruct_deque_tb.dinb[12] top.dstruct_deque_tb.dinb[11] top.dstruct_deque_tb.dinb[10] top.dstruct_deque_tb.dinb[9] top.dstruct_deque_tb.dinb[8] top.dstruct_deque_tb.dinb[7] top.dstruct_deque_tb.dinb[6] top.dstruct_deque_tb.dinb[5] top.dstruct_deque_tb.dinb[4] top.dstruct_deque_tb.dinb[3] top.dstruct_deque_tb.dinb[2] top.dstruct_deque_tb.dinb[1] top.dstruct_deque_tb.dinb[0] -@28 -top.dstruct_deque_tb.fullb -top.dstruct_deque_tb.putb -@22 -#{top.dstruct_deque_tb.doutb[15:0]} top.dstruct_deque_tb.doutb[15] top.dstruct_deque_tb.doutb[14] top.dstruct_deque_tb.doutb[13] top.dstruct_deque_tb.doutb[12] top.dstruct_deque_tb.doutb[11] top.dstruct_deque_tb.doutb[10] top.dstruct_deque_tb.doutb[9] top.dstruct_deque_tb.doutb[8] top.dstruct_deque_tb.doutb[7] top.dstruct_deque_tb.doutb[6] top.dstruct_deque_tb.doutb[5] top.dstruct_deque_tb.doutb[4] top.dstruct_deque_tb.doutb[3] top.dstruct_deque_tb.doutb[2] top.dstruct_deque_tb.doutb[1] top.dstruct_deque_tb.doutb[0] -@28 -top.dstruct_deque_tb.validb -top.dstruct_deque_tb.gotb -@200 --RAM -@28 -top.dstruct_deque_tb.dut.ram.we1 -@22 -#{top.dstruct_deque_tb.dut.ram.a1[6:0]} top.dstruct_deque_tb.dut.ram.a1[6] top.dstruct_deque_tb.dut.ram.a1[5] top.dstruct_deque_tb.dut.ram.a1[4] top.dstruct_deque_tb.dut.ram.a1[3] top.dstruct_deque_tb.dut.ram.a1[2] top.dstruct_deque_tb.dut.ram.a1[1] top.dstruct_deque_tb.dut.ram.a1[0] -#{top.dstruct_deque_tb.dut.ram.d1[15:0]} top.dstruct_deque_tb.dut.ram.d1[15] top.dstruct_deque_tb.dut.ram.d1[14] top.dstruct_deque_tb.dut.ram.d1[13] top.dstruct_deque_tb.dut.ram.d1[12] top.dstruct_deque_tb.dut.ram.d1[11] top.dstruct_deque_tb.dut.ram.d1[10] top.dstruct_deque_tb.dut.ram.d1[9] top.dstruct_deque_tb.dut.ram.d1[8] top.dstruct_deque_tb.dut.ram.d1[7] top.dstruct_deque_tb.dut.ram.d1[6] top.dstruct_deque_tb.dut.ram.d1[5] top.dstruct_deque_tb.dut.ram.d1[4] top.dstruct_deque_tb.dut.ram.d1[3] top.dstruct_deque_tb.dut.ram.d1[2] top.dstruct_deque_tb.dut.ram.d1[1] top.dstruct_deque_tb.dut.ram.d1[0] -#{top.dstruct_deque_tb.dut.ram.q1[15:0]} top.dstruct_deque_tb.dut.ram.q1[15] top.dstruct_deque_tb.dut.ram.q1[14] top.dstruct_deque_tb.dut.ram.q1[13] top.dstruct_deque_tb.dut.ram.q1[12] top.dstruct_deque_tb.dut.ram.q1[11] top.dstruct_deque_tb.dut.ram.q1[10] top.dstruct_deque_tb.dut.ram.q1[9] top.dstruct_deque_tb.dut.ram.q1[8] top.dstruct_deque_tb.dut.ram.q1[7] top.dstruct_deque_tb.dut.ram.q1[6] top.dstruct_deque_tb.dut.ram.q1[5] top.dstruct_deque_tb.dut.ram.q1[4] top.dstruct_deque_tb.dut.ram.q1[3] top.dstruct_deque_tb.dut.ram.q1[2] top.dstruct_deque_tb.dut.ram.q1[1] top.dstruct_deque_tb.dut.ram.q1[0] -@28 -top.dstruct_deque_tb.dut.ram.we2 -@22 -#{top.dstruct_deque_tb.dut.ram.a2[6:0]} top.dstruct_deque_tb.dut.ram.a2[6] top.dstruct_deque_tb.dut.ram.a2[5] top.dstruct_deque_tb.dut.ram.a2[4] top.dstruct_deque_tb.dut.ram.a2[3] top.dstruct_deque_tb.dut.ram.a2[2] top.dstruct_deque_tb.dut.ram.a2[1] top.dstruct_deque_tb.dut.ram.a2[0] -#{top.dstruct_deque_tb.dut.ram.d2[15:0]} top.dstruct_deque_tb.dut.ram.d2[15] top.dstruct_deque_tb.dut.ram.d2[14] top.dstruct_deque_tb.dut.ram.d2[13] top.dstruct_deque_tb.dut.ram.d2[12] top.dstruct_deque_tb.dut.ram.d2[11] top.dstruct_deque_tb.dut.ram.d2[10] top.dstruct_deque_tb.dut.ram.d2[9] top.dstruct_deque_tb.dut.ram.d2[8] top.dstruct_deque_tb.dut.ram.d2[7] top.dstruct_deque_tb.dut.ram.d2[6] top.dstruct_deque_tb.dut.ram.d2[5] top.dstruct_deque_tb.dut.ram.d2[4] top.dstruct_deque_tb.dut.ram.d2[3] top.dstruct_deque_tb.dut.ram.d2[2] top.dstruct_deque_tb.dut.ram.d2[1] top.dstruct_deque_tb.dut.ram.d2[0] -@23 -#{top.dstruct_deque_tb.dut.ram.q2[15:0]} top.dstruct_deque_tb.dut.ram.q2[15] top.dstruct_deque_tb.dut.ram.q2[14] top.dstruct_deque_tb.dut.ram.q2[13] top.dstruct_deque_tb.dut.ram.q2[12] top.dstruct_deque_tb.dut.ram.q2[11] top.dstruct_deque_tb.dut.ram.q2[10] top.dstruct_deque_tb.dut.ram.q2[9] top.dstruct_deque_tb.dut.ram.q2[8] top.dstruct_deque_tb.dut.ram.q2[7] top.dstruct_deque_tb.dut.ram.q2[6] top.dstruct_deque_tb.dut.ram.q2[5] top.dstruct_deque_tb.dut.ram.q2[4] top.dstruct_deque_tb.dut.ram.q2[3] top.dstruct_deque_tb.dut.ram.q2[2] top.dstruct_deque_tb.dut.ram.q2[1] top.dstruct_deque_tb.dut.ram.q2[0] -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/dstruct/dstruct_stack_tb.ghdl b/sim/dstruct/dstruct_stack_tb.ghdl deleted file mode 100644 index db6d49688..000000000 --- a/sim/dstruct/dstruct_stack_tb.ghdl +++ /dev/null @@ -1,32 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/dstruct_stack_tb/clk -/dstruct_stack_tb/rst -/dstruct_stack_tb/din -/dstruct_stack_tb/put -/dstruct_stack_tb/got -/dstruct_stack_tb/dout -/dstruct_stack_tb/full -/dstruct_stack_tb/valid -/dstruct_stack_tb/empty -/dstruct_stack_tb/dut/clk -/dstruct_stack_tb/dut/rst -/dstruct_stack_tb/dut/din -/dstruct_stack_tb/dut/put -/dstruct_stack_tb/dut/full -/dstruct_stack_tb/dut/got -/dstruct_stack_tb/dut/dout -/dstruct_stack_tb/dut/valid -/dstruct_stack_tb/dut/stackpointer -/dstruct_stack_tb/dut/we -/dstruct_stack_tb/dut/adr -/dstruct_stack_tb/dut/s_adr -/dstruct_stack_tb/dut/s_dout -/dstruct_stack_tb/dut/s_valid -/dstruct_stack_tb/dut/s_din -/dstruct_stack_tb/dut/ctrl -/dstruct_stack_tb/dut/current_state -/dstruct_stack_tb/dut/next_state diff --git a/sim/dstruct/dstruct_stack_tb.gtkw b/sim/dstruct/dstruct_stack_tb.gtkw deleted file mode 100644 index d2a886db8..000000000 --- a/sim/dstruct/dstruct_stack_tb.gtkw +++ /dev/null @@ -1,43 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.62 (w)1999-2014 BSI -[*] -[timestart] 0 -[size] 1680 1050 -[pos] -1 -1 -*-29.910084 0 -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 -[treeopen] top. -[treeopen] top.dstruct_stack_tb. -[treeopen] top.dstruct_stack_tb.dut. -[sst_width] 222 -[signals_width] 194 -[sst_expanded] 1 -[sst_vpaned_height] 326 -@28 -top.dstruct_stack_tb.clk -top.dstruct_stack_tb.rst -@200 --Stack -@29 -top.dstruct_stack_tb.dut.current_state -@22 -#{top.dstruct_stack_tb.din[15:0]} top.dstruct_stack_tb.din[15] top.dstruct_stack_tb.din[14] top.dstruct_stack_tb.din[13] top.dstruct_stack_tb.din[12] top.dstruct_stack_tb.din[11] top.dstruct_stack_tb.din[10] top.dstruct_stack_tb.din[9] top.dstruct_stack_tb.din[8] top.dstruct_stack_tb.din[7] top.dstruct_stack_tb.din[6] top.dstruct_stack_tb.din[5] top.dstruct_stack_tb.din[4] top.dstruct_stack_tb.din[3] top.dstruct_stack_tb.din[2] top.dstruct_stack_tb.din[1] top.dstruct_stack_tb.din[0] -@28 -top.dstruct_stack_tb.full -top.dstruct_stack_tb.put -@22 -#{top.dstruct_stack_tb.dout[15:0]} top.dstruct_stack_tb.dout[15] top.dstruct_stack_tb.dout[14] top.dstruct_stack_tb.dout[13] top.dstruct_stack_tb.dout[12] top.dstruct_stack_tb.dout[11] top.dstruct_stack_tb.dout[10] top.dstruct_stack_tb.dout[9] top.dstruct_stack_tb.dout[8] top.dstruct_stack_tb.dout[7] top.dstruct_stack_tb.dout[6] top.dstruct_stack_tb.dout[5] top.dstruct_stack_tb.dout[4] top.dstruct_stack_tb.dout[3] top.dstruct_stack_tb.dout[2] top.dstruct_stack_tb.dout[1] top.dstruct_stack_tb.dout[0] -@28 -top.dstruct_stack_tb.valid -top.dstruct_stack_tb.got -@200 --RAM -@28 -#{top.dstruct_stack_tb.dut.s_adr[2:0]} top.dstruct_stack_tb.dut.s_adr[2] top.dstruct_stack_tb.dut.s_adr[1] top.dstruct_stack_tb.dut.s_adr[0] -@22 -#{top.dstruct_stack_tb.dut.s_dout[15:0]} top.dstruct_stack_tb.dut.s_dout[15] top.dstruct_stack_tb.dut.s_dout[14] top.dstruct_stack_tb.dut.s_dout[13] top.dstruct_stack_tb.dut.s_dout[12] top.dstruct_stack_tb.dut.s_dout[11] top.dstruct_stack_tb.dut.s_dout[10] top.dstruct_stack_tb.dut.s_dout[9] top.dstruct_stack_tb.dut.s_dout[8] top.dstruct_stack_tb.dut.s_dout[7] top.dstruct_stack_tb.dut.s_dout[6] top.dstruct_stack_tb.dut.s_dout[5] top.dstruct_stack_tb.dut.s_dout[4] top.dstruct_stack_tb.dut.s_dout[3] top.dstruct_stack_tb.dut.s_dout[2] top.dstruct_stack_tb.dut.s_dout[1] top.dstruct_stack_tb.dut.s_dout[0] -@28 -top.dstruct_stack_tb.dut.ram.we -@22 -#{top.dstruct_stack_tb.dut.s_din[15:0]} top.dstruct_stack_tb.dut.s_din[15] top.dstruct_stack_tb.dut.s_din[14] top.dstruct_stack_tb.dut.s_din[13] top.dstruct_stack_tb.dut.s_din[12] top.dstruct_stack_tb.dut.s_din[11] top.dstruct_stack_tb.dut.s_din[10] top.dstruct_stack_tb.dut.s_din[9] top.dstruct_stack_tb.dut.s_din[8] top.dstruct_stack_tb.dut.s_din[7] top.dstruct_stack_tb.dut.s_din[6] top.dstruct_stack_tb.dut.s_din[5] top.dstruct_stack_tb.dut.s_din[4] top.dstruct_stack_tb.dut.s_din[3] top.dstruct_stack_tb.dut.s_din[2] top.dstruct_stack_tb.dut.s_din[1] top.dstruct_stack_tb.dut.s_din[0] -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/iSim.batch.tcl b/sim/iSim.batch.tcl deleted file mode 100644 index 1c84e7ba1..000000000 --- a/sim/iSim.batch.tcl +++ /dev/null @@ -1,3 +0,0 @@ -run all -show time -exit diff --git a/sim/iSim.gui.tcl b/sim/iSim.gui.tcl deleted file mode 100644 index b6569e9dc..000000000 --- a/sim/iSim.gui.tcl +++ /dev/null @@ -1,2 +0,0 @@ -run all -show time diff --git a/sim/io/uart/uart_rx_tb.ghdl b/sim/io/uart/uart_rx_tb.ghdl deleted file mode 100644 index b4a3e2c9c..000000000 --- a/sim/io/uart/uart_rx_tb.ghdl +++ /dev/null @@ -1,20 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/uart_rx_tb/clock -/uart_rx_tb/reset -/uart_rx_tb/bitclock -/uart_rx_tb/bitclock_x8 -/uart_rx_tb/uart_rx -/uart_rx_tb/rx_strobe -/uart_rx_tb/rx_data -/uart_rx_tb/rx/rst -/uart_rx_tb/rx/rx -/uart_rx_tb/rx/do -/uart_rx_tb/rx/stb -/uart_rx_tb/rx/rxs -/uart_rx_tb/rx/buf -/uart_rx_tb/rx/cnt -/uart_rx_tb/rx/vld diff --git a/sim/io/uart/uart_rx_tb.gtkw b/sim/io/uart/uart_rx_tb.gtkw deleted file mode 100644 index f6b482d94..000000000 --- a/sim/io/uart/uart_rx_tb.gtkw +++ /dev/null @@ -1,31 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.61 (w)1999-2014 BSI -[*] Tue Feb 09 01:06:25 2016 -[*] -[dumpfile_mtime] "Tue Feb 09 01:03:30 2016" -[dumpfile_size] 54807 -[timestart] 0 -[size] 1680 997 -[pos] -35 -35 -*-31.887627 24070000000 -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 -[treeopen] top. -[treeopen] top.uart_rx_tb. -[sst_width] 197 -[signals_width] 166 -[sst_expanded] 1 -[sst_vpaned_height] 293 -@28 -top.uart_rx_tb.clock -top.uart_rx_tb.reset -top.uart_rx_tb.uart_rx -@23 -#{top.uart_rx_tb.rx_data[7:0]} top.uart_rx_tb.rx_data[7] top.uart_rx_tb.rx_data[6] top.uart_rx_tb.rx_data[5] top.uart_rx_tb.rx_data[4] top.uart_rx_tb.rx_data[3] top.uart_rx_tb.rx_data[2] top.uart_rx_tb.rx_data[1] top.uart_rx_tb.rx_data[0] -@28 -top.uart_rx_tb.rx_strobe -@200 --BitClockGenerator -@28 -top.uart_rx_tb.bitclock_x8 -top.uart_rx_tb.bitclock -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/io/uart/uart_rx_tb.wcfg b/sim/io/uart/uart_rx_tb.wcfg deleted file mode 100644 index 8f6b35ff5..000000000 --- a/sim/io/uart/uart_rx_tb.wcfg +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - clock - clock - - - reset - reset - - - bitclock - bitclock - - - bitclock_x8 - bitclock_x8 - - - uart_rx - uart_rx - - - rx_strobe - rx_strobe - - - rx_data[7:0] - rx_data[7:0] - HEXRADIX - - diff --git a/sim/mem/lut/lut_Sine_tb.ghdl b/sim/mem/lut/lut_Sine_tb.ghdl deleted file mode 100644 index fd4d12d13..000000000 --- a/sim/mem/lut/lut_Sine_tb.ghdl +++ /dev/null @@ -1,24 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/lut_sine_tb/clock -/lut_sine_tb/sim_stop -/lut_sine_tb/lut_in -/lut_sine_tb/lut_q1_in -/lut_sine_tb/lut_q1_out -/lut_sine_tb/lut_q2_in -/lut_sine_tb/lut_q2_out -/lut_sine_tb/lut_q3_in -/lut_sine_tb/lut_q3_out -/lut_sine_tb/lut_q4_in -/lut_sine_tb/lut_q4_out -/lut_sine_tb/lutq1/input -/lut_sine_tb/lutq1/output -/lut_sine_tb/lutq2/input -/lut_sine_tb/lutq2/output -/lut_sine_tb/lutq3/input -/lut_sine_tb/lutq3/output -/lut_sine_tb/lutq4/input -/lut_sine_tb/lutq4/output diff --git a/sim/mem/lut/lut_Sine_tb.gtkw b/sim/mem/lut/lut_Sine_tb.gtkw deleted file mode 100644 index 776f6eece..000000000 --- a/sim/mem/lut/lut_Sine_tb.gtkw +++ /dev/null @@ -1,46 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.61 (w)1999-2014 BSI -[*] Mon Feb 08 22:21:35 2016 -[*] -[dumpfile_mtime] "Mon Feb 08 22:17:35 2016" -[dumpfile_size] 77559 -[timestart] 0 -[size] 1676 996 -[pos] -1 -1 -*-30.598400 -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 -[treeopen] top. -[treeopen] top.lut_sine_tb. -[sst_width] 197 -[signals_width] 150 -[sst_expanded] 1 -[sst_vpaned_height] 292 -@28 -top.lut_sine_tb.clock -@22 -#{top.lut_sine_tb.lut_in[7:0]} top.lut_sine_tb.lut_in[7] top.lut_sine_tb.lut_in[6] top.lut_sine_tb.lut_in[5] top.lut_sine_tb.lut_in[4] top.lut_sine_tb.lut_in[3] top.lut_sine_tb.lut_in[2] top.lut_sine_tb.lut_in[1] top.lut_sine_tb.lut_in[0] -@8420 -#{top.lut_sine_tb.lut_q1_out[7:0]} top.lut_sine_tb.lut_q1_out[7] top.lut_sine_tb.lut_q1_out[6] top.lut_sine_tb.lut_q1_out[5] top.lut_sine_tb.lut_q1_out[4] top.lut_sine_tb.lut_q1_out[3] top.lut_sine_tb.lut_q1_out[2] top.lut_sine_tb.lut_q1_out[1] top.lut_sine_tb.lut_q1_out[0] -@20000 -- -- -- -@10023 -#{top.lut_sine_tb.lut_q2_out[7:0]} top.lut_sine_tb.lut_q2_out[7] top.lut_sine_tb.lut_q2_out[6] top.lut_sine_tb.lut_q2_out[5] top.lut_sine_tb.lut_q2_out[4] top.lut_sine_tb.lut_q2_out[3] top.lut_sine_tb.lut_q2_out[2] top.lut_sine_tb.lut_q2_out[1] top.lut_sine_tb.lut_q2_out[0] -@20000 -- -- -- -@10420 -#{top.lut_sine_tb.lut_q3_out[7:0]} top.lut_sine_tb.lut_q3_out[7] top.lut_sine_tb.lut_q3_out[6] top.lut_sine_tb.lut_q3_out[5] top.lut_sine_tb.lut_q3_out[4] top.lut_sine_tb.lut_q3_out[3] top.lut_sine_tb.lut_q3_out[2] top.lut_sine_tb.lut_q3_out[1] top.lut_sine_tb.lut_q3_out[0] -@20000 -- -- -- -@10420 -#{top.lut_sine_tb.lut_q4_out[7:0]} top.lut_sine_tb.lut_q4_out[7] top.lut_sine_tb.lut_q4_out[6] top.lut_sine_tb.lut_q4_out[5] top.lut_sine_tb.lut_q4_out[4] top.lut_sine_tb.lut_q4_out[3] top.lut_sine_tb.lut_q4_out[2] top.lut_sine_tb.lut_q4_out[1] top.lut_sine_tb.lut_q4_out[0] -@20000 -- -- -- -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/mem/lut/lut_Sine_tb.wcfg b/sim/mem/lut/lut_Sine_tb.wcfg deleted file mode 100644 index 4c1155d8d..000000000 --- a/sim/mem/lut/lut_Sine_tb.wcfg +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - clock1 - clock1 - - - lut_in[7:0] - lut_in[7:0] - UNSIGNEDDECRADIX - - - lut_q1_out[7:0] - lut_q1_out[7:0] - UNSIGNEDDECRADIX - - - lut_q2_out[7:0] - lut_q2_out[7:0] - UNSIGNEDDECRADIX - - - lut_q3_out[7:0] - lut_q3_out[7:0] - SIGNEDDECRADIX - - - lut_q4_out[7:0] - lut_q4_out[7:0] - SIGNEDDECRADIX - - diff --git a/sim/mem/lut/lut_Sine_tb.wdo b/sim/mem/lut/lut_Sine_tb.wdo deleted file mode 100644 index 4385dbcbf..000000000 --- a/sim/mem/lut/lut_Sine_tb.wdo +++ /dev/null @@ -1,26 +0,0 @@ -onerror {resume} -quietly WaveActivateNextPane {} 0 -add wave -noupdate /lut_sine_tb/Clock -add wave -noupdate /lut_sine_tb/lut_in -add wave -noupdate -format Analog-Step -height 74 -max 127.0 /lut_sine_tb/lut_Q1_out -add wave -noupdate -format Analog-Step -height 74 -max 127.0 /lut_sine_tb/lut_Q2_out -add wave -noupdate -format Analog-Step -height 74 -max 127.0 -min -127.0 -radix decimal /lut_sine_tb/lut_Q3_out -add wave -noupdate -format Analog-Step -height 74 -max 127.0 -min -127.0 -radix decimal /lut_sine_tb/lut_Q4_out -TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 1} {490000000 fs} 0} -quietly wave cursor active 1 -configure wave -namecolwidth 164 -configure wave -valuecolwidth 39 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 -configure wave -gridoffset 0 -configure wave -gridperiod 1 -configure wave -griddelta 40 -configure wave -timeline 0 -configure wave -timelineunits ns -update -WaveRestoreZoom {0 fs} {10899 ns} diff --git a/sim/mem/ocram/ocram_sdp_tb.ghdl b/sim/mem/ocram/ocram_sdp_tb.ghdl deleted file mode 100644 index 72ec2d183..000000000 --- a/sim/mem/ocram/ocram_sdp_tb.ghdl +++ /dev/null @@ -1,13 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/ocram_sdp_tb/rce -/ocram_sdp_tb/wce -/ocram_sdp_tb/we -/ocram_sdp_tb/ra -/ocram_sdp_tb/wa -/ocram_sdp_tb/d -/ocram_sdp_tb/q -/ocram_sdp_tb/clk diff --git a/sim/mem/ocram/ocram_sdp_tb.gtkw b/sim/mem/ocram/ocram_sdp_tb.gtkw deleted file mode 100644 index 8dbdf8bbc..000000000 --- a/sim/mem/ocram/ocram_sdp_tb.gtkw +++ /dev/null @@ -1,67 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.61 (w)1999-2014 BSI -[*] Mon Feb 08 22:46:43 2016 -[*] -[dumpfile_mtime] "Mon Feb 08 22:45:30 2016" -[dumpfile_size] 116720 -[timestart] 0 -[size] 1680 997 -[pos] -217 -217 -*-24.503962 -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 -[treeopen] top. -[treeopen] top.ocram_sdp_tb. -[sst_width] 197 -[signals_width] 86 -[sst_expanded] 1 -[sst_vpaned_height] 293 -@28 -top.ocram_sdp_tb.clk -top.ocram_sdp_tb.wce -top.ocram_sdp_tb.we -@22 -#{top.ocram_sdp_tb.wa[9:0]} top.ocram_sdp_tb.wa[9] top.ocram_sdp_tb.wa[8] top.ocram_sdp_tb.wa[7] top.ocram_sdp_tb.wa[6] top.ocram_sdp_tb.wa[5] top.ocram_sdp_tb.wa[4] top.ocram_sdp_tb.wa[3] top.ocram_sdp_tb.wa[2] top.ocram_sdp_tb.wa[1] top.ocram_sdp_tb.wa[0] -@c00022 -#{top.ocram_sdp_tb.d[31:0]} top.ocram_sdp_tb.d[31] top.ocram_sdp_tb.d[30] top.ocram_sdp_tb.d[29] top.ocram_sdp_tb.d[28] top.ocram_sdp_tb.d[27] top.ocram_sdp_tb.d[26] top.ocram_sdp_tb.d[25] top.ocram_sdp_tb.d[24] top.ocram_sdp_tb.d[23] top.ocram_sdp_tb.d[22] top.ocram_sdp_tb.d[21] top.ocram_sdp_tb.d[20] top.ocram_sdp_tb.d[19] top.ocram_sdp_tb.d[18] top.ocram_sdp_tb.d[17] top.ocram_sdp_tb.d[16] top.ocram_sdp_tb.d[15] top.ocram_sdp_tb.d[14] top.ocram_sdp_tb.d[13] top.ocram_sdp_tb.d[12] top.ocram_sdp_tb.d[11] top.ocram_sdp_tb.d[10] top.ocram_sdp_tb.d[9] top.ocram_sdp_tb.d[8] top.ocram_sdp_tb.d[7] top.ocram_sdp_tb.d[6] top.ocram_sdp_tb.d[5] top.ocram_sdp_tb.d[4] top.ocram_sdp_tb.d[3] top.ocram_sdp_tb.d[2] top.ocram_sdp_tb.d[1] top.ocram_sdp_tb.d[0] -@28 -top.ocram_sdp_tb.d[31] -top.ocram_sdp_tb.d[30] -top.ocram_sdp_tb.d[29] -top.ocram_sdp_tb.d[28] -top.ocram_sdp_tb.d[27] -top.ocram_sdp_tb.d[26] -top.ocram_sdp_tb.d[25] -top.ocram_sdp_tb.d[24] -top.ocram_sdp_tb.d[23] -top.ocram_sdp_tb.d[22] -top.ocram_sdp_tb.d[21] -top.ocram_sdp_tb.d[20] -top.ocram_sdp_tb.d[19] -top.ocram_sdp_tb.d[18] -top.ocram_sdp_tb.d[17] -top.ocram_sdp_tb.d[16] -top.ocram_sdp_tb.d[15] -top.ocram_sdp_tb.d[14] -top.ocram_sdp_tb.d[13] -top.ocram_sdp_tb.d[12] -top.ocram_sdp_tb.d[11] -top.ocram_sdp_tb.d[10] -top.ocram_sdp_tb.d[9] -top.ocram_sdp_tb.d[8] -top.ocram_sdp_tb.d[7] -top.ocram_sdp_tb.d[6] -top.ocram_sdp_tb.d[5] -top.ocram_sdp_tb.d[4] -top.ocram_sdp_tb.d[3] -top.ocram_sdp_tb.d[2] -top.ocram_sdp_tb.d[1] -top.ocram_sdp_tb.d[0] -@1401200 --group_end -@28 -top.ocram_sdp_tb.rce -@23 -#{top.ocram_sdp_tb.ra[9:0]} top.ocram_sdp_tb.ra[9] top.ocram_sdp_tb.ra[8] top.ocram_sdp_tb.ra[7] top.ocram_sdp_tb.ra[6] top.ocram_sdp_tb.ra[5] top.ocram_sdp_tb.ra[4] top.ocram_sdp_tb.ra[3] top.ocram_sdp_tb.ra[2] top.ocram_sdp_tb.ra[1] top.ocram_sdp_tb.ra[0] -@22 -#{top.ocram_sdp_tb.q[31:0]} top.ocram_sdp_tb.q[31] top.ocram_sdp_tb.q[30] top.ocram_sdp_tb.q[29] top.ocram_sdp_tb.q[28] top.ocram_sdp_tb.q[27] top.ocram_sdp_tb.q[26] top.ocram_sdp_tb.q[25] top.ocram_sdp_tb.q[24] top.ocram_sdp_tb.q[23] top.ocram_sdp_tb.q[22] top.ocram_sdp_tb.q[21] top.ocram_sdp_tb.q[20] top.ocram_sdp_tb.q[19] top.ocram_sdp_tb.q[18] top.ocram_sdp_tb.q[17] top.ocram_sdp_tb.q[16] top.ocram_sdp_tb.q[15] top.ocram_sdp_tb.q[14] top.ocram_sdp_tb.q[13] top.ocram_sdp_tb.q[12] top.ocram_sdp_tb.q[11] top.ocram_sdp_tb.q[10] top.ocram_sdp_tb.q[9] top.ocram_sdp_tb.q[8] top.ocram_sdp_tb.q[7] top.ocram_sdp_tb.q[6] top.ocram_sdp_tb.q[5] top.ocram_sdp_tb.q[4] top.ocram_sdp_tb.q[3] top.ocram_sdp_tb.q[2] top.ocram_sdp_tb.q[1] top.ocram_sdp_tb.q[0] -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/misc/gearbox/gearbox_down_cc_tb.ghdl b/sim/misc/gearbox/gearbox_down_cc_tb.ghdl deleted file mode 100644 index 790862332..000000000 --- a/sim/misc/gearbox/gearbox_down_cc_tb.ghdl +++ /dev/null @@ -1,237 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/gearbox_down_cc_tb/clock -/gearbox_down_cc_tb//syncin -/gearbox_down_cc_tb//validin -/gearbox_down_cc_tb//datain -/gearbox_down_cc_tb//syncout -/gearbox_down_cc_tb//validout -/gearbox_down_cc_tb//dataout -/gearbox_down_cc_tb//firstout -/gearbox_down_cc_tb//lastout -/gearbox_down_cc_tb//gear/clock -/gearbox_down_cc_tb//gear/in_sync -/gearbox_down_cc_tb//gear/in_valid -/gearbox_down_cc_tb//gear/in_next -/gearbox_down_cc_tb//gear/in_data -/gearbox_down_cc_tb//gear/in_meta -/gearbox_down_cc_tb//gear/out_sync -/gearbox_down_cc_tb//gear/out_valid -/gearbox_down_cc_tb//gear/out_data -/gearbox_down_cc_tb//gear/out_meta -/gearbox_down_cc_tb//gear/out_first -/gearbox_down_cc_tb//gear/out_last -/gearbox_down_cc_tb//gear/in_sync_d -/gearbox_down_cc_tb//gear/in_data_d -/gearbox_down_cc_tb//gear/in_meta_d -/gearbox_down_cc_tb//gear/in_valid_d -/gearbox_down_cc_tb//gear/muxselect_rst -/gearbox_down_cc_tb//gear/muxselect_en -/gearbox_down_cc_tb//gear/muxselect_us -/gearbox_down_cc_tb//gear/muxselect_ov -/gearbox_down_cc_tb//gear/nxt -/gearbox_down_cc_tb//gear/autoincrement -/gearbox_down_cc_tb//gear/gearboxinput -/gearbox_down_cc_tb//gear/gearboxbuffer_en -/gearbox_down_cc_tb//gear/gearboxbuffer -/gearbox_down_cc_tb//gear/gearboxoutput -/gearbox_down_cc_tb//gear/syncout -/gearbox_down_cc_tb//gear/validout -/gearbox_down_cc_tb//gear/dataout -/gearbox_down_cc_tb//gear/metaout -/gearbox_down_cc_tb//gear/firstout -/gearbox_down_cc_tb//gear/lastout -/gearbox_down_cc_tb//gear/out_sync_d -/gearbox_down_cc_tb//gear/out_valid_d -/gearbox_down_cc_tb//gear/out_data_d -/gearbox_down_cc_tb//gear/out_meta_d -/gearbox_down_cc_tb//gear/out_first_d -/gearbox_down_cc_tb//gear/out_last_d -/gearbox_down_cc_tb//gear//muxinput -/gearbox_down_cc_tb//syncin -/gearbox_down_cc_tb//validin -/gearbox_down_cc_tb//datain -/gearbox_down_cc_tb//syncout -/gearbox_down_cc_tb//validout -/gearbox_down_cc_tb//dataout -/gearbox_down_cc_tb//firstout -/gearbox_down_cc_tb//lastout -/gearbox_down_cc_tb//gear/clock -/gearbox_down_cc_tb//gear/in_sync -/gearbox_down_cc_tb//gear/in_valid -/gearbox_down_cc_tb//gear/in_next -/gearbox_down_cc_tb//gear/in_data -/gearbox_down_cc_tb//gear/in_meta -/gearbox_down_cc_tb//gear/out_sync -/gearbox_down_cc_tb//gear/out_valid -/gearbox_down_cc_tb//gear/out_data -/gearbox_down_cc_tb//gear/out_meta -/gearbox_down_cc_tb//gear/out_first -/gearbox_down_cc_tb//gear/out_last -/gearbox_down_cc_tb//gear/in_sync_d -/gearbox_down_cc_tb//gear/in_data_d -/gearbox_down_cc_tb//gear/in_meta_d -/gearbox_down_cc_tb//gear/in_valid_d -/gearbox_down_cc_tb//gear/muxselect_rst -/gearbox_down_cc_tb//gear/muxselect_en -/gearbox_down_cc_tb//gear/muxselect_us -/gearbox_down_cc_tb//gear/muxselect_ov -/gearbox_down_cc_tb//gear/nxt -/gearbox_down_cc_tb//gear/autoincrement -/gearbox_down_cc_tb//gear/gearboxinput -/gearbox_down_cc_tb//gear/gearboxbuffer_en -/gearbox_down_cc_tb//gear/gearboxbuffer -/gearbox_down_cc_tb//gear/gearboxoutput -/gearbox_down_cc_tb//gear/syncout -/gearbox_down_cc_tb//gear/validout -/gearbox_down_cc_tb//gear/dataout -/gearbox_down_cc_tb//gear/metaout -/gearbox_down_cc_tb//gear/firstout -/gearbox_down_cc_tb//gear/lastout -/gearbox_down_cc_tb//gear/out_sync_d -/gearbox_down_cc_tb//gear/out_valid_d -/gearbox_down_cc_tb//gear/out_data_d -/gearbox_down_cc_tb//gear/out_meta_d -/gearbox_down_cc_tb//gear/out_first_d -/gearbox_down_cc_tb//gear/out_last_d -/gearbox_down_cc_tb//syncin -/gearbox_down_cc_tb//validin -/gearbox_down_cc_tb//datain -/gearbox_down_cc_tb//syncout -/gearbox_down_cc_tb//validout -/gearbox_down_cc_tb//dataout -/gearbox_down_cc_tb//firstout -/gearbox_down_cc_tb//lastout -/gearbox_down_cc_tb//gear/clock -/gearbox_down_cc_tb//gear/in_sync -/gearbox_down_cc_tb//gear/in_valid -/gearbox_down_cc_tb//gear/in_next -/gearbox_down_cc_tb//gear/in_data -/gearbox_down_cc_tb//gear/in_meta -/gearbox_down_cc_tb//gear/out_sync -/gearbox_down_cc_tb//gear/out_valid -/gearbox_down_cc_tb//gear/out_data -/gearbox_down_cc_tb//gear/out_meta -/gearbox_down_cc_tb//gear/out_first -/gearbox_down_cc_tb//gear/out_last -/gearbox_down_cc_tb//gear/in_sync_d -/gearbox_down_cc_tb//gear/in_data_d -/gearbox_down_cc_tb//gear/in_meta_d -/gearbox_down_cc_tb//gear/in_valid_d -/gearbox_down_cc_tb//gear/muxselect_rst -/gearbox_down_cc_tb//gear/muxselect_en -/gearbox_down_cc_tb//gear/muxselect_us -/gearbox_down_cc_tb//gear/muxselect_ov -/gearbox_down_cc_tb//gear/nxt -/gearbox_down_cc_tb//gear/autoincrement -/gearbox_down_cc_tb//gear/gearboxinput -/gearbox_down_cc_tb//gear/gearboxbuffer_en -/gearbox_down_cc_tb//gear/gearboxbuffer -/gearbox_down_cc_tb//gear/gearboxoutput -/gearbox_down_cc_tb//gear/syncout -/gearbox_down_cc_tb//gear/validout -/gearbox_down_cc_tb//gear/dataout -/gearbox_down_cc_tb//gear/metaout -/gearbox_down_cc_tb//gear/firstout -/gearbox_down_cc_tb//gear/lastout -/gearbox_down_cc_tb//gear/out_sync_d -/gearbox_down_cc_tb//gear/out_valid_d -/gearbox_down_cc_tb//gear/out_data_d -/gearbox_down_cc_tb//gear/out_meta_d -/gearbox_down_cc_tb//gear/out_first_d -/gearbox_down_cc_tb//gear/out_last_d -/gearbox_down_cc_tb//syncin -/gearbox_down_cc_tb//validin -/gearbox_down_cc_tb//datain -/gearbox_down_cc_tb//syncout -/gearbox_down_cc_tb//validout -/gearbox_down_cc_tb//dataout -/gearbox_down_cc_tb//firstout -/gearbox_down_cc_tb//lastout -/gearbox_down_cc_tb//gear/clock -/gearbox_down_cc_tb//gear/in_sync -/gearbox_down_cc_tb//gear/in_valid -/gearbox_down_cc_tb//gear/in_next -/gearbox_down_cc_tb//gear/in_data -/gearbox_down_cc_tb//gear/in_meta -/gearbox_down_cc_tb//gear/out_sync -/gearbox_down_cc_tb//gear/out_valid -/gearbox_down_cc_tb//gear/out_data -/gearbox_down_cc_tb//gear/out_meta -/gearbox_down_cc_tb//gear/out_first -/gearbox_down_cc_tb//gear/out_last -/gearbox_down_cc_tb//gear/in_sync_d -/gearbox_down_cc_tb//gear/in_data_d -/gearbox_down_cc_tb//gear/in_meta_d -/gearbox_down_cc_tb//gear/in_valid_d -/gearbox_down_cc_tb//gear/muxselect_rst -/gearbox_down_cc_tb//gear/muxselect_en -/gearbox_down_cc_tb//gear/muxselect_us -/gearbox_down_cc_tb//gear/muxselect_ov -/gearbox_down_cc_tb//gear/nxt -/gearbox_down_cc_tb//gear/autoincrement -/gearbox_down_cc_tb//gear/gearboxinput -/gearbox_down_cc_tb//gear/gearboxbuffer_en -/gearbox_down_cc_tb//gear/gearboxbuffer -/gearbox_down_cc_tb//gear/gearboxoutput -/gearbox_down_cc_tb//gear/syncout -/gearbox_down_cc_tb//gear/validout -/gearbox_down_cc_tb//gear/dataout -/gearbox_down_cc_tb//gear/metaout -/gearbox_down_cc_tb//gear/firstout -/gearbox_down_cc_tb//gear/lastout -/gearbox_down_cc_tb//gear/out_sync_d -/gearbox_down_cc_tb//gear/out_valid_d -/gearbox_down_cc_tb//gear/out_data_d -/gearbox_down_cc_tb//gear/out_meta_d -/gearbox_down_cc_tb//gear/out_first_d -/gearbox_down_cc_tb//gear/out_last_d -/gearbox_down_cc_tb//syncin -/gearbox_down_cc_tb//validin -/gearbox_down_cc_tb//datain -/gearbox_down_cc_tb//syncout -/gearbox_down_cc_tb//validout -/gearbox_down_cc_tb//dataout -/gearbox_down_cc_tb//firstout -/gearbox_down_cc_tb//lastout -/gearbox_down_cc_tb//gear/clock -/gearbox_down_cc_tb//gear/in_sync -/gearbox_down_cc_tb//gear/in_valid -/gearbox_down_cc_tb//gear/in_next -/gearbox_down_cc_tb//gear/in_data -/gearbox_down_cc_tb//gear/in_meta -/gearbox_down_cc_tb//gear/out_sync -/gearbox_down_cc_tb//gear/out_valid -/gearbox_down_cc_tb//gear/out_data -/gearbox_down_cc_tb//gear/out_meta -/gearbox_down_cc_tb//gear/out_first -/gearbox_down_cc_tb//gear/out_last -/gearbox_down_cc_tb//gear/in_sync_d -/gearbox_down_cc_tb//gear/in_data_d -/gearbox_down_cc_tb//gear/in_meta_d -/gearbox_down_cc_tb//gear/in_valid_d -/gearbox_down_cc_tb//gear/muxselect_rst -/gearbox_down_cc_tb//gear/muxselect_en -/gearbox_down_cc_tb//gear/muxselect_us -/gearbox_down_cc_tb//gear/muxselect_ov -/gearbox_down_cc_tb//gear/nxt -/gearbox_down_cc_tb//gear/autoincrement -/gearbox_down_cc_tb//gear/gearboxinput -/gearbox_down_cc_tb//gear/gearboxbuffer_en -/gearbox_down_cc_tb//gear/gearboxbuffer -/gearbox_down_cc_tb//gear/gearboxoutput -/gearbox_down_cc_tb//gear/syncout -/gearbox_down_cc_tb//gear/validout -/gearbox_down_cc_tb//gear/dataout -/gearbox_down_cc_tb//gear/metaout -/gearbox_down_cc_tb//gear/firstout -/gearbox_down_cc_tb//gear/lastout -/gearbox_down_cc_tb//gear/out_sync_d -/gearbox_down_cc_tb//gear/out_valid_d -/gearbox_down_cc_tb//gear/out_data_d -/gearbox_down_cc_tb//gear/out_meta_d -/gearbox_down_cc_tb//gear/out_first_d -/gearbox_down_cc_tb//gear/out_last_d diff --git a/sim/misc/gearbox/gearbox_down_cc_tb.gtkw b/sim/misc/gearbox/gearbox_down_cc_tb.gtkw deleted file mode 100644 index 84c2129e5..000000000 --- a/sim/misc/gearbox/gearbox_down_cc_tb.gtkw +++ /dev/null @@ -1,174 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.61 (w)1999-2014 BSI -[*] Mon Feb 08 01:00:49 2016 -[*] -[dumpfile_mtime] "Mon Feb 08 01:00:05 2016" -[dumpfile_size] 430817 -[timestart] 0 -[size] 1676 996 -[pos] -1 -1 -*-27.898556 44400000 -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 -[treeopen] top. -[treeopen] top.gearbox_down_cc_tb. -[treeopen] top.gearbox_down_cc_tb.[4]. -[sst_width] 197 -[signals_width] 228 -[sst_expanded] 1 -[sst_vpaned_height] 292 -@28 -top.gearbox_down_cc_tb.clock -@800200 --Example 0 (32->8) -@28 -top.gearbox_down_cc_tb[0].syncin -top.gearbox_down_cc_tb[0].validin -@22 -#{top.gearbox_down_cc_tb[0].datain[31:0]} top.gearbox_down_cc_tb[0].datain[31] top.gearbox_down_cc_tb[0].datain[30] top.gearbox_down_cc_tb[0].datain[29] top.gearbox_down_cc_tb[0].datain[28] top.gearbox_down_cc_tb[0].datain[27] top.gearbox_down_cc_tb[0].datain[26] top.gearbox_down_cc_tb[0].datain[25] top.gearbox_down_cc_tb[0].datain[24] top.gearbox_down_cc_tb[0].datain[23] top.gearbox_down_cc_tb[0].datain[22] top.gearbox_down_cc_tb[0].datain[21] top.gearbox_down_cc_tb[0].datain[20] top.gearbox_down_cc_tb[0].datain[19] top.gearbox_down_cc_tb[0].datain[18] top.gearbox_down_cc_tb[0].datain[17] top.gearbox_down_cc_tb[0].datain[16] top.gearbox_down_cc_tb[0].datain[15] top.gearbox_down_cc_tb[0].datain[14] top.gearbox_down_cc_tb[0].datain[13] top.gearbox_down_cc_tb[0].datain[12] top.gearbox_down_cc_tb[0].datain[11] top.gearbox_down_cc_tb[0].datain[10] top.gearbox_down_cc_tb[0].datain[9] top.gearbox_down_cc_tb[0].datain[8] top.gearbox_down_cc_tb[0].datain[7] top.gearbox_down_cc_tb[0].datain[6] top.gearbox_down_cc_tb[0].datain[5] top.gearbox_down_cc_tb[0].datain[4] top.gearbox_down_cc_tb[0].datain[3] top.gearbox_down_cc_tb[0].datain[2] top.gearbox_down_cc_tb[0].datain[1] top.gearbox_down_cc_tb[0].datain[0] -@28 -top.gearbox_down_cc_tb[0].syncout -top.gearbox_down_cc_tb[0].validout -@22 -#{top.gearbox_down_cc_tb[0].dataout[7:0]} top.gearbox_down_cc_tb[0].dataout[7] top.gearbox_down_cc_tb[0].dataout[6] top.gearbox_down_cc_tb[0].dataout[5] top.gearbox_down_cc_tb[0].dataout[4] top.gearbox_down_cc_tb[0].dataout[3] top.gearbox_down_cc_tb[0].dataout[2] top.gearbox_down_cc_tb[0].dataout[1] top.gearbox_down_cc_tb[0].dataout[0] -@28 -top.gearbox_down_cc_tb[0].firstout -top.gearbox_down_cc_tb[0].lastout -@1000200 --Example 0 (32->8) -@800200 --Example 1 (20->8) -@28 -top.gearbox_down_cc_tb[1].syncin -top.gearbox_down_cc_tb[1].validin -@22 -#{top.gearbox_down_cc_tb[1].datain[19:0]} top.gearbox_down_cc_tb[1].datain[19] top.gearbox_down_cc_tb[1].datain[18] top.gearbox_down_cc_tb[1].datain[17] top.gearbox_down_cc_tb[1].datain[16] top.gearbox_down_cc_tb[1].datain[15] top.gearbox_down_cc_tb[1].datain[14] top.gearbox_down_cc_tb[1].datain[13] top.gearbox_down_cc_tb[1].datain[12] top.gearbox_down_cc_tb[1].datain[11] top.gearbox_down_cc_tb[1].datain[10] top.gearbox_down_cc_tb[1].datain[9] top.gearbox_down_cc_tb[1].datain[8] top.gearbox_down_cc_tb[1].datain[7] top.gearbox_down_cc_tb[1].datain[6] top.gearbox_down_cc_tb[1].datain[5] top.gearbox_down_cc_tb[1].datain[4] top.gearbox_down_cc_tb[1].datain[3] top.gearbox_down_cc_tb[1].datain[2] top.gearbox_down_cc_tb[1].datain[1] top.gearbox_down_cc_tb[1].datain[0] -@28 -top.gearbox_down_cc_tb[1].syncout -top.gearbox_down_cc_tb[1].validout -@22 -#{top.gearbox_down_cc_tb[1].dataout[7:0]} top.gearbox_down_cc_tb[1].dataout[7] top.gearbox_down_cc_tb[1].dataout[6] top.gearbox_down_cc_tb[1].dataout[5] top.gearbox_down_cc_tb[1].dataout[4] top.gearbox_down_cc_tb[1].dataout[3] top.gearbox_down_cc_tb[1].dataout[2] top.gearbox_down_cc_tb[1].dataout[1] top.gearbox_down_cc_tb[1].dataout[0] -@28 -top.gearbox_down_cc_tb[1].firstout -top.gearbox_down_cc_tb[1].lastout -@1000200 --Example 1 (20->8) -@800200 --Example 2 (36->8) -@28 -top.gearbox_down_cc_tb[2].syncin -top.gearbox_down_cc_tb[2].validin -@22 -#{top.gearbox_down_cc_tb[2].datain[35:0]} top.gearbox_down_cc_tb[2].datain[35] top.gearbox_down_cc_tb[2].datain[34] top.gearbox_down_cc_tb[2].datain[33] top.gearbox_down_cc_tb[2].datain[32] top.gearbox_down_cc_tb[2].datain[31] top.gearbox_down_cc_tb[2].datain[30] top.gearbox_down_cc_tb[2].datain[29] top.gearbox_down_cc_tb[2].datain[28] top.gearbox_down_cc_tb[2].datain[27] top.gearbox_down_cc_tb[2].datain[26] top.gearbox_down_cc_tb[2].datain[25] top.gearbox_down_cc_tb[2].datain[24] top.gearbox_down_cc_tb[2].datain[23] top.gearbox_down_cc_tb[2].datain[22] top.gearbox_down_cc_tb[2].datain[21] top.gearbox_down_cc_tb[2].datain[20] top.gearbox_down_cc_tb[2].datain[19] top.gearbox_down_cc_tb[2].datain[18] top.gearbox_down_cc_tb[2].datain[17] top.gearbox_down_cc_tb[2].datain[16] top.gearbox_down_cc_tb[2].datain[15] top.gearbox_down_cc_tb[2].datain[14] top.gearbox_down_cc_tb[2].datain[13] top.gearbox_down_cc_tb[2].datain[12] top.gearbox_down_cc_tb[2].datain[11] top.gearbox_down_cc_tb[2].datain[10] top.gearbox_down_cc_tb[2].datain[9] top.gearbox_down_cc_tb[2].datain[8] top.gearbox_down_cc_tb[2].datain[7] top.gearbox_down_cc_tb[2].datain[6] top.gearbox_down_cc_tb[2].datain[5] top.gearbox_down_cc_tb[2].datain[4] top.gearbox_down_cc_tb[2].datain[3] top.gearbox_down_cc_tb[2].datain[2] top.gearbox_down_cc_tb[2].datain[1] top.gearbox_down_cc_tb[2].datain[0] -@28 -top.gearbox_down_cc_tb[2].syncout -@29 -top.gearbox_down_cc_tb[2].validout -@22 -#{top.gearbox_down_cc_tb[2].dataout[7:0]} top.gearbox_down_cc_tb[2].dataout[7] top.gearbox_down_cc_tb[2].dataout[6] top.gearbox_down_cc_tb[2].dataout[5] top.gearbox_down_cc_tb[2].dataout[4] top.gearbox_down_cc_tb[2].dataout[3] top.gearbox_down_cc_tb[2].dataout[2] top.gearbox_down_cc_tb[2].dataout[1] top.gearbox_down_cc_tb[2].dataout[0] -@28 -top.gearbox_down_cc_tb[2].firstout -top.gearbox_down_cc_tb[2].lastout -@1000200 --Example 2 (36->8) -@800200 --Example 3 (66->64) -@28 -top.gearbox_down_cc_tb[3].syncin -top.gearbox_down_cc_tb[3].validin -@22 -#{top.gearbox_down_cc_tb[3].datain[65:0]} top.gearbox_down_cc_tb[3].datain[65] top.gearbox_down_cc_tb[3].datain[64] top.gearbox_down_cc_tb[3].datain[63] top.gearbox_down_cc_tb[3].datain[62] top.gearbox_down_cc_tb[3].datain[61] top.gearbox_down_cc_tb[3].datain[60] top.gearbox_down_cc_tb[3].datain[59] top.gearbox_down_cc_tb[3].datain[58] top.gearbox_down_cc_tb[3].datain[57] top.gearbox_down_cc_tb[3].datain[56] top.gearbox_down_cc_tb[3].datain[55] top.gearbox_down_cc_tb[3].datain[54] top.gearbox_down_cc_tb[3].datain[53] top.gearbox_down_cc_tb[3].datain[52] top.gearbox_down_cc_tb[3].datain[51] top.gearbox_down_cc_tb[3].datain[50] top.gearbox_down_cc_tb[3].datain[49] top.gearbox_down_cc_tb[3].datain[48] top.gearbox_down_cc_tb[3].datain[47] top.gearbox_down_cc_tb[3].datain[46] top.gearbox_down_cc_tb[3].datain[45] top.gearbox_down_cc_tb[3].datain[44] top.gearbox_down_cc_tb[3].datain[43] top.gearbox_down_cc_tb[3].datain[42] top.gearbox_down_cc_tb[3].datain[41] top.gearbox_down_cc_tb[3].datain[40] top.gearbox_down_cc_tb[3].datain[39] top.gearbox_down_cc_tb[3].datain[38] top.gearbox_down_cc_tb[3].datain[37] top.gearbox_down_cc_tb[3].datain[36] top.gearbox_down_cc_tb[3].datain[35] top.gearbox_down_cc_tb[3].datain[34] top.gearbox_down_cc_tb[3].datain[33] top.gearbox_down_cc_tb[3].datain[32] top.gearbox_down_cc_tb[3].datain[31] top.gearbox_down_cc_tb[3].datain[30] top.gearbox_down_cc_tb[3].datain[29] top.gearbox_down_cc_tb[3].datain[28] top.gearbox_down_cc_tb[3].datain[27] top.gearbox_down_cc_tb[3].datain[26] top.gearbox_down_cc_tb[3].datain[25] top.gearbox_down_cc_tb[3].datain[24] top.gearbox_down_cc_tb[3].datain[23] top.gearbox_down_cc_tb[3].datain[22] top.gearbox_down_cc_tb[3].datain[21] top.gearbox_down_cc_tb[3].datain[20] top.gearbox_down_cc_tb[3].datain[19] top.gearbox_down_cc_tb[3].datain[18] top.gearbox_down_cc_tb[3].datain[17] top.gearbox_down_cc_tb[3].datain[16] top.gearbox_down_cc_tb[3].datain[15] top.gearbox_down_cc_tb[3].datain[14] top.gearbox_down_cc_tb[3].datain[13] top.gearbox_down_cc_tb[3].datain[12] top.gearbox_down_cc_tb[3].datain[11] top.gearbox_down_cc_tb[3].datain[10] top.gearbox_down_cc_tb[3].datain[9] top.gearbox_down_cc_tb[3].datain[8] top.gearbox_down_cc_tb[3].datain[7] top.gearbox_down_cc_tb[3].datain[6] top.gearbox_down_cc_tb[3].datain[5] top.gearbox_down_cc_tb[3].datain[4] top.gearbox_down_cc_tb[3].datain[3] top.gearbox_down_cc_tb[3].datain[2] top.gearbox_down_cc_tb[3].datain[1] top.gearbox_down_cc_tb[3].datain[0] -@28 -top.gearbox_down_cc_tb[3].syncout -top.gearbox_down_cc_tb[3].validout -@c00022 -#{top.gearbox_down_cc_tb[3].dataout[63:0]} top.gearbox_down_cc_tb[3].dataout[63] top.gearbox_down_cc_tb[3].dataout[62] top.gearbox_down_cc_tb[3].dataout[61] top.gearbox_down_cc_tb[3].dataout[60] top.gearbox_down_cc_tb[3].dataout[59] top.gearbox_down_cc_tb[3].dataout[58] top.gearbox_down_cc_tb[3].dataout[57] top.gearbox_down_cc_tb[3].dataout[56] top.gearbox_down_cc_tb[3].dataout[55] top.gearbox_down_cc_tb[3].dataout[54] top.gearbox_down_cc_tb[3].dataout[53] top.gearbox_down_cc_tb[3].dataout[52] top.gearbox_down_cc_tb[3].dataout[51] top.gearbox_down_cc_tb[3].dataout[50] top.gearbox_down_cc_tb[3].dataout[49] top.gearbox_down_cc_tb[3].dataout[48] top.gearbox_down_cc_tb[3].dataout[47] top.gearbox_down_cc_tb[3].dataout[46] top.gearbox_down_cc_tb[3].dataout[45] top.gearbox_down_cc_tb[3].dataout[44] top.gearbox_down_cc_tb[3].dataout[43] top.gearbox_down_cc_tb[3].dataout[42] top.gearbox_down_cc_tb[3].dataout[41] top.gearbox_down_cc_tb[3].dataout[40] top.gearbox_down_cc_tb[3].dataout[39] top.gearbox_down_cc_tb[3].dataout[38] top.gearbox_down_cc_tb[3].dataout[37] top.gearbox_down_cc_tb[3].dataout[36] top.gearbox_down_cc_tb[3].dataout[35] top.gearbox_down_cc_tb[3].dataout[34] top.gearbox_down_cc_tb[3].dataout[33] top.gearbox_down_cc_tb[3].dataout[32] top.gearbox_down_cc_tb[3].dataout[31] top.gearbox_down_cc_tb[3].dataout[30] top.gearbox_down_cc_tb[3].dataout[29] top.gearbox_down_cc_tb[3].dataout[28] top.gearbox_down_cc_tb[3].dataout[27] top.gearbox_down_cc_tb[3].dataout[26] top.gearbox_down_cc_tb[3].dataout[25] top.gearbox_down_cc_tb[3].dataout[24] top.gearbox_down_cc_tb[3].dataout[23] top.gearbox_down_cc_tb[3].dataout[22] top.gearbox_down_cc_tb[3].dataout[21] top.gearbox_down_cc_tb[3].dataout[20] top.gearbox_down_cc_tb[3].dataout[19] top.gearbox_down_cc_tb[3].dataout[18] top.gearbox_down_cc_tb[3].dataout[17] top.gearbox_down_cc_tb[3].dataout[16] top.gearbox_down_cc_tb[3].dataout[15] top.gearbox_down_cc_tb[3].dataout[14] top.gearbox_down_cc_tb[3].dataout[13] top.gearbox_down_cc_tb[3].dataout[12] top.gearbox_down_cc_tb[3].dataout[11] top.gearbox_down_cc_tb[3].dataout[10] top.gearbox_down_cc_tb[3].dataout[9] top.gearbox_down_cc_tb[3].dataout[8] top.gearbox_down_cc_tb[3].dataout[7] top.gearbox_down_cc_tb[3].dataout[6] top.gearbox_down_cc_tb[3].dataout[5] top.gearbox_down_cc_tb[3].dataout[4] top.gearbox_down_cc_tb[3].dataout[3] top.gearbox_down_cc_tb[3].dataout[2] top.gearbox_down_cc_tb[3].dataout[1] top.gearbox_down_cc_tb[3].dataout[0] -@28 -top.gearbox_down_cc_tb[3].dataout[63] -top.gearbox_down_cc_tb[3].dataout[62] -top.gearbox_down_cc_tb[3].dataout[61] -top.gearbox_down_cc_tb[3].dataout[60] -top.gearbox_down_cc_tb[3].dataout[59] -top.gearbox_down_cc_tb[3].dataout[58] -top.gearbox_down_cc_tb[3].dataout[57] -top.gearbox_down_cc_tb[3].dataout[56] -top.gearbox_down_cc_tb[3].dataout[55] -top.gearbox_down_cc_tb[3].dataout[54] -top.gearbox_down_cc_tb[3].dataout[53] -top.gearbox_down_cc_tb[3].dataout[52] -top.gearbox_down_cc_tb[3].dataout[51] -top.gearbox_down_cc_tb[3].dataout[50] -top.gearbox_down_cc_tb[3].dataout[49] -top.gearbox_down_cc_tb[3].dataout[48] -top.gearbox_down_cc_tb[3].dataout[47] -top.gearbox_down_cc_tb[3].dataout[46] -top.gearbox_down_cc_tb[3].dataout[45] -top.gearbox_down_cc_tb[3].dataout[44] -top.gearbox_down_cc_tb[3].dataout[43] -top.gearbox_down_cc_tb[3].dataout[42] -top.gearbox_down_cc_tb[3].dataout[41] -top.gearbox_down_cc_tb[3].dataout[40] -top.gearbox_down_cc_tb[3].dataout[39] -top.gearbox_down_cc_tb[3].dataout[38] -top.gearbox_down_cc_tb[3].dataout[37] -top.gearbox_down_cc_tb[3].dataout[36] -top.gearbox_down_cc_tb[3].dataout[35] -top.gearbox_down_cc_tb[3].dataout[34] -top.gearbox_down_cc_tb[3].dataout[33] -top.gearbox_down_cc_tb[3].dataout[32] -top.gearbox_down_cc_tb[3].dataout[31] -top.gearbox_down_cc_tb[3].dataout[30] -top.gearbox_down_cc_tb[3].dataout[29] -top.gearbox_down_cc_tb[3].dataout[28] -top.gearbox_down_cc_tb[3].dataout[27] -top.gearbox_down_cc_tb[3].dataout[26] -top.gearbox_down_cc_tb[3].dataout[25] -top.gearbox_down_cc_tb[3].dataout[24] -top.gearbox_down_cc_tb[3].dataout[23] -top.gearbox_down_cc_tb[3].dataout[22] -top.gearbox_down_cc_tb[3].dataout[21] -top.gearbox_down_cc_tb[3].dataout[20] -top.gearbox_down_cc_tb[3].dataout[19] -top.gearbox_down_cc_tb[3].dataout[18] -top.gearbox_down_cc_tb[3].dataout[17] -top.gearbox_down_cc_tb[3].dataout[16] -top.gearbox_down_cc_tb[3].dataout[15] -top.gearbox_down_cc_tb[3].dataout[14] -top.gearbox_down_cc_tb[3].dataout[13] -top.gearbox_down_cc_tb[3].dataout[12] -top.gearbox_down_cc_tb[3].dataout[11] -top.gearbox_down_cc_tb[3].dataout[10] -top.gearbox_down_cc_tb[3].dataout[9] -top.gearbox_down_cc_tb[3].dataout[8] -top.gearbox_down_cc_tb[3].dataout[7] -top.gearbox_down_cc_tb[3].dataout[6] -top.gearbox_down_cc_tb[3].dataout[5] -top.gearbox_down_cc_tb[3].dataout[4] -top.gearbox_down_cc_tb[3].dataout[3] -top.gearbox_down_cc_tb[3].dataout[2] -top.gearbox_down_cc_tb[3].dataout[1] -top.gearbox_down_cc_tb[3].dataout[0] -@1401200 --group_end -@28 -top.gearbox_down_cc_tb[3].firstout -top.gearbox_down_cc_tb[3].lastout -@1000200 --Example 3 (66->64) -@800200 --Example 4 (128->12) -@28 -top.gearbox_down_cc_tb[4].syncin -top.gearbox_down_cc_tb[4].validin -@22 -#{top.gearbox_down_cc_tb[4].datain[127:0]} top.gearbox_down_cc_tb[4].datain[127] top.gearbox_down_cc_tb[4].datain[126] top.gearbox_down_cc_tb[4].datain[125] top.gearbox_down_cc_tb[4].datain[124] top.gearbox_down_cc_tb[4].datain[123] top.gearbox_down_cc_tb[4].datain[122] top.gearbox_down_cc_tb[4].datain[121] top.gearbox_down_cc_tb[4].datain[120] top.gearbox_down_cc_tb[4].datain[119] top.gearbox_down_cc_tb[4].datain[118] top.gearbox_down_cc_tb[4].datain[117] top.gearbox_down_cc_tb[4].datain[116] top.gearbox_down_cc_tb[4].datain[115] top.gearbox_down_cc_tb[4].datain[114] top.gearbox_down_cc_tb[4].datain[113] top.gearbox_down_cc_tb[4].datain[112] top.gearbox_down_cc_tb[4].datain[111] top.gearbox_down_cc_tb[4].datain[110] top.gearbox_down_cc_tb[4].datain[109] top.gearbox_down_cc_tb[4].datain[108] top.gearbox_down_cc_tb[4].datain[107] top.gearbox_down_cc_tb[4].datain[106] top.gearbox_down_cc_tb[4].datain[105] top.gearbox_down_cc_tb[4].datain[104] top.gearbox_down_cc_tb[4].datain[103] top.gearbox_down_cc_tb[4].datain[102] top.gearbox_down_cc_tb[4].datain[101] top.gearbox_down_cc_tb[4].datain[100] top.gearbox_down_cc_tb[4].datain[99] top.gearbox_down_cc_tb[4].datain[98] top.gearbox_down_cc_tb[4].datain[97] top.gearbox_down_cc_tb[4].datain[96] top.gearbox_down_cc_tb[4].datain[95] top.gearbox_down_cc_tb[4].datain[94] top.gearbox_down_cc_tb[4].datain[93] top.gearbox_down_cc_tb[4].datain[92] top.gearbox_down_cc_tb[4].datain[91] top.gearbox_down_cc_tb[4].datain[90] top.gearbox_down_cc_tb[4].datain[89] top.gearbox_down_cc_tb[4].datain[88] top.gearbox_down_cc_tb[4].datain[87] top.gearbox_down_cc_tb[4].datain[86] top.gearbox_down_cc_tb[4].datain[85] top.gearbox_down_cc_tb[4].datain[84] top.gearbox_down_cc_tb[4].datain[83] top.gearbox_down_cc_tb[4].datain[82] top.gearbox_down_cc_tb[4].datain[81] top.gearbox_down_cc_tb[4].datain[80] top.gearbox_down_cc_tb[4].datain[79] top.gearbox_down_cc_tb[4].datain[78] top.gearbox_down_cc_tb[4].datain[77] top.gearbox_down_cc_tb[4].datain[76] top.gearbox_down_cc_tb[4].datain[75] top.gearbox_down_cc_tb[4].datain[74] top.gearbox_down_cc_tb[4].datain[73] top.gearbox_down_cc_tb[4].datain[72] top.gearbox_down_cc_tb[4].datain[71] top.gearbox_down_cc_tb[4].datain[70] top.gearbox_down_cc_tb[4].datain[69] top.gearbox_down_cc_tb[4].datain[68] top.gearbox_down_cc_tb[4].datain[67] top.gearbox_down_cc_tb[4].datain[66] top.gearbox_down_cc_tb[4].datain[65] top.gearbox_down_cc_tb[4].datain[64] top.gearbox_down_cc_tb[4].datain[63] top.gearbox_down_cc_tb[4].datain[62] top.gearbox_down_cc_tb[4].datain[61] top.gearbox_down_cc_tb[4].datain[60] top.gearbox_down_cc_tb[4].datain[59] top.gearbox_down_cc_tb[4].datain[58] top.gearbox_down_cc_tb[4].datain[57] top.gearbox_down_cc_tb[4].datain[56] top.gearbox_down_cc_tb[4].datain[55] top.gearbox_down_cc_tb[4].datain[54] top.gearbox_down_cc_tb[4].datain[53] top.gearbox_down_cc_tb[4].datain[52] top.gearbox_down_cc_tb[4].datain[51] top.gearbox_down_cc_tb[4].datain[50] top.gearbox_down_cc_tb[4].datain[49] top.gearbox_down_cc_tb[4].datain[48] top.gearbox_down_cc_tb[4].datain[47] top.gearbox_down_cc_tb[4].datain[46] top.gearbox_down_cc_tb[4].datain[45] top.gearbox_down_cc_tb[4].datain[44] top.gearbox_down_cc_tb[4].datain[43] top.gearbox_down_cc_tb[4].datain[42] top.gearbox_down_cc_tb[4].datain[41] top.gearbox_down_cc_tb[4].datain[40] top.gearbox_down_cc_tb[4].datain[39] top.gearbox_down_cc_tb[4].datain[38] top.gearbox_down_cc_tb[4].datain[37] top.gearbox_down_cc_tb[4].datain[36] top.gearbox_down_cc_tb[4].datain[35] top.gearbox_down_cc_tb[4].datain[34] top.gearbox_down_cc_tb[4].datain[33] top.gearbox_down_cc_tb[4].datain[32] top.gearbox_down_cc_tb[4].datain[31] top.gearbox_down_cc_tb[4].datain[30] top.gearbox_down_cc_tb[4].datain[29] top.gearbox_down_cc_tb[4].datain[28] top.gearbox_down_cc_tb[4].datain[27] top.gearbox_down_cc_tb[4].datain[26] top.gearbox_down_cc_tb[4].datain[25] top.gearbox_down_cc_tb[4].datain[24] top.gearbox_down_cc_tb[4].datain[23] top.gearbox_down_cc_tb[4].datain[22] top.gearbox_down_cc_tb[4].datain[21] top.gearbox_down_cc_tb[4].datain[20] top.gearbox_down_cc_tb[4].datain[19] top.gearbox_down_cc_tb[4].datain[18] top.gearbox_down_cc_tb[4].datain[17] top.gearbox_down_cc_tb[4].datain[16] top.gearbox_down_cc_tb[4].datain[15] top.gearbox_down_cc_tb[4].datain[14] top.gearbox_down_cc_tb[4].datain[13] top.gearbox_down_cc_tb[4].datain[12] top.gearbox_down_cc_tb[4].datain[11] top.gearbox_down_cc_tb[4].datain[10] top.gearbox_down_cc_tb[4].datain[9] top.gearbox_down_cc_tb[4].datain[8] top.gearbox_down_cc_tb[4].datain[7] top.gearbox_down_cc_tb[4].datain[6] top.gearbox_down_cc_tb[4].datain[5] top.gearbox_down_cc_tb[4].datain[4] top.gearbox_down_cc_tb[4].datain[3] top.gearbox_down_cc_tb[4].datain[2] top.gearbox_down_cc_tb[4].datain[1] top.gearbox_down_cc_tb[4].datain[0] -@28 -top.gearbox_down_cc_tb[4].syncout -top.gearbox_down_cc_tb[4].validout -@22 -#{top.gearbox_down_cc_tb[4].dataout[11:0]} top.gearbox_down_cc_tb[4].dataout[11] top.gearbox_down_cc_tb[4].dataout[10] top.gearbox_down_cc_tb[4].dataout[9] top.gearbox_down_cc_tb[4].dataout[8] top.gearbox_down_cc_tb[4].dataout[7] top.gearbox_down_cc_tb[4].dataout[6] top.gearbox_down_cc_tb[4].dataout[5] top.gearbox_down_cc_tb[4].dataout[4] top.gearbox_down_cc_tb[4].dataout[3] top.gearbox_down_cc_tb[4].dataout[2] top.gearbox_down_cc_tb[4].dataout[1] top.gearbox_down_cc_tb[4].dataout[0] -@28 -top.gearbox_down_cc_tb[4].firstout -top.gearbox_down_cc_tb[4].lastout -@1000200 --Example 4 (128->12) -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/misc/gearbox/gearbox_down_cc_tb.wdo b/sim/misc/gearbox/gearbox_down_cc_tb.wdo deleted file mode 100644 index 5b5c1bab1..000000000 --- a/sim/misc/gearbox/gearbox_down_cc_tb.wdo +++ /dev/null @@ -1,61 +0,0 @@ -onerror {resume} -quietly WaveActivateNextPane {} 0 -add wave -noupdate /gearbox_down_cc_tb/Clock -add wave -noupdate -expand -group {Example 1 (32 -> 8)} /gearbox_down_cc_tb/genInstances(0)/ValidOut -add wave -noupdate -expand -group {Example 1 (32 -> 8)} /gearbox_down_cc_tb/genInstances(0)/ValidIn -add wave -noupdate -expand -group {Example 1 (32 -> 8)} /gearbox_down_cc_tb/genInstances(0)/SyncOut -add wave -noupdate -expand -group {Example 1 (32 -> 8)} /gearbox_down_cc_tb/genInstances(0)/SyncIn -add wave -noupdate -expand -group {Example 1 (32 -> 8)} /gearbox_down_cc_tb/genInstances(0)/LastOut -add wave -noupdate -expand -group {Example 1 (32 -> 8)} /gearbox_down_cc_tb/genInstances(0)/FirstOut -add wave -noupdate -expand -group {Example 1 (32 -> 8)} /gearbox_down_cc_tb/genInstances(0)/DataOut -add wave -noupdate -expand -group {Example 1 (32 -> 8)} /gearbox_down_cc_tb/genInstances(0)/DataIn -add wave -noupdate -expand -group {Example 2 (20 -> 8)} /gearbox_down_cc_tb/genInstances(1)/ValidOut -add wave -noupdate -expand -group {Example 2 (20 -> 8)} /gearbox_down_cc_tb/genInstances(1)/ValidIn -add wave -noupdate -expand -group {Example 2 (20 -> 8)} /gearbox_down_cc_tb/genInstances(1)/SyncOut -add wave -noupdate -expand -group {Example 2 (20 -> 8)} /gearbox_down_cc_tb/genInstances(1)/SyncIn -add wave -noupdate -expand -group {Example 2 (20 -> 8)} /gearbox_down_cc_tb/genInstances(1)/LastOut -add wave -noupdate -expand -group {Example 2 (20 -> 8)} /gearbox_down_cc_tb/genInstances(1)/FirstOut -add wave -noupdate -expand -group {Example 2 (20 -> 8)} /gearbox_down_cc_tb/genInstances(1)/DataOut -add wave -noupdate -expand -group {Example 2 (20 -> 8)} /gearbox_down_cc_tb/genInstances(1)/DataIn -add wave -noupdate -expand -group {Example 3 (36 -> 8)} /gearbox_down_cc_tb/genInstances(2)/ValidOut -add wave -noupdate -expand -group {Example 3 (36 -> 8)} /gearbox_down_cc_tb/genInstances(2)/ValidIn -add wave -noupdate -expand -group {Example 3 (36 -> 8)} /gearbox_down_cc_tb/genInstances(2)/SyncOut -add wave -noupdate -expand -group {Example 3 (36 -> 8)} /gearbox_down_cc_tb/genInstances(2)/SyncIn -add wave -noupdate -expand -group {Example 3 (36 -> 8)} /gearbox_down_cc_tb/genInstances(2)/LastOut -add wave -noupdate -expand -group {Example 3 (36 -> 8)} /gearbox_down_cc_tb/genInstances(2)/FirstOut -add wave -noupdate -expand -group {Example 3 (36 -> 8)} /gearbox_down_cc_tb/genInstances(2)/DataOut -add wave -noupdate -expand -group {Example 3 (36 -> 8)} /gearbox_down_cc_tb/genInstances(2)/DataIn -add wave -noupdate -expand -group {Example 4 (66 -> 64)} /gearbox_down_cc_tb/genInstances(3)/ValidOut -add wave -noupdate -expand -group {Example 4 (66 -> 64)} /gearbox_down_cc_tb/genInstances(3)/ValidIn -add wave -noupdate -expand -group {Example 4 (66 -> 64)} /gearbox_down_cc_tb/genInstances(3)/SyncOut -add wave -noupdate -expand -group {Example 4 (66 -> 64)} /gearbox_down_cc_tb/genInstances(3)/SyncIn -add wave -noupdate -expand -group {Example 4 (66 -> 64)} /gearbox_down_cc_tb/genInstances(3)/LastOut -add wave -noupdate -expand -group {Example 4 (66 -> 64)} /gearbox_down_cc_tb/genInstances(3)/FirstOut -add wave -noupdate -expand -group {Example 4 (66 -> 64)} /gearbox_down_cc_tb/genInstances(3)/DataOut -add wave -noupdate -expand -group {Example 4 (66 -> 64)} /gearbox_down_cc_tb/genInstances(3)/DataIn -add wave -noupdate -expand -group {Example 5 (128 -> 12)} /gearbox_down_cc_tb/genInstances(4)/ValidOut -add wave -noupdate -expand -group {Example 5 (128 -> 12)} /gearbox_down_cc_tb/genInstances(4)/ValidIn -add wave -noupdate -expand -group {Example 5 (128 -> 12)} /gearbox_down_cc_tb/genInstances(4)/SyncOut -add wave -noupdate -expand -group {Example 5 (128 -> 12)} /gearbox_down_cc_tb/genInstances(4)/SyncIn -add wave -noupdate -expand -group {Example 5 (128 -> 12)} /gearbox_down_cc_tb/genInstances(4)/LastOut -add wave -noupdate -expand -group {Example 5 (128 -> 12)} /gearbox_down_cc_tb/genInstances(4)/FirstOut -add wave -noupdate -expand -group {Example 5 (128 -> 12)} /gearbox_down_cc_tb/genInstances(4)/DataOut -add wave -noupdate -expand -group {Example 5 (128 -> 12)} /gearbox_down_cc_tb/genInstances(4)/DataIn -TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 1} {35381868 fs} 0} -quietly wave cursor active 1 -configure wave -namecolwidth 338 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 -configure wave -gridoffset 0 -configure wave -gridperiod 1 -configure wave -griddelta 40 -configure wave -timeline 0 -configure wave -timelineunits ns -update -WaveRestoreZoom {0 fs} {1512 ns} diff --git a/sim/misc/gearbox/gearbox_down_dc_tb.ghdl b/sim/misc/gearbox/gearbox_down_dc_tb.ghdl deleted file mode 100644 index 20e3ea252..000000000 --- a/sim/misc/gearbox/gearbox_down_dc_tb.ghdl +++ /dev/null @@ -1,41 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/gearbox_down_dc_tb//clock1 -/gearbox_down_dc_tb//clock2 -/gearbox_down_dc_tb//datain -/gearbox_down_dc_tb//dataout -/gearbox_down_dc_tb//gear/clock1 -/gearbox_down_dc_tb//gear/clock2 -/gearbox_down_dc_tb//gear/in_data -/gearbox_down_dc_tb//gear/out_data -/gearbox_down_dc_tb//gear/wordboundary -/gearbox_down_dc_tb//gear/wordboundary_d -/gearbox_down_dc_tb//gear/align -/gearbox_down_dc_tb//gear/data_d -/gearbox_down_dc_tb//gear/datain -/gearbox_down_dc_tb//gear/dataout_d -/gearbox_down_dc_tb//gear/muxinput -/gearbox_down_dc_tb//gear/muxoutput -/gearbox_down_dc_tb//gear/muxcounter_us -/gearbox_down_dc_tb//gear/muxselect_us -/gearbox_down_dc_tb//clock1 -/gearbox_down_dc_tb//clock2 -/gearbox_down_dc_tb//datain -/gearbox_down_dc_tb//dataout -/gearbox_down_dc_tb//gear/clock1 -/gearbox_down_dc_tb//gear/clock2 -/gearbox_down_dc_tb//gear/in_data -/gearbox_down_dc_tb//gear/out_data -/gearbox_down_dc_tb//gear/wordboundary -/gearbox_down_dc_tb//gear/wordboundary_d -/gearbox_down_dc_tb//gear/align -/gearbox_down_dc_tb//gear/data_d -/gearbox_down_dc_tb//gear/datain -/gearbox_down_dc_tb//gear/dataout_d -/gearbox_down_dc_tb//gear/muxinput -/gearbox_down_dc_tb//gear/muxoutput -/gearbox_down_dc_tb//gear/muxcounter_us -/gearbox_down_dc_tb//gear/muxselect_us diff --git a/sim/misc/gearbox/gearbox_down_dc_tb.gtkw b/sim/misc/gearbox/gearbox_down_dc_tb.gtkw deleted file mode 100644 index 5543e96c2..000000000 --- a/sim/misc/gearbox/gearbox_down_dc_tb.gtkw +++ /dev/null @@ -1,41 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.66 (w)1999-2015 BSI -[*] Thu Jan 21 23:46:58 2016 -[*] -[dumpfile_mtime] "Thu Jan 21 23:45:45 2016" -[dumpfile_size] 21756 -[timestart] 0 -[size] 1920 996 -[pos] -1 -1 -*-27.380669 928800000 -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 -[treeopen] top. -[treeopen] top.gearbox_down_dc_tb. -[treeopen] top.gearbox_down_dc_tb.[0]. -[treeopen] top.gearbox_down_dc_tb.[1]. -[sst_width] 197 -[signals_width] 206 -[sst_expanded] 1 -[sst_vpaned_height] 292 -@800200 --Example 0 (32->8) -@29 -top.gearbox_down_dc_tb[0].clock1 -@28 -top.gearbox_down_dc_tb[0].clock2 -@22 -#{top.gearbox_down_dc_tb[0].datain[31:0]} top.gearbox_down_dc_tb[0].datain[31] top.gearbox_down_dc_tb[0].datain[30] top.gearbox_down_dc_tb[0].datain[29] top.gearbox_down_dc_tb[0].datain[28] top.gearbox_down_dc_tb[0].datain[27] top.gearbox_down_dc_tb[0].datain[26] top.gearbox_down_dc_tb[0].datain[25] top.gearbox_down_dc_tb[0].datain[24] top.gearbox_down_dc_tb[0].datain[23] top.gearbox_down_dc_tb[0].datain[22] top.gearbox_down_dc_tb[0].datain[21] top.gearbox_down_dc_tb[0].datain[20] top.gearbox_down_dc_tb[0].datain[19] top.gearbox_down_dc_tb[0].datain[18] top.gearbox_down_dc_tb[0].datain[17] top.gearbox_down_dc_tb[0].datain[16] top.gearbox_down_dc_tb[0].datain[15] top.gearbox_down_dc_tb[0].datain[14] top.gearbox_down_dc_tb[0].datain[13] top.gearbox_down_dc_tb[0].datain[12] top.gearbox_down_dc_tb[0].datain[11] top.gearbox_down_dc_tb[0].datain[10] top.gearbox_down_dc_tb[0].datain[9] top.gearbox_down_dc_tb[0].datain[8] top.gearbox_down_dc_tb[0].datain[7] top.gearbox_down_dc_tb[0].datain[6] top.gearbox_down_dc_tb[0].datain[5] top.gearbox_down_dc_tb[0].datain[4] top.gearbox_down_dc_tb[0].datain[3] top.gearbox_down_dc_tb[0].datain[2] top.gearbox_down_dc_tb[0].datain[1] top.gearbox_down_dc_tb[0].datain[0] -#{top.gearbox_down_dc_tb[0].dataout[7:0]} top.gearbox_down_dc_tb[0].dataout[7] top.gearbox_down_dc_tb[0].dataout[6] top.gearbox_down_dc_tb[0].dataout[5] top.gearbox_down_dc_tb[0].dataout[4] top.gearbox_down_dc_tb[0].dataout[3] top.gearbox_down_dc_tb[0].dataout[2] top.gearbox_down_dc_tb[0].dataout[1] top.gearbox_down_dc_tb[0].dataout[0] -@1000200 --Example 0 (32->8) -@800200 --Example 1 (128->8) -@28 -top.gearbox_down_dc_tb[1].clock1 -top.gearbox_down_dc_tb[1].clock2 -@22 -#{top.gearbox_down_dc_tb[1].datain[127:0]} top.gearbox_down_dc_tb[1].datain[127] top.gearbox_down_dc_tb[1].datain[126] top.gearbox_down_dc_tb[1].datain[125] top.gearbox_down_dc_tb[1].datain[124] top.gearbox_down_dc_tb[1].datain[123] top.gearbox_down_dc_tb[1].datain[122] top.gearbox_down_dc_tb[1].datain[121] top.gearbox_down_dc_tb[1].datain[120] top.gearbox_down_dc_tb[1].datain[119] top.gearbox_down_dc_tb[1].datain[118] top.gearbox_down_dc_tb[1].datain[117] top.gearbox_down_dc_tb[1].datain[116] top.gearbox_down_dc_tb[1].datain[115] top.gearbox_down_dc_tb[1].datain[114] top.gearbox_down_dc_tb[1].datain[113] top.gearbox_down_dc_tb[1].datain[112] top.gearbox_down_dc_tb[1].datain[111] top.gearbox_down_dc_tb[1].datain[110] top.gearbox_down_dc_tb[1].datain[109] top.gearbox_down_dc_tb[1].datain[108] top.gearbox_down_dc_tb[1].datain[107] top.gearbox_down_dc_tb[1].datain[106] top.gearbox_down_dc_tb[1].datain[105] top.gearbox_down_dc_tb[1].datain[104] top.gearbox_down_dc_tb[1].datain[103] top.gearbox_down_dc_tb[1].datain[102] top.gearbox_down_dc_tb[1].datain[101] top.gearbox_down_dc_tb[1].datain[100] top.gearbox_down_dc_tb[1].datain[99] top.gearbox_down_dc_tb[1].datain[98] top.gearbox_down_dc_tb[1].datain[97] top.gearbox_down_dc_tb[1].datain[96] top.gearbox_down_dc_tb[1].datain[95] top.gearbox_down_dc_tb[1].datain[94] top.gearbox_down_dc_tb[1].datain[93] top.gearbox_down_dc_tb[1].datain[92] top.gearbox_down_dc_tb[1].datain[91] top.gearbox_down_dc_tb[1].datain[90] top.gearbox_down_dc_tb[1].datain[89] top.gearbox_down_dc_tb[1].datain[88] top.gearbox_down_dc_tb[1].datain[87] top.gearbox_down_dc_tb[1].datain[86] top.gearbox_down_dc_tb[1].datain[85] top.gearbox_down_dc_tb[1].datain[84] top.gearbox_down_dc_tb[1].datain[83] top.gearbox_down_dc_tb[1].datain[82] top.gearbox_down_dc_tb[1].datain[81] top.gearbox_down_dc_tb[1].datain[80] top.gearbox_down_dc_tb[1].datain[79] top.gearbox_down_dc_tb[1].datain[78] top.gearbox_down_dc_tb[1].datain[77] top.gearbox_down_dc_tb[1].datain[76] top.gearbox_down_dc_tb[1].datain[75] top.gearbox_down_dc_tb[1].datain[74] top.gearbox_down_dc_tb[1].datain[73] top.gearbox_down_dc_tb[1].datain[72] top.gearbox_down_dc_tb[1].datain[71] top.gearbox_down_dc_tb[1].datain[70] top.gearbox_down_dc_tb[1].datain[69] top.gearbox_down_dc_tb[1].datain[68] top.gearbox_down_dc_tb[1].datain[67] top.gearbox_down_dc_tb[1].datain[66] top.gearbox_down_dc_tb[1].datain[65] top.gearbox_down_dc_tb[1].datain[64] top.gearbox_down_dc_tb[1].datain[63] top.gearbox_down_dc_tb[1].datain[62] top.gearbox_down_dc_tb[1].datain[61] top.gearbox_down_dc_tb[1].datain[60] top.gearbox_down_dc_tb[1].datain[59] top.gearbox_down_dc_tb[1].datain[58] top.gearbox_down_dc_tb[1].datain[57] top.gearbox_down_dc_tb[1].datain[56] top.gearbox_down_dc_tb[1].datain[55] top.gearbox_down_dc_tb[1].datain[54] top.gearbox_down_dc_tb[1].datain[53] top.gearbox_down_dc_tb[1].datain[52] top.gearbox_down_dc_tb[1].datain[51] top.gearbox_down_dc_tb[1].datain[50] top.gearbox_down_dc_tb[1].datain[49] top.gearbox_down_dc_tb[1].datain[48] top.gearbox_down_dc_tb[1].datain[47] top.gearbox_down_dc_tb[1].datain[46] top.gearbox_down_dc_tb[1].datain[45] top.gearbox_down_dc_tb[1].datain[44] top.gearbox_down_dc_tb[1].datain[43] top.gearbox_down_dc_tb[1].datain[42] top.gearbox_down_dc_tb[1].datain[41] top.gearbox_down_dc_tb[1].datain[40] top.gearbox_down_dc_tb[1].datain[39] top.gearbox_down_dc_tb[1].datain[38] top.gearbox_down_dc_tb[1].datain[37] top.gearbox_down_dc_tb[1].datain[36] top.gearbox_down_dc_tb[1].datain[35] top.gearbox_down_dc_tb[1].datain[34] top.gearbox_down_dc_tb[1].datain[33] top.gearbox_down_dc_tb[1].datain[32] top.gearbox_down_dc_tb[1].datain[31] top.gearbox_down_dc_tb[1].datain[30] top.gearbox_down_dc_tb[1].datain[29] top.gearbox_down_dc_tb[1].datain[28] top.gearbox_down_dc_tb[1].datain[27] top.gearbox_down_dc_tb[1].datain[26] top.gearbox_down_dc_tb[1].datain[25] top.gearbox_down_dc_tb[1].datain[24] top.gearbox_down_dc_tb[1].datain[23] top.gearbox_down_dc_tb[1].datain[22] top.gearbox_down_dc_tb[1].datain[21] top.gearbox_down_dc_tb[1].datain[20] top.gearbox_down_dc_tb[1].datain[19] top.gearbox_down_dc_tb[1].datain[18] top.gearbox_down_dc_tb[1].datain[17] top.gearbox_down_dc_tb[1].datain[16] top.gearbox_down_dc_tb[1].datain[15] top.gearbox_down_dc_tb[1].datain[14] top.gearbox_down_dc_tb[1].datain[13] top.gearbox_down_dc_tb[1].datain[12] top.gearbox_down_dc_tb[1].datain[11] top.gearbox_down_dc_tb[1].datain[10] top.gearbox_down_dc_tb[1].datain[9] top.gearbox_down_dc_tb[1].datain[8] top.gearbox_down_dc_tb[1].datain[7] top.gearbox_down_dc_tb[1].datain[6] top.gearbox_down_dc_tb[1].datain[5] top.gearbox_down_dc_tb[1].datain[4] top.gearbox_down_dc_tb[1].datain[3] top.gearbox_down_dc_tb[1].datain[2] top.gearbox_down_dc_tb[1].datain[1] top.gearbox_down_dc_tb[1].datain[0] -#{top.gearbox_down_dc_tb[1].dataout[7:0]} top.gearbox_down_dc_tb[1].dataout[7] top.gearbox_down_dc_tb[1].dataout[6] top.gearbox_down_dc_tb[1].dataout[5] top.gearbox_down_dc_tb[1].dataout[4] top.gearbox_down_dc_tb[1].dataout[3] top.gearbox_down_dc_tb[1].dataout[2] top.gearbox_down_dc_tb[1].dataout[1] top.gearbox_down_dc_tb[1].dataout[0] -@1000200 --Example 1 (128->8) -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/misc/gearbox/gearbox_down_dc_tb.wdo b/sim/misc/gearbox/gearbox_down_dc_tb.wdo deleted file mode 100644 index 8dfb90178..000000000 --- a/sim/misc/gearbox/gearbox_down_dc_tb.wdo +++ /dev/null @@ -1,28 +0,0 @@ -onerror {resume} -quietly WaveActivateNextPane {} 0 -add wave -noupdate -expand -group {Example 1 (32 -> 8)} -radix hexadecimal -radixshowbase 0 /gearbox_down_dc_tb/genInstances(0)/DataOut -add wave -noupdate -expand -group {Example 1 (32 -> 8)} -radix hexadecimal -radixshowbase 0 /gearbox_down_dc_tb/genInstances(0)/DataIn -add wave -noupdate -expand -group {Example 1 (32 -> 8)} /gearbox_down_dc_tb/genInstances(0)/Clock2 -add wave -noupdate -expand -group {Example 1 (32 -> 8)} /gearbox_down_dc_tb/genInstances(0)/Clock1 -add wave -noupdate -expand -group {Example 2 (128 -> 8)} -radix hexadecimal -radixshowbase 0 /gearbox_down_dc_tb/genInstances(1)/DataOut -add wave -noupdate -expand -group {Example 2 (128 -> 8)} -radix hexadecimal -radixshowbase 0 /gearbox_down_dc_tb/genInstances(1)/DataIn -add wave -noupdate -expand -group {Example 2 (128 -> 8)} /gearbox_down_dc_tb/genInstances(1)/Clock2 -add wave -noupdate -expand -group {Example 2 (128 -> 8)} /gearbox_down_dc_tb/genInstances(1)/Clock1 -TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 1} {200000000 fs} 0} -quietly wave cursor active 1 -configure wave -namecolwidth 223 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 -configure wave -gridoffset 0 -configure wave -gridperiod 1 -configure wave -griddelta 40 -configure wave -timeline 0 -configure wave -timelineunits ns -update -WaveRestoreZoom {274285714 fs} {446171429 fs} diff --git a/sim/misc/gearbox/gearbox_up_cc_tb.ghdl b/sim/misc/gearbox/gearbox_up_cc_tb.ghdl deleted file mode 100644 index 2f148ab06..000000000 --- a/sim/misc/gearbox/gearbox_up_cc_tb.ghdl +++ /dev/null @@ -1,246 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/gearbox_up_cc_tb/clock -/gearbox_up_cc_tb//syncin -/gearbox_up_cc_tb//validin -/gearbox_up_cc_tb//datain -/gearbox_up_cc_tb//syncout -/gearbox_up_cc_tb//validout -/gearbox_up_cc_tb//dataout -/gearbox_up_cc_tb//firstout -/gearbox_up_cc_tb//lastout -/gearbox_up_cc_tb//gear/clock -/gearbox_up_cc_tb//gear/in_sync -/gearbox_up_cc_tb//gear/in_valid -/gearbox_up_cc_tb//gear/in_data -/gearbox_up_cc_tb//gear/in_meta -/gearbox_up_cc_tb//gear/out_sync -/gearbox_up_cc_tb//gear/out_valid -/gearbox_up_cc_tb//gear/out_data -/gearbox_up_cc_tb//gear/out_meta -/gearbox_up_cc_tb//gear/out_first -/gearbox_up_cc_tb//gear/out_last -/gearbox_up_cc_tb//gear/in_sync_d -/gearbox_up_cc_tb//gear/in_data_d -/gearbox_up_cc_tb//gear/in_meta_d -/gearbox_up_cc_tb//gear/in_valid_d -/gearbox_up_cc_tb//gear/stageselect_rst -/gearbox_up_cc_tb//gear/stageselect_en -/gearbox_up_cc_tb//gear/stageselect_us -/gearbox_up_cc_tb//gear/stageselect_ov -/gearbox_up_cc_tb//gear/muxselect_rst -/gearbox_up_cc_tb//gear/muxselect_en -/gearbox_up_cc_tb//gear/muxselect_us -/gearbox_up_cc_tb//gear/muxselect_ov -/gearbox_up_cc_tb//gear/gearboxinput -/gearbox_up_cc_tb//gear/gearboxbuffer_en -/gearbox_up_cc_tb//gear/gearboxbuffer -/gearbox_up_cc_tb//gear/metabuffer -/gearbox_up_cc_tb//gear/gearboxoutput -/gearbox_up_cc_tb//gear/syncout -/gearbox_up_cc_tb//gear/validout -/gearbox_up_cc_tb//gear/dataout -/gearbox_up_cc_tb//gear/metaout -/gearbox_up_cc_tb//gear/firstout -/gearbox_up_cc_tb//gear/lastout -/gearbox_up_cc_tb//gear/out_sync_d -/gearbox_up_cc_tb//gear/out_valid_d -/gearbox_up_cc_tb//gear/out_data_d -/gearbox_up_cc_tb//gear/out_meta_d -/gearbox_up_cc_tb//gear/out_first_d -/gearbox_up_cc_tb//gear/out_last_d -/gearbox_up_cc_tb//syncin -/gearbox_up_cc_tb//validin -/gearbox_up_cc_tb//datain -/gearbox_up_cc_tb//syncout -/gearbox_up_cc_tb//validout -/gearbox_up_cc_tb//dataout -/gearbox_up_cc_tb//firstout -/gearbox_up_cc_tb//lastout -/gearbox_up_cc_tb//gear/clock -/gearbox_up_cc_tb//gear/in_sync -/gearbox_up_cc_tb//gear/in_valid -/gearbox_up_cc_tb//gear/in_data -/gearbox_up_cc_tb//gear/in_meta -/gearbox_up_cc_tb//gear/out_sync -/gearbox_up_cc_tb//gear/out_valid -/gearbox_up_cc_tb//gear/out_data -/gearbox_up_cc_tb//gear/out_meta -/gearbox_up_cc_tb//gear/out_first -/gearbox_up_cc_tb//gear/out_last -/gearbox_up_cc_tb//gear/in_sync_d -/gearbox_up_cc_tb//gear/in_data_d -/gearbox_up_cc_tb//gear/in_meta_d -/gearbox_up_cc_tb//gear/in_valid_d -/gearbox_up_cc_tb//gear/stageselect_rst -/gearbox_up_cc_tb//gear/stageselect_en -/gearbox_up_cc_tb//gear/stageselect_us -/gearbox_up_cc_tb//gear/stageselect_ov -/gearbox_up_cc_tb//gear/muxselect_rst -/gearbox_up_cc_tb//gear/muxselect_en -/gearbox_up_cc_tb//gear/muxselect_us -/gearbox_up_cc_tb//gear/muxselect_ov -/gearbox_up_cc_tb//gear/gearboxinput -/gearbox_up_cc_tb//gear/gearboxbuffer_en -/gearbox_up_cc_tb//gear/gearboxbuffer -/gearbox_up_cc_tb//gear/metabuffer -/gearbox_up_cc_tb//gear/gearboxoutput -/gearbox_up_cc_tb//gear/syncout -/gearbox_up_cc_tb//gear/validout -/gearbox_up_cc_tb//gear/dataout -/gearbox_up_cc_tb//gear/metaout -/gearbox_up_cc_tb//gear/firstout -/gearbox_up_cc_tb//gear/lastout -/gearbox_up_cc_tb//gear/out_sync_d -/gearbox_up_cc_tb//gear/out_valid_d -/gearbox_up_cc_tb//gear/out_data_d -/gearbox_up_cc_tb//gear/out_meta_d -/gearbox_up_cc_tb//gear/out_first_d -/gearbox_up_cc_tb//gear/out_last_d -/gearbox_up_cc_tb//syncin -/gearbox_up_cc_tb//validin -/gearbox_up_cc_tb//datain -/gearbox_up_cc_tb//syncout -/gearbox_up_cc_tb//validout -/gearbox_up_cc_tb//dataout -/gearbox_up_cc_tb//firstout -/gearbox_up_cc_tb//lastout -/gearbox_up_cc_tb//gear/clock -/gearbox_up_cc_tb//gear/in_sync -/gearbox_up_cc_tb//gear/in_valid -/gearbox_up_cc_tb//gear/in_data -/gearbox_up_cc_tb//gear/in_meta -/gearbox_up_cc_tb//gear/out_sync -/gearbox_up_cc_tb//gear/out_valid -/gearbox_up_cc_tb//gear/out_data -/gearbox_up_cc_tb//gear/out_meta -/gearbox_up_cc_tb//gear/out_first -/gearbox_up_cc_tb//gear/out_last -/gearbox_up_cc_tb//gear/in_sync_d -/gearbox_up_cc_tb//gear/in_data_d -/gearbox_up_cc_tb//gear/in_meta_d -/gearbox_up_cc_tb//gear/in_valid_d -/gearbox_up_cc_tb//gear/stageselect_rst -/gearbox_up_cc_tb//gear/stageselect_en -/gearbox_up_cc_tb//gear/stageselect_us -/gearbox_up_cc_tb//gear/stageselect_ov -/gearbox_up_cc_tb//gear/muxselect_rst -/gearbox_up_cc_tb//gear/muxselect_en -/gearbox_up_cc_tb//gear/muxselect_us -/gearbox_up_cc_tb//gear/muxselect_ov -/gearbox_up_cc_tb//gear/gearboxinput -/gearbox_up_cc_tb//gear/gearboxbuffer_en -/gearbox_up_cc_tb//gear/gearboxbuffer -/gearbox_up_cc_tb//gear/metabuffer -/gearbox_up_cc_tb//gear/gearboxoutput -/gearbox_up_cc_tb//gear/syncout -/gearbox_up_cc_tb//gear/validout -/gearbox_up_cc_tb//gear/dataout -/gearbox_up_cc_tb//gear/metaout -/gearbox_up_cc_tb//gear/firstout -/gearbox_up_cc_tb//gear/lastout -/gearbox_up_cc_tb//gear/out_sync_d -/gearbox_up_cc_tb//gear/out_valid_d -/gearbox_up_cc_tb//gear/out_data_d -/gearbox_up_cc_tb//gear/out_meta_d -/gearbox_up_cc_tb//gear/out_first_d -/gearbox_up_cc_tb//gear/out_last_d -/gearbox_up_cc_tb//syncin -/gearbox_up_cc_tb//validin -/gearbox_up_cc_tb//datain -/gearbox_up_cc_tb//syncout -/gearbox_up_cc_tb//validout -/gearbox_up_cc_tb//dataout -/gearbox_up_cc_tb//firstout -/gearbox_up_cc_tb//lastout -/gearbox_up_cc_tb//gear/clock -/gearbox_up_cc_tb//gear/in_sync -/gearbox_up_cc_tb//gear/in_valid -/gearbox_up_cc_tb//gear/in_data -/gearbox_up_cc_tb//gear/in_meta -/gearbox_up_cc_tb//gear/out_sync -/gearbox_up_cc_tb//gear/out_valid -/gearbox_up_cc_tb//gear/out_data -/gearbox_up_cc_tb//gear/out_meta -/gearbox_up_cc_tb//gear/out_first -/gearbox_up_cc_tb//gear/out_last -/gearbox_up_cc_tb//gear/in_sync_d -/gearbox_up_cc_tb//gear/in_data_d -/gearbox_up_cc_tb//gear/in_meta_d -/gearbox_up_cc_tb//gear/in_valid_d -/gearbox_up_cc_tb//gear/stageselect_rst -/gearbox_up_cc_tb//gear/stageselect_en -/gearbox_up_cc_tb//gear/stageselect_us -/gearbox_up_cc_tb//gear/stageselect_ov -/gearbox_up_cc_tb//gear/muxselect_rst -/gearbox_up_cc_tb//gear/muxselect_en -/gearbox_up_cc_tb//gear/muxselect_us -/gearbox_up_cc_tb//gear/muxselect_ov -/gearbox_up_cc_tb//gear/gearboxinput -/gearbox_up_cc_tb//gear/gearboxbuffer_en -/gearbox_up_cc_tb//gear/gearboxbuffer -/gearbox_up_cc_tb//gear/metabuffer -/gearbox_up_cc_tb//gear/gearboxoutput -/gearbox_up_cc_tb//gear/syncout -/gearbox_up_cc_tb//gear/validout -/gearbox_up_cc_tb//gear/dataout -/gearbox_up_cc_tb//gear/metaout -/gearbox_up_cc_tb//gear/firstout -/gearbox_up_cc_tb//gear/lastout -/gearbox_up_cc_tb//gear/out_sync_d -/gearbox_up_cc_tb//gear/out_valid_d -/gearbox_up_cc_tb//gear/out_data_d -/gearbox_up_cc_tb//gear/out_meta_d -/gearbox_up_cc_tb//gear/out_first_d -/gearbox_up_cc_tb//gear/out_last_d -/gearbox_up_cc_tb//syncin -/gearbox_up_cc_tb//validin -/gearbox_up_cc_tb//datain -/gearbox_up_cc_tb//syncout -/gearbox_up_cc_tb//validout -/gearbox_up_cc_tb//dataout -/gearbox_up_cc_tb//firstout -/gearbox_up_cc_tb//lastout -/gearbox_up_cc_tb//gear/clock -/gearbox_up_cc_tb//gear/in_sync -/gearbox_up_cc_tb//gear/in_valid -/gearbox_up_cc_tb//gear/in_data -/gearbox_up_cc_tb//gear/in_meta -/gearbox_up_cc_tb//gear/out_sync -/gearbox_up_cc_tb//gear/out_valid -/gearbox_up_cc_tb//gear/out_data -/gearbox_up_cc_tb//gear/out_meta -/gearbox_up_cc_tb//gear/out_first -/gearbox_up_cc_tb//gear/out_last -/gearbox_up_cc_tb//gear/in_sync_d -/gearbox_up_cc_tb//gear/in_data_d -/gearbox_up_cc_tb//gear/in_meta_d -/gearbox_up_cc_tb//gear/in_valid_d -/gearbox_up_cc_tb//gear/stageselect_rst -/gearbox_up_cc_tb//gear/stageselect_en -/gearbox_up_cc_tb//gear/stageselect_us -/gearbox_up_cc_tb//gear/stageselect_ov -/gearbox_up_cc_tb//gear/muxselect_rst -/gearbox_up_cc_tb//gear/muxselect_en -/gearbox_up_cc_tb//gear/muxselect_us -/gearbox_up_cc_tb//gear/muxselect_ov -/gearbox_up_cc_tb//gear/gearboxinput -/gearbox_up_cc_tb//gear/gearboxbuffer_en -/gearbox_up_cc_tb//gear/gearboxbuffer -/gearbox_up_cc_tb//gear/metabuffer -/gearbox_up_cc_tb//gear/gearboxoutput -/gearbox_up_cc_tb//gear/syncout -/gearbox_up_cc_tb//gear/validout -/gearbox_up_cc_tb//gear/dataout -/gearbox_up_cc_tb//gear/metaout -/gearbox_up_cc_tb//gear/firstout -/gearbox_up_cc_tb//gear/lastout -/gearbox_up_cc_tb//gear/out_sync_d -/gearbox_up_cc_tb//gear/out_valid_d -/gearbox_up_cc_tb//gear/out_data_d -/gearbox_up_cc_tb//gear/out_meta_d -/gearbox_up_cc_tb//gear/out_first_d -/gearbox_up_cc_tb//gear/out_last_d diff --git a/sim/misc/gearbox/gearbox_up_cc_tb.gtkw b/sim/misc/gearbox/gearbox_up_cc_tb.gtkw deleted file mode 100644 index c4a429a2e..000000000 --- a/sim/misc/gearbox/gearbox_up_cc_tb.gtkw +++ /dev/null @@ -1,186 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.61 (w)1999-2014 BSI -[*] Mon Feb 08 01:01:09 2016 -[*] -[dumpfile_mtime] "Mon Feb 08 00:54:13 2016" -[dumpfile_size] 255233 -[timestart] 0 -[size] 1676 996 -[pos] -1 -1 -*-27.962523 -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 -[treeopen] top. -[treeopen] top.gearbox_up_cc_tb. -[treeopen] top.gearbox_up_cc_tb.[0]. -[treeopen] top.gearbox_up_cc_tb.[1]. -[treeopen] top.gearbox_up_cc_tb.[2]. -[treeopen] top.gearbox_up_cc_tb.[3]. -[treeopen] top.gearbox_up_cc_tb.[4]. -[treeopen] top.gearbox_up_cc_tb.[4].gear.[0]. -[treeopen] top.gearbox_up_cc_tb.[4].gear.[31].muxinput. -[sst_width] 249 -[signals_width] 228 -[sst_expanded] 1 -[sst_vpaned_height] 292 -@28 -top.gearbox_up_cc_tb.clock -@800200 --Example 0 (8->32) -@200 --Inputs -@28 -top.gearbox_up_cc_tb[0].syncin -top.gearbox_up_cc_tb[0].validin -@22 -#{top.gearbox_up_cc_tb[0].datain[7:0]} top.gearbox_up_cc_tb[0].datain[7] top.gearbox_up_cc_tb[0].datain[6] top.gearbox_up_cc_tb[0].datain[5] top.gearbox_up_cc_tb[0].datain[4] top.gearbox_up_cc_tb[0].datain[3] top.gearbox_up_cc_tb[0].datain[2] top.gearbox_up_cc_tb[0].datain[1] top.gearbox_up_cc_tb[0].datain[0] -@200 --Outputs -@28 -top.gearbox_up_cc_tb[0].syncout -top.gearbox_up_cc_tb[0].validout -@22 -#{top.gearbox_up_cc_tb[0].dataout[31:0]} top.gearbox_up_cc_tb[0].dataout[31] top.gearbox_up_cc_tb[0].dataout[30] top.gearbox_up_cc_tb[0].dataout[29] top.gearbox_up_cc_tb[0].dataout[28] top.gearbox_up_cc_tb[0].dataout[27] top.gearbox_up_cc_tb[0].dataout[26] top.gearbox_up_cc_tb[0].dataout[25] top.gearbox_up_cc_tb[0].dataout[24] top.gearbox_up_cc_tb[0].dataout[23] top.gearbox_up_cc_tb[0].dataout[22] top.gearbox_up_cc_tb[0].dataout[21] top.gearbox_up_cc_tb[0].dataout[20] top.gearbox_up_cc_tb[0].dataout[19] top.gearbox_up_cc_tb[0].dataout[18] top.gearbox_up_cc_tb[0].dataout[17] top.gearbox_up_cc_tb[0].dataout[16] top.gearbox_up_cc_tb[0].dataout[15] top.gearbox_up_cc_tb[0].dataout[14] top.gearbox_up_cc_tb[0].dataout[13] top.gearbox_up_cc_tb[0].dataout[12] top.gearbox_up_cc_tb[0].dataout[11] top.gearbox_up_cc_tb[0].dataout[10] top.gearbox_up_cc_tb[0].dataout[9] top.gearbox_up_cc_tb[0].dataout[8] top.gearbox_up_cc_tb[0].dataout[7] top.gearbox_up_cc_tb[0].dataout[6] top.gearbox_up_cc_tb[0].dataout[5] top.gearbox_up_cc_tb[0].dataout[4] top.gearbox_up_cc_tb[0].dataout[3] top.gearbox_up_cc_tb[0].dataout[2] top.gearbox_up_cc_tb[0].dataout[1] top.gearbox_up_cc_tb[0].dataout[0] -@28 -top.gearbox_up_cc_tb[0].firstout -top.gearbox_up_cc_tb[0].lastout -@1000200 --Example 0 (8->32) -@800200 --Example 1 (8->20) -@200 --Inputs -@28 -[color] 3 -top.gearbox_up_cc_tb[1].syncin -[color] 3 -top.gearbox_up_cc_tb[1].validin -@22 -[color] 3 -#{top.gearbox_up_cc_tb[1].datain[7:0]} top.gearbox_up_cc_tb[1].datain[7] top.gearbox_up_cc_tb[1].datain[6] top.gearbox_up_cc_tb[1].datain[5] top.gearbox_up_cc_tb[1].datain[4] top.gearbox_up_cc_tb[1].datain[3] top.gearbox_up_cc_tb[1].datain[2] top.gearbox_up_cc_tb[1].datain[1] top.gearbox_up_cc_tb[1].datain[0] -@200 --Outputs -@28 -[color] 3 -top.gearbox_up_cc_tb[1].syncout -[color] 3 -top.gearbox_up_cc_tb[1].validout -@22 -[color] 3 -#{top.gearbox_up_cc_tb[1].dataout[19:0]} top.gearbox_up_cc_tb[1].dataout[19] top.gearbox_up_cc_tb[1].dataout[18] top.gearbox_up_cc_tb[1].dataout[17] top.gearbox_up_cc_tb[1].dataout[16] top.gearbox_up_cc_tb[1].dataout[15] top.gearbox_up_cc_tb[1].dataout[14] top.gearbox_up_cc_tb[1].dataout[13] top.gearbox_up_cc_tb[1].dataout[12] top.gearbox_up_cc_tb[1].dataout[11] top.gearbox_up_cc_tb[1].dataout[10] top.gearbox_up_cc_tb[1].dataout[9] top.gearbox_up_cc_tb[1].dataout[8] top.gearbox_up_cc_tb[1].dataout[7] top.gearbox_up_cc_tb[1].dataout[6] top.gearbox_up_cc_tb[1].dataout[5] top.gearbox_up_cc_tb[1].dataout[4] top.gearbox_up_cc_tb[1].dataout[3] top.gearbox_up_cc_tb[1].dataout[2] top.gearbox_up_cc_tb[1].dataout[1] top.gearbox_up_cc_tb[1].dataout[0] -@28 -[color] 3 -top.gearbox_up_cc_tb[1].firstout -[color] 3 -top.gearbox_up_cc_tb[1].lastout -@1000200 --Example 1 (8->20) -@800200 --Example 2 (8->36) -@200 --Inputs -@28 -[color] 2 -top.gearbox_up_cc_tb[2].syncin -[color] 2 -top.gearbox_up_cc_tb[2].validin -@22 -[color] 2 -#{top.gearbox_up_cc_tb[2].datain[7:0]} top.gearbox_up_cc_tb[2].datain[7] top.gearbox_up_cc_tb[2].datain[6] top.gearbox_up_cc_tb[2].datain[5] top.gearbox_up_cc_tb[2].datain[4] top.gearbox_up_cc_tb[2].datain[3] top.gearbox_up_cc_tb[2].datain[2] top.gearbox_up_cc_tb[2].datain[1] top.gearbox_up_cc_tb[2].datain[0] -@200 --Outputs -@28 -[color] 2 -top.gearbox_up_cc_tb[2].syncout -[color] 2 -top.gearbox_up_cc_tb[2].validout -@22 -[color] 2 -#{top.gearbox_up_cc_tb[2].dataout[35:0]} top.gearbox_up_cc_tb[2].dataout[35] top.gearbox_up_cc_tb[2].dataout[34] top.gearbox_up_cc_tb[2].dataout[33] top.gearbox_up_cc_tb[2].dataout[32] top.gearbox_up_cc_tb[2].dataout[31] top.gearbox_up_cc_tb[2].dataout[30] top.gearbox_up_cc_tb[2].dataout[29] top.gearbox_up_cc_tb[2].dataout[28] top.gearbox_up_cc_tb[2].dataout[27] top.gearbox_up_cc_tb[2].dataout[26] top.gearbox_up_cc_tb[2].dataout[25] top.gearbox_up_cc_tb[2].dataout[24] top.gearbox_up_cc_tb[2].dataout[23] top.gearbox_up_cc_tb[2].dataout[22] top.gearbox_up_cc_tb[2].dataout[21] top.gearbox_up_cc_tb[2].dataout[20] top.gearbox_up_cc_tb[2].dataout[19] top.gearbox_up_cc_tb[2].dataout[18] top.gearbox_up_cc_tb[2].dataout[17] top.gearbox_up_cc_tb[2].dataout[16] top.gearbox_up_cc_tb[2].dataout[15] top.gearbox_up_cc_tb[2].dataout[14] top.gearbox_up_cc_tb[2].dataout[13] top.gearbox_up_cc_tb[2].dataout[12] top.gearbox_up_cc_tb[2].dataout[11] top.gearbox_up_cc_tb[2].dataout[10] top.gearbox_up_cc_tb[2].dataout[9] top.gearbox_up_cc_tb[2].dataout[8] top.gearbox_up_cc_tb[2].dataout[7] top.gearbox_up_cc_tb[2].dataout[6] top.gearbox_up_cc_tb[2].dataout[5] top.gearbox_up_cc_tb[2].dataout[4] top.gearbox_up_cc_tb[2].dataout[3] top.gearbox_up_cc_tb[2].dataout[2] top.gearbox_up_cc_tb[2].dataout[1] top.gearbox_up_cc_tb[2].dataout[0] -@28 -[color] 2 -top.gearbox_up_cc_tb[2].firstout -[color] 2 -top.gearbox_up_cc_tb[2].lastout -@1000200 --Example 2 (8->36) -@800200 --Example 3 (64->66) -@200 --Inputs -@28 -[color] 1 -top.gearbox_up_cc_tb[3].syncin -[color] 1 -top.gearbox_up_cc_tb[3].validin -@22 -[color] 1 -#{top.gearbox_up_cc_tb[3].datain[63:0]} top.gearbox_up_cc_tb[3].datain[63] top.gearbox_up_cc_tb[3].datain[62] top.gearbox_up_cc_tb[3].datain[61] top.gearbox_up_cc_tb[3].datain[60] top.gearbox_up_cc_tb[3].datain[59] top.gearbox_up_cc_tb[3].datain[58] top.gearbox_up_cc_tb[3].datain[57] top.gearbox_up_cc_tb[3].datain[56] top.gearbox_up_cc_tb[3].datain[55] top.gearbox_up_cc_tb[3].datain[54] top.gearbox_up_cc_tb[3].datain[53] top.gearbox_up_cc_tb[3].datain[52] top.gearbox_up_cc_tb[3].datain[51] top.gearbox_up_cc_tb[3].datain[50] top.gearbox_up_cc_tb[3].datain[49] top.gearbox_up_cc_tb[3].datain[48] top.gearbox_up_cc_tb[3].datain[47] top.gearbox_up_cc_tb[3].datain[46] top.gearbox_up_cc_tb[3].datain[45] top.gearbox_up_cc_tb[3].datain[44] top.gearbox_up_cc_tb[3].datain[43] top.gearbox_up_cc_tb[3].datain[42] top.gearbox_up_cc_tb[3].datain[41] top.gearbox_up_cc_tb[3].datain[40] top.gearbox_up_cc_tb[3].datain[39] top.gearbox_up_cc_tb[3].datain[38] top.gearbox_up_cc_tb[3].datain[37] top.gearbox_up_cc_tb[3].datain[36] top.gearbox_up_cc_tb[3].datain[35] top.gearbox_up_cc_tb[3].datain[34] top.gearbox_up_cc_tb[3].datain[33] top.gearbox_up_cc_tb[3].datain[32] top.gearbox_up_cc_tb[3].datain[31] top.gearbox_up_cc_tb[3].datain[30] top.gearbox_up_cc_tb[3].datain[29] top.gearbox_up_cc_tb[3].datain[28] top.gearbox_up_cc_tb[3].datain[27] top.gearbox_up_cc_tb[3].datain[26] top.gearbox_up_cc_tb[3].datain[25] top.gearbox_up_cc_tb[3].datain[24] top.gearbox_up_cc_tb[3].datain[23] top.gearbox_up_cc_tb[3].datain[22] top.gearbox_up_cc_tb[3].datain[21] top.gearbox_up_cc_tb[3].datain[20] top.gearbox_up_cc_tb[3].datain[19] top.gearbox_up_cc_tb[3].datain[18] top.gearbox_up_cc_tb[3].datain[17] top.gearbox_up_cc_tb[3].datain[16] top.gearbox_up_cc_tb[3].datain[15] top.gearbox_up_cc_tb[3].datain[14] top.gearbox_up_cc_tb[3].datain[13] top.gearbox_up_cc_tb[3].datain[12] top.gearbox_up_cc_tb[3].datain[11] top.gearbox_up_cc_tb[3].datain[10] top.gearbox_up_cc_tb[3].datain[9] top.gearbox_up_cc_tb[3].datain[8] top.gearbox_up_cc_tb[3].datain[7] top.gearbox_up_cc_tb[3].datain[6] top.gearbox_up_cc_tb[3].datain[5] top.gearbox_up_cc_tb[3].datain[4] top.gearbox_up_cc_tb[3].datain[3] top.gearbox_up_cc_tb[3].datain[2] top.gearbox_up_cc_tb[3].datain[1] top.gearbox_up_cc_tb[3].datain[0] -@200 --Outputs -@28 -[color] 1 -top.gearbox_up_cc_tb[3].syncout -[color] 1 -top.gearbox_up_cc_tb[3].validout -[color] 1 -top.gearbox_up_cc_tb[3].firstout -[color] 1 -top.gearbox_up_cc_tb[3].lastout -@22 -[color] 1 -#{top.gearbox_up_cc_tb[3].dataout[65:0]} top.gearbox_up_cc_tb[3].dataout[65] top.gearbox_up_cc_tb[3].dataout[64] top.gearbox_up_cc_tb[3].dataout[63] top.gearbox_up_cc_tb[3].dataout[62] top.gearbox_up_cc_tb[3].dataout[61] top.gearbox_up_cc_tb[3].dataout[60] top.gearbox_up_cc_tb[3].dataout[59] top.gearbox_up_cc_tb[3].dataout[58] top.gearbox_up_cc_tb[3].dataout[57] top.gearbox_up_cc_tb[3].dataout[56] top.gearbox_up_cc_tb[3].dataout[55] top.gearbox_up_cc_tb[3].dataout[54] top.gearbox_up_cc_tb[3].dataout[53] top.gearbox_up_cc_tb[3].dataout[52] top.gearbox_up_cc_tb[3].dataout[51] top.gearbox_up_cc_tb[3].dataout[50] top.gearbox_up_cc_tb[3].dataout[49] top.gearbox_up_cc_tb[3].dataout[48] top.gearbox_up_cc_tb[3].dataout[47] top.gearbox_up_cc_tb[3].dataout[46] top.gearbox_up_cc_tb[3].dataout[45] top.gearbox_up_cc_tb[3].dataout[44] top.gearbox_up_cc_tb[3].dataout[43] top.gearbox_up_cc_tb[3].dataout[42] top.gearbox_up_cc_tb[3].dataout[41] top.gearbox_up_cc_tb[3].dataout[40] top.gearbox_up_cc_tb[3].dataout[39] top.gearbox_up_cc_tb[3].dataout[38] top.gearbox_up_cc_tb[3].dataout[37] top.gearbox_up_cc_tb[3].dataout[36] top.gearbox_up_cc_tb[3].dataout[35] top.gearbox_up_cc_tb[3].dataout[34] top.gearbox_up_cc_tb[3].dataout[33] top.gearbox_up_cc_tb[3].dataout[32] top.gearbox_up_cc_tb[3].dataout[31] top.gearbox_up_cc_tb[3].dataout[30] top.gearbox_up_cc_tb[3].dataout[29] top.gearbox_up_cc_tb[3].dataout[28] top.gearbox_up_cc_tb[3].dataout[27] top.gearbox_up_cc_tb[3].dataout[26] top.gearbox_up_cc_tb[3].dataout[25] top.gearbox_up_cc_tb[3].dataout[24] top.gearbox_up_cc_tb[3].dataout[23] top.gearbox_up_cc_tb[3].dataout[22] top.gearbox_up_cc_tb[3].dataout[21] top.gearbox_up_cc_tb[3].dataout[20] top.gearbox_up_cc_tb[3].dataout[19] top.gearbox_up_cc_tb[3].dataout[18] top.gearbox_up_cc_tb[3].dataout[17] top.gearbox_up_cc_tb[3].dataout[16] top.gearbox_up_cc_tb[3].dataout[15] top.gearbox_up_cc_tb[3].dataout[14] top.gearbox_up_cc_tb[3].dataout[13] top.gearbox_up_cc_tb[3].dataout[12] top.gearbox_up_cc_tb[3].dataout[11] top.gearbox_up_cc_tb[3].dataout[10] top.gearbox_up_cc_tb[3].dataout[9] top.gearbox_up_cc_tb[3].dataout[8] top.gearbox_up_cc_tb[3].dataout[7] top.gearbox_up_cc_tb[3].dataout[6] top.gearbox_up_cc_tb[3].dataout[5] top.gearbox_up_cc_tb[3].dataout[4] top.gearbox_up_cc_tb[3].dataout[3] top.gearbox_up_cc_tb[3].dataout[2] top.gearbox_up_cc_tb[3].dataout[1] top.gearbox_up_cc_tb[3].dataout[0] -@1000200 --Example 3 (64->66) -@800200 --Example 4 (12->128) -@200 --Inputs -@28 -[color] 6 -top.gearbox_up_cc_tb[4].syncin -[color] 6 -top.gearbox_up_cc_tb[4].validin -@22 -[color] 6 -#{top.gearbox_up_cc_tb[4].datain[11:0]} top.gearbox_up_cc_tb[4].datain[11] top.gearbox_up_cc_tb[4].datain[10] top.gearbox_up_cc_tb[4].datain[9] top.gearbox_up_cc_tb[4].datain[8] top.gearbox_up_cc_tb[4].datain[7] top.gearbox_up_cc_tb[4].datain[6] top.gearbox_up_cc_tb[4].datain[5] top.gearbox_up_cc_tb[4].datain[4] top.gearbox_up_cc_tb[4].datain[3] top.gearbox_up_cc_tb[4].datain[2] top.gearbox_up_cc_tb[4].datain[1] top.gearbox_up_cc_tb[4].datain[0] -@200 --Outputs -@28 -[color] 6 -top.gearbox_up_cc_tb[4].syncout -[color] 6 -top.gearbox_up_cc_tb[4].validout -@22 -[color] 6 -#{top.gearbox_up_cc_tb[4].dataout[127:0]} top.gearbox_up_cc_tb[4].dataout[127] top.gearbox_up_cc_tb[4].dataout[126] top.gearbox_up_cc_tb[4].dataout[125] top.gearbox_up_cc_tb[4].dataout[124] top.gearbox_up_cc_tb[4].dataout[123] top.gearbox_up_cc_tb[4].dataout[122] top.gearbox_up_cc_tb[4].dataout[121] top.gearbox_up_cc_tb[4].dataout[120] top.gearbox_up_cc_tb[4].dataout[119] top.gearbox_up_cc_tb[4].dataout[118] top.gearbox_up_cc_tb[4].dataout[117] top.gearbox_up_cc_tb[4].dataout[116] top.gearbox_up_cc_tb[4].dataout[115] top.gearbox_up_cc_tb[4].dataout[114] top.gearbox_up_cc_tb[4].dataout[113] top.gearbox_up_cc_tb[4].dataout[112] top.gearbox_up_cc_tb[4].dataout[111] top.gearbox_up_cc_tb[4].dataout[110] top.gearbox_up_cc_tb[4].dataout[109] top.gearbox_up_cc_tb[4].dataout[108] top.gearbox_up_cc_tb[4].dataout[107] top.gearbox_up_cc_tb[4].dataout[106] top.gearbox_up_cc_tb[4].dataout[105] top.gearbox_up_cc_tb[4].dataout[104] top.gearbox_up_cc_tb[4].dataout[103] top.gearbox_up_cc_tb[4].dataout[102] top.gearbox_up_cc_tb[4].dataout[101] top.gearbox_up_cc_tb[4].dataout[100] top.gearbox_up_cc_tb[4].dataout[99] top.gearbox_up_cc_tb[4].dataout[98] top.gearbox_up_cc_tb[4].dataout[97] top.gearbox_up_cc_tb[4].dataout[96] top.gearbox_up_cc_tb[4].dataout[95] top.gearbox_up_cc_tb[4].dataout[94] top.gearbox_up_cc_tb[4].dataout[93] top.gearbox_up_cc_tb[4].dataout[92] top.gearbox_up_cc_tb[4].dataout[91] top.gearbox_up_cc_tb[4].dataout[90] top.gearbox_up_cc_tb[4].dataout[89] top.gearbox_up_cc_tb[4].dataout[88] top.gearbox_up_cc_tb[4].dataout[87] top.gearbox_up_cc_tb[4].dataout[86] top.gearbox_up_cc_tb[4].dataout[85] top.gearbox_up_cc_tb[4].dataout[84] top.gearbox_up_cc_tb[4].dataout[83] top.gearbox_up_cc_tb[4].dataout[82] top.gearbox_up_cc_tb[4].dataout[81] top.gearbox_up_cc_tb[4].dataout[80] top.gearbox_up_cc_tb[4].dataout[79] top.gearbox_up_cc_tb[4].dataout[78] top.gearbox_up_cc_tb[4].dataout[77] top.gearbox_up_cc_tb[4].dataout[76] top.gearbox_up_cc_tb[4].dataout[75] top.gearbox_up_cc_tb[4].dataout[74] top.gearbox_up_cc_tb[4].dataout[73] top.gearbox_up_cc_tb[4].dataout[72] top.gearbox_up_cc_tb[4].dataout[71] top.gearbox_up_cc_tb[4].dataout[70] top.gearbox_up_cc_tb[4].dataout[69] top.gearbox_up_cc_tb[4].dataout[68] top.gearbox_up_cc_tb[4].dataout[67] top.gearbox_up_cc_tb[4].dataout[66] top.gearbox_up_cc_tb[4].dataout[65] top.gearbox_up_cc_tb[4].dataout[64] top.gearbox_up_cc_tb[4].dataout[63] top.gearbox_up_cc_tb[4].dataout[62] top.gearbox_up_cc_tb[4].dataout[61] top.gearbox_up_cc_tb[4].dataout[60] top.gearbox_up_cc_tb[4].dataout[59] top.gearbox_up_cc_tb[4].dataout[58] top.gearbox_up_cc_tb[4].dataout[57] top.gearbox_up_cc_tb[4].dataout[56] top.gearbox_up_cc_tb[4].dataout[55] top.gearbox_up_cc_tb[4].dataout[54] top.gearbox_up_cc_tb[4].dataout[53] top.gearbox_up_cc_tb[4].dataout[52] top.gearbox_up_cc_tb[4].dataout[51] top.gearbox_up_cc_tb[4].dataout[50] top.gearbox_up_cc_tb[4].dataout[49] top.gearbox_up_cc_tb[4].dataout[48] top.gearbox_up_cc_tb[4].dataout[47] top.gearbox_up_cc_tb[4].dataout[46] top.gearbox_up_cc_tb[4].dataout[45] top.gearbox_up_cc_tb[4].dataout[44] top.gearbox_up_cc_tb[4].dataout[43] top.gearbox_up_cc_tb[4].dataout[42] top.gearbox_up_cc_tb[4].dataout[41] top.gearbox_up_cc_tb[4].dataout[40] top.gearbox_up_cc_tb[4].dataout[39] top.gearbox_up_cc_tb[4].dataout[38] top.gearbox_up_cc_tb[4].dataout[37] top.gearbox_up_cc_tb[4].dataout[36] top.gearbox_up_cc_tb[4].dataout[35] top.gearbox_up_cc_tb[4].dataout[34] top.gearbox_up_cc_tb[4].dataout[33] top.gearbox_up_cc_tb[4].dataout[32] top.gearbox_up_cc_tb[4].dataout[31] top.gearbox_up_cc_tb[4].dataout[30] top.gearbox_up_cc_tb[4].dataout[29] top.gearbox_up_cc_tb[4].dataout[28] top.gearbox_up_cc_tb[4].dataout[27] top.gearbox_up_cc_tb[4].dataout[26] top.gearbox_up_cc_tb[4].dataout[25] top.gearbox_up_cc_tb[4].dataout[24] top.gearbox_up_cc_tb[4].dataout[23] top.gearbox_up_cc_tb[4].dataout[22] top.gearbox_up_cc_tb[4].dataout[21] top.gearbox_up_cc_tb[4].dataout[20] top.gearbox_up_cc_tb[4].dataout[19] top.gearbox_up_cc_tb[4].dataout[18] top.gearbox_up_cc_tb[4].dataout[17] top.gearbox_up_cc_tb[4].dataout[16] top.gearbox_up_cc_tb[4].dataout[15] top.gearbox_up_cc_tb[4].dataout[14] top.gearbox_up_cc_tb[4].dataout[13] top.gearbox_up_cc_tb[4].dataout[12] top.gearbox_up_cc_tb[4].dataout[11] top.gearbox_up_cc_tb[4].dataout[10] top.gearbox_up_cc_tb[4].dataout[9] top.gearbox_up_cc_tb[4].dataout[8] top.gearbox_up_cc_tb[4].dataout[7] top.gearbox_up_cc_tb[4].dataout[6] top.gearbox_up_cc_tb[4].dataout[5] top.gearbox_up_cc_tb[4].dataout[4] top.gearbox_up_cc_tb[4].dataout[3] top.gearbox_up_cc_tb[4].dataout[2] top.gearbox_up_cc_tb[4].dataout[1] top.gearbox_up_cc_tb[4].dataout[0] -@28 -[color] 6 -top.gearbox_up_cc_tb[4].firstout -[color] 6 -top.gearbox_up_cc_tb[4].lastout -@200 --Internal -@28 -[color] 6 -top.gearbox_up_cc_tb[4].gear.muxselect_rst -[color] 6 -top.gearbox_up_cc_tb[4].gear.muxselect_en -@24 -[color] 6 -#{top.gearbox_up_cc_tb[4].gear.muxselect_us[1:0]} top.gearbox_up_cc_tb[4].gear.muxselect_us[1] top.gearbox_up_cc_tb[4].gear.muxselect_us[0] -@28 -[color] 6 -top.gearbox_up_cc_tb[4].gear.muxselect_ov -[color] 6 -top.gearbox_up_cc_tb[4].gear.stageselect_rst -[color] 6 -top.gearbox_up_cc_tb[4].gear.stageselect_en -@25 -[color] 6 -#{top.gearbox_up_cc_tb[4].gear.stageselect_us[4:0]} top.gearbox_up_cc_tb[4].gear.stageselect_us[4] top.gearbox_up_cc_tb[4].gear.stageselect_us[3] top.gearbox_up_cc_tb[4].gear.stageselect_us[2] top.gearbox_up_cc_tb[4].gear.stageselect_us[1] top.gearbox_up_cc_tb[4].gear.stageselect_us[0] -@28 -[color] 6 -top.gearbox_up_cc_tb[4].gear.stageselect_ov -@1000200 --Example 4 (12->128) -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/misc/gearbox/gearbox_up_cc_tb.wdo b/sim/misc/gearbox/gearbox_up_cc_tb.wdo deleted file mode 100644 index 3fe04e87f..000000000 --- a/sim/misc/gearbox/gearbox_up_cc_tb.wdo +++ /dev/null @@ -1,61 +0,0 @@ -onerror {resume} -quietly WaveActivateNextPane {} 0 -add wave -noupdate /gearbox_up_cc_tb/Clock -add wave -noupdate -expand -group {Example 1 (8 -> 32)} /gearbox_up_cc_tb/genInstances(0)/ValidOut -add wave -noupdate -expand -group {Example 1 (8 -> 32)} /gearbox_up_cc_tb/genInstances(0)/ValidIn -add wave -noupdate -expand -group {Example 1 (8 -> 32)} /gearbox_up_cc_tb/genInstances(0)/SyncOut -add wave -noupdate -expand -group {Example 1 (8 -> 32)} /gearbox_up_cc_tb/genInstances(0)/SyncIn -add wave -noupdate -expand -group {Example 1 (8 -> 32)} /gearbox_up_cc_tb/genInstances(0)/LastOut -add wave -noupdate -expand -group {Example 1 (8 -> 32)} /gearbox_up_cc_tb/genInstances(0)/FirstOut -add wave -noupdate -expand -group {Example 1 (8 -> 32)} /gearbox_up_cc_tb/genInstances(0)/DataOut -add wave -noupdate -expand -group {Example 1 (8 -> 32)} /gearbox_up_cc_tb/genInstances(0)/DataIn -add wave -noupdate -expand -group {Example 2 (8 -> 20)} /gearbox_up_cc_tb/genInstances(1)/ValidOut -add wave -noupdate -expand -group {Example 2 (8 -> 20)} /gearbox_up_cc_tb/genInstances(1)/ValidIn -add wave -noupdate -expand -group {Example 2 (8 -> 20)} /gearbox_up_cc_tb/genInstances(1)/SyncOut -add wave -noupdate -expand -group {Example 2 (8 -> 20)} /gearbox_up_cc_tb/genInstances(1)/SyncIn -add wave -noupdate -expand -group {Example 2 (8 -> 20)} /gearbox_up_cc_tb/genInstances(1)/LastOut -add wave -noupdate -expand -group {Example 2 (8 -> 20)} /gearbox_up_cc_tb/genInstances(1)/FirstOut -add wave -noupdate -expand -group {Example 2 (8 -> 20)} /gearbox_up_cc_tb/genInstances(1)/DataOut -add wave -noupdate -expand -group {Example 2 (8 -> 20)} /gearbox_up_cc_tb/genInstances(1)/DataIn -add wave -noupdate -expand -group {Example 3 (8 -> 36)} /gearbox_up_cc_tb/genInstances(2)/ValidOut -add wave -noupdate -expand -group {Example 3 (8 -> 36)} /gearbox_up_cc_tb/genInstances(2)/ValidIn -add wave -noupdate -expand -group {Example 3 (8 -> 36)} /gearbox_up_cc_tb/genInstances(2)/SyncOut -add wave -noupdate -expand -group {Example 3 (8 -> 36)} /gearbox_up_cc_tb/genInstances(2)/SyncIn -add wave -noupdate -expand -group {Example 3 (8 -> 36)} /gearbox_up_cc_tb/genInstances(2)/LastOut -add wave -noupdate -expand -group {Example 3 (8 -> 36)} /gearbox_up_cc_tb/genInstances(2)/FirstOut -add wave -noupdate -expand -group {Example 3 (8 -> 36)} /gearbox_up_cc_tb/genInstances(2)/DataOut -add wave -noupdate -expand -group {Example 3 (8 -> 36)} /gearbox_up_cc_tb/genInstances(2)/DataIn -add wave -noupdate -expand -group {Example 4 (64 -> 66)} /gearbox_up_cc_tb/genInstances(3)/ValidOut -add wave -noupdate -expand -group {Example 4 (64 -> 66)} /gearbox_up_cc_tb/genInstances(3)/ValidIn -add wave -noupdate -expand -group {Example 4 (64 -> 66)} /gearbox_up_cc_tb/genInstances(3)/SyncOut -add wave -noupdate -expand -group {Example 4 (64 -> 66)} /gearbox_up_cc_tb/genInstances(3)/SyncIn -add wave -noupdate -expand -group {Example 4 (64 -> 66)} /gearbox_up_cc_tb/genInstances(3)/LastOut -add wave -noupdate -expand -group {Example 4 (64 -> 66)} /gearbox_up_cc_tb/genInstances(3)/FirstOut -add wave -noupdate -expand -group {Example 4 (64 -> 66)} /gearbox_up_cc_tb/genInstances(3)/DataOut -add wave -noupdate -expand -group {Example 4 (64 -> 66)} /gearbox_up_cc_tb/genInstances(3)/DataIn -add wave -noupdate -expand -group {Example 5 (12 -> 128)} /gearbox_up_cc_tb/genInstances(4)/ValidOut -add wave -noupdate -expand -group {Example 5 (12 -> 128)} /gearbox_up_cc_tb/genInstances(4)/ValidIn -add wave -noupdate -expand -group {Example 5 (12 -> 128)} /gearbox_up_cc_tb/genInstances(4)/SyncOut -add wave -noupdate -expand -group {Example 5 (12 -> 128)} /gearbox_up_cc_tb/genInstances(4)/SyncIn -add wave -noupdate -expand -group {Example 5 (12 -> 128)} /gearbox_up_cc_tb/genInstances(4)/LastOut -add wave -noupdate -expand -group {Example 5 (12 -> 128)} /gearbox_up_cc_tb/genInstances(4)/FirstOut -add wave -noupdate -expand -group {Example 5 (12 -> 128)} /gearbox_up_cc_tb/genInstances(4)/DataOut -add wave -noupdate -expand -group {Example 5 (12 -> 128)} /gearbox_up_cc_tb/genInstances(4)/DataIn -TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 1} {169270802 fs} 0} -quietly wave cursor active 1 -configure wave -namecolwidth 297 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 -configure wave -gridoffset 0 -configure wave -gridperiod 1 -configure wave -griddelta 40 -configure wave -timeline 0 -configure wave -timelineunits ns -update -WaveRestoreZoom {0 fs} {1512 ns} diff --git a/sim/misc/gearbox/gearbox_up_dc_tb.ghdl b/sim/misc/gearbox/gearbox_up_dc_tb.ghdl deleted file mode 100644 index cc34b1198..000000000 --- a/sim/misc/gearbox/gearbox_up_dc_tb.ghdl +++ /dev/null @@ -1,53 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/gearbox_up_dc_tb//clock1 -/gearbox_up_dc_tb//clock2 -/gearbox_up_dc_tb//align -/gearbox_up_dc_tb//datain -/gearbox_up_dc_tb//dataout -/gearbox_up_dc_tb//valid -/gearbox_up_dc_tb//gear/clock1 -/gearbox_up_dc_tb//gear/clock2 -/gearbox_up_dc_tb//gear/in_align -/gearbox_up_dc_tb//gear/in_data -/gearbox_up_dc_tb//gear/out_data -/gearbox_up_dc_tb//gear/out_valid -/gearbox_up_dc_tb//gear/counter_us -/gearbox_up_dc_tb//gear/select_us -/gearbox_up_dc_tb//gear/in_data_d -/gearbox_up_dc_tb//gear/in_align_d -/gearbox_up_dc_tb//gear/data_d -/gearbox_up_dc_tb//gear/collected -/gearbox_up_dc_tb//gear/collected_swapped -/gearbox_up_dc_tb//gear/collected_en -/gearbox_up_dc_tb//gear/collected_d -/gearbox_up_dc_tb//gear/dataout_d -/gearbox_up_dc_tb//gear/valid_r -/gearbox_up_dc_tb//gear/valid_d -/gearbox_up_dc_tb//clock1 -/gearbox_up_dc_tb//clock2 -/gearbox_up_dc_tb//align -/gearbox_up_dc_tb//datain -/gearbox_up_dc_tb//dataout -/gearbox_up_dc_tb//valid -/gearbox_up_dc_tb//gear/clock1 -/gearbox_up_dc_tb//gear/clock2 -/gearbox_up_dc_tb//gear/in_align -/gearbox_up_dc_tb//gear/in_data -/gearbox_up_dc_tb//gear/out_data -/gearbox_up_dc_tb//gear/out_valid -/gearbox_up_dc_tb//gear/counter_us -/gearbox_up_dc_tb//gear/select_us -/gearbox_up_dc_tb//gear/in_data_d -/gearbox_up_dc_tb//gear/in_align_d -/gearbox_up_dc_tb//gear/data_d -/gearbox_up_dc_tb//gear/collected -/gearbox_up_dc_tb//gear/collected_swapped -/gearbox_up_dc_tb//gear/collected_en -/gearbox_up_dc_tb//gear/collected_d -/gearbox_up_dc_tb//gear/dataout_d -/gearbox_up_dc_tb//gear/valid_r -/gearbox_up_dc_tb//gear/valid_d diff --git a/sim/misc/gearbox/gearbox_up_dc_tb.gtkw b/sim/misc/gearbox/gearbox_up_dc_tb.gtkw deleted file mode 100644 index 2bad64bfb..000000000 --- a/sim/misc/gearbox/gearbox_up_dc_tb.gtkw +++ /dev/null @@ -1,46 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.61 (w)1999-2014 BSI -[*] Mon Feb 08 01:07:41 2016 -[*] -[dumpfile_mtime] "Mon Feb 08 01:05:18 2016" -[dumpfile_size] 143749 -[timestart] 0 -[size] 1676 996 -[pos] -1 -1 -*-25.640909 -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 -[treeopen] top. -[treeopen] top.gearbox_up_dc_tb. -[treeopen] top.gearbox_up_dc_tb.[0]. -[treeopen] top.gearbox_up_dc_tb.[1]. -[sst_width] 197 -[signals_width] 190 -[sst_expanded] 1 -[sst_vpaned_height] 292 -@800200 --Example 0 (8->32) -@28 -top.gearbox_up_dc_tb[0].clock1 -top.gearbox_up_dc_tb[0].clock2 -@29 -top.gearbox_up_dc_tb[0].align -@28 -top.gearbox_up_dc_tb[0].valid -@22 -#{top.gearbox_up_dc_tb[0].datain[7:0]} top.gearbox_up_dc_tb[0].datain[7] top.gearbox_up_dc_tb[0].datain[6] top.gearbox_up_dc_tb[0].datain[5] top.gearbox_up_dc_tb[0].datain[4] top.gearbox_up_dc_tb[0].datain[3] top.gearbox_up_dc_tb[0].datain[2] top.gearbox_up_dc_tb[0].datain[1] top.gearbox_up_dc_tb[0].datain[0] -#{top.gearbox_up_dc_tb[0].dataout[31:0]} top.gearbox_up_dc_tb[0].dataout[31] top.gearbox_up_dc_tb[0].dataout[30] top.gearbox_up_dc_tb[0].dataout[29] top.gearbox_up_dc_tb[0].dataout[28] top.gearbox_up_dc_tb[0].dataout[27] top.gearbox_up_dc_tb[0].dataout[26] top.gearbox_up_dc_tb[0].dataout[25] top.gearbox_up_dc_tb[0].dataout[24] top.gearbox_up_dc_tb[0].dataout[23] top.gearbox_up_dc_tb[0].dataout[22] top.gearbox_up_dc_tb[0].dataout[21] top.gearbox_up_dc_tb[0].dataout[20] top.gearbox_up_dc_tb[0].dataout[19] top.gearbox_up_dc_tb[0].dataout[18] top.gearbox_up_dc_tb[0].dataout[17] top.gearbox_up_dc_tb[0].dataout[16] top.gearbox_up_dc_tb[0].dataout[15] top.gearbox_up_dc_tb[0].dataout[14] top.gearbox_up_dc_tb[0].dataout[13] top.gearbox_up_dc_tb[0].dataout[12] top.gearbox_up_dc_tb[0].dataout[11] top.gearbox_up_dc_tb[0].dataout[10] top.gearbox_up_dc_tb[0].dataout[9] top.gearbox_up_dc_tb[0].dataout[8] top.gearbox_up_dc_tb[0].dataout[7] top.gearbox_up_dc_tb[0].dataout[6] top.gearbox_up_dc_tb[0].dataout[5] top.gearbox_up_dc_tb[0].dataout[4] top.gearbox_up_dc_tb[0].dataout[3] top.gearbox_up_dc_tb[0].dataout[2] top.gearbox_up_dc_tb[0].dataout[1] top.gearbox_up_dc_tb[0].dataout[0] -@1000200 --Example 0 (8->32) -@800200 --Example 1 (8->128) -@28 -top.gearbox_up_dc_tb[1].clock1 -top.gearbox_up_dc_tb[1].clock2 -top.gearbox_up_dc_tb[1].align -top.gearbox_up_dc_tb[1].valid -@22 -#{top.gearbox_up_dc_tb[1].datain[7:0]} top.gearbox_up_dc_tb[1].datain[7] top.gearbox_up_dc_tb[1].datain[6] top.gearbox_up_dc_tb[1].datain[5] top.gearbox_up_dc_tb[1].datain[4] top.gearbox_up_dc_tb[1].datain[3] top.gearbox_up_dc_tb[1].datain[2] top.gearbox_up_dc_tb[1].datain[1] top.gearbox_up_dc_tb[1].datain[0] -#{top.gearbox_up_dc_tb[1].dataout[127:0]} top.gearbox_up_dc_tb[1].dataout[127] top.gearbox_up_dc_tb[1].dataout[126] top.gearbox_up_dc_tb[1].dataout[125] top.gearbox_up_dc_tb[1].dataout[124] top.gearbox_up_dc_tb[1].dataout[123] top.gearbox_up_dc_tb[1].dataout[122] top.gearbox_up_dc_tb[1].dataout[121] top.gearbox_up_dc_tb[1].dataout[120] top.gearbox_up_dc_tb[1].dataout[119] top.gearbox_up_dc_tb[1].dataout[118] top.gearbox_up_dc_tb[1].dataout[117] top.gearbox_up_dc_tb[1].dataout[116] top.gearbox_up_dc_tb[1].dataout[115] top.gearbox_up_dc_tb[1].dataout[114] top.gearbox_up_dc_tb[1].dataout[113] top.gearbox_up_dc_tb[1].dataout[112] top.gearbox_up_dc_tb[1].dataout[111] top.gearbox_up_dc_tb[1].dataout[110] top.gearbox_up_dc_tb[1].dataout[109] top.gearbox_up_dc_tb[1].dataout[108] top.gearbox_up_dc_tb[1].dataout[107] top.gearbox_up_dc_tb[1].dataout[106] top.gearbox_up_dc_tb[1].dataout[105] top.gearbox_up_dc_tb[1].dataout[104] top.gearbox_up_dc_tb[1].dataout[103] top.gearbox_up_dc_tb[1].dataout[102] top.gearbox_up_dc_tb[1].dataout[101] top.gearbox_up_dc_tb[1].dataout[100] top.gearbox_up_dc_tb[1].dataout[99] top.gearbox_up_dc_tb[1].dataout[98] top.gearbox_up_dc_tb[1].dataout[97] top.gearbox_up_dc_tb[1].dataout[96] top.gearbox_up_dc_tb[1].dataout[95] top.gearbox_up_dc_tb[1].dataout[94] top.gearbox_up_dc_tb[1].dataout[93] top.gearbox_up_dc_tb[1].dataout[92] top.gearbox_up_dc_tb[1].dataout[91] top.gearbox_up_dc_tb[1].dataout[90] top.gearbox_up_dc_tb[1].dataout[89] top.gearbox_up_dc_tb[1].dataout[88] top.gearbox_up_dc_tb[1].dataout[87] top.gearbox_up_dc_tb[1].dataout[86] top.gearbox_up_dc_tb[1].dataout[85] top.gearbox_up_dc_tb[1].dataout[84] top.gearbox_up_dc_tb[1].dataout[83] top.gearbox_up_dc_tb[1].dataout[82] top.gearbox_up_dc_tb[1].dataout[81] top.gearbox_up_dc_tb[1].dataout[80] top.gearbox_up_dc_tb[1].dataout[79] top.gearbox_up_dc_tb[1].dataout[78] top.gearbox_up_dc_tb[1].dataout[77] top.gearbox_up_dc_tb[1].dataout[76] top.gearbox_up_dc_tb[1].dataout[75] top.gearbox_up_dc_tb[1].dataout[74] top.gearbox_up_dc_tb[1].dataout[73] top.gearbox_up_dc_tb[1].dataout[72] top.gearbox_up_dc_tb[1].dataout[71] top.gearbox_up_dc_tb[1].dataout[70] top.gearbox_up_dc_tb[1].dataout[69] top.gearbox_up_dc_tb[1].dataout[68] top.gearbox_up_dc_tb[1].dataout[67] top.gearbox_up_dc_tb[1].dataout[66] top.gearbox_up_dc_tb[1].dataout[65] top.gearbox_up_dc_tb[1].dataout[64] top.gearbox_up_dc_tb[1].dataout[63] top.gearbox_up_dc_tb[1].dataout[62] top.gearbox_up_dc_tb[1].dataout[61] top.gearbox_up_dc_tb[1].dataout[60] top.gearbox_up_dc_tb[1].dataout[59] top.gearbox_up_dc_tb[1].dataout[58] top.gearbox_up_dc_tb[1].dataout[57] top.gearbox_up_dc_tb[1].dataout[56] top.gearbox_up_dc_tb[1].dataout[55] top.gearbox_up_dc_tb[1].dataout[54] top.gearbox_up_dc_tb[1].dataout[53] top.gearbox_up_dc_tb[1].dataout[52] top.gearbox_up_dc_tb[1].dataout[51] top.gearbox_up_dc_tb[1].dataout[50] top.gearbox_up_dc_tb[1].dataout[49] top.gearbox_up_dc_tb[1].dataout[48] top.gearbox_up_dc_tb[1].dataout[47] top.gearbox_up_dc_tb[1].dataout[46] top.gearbox_up_dc_tb[1].dataout[45] top.gearbox_up_dc_tb[1].dataout[44] top.gearbox_up_dc_tb[1].dataout[43] top.gearbox_up_dc_tb[1].dataout[42] top.gearbox_up_dc_tb[1].dataout[41] top.gearbox_up_dc_tb[1].dataout[40] top.gearbox_up_dc_tb[1].dataout[39] top.gearbox_up_dc_tb[1].dataout[38] top.gearbox_up_dc_tb[1].dataout[37] top.gearbox_up_dc_tb[1].dataout[36] top.gearbox_up_dc_tb[1].dataout[35] top.gearbox_up_dc_tb[1].dataout[34] top.gearbox_up_dc_tb[1].dataout[33] top.gearbox_up_dc_tb[1].dataout[32] top.gearbox_up_dc_tb[1].dataout[31] top.gearbox_up_dc_tb[1].dataout[30] top.gearbox_up_dc_tb[1].dataout[29] top.gearbox_up_dc_tb[1].dataout[28] top.gearbox_up_dc_tb[1].dataout[27] top.gearbox_up_dc_tb[1].dataout[26] top.gearbox_up_dc_tb[1].dataout[25] top.gearbox_up_dc_tb[1].dataout[24] top.gearbox_up_dc_tb[1].dataout[23] top.gearbox_up_dc_tb[1].dataout[22] top.gearbox_up_dc_tb[1].dataout[21] top.gearbox_up_dc_tb[1].dataout[20] top.gearbox_up_dc_tb[1].dataout[19] top.gearbox_up_dc_tb[1].dataout[18] top.gearbox_up_dc_tb[1].dataout[17] top.gearbox_up_dc_tb[1].dataout[16] top.gearbox_up_dc_tb[1].dataout[15] top.gearbox_up_dc_tb[1].dataout[14] top.gearbox_up_dc_tb[1].dataout[13] top.gearbox_up_dc_tb[1].dataout[12] top.gearbox_up_dc_tb[1].dataout[11] top.gearbox_up_dc_tb[1].dataout[10] top.gearbox_up_dc_tb[1].dataout[9] top.gearbox_up_dc_tb[1].dataout[8] top.gearbox_up_dc_tb[1].dataout[7] top.gearbox_up_dc_tb[1].dataout[6] top.gearbox_up_dc_tb[1].dataout[5] top.gearbox_up_dc_tb[1].dataout[4] top.gearbox_up_dc_tb[1].dataout[3] top.gearbox_up_dc_tb[1].dataout[2] top.gearbox_up_dc_tb[1].dataout[1] top.gearbox_up_dc_tb[1].dataout[0] -@1000200 --Example 1 (8->128) -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/misc/gearbox/gearbox_up_dc_tb.wdo b/sim/misc/gearbox/gearbox_up_dc_tb.wdo deleted file mode 100644 index cbd81ad49..000000000 --- a/sim/misc/gearbox/gearbox_up_dc_tb.wdo +++ /dev/null @@ -1,32 +0,0 @@ -onerror {resume} -quietly WaveActivateNextPane {} 0 -add wave -noupdate -expand -group {Example 1 (8 -> 32)} /gearbox_up_dc_tb/genInstances(0)/Valid -add wave -noupdate -expand -group {Example 1 (8 -> 32)} -radix hexadecimal -radixshowbase 0 /gearbox_up_dc_tb/genInstances(0)/DataOut -add wave -noupdate -expand -group {Example 1 (8 -> 32)} -radix hexadecimal -radixshowbase 0 /gearbox_up_dc_tb/genInstances(0)/DataIn -add wave -noupdate -expand -group {Example 1 (8 -> 32)} /gearbox_up_dc_tb/genInstances(0)/Clock2 -add wave -noupdate -expand -group {Example 1 (8 -> 32)} /gearbox_up_dc_tb/genInstances(0)/Clock1 -add wave -noupdate -expand -group {Example 1 (8 -> 32)} /gearbox_up_dc_tb/genInstances(0)/Align -add wave -noupdate -expand -group {Example 2 (8 -> 128)} /gearbox_up_dc_tb/genInstances(1)/Valid -add wave -noupdate -expand -group {Example 2 (8 -> 128)} -radix hexadecimal -radixshowbase 0 /gearbox_up_dc_tb/genInstances(1)/DataOut -add wave -noupdate -expand -group {Example 2 (8 -> 128)} -radix hexadecimal -radixshowbase 0 /gearbox_up_dc_tb/genInstances(1)/DataIn -add wave -noupdate -expand -group {Example 2 (8 -> 128)} /gearbox_up_dc_tb/genInstances(1)/Clock2 -add wave -noupdate -expand -group {Example 2 (8 -> 128)} /gearbox_up_dc_tb/genInstances(1)/Clock1 -add wave -noupdate -expand -group {Example 2 (8 -> 128)} /gearbox_up_dc_tb/genInstances(1)/Align -TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 1} {3145142857 fs} 0} -quietly wave cursor active 1 -configure wave -namecolwidth 223 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 -configure wave -gridoffset 0 -configure wave -gridperiod 1 -configure wave -griddelta 40 -configure wave -timeline 0 -configure wave -timelineunits ns -update -WaveRestoreZoom {0 fs} {10752 ns} diff --git a/sim/misc/stat/stat_Maximum_tb.ghdl b/sim/misc/stat/stat_Maximum_tb.ghdl deleted file mode 100644 index 4bbdf0d9b..000000000 --- a/sim/misc/stat/stat_Maximum_tb.ghdl +++ /dev/null @@ -1,28 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/stat_maximum_tb/clock -/stat_maximum_tb/reset -/stat_maximum_tb/enable -/stat_maximum_tb/datain -/stat_maximum_tb/valids -/stat_maximum_tb/maximums -/stat_maximum_tb/counts -/stat_maximum_tb/maximums_slvv -/stat_maximum_tb/counts_slvv -/stat_maximum_tb/uut/clock -/stat_maximum_tb/uut/reset -/stat_maximum_tb/uut/enable -/stat_maximum_tb/uut/datain -/stat_maximum_tb/uut/valids -/stat_maximum_tb/uut/maximums -/stat_maximum_tb/uut/counts -/stat_maximum_tb/uut/datain_us -/stat_maximum_tb/uut/taghit -/stat_maximum_tb/uut/maximumhit -/stat_maximum_tb/uut/tagmemory -/stat_maximum_tb/uut/countermemory -/stat_maximum_tb/uut/maximumindex -/stat_maximum_tb/uut/validmemory diff --git a/sim/misc/stat/stat_Maximum_tb.gtkw b/sim/misc/stat/stat_Maximum_tb.gtkw deleted file mode 100644 index d6290d66e..000000000 --- a/sim/misc/stat/stat_Maximum_tb.gtkw +++ /dev/null @@ -1,44 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.69 (w)1999-2016 BSI -[*] Sun May 08 14:44:12 2016 -[*] -[dumpfile_mtime] "Sun May 08 14:40:20 2016" -[dumpfile_size] 22583 -[timestart] 0 -[size] 1680 997 -[pos] -1 -1 -*-24.348576 -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 -[treeopen] top. -[treeopen] top.stat_maximum_tb. -[treeopen] top.stat_maximum_tb.maximums_slvv. -[sst_width] 197 -[signals_width] 242 -[sst_expanded] 1 -[sst_vpaned_height] 293 -@28 -top.stat_maximum_tb.clock -top.stat_maximum_tb.reset -top.stat_maximum_tb.enable -@24 -#{top.stat_maximum_tb.datain[7:0]} top.stat_maximum_tb.datain[7] top.stat_maximum_tb.datain[6] top.stat_maximum_tb.datain[5] top.stat_maximum_tb.datain[4] top.stat_maximum_tb.datain[3] top.stat_maximum_tb.datain[2] top.stat_maximum_tb.datain[1] top.stat_maximum_tb.datain[0] -@29 -#{top.stat_maximum_tb.valids[7:0]} top.stat_maximum_tb.valids[7] top.stat_maximum_tb.valids[6] top.stat_maximum_tb.valids[5] top.stat_maximum_tb.valids[4] top.stat_maximum_tb.valids[3] top.stat_maximum_tb.valids[2] top.stat_maximum_tb.valids[1] top.stat_maximum_tb.valids[0] -@24 -#{top.stat_maximum_tb.maximums_slvv[0][7:0]} top.stat_maximum_tb.maximums_slvv[0][7] top.stat_maximum_tb.maximums_slvv[0][6] top.stat_maximum_tb.maximums_slvv[0][5] top.stat_maximum_tb.maximums_slvv[0][4] top.stat_maximum_tb.maximums_slvv[0][3] top.stat_maximum_tb.maximums_slvv[0][2] top.stat_maximum_tb.maximums_slvv[0][1] top.stat_maximum_tb.maximums_slvv[0][0] -#{top.stat_maximum_tb.counts_slvv[0][3:0]} top.stat_maximum_tb.counts_slvv[0][3] top.stat_maximum_tb.counts_slvv[0][2] top.stat_maximum_tb.counts_slvv[0][1] top.stat_maximum_tb.counts_slvv[0][0] -#{top.stat_maximum_tb.maximums_slvv[1][7:0]} top.stat_maximum_tb.maximums_slvv[1][7] top.stat_maximum_tb.maximums_slvv[1][6] top.stat_maximum_tb.maximums_slvv[1][5] top.stat_maximum_tb.maximums_slvv[1][4] top.stat_maximum_tb.maximums_slvv[1][3] top.stat_maximum_tb.maximums_slvv[1][2] top.stat_maximum_tb.maximums_slvv[1][1] top.stat_maximum_tb.maximums_slvv[1][0] -#{top.stat_maximum_tb.counts_slvv[1][3:0]} top.stat_maximum_tb.counts_slvv[1][3] top.stat_maximum_tb.counts_slvv[1][2] top.stat_maximum_tb.counts_slvv[1][1] top.stat_maximum_tb.counts_slvv[1][0] -#{top.stat_maximum_tb.maximums_slvv[2][7:0]} top.stat_maximum_tb.maximums_slvv[2][7] top.stat_maximum_tb.maximums_slvv[2][6] top.stat_maximum_tb.maximums_slvv[2][5] top.stat_maximum_tb.maximums_slvv[2][4] top.stat_maximum_tb.maximums_slvv[2][3] top.stat_maximum_tb.maximums_slvv[2][2] top.stat_maximum_tb.maximums_slvv[2][1] top.stat_maximum_tb.maximums_slvv[2][0] -#{top.stat_maximum_tb.counts_slvv[2][3:0]} top.stat_maximum_tb.counts_slvv[2][3] top.stat_maximum_tb.counts_slvv[2][2] top.stat_maximum_tb.counts_slvv[2][1] top.stat_maximum_tb.counts_slvv[2][0] -#{top.stat_maximum_tb.maximums_slvv[3][7:0]} top.stat_maximum_tb.maximums_slvv[3][7] top.stat_maximum_tb.maximums_slvv[3][6] top.stat_maximum_tb.maximums_slvv[3][5] top.stat_maximum_tb.maximums_slvv[3][4] top.stat_maximum_tb.maximums_slvv[3][3] top.stat_maximum_tb.maximums_slvv[3][2] top.stat_maximum_tb.maximums_slvv[3][1] top.stat_maximum_tb.maximums_slvv[3][0] -#{top.stat_maximum_tb.counts_slvv[3][3:0]} top.stat_maximum_tb.counts_slvv[3][3] top.stat_maximum_tb.counts_slvv[3][2] top.stat_maximum_tb.counts_slvv[3][1] top.stat_maximum_tb.counts_slvv[3][0] -#{top.stat_maximum_tb.maximums_slvv[4][7:0]} top.stat_maximum_tb.maximums_slvv[4][7] top.stat_maximum_tb.maximums_slvv[4][6] top.stat_maximum_tb.maximums_slvv[4][5] top.stat_maximum_tb.maximums_slvv[4][4] top.stat_maximum_tb.maximums_slvv[4][3] top.stat_maximum_tb.maximums_slvv[4][2] top.stat_maximum_tb.maximums_slvv[4][1] top.stat_maximum_tb.maximums_slvv[4][0] -#{top.stat_maximum_tb.counts_slvv[4][3:0]} top.stat_maximum_tb.counts_slvv[4][3] top.stat_maximum_tb.counts_slvv[4][2] top.stat_maximum_tb.counts_slvv[4][1] top.stat_maximum_tb.counts_slvv[4][0] -#{top.stat_maximum_tb.maximums_slvv[5][7:0]} top.stat_maximum_tb.maximums_slvv[5][7] top.stat_maximum_tb.maximums_slvv[5][6] top.stat_maximum_tb.maximums_slvv[5][5] top.stat_maximum_tb.maximums_slvv[5][4] top.stat_maximum_tb.maximums_slvv[5][3] top.stat_maximum_tb.maximums_slvv[5][2] top.stat_maximum_tb.maximums_slvv[5][1] top.stat_maximum_tb.maximums_slvv[5][0] -#{top.stat_maximum_tb.counts_slvv[5][3:0]} top.stat_maximum_tb.counts_slvv[5][3] top.stat_maximum_tb.counts_slvv[5][2] top.stat_maximum_tb.counts_slvv[5][1] top.stat_maximum_tb.counts_slvv[5][0] -#{top.stat_maximum_tb.maximums_slvv[6][7:0]} top.stat_maximum_tb.maximums_slvv[6][7] top.stat_maximum_tb.maximums_slvv[6][6] top.stat_maximum_tb.maximums_slvv[6][5] top.stat_maximum_tb.maximums_slvv[6][4] top.stat_maximum_tb.maximums_slvv[6][3] top.stat_maximum_tb.maximums_slvv[6][2] top.stat_maximum_tb.maximums_slvv[6][1] top.stat_maximum_tb.maximums_slvv[6][0] -#{top.stat_maximum_tb.counts_slvv[6][3:0]} top.stat_maximum_tb.counts_slvv[6][3] top.stat_maximum_tb.counts_slvv[6][2] top.stat_maximum_tb.counts_slvv[6][1] top.stat_maximum_tb.counts_slvv[6][0] -#{top.stat_maximum_tb.maximums_slvv[7][7:0]} top.stat_maximum_tb.maximums_slvv[7][7] top.stat_maximum_tb.maximums_slvv[7][6] top.stat_maximum_tb.maximums_slvv[7][5] top.stat_maximum_tb.maximums_slvv[7][4] top.stat_maximum_tb.maximums_slvv[7][3] top.stat_maximum_tb.maximums_slvv[7][2] top.stat_maximum_tb.maximums_slvv[7][1] top.stat_maximum_tb.maximums_slvv[7][0] -#{top.stat_maximum_tb.counts_slvv[7][3:0]} top.stat_maximum_tb.counts_slvv[7][3] top.stat_maximum_tb.counts_slvv[7][2] top.stat_maximum_tb.counts_slvv[7][1] top.stat_maximum_tb.counts_slvv[7][0] -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/misc/stat/stat_Maximum_tb.wcfg b/sim/misc/stat/stat_Maximum_tb.wcfg deleted file mode 100644 index 3ebfa7338..000000000 --- a/sim/misc/stat/stat_Maximum_tb.wcfg +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - clock - clock - - - reset - reset - - - enable - enable - - - datain[7:0] - datain[7:0] - UNSIGNEDDECRADIX - - - valids[7:0] - valids[7:0] - - - maximums[7:0,7:0] - maximums[7:0,7:0] - UNSIGNEDDECRADIX - - [7,7:0] - maximums[7,7:0] - UNSIGNEDDECRADIX - - - [6,7:0] - maximums[6,7:0] - UNSIGNEDDECRADIX - - - [5,7:0] - maximums[5,7:0] - UNSIGNEDDECRADIX - - - [4,7:0] - maximums[4,7:0] - UNSIGNEDDECRADIX - - - [3,7:0] - maximums[3,7:0] - UNSIGNEDDECRADIX - - - [2,7:0] - maximums[2,7:0] - UNSIGNEDDECRADIX - - - [1,7:0] - maximums[1,7:0] - UNSIGNEDDECRADIX - - - [0,7:0] - maximums[0,7:0] - UNSIGNEDDECRADIX - - - - counts[7:0,3:0] - counts[7:0,3:0] - UNSIGNEDDECRADIX - - [7,3:0] - counts[7,3:0] - UNSIGNEDDECRADIX - - - [6,3:0] - counts[6,3:0] - UNSIGNEDDECRADIX - - - [5,3:0] - counts[5,3:0] - UNSIGNEDDECRADIX - - - [4,3:0] - counts[4,3:0] - UNSIGNEDDECRADIX - - - [3,3:0] - counts[3,3:0] - UNSIGNEDDECRADIX - - - [2,3:0] - counts[2,3:0] - UNSIGNEDDECRADIX - - - [1,3:0] - counts[1,3:0] - UNSIGNEDDECRADIX - - - [0,3:0] - counts[0,3:0] - UNSIGNEDDECRADIX - - - - good - good - - diff --git a/sim/misc/stat/stat_Minimum_tb.ghdl b/sim/misc/stat/stat_Minimum_tb.ghdl deleted file mode 100644 index ad298842b..000000000 --- a/sim/misc/stat/stat_Minimum_tb.ghdl +++ /dev/null @@ -1,28 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/stat_minimum_tb/clock -/stat_minimum_tb/reset -/stat_minimum_tb/enable -/stat_minimum_tb/datain -/stat_minimum_tb/valids -/stat_minimum_tb/minimums -/stat_minimum_tb/counts -/stat_minimum_tb/minimums_slvv -/stat_minimum_tb/counts_slvv -/stat_minimum_tb/uut/clock -/stat_minimum_tb/uut/reset -/stat_minimum_tb/uut/enable -/stat_minimum_tb/uut/datain -/stat_minimum_tb/uut/valids -/stat_minimum_tb/uut/minimums -/stat_minimum_tb/uut/counts -/stat_minimum_tb/uut/datain_us -/stat_minimum_tb/uut/taghit -/stat_minimum_tb/uut/minimumhit -/stat_minimum_tb/uut/tagmemory -/stat_minimum_tb/uut/countermemory -/stat_minimum_tb/uut/minimumindex -/stat_minimum_tb/uut/validmemory diff --git a/sim/misc/stat/stat_Minimum_tb.gtkw b/sim/misc/stat/stat_Minimum_tb.gtkw deleted file mode 100644 index cb356c7d4..000000000 --- a/sim/misc/stat/stat_Minimum_tb.gtkw +++ /dev/null @@ -1,65 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.69 (w)1999-2016 BSI -[*] Sun May 08 14:43:09 2016 -[*] -[dumpfile_mtime] "Sun May 08 14:42:08 2016" -[dumpfile_size] 21992 -[timestart] 0 -[size] 1680 997 -[pos] -1 -1 -*-24.296152 -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 -[treeopen] top. -[treeopen] top.stat_minimum_tb. -[treeopen] top.stat_minimum_tb.minimums_slvv. -[sst_width] 197 -[signals_width] 198 -[sst_expanded] 1 -[sst_vpaned_height] 293 -@28 -top.stat_minimum_tb.clock -top.stat_minimum_tb.reset -top.stat_minimum_tb.enable -@24 -#{top.stat_minimum_tb.datain[7:0]} top.stat_minimum_tb.datain[7] top.stat_minimum_tb.datain[6] top.stat_minimum_tb.datain[5] top.stat_minimum_tb.datain[4] top.stat_minimum_tb.datain[3] top.stat_minimum_tb.datain[2] top.stat_minimum_tb.datain[1] top.stat_minimum_tb.datain[0] -@29 -#{top.stat_minimum_tb.valids[7:0]} top.stat_minimum_tb.valids[7] top.stat_minimum_tb.valids[6] top.stat_minimum_tb.valids[5] top.stat_minimum_tb.valids[4] top.stat_minimum_tb.valids[3] top.stat_minimum_tb.valids[2] top.stat_minimum_tb.valids[1] top.stat_minimum_tb.valids[0] -@24 -#{top.stat_minimum_tb.minimums_slvv[0][7:0]} top.stat_minimum_tb.minimums_slvv[0][7] top.stat_minimum_tb.minimums_slvv[0][6] top.stat_minimum_tb.minimums_slvv[0][5] top.stat_minimum_tb.minimums_slvv[0][4] top.stat_minimum_tb.minimums_slvv[0][3] top.stat_minimum_tb.minimums_slvv[0][2] top.stat_minimum_tb.minimums_slvv[0][1] top.stat_minimum_tb.minimums_slvv[0][0] -#{top.stat_minimum_tb.counts_slvv[0][3:0]} top.stat_minimum_tb.counts_slvv[0][3] top.stat_minimum_tb.counts_slvv[0][2] top.stat_minimum_tb.counts_slvv[0][1] top.stat_minimum_tb.counts_slvv[0][0] -#{top.stat_minimum_tb.minimums_slvv[1][7:0]} top.stat_minimum_tb.minimums_slvv[1][7] top.stat_minimum_tb.minimums_slvv[1][6] top.stat_minimum_tb.minimums_slvv[1][5] top.stat_minimum_tb.minimums_slvv[1][4] top.stat_minimum_tb.minimums_slvv[1][3] top.stat_minimum_tb.minimums_slvv[1][2] top.stat_minimum_tb.minimums_slvv[1][1] top.stat_minimum_tb.minimums_slvv[1][0] -#{top.stat_minimum_tb.counts_slvv[1][3:0]} top.stat_minimum_tb.counts_slvv[1][3] top.stat_minimum_tb.counts_slvv[1][2] top.stat_minimum_tb.counts_slvv[1][1] top.stat_minimum_tb.counts_slvv[1][0] -#{top.stat_minimum_tb.minimums_slvv[2][7:0]} top.stat_minimum_tb.minimums_slvv[2][7] top.stat_minimum_tb.minimums_slvv[2][6] top.stat_minimum_tb.minimums_slvv[2][5] top.stat_minimum_tb.minimums_slvv[2][4] top.stat_minimum_tb.minimums_slvv[2][3] top.stat_minimum_tb.minimums_slvv[2][2] top.stat_minimum_tb.minimums_slvv[2][1] top.stat_minimum_tb.minimums_slvv[2][0] -#{top.stat_minimum_tb.counts_slvv[2][3:0]} top.stat_minimum_tb.counts_slvv[2][3] top.stat_minimum_tb.counts_slvv[2][2] top.stat_minimum_tb.counts_slvv[2][1] top.stat_minimum_tb.counts_slvv[2][0] -#{top.stat_minimum_tb.minimums_slvv[3][7:0]} top.stat_minimum_tb.minimums_slvv[3][7] top.stat_minimum_tb.minimums_slvv[3][6] top.stat_minimum_tb.minimums_slvv[3][5] top.stat_minimum_tb.minimums_slvv[3][4] top.stat_minimum_tb.minimums_slvv[3][3] top.stat_minimum_tb.minimums_slvv[3][2] top.stat_minimum_tb.minimums_slvv[3][1] top.stat_minimum_tb.minimums_slvv[3][0] -#{top.stat_minimum_tb.counts_slvv[3][3:0]} top.stat_minimum_tb.counts_slvv[3][3] top.stat_minimum_tb.counts_slvv[3][2] top.stat_minimum_tb.counts_slvv[3][1] top.stat_minimum_tb.counts_slvv[3][0] -#{top.stat_minimum_tb.minimums_slvv[4][7:0]} top.stat_minimum_tb.minimums_slvv[4][7] top.stat_minimum_tb.minimums_slvv[4][6] top.stat_minimum_tb.minimums_slvv[4][5] top.stat_minimum_tb.minimums_slvv[4][4] top.stat_minimum_tb.minimums_slvv[4][3] top.stat_minimum_tb.minimums_slvv[4][2] top.stat_minimum_tb.minimums_slvv[4][1] top.stat_minimum_tb.minimums_slvv[4][0] -@c00024 -#{top.stat_minimum_tb.counts_slvv[4][3:0]} top.stat_minimum_tb.counts_slvv[4][3] top.stat_minimum_tb.counts_slvv[4][2] top.stat_minimum_tb.counts_slvv[4][1] top.stat_minimum_tb.counts_slvv[4][0] -@28 -top.stat_minimum_tb.counts_slvv[4][3] -top.stat_minimum_tb.counts_slvv[4][2] -top.stat_minimum_tb.counts_slvv[4][1] -top.stat_minimum_tb.counts_slvv[4][0] -@1401204 --group_end -@c00024 -#{top.stat_minimum_tb.minimums_slvv[5][7:0]} top.stat_minimum_tb.minimums_slvv[5][7] top.stat_minimum_tb.minimums_slvv[5][6] top.stat_minimum_tb.minimums_slvv[5][5] top.stat_minimum_tb.minimums_slvv[5][4] top.stat_minimum_tb.minimums_slvv[5][3] top.stat_minimum_tb.minimums_slvv[5][2] top.stat_minimum_tb.minimums_slvv[5][1] top.stat_minimum_tb.minimums_slvv[5][0] -@28 -top.stat_minimum_tb.minimums_slvv[5][7] -top.stat_minimum_tb.minimums_slvv[5][6] -top.stat_minimum_tb.minimums_slvv[5][5] -top.stat_minimum_tb.minimums_slvv[5][4] -top.stat_minimum_tb.minimums_slvv[5][3] -top.stat_minimum_tb.minimums_slvv[5][2] -top.stat_minimum_tb.minimums_slvv[5][1] -top.stat_minimum_tb.minimums_slvv[5][0] -@1401204 --group_end -@24 -#{top.stat_minimum_tb.counts_slvv[5][3:0]} top.stat_minimum_tb.counts_slvv[5][3] top.stat_minimum_tb.counts_slvv[5][2] top.stat_minimum_tb.counts_slvv[5][1] top.stat_minimum_tb.counts_slvv[5][0] -#{top.stat_minimum_tb.minimums_slvv[6][7:0]} top.stat_minimum_tb.minimums_slvv[6][7] top.stat_minimum_tb.minimums_slvv[6][6] top.stat_minimum_tb.minimums_slvv[6][5] top.stat_minimum_tb.minimums_slvv[6][4] top.stat_minimum_tb.minimums_slvv[6][3] top.stat_minimum_tb.minimums_slvv[6][2] top.stat_minimum_tb.minimums_slvv[6][1] top.stat_minimum_tb.minimums_slvv[6][0] -#{top.stat_minimum_tb.counts_slvv[6][3:0]} top.stat_minimum_tb.counts_slvv[6][3] top.stat_minimum_tb.counts_slvv[6][2] top.stat_minimum_tb.counts_slvv[6][1] top.stat_minimum_tb.counts_slvv[6][0] -#{top.stat_minimum_tb.minimums_slvv[7][7:0]} top.stat_minimum_tb.minimums_slvv[7][7] top.stat_minimum_tb.minimums_slvv[7][6] top.stat_minimum_tb.minimums_slvv[7][5] top.stat_minimum_tb.minimums_slvv[7][4] top.stat_minimum_tb.minimums_slvv[7][3] top.stat_minimum_tb.minimums_slvv[7][2] top.stat_minimum_tb.minimums_slvv[7][1] top.stat_minimum_tb.minimums_slvv[7][0] -#{top.stat_minimum_tb.counts_slvv[7][3:0]} top.stat_minimum_tb.counts_slvv[7][3] top.stat_minimum_tb.counts_slvv[7][2] top.stat_minimum_tb.counts_slvv[7][1] top.stat_minimum_tb.counts_slvv[7][0] -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/misc/stat/stat_Minimum_tb.wcfg b/sim/misc/stat/stat_Minimum_tb.wcfg deleted file mode 100644 index e42f7b697..000000000 --- a/sim/misc/stat/stat_Minimum_tb.wcfg +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - clock - clock - - - reset - reset - - - enable - enable - - - datain[7:0] - datain[7:0] - UNSIGNEDDECRADIX - - - valids[7:0] - valids[7:0] - - - minimums[7:0,7:0] - minimums[7:0,7:0] - UNSIGNEDDECRADIX - - [7,7:0] - minimums[7,7:0] - UNSIGNEDDECRADIX - - - [6,7:0] - minimums[6,7:0] - UNSIGNEDDECRADIX - - - [5,7:0] - minimums[5,7:0] - UNSIGNEDDECRADIX - - - [4,7:0] - minimums[4,7:0] - UNSIGNEDDECRADIX - - - [3,7:0] - minimums[3,7:0] - UNSIGNEDDECRADIX - - - [2,7:0] - minimums[2,7:0] - UNSIGNEDDECRADIX - - - [1,7:0] - minimums[1,7:0] - UNSIGNEDDECRADIX - - - [0,7:0] - minimums[0,7:0] - UNSIGNEDDECRADIX - - - - counts[7:0,3:0] - counts[7:0,3:0] - UNSIGNEDDECRADIX - - [7,3:0] - counts[7,3:0] - UNSIGNEDDECRADIX - - - [6,3:0] - counts[6,3:0] - UNSIGNEDDECRADIX - - - [5,3:0] - counts[5,3:0] - UNSIGNEDDECRADIX - - - [4,3:0] - counts[4,3:0] - UNSIGNEDDECRADIX - - - [3,3:0] - counts[3,3:0] - UNSIGNEDDECRADIX - - - [2,3:0] - counts[2,3:0] - UNSIGNEDDECRADIX - - - [1,3:0] - counts[1,3:0] - UNSIGNEDDECRADIX - - - [0,3:0] - counts[0,3:0] - UNSIGNEDDECRADIX - - - - good - good - - diff --git a/sim/misc/sync/sync_Bits_tb.ghdl b/sim/misc/sync/sync_Bits_tb.ghdl deleted file mode 100644 index 74480e8ab..000000000 --- a/sim/misc/sync/sync_Bits_tb.ghdl +++ /dev/null @@ -1,9 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/sync_bits_tb/clock1 -/sync_bits_tb/clock2 -/sync_bits_tb/sync_in -/sync_bits_tb/sync_out diff --git a/sim/misc/sync/sync_Bits_tb.gtkw b/sim/misc/sync/sync_Bits_tb.gtkw deleted file mode 100644 index f4f4106e1..000000000 --- a/sim/misc/sync/sync_Bits_tb.gtkw +++ /dev/null @@ -1,23 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.69 (w)1999-2016 BSI -[*] Sun Mar 20 14:12:41 2016 -[*] -[dumpfile_mtime] "Sun Mar 20 14:12:23 2016" -[dumpfile_size] 2602 -[timestart] 0 -[size] 1680 997 -[pos] -1 -1 -*-26.329563 85600000 -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 -[treeopen] top. -[treeopen] top.sync_bits_tb. -[sst_width] 197 -[signals_width] 155 -[sst_expanded] 1 -[sst_vpaned_height] 293 -@28 -top.sync_bits_tb.clock1 -top.sync_bits_tb.clock2 -top.sync_bits_tb.sync_in[0] -top.sync_bits_tb.sync_out[0] -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/misc/sync/sync_Command_tb.ghdl b/sim/misc/sync/sync_Command_tb.ghdl deleted file mode 100644 index 8710ed198..000000000 --- a/sim/misc/sync/sync_Command_tb.ghdl +++ /dev/null @@ -1,11 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/sync_command_tb/clock1 -/sync_command_tb/clock2 -/sync_command_tb/sync_in -/sync_command_tb/sync_out -/sync_command_tb/sync_busy -/sync_command_tb/sync_changed diff --git a/sim/misc/sync/sync_Command_tb.gtkw b/sim/misc/sync/sync_Command_tb.gtkw deleted file mode 100644 index d0bc9fb30..000000000 --- a/sim/misc/sync/sync_Command_tb.gtkw +++ /dev/null @@ -1,25 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.61 (w)1999-2014 BSI -[*] Mon Feb 08 14:49:54 2016 -[*] -[dumpfile_mtime] "Mon Feb 08 14:49:00 2016" -[dumpfile_size] 3330 -[timestart] 0 -[size] 1680 997 -[pos] -243 -243 -*-26.165150 -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 -[treeopen] top. -[treeopen] top.sync_command_tb. -[sst_width] 197 -[signals_width] 134 -[sst_expanded] 1 -[sst_vpaned_height] 293 -@28 -top.sync_command_tb.clock1 -top.sync_command_tb.clock2 -top.sync_command_tb.sync_busy -#{top.sync_command_tb.sync_in[1:0]} top.sync_command_tb.sync_in[1] top.sync_command_tb.sync_in[0] -#{top.sync_command_tb.sync_out[1:0]} top.sync_command_tb.sync_out[1] top.sync_command_tb.sync_out[0] -top.sync_command_tb.sync_changed -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/misc/sync/sync_Command_tb.wcfg b/sim/misc/sync/sync_Command_tb.wcfg deleted file mode 100644 index 8f813372f..000000000 --- a/sim/misc/sync/sync_Command_tb.wcfg +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - label - clock1 - clock1 - clock1 - - - clock2 - clock2 - - - Synchronize a command signal - label - #808000 - 230 230 230 - - - Sync Command - label - - input[1:0] - input[1:0] - - - busy - busy - - - XClock - label - #008080 - 230 230 230 - - - output[1:0] - output[1:0] - - - changed - changed - - - Internal - label - - iscommand_clk1 - iscommand_clk1 - - - d0 - d0 - - - d1[1:0] - d1[1:0] - - - t2 - t2 - - - d3 - d3 - - - d4 - d4 - - - d5[1:0] - d5[1:0] - - - - diff --git a/sim/misc/sync/sync_Reset_tb.ghdl b/sim/misc/sync/sync_Reset_tb.ghdl deleted file mode 100644 index 6f5ab50b5..000000000 --- a/sim/misc/sync/sync_Reset_tb.ghdl +++ /dev/null @@ -1,9 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/sync_reset_tb/clock1 -/sync_reset_tb/clock2 -/sync_reset_tb/sync_in -/sync_reset_tb/sync_out diff --git a/sim/misc/sync/sync_Reset_tb.gtkw b/sim/misc/sync/sync_Reset_tb.gtkw deleted file mode 100644 index 4e3fd8356..000000000 --- a/sim/misc/sync/sync_Reset_tb.gtkw +++ /dev/null @@ -1,25 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.61 (w)1999-2014 BSI -[*] Mon Feb 08 14:40:50 2016 -[*] -[dumpfile_mtime] "Mon Feb 08 14:39:23 2016" -[dumpfile_size] 2407 -[timestart] 0 -[size] 1680 997 -[pos] -61 -61 -*-26.154070 -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 -[treeopen] top. -[treeopen] top.sync_reset_tb. -[sst_width] 197 -[signals_width] 124 -[sst_expanded] 1 -[sst_vpaned_height] 293 -@28 -top.sync_reset_tb.clock1 -top.sync_reset_tb.clock2 -@29 -top.sync_reset_tb.sync_in -@28 -top.sync_reset_tb.sync_out -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/misc/sync/sync_Reset_tb.wcfg b/sim/misc/sync/sync_Reset_tb.wcfg deleted file mode 100644 index ee8b3cd2f..000000000 --- a/sim/misc/sync/sync_Reset_tb.wcfg +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - label - clock1 - clock1 - clock1 - - - clock2 - clock2 - - - Synchronize a reset signal - label - #808000 - 230 230 230 - - - Sync Reset - label - - input - input - - - XClock - label - #008080 - 230 230 230 - - - output - output - - - Internal - label - - gen[0].Sync - label - - reset_async - reset_async - - - reset_meta - reset_meta - - - reset_sync - reset_sync - - - - - diff --git a/sim/misc/sync/sync_Strobe_tb.ghdl b/sim/misc/sync/sync_Strobe_tb.ghdl deleted file mode 100644 index c6d81db4d..000000000 --- a/sim/misc/sync/sync_Strobe_tb.ghdl +++ /dev/null @@ -1,10 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/sync_strobe_tb/clock1 -/sync_strobe_tb/clock2 -/sync_strobe_tb/sync_in -/sync_strobe_tb/sync_out -/sync_strobe_tb/sync_busy diff --git a/sim/misc/sync/sync_Strobe_tb.gtkw b/sim/misc/sync/sync_Strobe_tb.gtkw deleted file mode 100644 index 2bc3bbf5a..000000000 --- a/sim/misc/sync/sync_Strobe_tb.gtkw +++ /dev/null @@ -1,26 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.61 (w)1999-2014 BSI -[*] Mon Feb 08 14:37:35 2016 -[*] -[dumpfile_mtime] "Mon Feb 08 14:35:10 2016" -[dumpfile_size] 3230 -[timestart] 0 -[size] 1680 997 -[pos] -35 -35 -*-26.156279 380600000 -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 -[treeopen] top. -[treeopen] top.sync_strobe_tb. -[sst_width] 197 -[signals_width] 161 -[sst_expanded] 1 -[sst_vpaned_height] 293 -@28 -top.sync_strobe_tb.clock1 -top.sync_strobe_tb.clock2 -@29 -top.sync_strobe_tb.sync_busy[0] -@28 -top.sync_strobe_tb.sync_in[0] -top.sync_strobe_tb.sync_out[0] -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/misc/sync/sync_Strobe_tb.wcfg b/sim/misc/sync/sync_Strobe_tb.wcfg deleted file mode 100644 index befb66cbe..000000000 --- a/sim/misc/sync/sync_Strobe_tb.wcfg +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - label - clock1 - clock1 - clock1 - - - clock2 - clock2 - - - Synchronize a strobe signal - label - #808000 - 230 230 230 - - - Sync Strobe - label - - input[0:0] - input[0:0] - - - busy[0:0] - busy[0:0] - - - XClock - label - #008080 - 230 230 230 - - - output[0:0] - output[0:0] - - - Internal - label - - d0 - d0 - - - changed_clk1 - changed_clk1 - - - t1 - t1 - - - d2 - d2 - - - changed_clk2 - changed_clk2 - - - busy_i - busy_i - - - - diff --git a/sim/misc/sync/sync_Vector_tb.ghdl b/sim/misc/sync/sync_Vector_tb.ghdl deleted file mode 100644 index 31d75e8b8..000000000 --- a/sim/misc/sync/sync_Vector_tb.ghdl +++ /dev/null @@ -1,11 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/sync_vector_tb/clock1 -/sync_vector_tb/clock2 -/sync_vector_tb/sync_in -/sync_vector_tb/sync_out -/sync_vector_tb/sync_busy -/sync_vector_tb/sync_changed diff --git a/sim/misc/sync/sync_Vector_tb.gtkw b/sim/misc/sync/sync_Vector_tb.gtkw deleted file mode 100644 index 2679805e2..000000000 --- a/sim/misc/sync/sync_Vector_tb.gtkw +++ /dev/null @@ -1,34 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.61 (w)1999-2014 BSI -[*] Mon Feb 08 14:48:43 2016 -[*] -[dumpfile_mtime] "Mon Feb 08 14:47:38 2016" -[dumpfile_size] 3320 -[timestart] 0 -[size] 1680 997 -[pos] -217 -217 -*-26.227663 -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 -[treeopen] top. -[treeopen] top.sync_vector_tb. -[sst_width] 197 -[signals_width] 189 -[sst_expanded] 1 -[sst_vpaned_height] 293 -@28 -top.sync_vector_tb.clock1 -top.sync_vector_tb.clock2 -@29 -top.sync_vector_tb.sync_busy -@28 -#{top.sync_vector_tb.sync_in[1:0]} top.sync_vector_tb.sync_in[1] top.sync_vector_tb.sync_in[0] -@c00028 -#{top.sync_vector_tb.sync_out[1:0]} top.sync_vector_tb.sync_out[1] top.sync_vector_tb.sync_out[0] -@28 -top.sync_vector_tb.sync_out[1] -top.sync_vector_tb.sync_out[0] -@1401200 --group_end -@28 -top.sync_vector_tb.sync_changed -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/misc/sync/sync_Vector_tb.wcfg b/sim/misc/sync/sync_Vector_tb.wcfg deleted file mode 100644 index b383e0594..000000000 --- a/sim/misc/sync/sync_Vector_tb.wcfg +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - label - clock1 - clock1 - clock1 - - - clock2 - clock2 - - - Synchronize a complete Vector - label - #808000 - 230 230 230 - - - Sync Vector - label - - input[1:0] - input[1:0] - - - busy - busy - - - XClock - label - #008080 - 230 230 230 - - - output[1:0] - output[1:0] - - - label - changed - changed - changed - - - Internal - label - - d0[1:0] - d0[1:0] - - - changed_clk1 - changed_clk1 - - - t1 - t1 - - - d2 - d2 - - - changed_clk2 - changed_clk2 - - - d3 - d3 - - - d4[1:0] - d4[1:0] - - - busy_i - busy_i - - - - diff --git a/sim/sort/sortnet/sortnet_BitonicSort_tb.ghdl b/sim/sort/sortnet/sortnet_BitonicSort_tb.ghdl deleted file mode 100644 index 6fa2d7ff4..000000000 --- a/sim/sort/sortnet/sortnet_BitonicSort_tb.ghdl +++ /dev/null @@ -1,35 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/sortnet_bitonicsort_tb/clock -/sortnet_bitonicsort_tb/generator_valid -/sortnet_bitonicsort_tb/generator_iskey -/sortnet_bitonicsort_tb/generator_data -/sortnet_bitonicsort_tb/generator_meta -/sortnet_bitonicsort_tb/sort_valid -/sortnet_bitonicsort_tb/sort_iskey -/sortnet_bitonicsort_tb/sort_data -/sortnet_bitonicsort_tb/sort_meta -/sortnet_bitonicsort_tb/datainputmatrix -/sortnet_bitonicsort_tb/dataoutputmatrix -/sortnet_bitonicsort_tb/sort/clock -/sortnet_bitonicsort_tb/sort/reset -/sortnet_bitonicsort_tb/sort/inverse -/sortnet_bitonicsort_tb/sort/in_valid -/sortnet_bitonicsort_tb/sort/in_iskey -/sortnet_bitonicsort_tb/sort/in_data -/sortnet_bitonicsort_tb/sort/in_meta -/sortnet_bitonicsort_tb/sort/out_valid -/sortnet_bitonicsort_tb/sort/out_iskey -/sortnet_bitonicsort_tb/sort/out_data -/sortnet_bitonicsort_tb/sort/out_meta -/sortnet_bitonicsort_tb/sort/in_valid_d -/sortnet_bitonicsort_tb/sort/in_iskey_d -/sortnet_bitonicsort_tb/sort/in_data_d -/sortnet_bitonicsort_tb/sort/in_meta_d -/sortnet_bitonicsort_tb/sort/metavector -/sortnet_bitonicsort_tb/sort/datamatrix -/sortnet_bitonicsort_tb/sort/metaoutputs_d -/sortnet_bitonicsort_tb/sort/dataoutputs_d diff --git a/sim/sort/sortnet/sortnet_BitonicSort_tb.gtkw b/sim/sort/sortnet/sortnet_BitonicSort_tb.gtkw deleted file mode 100644 index dd7af1890..000000000 --- a/sim/sort/sortnet/sortnet_BitonicSort_tb.gtkw +++ /dev/null @@ -1,82 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.69 (w)1999-2016 BSI -[*] Sun Mar 20 16:55:14 2016 -[*] -[dumpfile_mtime] "Sun Mar 20 16:54:49 2016" -[dumpfile_size] 654474 -[timestart] 0 -[size] 1676 997 -[pos] -1 -1 -*-25.187967 -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 -[treeopen] top. -[treeopen] top.sortnet_bitonicsort_tb. -[treeopen] top.sortnet_bitonicsort_tb.sort. -[treeopen] top.sortnet_bitonicsort_tb.sort.[1].[1].[15]. -[treeopen] top.sortnet_bitonicsort_tb.sort_data. -[sst_width] 197 -[signals_width] 301 -[sst_expanded] 1 -[sst_vpaned_height] 293 -@28 -top.sortnet_bitonicsort_tb.clock -top.sortnet_bitonicsort_tb.generator_valid -top.sortnet_bitonicsort_tb.generator_iskey -@800200 --Generator_Data [31:0] -@22 -#{top.sortnet_bitonicsort_tb.generator_data[0][31:0]} top.sortnet_bitonicsort_tb.generator_data[0][31] top.sortnet_bitonicsort_tb.generator_data[0][30] top.sortnet_bitonicsort_tb.generator_data[0][29] top.sortnet_bitonicsort_tb.generator_data[0][28] top.sortnet_bitonicsort_tb.generator_data[0][27] top.sortnet_bitonicsort_tb.generator_data[0][26] top.sortnet_bitonicsort_tb.generator_data[0][25] top.sortnet_bitonicsort_tb.generator_data[0][24] top.sortnet_bitonicsort_tb.generator_data[0][23] top.sortnet_bitonicsort_tb.generator_data[0][22] top.sortnet_bitonicsort_tb.generator_data[0][21] top.sortnet_bitonicsort_tb.generator_data[0][20] top.sortnet_bitonicsort_tb.generator_data[0][19] top.sortnet_bitonicsort_tb.generator_data[0][18] top.sortnet_bitonicsort_tb.generator_data[0][17] top.sortnet_bitonicsort_tb.generator_data[0][16] top.sortnet_bitonicsort_tb.generator_data[0][15] top.sortnet_bitonicsort_tb.generator_data[0][14] top.sortnet_bitonicsort_tb.generator_data[0][13] top.sortnet_bitonicsort_tb.generator_data[0][12] top.sortnet_bitonicsort_tb.generator_data[0][11] top.sortnet_bitonicsort_tb.generator_data[0][10] top.sortnet_bitonicsort_tb.generator_data[0][9] top.sortnet_bitonicsort_tb.generator_data[0][8] top.sortnet_bitonicsort_tb.generator_data[0][7] top.sortnet_bitonicsort_tb.generator_data[0][6] top.sortnet_bitonicsort_tb.generator_data[0][5] top.sortnet_bitonicsort_tb.generator_data[0][4] top.sortnet_bitonicsort_tb.generator_data[0][3] top.sortnet_bitonicsort_tb.generator_data[0][2] top.sortnet_bitonicsort_tb.generator_data[0][1] top.sortnet_bitonicsort_tb.generator_data[0][0] -#{top.sortnet_bitonicsort_tb.generator_data[1][31:0]} top.sortnet_bitonicsort_tb.generator_data[1][31] top.sortnet_bitonicsort_tb.generator_data[1][30] top.sortnet_bitonicsort_tb.generator_data[1][29] top.sortnet_bitonicsort_tb.generator_data[1][28] top.sortnet_bitonicsort_tb.generator_data[1][27] top.sortnet_bitonicsort_tb.generator_data[1][26] top.sortnet_bitonicsort_tb.generator_data[1][25] top.sortnet_bitonicsort_tb.generator_data[1][24] top.sortnet_bitonicsort_tb.generator_data[1][23] top.sortnet_bitonicsort_tb.generator_data[1][22] top.sortnet_bitonicsort_tb.generator_data[1][21] top.sortnet_bitonicsort_tb.generator_data[1][20] top.sortnet_bitonicsort_tb.generator_data[1][19] top.sortnet_bitonicsort_tb.generator_data[1][18] top.sortnet_bitonicsort_tb.generator_data[1][17] top.sortnet_bitonicsort_tb.generator_data[1][16] top.sortnet_bitonicsort_tb.generator_data[1][15] top.sortnet_bitonicsort_tb.generator_data[1][14] top.sortnet_bitonicsort_tb.generator_data[1][13] top.sortnet_bitonicsort_tb.generator_data[1][12] top.sortnet_bitonicsort_tb.generator_data[1][11] top.sortnet_bitonicsort_tb.generator_data[1][10] top.sortnet_bitonicsort_tb.generator_data[1][9] top.sortnet_bitonicsort_tb.generator_data[1][8] top.sortnet_bitonicsort_tb.generator_data[1][7] top.sortnet_bitonicsort_tb.generator_data[1][6] top.sortnet_bitonicsort_tb.generator_data[1][5] top.sortnet_bitonicsort_tb.generator_data[1][4] top.sortnet_bitonicsort_tb.generator_data[1][3] top.sortnet_bitonicsort_tb.generator_data[1][2] top.sortnet_bitonicsort_tb.generator_data[1][1] top.sortnet_bitonicsort_tb.generator_data[1][0] -#{top.sortnet_bitonicsort_tb.generator_data[2][31:0]} top.sortnet_bitonicsort_tb.generator_data[2][31] top.sortnet_bitonicsort_tb.generator_data[2][30] top.sortnet_bitonicsort_tb.generator_data[2][29] top.sortnet_bitonicsort_tb.generator_data[2][28] top.sortnet_bitonicsort_tb.generator_data[2][27] top.sortnet_bitonicsort_tb.generator_data[2][26] top.sortnet_bitonicsort_tb.generator_data[2][25] top.sortnet_bitonicsort_tb.generator_data[2][24] top.sortnet_bitonicsort_tb.generator_data[2][23] top.sortnet_bitonicsort_tb.generator_data[2][22] top.sortnet_bitonicsort_tb.generator_data[2][21] top.sortnet_bitonicsort_tb.generator_data[2][20] top.sortnet_bitonicsort_tb.generator_data[2][19] top.sortnet_bitonicsort_tb.generator_data[2][18] top.sortnet_bitonicsort_tb.generator_data[2][17] top.sortnet_bitonicsort_tb.generator_data[2][16] top.sortnet_bitonicsort_tb.generator_data[2][15] top.sortnet_bitonicsort_tb.generator_data[2][14] top.sortnet_bitonicsort_tb.generator_data[2][13] top.sortnet_bitonicsort_tb.generator_data[2][12] top.sortnet_bitonicsort_tb.generator_data[2][11] top.sortnet_bitonicsort_tb.generator_data[2][10] top.sortnet_bitonicsort_tb.generator_data[2][9] top.sortnet_bitonicsort_tb.generator_data[2][8] top.sortnet_bitonicsort_tb.generator_data[2][7] top.sortnet_bitonicsort_tb.generator_data[2][6] top.sortnet_bitonicsort_tb.generator_data[2][5] top.sortnet_bitonicsort_tb.generator_data[2][4] top.sortnet_bitonicsort_tb.generator_data[2][3] top.sortnet_bitonicsort_tb.generator_data[2][2] top.sortnet_bitonicsort_tb.generator_data[2][1] top.sortnet_bitonicsort_tb.generator_data[2][0] -#{top.sortnet_bitonicsort_tb.generator_data[3][31:0]} top.sortnet_bitonicsort_tb.generator_data[3][31] top.sortnet_bitonicsort_tb.generator_data[3][30] top.sortnet_bitonicsort_tb.generator_data[3][29] top.sortnet_bitonicsort_tb.generator_data[3][28] top.sortnet_bitonicsort_tb.generator_data[3][27] top.sortnet_bitonicsort_tb.generator_data[3][26] top.sortnet_bitonicsort_tb.generator_data[3][25] top.sortnet_bitonicsort_tb.generator_data[3][24] top.sortnet_bitonicsort_tb.generator_data[3][23] top.sortnet_bitonicsort_tb.generator_data[3][22] top.sortnet_bitonicsort_tb.generator_data[3][21] top.sortnet_bitonicsort_tb.generator_data[3][20] top.sortnet_bitonicsort_tb.generator_data[3][19] top.sortnet_bitonicsort_tb.generator_data[3][18] top.sortnet_bitonicsort_tb.generator_data[3][17] top.sortnet_bitonicsort_tb.generator_data[3][16] top.sortnet_bitonicsort_tb.generator_data[3][15] top.sortnet_bitonicsort_tb.generator_data[3][14] top.sortnet_bitonicsort_tb.generator_data[3][13] top.sortnet_bitonicsort_tb.generator_data[3][12] top.sortnet_bitonicsort_tb.generator_data[3][11] top.sortnet_bitonicsort_tb.generator_data[3][10] top.sortnet_bitonicsort_tb.generator_data[3][9] top.sortnet_bitonicsort_tb.generator_data[3][8] top.sortnet_bitonicsort_tb.generator_data[3][7] top.sortnet_bitonicsort_tb.generator_data[3][6] top.sortnet_bitonicsort_tb.generator_data[3][5] top.sortnet_bitonicsort_tb.generator_data[3][4] top.sortnet_bitonicsort_tb.generator_data[3][3] top.sortnet_bitonicsort_tb.generator_data[3][2] top.sortnet_bitonicsort_tb.generator_data[3][1] top.sortnet_bitonicsort_tb.generator_data[3][0] -#{top.sortnet_bitonicsort_tb.generator_data[4][31:0]} top.sortnet_bitonicsort_tb.generator_data[4][31] top.sortnet_bitonicsort_tb.generator_data[4][30] top.sortnet_bitonicsort_tb.generator_data[4][29] top.sortnet_bitonicsort_tb.generator_data[4][28] top.sortnet_bitonicsort_tb.generator_data[4][27] top.sortnet_bitonicsort_tb.generator_data[4][26] top.sortnet_bitonicsort_tb.generator_data[4][25] top.sortnet_bitonicsort_tb.generator_data[4][24] top.sortnet_bitonicsort_tb.generator_data[4][23] top.sortnet_bitonicsort_tb.generator_data[4][22] top.sortnet_bitonicsort_tb.generator_data[4][21] top.sortnet_bitonicsort_tb.generator_data[4][20] top.sortnet_bitonicsort_tb.generator_data[4][19] top.sortnet_bitonicsort_tb.generator_data[4][18] top.sortnet_bitonicsort_tb.generator_data[4][17] top.sortnet_bitonicsort_tb.generator_data[4][16] top.sortnet_bitonicsort_tb.generator_data[4][15] top.sortnet_bitonicsort_tb.generator_data[4][14] top.sortnet_bitonicsort_tb.generator_data[4][13] top.sortnet_bitonicsort_tb.generator_data[4][12] top.sortnet_bitonicsort_tb.generator_data[4][11] top.sortnet_bitonicsort_tb.generator_data[4][10] top.sortnet_bitonicsort_tb.generator_data[4][9] top.sortnet_bitonicsort_tb.generator_data[4][8] top.sortnet_bitonicsort_tb.generator_data[4][7] top.sortnet_bitonicsort_tb.generator_data[4][6] top.sortnet_bitonicsort_tb.generator_data[4][5] top.sortnet_bitonicsort_tb.generator_data[4][4] top.sortnet_bitonicsort_tb.generator_data[4][3] top.sortnet_bitonicsort_tb.generator_data[4][2] top.sortnet_bitonicsort_tb.generator_data[4][1] top.sortnet_bitonicsort_tb.generator_data[4][0] -#{top.sortnet_bitonicsort_tb.generator_data[5][31:0]} top.sortnet_bitonicsort_tb.generator_data[5][31] top.sortnet_bitonicsort_tb.generator_data[5][30] top.sortnet_bitonicsort_tb.generator_data[5][29] top.sortnet_bitonicsort_tb.generator_data[5][28] top.sortnet_bitonicsort_tb.generator_data[5][27] top.sortnet_bitonicsort_tb.generator_data[5][26] top.sortnet_bitonicsort_tb.generator_data[5][25] top.sortnet_bitonicsort_tb.generator_data[5][24] top.sortnet_bitonicsort_tb.generator_data[5][23] top.sortnet_bitonicsort_tb.generator_data[5][22] top.sortnet_bitonicsort_tb.generator_data[5][21] top.sortnet_bitonicsort_tb.generator_data[5][20] top.sortnet_bitonicsort_tb.generator_data[5][19] top.sortnet_bitonicsort_tb.generator_data[5][18] top.sortnet_bitonicsort_tb.generator_data[5][17] top.sortnet_bitonicsort_tb.generator_data[5][16] top.sortnet_bitonicsort_tb.generator_data[5][15] top.sortnet_bitonicsort_tb.generator_data[5][14] top.sortnet_bitonicsort_tb.generator_data[5][13] top.sortnet_bitonicsort_tb.generator_data[5][12] top.sortnet_bitonicsort_tb.generator_data[5][11] top.sortnet_bitonicsort_tb.generator_data[5][10] top.sortnet_bitonicsort_tb.generator_data[5][9] top.sortnet_bitonicsort_tb.generator_data[5][8] top.sortnet_bitonicsort_tb.generator_data[5][7] top.sortnet_bitonicsort_tb.generator_data[5][6] top.sortnet_bitonicsort_tb.generator_data[5][5] top.sortnet_bitonicsort_tb.generator_data[5][4] top.sortnet_bitonicsort_tb.generator_data[5][3] top.sortnet_bitonicsort_tb.generator_data[5][2] top.sortnet_bitonicsort_tb.generator_data[5][1] top.sortnet_bitonicsort_tb.generator_data[5][0] -#{top.sortnet_bitonicsort_tb.generator_data[6][31:0]} top.sortnet_bitonicsort_tb.generator_data[6][31] top.sortnet_bitonicsort_tb.generator_data[6][30] top.sortnet_bitonicsort_tb.generator_data[6][29] top.sortnet_bitonicsort_tb.generator_data[6][28] top.sortnet_bitonicsort_tb.generator_data[6][27] top.sortnet_bitonicsort_tb.generator_data[6][26] top.sortnet_bitonicsort_tb.generator_data[6][25] top.sortnet_bitonicsort_tb.generator_data[6][24] top.sortnet_bitonicsort_tb.generator_data[6][23] top.sortnet_bitonicsort_tb.generator_data[6][22] top.sortnet_bitonicsort_tb.generator_data[6][21] top.sortnet_bitonicsort_tb.generator_data[6][20] top.sortnet_bitonicsort_tb.generator_data[6][19] top.sortnet_bitonicsort_tb.generator_data[6][18] top.sortnet_bitonicsort_tb.generator_data[6][17] top.sortnet_bitonicsort_tb.generator_data[6][16] top.sortnet_bitonicsort_tb.generator_data[6][15] top.sortnet_bitonicsort_tb.generator_data[6][14] top.sortnet_bitonicsort_tb.generator_data[6][13] top.sortnet_bitonicsort_tb.generator_data[6][12] top.sortnet_bitonicsort_tb.generator_data[6][11] top.sortnet_bitonicsort_tb.generator_data[6][10] top.sortnet_bitonicsort_tb.generator_data[6][9] top.sortnet_bitonicsort_tb.generator_data[6][8] top.sortnet_bitonicsort_tb.generator_data[6][7] top.sortnet_bitonicsort_tb.generator_data[6][6] top.sortnet_bitonicsort_tb.generator_data[6][5] top.sortnet_bitonicsort_tb.generator_data[6][4] top.sortnet_bitonicsort_tb.generator_data[6][3] top.sortnet_bitonicsort_tb.generator_data[6][2] top.sortnet_bitonicsort_tb.generator_data[6][1] top.sortnet_bitonicsort_tb.generator_data[6][0] -#{top.sortnet_bitonicsort_tb.generator_data[7][31:0]} top.sortnet_bitonicsort_tb.generator_data[7][31] top.sortnet_bitonicsort_tb.generator_data[7][30] top.sortnet_bitonicsort_tb.generator_data[7][29] top.sortnet_bitonicsort_tb.generator_data[7][28] top.sortnet_bitonicsort_tb.generator_data[7][27] top.sortnet_bitonicsort_tb.generator_data[7][26] top.sortnet_bitonicsort_tb.generator_data[7][25] top.sortnet_bitonicsort_tb.generator_data[7][24] top.sortnet_bitonicsort_tb.generator_data[7][23] top.sortnet_bitonicsort_tb.generator_data[7][22] top.sortnet_bitonicsort_tb.generator_data[7][21] top.sortnet_bitonicsort_tb.generator_data[7][20] top.sortnet_bitonicsort_tb.generator_data[7][19] top.sortnet_bitonicsort_tb.generator_data[7][18] top.sortnet_bitonicsort_tb.generator_data[7][17] top.sortnet_bitonicsort_tb.generator_data[7][16] top.sortnet_bitonicsort_tb.generator_data[7][15] top.sortnet_bitonicsort_tb.generator_data[7][14] top.sortnet_bitonicsort_tb.generator_data[7][13] top.sortnet_bitonicsort_tb.generator_data[7][12] top.sortnet_bitonicsort_tb.generator_data[7][11] top.sortnet_bitonicsort_tb.generator_data[7][10] top.sortnet_bitonicsort_tb.generator_data[7][9] top.sortnet_bitonicsort_tb.generator_data[7][8] top.sortnet_bitonicsort_tb.generator_data[7][7] top.sortnet_bitonicsort_tb.generator_data[7][6] top.sortnet_bitonicsort_tb.generator_data[7][5] top.sortnet_bitonicsort_tb.generator_data[7][4] top.sortnet_bitonicsort_tb.generator_data[7][3] top.sortnet_bitonicsort_tb.generator_data[7][2] top.sortnet_bitonicsort_tb.generator_data[7][1] top.sortnet_bitonicsort_tb.generator_data[7][0] -#{top.sortnet_bitonicsort_tb.generator_data[8][31:0]} top.sortnet_bitonicsort_tb.generator_data[8][31] top.sortnet_bitonicsort_tb.generator_data[8][30] top.sortnet_bitonicsort_tb.generator_data[8][29] top.sortnet_bitonicsort_tb.generator_data[8][28] top.sortnet_bitonicsort_tb.generator_data[8][27] top.sortnet_bitonicsort_tb.generator_data[8][26] top.sortnet_bitonicsort_tb.generator_data[8][25] top.sortnet_bitonicsort_tb.generator_data[8][24] top.sortnet_bitonicsort_tb.generator_data[8][23] top.sortnet_bitonicsort_tb.generator_data[8][22] top.sortnet_bitonicsort_tb.generator_data[8][21] top.sortnet_bitonicsort_tb.generator_data[8][20] top.sortnet_bitonicsort_tb.generator_data[8][19] top.sortnet_bitonicsort_tb.generator_data[8][18] top.sortnet_bitonicsort_tb.generator_data[8][17] top.sortnet_bitonicsort_tb.generator_data[8][16] top.sortnet_bitonicsort_tb.generator_data[8][15] top.sortnet_bitonicsort_tb.generator_data[8][14] top.sortnet_bitonicsort_tb.generator_data[8][13] top.sortnet_bitonicsort_tb.generator_data[8][12] top.sortnet_bitonicsort_tb.generator_data[8][11] top.sortnet_bitonicsort_tb.generator_data[8][10] top.sortnet_bitonicsort_tb.generator_data[8][9] top.sortnet_bitonicsort_tb.generator_data[8][8] top.sortnet_bitonicsort_tb.generator_data[8][7] top.sortnet_bitonicsort_tb.generator_data[8][6] top.sortnet_bitonicsort_tb.generator_data[8][5] top.sortnet_bitonicsort_tb.generator_data[8][4] top.sortnet_bitonicsort_tb.generator_data[8][3] top.sortnet_bitonicsort_tb.generator_data[8][2] top.sortnet_bitonicsort_tb.generator_data[8][1] top.sortnet_bitonicsort_tb.generator_data[8][0] -#{top.sortnet_bitonicsort_tb.generator_data[9][31:0]} top.sortnet_bitonicsort_tb.generator_data[9][31] top.sortnet_bitonicsort_tb.generator_data[9][30] top.sortnet_bitonicsort_tb.generator_data[9][29] top.sortnet_bitonicsort_tb.generator_data[9][28] top.sortnet_bitonicsort_tb.generator_data[9][27] top.sortnet_bitonicsort_tb.generator_data[9][26] top.sortnet_bitonicsort_tb.generator_data[9][25] top.sortnet_bitonicsort_tb.generator_data[9][24] top.sortnet_bitonicsort_tb.generator_data[9][23] top.sortnet_bitonicsort_tb.generator_data[9][22] top.sortnet_bitonicsort_tb.generator_data[9][21] top.sortnet_bitonicsort_tb.generator_data[9][20] top.sortnet_bitonicsort_tb.generator_data[9][19] top.sortnet_bitonicsort_tb.generator_data[9][18] top.sortnet_bitonicsort_tb.generator_data[9][17] top.sortnet_bitonicsort_tb.generator_data[9][16] top.sortnet_bitonicsort_tb.generator_data[9][15] top.sortnet_bitonicsort_tb.generator_data[9][14] top.sortnet_bitonicsort_tb.generator_data[9][13] top.sortnet_bitonicsort_tb.generator_data[9][12] top.sortnet_bitonicsort_tb.generator_data[9][11] top.sortnet_bitonicsort_tb.generator_data[9][10] top.sortnet_bitonicsort_tb.generator_data[9][9] top.sortnet_bitonicsort_tb.generator_data[9][8] top.sortnet_bitonicsort_tb.generator_data[9][7] top.sortnet_bitonicsort_tb.generator_data[9][6] top.sortnet_bitonicsort_tb.generator_data[9][5] top.sortnet_bitonicsort_tb.generator_data[9][4] top.sortnet_bitonicsort_tb.generator_data[9][3] top.sortnet_bitonicsort_tb.generator_data[9][2] top.sortnet_bitonicsort_tb.generator_data[9][1] top.sortnet_bitonicsort_tb.generator_data[9][0] -#{top.sortnet_bitonicsort_tb.generator_data[10][31:0]} top.sortnet_bitonicsort_tb.generator_data[10][31] top.sortnet_bitonicsort_tb.generator_data[10][30] top.sortnet_bitonicsort_tb.generator_data[10][29] top.sortnet_bitonicsort_tb.generator_data[10][28] top.sortnet_bitonicsort_tb.generator_data[10][27] top.sortnet_bitonicsort_tb.generator_data[10][26] top.sortnet_bitonicsort_tb.generator_data[10][25] top.sortnet_bitonicsort_tb.generator_data[10][24] top.sortnet_bitonicsort_tb.generator_data[10][23] top.sortnet_bitonicsort_tb.generator_data[10][22] top.sortnet_bitonicsort_tb.generator_data[10][21] top.sortnet_bitonicsort_tb.generator_data[10][20] top.sortnet_bitonicsort_tb.generator_data[10][19] top.sortnet_bitonicsort_tb.generator_data[10][18] top.sortnet_bitonicsort_tb.generator_data[10][17] top.sortnet_bitonicsort_tb.generator_data[10][16] top.sortnet_bitonicsort_tb.generator_data[10][15] top.sortnet_bitonicsort_tb.generator_data[10][14] top.sortnet_bitonicsort_tb.generator_data[10][13] top.sortnet_bitonicsort_tb.generator_data[10][12] top.sortnet_bitonicsort_tb.generator_data[10][11] top.sortnet_bitonicsort_tb.generator_data[10][10] top.sortnet_bitonicsort_tb.generator_data[10][9] top.sortnet_bitonicsort_tb.generator_data[10][8] top.sortnet_bitonicsort_tb.generator_data[10][7] top.sortnet_bitonicsort_tb.generator_data[10][6] top.sortnet_bitonicsort_tb.generator_data[10][5] top.sortnet_bitonicsort_tb.generator_data[10][4] top.sortnet_bitonicsort_tb.generator_data[10][3] top.sortnet_bitonicsort_tb.generator_data[10][2] top.sortnet_bitonicsort_tb.generator_data[10][1] top.sortnet_bitonicsort_tb.generator_data[10][0] -#{top.sortnet_bitonicsort_tb.generator_data[11][31:0]} top.sortnet_bitonicsort_tb.generator_data[11][31] top.sortnet_bitonicsort_tb.generator_data[11][30] top.sortnet_bitonicsort_tb.generator_data[11][29] top.sortnet_bitonicsort_tb.generator_data[11][28] top.sortnet_bitonicsort_tb.generator_data[11][27] top.sortnet_bitonicsort_tb.generator_data[11][26] top.sortnet_bitonicsort_tb.generator_data[11][25] top.sortnet_bitonicsort_tb.generator_data[11][24] top.sortnet_bitonicsort_tb.generator_data[11][23] top.sortnet_bitonicsort_tb.generator_data[11][22] top.sortnet_bitonicsort_tb.generator_data[11][21] top.sortnet_bitonicsort_tb.generator_data[11][20] top.sortnet_bitonicsort_tb.generator_data[11][19] top.sortnet_bitonicsort_tb.generator_data[11][18] top.sortnet_bitonicsort_tb.generator_data[11][17] top.sortnet_bitonicsort_tb.generator_data[11][16] top.sortnet_bitonicsort_tb.generator_data[11][15] top.sortnet_bitonicsort_tb.generator_data[11][14] top.sortnet_bitonicsort_tb.generator_data[11][13] top.sortnet_bitonicsort_tb.generator_data[11][12] top.sortnet_bitonicsort_tb.generator_data[11][11] top.sortnet_bitonicsort_tb.generator_data[11][10] top.sortnet_bitonicsort_tb.generator_data[11][9] top.sortnet_bitonicsort_tb.generator_data[11][8] top.sortnet_bitonicsort_tb.generator_data[11][7] top.sortnet_bitonicsort_tb.generator_data[11][6] top.sortnet_bitonicsort_tb.generator_data[11][5] top.sortnet_bitonicsort_tb.generator_data[11][4] top.sortnet_bitonicsort_tb.generator_data[11][3] top.sortnet_bitonicsort_tb.generator_data[11][2] top.sortnet_bitonicsort_tb.generator_data[11][1] top.sortnet_bitonicsort_tb.generator_data[11][0] -#{top.sortnet_bitonicsort_tb.generator_data[12][31:0]} top.sortnet_bitonicsort_tb.generator_data[12][31] top.sortnet_bitonicsort_tb.generator_data[12][30] top.sortnet_bitonicsort_tb.generator_data[12][29] top.sortnet_bitonicsort_tb.generator_data[12][28] top.sortnet_bitonicsort_tb.generator_data[12][27] top.sortnet_bitonicsort_tb.generator_data[12][26] top.sortnet_bitonicsort_tb.generator_data[12][25] top.sortnet_bitonicsort_tb.generator_data[12][24] top.sortnet_bitonicsort_tb.generator_data[12][23] top.sortnet_bitonicsort_tb.generator_data[12][22] top.sortnet_bitonicsort_tb.generator_data[12][21] top.sortnet_bitonicsort_tb.generator_data[12][20] top.sortnet_bitonicsort_tb.generator_data[12][19] top.sortnet_bitonicsort_tb.generator_data[12][18] top.sortnet_bitonicsort_tb.generator_data[12][17] top.sortnet_bitonicsort_tb.generator_data[12][16] top.sortnet_bitonicsort_tb.generator_data[12][15] top.sortnet_bitonicsort_tb.generator_data[12][14] top.sortnet_bitonicsort_tb.generator_data[12][13] top.sortnet_bitonicsort_tb.generator_data[12][12] top.sortnet_bitonicsort_tb.generator_data[12][11] top.sortnet_bitonicsort_tb.generator_data[12][10] top.sortnet_bitonicsort_tb.generator_data[12][9] top.sortnet_bitonicsort_tb.generator_data[12][8] top.sortnet_bitonicsort_tb.generator_data[12][7] top.sortnet_bitonicsort_tb.generator_data[12][6] top.sortnet_bitonicsort_tb.generator_data[12][5] top.sortnet_bitonicsort_tb.generator_data[12][4] top.sortnet_bitonicsort_tb.generator_data[12][3] top.sortnet_bitonicsort_tb.generator_data[12][2] top.sortnet_bitonicsort_tb.generator_data[12][1] top.sortnet_bitonicsort_tb.generator_data[12][0] -#{top.sortnet_bitonicsort_tb.generator_data[13][31:0]} top.sortnet_bitonicsort_tb.generator_data[13][31] top.sortnet_bitonicsort_tb.generator_data[13][30] top.sortnet_bitonicsort_tb.generator_data[13][29] top.sortnet_bitonicsort_tb.generator_data[13][28] top.sortnet_bitonicsort_tb.generator_data[13][27] top.sortnet_bitonicsort_tb.generator_data[13][26] top.sortnet_bitonicsort_tb.generator_data[13][25] top.sortnet_bitonicsort_tb.generator_data[13][24] top.sortnet_bitonicsort_tb.generator_data[13][23] top.sortnet_bitonicsort_tb.generator_data[13][22] top.sortnet_bitonicsort_tb.generator_data[13][21] top.sortnet_bitonicsort_tb.generator_data[13][20] top.sortnet_bitonicsort_tb.generator_data[13][19] top.sortnet_bitonicsort_tb.generator_data[13][18] top.sortnet_bitonicsort_tb.generator_data[13][17] top.sortnet_bitonicsort_tb.generator_data[13][16] top.sortnet_bitonicsort_tb.generator_data[13][15] top.sortnet_bitonicsort_tb.generator_data[13][14] top.sortnet_bitonicsort_tb.generator_data[13][13] top.sortnet_bitonicsort_tb.generator_data[13][12] top.sortnet_bitonicsort_tb.generator_data[13][11] top.sortnet_bitonicsort_tb.generator_data[13][10] top.sortnet_bitonicsort_tb.generator_data[13][9] top.sortnet_bitonicsort_tb.generator_data[13][8] top.sortnet_bitonicsort_tb.generator_data[13][7] top.sortnet_bitonicsort_tb.generator_data[13][6] top.sortnet_bitonicsort_tb.generator_data[13][5] top.sortnet_bitonicsort_tb.generator_data[13][4] top.sortnet_bitonicsort_tb.generator_data[13][3] top.sortnet_bitonicsort_tb.generator_data[13][2] top.sortnet_bitonicsort_tb.generator_data[13][1] top.sortnet_bitonicsort_tb.generator_data[13][0] -#{top.sortnet_bitonicsort_tb.generator_data[14][31:0]} top.sortnet_bitonicsort_tb.generator_data[14][31] top.sortnet_bitonicsort_tb.generator_data[14][30] top.sortnet_bitonicsort_tb.generator_data[14][29] top.sortnet_bitonicsort_tb.generator_data[14][28] top.sortnet_bitonicsort_tb.generator_data[14][27] top.sortnet_bitonicsort_tb.generator_data[14][26] top.sortnet_bitonicsort_tb.generator_data[14][25] top.sortnet_bitonicsort_tb.generator_data[14][24] top.sortnet_bitonicsort_tb.generator_data[14][23] top.sortnet_bitonicsort_tb.generator_data[14][22] top.sortnet_bitonicsort_tb.generator_data[14][21] top.sortnet_bitonicsort_tb.generator_data[14][20] top.sortnet_bitonicsort_tb.generator_data[14][19] top.sortnet_bitonicsort_tb.generator_data[14][18] top.sortnet_bitonicsort_tb.generator_data[14][17] top.sortnet_bitonicsort_tb.generator_data[14][16] top.sortnet_bitonicsort_tb.generator_data[14][15] top.sortnet_bitonicsort_tb.generator_data[14][14] top.sortnet_bitonicsort_tb.generator_data[14][13] top.sortnet_bitonicsort_tb.generator_data[14][12] top.sortnet_bitonicsort_tb.generator_data[14][11] top.sortnet_bitonicsort_tb.generator_data[14][10] top.sortnet_bitonicsort_tb.generator_data[14][9] top.sortnet_bitonicsort_tb.generator_data[14][8] top.sortnet_bitonicsort_tb.generator_data[14][7] top.sortnet_bitonicsort_tb.generator_data[14][6] top.sortnet_bitonicsort_tb.generator_data[14][5] top.sortnet_bitonicsort_tb.generator_data[14][4] top.sortnet_bitonicsort_tb.generator_data[14][3] top.sortnet_bitonicsort_tb.generator_data[14][2] top.sortnet_bitonicsort_tb.generator_data[14][1] top.sortnet_bitonicsort_tb.generator_data[14][0] -#{top.sortnet_bitonicsort_tb.generator_data[15][31:0]} top.sortnet_bitonicsort_tb.generator_data[15][31] top.sortnet_bitonicsort_tb.generator_data[15][30] top.sortnet_bitonicsort_tb.generator_data[15][29] top.sortnet_bitonicsort_tb.generator_data[15][28] top.sortnet_bitonicsort_tb.generator_data[15][27] top.sortnet_bitonicsort_tb.generator_data[15][26] top.sortnet_bitonicsort_tb.generator_data[15][25] top.sortnet_bitonicsort_tb.generator_data[15][24] top.sortnet_bitonicsort_tb.generator_data[15][23] top.sortnet_bitonicsort_tb.generator_data[15][22] top.sortnet_bitonicsort_tb.generator_data[15][21] top.sortnet_bitonicsort_tb.generator_data[15][20] top.sortnet_bitonicsort_tb.generator_data[15][19] top.sortnet_bitonicsort_tb.generator_data[15][18] top.sortnet_bitonicsort_tb.generator_data[15][17] top.sortnet_bitonicsort_tb.generator_data[15][16] top.sortnet_bitonicsort_tb.generator_data[15][15] top.sortnet_bitonicsort_tb.generator_data[15][14] top.sortnet_bitonicsort_tb.generator_data[15][13] top.sortnet_bitonicsort_tb.generator_data[15][12] top.sortnet_bitonicsort_tb.generator_data[15][11] top.sortnet_bitonicsort_tb.generator_data[15][10] top.sortnet_bitonicsort_tb.generator_data[15][9] top.sortnet_bitonicsort_tb.generator_data[15][8] top.sortnet_bitonicsort_tb.generator_data[15][7] top.sortnet_bitonicsort_tb.generator_data[15][6] top.sortnet_bitonicsort_tb.generator_data[15][5] top.sortnet_bitonicsort_tb.generator_data[15][4] top.sortnet_bitonicsort_tb.generator_data[15][3] top.sortnet_bitonicsort_tb.generator_data[15][2] top.sortnet_bitonicsort_tb.generator_data[15][1] top.sortnet_bitonicsort_tb.generator_data[15][0] -#{top.sortnet_bitonicsort_tb.generator_data[16][31:0]} top.sortnet_bitonicsort_tb.generator_data[16][31] top.sortnet_bitonicsort_tb.generator_data[16][30] top.sortnet_bitonicsort_tb.generator_data[16][29] top.sortnet_bitonicsort_tb.generator_data[16][28] top.sortnet_bitonicsort_tb.generator_data[16][27] top.sortnet_bitonicsort_tb.generator_data[16][26] top.sortnet_bitonicsort_tb.generator_data[16][25] top.sortnet_bitonicsort_tb.generator_data[16][24] top.sortnet_bitonicsort_tb.generator_data[16][23] top.sortnet_bitonicsort_tb.generator_data[16][22] top.sortnet_bitonicsort_tb.generator_data[16][21] top.sortnet_bitonicsort_tb.generator_data[16][20] top.sortnet_bitonicsort_tb.generator_data[16][19] top.sortnet_bitonicsort_tb.generator_data[16][18] top.sortnet_bitonicsort_tb.generator_data[16][17] top.sortnet_bitonicsort_tb.generator_data[16][16] top.sortnet_bitonicsort_tb.generator_data[16][15] top.sortnet_bitonicsort_tb.generator_data[16][14] top.sortnet_bitonicsort_tb.generator_data[16][13] top.sortnet_bitonicsort_tb.generator_data[16][12] top.sortnet_bitonicsort_tb.generator_data[16][11] top.sortnet_bitonicsort_tb.generator_data[16][10] top.sortnet_bitonicsort_tb.generator_data[16][9] top.sortnet_bitonicsort_tb.generator_data[16][8] top.sortnet_bitonicsort_tb.generator_data[16][7] top.sortnet_bitonicsort_tb.generator_data[16][6] top.sortnet_bitonicsort_tb.generator_data[16][5] top.sortnet_bitonicsort_tb.generator_data[16][4] top.sortnet_bitonicsort_tb.generator_data[16][3] top.sortnet_bitonicsort_tb.generator_data[16][2] top.sortnet_bitonicsort_tb.generator_data[16][1] top.sortnet_bitonicsort_tb.generator_data[16][0] -#{top.sortnet_bitonicsort_tb.generator_data[17][31:0]} top.sortnet_bitonicsort_tb.generator_data[17][31] top.sortnet_bitonicsort_tb.generator_data[17][30] top.sortnet_bitonicsort_tb.generator_data[17][29] top.sortnet_bitonicsort_tb.generator_data[17][28] top.sortnet_bitonicsort_tb.generator_data[17][27] top.sortnet_bitonicsort_tb.generator_data[17][26] top.sortnet_bitonicsort_tb.generator_data[17][25] top.sortnet_bitonicsort_tb.generator_data[17][24] top.sortnet_bitonicsort_tb.generator_data[17][23] top.sortnet_bitonicsort_tb.generator_data[17][22] top.sortnet_bitonicsort_tb.generator_data[17][21] top.sortnet_bitonicsort_tb.generator_data[17][20] top.sortnet_bitonicsort_tb.generator_data[17][19] top.sortnet_bitonicsort_tb.generator_data[17][18] top.sortnet_bitonicsort_tb.generator_data[17][17] top.sortnet_bitonicsort_tb.generator_data[17][16] top.sortnet_bitonicsort_tb.generator_data[17][15] top.sortnet_bitonicsort_tb.generator_data[17][14] top.sortnet_bitonicsort_tb.generator_data[17][13] top.sortnet_bitonicsort_tb.generator_data[17][12] top.sortnet_bitonicsort_tb.generator_data[17][11] top.sortnet_bitonicsort_tb.generator_data[17][10] top.sortnet_bitonicsort_tb.generator_data[17][9] top.sortnet_bitonicsort_tb.generator_data[17][8] top.sortnet_bitonicsort_tb.generator_data[17][7] top.sortnet_bitonicsort_tb.generator_data[17][6] top.sortnet_bitonicsort_tb.generator_data[17][5] top.sortnet_bitonicsort_tb.generator_data[17][4] top.sortnet_bitonicsort_tb.generator_data[17][3] top.sortnet_bitonicsort_tb.generator_data[17][2] top.sortnet_bitonicsort_tb.generator_data[17][1] top.sortnet_bitonicsort_tb.generator_data[17][0] -#{top.sortnet_bitonicsort_tb.generator_data[18][31:0]} top.sortnet_bitonicsort_tb.generator_data[18][31] top.sortnet_bitonicsort_tb.generator_data[18][30] top.sortnet_bitonicsort_tb.generator_data[18][29] top.sortnet_bitonicsort_tb.generator_data[18][28] top.sortnet_bitonicsort_tb.generator_data[18][27] top.sortnet_bitonicsort_tb.generator_data[18][26] top.sortnet_bitonicsort_tb.generator_data[18][25] top.sortnet_bitonicsort_tb.generator_data[18][24] top.sortnet_bitonicsort_tb.generator_data[18][23] top.sortnet_bitonicsort_tb.generator_data[18][22] top.sortnet_bitonicsort_tb.generator_data[18][21] top.sortnet_bitonicsort_tb.generator_data[18][20] top.sortnet_bitonicsort_tb.generator_data[18][19] top.sortnet_bitonicsort_tb.generator_data[18][18] top.sortnet_bitonicsort_tb.generator_data[18][17] top.sortnet_bitonicsort_tb.generator_data[18][16] top.sortnet_bitonicsort_tb.generator_data[18][15] top.sortnet_bitonicsort_tb.generator_data[18][14] top.sortnet_bitonicsort_tb.generator_data[18][13] top.sortnet_bitonicsort_tb.generator_data[18][12] top.sortnet_bitonicsort_tb.generator_data[18][11] top.sortnet_bitonicsort_tb.generator_data[18][10] top.sortnet_bitonicsort_tb.generator_data[18][9] top.sortnet_bitonicsort_tb.generator_data[18][8] top.sortnet_bitonicsort_tb.generator_data[18][7] top.sortnet_bitonicsort_tb.generator_data[18][6] top.sortnet_bitonicsort_tb.generator_data[18][5] top.sortnet_bitonicsort_tb.generator_data[18][4] top.sortnet_bitonicsort_tb.generator_data[18][3] top.sortnet_bitonicsort_tb.generator_data[18][2] top.sortnet_bitonicsort_tb.generator_data[18][1] top.sortnet_bitonicsort_tb.generator_data[18][0] -#{top.sortnet_bitonicsort_tb.generator_data[19][31:0]} top.sortnet_bitonicsort_tb.generator_data[19][31] top.sortnet_bitonicsort_tb.generator_data[19][30] top.sortnet_bitonicsort_tb.generator_data[19][29] top.sortnet_bitonicsort_tb.generator_data[19][28] top.sortnet_bitonicsort_tb.generator_data[19][27] top.sortnet_bitonicsort_tb.generator_data[19][26] top.sortnet_bitonicsort_tb.generator_data[19][25] top.sortnet_bitonicsort_tb.generator_data[19][24] top.sortnet_bitonicsort_tb.generator_data[19][23] top.sortnet_bitonicsort_tb.generator_data[19][22] top.sortnet_bitonicsort_tb.generator_data[19][21] top.sortnet_bitonicsort_tb.generator_data[19][20] top.sortnet_bitonicsort_tb.generator_data[19][19] top.sortnet_bitonicsort_tb.generator_data[19][18] top.sortnet_bitonicsort_tb.generator_data[19][17] top.sortnet_bitonicsort_tb.generator_data[19][16] top.sortnet_bitonicsort_tb.generator_data[19][15] top.sortnet_bitonicsort_tb.generator_data[19][14] top.sortnet_bitonicsort_tb.generator_data[19][13] top.sortnet_bitonicsort_tb.generator_data[19][12] top.sortnet_bitonicsort_tb.generator_data[19][11] top.sortnet_bitonicsort_tb.generator_data[19][10] top.sortnet_bitonicsort_tb.generator_data[19][9] top.sortnet_bitonicsort_tb.generator_data[19][8] top.sortnet_bitonicsort_tb.generator_data[19][7] top.sortnet_bitonicsort_tb.generator_data[19][6] top.sortnet_bitonicsort_tb.generator_data[19][5] top.sortnet_bitonicsort_tb.generator_data[19][4] top.sortnet_bitonicsort_tb.generator_data[19][3] top.sortnet_bitonicsort_tb.generator_data[19][2] top.sortnet_bitonicsort_tb.generator_data[19][1] top.sortnet_bitonicsort_tb.generator_data[19][0] -#{top.sortnet_bitonicsort_tb.generator_data[20][31:0]} top.sortnet_bitonicsort_tb.generator_data[20][31] top.sortnet_bitonicsort_tb.generator_data[20][30] top.sortnet_bitonicsort_tb.generator_data[20][29] top.sortnet_bitonicsort_tb.generator_data[20][28] top.sortnet_bitonicsort_tb.generator_data[20][27] top.sortnet_bitonicsort_tb.generator_data[20][26] top.sortnet_bitonicsort_tb.generator_data[20][25] top.sortnet_bitonicsort_tb.generator_data[20][24] top.sortnet_bitonicsort_tb.generator_data[20][23] top.sortnet_bitonicsort_tb.generator_data[20][22] top.sortnet_bitonicsort_tb.generator_data[20][21] top.sortnet_bitonicsort_tb.generator_data[20][20] top.sortnet_bitonicsort_tb.generator_data[20][19] top.sortnet_bitonicsort_tb.generator_data[20][18] top.sortnet_bitonicsort_tb.generator_data[20][17] top.sortnet_bitonicsort_tb.generator_data[20][16] top.sortnet_bitonicsort_tb.generator_data[20][15] top.sortnet_bitonicsort_tb.generator_data[20][14] top.sortnet_bitonicsort_tb.generator_data[20][13] top.sortnet_bitonicsort_tb.generator_data[20][12] top.sortnet_bitonicsort_tb.generator_data[20][11] top.sortnet_bitonicsort_tb.generator_data[20][10] top.sortnet_bitonicsort_tb.generator_data[20][9] top.sortnet_bitonicsort_tb.generator_data[20][8] top.sortnet_bitonicsort_tb.generator_data[20][7] top.sortnet_bitonicsort_tb.generator_data[20][6] top.sortnet_bitonicsort_tb.generator_data[20][5] top.sortnet_bitonicsort_tb.generator_data[20][4] top.sortnet_bitonicsort_tb.generator_data[20][3] top.sortnet_bitonicsort_tb.generator_data[20][2] top.sortnet_bitonicsort_tb.generator_data[20][1] top.sortnet_bitonicsort_tb.generator_data[20][0] -#{top.sortnet_bitonicsort_tb.generator_data[21][31:0]} top.sortnet_bitonicsort_tb.generator_data[21][31] top.sortnet_bitonicsort_tb.generator_data[21][30] top.sortnet_bitonicsort_tb.generator_data[21][29] top.sortnet_bitonicsort_tb.generator_data[21][28] top.sortnet_bitonicsort_tb.generator_data[21][27] top.sortnet_bitonicsort_tb.generator_data[21][26] top.sortnet_bitonicsort_tb.generator_data[21][25] top.sortnet_bitonicsort_tb.generator_data[21][24] top.sortnet_bitonicsort_tb.generator_data[21][23] top.sortnet_bitonicsort_tb.generator_data[21][22] top.sortnet_bitonicsort_tb.generator_data[21][21] top.sortnet_bitonicsort_tb.generator_data[21][20] top.sortnet_bitonicsort_tb.generator_data[21][19] top.sortnet_bitonicsort_tb.generator_data[21][18] top.sortnet_bitonicsort_tb.generator_data[21][17] top.sortnet_bitonicsort_tb.generator_data[21][16] top.sortnet_bitonicsort_tb.generator_data[21][15] top.sortnet_bitonicsort_tb.generator_data[21][14] top.sortnet_bitonicsort_tb.generator_data[21][13] top.sortnet_bitonicsort_tb.generator_data[21][12] top.sortnet_bitonicsort_tb.generator_data[21][11] top.sortnet_bitonicsort_tb.generator_data[21][10] top.sortnet_bitonicsort_tb.generator_data[21][9] top.sortnet_bitonicsort_tb.generator_data[21][8] top.sortnet_bitonicsort_tb.generator_data[21][7] top.sortnet_bitonicsort_tb.generator_data[21][6] top.sortnet_bitonicsort_tb.generator_data[21][5] top.sortnet_bitonicsort_tb.generator_data[21][4] top.sortnet_bitonicsort_tb.generator_data[21][3] top.sortnet_bitonicsort_tb.generator_data[21][2] top.sortnet_bitonicsort_tb.generator_data[21][1] top.sortnet_bitonicsort_tb.generator_data[21][0] -#{top.sortnet_bitonicsort_tb.generator_data[22][31:0]} top.sortnet_bitonicsort_tb.generator_data[22][31] top.sortnet_bitonicsort_tb.generator_data[22][30] top.sortnet_bitonicsort_tb.generator_data[22][29] top.sortnet_bitonicsort_tb.generator_data[22][28] top.sortnet_bitonicsort_tb.generator_data[22][27] top.sortnet_bitonicsort_tb.generator_data[22][26] top.sortnet_bitonicsort_tb.generator_data[22][25] top.sortnet_bitonicsort_tb.generator_data[22][24] top.sortnet_bitonicsort_tb.generator_data[22][23] top.sortnet_bitonicsort_tb.generator_data[22][22] top.sortnet_bitonicsort_tb.generator_data[22][21] top.sortnet_bitonicsort_tb.generator_data[22][20] top.sortnet_bitonicsort_tb.generator_data[22][19] top.sortnet_bitonicsort_tb.generator_data[22][18] top.sortnet_bitonicsort_tb.generator_data[22][17] top.sortnet_bitonicsort_tb.generator_data[22][16] top.sortnet_bitonicsort_tb.generator_data[22][15] top.sortnet_bitonicsort_tb.generator_data[22][14] top.sortnet_bitonicsort_tb.generator_data[22][13] top.sortnet_bitonicsort_tb.generator_data[22][12] top.sortnet_bitonicsort_tb.generator_data[22][11] top.sortnet_bitonicsort_tb.generator_data[22][10] top.sortnet_bitonicsort_tb.generator_data[22][9] top.sortnet_bitonicsort_tb.generator_data[22][8] top.sortnet_bitonicsort_tb.generator_data[22][7] top.sortnet_bitonicsort_tb.generator_data[22][6] top.sortnet_bitonicsort_tb.generator_data[22][5] top.sortnet_bitonicsort_tb.generator_data[22][4] top.sortnet_bitonicsort_tb.generator_data[22][3] top.sortnet_bitonicsort_tb.generator_data[22][2] top.sortnet_bitonicsort_tb.generator_data[22][1] top.sortnet_bitonicsort_tb.generator_data[22][0] -#{top.sortnet_bitonicsort_tb.generator_data[23][31:0]} top.sortnet_bitonicsort_tb.generator_data[23][31] top.sortnet_bitonicsort_tb.generator_data[23][30] top.sortnet_bitonicsort_tb.generator_data[23][29] top.sortnet_bitonicsort_tb.generator_data[23][28] top.sortnet_bitonicsort_tb.generator_data[23][27] top.sortnet_bitonicsort_tb.generator_data[23][26] top.sortnet_bitonicsort_tb.generator_data[23][25] top.sortnet_bitonicsort_tb.generator_data[23][24] top.sortnet_bitonicsort_tb.generator_data[23][23] top.sortnet_bitonicsort_tb.generator_data[23][22] top.sortnet_bitonicsort_tb.generator_data[23][21] top.sortnet_bitonicsort_tb.generator_data[23][20] top.sortnet_bitonicsort_tb.generator_data[23][19] top.sortnet_bitonicsort_tb.generator_data[23][18] top.sortnet_bitonicsort_tb.generator_data[23][17] top.sortnet_bitonicsort_tb.generator_data[23][16] top.sortnet_bitonicsort_tb.generator_data[23][15] top.sortnet_bitonicsort_tb.generator_data[23][14] top.sortnet_bitonicsort_tb.generator_data[23][13] top.sortnet_bitonicsort_tb.generator_data[23][12] top.sortnet_bitonicsort_tb.generator_data[23][11] top.sortnet_bitonicsort_tb.generator_data[23][10] top.sortnet_bitonicsort_tb.generator_data[23][9] top.sortnet_bitonicsort_tb.generator_data[23][8] top.sortnet_bitonicsort_tb.generator_data[23][7] top.sortnet_bitonicsort_tb.generator_data[23][6] top.sortnet_bitonicsort_tb.generator_data[23][5] top.sortnet_bitonicsort_tb.generator_data[23][4] top.sortnet_bitonicsort_tb.generator_data[23][3] top.sortnet_bitonicsort_tb.generator_data[23][2] top.sortnet_bitonicsort_tb.generator_data[23][1] top.sortnet_bitonicsort_tb.generator_data[23][0] -#{top.sortnet_bitonicsort_tb.generator_data[24][31:0]} top.sortnet_bitonicsort_tb.generator_data[24][31] top.sortnet_bitonicsort_tb.generator_data[24][30] top.sortnet_bitonicsort_tb.generator_data[24][29] top.sortnet_bitonicsort_tb.generator_data[24][28] top.sortnet_bitonicsort_tb.generator_data[24][27] top.sortnet_bitonicsort_tb.generator_data[24][26] top.sortnet_bitonicsort_tb.generator_data[24][25] top.sortnet_bitonicsort_tb.generator_data[24][24] top.sortnet_bitonicsort_tb.generator_data[24][23] top.sortnet_bitonicsort_tb.generator_data[24][22] top.sortnet_bitonicsort_tb.generator_data[24][21] top.sortnet_bitonicsort_tb.generator_data[24][20] top.sortnet_bitonicsort_tb.generator_data[24][19] top.sortnet_bitonicsort_tb.generator_data[24][18] top.sortnet_bitonicsort_tb.generator_data[24][17] top.sortnet_bitonicsort_tb.generator_data[24][16] top.sortnet_bitonicsort_tb.generator_data[24][15] top.sortnet_bitonicsort_tb.generator_data[24][14] top.sortnet_bitonicsort_tb.generator_data[24][13] top.sortnet_bitonicsort_tb.generator_data[24][12] top.sortnet_bitonicsort_tb.generator_data[24][11] top.sortnet_bitonicsort_tb.generator_data[24][10] top.sortnet_bitonicsort_tb.generator_data[24][9] top.sortnet_bitonicsort_tb.generator_data[24][8] top.sortnet_bitonicsort_tb.generator_data[24][7] top.sortnet_bitonicsort_tb.generator_data[24][6] top.sortnet_bitonicsort_tb.generator_data[24][5] top.sortnet_bitonicsort_tb.generator_data[24][4] top.sortnet_bitonicsort_tb.generator_data[24][3] top.sortnet_bitonicsort_tb.generator_data[24][2] top.sortnet_bitonicsort_tb.generator_data[24][1] top.sortnet_bitonicsort_tb.generator_data[24][0] -#{top.sortnet_bitonicsort_tb.generator_data[25][31:0]} top.sortnet_bitonicsort_tb.generator_data[25][31] top.sortnet_bitonicsort_tb.generator_data[25][30] top.sortnet_bitonicsort_tb.generator_data[25][29] top.sortnet_bitonicsort_tb.generator_data[25][28] top.sortnet_bitonicsort_tb.generator_data[25][27] top.sortnet_bitonicsort_tb.generator_data[25][26] top.sortnet_bitonicsort_tb.generator_data[25][25] top.sortnet_bitonicsort_tb.generator_data[25][24] top.sortnet_bitonicsort_tb.generator_data[25][23] top.sortnet_bitonicsort_tb.generator_data[25][22] top.sortnet_bitonicsort_tb.generator_data[25][21] top.sortnet_bitonicsort_tb.generator_data[25][20] top.sortnet_bitonicsort_tb.generator_data[25][19] top.sortnet_bitonicsort_tb.generator_data[25][18] top.sortnet_bitonicsort_tb.generator_data[25][17] top.sortnet_bitonicsort_tb.generator_data[25][16] top.sortnet_bitonicsort_tb.generator_data[25][15] top.sortnet_bitonicsort_tb.generator_data[25][14] top.sortnet_bitonicsort_tb.generator_data[25][13] top.sortnet_bitonicsort_tb.generator_data[25][12] top.sortnet_bitonicsort_tb.generator_data[25][11] top.sortnet_bitonicsort_tb.generator_data[25][10] top.sortnet_bitonicsort_tb.generator_data[25][9] top.sortnet_bitonicsort_tb.generator_data[25][8] top.sortnet_bitonicsort_tb.generator_data[25][7] top.sortnet_bitonicsort_tb.generator_data[25][6] top.sortnet_bitonicsort_tb.generator_data[25][5] top.sortnet_bitonicsort_tb.generator_data[25][4] top.sortnet_bitonicsort_tb.generator_data[25][3] top.sortnet_bitonicsort_tb.generator_data[25][2] top.sortnet_bitonicsort_tb.generator_data[25][1] top.sortnet_bitonicsort_tb.generator_data[25][0] -#{top.sortnet_bitonicsort_tb.generator_data[26][31:0]} top.sortnet_bitonicsort_tb.generator_data[26][31] top.sortnet_bitonicsort_tb.generator_data[26][30] top.sortnet_bitonicsort_tb.generator_data[26][29] top.sortnet_bitonicsort_tb.generator_data[26][28] top.sortnet_bitonicsort_tb.generator_data[26][27] top.sortnet_bitonicsort_tb.generator_data[26][26] top.sortnet_bitonicsort_tb.generator_data[26][25] top.sortnet_bitonicsort_tb.generator_data[26][24] top.sortnet_bitonicsort_tb.generator_data[26][23] top.sortnet_bitonicsort_tb.generator_data[26][22] top.sortnet_bitonicsort_tb.generator_data[26][21] top.sortnet_bitonicsort_tb.generator_data[26][20] top.sortnet_bitonicsort_tb.generator_data[26][19] top.sortnet_bitonicsort_tb.generator_data[26][18] top.sortnet_bitonicsort_tb.generator_data[26][17] top.sortnet_bitonicsort_tb.generator_data[26][16] top.sortnet_bitonicsort_tb.generator_data[26][15] top.sortnet_bitonicsort_tb.generator_data[26][14] top.sortnet_bitonicsort_tb.generator_data[26][13] top.sortnet_bitonicsort_tb.generator_data[26][12] top.sortnet_bitonicsort_tb.generator_data[26][11] top.sortnet_bitonicsort_tb.generator_data[26][10] top.sortnet_bitonicsort_tb.generator_data[26][9] top.sortnet_bitonicsort_tb.generator_data[26][8] top.sortnet_bitonicsort_tb.generator_data[26][7] top.sortnet_bitonicsort_tb.generator_data[26][6] top.sortnet_bitonicsort_tb.generator_data[26][5] top.sortnet_bitonicsort_tb.generator_data[26][4] top.sortnet_bitonicsort_tb.generator_data[26][3] top.sortnet_bitonicsort_tb.generator_data[26][2] top.sortnet_bitonicsort_tb.generator_data[26][1] top.sortnet_bitonicsort_tb.generator_data[26][0] -#{top.sortnet_bitonicsort_tb.generator_data[27][31:0]} top.sortnet_bitonicsort_tb.generator_data[27][31] top.sortnet_bitonicsort_tb.generator_data[27][30] top.sortnet_bitonicsort_tb.generator_data[27][29] top.sortnet_bitonicsort_tb.generator_data[27][28] top.sortnet_bitonicsort_tb.generator_data[27][27] top.sortnet_bitonicsort_tb.generator_data[27][26] top.sortnet_bitonicsort_tb.generator_data[27][25] top.sortnet_bitonicsort_tb.generator_data[27][24] top.sortnet_bitonicsort_tb.generator_data[27][23] top.sortnet_bitonicsort_tb.generator_data[27][22] top.sortnet_bitonicsort_tb.generator_data[27][21] top.sortnet_bitonicsort_tb.generator_data[27][20] top.sortnet_bitonicsort_tb.generator_data[27][19] top.sortnet_bitonicsort_tb.generator_data[27][18] top.sortnet_bitonicsort_tb.generator_data[27][17] top.sortnet_bitonicsort_tb.generator_data[27][16] top.sortnet_bitonicsort_tb.generator_data[27][15] top.sortnet_bitonicsort_tb.generator_data[27][14] top.sortnet_bitonicsort_tb.generator_data[27][13] top.sortnet_bitonicsort_tb.generator_data[27][12] top.sortnet_bitonicsort_tb.generator_data[27][11] top.sortnet_bitonicsort_tb.generator_data[27][10] top.sortnet_bitonicsort_tb.generator_data[27][9] top.sortnet_bitonicsort_tb.generator_data[27][8] top.sortnet_bitonicsort_tb.generator_data[27][7] top.sortnet_bitonicsort_tb.generator_data[27][6] top.sortnet_bitonicsort_tb.generator_data[27][5] top.sortnet_bitonicsort_tb.generator_data[27][4] top.sortnet_bitonicsort_tb.generator_data[27][3] top.sortnet_bitonicsort_tb.generator_data[27][2] top.sortnet_bitonicsort_tb.generator_data[27][1] top.sortnet_bitonicsort_tb.generator_data[27][0] -#{top.sortnet_bitonicsort_tb.generator_data[28][31:0]} top.sortnet_bitonicsort_tb.generator_data[28][31] top.sortnet_bitonicsort_tb.generator_data[28][30] top.sortnet_bitonicsort_tb.generator_data[28][29] top.sortnet_bitonicsort_tb.generator_data[28][28] top.sortnet_bitonicsort_tb.generator_data[28][27] top.sortnet_bitonicsort_tb.generator_data[28][26] top.sortnet_bitonicsort_tb.generator_data[28][25] top.sortnet_bitonicsort_tb.generator_data[28][24] top.sortnet_bitonicsort_tb.generator_data[28][23] top.sortnet_bitonicsort_tb.generator_data[28][22] top.sortnet_bitonicsort_tb.generator_data[28][21] top.sortnet_bitonicsort_tb.generator_data[28][20] top.sortnet_bitonicsort_tb.generator_data[28][19] top.sortnet_bitonicsort_tb.generator_data[28][18] top.sortnet_bitonicsort_tb.generator_data[28][17] top.sortnet_bitonicsort_tb.generator_data[28][16] top.sortnet_bitonicsort_tb.generator_data[28][15] top.sortnet_bitonicsort_tb.generator_data[28][14] top.sortnet_bitonicsort_tb.generator_data[28][13] top.sortnet_bitonicsort_tb.generator_data[28][12] top.sortnet_bitonicsort_tb.generator_data[28][11] top.sortnet_bitonicsort_tb.generator_data[28][10] top.sortnet_bitonicsort_tb.generator_data[28][9] top.sortnet_bitonicsort_tb.generator_data[28][8] top.sortnet_bitonicsort_tb.generator_data[28][7] top.sortnet_bitonicsort_tb.generator_data[28][6] top.sortnet_bitonicsort_tb.generator_data[28][5] top.sortnet_bitonicsort_tb.generator_data[28][4] top.sortnet_bitonicsort_tb.generator_data[28][3] top.sortnet_bitonicsort_tb.generator_data[28][2] top.sortnet_bitonicsort_tb.generator_data[28][1] top.sortnet_bitonicsort_tb.generator_data[28][0] -#{top.sortnet_bitonicsort_tb.generator_data[29][31:0]} top.sortnet_bitonicsort_tb.generator_data[29][31] top.sortnet_bitonicsort_tb.generator_data[29][30] top.sortnet_bitonicsort_tb.generator_data[29][29] top.sortnet_bitonicsort_tb.generator_data[29][28] top.sortnet_bitonicsort_tb.generator_data[29][27] top.sortnet_bitonicsort_tb.generator_data[29][26] top.sortnet_bitonicsort_tb.generator_data[29][25] top.sortnet_bitonicsort_tb.generator_data[29][24] top.sortnet_bitonicsort_tb.generator_data[29][23] top.sortnet_bitonicsort_tb.generator_data[29][22] top.sortnet_bitonicsort_tb.generator_data[29][21] top.sortnet_bitonicsort_tb.generator_data[29][20] top.sortnet_bitonicsort_tb.generator_data[29][19] top.sortnet_bitonicsort_tb.generator_data[29][18] top.sortnet_bitonicsort_tb.generator_data[29][17] top.sortnet_bitonicsort_tb.generator_data[29][16] top.sortnet_bitonicsort_tb.generator_data[29][15] top.sortnet_bitonicsort_tb.generator_data[29][14] top.sortnet_bitonicsort_tb.generator_data[29][13] top.sortnet_bitonicsort_tb.generator_data[29][12] top.sortnet_bitonicsort_tb.generator_data[29][11] top.sortnet_bitonicsort_tb.generator_data[29][10] top.sortnet_bitonicsort_tb.generator_data[29][9] top.sortnet_bitonicsort_tb.generator_data[29][8] top.sortnet_bitonicsort_tb.generator_data[29][7] top.sortnet_bitonicsort_tb.generator_data[29][6] top.sortnet_bitonicsort_tb.generator_data[29][5] top.sortnet_bitonicsort_tb.generator_data[29][4] top.sortnet_bitonicsort_tb.generator_data[29][3] top.sortnet_bitonicsort_tb.generator_data[29][2] top.sortnet_bitonicsort_tb.generator_data[29][1] top.sortnet_bitonicsort_tb.generator_data[29][0] -#{top.sortnet_bitonicsort_tb.generator_data[30][31:0]} top.sortnet_bitonicsort_tb.generator_data[30][31] top.sortnet_bitonicsort_tb.generator_data[30][30] top.sortnet_bitonicsort_tb.generator_data[30][29] top.sortnet_bitonicsort_tb.generator_data[30][28] top.sortnet_bitonicsort_tb.generator_data[30][27] top.sortnet_bitonicsort_tb.generator_data[30][26] top.sortnet_bitonicsort_tb.generator_data[30][25] top.sortnet_bitonicsort_tb.generator_data[30][24] top.sortnet_bitonicsort_tb.generator_data[30][23] top.sortnet_bitonicsort_tb.generator_data[30][22] top.sortnet_bitonicsort_tb.generator_data[30][21] top.sortnet_bitonicsort_tb.generator_data[30][20] top.sortnet_bitonicsort_tb.generator_data[30][19] top.sortnet_bitonicsort_tb.generator_data[30][18] top.sortnet_bitonicsort_tb.generator_data[30][17] top.sortnet_bitonicsort_tb.generator_data[30][16] top.sortnet_bitonicsort_tb.generator_data[30][15] top.sortnet_bitonicsort_tb.generator_data[30][14] top.sortnet_bitonicsort_tb.generator_data[30][13] top.sortnet_bitonicsort_tb.generator_data[30][12] top.sortnet_bitonicsort_tb.generator_data[30][11] top.sortnet_bitonicsort_tb.generator_data[30][10] top.sortnet_bitonicsort_tb.generator_data[30][9] top.sortnet_bitonicsort_tb.generator_data[30][8] top.sortnet_bitonicsort_tb.generator_data[30][7] top.sortnet_bitonicsort_tb.generator_data[30][6] top.sortnet_bitonicsort_tb.generator_data[30][5] top.sortnet_bitonicsort_tb.generator_data[30][4] top.sortnet_bitonicsort_tb.generator_data[30][3] top.sortnet_bitonicsort_tb.generator_data[30][2] top.sortnet_bitonicsort_tb.generator_data[30][1] top.sortnet_bitonicsort_tb.generator_data[30][0] -#{top.sortnet_bitonicsort_tb.generator_data[31][31:0]} top.sortnet_bitonicsort_tb.generator_data[31][31] top.sortnet_bitonicsort_tb.generator_data[31][30] top.sortnet_bitonicsort_tb.generator_data[31][29] top.sortnet_bitonicsort_tb.generator_data[31][28] top.sortnet_bitonicsort_tb.generator_data[31][27] top.sortnet_bitonicsort_tb.generator_data[31][26] top.sortnet_bitonicsort_tb.generator_data[31][25] top.sortnet_bitonicsort_tb.generator_data[31][24] top.sortnet_bitonicsort_tb.generator_data[31][23] top.sortnet_bitonicsort_tb.generator_data[31][22] top.sortnet_bitonicsort_tb.generator_data[31][21] top.sortnet_bitonicsort_tb.generator_data[31][20] top.sortnet_bitonicsort_tb.generator_data[31][19] top.sortnet_bitonicsort_tb.generator_data[31][18] top.sortnet_bitonicsort_tb.generator_data[31][17] top.sortnet_bitonicsort_tb.generator_data[31][16] top.sortnet_bitonicsort_tb.generator_data[31][15] top.sortnet_bitonicsort_tb.generator_data[31][14] top.sortnet_bitonicsort_tb.generator_data[31][13] top.sortnet_bitonicsort_tb.generator_data[31][12] top.sortnet_bitonicsort_tb.generator_data[31][11] top.sortnet_bitonicsort_tb.generator_data[31][10] top.sortnet_bitonicsort_tb.generator_data[31][9] top.sortnet_bitonicsort_tb.generator_data[31][8] top.sortnet_bitonicsort_tb.generator_data[31][7] top.sortnet_bitonicsort_tb.generator_data[31][6] top.sortnet_bitonicsort_tb.generator_data[31][5] top.sortnet_bitonicsort_tb.generator_data[31][4] top.sortnet_bitonicsort_tb.generator_data[31][3] top.sortnet_bitonicsort_tb.generator_data[31][2] top.sortnet_bitonicsort_tb.generator_data[31][1] top.sortnet_bitonicsort_tb.generator_data[31][0] -@1000200 --Generator_Data [31:0] -@22 -#{top.sortnet_bitonicsort_tb.generator_meta[3:0]} top.sortnet_bitonicsort_tb.generator_meta[3] top.sortnet_bitonicsort_tb.generator_meta[2] top.sortnet_bitonicsort_tb.generator_meta[1] top.sortnet_bitonicsort_tb.generator_meta[0] -@200 --outputs -@28 -top.sortnet_bitonicsort_tb.sort_valid -top.sortnet_bitonicsort_tb.sort_iskey -@800200 --Sort_Data [31:0] -@23 -#{top.sortnet_bitonicsort_tb.sort_data[0][31:0]} top.sortnet_bitonicsort_tb.sort_data[0][31] top.sortnet_bitonicsort_tb.sort_data[0][30] top.sortnet_bitonicsort_tb.sort_data[0][29] top.sortnet_bitonicsort_tb.sort_data[0][28] top.sortnet_bitonicsort_tb.sort_data[0][27] top.sortnet_bitonicsort_tb.sort_data[0][26] top.sortnet_bitonicsort_tb.sort_data[0][25] top.sortnet_bitonicsort_tb.sort_data[0][24] top.sortnet_bitonicsort_tb.sort_data[0][23] top.sortnet_bitonicsort_tb.sort_data[0][22] top.sortnet_bitonicsort_tb.sort_data[0][21] top.sortnet_bitonicsort_tb.sort_data[0][20] top.sortnet_bitonicsort_tb.sort_data[0][19] top.sortnet_bitonicsort_tb.sort_data[0][18] top.sortnet_bitonicsort_tb.sort_data[0][17] top.sortnet_bitonicsort_tb.sort_data[0][16] top.sortnet_bitonicsort_tb.sort_data[0][15] top.sortnet_bitonicsort_tb.sort_data[0][14] top.sortnet_bitonicsort_tb.sort_data[0][13] top.sortnet_bitonicsort_tb.sort_data[0][12] top.sortnet_bitonicsort_tb.sort_data[0][11] top.sortnet_bitonicsort_tb.sort_data[0][10] top.sortnet_bitonicsort_tb.sort_data[0][9] top.sortnet_bitonicsort_tb.sort_data[0][8] top.sortnet_bitonicsort_tb.sort_data[0][7] top.sortnet_bitonicsort_tb.sort_data[0][6] top.sortnet_bitonicsort_tb.sort_data[0][5] top.sortnet_bitonicsort_tb.sort_data[0][4] top.sortnet_bitonicsort_tb.sort_data[0][3] top.sortnet_bitonicsort_tb.sort_data[0][2] top.sortnet_bitonicsort_tb.sort_data[0][1] top.sortnet_bitonicsort_tb.sort_data[0][0] -#{top.sortnet_bitonicsort_tb.sort_data[1][31:0]} top.sortnet_bitonicsort_tb.sort_data[1][31] top.sortnet_bitonicsort_tb.sort_data[1][30] top.sortnet_bitonicsort_tb.sort_data[1][29] top.sortnet_bitonicsort_tb.sort_data[1][28] top.sortnet_bitonicsort_tb.sort_data[1][27] top.sortnet_bitonicsort_tb.sort_data[1][26] top.sortnet_bitonicsort_tb.sort_data[1][25] top.sortnet_bitonicsort_tb.sort_data[1][24] top.sortnet_bitonicsort_tb.sort_data[1][23] top.sortnet_bitonicsort_tb.sort_data[1][22] top.sortnet_bitonicsort_tb.sort_data[1][21] top.sortnet_bitonicsort_tb.sort_data[1][20] top.sortnet_bitonicsort_tb.sort_data[1][19] top.sortnet_bitonicsort_tb.sort_data[1][18] top.sortnet_bitonicsort_tb.sort_data[1][17] top.sortnet_bitonicsort_tb.sort_data[1][16] top.sortnet_bitonicsort_tb.sort_data[1][15] top.sortnet_bitonicsort_tb.sort_data[1][14] top.sortnet_bitonicsort_tb.sort_data[1][13] top.sortnet_bitonicsort_tb.sort_data[1][12] top.sortnet_bitonicsort_tb.sort_data[1][11] top.sortnet_bitonicsort_tb.sort_data[1][10] top.sortnet_bitonicsort_tb.sort_data[1][9] top.sortnet_bitonicsort_tb.sort_data[1][8] top.sortnet_bitonicsort_tb.sort_data[1][7] top.sortnet_bitonicsort_tb.sort_data[1][6] top.sortnet_bitonicsort_tb.sort_data[1][5] top.sortnet_bitonicsort_tb.sort_data[1][4] top.sortnet_bitonicsort_tb.sort_data[1][3] top.sortnet_bitonicsort_tb.sort_data[1][2] top.sortnet_bitonicsort_tb.sort_data[1][1] top.sortnet_bitonicsort_tb.sort_data[1][0] -#{top.sortnet_bitonicsort_tb.sort_data[2][31:0]} top.sortnet_bitonicsort_tb.sort_data[2][31] top.sortnet_bitonicsort_tb.sort_data[2][30] top.sortnet_bitonicsort_tb.sort_data[2][29] top.sortnet_bitonicsort_tb.sort_data[2][28] top.sortnet_bitonicsort_tb.sort_data[2][27] top.sortnet_bitonicsort_tb.sort_data[2][26] top.sortnet_bitonicsort_tb.sort_data[2][25] top.sortnet_bitonicsort_tb.sort_data[2][24] top.sortnet_bitonicsort_tb.sort_data[2][23] top.sortnet_bitonicsort_tb.sort_data[2][22] top.sortnet_bitonicsort_tb.sort_data[2][21] top.sortnet_bitonicsort_tb.sort_data[2][20] top.sortnet_bitonicsort_tb.sort_data[2][19] top.sortnet_bitonicsort_tb.sort_data[2][18] top.sortnet_bitonicsort_tb.sort_data[2][17] top.sortnet_bitonicsort_tb.sort_data[2][16] top.sortnet_bitonicsort_tb.sort_data[2][15] top.sortnet_bitonicsort_tb.sort_data[2][14] top.sortnet_bitonicsort_tb.sort_data[2][13] top.sortnet_bitonicsort_tb.sort_data[2][12] top.sortnet_bitonicsort_tb.sort_data[2][11] top.sortnet_bitonicsort_tb.sort_data[2][10] top.sortnet_bitonicsort_tb.sort_data[2][9] top.sortnet_bitonicsort_tb.sort_data[2][8] top.sortnet_bitonicsort_tb.sort_data[2][7] top.sortnet_bitonicsort_tb.sort_data[2][6] top.sortnet_bitonicsort_tb.sort_data[2][5] top.sortnet_bitonicsort_tb.sort_data[2][4] top.sortnet_bitonicsort_tb.sort_data[2][3] top.sortnet_bitonicsort_tb.sort_data[2][2] top.sortnet_bitonicsort_tb.sort_data[2][1] top.sortnet_bitonicsort_tb.sort_data[2][0] -#{top.sortnet_bitonicsort_tb.sort_data[3][31:0]} top.sortnet_bitonicsort_tb.sort_data[3][31] top.sortnet_bitonicsort_tb.sort_data[3][30] top.sortnet_bitonicsort_tb.sort_data[3][29] top.sortnet_bitonicsort_tb.sort_data[3][28] top.sortnet_bitonicsort_tb.sort_data[3][27] top.sortnet_bitonicsort_tb.sort_data[3][26] top.sortnet_bitonicsort_tb.sort_data[3][25] top.sortnet_bitonicsort_tb.sort_data[3][24] top.sortnet_bitonicsort_tb.sort_data[3][23] top.sortnet_bitonicsort_tb.sort_data[3][22] top.sortnet_bitonicsort_tb.sort_data[3][21] top.sortnet_bitonicsort_tb.sort_data[3][20] top.sortnet_bitonicsort_tb.sort_data[3][19] top.sortnet_bitonicsort_tb.sort_data[3][18] top.sortnet_bitonicsort_tb.sort_data[3][17] top.sortnet_bitonicsort_tb.sort_data[3][16] top.sortnet_bitonicsort_tb.sort_data[3][15] top.sortnet_bitonicsort_tb.sort_data[3][14] top.sortnet_bitonicsort_tb.sort_data[3][13] top.sortnet_bitonicsort_tb.sort_data[3][12] top.sortnet_bitonicsort_tb.sort_data[3][11] top.sortnet_bitonicsort_tb.sort_data[3][10] top.sortnet_bitonicsort_tb.sort_data[3][9] top.sortnet_bitonicsort_tb.sort_data[3][8] top.sortnet_bitonicsort_tb.sort_data[3][7] top.sortnet_bitonicsort_tb.sort_data[3][6] top.sortnet_bitonicsort_tb.sort_data[3][5] top.sortnet_bitonicsort_tb.sort_data[3][4] top.sortnet_bitonicsort_tb.sort_data[3][3] top.sortnet_bitonicsort_tb.sort_data[3][2] top.sortnet_bitonicsort_tb.sort_data[3][1] top.sortnet_bitonicsort_tb.sort_data[3][0] -#{top.sortnet_bitonicsort_tb.sort_data[28][31:0]} top.sortnet_bitonicsort_tb.sort_data[28][31] top.sortnet_bitonicsort_tb.sort_data[28][30] top.sortnet_bitonicsort_tb.sort_data[28][29] top.sortnet_bitonicsort_tb.sort_data[28][28] top.sortnet_bitonicsort_tb.sort_data[28][27] top.sortnet_bitonicsort_tb.sort_data[28][26] top.sortnet_bitonicsort_tb.sort_data[28][25] top.sortnet_bitonicsort_tb.sort_data[28][24] top.sortnet_bitonicsort_tb.sort_data[28][23] top.sortnet_bitonicsort_tb.sort_data[28][22] top.sortnet_bitonicsort_tb.sort_data[28][21] top.sortnet_bitonicsort_tb.sort_data[28][20] top.sortnet_bitonicsort_tb.sort_data[28][19] top.sortnet_bitonicsort_tb.sort_data[28][18] top.sortnet_bitonicsort_tb.sort_data[28][17] top.sortnet_bitonicsort_tb.sort_data[28][16] top.sortnet_bitonicsort_tb.sort_data[28][15] top.sortnet_bitonicsort_tb.sort_data[28][14] top.sortnet_bitonicsort_tb.sort_data[28][13] top.sortnet_bitonicsort_tb.sort_data[28][12] top.sortnet_bitonicsort_tb.sort_data[28][11] top.sortnet_bitonicsort_tb.sort_data[28][10] top.sortnet_bitonicsort_tb.sort_data[28][9] top.sortnet_bitonicsort_tb.sort_data[28][8] top.sortnet_bitonicsort_tb.sort_data[28][7] top.sortnet_bitonicsort_tb.sort_data[28][6] top.sortnet_bitonicsort_tb.sort_data[28][5] top.sortnet_bitonicsort_tb.sort_data[28][4] top.sortnet_bitonicsort_tb.sort_data[28][3] top.sortnet_bitonicsort_tb.sort_data[28][2] top.sortnet_bitonicsort_tb.sort_data[28][1] top.sortnet_bitonicsort_tb.sort_data[28][0] -#{top.sortnet_bitonicsort_tb.sort_data[29][31:0]} top.sortnet_bitonicsort_tb.sort_data[29][31] top.sortnet_bitonicsort_tb.sort_data[29][30] top.sortnet_bitonicsort_tb.sort_data[29][29] top.sortnet_bitonicsort_tb.sort_data[29][28] top.sortnet_bitonicsort_tb.sort_data[29][27] top.sortnet_bitonicsort_tb.sort_data[29][26] top.sortnet_bitonicsort_tb.sort_data[29][25] top.sortnet_bitonicsort_tb.sort_data[29][24] top.sortnet_bitonicsort_tb.sort_data[29][23] top.sortnet_bitonicsort_tb.sort_data[29][22] top.sortnet_bitonicsort_tb.sort_data[29][21] top.sortnet_bitonicsort_tb.sort_data[29][20] top.sortnet_bitonicsort_tb.sort_data[29][19] top.sortnet_bitonicsort_tb.sort_data[29][18] top.sortnet_bitonicsort_tb.sort_data[29][17] top.sortnet_bitonicsort_tb.sort_data[29][16] top.sortnet_bitonicsort_tb.sort_data[29][15] top.sortnet_bitonicsort_tb.sort_data[29][14] top.sortnet_bitonicsort_tb.sort_data[29][13] top.sortnet_bitonicsort_tb.sort_data[29][12] top.sortnet_bitonicsort_tb.sort_data[29][11] top.sortnet_bitonicsort_tb.sort_data[29][10] top.sortnet_bitonicsort_tb.sort_data[29][9] top.sortnet_bitonicsort_tb.sort_data[29][8] top.sortnet_bitonicsort_tb.sort_data[29][7] top.sortnet_bitonicsort_tb.sort_data[29][6] top.sortnet_bitonicsort_tb.sort_data[29][5] top.sortnet_bitonicsort_tb.sort_data[29][4] top.sortnet_bitonicsort_tb.sort_data[29][3] top.sortnet_bitonicsort_tb.sort_data[29][2] top.sortnet_bitonicsort_tb.sort_data[29][1] top.sortnet_bitonicsort_tb.sort_data[29][0] -#{top.sortnet_bitonicsort_tb.sort_data[30][31:0]} top.sortnet_bitonicsort_tb.sort_data[30][31] top.sortnet_bitonicsort_tb.sort_data[30][30] top.sortnet_bitonicsort_tb.sort_data[30][29] top.sortnet_bitonicsort_tb.sort_data[30][28] top.sortnet_bitonicsort_tb.sort_data[30][27] top.sortnet_bitonicsort_tb.sort_data[30][26] top.sortnet_bitonicsort_tb.sort_data[30][25] top.sortnet_bitonicsort_tb.sort_data[30][24] top.sortnet_bitonicsort_tb.sort_data[30][23] top.sortnet_bitonicsort_tb.sort_data[30][22] top.sortnet_bitonicsort_tb.sort_data[30][21] top.sortnet_bitonicsort_tb.sort_data[30][20] top.sortnet_bitonicsort_tb.sort_data[30][19] top.sortnet_bitonicsort_tb.sort_data[30][18] top.sortnet_bitonicsort_tb.sort_data[30][17] top.sortnet_bitonicsort_tb.sort_data[30][16] top.sortnet_bitonicsort_tb.sort_data[30][15] top.sortnet_bitonicsort_tb.sort_data[30][14] top.sortnet_bitonicsort_tb.sort_data[30][13] top.sortnet_bitonicsort_tb.sort_data[30][12] top.sortnet_bitonicsort_tb.sort_data[30][11] top.sortnet_bitonicsort_tb.sort_data[30][10] top.sortnet_bitonicsort_tb.sort_data[30][9] top.sortnet_bitonicsort_tb.sort_data[30][8] top.sortnet_bitonicsort_tb.sort_data[30][7] top.sortnet_bitonicsort_tb.sort_data[30][6] top.sortnet_bitonicsort_tb.sort_data[30][5] top.sortnet_bitonicsort_tb.sort_data[30][4] top.sortnet_bitonicsort_tb.sort_data[30][3] top.sortnet_bitonicsort_tb.sort_data[30][2] top.sortnet_bitonicsort_tb.sort_data[30][1] top.sortnet_bitonicsort_tb.sort_data[30][0] -#{top.sortnet_bitonicsort_tb.sort_data[31][31:0]} top.sortnet_bitonicsort_tb.sort_data[31][31] top.sortnet_bitonicsort_tb.sort_data[31][30] top.sortnet_bitonicsort_tb.sort_data[31][29] top.sortnet_bitonicsort_tb.sort_data[31][28] top.sortnet_bitonicsort_tb.sort_data[31][27] top.sortnet_bitonicsort_tb.sort_data[31][26] top.sortnet_bitonicsort_tb.sort_data[31][25] top.sortnet_bitonicsort_tb.sort_data[31][24] top.sortnet_bitonicsort_tb.sort_data[31][23] top.sortnet_bitonicsort_tb.sort_data[31][22] top.sortnet_bitonicsort_tb.sort_data[31][21] top.sortnet_bitonicsort_tb.sort_data[31][20] top.sortnet_bitonicsort_tb.sort_data[31][19] top.sortnet_bitonicsort_tb.sort_data[31][18] top.sortnet_bitonicsort_tb.sort_data[31][17] top.sortnet_bitonicsort_tb.sort_data[31][16] top.sortnet_bitonicsort_tb.sort_data[31][15] top.sortnet_bitonicsort_tb.sort_data[31][14] top.sortnet_bitonicsort_tb.sort_data[31][13] top.sortnet_bitonicsort_tb.sort_data[31][12] top.sortnet_bitonicsort_tb.sort_data[31][11] top.sortnet_bitonicsort_tb.sort_data[31][10] top.sortnet_bitonicsort_tb.sort_data[31][9] top.sortnet_bitonicsort_tb.sort_data[31][8] top.sortnet_bitonicsort_tb.sort_data[31][7] top.sortnet_bitonicsort_tb.sort_data[31][6] top.sortnet_bitonicsort_tb.sort_data[31][5] top.sortnet_bitonicsort_tb.sort_data[31][4] top.sortnet_bitonicsort_tb.sort_data[31][3] top.sortnet_bitonicsort_tb.sort_data[31][2] top.sortnet_bitonicsort_tb.sort_data[31][1] top.sortnet_bitonicsort_tb.sort_data[31][0] -@1000200 --Sort_Data [31:0] -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/sort/sortnet/sortnet_BitonicSort_tb.wcfg b/sim/sort/sortnet/sortnet_BitonicSort_tb.wcfg deleted file mode 100644 index a32ba8d0c..000000000 --- a/sim/sort/sortnet/sortnet_BitonicSort_tb.wcfg +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - KeyInputVector[3:0][7:0] - KeyInputVector[3:0][7:0] - UNSIGNEDDECRADIX - - [3][7:0] - KeyInputVector[3][7:0] - UNSIGNEDDECRADIX - - - [2][7:0] - KeyInputVector[2][7:0] - UNSIGNEDDECRADIX - - - [1][7:0] - KeyInputVector[1][7:0] - UNSIGNEDDECRADIX - - - [0][7:0] - KeyInputVector[0][7:0] - UNSIGNEDDECRADIX - - - - KeyOutputVector[3:0][7:0] - KeyOutputVector[3:0][7:0] - UNSIGNEDDECRADIX - - [3][7:0] - KeyOutputVector[3][7:0] - UNSIGNEDDECRADIX - - - [2][7:0] - KeyOutputVector[2][7:0] - UNSIGNEDDECRADIX - - - [1][7:0] - KeyOutputVector[1][7:0] - UNSIGNEDDECRADIX - - - [0][7:0] - KeyOutputVector[0][7:0] - UNSIGNEDDECRADIX - - - - B0 S0 G0 L0 - label - - Greater - Greater - - - INVERSE - INVERSE - - - Switch - Switch - - - NewData0[7:0] - NewData0[7:0] - UNSIGNEDDECRADIX - - - NewData1[7:0] - NewData1[7:0] - UNSIGNEDDECRADIX - - - START_DISTANCE - START_DISTANCE - UNSIGNEDDECRADIX - - - s - s - - - g - g - - - STAGE_INDEX - STAGE_INDEX - - - DISTANCE - DISTANCE - - - - B0 S0 G1 L0 - label - - Greater - Greater - - - INVERSE - INVERSE - - - Switch - Switch - - - NewData0[7:0] - NewData0[7:0] - UNSIGNEDDECRADIX - - - NewData1[7:0] - NewData1[7:0] - UNSIGNEDDECRADIX - - - START_DISTANCE - START_DISTANCE - UNSIGNEDDECRADIX - - - s - s - - - g - g - - - STAGE_INDEX - STAGE_INDEX - - - DISTANCE - DISTANCE - - - - B1 S0 G0 L0 - label - - Greater - Greater - - - INVERSE - INVERSE - - - Switch - Switch - - - NewData0[7:0] - NewData0[7:0] - UNSIGNEDDECRADIX - - - NewData1[7:0] - NewData1[7:0] - UNSIGNEDDECRADIX - - - START_DISTANCE - START_DISTANCE - UNSIGNEDDECRADIX - - - s - s - - - g - g - - - STAGE_INDEX - STAGE_INDEX - - - DISTANCE - DISTANCE - - - diff --git a/sim/sort/sortnet/sortnet_BitonicSort_tb.wdo b/sim/sort/sortnet/sortnet_BitonicSort_tb.wdo deleted file mode 100644 index e51499c21..000000000 --- a/sim/sort/sortnet/sortnet_BitonicSort_tb.wdo +++ /dev/null @@ -1,70 +0,0 @@ -proc _poc_reanalyze {} { - set returnCode [exec -ignorestderr py -3 ../../py/PoC.py -d vsim PoC.sort.sortnet.BitonicSort --analyze --elaborate] - puts "ReturnCode: $returnCode" -} - -proc poc_recompile {} { - _poc_reanalyze - restart -force - puts "DONE" -} - -proc poc_rerun {} { - restart -force - # if xxx exists - # do ../../sim/sort/sortnet/sortnet_BitonicSort_tb.do - # else - do ../../sim/vSim.gui.tcl - puts "DONE" -} - -proc poc_relaunch {} { - _poc_reanalyze - poc_rerun -} - -proc poc_reload_waveform {} { - puts "Not implemented!" - # if xxx exists - # do ../../sim/sort/sortnet/sortnet_BitonicSort_tb.wdo - # else - # do ../../sim/vSim.default.wdo - puts "DONE" -} - -proc poc_save_waveform {} { - puts "Saving waveform settings to 'D:/git/PoC/sim/sort/sortnet/sortnet_BitonicSort_tb.wdo'..." - write format wave -window .main_pane.wave.interior.cs.body.pw.wf D:/git/PoC/sim/sort/sortnet/sortnet_BitonicSort_tb.wdo - puts "DONE" -} - -onerror {resume} -quietly WaveActivateNextPane {} 0 -add wave -noupdate /sortnet_bitonicsort_tb/Clock -add wave -noupdate -divider Generator -add wave -noupdate /sortnet_bitonicsort_tb/Generator_Valid -add wave -noupdate -radix unsigned -radixshowbase 0 /sortnet_bitonicsort_tb/Generator_Meta -add wave -noupdate /sortnet_bitonicsort_tb/Generator_IsKey -add wave -noupdate -radix hexadecimal -childformat {{/sortnet_bitonicsort_tb/Generator_Data(31) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(30) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(29) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(28) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(27) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(26) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(25) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(24) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(23) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(22) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(21) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(20) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(19) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(18) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(17) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(16) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(15) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(14) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(13) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(12) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(11) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(10) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(9) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(8) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(7) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(6) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(5) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(4) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(3) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(2) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(1) -radix hexadecimal} {/sortnet_bitonicsort_tb/Generator_Data(0) -radix hexadecimal}} -radixshowbase 0 -expand -subitemconfig {/sortnet_bitonicsort_tb/Generator_Data(31) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(30) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(29) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(28) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(27) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(26) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(25) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(24) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(23) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(22) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(21) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(20) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(19) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(18) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(17) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(16) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(15) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(14) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(13) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(12) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(11) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(10) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(9) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(8) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(7) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(6) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(5) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(4) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(3) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(2) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(1) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Generator_Data(0) {-radix hexadecimal -radixshowbase 0}} /sortnet_bitonicsort_tb/Generator_Data -add wave -noupdate -divider {SortNet - BitonicSort} -add wave -noupdate /sortnet_bitonicsort_tb/Sort_Valid -add wave -noupdate -radix unsigned /sortnet_bitonicsort_tb/Sort_Meta -add wave -noupdate -radix hexadecimal -childformat {{/sortnet_bitonicsort_tb/Sort_Data(31) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(30) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(29) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(28) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(27) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(26) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(25) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(24) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(23) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(22) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(21) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(20) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(19) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(18) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(17) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(16) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(15) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(14) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(13) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(12) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(11) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(10) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(9) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(8) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(7) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(6) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(5) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(4) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(3) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(2) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(1) -radix hexadecimal} {/sortnet_bitonicsort_tb/Sort_Data(0) -radix hexadecimal}} -radixshowbase 0 -expand -subitemconfig {/sortnet_bitonicsort_tb/Sort_Data(31) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(30) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(29) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(28) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(27) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(26) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(25) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(24) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(23) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(22) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(21) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(20) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(19) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(18) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(17) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(16) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(15) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(14) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(13) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(12) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(11) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(10) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(9) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(8) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(7) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(6) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(5) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(4) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(3) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(2) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(1) {-radix hexadecimal -radixshowbase 0} /sortnet_bitonicsort_tb/Sort_Data(0) {-radix hexadecimal -radixshowbase 0}} /sortnet_bitonicsort_tb/Sort_Data -TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 1} {90205940 fs} 0} -quietly wave cursor active 1 -configure wave -namecolwidth 285 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 -configure wave -gridoffset 0 -configure wave -gridperiod 1 -configure wave -griddelta 40 -configure wave -timeline 0 -configure wave -timelineunits ns -update -WaveRestoreZoom {0 fs} {378 ns} diff --git a/sim/sort/sortnet/sortnet_OddEvenMergeSort_tb.ghdl b/sim/sort/sortnet/sortnet_OddEvenMergeSort_tb.ghdl deleted file mode 100644 index ceea4277e..000000000 --- a/sim/sort/sortnet/sortnet_OddEvenMergeSort_tb.ghdl +++ /dev/null @@ -1,35 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/sortnet_oddevenmergesort_tb/clock -/sortnet_oddevenmergesort_tb/generator_valid -/sortnet_oddevenmergesort_tb/generator_iskey -/sortnet_oddevenmergesort_tb/generator_data -/sortnet_oddevenmergesort_tb/generator_meta -/sortnet_oddevenmergesort_tb/sort_valid -/sortnet_oddevenmergesort_tb/sort_iskey -/sortnet_oddevenmergesort_tb/sort_data -/sortnet_oddevenmergesort_tb/sort_meta -/sortnet_oddevenmergesort_tb/datainputmatrix -/sortnet_oddevenmergesort_tb/dataoutputmatrix -/sortnet_oddevenmergesort_tb/sort/clock -/sortnet_oddevenmergesort_tb/sort/reset -/sortnet_oddevenmergesort_tb/sort/inverse -/sortnet_oddevenmergesort_tb/sort/in_valid -/sortnet_oddevenmergesort_tb/sort/in_iskey -/sortnet_oddevenmergesort_tb/sort/in_data -/sortnet_oddevenmergesort_tb/sort/in_meta -/sortnet_oddevenmergesort_tb/sort/out_valid -/sortnet_oddevenmergesort_tb/sort/out_iskey -/sortnet_oddevenmergesort_tb/sort/out_data -/sortnet_oddevenmergesort_tb/sort/out_meta -/sortnet_oddevenmergesort_tb/sort/in_valid_d -/sortnet_oddevenmergesort_tb/sort/in_iskey_d -/sortnet_oddevenmergesort_tb/sort/in_data_d -/sortnet_oddevenmergesort_tb/sort/in_meta_d -/sortnet_oddevenmergesort_tb/sort/metavector -/sortnet_oddevenmergesort_tb/sort/datamatrix -/sortnet_oddevenmergesort_tb/sort/metaoutputs_d -/sortnet_oddevenmergesort_tb/sort/dataoutputs_d diff --git a/sim/sort/sortnet/sortnet_OddEvenMergeSort_tb.gtkw b/sim/sort/sortnet/sortnet_OddEvenMergeSort_tb.gtkw deleted file mode 100644 index 75e96f7d3..000000000 --- a/sim/sort/sortnet/sortnet_OddEvenMergeSort_tb.gtkw +++ /dev/null @@ -1,64 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.69 (w)1999-2016 BSI -[*] Sun Mar 20 17:06:18 2016 -[*] -[dumpfile_mtime] "Sun Mar 20 17:05:58 2016" -[dumpfile_size] 582043 -[timestart] 0 -[size] 1676 997 -[pos] -1 -1 -*-25.187351 -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 -[treeopen] top. -[treeopen] top.sortnet_oddevenmergesort_tb. -[treeopen] top.sortnet_oddevenmergesort_tb.sort_data. -[sst_width] 197 -[signals_width] 222 -[sst_expanded] 1 -[sst_vpaned_height] 566 -@28 -top.sortnet_oddevenmergesort_tb.clock -top.sortnet_oddevenmergesort_tb.generator_valid -top.sortnet_oddevenmergesort_tb.generator_iskey -@22 -#{top.sortnet_oddevenmergesort_tb.generator_data[0][31:0]} top.sortnet_oddevenmergesort_tb.generator_data[0][31] top.sortnet_oddevenmergesort_tb.generator_data[0][30] top.sortnet_oddevenmergesort_tb.generator_data[0][29] top.sortnet_oddevenmergesort_tb.generator_data[0][28] top.sortnet_oddevenmergesort_tb.generator_data[0][27] top.sortnet_oddevenmergesort_tb.generator_data[0][26] top.sortnet_oddevenmergesort_tb.generator_data[0][25] top.sortnet_oddevenmergesort_tb.generator_data[0][24] top.sortnet_oddevenmergesort_tb.generator_data[0][23] top.sortnet_oddevenmergesort_tb.generator_data[0][22] top.sortnet_oddevenmergesort_tb.generator_data[0][21] top.sortnet_oddevenmergesort_tb.generator_data[0][20] top.sortnet_oddevenmergesort_tb.generator_data[0][19] top.sortnet_oddevenmergesort_tb.generator_data[0][18] top.sortnet_oddevenmergesort_tb.generator_data[0][17] top.sortnet_oddevenmergesort_tb.generator_data[0][16] top.sortnet_oddevenmergesort_tb.generator_data[0][15] top.sortnet_oddevenmergesort_tb.generator_data[0][14] top.sortnet_oddevenmergesort_tb.generator_data[0][13] top.sortnet_oddevenmergesort_tb.generator_data[0][12] top.sortnet_oddevenmergesort_tb.generator_data[0][11] top.sortnet_oddevenmergesort_tb.generator_data[0][10] top.sortnet_oddevenmergesort_tb.generator_data[0][9] top.sortnet_oddevenmergesort_tb.generator_data[0][8] top.sortnet_oddevenmergesort_tb.generator_data[0][7] top.sortnet_oddevenmergesort_tb.generator_data[0][6] top.sortnet_oddevenmergesort_tb.generator_data[0][5] top.sortnet_oddevenmergesort_tb.generator_data[0][4] top.sortnet_oddevenmergesort_tb.generator_data[0][3] top.sortnet_oddevenmergesort_tb.generator_data[0][2] top.sortnet_oddevenmergesort_tb.generator_data[0][1] top.sortnet_oddevenmergesort_tb.generator_data[0][0] -#{top.sortnet_oddevenmergesort_tb.generator_data[1][31:0]} top.sortnet_oddevenmergesort_tb.generator_data[1][31] top.sortnet_oddevenmergesort_tb.generator_data[1][30] top.sortnet_oddevenmergesort_tb.generator_data[1][29] top.sortnet_oddevenmergesort_tb.generator_data[1][28] top.sortnet_oddevenmergesort_tb.generator_data[1][27] top.sortnet_oddevenmergesort_tb.generator_data[1][26] top.sortnet_oddevenmergesort_tb.generator_data[1][25] top.sortnet_oddevenmergesort_tb.generator_data[1][24] top.sortnet_oddevenmergesort_tb.generator_data[1][23] top.sortnet_oddevenmergesort_tb.generator_data[1][22] top.sortnet_oddevenmergesort_tb.generator_data[1][21] top.sortnet_oddevenmergesort_tb.generator_data[1][20] top.sortnet_oddevenmergesort_tb.generator_data[1][19] top.sortnet_oddevenmergesort_tb.generator_data[1][18] top.sortnet_oddevenmergesort_tb.generator_data[1][17] top.sortnet_oddevenmergesort_tb.generator_data[1][16] top.sortnet_oddevenmergesort_tb.generator_data[1][15] top.sortnet_oddevenmergesort_tb.generator_data[1][14] top.sortnet_oddevenmergesort_tb.generator_data[1][13] top.sortnet_oddevenmergesort_tb.generator_data[1][12] top.sortnet_oddevenmergesort_tb.generator_data[1][11] top.sortnet_oddevenmergesort_tb.generator_data[1][10] top.sortnet_oddevenmergesort_tb.generator_data[1][9] top.sortnet_oddevenmergesort_tb.generator_data[1][8] top.sortnet_oddevenmergesort_tb.generator_data[1][7] top.sortnet_oddevenmergesort_tb.generator_data[1][6] top.sortnet_oddevenmergesort_tb.generator_data[1][5] top.sortnet_oddevenmergesort_tb.generator_data[1][4] top.sortnet_oddevenmergesort_tb.generator_data[1][3] top.sortnet_oddevenmergesort_tb.generator_data[1][2] top.sortnet_oddevenmergesort_tb.generator_data[1][1] top.sortnet_oddevenmergesort_tb.generator_data[1][0] -#{top.sortnet_oddevenmergesort_tb.generator_data[2][31:0]} top.sortnet_oddevenmergesort_tb.generator_data[2][31] top.sortnet_oddevenmergesort_tb.generator_data[2][30] top.sortnet_oddevenmergesort_tb.generator_data[2][29] top.sortnet_oddevenmergesort_tb.generator_data[2][28] top.sortnet_oddevenmergesort_tb.generator_data[2][27] top.sortnet_oddevenmergesort_tb.generator_data[2][26] top.sortnet_oddevenmergesort_tb.generator_data[2][25] top.sortnet_oddevenmergesort_tb.generator_data[2][24] top.sortnet_oddevenmergesort_tb.generator_data[2][23] top.sortnet_oddevenmergesort_tb.generator_data[2][22] top.sortnet_oddevenmergesort_tb.generator_data[2][21] top.sortnet_oddevenmergesort_tb.generator_data[2][20] top.sortnet_oddevenmergesort_tb.generator_data[2][19] top.sortnet_oddevenmergesort_tb.generator_data[2][18] top.sortnet_oddevenmergesort_tb.generator_data[2][17] top.sortnet_oddevenmergesort_tb.generator_data[2][16] top.sortnet_oddevenmergesort_tb.generator_data[2][15] top.sortnet_oddevenmergesort_tb.generator_data[2][14] top.sortnet_oddevenmergesort_tb.generator_data[2][13] top.sortnet_oddevenmergesort_tb.generator_data[2][12] top.sortnet_oddevenmergesort_tb.generator_data[2][11] top.sortnet_oddevenmergesort_tb.generator_data[2][10] top.sortnet_oddevenmergesort_tb.generator_data[2][9] top.sortnet_oddevenmergesort_tb.generator_data[2][8] top.sortnet_oddevenmergesort_tb.generator_data[2][7] top.sortnet_oddevenmergesort_tb.generator_data[2][6] top.sortnet_oddevenmergesort_tb.generator_data[2][5] top.sortnet_oddevenmergesort_tb.generator_data[2][4] top.sortnet_oddevenmergesort_tb.generator_data[2][3] top.sortnet_oddevenmergesort_tb.generator_data[2][2] top.sortnet_oddevenmergesort_tb.generator_data[2][1] top.sortnet_oddevenmergesort_tb.generator_data[2][0] -#{top.sortnet_oddevenmergesort_tb.generator_data[3][31:0]} top.sortnet_oddevenmergesort_tb.generator_data[3][31] top.sortnet_oddevenmergesort_tb.generator_data[3][30] top.sortnet_oddevenmergesort_tb.generator_data[3][29] top.sortnet_oddevenmergesort_tb.generator_data[3][28] top.sortnet_oddevenmergesort_tb.generator_data[3][27] top.sortnet_oddevenmergesort_tb.generator_data[3][26] top.sortnet_oddevenmergesort_tb.generator_data[3][25] top.sortnet_oddevenmergesort_tb.generator_data[3][24] top.sortnet_oddevenmergesort_tb.generator_data[3][23] top.sortnet_oddevenmergesort_tb.generator_data[3][22] top.sortnet_oddevenmergesort_tb.generator_data[3][21] top.sortnet_oddevenmergesort_tb.generator_data[3][20] top.sortnet_oddevenmergesort_tb.generator_data[3][19] top.sortnet_oddevenmergesort_tb.generator_data[3][18] top.sortnet_oddevenmergesort_tb.generator_data[3][17] top.sortnet_oddevenmergesort_tb.generator_data[3][16] top.sortnet_oddevenmergesort_tb.generator_data[3][15] top.sortnet_oddevenmergesort_tb.generator_data[3][14] top.sortnet_oddevenmergesort_tb.generator_data[3][13] top.sortnet_oddevenmergesort_tb.generator_data[3][12] top.sortnet_oddevenmergesort_tb.generator_data[3][11] top.sortnet_oddevenmergesort_tb.generator_data[3][10] top.sortnet_oddevenmergesort_tb.generator_data[3][9] top.sortnet_oddevenmergesort_tb.generator_data[3][8] top.sortnet_oddevenmergesort_tb.generator_data[3][7] top.sortnet_oddevenmergesort_tb.generator_data[3][6] top.sortnet_oddevenmergesort_tb.generator_data[3][5] top.sortnet_oddevenmergesort_tb.generator_data[3][4] top.sortnet_oddevenmergesort_tb.generator_data[3][3] top.sortnet_oddevenmergesort_tb.generator_data[3][2] top.sortnet_oddevenmergesort_tb.generator_data[3][1] top.sortnet_oddevenmergesort_tb.generator_data[3][0] -@28 -top.sortnet_oddevenmergesort_tb.sort_valid -top.sortnet_oddevenmergesort_tb.sort_iskey -@23 -#{top.sortnet_oddevenmergesort_tb.sort_data[0][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[0][31] top.sortnet_oddevenmergesort_tb.sort_data[0][30] top.sortnet_oddevenmergesort_tb.sort_data[0][29] top.sortnet_oddevenmergesort_tb.sort_data[0][28] top.sortnet_oddevenmergesort_tb.sort_data[0][27] top.sortnet_oddevenmergesort_tb.sort_data[0][26] top.sortnet_oddevenmergesort_tb.sort_data[0][25] top.sortnet_oddevenmergesort_tb.sort_data[0][24] top.sortnet_oddevenmergesort_tb.sort_data[0][23] top.sortnet_oddevenmergesort_tb.sort_data[0][22] top.sortnet_oddevenmergesort_tb.sort_data[0][21] top.sortnet_oddevenmergesort_tb.sort_data[0][20] top.sortnet_oddevenmergesort_tb.sort_data[0][19] top.sortnet_oddevenmergesort_tb.sort_data[0][18] top.sortnet_oddevenmergesort_tb.sort_data[0][17] top.sortnet_oddevenmergesort_tb.sort_data[0][16] top.sortnet_oddevenmergesort_tb.sort_data[0][15] top.sortnet_oddevenmergesort_tb.sort_data[0][14] top.sortnet_oddevenmergesort_tb.sort_data[0][13] top.sortnet_oddevenmergesort_tb.sort_data[0][12] top.sortnet_oddevenmergesort_tb.sort_data[0][11] top.sortnet_oddevenmergesort_tb.sort_data[0][10] top.sortnet_oddevenmergesort_tb.sort_data[0][9] top.sortnet_oddevenmergesort_tb.sort_data[0][8] top.sortnet_oddevenmergesort_tb.sort_data[0][7] top.sortnet_oddevenmergesort_tb.sort_data[0][6] top.sortnet_oddevenmergesort_tb.sort_data[0][5] top.sortnet_oddevenmergesort_tb.sort_data[0][4] top.sortnet_oddevenmergesort_tb.sort_data[0][3] top.sortnet_oddevenmergesort_tb.sort_data[0][2] top.sortnet_oddevenmergesort_tb.sort_data[0][1] top.sortnet_oddevenmergesort_tb.sort_data[0][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[1][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[1][31] top.sortnet_oddevenmergesort_tb.sort_data[1][30] top.sortnet_oddevenmergesort_tb.sort_data[1][29] top.sortnet_oddevenmergesort_tb.sort_data[1][28] top.sortnet_oddevenmergesort_tb.sort_data[1][27] top.sortnet_oddevenmergesort_tb.sort_data[1][26] top.sortnet_oddevenmergesort_tb.sort_data[1][25] top.sortnet_oddevenmergesort_tb.sort_data[1][24] top.sortnet_oddevenmergesort_tb.sort_data[1][23] top.sortnet_oddevenmergesort_tb.sort_data[1][22] top.sortnet_oddevenmergesort_tb.sort_data[1][21] top.sortnet_oddevenmergesort_tb.sort_data[1][20] top.sortnet_oddevenmergesort_tb.sort_data[1][19] top.sortnet_oddevenmergesort_tb.sort_data[1][18] top.sortnet_oddevenmergesort_tb.sort_data[1][17] top.sortnet_oddevenmergesort_tb.sort_data[1][16] top.sortnet_oddevenmergesort_tb.sort_data[1][15] top.sortnet_oddevenmergesort_tb.sort_data[1][14] top.sortnet_oddevenmergesort_tb.sort_data[1][13] top.sortnet_oddevenmergesort_tb.sort_data[1][12] top.sortnet_oddevenmergesort_tb.sort_data[1][11] top.sortnet_oddevenmergesort_tb.sort_data[1][10] top.sortnet_oddevenmergesort_tb.sort_data[1][9] top.sortnet_oddevenmergesort_tb.sort_data[1][8] top.sortnet_oddevenmergesort_tb.sort_data[1][7] top.sortnet_oddevenmergesort_tb.sort_data[1][6] top.sortnet_oddevenmergesort_tb.sort_data[1][5] top.sortnet_oddevenmergesort_tb.sort_data[1][4] top.sortnet_oddevenmergesort_tb.sort_data[1][3] top.sortnet_oddevenmergesort_tb.sort_data[1][2] top.sortnet_oddevenmergesort_tb.sort_data[1][1] top.sortnet_oddevenmergesort_tb.sort_data[1][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[2][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[2][31] top.sortnet_oddevenmergesort_tb.sort_data[2][30] top.sortnet_oddevenmergesort_tb.sort_data[2][29] top.sortnet_oddevenmergesort_tb.sort_data[2][28] top.sortnet_oddevenmergesort_tb.sort_data[2][27] top.sortnet_oddevenmergesort_tb.sort_data[2][26] top.sortnet_oddevenmergesort_tb.sort_data[2][25] top.sortnet_oddevenmergesort_tb.sort_data[2][24] top.sortnet_oddevenmergesort_tb.sort_data[2][23] top.sortnet_oddevenmergesort_tb.sort_data[2][22] top.sortnet_oddevenmergesort_tb.sort_data[2][21] top.sortnet_oddevenmergesort_tb.sort_data[2][20] top.sortnet_oddevenmergesort_tb.sort_data[2][19] top.sortnet_oddevenmergesort_tb.sort_data[2][18] top.sortnet_oddevenmergesort_tb.sort_data[2][17] top.sortnet_oddevenmergesort_tb.sort_data[2][16] top.sortnet_oddevenmergesort_tb.sort_data[2][15] top.sortnet_oddevenmergesort_tb.sort_data[2][14] top.sortnet_oddevenmergesort_tb.sort_data[2][13] top.sortnet_oddevenmergesort_tb.sort_data[2][12] top.sortnet_oddevenmergesort_tb.sort_data[2][11] top.sortnet_oddevenmergesort_tb.sort_data[2][10] top.sortnet_oddevenmergesort_tb.sort_data[2][9] top.sortnet_oddevenmergesort_tb.sort_data[2][8] top.sortnet_oddevenmergesort_tb.sort_data[2][7] top.sortnet_oddevenmergesort_tb.sort_data[2][6] top.sortnet_oddevenmergesort_tb.sort_data[2][5] top.sortnet_oddevenmergesort_tb.sort_data[2][4] top.sortnet_oddevenmergesort_tb.sort_data[2][3] top.sortnet_oddevenmergesort_tb.sort_data[2][2] top.sortnet_oddevenmergesort_tb.sort_data[2][1] top.sortnet_oddevenmergesort_tb.sort_data[2][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[3][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[3][31] top.sortnet_oddevenmergesort_tb.sort_data[3][30] top.sortnet_oddevenmergesort_tb.sort_data[3][29] top.sortnet_oddevenmergesort_tb.sort_data[3][28] top.sortnet_oddevenmergesort_tb.sort_data[3][27] top.sortnet_oddevenmergesort_tb.sort_data[3][26] top.sortnet_oddevenmergesort_tb.sort_data[3][25] top.sortnet_oddevenmergesort_tb.sort_data[3][24] top.sortnet_oddevenmergesort_tb.sort_data[3][23] top.sortnet_oddevenmergesort_tb.sort_data[3][22] top.sortnet_oddevenmergesort_tb.sort_data[3][21] top.sortnet_oddevenmergesort_tb.sort_data[3][20] top.sortnet_oddevenmergesort_tb.sort_data[3][19] top.sortnet_oddevenmergesort_tb.sort_data[3][18] top.sortnet_oddevenmergesort_tb.sort_data[3][17] top.sortnet_oddevenmergesort_tb.sort_data[3][16] top.sortnet_oddevenmergesort_tb.sort_data[3][15] top.sortnet_oddevenmergesort_tb.sort_data[3][14] top.sortnet_oddevenmergesort_tb.sort_data[3][13] top.sortnet_oddevenmergesort_tb.sort_data[3][12] top.sortnet_oddevenmergesort_tb.sort_data[3][11] top.sortnet_oddevenmergesort_tb.sort_data[3][10] top.sortnet_oddevenmergesort_tb.sort_data[3][9] top.sortnet_oddevenmergesort_tb.sort_data[3][8] top.sortnet_oddevenmergesort_tb.sort_data[3][7] top.sortnet_oddevenmergesort_tb.sort_data[3][6] top.sortnet_oddevenmergesort_tb.sort_data[3][5] top.sortnet_oddevenmergesort_tb.sort_data[3][4] top.sortnet_oddevenmergesort_tb.sort_data[3][3] top.sortnet_oddevenmergesort_tb.sort_data[3][2] top.sortnet_oddevenmergesort_tb.sort_data[3][1] top.sortnet_oddevenmergesort_tb.sort_data[3][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[4][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[4][31] top.sortnet_oddevenmergesort_tb.sort_data[4][30] top.sortnet_oddevenmergesort_tb.sort_data[4][29] top.sortnet_oddevenmergesort_tb.sort_data[4][28] top.sortnet_oddevenmergesort_tb.sort_data[4][27] top.sortnet_oddevenmergesort_tb.sort_data[4][26] top.sortnet_oddevenmergesort_tb.sort_data[4][25] top.sortnet_oddevenmergesort_tb.sort_data[4][24] top.sortnet_oddevenmergesort_tb.sort_data[4][23] top.sortnet_oddevenmergesort_tb.sort_data[4][22] top.sortnet_oddevenmergesort_tb.sort_data[4][21] top.sortnet_oddevenmergesort_tb.sort_data[4][20] top.sortnet_oddevenmergesort_tb.sort_data[4][19] top.sortnet_oddevenmergesort_tb.sort_data[4][18] top.sortnet_oddevenmergesort_tb.sort_data[4][17] top.sortnet_oddevenmergesort_tb.sort_data[4][16] top.sortnet_oddevenmergesort_tb.sort_data[4][15] top.sortnet_oddevenmergesort_tb.sort_data[4][14] top.sortnet_oddevenmergesort_tb.sort_data[4][13] top.sortnet_oddevenmergesort_tb.sort_data[4][12] top.sortnet_oddevenmergesort_tb.sort_data[4][11] top.sortnet_oddevenmergesort_tb.sort_data[4][10] top.sortnet_oddevenmergesort_tb.sort_data[4][9] top.sortnet_oddevenmergesort_tb.sort_data[4][8] top.sortnet_oddevenmergesort_tb.sort_data[4][7] top.sortnet_oddevenmergesort_tb.sort_data[4][6] top.sortnet_oddevenmergesort_tb.sort_data[4][5] top.sortnet_oddevenmergesort_tb.sort_data[4][4] top.sortnet_oddevenmergesort_tb.sort_data[4][3] top.sortnet_oddevenmergesort_tb.sort_data[4][2] top.sortnet_oddevenmergesort_tb.sort_data[4][1] top.sortnet_oddevenmergesort_tb.sort_data[4][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[5][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[5][31] top.sortnet_oddevenmergesort_tb.sort_data[5][30] top.sortnet_oddevenmergesort_tb.sort_data[5][29] top.sortnet_oddevenmergesort_tb.sort_data[5][28] top.sortnet_oddevenmergesort_tb.sort_data[5][27] top.sortnet_oddevenmergesort_tb.sort_data[5][26] top.sortnet_oddevenmergesort_tb.sort_data[5][25] top.sortnet_oddevenmergesort_tb.sort_data[5][24] top.sortnet_oddevenmergesort_tb.sort_data[5][23] top.sortnet_oddevenmergesort_tb.sort_data[5][22] top.sortnet_oddevenmergesort_tb.sort_data[5][21] top.sortnet_oddevenmergesort_tb.sort_data[5][20] top.sortnet_oddevenmergesort_tb.sort_data[5][19] top.sortnet_oddevenmergesort_tb.sort_data[5][18] top.sortnet_oddevenmergesort_tb.sort_data[5][17] top.sortnet_oddevenmergesort_tb.sort_data[5][16] top.sortnet_oddevenmergesort_tb.sort_data[5][15] top.sortnet_oddevenmergesort_tb.sort_data[5][14] top.sortnet_oddevenmergesort_tb.sort_data[5][13] top.sortnet_oddevenmergesort_tb.sort_data[5][12] top.sortnet_oddevenmergesort_tb.sort_data[5][11] top.sortnet_oddevenmergesort_tb.sort_data[5][10] top.sortnet_oddevenmergesort_tb.sort_data[5][9] top.sortnet_oddevenmergesort_tb.sort_data[5][8] top.sortnet_oddevenmergesort_tb.sort_data[5][7] top.sortnet_oddevenmergesort_tb.sort_data[5][6] top.sortnet_oddevenmergesort_tb.sort_data[5][5] top.sortnet_oddevenmergesort_tb.sort_data[5][4] top.sortnet_oddevenmergesort_tb.sort_data[5][3] top.sortnet_oddevenmergesort_tb.sort_data[5][2] top.sortnet_oddevenmergesort_tb.sort_data[5][1] top.sortnet_oddevenmergesort_tb.sort_data[5][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[6][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[6][31] top.sortnet_oddevenmergesort_tb.sort_data[6][30] top.sortnet_oddevenmergesort_tb.sort_data[6][29] top.sortnet_oddevenmergesort_tb.sort_data[6][28] top.sortnet_oddevenmergesort_tb.sort_data[6][27] top.sortnet_oddevenmergesort_tb.sort_data[6][26] top.sortnet_oddevenmergesort_tb.sort_data[6][25] top.sortnet_oddevenmergesort_tb.sort_data[6][24] top.sortnet_oddevenmergesort_tb.sort_data[6][23] top.sortnet_oddevenmergesort_tb.sort_data[6][22] top.sortnet_oddevenmergesort_tb.sort_data[6][21] top.sortnet_oddevenmergesort_tb.sort_data[6][20] top.sortnet_oddevenmergesort_tb.sort_data[6][19] top.sortnet_oddevenmergesort_tb.sort_data[6][18] top.sortnet_oddevenmergesort_tb.sort_data[6][17] top.sortnet_oddevenmergesort_tb.sort_data[6][16] top.sortnet_oddevenmergesort_tb.sort_data[6][15] top.sortnet_oddevenmergesort_tb.sort_data[6][14] top.sortnet_oddevenmergesort_tb.sort_data[6][13] top.sortnet_oddevenmergesort_tb.sort_data[6][12] top.sortnet_oddevenmergesort_tb.sort_data[6][11] top.sortnet_oddevenmergesort_tb.sort_data[6][10] top.sortnet_oddevenmergesort_tb.sort_data[6][9] top.sortnet_oddevenmergesort_tb.sort_data[6][8] top.sortnet_oddevenmergesort_tb.sort_data[6][7] top.sortnet_oddevenmergesort_tb.sort_data[6][6] top.sortnet_oddevenmergesort_tb.sort_data[6][5] top.sortnet_oddevenmergesort_tb.sort_data[6][4] top.sortnet_oddevenmergesort_tb.sort_data[6][3] top.sortnet_oddevenmergesort_tb.sort_data[6][2] top.sortnet_oddevenmergesort_tb.sort_data[6][1] top.sortnet_oddevenmergesort_tb.sort_data[6][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[7][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[7][31] top.sortnet_oddevenmergesort_tb.sort_data[7][30] top.sortnet_oddevenmergesort_tb.sort_data[7][29] top.sortnet_oddevenmergesort_tb.sort_data[7][28] top.sortnet_oddevenmergesort_tb.sort_data[7][27] top.sortnet_oddevenmergesort_tb.sort_data[7][26] top.sortnet_oddevenmergesort_tb.sort_data[7][25] top.sortnet_oddevenmergesort_tb.sort_data[7][24] top.sortnet_oddevenmergesort_tb.sort_data[7][23] top.sortnet_oddevenmergesort_tb.sort_data[7][22] top.sortnet_oddevenmergesort_tb.sort_data[7][21] top.sortnet_oddevenmergesort_tb.sort_data[7][20] top.sortnet_oddevenmergesort_tb.sort_data[7][19] top.sortnet_oddevenmergesort_tb.sort_data[7][18] top.sortnet_oddevenmergesort_tb.sort_data[7][17] top.sortnet_oddevenmergesort_tb.sort_data[7][16] top.sortnet_oddevenmergesort_tb.sort_data[7][15] top.sortnet_oddevenmergesort_tb.sort_data[7][14] top.sortnet_oddevenmergesort_tb.sort_data[7][13] top.sortnet_oddevenmergesort_tb.sort_data[7][12] top.sortnet_oddevenmergesort_tb.sort_data[7][11] top.sortnet_oddevenmergesort_tb.sort_data[7][10] top.sortnet_oddevenmergesort_tb.sort_data[7][9] top.sortnet_oddevenmergesort_tb.sort_data[7][8] top.sortnet_oddevenmergesort_tb.sort_data[7][7] top.sortnet_oddevenmergesort_tb.sort_data[7][6] top.sortnet_oddevenmergesort_tb.sort_data[7][5] top.sortnet_oddevenmergesort_tb.sort_data[7][4] top.sortnet_oddevenmergesort_tb.sort_data[7][3] top.sortnet_oddevenmergesort_tb.sort_data[7][2] top.sortnet_oddevenmergesort_tb.sort_data[7][1] top.sortnet_oddevenmergesort_tb.sort_data[7][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[8][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[8][31] top.sortnet_oddevenmergesort_tb.sort_data[8][30] top.sortnet_oddevenmergesort_tb.sort_data[8][29] top.sortnet_oddevenmergesort_tb.sort_data[8][28] top.sortnet_oddevenmergesort_tb.sort_data[8][27] top.sortnet_oddevenmergesort_tb.sort_data[8][26] top.sortnet_oddevenmergesort_tb.sort_data[8][25] top.sortnet_oddevenmergesort_tb.sort_data[8][24] top.sortnet_oddevenmergesort_tb.sort_data[8][23] top.sortnet_oddevenmergesort_tb.sort_data[8][22] top.sortnet_oddevenmergesort_tb.sort_data[8][21] top.sortnet_oddevenmergesort_tb.sort_data[8][20] top.sortnet_oddevenmergesort_tb.sort_data[8][19] top.sortnet_oddevenmergesort_tb.sort_data[8][18] top.sortnet_oddevenmergesort_tb.sort_data[8][17] top.sortnet_oddevenmergesort_tb.sort_data[8][16] top.sortnet_oddevenmergesort_tb.sort_data[8][15] top.sortnet_oddevenmergesort_tb.sort_data[8][14] top.sortnet_oddevenmergesort_tb.sort_data[8][13] top.sortnet_oddevenmergesort_tb.sort_data[8][12] top.sortnet_oddevenmergesort_tb.sort_data[8][11] top.sortnet_oddevenmergesort_tb.sort_data[8][10] top.sortnet_oddevenmergesort_tb.sort_data[8][9] top.sortnet_oddevenmergesort_tb.sort_data[8][8] top.sortnet_oddevenmergesort_tb.sort_data[8][7] top.sortnet_oddevenmergesort_tb.sort_data[8][6] top.sortnet_oddevenmergesort_tb.sort_data[8][5] top.sortnet_oddevenmergesort_tb.sort_data[8][4] top.sortnet_oddevenmergesort_tb.sort_data[8][3] top.sortnet_oddevenmergesort_tb.sort_data[8][2] top.sortnet_oddevenmergesort_tb.sort_data[8][1] top.sortnet_oddevenmergesort_tb.sort_data[8][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[9][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[9][31] top.sortnet_oddevenmergesort_tb.sort_data[9][30] top.sortnet_oddevenmergesort_tb.sort_data[9][29] top.sortnet_oddevenmergesort_tb.sort_data[9][28] top.sortnet_oddevenmergesort_tb.sort_data[9][27] top.sortnet_oddevenmergesort_tb.sort_data[9][26] top.sortnet_oddevenmergesort_tb.sort_data[9][25] top.sortnet_oddevenmergesort_tb.sort_data[9][24] top.sortnet_oddevenmergesort_tb.sort_data[9][23] top.sortnet_oddevenmergesort_tb.sort_data[9][22] top.sortnet_oddevenmergesort_tb.sort_data[9][21] top.sortnet_oddevenmergesort_tb.sort_data[9][20] top.sortnet_oddevenmergesort_tb.sort_data[9][19] top.sortnet_oddevenmergesort_tb.sort_data[9][18] top.sortnet_oddevenmergesort_tb.sort_data[9][17] top.sortnet_oddevenmergesort_tb.sort_data[9][16] top.sortnet_oddevenmergesort_tb.sort_data[9][15] top.sortnet_oddevenmergesort_tb.sort_data[9][14] top.sortnet_oddevenmergesort_tb.sort_data[9][13] top.sortnet_oddevenmergesort_tb.sort_data[9][12] top.sortnet_oddevenmergesort_tb.sort_data[9][11] top.sortnet_oddevenmergesort_tb.sort_data[9][10] top.sortnet_oddevenmergesort_tb.sort_data[9][9] top.sortnet_oddevenmergesort_tb.sort_data[9][8] top.sortnet_oddevenmergesort_tb.sort_data[9][7] top.sortnet_oddevenmergesort_tb.sort_data[9][6] top.sortnet_oddevenmergesort_tb.sort_data[9][5] top.sortnet_oddevenmergesort_tb.sort_data[9][4] top.sortnet_oddevenmergesort_tb.sort_data[9][3] top.sortnet_oddevenmergesort_tb.sort_data[9][2] top.sortnet_oddevenmergesort_tb.sort_data[9][1] top.sortnet_oddevenmergesort_tb.sort_data[9][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[10][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[10][31] top.sortnet_oddevenmergesort_tb.sort_data[10][30] top.sortnet_oddevenmergesort_tb.sort_data[10][29] top.sortnet_oddevenmergesort_tb.sort_data[10][28] top.sortnet_oddevenmergesort_tb.sort_data[10][27] top.sortnet_oddevenmergesort_tb.sort_data[10][26] top.sortnet_oddevenmergesort_tb.sort_data[10][25] top.sortnet_oddevenmergesort_tb.sort_data[10][24] top.sortnet_oddevenmergesort_tb.sort_data[10][23] top.sortnet_oddevenmergesort_tb.sort_data[10][22] top.sortnet_oddevenmergesort_tb.sort_data[10][21] top.sortnet_oddevenmergesort_tb.sort_data[10][20] top.sortnet_oddevenmergesort_tb.sort_data[10][19] top.sortnet_oddevenmergesort_tb.sort_data[10][18] top.sortnet_oddevenmergesort_tb.sort_data[10][17] top.sortnet_oddevenmergesort_tb.sort_data[10][16] top.sortnet_oddevenmergesort_tb.sort_data[10][15] top.sortnet_oddevenmergesort_tb.sort_data[10][14] top.sortnet_oddevenmergesort_tb.sort_data[10][13] top.sortnet_oddevenmergesort_tb.sort_data[10][12] top.sortnet_oddevenmergesort_tb.sort_data[10][11] top.sortnet_oddevenmergesort_tb.sort_data[10][10] top.sortnet_oddevenmergesort_tb.sort_data[10][9] top.sortnet_oddevenmergesort_tb.sort_data[10][8] top.sortnet_oddevenmergesort_tb.sort_data[10][7] top.sortnet_oddevenmergesort_tb.sort_data[10][6] top.sortnet_oddevenmergesort_tb.sort_data[10][5] top.sortnet_oddevenmergesort_tb.sort_data[10][4] top.sortnet_oddevenmergesort_tb.sort_data[10][3] top.sortnet_oddevenmergesort_tb.sort_data[10][2] top.sortnet_oddevenmergesort_tb.sort_data[10][1] top.sortnet_oddevenmergesort_tb.sort_data[10][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[11][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[11][31] top.sortnet_oddevenmergesort_tb.sort_data[11][30] top.sortnet_oddevenmergesort_tb.sort_data[11][29] top.sortnet_oddevenmergesort_tb.sort_data[11][28] top.sortnet_oddevenmergesort_tb.sort_data[11][27] top.sortnet_oddevenmergesort_tb.sort_data[11][26] top.sortnet_oddevenmergesort_tb.sort_data[11][25] top.sortnet_oddevenmergesort_tb.sort_data[11][24] top.sortnet_oddevenmergesort_tb.sort_data[11][23] top.sortnet_oddevenmergesort_tb.sort_data[11][22] top.sortnet_oddevenmergesort_tb.sort_data[11][21] top.sortnet_oddevenmergesort_tb.sort_data[11][20] top.sortnet_oddevenmergesort_tb.sort_data[11][19] top.sortnet_oddevenmergesort_tb.sort_data[11][18] top.sortnet_oddevenmergesort_tb.sort_data[11][17] top.sortnet_oddevenmergesort_tb.sort_data[11][16] top.sortnet_oddevenmergesort_tb.sort_data[11][15] top.sortnet_oddevenmergesort_tb.sort_data[11][14] top.sortnet_oddevenmergesort_tb.sort_data[11][13] top.sortnet_oddevenmergesort_tb.sort_data[11][12] top.sortnet_oddevenmergesort_tb.sort_data[11][11] top.sortnet_oddevenmergesort_tb.sort_data[11][10] top.sortnet_oddevenmergesort_tb.sort_data[11][9] top.sortnet_oddevenmergesort_tb.sort_data[11][8] top.sortnet_oddevenmergesort_tb.sort_data[11][7] top.sortnet_oddevenmergesort_tb.sort_data[11][6] top.sortnet_oddevenmergesort_tb.sort_data[11][5] top.sortnet_oddevenmergesort_tb.sort_data[11][4] top.sortnet_oddevenmergesort_tb.sort_data[11][3] top.sortnet_oddevenmergesort_tb.sort_data[11][2] top.sortnet_oddevenmergesort_tb.sort_data[11][1] top.sortnet_oddevenmergesort_tb.sort_data[11][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[12][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[12][31] top.sortnet_oddevenmergesort_tb.sort_data[12][30] top.sortnet_oddevenmergesort_tb.sort_data[12][29] top.sortnet_oddevenmergesort_tb.sort_data[12][28] top.sortnet_oddevenmergesort_tb.sort_data[12][27] top.sortnet_oddevenmergesort_tb.sort_data[12][26] top.sortnet_oddevenmergesort_tb.sort_data[12][25] top.sortnet_oddevenmergesort_tb.sort_data[12][24] top.sortnet_oddevenmergesort_tb.sort_data[12][23] top.sortnet_oddevenmergesort_tb.sort_data[12][22] top.sortnet_oddevenmergesort_tb.sort_data[12][21] top.sortnet_oddevenmergesort_tb.sort_data[12][20] top.sortnet_oddevenmergesort_tb.sort_data[12][19] top.sortnet_oddevenmergesort_tb.sort_data[12][18] top.sortnet_oddevenmergesort_tb.sort_data[12][17] top.sortnet_oddevenmergesort_tb.sort_data[12][16] top.sortnet_oddevenmergesort_tb.sort_data[12][15] top.sortnet_oddevenmergesort_tb.sort_data[12][14] top.sortnet_oddevenmergesort_tb.sort_data[12][13] top.sortnet_oddevenmergesort_tb.sort_data[12][12] top.sortnet_oddevenmergesort_tb.sort_data[12][11] top.sortnet_oddevenmergesort_tb.sort_data[12][10] top.sortnet_oddevenmergesort_tb.sort_data[12][9] top.sortnet_oddevenmergesort_tb.sort_data[12][8] top.sortnet_oddevenmergesort_tb.sort_data[12][7] top.sortnet_oddevenmergesort_tb.sort_data[12][6] top.sortnet_oddevenmergesort_tb.sort_data[12][5] top.sortnet_oddevenmergesort_tb.sort_data[12][4] top.sortnet_oddevenmergesort_tb.sort_data[12][3] top.sortnet_oddevenmergesort_tb.sort_data[12][2] top.sortnet_oddevenmergesort_tb.sort_data[12][1] top.sortnet_oddevenmergesort_tb.sort_data[12][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[13][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[13][31] top.sortnet_oddevenmergesort_tb.sort_data[13][30] top.sortnet_oddevenmergesort_tb.sort_data[13][29] top.sortnet_oddevenmergesort_tb.sort_data[13][28] top.sortnet_oddevenmergesort_tb.sort_data[13][27] top.sortnet_oddevenmergesort_tb.sort_data[13][26] top.sortnet_oddevenmergesort_tb.sort_data[13][25] top.sortnet_oddevenmergesort_tb.sort_data[13][24] top.sortnet_oddevenmergesort_tb.sort_data[13][23] top.sortnet_oddevenmergesort_tb.sort_data[13][22] top.sortnet_oddevenmergesort_tb.sort_data[13][21] top.sortnet_oddevenmergesort_tb.sort_data[13][20] top.sortnet_oddevenmergesort_tb.sort_data[13][19] top.sortnet_oddevenmergesort_tb.sort_data[13][18] top.sortnet_oddevenmergesort_tb.sort_data[13][17] top.sortnet_oddevenmergesort_tb.sort_data[13][16] top.sortnet_oddevenmergesort_tb.sort_data[13][15] top.sortnet_oddevenmergesort_tb.sort_data[13][14] top.sortnet_oddevenmergesort_tb.sort_data[13][13] top.sortnet_oddevenmergesort_tb.sort_data[13][12] top.sortnet_oddevenmergesort_tb.sort_data[13][11] top.sortnet_oddevenmergesort_tb.sort_data[13][10] top.sortnet_oddevenmergesort_tb.sort_data[13][9] top.sortnet_oddevenmergesort_tb.sort_data[13][8] top.sortnet_oddevenmergesort_tb.sort_data[13][7] top.sortnet_oddevenmergesort_tb.sort_data[13][6] top.sortnet_oddevenmergesort_tb.sort_data[13][5] top.sortnet_oddevenmergesort_tb.sort_data[13][4] top.sortnet_oddevenmergesort_tb.sort_data[13][3] top.sortnet_oddevenmergesort_tb.sort_data[13][2] top.sortnet_oddevenmergesort_tb.sort_data[13][1] top.sortnet_oddevenmergesort_tb.sort_data[13][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[14][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[14][31] top.sortnet_oddevenmergesort_tb.sort_data[14][30] top.sortnet_oddevenmergesort_tb.sort_data[14][29] top.sortnet_oddevenmergesort_tb.sort_data[14][28] top.sortnet_oddevenmergesort_tb.sort_data[14][27] top.sortnet_oddevenmergesort_tb.sort_data[14][26] top.sortnet_oddevenmergesort_tb.sort_data[14][25] top.sortnet_oddevenmergesort_tb.sort_data[14][24] top.sortnet_oddevenmergesort_tb.sort_data[14][23] top.sortnet_oddevenmergesort_tb.sort_data[14][22] top.sortnet_oddevenmergesort_tb.sort_data[14][21] top.sortnet_oddevenmergesort_tb.sort_data[14][20] top.sortnet_oddevenmergesort_tb.sort_data[14][19] top.sortnet_oddevenmergesort_tb.sort_data[14][18] top.sortnet_oddevenmergesort_tb.sort_data[14][17] top.sortnet_oddevenmergesort_tb.sort_data[14][16] top.sortnet_oddevenmergesort_tb.sort_data[14][15] top.sortnet_oddevenmergesort_tb.sort_data[14][14] top.sortnet_oddevenmergesort_tb.sort_data[14][13] top.sortnet_oddevenmergesort_tb.sort_data[14][12] top.sortnet_oddevenmergesort_tb.sort_data[14][11] top.sortnet_oddevenmergesort_tb.sort_data[14][10] top.sortnet_oddevenmergesort_tb.sort_data[14][9] top.sortnet_oddevenmergesort_tb.sort_data[14][8] top.sortnet_oddevenmergesort_tb.sort_data[14][7] top.sortnet_oddevenmergesort_tb.sort_data[14][6] top.sortnet_oddevenmergesort_tb.sort_data[14][5] top.sortnet_oddevenmergesort_tb.sort_data[14][4] top.sortnet_oddevenmergesort_tb.sort_data[14][3] top.sortnet_oddevenmergesort_tb.sort_data[14][2] top.sortnet_oddevenmergesort_tb.sort_data[14][1] top.sortnet_oddevenmergesort_tb.sort_data[14][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[15][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[15][31] top.sortnet_oddevenmergesort_tb.sort_data[15][30] top.sortnet_oddevenmergesort_tb.sort_data[15][29] top.sortnet_oddevenmergesort_tb.sort_data[15][28] top.sortnet_oddevenmergesort_tb.sort_data[15][27] top.sortnet_oddevenmergesort_tb.sort_data[15][26] top.sortnet_oddevenmergesort_tb.sort_data[15][25] top.sortnet_oddevenmergesort_tb.sort_data[15][24] top.sortnet_oddevenmergesort_tb.sort_data[15][23] top.sortnet_oddevenmergesort_tb.sort_data[15][22] top.sortnet_oddevenmergesort_tb.sort_data[15][21] top.sortnet_oddevenmergesort_tb.sort_data[15][20] top.sortnet_oddevenmergesort_tb.sort_data[15][19] top.sortnet_oddevenmergesort_tb.sort_data[15][18] top.sortnet_oddevenmergesort_tb.sort_data[15][17] top.sortnet_oddevenmergesort_tb.sort_data[15][16] top.sortnet_oddevenmergesort_tb.sort_data[15][15] top.sortnet_oddevenmergesort_tb.sort_data[15][14] top.sortnet_oddevenmergesort_tb.sort_data[15][13] top.sortnet_oddevenmergesort_tb.sort_data[15][12] top.sortnet_oddevenmergesort_tb.sort_data[15][11] top.sortnet_oddevenmergesort_tb.sort_data[15][10] top.sortnet_oddevenmergesort_tb.sort_data[15][9] top.sortnet_oddevenmergesort_tb.sort_data[15][8] top.sortnet_oddevenmergesort_tb.sort_data[15][7] top.sortnet_oddevenmergesort_tb.sort_data[15][6] top.sortnet_oddevenmergesort_tb.sort_data[15][5] top.sortnet_oddevenmergesort_tb.sort_data[15][4] top.sortnet_oddevenmergesort_tb.sort_data[15][3] top.sortnet_oddevenmergesort_tb.sort_data[15][2] top.sortnet_oddevenmergesort_tb.sort_data[15][1] top.sortnet_oddevenmergesort_tb.sort_data[15][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[16][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[16][31] top.sortnet_oddevenmergesort_tb.sort_data[16][30] top.sortnet_oddevenmergesort_tb.sort_data[16][29] top.sortnet_oddevenmergesort_tb.sort_data[16][28] top.sortnet_oddevenmergesort_tb.sort_data[16][27] top.sortnet_oddevenmergesort_tb.sort_data[16][26] top.sortnet_oddevenmergesort_tb.sort_data[16][25] top.sortnet_oddevenmergesort_tb.sort_data[16][24] top.sortnet_oddevenmergesort_tb.sort_data[16][23] top.sortnet_oddevenmergesort_tb.sort_data[16][22] top.sortnet_oddevenmergesort_tb.sort_data[16][21] top.sortnet_oddevenmergesort_tb.sort_data[16][20] top.sortnet_oddevenmergesort_tb.sort_data[16][19] top.sortnet_oddevenmergesort_tb.sort_data[16][18] top.sortnet_oddevenmergesort_tb.sort_data[16][17] top.sortnet_oddevenmergesort_tb.sort_data[16][16] top.sortnet_oddevenmergesort_tb.sort_data[16][15] top.sortnet_oddevenmergesort_tb.sort_data[16][14] top.sortnet_oddevenmergesort_tb.sort_data[16][13] top.sortnet_oddevenmergesort_tb.sort_data[16][12] top.sortnet_oddevenmergesort_tb.sort_data[16][11] top.sortnet_oddevenmergesort_tb.sort_data[16][10] top.sortnet_oddevenmergesort_tb.sort_data[16][9] top.sortnet_oddevenmergesort_tb.sort_data[16][8] top.sortnet_oddevenmergesort_tb.sort_data[16][7] top.sortnet_oddevenmergesort_tb.sort_data[16][6] top.sortnet_oddevenmergesort_tb.sort_data[16][5] top.sortnet_oddevenmergesort_tb.sort_data[16][4] top.sortnet_oddevenmergesort_tb.sort_data[16][3] top.sortnet_oddevenmergesort_tb.sort_data[16][2] top.sortnet_oddevenmergesort_tb.sort_data[16][1] top.sortnet_oddevenmergesort_tb.sort_data[16][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[17][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[17][31] top.sortnet_oddevenmergesort_tb.sort_data[17][30] top.sortnet_oddevenmergesort_tb.sort_data[17][29] top.sortnet_oddevenmergesort_tb.sort_data[17][28] top.sortnet_oddevenmergesort_tb.sort_data[17][27] top.sortnet_oddevenmergesort_tb.sort_data[17][26] top.sortnet_oddevenmergesort_tb.sort_data[17][25] top.sortnet_oddevenmergesort_tb.sort_data[17][24] top.sortnet_oddevenmergesort_tb.sort_data[17][23] top.sortnet_oddevenmergesort_tb.sort_data[17][22] top.sortnet_oddevenmergesort_tb.sort_data[17][21] top.sortnet_oddevenmergesort_tb.sort_data[17][20] top.sortnet_oddevenmergesort_tb.sort_data[17][19] top.sortnet_oddevenmergesort_tb.sort_data[17][18] top.sortnet_oddevenmergesort_tb.sort_data[17][17] top.sortnet_oddevenmergesort_tb.sort_data[17][16] top.sortnet_oddevenmergesort_tb.sort_data[17][15] top.sortnet_oddevenmergesort_tb.sort_data[17][14] top.sortnet_oddevenmergesort_tb.sort_data[17][13] top.sortnet_oddevenmergesort_tb.sort_data[17][12] top.sortnet_oddevenmergesort_tb.sort_data[17][11] top.sortnet_oddevenmergesort_tb.sort_data[17][10] top.sortnet_oddevenmergesort_tb.sort_data[17][9] top.sortnet_oddevenmergesort_tb.sort_data[17][8] top.sortnet_oddevenmergesort_tb.sort_data[17][7] top.sortnet_oddevenmergesort_tb.sort_data[17][6] top.sortnet_oddevenmergesort_tb.sort_data[17][5] top.sortnet_oddevenmergesort_tb.sort_data[17][4] top.sortnet_oddevenmergesort_tb.sort_data[17][3] top.sortnet_oddevenmergesort_tb.sort_data[17][2] top.sortnet_oddevenmergesort_tb.sort_data[17][1] top.sortnet_oddevenmergesort_tb.sort_data[17][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[18][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[18][31] top.sortnet_oddevenmergesort_tb.sort_data[18][30] top.sortnet_oddevenmergesort_tb.sort_data[18][29] top.sortnet_oddevenmergesort_tb.sort_data[18][28] top.sortnet_oddevenmergesort_tb.sort_data[18][27] top.sortnet_oddevenmergesort_tb.sort_data[18][26] top.sortnet_oddevenmergesort_tb.sort_data[18][25] top.sortnet_oddevenmergesort_tb.sort_data[18][24] top.sortnet_oddevenmergesort_tb.sort_data[18][23] top.sortnet_oddevenmergesort_tb.sort_data[18][22] top.sortnet_oddevenmergesort_tb.sort_data[18][21] top.sortnet_oddevenmergesort_tb.sort_data[18][20] top.sortnet_oddevenmergesort_tb.sort_data[18][19] top.sortnet_oddevenmergesort_tb.sort_data[18][18] top.sortnet_oddevenmergesort_tb.sort_data[18][17] top.sortnet_oddevenmergesort_tb.sort_data[18][16] top.sortnet_oddevenmergesort_tb.sort_data[18][15] top.sortnet_oddevenmergesort_tb.sort_data[18][14] top.sortnet_oddevenmergesort_tb.sort_data[18][13] top.sortnet_oddevenmergesort_tb.sort_data[18][12] top.sortnet_oddevenmergesort_tb.sort_data[18][11] top.sortnet_oddevenmergesort_tb.sort_data[18][10] top.sortnet_oddevenmergesort_tb.sort_data[18][9] top.sortnet_oddevenmergesort_tb.sort_data[18][8] top.sortnet_oddevenmergesort_tb.sort_data[18][7] top.sortnet_oddevenmergesort_tb.sort_data[18][6] top.sortnet_oddevenmergesort_tb.sort_data[18][5] top.sortnet_oddevenmergesort_tb.sort_data[18][4] top.sortnet_oddevenmergesort_tb.sort_data[18][3] top.sortnet_oddevenmergesort_tb.sort_data[18][2] top.sortnet_oddevenmergesort_tb.sort_data[18][1] top.sortnet_oddevenmergesort_tb.sort_data[18][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[19][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[19][31] top.sortnet_oddevenmergesort_tb.sort_data[19][30] top.sortnet_oddevenmergesort_tb.sort_data[19][29] top.sortnet_oddevenmergesort_tb.sort_data[19][28] top.sortnet_oddevenmergesort_tb.sort_data[19][27] top.sortnet_oddevenmergesort_tb.sort_data[19][26] top.sortnet_oddevenmergesort_tb.sort_data[19][25] top.sortnet_oddevenmergesort_tb.sort_data[19][24] top.sortnet_oddevenmergesort_tb.sort_data[19][23] top.sortnet_oddevenmergesort_tb.sort_data[19][22] top.sortnet_oddevenmergesort_tb.sort_data[19][21] top.sortnet_oddevenmergesort_tb.sort_data[19][20] top.sortnet_oddevenmergesort_tb.sort_data[19][19] top.sortnet_oddevenmergesort_tb.sort_data[19][18] top.sortnet_oddevenmergesort_tb.sort_data[19][17] top.sortnet_oddevenmergesort_tb.sort_data[19][16] top.sortnet_oddevenmergesort_tb.sort_data[19][15] top.sortnet_oddevenmergesort_tb.sort_data[19][14] top.sortnet_oddevenmergesort_tb.sort_data[19][13] top.sortnet_oddevenmergesort_tb.sort_data[19][12] top.sortnet_oddevenmergesort_tb.sort_data[19][11] top.sortnet_oddevenmergesort_tb.sort_data[19][10] top.sortnet_oddevenmergesort_tb.sort_data[19][9] top.sortnet_oddevenmergesort_tb.sort_data[19][8] top.sortnet_oddevenmergesort_tb.sort_data[19][7] top.sortnet_oddevenmergesort_tb.sort_data[19][6] top.sortnet_oddevenmergesort_tb.sort_data[19][5] top.sortnet_oddevenmergesort_tb.sort_data[19][4] top.sortnet_oddevenmergesort_tb.sort_data[19][3] top.sortnet_oddevenmergesort_tb.sort_data[19][2] top.sortnet_oddevenmergesort_tb.sort_data[19][1] top.sortnet_oddevenmergesort_tb.sort_data[19][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[20][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[20][31] top.sortnet_oddevenmergesort_tb.sort_data[20][30] top.sortnet_oddevenmergesort_tb.sort_data[20][29] top.sortnet_oddevenmergesort_tb.sort_data[20][28] top.sortnet_oddevenmergesort_tb.sort_data[20][27] top.sortnet_oddevenmergesort_tb.sort_data[20][26] top.sortnet_oddevenmergesort_tb.sort_data[20][25] top.sortnet_oddevenmergesort_tb.sort_data[20][24] top.sortnet_oddevenmergesort_tb.sort_data[20][23] top.sortnet_oddevenmergesort_tb.sort_data[20][22] top.sortnet_oddevenmergesort_tb.sort_data[20][21] top.sortnet_oddevenmergesort_tb.sort_data[20][20] top.sortnet_oddevenmergesort_tb.sort_data[20][19] top.sortnet_oddevenmergesort_tb.sort_data[20][18] top.sortnet_oddevenmergesort_tb.sort_data[20][17] top.sortnet_oddevenmergesort_tb.sort_data[20][16] top.sortnet_oddevenmergesort_tb.sort_data[20][15] top.sortnet_oddevenmergesort_tb.sort_data[20][14] top.sortnet_oddevenmergesort_tb.sort_data[20][13] top.sortnet_oddevenmergesort_tb.sort_data[20][12] top.sortnet_oddevenmergesort_tb.sort_data[20][11] top.sortnet_oddevenmergesort_tb.sort_data[20][10] top.sortnet_oddevenmergesort_tb.sort_data[20][9] top.sortnet_oddevenmergesort_tb.sort_data[20][8] top.sortnet_oddevenmergesort_tb.sort_data[20][7] top.sortnet_oddevenmergesort_tb.sort_data[20][6] top.sortnet_oddevenmergesort_tb.sort_data[20][5] top.sortnet_oddevenmergesort_tb.sort_data[20][4] top.sortnet_oddevenmergesort_tb.sort_data[20][3] top.sortnet_oddevenmergesort_tb.sort_data[20][2] top.sortnet_oddevenmergesort_tb.sort_data[20][1] top.sortnet_oddevenmergesort_tb.sort_data[20][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[21][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[21][31] top.sortnet_oddevenmergesort_tb.sort_data[21][30] top.sortnet_oddevenmergesort_tb.sort_data[21][29] top.sortnet_oddevenmergesort_tb.sort_data[21][28] top.sortnet_oddevenmergesort_tb.sort_data[21][27] top.sortnet_oddevenmergesort_tb.sort_data[21][26] top.sortnet_oddevenmergesort_tb.sort_data[21][25] top.sortnet_oddevenmergesort_tb.sort_data[21][24] top.sortnet_oddevenmergesort_tb.sort_data[21][23] top.sortnet_oddevenmergesort_tb.sort_data[21][22] top.sortnet_oddevenmergesort_tb.sort_data[21][21] top.sortnet_oddevenmergesort_tb.sort_data[21][20] top.sortnet_oddevenmergesort_tb.sort_data[21][19] top.sortnet_oddevenmergesort_tb.sort_data[21][18] top.sortnet_oddevenmergesort_tb.sort_data[21][17] top.sortnet_oddevenmergesort_tb.sort_data[21][16] top.sortnet_oddevenmergesort_tb.sort_data[21][15] top.sortnet_oddevenmergesort_tb.sort_data[21][14] top.sortnet_oddevenmergesort_tb.sort_data[21][13] top.sortnet_oddevenmergesort_tb.sort_data[21][12] top.sortnet_oddevenmergesort_tb.sort_data[21][11] top.sortnet_oddevenmergesort_tb.sort_data[21][10] top.sortnet_oddevenmergesort_tb.sort_data[21][9] top.sortnet_oddevenmergesort_tb.sort_data[21][8] top.sortnet_oddevenmergesort_tb.sort_data[21][7] top.sortnet_oddevenmergesort_tb.sort_data[21][6] top.sortnet_oddevenmergesort_tb.sort_data[21][5] top.sortnet_oddevenmergesort_tb.sort_data[21][4] top.sortnet_oddevenmergesort_tb.sort_data[21][3] top.sortnet_oddevenmergesort_tb.sort_data[21][2] top.sortnet_oddevenmergesort_tb.sort_data[21][1] top.sortnet_oddevenmergesort_tb.sort_data[21][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[22][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[22][31] top.sortnet_oddevenmergesort_tb.sort_data[22][30] top.sortnet_oddevenmergesort_tb.sort_data[22][29] top.sortnet_oddevenmergesort_tb.sort_data[22][28] top.sortnet_oddevenmergesort_tb.sort_data[22][27] top.sortnet_oddevenmergesort_tb.sort_data[22][26] top.sortnet_oddevenmergesort_tb.sort_data[22][25] top.sortnet_oddevenmergesort_tb.sort_data[22][24] top.sortnet_oddevenmergesort_tb.sort_data[22][23] top.sortnet_oddevenmergesort_tb.sort_data[22][22] top.sortnet_oddevenmergesort_tb.sort_data[22][21] top.sortnet_oddevenmergesort_tb.sort_data[22][20] top.sortnet_oddevenmergesort_tb.sort_data[22][19] top.sortnet_oddevenmergesort_tb.sort_data[22][18] top.sortnet_oddevenmergesort_tb.sort_data[22][17] top.sortnet_oddevenmergesort_tb.sort_data[22][16] top.sortnet_oddevenmergesort_tb.sort_data[22][15] top.sortnet_oddevenmergesort_tb.sort_data[22][14] top.sortnet_oddevenmergesort_tb.sort_data[22][13] top.sortnet_oddevenmergesort_tb.sort_data[22][12] top.sortnet_oddevenmergesort_tb.sort_data[22][11] top.sortnet_oddevenmergesort_tb.sort_data[22][10] top.sortnet_oddevenmergesort_tb.sort_data[22][9] top.sortnet_oddevenmergesort_tb.sort_data[22][8] top.sortnet_oddevenmergesort_tb.sort_data[22][7] top.sortnet_oddevenmergesort_tb.sort_data[22][6] top.sortnet_oddevenmergesort_tb.sort_data[22][5] top.sortnet_oddevenmergesort_tb.sort_data[22][4] top.sortnet_oddevenmergesort_tb.sort_data[22][3] top.sortnet_oddevenmergesort_tb.sort_data[22][2] top.sortnet_oddevenmergesort_tb.sort_data[22][1] top.sortnet_oddevenmergesort_tb.sort_data[22][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[23][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[23][31] top.sortnet_oddevenmergesort_tb.sort_data[23][30] top.sortnet_oddevenmergesort_tb.sort_data[23][29] top.sortnet_oddevenmergesort_tb.sort_data[23][28] top.sortnet_oddevenmergesort_tb.sort_data[23][27] top.sortnet_oddevenmergesort_tb.sort_data[23][26] top.sortnet_oddevenmergesort_tb.sort_data[23][25] top.sortnet_oddevenmergesort_tb.sort_data[23][24] top.sortnet_oddevenmergesort_tb.sort_data[23][23] top.sortnet_oddevenmergesort_tb.sort_data[23][22] top.sortnet_oddevenmergesort_tb.sort_data[23][21] top.sortnet_oddevenmergesort_tb.sort_data[23][20] top.sortnet_oddevenmergesort_tb.sort_data[23][19] top.sortnet_oddevenmergesort_tb.sort_data[23][18] top.sortnet_oddevenmergesort_tb.sort_data[23][17] top.sortnet_oddevenmergesort_tb.sort_data[23][16] top.sortnet_oddevenmergesort_tb.sort_data[23][15] top.sortnet_oddevenmergesort_tb.sort_data[23][14] top.sortnet_oddevenmergesort_tb.sort_data[23][13] top.sortnet_oddevenmergesort_tb.sort_data[23][12] top.sortnet_oddevenmergesort_tb.sort_data[23][11] top.sortnet_oddevenmergesort_tb.sort_data[23][10] top.sortnet_oddevenmergesort_tb.sort_data[23][9] top.sortnet_oddevenmergesort_tb.sort_data[23][8] top.sortnet_oddevenmergesort_tb.sort_data[23][7] top.sortnet_oddevenmergesort_tb.sort_data[23][6] top.sortnet_oddevenmergesort_tb.sort_data[23][5] top.sortnet_oddevenmergesort_tb.sort_data[23][4] top.sortnet_oddevenmergesort_tb.sort_data[23][3] top.sortnet_oddevenmergesort_tb.sort_data[23][2] top.sortnet_oddevenmergesort_tb.sort_data[23][1] top.sortnet_oddevenmergesort_tb.sort_data[23][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[24][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[24][31] top.sortnet_oddevenmergesort_tb.sort_data[24][30] top.sortnet_oddevenmergesort_tb.sort_data[24][29] top.sortnet_oddevenmergesort_tb.sort_data[24][28] top.sortnet_oddevenmergesort_tb.sort_data[24][27] top.sortnet_oddevenmergesort_tb.sort_data[24][26] top.sortnet_oddevenmergesort_tb.sort_data[24][25] top.sortnet_oddevenmergesort_tb.sort_data[24][24] top.sortnet_oddevenmergesort_tb.sort_data[24][23] top.sortnet_oddevenmergesort_tb.sort_data[24][22] top.sortnet_oddevenmergesort_tb.sort_data[24][21] top.sortnet_oddevenmergesort_tb.sort_data[24][20] top.sortnet_oddevenmergesort_tb.sort_data[24][19] top.sortnet_oddevenmergesort_tb.sort_data[24][18] top.sortnet_oddevenmergesort_tb.sort_data[24][17] top.sortnet_oddevenmergesort_tb.sort_data[24][16] top.sortnet_oddevenmergesort_tb.sort_data[24][15] top.sortnet_oddevenmergesort_tb.sort_data[24][14] top.sortnet_oddevenmergesort_tb.sort_data[24][13] top.sortnet_oddevenmergesort_tb.sort_data[24][12] top.sortnet_oddevenmergesort_tb.sort_data[24][11] top.sortnet_oddevenmergesort_tb.sort_data[24][10] top.sortnet_oddevenmergesort_tb.sort_data[24][9] top.sortnet_oddevenmergesort_tb.sort_data[24][8] top.sortnet_oddevenmergesort_tb.sort_data[24][7] top.sortnet_oddevenmergesort_tb.sort_data[24][6] top.sortnet_oddevenmergesort_tb.sort_data[24][5] top.sortnet_oddevenmergesort_tb.sort_data[24][4] top.sortnet_oddevenmergesort_tb.sort_data[24][3] top.sortnet_oddevenmergesort_tb.sort_data[24][2] top.sortnet_oddevenmergesort_tb.sort_data[24][1] top.sortnet_oddevenmergesort_tb.sort_data[24][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[25][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[25][31] top.sortnet_oddevenmergesort_tb.sort_data[25][30] top.sortnet_oddevenmergesort_tb.sort_data[25][29] top.sortnet_oddevenmergesort_tb.sort_data[25][28] top.sortnet_oddevenmergesort_tb.sort_data[25][27] top.sortnet_oddevenmergesort_tb.sort_data[25][26] top.sortnet_oddevenmergesort_tb.sort_data[25][25] top.sortnet_oddevenmergesort_tb.sort_data[25][24] top.sortnet_oddevenmergesort_tb.sort_data[25][23] top.sortnet_oddevenmergesort_tb.sort_data[25][22] top.sortnet_oddevenmergesort_tb.sort_data[25][21] top.sortnet_oddevenmergesort_tb.sort_data[25][20] top.sortnet_oddevenmergesort_tb.sort_data[25][19] top.sortnet_oddevenmergesort_tb.sort_data[25][18] top.sortnet_oddevenmergesort_tb.sort_data[25][17] top.sortnet_oddevenmergesort_tb.sort_data[25][16] top.sortnet_oddevenmergesort_tb.sort_data[25][15] top.sortnet_oddevenmergesort_tb.sort_data[25][14] top.sortnet_oddevenmergesort_tb.sort_data[25][13] top.sortnet_oddevenmergesort_tb.sort_data[25][12] top.sortnet_oddevenmergesort_tb.sort_data[25][11] top.sortnet_oddevenmergesort_tb.sort_data[25][10] top.sortnet_oddevenmergesort_tb.sort_data[25][9] top.sortnet_oddevenmergesort_tb.sort_data[25][8] top.sortnet_oddevenmergesort_tb.sort_data[25][7] top.sortnet_oddevenmergesort_tb.sort_data[25][6] top.sortnet_oddevenmergesort_tb.sort_data[25][5] top.sortnet_oddevenmergesort_tb.sort_data[25][4] top.sortnet_oddevenmergesort_tb.sort_data[25][3] top.sortnet_oddevenmergesort_tb.sort_data[25][2] top.sortnet_oddevenmergesort_tb.sort_data[25][1] top.sortnet_oddevenmergesort_tb.sort_data[25][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[26][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[26][31] top.sortnet_oddevenmergesort_tb.sort_data[26][30] top.sortnet_oddevenmergesort_tb.sort_data[26][29] top.sortnet_oddevenmergesort_tb.sort_data[26][28] top.sortnet_oddevenmergesort_tb.sort_data[26][27] top.sortnet_oddevenmergesort_tb.sort_data[26][26] top.sortnet_oddevenmergesort_tb.sort_data[26][25] top.sortnet_oddevenmergesort_tb.sort_data[26][24] top.sortnet_oddevenmergesort_tb.sort_data[26][23] top.sortnet_oddevenmergesort_tb.sort_data[26][22] top.sortnet_oddevenmergesort_tb.sort_data[26][21] top.sortnet_oddevenmergesort_tb.sort_data[26][20] top.sortnet_oddevenmergesort_tb.sort_data[26][19] top.sortnet_oddevenmergesort_tb.sort_data[26][18] top.sortnet_oddevenmergesort_tb.sort_data[26][17] top.sortnet_oddevenmergesort_tb.sort_data[26][16] top.sortnet_oddevenmergesort_tb.sort_data[26][15] top.sortnet_oddevenmergesort_tb.sort_data[26][14] top.sortnet_oddevenmergesort_tb.sort_data[26][13] top.sortnet_oddevenmergesort_tb.sort_data[26][12] top.sortnet_oddevenmergesort_tb.sort_data[26][11] top.sortnet_oddevenmergesort_tb.sort_data[26][10] top.sortnet_oddevenmergesort_tb.sort_data[26][9] top.sortnet_oddevenmergesort_tb.sort_data[26][8] top.sortnet_oddevenmergesort_tb.sort_data[26][7] top.sortnet_oddevenmergesort_tb.sort_data[26][6] top.sortnet_oddevenmergesort_tb.sort_data[26][5] top.sortnet_oddevenmergesort_tb.sort_data[26][4] top.sortnet_oddevenmergesort_tb.sort_data[26][3] top.sortnet_oddevenmergesort_tb.sort_data[26][2] top.sortnet_oddevenmergesort_tb.sort_data[26][1] top.sortnet_oddevenmergesort_tb.sort_data[26][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[27][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[27][31] top.sortnet_oddevenmergesort_tb.sort_data[27][30] top.sortnet_oddevenmergesort_tb.sort_data[27][29] top.sortnet_oddevenmergesort_tb.sort_data[27][28] top.sortnet_oddevenmergesort_tb.sort_data[27][27] top.sortnet_oddevenmergesort_tb.sort_data[27][26] top.sortnet_oddevenmergesort_tb.sort_data[27][25] top.sortnet_oddevenmergesort_tb.sort_data[27][24] top.sortnet_oddevenmergesort_tb.sort_data[27][23] top.sortnet_oddevenmergesort_tb.sort_data[27][22] top.sortnet_oddevenmergesort_tb.sort_data[27][21] top.sortnet_oddevenmergesort_tb.sort_data[27][20] top.sortnet_oddevenmergesort_tb.sort_data[27][19] top.sortnet_oddevenmergesort_tb.sort_data[27][18] top.sortnet_oddevenmergesort_tb.sort_data[27][17] top.sortnet_oddevenmergesort_tb.sort_data[27][16] top.sortnet_oddevenmergesort_tb.sort_data[27][15] top.sortnet_oddevenmergesort_tb.sort_data[27][14] top.sortnet_oddevenmergesort_tb.sort_data[27][13] top.sortnet_oddevenmergesort_tb.sort_data[27][12] top.sortnet_oddevenmergesort_tb.sort_data[27][11] top.sortnet_oddevenmergesort_tb.sort_data[27][10] top.sortnet_oddevenmergesort_tb.sort_data[27][9] top.sortnet_oddevenmergesort_tb.sort_data[27][8] top.sortnet_oddevenmergesort_tb.sort_data[27][7] top.sortnet_oddevenmergesort_tb.sort_data[27][6] top.sortnet_oddevenmergesort_tb.sort_data[27][5] top.sortnet_oddevenmergesort_tb.sort_data[27][4] top.sortnet_oddevenmergesort_tb.sort_data[27][3] top.sortnet_oddevenmergesort_tb.sort_data[27][2] top.sortnet_oddevenmergesort_tb.sort_data[27][1] top.sortnet_oddevenmergesort_tb.sort_data[27][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[28][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[28][31] top.sortnet_oddevenmergesort_tb.sort_data[28][30] top.sortnet_oddevenmergesort_tb.sort_data[28][29] top.sortnet_oddevenmergesort_tb.sort_data[28][28] top.sortnet_oddevenmergesort_tb.sort_data[28][27] top.sortnet_oddevenmergesort_tb.sort_data[28][26] top.sortnet_oddevenmergesort_tb.sort_data[28][25] top.sortnet_oddevenmergesort_tb.sort_data[28][24] top.sortnet_oddevenmergesort_tb.sort_data[28][23] top.sortnet_oddevenmergesort_tb.sort_data[28][22] top.sortnet_oddevenmergesort_tb.sort_data[28][21] top.sortnet_oddevenmergesort_tb.sort_data[28][20] top.sortnet_oddevenmergesort_tb.sort_data[28][19] top.sortnet_oddevenmergesort_tb.sort_data[28][18] top.sortnet_oddevenmergesort_tb.sort_data[28][17] top.sortnet_oddevenmergesort_tb.sort_data[28][16] top.sortnet_oddevenmergesort_tb.sort_data[28][15] top.sortnet_oddevenmergesort_tb.sort_data[28][14] top.sortnet_oddevenmergesort_tb.sort_data[28][13] top.sortnet_oddevenmergesort_tb.sort_data[28][12] top.sortnet_oddevenmergesort_tb.sort_data[28][11] top.sortnet_oddevenmergesort_tb.sort_data[28][10] top.sortnet_oddevenmergesort_tb.sort_data[28][9] top.sortnet_oddevenmergesort_tb.sort_data[28][8] top.sortnet_oddevenmergesort_tb.sort_data[28][7] top.sortnet_oddevenmergesort_tb.sort_data[28][6] top.sortnet_oddevenmergesort_tb.sort_data[28][5] top.sortnet_oddevenmergesort_tb.sort_data[28][4] top.sortnet_oddevenmergesort_tb.sort_data[28][3] top.sortnet_oddevenmergesort_tb.sort_data[28][2] top.sortnet_oddevenmergesort_tb.sort_data[28][1] top.sortnet_oddevenmergesort_tb.sort_data[28][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[29][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[29][31] top.sortnet_oddevenmergesort_tb.sort_data[29][30] top.sortnet_oddevenmergesort_tb.sort_data[29][29] top.sortnet_oddevenmergesort_tb.sort_data[29][28] top.sortnet_oddevenmergesort_tb.sort_data[29][27] top.sortnet_oddevenmergesort_tb.sort_data[29][26] top.sortnet_oddevenmergesort_tb.sort_data[29][25] top.sortnet_oddevenmergesort_tb.sort_data[29][24] top.sortnet_oddevenmergesort_tb.sort_data[29][23] top.sortnet_oddevenmergesort_tb.sort_data[29][22] top.sortnet_oddevenmergesort_tb.sort_data[29][21] top.sortnet_oddevenmergesort_tb.sort_data[29][20] top.sortnet_oddevenmergesort_tb.sort_data[29][19] top.sortnet_oddevenmergesort_tb.sort_data[29][18] top.sortnet_oddevenmergesort_tb.sort_data[29][17] top.sortnet_oddevenmergesort_tb.sort_data[29][16] top.sortnet_oddevenmergesort_tb.sort_data[29][15] top.sortnet_oddevenmergesort_tb.sort_data[29][14] top.sortnet_oddevenmergesort_tb.sort_data[29][13] top.sortnet_oddevenmergesort_tb.sort_data[29][12] top.sortnet_oddevenmergesort_tb.sort_data[29][11] top.sortnet_oddevenmergesort_tb.sort_data[29][10] top.sortnet_oddevenmergesort_tb.sort_data[29][9] top.sortnet_oddevenmergesort_tb.sort_data[29][8] top.sortnet_oddevenmergesort_tb.sort_data[29][7] top.sortnet_oddevenmergesort_tb.sort_data[29][6] top.sortnet_oddevenmergesort_tb.sort_data[29][5] top.sortnet_oddevenmergesort_tb.sort_data[29][4] top.sortnet_oddevenmergesort_tb.sort_data[29][3] top.sortnet_oddevenmergesort_tb.sort_data[29][2] top.sortnet_oddevenmergesort_tb.sort_data[29][1] top.sortnet_oddevenmergesort_tb.sort_data[29][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[30][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[30][31] top.sortnet_oddevenmergesort_tb.sort_data[30][30] top.sortnet_oddevenmergesort_tb.sort_data[30][29] top.sortnet_oddevenmergesort_tb.sort_data[30][28] top.sortnet_oddevenmergesort_tb.sort_data[30][27] top.sortnet_oddevenmergesort_tb.sort_data[30][26] top.sortnet_oddevenmergesort_tb.sort_data[30][25] top.sortnet_oddevenmergesort_tb.sort_data[30][24] top.sortnet_oddevenmergesort_tb.sort_data[30][23] top.sortnet_oddevenmergesort_tb.sort_data[30][22] top.sortnet_oddevenmergesort_tb.sort_data[30][21] top.sortnet_oddevenmergesort_tb.sort_data[30][20] top.sortnet_oddevenmergesort_tb.sort_data[30][19] top.sortnet_oddevenmergesort_tb.sort_data[30][18] top.sortnet_oddevenmergesort_tb.sort_data[30][17] top.sortnet_oddevenmergesort_tb.sort_data[30][16] top.sortnet_oddevenmergesort_tb.sort_data[30][15] top.sortnet_oddevenmergesort_tb.sort_data[30][14] top.sortnet_oddevenmergesort_tb.sort_data[30][13] top.sortnet_oddevenmergesort_tb.sort_data[30][12] top.sortnet_oddevenmergesort_tb.sort_data[30][11] top.sortnet_oddevenmergesort_tb.sort_data[30][10] top.sortnet_oddevenmergesort_tb.sort_data[30][9] top.sortnet_oddevenmergesort_tb.sort_data[30][8] top.sortnet_oddevenmergesort_tb.sort_data[30][7] top.sortnet_oddevenmergesort_tb.sort_data[30][6] top.sortnet_oddevenmergesort_tb.sort_data[30][5] top.sortnet_oddevenmergesort_tb.sort_data[30][4] top.sortnet_oddevenmergesort_tb.sort_data[30][3] top.sortnet_oddevenmergesort_tb.sort_data[30][2] top.sortnet_oddevenmergesort_tb.sort_data[30][1] top.sortnet_oddevenmergesort_tb.sort_data[30][0] -#{top.sortnet_oddevenmergesort_tb.sort_data[31][31:0]} top.sortnet_oddevenmergesort_tb.sort_data[31][31] top.sortnet_oddevenmergesort_tb.sort_data[31][30] top.sortnet_oddevenmergesort_tb.sort_data[31][29] top.sortnet_oddevenmergesort_tb.sort_data[31][28] top.sortnet_oddevenmergesort_tb.sort_data[31][27] top.sortnet_oddevenmergesort_tb.sort_data[31][26] top.sortnet_oddevenmergesort_tb.sort_data[31][25] top.sortnet_oddevenmergesort_tb.sort_data[31][24] top.sortnet_oddevenmergesort_tb.sort_data[31][23] top.sortnet_oddevenmergesort_tb.sort_data[31][22] top.sortnet_oddevenmergesort_tb.sort_data[31][21] top.sortnet_oddevenmergesort_tb.sort_data[31][20] top.sortnet_oddevenmergesort_tb.sort_data[31][19] top.sortnet_oddevenmergesort_tb.sort_data[31][18] top.sortnet_oddevenmergesort_tb.sort_data[31][17] top.sortnet_oddevenmergesort_tb.sort_data[31][16] top.sortnet_oddevenmergesort_tb.sort_data[31][15] top.sortnet_oddevenmergesort_tb.sort_data[31][14] top.sortnet_oddevenmergesort_tb.sort_data[31][13] top.sortnet_oddevenmergesort_tb.sort_data[31][12] top.sortnet_oddevenmergesort_tb.sort_data[31][11] top.sortnet_oddevenmergesort_tb.sort_data[31][10] top.sortnet_oddevenmergesort_tb.sort_data[31][9] top.sortnet_oddevenmergesort_tb.sort_data[31][8] top.sortnet_oddevenmergesort_tb.sort_data[31][7] top.sortnet_oddevenmergesort_tb.sort_data[31][6] top.sortnet_oddevenmergesort_tb.sort_data[31][5] top.sortnet_oddevenmergesort_tb.sort_data[31][4] top.sortnet_oddevenmergesort_tb.sort_data[31][3] top.sortnet_oddevenmergesort_tb.sort_data[31][2] top.sortnet_oddevenmergesort_tb.sort_data[31][1] top.sortnet_oddevenmergesort_tb.sort_data[31][0] -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/sort/sortnet/sortnet_OddEvenMergeSort_tb.wdo b/sim/sort/sortnet/sortnet_OddEvenMergeSort_tb.wdo deleted file mode 100644 index d47fe96a1..000000000 --- a/sim/sort/sortnet/sortnet_OddEvenMergeSort_tb.wdo +++ /dev/null @@ -1,31 +0,0 @@ -onerror {resume} -quietly WaveActivateNextPane {} 0 -add wave -noupdate -expand -group Common -label Clock /sortnet_oddevenmergesort_tb/Clock -add wave -noupdate -expand -group Input -label Generator_Valid /sortnet_oddevenmergesort_tb/Generator_Valid -add wave -noupdate -expand -group Input -label Generator_IsKey /sortnet_oddevenmergesort_tb/Generator_IsKey -add wave -noupdate -expand -group Input -label Generator_Data /sortnet_oddevenmergesort_tb/Generator_Data -add wave -noupdate -expand -group Input -label DataInputMatrix /sortnet_oddevenmergesort_tb/DataInputMatrix -add wave -noupdate -expand -group Input -label Generator_Meta /sortnet_oddevenmergesort_tb/Generator_Meta -add wave -noupdate -expand -group Output -label Sort_Valid /sortnet_oddevenmergesort_tb/Sort_Valid -add wave -noupdate -expand -group Output -label Sort_IsKey /sortnet_oddevenmergesort_tb/Sort_IsKey -add wave -noupdate -expand -group Output -label Sort_Data /sortnet_oddevenmergesort_tb/Sort_Data -add wave -noupdate -expand -group Output -label DataOutputMatrix /sortnet_oddevenmergesort_tb/DataOutputMatrix -add wave -noupdate -expand -group Output -label Sort_Meta /sortnet_oddevenmergesort_tb/Sort_Meta -TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 1} {0 fs} 0} -quietly wave cursor active 0 -configure wave -namecolwidth 324 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 -configure wave -gridoffset 0 -configure wave -gridperiod 1 -configure wave -griddelta 40 -configure wave -timeline 0 -configure wave -timelineunits ns -update -WaveRestoreZoom {0 fs} {10707958493 fs} diff --git a/sim/sort/sortnet/sortnet_OddEvenSort_tb.ghdl b/sim/sort/sortnet/sortnet_OddEvenSort_tb.ghdl deleted file mode 100644 index 111832cb0..000000000 --- a/sim/sort/sortnet/sortnet_OddEvenSort_tb.ghdl +++ /dev/null @@ -1,35 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/sortnet_oddevensort_tb/clock -/sortnet_oddevensort_tb/generator_valid -/sortnet_oddevensort_tb/generator_iskey -/sortnet_oddevensort_tb/generator_data -/sortnet_oddevensort_tb/generator_meta -/sortnet_oddevensort_tb/sort_valid -/sortnet_oddevensort_tb/sort_iskey -/sortnet_oddevensort_tb/sort_data -/sortnet_oddevensort_tb/sort_meta -/sortnet_oddevensort_tb/datainputmatrix -/sortnet_oddevensort_tb/dataoutputmatrix -/sortnet_oddevensort_tb/sort/clock -/sortnet_oddevensort_tb/sort/reset -/sortnet_oddevensort_tb/sort/inverse -/sortnet_oddevensort_tb/sort/in_valid -/sortnet_oddevensort_tb/sort/in_iskey -/sortnet_oddevensort_tb/sort/in_data -/sortnet_oddevensort_tb/sort/in_meta -/sortnet_oddevensort_tb/sort/out_valid -/sortnet_oddevensort_tb/sort/out_iskey -/sortnet_oddevensort_tb/sort/out_data -/sortnet_oddevensort_tb/sort/out_meta -/sortnet_oddevensort_tb/sort/in_valid_d -/sortnet_oddevensort_tb/sort/in_iskey_d -/sortnet_oddevensort_tb/sort/in_data_d -/sortnet_oddevensort_tb/sort/in_meta_d -/sortnet_oddevensort_tb/sort/metavector -/sortnet_oddevensort_tb/sort/datamatrix -/sortnet_oddevensort_tb/sort/metaoutputs_d -/sortnet_oddevensort_tb/sort/dataoutputs_d diff --git a/sim/sort/sortnet/sortnet_OddEvenSort_tb.gtkw b/sim/sort/sortnet/sortnet_OddEvenSort_tb.gtkw deleted file mode 100644 index 6695eba54..000000000 --- a/sim/sort/sortnet/sortnet_OddEvenSort_tb.gtkw +++ /dev/null @@ -1,66 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.69 (w)1999-2016 BSI -[*] Sun Mar 20 17:00:26 2016 -[*] -[dumpfile_mtime] "Sun Mar 20 16:55:34 2016" -[dumpfile_size] 1236808 -[timestart] 0 -[size] 1680 997 -[pos] -1 -1 -*-25.656399 264400000 -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 -[treeopen] top. -[treeopen] top.sortnet_oddevensort_tb. -[treeopen] top.sortnet_oddevensort_tb.generator_data. -[treeopen] top.sortnet_oddevensort_tb.sort_data. -[sst_width] 197 -[signals_width] 294 -[sst_expanded] 1 -[sst_vpaned_height] 293 -@28 -top.sortnet_oddevensort_tb.clock -top.sortnet_oddevensort_tb.generator_valid -top.sortnet_oddevensort_tb.generator_iskey -@22 -#{top.sortnet_oddevensort_tb.generator_data[0][31:0]} top.sortnet_oddevensort_tb.generator_data[0][31] top.sortnet_oddevensort_tb.generator_data[0][30] top.sortnet_oddevensort_tb.generator_data[0][29] top.sortnet_oddevensort_tb.generator_data[0][28] top.sortnet_oddevensort_tb.generator_data[0][27] top.sortnet_oddevensort_tb.generator_data[0][26] top.sortnet_oddevensort_tb.generator_data[0][25] top.sortnet_oddevensort_tb.generator_data[0][24] top.sortnet_oddevensort_tb.generator_data[0][23] top.sortnet_oddevensort_tb.generator_data[0][22] top.sortnet_oddevensort_tb.generator_data[0][21] top.sortnet_oddevensort_tb.generator_data[0][20] top.sortnet_oddevensort_tb.generator_data[0][19] top.sortnet_oddevensort_tb.generator_data[0][18] top.sortnet_oddevensort_tb.generator_data[0][17] top.sortnet_oddevensort_tb.generator_data[0][16] top.sortnet_oddevensort_tb.generator_data[0][15] top.sortnet_oddevensort_tb.generator_data[0][14] top.sortnet_oddevensort_tb.generator_data[0][13] top.sortnet_oddevensort_tb.generator_data[0][12] top.sortnet_oddevensort_tb.generator_data[0][11] top.sortnet_oddevensort_tb.generator_data[0][10] top.sortnet_oddevensort_tb.generator_data[0][9] top.sortnet_oddevensort_tb.generator_data[0][8] top.sortnet_oddevensort_tb.generator_data[0][7] top.sortnet_oddevensort_tb.generator_data[0][6] top.sortnet_oddevensort_tb.generator_data[0][5] top.sortnet_oddevensort_tb.generator_data[0][4] top.sortnet_oddevensort_tb.generator_data[0][3] top.sortnet_oddevensort_tb.generator_data[0][2] top.sortnet_oddevensort_tb.generator_data[0][1] top.sortnet_oddevensort_tb.generator_data[0][0] -#{top.sortnet_oddevensort_tb.generator_data[1][31:0]} top.sortnet_oddevensort_tb.generator_data[1][31] top.sortnet_oddevensort_tb.generator_data[1][30] top.sortnet_oddevensort_tb.generator_data[1][29] top.sortnet_oddevensort_tb.generator_data[1][28] top.sortnet_oddevensort_tb.generator_data[1][27] top.sortnet_oddevensort_tb.generator_data[1][26] top.sortnet_oddevensort_tb.generator_data[1][25] top.sortnet_oddevensort_tb.generator_data[1][24] top.sortnet_oddevensort_tb.generator_data[1][23] top.sortnet_oddevensort_tb.generator_data[1][22] top.sortnet_oddevensort_tb.generator_data[1][21] top.sortnet_oddevensort_tb.generator_data[1][20] top.sortnet_oddevensort_tb.generator_data[1][19] top.sortnet_oddevensort_tb.generator_data[1][18] top.sortnet_oddevensort_tb.generator_data[1][17] top.sortnet_oddevensort_tb.generator_data[1][16] top.sortnet_oddevensort_tb.generator_data[1][15] top.sortnet_oddevensort_tb.generator_data[1][14] top.sortnet_oddevensort_tb.generator_data[1][13] top.sortnet_oddevensort_tb.generator_data[1][12] top.sortnet_oddevensort_tb.generator_data[1][11] top.sortnet_oddevensort_tb.generator_data[1][10] top.sortnet_oddevensort_tb.generator_data[1][9] top.sortnet_oddevensort_tb.generator_data[1][8] top.sortnet_oddevensort_tb.generator_data[1][7] top.sortnet_oddevensort_tb.generator_data[1][6] top.sortnet_oddevensort_tb.generator_data[1][5] top.sortnet_oddevensort_tb.generator_data[1][4] top.sortnet_oddevensort_tb.generator_data[1][3] top.sortnet_oddevensort_tb.generator_data[1][2] top.sortnet_oddevensort_tb.generator_data[1][1] top.sortnet_oddevensort_tb.generator_data[1][0] -#{top.sortnet_oddevensort_tb.generator_data[2][31:0]} top.sortnet_oddevensort_tb.generator_data[2][31] top.sortnet_oddevensort_tb.generator_data[2][30] top.sortnet_oddevensort_tb.generator_data[2][29] top.sortnet_oddevensort_tb.generator_data[2][28] top.sortnet_oddevensort_tb.generator_data[2][27] top.sortnet_oddevensort_tb.generator_data[2][26] top.sortnet_oddevensort_tb.generator_data[2][25] top.sortnet_oddevensort_tb.generator_data[2][24] top.sortnet_oddevensort_tb.generator_data[2][23] top.sortnet_oddevensort_tb.generator_data[2][22] top.sortnet_oddevensort_tb.generator_data[2][21] top.sortnet_oddevensort_tb.generator_data[2][20] top.sortnet_oddevensort_tb.generator_data[2][19] top.sortnet_oddevensort_tb.generator_data[2][18] top.sortnet_oddevensort_tb.generator_data[2][17] top.sortnet_oddevensort_tb.generator_data[2][16] top.sortnet_oddevensort_tb.generator_data[2][15] top.sortnet_oddevensort_tb.generator_data[2][14] top.sortnet_oddevensort_tb.generator_data[2][13] top.sortnet_oddevensort_tb.generator_data[2][12] top.sortnet_oddevensort_tb.generator_data[2][11] top.sortnet_oddevensort_tb.generator_data[2][10] top.sortnet_oddevensort_tb.generator_data[2][9] top.sortnet_oddevensort_tb.generator_data[2][8] top.sortnet_oddevensort_tb.generator_data[2][7] top.sortnet_oddevensort_tb.generator_data[2][6] top.sortnet_oddevensort_tb.generator_data[2][5] top.sortnet_oddevensort_tb.generator_data[2][4] top.sortnet_oddevensort_tb.generator_data[2][3] top.sortnet_oddevensort_tb.generator_data[2][2] top.sortnet_oddevensort_tb.generator_data[2][1] top.sortnet_oddevensort_tb.generator_data[2][0] -@23 -#{top.sortnet_oddevensort_tb.generator_data[3][31:0]} top.sortnet_oddevensort_tb.generator_data[3][31] top.sortnet_oddevensort_tb.generator_data[3][30] top.sortnet_oddevensort_tb.generator_data[3][29] top.sortnet_oddevensort_tb.generator_data[3][28] top.sortnet_oddevensort_tb.generator_data[3][27] top.sortnet_oddevensort_tb.generator_data[3][26] top.sortnet_oddevensort_tb.generator_data[3][25] top.sortnet_oddevensort_tb.generator_data[3][24] top.sortnet_oddevensort_tb.generator_data[3][23] top.sortnet_oddevensort_tb.generator_data[3][22] top.sortnet_oddevensort_tb.generator_data[3][21] top.sortnet_oddevensort_tb.generator_data[3][20] top.sortnet_oddevensort_tb.generator_data[3][19] top.sortnet_oddevensort_tb.generator_data[3][18] top.sortnet_oddevensort_tb.generator_data[3][17] top.sortnet_oddevensort_tb.generator_data[3][16] top.sortnet_oddevensort_tb.generator_data[3][15] top.sortnet_oddevensort_tb.generator_data[3][14] top.sortnet_oddevensort_tb.generator_data[3][13] top.sortnet_oddevensort_tb.generator_data[3][12] top.sortnet_oddevensort_tb.generator_data[3][11] top.sortnet_oddevensort_tb.generator_data[3][10] top.sortnet_oddevensort_tb.generator_data[3][9] top.sortnet_oddevensort_tb.generator_data[3][8] top.sortnet_oddevensort_tb.generator_data[3][7] top.sortnet_oddevensort_tb.generator_data[3][6] top.sortnet_oddevensort_tb.generator_data[3][5] top.sortnet_oddevensort_tb.generator_data[3][4] top.sortnet_oddevensort_tb.generator_data[3][3] top.sortnet_oddevensort_tb.generator_data[3][2] top.sortnet_oddevensort_tb.generator_data[3][1] top.sortnet_oddevensort_tb.generator_data[3][0] -@22 -#{top.sortnet_oddevensort_tb.sort_data[0][31:0]} top.sortnet_oddevensort_tb.sort_data[0][31] top.sortnet_oddevensort_tb.sort_data[0][30] top.sortnet_oddevensort_tb.sort_data[0][29] top.sortnet_oddevensort_tb.sort_data[0][28] top.sortnet_oddevensort_tb.sort_data[0][27] top.sortnet_oddevensort_tb.sort_data[0][26] top.sortnet_oddevensort_tb.sort_data[0][25] top.sortnet_oddevensort_tb.sort_data[0][24] top.sortnet_oddevensort_tb.sort_data[0][23] top.sortnet_oddevensort_tb.sort_data[0][22] top.sortnet_oddevensort_tb.sort_data[0][21] top.sortnet_oddevensort_tb.sort_data[0][20] top.sortnet_oddevensort_tb.sort_data[0][19] top.sortnet_oddevensort_tb.sort_data[0][18] top.sortnet_oddevensort_tb.sort_data[0][17] top.sortnet_oddevensort_tb.sort_data[0][16] top.sortnet_oddevensort_tb.sort_data[0][15] top.sortnet_oddevensort_tb.sort_data[0][14] top.sortnet_oddevensort_tb.sort_data[0][13] top.sortnet_oddevensort_tb.sort_data[0][12] top.sortnet_oddevensort_tb.sort_data[0][11] top.sortnet_oddevensort_tb.sort_data[0][10] top.sortnet_oddevensort_tb.sort_data[0][9] top.sortnet_oddevensort_tb.sort_data[0][8] top.sortnet_oddevensort_tb.sort_data[0][7] top.sortnet_oddevensort_tb.sort_data[0][6] top.sortnet_oddevensort_tb.sort_data[0][5] top.sortnet_oddevensort_tb.sort_data[0][4] top.sortnet_oddevensort_tb.sort_data[0][3] top.sortnet_oddevensort_tb.sort_data[0][2] top.sortnet_oddevensort_tb.sort_data[0][1] top.sortnet_oddevensort_tb.sort_data[0][0] -#{top.sortnet_oddevensort_tb.sort_data[1][31:0]} top.sortnet_oddevensort_tb.sort_data[1][31] top.sortnet_oddevensort_tb.sort_data[1][30] top.sortnet_oddevensort_tb.sort_data[1][29] top.sortnet_oddevensort_tb.sort_data[1][28] top.sortnet_oddevensort_tb.sort_data[1][27] top.sortnet_oddevensort_tb.sort_data[1][26] top.sortnet_oddevensort_tb.sort_data[1][25] top.sortnet_oddevensort_tb.sort_data[1][24] top.sortnet_oddevensort_tb.sort_data[1][23] top.sortnet_oddevensort_tb.sort_data[1][22] top.sortnet_oddevensort_tb.sort_data[1][21] top.sortnet_oddevensort_tb.sort_data[1][20] top.sortnet_oddevensort_tb.sort_data[1][19] top.sortnet_oddevensort_tb.sort_data[1][18] top.sortnet_oddevensort_tb.sort_data[1][17] top.sortnet_oddevensort_tb.sort_data[1][16] top.sortnet_oddevensort_tb.sort_data[1][15] top.sortnet_oddevensort_tb.sort_data[1][14] top.sortnet_oddevensort_tb.sort_data[1][13] top.sortnet_oddevensort_tb.sort_data[1][12] top.sortnet_oddevensort_tb.sort_data[1][11] top.sortnet_oddevensort_tb.sort_data[1][10] top.sortnet_oddevensort_tb.sort_data[1][9] top.sortnet_oddevensort_tb.sort_data[1][8] top.sortnet_oddevensort_tb.sort_data[1][7] top.sortnet_oddevensort_tb.sort_data[1][6] top.sortnet_oddevensort_tb.sort_data[1][5] top.sortnet_oddevensort_tb.sort_data[1][4] top.sortnet_oddevensort_tb.sort_data[1][3] top.sortnet_oddevensort_tb.sort_data[1][2] top.sortnet_oddevensort_tb.sort_data[1][1] top.sortnet_oddevensort_tb.sort_data[1][0] -#{top.sortnet_oddevensort_tb.sort_data[2][31:0]} top.sortnet_oddevensort_tb.sort_data[2][31] top.sortnet_oddevensort_tb.sort_data[2][30] top.sortnet_oddevensort_tb.sort_data[2][29] top.sortnet_oddevensort_tb.sort_data[2][28] top.sortnet_oddevensort_tb.sort_data[2][27] top.sortnet_oddevensort_tb.sort_data[2][26] top.sortnet_oddevensort_tb.sort_data[2][25] top.sortnet_oddevensort_tb.sort_data[2][24] top.sortnet_oddevensort_tb.sort_data[2][23] top.sortnet_oddevensort_tb.sort_data[2][22] top.sortnet_oddevensort_tb.sort_data[2][21] top.sortnet_oddevensort_tb.sort_data[2][20] top.sortnet_oddevensort_tb.sort_data[2][19] top.sortnet_oddevensort_tb.sort_data[2][18] top.sortnet_oddevensort_tb.sort_data[2][17] top.sortnet_oddevensort_tb.sort_data[2][16] top.sortnet_oddevensort_tb.sort_data[2][15] top.sortnet_oddevensort_tb.sort_data[2][14] top.sortnet_oddevensort_tb.sort_data[2][13] top.sortnet_oddevensort_tb.sort_data[2][12] top.sortnet_oddevensort_tb.sort_data[2][11] top.sortnet_oddevensort_tb.sort_data[2][10] top.sortnet_oddevensort_tb.sort_data[2][9] top.sortnet_oddevensort_tb.sort_data[2][8] top.sortnet_oddevensort_tb.sort_data[2][7] top.sortnet_oddevensort_tb.sort_data[2][6] top.sortnet_oddevensort_tb.sort_data[2][5] top.sortnet_oddevensort_tb.sort_data[2][4] top.sortnet_oddevensort_tb.sort_data[2][3] top.sortnet_oddevensort_tb.sort_data[2][2] top.sortnet_oddevensort_tb.sort_data[2][1] top.sortnet_oddevensort_tb.sort_data[2][0] -#{top.sortnet_oddevensort_tb.sort_data[3][31:0]} top.sortnet_oddevensort_tb.sort_data[3][31] top.sortnet_oddevensort_tb.sort_data[3][30] top.sortnet_oddevensort_tb.sort_data[3][29] top.sortnet_oddevensort_tb.sort_data[3][28] top.sortnet_oddevensort_tb.sort_data[3][27] top.sortnet_oddevensort_tb.sort_data[3][26] top.sortnet_oddevensort_tb.sort_data[3][25] top.sortnet_oddevensort_tb.sort_data[3][24] top.sortnet_oddevensort_tb.sort_data[3][23] top.sortnet_oddevensort_tb.sort_data[3][22] top.sortnet_oddevensort_tb.sort_data[3][21] top.sortnet_oddevensort_tb.sort_data[3][20] top.sortnet_oddevensort_tb.sort_data[3][19] top.sortnet_oddevensort_tb.sort_data[3][18] top.sortnet_oddevensort_tb.sort_data[3][17] top.sortnet_oddevensort_tb.sort_data[3][16] top.sortnet_oddevensort_tb.sort_data[3][15] top.sortnet_oddevensort_tb.sort_data[3][14] top.sortnet_oddevensort_tb.sort_data[3][13] top.sortnet_oddevensort_tb.sort_data[3][12] top.sortnet_oddevensort_tb.sort_data[3][11] top.sortnet_oddevensort_tb.sort_data[3][10] top.sortnet_oddevensort_tb.sort_data[3][9] top.sortnet_oddevensort_tb.sort_data[3][8] top.sortnet_oddevensort_tb.sort_data[3][7] top.sortnet_oddevensort_tb.sort_data[3][6] top.sortnet_oddevensort_tb.sort_data[3][5] top.sortnet_oddevensort_tb.sort_data[3][4] top.sortnet_oddevensort_tb.sort_data[3][3] top.sortnet_oddevensort_tb.sort_data[3][2] top.sortnet_oddevensort_tb.sort_data[3][1] top.sortnet_oddevensort_tb.sort_data[3][0] -#{top.sortnet_oddevensort_tb.sort_data[4][31:0]} top.sortnet_oddevensort_tb.sort_data[4][31] top.sortnet_oddevensort_tb.sort_data[4][30] top.sortnet_oddevensort_tb.sort_data[4][29] top.sortnet_oddevensort_tb.sort_data[4][28] top.sortnet_oddevensort_tb.sort_data[4][27] top.sortnet_oddevensort_tb.sort_data[4][26] top.sortnet_oddevensort_tb.sort_data[4][25] top.sortnet_oddevensort_tb.sort_data[4][24] top.sortnet_oddevensort_tb.sort_data[4][23] top.sortnet_oddevensort_tb.sort_data[4][22] top.sortnet_oddevensort_tb.sort_data[4][21] top.sortnet_oddevensort_tb.sort_data[4][20] top.sortnet_oddevensort_tb.sort_data[4][19] top.sortnet_oddevensort_tb.sort_data[4][18] top.sortnet_oddevensort_tb.sort_data[4][17] top.sortnet_oddevensort_tb.sort_data[4][16] top.sortnet_oddevensort_tb.sort_data[4][15] top.sortnet_oddevensort_tb.sort_data[4][14] top.sortnet_oddevensort_tb.sort_data[4][13] top.sortnet_oddevensort_tb.sort_data[4][12] top.sortnet_oddevensort_tb.sort_data[4][11] top.sortnet_oddevensort_tb.sort_data[4][10] top.sortnet_oddevensort_tb.sort_data[4][9] top.sortnet_oddevensort_tb.sort_data[4][8] top.sortnet_oddevensort_tb.sort_data[4][7] top.sortnet_oddevensort_tb.sort_data[4][6] top.sortnet_oddevensort_tb.sort_data[4][5] top.sortnet_oddevensort_tb.sort_data[4][4] top.sortnet_oddevensort_tb.sort_data[4][3] top.sortnet_oddevensort_tb.sort_data[4][2] top.sortnet_oddevensort_tb.sort_data[4][1] top.sortnet_oddevensort_tb.sort_data[4][0] -#{top.sortnet_oddevensort_tb.sort_data[5][31:0]} top.sortnet_oddevensort_tb.sort_data[5][31] top.sortnet_oddevensort_tb.sort_data[5][30] top.sortnet_oddevensort_tb.sort_data[5][29] top.sortnet_oddevensort_tb.sort_data[5][28] top.sortnet_oddevensort_tb.sort_data[5][27] top.sortnet_oddevensort_tb.sort_data[5][26] top.sortnet_oddevensort_tb.sort_data[5][25] top.sortnet_oddevensort_tb.sort_data[5][24] top.sortnet_oddevensort_tb.sort_data[5][23] top.sortnet_oddevensort_tb.sort_data[5][22] top.sortnet_oddevensort_tb.sort_data[5][21] top.sortnet_oddevensort_tb.sort_data[5][20] top.sortnet_oddevensort_tb.sort_data[5][19] top.sortnet_oddevensort_tb.sort_data[5][18] top.sortnet_oddevensort_tb.sort_data[5][17] top.sortnet_oddevensort_tb.sort_data[5][16] top.sortnet_oddevensort_tb.sort_data[5][15] top.sortnet_oddevensort_tb.sort_data[5][14] top.sortnet_oddevensort_tb.sort_data[5][13] top.sortnet_oddevensort_tb.sort_data[5][12] top.sortnet_oddevensort_tb.sort_data[5][11] top.sortnet_oddevensort_tb.sort_data[5][10] top.sortnet_oddevensort_tb.sort_data[5][9] top.sortnet_oddevensort_tb.sort_data[5][8] top.sortnet_oddevensort_tb.sort_data[5][7] top.sortnet_oddevensort_tb.sort_data[5][6] top.sortnet_oddevensort_tb.sort_data[5][5] top.sortnet_oddevensort_tb.sort_data[5][4] top.sortnet_oddevensort_tb.sort_data[5][3] top.sortnet_oddevensort_tb.sort_data[5][2] top.sortnet_oddevensort_tb.sort_data[5][1] top.sortnet_oddevensort_tb.sort_data[5][0] -#{top.sortnet_oddevensort_tb.sort_data[6][31:0]} top.sortnet_oddevensort_tb.sort_data[6][31] top.sortnet_oddevensort_tb.sort_data[6][30] top.sortnet_oddevensort_tb.sort_data[6][29] top.sortnet_oddevensort_tb.sort_data[6][28] top.sortnet_oddevensort_tb.sort_data[6][27] top.sortnet_oddevensort_tb.sort_data[6][26] top.sortnet_oddevensort_tb.sort_data[6][25] top.sortnet_oddevensort_tb.sort_data[6][24] top.sortnet_oddevensort_tb.sort_data[6][23] top.sortnet_oddevensort_tb.sort_data[6][22] top.sortnet_oddevensort_tb.sort_data[6][21] top.sortnet_oddevensort_tb.sort_data[6][20] top.sortnet_oddevensort_tb.sort_data[6][19] top.sortnet_oddevensort_tb.sort_data[6][18] top.sortnet_oddevensort_tb.sort_data[6][17] top.sortnet_oddevensort_tb.sort_data[6][16] top.sortnet_oddevensort_tb.sort_data[6][15] top.sortnet_oddevensort_tb.sort_data[6][14] top.sortnet_oddevensort_tb.sort_data[6][13] top.sortnet_oddevensort_tb.sort_data[6][12] top.sortnet_oddevensort_tb.sort_data[6][11] top.sortnet_oddevensort_tb.sort_data[6][10] top.sortnet_oddevensort_tb.sort_data[6][9] top.sortnet_oddevensort_tb.sort_data[6][8] top.sortnet_oddevensort_tb.sort_data[6][7] top.sortnet_oddevensort_tb.sort_data[6][6] top.sortnet_oddevensort_tb.sort_data[6][5] top.sortnet_oddevensort_tb.sort_data[6][4] top.sortnet_oddevensort_tb.sort_data[6][3] top.sortnet_oddevensort_tb.sort_data[6][2] top.sortnet_oddevensort_tb.sort_data[6][1] top.sortnet_oddevensort_tb.sort_data[6][0] -#{top.sortnet_oddevensort_tb.sort_data[7][31:0]} top.sortnet_oddevensort_tb.sort_data[7][31] top.sortnet_oddevensort_tb.sort_data[7][30] top.sortnet_oddevensort_tb.sort_data[7][29] top.sortnet_oddevensort_tb.sort_data[7][28] top.sortnet_oddevensort_tb.sort_data[7][27] top.sortnet_oddevensort_tb.sort_data[7][26] top.sortnet_oddevensort_tb.sort_data[7][25] top.sortnet_oddevensort_tb.sort_data[7][24] top.sortnet_oddevensort_tb.sort_data[7][23] top.sortnet_oddevensort_tb.sort_data[7][22] top.sortnet_oddevensort_tb.sort_data[7][21] top.sortnet_oddevensort_tb.sort_data[7][20] top.sortnet_oddevensort_tb.sort_data[7][19] top.sortnet_oddevensort_tb.sort_data[7][18] top.sortnet_oddevensort_tb.sort_data[7][17] top.sortnet_oddevensort_tb.sort_data[7][16] top.sortnet_oddevensort_tb.sort_data[7][15] top.sortnet_oddevensort_tb.sort_data[7][14] top.sortnet_oddevensort_tb.sort_data[7][13] top.sortnet_oddevensort_tb.sort_data[7][12] top.sortnet_oddevensort_tb.sort_data[7][11] top.sortnet_oddevensort_tb.sort_data[7][10] top.sortnet_oddevensort_tb.sort_data[7][9] top.sortnet_oddevensort_tb.sort_data[7][8] top.sortnet_oddevensort_tb.sort_data[7][7] top.sortnet_oddevensort_tb.sort_data[7][6] top.sortnet_oddevensort_tb.sort_data[7][5] top.sortnet_oddevensort_tb.sort_data[7][4] top.sortnet_oddevensort_tb.sort_data[7][3] top.sortnet_oddevensort_tb.sort_data[7][2] top.sortnet_oddevensort_tb.sort_data[7][1] top.sortnet_oddevensort_tb.sort_data[7][0] -#{top.sortnet_oddevensort_tb.sort_data[8][31:0]} top.sortnet_oddevensort_tb.sort_data[8][31] top.sortnet_oddevensort_tb.sort_data[8][30] top.sortnet_oddevensort_tb.sort_data[8][29] top.sortnet_oddevensort_tb.sort_data[8][28] top.sortnet_oddevensort_tb.sort_data[8][27] top.sortnet_oddevensort_tb.sort_data[8][26] top.sortnet_oddevensort_tb.sort_data[8][25] top.sortnet_oddevensort_tb.sort_data[8][24] top.sortnet_oddevensort_tb.sort_data[8][23] top.sortnet_oddevensort_tb.sort_data[8][22] top.sortnet_oddevensort_tb.sort_data[8][21] top.sortnet_oddevensort_tb.sort_data[8][20] top.sortnet_oddevensort_tb.sort_data[8][19] top.sortnet_oddevensort_tb.sort_data[8][18] top.sortnet_oddevensort_tb.sort_data[8][17] top.sortnet_oddevensort_tb.sort_data[8][16] top.sortnet_oddevensort_tb.sort_data[8][15] top.sortnet_oddevensort_tb.sort_data[8][14] top.sortnet_oddevensort_tb.sort_data[8][13] top.sortnet_oddevensort_tb.sort_data[8][12] top.sortnet_oddevensort_tb.sort_data[8][11] top.sortnet_oddevensort_tb.sort_data[8][10] top.sortnet_oddevensort_tb.sort_data[8][9] top.sortnet_oddevensort_tb.sort_data[8][8] top.sortnet_oddevensort_tb.sort_data[8][7] top.sortnet_oddevensort_tb.sort_data[8][6] top.sortnet_oddevensort_tb.sort_data[8][5] top.sortnet_oddevensort_tb.sort_data[8][4] top.sortnet_oddevensort_tb.sort_data[8][3] top.sortnet_oddevensort_tb.sort_data[8][2] top.sortnet_oddevensort_tb.sort_data[8][1] top.sortnet_oddevensort_tb.sort_data[8][0] -#{top.sortnet_oddevensort_tb.sort_data[9][31:0]} top.sortnet_oddevensort_tb.sort_data[9][31] top.sortnet_oddevensort_tb.sort_data[9][30] top.sortnet_oddevensort_tb.sort_data[9][29] top.sortnet_oddevensort_tb.sort_data[9][28] top.sortnet_oddevensort_tb.sort_data[9][27] top.sortnet_oddevensort_tb.sort_data[9][26] top.sortnet_oddevensort_tb.sort_data[9][25] top.sortnet_oddevensort_tb.sort_data[9][24] top.sortnet_oddevensort_tb.sort_data[9][23] top.sortnet_oddevensort_tb.sort_data[9][22] top.sortnet_oddevensort_tb.sort_data[9][21] top.sortnet_oddevensort_tb.sort_data[9][20] top.sortnet_oddevensort_tb.sort_data[9][19] top.sortnet_oddevensort_tb.sort_data[9][18] top.sortnet_oddevensort_tb.sort_data[9][17] top.sortnet_oddevensort_tb.sort_data[9][16] top.sortnet_oddevensort_tb.sort_data[9][15] top.sortnet_oddevensort_tb.sort_data[9][14] top.sortnet_oddevensort_tb.sort_data[9][13] top.sortnet_oddevensort_tb.sort_data[9][12] top.sortnet_oddevensort_tb.sort_data[9][11] top.sortnet_oddevensort_tb.sort_data[9][10] top.sortnet_oddevensort_tb.sort_data[9][9] top.sortnet_oddevensort_tb.sort_data[9][8] top.sortnet_oddevensort_tb.sort_data[9][7] top.sortnet_oddevensort_tb.sort_data[9][6] top.sortnet_oddevensort_tb.sort_data[9][5] top.sortnet_oddevensort_tb.sort_data[9][4] top.sortnet_oddevensort_tb.sort_data[9][3] top.sortnet_oddevensort_tb.sort_data[9][2] top.sortnet_oddevensort_tb.sort_data[9][1] top.sortnet_oddevensort_tb.sort_data[9][0] -#{top.sortnet_oddevensort_tb.sort_data[10][31:0]} top.sortnet_oddevensort_tb.sort_data[10][31] top.sortnet_oddevensort_tb.sort_data[10][30] top.sortnet_oddevensort_tb.sort_data[10][29] top.sortnet_oddevensort_tb.sort_data[10][28] top.sortnet_oddevensort_tb.sort_data[10][27] top.sortnet_oddevensort_tb.sort_data[10][26] top.sortnet_oddevensort_tb.sort_data[10][25] top.sortnet_oddevensort_tb.sort_data[10][24] top.sortnet_oddevensort_tb.sort_data[10][23] top.sortnet_oddevensort_tb.sort_data[10][22] top.sortnet_oddevensort_tb.sort_data[10][21] top.sortnet_oddevensort_tb.sort_data[10][20] top.sortnet_oddevensort_tb.sort_data[10][19] top.sortnet_oddevensort_tb.sort_data[10][18] top.sortnet_oddevensort_tb.sort_data[10][17] top.sortnet_oddevensort_tb.sort_data[10][16] top.sortnet_oddevensort_tb.sort_data[10][15] top.sortnet_oddevensort_tb.sort_data[10][14] top.sortnet_oddevensort_tb.sort_data[10][13] top.sortnet_oddevensort_tb.sort_data[10][12] top.sortnet_oddevensort_tb.sort_data[10][11] top.sortnet_oddevensort_tb.sort_data[10][10] top.sortnet_oddevensort_tb.sort_data[10][9] top.sortnet_oddevensort_tb.sort_data[10][8] top.sortnet_oddevensort_tb.sort_data[10][7] top.sortnet_oddevensort_tb.sort_data[10][6] top.sortnet_oddevensort_tb.sort_data[10][5] top.sortnet_oddevensort_tb.sort_data[10][4] top.sortnet_oddevensort_tb.sort_data[10][3] top.sortnet_oddevensort_tb.sort_data[10][2] top.sortnet_oddevensort_tb.sort_data[10][1] top.sortnet_oddevensort_tb.sort_data[10][0] -#{top.sortnet_oddevensort_tb.sort_data[11][31:0]} top.sortnet_oddevensort_tb.sort_data[11][31] top.sortnet_oddevensort_tb.sort_data[11][30] top.sortnet_oddevensort_tb.sort_data[11][29] top.sortnet_oddevensort_tb.sort_data[11][28] top.sortnet_oddevensort_tb.sort_data[11][27] top.sortnet_oddevensort_tb.sort_data[11][26] top.sortnet_oddevensort_tb.sort_data[11][25] top.sortnet_oddevensort_tb.sort_data[11][24] top.sortnet_oddevensort_tb.sort_data[11][23] top.sortnet_oddevensort_tb.sort_data[11][22] top.sortnet_oddevensort_tb.sort_data[11][21] top.sortnet_oddevensort_tb.sort_data[11][20] top.sortnet_oddevensort_tb.sort_data[11][19] top.sortnet_oddevensort_tb.sort_data[11][18] top.sortnet_oddevensort_tb.sort_data[11][17] top.sortnet_oddevensort_tb.sort_data[11][16] top.sortnet_oddevensort_tb.sort_data[11][15] top.sortnet_oddevensort_tb.sort_data[11][14] top.sortnet_oddevensort_tb.sort_data[11][13] top.sortnet_oddevensort_tb.sort_data[11][12] top.sortnet_oddevensort_tb.sort_data[11][11] top.sortnet_oddevensort_tb.sort_data[11][10] top.sortnet_oddevensort_tb.sort_data[11][9] top.sortnet_oddevensort_tb.sort_data[11][8] top.sortnet_oddevensort_tb.sort_data[11][7] top.sortnet_oddevensort_tb.sort_data[11][6] top.sortnet_oddevensort_tb.sort_data[11][5] top.sortnet_oddevensort_tb.sort_data[11][4] top.sortnet_oddevensort_tb.sort_data[11][3] top.sortnet_oddevensort_tb.sort_data[11][2] top.sortnet_oddevensort_tb.sort_data[11][1] top.sortnet_oddevensort_tb.sort_data[11][0] -#{top.sortnet_oddevensort_tb.sort_data[12][31:0]} top.sortnet_oddevensort_tb.sort_data[12][31] top.sortnet_oddevensort_tb.sort_data[12][30] top.sortnet_oddevensort_tb.sort_data[12][29] top.sortnet_oddevensort_tb.sort_data[12][28] top.sortnet_oddevensort_tb.sort_data[12][27] top.sortnet_oddevensort_tb.sort_data[12][26] top.sortnet_oddevensort_tb.sort_data[12][25] top.sortnet_oddevensort_tb.sort_data[12][24] top.sortnet_oddevensort_tb.sort_data[12][23] top.sortnet_oddevensort_tb.sort_data[12][22] top.sortnet_oddevensort_tb.sort_data[12][21] top.sortnet_oddevensort_tb.sort_data[12][20] top.sortnet_oddevensort_tb.sort_data[12][19] top.sortnet_oddevensort_tb.sort_data[12][18] top.sortnet_oddevensort_tb.sort_data[12][17] top.sortnet_oddevensort_tb.sort_data[12][16] top.sortnet_oddevensort_tb.sort_data[12][15] top.sortnet_oddevensort_tb.sort_data[12][14] top.sortnet_oddevensort_tb.sort_data[12][13] top.sortnet_oddevensort_tb.sort_data[12][12] top.sortnet_oddevensort_tb.sort_data[12][11] top.sortnet_oddevensort_tb.sort_data[12][10] top.sortnet_oddevensort_tb.sort_data[12][9] top.sortnet_oddevensort_tb.sort_data[12][8] top.sortnet_oddevensort_tb.sort_data[12][7] top.sortnet_oddevensort_tb.sort_data[12][6] top.sortnet_oddevensort_tb.sort_data[12][5] top.sortnet_oddevensort_tb.sort_data[12][4] top.sortnet_oddevensort_tb.sort_data[12][3] top.sortnet_oddevensort_tb.sort_data[12][2] top.sortnet_oddevensort_tb.sort_data[12][1] top.sortnet_oddevensort_tb.sort_data[12][0] -#{top.sortnet_oddevensort_tb.sort_data[13][31:0]} top.sortnet_oddevensort_tb.sort_data[13][31] top.sortnet_oddevensort_tb.sort_data[13][30] top.sortnet_oddevensort_tb.sort_data[13][29] top.sortnet_oddevensort_tb.sort_data[13][28] top.sortnet_oddevensort_tb.sort_data[13][27] top.sortnet_oddevensort_tb.sort_data[13][26] top.sortnet_oddevensort_tb.sort_data[13][25] top.sortnet_oddevensort_tb.sort_data[13][24] top.sortnet_oddevensort_tb.sort_data[13][23] top.sortnet_oddevensort_tb.sort_data[13][22] top.sortnet_oddevensort_tb.sort_data[13][21] top.sortnet_oddevensort_tb.sort_data[13][20] top.sortnet_oddevensort_tb.sort_data[13][19] top.sortnet_oddevensort_tb.sort_data[13][18] top.sortnet_oddevensort_tb.sort_data[13][17] top.sortnet_oddevensort_tb.sort_data[13][16] top.sortnet_oddevensort_tb.sort_data[13][15] top.sortnet_oddevensort_tb.sort_data[13][14] top.sortnet_oddevensort_tb.sort_data[13][13] top.sortnet_oddevensort_tb.sort_data[13][12] top.sortnet_oddevensort_tb.sort_data[13][11] top.sortnet_oddevensort_tb.sort_data[13][10] top.sortnet_oddevensort_tb.sort_data[13][9] top.sortnet_oddevensort_tb.sort_data[13][8] top.sortnet_oddevensort_tb.sort_data[13][7] top.sortnet_oddevensort_tb.sort_data[13][6] top.sortnet_oddevensort_tb.sort_data[13][5] top.sortnet_oddevensort_tb.sort_data[13][4] top.sortnet_oddevensort_tb.sort_data[13][3] top.sortnet_oddevensort_tb.sort_data[13][2] top.sortnet_oddevensort_tb.sort_data[13][1] top.sortnet_oddevensort_tb.sort_data[13][0] -#{top.sortnet_oddevensort_tb.sort_data[14][31:0]} top.sortnet_oddevensort_tb.sort_data[14][31] top.sortnet_oddevensort_tb.sort_data[14][30] top.sortnet_oddevensort_tb.sort_data[14][29] top.sortnet_oddevensort_tb.sort_data[14][28] top.sortnet_oddevensort_tb.sort_data[14][27] top.sortnet_oddevensort_tb.sort_data[14][26] top.sortnet_oddevensort_tb.sort_data[14][25] top.sortnet_oddevensort_tb.sort_data[14][24] top.sortnet_oddevensort_tb.sort_data[14][23] top.sortnet_oddevensort_tb.sort_data[14][22] top.sortnet_oddevensort_tb.sort_data[14][21] top.sortnet_oddevensort_tb.sort_data[14][20] top.sortnet_oddevensort_tb.sort_data[14][19] top.sortnet_oddevensort_tb.sort_data[14][18] top.sortnet_oddevensort_tb.sort_data[14][17] top.sortnet_oddevensort_tb.sort_data[14][16] top.sortnet_oddevensort_tb.sort_data[14][15] top.sortnet_oddevensort_tb.sort_data[14][14] top.sortnet_oddevensort_tb.sort_data[14][13] top.sortnet_oddevensort_tb.sort_data[14][12] top.sortnet_oddevensort_tb.sort_data[14][11] top.sortnet_oddevensort_tb.sort_data[14][10] top.sortnet_oddevensort_tb.sort_data[14][9] top.sortnet_oddevensort_tb.sort_data[14][8] top.sortnet_oddevensort_tb.sort_data[14][7] top.sortnet_oddevensort_tb.sort_data[14][6] top.sortnet_oddevensort_tb.sort_data[14][5] top.sortnet_oddevensort_tb.sort_data[14][4] top.sortnet_oddevensort_tb.sort_data[14][3] top.sortnet_oddevensort_tb.sort_data[14][2] top.sortnet_oddevensort_tb.sort_data[14][1] top.sortnet_oddevensort_tb.sort_data[14][0] -#{top.sortnet_oddevensort_tb.sort_data[15][31:0]} top.sortnet_oddevensort_tb.sort_data[15][31] top.sortnet_oddevensort_tb.sort_data[15][30] top.sortnet_oddevensort_tb.sort_data[15][29] top.sortnet_oddevensort_tb.sort_data[15][28] top.sortnet_oddevensort_tb.sort_data[15][27] top.sortnet_oddevensort_tb.sort_data[15][26] top.sortnet_oddevensort_tb.sort_data[15][25] top.sortnet_oddevensort_tb.sort_data[15][24] top.sortnet_oddevensort_tb.sort_data[15][23] top.sortnet_oddevensort_tb.sort_data[15][22] top.sortnet_oddevensort_tb.sort_data[15][21] top.sortnet_oddevensort_tb.sort_data[15][20] top.sortnet_oddevensort_tb.sort_data[15][19] top.sortnet_oddevensort_tb.sort_data[15][18] top.sortnet_oddevensort_tb.sort_data[15][17] top.sortnet_oddevensort_tb.sort_data[15][16] top.sortnet_oddevensort_tb.sort_data[15][15] top.sortnet_oddevensort_tb.sort_data[15][14] top.sortnet_oddevensort_tb.sort_data[15][13] top.sortnet_oddevensort_tb.sort_data[15][12] top.sortnet_oddevensort_tb.sort_data[15][11] top.sortnet_oddevensort_tb.sort_data[15][10] top.sortnet_oddevensort_tb.sort_data[15][9] top.sortnet_oddevensort_tb.sort_data[15][8] top.sortnet_oddevensort_tb.sort_data[15][7] top.sortnet_oddevensort_tb.sort_data[15][6] top.sortnet_oddevensort_tb.sort_data[15][5] top.sortnet_oddevensort_tb.sort_data[15][4] top.sortnet_oddevensort_tb.sort_data[15][3] top.sortnet_oddevensort_tb.sort_data[15][2] top.sortnet_oddevensort_tb.sort_data[15][1] top.sortnet_oddevensort_tb.sort_data[15][0] -#{top.sortnet_oddevensort_tb.sort_data[16][31:0]} top.sortnet_oddevensort_tb.sort_data[16][31] top.sortnet_oddevensort_tb.sort_data[16][30] top.sortnet_oddevensort_tb.sort_data[16][29] top.sortnet_oddevensort_tb.sort_data[16][28] top.sortnet_oddevensort_tb.sort_data[16][27] top.sortnet_oddevensort_tb.sort_data[16][26] top.sortnet_oddevensort_tb.sort_data[16][25] top.sortnet_oddevensort_tb.sort_data[16][24] top.sortnet_oddevensort_tb.sort_data[16][23] top.sortnet_oddevensort_tb.sort_data[16][22] top.sortnet_oddevensort_tb.sort_data[16][21] top.sortnet_oddevensort_tb.sort_data[16][20] top.sortnet_oddevensort_tb.sort_data[16][19] top.sortnet_oddevensort_tb.sort_data[16][18] top.sortnet_oddevensort_tb.sort_data[16][17] top.sortnet_oddevensort_tb.sort_data[16][16] top.sortnet_oddevensort_tb.sort_data[16][15] top.sortnet_oddevensort_tb.sort_data[16][14] top.sortnet_oddevensort_tb.sort_data[16][13] top.sortnet_oddevensort_tb.sort_data[16][12] top.sortnet_oddevensort_tb.sort_data[16][11] top.sortnet_oddevensort_tb.sort_data[16][10] top.sortnet_oddevensort_tb.sort_data[16][9] top.sortnet_oddevensort_tb.sort_data[16][8] top.sortnet_oddevensort_tb.sort_data[16][7] top.sortnet_oddevensort_tb.sort_data[16][6] top.sortnet_oddevensort_tb.sort_data[16][5] top.sortnet_oddevensort_tb.sort_data[16][4] top.sortnet_oddevensort_tb.sort_data[16][3] top.sortnet_oddevensort_tb.sort_data[16][2] top.sortnet_oddevensort_tb.sort_data[16][1] top.sortnet_oddevensort_tb.sort_data[16][0] -#{top.sortnet_oddevensort_tb.sort_data[17][31:0]} top.sortnet_oddevensort_tb.sort_data[17][31] top.sortnet_oddevensort_tb.sort_data[17][30] top.sortnet_oddevensort_tb.sort_data[17][29] top.sortnet_oddevensort_tb.sort_data[17][28] top.sortnet_oddevensort_tb.sort_data[17][27] top.sortnet_oddevensort_tb.sort_data[17][26] top.sortnet_oddevensort_tb.sort_data[17][25] top.sortnet_oddevensort_tb.sort_data[17][24] top.sortnet_oddevensort_tb.sort_data[17][23] top.sortnet_oddevensort_tb.sort_data[17][22] top.sortnet_oddevensort_tb.sort_data[17][21] top.sortnet_oddevensort_tb.sort_data[17][20] top.sortnet_oddevensort_tb.sort_data[17][19] top.sortnet_oddevensort_tb.sort_data[17][18] top.sortnet_oddevensort_tb.sort_data[17][17] top.sortnet_oddevensort_tb.sort_data[17][16] top.sortnet_oddevensort_tb.sort_data[17][15] top.sortnet_oddevensort_tb.sort_data[17][14] top.sortnet_oddevensort_tb.sort_data[17][13] top.sortnet_oddevensort_tb.sort_data[17][12] top.sortnet_oddevensort_tb.sort_data[17][11] top.sortnet_oddevensort_tb.sort_data[17][10] top.sortnet_oddevensort_tb.sort_data[17][9] top.sortnet_oddevensort_tb.sort_data[17][8] top.sortnet_oddevensort_tb.sort_data[17][7] top.sortnet_oddevensort_tb.sort_data[17][6] top.sortnet_oddevensort_tb.sort_data[17][5] top.sortnet_oddevensort_tb.sort_data[17][4] top.sortnet_oddevensort_tb.sort_data[17][3] top.sortnet_oddevensort_tb.sort_data[17][2] top.sortnet_oddevensort_tb.sort_data[17][1] top.sortnet_oddevensort_tb.sort_data[17][0] -#{top.sortnet_oddevensort_tb.sort_data[18][31:0]} top.sortnet_oddevensort_tb.sort_data[18][31] top.sortnet_oddevensort_tb.sort_data[18][30] top.sortnet_oddevensort_tb.sort_data[18][29] top.sortnet_oddevensort_tb.sort_data[18][28] top.sortnet_oddevensort_tb.sort_data[18][27] top.sortnet_oddevensort_tb.sort_data[18][26] top.sortnet_oddevensort_tb.sort_data[18][25] top.sortnet_oddevensort_tb.sort_data[18][24] top.sortnet_oddevensort_tb.sort_data[18][23] top.sortnet_oddevensort_tb.sort_data[18][22] top.sortnet_oddevensort_tb.sort_data[18][21] top.sortnet_oddevensort_tb.sort_data[18][20] top.sortnet_oddevensort_tb.sort_data[18][19] top.sortnet_oddevensort_tb.sort_data[18][18] top.sortnet_oddevensort_tb.sort_data[18][17] top.sortnet_oddevensort_tb.sort_data[18][16] top.sortnet_oddevensort_tb.sort_data[18][15] top.sortnet_oddevensort_tb.sort_data[18][14] top.sortnet_oddevensort_tb.sort_data[18][13] top.sortnet_oddevensort_tb.sort_data[18][12] top.sortnet_oddevensort_tb.sort_data[18][11] top.sortnet_oddevensort_tb.sort_data[18][10] top.sortnet_oddevensort_tb.sort_data[18][9] top.sortnet_oddevensort_tb.sort_data[18][8] top.sortnet_oddevensort_tb.sort_data[18][7] top.sortnet_oddevensort_tb.sort_data[18][6] top.sortnet_oddevensort_tb.sort_data[18][5] top.sortnet_oddevensort_tb.sort_data[18][4] top.sortnet_oddevensort_tb.sort_data[18][3] top.sortnet_oddevensort_tb.sort_data[18][2] top.sortnet_oddevensort_tb.sort_data[18][1] top.sortnet_oddevensort_tb.sort_data[18][0] -#{top.sortnet_oddevensort_tb.sort_data[19][31:0]} top.sortnet_oddevensort_tb.sort_data[19][31] top.sortnet_oddevensort_tb.sort_data[19][30] top.sortnet_oddevensort_tb.sort_data[19][29] top.sortnet_oddevensort_tb.sort_data[19][28] top.sortnet_oddevensort_tb.sort_data[19][27] top.sortnet_oddevensort_tb.sort_data[19][26] top.sortnet_oddevensort_tb.sort_data[19][25] top.sortnet_oddevensort_tb.sort_data[19][24] top.sortnet_oddevensort_tb.sort_data[19][23] top.sortnet_oddevensort_tb.sort_data[19][22] top.sortnet_oddevensort_tb.sort_data[19][21] top.sortnet_oddevensort_tb.sort_data[19][20] top.sortnet_oddevensort_tb.sort_data[19][19] top.sortnet_oddevensort_tb.sort_data[19][18] top.sortnet_oddevensort_tb.sort_data[19][17] top.sortnet_oddevensort_tb.sort_data[19][16] top.sortnet_oddevensort_tb.sort_data[19][15] top.sortnet_oddevensort_tb.sort_data[19][14] top.sortnet_oddevensort_tb.sort_data[19][13] top.sortnet_oddevensort_tb.sort_data[19][12] top.sortnet_oddevensort_tb.sort_data[19][11] top.sortnet_oddevensort_tb.sort_data[19][10] top.sortnet_oddevensort_tb.sort_data[19][9] top.sortnet_oddevensort_tb.sort_data[19][8] top.sortnet_oddevensort_tb.sort_data[19][7] top.sortnet_oddevensort_tb.sort_data[19][6] top.sortnet_oddevensort_tb.sort_data[19][5] top.sortnet_oddevensort_tb.sort_data[19][4] top.sortnet_oddevensort_tb.sort_data[19][3] top.sortnet_oddevensort_tb.sort_data[19][2] top.sortnet_oddevensort_tb.sort_data[19][1] top.sortnet_oddevensort_tb.sort_data[19][0] -#{top.sortnet_oddevensort_tb.sort_data[20][31:0]} top.sortnet_oddevensort_tb.sort_data[20][31] top.sortnet_oddevensort_tb.sort_data[20][30] top.sortnet_oddevensort_tb.sort_data[20][29] top.sortnet_oddevensort_tb.sort_data[20][28] top.sortnet_oddevensort_tb.sort_data[20][27] top.sortnet_oddevensort_tb.sort_data[20][26] top.sortnet_oddevensort_tb.sort_data[20][25] top.sortnet_oddevensort_tb.sort_data[20][24] top.sortnet_oddevensort_tb.sort_data[20][23] top.sortnet_oddevensort_tb.sort_data[20][22] top.sortnet_oddevensort_tb.sort_data[20][21] top.sortnet_oddevensort_tb.sort_data[20][20] top.sortnet_oddevensort_tb.sort_data[20][19] top.sortnet_oddevensort_tb.sort_data[20][18] top.sortnet_oddevensort_tb.sort_data[20][17] top.sortnet_oddevensort_tb.sort_data[20][16] top.sortnet_oddevensort_tb.sort_data[20][15] top.sortnet_oddevensort_tb.sort_data[20][14] top.sortnet_oddevensort_tb.sort_data[20][13] top.sortnet_oddevensort_tb.sort_data[20][12] top.sortnet_oddevensort_tb.sort_data[20][11] top.sortnet_oddevensort_tb.sort_data[20][10] top.sortnet_oddevensort_tb.sort_data[20][9] top.sortnet_oddevensort_tb.sort_data[20][8] top.sortnet_oddevensort_tb.sort_data[20][7] top.sortnet_oddevensort_tb.sort_data[20][6] top.sortnet_oddevensort_tb.sort_data[20][5] top.sortnet_oddevensort_tb.sort_data[20][4] top.sortnet_oddevensort_tb.sort_data[20][3] top.sortnet_oddevensort_tb.sort_data[20][2] top.sortnet_oddevensort_tb.sort_data[20][1] top.sortnet_oddevensort_tb.sort_data[20][0] -#{top.sortnet_oddevensort_tb.sort_data[21][31:0]} top.sortnet_oddevensort_tb.sort_data[21][31] top.sortnet_oddevensort_tb.sort_data[21][30] top.sortnet_oddevensort_tb.sort_data[21][29] top.sortnet_oddevensort_tb.sort_data[21][28] top.sortnet_oddevensort_tb.sort_data[21][27] top.sortnet_oddevensort_tb.sort_data[21][26] top.sortnet_oddevensort_tb.sort_data[21][25] top.sortnet_oddevensort_tb.sort_data[21][24] top.sortnet_oddevensort_tb.sort_data[21][23] top.sortnet_oddevensort_tb.sort_data[21][22] top.sortnet_oddevensort_tb.sort_data[21][21] top.sortnet_oddevensort_tb.sort_data[21][20] top.sortnet_oddevensort_tb.sort_data[21][19] top.sortnet_oddevensort_tb.sort_data[21][18] top.sortnet_oddevensort_tb.sort_data[21][17] top.sortnet_oddevensort_tb.sort_data[21][16] top.sortnet_oddevensort_tb.sort_data[21][15] top.sortnet_oddevensort_tb.sort_data[21][14] top.sortnet_oddevensort_tb.sort_data[21][13] top.sortnet_oddevensort_tb.sort_data[21][12] top.sortnet_oddevensort_tb.sort_data[21][11] top.sortnet_oddevensort_tb.sort_data[21][10] top.sortnet_oddevensort_tb.sort_data[21][9] top.sortnet_oddevensort_tb.sort_data[21][8] top.sortnet_oddevensort_tb.sort_data[21][7] top.sortnet_oddevensort_tb.sort_data[21][6] top.sortnet_oddevensort_tb.sort_data[21][5] top.sortnet_oddevensort_tb.sort_data[21][4] top.sortnet_oddevensort_tb.sort_data[21][3] top.sortnet_oddevensort_tb.sort_data[21][2] top.sortnet_oddevensort_tb.sort_data[21][1] top.sortnet_oddevensort_tb.sort_data[21][0] -#{top.sortnet_oddevensort_tb.sort_data[22][31:0]} top.sortnet_oddevensort_tb.sort_data[22][31] top.sortnet_oddevensort_tb.sort_data[22][30] top.sortnet_oddevensort_tb.sort_data[22][29] top.sortnet_oddevensort_tb.sort_data[22][28] top.sortnet_oddevensort_tb.sort_data[22][27] top.sortnet_oddevensort_tb.sort_data[22][26] top.sortnet_oddevensort_tb.sort_data[22][25] top.sortnet_oddevensort_tb.sort_data[22][24] top.sortnet_oddevensort_tb.sort_data[22][23] top.sortnet_oddevensort_tb.sort_data[22][22] top.sortnet_oddevensort_tb.sort_data[22][21] top.sortnet_oddevensort_tb.sort_data[22][20] top.sortnet_oddevensort_tb.sort_data[22][19] top.sortnet_oddevensort_tb.sort_data[22][18] top.sortnet_oddevensort_tb.sort_data[22][17] top.sortnet_oddevensort_tb.sort_data[22][16] top.sortnet_oddevensort_tb.sort_data[22][15] top.sortnet_oddevensort_tb.sort_data[22][14] top.sortnet_oddevensort_tb.sort_data[22][13] top.sortnet_oddevensort_tb.sort_data[22][12] top.sortnet_oddevensort_tb.sort_data[22][11] top.sortnet_oddevensort_tb.sort_data[22][10] top.sortnet_oddevensort_tb.sort_data[22][9] top.sortnet_oddevensort_tb.sort_data[22][8] top.sortnet_oddevensort_tb.sort_data[22][7] top.sortnet_oddevensort_tb.sort_data[22][6] top.sortnet_oddevensort_tb.sort_data[22][5] top.sortnet_oddevensort_tb.sort_data[22][4] top.sortnet_oddevensort_tb.sort_data[22][3] top.sortnet_oddevensort_tb.sort_data[22][2] top.sortnet_oddevensort_tb.sort_data[22][1] top.sortnet_oddevensort_tb.sort_data[22][0] -#{top.sortnet_oddevensort_tb.sort_data[23][31:0]} top.sortnet_oddevensort_tb.sort_data[23][31] top.sortnet_oddevensort_tb.sort_data[23][30] top.sortnet_oddevensort_tb.sort_data[23][29] top.sortnet_oddevensort_tb.sort_data[23][28] top.sortnet_oddevensort_tb.sort_data[23][27] top.sortnet_oddevensort_tb.sort_data[23][26] top.sortnet_oddevensort_tb.sort_data[23][25] top.sortnet_oddevensort_tb.sort_data[23][24] top.sortnet_oddevensort_tb.sort_data[23][23] top.sortnet_oddevensort_tb.sort_data[23][22] top.sortnet_oddevensort_tb.sort_data[23][21] top.sortnet_oddevensort_tb.sort_data[23][20] top.sortnet_oddevensort_tb.sort_data[23][19] top.sortnet_oddevensort_tb.sort_data[23][18] top.sortnet_oddevensort_tb.sort_data[23][17] top.sortnet_oddevensort_tb.sort_data[23][16] top.sortnet_oddevensort_tb.sort_data[23][15] top.sortnet_oddevensort_tb.sort_data[23][14] top.sortnet_oddevensort_tb.sort_data[23][13] top.sortnet_oddevensort_tb.sort_data[23][12] top.sortnet_oddevensort_tb.sort_data[23][11] top.sortnet_oddevensort_tb.sort_data[23][10] top.sortnet_oddevensort_tb.sort_data[23][9] top.sortnet_oddevensort_tb.sort_data[23][8] top.sortnet_oddevensort_tb.sort_data[23][7] top.sortnet_oddevensort_tb.sort_data[23][6] top.sortnet_oddevensort_tb.sort_data[23][5] top.sortnet_oddevensort_tb.sort_data[23][4] top.sortnet_oddevensort_tb.sort_data[23][3] top.sortnet_oddevensort_tb.sort_data[23][2] top.sortnet_oddevensort_tb.sort_data[23][1] top.sortnet_oddevensort_tb.sort_data[23][0] -#{top.sortnet_oddevensort_tb.sort_data[24][31:0]} top.sortnet_oddevensort_tb.sort_data[24][31] top.sortnet_oddevensort_tb.sort_data[24][30] top.sortnet_oddevensort_tb.sort_data[24][29] top.sortnet_oddevensort_tb.sort_data[24][28] top.sortnet_oddevensort_tb.sort_data[24][27] top.sortnet_oddevensort_tb.sort_data[24][26] top.sortnet_oddevensort_tb.sort_data[24][25] top.sortnet_oddevensort_tb.sort_data[24][24] top.sortnet_oddevensort_tb.sort_data[24][23] top.sortnet_oddevensort_tb.sort_data[24][22] top.sortnet_oddevensort_tb.sort_data[24][21] top.sortnet_oddevensort_tb.sort_data[24][20] top.sortnet_oddevensort_tb.sort_data[24][19] top.sortnet_oddevensort_tb.sort_data[24][18] top.sortnet_oddevensort_tb.sort_data[24][17] top.sortnet_oddevensort_tb.sort_data[24][16] top.sortnet_oddevensort_tb.sort_data[24][15] top.sortnet_oddevensort_tb.sort_data[24][14] top.sortnet_oddevensort_tb.sort_data[24][13] top.sortnet_oddevensort_tb.sort_data[24][12] top.sortnet_oddevensort_tb.sort_data[24][11] top.sortnet_oddevensort_tb.sort_data[24][10] top.sortnet_oddevensort_tb.sort_data[24][9] top.sortnet_oddevensort_tb.sort_data[24][8] top.sortnet_oddevensort_tb.sort_data[24][7] top.sortnet_oddevensort_tb.sort_data[24][6] top.sortnet_oddevensort_tb.sort_data[24][5] top.sortnet_oddevensort_tb.sort_data[24][4] top.sortnet_oddevensort_tb.sort_data[24][3] top.sortnet_oddevensort_tb.sort_data[24][2] top.sortnet_oddevensort_tb.sort_data[24][1] top.sortnet_oddevensort_tb.sort_data[24][0] -#{top.sortnet_oddevensort_tb.sort_data[25][31:0]} top.sortnet_oddevensort_tb.sort_data[25][31] top.sortnet_oddevensort_tb.sort_data[25][30] top.sortnet_oddevensort_tb.sort_data[25][29] top.sortnet_oddevensort_tb.sort_data[25][28] top.sortnet_oddevensort_tb.sort_data[25][27] top.sortnet_oddevensort_tb.sort_data[25][26] top.sortnet_oddevensort_tb.sort_data[25][25] top.sortnet_oddevensort_tb.sort_data[25][24] top.sortnet_oddevensort_tb.sort_data[25][23] top.sortnet_oddevensort_tb.sort_data[25][22] top.sortnet_oddevensort_tb.sort_data[25][21] top.sortnet_oddevensort_tb.sort_data[25][20] top.sortnet_oddevensort_tb.sort_data[25][19] top.sortnet_oddevensort_tb.sort_data[25][18] top.sortnet_oddevensort_tb.sort_data[25][17] top.sortnet_oddevensort_tb.sort_data[25][16] top.sortnet_oddevensort_tb.sort_data[25][15] top.sortnet_oddevensort_tb.sort_data[25][14] top.sortnet_oddevensort_tb.sort_data[25][13] top.sortnet_oddevensort_tb.sort_data[25][12] top.sortnet_oddevensort_tb.sort_data[25][11] top.sortnet_oddevensort_tb.sort_data[25][10] top.sortnet_oddevensort_tb.sort_data[25][9] top.sortnet_oddevensort_tb.sort_data[25][8] top.sortnet_oddevensort_tb.sort_data[25][7] top.sortnet_oddevensort_tb.sort_data[25][6] top.sortnet_oddevensort_tb.sort_data[25][5] top.sortnet_oddevensort_tb.sort_data[25][4] top.sortnet_oddevensort_tb.sort_data[25][3] top.sortnet_oddevensort_tb.sort_data[25][2] top.sortnet_oddevensort_tb.sort_data[25][1] top.sortnet_oddevensort_tb.sort_data[25][0] -#{top.sortnet_oddevensort_tb.sort_data[26][31:0]} top.sortnet_oddevensort_tb.sort_data[26][31] top.sortnet_oddevensort_tb.sort_data[26][30] top.sortnet_oddevensort_tb.sort_data[26][29] top.sortnet_oddevensort_tb.sort_data[26][28] top.sortnet_oddevensort_tb.sort_data[26][27] top.sortnet_oddevensort_tb.sort_data[26][26] top.sortnet_oddevensort_tb.sort_data[26][25] top.sortnet_oddevensort_tb.sort_data[26][24] top.sortnet_oddevensort_tb.sort_data[26][23] top.sortnet_oddevensort_tb.sort_data[26][22] top.sortnet_oddevensort_tb.sort_data[26][21] top.sortnet_oddevensort_tb.sort_data[26][20] top.sortnet_oddevensort_tb.sort_data[26][19] top.sortnet_oddevensort_tb.sort_data[26][18] top.sortnet_oddevensort_tb.sort_data[26][17] top.sortnet_oddevensort_tb.sort_data[26][16] top.sortnet_oddevensort_tb.sort_data[26][15] top.sortnet_oddevensort_tb.sort_data[26][14] top.sortnet_oddevensort_tb.sort_data[26][13] top.sortnet_oddevensort_tb.sort_data[26][12] top.sortnet_oddevensort_tb.sort_data[26][11] top.sortnet_oddevensort_tb.sort_data[26][10] top.sortnet_oddevensort_tb.sort_data[26][9] top.sortnet_oddevensort_tb.sort_data[26][8] top.sortnet_oddevensort_tb.sort_data[26][7] top.sortnet_oddevensort_tb.sort_data[26][6] top.sortnet_oddevensort_tb.sort_data[26][5] top.sortnet_oddevensort_tb.sort_data[26][4] top.sortnet_oddevensort_tb.sort_data[26][3] top.sortnet_oddevensort_tb.sort_data[26][2] top.sortnet_oddevensort_tb.sort_data[26][1] top.sortnet_oddevensort_tb.sort_data[26][0] -#{top.sortnet_oddevensort_tb.sort_data[27][31:0]} top.sortnet_oddevensort_tb.sort_data[27][31] top.sortnet_oddevensort_tb.sort_data[27][30] top.sortnet_oddevensort_tb.sort_data[27][29] top.sortnet_oddevensort_tb.sort_data[27][28] top.sortnet_oddevensort_tb.sort_data[27][27] top.sortnet_oddevensort_tb.sort_data[27][26] top.sortnet_oddevensort_tb.sort_data[27][25] top.sortnet_oddevensort_tb.sort_data[27][24] top.sortnet_oddevensort_tb.sort_data[27][23] top.sortnet_oddevensort_tb.sort_data[27][22] top.sortnet_oddevensort_tb.sort_data[27][21] top.sortnet_oddevensort_tb.sort_data[27][20] top.sortnet_oddevensort_tb.sort_data[27][19] top.sortnet_oddevensort_tb.sort_data[27][18] top.sortnet_oddevensort_tb.sort_data[27][17] top.sortnet_oddevensort_tb.sort_data[27][16] top.sortnet_oddevensort_tb.sort_data[27][15] top.sortnet_oddevensort_tb.sort_data[27][14] top.sortnet_oddevensort_tb.sort_data[27][13] top.sortnet_oddevensort_tb.sort_data[27][12] top.sortnet_oddevensort_tb.sort_data[27][11] top.sortnet_oddevensort_tb.sort_data[27][10] top.sortnet_oddevensort_tb.sort_data[27][9] top.sortnet_oddevensort_tb.sort_data[27][8] top.sortnet_oddevensort_tb.sort_data[27][7] top.sortnet_oddevensort_tb.sort_data[27][6] top.sortnet_oddevensort_tb.sort_data[27][5] top.sortnet_oddevensort_tb.sort_data[27][4] top.sortnet_oddevensort_tb.sort_data[27][3] top.sortnet_oddevensort_tb.sort_data[27][2] top.sortnet_oddevensort_tb.sort_data[27][1] top.sortnet_oddevensort_tb.sort_data[27][0] -#{top.sortnet_oddevensort_tb.sort_data[28][31:0]} top.sortnet_oddevensort_tb.sort_data[28][31] top.sortnet_oddevensort_tb.sort_data[28][30] top.sortnet_oddevensort_tb.sort_data[28][29] top.sortnet_oddevensort_tb.sort_data[28][28] top.sortnet_oddevensort_tb.sort_data[28][27] top.sortnet_oddevensort_tb.sort_data[28][26] top.sortnet_oddevensort_tb.sort_data[28][25] top.sortnet_oddevensort_tb.sort_data[28][24] top.sortnet_oddevensort_tb.sort_data[28][23] top.sortnet_oddevensort_tb.sort_data[28][22] top.sortnet_oddevensort_tb.sort_data[28][21] top.sortnet_oddevensort_tb.sort_data[28][20] top.sortnet_oddevensort_tb.sort_data[28][19] top.sortnet_oddevensort_tb.sort_data[28][18] top.sortnet_oddevensort_tb.sort_data[28][17] top.sortnet_oddevensort_tb.sort_data[28][16] top.sortnet_oddevensort_tb.sort_data[28][15] top.sortnet_oddevensort_tb.sort_data[28][14] top.sortnet_oddevensort_tb.sort_data[28][13] top.sortnet_oddevensort_tb.sort_data[28][12] top.sortnet_oddevensort_tb.sort_data[28][11] top.sortnet_oddevensort_tb.sort_data[28][10] top.sortnet_oddevensort_tb.sort_data[28][9] top.sortnet_oddevensort_tb.sort_data[28][8] top.sortnet_oddevensort_tb.sort_data[28][7] top.sortnet_oddevensort_tb.sort_data[28][6] top.sortnet_oddevensort_tb.sort_data[28][5] top.sortnet_oddevensort_tb.sort_data[28][4] top.sortnet_oddevensort_tb.sort_data[28][3] top.sortnet_oddevensort_tb.sort_data[28][2] top.sortnet_oddevensort_tb.sort_data[28][1] top.sortnet_oddevensort_tb.sort_data[28][0] -#{top.sortnet_oddevensort_tb.sort_data[29][31:0]} top.sortnet_oddevensort_tb.sort_data[29][31] top.sortnet_oddevensort_tb.sort_data[29][30] top.sortnet_oddevensort_tb.sort_data[29][29] top.sortnet_oddevensort_tb.sort_data[29][28] top.sortnet_oddevensort_tb.sort_data[29][27] top.sortnet_oddevensort_tb.sort_data[29][26] top.sortnet_oddevensort_tb.sort_data[29][25] top.sortnet_oddevensort_tb.sort_data[29][24] top.sortnet_oddevensort_tb.sort_data[29][23] top.sortnet_oddevensort_tb.sort_data[29][22] top.sortnet_oddevensort_tb.sort_data[29][21] top.sortnet_oddevensort_tb.sort_data[29][20] top.sortnet_oddevensort_tb.sort_data[29][19] top.sortnet_oddevensort_tb.sort_data[29][18] top.sortnet_oddevensort_tb.sort_data[29][17] top.sortnet_oddevensort_tb.sort_data[29][16] top.sortnet_oddevensort_tb.sort_data[29][15] top.sortnet_oddevensort_tb.sort_data[29][14] top.sortnet_oddevensort_tb.sort_data[29][13] top.sortnet_oddevensort_tb.sort_data[29][12] top.sortnet_oddevensort_tb.sort_data[29][11] top.sortnet_oddevensort_tb.sort_data[29][10] top.sortnet_oddevensort_tb.sort_data[29][9] top.sortnet_oddevensort_tb.sort_data[29][8] top.sortnet_oddevensort_tb.sort_data[29][7] top.sortnet_oddevensort_tb.sort_data[29][6] top.sortnet_oddevensort_tb.sort_data[29][5] top.sortnet_oddevensort_tb.sort_data[29][4] top.sortnet_oddevensort_tb.sort_data[29][3] top.sortnet_oddevensort_tb.sort_data[29][2] top.sortnet_oddevensort_tb.sort_data[29][1] top.sortnet_oddevensort_tb.sort_data[29][0] -#{top.sortnet_oddevensort_tb.sort_data[30][31:0]} top.sortnet_oddevensort_tb.sort_data[30][31] top.sortnet_oddevensort_tb.sort_data[30][30] top.sortnet_oddevensort_tb.sort_data[30][29] top.sortnet_oddevensort_tb.sort_data[30][28] top.sortnet_oddevensort_tb.sort_data[30][27] top.sortnet_oddevensort_tb.sort_data[30][26] top.sortnet_oddevensort_tb.sort_data[30][25] top.sortnet_oddevensort_tb.sort_data[30][24] top.sortnet_oddevensort_tb.sort_data[30][23] top.sortnet_oddevensort_tb.sort_data[30][22] top.sortnet_oddevensort_tb.sort_data[30][21] top.sortnet_oddevensort_tb.sort_data[30][20] top.sortnet_oddevensort_tb.sort_data[30][19] top.sortnet_oddevensort_tb.sort_data[30][18] top.sortnet_oddevensort_tb.sort_data[30][17] top.sortnet_oddevensort_tb.sort_data[30][16] top.sortnet_oddevensort_tb.sort_data[30][15] top.sortnet_oddevensort_tb.sort_data[30][14] top.sortnet_oddevensort_tb.sort_data[30][13] top.sortnet_oddevensort_tb.sort_data[30][12] top.sortnet_oddevensort_tb.sort_data[30][11] top.sortnet_oddevensort_tb.sort_data[30][10] top.sortnet_oddevensort_tb.sort_data[30][9] top.sortnet_oddevensort_tb.sort_data[30][8] top.sortnet_oddevensort_tb.sort_data[30][7] top.sortnet_oddevensort_tb.sort_data[30][6] top.sortnet_oddevensort_tb.sort_data[30][5] top.sortnet_oddevensort_tb.sort_data[30][4] top.sortnet_oddevensort_tb.sort_data[30][3] top.sortnet_oddevensort_tb.sort_data[30][2] top.sortnet_oddevensort_tb.sort_data[30][1] top.sortnet_oddevensort_tb.sort_data[30][0] -#{top.sortnet_oddevensort_tb.sort_data[31][31:0]} top.sortnet_oddevensort_tb.sort_data[31][31] top.sortnet_oddevensort_tb.sort_data[31][30] top.sortnet_oddevensort_tb.sort_data[31][29] top.sortnet_oddevensort_tb.sort_data[31][28] top.sortnet_oddevensort_tb.sort_data[31][27] top.sortnet_oddevensort_tb.sort_data[31][26] top.sortnet_oddevensort_tb.sort_data[31][25] top.sortnet_oddevensort_tb.sort_data[31][24] top.sortnet_oddevensort_tb.sort_data[31][23] top.sortnet_oddevensort_tb.sort_data[31][22] top.sortnet_oddevensort_tb.sort_data[31][21] top.sortnet_oddevensort_tb.sort_data[31][20] top.sortnet_oddevensort_tb.sort_data[31][19] top.sortnet_oddevensort_tb.sort_data[31][18] top.sortnet_oddevensort_tb.sort_data[31][17] top.sortnet_oddevensort_tb.sort_data[31][16] top.sortnet_oddevensort_tb.sort_data[31][15] top.sortnet_oddevensort_tb.sort_data[31][14] top.sortnet_oddevensort_tb.sort_data[31][13] top.sortnet_oddevensort_tb.sort_data[31][12] top.sortnet_oddevensort_tb.sort_data[31][11] top.sortnet_oddevensort_tb.sort_data[31][10] top.sortnet_oddevensort_tb.sort_data[31][9] top.sortnet_oddevensort_tb.sort_data[31][8] top.sortnet_oddevensort_tb.sort_data[31][7] top.sortnet_oddevensort_tb.sort_data[31][6] top.sortnet_oddevensort_tb.sort_data[31][5] top.sortnet_oddevensort_tb.sort_data[31][4] top.sortnet_oddevensort_tb.sort_data[31][3] top.sortnet_oddevensort_tb.sort_data[31][2] top.sortnet_oddevensort_tb.sort_data[31][1] top.sortnet_oddevensort_tb.sort_data[31][0] -@28 -top.sortnet_oddevensort_tb.sort_valid -top.sortnet_oddevensort_tb.sort_iskey -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/sort/sortnet/sortnet_OddEvenSort_tb.wcfg b/sim/sort/sortnet/sortnet_OddEvenSort_tb.wcfg deleted file mode 100644 index 963b9d887..000000000 --- a/sim/sort/sortnet/sortnet_OddEvenSort_tb.wcfg +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - Clock - Clock - - - KeyInputVector[7:0][7:0] - KeyInputVector[7:0][7:0] - UNSIGNEDDECRADIX - - [7][7:0] - KeyInputVector[7][7:0] - UNSIGNEDDECRADIX - - - [6][7:0] - KeyInputVector[6][7:0] - UNSIGNEDDECRADIX - - - [5][7:0] - KeyInputVector[5][7:0] - UNSIGNEDDECRADIX - - - [4][7:0] - KeyInputVector[4][7:0] - UNSIGNEDDECRADIX - - - [3][7:0] - KeyInputVector[3][7:0] - UNSIGNEDDECRADIX - - - [2][7:0] - KeyInputVector[2][7:0] - UNSIGNEDDECRADIX - - - [1][7:0] - KeyInputVector[1][7:0] - UNSIGNEDDECRADIX - - - [0][7:0] - KeyInputVector[0][7:0] - UNSIGNEDDECRADIX - - - - KeyOutputVector[7:0][7:0] - KeyOutputVector[7:0][7:0] - UNSIGNEDDECRADIX - - [7][7:0] - KeyOutputVector[7][7:0] - UNSIGNEDDECRADIX - - - [6][7:0] - KeyOutputVector[6][7:0] - UNSIGNEDDECRADIX - - - [5][7:0] - KeyOutputVector[5][7:0] - UNSIGNEDDECRADIX - - - [4][7:0] - KeyOutputVector[4][7:0] - UNSIGNEDDECRADIX - - - [3][7:0] - KeyOutputVector[3][7:0] - UNSIGNEDDECRADIX - - - [2][7:0] - KeyOutputVector[2][7:0] - UNSIGNEDDECRADIX - - - [1][7:0] - KeyOutputVector[1][7:0] - UNSIGNEDDECRADIX - - - [0][7:0] - KeyOutputVector[0][7:0] - UNSIGNEDDECRADIX - - - - StopSimulation - StopSimulation - - diff --git a/sim/sort/sortnet/sortnet_OddEvenSort_tb.wdo b/sim/sort/sortnet/sortnet_OddEvenSort_tb.wdo deleted file mode 100644 index 04703465a..000000000 --- a/sim/sort/sortnet/sortnet_OddEvenSort_tb.wdo +++ /dev/null @@ -1,31 +0,0 @@ -onerror {resume} -quietly WaveActivateNextPane {} 0 -add wave -noupdate /sortnet_oddevensort_tb/Clock -add wave -noupdate -divider Generator -add wave -noupdate /sortnet_oddevensort_tb/Generator_Valid -add wave -noupdate -radix unsigned -radixshowbase 0 /sortnet_oddevensort_tb/Generator_Meta -add wave -noupdate /sortnet_oddevensort_tb/Generator_IsKey -add wave -noupdate -radix hexadecimal -childformat {{/sortnet_oddevensort_tb/Generator_Data(31) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(30) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(29) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(28) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(27) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(26) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(25) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(24) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(23) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(22) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(21) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(20) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(19) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(18) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(17) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(16) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(15) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(14) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(13) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(12) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(11) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(10) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(9) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(8) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(7) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(6) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(5) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(4) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(3) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(2) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(1) -radix hexadecimal} {/sortnet_oddevensort_tb/Generator_Data(0) -radix hexadecimal}} -radixshowbase 0 -expand -subitemconfig {/sortnet_oddevensort_tb/Generator_Data(31) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(30) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(29) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(28) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(27) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(26) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(25) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(24) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(23) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(22) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(21) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(20) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(19) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(18) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(17) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(16) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(15) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(14) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(13) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(12) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(11) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(10) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(9) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(8) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(7) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(6) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(5) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(4) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(3) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(2) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(1) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Generator_Data(0) {-radix hexadecimal -radixshowbase 0}} /sortnet_oddevensort_tb/Generator_Data -add wave -noupdate -divider {SortNet - OddEvenSort} -add wave -noupdate /sortnet_oddevensort_tb/Sort_Valid -add wave -noupdate /sortnet_oddevensort_tb/Sort_Meta -add wave -noupdate /sortnet_oddevensort_tb/Sort_IsKey -add wave -noupdate -radix hexadecimal -childformat {{/sortnet_oddevensort_tb/Sort_Data(31) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(30) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(29) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(28) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(27) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(26) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(25) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(24) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(23) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(22) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(21) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(20) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(19) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(18) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(17) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(16) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(15) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(14) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(13) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(12) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(11) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(10) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(9) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(8) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(7) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(6) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(5) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(4) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(3) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(2) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(1) -radix hexadecimal} {/sortnet_oddevensort_tb/Sort_Data(0) -radix hexadecimal}} -radixshowbase 0 -expand -subitemconfig {/sortnet_oddevensort_tb/Sort_Data(31) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(30) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(29) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(28) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(27) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(26) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(25) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(24) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(23) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(22) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(21) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(20) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(19) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(18) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(17) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(16) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(15) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(14) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(13) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(12) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(11) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(10) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(9) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(8) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(7) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(6) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(5) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(4) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(3) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(2) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(1) {-radix hexadecimal -radixshowbase 0} /sortnet_oddevensort_tb/Sort_Data(0) {-radix hexadecimal -radixshowbase 0}} /sortnet_oddevensort_tb/Sort_Data -TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 1} {709303923 fs} 0} -quietly wave cursor active 1 -configure wave -namecolwidth 306 -configure wave -valuecolwidth 100 -configure wave -justifyvalue left -configure wave -signalnamewidth 0 -configure wave -snapdistance 10 -configure wave -datasetprefix 0 -configure wave -rowmargin 4 -configure wave -childrowmargin 2 -configure wave -gridoffset 0 -configure wave -gridperiod 1 -configure wave -griddelta 40 -configure wave -timeline 0 -configure wave -timelineunits ns -update -WaveRestoreZoom {0 fs} {451500 ps} diff --git a/sim/sort/sortnet/sortnet_Stream_Adapter2_tb.ghdl b/sim/sort/sortnet/sortnet_Stream_Adapter2_tb.ghdl deleted file mode 100644 index 0558917a3..000000000 --- a/sim/sort/sortnet/sortnet_Stream_Adapter2_tb.ghdl +++ /dev/null @@ -1,168 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/sortnet_stream_adapter2_tb/clock -/sortnet_stream_adapter2_tb/generator_valid -/sortnet_stream_adapter2_tb/generator_data -/sortnet_stream_adapter2_tb/generator_sof -/sortnet_stream_adapter2_tb/generator_iskey -/sortnet_stream_adapter2_tb/generator_eof -/sortnet_stream_adapter2_tb/generator_meta -/sortnet_stream_adapter2_tb/sort_out_valid -/sortnet_stream_adapter2_tb/sort_out_data -/sortnet_stream_adapter2_tb/sort_out_iskey -/sortnet_stream_adapter2_tb/tester_ack -/sortnet_stream_adapter2_tb/sort/clock -/sortnet_stream_adapter2_tb/sort/reset -/sortnet_stream_adapter2_tb/sort/inverse -/sortnet_stream_adapter2_tb/sort/in_valid -/sortnet_stream_adapter2_tb/sort/in_data -/sortnet_stream_adapter2_tb/sort/in_meta -/sortnet_stream_adapter2_tb/sort/in_sof -/sortnet_stream_adapter2_tb/sort/in_iskey -/sortnet_stream_adapter2_tb/sort/in_eof -/sortnet_stream_adapter2_tb/sort/in_ack -/sortnet_stream_adapter2_tb/sort/out_valid -/sortnet_stream_adapter2_tb/sort/out_data -/sortnet_stream_adapter2_tb/sort/out_meta -/sortnet_stream_adapter2_tb/sort/out_sof -/sortnet_stream_adapter2_tb/sort/out_iskey -/sortnet_stream_adapter2_tb/sort/out_eof -/sortnet_stream_adapter2_tb/sort/out_ack -/sortnet_stream_adapter2_tb/sort/synchronized_r -/sortnet_stream_adapter2_tb/sort/syncin -/sortnet_stream_adapter2_tb/sort/metain -/sortnet_stream_adapter2_tb/sort/gearup_sync -/sortnet_stream_adapter2_tb/sort/gearup_valid -/sortnet_stream_adapter2_tb/sort/gearup_data -/sortnet_stream_adapter2_tb/sort/gearup_meta -/sortnet_stream_adapter2_tb/sort/gearup_first -/sortnet_stream_adapter2_tb/sort/gearup_last -/sortnet_stream_adapter2_tb/sort/sort_valid -/sortnet_stream_adapter2_tb/sort/sort_iskey -/sortnet_stream_adapter2_tb/sort/sort_data -/sortnet_stream_adapter2_tb/sort/sort_meta -/sortnet_stream_adapter2_tb/sort/transform_valid -/sortnet_stream_adapter2_tb/sort/transform_data -/sortnet_stream_adapter2_tb/sort/transform_meta -/sortnet_stream_adapter2_tb/sort/transform_sof -/sortnet_stream_adapter2_tb/sort/transform_eof -/sortnet_stream_adapter2_tb/sort/merge_sync -/sortnet_stream_adapter2_tb/sort/merge_valid -/sortnet_stream_adapter2_tb/sort/merge_data -/sortnet_stream_adapter2_tb/sort/merge_meta -/sortnet_stream_adapter2_tb/sort/merge_sof -/sortnet_stream_adapter2_tb/sort/merge_eof -/sortnet_stream_adapter2_tb/sort/merge_ack -/sortnet_stream_adapter2_tb/sort/geardown_nxt -/sortnet_stream_adapter2_tb/sort/geardown_meta -/sortnet_stream_adapter2_tb/sort/geardown_first -/sortnet_stream_adapter2_tb/sort/geardown_last -/sortnet_stream_adapter2_tb/sort/gearup/clock -/sortnet_stream_adapter2_tb/sort/gearup/in_sync -/sortnet_stream_adapter2_tb/sort/gearup/in_valid -/sortnet_stream_adapter2_tb/sort/gearup/in_data -/sortnet_stream_adapter2_tb/sort/gearup/in_meta -/sortnet_stream_adapter2_tb/sort/gearup/out_sync -/sortnet_stream_adapter2_tb/sort/gearup/out_valid -/sortnet_stream_adapter2_tb/sort/gearup/out_data -/sortnet_stream_adapter2_tb/sort/gearup/out_meta -/sortnet_stream_adapter2_tb/sort/gearup/out_first -/sortnet_stream_adapter2_tb/sort/gearup/out_last -/sortnet_stream_adapter2_tb/sort/gearup/in_sync_d -/sortnet_stream_adapter2_tb/sort/gearup/in_data_d -/sortnet_stream_adapter2_tb/sort/gearup/in_meta_d -/sortnet_stream_adapter2_tb/sort/gearup/in_valid_d -/sortnet_stream_adapter2_tb/sort/gearup/stageselect_rst -/sortnet_stream_adapter2_tb/sort/gearup/stageselect_en -/sortnet_stream_adapter2_tb/sort/gearup/stageselect_us -/sortnet_stream_adapter2_tb/sort/gearup/stageselect_ov -/sortnet_stream_adapter2_tb/sort/gearup/muxselect_rst -/sortnet_stream_adapter2_tb/sort/gearup/muxselect_en -/sortnet_stream_adapter2_tb/sort/gearup/muxselect_us -/sortnet_stream_adapter2_tb/sort/gearup/muxselect_ov -/sortnet_stream_adapter2_tb/sort/gearup/gearboxinput -/sortnet_stream_adapter2_tb/sort/gearup/gearboxbuffer_en -/sortnet_stream_adapter2_tb/sort/gearup/gearboxbuffer -/sortnet_stream_adapter2_tb/sort/gearup/metabuffer -/sortnet_stream_adapter2_tb/sort/gearup/gearboxoutput -/sortnet_stream_adapter2_tb/sort/gearup/syncout -/sortnet_stream_adapter2_tb/sort/gearup/validout -/sortnet_stream_adapter2_tb/sort/gearup/dataout -/sortnet_stream_adapter2_tb/sort/gearup/metaout -/sortnet_stream_adapter2_tb/sort/gearup/firstout -/sortnet_stream_adapter2_tb/sort/gearup/lastout -/sortnet_stream_adapter2_tb/sort/gearup/out_sync_d -/sortnet_stream_adapter2_tb/sort/gearup/out_valid_d -/sortnet_stream_adapter2_tb/sort/gearup/out_data_d -/sortnet_stream_adapter2_tb/sort/gearup/out_meta_d -/sortnet_stream_adapter2_tb/sort/gearup/out_first_d -/sortnet_stream_adapter2_tb/sort/gearup/out_last_d -/sortnet_stream_adapter2_tb/sort/blktransform/datainputmatrix -/sortnet_stream_adapter2_tb/sort/blktransform/dataoutputmatrix -/sortnet_stream_adapter2_tb/sort/blktransform/transform/clock -/sortnet_stream_adapter2_tb/sort/blktransform/transform/reset -/sortnet_stream_adapter2_tb/sort/blktransform/transform/in_valid -/sortnet_stream_adapter2_tb/sort/blktransform/transform/in_data -/sortnet_stream_adapter2_tb/sort/blktransform/transform/in_sof -/sortnet_stream_adapter2_tb/sort/blktransform/transform/in_eof -/sortnet_stream_adapter2_tb/sort/blktransform/transform/out_valid -/sortnet_stream_adapter2_tb/sort/blktransform/transform/out_data -/sortnet_stream_adapter2_tb/sort/blktransform/transform/out_sof -/sortnet_stream_adapter2_tb/sort/blktransform/transform/out_eof -/sortnet_stream_adapter2_tb/sort/blktransform/transform/datain -/sortnet_stream_adapter2_tb/sort/blktransform/transform/columnwriter_rst -/sortnet_stream_adapter2_tb/sort/blktransform/transform/columnwriter_us -/sortnet_stream_adapter2_tb/sort/blktransform/transform/columnwriter_ov -/sortnet_stream_adapter2_tb/sort/blktransform/transform/inputbuffer -/sortnet_stream_adapter2_tb/sort/blktransform/transform/rowreader_en_r -/sortnet_stream_adapter2_tb/sort/blktransform/transform/rowreader_rst -/sortnet_stream_adapter2_tb/sort/blktransform/transform/rowreader_en -/sortnet_stream_adapter2_tb/sort/blktransform/transform/rowreader_us -/sortnet_stream_adapter2_tb/sort/blktransform/transform/rowreader_ov -/sortnet_stream_adapter2_tb/sort/blkmergesort/mergesortmatrix_valid -/sortnet_stream_adapter2_tb/sort/blkmergesort/mergesortmatrix_data -/sortnet_stream_adapter2_tb/sort/blkmergesort/mergesortmatrix_sof -/sortnet_stream_adapter2_tb/sort/blkmergesort/mergesortmatrix_eof -/sortnet_stream_adapter2_tb/sort/blkmergesort/mergesortmatrix_ack -/sortnet_stream_adapter2_tb/sort/geardown/clock -/sortnet_stream_adapter2_tb/sort/geardown/in_sync -/sortnet_stream_adapter2_tb/sort/geardown/in_valid -/sortnet_stream_adapter2_tb/sort/geardown/in_next -/sortnet_stream_adapter2_tb/sort/geardown/in_data -/sortnet_stream_adapter2_tb/sort/geardown/in_meta -/sortnet_stream_adapter2_tb/sort/geardown/out_sync -/sortnet_stream_adapter2_tb/sort/geardown/out_valid -/sortnet_stream_adapter2_tb/sort/geardown/out_data -/sortnet_stream_adapter2_tb/sort/geardown/out_meta -/sortnet_stream_adapter2_tb/sort/geardown/out_first -/sortnet_stream_adapter2_tb/sort/geardown/out_last -/sortnet_stream_adapter2_tb/sort/geardown/in_sync_d -/sortnet_stream_adapter2_tb/sort/geardown/in_data_d -/sortnet_stream_adapter2_tb/sort/geardown/in_meta_d -/sortnet_stream_adapter2_tb/sort/geardown/in_valid_d -/sortnet_stream_adapter2_tb/sort/geardown/muxselect_rst -/sortnet_stream_adapter2_tb/sort/geardown/muxselect_en -/sortnet_stream_adapter2_tb/sort/geardown/muxselect_us -/sortnet_stream_adapter2_tb/sort/geardown/muxselect_ov -/sortnet_stream_adapter2_tb/sort/geardown/nxt -/sortnet_stream_adapter2_tb/sort/geardown/autoincrement -/sortnet_stream_adapter2_tb/sort/geardown/gearboxinput -/sortnet_stream_adapter2_tb/sort/geardown/gearboxbuffer_en -/sortnet_stream_adapter2_tb/sort/geardown/gearboxbuffer -/sortnet_stream_adapter2_tb/sort/geardown/gearboxoutput -/sortnet_stream_adapter2_tb/sort/geardown/syncout -/sortnet_stream_adapter2_tb/sort/geardown/validout -/sortnet_stream_adapter2_tb/sort/geardown/dataout -/sortnet_stream_adapter2_tb/sort/geardown/metaout -/sortnet_stream_adapter2_tb/sort/geardown/firstout -/sortnet_stream_adapter2_tb/sort/geardown/lastout -/sortnet_stream_adapter2_tb/sort/geardown/out_sync_d -/sortnet_stream_adapter2_tb/sort/geardown/out_valid_d -/sortnet_stream_adapter2_tb/sort/geardown/out_data_d -/sortnet_stream_adapter2_tb/sort/geardown/out_meta_d -/sortnet_stream_adapter2_tb/sort/geardown/out_first_d -/sortnet_stream_adapter2_tb/sort/geardown/out_last_d -/sortnet_stream_adapter2_tb/sort/geardown//muxinput diff --git a/sim/sort/sortnet/sortnet_Stream_Adapter2_tb.gtkw b/sim/sort/sortnet/sortnet_Stream_Adapter2_tb.gtkw deleted file mode 100644 index 1226e93b3..000000000 --- a/sim/sort/sortnet/sortnet_Stream_Adapter2_tb.gtkw +++ /dev/null @@ -1,265 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.61 (w)1999-2014 BSI -[*] Mon Jan 04 05:24:27 2016 -[*] -[dumpfile_mtime] "Mon Jan 04 05:20:23 2016" -[dumpfile_size] 238301 -[timestart] 0 -[size] 1676 997 -[pos] -1 -1 -*-25.373365 89100000 -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 -[treeopen] top. -[treeopen] top.sortnet_stream_adapter2_tb. -[treeopen] top.sortnet_stream_adapter2_tb.sort. -[treeopen] top.sortnet_stream_adapter2_tb.sort.blktransform.transform. -[treeopen] top.sortnet_stream_adapter2_tb.sort.gearup. -[sst_width] 232 -[signals_width] 509 -[sst_expanded] 1 -[sst_vpaned_height] 412 -@28 -top.sortnet_stream_adapter2_tb.stopsimulation -top.sortnet_stream_adapter2_tb.clock -@200 --Generator -@28 -top.sortnet_stream_adapter2_tb.generator_valid -@22 -#{top.sortnet_stream_adapter2_tb.generator_data[15:0]} top.sortnet_stream_adapter2_tb.generator_data[15] top.sortnet_stream_adapter2_tb.generator_data[14] top.sortnet_stream_adapter2_tb.generator_data[13] top.sortnet_stream_adapter2_tb.generator_data[12] top.sortnet_stream_adapter2_tb.generator_data[11] top.sortnet_stream_adapter2_tb.generator_data[10] top.sortnet_stream_adapter2_tb.generator_data[9] top.sortnet_stream_adapter2_tb.generator_data[8] top.sortnet_stream_adapter2_tb.generator_data[7] top.sortnet_stream_adapter2_tb.generator_data[6] top.sortnet_stream_adapter2_tb.generator_data[5] top.sortnet_stream_adapter2_tb.generator_data[4] top.sortnet_stream_adapter2_tb.generator_data[3] top.sortnet_stream_adapter2_tb.generator_data[2] top.sortnet_stream_adapter2_tb.generator_data[1] top.sortnet_stream_adapter2_tb.generator_data[0] -@28 -top.sortnet_stream_adapter2_tb.generator_sof -top.sortnet_stream_adapter2_tb.generator_iskey -top.sortnet_stream_adapter2_tb.generator_eof -@200 --GearBox_up -@28 -top.sortnet_stream_adapter2_tb.sort.gearup.in_sync -top.sortnet_stream_adapter2_tb.sort.gearup.in_valid -@22 -#{top.sortnet_stream_adapter2_tb.sort.gearup.in_data[15:0]} top.sortnet_stream_adapter2_tb.sort.gearup.in_data[15] top.sortnet_stream_adapter2_tb.sort.gearup.in_data[14] top.sortnet_stream_adapter2_tb.sort.gearup.in_data[13] top.sortnet_stream_adapter2_tb.sort.gearup.in_data[12] top.sortnet_stream_adapter2_tb.sort.gearup.in_data[11] top.sortnet_stream_adapter2_tb.sort.gearup.in_data[10] top.sortnet_stream_adapter2_tb.sort.gearup.in_data[9] top.sortnet_stream_adapter2_tb.sort.gearup.in_data[8] top.sortnet_stream_adapter2_tb.sort.gearup.in_data[7] top.sortnet_stream_adapter2_tb.sort.gearup.in_data[6] top.sortnet_stream_adapter2_tb.sort.gearup.in_data[5] top.sortnet_stream_adapter2_tb.sort.gearup.in_data[4] top.sortnet_stream_adapter2_tb.sort.gearup.in_data[3] top.sortnet_stream_adapter2_tb.sort.gearup.in_data[2] top.sortnet_stream_adapter2_tb.sort.gearup.in_data[1] top.sortnet_stream_adapter2_tb.sort.gearup.in_data[0] -#{top.sortnet_stream_adapter2_tb.sort.gearup.in_meta[4:0]} top.sortnet_stream_adapter2_tb.sort.gearup.in_meta[4] top.sortnet_stream_adapter2_tb.sort.gearup.in_meta[3] top.sortnet_stream_adapter2_tb.sort.gearup.in_meta[2] top.sortnet_stream_adapter2_tb.sort.gearup.in_meta[1] top.sortnet_stream_adapter2_tb.sort.gearup.in_meta[0] -@28 -top.sortnet_stream_adapter2_tb.sort.gearup.gearboxbuffer_en -top.sortnet_stream_adapter2_tb.sort.gearup.out_sync -top.sortnet_stream_adapter2_tb.sort.gearup.out_valid -@c00022 -#{top.sortnet_stream_adapter2_tb.sort.gearup.out_data[127:0]} top.sortnet_stream_adapter2_tb.sort.gearup.out_data[127] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[126] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[125] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[124] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[123] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[122] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[121] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[120] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[119] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[118] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[117] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[116] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[115] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[114] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[113] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[112] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[111] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[110] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[109] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[108] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[107] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[106] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[105] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[104] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[103] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[102] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[101] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[100] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[99] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[98] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[97] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[96] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[95] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[94] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[93] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[92] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[91] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[90] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[89] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[88] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[87] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[86] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[85] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[84] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[83] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[82] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[81] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[80] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[79] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[78] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[77] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[76] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[75] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[74] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[73] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[72] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[71] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[70] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[69] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[68] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[67] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[66] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[65] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[64] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[63] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[62] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[61] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[60] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[59] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[58] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[57] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[56] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[55] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[54] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[53] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[52] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[51] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[50] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[49] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[48] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[47] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[46] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[45] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[44] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[43] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[42] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[41] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[40] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[39] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[38] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[37] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[36] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[35] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[34] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[33] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[32] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[31] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[30] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[29] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[28] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[27] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[26] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[25] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[24] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[23] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[22] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[21] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[20] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[19] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[18] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[17] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[16] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[15] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[14] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[13] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[12] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[11] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[10] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[9] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[8] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[7] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[6] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[5] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[4] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[3] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[2] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[1] top.sortnet_stream_adapter2_tb.sort.gearup.out_data[0] -@28 -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[127] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[126] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[125] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[124] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[123] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[122] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[121] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[120] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[119] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[118] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[117] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[116] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[115] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[114] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[113] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[112] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[111] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[110] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[109] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[108] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[107] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[106] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[105] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[104] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[103] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[102] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[101] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[100] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[99] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[98] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[97] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[96] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[95] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[94] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[93] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[92] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[91] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[90] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[89] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[88] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[87] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[86] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[85] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[84] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[83] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[82] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[81] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[80] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[79] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[78] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[77] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[76] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[75] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[74] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[73] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[72] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[71] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[70] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[69] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[68] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[67] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[66] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[65] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[64] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[63] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[62] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[61] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[60] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[59] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[58] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[57] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[56] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[55] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[54] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[53] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[52] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[51] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[50] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[49] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[48] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[47] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[46] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[45] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[44] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[43] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[42] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[41] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[40] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[39] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[38] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[37] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[36] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[35] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[34] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[33] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[32] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[31] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[30] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[29] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[28] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[27] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[26] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[25] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[24] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[23] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[22] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[21] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[20] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[19] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[18] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[17] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[16] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[15] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[14] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[13] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[12] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[11] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[10] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[9] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[8] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[7] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[6] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[5] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[4] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[3] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[2] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[1] -top.sortnet_stream_adapter2_tb.sort.gearup.out_data[0] -@1401200 --group_end -@22 -#{top.sortnet_stream_adapter2_tb.sort.gearup.out_meta[4:0]} top.sortnet_stream_adapter2_tb.sort.gearup.out_meta[4] top.sortnet_stream_adapter2_tb.sort.gearup.out_meta[3] top.sortnet_stream_adapter2_tb.sort.gearup.out_meta[2] top.sortnet_stream_adapter2_tb.sort.gearup.out_meta[1] top.sortnet_stream_adapter2_tb.sort.gearup.out_meta[0] -@28 -top.sortnet_stream_adapter2_tb.sort.gearup.out_first -top.sortnet_stream_adapter2_tb.sort.gearup.out_last -@25 -#{top.sortnet_stream_adapter2_tb.sort.gearup.stageselect_us[2:0]} top.sortnet_stream_adapter2_tb.sort.gearup.stageselect_us[2] top.sortnet_stream_adapter2_tb.sort.gearup.stageselect_us[1] top.sortnet_stream_adapter2_tb.sort.gearup.stageselect_us[0] -@200 --Sortnet -@28 -top.sortnet_stream_adapter2_tb.sort.B1.sort.in_valid -top.sortnet_stream_adapter2_tb.sort.B1.sort.in_iskey -top.sortnet_stream_adapter2_tb.sort.B1.sort.out_valid -top.sortnet_stream_adapter2_tb.sort.B1.sort.out_iskey -@200 --Transform -@28 -top.sortnet_stream_adapter2_tb.sort.blktransform.transform.in_valid -top.sortnet_stream_adapter2_tb.sort.blktransform.transform.in_sof -top.sortnet_stream_adapter2_tb.sort.blktransform.transform.in_eof -@24 -#{top.sortnet_stream_adapter2_tb.sort.blktransform.transform.columnwriter_us[1:0]} top.sortnet_stream_adapter2_tb.sort.blktransform.transform.columnwriter_us[0] -#{top.sortnet_stream_adapter2_tb.sort.blktransform.transform.rowreader_us[2:0]} top.sortnet_stream_adapter2_tb.sort.blktransform.transform.rowreader_us[2] top.sortnet_stream_adapter2_tb.sort.blktransform.transform.rowreader_us[1] top.sortnet_stream_adapter2_tb.sort.blktransform.transform.rowreader_us[0] -@28 -top.sortnet_stream_adapter2_tb.sort.blktransform.transform.out_valid -top.sortnet_stream_adapter2_tb.sort.blktransform.transform.out_eof -top.sortnet_stream_adapter2_tb.sort.blktransform.transform.out_sof -@200 --MergeSort_Streamed -@800028 -#{top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_valid[2:0]} top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_valid[2] top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_valid[1] top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_valid[0] -@28 -[color] 3 -top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_valid[2] -[color] 6 -top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_valid[1] -[color] 2 -top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_valid[0] -@1001200 --group_end -@800028 -#{top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_sof[2:0]} top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_sof[2] top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_sof[1] top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_sof[0] -@28 -[color] 3 -top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_sof[2] -[color] 6 -top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_sof[1] -[color] 2 -top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_sof[0] -@1001200 --group_end -@800028 -#{top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_eof[2:0]} top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_eof[2] top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_eof[1] top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_eof[0] -@28 -[color] 3 -top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_eof[2] -[color] 6 -top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_eof[1] -[color] 2 -top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_eof[0] -@1001200 --group_end -@800028 -#{top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_ack[2:0]} top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_ack[2] top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_ack[1] top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_ack[0] -@28 -[color] 3 -top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_ack[2] -[color] 6 -top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_ack[1] -[color] 2 -top.sortnet_stream_adapter2_tb.sort.blkmergesort.mergesortmatrix_ack[0] -@200 --GearBox_down -@1001200 --group_end -@28 -top.sortnet_stream_adapter2_tb.sort.geardown.in_sync -top.sortnet_stream_adapter2_tb.sort.geardown.in_valid -@22 -#{top.sortnet_stream_adapter2_tb.sort.geardown.in_data[63:0]} top.sortnet_stream_adapter2_tb.sort.geardown.in_data[31] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[30] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[29] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[28] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[27] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[26] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[25] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[24] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[23] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[22] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[21] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[20] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[19] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[18] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[17] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[16] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[15] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[14] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[13] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[12] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[11] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[10] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[9] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[8] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[7] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[6] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[5] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[4] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[3] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[2] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[1] top.sortnet_stream_adapter2_tb.sort.geardown.in_data[0] -@28 -top.sortnet_stream_adapter2_tb.sort.geardown.in_next -top.sortnet_stream_adapter2_tb.sort.geardown.out_sync -top.sortnet_stream_adapter2_tb.sort.geardown.out_valid -@22 -#{top.sortnet_stream_adapter2_tb.sort.geardown.out_data[15:0]} top.sortnet_stream_adapter2_tb.sort.geardown.out_data[11] top.sortnet_stream_adapter2_tb.sort.geardown.out_data[10] top.sortnet_stream_adapter2_tb.sort.geardown.out_data[9] top.sortnet_stream_adapter2_tb.sort.geardown.out_data[8] top.sortnet_stream_adapter2_tb.sort.geardown.out_data[7] top.sortnet_stream_adapter2_tb.sort.geardown.out_data[6] top.sortnet_stream_adapter2_tb.sort.geardown.out_data[5] top.sortnet_stream_adapter2_tb.sort.geardown.out_data[4] top.sortnet_stream_adapter2_tb.sort.geardown.out_data[3] top.sortnet_stream_adapter2_tb.sort.geardown.out_data[2] top.sortnet_stream_adapter2_tb.sort.geardown.out_data[1] top.sortnet_stream_adapter2_tb.sort.geardown.out_data[0] -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/sort/sortnet/sortnet_Stream_Adapter_tb.ghdl b/sim/sort/sortnet/sortnet_Stream_Adapter_tb.ghdl deleted file mode 100644 index 09bd9dce1..000000000 --- a/sim/sort/sortnet/sortnet_Stream_Adapter_tb.ghdl +++ /dev/null @@ -1,115 +0,0 @@ -$ version 1.1 - -# Signals in packages : - -# Signals in entities : -/sortnet_stream_adapter_tb/clock -/sortnet_stream_adapter_tb/generator_valid -/sortnet_stream_adapter_tb/generator_data -/sortnet_stream_adapter_tb/generator_iskey -/sortnet_stream_adapter_tb/generator_tag -/sortnet_stream_adapter_tb/sort_out_valid -/sortnet_stream_adapter_tb/sort_out_data -/sortnet_stream_adapter_tb/sort_out_iskey -/sortnet_stream_adapter_tb/tester_ack -/sortnet_stream_adapter_tb/stopsimulation -/sortnet_stream_adapter_tb/sort/clock -/sortnet_stream_adapter_tb/sort/reset -/sortnet_stream_adapter_tb/sort/in_valid -/sortnet_stream_adapter_tb/sort/in_iskey -/sortnet_stream_adapter_tb/sort/in_data -/sortnet_stream_adapter_tb/sort/in_meta -/sortnet_stream_adapter_tb/sort/in_ack -/sortnet_stream_adapter_tb/sort/out_valid -/sortnet_stream_adapter_tb/sort/out_iskey -/sortnet_stream_adapter_tb/sort/out_data -/sortnet_stream_adapter_tb/sort/out_meta -/sortnet_stream_adapter_tb/sort/out_ack -/sortnet_stream_adapter_tb/sort/metain -/sortnet_stream_adapter_tb/sort/gearup_valid -/sortnet_stream_adapter_tb/sort/gearup_data -/sortnet_stream_adapter_tb/sort/gearup_meta -/sortnet_stream_adapter_tb/sort/sort_valid -/sortnet_stream_adapter_tb/sort/sort_iskey -/sortnet_stream_adapter_tb/sort/sort_data -/sortnet_stream_adapter_tb/sort/sort_meta -/sortnet_stream_adapter_tb/sort/geardown_nxt -/sortnet_stream_adapter_tb/sort/gearup/clock -/sortnet_stream_adapter_tb/sort/gearup/in_sync -/sortnet_stream_adapter_tb/sort/gearup/in_valid -/sortnet_stream_adapter_tb/sort/gearup/in_data -/sortnet_stream_adapter_tb/sort/gearup/in_meta -/sortnet_stream_adapter_tb/sort/gearup/out_sync -/sortnet_stream_adapter_tb/sort/gearup/out_valid -/sortnet_stream_adapter_tb/sort/gearup/out_data -/sortnet_stream_adapter_tb/sort/gearup/out_meta -/sortnet_stream_adapter_tb/sort/gearup/out_first -/sortnet_stream_adapter_tb/sort/gearup/out_last -/sortnet_stream_adapter_tb/sort/gearup/in_sync_d -/sortnet_stream_adapter_tb/sort/gearup/in_data_d -/sortnet_stream_adapter_tb/sort/gearup/in_meta_d -/sortnet_stream_adapter_tb/sort/gearup/in_valid_d -/sortnet_stream_adapter_tb/sort/gearup/stageselect_rst -/sortnet_stream_adapter_tb/sort/gearup/stageselect_en -/sortnet_stream_adapter_tb/sort/gearup/stageselect_us -/sortnet_stream_adapter_tb/sort/gearup/stageselect_ov -/sortnet_stream_adapter_tb/sort/gearup/muxselect_rst -/sortnet_stream_adapter_tb/sort/gearup/muxselect_en -/sortnet_stream_adapter_tb/sort/gearup/muxselect_us -/sortnet_stream_adapter_tb/sort/gearup/muxselect_ov -/sortnet_stream_adapter_tb/sort/gearup/gearboxinput -/sortnet_stream_adapter_tb/sort/gearup/gearboxbuffer_en -/sortnet_stream_adapter_tb/sort/gearup/gearboxbuffer -/sortnet_stream_adapter_tb/sort/gearup/metabuffer -/sortnet_stream_adapter_tb/sort/gearup/gearboxoutput -/sortnet_stream_adapter_tb/sort/gearup/syncout -/sortnet_stream_adapter_tb/sort/gearup/validout -/sortnet_stream_adapter_tb/sort/gearup/dataout -/sortnet_stream_adapter_tb/sort/gearup/metaout -/sortnet_stream_adapter_tb/sort/gearup/firstout -/sortnet_stream_adapter_tb/sort/gearup/lastout -/sortnet_stream_adapter_tb/sort/gearup/out_sync_d -/sortnet_stream_adapter_tb/sort/gearup/out_valid_d -/sortnet_stream_adapter_tb/sort/gearup/out_data_d -/sortnet_stream_adapter_tb/sort/gearup/out_meta_d -/sortnet_stream_adapter_tb/sort/gearup/out_first_d -/sortnet_stream_adapter_tb/sort/gearup/out_last_d -/sortnet_stream_adapter_tb/sort/geardown/clock -/sortnet_stream_adapter_tb/sort/geardown/in_sync -/sortnet_stream_adapter_tb/sort/geardown/in_valid -/sortnet_stream_adapter_tb/sort/geardown/in_next -/sortnet_stream_adapter_tb/sort/geardown/in_data -/sortnet_stream_adapter_tb/sort/geardown/in_meta -/sortnet_stream_adapter_tb/sort/geardown/out_sync -/sortnet_stream_adapter_tb/sort/geardown/out_valid -/sortnet_stream_adapter_tb/sort/geardown/out_data -/sortnet_stream_adapter_tb/sort/geardown/out_meta -/sortnet_stream_adapter_tb/sort/geardown/out_first -/sortnet_stream_adapter_tb/sort/geardown/out_last -/sortnet_stream_adapter_tb/sort/geardown/in_sync_d -/sortnet_stream_adapter_tb/sort/geardown/in_data_d -/sortnet_stream_adapter_tb/sort/geardown/in_meta_d -/sortnet_stream_adapter_tb/sort/geardown/in_valid_d -/sortnet_stream_adapter_tb/sort/geardown/muxselect_rst -/sortnet_stream_adapter_tb/sort/geardown/muxselect_en -/sortnet_stream_adapter_tb/sort/geardown/muxselect_us -/sortnet_stream_adapter_tb/sort/geardown/muxselect_ov -/sortnet_stream_adapter_tb/sort/geardown/nxt -/sortnet_stream_adapter_tb/sort/geardown/autoincrement -/sortnet_stream_adapter_tb/sort/geardown/gearboxinput -/sortnet_stream_adapter_tb/sort/geardown/gearboxbuffer_en -/sortnet_stream_adapter_tb/sort/geardown/gearboxbuffer -/sortnet_stream_adapter_tb/sort/geardown/gearboxoutput -/sortnet_stream_adapter_tb/sort/geardown/syncout -/sortnet_stream_adapter_tb/sort/geardown/validout -/sortnet_stream_adapter_tb/sort/geardown/dataout -/sortnet_stream_adapter_tb/sort/geardown/metaout -/sortnet_stream_adapter_tb/sort/geardown/firstout -/sortnet_stream_adapter_tb/sort/geardown/lastout -/sortnet_stream_adapter_tb/sort/geardown/out_sync_d -/sortnet_stream_adapter_tb/sort/geardown/out_valid_d -/sortnet_stream_adapter_tb/sort/geardown/out_data_d -/sortnet_stream_adapter_tb/sort/geardown/out_meta_d -/sortnet_stream_adapter_tb/sort/geardown/out_first_d -/sortnet_stream_adapter_tb/sort/geardown/out_last_d -/sortnet_stream_adapter_tb/sort/geardown//muxinput diff --git a/sim/sort/sortnet/sortnet_Stream_Adapter_tb.gtkw b/sim/sort/sortnet/sortnet_Stream_Adapter_tb.gtkw deleted file mode 100644 index a54fe0648..000000000 --- a/sim/sort/sortnet/sortnet_Stream_Adapter_tb.gtkw +++ /dev/null @@ -1,436 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.69 (w)1999-2016 BSI -[*] Sun Mar 20 17:07:11 2016 -[*] -[dumpfile_mtime] "Sun Mar 20 17:06:47 2016" -[dumpfile_size] 89113 -[timestart] 0 -[size] 1676 997 -[pos] -1 -1 -*-27.321276 281700000 -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 -[treeopen] top. -[treeopen] top.sortnet_stream_adapter_tb. -[treeopen] top.sortnet_stream_adapter_tb.sort. -[treeopen] top.sortnet_stream_adapter_tb.sort.B1. -[treeopen] top.sortnet_stream_adapter_tb.sort.B1.sort. -[treeopen] top.sortnet_stream_adapter_tb.sort.B1.sort.[6].B1. -[treeopen] top.sortnet_stream_adapter_tb.sort.B1.sort.datamatrix.[0]. -[sst_width] 230 -[signals_width] 261 -[sst_expanded] 1 -[sst_vpaned_height] 293 -@28 -top.sortnet_stream_adapter_tb.clock -@200 --Generator -@28 -top.sortnet_stream_adapter_tb.generator_iskey -top.sortnet_stream_adapter_tb.generator_valid -@22 -#{top.sortnet_stream_adapter_tb.generator_data[15:0]} top.sortnet_stream_adapter_tb.generator_data[15] top.sortnet_stream_adapter_tb.generator_data[14] top.sortnet_stream_adapter_tb.generator_data[13] top.sortnet_stream_adapter_tb.generator_data[12] top.sortnet_stream_adapter_tb.generator_data[11] top.sortnet_stream_adapter_tb.generator_data[10] top.sortnet_stream_adapter_tb.generator_data[9] top.sortnet_stream_adapter_tb.generator_data[8] top.sortnet_stream_adapter_tb.generator_data[7] top.sortnet_stream_adapter_tb.generator_data[6] top.sortnet_stream_adapter_tb.generator_data[5] top.sortnet_stream_adapter_tb.generator_data[4] top.sortnet_stream_adapter_tb.generator_data[3] top.sortnet_stream_adapter_tb.generator_data[2] top.sortnet_stream_adapter_tb.generator_data[1] top.sortnet_stream_adapter_tb.generator_data[0] -@28 -#{top.sortnet_stream_adapter_tb.generator_tag[1:0]} top.sortnet_stream_adapter_tb.generator_tag[1] top.sortnet_stream_adapter_tb.generator_tag[0] -@200 --GearBox -@28 -top.sortnet_stream_adapter_tb.sort.gearup.in_sync -top.sortnet_stream_adapter_tb.sort.gearup.in_valid -@22 -#{top.sortnet_stream_adapter_tb.sort.gearup.in_data[15:0]} top.sortnet_stream_adapter_tb.sort.gearup.in_data[15] top.sortnet_stream_adapter_tb.sort.gearup.in_data[14] top.sortnet_stream_adapter_tb.sort.gearup.in_data[13] top.sortnet_stream_adapter_tb.sort.gearup.in_data[12] top.sortnet_stream_adapter_tb.sort.gearup.in_data[11] top.sortnet_stream_adapter_tb.sort.gearup.in_data[10] top.sortnet_stream_adapter_tb.sort.gearup.in_data[9] top.sortnet_stream_adapter_tb.sort.gearup.in_data[8] top.sortnet_stream_adapter_tb.sort.gearup.in_data[7] top.sortnet_stream_adapter_tb.sort.gearup.in_data[6] top.sortnet_stream_adapter_tb.sort.gearup.in_data[5] top.sortnet_stream_adapter_tb.sort.gearup.in_data[4] top.sortnet_stream_adapter_tb.sort.gearup.in_data[3] top.sortnet_stream_adapter_tb.sort.gearup.in_data[2] top.sortnet_stream_adapter_tb.sort.gearup.in_data[1] top.sortnet_stream_adapter_tb.sort.gearup.in_data[0] -@28 -#{top.sortnet_stream_adapter_tb.sort.gearup.in_meta[2:0]} top.sortnet_stream_adapter_tb.sort.gearup.in_meta[2] top.sortnet_stream_adapter_tb.sort.gearup.in_meta[1] top.sortnet_stream_adapter_tb.sort.gearup.in_meta[0] -top.sortnet_stream_adapter_tb.sort.gearup.out_sync -top.sortnet_stream_adapter_tb.sort.gearup.out_valid -@22 -#{top.sortnet_stream_adapter_tb.sort.gearup.out_data[127:0]} top.sortnet_stream_adapter_tb.sort.gearup.out_data[127] top.sortnet_stream_adapter_tb.sort.gearup.out_data[126] top.sortnet_stream_adapter_tb.sort.gearup.out_data[125] top.sortnet_stream_adapter_tb.sort.gearup.out_data[124] top.sortnet_stream_adapter_tb.sort.gearup.out_data[123] top.sortnet_stream_adapter_tb.sort.gearup.out_data[122] top.sortnet_stream_adapter_tb.sort.gearup.out_data[121] top.sortnet_stream_adapter_tb.sort.gearup.out_data[120] top.sortnet_stream_adapter_tb.sort.gearup.out_data[119] top.sortnet_stream_adapter_tb.sort.gearup.out_data[118] top.sortnet_stream_adapter_tb.sort.gearup.out_data[117] top.sortnet_stream_adapter_tb.sort.gearup.out_data[116] top.sortnet_stream_adapter_tb.sort.gearup.out_data[115] top.sortnet_stream_adapter_tb.sort.gearup.out_data[114] top.sortnet_stream_adapter_tb.sort.gearup.out_data[113] top.sortnet_stream_adapter_tb.sort.gearup.out_data[112] top.sortnet_stream_adapter_tb.sort.gearup.out_data[111] top.sortnet_stream_adapter_tb.sort.gearup.out_data[110] top.sortnet_stream_adapter_tb.sort.gearup.out_data[109] top.sortnet_stream_adapter_tb.sort.gearup.out_data[108] top.sortnet_stream_adapter_tb.sort.gearup.out_data[107] top.sortnet_stream_adapter_tb.sort.gearup.out_data[106] top.sortnet_stream_adapter_tb.sort.gearup.out_data[105] top.sortnet_stream_adapter_tb.sort.gearup.out_data[104] top.sortnet_stream_adapter_tb.sort.gearup.out_data[103] top.sortnet_stream_adapter_tb.sort.gearup.out_data[102] top.sortnet_stream_adapter_tb.sort.gearup.out_data[101] top.sortnet_stream_adapter_tb.sort.gearup.out_data[100] top.sortnet_stream_adapter_tb.sort.gearup.out_data[99] top.sortnet_stream_adapter_tb.sort.gearup.out_data[98] top.sortnet_stream_adapter_tb.sort.gearup.out_data[97] top.sortnet_stream_adapter_tb.sort.gearup.out_data[96] top.sortnet_stream_adapter_tb.sort.gearup.out_data[95] top.sortnet_stream_adapter_tb.sort.gearup.out_data[94] top.sortnet_stream_adapter_tb.sort.gearup.out_data[93] top.sortnet_stream_adapter_tb.sort.gearup.out_data[92] top.sortnet_stream_adapter_tb.sort.gearup.out_data[91] top.sortnet_stream_adapter_tb.sort.gearup.out_data[90] top.sortnet_stream_adapter_tb.sort.gearup.out_data[89] top.sortnet_stream_adapter_tb.sort.gearup.out_data[88] top.sortnet_stream_adapter_tb.sort.gearup.out_data[87] top.sortnet_stream_adapter_tb.sort.gearup.out_data[86] top.sortnet_stream_adapter_tb.sort.gearup.out_data[85] top.sortnet_stream_adapter_tb.sort.gearup.out_data[84] top.sortnet_stream_adapter_tb.sort.gearup.out_data[83] top.sortnet_stream_adapter_tb.sort.gearup.out_data[82] top.sortnet_stream_adapter_tb.sort.gearup.out_data[81] top.sortnet_stream_adapter_tb.sort.gearup.out_data[80] top.sortnet_stream_adapter_tb.sort.gearup.out_data[79] top.sortnet_stream_adapter_tb.sort.gearup.out_data[78] top.sortnet_stream_adapter_tb.sort.gearup.out_data[77] top.sortnet_stream_adapter_tb.sort.gearup.out_data[76] top.sortnet_stream_adapter_tb.sort.gearup.out_data[75] top.sortnet_stream_adapter_tb.sort.gearup.out_data[74] top.sortnet_stream_adapter_tb.sort.gearup.out_data[73] top.sortnet_stream_adapter_tb.sort.gearup.out_data[72] top.sortnet_stream_adapter_tb.sort.gearup.out_data[71] top.sortnet_stream_adapter_tb.sort.gearup.out_data[70] top.sortnet_stream_adapter_tb.sort.gearup.out_data[69] top.sortnet_stream_adapter_tb.sort.gearup.out_data[68] top.sortnet_stream_adapter_tb.sort.gearup.out_data[67] top.sortnet_stream_adapter_tb.sort.gearup.out_data[66] top.sortnet_stream_adapter_tb.sort.gearup.out_data[65] top.sortnet_stream_adapter_tb.sort.gearup.out_data[64] top.sortnet_stream_adapter_tb.sort.gearup.out_data[63] top.sortnet_stream_adapter_tb.sort.gearup.out_data[62] top.sortnet_stream_adapter_tb.sort.gearup.out_data[61] top.sortnet_stream_adapter_tb.sort.gearup.out_data[60] top.sortnet_stream_adapter_tb.sort.gearup.out_data[59] top.sortnet_stream_adapter_tb.sort.gearup.out_data[58] top.sortnet_stream_adapter_tb.sort.gearup.out_data[57] top.sortnet_stream_adapter_tb.sort.gearup.out_data[56] top.sortnet_stream_adapter_tb.sort.gearup.out_data[55] top.sortnet_stream_adapter_tb.sort.gearup.out_data[54] top.sortnet_stream_adapter_tb.sort.gearup.out_data[53] top.sortnet_stream_adapter_tb.sort.gearup.out_data[52] top.sortnet_stream_adapter_tb.sort.gearup.out_data[51] top.sortnet_stream_adapter_tb.sort.gearup.out_data[50] top.sortnet_stream_adapter_tb.sort.gearup.out_data[49] top.sortnet_stream_adapter_tb.sort.gearup.out_data[48] top.sortnet_stream_adapter_tb.sort.gearup.out_data[47] top.sortnet_stream_adapter_tb.sort.gearup.out_data[46] top.sortnet_stream_adapter_tb.sort.gearup.out_data[45] top.sortnet_stream_adapter_tb.sort.gearup.out_data[44] top.sortnet_stream_adapter_tb.sort.gearup.out_data[43] top.sortnet_stream_adapter_tb.sort.gearup.out_data[42] top.sortnet_stream_adapter_tb.sort.gearup.out_data[41] top.sortnet_stream_adapter_tb.sort.gearup.out_data[40] top.sortnet_stream_adapter_tb.sort.gearup.out_data[39] top.sortnet_stream_adapter_tb.sort.gearup.out_data[38] top.sortnet_stream_adapter_tb.sort.gearup.out_data[37] top.sortnet_stream_adapter_tb.sort.gearup.out_data[36] top.sortnet_stream_adapter_tb.sort.gearup.out_data[35] top.sortnet_stream_adapter_tb.sort.gearup.out_data[34] top.sortnet_stream_adapter_tb.sort.gearup.out_data[33] top.sortnet_stream_adapter_tb.sort.gearup.out_data[32] top.sortnet_stream_adapter_tb.sort.gearup.out_data[31] top.sortnet_stream_adapter_tb.sort.gearup.out_data[30] top.sortnet_stream_adapter_tb.sort.gearup.out_data[29] top.sortnet_stream_adapter_tb.sort.gearup.out_data[28] top.sortnet_stream_adapter_tb.sort.gearup.out_data[27] top.sortnet_stream_adapter_tb.sort.gearup.out_data[26] top.sortnet_stream_adapter_tb.sort.gearup.out_data[25] top.sortnet_stream_adapter_tb.sort.gearup.out_data[24] top.sortnet_stream_adapter_tb.sort.gearup.out_data[23] top.sortnet_stream_adapter_tb.sort.gearup.out_data[22] top.sortnet_stream_adapter_tb.sort.gearup.out_data[21] top.sortnet_stream_adapter_tb.sort.gearup.out_data[20] top.sortnet_stream_adapter_tb.sort.gearup.out_data[19] top.sortnet_stream_adapter_tb.sort.gearup.out_data[18] top.sortnet_stream_adapter_tb.sort.gearup.out_data[17] top.sortnet_stream_adapter_tb.sort.gearup.out_data[16] top.sortnet_stream_adapter_tb.sort.gearup.out_data[15] top.sortnet_stream_adapter_tb.sort.gearup.out_data[14] top.sortnet_stream_adapter_tb.sort.gearup.out_data[13] top.sortnet_stream_adapter_tb.sort.gearup.out_data[12] top.sortnet_stream_adapter_tb.sort.gearup.out_data[11] top.sortnet_stream_adapter_tb.sort.gearup.out_data[10] top.sortnet_stream_adapter_tb.sort.gearup.out_data[9] top.sortnet_stream_adapter_tb.sort.gearup.out_data[8] top.sortnet_stream_adapter_tb.sort.gearup.out_data[7] top.sortnet_stream_adapter_tb.sort.gearup.out_data[6] top.sortnet_stream_adapter_tb.sort.gearup.out_data[5] top.sortnet_stream_adapter_tb.sort.gearup.out_data[4] top.sortnet_stream_adapter_tb.sort.gearup.out_data[3] top.sortnet_stream_adapter_tb.sort.gearup.out_data[2] top.sortnet_stream_adapter_tb.sort.gearup.out_data[1] top.sortnet_stream_adapter_tb.sort.gearup.out_data[0] -@28 -#{top.sortnet_stream_adapter_tb.sort.gearup.out_meta[2:0]} top.sortnet_stream_adapter_tb.sort.gearup.out_meta[2] top.sortnet_stream_adapter_tb.sort.gearup.out_meta[1] top.sortnet_stream_adapter_tb.sort.gearup.out_meta[0] -top.sortnet_stream_adapter_tb.sort.gearup.out_first -top.sortnet_stream_adapter_tb.sort.gearup.out_last -@200 --SortNet -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.in_valid -top.sortnet_stream_adapter_tb.sort.B1.sort.in_iskey -@c00022 -#{in_data[0][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,15] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,14] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,13] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,12] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,11] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,10] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,9] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,8] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,7] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,6] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,5] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,4] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,3] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,2] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,1] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[0,15] -@1401200 --group_end -@c00022 -#{in_data[1][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,15] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,14] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,13] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,12] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,11] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,10] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,9] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,8] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,7] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,6] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,5] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,4] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,3] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,2] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,1] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[1,15] -@1401200 --group_end -@c00022 -#{in_data[2][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,15] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,14] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,13] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,12] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,11] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,10] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,9] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,8] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,7] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,6] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,5] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,4] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,3] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,2] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,1] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[2,15] -@1401200 --group_end -@c00022 -#{in_data[3][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,15] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,14] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,13] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,12] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,11] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,10] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,9] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,8] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,7] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,6] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,5] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,4] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,3] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,2] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,1] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[3,15] -@1401200 --group_end -@c00022 -#{in_data[4][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,15] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,14] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,13] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,12] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,11] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,10] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,9] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,8] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,7] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,6] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,5] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,4] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,3] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,2] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,1] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[4,15] -@1401200 --group_end -@c00022 -#{in_data[5][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,15] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,14] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,13] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,12] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,11] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,10] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,9] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,8] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,7] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,6] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,5] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,4] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,3] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,2] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,1] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[5,15] -@1401200 --group_end -@c00022 -#{in_data[6][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,15] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,14] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,13] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,12] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,11] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,10] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,9] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,8] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,7] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,6] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,5] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,4] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,3] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,2] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,1] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[6,15] -@1401200 --group_end -@c00022 -#{in_data[7][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,15] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,14] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,13] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,12] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,11] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,10] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,9] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,8] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,7] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,6] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,5] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,4] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,3] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,2] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,1] top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.in_data[7,15] -@1401200 --group_end -@c00022 -#{out_data[0][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,15] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,14] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,13] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,12] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,11] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,10] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,9] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,8] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,7] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,6] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,5] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,4] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,3] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,2] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,1] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[0,15] -@1401200 --group_end -@c00022 -#{out_data[1][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,15] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,14] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,13] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,12] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,11] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,10] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,9] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,8] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,7] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,6] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,5] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,4] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,3] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,2] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,1] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[1,15] -@1401200 --group_end -@c00022 -#{out_data[2][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,15] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,14] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,13] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,12] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,11] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,10] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,9] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,8] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,7] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,6] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,5] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,4] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,3] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,2] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,1] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[2,15] -@1401200 --group_end -@c00022 -#{out_data[3][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,15] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,14] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,13] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,12] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,11] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,10] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,9] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,8] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,7] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,6] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,5] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,4] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,3] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,2] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,1] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[3,15] -@1401200 --group_end -@c00022 -#{out_data[4][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,15] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,14] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,13] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,12] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,11] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,10] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,9] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,8] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,7] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,6] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,5] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,4] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,3] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,2] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,1] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[4,15] -@1401200 --group_end -@c00022 -#{out_data[5][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,15] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,14] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,13] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,12] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,11] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,10] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,9] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,8] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,7] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,6] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,5] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,4] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,3] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,2] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,1] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[5,15] -@1401200 --group_end -@c00022 -#{out_data[6][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,15] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,14] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,13] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,12] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,11] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,10] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,9] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,8] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,7] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,6] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,5] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,4] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,3] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,2] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,1] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[6,15] -@1401200 --group_end -@c00022 -#{out_data[7][15:0]} top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,15] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,14] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,13] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,12] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,11] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,10] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,9] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,8] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,7] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,6] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,5] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,4] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,3] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,2] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,1] top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,0] -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,0] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,1] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,2] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,3] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,4] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,5] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,6] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,7] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,8] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,9] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,10] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,11] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,12] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,13] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,14] -top.sortnet_stream_adapter_tb.sort.B1.sort.out_data[7,15] -@1401200 --group_end -@28 -top.sortnet_stream_adapter_tb.sort.B1.sort.out_valid -top.sortnet_stream_adapter_tb.sort.B1.sort.out_iskey -@200 --GearBox -@28 -top.sortnet_stream_adapter_tb.sort.geardown.in_sync -@29 -top.sortnet_stream_adapter_tb.sort.geardown.in_valid -@22 -#{top.sortnet_stream_adapter_tb.sort.geardown.in_data[127:0]} top.sortnet_stream_adapter_tb.sort.geardown.in_data[127] top.sortnet_stream_adapter_tb.sort.geardown.in_data[126] top.sortnet_stream_adapter_tb.sort.geardown.in_data[125] top.sortnet_stream_adapter_tb.sort.geardown.in_data[124] top.sortnet_stream_adapter_tb.sort.geardown.in_data[123] top.sortnet_stream_adapter_tb.sort.geardown.in_data[122] top.sortnet_stream_adapter_tb.sort.geardown.in_data[121] top.sortnet_stream_adapter_tb.sort.geardown.in_data[120] top.sortnet_stream_adapter_tb.sort.geardown.in_data[119] top.sortnet_stream_adapter_tb.sort.geardown.in_data[118] top.sortnet_stream_adapter_tb.sort.geardown.in_data[117] top.sortnet_stream_adapter_tb.sort.geardown.in_data[116] top.sortnet_stream_adapter_tb.sort.geardown.in_data[115] top.sortnet_stream_adapter_tb.sort.geardown.in_data[114] top.sortnet_stream_adapter_tb.sort.geardown.in_data[113] top.sortnet_stream_adapter_tb.sort.geardown.in_data[112] top.sortnet_stream_adapter_tb.sort.geardown.in_data[111] top.sortnet_stream_adapter_tb.sort.geardown.in_data[110] top.sortnet_stream_adapter_tb.sort.geardown.in_data[109] top.sortnet_stream_adapter_tb.sort.geardown.in_data[108] top.sortnet_stream_adapter_tb.sort.geardown.in_data[107] top.sortnet_stream_adapter_tb.sort.geardown.in_data[106] top.sortnet_stream_adapter_tb.sort.geardown.in_data[105] top.sortnet_stream_adapter_tb.sort.geardown.in_data[104] top.sortnet_stream_adapter_tb.sort.geardown.in_data[103] top.sortnet_stream_adapter_tb.sort.geardown.in_data[102] top.sortnet_stream_adapter_tb.sort.geardown.in_data[101] top.sortnet_stream_adapter_tb.sort.geardown.in_data[100] top.sortnet_stream_adapter_tb.sort.geardown.in_data[99] top.sortnet_stream_adapter_tb.sort.geardown.in_data[98] top.sortnet_stream_adapter_tb.sort.geardown.in_data[97] top.sortnet_stream_adapter_tb.sort.geardown.in_data[96] top.sortnet_stream_adapter_tb.sort.geardown.in_data[95] top.sortnet_stream_adapter_tb.sort.geardown.in_data[94] top.sortnet_stream_adapter_tb.sort.geardown.in_data[93] top.sortnet_stream_adapter_tb.sort.geardown.in_data[92] top.sortnet_stream_adapter_tb.sort.geardown.in_data[91] top.sortnet_stream_adapter_tb.sort.geardown.in_data[90] top.sortnet_stream_adapter_tb.sort.geardown.in_data[89] top.sortnet_stream_adapter_tb.sort.geardown.in_data[88] top.sortnet_stream_adapter_tb.sort.geardown.in_data[87] top.sortnet_stream_adapter_tb.sort.geardown.in_data[86] top.sortnet_stream_adapter_tb.sort.geardown.in_data[85] top.sortnet_stream_adapter_tb.sort.geardown.in_data[84] top.sortnet_stream_adapter_tb.sort.geardown.in_data[83] top.sortnet_stream_adapter_tb.sort.geardown.in_data[82] top.sortnet_stream_adapter_tb.sort.geardown.in_data[81] top.sortnet_stream_adapter_tb.sort.geardown.in_data[80] top.sortnet_stream_adapter_tb.sort.geardown.in_data[79] top.sortnet_stream_adapter_tb.sort.geardown.in_data[78] top.sortnet_stream_adapter_tb.sort.geardown.in_data[77] top.sortnet_stream_adapter_tb.sort.geardown.in_data[76] top.sortnet_stream_adapter_tb.sort.geardown.in_data[75] top.sortnet_stream_adapter_tb.sort.geardown.in_data[74] top.sortnet_stream_adapter_tb.sort.geardown.in_data[73] top.sortnet_stream_adapter_tb.sort.geardown.in_data[72] top.sortnet_stream_adapter_tb.sort.geardown.in_data[71] top.sortnet_stream_adapter_tb.sort.geardown.in_data[70] top.sortnet_stream_adapter_tb.sort.geardown.in_data[69] top.sortnet_stream_adapter_tb.sort.geardown.in_data[68] top.sortnet_stream_adapter_tb.sort.geardown.in_data[67] top.sortnet_stream_adapter_tb.sort.geardown.in_data[66] top.sortnet_stream_adapter_tb.sort.geardown.in_data[65] top.sortnet_stream_adapter_tb.sort.geardown.in_data[64] top.sortnet_stream_adapter_tb.sort.geardown.in_data[63] top.sortnet_stream_adapter_tb.sort.geardown.in_data[62] top.sortnet_stream_adapter_tb.sort.geardown.in_data[61] top.sortnet_stream_adapter_tb.sort.geardown.in_data[60] top.sortnet_stream_adapter_tb.sort.geardown.in_data[59] top.sortnet_stream_adapter_tb.sort.geardown.in_data[58] top.sortnet_stream_adapter_tb.sort.geardown.in_data[57] top.sortnet_stream_adapter_tb.sort.geardown.in_data[56] top.sortnet_stream_adapter_tb.sort.geardown.in_data[55] top.sortnet_stream_adapter_tb.sort.geardown.in_data[54] top.sortnet_stream_adapter_tb.sort.geardown.in_data[53] top.sortnet_stream_adapter_tb.sort.geardown.in_data[52] top.sortnet_stream_adapter_tb.sort.geardown.in_data[51] top.sortnet_stream_adapter_tb.sort.geardown.in_data[50] top.sortnet_stream_adapter_tb.sort.geardown.in_data[49] top.sortnet_stream_adapter_tb.sort.geardown.in_data[48] top.sortnet_stream_adapter_tb.sort.geardown.in_data[47] top.sortnet_stream_adapter_tb.sort.geardown.in_data[46] top.sortnet_stream_adapter_tb.sort.geardown.in_data[45] top.sortnet_stream_adapter_tb.sort.geardown.in_data[44] top.sortnet_stream_adapter_tb.sort.geardown.in_data[43] top.sortnet_stream_adapter_tb.sort.geardown.in_data[42] top.sortnet_stream_adapter_tb.sort.geardown.in_data[41] top.sortnet_stream_adapter_tb.sort.geardown.in_data[40] top.sortnet_stream_adapter_tb.sort.geardown.in_data[39] top.sortnet_stream_adapter_tb.sort.geardown.in_data[38] top.sortnet_stream_adapter_tb.sort.geardown.in_data[37] top.sortnet_stream_adapter_tb.sort.geardown.in_data[36] top.sortnet_stream_adapter_tb.sort.geardown.in_data[35] top.sortnet_stream_adapter_tb.sort.geardown.in_data[34] top.sortnet_stream_adapter_tb.sort.geardown.in_data[33] top.sortnet_stream_adapter_tb.sort.geardown.in_data[32] top.sortnet_stream_adapter_tb.sort.geardown.in_data[31] top.sortnet_stream_adapter_tb.sort.geardown.in_data[30] top.sortnet_stream_adapter_tb.sort.geardown.in_data[29] top.sortnet_stream_adapter_tb.sort.geardown.in_data[28] top.sortnet_stream_adapter_tb.sort.geardown.in_data[27] top.sortnet_stream_adapter_tb.sort.geardown.in_data[26] top.sortnet_stream_adapter_tb.sort.geardown.in_data[25] top.sortnet_stream_adapter_tb.sort.geardown.in_data[24] top.sortnet_stream_adapter_tb.sort.geardown.in_data[23] top.sortnet_stream_adapter_tb.sort.geardown.in_data[22] top.sortnet_stream_adapter_tb.sort.geardown.in_data[21] top.sortnet_stream_adapter_tb.sort.geardown.in_data[20] top.sortnet_stream_adapter_tb.sort.geardown.in_data[19] top.sortnet_stream_adapter_tb.sort.geardown.in_data[18] top.sortnet_stream_adapter_tb.sort.geardown.in_data[17] top.sortnet_stream_adapter_tb.sort.geardown.in_data[16] top.sortnet_stream_adapter_tb.sort.geardown.in_data[15] top.sortnet_stream_adapter_tb.sort.geardown.in_data[14] top.sortnet_stream_adapter_tb.sort.geardown.in_data[13] top.sortnet_stream_adapter_tb.sort.geardown.in_data[12] top.sortnet_stream_adapter_tb.sort.geardown.in_data[11] top.sortnet_stream_adapter_tb.sort.geardown.in_data[10] top.sortnet_stream_adapter_tb.sort.geardown.in_data[9] top.sortnet_stream_adapter_tb.sort.geardown.in_data[8] top.sortnet_stream_adapter_tb.sort.geardown.in_data[7] top.sortnet_stream_adapter_tb.sort.geardown.in_data[6] top.sortnet_stream_adapter_tb.sort.geardown.in_data[5] top.sortnet_stream_adapter_tb.sort.geardown.in_data[4] top.sortnet_stream_adapter_tb.sort.geardown.in_data[3] top.sortnet_stream_adapter_tb.sort.geardown.in_data[2] top.sortnet_stream_adapter_tb.sort.geardown.in_data[1] top.sortnet_stream_adapter_tb.sort.geardown.in_data[0] -@28 -#{top.sortnet_stream_adapter_tb.sort.geardown.in_meta[1:0]} top.sortnet_stream_adapter_tb.sort.geardown.in_meta[1] top.sortnet_stream_adapter_tb.sort.geardown.in_meta[0] -top.sortnet_stream_adapter_tb.sort.geardown.in_next -top.sortnet_stream_adapter_tb.sort.geardown.out_sync -top.sortnet_stream_adapter_tb.sort.geardown.out_valid -#{top.sortnet_stream_adapter_tb.sort.geardown.out_meta[1:0]} top.sortnet_stream_adapter_tb.sort.geardown.out_meta[1] top.sortnet_stream_adapter_tb.sort.geardown.out_meta[0] -@c00022 -#{top.sortnet_stream_adapter_tb.sort.geardown.out_data[15:0]} top.sortnet_stream_adapter_tb.sort.geardown.out_data[15] top.sortnet_stream_adapter_tb.sort.geardown.out_data[14] top.sortnet_stream_adapter_tb.sort.geardown.out_data[13] top.sortnet_stream_adapter_tb.sort.geardown.out_data[12] top.sortnet_stream_adapter_tb.sort.geardown.out_data[11] top.sortnet_stream_adapter_tb.sort.geardown.out_data[10] top.sortnet_stream_adapter_tb.sort.geardown.out_data[9] top.sortnet_stream_adapter_tb.sort.geardown.out_data[8] top.sortnet_stream_adapter_tb.sort.geardown.out_data[7] top.sortnet_stream_adapter_tb.sort.geardown.out_data[6] top.sortnet_stream_adapter_tb.sort.geardown.out_data[5] top.sortnet_stream_adapter_tb.sort.geardown.out_data[4] top.sortnet_stream_adapter_tb.sort.geardown.out_data[3] top.sortnet_stream_adapter_tb.sort.geardown.out_data[2] top.sortnet_stream_adapter_tb.sort.geardown.out_data[1] top.sortnet_stream_adapter_tb.sort.geardown.out_data[0] -@28 -top.sortnet_stream_adapter_tb.sort.geardown.out_data[15] -top.sortnet_stream_adapter_tb.sort.geardown.out_data[14] -top.sortnet_stream_adapter_tb.sort.geardown.out_data[13] -top.sortnet_stream_adapter_tb.sort.geardown.out_data[12] -top.sortnet_stream_adapter_tb.sort.geardown.out_data[11] -top.sortnet_stream_adapter_tb.sort.geardown.out_data[10] -top.sortnet_stream_adapter_tb.sort.geardown.out_data[9] -top.sortnet_stream_adapter_tb.sort.geardown.out_data[8] -top.sortnet_stream_adapter_tb.sort.geardown.out_data[7] -top.sortnet_stream_adapter_tb.sort.geardown.out_data[6] -top.sortnet_stream_adapter_tb.sort.geardown.out_data[5] -top.sortnet_stream_adapter_tb.sort.geardown.out_data[4] -top.sortnet_stream_adapter_tb.sort.geardown.out_data[3] -top.sortnet_stream_adapter_tb.sort.geardown.out_data[2] -top.sortnet_stream_adapter_tb.sort.geardown.out_data[1] -top.sortnet_stream_adapter_tb.sort.geardown.out_data[0] -@1401200 --group_end -@28 -top.sortnet_stream_adapter_tb.sort.geardown.out_first -top.sortnet_stream_adapter_tb.sort.geardown.out_last -@200 --Tester --Internal -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/sim/vSim.batch.tcl b/sim/vSim.batch.tcl deleted file mode 100644 index 6a165b697..000000000 --- a/sim/vSim.batch.tcl +++ /dev/null @@ -1,3 +0,0 @@ -run -all -#coverage report -html -htmldir CoverageReport -details=abcdefgs -threshL 50 -threshH 90 -quit diff --git a/sim/vSim.default.wdo b/sim/vSim.default.wdo deleted file mode 100644 index 05fa26a67..000000000 --- a/sim/vSim.default.wdo +++ /dev/null @@ -1 +0,0 @@ -add wave * diff --git a/sim/vSim.gui.tcl b/sim/vSim.gui.tcl deleted file mode 100644 index d694be4f3..000000000 --- a/sim/vSim.gui.tcl +++ /dev/null @@ -1,6 +0,0 @@ -run -all -wave zoom full -puts "Provided files:" -puts "- 'do recompile.do' compile all sources from scratch and restart the simulation" -puts "- 'do relaunch.do' recompile, restart and rerun the simulation" -puts "- 'do saveWaveform.do' save current waveform selection to a *.wdo file" diff --git a/sim/xSim.batch.tcl b/sim/xSim.batch.tcl deleted file mode 100644 index 767aee201..000000000 --- a/sim/xSim.batch.tcl +++ /dev/null @@ -1,2 +0,0 @@ -run all -quit diff --git a/sim/xSim.gui.tcl b/sim/xSim.gui.tcl deleted file mode 100644 index c43cff447..000000000 --- a/sim/xSim.gui.tcl +++ /dev/null @@ -1 +0,0 @@ -run all diff --git a/src/arith/README.md b/src/arith/README.md index 3848a8cf4..6f04ef982 100644 --- a/src/arith/README.md +++ b/src/arith/README.md @@ -11,41 +11,41 @@ namespace as well as public constants and functions. ## Entities - - [`arith_addw`][arith_addw] - - [`arith_carrychain_inc`][arith_carrychain_inc] - - [`arith_convert_bin2bcd`][arith_convert_bin2bcd] - - [`arith_counter_bcd`][arith_counter_bcd] - implements a BCD (Binary-Coded Decimal) counter. - - [`arith_counter_free`][arith_counter_free] - - [`arith_counter_gray`][arith_counter_gray] - implements a Gray-Code counter. - - [`arith_counter_ring`][arith_counter_ring] - implements a ring (Johnson) counter. - - [`arith_div`][arith_addw] - - [`arith_firstone`][arith_firstone] + - [`arith_Adder_Wide`][arith_Adder_Wide] + - [`arith_CarryChain_inc`][arith_CarryChain_inc] + - [`arith_Convert_Binary2BCD`][arith_Convert_Binary2BCD] + - [`arith_Counter_BCD`][arith_Counter_BCD] - implements a BCD (Binary-Coded Decimal) counter. + - [`arith_Counter_Free`][arith_Counter_Free] + - [`arith_Counter_Gray`][arith_Counter_Gray] - implements a Gray-Code counter. + - [`arith_Counter_Ring`][arith_Counter_Ring] - implements a ring (Johnson) counter. + - [`arith_Divider`][arith_Divider] + - [`arith_FirstOne`][arith_FirstOne] - [`arith_muls_wide`][arith_muls_wide] - - [`arith_prefix_and`][arith_prefix_and] - - [`arith_prefix_or`][arith_prefix_or] - - [`arith_prng`][arith_prng] - implements a Pseudo Random Number Generator (PRNG). - - [`arith_same`][arith_same] - - [`arith_scaler`][arith_scaler] - - [`arith_shifter_barrel`][arith_shifter_barrel] - - [`arith_sqrt`][arith_sqrt] + - [`arith_Prefix_And`][arith_Prefix_And] + - [`arith_Prefix_Or`][arith_Prefix_Or] + - [`arith_PRNG`][arith_PRNG] - implements a Pseudo Random Number Generator (PRNG). + - [`arith_Same`][arith_Same] + - [`arith_Scaler`][arith_Scaler] + - [`arith_Shifter_Barrel`][arith_Shifter_Barrel] + - [`arith_SquareRoot`][arith_SquareRoot] [arith.pkg]: arith.pkg.vhdl - [arith_addw]: arith_addw.vhdl - [arith_carrychain_inc]: arith_carrychain_inc.vhdl - [arith_convert_bin2bcd]: arith_convert_bin2bcd.vhdl - [arith_counter_bcd]: arith_counter_bcd.vhdl - [arith_counter_free]: arith_counter_free.vhdl - [arith_counter_gray]: arith_counter_gray.vhdl - [arith_counter_ring]: arith_counter_ring.vhdl - [arith_div]: arith_div.vhdl - [arith_firstone]: arith_firstone.vhdl + [arith_Adder_Wide]: arith_Adder_Wide.vhdl + [arith_CarryChain_inc]: arith_CarryChain_inc.vhdl + [arith_Convert_Binary2BCD]: arith_Convert_Binary2BCD.vhdl + [arith_Counter_BCD]: arith_Counter_BCD.vhdl + [arith_Counter_Free]: arith_Counter_Free.vhdl + [arith_Counter_Gray]: arith_Counter_Gray.vhdl + [arith_Counter_Ring]: arith_Counter_Ring.vhdl + [arith_Divider]: arith_Divider.vhdl + [arith_FirstOne]: arith_FirstOne.vhdl [arith_muls_wide]: arith_muls_wide.vhdl - [arith_prefix_and]: arith_prefix_and.vhdl - [arith_prefix_or]: arith_prefix_or.vhdl - [arith_prng]: arith_prng.vhdl - [arith_same]: arith_same.vhdl - [arith_scaler]: arith_scaler.vhdl - [arith_shifter_barrel]: arith_shifter_barrel.vhdl - [arith_sqrt]: arith_sqrt.vhdl + [arith_Prefix_And]: arith_Prefix_And.vhdl + [arith_Prefix_Or]: arith_Prefix_Or.vhdl + [arith_PRNG]: arith_PRNG.vhdl + [arith_Same]: arith_Same.vhdl + [arith_Scaler]: arith_Scaler.vhdl + [arith_Shifter_Barrel]: arith_Shifter_Barrel.vhdl + [arith_SquareRoot]: arith_SquareRoot.vhdl diff --git a/src/arith/arith.pkg.vhdl b/src/arith/arith.pkg.vhdl index cc3f9a8ed..61681faa2 100644 --- a/src/arith/arith.pkg.vhdl +++ b/src/arith/arith.pkg.vhdl @@ -39,42 +39,42 @@ use work.utils.all; package arith is function arith_prbs_lfsr (value : std_logic_vector) return std_logic_vector; - component arith_firstone is + component arith_FirstOne is generic ( - N : positive -- Length of Token Chain + BITS : positive -- Length of Token Chain ); port ( - tin : in std_logic := '1'; -- Enable: Fed Token - rqst : in std_logic_vector(N-1 downto 0); -- Request: Token Requests - grnt : out std_logic_vector(N-1 downto 0); -- Grant: Token Output - tout : out std_logic; -- Inactive: Unused Token - bin : out std_logic_vector(log2ceil(N)-1 downto 0) -- Binary Grant Index + TokenIn : in std_logic := '1'; -- Enable: Fed Token + Request : in std_logic_vector(BITS-1 downto 0); -- Request: Token Requests + Grant : out std_logic_vector(BITS-1 downto 0); -- Grant: Token Output + TokenOut : out std_logic; -- Inactive: Unused Token + Index : out std_logic_vector(log2ceil(BITS)-1 downto 0) -- Binary Grant Index ); end component; - component arith_counter_bcd is + component arith_Counter_BCD is generic ( DIGITS : positive ); port ( - clk : in std_logic; - rst : in std_logic; - inc : in std_logic; - val : out T_BCD_VECTOR(DIGITS-1 downto 0)); + Clock : in std_logic; + Reset : in std_logic; + Increment : in std_logic; + Value : out T_BCD_VECTOR(DIGITS-1 downto 0)); end component; - component arith_counter_gray is + component arith_Counter_Gray is generic ( BITS : positive; -- Bit width of the counter INIT : natural := 0 -- Initial/reset counter value ); port ( - clk : in std_logic; - rst : in std_logic; -- Reset to INIT value - inc : in std_logic; -- Increment - dec : in std_logic := '0'; -- Decrement - val : out std_logic_vector(BITS-1 downto 0); -- Value output - cry : out std_logic -- Carry output + Clock : in std_logic; + Reset : in std_logic; + Increment : in std_logic; + Decrement : in std_logic := '0'; + Value : out std_logic_vector(BITS-1 downto 0); + CarryOut : out std_logic ); end component; @@ -82,156 +82,148 @@ package arith is -- pipelined and the regular sequential implementation. The returned value -- specifies the number of cycles it takes after asserting start for the -- result to become ready. - function arith_div_latency(a_bits, rapow : positive) return positive; + function arith_DividerLatency(dividendBits : positive; radixExponent : positive) return positive; - component arith_div + -- XXX: discuss generic and port names + component arith_Divider generic ( - A_BITS : positive; -- Dividend Width - D_BITS : positive; -- Divisor Width - RAPOW : positive := 1; -- Power of Compute Radix (2**RAPOW) + DIVIDEND_BITS : positive; -- Dividend Width + DIVISOR_BITS : positive; -- Divisor Width + RADIX_EXPONENT : positive := 1; -- Power of Compute Radix (2**RAPOW) PIPELINED : boolean := false -- Computation Pipeline ); port ( -- Global Reset/Clock - clk : in std_logic; - rst : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- Ready / Start - start : in std_logic; - ready : out std_logic; + Start : in std_logic; + Ready : out std_logic; -- Arguments / Result (2's complement) - A : in std_logic_vector(A_BITS-1 downto 0); -- Dividend - D : in std_logic_vector(D_BITS-1 downto 0); -- Divisor - Q : out std_logic_vector(A_BITS-1 downto 0); -- Quotient - R : out std_logic_vector(D_BITS-1 downto 0); -- Remainder - Z : out std_logic -- Division by Zero + Dividend : in std_logic_vector(DIVIDEND_BITS - 1 downto 0); + Divisor : in std_logic_vector(DIVISOR_BITS - 1 downto 0); + Quotient : out std_logic_vector(DIVIDEND_BITS - 1 downto 0); + Remainder : out std_logic_vector(DIVISOR_BITS - 1 downto 0); + DivisionByZero : out std_logic ); end component; - component arith_prng + component arith_PRNG generic ( - BITS : positive; - SEED : std_logic_vector := "0" + BITS : positive; + SEED : std_logic_vector := "0" ); port ( - Clock : in std_logic; - Reset : in std_logic; -- reset value to seed + Clock : in std_logic; + Reset : in std_logic; -- reset value to seed - InitialValue : in std_logic_vector := SEED; -- Is loaded when Reset = '1' - Got : in std_logic; -- the current value has been got, and a new value should be calculated + InitialValue : in std_logic_vector := SEED; -- Is loaded when Reset = '1' + Got : in std_logic; -- the current value has been got, and a new value should be calculated Value : out std_logic_vector(BITS - 1 downto 0) -- the pseudo-random number ); end component; - component arith_trng is + -- XXX: discuss generic and port names + component arith_TRNG is generic ( - BITS : positive -- Width: Number of Oscillators + BITS : positive -- Width: Number of Oscillators ); port ( - clk : in std_logic; -- Clock - rnd : out std_logic_vector(BITS-1 downto 0) -- Random Oscillator Samples + Clock : in std_logic; -- Clock + Value : out std_logic_vector(BITS-1 downto 0) -- Random Oscillator Samples ); end component; - -- component arith_muls_wide - -- generic ( - -- NA : integer range 2 to 18; - -- NB : integer range 19 to 36; - -- SPLIT : positive - -- ); - -- port ( - -- a : in signed(NA-1 downto 0); - -- b : in signed(NB-1 downto 0); - -- p : out signed(NA+NB-1 downto 0) - -- ); - -- end component; - - component arith_sqrt + component arith_SquareRoot generic ( - N : positive + BITS : positive ); port ( - rst : in std_logic; - clk : in std_logic; - arg : in std_logic_vector(N-1 downto 0); - start : in std_logic; - sqrt : out std_logic_vector((N-1)/2 downto 0); - rdy : out std_logic + Clock : in std_logic; + Reset : in std_logic; + Operand : in std_logic_vector(BITS-1 downto 0); + Start : in std_logic; + Result : out std_logic_vector((BITS-1)/2 downto 0); + Ready : out std_logic ); end component; - type tArch is (AAM, CAI, CCA, PAI); - type tBlocking is (DFLT, FIX, ASC, DESC); - type tSkipping is (PLAIN, CCC, PPN_KS, PPN_BK); + type T_Adder_Architecture is (AAM, CAI, CCA, PAI); + type T_Adder_BlockingScheme is (DFLT, FIX, ASC, DESC); -- DFLT = Default + type T_Adder_CarrySkipScheme is (PLAIN, CCC, PPN_KS, PPN_BK); - component arith_addw is + type T_Adder_BlockingScheme_Vector is array(T_Adder_Architecture) of T_Adder_BlockingScheme; + + component arith_Adder_Wide is generic ( - N : positive; -- Operand Width - K : positive; -- Block Count + BITS : positive; -- Operand Width + BLOCKS : positive; -- Block Count - ARCH : tArch := AAM; -- Architecture - BLOCKING : tBlocking := DFLT; -- Blocking Scheme - SKIPPING : tSkipping := CCC; -- Carry Skip Scheme - P_INCLUSIVE : boolean := false -- Use Inclusive Propagate, i.e. c^1 + ARCH : T_Adder_Architecture := AAM; -- Architecture + BLOCKING : T_Adder_BlockingScheme := DFLT; -- Blocking Scheme + SKIPPING : T_Adder_CarrySkipScheme := CCC; -- Carry Skip Scheme + P_INCLUSIVE : boolean := false -- Use Inclusive Propagate, i.e. c^1 ); port ( - a, b : in std_logic_vector(N-1 downto 0); - cin : in std_logic; + A : in std_logic_vector(BITS - 1 downto 0); + B : in std_logic_vector(BITS - 1 downto 0); + CarryIn : in std_logic; - s : out std_logic_vector(N-1 downto 0); - cout : out std_logic + Sum : out std_logic_vector(BITS - 1 downto 0); + CarryOut : out std_logic ); end component; - component arith_same is + component arith_Same is generic ( - N : positive -- Input width + BITS : positive -- Input width ); port ( g : in std_logic := '1'; -- Guard Input (!g => !y) - x : in std_logic_vector(N-1 downto 0); -- Input Vector + x : in std_logic_vector(BITS-1 downto 0); -- Input Vector y : out std_logic -- All-same Output ); end component; - component arith_carrychain_inc_xilinx is + component arith_CarryChain_inc_Xilinx is generic ( BITS : positive ); port ( - X : in std_logic_vector(BITS - 1 downto 0); - CIn : in std_logic := '1'; - Y : out std_logic_vector(BITS - 1 downto 0) + A : in std_logic_vector(BITS - 1 downto 0); + CarryIn : in std_logic := '1'; + Sum : out std_logic_vector(BITS - 1 downto 0) ); end component; - component arith_prefix_and_xilinx is + component arith_Prefix_And_Xilinx is generic ( - N : positive + BITS : positive ); port ( - x : in std_logic_vector(N-1 downto 0); - y : out std_logic_vector(N-1 downto 0) + x : in std_logic_vector(BITS-1 downto 0); + y : out std_logic_vector(BITS-1 downto 0) ); end component; - component arith_prefix_or_xilinx is + component arith_Prefix_Or_Xilinx is generic ( - N : positive + BITS : positive ); port ( - x : in std_logic_vector(N-1 downto 0); - y : out std_logic_vector(N-1 downto 0) + x : in std_logic_vector(BITS-1 downto 0); + y : out std_logic_vector(BITS-1 downto 0) ); end component; component arith_inc_ovcy_xilinx is generic ( - N : positive -- Bit Width + BITS : positive -- Bit Width ); port ( - p : in std_logic_vector(N-1 downto 0); -- Argument + p : in std_logic_vector(BITS-1 downto 0); -- Argument g : in std_logic; -- Increment Guard v : out std_logic -- Overflow Output ); @@ -239,13 +231,13 @@ package arith is end package; package body arith is - function arith_div_latency(a_bits, rapow : positive) return positive is + function arith_DividerLatency(dividendBits : positive; radixExponent : positive) return positive is begin - return (a_bits+rapow-1)/rapow; - end; + return (dividendBits + radixExponent - 1) / radixExponent; + end function; function arith_prbs_lfsr (value : std_logic_vector) return std_logic_vector is - subtype T_TAPPOSITION is T_NATVEC(0 to 4); + subtype T_TAPPOSITION is natural_vector(0 to 4); type T_TAPPOSITION_VECTOR is array (natural range <>) of T_TAPPOSITION; -- Tap positions are taken from Xilinx Application Note 052 (XAPP052) @@ -434,5 +426,5 @@ package body arith is end loop; return value(BITS - 2 downto 0) & temp; - end; -end package body arith; + end function; +end package body; diff --git a/src/arith/arith_Adder_Wide.vhdl b/src/arith/arith_Adder_Wide.vhdl new file mode 100644 index 000000000..a4cb49fcf --- /dev/null +++ b/src/arith/arith_Adder_Wide.vhdl @@ -0,0 +1,346 @@ +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- +-- Entity: arith_Adder_Wide +-- +-- Description: +-- ------------------------------------- +-- Implements wide addition providing several options all based +-- on an adaptation of a carry-select approach. +-- +-- References: +-- +-- * Hong Diep Nguyen and Bogdan Pasca and Thomas B. Preusser: +-- FPGA-Specific Arithmetic Optimizations of Short-Latency Adders, +-- FPL 2011. +-- -> ARCH: AAM, CAI, CCA +-- -> SKIPPING: CCC +-- +-- * Marcin Rogawski, Kris Gaj and Ekawat Homsirikamol: +-- A Novel Modular Adder for One Thousand Bits and More +-- Using Fast Carry Chains of Modern FPGAs, FPL 2014. +-- -> ARCH: PAI +-- -> SKIPPING: PPN_KS, PPN_BK +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2015 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + + +use std.textio.all; + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.utils.all; +use work.arith.all; + + +entity arith_Adder_Wide is + generic ( + BITS : positive; -- Operand Width + BLOCKS : positive; -- Block Count + + ARCH : T_Adder_Architecture := AAM; -- Architecture + BLOCKING : T_Adder_BlockingScheme := DFLT; -- Blocking Scheme + SKIPPING : T_Adder_CarrySkipScheme := CCC; -- Carry Skip Scheme + P_INCLUSIVE : boolean := false -- Use Inclusive Propagate, i.e. c^1 + ); + port ( + A : in std_logic_vector(BITS-1 downto 0); + B : in std_logic_vector(BITS-1 downto 0); + CarryIn : in std_logic; + + Sum : out std_logic_vector(BITS-1 downto 0); + CarryOut : out std_logic + ); +end entity; + +architecture rtl of arith_Adder_Wide is + + -- Determine Block Boundaries + type T_Blocking_Vector is array(T_Adder_Architecture) of T_Adder_BlockingScheme; + constant DEFAULT_BLOCKING : T_Blocking_Vector := (AAM => ASC, CAI => DESC, PAI => DESC, CCA => DESC); + + impure function compute_blocks return integer_vector is + variable bs : T_Adder_BlockingScheme := BLOCKING; + variable res : integer_vector(BLOCKS-1 downto 0); + + variable l : line; + begin + if bs = DFLT then + bs := DEFAULT_BLOCKING(ARCH); + end if; + case bs is + when FIX => + assert BITS >= BLOCKS + report "Cannot have more blocks than input bits." + severity failure; + for i in res'range loop + res(i) := ((i+1)*BITS+BLOCKS/2)/BLOCKS; + end loop; + + when ASC => + assert BITS-BLOCKS*(BLOCKS-1)/2 >= BLOCKS + report "Too few input bits to implement growing block sizes." + severity failure; + for i in res'range loop + res(i) := ((i+1)*(BITS-BLOCKS*(BLOCKS-1)/2)+BLOCKS/2)/BLOCKS + (i+1)*i/2; + end loop; + + when DESC => + assert BITS-BLOCKS*(BLOCKS-1)/2 >= BLOCKS + report "Too few input bits to implement growing block sizes." + severity failure; + for i in res'range loop + res(i) := ((i+1)*(BITS+BLOCKS*(BLOCKS-1)/2)+BLOCKS/2)/BLOCKS - (i+1)*i/2; + end loop; + + when others => + report "Unknown blocking scheme: "&T_Adder_BlockingScheme'image(bs) severity failure; + + end case; + --synthesis translate_off + write(l, "Implementing "&integer'image(BITS)&"-bit wide adder: ARCH="&T_Adder_Architecture'image(ARCH)& + ", BLOCKING="&T_Adder_BlockingScheme'image(bs)&'['); + for i in BLOCKS-1 downto 1 loop + write(l, res(i)-res(i-1)); + write(l, ','); + end loop; + write(l, res(0)); + write(l, "], SKIPPING="&T_Adder_CarrySkipScheme'image(SKIPPING)); + writeline(output, l); + --synthesis translate_on + return res; + end function compute_blocks; + + constant BLOCK_S : integer_vector(BLOCKS-1 downto 0) := compute_blocks; + + signal g : std_logic_vector(BLOCKS-1 downto 1); -- Block Generate + signal p : std_logic_vector(BLOCKS-1 downto 1); -- Block Propagate + signal c : std_logic_vector(BLOCKS-1 downto 1); -- Block Carry-in +begin + + ----------------------------------------------------------------------------- + -- Rightmost Block + Carry Computation Core + blkCore: block + constant M : positive := BLOCK_S(0); -- Rightmost Block Width + begin + + -- Carry Computation with Carry Chain + genCCC: if SKIPPING = CCC generate + signal x, y : unsigned(BLOCKS+M-2 downto 0); + signal z : unsigned(BLOCKS+M-1 downto 0); + begin + x <= unsigned(g & A(M-1 downto 0)); + genExcl: if not P_INCLUSIVE generate + y <= unsigned((g or p) & B(M-1 downto 0)); + -- carry recovery for other blocks + c <= std_logic_vector(z(BLOCKS+M-2 downto M)) xor p; + end generate genExcl; + genIncl: if P_INCLUSIVE generate + y <= unsigned(p & B(M-1 downto 0)); + -- carry recovery for other blocks + c <= std_logic_vector(z(BLOCKS+M-2 downto M)) xor (p xor g); + end generate genIncl; + z <= ('0' & x) + y + (0 to 0 => CarryIn); + + -- output of rightmost block + Sum(M-1 downto 0) <= std_logic_vector(z(M-1 downto 0)); + + -- carry output + CarryOut <= z(z'left); + end generate genCCC; + + -- LUT-based Carry Computations + genLUT: if SKIPPING /= CCC generate + signal z : unsigned(M downto 0); + begin + -- rightmost block + z <= unsigned('0' & A(M-1 downto 0)) + unsigned(B(M-1 downto 0)) + (0 to 0 => CarryIn); + Sum(M-1 downto 0) <= std_logic_vector(z(M-1 downto 0)); + + -- Plain linear LUT-based Carry Forwarding + genPlain: if SKIPPING = PLAIN generate + signal t : std_logic_vector(BLOCKS downto 1); + begin + -- carry forwarding + t(1) <= z(M); + t(BLOCKS downto 2) <= g or (p and c); + c <= t(BLOCKS-1 downto 1); + CarryOut <= t(BLOCKS); + end generate genPlain; + + -- Kogge-Stone Parallel Prefix Network + genPPN_KS: if SKIPPING = PPN_KS generate + subtype tLevel is std_logic_vector(BLOCKS-1 downto 0); + type tLevels is array(natural range<>) of tLevel; + constant LEVELS : positive := log2ceil(BLOCKS); + signal pp, gg : tLevels(0 to LEVELS); + begin + -- carry forwarding + pp(0) <= p & 'X'; + gg(0) <= g & z(M); + genLevels: for i in 1 to LEVELS generate + constant D : positive := 2**(i-1); + begin + pp(i) <= (pp(i-1)(BLOCKS-1 downto D) and pp(i-1)(BLOCKS-D-1 downto 0)) & pp(i-1)(D-1 downto 0); + gg(i) <= (gg(i-1)(BLOCKS-1 downto D) or (pp(i-1)(BLOCKS-1 downto D) and gg(i-1)(BLOCKS-D-1 downto 0))) & gg(i-1)(D-1 downto 0); + end generate genLevels; + c <= gg(LEVELS)(BLOCKS-2 downto 0); + CarryOut <= gg(LEVELS)(BLOCKS-1); + end generate genPPN_KS; + + -- Brent-Kung Parallel Prefix Network + genPPN_BK: if SKIPPING = PPN_BK generate + subtype tLevel is std_logic_vector(BLOCKS-1 downto 0); + type tLevels is array(natural range<>) of tLevel; + constant LEVELS : positive := log2ceil(BLOCKS); + signal pp, gg : tLevels(0 to 2*LEVELS-1); + begin + -- carry forwarding + pp(0) <= p & 'X'; + gg(0) <= g & z(M); + genMerge: for i in 1 to LEVELS generate + constant D : positive := 2**(i-1); + begin + genBits: for j in 0 to BLOCKS-1 generate + genOp: if j mod (2*D) = 2*D-1 generate + gg(i)(j) <= (pp(i-1)(j) and gg(i-1)(j-D)) or gg(i-1)(j); + pp(i)(j) <= pp(i-1)(j) and pp(i-1)(j-D); + end generate; + genCp: if j mod (2*D) /= 2*D-1 generate + gg(i)(j) <= gg(i-1)(j); + pp(i)(j) <= pp(i-1)(j); + end generate; + end generate; + end generate genMerge; + genSpread: for i in LEVELS+1 to 2*LEVELS-1 generate + constant D : positive := 2**(2*LEVELS-i-1); + begin + genBits: for j in 0 to BLOCKS-1 generate + genOp: if j > D and (j+1) mod (2*D) = D generate + gg(i)(j) <= (pp(i-1)(j) and gg(i-1)(j-D)) or gg(i-1)(j); + pp(i)(j) <= pp(i-1)(j) and pp(i-1)(j-D); + end generate; + genCp: if j <= D or (j+1) mod (2*D) /= D generate + gg(i)(j) <= gg(i-1)(j); + pp(i)(j) <= pp(i-1)(j); + end generate; + end generate; + end generate genSpread; + c <= gg(gg'high)(BLOCKS-2 downto 0); + CarryOut <= gg(gg'high)(BLOCKS-1); + end generate genPPN_BK; + + end generate genLUT; + + end block blkCore; + + ----------------------------------------------------------------------------- + -- Implement Carry-Select Variant + -- + -- all but rightmost block, implementation architecture selected by ARCH + genBlocks: for i in 1 to BLOCKS-1 generate + -- Covered Index Range + constant LO : positive := BLOCK_S(i-1); -- Low Bit Index + constant HI : positive := BLOCK_S(i)-1; -- High Bit Index + + -- Internal Block Interface + signal aa : unsigned(HI downto LO); + signal bb : unsigned(HI downto LO); + signal ss : unsigned(HI downto LO); + begin + + -- Connect common block interface + aa <= unsigned(A(HI downto LO)); + bb <= unsigned(B(HI downto LO)); + Sum(HI downto LO) <= std_logic_vector(ss); + + -- ARCH-specific Implementations + + --Add-Add-Multiplex + genAAM: if ARCH = AAM generate + signal s0 : unsigned(HI+1 downto LO); -- Block Sum (cin=0) + signal s1 : unsigned(HI+1 downto LO); -- Block Sum (cin=1) + begin + s0 <= ('0' & aa) + bb; + s1 <= ('0' & aa) + bb + 1; + g(i) <= s0(HI+1); + genExcl: if not P_INCLUSIVE generate + p(i) <= s1(HI+1) xor s0(HI+1); + end generate genExcl; + genIncl: if P_INCLUSIVE generate + p(i) <= s1(HI+1); + end generate genIncl; + + ss <= s0(HI downto LO) when c(i) = '0' else s1(HI downto LO); + end generate genAAM; + + -- Compare-Add-Increment + genCAI: if ARCH = CAI generate + signal s0 : unsigned(HI+1 downto LO); -- Block Sum (cin=0) + begin + s0 <= ('0' & aa) + bb; + g(i) <= s0(HI+1); + genExcl: if not P_INCLUSIVE generate + p(i) <= 'X' when Is_X(std_logic_vector(aa & bb)) else + '1' when (aa xor bb) = (aa'range => '1') else '0'; + end generate genExcl; + genIncl: if P_INCLUSIVE generate + p(i) <= 'X' when Is_X(std_logic_vector(aa&bb)) else + '1' when aa >= not bb else '0'; + end generate genIncl; + ss <= s0(HI downto LO) when c(i) = '0' else s0(HI downto LO)+1; + end generate genCAI; + + -- Propagate-Add-Increment + genPAI: if ARCH = PAI generate + signal s0 : unsigned(HI+1 downto LO); -- Block Sum (cin=0) + begin + s0 <= ('0' & aa) + bb; + g(i) <= s0(HI+1); + genExcl: if not P_INCLUSIVE generate + p(i) <= 'X' when Is_X(std_logic_vector(s0)) else + '1' when s0(HI downto LO) = (HI downto LO => '1') else '0'; + end generate genExcl; + genIncl: if P_INCLUSIVE generate + p(i) <= 'X' when Is_X(std_logic_vector(s0)) else + '1' when s0(HI downto LO) = (HI downto LO => '1') else g(i); + end generate genIncl; + ss <= s0(HI downto LO) when c(i) = '0' else s0(HI downto LO)+1; + end generate genPAI; + + -- Compare-Compare-Add + genCCA: if ARCH = CCA generate + g(i) <= 'X' when Is_X(std_logic_vector(aa&bb)) else + '1' when aa > not bb else '0'; + genExcl: if not P_INCLUSIVE generate + p(i) <= 'X' when Is_X(std_logic_vector(aa&bb)) else + '1' when (aa xor bb) = (aa'range => '1') else '0'; + end generate genExcl; + genIncl: if P_INCLUSIVE generate + p(i) <= 'X' when Is_X(std_logic_vector(aa&bb)) else + '1' when aa >= not bb else '0'; + end generate genIncl; + ss <= aa + bb + (0 to 0 => c(i)); + end generate genCCA; + + end generate genBlocks; + +end architecture; diff --git a/src/arith/arith_carrychain_inc.vhdl b/src/arith/arith_CarryChain_inc.vhdl similarity index 62% rename from src/arith/arith_carrychain_inc.vhdl rename to src/arith/arith_CarryChain_inc.vhdl index 8a6f66655..1c864dc2a 100644 --- a/src/arith/arith_carrychain_inc.vhdl +++ b/src/arith/arith_CarryChain_inc.vhdl @@ -1,24 +1,25 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Carry-chain abstraction for increment by one operations +-- Entity: Carry-chain abstraction for increment by one operations -- -- Description: -- ------------------------------------- -- This is a generic carry-chain abstraction for increment by one operations. -- --- Y <= X + (0...0) & Cin +-- Sum <= A + (0...0) & CarryIn -- -- License: -- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -36,39 +37,39 @@ use work.utils.all; use work.arith.all; -entity arith_carrychain_inc is +entity arith_CarryChain_inc is generic ( - BITS : positive + BITS : positive ); port ( - X : in std_logic_vector(BITS - 1 downto 0); - CIn : in std_logic := '1'; - Y : out std_logic_vector(BITS - 1 downto 0) + A : in std_logic_vector(BITS - 1 downto 0); + CarryIn : in std_logic := '1'; + Sum : out std_logic_vector(BITS - 1 downto 0) ); end entity; -architecture rtl of arith_carrychain_inc is +architecture rtl of arith_CarryChain_inc is -- Force Carry-chain use for pointer increments on Xilinx architectures - constant XILINX_FORCE_CARRYCHAIN : boolean := (not SIMULATION) and (VENDOR = VENDOR_XILINX) and (BITS > 4); + constant XILINX_FORCE_CARRYCHAIN : boolean := (not SIMULATION) and (VENDOR = VENDOR_XILINX) and (BITS > 4); begin genGeneric : if not XILINX_FORCE_CARRYCHAIN generate signal Cin_vec : unsigned(0 downto 0); begin - Cin_vec(0) <= Cin; -- WORKAROUND: for GHDL - Y <= std_logic_vector(unsigned(X) + Cin_vec); + Cin_vec(0) <= CarryIn; -- WORKAROUND: for GHDL + Sum <= std_logic_vector(unsigned(A) + Cin_vec); end generate; genXilinx : if XILINX_FORCE_CARRYCHAIN generate - inc : arith_carrychain_inc_xilinx + inc : component arith_CarryChain_inc_Xilinx generic map ( - BITS => BITS + BITS => BITS ) port map ( - X => X, - CIn => CIn, - Y => Y + A => A, + CarryIn => CarryIn, + Sum => Sum ); end generate; end architecture; diff --git a/src/arith/arith_convert_bin2bcd.vhdl b/src/arith/arith_Convert_Binary2BCD.vhdl similarity index 86% rename from src/arith/arith_convert_bin2bcd.vhdl rename to src/arith/arith_Convert_Binary2BCD.vhdl index 7f11c1f0e..b24fb8a4e 100644 --- a/src/arith/arith_convert_bin2bcd.vhdl +++ b/src/arith/arith_Convert_Binary2BCD.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Converter binary numbers to BCD encoded numbers. +-- Entity: Converter binary numbers to BCD encoded numbers. -- -- Description: -- ------------------------------------- @@ -17,7 +17,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -27,14 +27,14 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.components.all; -entity arith_convert_bin2bcd is +entity arith_Convert_Binary2BCD is generic ( BITS : positive := 8; DIGITS : positive := 3; @@ -42,27 +42,27 @@ entity arith_convert_bin2bcd is REGISTER_OUTPUT : boolean := FALSE ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - Start : in std_logic; + Start : in std_logic; Busy : out std_logic; - Binary : in std_logic_vector(BITS - 1 downto 0); - IsSigned : in std_logic := '0'; + Binary : in std_logic_vector(BITS - 1 downto 0); + IsSigned : in std_logic := '0'; BCDDigits : out T_BCD_VECTOR(DIGITS - 1 downto 0); Sign : out std_logic ); end entity; -architecture rtl of arith_convert_bin2bcd is +architecture rtl of arith_Convert_Binary2BCD is constant RADIX_BITS : positive := log2ceil(RADIX); constant BINARY_SHIFTS : positive := div_ceil(BITS, RADIX_BITS); constant BINARY_BITS : positive := BINARY_SHIFTS * RADIX_BITS; subtype T_CARRY is unsigned(RADIX_BITS - 1 downto 0); - type T_CARRY_VECTOR is array(natural range <>) of T_CARRY; + type T_CARRY_VECTOR is array(natural range <>) of T_CARRY; -- FIXME: T_USV ? signal Digit_Shift_rst : std_logic; signal Digit_Shift_en : std_logic; @@ -70,7 +70,7 @@ architecture rtl of arith_convert_bin2bcd is signal Binary_en : std_logic; signal Binary_rl : std_logic; - signal Binary_d : std_logic_vector(BINARY_BITS - 1 downto 0) := (others => '0'); + signal Binary_d : std_logic_vector(BINARY_BITS - 1 downto 0) := (others => '0'); signal Sign_d : std_logic := '0'; signal DelayShifter : std_logic_vector(BINARY_SHIFTS downto 0) := '1' & (BINARY_SHIFTS - 1 downto 0 => '0'); @@ -141,9 +141,9 @@ begin begin if rising_edge(Clock) then if Reset = '1' or Digit_Shift_rst = '1' then - Digit_d <= "0000"; + Digit_d <= "0000"; elsif (Digit_Shift_en = '1') then - Digit_d <= Digit_nxt(Digit_d'range); + Digit_d <= Digit_nxt(Digit_d'range); end if; end if; end process; diff --git a/src/arith/arith_counter_bcd.vhdl b/src/arith/arith_Counter_BCD.vhdl similarity index 55% rename from src/arith/arith_counter_bcd.vhdl rename to src/arith/arith_Counter_BCD.vhdl index 66babf22a..ff1641ac7 100644 --- a/src/arith/arith_counter_bcd.vhdl +++ b/src/arith/arith_Counter_BCD.vhdl @@ -1,34 +1,35 @@ -- ============================================================================= --- Authors: Martin Zabel --- Thomas B. Preusser +-- Authors: Martin Zabel +-- Thomas B. Preusser -- --- Entity: BCD counter. +-- Entity: BCD counter. -- -- Description: -- ------------------------------------- -- Counter with output in binary coded decimal (BCD). The number of BCD digits -- is configurable by ``DIGITS``. -- --- All control signals (reset ``rst``, increment ``inc``) are high-active and --- synchronous to clock ``clk``. The output ``val`` is the current counter +-- All control signals (``Reset``, ``Increment``) are high-active and +-- synchronous to ``Clock``. The output ``Value`` is the current counter -- state. Groups of 4 bit represent one BCD digit. The lowest significant digit --- is specified by ``val(3 downto 0)``. +-- is specified by ``Value(3 downto 0)``. -- -- .. TODO:: -- --- * implement a ``dec`` input for decrementing --- * implement a ``load`` input to load a value +-- * implement a ``Decrement`` input for decrementing +-- * implement a ``Load`` input to load a value -- -- License: -- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -37,45 +38,45 @@ -- limitations under the License. -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use work.utils.all; -entity arith_counter_bcd is +entity arith_Counter_BCD is generic ( - DIGITS : positive -- Number of BCD digits + DIGITS : positive -- Number of BCD digits ); port ( - clk : in std_logic; - rst : in std_logic; -- Reset to 0 - inc : in std_logic; -- Increment - val : out T_BCD_VECTOR(DIGITS-1 downto 0) -- Value output + Clock : in std_logic; + Reset : in std_logic; -- Reset to 0 + Increment : in std_logic; -- Increment + Value : out T_BCD_VECTOR(DIGITS-1 downto 0) -- Value output ); end entity; -architecture rtl of arith_counter_bcd is - -- c(i) = carry-in of stage 'i' - signal p : unsigned(DIGITS-1 downto 0); -- Stage Overflows=Propagates - signal c : unsigned(DIGITS downto 0); -- Inter-Stage Carries +architecture rtl of arith_Counter_BCD is + -- c(i) = carry-in of stage 'i' + signal p : unsigned(DIGITS-1 downto 0); -- Stage Overflows=Propagates + signal c : unsigned(DIGITS downto 0); -- Inter-Stage Carries begin -- Compute Carries using standard addition - c <= ('0'&p) xor (('0'&p) + 1); + c <= ('0'&p) xor (('0'&p) + 1); -- Generate for each BCD stage gDigit : for i in 0 to DIGITS-1 generate - signal cnt_r : T_BCD := x"0"; -- Counter Digit of this Stage + signal cnt_r : T_BCD := x"0"; -- Counter Digit of this Stage begin p(i) <= cnt_r(3) and cnt_r(0); -- Local Overflow at digit 9 - process(clk) + process(Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then cnt_r <= (others => '0'); - elsif (inc and c(i)) = '1' then -- short critical path for 'inc' + elsif (Increment and c(i)) = '1' then -- short critical path for 'inc' if p(i) = '1' then -- our counter reached last digit cnt_r <= x"0"; else @@ -86,6 +87,6 @@ begin end process; -- Digit Output - val(i) <= cnt_r; + Value(i) <= cnt_r; end generate gDigit; end architecture; diff --git a/src/arith/arith_counter_free.vhdl b/src/arith/arith_Counter_Free.vhdl similarity index 65% rename from src/arith/arith_counter_free.vhdl rename to src/arith/arith_Counter_Free.vhdl index beed1421b..09ffbb332 100644 --- a/src/arith/arith_counter_free.vhdl +++ b/src/arith/arith_Counter_Free.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Thomas B. Preusser +-- Authors: Thomas B. Preusser -- --- Entity: Poc.arith_counter_free +-- Entity: Poc.arith_Counter_Free -- -- Description: -- ------------------------------------- @@ -17,13 +17,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -32,59 +32,60 @@ -- limitations under the License. -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; -use work.utils.all; +use work.utils.all; -entity arith_counter_free is +-- XXX: discuss generic +entity arith_Counter_Free is generic ( - DIVIDER : positive + DIVIDER : positive ); port ( -- Global Control - clk : in std_logic; - rst : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - inc : in std_logic; - stb : out std_logic -- End-of-Period Strobe - ); -end entity arith_counter_free; + Increment : in std_logic; + Strobe : out std_logic -- End-of-Period Strobe + ); +end entity; -architecture rtl of arith_counter_free is +architecture rtl of arith_Counter_Free is begin genNoDiv: if DIVIDER = 1 generate - process(clk) + process(Clock) begin - if rising_edge(clk) then - stb <= inc; + if rising_edge(Clock) then + Strobe <= Increment; end if; end process; end generate genNoDiv; genDoDiv: if DIVIDER > 1 generate -- Note: For DIVIDER=2**K+1, this could be marginally reduced to log2ceil(DIVIDER-1) -- if it was known that the increment input inc would never be deasserted. - constant N : natural := log2ceil(DIVIDER); - signal Cnt : unsigned(N downto 0) := (others => '0'); + constant BITS : natural := log2ceil(DIVIDER); + signal Cnt : unsigned(BITS downto 0) := (others => '0'); signal cin : unsigned(0 downto 0); begin - cin(0) <= not inc; - process(clk) + cin(0) <= not Increment; + process(Clock) begin - if rising_edge(clk) then - if rst = '1' then - Cnt <= to_unsigned(DIVIDER-2, N+1); + if rising_edge(Clock) then + if Reset = '1' then + Cnt <= to_unsigned(DIVIDER-2, BITS+1); else - Cnt <= Cnt + ite(Cnt(N) = '0', (Cnt'range => '1'), to_unsigned(DIVIDER-1, N+1)) + cin; + Cnt <= Cnt + ite(Cnt(BITS) = '0', (Cnt'range => '1'), to_unsigned(DIVIDER-1, BITS+1)) + cin; end if; end if; end process; - stb <= Cnt(N); + Strobe <= Cnt(BITS); end generate genDoDiv; -end rtl; +end architecture; diff --git a/src/arith/arith_counter_gray.vhdl b/src/arith/arith_Counter_Gray.vhdl similarity index 57% rename from src/arith/arith_counter_gray.vhdl rename to src/arith/arith_Counter_Gray.vhdl index 1226cd2c0..a8c31c780 100644 --- a/src/arith/arith_counter_gray.vhdl +++ b/src/arith/arith_Counter_Gray.vhdl @@ -1,9 +1,9 @@ -- ============================================================================= --- Authors: Thomas B. Preusser --- Martin Zabel --- Steffen Koehler +-- Authors: Thomas B. Preusser +-- Martin Zabel +-- Steffen Koehler -- --- Entity: Gray-Code counter. +-- Entity: Gray-Code counter. -- -- Description: -- ------------------------------------- @@ -12,13 +12,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2014 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -27,28 +27,28 @@ -- limitations under the License. -- ============================================================================= -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -entity arith_counter_gray is +entity arith_Counter_Gray is generic ( - BITS : positive; -- Bit width of the counter - INIT : natural := 0 -- Initial/reset counter value + BITS : positive; -- Bit width of the counter + INIT : natural := 0 -- Initial/reset counter value ); port ( - clk : in std_logic; - rst : in std_logic; -- Reset to INIT value - inc : in std_logic; -- Increment - dec : in std_logic := '0'; -- Decrement - val : out std_logic_vector(BITS-1 downto 0); -- Value output - cry : out std_logic -- Carry output + Clock : in std_logic; + Reset : in std_logic; -- Reset to INIT value + Increment : in std_logic; -- Increment + Decrement : in std_logic := '0'; -- Decrement + Value : out std_logic_vector(BITS-1 downto 0); -- Value output + CarryOut : out std_logic -- Carry output ); -end entity arith_counter_gray; +end entity; -architecture rtl of arith_counter_gray is +architecture rtl of arith_Counter_Gray is -- purpose: gray constant encoder function gray_encode (val : natural; len : positive) return unsigned is @@ -63,7 +63,7 @@ architecture rtl of arith_counter_gray is -- purpose: parity generation function parity (val : unsigned) return std_logic is variable res : std_logic := '0'; - begin -- parity + begin -- parity for i in val'range loop res := res xor val(i); end loop; @@ -71,28 +71,28 @@ architecture rtl of arith_counter_gray is end parity; -- Counter Register - constant INIT_GRAY : unsigned(BITS-1 downto 0) := gray_encode(INIT, BITS); - signal gray_cnt_r : unsigned(BITS-1 downto 0) := INIT_GRAY; + constant INIT_GRAY : unsigned(BITS-1 downto 0) := gray_encode(INIT, BITS); + signal gray_cnt_r : unsigned(BITS-1 downto 0) := INIT_GRAY; signal gray_cnt_nxt : unsigned(BITS-1 downto 0); - signal en : std_logic; -- enable: inc xor dec + signal en : std_logic; -- enable: inc xor dec begin ----------------------------------------------------------------------------- -- Actual Counter Register - en <= inc xor dec; - process(clk) + en <= Increment xor Decrement; + process(Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then gray_cnt_r <= INIT_GRAY; elsif en = '1' then gray_cnt_r <= gray_cnt_nxt; end if; end if; end process; - val <= std_logic_vector(gray_cnt_r); + Value <= std_logic_vector(gray_cnt_r); ----------------------------------------------------------------------------- -- Computation of Increment/Decrement @@ -101,7 +101,7 @@ begin -- Trivial one-bit Counter g1: if BITS = 1 generate gray_cnt_nxt <= not gray_cnt_r; - cry <= gray_cnt_r(0) xor dec; + CarryOut <= gray_cnt_r(0) xor Decrement; end generate g1; -- Multi-Bit Counter @@ -112,16 +112,16 @@ begin -- first_one_n(i) = '1' denotes position i -- parity of gray_cnt_r - signal par_r : std_logic := INIT_PAR; + signal par_r : std_logic := INIT_PAR; signal par_nxt : std_logic; begin -- Parity Register - process(clk) + process(Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then par_r <= INIT_PAR; elsif en = '1' then par_r <= par_nxt; @@ -130,22 +130,22 @@ begin end process; -- Computation of next Value - process(gray_cnt_r, par_r, dec) - variable x : unsigned(BITS-1 downto 0); - variable s : unsigned(BITS-1 downto 0); + process(gray_cnt_r, par_r, Decrement) + variable x : unsigned(BITS-1 downto 0); + variable s : unsigned(BITS-1 downto 0); begin -- Prefer inc over dec to keep combinational path short in standard use. - x := gray_cnt_r(BITS-2 downto 0) & (par_r xnor dec); - x(x'left) := not gray_cnt_r(BITS-1); -- catch final carry to invert last bit - s := not x + 1; -- locate first intermediate '1' + x := gray_cnt_r(BITS-2 downto 0) & (par_r xnor Decrement); + x(x'left) := not gray_cnt_r(BITS-1); -- catch final carry to invert last bit + s := not x + 1; -- locate first intermediate '1' gray_cnt_nxt <= s(BITS-1) & (gray_cnt_r(BITS-2 downto 0) xor (s(BITS-2 downto 0) and x(BITS-2 downto 0))); - par_nxt <= s(0) xor dec; + par_nxt <= s(0) xor Decrement; end process; - cry <= (gray_cnt_r(BITS-1) xor dec) and (gray_cnt_nxt(BITS-1) xnor dec); + CarryOut <= (gray_cnt_r(BITS-1) xor Decrement) and (gray_cnt_nxt(BITS-1) xnor Decrement); end generate g2; end architecture; diff --git a/src/arith/arith_Counter_Ring.vhdl b/src/arith/arith_Counter_Ring.vhdl new file mode 100644 index 000000000..ecb2121ec --- /dev/null +++ b/src/arith/arith_Counter_Ring.vhdl @@ -0,0 +1,73 @@ +-- ============================================================================= +-- Authors: Patrick Lehmann +-- +-- Entity: Ring counter/Johnson Counter +-- +-- Description: +-- ------------------------------------- +-- This module implements an up/down ring-counter with loadable initial value +-- (``seed``) on reset. The counter can be configured to a Johnson counter by +-- enabling ``INVERT_FEEDBACK``. The number of counter bits is configurable with +-- ``BITS``. +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; + +use work.utils.all; + + +entity arith_Counter_Ring is + generic ( + BITS : positive; + INVERT_FEEDBACK : boolean := FALSE -- FALSE -> ring counter; TRUE -> johnson counter + ); + port ( + Clock : in std_logic; -- Clock + Reset : in std_logic; -- Reset + Seed : in std_logic_vector(BITS - 1 downto 0) := (others => '0'); -- initial counter vector / load value + Increment : in std_logic := '0'; -- increment counter + Decrement : in std_logic := '0'; -- decrement counter + Value : out std_logic_vector(BITS - 1 downto 0) -- counter value + ); +end entity; + + +architecture rtl of arith_Counter_Ring is + constant invert : std_logic := to_sl(INVERT_FEEDBACK); + + signal Counter : std_logic_vector(BITS - 1 downto 0) := (others => '0'); + +begin + process(Clock) + begin + if rising_edge(Clock) then + if (Reset = '1') then + Counter <= Seed; + elsif (Increment = '1') then + Counter <= Counter(Counter'high - 1 downto 0) & (Counter(Counter'high) xor invert); + elsif (Decrement = '1') then + Counter <= (Counter(0) xor invert) & Counter(Counter'high downto 1); + end if; + end if; + end process; + + Value <= Counter; +end architecture; diff --git a/src/arith/arith_Divider.vhdl b/src/arith/arith_Divider.vhdl new file mode 100644 index 000000000..93bd369aa --- /dev/null +++ b/src/arith/arith_Divider.vhdl @@ -0,0 +1,232 @@ +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- +-- Entity: Multi-cycle Non-Performing Restoring Divider +-- +-- Description: +-- ------------------------------------- +-- Implementation of a Non-Performing restoring divider with a configurable radix. +-- The multi-cycle division is controlled by 'start' / 'rdy'. A new division is +-- started by asserting 'start'. The result Q = A/D is available when 'rdy' +-- returns to '1'. A division by zero is identified by output Z. The Q and R +-- outputs are undefined in this case. +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universität Dresden - Germany, +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; + +entity arith_Divider is + generic ( + DIVIDEND_BITS : positive; -- Dividend Width + DIVISOR_BITS : positive; -- Divisor Width + RADIX_EXPONENT : positive := 1; -- Power of Compute Radix (2**RAPOW) + PIPELINED : boolean := false -- Computation Pipeline + ); + port ( + -- Global Reset/Clock + Clock : in std_logic; + Reset : in std_logic; + + -- Ready / Start + Start : in std_logic; + Ready : out std_logic; + + -- Arguments / Result (2's complement) + Dividend : in std_logic_vector(DIVIDEND_BITS-1 downto 0); + Divisor : in std_logic_vector(DIVISOR_BITS-1 downto 0); + Quotient : out std_logic_vector(DIVIDEND_BITS-1 downto 0); + Remainder : out std_logic_vector(DIVISOR_BITS-1 downto 0); + DivisionByZero : out std_logic + ); +end entity arith_Divider; + + +library IEEE; +use IEEE.numeric_std.all; + +use work.utils.all; + +------------------------------------------------------------------------------- +-- This divider is an implementation by an iterative digit recurrence. +-- +-- The basic approach is radix 2 (RAPOW=1). A higher radix power may be +-- specified so as to unroll the corresponding number of elementary radix-2 +-- steps into one clock cycle. This cuts the computational latency accordingly. +-- However, the amount of combinational logic does increase and the critical +-- path will eventually be affected. +-- +-- A PIPELINED instantiation unrolls all necessary iteration steps in space +-- so that every stage uses its own set of registers. The pipeline can accept a +-- new pair of inputs in every clock cycle. +-- +-- Internally, the divider uses two state registers: +-- - DR - the divisor, which remains constant throughout one operation, and +-- - AR holding the actual computation state, which is iteratively tranformed +-- from the initial dividend to the quotient. +-- The active computation is performed on the left end of AR, which represents +-- the relevant prefix of the current residue to be tested against the divisor. +-- The remaining residue is shifted step-by-step into this region. The freed +-- space on the right is immediately re-used for the generated quotient digits. +-- +-- The layout transformation of AR (either over time or in space) is as follows: +-- +-- |<- D_BITS+RAPOW ->|<- (Digits of A) - 1 ->| +-- |<- A_BITS ->| +-- +-- | 00 ... 00 | A | +-- +-- \-------v-------/ +-- P-D ? +-- / \______________________________ +-- | \ +-- v v +-- +-- | P' | << A << | Q| +-- +-- +-- | R | Q | +-- +architecture rtl of arith_Divider is + + -- Constants + constant STEPS : positive := (DIVIDEND_BITS+RADIX_EXPONENT-1)/RADIX_EXPONENT; -- Number of Iteration Steps + constant DEPTH : natural := ite(PIPELINED, STEPS, 0); -- Physical Depth + constant TRUNK_BITS : natural := (STEPS-1)*RADIX_EXPONENT; + constant ACTIVE_BITS : positive := DIVISOR_BITS + RADIX_EXPONENT; + + -- Private Types + subtype t_residue is unsigned(ACTIVE_BITS+TRUNK_BITS-1 downto 0); + subtype t_divisor is unsigned(DIVISOR_BITS-1 downto 0); + type residue_vector is array(natural range<>) of t_residue; + type divisor_vector is array(natural range<>) of t_divisor; + + function div_step(av : t_residue; dv : t_divisor) return t_residue is + variable res : t_residue; + variable win : unsigned(DIVISOR_BITS-1 downto 0); + variable dif : unsigned(DIVISOR_BITS downto 0); + begin + win := av(av'left downto TRUNK_BITS + RADIX_EXPONENT); + for i in RADIX_EXPONENT-1 downto 0 loop + dif := (win & av(TRUNK_BITS+i)) - dv; + if dif(dif'left) = '0' then + win := dif(DIVISOR_BITS-1 downto 0); + else + win := win(DIVISOR_BITS-2 downto 0) & av(TRUNK_BITS+i); + end if; + res(i) := not dif(dif'left); + end loop; + res(res'left downto RADIX_EXPONENT) := win & av(TRUNK_BITS-1 downto 0); + return res; + end function div_step; + + -- Data Registers + signal AR : residue_vector(0 to DEPTH) := (others => (others => '-')); + signal DR : divisor_vector(0 to DEPTH) := (others => (others => '-')); + signal ZR : std_logic := '-'; -- Zero Detection only in last pipeline stage + + signal exec : std_logic; + +begin + + ----------------------------------------------------------------------------- + -- Control + genPipeN : if not PIPELINED generate + constant EXEC_BITS : positive := log2ceil(STEPS)+1; + constant EXEC_IDLE : signed(EXEC_BITS-1 downto 0) := '0' & (1 to EXEC_BITS-1 => '-'); + + signal CntExec : signed(EXEC_BITS-1 downto 0) := EXEC_IDLE; + begin + process(Clock) + begin + if rising_edge(Clock) then + if Reset = '1' then + CntExec <= EXEC_IDLE; + elsif Start = '1' then + CntExec <= to_signed(-STEPS, CntExec'length); + elsif CntExec(CntExec'left) = '1' then + CntExec <= CntExec + 1; + end if; + end if; + end process; + exec <= CntExec(CntExec'left); + Ready <= not exec; + end generate genPipeN; + + genPipeY : if PIPELINED generate + signal Vld : std_logic_vector(0 to STEPS) := (others => '0'); + begin + process(Clock) + begin + if rising_edge(Clock) then + if Reset = '1' then + Vld <= (others => '0'); + else + Vld <= Start & Vld(0 to STEPS-1); + end if; + end if; + end process; + Ready <= Vld(STEPS); + end generate genPipeY; + + ----------------------------------------------------------------------------- + -- Registers + process(Clock) + variable an : t_residue; + variable dn : t_divisor; + begin + if rising_edge(Clock) then + -- Reset + if Reset = '1' then + AR <= (others => (others => '-')); + DR <= (others => (others => '-')); + ZR <= '-'; + + -- Operation Initialization + else + + an := t_residue'((t_residue'left downto DIVIDEND_BITS => '0') & unsigned(Dividend)); + dn := t_divisor'(unsigned(Divisor)); + for i in 0 to imax(0, DEPTH-1) loop + AR(i) <= an; + DR(i) <= dn; + an := div_step(AR(i), DR(i)); + dn := DR(i); + end loop; + + if PIPELINED or (Start = '0' and exec = '1') then + AR(DEPTH) <= an; + DR(DEPTH) <= dn; + if Is_X(std_logic_vector(dn)) then + ZR <= 'X'; + elsif dn = 0 then + ZR <= '1'; + else + ZR <= '0'; + end if; + end if; + + end if; + end if; + end process; + + Quotient <= std_logic_vector(AR(DEPTH)(DIVIDEND_BITS-1 downto 0)); + Remainder <= std_logic_vector(AR(DEPTH)(STEPS * RADIX_EXPONENT + DIVISOR_BITS-1 downto STEPS * RADIX_EXPONENT)); + DivisionByZero <= ZR; +end architecture; diff --git a/src/arith/arith_FirstOne.vhdl b/src/arith/arith_FirstOne.vhdl new file mode 100644 index 000000000..0a766108f --- /dev/null +++ b/src/arith/arith_FirstOne.vhdl @@ -0,0 +1,160 @@ +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- +-- Entity: TODO +-- +-- Description: +-- ------------------------------------- +-- Computes from an input word, a word of the same size that has, at most, +-- one bit set. The output contains a set bit at the position of the rightmost +-- set bit of the input if and only if such a set bit exists in the input. +-- +-- A typical use case for this computation would be an arbitration over +-- requests with a fixed and strictly ordered priority. The terminology of +-- the interface assumes this use case and provides some useful extras: +-- +-- * Set tin <= '0' (no input token) to disallow grants altogether. +-- * Read tout (unused token) to see whether or any grant was issued. +-- * Read bin to obtain the binary index of the rightmost detected one bit. +-- The index starts at zero (0) in the rightmost bit position. +-- +-- This implementation uses carry chains for wider implementations. +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2015 Technische Universität Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.config.all; +use work.utils.all; + +entity arith_FirstOne is + generic ( + BITS : positive -- Length of Token Chain + ); + port ( + TokenIn : in std_logic := '1'; -- Enable: Fed Token + Request : in std_logic_vector(BITS-1 downto 0); -- Request: Token Requests + Grant : out std_logic_vector(BITS-1 downto 0); -- Grant: Token Output + TokenOut : out std_logic; -- Inactive: Unused Token + Index : out std_logic_vector(log2ceil(BITS)-1 downto 0) -- Binary Grant Index + ); +end entity; + +architecture rtl of arith_FirstOne is +begin + -- Generic Carry Chain through Addition + genGeneric: if VENDOR /= VENDOR_XILINX or BITS < 6 generate + process(Request, TokenIn) + variable onehot : std_logic_vector(Grant'range); + variable binary : unsigned(Index'range); + variable adder : unsigned(BITS downto 0); + begin + adder := ("0" & unsigned(not Request)) + (1 to 1 => TokenIn); + onehot := std_logic_vector(adder(BITS-1 downto 0)) and Request; + binary := (others => '0'); + for i in onehot'range loop + if onehot(i) = '1' then + binary := binary or to_unsigned(i, binary'length); + end if; + end loop; + TokenOut <= adder(BITS); + Grant <= onehot; + Index <= std_logic_vector(binary); + end process; + end generate genGeneric; + + -- Optimized Xilinx Carry Chain by MUXCY Instantiation + genXilinx: if VENDOR = VENDOR_XILINX and BITS >= 6 generate + component MUXCY + port ( + S : in std_logic; + DI : in std_logic; + CI : in std_logic; + O : out std_logic + ); + end component; + + signal p : std_logic_vector(BITS-1 downto 0); -- Propagates + signal q : std_logic_vector(BITS downto 0); -- Carries = Intermediate Tokens + begin + + -- Propagate if no local Request + p <= not Request; + + -- Token Input + q(0) <= to_X01(TokenIn); + + -- Token Forwarding Chain + genChain: for i in 0 to BITS-1 generate + signal pp, cc : std_logic; + signal qq : std_logic_vector(1 downto 0); + begin + + -- q(i+1) <= q(i) and p(i) + + -- First MUXCY only with switching LUT + genFirst: if i = 0 generate + pp <= q(0) and p(0); + cc <= '1'; + end generate; + + -- Others using Carry Input + genChain: if i > 0 generate + pp <= p(i); + cc <= q(i); + end generate genChain; + + MUXCY_inst : MUXCY + port map ( + O => q(i+1), + CI => cc, + DI => '0', + S => pp + ); + + -- Compute Grant + qq <= q(i+1 downto i); + with qq select Grant(i) <= + '0' when "00" | "11", + '1' when "01", + 'X' when others; + + end generate; + + -- Token Output + TokenOut <= q(BITS); + + -- Recode to Binary + process(q) + variable b : std_logic; + begin + for i in 0 to log2ceil(BITS)-1 loop + b := '0'; + for j in 0 to (BITS+(2**i)-1)/(2**(i+1))-1 loop + b := b or (q((2**i) + j*(2**(i+1))) and not q(imin(BITS, (2**(i+1)) + j*(2**(i+1))))); + end loop; + Index(i) <= b; + end loop; + end process; + + end generate genXilinx; + +end architecture; diff --git a/src/arith/arith_prng.vhdl b/src/arith/arith_PRNG.vhdl similarity index 59% rename from src/arith/arith_prng.vhdl rename to src/arith/arith_PRNG.vhdl index a69decd73..0de4cea58 100644 --- a/src/arith/arith_prng.vhdl +++ b/src/arith/arith_PRNG.vhdl @@ -34,49 +34,49 @@ -- limitations under the License. -- ============================================================================= -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.arith.all; -entity arith_prng is - generic ( - BITS : positive; +entity arith_PRNG is + generic ( + BITS : positive; SEED : std_logic_vector := "0" - ); - port ( - Clock : in std_logic; - Reset : in std_logic; -- reset value to seed + ); + port ( + Clock : in std_logic; + Reset : in std_logic; -- reset value to seed - InitialValue : in std_logic_vector := SEED; -- Is loaded when Reset = '1' - Got : in std_logic; -- the current value has been got, and a new value should be calculated - Value : out std_logic_vector(BITS - 1 downto 0) -- the pseudo-random number - ); + InitialValue : in std_logic_vector := SEED; -- Is loaded when Reset = '1' + Got : in std_logic; -- the current value has been got, and a new value should be calculated + Value : out std_logic_vector(BITS - 1 downto 0) -- the pseudo-random number + ); end entity; -architecture rtl of arith_prng is - -- The current value - signal val_r : std_logic_vector(BITS - 1 downto 0) := resize(SEED, BITS); +architecture rtl of arith_PRNG is + -- The current value + signal val_r : std_logic_vector(BITS - 1 downto 0) := resize(SEED, BITS); begin - assert ((3 <= BITS) and (BITS <= 168)) report "Width not yet supported." severity failure; + assert ((3 <= BITS) and (BITS <= 168)) report "Width not yet supported." severity failure; - ----------------------------------------------------------------------------- - -- Register - ----------------------------------------------------------------------------- - process (Clock) - begin - if rising_edge(Clock) then - if Reset = '1' then - val_r <= resize(InitialValue, BITS); - elsif Got = '1' then - val_r <= arith_prbs_lfsr(val_r); - end if; - end if; - end process; + ----------------------------------------------------------------------------- + -- Register + ----------------------------------------------------------------------------- + process (Clock) + begin + if rising_edge(Clock) then + if Reset = '1' then + val_r <= resize(InitialValue, BITS); + elsif Got = '1' then + val_r <= arith_prbs_lfsr(val_r); + end if; + end if; + end process; - Value <= val_r; + Value <= val_r; end architecture; diff --git a/src/arith/arith_prefix_and.vhdl b/src/arith/arith_Prefix_And.vhdl similarity index 62% rename from src/arith/arith_prefix_and.vhdl rename to src/arith/arith_Prefix_And.vhdl index 4bae0c1e1..5c469c152 100644 --- a/src/arith/arith_prefix_and.vhdl +++ b/src/arith/arith_Prefix_And.vhdl @@ -1,11 +1,8 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; -- ============================================================================= --- Authors: Thomas B. Preusser --- Patrick Lehmann +-- Authors: Thomas B. Preusser +-- Patrick Lehmann -- --- Entity: Prefix AND computation +-- Entity: Prefix AND computation -- -- Description: -- ------------------------------------- @@ -16,13 +13,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universität Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,52 +28,52 @@ -- limitations under the License. -- ============================================================================= -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.arith.all; -entity arith_prefix_and is +entity arith_Prefix_And is generic ( - N : positive + BITS : positive ); port ( - x : in std_logic_vector(N-1 downto 0); - y : out std_logic_vector(N-1 downto 0) + x : in std_logic_vector(BITS-1 downto 0); + y : out std_logic_vector(BITS-1 downto 0) ); end entity; -architecture rtl of arith_prefix_and is +architecture rtl of arith_Prefix_And is begin -- Generic Carry Chain through Addition genGeneric: if VENDOR /= VENDOR_XILINX generate y(0) <= x(0); - gen1: if N > 1 generate - signal p : unsigned(N-1 downto 1); + gen1: if BITS > 1 generate + signal p : unsigned(BITS-1 downto 1); begin p(1) <= x(0) and x(1); - gen2: if N > 2 generate - signal s : std_logic_vector(N downto 1); + gen2: if BITS > 2 generate + signal s : std_logic_vector(BITS downto 1); begin - p(N-1 downto 2) <= unsigned(x(N-1 downto 2)); + p(BITS-1 downto 2) <= unsigned(x(BITS-1 downto 2)); s <= std_logic_vector(('0' & p) + 1); - y(N-1 downto 2) <= s(N downto 3) xor ('0' & x(N-1 downto 3)); + y(BITS-1 downto 2) <= s(BITS downto 3) xor ('0' & x(BITS-1 downto 3)); end generate gen2; y(1) <= p(1); end generate gen1; end generate; genXilinx : if VENDOR = VENDOR_XILINX generate - prefix : arith_prefix_and_xilinx + prefix : arith_Prefix_And_Xilinx generic map ( - N => N + BITS => BITS ) port map ( - x => x, - y => y + x => x, + y => y ); end generate; end architecture; diff --git a/src/arith/arith_prefix_or.vhdl b/src/arith/arith_Prefix_Or.vhdl similarity index 62% rename from src/arith/arith_prefix_or.vhdl rename to src/arith/arith_Prefix_Or.vhdl index d2900a9eb..eb791f6b9 100644 --- a/src/arith/arith_prefix_or.vhdl +++ b/src/arith/arith_Prefix_Or.vhdl @@ -1,11 +1,8 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; -- ============================================================================= --- Authors: Thomas B. Preusser --- Patrick Lehmann +-- Authors: Thomas B. Preusser +-- Patrick Lehmann -- --- Entity: Prefix OR computation +-- Entity: Prefix OR computation -- -- Description: -- ------------------------------------- @@ -16,13 +13,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universität Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,52 +28,52 @@ -- limitations under the License. -- ============================================================================= -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.arith.all; -entity arith_prefix_or is +entity arith_Prefix_Or is generic ( - N : positive + BITS : positive ); port ( - x : in std_logic_vector(N-1 downto 0); - y : out std_logic_vector(N-1 downto 0) + x : in std_logic_vector(BITS-1 downto 0); + y : out std_logic_vector(BITS-1 downto 0) ); end entity; -architecture rtl of arith_prefix_or is +architecture rtl of arith_Prefix_Or is begin -- Generic Carry Chain through Addition genGeneric: if VENDOR /= VENDOR_XILINX generate y(0) <= x(0); - gen1: if N > 1 generate - signal p : unsigned(N-1 downto 1); + gen1: if BITS > 1 generate + signal p : unsigned(BITS-1 downto 1); begin p(1) <= x(0) or x(1); - gen2: if N > 2 generate - signal s : std_logic_vector(N downto 1); + gen2: if BITS > 2 generate + signal s : std_logic_vector(BITS downto 1); begin - p(N-1 downto 2) <= unsigned(x(N-1 downto 2)); + p(BITS-1 downto 2) <= unsigned(x(BITS-1 downto 2)); s <= std_logic_vector(('1' & p) - 1); - y(N-1 downto 2) <= s(N downto 3) xnor ('1' & x(N-1 downto 3)); + y(BITS-1 downto 2) <= s(BITS downto 3) xnor ('1' & x(BITS-1 downto 3)); end generate gen2; y(1) <= p(1); end generate gen1; end generate; genXilinx : if VENDOR = VENDOR_XILINX generate - prefix : arith_prefix_or_xilinx + prefix : arith_Prefix_Or_Xilinx generic map ( - N => N + BITS => BITS ) port map ( - x => x, - y => y + x => x, + y => y ); end generate; end architecture; diff --git a/src/arith/arith_same.vhdl b/src/arith/arith_Same.vhdl similarity index 68% rename from src/arith/arith_same.vhdl rename to src/arith/arith_Same.vhdl index 072a3e295..d9b098d18 100644 --- a/src/arith/arith_same.vhdl +++ b/src/arith/arith_Same.vhdl @@ -1,10 +1,7 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; -- ============================================================================= --- Authors: Thomas B. Preusser +-- Authors: Thomas B. Preusser -- --- Entity: This module detects whether all bit positions of a std_logic_vector have the same value. +-- Entity: This module detects whether all bit positions of a std_logic_vector have the same value. -- -- Description: -- ------------------------------------- @@ -20,13 +17,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universität Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -44,32 +41,32 @@ use work.utils.all; use work.arith.all; -entity arith_same is +entity arith_Same is generic ( - N : positive -- Input width + BITS : positive -- Input width ); port ( - g : in std_logic := '1'; -- Guard Input (!g => !y) - x : in std_logic_vector(N-1 downto 0); -- Input Vector - y : out std_logic -- All-same Output + g : in std_logic := '1'; -- Guard Input (!g => !y) + x : in std_logic_vector(BITS-1 downto 0); -- Input Vector + y : out std_logic -- All-same Output ); end entity; -architecture rtl of arith_same is - constant DEV_INFO : T_DEVICE_INFO := DEVICE_INFO; +architecture rtl of arith_Same is + constant DEV_INFO : T_DEVICE_INFO := DEVICE_INFO; - constant K : positive := DEV_INFO.LUT_FanIn; -- LUT Fanin - constant M : positive := (N-2+1/N)/(K-1) + 1; -- Required Stage Count - signal p : std_logic_vector(M-1 downto 0); -- Stage Propagates + constant K : positive := DEV_INFO.LUT_FanIn; -- LUT Fanin + constant M : positive := (BITS-2+1/BITS)/(K-1) + 1; -- Required Stage Count + signal p : std_logic_vector(M-1 downto 0); -- Stage Propagates begin -- Compute Propagates in LUT Stages genCC: for i in 0 to M-1 generate -- Relevant Vector Slice - constant LO : natural := i *(K-1); - constant HI : natural := imin(N-1, (i+1)*(K-1)); + constant LO : natural := i *(K-1); + constant HI : natural := imin(BITS-1, (i+1)*(K-1)); begin p(i) <= '1' when x(HI downto LO) = (HI downto LO => '0') else '1' when x(HI downto LO) = (HI downto LO => '1') else @@ -78,7 +75,7 @@ begin -- Compute Equivalence in Carry Chain genXLXn: if DEV_INFO.Vendor /= VENDOR_XILINX generate - signal s : std_logic_vector(M downto 0); + signal s : std_logic_vector(M downto 0); begin -- Infere Carry Chain from Addition s <= std_logic_vector(unsigned('0' & p) + (0 to 0 => g)); @@ -88,7 +85,7 @@ begin genXLXy: if DEV_INFO.Vendor = VENDOR_XILINX generate i: arith_inc_ovcy_xilinx generic map ( - N => M + BITS => M ) port map ( p => p, diff --git a/src/arith/arith_scaler.vhdl b/src/arith/arith_Scaler.vhdl similarity index 67% rename from src/arith/arith_scaler.vhdl rename to src/arith/arith_Scaler.vhdl index c9237779c..20a22762d 100644 --- a/src/arith/arith_scaler.vhdl +++ b/src/arith/arith_Scaler.vhdl @@ -45,55 +45,55 @@ use IEEE.numeric_std.all; use work.utils.all; -entity arith_scaler is +entity arith_Scaler is generic ( - MULS : T_POSVEC := (0 => 1); -- The set of multipliers to choose from in scaling operations. - DIVS : T_POSVEC := (0 => 1) -- The set of divisors to choose from in scaling operations. + MULTIPLIERS : positive_vector := (0 => 1); -- The set of multipliers to choose from in scaling operations. + DIVISORS : positive_vector := (0 => 1) -- The set of divisors to choose from in scaling operations. ); port ( - clk : in std_logic; - rst : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - start : in std_logic; -- Start of Computation - arg : in std_logic_vector; -- Fixed-point value to be scaled - msel : in std_logic_vector(log2ceil(MULS'length)-1 downto 0) := (others => '0'); - dsel : in std_logic_vector(log2ceil(DIVS'length)-1 downto 0) := (others => '0'); + Start : in std_logic; -- Start of Computation + Operand : in std_logic_vector; -- Fixed-point value to be scaled + MultiplierSelect : in std_logic_vector(log2ceil(MULTIPLIERS'length)-1 downto 0) := (others => '0'); + DivisorSelect : in std_logic_vector(log2ceil(DIVISORS'length)-1 downto 0) := (others => '0'); - done : out std_logic; -- Completion - res : out std_logic_vector -- Result + Result : out std_logic_vector; -- Result + Done : out std_logic -- Completion ); end entity; -architecture rtl of arith_scaler is +architecture rtl of arith_Scaler is -- Derived Constants - constant N : positive := arg'length; - constant X : positive := log2ceil(imax(imax(MULS), imax(DIVS)/2+1)); - constant R : positive := log2ceil(imax(DIVS)+1); + constant BITS : positive := Operand'length; + constant X : positive := log2ceil(imax(imax(MULTIPLIERS), imax(DIVISORS)/2+1)); + constant R : positive := log2ceil(imax(DIVISORS)+1); -- Division Properties type tDivProps is record -- Properties of the operation for a divisor - steps : T_POSVEC(DIVS'range); -- Steps to perform - align : T_POSVEC(DIVS'range); -- Left-aligned divisor + steps : positive_vector(DIVISORS'range); -- Steps to perform + align : positive_vector(DIVISORS'range); -- Left-aligned divisor end record; function computeProps return tDivProps is variable res : tDivProps; variable min_steps : positive; begin - for i in DIVS'range loop - res.steps(i) := N+X - log2ceil(DIVS(i)+1) + 1; + for i in DIVISORS'range loop + res.steps(i) := BITS+X - log2ceil(DIVISORS(i)+1) + 1; end loop; min_steps := imin(res.steps); - for i in DIVS'range loop - res.align(i) := DIVS(i) * 2**(res.steps(i) - min_steps); + for i in DIVISORS'range loop + res.align(i) := DIVISORS(i) * 2**(res.steps(i) - min_steps); end loop; return res; end computeProps; constant DIV_PROPS : tDivProps := computeProps; - constant MAX_MUL_STEPS : positive := N; + constant MAX_MUL_STEPS : positive := BITS; constant MAX_DIV_STEPS : positive := imax(DIV_PROPS.steps); constant MAX_ANY_STEPS : positive := imax(MAX_MUL_STEPS, MAX_DIV_STEPS); @@ -101,16 +101,16 @@ architecture rtl of arith_scaler is type tResMasks is array(natural range<>) of tResMask; function computeMasks return tResMasks is - variable res : tResMasks(DIVS'range); + variable res : tResMasks(DIVISORS'range); begin - for i in DIVS'range loop + for i in DIVISORS'range loop res(i) := (others => '0'); res(i)(DIV_PROPS.steps(i)-1 downto 0) := (others => '1'); end loop; return res; end computeMasks; - constant RES_MASKS : tResMasks(DIVS'range) := computeMasks; + constant RES_MASKS : tResMasks(DIVISORS'range) := computeMasks; -- Values computed for the selected multiplier/divisor pair. signal muloffset : unsigned(X-1 downto 0); -- Offset for correct rounding. @@ -125,50 +125,50 @@ begin -- Compute Parameters according to selected Multiplier/Divisor Pair. -- Selection of Multiplier - genMultiMul: if MULS'length > 1 generate - signal MS : unsigned(msel'range) := (others => '0'); + genMultiMul: if MULTIPLIERS'length > 1 generate + signal MS : unsigned(MultiplierSelect'range) := (others => '0'); begin - process(clk) + process(Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then MS <= (others => '0'); - elsif start = '1' then - MS <= unsigned(msel); + elsif Start = '1' then + MS <= unsigned(MultiplierSelect); end if; end if; end process; - multiplier <= (others => 'X') when Is_X(std_logic_vector(MS)) else to_unsigned(MULS(to_integer(MS)), multiplier'length); + multiplier <= (others => 'X') when Is_X(std_logic_vector(MS)) else to_unsigned(MULTIPLIERS(to_integer(MS)), multiplier'length); end generate genMultiMul; - genSingleMul: if MULS'length = 1 generate - multiplier <= to_unsigned(MULS(0), multiplier'length); + genSingleMul: if MULTIPLIERS'length = 1 generate + multiplier <= to_unsigned(MULTIPLIERS(0), multiplier'length); end generate genSingleMul; -- Selection of Divisor - genMultiDiv: if DIVS'length > 1 generate - signal DS : unsigned(dsel'range) := (others => '0'); + genMultiDiv: if DIVISORS'length > 1 generate + signal DS : unsigned(DivisorSelect'range) := (others => '0'); begin - process(clk) + process(Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then DS <= (others => '0'); - elsif start = '1' then - DS <= unsigned(dsel); + elsif Start = '1' then + DS <= unsigned(DivisorSelect); end if; end if; end process; - muloffset <= (others => 'X') when Is_X(dsel) else to_unsigned(DIVS(to_integer(unsigned(dsel)))/2, muloffset'length); + muloffset <= (others => 'X') when Is_X(DivisorSelect) else to_unsigned(DIVISORS(to_integer(unsigned(DivisorSelect)))/2, muloffset'length); divisor <= (others => 'X') when Is_X(std_logic_vector(DS)) else to_unsigned(DIV_PROPS.align(to_integer(DS)), divisor'length); divcini <= (others => 'X') when Is_X(std_logic_vector(DS)) else to_unsigned(DIV_PROPS.steps(to_integer(DS))-1, divcini'length); divmask <= (others => 'X') when Is_X(std_logic_vector(DS)) else RES_MASKS(to_integer(DS)); end generate genMultiDiv; - genSingleDiv: if DIVS'length = 1 generate - muloffset <= to_unsigned(DIVS(0)/2, muloffset'length); + genSingleDiv: if DIVISORS'length = 1 generate + muloffset <= to_unsigned(DIVISORS(0)/2, muloffset'length); divisor <= to_unsigned(DIV_PROPS.align(0), divisor'length); divcini <= to_unsigned(DIV_PROPS.steps(0)-1, divcini'length); divmask <= RES_MASKS(0); @@ -178,28 +178,28 @@ begin -- Implementation of Scaling Operation blkMain : block signal C : unsigned(1+log2ceil(MAX_ANY_STEPS) downto 0) := (others => '0'); - signal Q : unsigned( X+N downto 0) := (others => '0'); + signal Q : unsigned( X+BITS downto 0) := (others => '0'); begin - process(clk) + process(Clock) variable cnxt : unsigned(C'range); variable d : unsigned(R downto 0); begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then C <= (others => '0'); Q <= (others => '0'); else - if start = '1' then + if Start = '1' then C <= "11" & to_unsigned(MAX_MUL_STEPS-1, C'length-2); - Q <= '0' & muloffset & unsigned(arg); + Q <= '0' & muloffset & unsigned(Operand); elsif C(C'left) = '1' then cnxt := C - 1; if C(C'left-1) = '1' then -- MUL Phase - Q <= "00" & Q(X+N-1 downto 1); + Q <= "00" & Q(X+BITS-1 downto 1); if Q(0) = '1' then - Q(X+N-1 downto N-1) <= ('0' & Q(X+N-1 downto N)) + multiplier; + Q(X+BITS-1 downto BITS-1) <= ('0' & Q(X+BITS-1 downto BITS)) + multiplier; end if; -- Transition to DIV @@ -222,14 +222,14 @@ begin end if; end process; - done <= not C(C'left); + Done <= not C(C'left); process(Q, divmask) - variable r : std_logic_vector(res'length-1 downto 0); + variable r : std_logic_vector(Result'length-1 downto 0); begin r := (others => '0'); r(imin(r'left, tResMask'left) downto 0) := std_logic_vector(Q(imin(r'left, tResMask'left) downto 0)) and divmask(imin(r'left, tResMask'left) downto 0); - res <= r; + Result <= r; end process; end block blkMain; diff --git a/src/arith/arith_shifter_barrel.vhdl b/src/arith/arith_Shifter_Barrel.vhdl similarity index 57% rename from src/arith/arith_shifter_barrel.vhdl rename to src/arith/arith_Shifter_Barrel.vhdl index 346d998bb..8a3fa46a2 100644 --- a/src/arith/arith_shifter_barrel.vhdl +++ b/src/arith/arith_Shifter_Barrel.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Universal Barrel-Shifter +-- Entity: Universal Barrel-Shifter -- -- Description: -- ------------------------------------- @@ -16,13 +16,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -32,63 +32,63 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; -entity arith_shifter_barrel is +entity arith_Shifter_Barrel is generic ( - BITS : positive := 32 + BITS : positive := 32 ); - port ( - Input : in std_logic_vector(BITS - 1 downto 0); - ShiftAmount : in std_logic_vector(log2ceilnz(BITS) - 1 downto 0); - ShiftRotate : in std_logic; - LeftRight : in std_logic; - ArithmeticLogic : in std_logic; - Output : out std_logic_vector(BITS - 1 downto 0) + port ( + Input : in std_logic_vector(BITS - 1 downto 0); + ShiftAmount : in std_logic_vector(log2ceilnz(BITS) - 1 downto 0); + ShiftRotate : in std_logic; + LeftRight : in std_logic; + ArithmeticLogic : in std_logic; + Output : out std_logic_vector(BITS - 1 downto 0) ); end entity; -architecture rtl of arith_shifter_barrel is - constant STAGES : positive := log2ceilnz(BITS); +architecture rtl of arith_Shifter_Barrel is + constant STAGES : positive := log2ceilnz(BITS); - subtype T_INTERMEDIATE_RESULT is std_logic_vector(BITS - 1 downto 0); - type T_INTERMEDIATE_VECTOR is array (natural range <>) of T_INTERMEDIATE_RESULT; + subtype T_INTERMEDIATE_RESULT is std_logic_vector(BITS - 1 downto 0); + type T_INTERMEDIATE_VECTOR is array (natural range <>) of T_INTERMEDIATE_RESULT; -- FIXME: T_SLVV - signal IntermediateResults : T_INTERMEDIATE_VECTOR(STAGES downto 0); + signal IntermediateResults : T_INTERMEDIATE_VECTOR(STAGES downto 0); begin - IntermediateResults(0) <= Input; - Output <= IntermediateResults(STAGES); + IntermediateResults(0) <= Input; + Output <= IntermediateResults(STAGES); genStage : for i in 0 to STAGES - 1 generate process(IntermediateResults(i), ShiftRotate, LeftRight, ArithmeticLogic, ShiftAmount) begin if (ShiftAmount(i) = '0') then - IntermediateResults(i + 1) <= IntermediateResults(i); -- NOP + IntermediateResults(i + 1) <= IntermediateResults(i); -- NOP else if (ShiftRotate = '0') then if (LeftRight = '0') then - IntermediateResults(i + 1) <= IntermediateResults(i)((BITS - 2**i - 1) downto 0) & ((2**i - 1) downto 0 => '0'); -- SLA, SLL + IntermediateResults(i + 1) <= IntermediateResults(i)((BITS - 2**i - 1) downto 0) & ((2**i - 1) downto 0 => '0'); -- SLA, SLL else if (ArithmeticLogic = '0') then - IntermediateResults(i + 1) <= ((2**i - 1) downto 0 => IntermediateResults(i)(BITS - 1)) & IntermediateResults(i)(BITS - 1 downto 2**i); -- SRA + IntermediateResults(i + 1) <= ((2**i - 1) downto 0 => IntermediateResults(i)(BITS - 1)) & IntermediateResults(i)(BITS - 1 downto 2**i); -- SRA else - IntermediateResults(i + 1) <= ((2**i - 1) downto 0 => '0') & IntermediateResults(i)(BITS - 1 downto 2**i); -- SRL + IntermediateResults(i + 1) <= ((2**i - 1) downto 0 => '0') & IntermediateResults(i)(BITS - 1 downto 2**i); -- SRL end if; end if; else if (LeftRight = '0') then - IntermediateResults(i + 1) <= IntermediateResults(i)((BITS - 2**i - 1) downto 0) & IntermediateResults(i)(BITS - 1 downto (BITS - 2**i)); -- RL + IntermediateResults(i + 1) <= IntermediateResults(i)((BITS - 2**i - 1) downto 0) & IntermediateResults(i)(BITS - 1 downto (BITS - 2**i)); -- RL else - IntermediateResults(i + 1) <= IntermediateResults(i)((2**i - 1) downto 0) & IntermediateResults(i)(BITS - 1 downto 2**i); -- RR + IntermediateResults(i + 1) <= IntermediateResults(i)((2**i - 1) downto 0) & IntermediateResults(i)(BITS - 1 downto 2**i); -- RR end if; end if; end if; end process; end generate; -end; +end architecture; diff --git a/src/arith/arith_sqrt.vhdl b/src/arith/arith_SquareRoot.vhdl similarity index 56% rename from src/arith/arith_sqrt.vhdl rename to src/arith/arith_SquareRoot.vhdl index f7045c815..30a86c577 100644 --- a/src/arith/arith_sqrt.vhdl +++ b/src/arith/arith_SquareRoot.vhdl @@ -1,10 +1,7 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; -- ============================================================================= --- Authors: Thomas B. Preußer +-- Authors: Thomas B. Preußer -- --- Entity: Iterative Square Root Extractor. +-- Entity: Iterative Square Root Extractor. -- -- Description: -- ------------------------------------- @@ -15,13 +12,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2014 Technische Universität Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -35,46 +32,46 @@ use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; -entity arith_sqrt is +entity arith_SquareRoot is generic ( - N : positive -- := 8 -- Bit Width of Argument + BITS : positive -- := 8 -- Bit Width of Argument ); port ( -- Global Control - rst : in std_logic; -- Reset (synchronous) - clk : in std_logic; -- Clock + Reset : in std_logic; -- Reset (synchronous) + Clock : in std_logic; -- Clock -- Inputs - arg : in std_logic_vector(N-1 downto 0); -- Radicand - start : in std_logic; -- Start Strobe + Operand : in std_logic_vector(BITS-1 downto 0); -- Radicand + Start : in std_logic; -- Start Strobe -- Outputs - sqrt : out std_logic_vector((N-1)/2 downto 0); -- Result - rdy : out std_logic -- Ready / Done + Result : out std_logic_vector((BITS-1)/2 downto 0); -- Result + Ready : out std_logic -- Ready / Done ); -end entity arith_sqrt; +end entity arith_SquareRoot; -architecture rtl of arith_sqrt is +architecture rtl of arith_SquareRoot is -- Number of Iteration Steps = Number of Result Digits - constant STEPS : positive := (N+1)/2; + constant STEPS : positive := (BITS+1)/2; -- Intern Registers - signal Rmd : unsigned(N+STEPS-1 downto 0); -- Remainder / Result - signal Vld : unsigned(STEPS-1 downto 0); -- Result Flags - signal Res : unsigned(STEPS-1 downto 0); -- Extracted Result + signal Rmd : unsigned(BITS+STEPS-1 downto 0); -- Remainder / Result + signal Vld : unsigned(STEPS-1 downto 0); -- Result Flags + signal Res : unsigned(STEPS-1 downto 0); -- Extracted Result -- Tentative Difference signal diff : unsigned(STEPS+1 downto 0); -begin -- rtl +begin -- rtl -- Registers - process(clk) + process(Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then -- Only clear Ready, everything else: '-' Rmd <= (others => '-'); @@ -83,10 +80,10 @@ begin -- rtl else - if start = '1' then + if Start = '1' then -- Initilize Computation - Rmd <= (Rmd'left downto N => '0') & unsigned(arg); + Rmd <= (Rmd'left downto BITS => '0') & unsigned(Operand); Vld <= (others => '1'); elsif Vld(Vld'left) = '1' then @@ -94,13 +91,13 @@ begin -- rtl -- Computation Step -- New Residue - Rmd(N-1 downto 0) <= Rmd(N-3 downto 0) & '-' & not diff(diff'left); -- just shift lower bits + Rmd(BITS-1 downto 0) <= Rmd(BITS-3 downto 0) & '-' & not diff(diff'left); -- just shift lower bits if diff(diff'left) = '1' then -- Sub failed: just shift upper Part - Rmd(Rmd'left downto N) <= Rmd(Rmd'left-2 downto N-2); + Rmd(Rmd'left downto BITS) <= Rmd(Rmd'left-2 downto BITS-2); else -- Sub succeeded: replace by shifted Difference - Rmd(Rmd'left downto N) <= diff(diff'left-2 downto 0); + Rmd(Rmd'left downto BITS) <= diff(diff'left-2 downto 0); end if; -- Validate Result Digit @@ -118,10 +115,10 @@ begin -- rtl end generate; -- Tentative Subtraction: 4*rmd - (4*res+1) - diff <= Rmd(Rmd'left downto N-2) + ('1' & not Res(STEPS-2 downto 0) & "11"); + diff <= Rmd(Rmd'left downto BITS-2) + ('1' & not Res(STEPS-2 downto 0) & "11"); -- Ouputs - sqrt <= std_logic_vector(Res); - rdy <= not Vld(Vld'left); + Result <= std_logic_vector(Res); + Ready <= not Vld(Vld'left); -end rtl; +end architecture; diff --git a/src/arith/arith_trng.vhdl b/src/arith/arith_TRNG.vhdl similarity index 68% rename from src/arith/arith_trng.vhdl rename to src/arith/arith_TRNG.vhdl index 7e38338ef..88d3eb987 100644 --- a/src/arith/arith_trng.vhdl +++ b/src/arith/arith_TRNG.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Thomas B. Preusser +-- Authors: Thomas B. Preusser -- --- Entity: TRNG - True Random Number Generator. +-- Entity: TRNG - True Random Number Generator. -- -- Description: -- ------------ @@ -24,13 +24,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2017 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -44,35 +44,35 @@ use IEEE.std_logic_1164.all; use work.utils.all; -entity arith_trng is - generic ( - BITS : positive -- Width: Number of Oscillators +entity arith_TRNG is + generic ( + BITS : positive -- Width: Number of Oscillators ); - port ( - clk : in std_logic; -- Clock - rnd : out std_logic_vector(BITS-1 downto 0) -- Random Oscillator Samples + port ( + Clock : in std_logic; -- Clock + Value : out std_logic_vector(BITS-1 downto 0) -- Random Oscillator Samples ); end entity; -architecture rtl of arith_trng is - signal osc : std_logic_vector(BITS-1 downto 0) := (others => '-'); -- Oscillators - attribute KEEP : boolean; - attribute KEEP of osc : signal is true; +architecture rtl of arith_TRNG is + signal osc : std_logic_vector(BITS-1 downto 0) := (others => '-'); -- Oscillators + attribute KEEP : boolean; + attribute KEEP of osc : signal is true; begin - -- Oscillator Leaves - genOscillate : for i in 0 to BITS-1 generate - osc(i) <= ite(i<3, '1', '0') xor osc((i-1)mod BITS) xor osc(i) xor osc((i+1)mod BITS); - end generate; + -- Oscillator Leaves + genOscillate : for i in 0 to BITS-1 generate + osc(i) <= ite(i<3, '1', '0') xor osc((i-1)mod BITS) xor osc(i) xor osc((i+1)mod BITS); + end generate; - sync_i : entity work.sync_Bits + sync : entity work.sync_Bits generic map ( BITS => BITS ) port map ( - Clock => clk, + Clock => Clock, Input => osc, - Output => rnd + Output => Value ); -end rtl; +end architecture; diff --git a/src/arith/arith_addw.vhdl b/src/arith/arith_addw.vhdl deleted file mode 100644 index f134dc769..000000000 --- a/src/arith/arith_addw.vhdl +++ /dev/null @@ -1,345 +0,0 @@ --- ============================================================================= --- Authors: Thomas B. Preusser --- --- Entity: arith_addw --- --- Description: --- ------------------------------------- --- Implements wide addition providing several options all based --- on an adaptation of a carry-select approach. --- --- References: --- --- * Hong Diep Nguyen and Bogdan Pasca and Thomas B. Preusser: --- FPGA-Specific Arithmetic Optimizations of Short-Latency Adders, --- FPL 2011. --- -> ARCH: AAM, CAI, CCA --- -> SKIPPING: CCC --- --- * Marcin Rogawski, Kris Gaj and Ekawat Homsirikamol: --- A Novel Modular Adder for One Thousand Bits and More --- Using Fast Carry Chains of Modern FPGAs, FPL 2014. --- -> ARCH: PAI --- -> SKIPPING: PPN_KS, PPN_BK --- --- License: --- ============================================================================= --- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -use std.textio.all; - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -use work.utils.all; -use work.arith.all; - - -entity arith_addw is - generic ( - N : positive; -- Operand Width - K : positive; -- Block Count - - ARCH : tArch := AAM; -- Architecture - BLOCKING : tBlocking := DFLT; -- Blocking Scheme - SKIPPING : tSkipping := CCC; -- Carry Skip Scheme - P_INCLUSIVE : boolean := false -- Use Inclusive Propagate, i.e. c^1 - ); - port ( - a, b : in std_logic_vector(N-1 downto 0); - cin : in std_logic; - - s : out std_logic_vector(N-1 downto 0); - cout : out std_logic - ); -end entity; - -architecture rtl of arith_addw is - - -- Determine Block Boundaries - type tBlocking_vector is array(tArch) of tBlocking; - constant DEFAULT_BLOCKING : tBlocking_vector := (AAM => ASC, CAI => DESC, PAI => DESC, CCA => DESC); - - type integer_vector is array(natural range<>) of integer; - impure function compute_blocks return integer_vector is - variable bs : tBlocking := BLOCKING; - variable res : integer_vector(K-1 downto 0); - - variable l : line; - begin - if bs = DFLT then - bs := DEFAULT_BLOCKING(ARCH); - end if; - case bs is - when FIX => - assert N >= K - report "Cannot have more blocks than input bits." - severity failure; - for i in res'range loop - res(i) := ((i+1)*N+K/2)/K; - end loop; - - when ASC => - assert N-K*(K-1)/2 >= K - report "Too few input bits to implement growing block sizes." - severity failure; - for i in res'range loop - res(i) := ((i+1)*(N-K*(K-1)/2)+K/2)/K + (i+1)*i/2; - end loop; - - when DESC => - assert N-K*(K-1)/2 >= K - report "Too few input bits to implement growing block sizes." - severity failure; - for i in res'range loop - res(i) := ((i+1)*(N+K*(K-1)/2)+K/2)/K - (i+1)*i/2; - end loop; - - when others => - report "Unknown blocking scheme: "&tBlocking'image(bs) severity failure; - - end case; - --synthesis translate_off - write(l, "Implementing "&integer'image(N)&"-bit wide adder: ARCH="&tArch'image(ARCH)& - ", BLOCKING="&tBlocking'image(bs)&'['); - for i in K-1 downto 1 loop - write(l, res(i)-res(i-1)); - write(l, ','); - end loop; - write(l, res(0)); - write(l, "], SKIPPING="&tSkipping'image(SKIPPING)); - writeline(output, l); - --synthesis translate_on - return res; - end compute_blocks; - constant BLOCKS : integer_vector(K-1 downto 0) := compute_blocks; - - signal g : std_logic_vector(K-1 downto 1); -- Block Generate - signal p : std_logic_vector(K-1 downto 1); -- Block Propagate - signal c : std_logic_vector(K-1 downto 1); -- Block Carry-in -begin - - ----------------------------------------------------------------------------- - -- Rightmost Block + Carry Computation Core - blkCore: block - constant M : positive := BLOCKS(0); -- Rightmost Block Width - begin - - -- Carry Computation with Carry Chain - genCCC: if SKIPPING = CCC generate - signal x, y : unsigned(K+M-2 downto 0); - signal z : unsigned(K+M-1 downto 0); - begin - x <= unsigned(g & a(M-1 downto 0)); - genExcl: if not P_INCLUSIVE generate - y <= unsigned((g or p) & b(M-1 downto 0)); - -- carry recovery for other blocks - c <= std_logic_vector(z(K+M-2 downto M)) xor p; - end generate genExcl; - genIncl: if P_INCLUSIVE generate - y <= unsigned(p & b(M-1 downto 0)); - -- carry recovery for other blocks - c <= std_logic_vector(z(K+M-2 downto M)) xor (p xor g); - end generate genIncl; - z <= ('0' & x) + y + (0 to 0 => cin); - - -- output of rightmost block - s(M-1 downto 0) <= std_logic_vector(z(M-1 downto 0)); - - -- carry output - cout <= z(z'left); - end generate genCCC; - - -- LUT-based Carry Computations - genLUT: if SKIPPING /= CCC generate - signal z : unsigned(M downto 0); - begin - -- rightmost block - z <= unsigned('0' & a(M-1 downto 0)) + unsigned(b(M-1 downto 0)) + (0 to 0 => cin); - s(M-1 downto 0) <= std_logic_vector(z(M-1 downto 0)); - - -- Plain linear LUT-based Carry Forwarding - genPlain: if SKIPPING = PLAIN generate - signal t : std_logic_vector(K downto 1); - begin - -- carry forwarding - t(1) <= z(M); - t(K downto 2) <= g or (p and c); - c <= t(K-1 downto 1); - cout <= t(K); - end generate genPlain; - - -- Kogge-Stone Parallel Prefix Network - genPPN_KS: if SKIPPING = PPN_KS generate - subtype tLevel is std_logic_vector(K-1 downto 0); - type tLevels is array(natural range<>) of tLevel; - constant LEVELS : positive := log2ceil(K); - signal pp, gg : tLevels(0 to LEVELS); - begin - -- carry forwarding - pp(0) <= p & 'X'; - gg(0) <= g & z(M); - genLevels: for i in 1 to LEVELS generate - constant D : positive := 2**(i-1); - begin - pp(i) <= (pp(i-1)(K-1 downto D) and pp(i-1)(K-D-1 downto 0)) & pp(i-1)(D-1 downto 0); - gg(i) <= (gg(i-1)(K-1 downto D) or (pp(i-1)(K-1 downto D) and gg(i-1)(K-D-1 downto 0))) & gg(i-1)(D-1 downto 0); - end generate genLevels; - c <= gg(LEVELS)(K-2 downto 0); - cout <= gg(LEVELS)(K-1); - end generate genPPN_KS; - - -- Brent-Kung Parallel Prefix Network - genPPN_BK: if SKIPPING = PPN_BK generate - subtype tLevel is std_logic_vector(K-1 downto 0); - type tLevels is array(natural range<>) of tLevel; - constant LEVELS : positive := log2ceil(K); - signal pp, gg : tLevels(0 to 2*LEVELS-1); - begin - -- carry forwarding - pp(0) <= p & 'X'; - gg(0) <= g & z(M); - genMerge: for i in 1 to LEVELS generate - constant D : positive := 2**(i-1); - begin - genBits: for j in 0 to K-1 generate - genOp: if j mod (2*D) = 2*D-1 generate - gg(i)(j) <= (pp(i-1)(j) and gg(i-1)(j-D)) or gg(i-1)(j); - pp(i)(j) <= pp(i-1)(j) and pp(i-1)(j-D); - end generate; - genCp: if j mod (2*D) /= 2*D-1 generate - gg(i)(j) <= gg(i-1)(j); - pp(i)(j) <= pp(i-1)(j); - end generate; - end generate; - end generate genMerge; - genSpread: for i in LEVELS+1 to 2*LEVELS-1 generate - constant D : positive := 2**(2*LEVELS-i-1); - begin - genBits: for j in 0 to K-1 generate - genOp: if j > D and (j+1) mod (2*D) = D generate - gg(i)(j) <= (pp(i-1)(j) and gg(i-1)(j-D)) or gg(i-1)(j); - pp(i)(j) <= pp(i-1)(j) and pp(i-1)(j-D); - end generate; - genCp: if j <= D or (j+1) mod (2*D) /= D generate - gg(i)(j) <= gg(i-1)(j); - pp(i)(j) <= pp(i-1)(j); - end generate; - end generate; - end generate genSpread; - c <= gg(gg'high)(K-2 downto 0); - cout <= gg(gg'high)(K-1); - end generate genPPN_BK; - - end generate genLUT; - - end block blkCore; - - ----------------------------------------------------------------------------- - -- Implement Carry-Select Variant - -- - -- all but rightmost block, implementation architecture selected by ARCH - genBlocks: for i in 1 to K-1 generate - -- Covered Index Range - constant LO : positive := BLOCKS(i-1); -- Low Bit Index - constant HI : positive := BLOCKS(i)-1; -- High Bit Index - - -- Internal Block Interface - signal aa : unsigned(HI downto LO); - signal bb : unsigned(HI downto LO); - signal ss : unsigned(HI downto LO); - begin - - -- Connect common block interface - aa <= unsigned(a(HI downto LO)); - bb <= unsigned(b(HI downto LO)); - s(HI downto LO) <= std_logic_vector(ss); - - -- ARCH-specific Implementations - - --Add-Add-Multiplex - genAAM: if ARCH = AAM generate - signal s0 : unsigned(HI+1 downto LO); -- Block Sum (cin=0) - signal s1 : unsigned(HI+1 downto LO); -- Block Sum (cin=1) - begin - s0 <= ('0' & aa) + bb; - s1 <= ('0' & aa) + bb + 1; - g(i) <= s0(HI+1); - genExcl: if not P_INCLUSIVE generate - p(i) <= s1(HI+1) xor s0(HI+1); - end generate genExcl; - genIncl: if P_INCLUSIVE generate - p(i) <= s1(HI+1); - end generate genIncl; - - ss <= s0(HI downto LO) when c(i) = '0' else s1(HI downto LO); - end generate genAAM; - - -- Compare-Add-Increment - genCAI: if ARCH = CAI generate - signal s0 : unsigned(HI+1 downto LO); -- Block Sum (cin=0) - begin - s0 <= ('0' & aa) + bb; - g(i) <= s0(HI+1); - genExcl: if not P_INCLUSIVE generate - p(i) <= 'X' when Is_X(std_logic_vector(aa&bb)) else - '1' when (aa xor bb) = (aa'range => '1') else '0'; - end generate genExcl; - genIncl: if P_INCLUSIVE generate - p(i) <= 'X' when Is_X(std_logic_vector(aa&bb)) else - '1' when aa >= not bb else '0'; - end generate genIncl; - ss <= s0(HI downto LO) when c(i) = '0' else s0(HI downto LO)+1; - end generate genCAI; - - -- Propagate-Add-Increment - genPAI: if ARCH = PAI generate - signal s0 : unsigned(HI+1 downto LO); -- Block Sum (cin=0) - begin - s0 <= ('0' & aa) + bb; - g(i) <= s0(HI+1); - genExcl: if not P_INCLUSIVE generate - p(i) <= 'X' when Is_X(std_logic_vector(s0)) else - '1' when s0(HI downto LO) = (HI downto LO => '1') else '0'; - end generate genExcl; - genIncl: if P_INCLUSIVE generate - p(i) <= 'X' when Is_X(std_logic_vector(s0)) else - '1' when s0(HI downto LO) = (HI downto LO => '1') else g(i); - end generate genIncl; - ss <= s0(HI downto LO) when c(i) = '0' else s0(HI downto LO)+1; - end generate genPAI; - - -- Compare-Compare-Add - genCCA: if ARCH = CCA generate - g(i) <= 'X' when Is_X(std_logic_vector(aa&bb)) else - '1' when aa > not bb else '0'; - genExcl: if not P_INCLUSIVE generate - p(i) <= 'X' when Is_X(std_logic_vector(aa&bb)) else - '1' when (aa xor bb) = (aa'range => '1') else '0'; - end generate genExcl; - genIncl: if P_INCLUSIVE generate - p(i) <= 'X' when Is_X(std_logic_vector(aa&bb)) else - '1' when aa >= not bb else '0'; - end generate genIncl; - ss <= aa + bb + (0 to 0 => c(i)); - end generate genCCA; - - end generate genBlocks; - -end architecture; diff --git a/src/arith/arith_cca.vhdl b/src/arith/arith_cca.vhdl index 92ed35a52..cc7c3f86b 100644 --- a/src/arith/arith_cca.vhdl +++ b/src/arith/arith_cca.vhdl @@ -1,8 +1,3 @@ --- =================================================================================== --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Description: Carry-Compact Adder for Xilinx Virtex-5 architectures and newer. -- @@ -44,147 +39,147 @@ -- =================================================================================== library IEEE; -use IEEE.std_logic_1164.all; +use IEEE.std_logic_1164.all; entity arith_cca is - generic( - N : positive; -- bit width - L : natural; -- CC length equivalent per LUT stage - X : natural := 0 -- max expansion depth; default: zero (0) - unlimited - ); - port( - a : in std_logic_vector(N-1 downto 0); - b : in std_logic_vector(N-1 downto 0); - c : in std_logic := '0'; - s : out std_logic_vector(N-1 downto 0) - ); -end arith_cca; + generic( + BITS : positive; -- bit width + L : natural; -- CC length equivalent per LUT stage + X : natural := 0 -- max expansion depth; default: zero (0) - unlimited + ); + port( + a : in std_logic_vector(BITS-1 downto 0); + b : in std_logic_vector(BITS-1 downto 0); + c : in std_logic := '0'; + s : out std_logic_vector(BITS-1 downto 0) + ); +end entity; library IEEE; -use IEEE.numeric_std.all; +use IEEE.numeric_std.all; architecture rtl of arith_cca is - type tLevel is record - base : natural; - core : integer; - done : natural; - end record tLevel; - type tLevels is array(natural range<>) of tLevel; - - function compact return tLevels is - variable res : tLevels(0 to 31); - variable base, core, done : integer; - begin - base := 0; - core := (N-L)/2; - done := N-2*core; - for i in res'range loop - res(i) := (base, core, done); - if core <= 0 then - for j in 0 to i loop - report integer'image(j)&": ("&integer'image(res(j).base)&", "&integer'image(res(j).core)&", "&integer'image(res(j).done)&")" severity note; - end loop; - return res(0 to i); - end if; - base := base + 2*core; - done := done + (core-2*(core/2)+L); - core := core/2 - L; - if i+1 = X and core > 0 then - done := done + 2*core; - core := 0; - end if; - end loop; - end function compact; - constant LEVELS : tLevels := compact; - constant CCA : boolean := LEVELS'length > 1; + type tLevel is record + base : natural; + core : integer; + done : natural; + end record tLevel; + type tLevels is array(natural range<>) of tLevel; + + function compact return tLevels is + variable res : tLevels(0 to 31); + variable base, core, done : integer; + begin + base := 0; + core := (BITS-L)/2; + done := BITS-2*core; + for i in res'range loop + res(i) := (base, core, done); + if core <= 0 then + for j in 0 to i loop + report integer'image(j)&": ("&integer'image(res(j).base)&", "&integer'image(res(j).core)&", "&integer'image(res(j).done)&")" severity note; + end loop; + return res(0 to i); + end if; + base := base + 2*core; + done := done + (core-2*(core/2)+L); + core := core/2 - L; + if i+1 = X and core > 0 then + done := done + 2*core; + core := 0; + end if; + end loop; + end function compact; + constant LEVELS : tLevels := compact; + constant CCA : boolean := LEVELS'length > 1; begin - genRCA: if not CCA generate - assert false - report "Using standard RCA for small "&integer'image(N)&"-bit adder." - severity note; - s <= std_logic_vector(unsigned(a)+unsigned(b)+(0 to 0 => c)); - end generate; - - genCCA: if CCA generate - constant WI : positive := LEVELS(LEVELS'high).base; - constant WC : positive := LEVELS(LEVELS'high).done + LEVELS'high*L + 2*LEVELS(LEVELS'high).core; - - signal ai, bi, si : std_logic_vector(WI-1 downto 0); - signal ac, bc, sc : unsigned(WC-1 downto 0); - begin - - -- Feed operands into compaction tree except for a prefix of L bits - -- to hide expansion delay of lower-order bits - blkFeed: block is - constant DONE : natural := LEVELS(0).done; - begin - -- alias most-significant prefix of ports and compacted operation - genPre: if DONE > 0 generate - ac(WC-1 downto WC-DONE) <= unsigned(a(N-1 downto N-DONE)); - bc(WC-1 downto WC-DONE) <= unsigned(b(N-1 downto N-DONE)); - s(N-1 downto N-DONE) <= std_logic_vector(sc(WC-1 downto WC-DONE)); - end generate genPre; - - -- copy compaction region - ai(N-DONE-1 downto 0) <= a(N-DONE-1 downto 0); - bi(N-DONE-1 downto 0) <= b(N-DONE-1 downto 0); - s(N-DONE-1 downto 0) <= si(N-DONE-1 downto 0); - end block blkFeed; - - -- Build the compaction tree - genCompact: for i in 1 to LEVELS'high generate - constant PAIRS : positive := LEVELS(i-1).core; - - constant BASE : natural := LEVELS(i).base; - constant CORE : integer := LEVELS(i).core; - constant DONE : natural := LEVELS(i).done; - - begin - genPairs: for j in 0 to PAIRS-1 generate - signal b1, b0, a1, a0 : std_logic; - signal ss : std_logic; - begin - -- Compaction ------ - - -- Simplify Names - b1 <= bi(BASE-2*(PAIRS-j)+1); - b0 <= bi(BASE-2*(PAIRS-j)+0); - a1 <= ai(BASE-2*(PAIRS-j)+1); - a0 <= ai(BASE-2*(PAIRS-j)+0); - - genLast: if CORE <= 0 or j < L or L+2*CORE <= j generate - signal aa, bb : std_logic; - begin - aa <= (b1 and a1) or (b1 and a0) or (a1 and a0); - bb <= (b1 and a1) or (b1 and b0) or (a1 and b0); - - genSuf: if CORE <= 0 or j < L generate - ac((i-1)*L+j) <= aa; - bc((i-1)*L+j) <= bb; - ss <= sc((i-1)*L+j); - end generate genSuf; - genPre: if CORE > 0 and L+2*CORE <= j generate - ac(j-L-2*CORE+(WC-DONE)) <= aa; - bc(j-L-2*CORE+(WC-DONE)) <= bb; - ss <= sc(j-L-2*CORE+(WC-DONE)); - end generate genPre; - end generate genLast; - - genCore: if CORE > 0 and L <= j and j < L+2*CORE generate - ss <= si(BASE-L+j); - ai(BASE-L+j) <= (b1 and a1) or ((b1 xor a1) and a0); - bi(BASE-L+j) <= (b1 and a1) or ((b1 xor a1) and b0); - end generate genCore; - - -- Expansion ------ - si(BASE-2*(PAIRS-j)+0) <= (b0 xor a0) xor (ss xor ((b1 xor a1) and (b0 xor a0))); - si(BASE-2*(PAIRS-j)+1) <= (b1 xor a1) xor ((b0 and a0) or ((b0 xor a0) and (ss xor ((b1 xor a1) and (b0 xor a0))))); - end generate genPairs; - end generate genCompact; - sc <= ac + bc + (0 to 0 => c); - end generate genCCA; - -end rtl; + genRCA: if not CCA generate + assert false + report "Using standard RCA for small "&integer'image(BITS)&"-bit adder." + severity note; + s <= std_logic_vector(unsigned(a)+unsigned(b)+(0 to 0 => c)); + end generate; + + genCCA: if CCA generate + constant WI : positive := LEVELS(LEVELS'high).base; + constant WC : positive := LEVELS(LEVELS'high).done + LEVELS'high*L + 2*LEVELS(LEVELS'high).core; + + signal ai, bi, si : std_logic_vector(WI-1 downto 0); + signal ac, bc, sc : unsigned(WC-1 downto 0); + begin + + -- Feed operands into compaction tree except for a prefix of L bits + -- to hide expansion delay of lower-order bits + blkFeed: block is + constant DONE : natural := LEVELS(0).done; + begin + -- alias most-significant prefix of ports and compacted operation + genPre: if DONE > 0 generate + ac(WC-1 downto WC-DONE) <= unsigned(a(BITS-1 downto BITS-DONE)); + bc(WC-1 downto WC-DONE) <= unsigned(b(BITS-1 downto BITS-DONE)); + s(BITS-1 downto BITS-DONE) <= std_logic_vector(sc(WC-1 downto WC-DONE)); + end generate genPre; + + -- copy compaction region + ai(BITS-DONE-1 downto 0) <= a(BITS-DONE-1 downto 0); + bi(BITS-DONE-1 downto 0) <= b(BITS-DONE-1 downto 0); + s(BITS-DONE-1 downto 0) <= si(BITS-DONE-1 downto 0); + end block blkFeed; + + -- Build the compaction tree + genCompact: for i in 1 to LEVELS'high generate + constant PAIRS : positive := LEVELS(i-1).core; + + constant BASE : natural := LEVELS(i).base; + constant CORE : integer := LEVELS(i).core; + constant DONE : natural := LEVELS(i).done; + + begin + genPairs: for j in 0 to PAIRS-1 generate + signal b1, b0, a1, a0 : std_logic; + signal ss : std_logic; + begin + -- Compaction ------ + + -- Simplify Names + b1 <= bi(BASE-2*(PAIRS-j)+1); + b0 <= bi(BASE-2*(PAIRS-j)+0); + a1 <= ai(BASE-2*(PAIRS-j)+1); + a0 <= ai(BASE-2*(PAIRS-j)+0); + + genLast: if CORE <= 0 or j < L or L+2*CORE <= j generate + signal aa, bb : std_logic; + begin + aa <= (b1 and a1) or (b1 and a0) or (a1 and a0); + bb <= (b1 and a1) or (b1 and b0) or (a1 and b0); + + genSuf: if CORE <= 0 or j < L generate + ac((i-1)*L+j) <= aa; + bc((i-1)*L+j) <= bb; + ss <= sc((i-1)*L+j); + end generate genSuf; + genPre: if CORE > 0 and L+2*CORE <= j generate + ac(j-L-2*CORE+(WC-DONE)) <= aa; + bc(j-L-2*CORE+(WC-DONE)) <= bb; + ss <= sc(j-L-2*CORE+(WC-DONE)); + end generate genPre; + end generate genLast; + + genCore: if CORE > 0 and L <= j and j < L+2*CORE generate + ss <= si(BASE-L+j); + ai(BASE-L+j) <= (b1 and a1) or ((b1 xor a1) and a0); + bi(BASE-L+j) <= (b1 and a1) or ((b1 xor a1) and b0); + end generate genCore; + + -- Expansion ------ + si(BASE-2*(PAIRS-j)+0) <= (b0 xor a0) xor (ss xor ((b1 xor a1) and (b0 xor a0))); + si(BASE-2*(PAIRS-j)+1) <= (b1 xor a1) xor ((b0 and a0) or ((b0 xor a0) and (ss xor ((b1 xor a1) and (b0 xor a0))))); + end generate genPairs; + end generate genCompact; + sc <= ac + bc + (0 to 0 => c); + end generate genCCA; + +end architecture; diff --git a/src/arith/arith_counter_ring.vhdl b/src/arith/arith_counter_ring.vhdl deleted file mode 100644 index 4a3fdc597..000000000 --- a/src/arith/arith_counter_ring.vhdl +++ /dev/null @@ -1,73 +0,0 @@ --- ============================================================================= --- Authors: Patrick Lehmann --- --- Entity: Ring counter/Johnson Counter --- --- Description: --- ------------------------------------- --- This module implements an up/down ring-counter with loadable initial value --- (``seed``) on reset. The counter can be configured to a Johnson counter by --- enabling ``INVERT_FEEDBACK``. The number of counter bits is configurable with --- ``BITS``. --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.STD_LOGIC_1164.all; - -use work.utils.all; - - -entity arith_counter_ring is - generic ( - BITS : positive; - INVERT_FEEDBACK : boolean := FALSE -- FALSE -> ring counter; TRUE -> johnson counter - ); - port ( - Clock : in std_logic; -- Clock - Reset : in std_logic; -- Reset - seed : in std_logic_vector(BITS - 1 downto 0) := (others => '0'); -- initial counter vector / load value - inc : in std_logic := '0'; -- increment counter - dec : in std_logic := '0'; -- decrement counter - value : out std_logic_vector(BITS - 1 downto 0) -- counter value - ); -end entity; - - -architecture rtl of arith_counter_ring is - constant invert : std_logic := to_sl(INVERT_FEEDBACK); - - signal Counter : std_logic_vector(BITS - 1 downto 0) := (others => '0'); - -begin - process(Clock) - begin - if rising_edge(Clock) then - if (Reset = '1') then - Counter <= seed; - elsif (inc = '1') then - Counter <= Counter(Counter'high - 1 downto 0) & (Counter(Counter'high) xor invert); - elsif (dec = '1') then - Counter <= (Counter(0) xor invert) & Counter(Counter'high downto 1); - end if; - end if; - end process; - - value <= Counter; -end architecture; diff --git a/src/arith/arith_div.vhdl b/src/arith/arith_div.vhdl deleted file mode 100644 index 0c61f9612..000000000 --- a/src/arith/arith_div.vhdl +++ /dev/null @@ -1,231 +0,0 @@ --- ============================================================================= --- Authors: Thomas B. Preusser --- --- Entity: Multi-cycle Non-Performing Restoring Divider --- --- Description: --- ------------------------------------- --- Implementation of a Non-Performing restoring divider with a configurable radix. --- The multi-cycle division is controlled by 'start' / 'rdy'. A new division is --- started by asserting 'start'. The result Q = A/D is available when 'rdy' --- returns to '1'. A division by zero is identified by output Z. The Q and R --- outputs are undefined in this case. --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universität Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; - -entity arith_div is - generic ( - A_BITS : positive; -- Dividend Width - D_BITS : positive; -- Divisor Width - RAPOW : positive := 1; -- Power of Compute Radix (2**RAPOW) - PIPELINED : boolean := false -- Computation Pipeline - ); - port ( - -- Global Reset/Clock - clk : in std_logic; - rst : in std_logic; - - -- Ready / Start - start : in std_logic; - ready : out std_logic; - - -- Arguments / Result (2's complement) - A : in std_logic_vector(A_BITS-1 downto 0); -- Dividend - D : in std_logic_vector(D_BITS-1 downto 0); -- Divisor - Q : out std_logic_vector(A_BITS-1 downto 0); -- Quotient - R : out std_logic_vector(D_BITS-1 downto 0); -- Remainder - Z : out std_logic -- Division by Zero - ); -end entity arith_div; - - -library IEEE; -use IEEE.numeric_std.all; - -use work.utils.all; - -------------------------------------------------------------------------------- --- This divider is an implementation by an iterative digit recurrence. --- --- The basic approach is radix 2 (RAPOW=1). A higher radix power may be --- specified so as to unroll the corresponding number of elementary radix-2 --- steps into one clock cycle. This cuts the computational latency accordingly. --- However, the amount of combinational logic does increase and the critical --- path will eventually be affected. --- --- A PIPELINED instantiation unrolls all necessary iteration steps in space --- so that every stage uses its own set of registers. The pipeline can accept a --- new pair of inputs in every clock cycle. --- --- Internally, the divider uses two state registers: --- - DR - the divisor, which remains constant throughout one operation, and --- - AR holding the actual computation state, which is iteratively tranformed --- from the initial dividend to the quotient. --- The active computation is performed on the left end of AR, which represents --- the relevant prefix of the current residue to be tested against the divisor. --- The remaining residue is shifted step-by-step into this region. The freed --- space on the right is immediately re-used for the generated quotient digits. --- --- The layout transformation of AR (either over time or in space) is as follows: --- --- |<- D_BITS+RAPOW ->|<- (Digits of A) - 1 ->| --- |<- A_BITS ->| --- --- | 00 ... 00 | A | --- --- \-------v-------/ --- P-D ? --- / \______________________________ --- | \ --- v v --- --- | P' | << A << | Q| --- --- --- | R | Q | --- -architecture rtl of arith_div is - - -- Constants - constant STEPS : positive := (A_BITS+RAPOW-1)/RAPOW; -- Number of Iteration Steps - constant DEPTH : natural := ite(PIPELINED, STEPS, 0); -- Physical Depth - constant TRUNK_BITS : natural := (STEPS-1)*RAPOW; - constant ACTIVE_BITS : positive := D_BITS + RAPOW; - - -- Private Types - subtype residue is unsigned(ACTIVE_BITS+TRUNK_BITS-1 downto 0); - subtype divisor is unsigned(D_BITS-1 downto 0); - type residue_vector is array(natural range<>) of residue; - type divisor_vector is array(natural range<>) of divisor; - - function div_step(av : residue; dv : divisor) return residue is - variable res : residue; - variable win : unsigned(D_BITS-1 downto 0); - variable dif : unsigned(D_BITS downto 0); - begin - win := av(av'left downto TRUNK_BITS + RAPOW); - for i in RAPOW-1 downto 0 loop - dif := (win & av(TRUNK_BITS+i)) - dv; - if dif(dif'left) = '0' then - win := dif(D_BITS-1 downto 0); - else - win := win(D_BITS-2 downto 0) & av(TRUNK_BITS+i); - end if; - res(i) := not dif(dif'left); - end loop; - res(res'left downto RAPOW) := win & av(TRUNK_BITS-1 downto 0); - return res; - end function div_step; - - -- Data Registers - signal AR : residue_vector(0 to DEPTH) := (others => (others => '-')); - signal DR : divisor_vector(0 to DEPTH) := (others => (others => '-')); - signal ZR : std_logic := '-'; -- Zero Detection only in last pipeline stage - - signal exec : std_logic; - -begin - - ----------------------------------------------------------------------------- - -- Control - genPipeN : if not PIPELINED generate - constant EXEC_BITS : positive := log2ceil(STEPS)+1; - constant EXEC_IDLE : signed(EXEC_BITS-1 downto 0) := '0' & (1 to EXEC_BITS-1 => '-'); - signal CntExec : signed(EXEC_BITS-1 downto 0) := EXEC_IDLE; - begin - process(clk) - begin - if rising_edge(clk) then - if rst = '1' then - CntExec <= EXEC_IDLE; - elsif start = '1' then - CntExec <= to_signed(-STEPS, CntExec'length); - elsif CntExec(CntExec'left) = '1' then - CntExec <= CntExec + 1; - end if; - end if; - end process; - exec <= CntExec(CntExec'left); - ready <= not exec; - end generate genPipeN; - - genPipeY : if PIPELINED generate - signal Vld : std_logic_vector(0 to STEPS) := (others => '0'); - begin - process(clk) - begin - if rising_edge(clk) then - if rst = '1' then - Vld <= (others => '0'); - else - Vld <= start & Vld(0 to STEPS-1); - end if; - end if; - end process; - ready <= Vld(STEPS); - end generate genPipeY; - - ----------------------------------------------------------------------------- - -- Registers - process(clk) - variable an : residue; - variable dn : divisor; - begin - if rising_edge(clk) then - -- Reset - if rst = '1' then - AR <= (others => (others => '-')); - DR <= (others => (others => '-')); - ZR <= '-'; - - -- Operation Initialization - else - - an := residue'((residue'left downto A_BITS => '0') & unsigned(A)); - dn := divisor'(unsigned(D)); - for i in 0 to imax(0, DEPTH-1) loop - AR(i) <= an; - DR(i) <= dn; - an := div_step(AR(i), DR(i)); - dn := DR(i); - end loop; - - if PIPELINED or (start = '0' and exec = '1') then - AR(DEPTH) <= an; - DR(DEPTH) <= dn; - if Is_X(std_logic_vector(dn)) then - ZR <= 'X'; - elsif dn = 0 then - ZR <= '1'; - else - ZR <= '0'; - end if; - end if; - - end if; - end if; - end process; - - Q <= std_logic_vector(AR(DEPTH)(A_BITS-1 downto 0)); - R <= std_logic_vector(AR(DEPTH)(STEPS*RAPOW+D_BITS-1 downto STEPS*RAPOW)); - Z <= ZR; -end rtl; diff --git a/src/arith/arith_firstone.vhdl b/src/arith/arith_firstone.vhdl deleted file mode 100644 index 383552005..000000000 --- a/src/arith/arith_firstone.vhdl +++ /dev/null @@ -1,160 +0,0 @@ --- ============================================================================= --- Authors: Thomas B. Preusser --- --- Entity: TODO --- --- Description: --- ------------------------------------- --- Computes from an input word, a word of the same size that has, at most, --- one bit set. The output contains a set bit at the position of the rightmost --- set bit of the input if and only if such a set bit exists in the input. --- --- A typical use case for this computation would be an arbitration over --- requests with a fixed and strictly ordered priority. The terminology of --- the interface assumes this use case and provides some useful extras: --- --- * Set tin <= '0' (no input token) to disallow grants altogether. --- * Read tout (unused token) to see whether or any grant was issued. --- * Read bin to obtain the binary index of the rightmost detected one bit. --- The index starts at zero (0) in the rightmost bit position. --- --- This implementation uses carry chains for wider implementations. --- --- License: --- ============================================================================= --- Copyright 2007-2015 Technische Universität Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -use work.config.all; -use work.utils.all; - -entity arith_firstone is - generic ( - N : positive -- Length of Token Chain - ); - port ( - tin : in std_logic := '1'; -- Enable: Fed Token - rqst : in std_logic_vector(N-1 downto 0); -- Request: Token Requests - grnt : out std_logic_vector(N-1 downto 0); -- Grant: Token Output - tout : out std_logic; -- Inactive: Unused Token - bin : out std_logic_vector(log2ceil(N)-1 downto 0) -- Binary Grant Index - ); -end entity arith_firstone; - -architecture rtl of arith_firstone is -begin - -- Generic Carry Chain through Addition - genGeneric: if VENDOR /= VENDOR_XILINX or N < 6 generate - process(rqst, tin) - variable onehot : std_logic_vector(grnt'range); - variable binary : unsigned(bin'range); - variable adder : unsigned(N downto 0); - begin - adder := ("0" & unsigned(not rqst)) + (1 to 1 => tin); - onehot := std_logic_vector(adder(N-1 downto 0)) and rqst; - binary := (others => '0'); - for i in onehot'range loop - if onehot(i) = '1' then - binary := binary or to_unsigned(i, binary'length); - end if; - end loop; - tout <= adder(N); - grnt <= onehot; - bin <= std_logic_vector(binary); - end process; - end generate genGeneric; - - -- Optimized Xilinx Carry Chain by MUXCY Instantiation - genXilinx: if VENDOR = VENDOR_XILINX and N >= 6 generate - component MUXCY - port ( - S : in std_logic; - DI : in std_logic; - CI : in std_logic; - O : out std_logic - ); - end component; - - signal p : std_logic_vector(N-1 downto 0); -- Propagates - signal q : std_logic_vector(N downto 0); -- Carries = Intermediate Tokens - begin - - -- Propagate if no local Request - p <= not rqst; - - -- Token Input - q(0) <= to_X01(tin); - - -- Token Forwarding Chain - genChain: for i in 0 to N-1 generate - signal pp, cc : std_logic; - signal qq : std_logic_vector(1 downto 0); - begin - - -- q(i+1) <= q(i) and p(i) - - -- First MUXCY only with switching LUT - genFirst: if i = 0 generate - pp <= q(0) and p(0); - cc <= '1'; - end generate; - - -- Others using Carry Input - genChain: if i > 0 generate - pp <= p(i); - cc <= q(i); - end generate genChain; - - MUXCY_inst : MUXCY - port map ( - O => q(i+1), - CI => cc, - DI => '0', - S => pp - ); - - -- Compute Grant - qq <= q(i+1 downto i); - with qq select grnt(i) <= - '0' when "00" | "11", - '1' when "01", - 'X' when others; - - end generate; - - -- Token Output - tout <= q(N); - - -- Recode to Binary - process(q) - variable b : std_logic; - begin - for i in 0 to log2ceil(N)-1 loop - b := '0'; - for j in 0 to (N+(2**i)-1)/(2**(i+1))-1 loop - b := b or (q((2**i) + j*(2**(i+1))) and not q(imin(N, (2**(i+1)) + j*(2**(i+1))))); - end loop; - bin(i) <= b; - end loop; - end process; - - end generate genXilinx; - -end rtl; diff --git a/src/arith/arith.pro b/src/arith/build.pro similarity index 58% rename from src/arith/arith.pro rename to src/arith/build.pro index 144c26640..47e5ec8a6 100644 --- a/src/arith/arith.pro +++ b/src/arith/build.pro @@ -23,12 +23,19 @@ analyze ./arith.pkg.vhdl if { $::poc::vendorName eq "Xilinx" } { - analyze ./xilinx/arith_carrychain_inc_xilinx.vhdl + analyze ./xilinx/arith_CarryChain_inc_Xilinx.vhdl analyze ./xilinx/arith_cca_xilinx.vhdl - analyze ./xilinx/arith_addw_xilinx.vhdl + + if {$::osvvm::ToolName eq "NVC"} { + # todo: fix error: cannot reference file OUTPUT in pure function COMPUTE_BLOCKS (line 128) + disabled ./xilinx/arith_Adder_Wide_Xilinx.vhdl + } else { + analyze ./xilinx/arith_Adder_Wide_Xilinx.vhdl + } + analyze ./xilinx/arith_inc_ovcy_xilinx.vhdl - analyze ./xilinx/arith_prefix_and_xilinx.vhdl - analyze ./xilinx/arith_prefix_or_xilinx.vhdl + analyze ./xilinx/arith_Prefix_And_Xilinx.vhdl + analyze ./xilinx/arith_Prefix_Or_Xilinx.vhdl } elseif { $::poc::vendorName eq "Altera" } { puts "No Altera files for arith." @@ -39,21 +46,21 @@ if { $::poc::vendorName eq "Xilinx" } { } disabled ./arith_accumulator.vhdl -analyze ./arith_addw.vhdl -analyze ./arith_carrychain_inc.vhdl +analyze ./arith_Adder_Wide.vhdl +analyze ./arith_CarryChain_inc.vhdl analyze ./arith_cca.vhdl -analyze ./arith_convert_bin2bcd.vhdl -analyze ./arith_counter_bcd.vhdl -analyze ./arith_counter_free.vhdl -analyze ./arith_counter_gray.vhdl -analyze ./arith_counter_ring.vhdl -analyze ./arith_div.vhdl -analyze ./arith_firstone.vhdl -analyze ./arith_prefix_and.vhdl -analyze ./arith_prefix_or.vhdl -analyze ./arith_prng.vhdl -analyze ./arith_same.vhdl -analyze ./arith_sqrt.vhdl -analyze ./arith_scaler.vhdl -analyze ./arith_shifter_barrel.vhdl -analyze ./arith_trng.vhdl +analyze ./arith_Convert_Binary2BCD.vhdl +analyze ./arith_Counter_BCD.vhdl +analyze ./arith_Counter_Free.vhdl +analyze ./arith_Counter_Gray.vhdl +analyze ./arith_Counter_Ring.vhdl +analyze ./arith_Divider.vhdl +analyze ./arith_FirstOne.vhdl +analyze ./arith_Prefix_And.vhdl +analyze ./arith_Prefix_Or.vhdl +analyze ./arith_PRNG.vhdl +analyze ./arith_Same.vhdl +analyze ./arith_SquareRoot.vhdl +analyze ./arith_Scaler.vhdl +analyze ./arith_Shifter_Barrel.vhdl +analyze ./arith_TRNG.vhdl diff --git a/src/arith/xilinx/arith_addw_xilinx.vhdl b/src/arith/xilinx/arith_Adder_Wide_Xilinx.vhdl similarity index 53% rename from src/arith/xilinx/arith_addw_xilinx.vhdl rename to src/arith/xilinx/arith_Adder_Wide_Xilinx.vhdl index 15b56b626..99ea0ad7b 100644 --- a/src/arith/xilinx/arith_addw_xilinx.vhdl +++ b/src/arith/xilinx/arith_Adder_Wide_Xilinx.vhdl @@ -1,38 +1,38 @@ -- ============================================================================= --- Authors: Thomas B. Preusser +-- Authors: Thomas B. Preusser -- --- Entity: arith_addw_xilinx +-- Entity: arith_Adder_Wide_xilinx -- -- Description: -- ------------------------------------- --- Implements wide addition providing several options all based --- on an adaptation of a carry-select approach. +-- Implements wide addition providing several options all based +-- on an adaptation of a carry-select approach. -- --- Xilinx-specific optimizations. +-- Xilinx-specific optimizations. -- --- References: --- * Hong Diep Nguyen and Bogdan Pasca and Thomas B. Preusser: --- FPGA-Specific Arithmetic Optimizations of Short-Latency Adders, --- FPL 2011. --- -> ARCH: AAM, CAI, CCA --- -> SKIPPING: CCC +-- References: +-- * Hong Diep Nguyen and Bogdan Pasca and Thomas B. Preusser: +-- FPGA-Specific Arithmetic Optimizations of Short-Latency Adders, +-- FPL 2011. +-- -> ARCH: AAM, CAI, CCA +-- -> SKIPPING: CCC -- --- * Marcin Rogawski, Kris Gaj and Ekawat Homsirikamol: --- A Novel Modular Adder for One Thousand Bits and More --- Using Fast Carry Chains of Modern FPGAs, FPL 2014. --- -> ARCH: PAI --- -> SKIPPING: PPN_KS, PPN_BK +-- * Marcin Rogawski, Kris Gaj and Ekawat Homsirikamol: +-- A Novel Modular Adder for One Thousand Bits and More +-- Using Fast Carry Chains of Modern FPGAs, FPL 2014. +-- -> ARCH: PAI +-- -> SKIPPING: PPN_KS, PPN_BK -- -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -43,129 +43,133 @@ use std.textio.all; -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; -library UNISIM; +library UNISIM; use UNISIM.vcomponents.all; use work.utils.all; use work.arith.all; -entity arith_addw_xilinx is - generic ( - N : positive; -- Operand Width - K : positive; -- Block Count - - ARCH : tArch := CAI; -- Architecture - BLOCKING : tBlocking := DFLT; -- Blocking Scheme - SKIPPING : tSkipping := CCC -- Carry Skip Scheme - ); - port ( - a, b : in std_logic_vector(N-1 downto 0); - cin : in std_logic; - - s : out std_logic_vector(N-1 downto 0); - cout : out std_logic - ); +entity arith_Adder_Wide_Xilinx is + generic ( + N : positive; -- Operand Width + K : positive; -- Block Count + + ARCH : T_Adder_Architecture := CAI; -- Architecture + BLOCKING : T_Adder_BlockingScheme := DFLT; -- Blocking Scheme + SKIPPING : T_Adder_CarrySkipScheme := CCC -- Carry Skip Scheme + ); + port ( + A : in std_logic_vector(N-1 downto 0); + B : in std_logic_vector(N-1 downto 0); + CarryIn : in std_logic; + + Sum : out std_logic_vector(N-1 downto 0); + CarryOut : out std_logic + ); end entity; -architecture rtl of arith_addw_xilinx is - - -- Determine Block Boundaries - type tBlocking_vector is array(tArch) of tBlocking; - constant DEFAULT_BLOCKING : tBlocking_vector := (AAM => ASC, CAI => ASC, PAI => DESC, CCA => DESC); - - type integer_vector is array(natural range<>) of integer; - function compute_blocks return integer_vector is - variable bs : tBlocking := BLOCKING; - variable res : integer_vector(K-1 downto 0); - - variable l : line; - begin - if bs = DFLT then - bs := DEFAULT_BLOCKING(ARCH); - end if; - case bs is - when FIX => - assert N >= K - report "Cannot have more blocks than input bits." - severity failure; - for i in res'range loop - res(i) := ((i+1)*N+K/2)/K; - end loop; - - when ASC => - assert N-K*(K-1)/2 >= K - report "Too few input bits to implement growing block sizes." - severity failure; - for i in res'range loop - res(i) := ((i+1)*(N-K*(K-1)/2)+K/2)/K + (i+1)*i/2; - end loop; - - when DESC => - assert N-K*(K-1)/2 >= K - report "Too few input bits to implement growing block sizes." - severity failure; - for i in res'range loop - res(i) := ((i+1)*(N+K*(K-1)/2)+K/2)/K - (i+1)*i/2; - end loop; - - when others => - report "Unknown blocking scheme: "&tBlocking'image(bs) severity failure; - - end case; - --synthesis translate_off - write(l, "Implementing "&integer'image(N)&"-bit wide adder: ARCH="&tArch'image(ARCH)& - ", BLOCKING="&tBlocking'image(bs)&'['); - for i in K-1 downto 1 loop - write(l, res(i)-res(i-1)); - write(l, ','); - end loop; - write(l, res(0)); - write(l, "], SKIPPING="&tSkipping'image(SKIPPING)); - writeline(output, l); - --synthesis translate_on - return res; - end compute_blocks; - constant BLOCKS : integer_vector(K-1 downto 0) := compute_blocks; - - signal g : std_logic_vector(K-1 downto 1); -- Block Generate - signal p : std_logic_vector(K-1 downto 1); -- Block Propagate - signal c : std_logic_vector(K-1 downto 1); -- Block Carry-in +architecture rtl of arith_Adder_Wide_Xilinx is + -- Determine Block Boundaries + constant DEFAULT_BLOCKING : T_Adder_BlockingScheme_Vector := ( + AAM => ASC, + CAI => ASC, + PAI => DESC, + CCA => DESC + ); + + function compute_blocks return integer_vector is + variable bs : T_Adder_BlockingScheme := BLOCKING; + variable res : integer_vector(K-1 downto 0); + + variable l : line; + begin + if bs = DFLT then + bs := DEFAULT_BLOCKING(ARCH); + end if; + case bs is + when FIX => + assert N >= K + report "Cannot have more blocks than input bits." + severity failure; + for i in res'range loop + res(i) := ((i+1)*N+K/2)/K; + end loop; + + when ASC => + assert N-K*(K-1)/2 >= K + report "Too few input bits to implement growing block sizes." + severity failure; + for i in res'range loop + res(i) := ((i+1)*(N-K*(K-1)/2)+K/2)/K + (i+1)*i/2; + end loop; + + when DESC => + assert N-K*(K-1)/2 >= K + report "Too few input bits to implement growing block sizes." + severity failure; + for i in res'range loop + res(i) := ((i+1)*(N+K*(K-1)/2)+K/2)/K - (i+1)*i/2; + end loop; + + when others => + report "Unknown blocking scheme: " & T_Adder_BlockingScheme'image(bs) severity failure; + + end case; + --synthesis translate_off + write(l, "Implementing " & integer'image(N) & "-bit wide adder: ARCH=" & T_Adder_Architecture'image(ARCH) & + ", BLOCKING=" & T_Adder_BlockingScheme'image(bs) & '['); + for i in K-1 downto 1 loop + write(l, res(i)-res(i-1)); + write(l, ','); + end loop; + write(l, res(0)); + write(l, "], SKIPPING=" & T_Adder_CarrySkipScheme'image(SKIPPING)); + writeline(output, l); + --synthesis translate_on + return res; + end function compute_blocks; + + constant BLOCKS : integer_vector(K-1 downto 0) := compute_blocks; + + signal g : std_logic_vector(K-1 downto 1); -- Block Generate + signal p : std_logic_vector(K-1 downto 1); -- Block Propagate + signal c : std_logic_vector(K-1 downto 1); -- Block Carry-in begin - ----------------------------------------------------------------------------- - -- Rightmost Block and Core Carry Chain + ----------------------------------------------------------------------------- + -- Rightmost Block and Core Carry Chain blkCore: block - constant M : positive := BLOCKS(0); -- Rightmost Block Width + constant M : positive := BLOCKS(0); -- Rightmost Block Width signal cc : std_logic_vector(K+M-1 downto 0); begin - cc(0) <= cin; + cc(0) <= CarryIn; -- Rightmost Block genChain: for i in 0 to M-1 generate signal pp : std_logic; begin - pp <= a(i) xor b(i); + pp <= A(i) xor B(i); cc_mux: MUXCY port map ( O => cc(i+1), CI => cc(i), - DI => a(i), + DI => A(i), S => pp ); cc_xor: XORCY port map ( - O => s(i), + O => Sum(i), CI => cc(i), LI => pp ); end generate genChain; -- Carry Computation with Carry Chain - genCCC: if SKIPPING = CCC generate + genCCC: if SKIPPING = CCC generate genChain: for i in 1 to K-1 generate cc_mux: MUXCY port map ( @@ -175,7 +179,7 @@ begin S => p(i) ); end generate genChain; - end generate genCCC; + end generate genCCC; -- Plain linear LUT-based Carry Forwarding genPlain: if SKIPPING = PLAIN generate @@ -243,24 +247,24 @@ begin end generate genPPN_BK; c <= cc(K+M-2 downto M); - cout <= cc(cc'left); + CarryOut <= cc(cc'left); end block blkCore; - ----------------------------------------------------------------------------- - -- Implement Carry-Select Variant - -- - -- all but rightmost block, implementation architecture selected by ARCH - genBlocks: for i in 1 to K-1 generate - -- Covered Index Range - constant LO : positive := BLOCKS(i-1); -- Low Bit Index - constant HI : positive := BLOCKS(i)-1; -- High Bit Index - begin + ----------------------------------------------------------------------------- + -- Implement Carry-Select Variant + -- + -- all but rightmost block, implementation architecture selected by ARCH + genBlocks: for i in 1 to K-1 generate + -- Covered Index Range + constant LO : positive := BLOCKS(i-1); -- Low Bit Index + constant HI : positive := BLOCKS(i)-1; -- High Bit Index + begin - -- ARCH-specific Implementations + -- ARCH-specific Implementations - --Add-Add-Multiplex - genAAM: if ARCH = AAM generate + --Add-Add-Multiplex + genAAM: if ARCH = AAM generate signal c0 : std_logic_vector(HI+1 downto LO); signal c1 : std_logic_vector(HI+1 downto LO); begin @@ -270,14 +274,14 @@ begin signal p0, s0 : std_logic; signal p1, s1 : std_logic; begin - p0 <= a(j) xor b(j); + p0 <= A(j) xor B(j); -- Computation of (c0, s0) c0_mux: MUXCY port map ( O => c0(j+1), CI => c0(j), - DI => a(j), + DI => A(j), S => p0 ); c0_xor: XORCY @@ -289,24 +293,24 @@ begin -- Computation of (c1, s1) and Block Sum c1_lut: LUT6_2 - generic map ( - INIT => x"66666666_FF00F0F0" + generic map ( + INIT => x"66666666_FF00F0F0" ) - port map ( - O6 => p1, - O5 => s(j), - I5 => '1', - I4 => c(i), - I3 => s1, - I2 => s0, - I1 => b(j), - I0 => a(j) + port map ( + O6 => p1, + O5 => Sum(j), + I5 => '1', + I4 => c(i), + I3 => s1, + I2 => s0, + I1 => B(j), + I0 => A(j) ); c1_mux: MUXCY port map ( O => c1(j+1), CI => c1(j), - DI => a(j), + DI => A(j), S => p1 ); c1_xor: XORCY @@ -320,71 +324,71 @@ begin g(i) <= c0(HI+1); p(i) <= c1(HI+1) xor c0(HI+1); - end generate genAAM; + end generate genAAM; - -- Compare-Add-Increment - genCAI: if ARCH = CAI generate + -- Compare-Add-Increment + genCAI: if ARCH = CAI generate constant MD : natural := (HI-LO+1)/2; -- Full double blocks constant MR : natural := HI-LO+1 - 2*MD; -- Single closing block signal c0 : std_logic_vector(HI+1 downto LO); - signal pp : std_logic_vector(MR+MD downto 0); -- Cumulative Propagates - begin + signal pp : std_logic_vector(MR+MD downto 0); -- Cumulative Propagates + begin -- Computation of P and s c0(LO) <= '0'; pp(0) <= '1'; genDoubles: for j in 0 to MD-1 generate constant BASE : natural := LO + 2*j; - signal pl, pr : std_logic; -- Left / right propagates - signal sl, sr : std_logic; -- Left / right sum bits - signal pd : std_logic; -- Joint propagate + signal pl, pr : std_logic; -- Left / right propagates + signal sl, sr : std_logic; -- Left / right sum bits + signal pd : std_logic; -- Joint propagate begin -- Sum Bit Computations ps_lut_r: LUT6_2 - generic map ( - INIT => x"66666666_9F60FF00" + generic map ( + INIT => x"66666666_9F60FF00" ) - port map ( - O6 => pr, - O5 => s(BASE+1), - I5 => '1', - I4 => c(i), - I3 => sl, - I2 => pp(j), - I1 => b(BASE), - I0 => a(BASE) + port map ( + O6 => pr, + O5 => Sum(BASE+1), + I5 => '1', + I4 => c(i), + I3 => sl, + I2 => pp(j), + I1 => B(BASE), + I0 => A(BASE) ); ps_lut_l: LUT6_2 - generic map ( - INIT => x"66666666_0FF0FF00" + generic map ( + INIT => x"66666666_0FF0FF00" ) - port map ( - O6 => pl, - O5 => s(BASE), - I5 => '1', - I4 => c(i), - I3 => sr, - I2 => pp(j), - I1 => b(BASE+1), - I0 => a(BASE+1) + port map ( + O6 => pl, + O5 => Sum(BASE), + I5 => '1', + I4 => c(i), + I3 => sr, + I2 => pp(j), + I1 => B(BASE+1), + I0 => A(BASE+1) ); c0_mux_r: MUXCY port map ( O => c0(BASE+1), CI => c0(BASE), - DI => a(BASE), + DI => A(BASE), S => pr ); c0_mux_l: MUXCY port map ( O => c0(BASE+2), CI => c0(BASE+1), - DI => a(BASE+1), + DI => A(BASE+1), S => pl ); - genLSB: if j = 0 generate + genLSB: if j = 0 generate sr <= pr; end generate; genHSB: if j > 0 generate @@ -403,7 +407,7 @@ begin ); -- Propagate Chain - pd <= (a(BASE+1) xor b(BASE+1)) and (a(BASE) xor b(BASE)); + pd <= (A(BASE+1) xor B(BASE+1)) and (A(BASE) xor B(BASE)); pp_mux: MUXCY port map ( O => pp(j+1), @@ -419,24 +423,24 @@ begin signal p, s0 : std_logic; begin ps_lut_l: LUT6_2 - generic map ( - INIT => x"66666666_0FF0FF00" + generic map ( + INIT => x"66666666_0FF0FF00" ) - port map ( - O6 => p, - O5 => s(BASE), - I5 => '1', - I4 => c(i), - I3 => s0, - I2 => pp(MD), - I1 => b(BASE), - I0 => a(BASE) + port map ( + O6 => p, + O5 => Sum(BASE), + I5 => '1', + I4 => c(i), + I3 => s0, + I2 => pp(MD), + I1 => B(BASE), + I0 => A(BASE) ); c0_mux: MUXCY port map ( O => c0(BASE+1), CI => c0(BASE), - DI => a(BASE), + DI => A(BASE), S => p ); s0_xor: XORCY @@ -447,7 +451,7 @@ begin ); -- Let synthesis merge it into carry computation - pp(pp'left) <= (a(BASE) xor b(BASE)) and pp(MD); + pp(pp'left) <= (A(BASE) xor B(BASE)) and pp(MD); end generate genLast; g(i) <= c0(c0'left); @@ -468,18 +472,18 @@ begin signal gl : std_logic; begin gp_lut: LUT6_2 - generic map ( - INIT => x"12480000_EE880000" + generic map ( + INIT => x"12480000_EE880000" ) - port map ( - O6 => pl(j), - O5 => gl, - I5 => '1', - I4 => '1', - I3 => a(LO+2*j+1), - I2 => a(LO+2*j), - I1 => b(LO+2*j+1), - I0 => b(LO+2*j) + port map ( + O6 => pl(j), + O5 => gl, + I5 => '1', + I4 => '1', + I3 => A(LO+2*j+1), + I2 => A(LO+2*j), + I1 => B(LO+2*j+1), + I0 => B(LO+2*j) ); c0_mux: MUXCY port map ( @@ -490,17 +494,17 @@ begin ); end generate genDoubles; genOdd: if M-D > D generate - pl(D) <= a(HI) xnor b(HI); + pl(D) <= A(HI) xnor B(HI); pc(D+1) <= pl(D) and pc(D); end generate genOdd; g(i) <= pc(pc'left); p(i) <= 'X' when Is_X(pl) else '1' when pl = (pl'range => '1') else '0'; - s(HI downto LO) <= std_logic_vector(unsigned(a(HI downto LO)) + unsigned(b(HI downto LO)) + + Sum(HI downto LO) <= std_logic_vector(unsigned(A(HI downto LO)) + unsigned(B(HI downto LO)) + (0 to 0 => c(i))); end generate genCCA; - end generate genBlocks; + end generate genBlocks; end architecture; diff --git a/src/arith/xilinx/arith_carrychain_inc_xilinx.vhdl b/src/arith/xilinx/arith_CarryChain_inc_Xilinx.vhdl similarity index 57% rename from src/arith/xilinx/arith_carrychain_inc_xilinx.vhdl rename to src/arith/xilinx/arith_CarryChain_inc_Xilinx.vhdl index 537e4942d..0fbdec3cf 100644 --- a/src/arith/xilinx/arith_carrychain_inc_xilinx.vhdl +++ b/src/arith/xilinx/arith_CarryChain_inc_Xilinx.vhdl @@ -1,25 +1,26 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Carry-chain abstraction for increment by one operations +-- Entity: Carry-chain abstraction for increment by one operations -- -- Description: -- ------------------------------------- --- This is a Xilinx specific carry-chain abstraction for increment by one --- operations. +-- This is a Xilinx specific carry-chain abstraction for increment by one +-- operations. -- --- Y <= X + (0...0) & Cin +-- Sum <= A + (0...0) & CarryIn -- -- License: -- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,41 +32,42 @@ library IEEE; use IEEE.std_logic_1164.all; -library Unisim; +library Unisim; use Unisim.VComponents.all; -entity arith_carrychain_inc_xilinx is +entity arith_CarryChain_inc_Xilinx is generic ( - BITS : positive + BITS : positive ); port ( - X : in std_logic_vector(BITS - 1 downto 0); - CIn : in std_logic := '1'; - Y : out std_logic_vector(BITS - 1 downto 0) + A : in std_logic_vector(BITS - 1 downto 0); + CarryIn : in std_logic := '1'; + Sum : out std_logic_vector(BITS - 1 downto 0) ); end entity; -architecture rtl of arith_carrychain_inc_xilinx is - signal ci : std_logic_vector(BITS downto 0); - signal co : std_logic_vector(BITS downto 0); +architecture rtl of arith_CarryChain_inc_Xilinx is + signal ci : std_logic_vector(BITS downto 0); + signal co : std_logic_vector(BITS downto 0); begin - ci(0) <= CIn; + ci(0) <= CarryIn; + genBits : for i in 0 to BITS - 1 generate - cc_mux : MUXCY + cc_mux : component MUXCY port map ( O => ci(i + 1), CI => ci(i), DI => '0', - S => X(i) + S => A(i) ); - cc_xor : XORCY + cc_xor : component XORCY port map ( - O => Y(i), + O => Sum(i), CI => ci(i), - LI => X(i) + LI => A(i) ); end generate; end architecture; diff --git a/src/arith/xilinx/arith_prefix_and_xilinx.vhdl b/src/arith/xilinx/arith_Prefix_And_Xilinx.vhdl similarity index 53% rename from src/arith/xilinx/arith_prefix_and_xilinx.vhdl rename to src/arith/xilinx/arith_Prefix_And_Xilinx.vhdl index 933c4f665..2090bb70f 100644 --- a/src/arith/xilinx/arith_prefix_and_xilinx.vhdl +++ b/src/arith/xilinx/arith_Prefix_And_Xilinx.vhdl @@ -1,27 +1,24 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; -- ============================================================================= --- Authors: Thomas B. Preusser --- Patrick Lehmann +-- Authors: Thomas B. Preusser +-- Patrick Lehmann -- --- Entity: Prefix AND computation +-- Entity: Prefix AND computation -- -- Description: -- ------------------------------------- --- Prefix AND computation: --- y(i) <= '1' when x(i downto 0) = (i downto 0 => '1') else '0' --- This implementation uses carry chains for wider implementations. +-- Prefix AND computation: +-- y(i) <= '1' when x(i downto 0) = (i downto 0 => '1') else '0' +-- This implementation uses carry chains for wider implementations. -- -- ============================================================================= -- Copyright 2007-2016 Technische Universität Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,46 +27,46 @@ -- limitations under the License. -- ============================================================================= -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library UniSim; use UniSim.VComponents.all; -entity arith_prefix_and_xilinx is +entity arith_Prefix_And_Xilinx is generic ( - N : positive + BITS : positive ); port ( - x : in std_logic_vector(N-1 downto 0); - y : out std_logic_vector(N-1 downto 0) + x : in std_logic_vector(BITS-1 downto 0); + y : out std_logic_vector(BITS-1 downto 0) ); end entity; -architecture rtl of arith_prefix_and_xilinx is - signal c : std_logic_vector(N-1 downto 0); +architecture rtl of arith_Prefix_And_Xilinx is + signal c : std_logic_vector(BITS-1 downto 0); begin y(0) <= x(0); - gen1: if N > 1 generate - signal p : unsigned(N-1 downto 1); + gen1: if BITS > 1 generate + signal p : unsigned(BITS-1 downto 1); begin p(1) <= x(0) and x(1); - gen2: if N > 2 generate - p(N-1 downto 2) <= unsigned(x(N-1 downto 2)); + gen2: if BITS > 2 generate + p(BITS-1 downto 2) <= unsigned(x(BITS-1 downto 2)); c(0) <= '1'; - genChain: for i in 1 to N-1 generate + genChain: for i in 1 to BITS-1 generate mux : MUXCY port map ( - S => p(i), + S => p(i), DI => '0', CI => c(i-1), - O => c(i) + O => c(i) ); end generate genChain; - y(N-1 downto 2) <= c(N-1 downto 2); + y(BITS-1 downto 2) <= c(BITS-1 downto 2); end generate gen2; y(1) <= p(1); end generate gen1; diff --git a/src/arith/xilinx/arith_prefix_or_xilinx.vhdl b/src/arith/xilinx/arith_Prefix_Or_Xilinx.vhdl similarity index 51% rename from src/arith/xilinx/arith_prefix_or_xilinx.vhdl rename to src/arith/xilinx/arith_Prefix_Or_Xilinx.vhdl index 4dedc381b..bec29afed 100644 --- a/src/arith/xilinx/arith_prefix_or_xilinx.vhdl +++ b/src/arith/xilinx/arith_Prefix_Or_Xilinx.vhdl @@ -1,27 +1,24 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; -- ============================================================================= --- Authors: Thomas B. Preusser --- Patrick Lehmann +-- Authors: Thomas B. Preusser +-- Patrick Lehmann -- --- Entity: Prefix OR computation +-- Entity: Prefix OR computation -- -- Description: -- ------------------------------------- --- Prefix OR computation: --- y(i) <= '0' when x(i downto 0) = (i downto 0 => '0') else '1'; --- This implementation uses carry chains for wider implementations. +-- Prefix OR computation: +-- y(i) <= '0' when x(i downto 0) = (i downto 0 => '0') else '1'; +-- This implementation uses carry chains for wider implementations. -- -- ============================================================================= -- Copyright 2007-2016 Technische Universität Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,47 +27,47 @@ -- limitations under the License. -- ============================================================================= -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library UniSim; use UniSim.VComponents.all; -entity arith_prefix_or_xilinx is +entity arith_Prefix_Or_Xilinx is generic ( - N : positive + BITS : positive ); port ( - x : in std_logic_vector(N-1 downto 0); - y : out std_logic_vector(N-1 downto 0) + x : in std_logic_vector(BITS-1 downto 0); + y : out std_logic_vector(BITS-1 downto 0) ); end entity; -architecture rtl of arith_prefix_or_xilinx is - constant d : std_logic_vector(N-2 downto 0) := (N-2 downto 1 => '1') & '0'; - signal c : std_logic_vector(N-1 downto 0); +architecture rtl of arith_Prefix_Or_Xilinx is + constant d : std_logic_vector(BITS-2 downto 0) := (BITS-2 downto 1 => '1') & '0'; + signal c : std_logic_vector(BITS-1 downto 0); begin y(0) <= x(0); - gen1: if N > 1 generate - signal p : unsigned(N-1 downto 1); + gen1: if BITS > 1 generate + signal p : unsigned(BITS-1 downto 1); begin p(1) <= x(0) or x(1); - gen2: if N > 2 generate - p(N-1 downto 2) <= not unsigned(x(N-1 downto 2)); + gen2: if BITS > 2 generate + p(BITS-1 downto 2) <= not unsigned(x(BITS-1 downto 2)); c(0) <= '1'; - genChain: for i in 1 to N-1 generate + genChain: for i in 1 to BITS-1 generate mux : MUXCY port map ( - S => p(i), + S => p(i), DI => d(i-1), CI => c(i-1), - O => c(i) + O => c(i) ); end generate genChain; - y(N-1 downto 2) <= c(N-1 downto 2); + y(BITS-1 downto 2) <= c(BITS-1 downto 2); end generate gen2; y(1) <= p(1); end generate gen1; diff --git a/src/arith/xilinx/arith_cca_xilinx.vhdl b/src/arith/xilinx/arith_cca_xilinx.vhdl index e4e2c00cc..cc7da7cd8 100644 --- a/src/arith/xilinx/arith_cca_xilinx.vhdl +++ b/src/arith/xilinx/arith_cca_xilinx.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Description: Carry-Compact Adder for Xilinx Virtex-5 architectures and newer. -- @@ -43,189 +39,189 @@ -- =================================================================================== library IEEE; -use IEEE.std_logic_1164.all; +use IEEE.std_logic_1164.all; entity arith_cca is - generic( - N : positive; -- bit width - L : natural; -- CC length equivalent per LUT stage - X : natural := 0 -- max expansion depth; default: zero (0) - unlimited - ); - port( - a : in std_logic_vector(N-1 downto 0); - b : in std_logic_vector(N-1 downto 0); - c : in std_logic := '0'; - s : out std_logic_vector(N-1 downto 0) - ); -end arith_cca; + generic( + BITS : positive; -- bit width + L : natural; -- CC length equivalent per LUT stage + X : natural := 0 -- max expansion depth; default: zero (0) - unlimited + ); + port( + a : in std_logic_vector(BITS-1 downto 0); + b : in std_logic_vector(BITS-1 downto 0); + c : in std_logic := '0'; + s : out std_logic_vector(BITS-1 downto 0) + ); +end entity; library IEEE; -use IEEE.numeric_std.all; +use IEEE.numeric_std.all; architecture rtl of arith_cca is - type tLevel is record - base : natural; - core : integer; - done : natural; - end record tLevel; - type tLevels is array(natural range<>) of tLevel; - - function compact return tLevels is - variable res : tLevels(0 to 31); - variable base, core, done : integer; - begin - base := 0; - core := (N-L)/2; - done := N-2*core; - for i in res'range loop - res(i) := (base, core, done); - if core <= 0 then - for j in 0 to i loop - report integer'image(j)&": ("&integer'image(res(j).base)&", "&integer'image(res(j).core)&", "&integer'image(res(j).done)&")" severity note; - end loop; - return res(0 to i); - end if; - base := base + 2*core; - done := done + (core-2*(core/2)+L); - core := core/2 - L; - if i+1 = X and core > 0 then - done := done + 2*core; - core := 0; - end if; - end loop; - end function compact; - constant LEVELS : tLevels := compact; - constant CCA : boolean := LEVELS'length > 1; + type tLevel is record + base : natural; + core : integer; + done : natural; + end record tLevel; + type tLevels is array(natural range<>) of tLevel; + + function compact return tLevels is + variable res : tLevels(0 to 31); + variable base, core, done : integer; + begin + base := 0; + core := (BITS-L)/2; + done := BITS-2*core; + for i in res'range loop + res(i) := (base, core, done); + if core <= 0 then + for j in 0 to i loop + report integer'image(j)&": ("&integer'image(res(j).base)&", "&integer'image(res(j).core)&", "&integer'image(res(j).done)&")" severity note; + end loop; + return res(0 to i); + end if; + base := base + 2*core; + done := done + (core-2*(core/2)+L); + core := core/2 - L; + if i+1 = X and core > 0 then + done := done + 2*core; + core := 0; + end if; + end loop; + end function compact; + constant LEVELS : tLevels := compact; + constant CCA : boolean := LEVELS'length > 1; begin - genRCA: if not CCA generate - assert false - report "Using standard RCA for small "&integer'image(N)&"-bit adder." - severity note; - s <= std_logic_vector(unsigned(a)+unsigned(b)+(0 to 0 => c)); - end generate; - - genCCA: if CCA generate - constant WI : positive := LEVELS(LEVELS'high).base; - constant WC : positive := LEVELS(LEVELS'high).done + LEVELS'high*L + 2*LEVELS(LEVELS'high).core; - - signal ai, bi, si : std_logic_vector(WI-1 downto 0); - signal ac, bc, sc : unsigned(WC-1 downto 0); - begin - - -- Feed operands into compaction tree except for a prefix of L bits - -- to hide expansion delay of lower-order bits - blkFeed: block is - constant DONE : natural := LEVELS(0).done; - begin - -- alias most-significant prefix of ports and compacted operation - genPre: if DONE > 0 generate - ac(WC-1 downto WC-DONE) <= unsigned(a(N-1 downto N-DONE)); - bc(WC-1 downto WC-DONE) <= unsigned(b(N-1 downto N-DONE)); - s(N-1 downto N-DONE) <= std_logic_vector(sc(WC-1 downto WC-DONE)); - end generate genPre; - - -- copy compaction region - ai(N-DONE-1 downto 0) <= a(N-DONE-1 downto 0); - bi(N-DONE-1 downto 0) <= b(N-DONE-1 downto 0); - s(N-DONE-1 downto 0) <= si(N-DONE-1 downto 0); - end block blkFeed; - - -- Build the compaction tree - genCompact: for i in 1 to LEVELS'high generate - constant PAIRS : positive := LEVELS(i-1).core; - - constant BASE : natural := LEVELS(i).base; - constant CORE : integer := LEVELS(i).core; - constant DONE : natural := LEVELS(i).done; - - component LUT6_2 is - generic( - INIT : bit_vector := X"0000000000000000" - ); - port( - O5 : out std_ulogic; - O6 : out std_ulogic; - I0 : in std_ulogic; - I1 : in std_ulogic; - I2 : in std_ulogic; - I3 : in std_ulogic; - I4 : in std_ulogic; - I5 : in std_ulogic - ); - end component LUT6_2; - - begin - genPairs: for j in 0 to PAIRS-1 generate - signal b1, b0, a1, a0 : std_logic; - signal ss : std_logic; - begin - -- Compaction ------ - - -- Simplify Names - b1 <= bi(BASE-2*(PAIRS-j)+1); - b0 <= bi(BASE-2*(PAIRS-j)+0); - a1 <= ai(BASE-2*(PAIRS-j)+1); - a0 <= ai(BASE-2*(PAIRS-j)+0); - - genLast: if CORE <= 0 or j < L or L+2*CORE <= j generate - signal aa, bb : std_logic; - begin - aa <= (b1 and a1) or (b1 and a0) or (a1 and a0); - bb <= (b1 and a1) or (b1 and b0) or (a1 and b0); - - genSuf: if CORE <= 0 or j < L generate - ac((i-1)*L+j) <= aa; - bc((i-1)*L+j) <= bb; - ss <= sc((i-1)*L+j); - end generate genSuf; - genPre: if CORE > 0 and L+2*CORE <= j generate - ac(j-L-2*CORE+(WC-DONE)) <= aa; - bc(j-L-2*CORE+(WC-DONE)) <= bb; - ss <= sc(j-L-2*CORE+(WC-DONE)); - end generate genPre; - end generate genLast; - - genCore: if CORE > 0 and L <= j and j < L+2*CORE generate - ss <= si(BASE-L+j); - - compact: LUT6_2 - generic map( - INIT => X"FCC0FCC0FAA0FAA0" - ) - port map( - O6 => bi(BASE-L+j), - O5 => ai(BASE-L+j), - I5 => '1', - I4 => '-', - I3 => b1, - I2 => a1, - I1 => b0, - I0 => a0 - ); - end generate genCore; - - -- Expansion ------ - expand: LUT6_2 - generic map( - INIT => X"E77E81189FF96006" - ) - port map( - O6 => si(BASE-2*(PAIRS-j)+1), - O5 => si(BASE-2*(PAIRS-j)+0), - I5 => '1', - I4 => ss, - I3 => b1, - I2 => a1, - I1 => b0, - I0 => a0 - ); - - end generate genPairs; - end generate genCompact; - sc <= ac + bc + (0 to 0 => c); - end generate genCCA; - -end rtl; + genRCA: if not CCA generate + assert false + report "Using standard RCA for small "&integer'image(BITS)&"-bit adder." + severity note; + s <= std_logic_vector(unsigned(a)+unsigned(b)+(0 to 0 => c)); + end generate; + + genCCA: if CCA generate + constant WI : positive := LEVELS(LEVELS'high).base; + constant WC : positive := LEVELS(LEVELS'high).done + LEVELS'high*L + 2*LEVELS(LEVELS'high).core; + + signal ai, bi, si : std_logic_vector(WI-1 downto 0); + signal ac, bc, sc : unsigned(WC-1 downto 0); + begin + + -- Feed operands into compaction tree except for a prefix of L bits + -- to hide expansion delay of lower-order bits + blkFeed: block is + constant DONE : natural := LEVELS(0).done; + begin + -- alias most-significant prefix of ports and compacted operation + genPre: if DONE > 0 generate + ac(WC-1 downto WC-DONE) <= unsigned(a(BITS-1 downto BITS-DONE)); + bc(WC-1 downto WC-DONE) <= unsigned(b(BITS-1 downto BITS-DONE)); + s(BITS-1 downto BITS-DONE) <= std_logic_vector(sc(WC-1 downto WC-DONE)); + end generate genPre; + + -- copy compaction region + ai(BITS-DONE-1 downto 0) <= a(BITS-DONE-1 downto 0); + bi(BITS-DONE-1 downto 0) <= b(BITS-DONE-1 downto 0); + s(BITS-DONE-1 downto 0) <= si(BITS-DONE-1 downto 0); + end block blkFeed; + + -- Build the compaction tree + genCompact: for i in 1 to LEVELS'high generate + constant PAIRS : positive := LEVELS(i-1).core; + + constant BASE : natural := LEVELS(i).base; + constant CORE : integer := LEVELS(i).core; + constant DONE : natural := LEVELS(i).done; + + component LUT6_2 is + generic( + INIT : bit_vector := X"0000000000000000" + ); + port( + O5 : out std_ulogic; + O6 : out std_ulogic; + I0 : in std_ulogic; + I1 : in std_ulogic; + I2 : in std_ulogic; + I3 : in std_ulogic; + I4 : in std_ulogic; + I5 : in std_ulogic + ); + end component LUT6_2; + + begin + genPairs: for j in 0 to PAIRS-1 generate + signal b1, b0, a1, a0 : std_logic; + signal ss : std_logic; + begin + -- Compaction ------ + + -- Simplify Names + b1 <= bi(BASE-2*(PAIRS-j)+1); + b0 <= bi(BASE-2*(PAIRS-j)+0); + a1 <= ai(BASE-2*(PAIRS-j)+1); + a0 <= ai(BASE-2*(PAIRS-j)+0); + + genLast: if CORE <= 0 or j < L or L+2*CORE <= j generate + signal aa, bb : std_logic; + begin + aa <= (b1 and a1) or (b1 and a0) or (a1 and a0); + bb <= (b1 and a1) or (b1 and b0) or (a1 and b0); + + genSuf: if CORE <= 0 or j < L generate + ac((i-1)*L+j) <= aa; + bc((i-1)*L+j) <= bb; + ss <= sc((i-1)*L+j); + end generate genSuf; + genPre: if CORE > 0 and L+2*CORE <= j generate + ac(j-L-2*CORE+(WC-DONE)) <= aa; + bc(j-L-2*CORE+(WC-DONE)) <= bb; + ss <= sc(j-L-2*CORE+(WC-DONE)); + end generate genPre; + end generate genLast; + + genCore: if CORE > 0 and L <= j and j < L+2*CORE generate + ss <= si(BASE-L+j); + + compact: LUT6_2 + generic map( + INIT => X"FCC0FCC0FAA0FAA0" + ) + port map( + O6 => bi(BASE-L+j), + O5 => ai(BASE-L+j), + I5 => '1', + I4 => '-', + I3 => b1, + I2 => a1, + I1 => b0, + I0 => a0 + ); + end generate genCore; + + -- Expansion ------ + expand: LUT6_2 + generic map( + INIT => X"E77E81189FF96006" + ) + port map( + O6 => si(BASE-2*(PAIRS-j)+1), + O5 => si(BASE-2*(PAIRS-j)+0), + I5 => '1', + I4 => ss, + I3 => b1, + I2 => a1, + I1 => b0, + I0 => a0 + ); + + end generate genPairs; + end generate genCompact; + sc <= ac + bc + (0 to 0 => c); + end generate genCCA; + +end architecture; diff --git a/src/arith/xilinx/arith_inc_ovcy_xilinx.vhdl b/src/arith/xilinx/arith_inc_ovcy_xilinx.vhdl index 4c9ea6401..f6d5ff279 100644 --- a/src/arith/xilinx/arith_inc_ovcy_xilinx.vhdl +++ b/src/arith/xilinx/arith_inc_ovcy_xilinx.vhdl @@ -1,23 +1,20 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; -- ============================================================================= --- Authors: Thomas B. Preusser +-- Authors: Thomas B. Preusser -- --- Entity: TODO +-- Entity: TODO -- Description: -- ------------------------------------- -- .. TODO:: No documentation available. -- -- ============================================================================= -- Copyright 2007-2015 Technische Universität Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,36 +31,36 @@ use UNISIM.vComponents.all; entity arith_inc_ovcy_xilinx is - generic ( - N : positive -- Bit Width - ); - port ( - p : in std_logic_vector(N-1 downto 0); -- Argument - g : in std_logic; -- Increment Guard - v : out std_logic -- Overflow Output - ); + generic ( + BITS : positive -- Bit Width + ); + port ( + p : in std_logic_vector(BITS-1 downto 0); -- Argument + g : in std_logic; -- Increment Guard + v : out std_logic -- Overflow Output + ); end entity; architecture rtl of arith_inc_ovcy_xilinx is - signal c : std_logic_vector(N downto 0); -- Carry Chain Links + signal c : std_logic_vector(BITS downto 0); -- Carry Chain Links begin -- rtl - -- Feed Chain with Guard - c(0) <= g; + -- Feed Chain with Guard + c(0) <= g; - -- Instantiate Carry Chain - genCC: for i in 0 to N-1 generate - m : MUXCY - port map ( - O => c(i+1), - CI => c(i), - DI => '0', - S => p(i) - ); - end generate genCC; + -- Instantiate Carry Chain + genCC: for i in 0 to BITS-1 generate + m : MUXCY + port map ( + O => c(i+1), + CI => c(i), + DI => '0', + S => p(i) + ); + end generate genCC; - -- Output from final Carry - v <= c(N); + -- Output from final Carry + v <= c(BITS); end architecture; diff --git a/src/PoC.pro b/src/build.pro similarity index 60% rename from src/PoC.pro rename to src/build.pro index 2c4d834da..db70e8bbe 100644 --- a/src/PoC.pro +++ b/src/build.pro @@ -21,35 +21,34 @@ library PoC -analyze $::poc::myConfigFile -analyze $::poc::myProjectFile +analyze $::poc::projectConfigurationPath +analyze $::poc::localConfigurationPath -include ./common/common.pro -analyze ./xil/./xil.pkg.vhdl +include ./common disabled ./misc/misc_ClockBuffer.vhdl -include ./sync/sync.pro -include ./arith/arith.pro -include ./misc/misc.pro - -analyze ./bus/axi4/AXI4_Common.pkg.vhdl -analyze ./bus/axi4/AXI4_Full.pkg.vhdl -analyze ./bus/axi4/AXI4Stream/AXI4Stream.pkg.vhdl -analyze ./bus/axi4/AXI4Lite/AXI4Lite.pkg.vhdl +include ./sync +include ./arith +include ./misc + +analyze ./bus/axi4/axi4_Common.pkg.vhdl +analyze ./bus/axi4/axi4_Full.pkg.vhdl +analyze ./bus/axi4stream/axi4stream.pkg.vhdl +analyze ./bus/axi4lite/axi4lite.pkg.vhdl analyze ./bus/axi4/axi4.pkg.vhdl -include ./mem/mem.pro -include ./fifo/fifo.pro -include ./xil/xil.pro +include ./mem +include ./fifo +include ./xil -include ./dstruct/dstruct.pro -include ./io/io.pro -include ./bus/bus.pro -include ./comm/comm.pro -include ./sort/sort.pro -include ./cache/cache.pro +include ./dstruct +include ./io +include ./bus +include ./comm +include ./sort +include ./cache -analyze ./list/list_expire.vhdl +analyze ./list/list_Expire.vhdl -include ./net/net.pro -include ./sim/sim.pro +include ./net +include ./sim diff --git a/src/bus/axi4/AXI4Lite/AXI4Lite_FIFO_cdc.vhdl b/src/bus/axi4/AXI4Lite/AXI4Lite_FIFO_cdc.vhdl deleted file mode 100644 index 3e51449e4..000000000 --- a/src/bus/axi4/AXI4Lite/AXI4Lite_FIFO_cdc.vhdl +++ /dev/null @@ -1,250 +0,0 @@ --- ============================================================================= --- Authors: --- Stefan Unrein --- --- Entity: AXI4Lite_FIFO_cdc --- --- Description: --- ------------------------------------- --- A wrapper of fifo_ic_got for AXI4-Lite interface. It creates a separate --- CDC-FIFO for every of the five substreams. --- --- TRANSACTIONS: Defines how many AXI4Lite transactions should be buffered. --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -use work.utils.all; -use work.vectors.all; -use work.components.all; -use work.axi4Lite.all; -use work.axi4_Common.all; - - -entity AXI4Lite_FIFO_cdc is - generic ( - TRANSACTIONS : positive := 2; - DATA_REG : boolean := false; -- Store Data Content in Registers - OUTPUT_REG : boolean := false -- Registered FIFO Output - ); - port ( - -- IN Port - In_Clock : in std_logic; - In_Reset : in std_logic; - In_M2S : in T_AXI4Lite_Bus_M2S; - In_S2M : out T_AXI4Lite_Bus_S2M; - -- OUT Port - Out_Clock : in std_logic; - Out_Reset : in std_logic; - Out_M2S : out T_AXI4Lite_Bus_M2S; - Out_S2M : in T_AXI4Lite_Bus_S2M - ); -end entity; - - -architecture rtl of AXI4Lite_FIFO_cdc is - constant Address_BITS : natural := In_M2S.AWAddr'length; - constant Data_BITS : natural := In_M2S.WData'length; - constant STRB_BITS : natural := In_M2S.WData'length / 8; - constant CACHE_BITS : natural := In_M2S.AWCache'length; - constant PROTECT_BITS : natural := In_M2S.AWProt'length; - constant RESPONSE_BITS : natural := In_S2M.RResp'length; - - constant Addr_POS : natural := 0; - constant Cache_POS : natural := 1; - constant Protect_POS : natural := 2; - constant Data_POS : natural := 0; - constant Strobe_POS : natural := 1; - constant Resp_POS : natural := 1; - constant Addr_BIT_VEC : T_POSVEC := (Addr_POS => Address_BITS, Cache_POS => CACHE_BITS, Protect_POS => PROTECT_BITS); - constant W_BIT_VEC : T_POSVEC := (Data_POS => Data_BITS, Strobe_POS => STRB_BITS); - constant R_BIT_VEC : T_POSVEC := (Data_POS => Data_BITS, Resp_POS => RESPONSE_BITS); - constant B_BIT_VEC : T_POSVEC := (Resp_POS => RESPONSE_BITS); - - constant AW_POS : natural := 0; - constant AR_POS : natural := 1; - constant W_POS : natural := 2; - constant R_POS : natural := 3; - constant B_POS : natural := 4; - - constant BIT_VEC : T_POSVEC := ( - AW_POS => isum(Addr_BIT_VEC), - AR_POS => isum(Addr_BIT_VEC), - W_POS => isum(W_BIT_VEC), - R_POS => isum(R_BIT_VEC), - B_POS => isum(B_BIT_VEC) - ); - - signal In_Ready_vec : std_logic_vector(0 to 4); - signal In_Valid_vec : std_logic_vector(0 to 4); - signal Out_Ready_vec : std_logic_vector(0 to 4); - signal Out_Valid_vec : std_logic_vector(0 to 4); - signal DataFIFO_DataIn : std_logic_vector(isum(BIT_VEC) -1 downto 0); - signal DataFIFO_DataOut : std_logic_vector(isum(BIT_VEC) -1 downto 0); - - - -begin - -----INPUT - In_S2M.AWReady <= In_Ready_vec(AW_POS); - In_S2M.ARReady <= In_Ready_vec(AR_POS); - In_S2M.WReady <= In_Ready_vec(W_POS ); - Out_M2S.RReady <= In_Ready_vec(R_POS ); - Out_M2S.BReady <= In_Ready_vec(B_POS ); - - In_Valid_vec(AW_POS) <= In_M2S.AWValid; - In_Valid_vec(AR_POS) <= In_M2S.ARValid; - In_Valid_vec(W_POS ) <= In_M2S.WValid; - In_Valid_vec(R_POS ) <= Out_S2M.RValid; - In_Valid_vec(B_POS ) <= Out_S2M.BValid; - - -----OUTPUT - Out_Ready_vec(AW_POS) <= Out_S2M.AWReady; - Out_Ready_vec(AR_POS) <= Out_S2M.ARReady; - Out_Ready_vec(W_POS ) <= Out_S2M.WReady ; - Out_Ready_vec(R_POS ) <= In_M2S.RReady; - Out_Ready_vec(B_POS ) <= In_M2S.BReady; - - Out_M2S.AWValid <= Out_Valid_vec(AW_POS); - Out_M2S.ARValid <= Out_Valid_vec(AR_POS); - Out_M2S.WValid <= Out_Valid_vec(W_POS ); - In_S2M.RValid <= Out_Valid_vec(R_POS ); - In_S2M.BValid <= Out_Valid_vec(B_POS ); - - -----INPUT - --AW IN Interface - DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Addr_POS)) - <= In_M2S.AWAddr; - DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Cache_POS)) - <= In_M2S.AWCache; - DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Protect_POS)) - <= In_M2S.AWProt; - --AR IN Interface - DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Addr_POS)) - <= In_M2S.ARAddr; - DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Cache_POS)) - <= In_M2S.ARCache; - DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Protect_POS)) - <= In_M2S.ARProt; - --W IN Interface - DataFIFO_DataIn( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Data_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)) - <= In_M2S.WData; - DataFIFO_DataIn( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Strobe_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)) - <= In_M2S.WStrb; - --R IN Interface - DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Data_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)) - <= Out_S2M.RData; - DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Resp_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)) - <= Out_S2M.RResp; - --B IN Interface - DataFIFO_DataIn( low(BIT_VEC,B_POS) + high(B_BIT_VEC,Resp_POS) downto - low(BIT_VEC,B_POS) + low(B_BIT_VEC,Resp_POS)) - <= Out_S2M.BResp; - - ----OUTPUT - --AW Out Interface - Out_M2S.AWAddr <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Addr_POS)); - Out_M2S.AWCache <= DataFIFO_DataOut(low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Cache_POS)); - Out_M2S.AWProt <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Protect_POS)); - --AR Out Interface - Out_M2S.ARAddr <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Addr_POS)); - Out_M2S.ARCache <= DataFIFO_DataOut(low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Cache_POS)); - Out_M2S.ARProt <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Protect_POS)); - --W Out Interface - Out_M2S.WData <= DataFIFO_DataOut( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Data_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)); - Out_M2S.WStrb <= DataFIFO_DataOut( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Strobe_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)); - --R Out Interface - In_S2M.RData <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Data_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)); - In_S2M.RResp <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Resp_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)); - --B Out Interface - In_S2M.BResp <= DataFIFO_DataOut( low(BIT_VEC,B_POS) + high(B_BIT_VEC,Resp_POS) downto - low(BIT_VEC,B_POS) + low(B_BIT_VEC,Resp_POS)); - - - gen : for i in 0 to 4 generate - signal DataFIFO_put : std_logic; - signal DataFIFO_DataIn_i : std_logic_vector(BIT_VEC(i) -1 downto 0); - signal DataFIFO_DataOut_i : std_logic_vector(BIT_VEC(i) -1 downto 0); - signal DataFIFO_Full : std_logic; - signal DataFIFO_got : std_logic; - signal DataFIFO_Valid : std_logic; - begin - - DataFIFO_put <= In_Valid_vec(i) and not DataFIFO_Full; - In_Ready_vec(i) <= not DataFIFO_Full; - DataFIFO_DataIn_i <= DataFIFO_DataIn(high(BIT_VEC,i) downto low(BIT_VEC,i)); - - DataFIFO_DataOut(high(BIT_VEC,i) downto low(BIT_VEC,i)) <= DataFIFO_DataOut_i; - DataFIFO_got <= Out_Ready_vec(i); - Out_Valid_vec(i) <= DataFIFO_Valid; - - DataFifo : entity work.fifo_ic_got - generic map ( - D_BITS => BIT_VEC(i), - MIN_DEPTH => TRANSACTIONS, - DATA_REG => DATA_REG, - OUTPUT_REG => OUTPUT_REG, - ESTATE_WR_BITS => 0, - FSTATE_RD_BITS => 0 - ) - port map ( - -- Writing Interface - clk_wr => ite(i<3,In_Clock,Out_Clock), - rst_wr => ite(i<3,In_Reset,Out_Reset), - put => DataFIFO_put, - din => DataFIFO_DataIn_i, - full => DataFIFO_Full, - estate_wr => open, - - -- Reading Interface - clk_rd => ite(i<3,Out_Clock,In_Clock), - rst_rd => ite(i<3,Out_Reset,In_Reset), - got => DataFIFO_got, - dout => DataFIFO_DataOut_i, - valid => DataFIFO_Valid, - fstate_rd => open - ); - - - end generate; - - -end architecture; diff --git a/src/bus/axi4/AXI4_FIFO_cdc.vhdl b/src/bus/axi4/AXI4_FIFO_cdc.vhdl deleted file mode 100644 index 7c6839ebf..000000000 --- a/src/bus/axi4/AXI4_FIFO_cdc.vhdl +++ /dev/null @@ -1,392 +0,0 @@ --- ============================================================================= --- Authors: Stefan Unrein --- --- Entity: AXI4_FIFO_cdc --- --- Description: --- ------------------------------------- --- A wrapper of fifo_ic_got for AXI4-MM interface. It creates a separate --- CDC-FIFO for every of the five substreams. The size of the data-channels is --- FRAMES * FRAMES_DEPTH, the size of the control-channels is FRAMES. --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -use work.utils.all; -use work.vectors.all; -use work.components.all; -use work.axi4_Full.all; -use work.axi4_Common.all; - - -entity AXI4_FIFO_cdc is - generic ( - FRAMES : positive := 2; - FRAME_DEPTH : positive := 1; - DATA_REG : boolean := false; -- Store Data Content in Registers - OUTPUT_REG : boolean := false -- Registered FIFO Output - ); - port ( - -- IN Port - In_Clock : in std_logic; - In_Reset : in std_logic; - In_M2S : in T_AXI4_Bus_M2S; - In_S2M : out T_AXI4_Bus_S2M; - -- OUT Port - Out_Clock : in std_logic; - Out_Reset : in std_logic; - Out_M2S : out T_AXI4_Bus_M2S; - Out_S2M : in T_AXI4_Bus_S2M - ); -end entity; - - -architecture rtl of AXI4_FIFO_cdc is - constant LOCK_BITS : natural := 1; - constant LAST_BITS : natural := 1; - - constant ID_POS : natural := 0; - constant User_POS : natural := 1; - constant Addr_POS : natural := 2; - constant Cache_POS : natural := 3; - constant Protect_POS : natural := 4; - constant Len_POS : natural := 5; - constant Size_POS : natural := 6; - constant Burst_POS : natural := 7; - constant Lock_POS : natural := 8; - constant QoS_POS : natural := 9; - constant Region_POS : natural := 10; - - --Data-Only - constant Data_POS : natural := 3; - constant Last_POS : natural := 4; - --Write-Only - constant Strobe_POS : natural := 2; - --Ready/Write-Response-Only - constant Resp_POS : natural := 2; - - constant W_Addr_BIT_VEC : T_POSVEC := ( ID_POS => In_M2S.AWID'length, User_POS => In_M2S.AWUser'length, Addr_POS => In_M2S.AWAddr'length, - Cache_POS => In_M2S.AWCache'length, Protect_POS => In_M2S.AWProt'length, Len_POS => In_M2S.AWLen'length, - Size_POS => In_M2S.AWSize'length, Burst_POS => In_M2S.AWBurst'length, Lock_POS => LOCK_BITS, - QoS_POS => In_M2S.AWQoS'length, Region_POS => In_M2S.AWRegion'length - ); - constant R_Addr_BIT_VEC : T_POSVEC := ( ID_POS => In_M2S.ARID'length, User_POS => In_M2S.ARUser'length, Addr_POS => In_M2S.ARAddr'length, - Cache_POS => In_M2S.ARCache'length, Protect_POS => In_M2S.ARProt'length, Len_POS => In_M2S.ARLen'length, - Size_POS => In_M2S.ARSize'length, Burst_POS => In_M2S.ARBurst'length, Lock_POS => LOCK_BITS, - QoS_POS => In_M2S.ARQoS'length, Region_POS => In_M2S.ARRegion'length - ); - constant W_BIT_VEC : T_POSVEC := (User_POS => In_M2S.WUser'length, Strobe_POS => In_M2S.WStrb'length, Data_POS => In_M2S.WData'length, - Last_POS => LAST_BITS - ); - constant R_BIT_VEC : T_POSVEC := (ID_POS => In_S2M.RID'length, User_POS => In_S2M.RUser'length, Resp_POS => In_S2M.RResp'length, - Data_POS => In_S2M.RData'length, Last_POS => LAST_BITS - ); - constant B_BIT_VEC : T_POSVEC := (ID_POS => In_S2M.BID'length, User_POS => In_S2M.BUser'length, Resp_POS => In_S2M.BResp'length); - - constant AW_POS : natural := 0; - constant AR_POS : natural := 1; - constant W_POS : natural := 2; - constant R_POS : natural := 3; - constant B_POS : natural := 4; - - constant BIT_VEC : T_POSVEC := ( - AW_POS => isum(W_Addr_BIT_VEC), - AR_POS => isum(R_Addr_BIT_VEC), - W_POS => isum(W_BIT_VEC), - R_POS => isum(R_BIT_VEC), - B_POS => isum(B_BIT_VEC) - ); - - constant MIN_DEPTH : T_POSVEC := ( - AW_POS => FRAMES, - AR_POS => FRAMES, - W_POS => FRAMES * FRAME_DEPTH, - R_POS => FRAMES * FRAME_DEPTH, - B_POS => FRAMES - ); - - signal In_Ready_vec : std_logic_vector(0 to 4); - signal In_Valid_vec : std_logic_vector(0 to 4); - signal Out_Ready_vec : std_logic_vector(0 to 4); - signal Out_Valid_vec : std_logic_vector(0 to 4); - signal DataFIFO_DataIn : std_logic_vector(isum(BIT_VEC) -1 downto 0); - signal DataFIFO_DataOut : std_logic_vector(isum(BIT_VEC) -1 downto 0); - - - -begin - -----INPUT - In_S2M.AWReady <= In_Ready_vec(AW_POS); - In_S2M.ARReady <= In_Ready_vec(AR_POS); - In_S2M.WReady <= In_Ready_vec(W_POS ); - Out_M2S.RReady <= In_Ready_vec(R_POS ); - Out_M2S.BReady <= In_Ready_vec(B_POS ); - - In_Valid_vec(AW_POS) <= In_M2S.AWValid; - In_Valid_vec(AR_POS) <= In_M2S.ARValid; - In_Valid_vec(W_POS ) <= In_M2S.WValid; - In_Valid_vec(R_POS ) <= Out_S2M.RValid; - In_Valid_vec(B_POS ) <= Out_S2M.BValid; - - -----OUTPUT - Out_Ready_vec(AW_POS) <= Out_S2M.AWReady; - Out_Ready_vec(AR_POS) <= Out_S2M.ARReady; - Out_Ready_vec(W_POS ) <= Out_S2M.WReady ; - Out_Ready_vec(R_POS ) <= In_M2S.RReady; - Out_Ready_vec(B_POS ) <= In_M2S.BReady; - - Out_M2S.AWValid <= Out_Valid_vec(AW_POS); - Out_M2S.ARValid <= Out_Valid_vec(AR_POS); - Out_M2S.WValid <= Out_Valid_vec(W_POS ); - In_S2M.RValid <= Out_Valid_vec(R_POS ); - In_S2M.BValid <= Out_Valid_vec(B_POS ); - - -----INPUT - --AW IN Interface - DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Addr_POS)) - <= In_M2S.AWAddr; - DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Cache_POS)) - <= In_M2S.AWCache; - DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Protect_POS)) - <= In_M2S.AWProt; - DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,ID_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,ID_POS)) - <= In_M2S.AWID; - DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Len_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Len_POS)) - <= In_M2S.AWLen; - DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Size_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Size_POS)) - <= In_M2S.AWSize; - DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Burst_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Burst_POS)) - <= In_M2S.AWBurst; - DataFIFO_DataIn( low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Lock_POS)) - <= In_M2S.AWLock(0); - - DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,QoS_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,QoS_POS)) - <= In_M2S.AWQoS; - DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Region_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Region_POS)) - <= In_M2S.AWRegion; - DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,User_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,User_POS)) - <= In_M2S.AWUser; - --AR IN Interface - DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Addr_POS)) - <= In_M2S.ARAddr; - DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Cache_POS)) - <= In_M2S.ARCache; - DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Protect_POS)) - <= In_M2S.ARProt; - DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,ID_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,ID_POS)) - <= In_M2S.ARID; - DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Len_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Len_POS)) - <= In_M2S.ARLen; - DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Size_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Size_POS)) - <= In_M2S.ARSize; - DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Burst_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Burst_POS)) - <= In_M2S.ARBurst; - DataFIFO_DataIn( low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Lock_POS)) - <= In_M2S.ARLock(0); - - DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,QoS_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,QoS_POS)) - <= In_M2S.ARQoS; - DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Region_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Region_POS)) - <= In_M2S.ARRegion; - DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,User_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,User_POS)) - <= In_M2S.ARUser; - --W IN Interface - DataFIFO_DataIn( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Data_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)) - <= In_M2S.WData; - DataFIFO_DataIn( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Strobe_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)) - <= In_M2S.WStrb; - DataFIFO_DataIn( low(BIT_VEC,W_POS) + high(W_BIT_VEC,User_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,User_POS)) - <= In_M2S.WUser; - DataFIFO_DataIn( low(BIT_VEC,W_POS) + low(W_BIT_VEC,Last_POS)) - <= In_M2S.WLast; - --R IN Interface - DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Data_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)) - <= Out_S2M.RData; - DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Resp_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)) - <= Out_S2M.RResp; - DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,ID_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,ID_POS)) - <= Out_S2M.RID; - DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,User_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,User_POS)) - <= Out_S2M.RUser; - DataFIFO_DataIn( low(BIT_VEC,R_POS) + low(R_BIT_VEC,Last_POS)) - <= Out_S2M.RLast; - --B IN Interface - DataFIFO_DataIn( low(BIT_VEC,B_POS) + high(R_BIT_VEC,Resp_POS) downto - low(BIT_VEC,B_POS) + low(R_BIT_VEC,Resp_POS)) - <= Out_S2M.BResp; - DataFIFO_DataIn( low(BIT_VEC,B_POS) + high(R_BIT_VEC,ID_POS) downto - low(BIT_VEC,B_POS) + low(R_BIT_VEC,ID_POS)) - <= Out_S2M.BID; - DataFIFO_DataIn( low(BIT_VEC,B_POS) + high(R_BIT_VEC,User_POS) downto - low(BIT_VEC,B_POS) + low(R_BIT_VEC,User_POS)) - <= Out_S2M.BUser; - - ----OUTPUT - --AW Out Interface - Out_M2S.AWAddr <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Addr_POS)); - Out_M2S.AWCache <= DataFIFO_DataOut(low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Cache_POS)); - Out_M2S.AWProt <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Protect_POS)); - Out_M2S.AWID <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,ID_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,ID_POS)); - Out_M2S.AWLen <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Len_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Len_POS)); - Out_M2S.AWSize <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Size_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Size_POS)); - Out_M2S.AWBurst <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Burst_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Burst_POS)); - Out_M2S.AWLock(0) <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Lock_POS)); - - Out_M2S.AWQoS <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,QoS_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,QoS_POS)); - Out_M2S.AWRegion <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Region_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Region_POS)); - Out_M2S.AWUser <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,User_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,User_POS)); - --AR Out Interface - Out_M2S.ARAddr <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Addr_POS)); - Out_M2S.ARCache <= DataFIFO_DataOut(low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Cache_POS)); - Out_M2S.ARProt <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Protect_POS)); - Out_M2S.ARID <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,ID_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,ID_POS)); - Out_M2S.ARLen <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Len_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Len_POS)); - Out_M2S.ARSize <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Size_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Size_POS)); - Out_M2S.ARBurst <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Burst_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Burst_POS)); - Out_M2S.ARLock(0) <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Lock_POS)); - - Out_M2S.ARQoS <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,QoS_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,QoS_POS)); - Out_M2S.ARRegion <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Region_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Region_POS)); - Out_M2S.ARUser <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,User_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,User_POS)); - --W Out Interface - Out_M2S.WData <= DataFIFO_DataOut( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Data_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)); - Out_M2S.WStrb <= DataFIFO_DataOut( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Strobe_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)); - Out_M2S.WUser <= DataFIFO_DataOut( low(BIT_VEC,W_POS) + high(W_BIT_VEC,User_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,User_POS)); - Out_M2S.WLast <= DataFIFO_DataOut( low(BIT_VEC,W_POS) + low(W_BIT_VEC,Last_POS)); - - --R Out Interface - In_S2M.RData <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Data_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)); - In_S2M.RResp <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Resp_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)); - In_S2M.RUser <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,User_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,User_POS)); - In_S2M.RLast <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + low(R_BIT_VEC,Last_POS)); - - In_S2M.RID <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,ID_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,ID_POS)); - --B Out Interface - In_S2M.BResp <= DataFIFO_DataOut( low(BIT_VEC,B_POS) + high(R_BIT_VEC,Resp_POS) downto - low(BIT_VEC,B_POS) + low(R_BIT_VEC,Resp_POS)); - In_S2M.BUser <= DataFIFO_DataOut( low(BIT_VEC,B_POS) + high(R_BIT_VEC,User_POS) downto - low(BIT_VEC,B_POS) + low(R_BIT_VEC,User_POS)); - In_S2M.BID <= DataFIFO_DataOut( low(BIT_VEC,B_POS) + high(R_BIT_VEC,ID_POS) downto - low(BIT_VEC,B_POS) + low(R_BIT_VEC,ID_POS)); - - - gen : for i in 0 to 4 generate - signal DataFIFO_put : std_logic; - signal DataFIFO_DataIn_i : std_logic_vector(BIT_VEC(i) -1 downto 0); - signal DataFIFO_DataOut_i : std_logic_vector(BIT_VEC(i) -1 downto 0); - signal DataFIFO_Full : std_logic; - signal DataFIFO_got : std_logic; - signal DataFIFO_Valid : std_logic; - begin - - DataFIFO_put <= In_Valid_vec(i) and not DataFIFO_Full; - In_Ready_vec(i) <= not DataFIFO_Full; - DataFIFO_DataIn_i <= DataFIFO_DataIn(high(BIT_VEC,i) downto low(BIT_VEC,i)); - - DataFIFO_DataOut(high(BIT_VEC,i) downto low(BIT_VEC,i)) <= DataFIFO_DataOut_i; - DataFIFO_got <= Out_Ready_vec(i); - Out_Valid_vec(i) <= DataFIFO_Valid; - - DataFifo : entity work.fifo_ic_got - generic map ( - D_BITS => BIT_VEC(i), -- Data Width - MIN_DEPTH => MIN_DEPTH(i), -- Minimum FIFO Depth - DATA_REG => DATA_REG, -- Store Data Content in Registers - OUTPUT_REG => OUTPUT_REG, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits - ) - port map ( - -- Writing Interface - clk_wr => ite(i<3,In_Clock,Out_Clock), - rst_wr => ite(i<3,In_Reset,Out_Reset), - put => DataFIFO_put, - din => DataFIFO_DataIn_i, - full => DataFIFO_Full, - estate_wr => open, - - -- Reading Interface - clk_rd => ite(i<3,Out_Clock,In_Clock), - rst_rd => ite(i<3,Out_Reset,In_Reset), - got => DataFIFO_got, - dout => DataFIFO_DataOut_i, - valid => DataFIFO_Valid, - fstate_rd => open - ); - - end generate; - - -end architecture; diff --git a/src/bus/axi4/axi4.pkg.vhdl b/src/bus/axi4/axi4.pkg.vhdl index ca4865762..f37233f5f 100644 --- a/src/bus/axi4/axi4.pkg.vhdl +++ b/src/bus/axi4/axi4.pkg.vhdl @@ -35,15 +35,15 @@ use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use work.utils.all; -use work.AXI4_Common.all; -use work.AXI4Stream.all; -use work.AXI4Lite.all; -use work.AXI4_Full.all; +use work.axi4_Common.all; +use work.axi4stream.all; +use work.axi4lite.all; +use work.axi4_Full.all; -package AXI4 is - --ATTENTION::Whe using this function, keep in mind that return id is always zero! +package axi4 is + --ATTENTION::When using this function, keep in mind that return id is always zero! -- Use only when connected AXI4Full is not using ID! - -- If ID is needed, use Moduel "AXI4_to_AXI4Lite" + -- If ID is needed, use Module "axi4_AXI4Lite_Converter" function to_AXI4LITE_BUS(full : T_AXI4_BUS_M2S; databit : natural := 0) return T_AXI4LITE_BUS_M2S; function to_AXI4LITE_BUS(full : T_AXI4_BUS_S2M; databit : natural := 0) return T_AXI4LITE_BUS_S2M; @@ -51,45 +51,45 @@ package AXI4 is function to_AXI4_BUS(lite : T_AXI4LITE_BUS_S2M; databit : natural := 0; id_bits : positive := 1; user_bits : positive := 1) return T_AXI4_BUS_S2M; -- AXI4 common types and constants - alias T_AXI4_Response is work.AXI4_Common.T_AXI4_Response; - alias C_AXI4_RESPONSE_OKAY is work.AXI4_Common.C_AXI4_RESPONSE_OKAY; - alias C_AXI4_RESPONSE_EX_OKAY is work.AXI4_Common.C_AXI4_RESPONSE_EX_OKAY; - alias C_AXI4_RESPONSE_SLAVE_ERROR is work.AXI4_Common.C_AXI4_RESPONSE_SLAVE_ERROR; - alias C_AXI4_RESPONSE_DECODE_ERROR is work.AXI4_Common.C_AXI4_RESPONSE_DECODE_ERROR; - alias C_AXI4_RESPONSE_INIT is work.AXI4_Common.C_AXI4_RESPONSE_INIT; + alias T_AXI4_Response is work.axi4_Common.T_AXI4_Response; + alias C_AXI4_RESPONSE_OKAY is work.axi4_Common.C_AXI4_RESPONSE_OKAY; + alias C_AXI4_RESPONSE_EX_OKAY is work.axi4_Common.C_AXI4_RESPONSE_EX_OKAY; + alias C_AXI4_RESPONSE_SLAVE_ERROR is work.axi4_Common.C_AXI4_RESPONSE_SLAVE_ERROR; + alias C_AXI4_RESPONSE_DECODE_ERROR is work.axi4_Common.C_AXI4_RESPONSE_DECODE_ERROR; + alias C_AXI4_RESPONSE_INIT is work.axi4_Common.C_AXI4_RESPONSE_INIT; - alias T_AXI4_Cache is work.AXI4_Common.T_AXI4_Cache; - alias C_AXI4_CACHE_INIT is work.AXI4_Common.C_AXI4_CACHE_INIT; - alias C_AXI4_CACHE is work.AXI4_Common.C_AXI4_CACHE; + alias T_AXI4_Cache is work.axi4_Common.T_AXI4_Cache; + alias C_AXI4_CACHE_INIT is work.axi4_Common.C_AXI4_CACHE_INIT; + alias C_AXI4_CACHE is work.axi4_Common.C_AXI4_CACHE; - alias T_AXI4_QoS is work.AXI4_Common.T_AXI4_QoS; - alias C_AXI4_QOS_INIT is work.AXI4_Common.C_AXI4_QOS_INIT; + alias T_AXI4_QoS is work.axi4_Common.T_AXI4_QoS; + alias C_AXI4_QOS_INIT is work.axi4_Common.C_AXI4_QOS_INIT; - alias T_AXI4_Region is work.AXI4_Common.T_AXI4_Region; - alias C_AXI4_REGION_INIT is work.AXI4_Common.C_AXI4_REGION_INIT; + alias T_AXI4_Region is work.axi4_Common.T_AXI4_Region; + alias C_AXI4_REGION_INIT is work.axi4_Common.C_AXI4_REGION_INIT; - alias T_AXI4_Size is work.AXI4_Common.T_AXI4_Size; - alias C_AXI4_SIZE_1 is work.AXI4_Common.C_AXI4_SIZE_1; - alias C_AXI4_SIZE_2 is work.AXI4_Common.C_AXI4_SIZE_2; - alias C_AXI4_SIZE_4 is work.AXI4_Common.C_AXI4_SIZE_4; - alias C_AXI4_SIZE_8 is work.AXI4_Common.C_AXI4_SIZE_8; - alias C_AXI4_SIZE_16 is work.AXI4_Common.C_AXI4_SIZE_16; - alias C_AXI4_SIZE_32 is work.AXI4_Common.C_AXI4_SIZE_32; - alias C_AXI4_SIZE_64 is work.AXI4_Common.C_AXI4_SIZE_64; - alias C_AXI4_SIZE_128 is work.AXI4_Common.C_AXI4_SIZE_128; - alias C_AXI4_SIZE_INIT is work.AXI4_Common.C_AXI4_SIZE_INIT; + alias T_AXI4_Size is work.axi4_Common.T_AXI4_Size; + alias C_AXI4_SIZE_1 is work.axi4_Common.C_AXI4_SIZE_1; + alias C_AXI4_SIZE_2 is work.axi4_Common.C_AXI4_SIZE_2; + alias C_AXI4_SIZE_4 is work.axi4_Common.C_AXI4_SIZE_4; + alias C_AXI4_SIZE_8 is work.axi4_Common.C_AXI4_SIZE_8; + alias C_AXI4_SIZE_16 is work.axi4_Common.C_AXI4_SIZE_16; + alias C_AXI4_SIZE_32 is work.axi4_Common.C_AXI4_SIZE_32; + alias C_AXI4_SIZE_64 is work.axi4_Common.C_AXI4_SIZE_64; + alias C_AXI4_SIZE_128 is work.axi4_Common.C_AXI4_SIZE_128; + alias C_AXI4_SIZE_INIT is work.axi4_Common.C_AXI4_SIZE_INIT; - alias T_AXI4_Burst is work.AXI4_Common.T_AXI4_Burst; - alias C_AXI4_BURST_FIXED is work.AXI4_Common.C_AXI4_BURST_FIXED; - alias C_AXI4_BURST_INCR is work.AXI4_Common.C_AXI4_BURST_INCR; - alias C_AXI4_BURST_WRAP is work.AXI4_Common.C_AXI4_BURST_WRAP; - alias C_AXI4_BURST_INIT is work.AXI4_Common.C_AXI4_BURST_INIT; + alias T_AXI4_Burst is work.axi4_Common.T_AXI4_Burst; + alias C_AXI4_BURST_FIXED is work.axi4_Common.C_AXI4_BURST_FIXED; + alias C_AXI4_BURST_INCR is work.axi4_Common.C_AXI4_BURST_INCR; + alias C_AXI4_BURST_WRAP is work.axi4_Common.C_AXI4_BURST_WRAP; + alias C_AXI4_BURST_INIT is work.axi4_Common.C_AXI4_BURST_INIT; - alias T_AXI4_Protect is work.AXI4_Common.T_AXI4_Protect; - alias C_AXI4_PROTECT_INIT is work.AXI4_Common.C_AXI4_PROTECT_INIT; - alias C_AXI4_PROTECT is work.AXI4_Common.C_AXI4_PROTECT; + alias T_AXI4_Protect is work.axi4_Common.T_AXI4_Protect; + alias C_AXI4_PROTECT_INIT is work.axi4_Common.C_AXI4_PROTECT_INIT; + alias C_AXI4_PROTECT is work.axi4_Common.C_AXI4_PROTECT; end package; -package body AXI4 is +package body axi4 is function to_AXI4LITE_BUS(full : T_AXI4_BUS_M2S; databit : natural := 0) return T_AXI4LITE_BUS_M2S is constant addrbit : natural := full.AWAddr'length; diff --git a/src/bus/axi4/axi4.pro b/src/bus/axi4/axi4.pro deleted file mode 100644 index 0a904e906..000000000 --- a/src/bus/axi4/axi4.pro +++ /dev/null @@ -1,93 +0,0 @@ -# ============================================================================= -# Authors: -# Adrian Weiland -# Stefan Unrein -# -# License: -# ============================================================================= -# Copyright 2025-2026 The PoC-Library Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================= - -#Packages included on main PoC.pro -#analyze AXI4_Common.pkg.vhdl -#analyze AXI4_Full.pkg.vhdl -#analyze ./AXI4Stream/AXI4Stream.pkg.vhdl -#analyze ./AXI4Lite/AXI4Lite.pkg.vhdl -#analyze axi4.pkg.vhdl - -disabled AXI4_Address_Data_Aligner.vhdl -disabled AXI4_Address_Translate.vhdl -disabled AXI4_Address_Translate_n_Filter.vhdl -disabled AXI4_Data_Swapper.vhdl -analyze AXI4_FIFO.vhdl -analyze AXI4_FIFO_cdc.vhdl -disabled AXI4_DeMux.vhdl -disabled AXI4_Mux.vhdl -disabled AXI4_Packet_FIFO.vhdl -disabled AXI4_Sink_Slave.vhdl -analyze AXI4_Termination_Manager.vhdl -analyze AXI4_Termination_Subordinate.vhdl -analyze AXI4_to_AXI4Lite.vhdl - -analyze AXI4_OSVVM.pkg.vhdl - -disabled ./AXI4Lite/AXI4Lite_AddressMask.vhdl -disabled ./AXI4Lite/AXI4Lite_AddressTruncate.vhdl -disabled ./AXI4Lite/AXI4Lite_Writer.vhdl -disabled ./AXI4Lite/AXI4Lite_Reader.vhdl -# analyze ./AXI4Lite/AXI4Lite_Configurator.vhdl ; # Does not work right now -disabled ./AXI4Lite/AXI4Lite_DeMux.vhdl -disabled ./AXI4Lite/AXI4Lite_ErrorFilter.vhdl -analyze ./AXI4Lite/AXI4Lite_FIFO.vhdl -analyze ./AXI4Lite/AXI4Lite_FIFO_cdc.vhdl -analyze ./AXI4Lite/AXI4Lite_Register.vhdl -disabled ./AXI4Lite/AXI4Lite_Register_split.vhdl -analyze ./AXI4Lite/AXI4Lite_Termination_Manager.vhdl -analyze ./AXI4Lite/AXI4Lite_Termination_Subordinate.vhdl -analyze ./AXI4Lite/AXI4Lite_HighResolutionClock.vhdl -# analyze ./AXI4Lite/AXI4Lite_Interrupt_Controller.vhdl ; # Does not work right now -analyze ./AXI4Lite/AXI4Lite_OCRAM_Adapter.vhdl -analyze ./AXI4Lite/AXI4Lite_OSVVM.pkg.vhdl -analyze ./AXI4Lite/AXI4Lite_GitVersionRegister.vhdl -disabled ./AXI4Lite/AXI4Lite_SimpleInterface.vhdl -analyze ./AXI4Lite/AXI4Lite_UART.vhdl - -analyze ./AXI4Stream/AXI4Stream_FIFO.vhdl -analyze ./AXI4Stream/AXI4Stream_FIFO_cdc.vhdl -analyze ./AXI4Stream/AXI4Stream_FIFO_tempgot.vhdl -analyze ./AXI4Stream/AXI4Stream_FIFO_tempput.vhdl -analyze ./AXI4Stream/AXI4Stream_Stage.vhdl -disabled ./AXI4Stream/AXI4Stream_Mirror.vhdl -analyze ./AXI4Stream/AXI4Stream_Mux.vhdl -disabled ./AXI4Stream/AXI4Stream_Pause.vhdl -analyze ./AXI4Stream/AXI4Stream_DeMux.vhdl -disabled ./AXI4Stream/AXI4Stream_DataExtractor.vhdl -disabled ./AXI4Stream/AXI4Stream_PatternFinder.vhdl -disabled ./AXI4Stream/AXI4Stream_FieldReplacer.vhd -disabled ./AXI4Stream/AXI4Stream_Crossbar.vhdl ; # Does not work right now due to Riviera compiler error (bug report is pending) -# analyze ./AXI4Stream/AXI4Stream_Frame_Buffer.vhdl ; #Does not work right now -disabled ./AXI4Stream/AXI4Stream_PRBSGenerator.vhdl -disabled ./AXI4Stream/AXI4Stream_Termination_Manager.vhdl -disabled ./AXI4Stream/AXI4Stream_Termination_Subordinate.vhdl -disabled ./AXI4Stream/AXI4Stream_Buffer_no_backpressure.vhdl -disabled ./AXI4Stream/AXI4Stream_To_Stream.vhdl -disabled ./AXI4Stream/AXI4Stream_Splitter.vhdl -disabled ./AXI4Stream/AXI4Stream_Delay.vhdl -disabled ./AXI4Stream/AXI4Stream_Realign.vhdl - -# FIXME: should be analyzed before PoC.bus, right? -analyze ../../misc/gearbox/gearbox_down_cc.vhdl -analyze ../../misc/gearbox/gearbox_up_cc.vhdl -disabled ./AXI4Stream/AXI4Stream_Gearbox.vhdl diff --git a/src/bus/axi4/AXI4_to_AXI4Lite.vhdl b/src/bus/axi4/axi4_AXI4Lite_Converter.vhdl similarity index 74% rename from src/bus/axi4/AXI4_to_AXI4Lite.vhdl rename to src/bus/axi4/axi4_AXI4Lite_Converter.vhdl index faabfc469..d1cac22d2 100644 --- a/src/bus/axi4/AXI4_to_AXI4Lite.vhdl +++ b/src/bus/axi4/axi4_AXI4Lite_Converter.vhdl @@ -2,7 +2,7 @@ -- Authors: -- Stefan Unrein -- --- Entity: AXI4_to_AXI4Lite +-- Entity: axi4_AXI4Lite_Converter -- -- License: -- ============================================================================= @@ -22,17 +22,17 @@ -- ============================================================================= library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -use work.utils.all; -use work.vectors.all; -use work.components.all; -use work.axi4_Full.all; -use work.axi4Lite.all; +use work.utils.all; +use work.vectors.all; +use work.components.all; +use work.axi4_Full.all; +use work.axi4lite.all; -entity AXI4_to_AXI4Lite is +entity axi4_AXI4Lite_Converter is generic ( RESPONSE_FIFO_DEPTH : positive := 16 --Using SRL16E, depth is maximum 16 ); @@ -49,7 +49,7 @@ entity AXI4_to_AXI4Lite is end entity; -architecture rtl of AXI4_to_AXI4Lite is +architecture rtl of axi4_AXI4Lite_Converter is signal Response_B_fifo_ful : std_logic; signal Response_R_fifo_ful : std_logic; begin @@ -82,46 +82,46 @@ begin In_S2M.BUser <= (others => '0'); In_S2M.RUser <= (others => '0'); - Response_R_fifo : entity work.fifo_shift + Response_R_fifo : entity work.fifo_Shift generic map( - D_BITS => In_M2S.AWID'length, + DATA_BITS => In_M2S.AWID'length, MIN_DEPTH => RESPONSE_FIFO_DEPTH ) port map( -- Global Control - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Writing Interface - put => In_M2S.ARValid and Out_S2M.ARReady and not Response_R_fifo_ful, - din => In_M2S.ARID, - ful => Response_R_fifo_ful, + Put => In_M2S.ARValid and Out_S2M.ARReady and not Response_R_fifo_ful, + DataIn => In_M2S.ARID, + Full => Response_R_fifo_ful, -- Reading Interface - got => Out_S2M.RValid and In_M2S.RReady, - dout => In_S2M.RID, - vld => open + Got => Out_S2M.RValid and In_M2S.RReady, + DataOut => In_S2M.RID, + Valid => open ); - Response_B_fifo : entity work.fifo_shift + Response_B_fifo : entity work.fifo_Shift generic map( - D_BITS => In_M2S.AWID'length, + DATA_BITS => In_M2S.AWID'length, MIN_DEPTH => RESPONSE_FIFO_DEPTH ) port map( -- Global Control - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Writing Interface - put => In_M2S.AWValid and Out_S2M.AWReady and not Response_B_fifo_ful, - din => In_M2S.AWID, - ful => Response_B_fifo_ful, + Put => In_M2S.AWValid and Out_S2M.AWReady and not Response_B_fifo_ful, + DataIn => In_M2S.AWID, + Full => Response_B_fifo_ful, -- Reading Interface - got => Out_S2M.BValid and In_M2S.BReady, - dout => In_S2M.BID, - vld => open + Got => Out_S2M.BValid and In_M2S.BReady, + DataOut => In_S2M.BID, + Valid => open ); diff --git a/src/bus/axi4/AXI4_Common.pkg.vhdl b/src/bus/axi4/axi4_Common.pkg.vhdl similarity index 99% rename from src/bus/axi4/AXI4_Common.pkg.vhdl rename to src/bus/axi4/axi4_Common.pkg.vhdl index b97ddbd5c..dabecea2b 100644 --- a/src/bus/axi4/AXI4_Common.pkg.vhdl +++ b/src/bus/axi4/axi4_Common.pkg.vhdl @@ -30,7 +30,7 @@ library IEEE; use IEEE.std_logic_1164.all; -package AXI4_Common is +package axi4_Common is subtype T_AXI4_Response is std_logic_vector(1 downto 0); constant C_AXI4_RESPONSE_OKAY : T_AXI4_Response := "00"; constant C_AXI4_RESPONSE_EX_OKAY : T_AXI4_Response := "01"; diff --git a/src/bus/axi4/axi4_DeMux.vhdl b/src/bus/axi4/axi4_DeMux.vhdl new file mode 100644 index 000000000..03b446c29 --- /dev/null +++ b/src/bus/axi4/axi4_DeMux.vhdl @@ -0,0 +1,738 @@ +-- ============================================================================= +-- Authors: Stefan Unrein +-- +-- Entity: AXI4 De-Multiplexer +-- +-- Description: +-- ------------------------------------- +-- This module provides a demultiplexing functionality for AXI4 busses. +-- Based on the provided address on write or read channels, the packets are +-- forwarded to the matching output interface. The address of the connected +-- subordinates is defined by the BASE_ADDRESS and the corresponding +-- BASE_ADDRESS_MASK. Every transaction not matching any outputs is internally +-- discarted and a decode-error response is generated. +-- Note that this module terminates ID's on the input and genrates new ID's for +-- every output-port. On response reception, the response is forwarded with the +-- original ID to the manager. The number of read and write ID's is defined by +-- NUM_OUTSTANDING_READS and NUM_OUTSTANDING_WRITES, where the ID's from +-- 0 to NUM_OUTSTANDING_* -1 are generated. Every subordinate must support the +-- given number of ID's to work. Leave NUM_OUTSTANDING_* at init value 0 to +-- generate ID's of the full ID-width (2**ID-width). +-- PIPELINE_IN and PIPELINE_OUT provide the settings for input and ouput +-- pipelining stages as a timing relaxantion setting. +-- +-- Example configuration: +-- 3 Subordinates with 512kB each, starting at 0x0008_0000 +-- BASE_ADDRESS => (0 => 32x"x0008_0000", 1 => 32x"x0009_0000", 2 => 32x"x000A_0000") +-- BASE_ADDRESS_MASK => (0 to 2 => 32x"x0007_FFFF") +-- +-- Utilization compared to Xilinx Crossbar (2.1) 1 Slave => 4 Master (32 Addr/Data) +-- | LUT | FF | Comment | +-- | ---- | ---- | ---------------------- | +-- | 294 | 520 | Xilinx Crosbar ( 2 IDs)| +-- | 320 | 540 | Xilinx Crosbar (16 IDs)| +-- | 258 | 62 | 0 Glue ( 2 IDs)| +-- | 823 | 199 | 0 Glue (16 IDs)| +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.utils.all; +use work.vectors.all; +use work.components.all; +use work.axi4_Full.all; +use work.axi4stream.all; + + +entity axi4_DeMux is + generic( + BASE_ADDRESS : T_SLUV; + BASE_ADDRESS_MASK : BASE_ADDRESS'subtype; + PIPELINE_IN : natural := 0; + PIPELINE_OUT : natural_vector(BASE_ADDRESS'range) := (others => 0); + NUM_OUTSTANDING_READS : natural := 0; -- if zero, use full ID width (2**ID) + NUM_OUTSTANDING_WRITES : natural := 0 -- if zero, use full ID width (2**ID) + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + -- IN Port + In_M2S : in T_AXI4_Bus_M2S; + In_S2M : out T_AXI4_Bus_S2M; + -- OUT Port + Out_M2S : out T_AXI4_Bus_M2S_VECTOR; + Out_S2M : in T_AXI4_Bus_S2M_VECTOR + ); +end entity; + + +architecture rtl of axi4_DeMux is + constant RESPONSE_FIFO_DEPTH : positive := 16; --Using SRL16E, depth is maximum 16 + + constant PORTS : positive := Out_M2S'length; + constant PORT_BITS : positive := log2ceilnz(PORTS); + + constant IN_AW_ID_BITS : natural := In_M2S.AWID'length; + constant Out_AW_ID_BITS : natural := Out_M2S(Out_M2S'low).AWID'length; + constant IN_AR_ID_BITS : natural := In_M2S.ARID'length; + constant Out_AR_ID_BITS : natural := Out_M2S(Out_M2S'low).ARID'length; + + constant ADDRESS_BITS : natural := imin(In_M2S.AWAddr'length, Out_M2S(0).AWAddr'length); + constant DATA_BITS : natural := In_M2S.WData'length; + constant STRB_BITS : natural := In_M2S.WData'length / 8; + constant CACHE_BITS : natural := In_M2S.AWCache'length; + constant PROTECT_BITS : natural := In_M2S.AWProt'length; + constant RESPONSE_BITS : natural := In_S2M.RResp'length; + constant USER_BITS : natural := In_M2S.AWUser'length; + constant ID_BITS : natural := In_M2S.AWID'length; + constant LEN_BITS : natural := In_M2S.AWLen'length; + constant SIZE_BITS : natural := In_M2S.AWSize'length; + constant BURST_BITS : natural := In_M2S.AWBurst'length; + constant QOS_BITS : natural := In_M2S.AWQoS'length; + constant REGION_BITS : natural := In_M2S.AWRegion'length; + constant LOCK_BITS : natural := 1; + + constant ADDR_BITS_SLAVE : natural := Out_M2S(Out_M2S'low).ARAddr'length; + + signal In_M2S_g : In_M2S'subtype; + signal In_S2M_g : In_S2M'subtype; + signal In_M2S_write : In_M2S'subtype; + signal In_S2M_write : In_S2M'subtype; + signal In_M2S_read : In_M2S'subtype; + signal In_S2M_read : In_S2M'subtype; + signal Out_M2S_g : Out_M2S'subtype; + signal Out_S2M_g : Out_S2M'subtype; + signal Out_M2S_write : Out_M2S'subtype; + signal Out_S2M_write : Out_S2M'subtype; + signal Out_M2S_read : Out_M2S'subtype; + signal Out_S2M_read : Out_S2M'subtype; + +begin + assert In_M2S.AWAddr'length = Out_M2S(Out_M2S'low).AWAddr'length report "PoC.axi4_DeMux:: AWAddr size of in and out not matching!" severity failure; + assert In_M2S.ARAddr'length = Out_M2S(Out_M2S'low).ARAddr'length report "PoC.axi4_DeMux:: ARAddr size of in and out not matching!" severity failure; + assert In_M2S.WData'length = Out_M2S(Out_M2S'low).WData'length report "PoC.axi4_DeMux:: WData size of in and out not matching!" severity failure; + assert In_S2M.RData'length = Out_S2M(Out_M2S'low).RData'length report "PoC.axi4_DeMux:: RData size of in and out not matching!" severity failure; + assert BASE_ADDRESS'length = Out_M2S'length + report "PoC.axi4_DeMux:: Number of Base-Addresses is not equal to Number Port-Vector!" + severity failure; + + assert BASE_ADDRESS(BASE_ADDRESS'low)'length >= ADDRESS_BITS + report "PoC.axi4_DeMux:: The number of master address bits (" & to_string(ADDRESS_BITS) & ") is not less than or equal to the width of generic BASE_ADDRESS (" & to_string(BASE_ADDRESS(BASE_ADDRESS'low)'length) & ")!" + severity failure; + + assert BASE_ADDRESS(BASE_ADDRESS'low)'length >= ADDR_BITS_SLAVE + report "PoC.axi4_DeMux:: The number of slave address bits (" & to_string(ADDR_BITS_SLAVE) & ") is not less than or equal to the width of generic BASE_ADDRESS (" & to_string(BASE_ADDRESS(BASE_ADDRESS'low)'length) & ")!" + severity failure; + + glue_in_gen : if PIPELINE_IN > 0 generate + Glue_in : entity work.axi4_FIFO + generic map( + FRAMES => PIPELINE_IN -1 + ) + port map( + Clock => Clock, + Reset => Reset, + -- IN Port + In_M2S => In_M2S, + In_S2M => In_S2M, + -- OUT Port + Out_M2S => In_M2S_g, + Out_S2M => In_S2M_g + ); + else generate + In_M2S_g <= In_M2S; + In_S2M <= In_S2M_g; + end generate; + + glue_out_loop_gen : for i in Out_M2S'range generate + glue_out_gen : if PIPELINE_OUT(i) > 0 generate + Glue_in : entity work.axi4_FIFO + generic map( + FRAMES => PIPELINE_OUT(i) -1 + ) + port map( + Clock => Clock, + Reset => Reset, + -- IN Port + In_M2S => Out_M2S_g(i), + In_S2M => Out_S2M_g(i), + -- OUT Port + Out_M2S => Out_M2S(i), + Out_S2M => Out_S2M(i) + ); + else generate + Out_M2S(i) <= Out_M2S_g(i); + Out_S2M_g(i) <= Out_S2M(i); + end generate; + end generate; + + write_blk : block + constant NUM_INDEX : natural := ite(NUM_OUTSTANDING_WRITES = 0, 2**Out_AW_ID_BITS, NUM_OUTSTANDING_WRITES); + + constant B_Resp_POS : natural := 0; + constant B_ID_POS : natural := 1; + constant B_User_POS : natural := 2; + constant BACKWARD_BIT_VEC : positive_vector := ( + B_Resp_POS => RESPONSE_BITS, + B_ID_POS => Out_AW_ID_BITS, + B_User_POS => USER_BITS + ); + + signal Address_hit : std_logic_vector(PORTS -1 downto 0); + constant MUX_DATA_BITS : natural := isum(BACKWARD_BIT_VEC); + + signal Mux_In_M2S : T_AXI4Stream_M2S_VECTOR(0 to PORTS)(Data(isum(BACKWARD_BIT_VEC) - 1 downto 0), Keep(0 downto 0), User(0 downto 0), ID(0 downto 0), Dest(0 downto 0)); + signal Mux_In_S2M : T_AXI4Stream_S2M_VECTOR(0 to PORTS)(User(0 downto 0)); + signal Mux_Out_M2S : T_AXI4Stream_M2S(Data(isum(BACKWARD_BIT_VEC) - 1 downto 0), Keep(0 downto 0), User(0 downto 0), ID(0 downto 0), Dest(0 downto 0)); + signal Mux_Out_S2M : T_AXI4Stream_S2M(User(0 downto 0)); + + signal Response_fifo_put : std_logic; + signal Response_fifo_ful : std_logic; + signal Response_fifo_got : std_logic; + signal Response_fifo_dout : std_logic_vector(ID_BITS-1 downto 0); + signal Response_fifo_vld : std_logic; + + type T_STATE is (ST_Idle, ST_Dataflow, ST_DataOnly, ST_AddressOnly, St_DiscardData); + + signal State : T_State := St_Idle; + signal NextState : T_STATE; + + --OoO-Buffer Signals + -- Put Port + signal Put : std_logic_vector(0 to PORTS -1); + signal Full : std_logic_vector(0 to PORTS -1); + signal IndexOut : T_SLUV(0 to PORTS)(log2ceilnz(NUM_INDEX) -1 downto 0); + signal Write_Response_Error : std_logic_vector(0 to PORTS -1) := (others => '0'); + begin + assign_gen : for i in 0 to PORTS -1 generate + --OoO-Buffer Signals + -- Put Port + signal DataIn : std_logic_vector(In_AW_ID_BITS -1 downto 0); + -- Get Port + signal Got : std_logic; + signal Valid : std_logic; + signal DataOut : std_logic_vector(In_AW_ID_BITS -1 downto 0); + begin + Address_hit(i) <= '1' when (unsigned(In_M2S_write.AWAddr) and not BASE_ADDRESS_MASK(i)) = (Base_Address(i) and not BASE_ADDRESS_MASK(i)) else '0'; + + Write_idx : entity work.dstruct_OutOfOrderBuffer + generic map( + DATA_BITS => In_AW_ID_BITS, + NUM_INDEX => NUM_INDEX + ) + port map( + -- INPUTS + Clock => Clock, + Reset => Reset, + + -- Put Port + Put => Put(i), + Full => Full(i), + DataIn => DataIn, + IndexOut => IndexOut(i), + + -- Get Port + Got => Got, + Valid => Valid, + IndexIn => resize(unsigned(Out_S2M_write(i).BID), IndexOut(0)'length), + DataOut => DataOut + ); + + Got <= Out_S2M_write(i).BValid and Mux_In_S2M(i).Ready; + DataIn <= In_M2S_write.AWID; + + Mux_In_M2S(i).Valid <= Out_S2M_write(i).BValid; + Mux_In_M2S(i).Data(high(BACKWARD_BIT_VEC, B_Resp_POS) downto low(BACKWARD_BIT_VEC, B_Resp_POS)) <= Out_S2M_write(i).BResp; + Mux_In_M2S(i).Data(high(BACKWARD_BIT_VEC, B_ID_POS) downto low(BACKWARD_BIT_VEC, B_ID_POS)) <= std_logic_vector(DataOut); + Mux_In_M2S(i).Data(high(BACKWARD_BIT_VEC, B_User_POS) downto low(BACKWARD_BIT_VEC, B_User_POS)) <= Out_S2M_write(i).BUser; + -- Mux_In_M2S(i).SoF <= '1'; + Mux_In_M2S(i).Last <= '1'; + + Write_Response_Error(i) <= Got and not Valid when rising_edge(Clock); + assert Write_Response_Error(i) = '0' report "PoC.axi4_DeMux:: Got write response on channel '" & integer'image(i) & "' but no matching index!" severity warning; + end generate; + + process(Clock) + begin + if rising_edge(Clock) then + if Reset = '1' then + State <= St_Idle; + else + State <= NextState; + end if; + end if; + end process; + + process(all) + variable SelectIndex : integer; + begin + NextState <= State; + + In_S2M_write <= Initialize_AXI4_Bus_S2M(In_M2S.AWAddr'length, In_S2M.RData'length, In_S2M.RUser'length, In_S2M.BID'length, '0'); + Out_M2S_write <= (Out_M2S'range => In_M2S_write); + + for i in 0 to PORTS -1 loop + Out_M2S_write(i).AWValid <= '0'; + Out_M2S_write(i).WValid <= '0'; + Out_M2S_write(i).AWID <= to_slv(resize(IndexOut(i), Out_AW_ID_BITS)); -- Have AWID always connected to OoO Index + end loop; + + Response_fifo_put <= '0'; + + Put <= (others => '0'); + + case State is + when St_Idle => + SelectIndex := lssb_idx(Address_hit); + + if In_M2S_write.AWValid = '1' then + if unsigned(Address_hit) = 0 then + Response_fifo_put <= '1'; + In_S2M_write.AWReady <= '1'; + In_S2M_write.WReady <= '1'; + + if (In_M2S_write.WValid or In_M2S_write.WLast) = '0' then + NextState <= St_DiscardData; + end if; + elsif Full(SelectIndex) = '0' then + In_S2M_write <= Out_S2M_write(SelectIndex); + Out_M2S_write(SelectIndex).AWValid <= In_M2S_write.AWValid; + Out_M2S_write(SelectIndex).WValid <= In_M2S_write.WValid; + + Put(SelectIndex) <= '1'; + + if (Out_S2M_write(SelectIndex).AWReady and In_M2S_write.WValid and In_M2S_write.WLast and Out_S2M_write(SelectIndex).WReady) = '1' then -- Full transaction closed in my cycle, stay in Idle + elsif (Out_S2M_write(SelectIndex).AWReady) = '1' then -- Address transmitted + NextState <= ST_DataOnly; + elsif (In_M2S_write.WValid and In_M2S_write.WLast and Out_S2M_write(SelectIndex).WReady) = '1' then -- Data transmitted + NextState <= ST_AddressOnly; + else + NextState <= ST_Dataflow; + end if; + end if; + end if; + + when ST_Dataflow => + In_S2M_write <= Out_S2M_write(SelectIndex); + Out_M2S_write(SelectIndex).AWValid <= In_M2S_write.AWValid; + Out_M2S_write(SelectIndex).WValid <= In_M2S_write.WValid; + + if (In_M2S_write.AWValid and Out_S2M_write(SelectIndex).AWReady and In_M2S_write.WValid and In_M2S_write.WLast and Out_S2M_write(SelectIndex).WReady) = '1' then -- Full transaction closed + NextState <= St_Idle; + elsif (In_M2S_write.AWValid and Out_S2M_write(SelectIndex).AWReady) = '1' then -- Address transmitted + NextState <= ST_DataOnly; + elsif (In_M2S_write.WValid and In_M2S_write.WLast and Out_S2M_write(SelectIndex).WReady) = '1' then -- Data transmitted + NextState <= ST_AddressOnly; + end if; + + when ST_DataOnly => + In_S2M_write <= Out_S2M_write(SelectIndex); + In_S2M_write.AWReady <= '0'; + Out_M2S_write(SelectIndex).WValid <= In_M2S_write.WValid; + + if (In_M2S_write.WValid and In_M2S_write.WLast and Out_S2M_write(SelectIndex).WReady) = '1' then -- Data transmitted + NextState <= St_Idle; + end if; + + when ST_AddressOnly => + In_S2M_write <= Out_S2M_write(SelectIndex); + In_S2M_write.WReady <= '0'; + Out_M2S_write(SelectIndex).AWValid <= In_M2S_write.AWValid; + + if (In_M2S_write.AWValid and Out_S2M_write(SelectIndex).AWReady) = '1' then -- Address transmitted + NextState <= St_Idle; + end if; + + when St_DiscardData => + In_S2M_write.WReady <= '1'; + + if (In_M2S_write.WValid and In_M2S_write.WLast) = '1' then + NextState <= St_Idle; + end if; + end case; + + + -- Connect Write Response + In_S2M_write.BValid <= Mux_Out_M2S.Valid; + In_S2M_write.BResp <= Mux_Out_M2S.Data(high(BACKWARD_BIT_VEC, B_Resp_POS) downto low(BACKWARD_BIT_VEC, B_Resp_POS)); + In_S2M_write.BID <= Mux_Out_M2S.Data(high(BACKWARD_BIT_VEC, B_ID_POS) downto low(BACKWARD_BIT_VEC, B_ID_POS)); + In_S2M_write.BUser <= Mux_Out_M2S.Data(high(BACKWARD_BIT_VEC, B_User_POS) downto low(BACKWARD_BIT_VEC, B_User_POS)); + for i in 0 to PORTS -1 loop + Out_M2S_write(i).BReady <= Mux_In_S2M(i).Ready; + end loop; + end process; + + Write_Mux : entity work.axi4stream_Mux + generic map( + PORTS => PORTS +1 + ) + port map( + Clock => Clock, + Reset => Reset, + + In_M2S => Mux_In_M2S, + In_S2M => Mux_In_S2M, + Out_M2S => Mux_Out_M2S, + Out_S2M => Mux_Out_S2M + ); + Mux_Out_S2M.Ready <= In_M2S_write.BReady; + + Response_fifo : entity work.fifo_Shift + generic map( + DATA_BITS => ID_BITS, + MIN_DEPTH => RESPONSE_FIFO_DEPTH + ) + port map( + -- Global Control + Clock => Clock, + Reset => Reset, + + -- Writing Interface + Put => Response_fifo_put, + DataIn => In_M2S_write.ARID, + Full => Response_fifo_ful, + + -- Reading Interface + Got => Response_fifo_got, + DataOut => Response_fifo_dout, + Valid => Response_fifo_vld + ); + + Mux_In_M2S(PORTS).Valid <= Response_fifo_vld; + Response_fifo_got <= Mux_In_S2M(PORTS).Ready; + Mux_In_M2S(PORTS).Data(high(BACKWARD_BIT_VEC, B_Resp_POS) downto low(BACKWARD_BIT_VEC, B_Resp_POS)) <= C_AXI4_RESPONSE_DECODE_ERROR; + Mux_In_M2S(PORTS).Data(high(BACKWARD_BIT_VEC, B_ID_POS) downto low(BACKWARD_BIT_VEC, B_ID_POS)) <= Response_fifo_dout; + Mux_In_M2S(PORTS).Data(high(BACKWARD_BIT_VEC, B_User_POS) downto low(BACKWARD_BIT_VEC, B_User_POS)) <= (others => '0'); + end block; + + read_blk : block + constant NUM_INDEX : natural := ite(NUM_OUTSTANDING_READS = 0, 2**(Out_M2S(Out_M2S'low).ARID'length), NUM_OUTSTANDING_READS); + + constant AR_Addr_POS : natural := 0; + constant AR_Len_POS : natural := 1; + constant AR_Size_POS : natural := 2; + constant AR_Burst_POS : natural := 3; + constant AR_User_POS : natural := 4; + constant AR_Cache_POS : natural := 5; + constant AR_Protect_POS : natural := 6; + constant AR_Lock_POS : natural := 7; + constant AR_QoS_POS : natural := 8; + constant AR_Region_POS : natural := 9; + constant AR_ID_POS : natural := 10; + + constant FORWARD_BIT_VEC : positive_vector := ( + AR_Addr_POS => ADDRESS_BITS, + AR_Len_POS => LEN_BITS , + AR_Size_POS => SIZE_BITS , + AR_Burst_POS => BURST_BITS , + AR_ID_POS => ID_BITS , + AR_User_POS => USER_BITS , + AR_Cache_POS => CACHE_BITS , + AR_Protect_POS=> PROTECT_BITS, + AR_Lock_POS => LOCK_BITS , + AR_QoS_POS => QOS_BITS , + AR_Region_POS => REGION_BITS + ); + + constant R_Data_POS : natural := 0; + constant R_Resp_POS : natural := 1; + constant R_ID_POS : natural := 2; + constant R_User_POS : natural := 3; + + constant BACKWARD_BIT_VEC : positive_vector := ( + R_Data_POS => DATA_BITS, + R_Resp_POS => RESPONSE_BITS, + R_ID_POS => ID_BITS, + R_User_POS => USER_BITS + ); + + signal Address_hit : std_logic_vector(PORTS -1 downto 0); + signal DeMuxControl : std_logic_vector(PORTS -1 downto 0); + + constant MUX_DATA_BITS : natural := isum(BACKWARD_BIT_VEC); + constant DeMUX_DATA_BITS : natural := isum(FORWARD_BIT_VEC); + + signal DeMux_In_M2S : T_AXI4STREAM_M2S(Data(DeMUX_DATA_BITS - 1 downto 0), Keep(0 downto 0), User(0 downto 0), ID(0 downto 0), Dest(0 downto 0)); + signal DeMux_In_S2M : T_AXI4STREAM_S2M(User(0 downto 0)); + signal DeMux_Out_M2S : T_AXI4STREAM_M2S_VECTOR(0 to PORTS -1)(Data(DeMUX_DATA_BITS - 1 downto 0), Keep(0 downto 0), User(0 downto 0), ID(0 downto 0), Dest(0 downto 0)); + signal DeMux_Out_S2M : T_AXI4STREAM_S2M_VECTOR(0 to PORTS -1)(User(0 downto 0)); + + signal Mux_In_M2S : T_AXI4STREAM_M2S_VECTOR(0 to PORTS)(Data(MUX_DATA_BITS - 1 downto 0), Keep(0 downto 0), User(0 downto 0), ID(0 downto 0), Dest(0 downto 0)); + signal Mux_In_S2M : T_AXI4STREAM_S2M_VECTOR(0 to PORTS)(User(0 downto 0)); + signal Mux_Out_M2S : T_AXI4STREAM_M2S(Data(MUX_DATA_BITS - 1 downto 0), Keep(0 downto 0), User(0 downto 0), ID(0 downto 0), Dest(0 downto 0)); + signal Mux_Out_S2M : T_AXI4STREAM_S2M(User(0 downto 0)); + + signal Response_fifo_put : std_logic; + signal Response_fifo_ful : std_logic; + signal Response_fifo_got : std_logic; + signal Response_fifo_dout : std_logic_vector(ID_BITS-1 downto 0); + signal Response_fifo_vld : std_logic; + begin + + + assign_gen : for i in 0 to PORTS -1 generate + signal Put : std_logic; + signal Full : std_logic; + signal DataIn : std_logic_vector(ID_BITS -1 downto 0); + signal IndexOut : unsigned(log2ceilnz(NUM_INDEX) -1 downto 0); + signal Got : std_logic; + signal DataOut : std_logic_vector(ID_BITS -1 downto 0); + begin + Address_hit(i) <= '1' when (unsigned(In_M2S_read.ARAddr) and not BASE_ADDRESS_MASK(i)) = (Base_Address(i) and not BASE_ADDRESS_MASK(i)) else '0'; + + Out_M2S_read(i).ARID <= std_logic_vector(resize(IndexOut, Out_AR_ID_BITS)); + Out_M2S_read(i).ARValid <= DeMux_Out_M2S(i).Valid and not Full; + + Out_M2S_read(i).ARAddr <= resize(DeMux_Out_M2S(i).Data(high(FORWARD_BIT_VEC, AR_Addr_POS) downto low(FORWARD_BIT_VEC, AR_Addr_POS)), ADDR_BITS_SLAVE); + Out_M2S_read(i).ARCache <= DeMux_Out_M2S(i).Data(high(FORWARD_BIT_VEC, AR_Cache_POS) downto low(FORWARD_BIT_VEC, AR_Cache_POS)); + Out_M2S_read(i).ARProt <= DeMux_Out_M2S(i).Data(high(FORWARD_BIT_VEC, AR_Protect_POS) downto low(FORWARD_BIT_VEC, AR_Protect_POS)); + Out_M2S_read(i).ARLen <= DeMux_Out_M2S(i).Data(high(FORWARD_BIT_VEC, AR_Len_POS) downto low(FORWARD_BIT_VEC, AR_Len_POS)); + Out_M2S_read(i).ARSize <= DeMux_Out_M2S(i).Data(high(FORWARD_BIT_VEC, AR_Size_POS) downto low(FORWARD_BIT_VEC, AR_Size_POS)); + Out_M2S_read(i).ARBurst <= DeMux_Out_M2S(i).Data(high(FORWARD_BIT_VEC, AR_Burst_POS) downto low(FORWARD_BIT_VEC, AR_Burst_POS)); + Out_M2S_read(i).ARLock <= DeMux_Out_M2S(i).Data(high(FORWARD_BIT_VEC, AR_Lock_POS) downto low(FORWARD_BIT_VEC, AR_Lock_POS)); + Out_M2S_read(i).ARQOS <= DeMux_Out_M2S(i).Data(high(FORWARD_BIT_VEC, AR_QoS_POS) downto low(FORWARD_BIT_VEC, AR_QoS_POS)); + Out_M2S_read(i).ARRegion <= DeMux_Out_M2S(i).Data(high(FORWARD_BIT_VEC, AR_Region_POS) downto low(FORWARD_BIT_VEC, AR_Region_POS)); + Out_M2S_read(i).ARUser <= DeMux_Out_M2S(i).Data(high(FORWARD_BIT_VEC, AR_User_POS) downto low(FORWARD_BIT_VEC, AR_User_POS)); + DataIn(ID_BITS -1 downto 0) <= DeMux_Out_M2S(i).Data(high(FORWARD_BIT_VEC, AR_ID_POS) downto low(FORWARD_BIT_VEC, AR_ID_POS)); + DeMux_Out_S2M(i).Ready <= Out_S2M_read(i).ARReady and not Full; + + Put <= DeMux_Out_M2S(i).Valid and Out_S2M_read(i).ARReady and not Full; + Got <= Mux_In_S2M(i).Ready and Out_S2M_read(i).RValid and Out_S2M_read(i).RLast; + + Out_M2S_read(i).RReady <= Mux_In_S2M(i).Ready; + + Mux_In_M2S(i).Valid <= Out_S2M_read(i).RValid; + + Mux_In_M2S(i).Data(high(BACKWARD_BIT_VEC, R_Data_POS) downto low(BACKWARD_BIT_VEC, R_Data_POS)) <= Out_S2M_read(i).RData ; + Mux_In_M2S(i).Data(high(BACKWARD_BIT_VEC, R_Resp_POS) downto low(BACKWARD_BIT_VEC, R_Resp_POS)) <= Out_S2M_read(i).RResp ; + Mux_In_M2S(i).Data(high(BACKWARD_BIT_VEC, R_ID_POS) downto low(BACKWARD_BIT_VEC, R_ID_POS)) <= DataOut ; + Mux_In_M2S(i).Data(high(BACKWARD_BIT_VEC, R_User_POS) downto low(BACKWARD_BIT_VEC, R_User_POS)) <= Out_S2M_read(i).RUser ; + Mux_In_M2S(i).Last <= Out_S2M_read(i).RLast; + + Read_idx : entity work.dstruct_OutOfOrderBuffer + generic map( + DATA_BITS => ID_BITS, + NUM_INDEX => NUM_INDEX + ) + port map( + -- INPUTS + Clock => Clock, + Reset => Reset, + + -- Put Port + Put => Put, + Full => Full, + DataIn => DataIn, + IndexOut => IndexOut, + + -- Get Port + Got => Got, + Valid => open, + IndexIn => resize(unsigned(Out_S2M_read(i).RID), IndexOut'length), + DataOut => DataOut + ); + end generate; + + Read_mux : entity work.axi4stream_Mux + generic map( + PORTS => PORTS +1 + ) + port map( + Clock => Clock, + Reset => Reset, + + In_M2S => Mux_In_M2S, + In_S2M => Mux_In_S2M, + Out_M2S => Mux_Out_M2S, + Out_S2M => Mux_Out_S2M + ); + + In_S2M_read.RValid <= Mux_Out_M2S.Valid; + In_S2M_read.RLast <= Mux_Out_M2S.Last; + Mux_Out_S2M.Ready <= In_M2S_read.RReady; + + In_S2M_read.RData <= Mux_Out_M2S.Data(high(BACKWARD_BIT_VEC, R_Data_POS) downto low(BACKWARD_BIT_VEC, R_Data_POS)); + In_S2M_read.RResp <= Mux_Out_M2S.Data(high(BACKWARD_BIT_VEC, R_Resp_POS) downto low(BACKWARD_BIT_VEC, R_Resp_POS)); + In_S2M_read.RID <= Mux_Out_M2S.Data(high(BACKWARD_BIT_VEC, R_ID_POS ) downto low(BACKWARD_BIT_VEC, R_ID_POS )); + In_S2M_read.RUser <= Mux_Out_M2S.Data(high(BACKWARD_BIT_VEC, R_User_POS) downto low(BACKWARD_BIT_VEC, R_User_POS)); + + DeMuxControl <= lssb(Address_hit); + + Read_DeMux : entity work.axi4stream_DeMux + port map( + Clock => Clock, + Reset => Reset, + -- Control interface + DeMuxControl => DeMuxControl, + -- IN Port + In_M2S => DeMux_In_M2S, + In_S2M => DeMux_In_S2M, + -- OUT Ports + Out_M2S => DeMux_Out_M2S, + Out_S2M => DeMux_Out_S2M + ); + + DeMux_In_M2S.Valid <= In_M2S_read.ARValid and not Response_fifo_ful; + DeMux_In_M2S.Last <= '1'; + In_S2M_read.ARReady <= DeMux_In_S2M.Ready and not Response_fifo_ful; + + Response_fifo : entity work.fifo_Shift + generic map( + DATA_BITS => ID_BITS, + MIN_DEPTH => RESPONSE_FIFO_DEPTH + ) + port map( + -- Global Control + Clock => Clock, + Reset => Reset, + + -- Writing Interface + Put => Response_fifo_put, + DataIn => In_M2S_read.ARID, + Full => Response_fifo_ful, + + -- Reading Interface + Got => Response_fifo_got, + DataOut => Response_fifo_dout, + Valid => Response_fifo_vld + ); + + Response_fifo_put <= '1' when (In_M2S_read.ARValid and DeMux_In_S2M.Ready) = '1' and unsigned(Address_hit) = 0 else '0'; + + Mux_In_M2S(PORTS).Valid <= Response_fifo_vld; + -- Mux_In_M2S(PORTS).SOF <= '1'; + Mux_In_M2S(PORTS).Last <= '1'; + Response_fifo_got <= Mux_In_S2M(PORTS).Ready; + Mux_In_M2S(PORTS).Data(high(BACKWARD_BIT_VEC, R_Data_POS) downto low(BACKWARD_BIT_VEC, R_Data_POS)) <= (others => '0'); + Mux_In_M2S(PORTS).Data(high(BACKWARD_BIT_VEC, R_Resp_POS) downto low(BACKWARD_BIT_VEC, R_Resp_POS)) <= C_AXI4_RESPONSE_DECODE_ERROR; + Mux_In_M2S(PORTS).Data(high(BACKWARD_BIT_VEC, R_ID_POS) downto low(BACKWARD_BIT_VEC, R_ID_POS)) <= Response_fifo_dout; + Mux_In_M2S(PORTS).Data(high(BACKWARD_BIT_VEC, R_User_POS) downto low(BACKWARD_BIT_VEC, R_User_POS)) <= (others => '0'); + + + DeMux_In_M2S.Data(high(FORWARD_BIT_VEC, AR_Addr_POS ) downto low(FORWARD_BIT_VEC, AR_Addr_POS )) <= resize(In_M2S_read.ARAddr, ADDRESS_BITS) ; + DeMux_In_M2S.Data(high(FORWARD_BIT_VEC, AR_Len_POS ) downto low(FORWARD_BIT_VEC, AR_Len_POS )) <= In_M2S_read.ARLen ; + DeMux_In_M2S.Data(high(FORWARD_BIT_VEC, AR_Size_POS ) downto low(FORWARD_BIT_VEC, AR_Size_POS )) <= In_M2S_read.ARSize ; + DeMux_In_M2S.Data(high(FORWARD_BIT_VEC, AR_Burst_POS ) downto low(FORWARD_BIT_VEC, AR_Burst_POS )) <= In_M2S_read.ARBurst ; + DeMux_In_M2S.Data(high(FORWARD_BIT_VEC, AR_User_POS ) downto low(FORWARD_BIT_VEC, AR_User_POS )) <= In_M2S_read.ARUser ; + DeMux_In_M2S.Data(high(FORWARD_BIT_VEC, AR_Cache_POS ) downto low(FORWARD_BIT_VEC, AR_Cache_POS )) <= In_M2S_read.ARCache ; + DeMux_In_M2S.Data(high(FORWARD_BIT_VEC, AR_Protect_POS) downto low(FORWARD_BIT_VEC, AR_Protect_POS)) <= In_M2S_read.ARProt ; + DeMux_In_M2S.Data(high(FORWARD_BIT_VEC, AR_Lock_POS ) downto low(FORWARD_BIT_VEC, AR_Lock_POS )) <= In_M2S_read.ARLock ; + DeMux_In_M2S.Data(high(FORWARD_BIT_VEC, AR_QoS_POS ) downto low(FORWARD_BIT_VEC, AR_QoS_POS )) <= In_M2S_read.ARQoS ; + DeMux_In_M2S.Data(high(FORWARD_BIT_VEC, AR_Region_POS ) downto low(FORWARD_BIT_VEC, AR_Region_POS )) <= In_M2S_read.ARRegion; + DeMux_In_M2S.Data(high(FORWARD_BIT_VEC, AR_ID_POS ) downto low(FORWARD_BIT_VEC, AR_ID_POS )) <= In_M2S_read.ARID ; + + + end block; + + assign_gen : for i in 0 to PORTS - 1 generate + Out_M2S_g(i).AWID <= Out_M2S_write(i).AWID ; + Out_M2S_g(i).AWAddr <= Out_M2S_write(i).AWAddr ; + Out_M2S_g(i).AWLen <= Out_M2S_write(i).AWLen ; + Out_M2S_g(i).AWSize <= Out_M2S_write(i).AWSize ; + Out_M2S_g(i).AWBurst <= Out_M2S_write(i).AWBurst ; + Out_M2S_g(i).AWLock <= Out_M2S_write(i).AWLock ; + Out_M2S_g(i).AWQOS <= Out_M2S_write(i).AWQOS ; + Out_M2S_g(i).AWRegion <= Out_M2S_write(i).AWRegion; + Out_M2S_g(i).AWUser <= Out_M2S_write(i).AWUser ; + Out_M2S_g(i).AWValid <= Out_M2S_write(i).AWValid ; + Out_M2S_g(i).AWCache <= Out_M2S_write(i).AWCache ; + Out_M2S_g(i).AWProt <= Out_M2S_write(i).AWProt ; + Out_M2S_g(i).WValid <= Out_M2S_write(i).WValid ; + Out_M2S_g(i).WLast <= Out_M2S_write(i).WLast ; + Out_M2S_g(i).WUser <= Out_M2S_write(i).WUser ; + Out_M2S_g(i).WData <= Out_M2S_write(i).WData ; + Out_M2S_g(i).WStrb <= Out_M2S_write(i).WStrb ; + Out_M2S_g(i).BReady <= Out_M2S_write(i).BReady ; + Out_M2S_g(i).ARValid <= Out_M2S_read(i).ARValid ; + Out_M2S_g(i).ARAddr <= Out_M2S_read(i).ARAddr ; + Out_M2S_g(i).ARCache <= Out_M2S_read(i).ARCache ; + Out_M2S_g(i).ARProt <= Out_M2S_read(i).ARProt ; + Out_M2S_g(i).ARID <= Out_M2S_read(i).ARID ; + Out_M2S_g(i).ARLen <= Out_M2S_read(i).ARLen ; + Out_M2S_g(i).ARSize <= Out_M2S_read(i).ARSize ; + Out_M2S_g(i).ARBurst <= Out_M2S_read(i).ARBurst ; + Out_M2S_g(i).ARLock <= Out_M2S_read(i).ARLock ; + Out_M2S_g(i).ARQOS <= Out_M2S_read(i).ARQOS ; + Out_M2S_g(i).ARRegion <= Out_M2S_read(i).ARRegion ; + Out_M2S_g(i).ARUser <= Out_M2S_read(i).ARUser ; + Out_M2S_g(i).RReady <= Out_M2S_read(i).RReady ; + + Out_S2M_write(i).AWReady <= Out_S2M_g(i).AWReady; + Out_S2M_write(i).WReady <= Out_S2M_g(i).WReady ; + Out_S2M_write(i).BValid <= Out_S2M_g(i).BValid ; + Out_S2M_write(i).BResp <= Out_S2M_g(i).BResp ; + Out_S2M_write(i).BID <= Out_S2M_g(i).BID ; + Out_S2M_write(i).BUser <= Out_S2M_g(i).BUser ; + Out_S2M_read(i).ARReady <= Out_S2M_g(i).ARReady; + Out_S2M_read(i).RValid <= Out_S2M_g(i).RValid ; + Out_S2M_read(i).RData <= Out_S2M_g(i).RData ; + Out_S2M_read(i).RResp <= Out_S2M_g(i).RResp ; + Out_S2M_read(i).RID <= Out_S2M_g(i).RID ; + Out_S2M_read(i).RLast <= Out_S2M_g(i).RLast ; + Out_S2M_read(i).RUser <= Out_S2M_g(i).RUser ; + end generate; + + In_M2S_write.AWID <= In_M2S_g.AWID ; + In_M2S_write.AWAddr <= In_M2S_g.AWAddr ; + In_M2S_write.AWLen <= In_M2S_g.AWLen ; + In_M2S_write.AWSize <= In_M2S_g.AWSize ; + In_M2S_write.AWBurst <= In_M2S_g.AWBurst ; + In_M2S_write.AWLock <= In_M2S_g.AWLock ; + In_M2S_write.AWQOS <= In_M2S_g.AWQOS ; + In_M2S_write.AWRegion <= In_M2S_g.AWRegion; + In_M2S_write.AWUser <= In_M2S_g.AWUser ; + In_M2S_write.AWValid <= In_M2S_g.AWValid ; + In_M2S_write.AWCache <= In_M2S_g.AWCache ; + In_M2S_write.AWProt <= In_M2S_g.AWProt ; + In_M2S_write.WValid <= In_M2S_g.WValid ; + In_M2S_write.WLast <= In_M2S_g.WLast ; + In_M2S_write.WUser <= In_M2S_g.WUser ; + In_M2S_write.WData <= In_M2S_g.WData ; + In_M2S_write.WStrb <= In_M2S_g.WStrb ; + In_M2S_write.BReady <= In_M2S_g.BReady ; + In_M2S_read.ARValid <= In_M2S_g.ARValid ; + In_M2S_read.ARAddr <= In_M2S_g.ARAddr ; + In_M2S_read.ARCache <= In_M2S_g.ARCache ; + In_M2S_read.ARProt <= In_M2S_g.ARProt ; + In_M2S_read.ARID <= In_M2S_g.ARID ; + In_M2S_read.ARLen <= In_M2S_g.ARLen ; + In_M2S_read.ARSize <= In_M2S_g.ARSize ; + In_M2S_read.ARBurst <= In_M2S_g.ARBurst ; + In_M2S_read.ARLock <= In_M2S_g.ARLock ; + In_M2S_read.ARQOS <= In_M2S_g.ARQOS ; + In_M2S_read.ARRegion <= In_M2S_g.ARRegion; + In_M2S_read.ARUser <= In_M2S_g.ARUser ; + In_M2S_read.RReady <= In_M2S_g.RReady ; + + In_S2M_g.AWReady <= In_S2M_write.AWReady; + In_S2M_g.WReady <= In_S2M_write.WReady ; + In_S2M_g.BValid <= In_S2M_write.BValid ; + In_S2M_g.BResp <= In_S2M_write.BResp ; + In_S2M_g.BID <= In_S2M_write.BID ; + In_S2M_g.BUser <= In_S2M_write.BUser ; + In_S2M_g.ARReady <= In_S2M_read.ARReady ; + In_S2M_g.RValid <= In_S2M_read.RValid ; + In_S2M_g.RData <= In_S2M_read.RData ; + In_S2M_g.RResp <= In_S2M_read.RResp ; + In_S2M_g.RID <= In_S2M_read.RID ; + In_S2M_g.RLast <= In_S2M_read.RLast ; + In_S2M_g.RUser <= In_S2M_read.RUser ; +end architecture; diff --git a/src/bus/axi4/AXI4_FIFO.vhdl b/src/bus/axi4/axi4_FIFO.vhdl similarity index 60% rename from src/bus/axi4/AXI4_FIFO.vhdl rename to src/bus/axi4/axi4_FIFO.vhdl index edf39b0c8..2a9f45f76 100644 --- a/src/bus/axi4/AXI4_FIFO.vhdl +++ b/src/bus/axi4/axi4_FIFO.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= -- Authors: Stefan Unrein -- --- Entity: AXI4_FIFO +-- Entity: axi4_FIFO -- -- Description: -- ------------------------------------- @@ -37,7 +37,7 @@ use work.axi4_Full.all; use work.axi4_Common.all; -entity AXI4_FIFO is +entity axi4_FIFO is generic ( FRAMES : natural := 0; FRAME_DEPTH : positive := 1 @@ -55,7 +55,7 @@ port ( end entity; -architecture rtl of AXI4_FIFO is +architecture rtl of axi4_FIFO is constant LOCK_BITS : natural := 1; constant LAST_BITS : natural := 1; @@ -79,23 +79,23 @@ architecture rtl of AXI4_FIFO is --Ready/Write-Response-Only constant Resp_POS : natural := 2; - constant W_Addr_BIT_VEC : T_POSVEC := ( ID_POS => In_M2S.AWID'length, User_POS => In_M2S.AWUser'length, Addr_POS => In_M2S.AWAddr'length, - Cache_POS => In_M2S.AWCache'length, Protect_POS => In_M2S.AWProt'length, Len_POS => In_M2S.AWLen'length, - Size_POS => In_M2S.AWSize'length, Burst_POS => In_M2S.AWBurst'length, Lock_POS => LOCK_BITS, - QoS_POS => In_M2S.AWQoS'length, Region_POS => In_M2S.AWRegion'length + constant W_Addr_BIT_VEC : positive_vector := ( ID_POS => In_M2S.AWID'length, User_POS => In_M2S.AWUser'length, Addr_POS => In_M2S.AWAddr'length, + Cache_POS => In_M2S.AWCache'length, Protect_POS => In_M2S.AWProt'length, Len_POS => In_M2S.AWLen'length, + Size_POS => In_M2S.AWSize'length, Burst_POS => In_M2S.AWBurst'length, Lock_POS => LOCK_BITS, + QoS_POS => In_M2S.AWQoS'length, Region_POS => In_M2S.AWRegion'length ); - constant R_Addr_BIT_VEC : T_POSVEC := ( ID_POS => In_M2S.ARID'length, User_POS => In_M2S.ARUser'length, Addr_POS => In_M2S.ARAddr'length, - Cache_POS => In_M2S.ARCache'length, Protect_POS => In_M2S.ARProt'length, Len_POS => In_M2S.ARLen'length, - Size_POS => In_M2S.ARSize'length, Burst_POS => In_M2S.ARBurst'length, Lock_POS => LOCK_BITS, - QoS_POS => In_M2S.ARQoS'length, Region_POS => In_M2S.ARRegion'length + constant R_Addr_BIT_VEC : positive_vector := ( ID_POS => In_M2S.ARID'length, User_POS => In_M2S.ARUser'length, Addr_POS => In_M2S.ARAddr'length, + Cache_POS => In_M2S.ARCache'length, Protect_POS => In_M2S.ARProt'length, Len_POS => In_M2S.ARLen'length, + Size_POS => In_M2S.ARSize'length, Burst_POS => In_M2S.ARBurst'length, Lock_POS => LOCK_BITS, + QoS_POS => In_M2S.ARQoS'length, Region_POS => In_M2S.ARRegion'length ); - constant W_BIT_VEC : T_POSVEC := (User_POS => In_M2S.WUser'length, Strobe_POS => In_M2S.WStrb'length, Data_POS => In_M2S.WData'length, - Last_POS => LAST_BITS + constant W_BIT_VEC : positive_vector := (User_POS => In_M2S.WUser'length, Strobe_POS => In_M2S.WStrb'length, Data_POS => In_M2S.WData'length, + Last_POS => LAST_BITS ); - constant R_BIT_VEC : T_POSVEC := (ID_POS => In_S2M.RID'length, User_POS => In_S2M.RUser'length, Resp_POS => In_S2M.RResp'length, - Data_POS => In_S2M.RData'length, Last_POS => LAST_BITS + constant R_BIT_VEC : positive_vector := (ID_POS => In_S2M.RID'length, User_POS => In_S2M.RUser'length, Resp_POS => In_S2M.RResp'length, + Data_POS => In_S2M.RData'length, Last_POS => LAST_BITS ); - constant B_BIT_VEC : T_POSVEC := (ID_POS => In_S2M.BID'length, User_POS => In_S2M.BUser'length, Resp_POS => In_S2M.BResp'length); + constant B_BIT_VEC : positive_vector := (ID_POS => In_S2M.BID'length, User_POS => In_S2M.BUser'length, Resp_POS => In_S2M.BResp'length); constant AW_POS : natural := 0; constant AR_POS : natural := 1; @@ -103,15 +103,15 @@ architecture rtl of AXI4_FIFO is constant R_POS : natural := 3; constant B_POS : natural := 4; - constant BIT_VEC : T_POSVEC := ( - AW_POS => isum(W_Addr_BIT_VEC), - AR_POS => isum(R_Addr_BIT_VEC), + constant BIT_VEC : positive_vector := ( + AW_POS => isum(W_Addr_BIT_VEC), + AR_POS => isum(R_Addr_BIT_VEC), W_POS => isum(W_BIT_VEC), R_POS => isum(R_BIT_VEC), B_POS => isum(B_BIT_VEC) ); - constant MIN_DEPTH : T_NATVEC := ( + constant MIN_DEPTH : natural_vector := ( AW_POS => FRAMES, AR_POS => FRAMES, W_POS => FRAMES * FRAME_DEPTH, @@ -158,184 +158,184 @@ begin -----INPUT --AW IN Interface DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Addr_POS)) + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Addr_POS)) <= In_M2S.AWAddr; DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Cache_POS)) + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Cache_POS)) <= In_M2S.AWCache; DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Protect_POS)) + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Protect_POS)) <= In_M2S.AWProt; DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,ID_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,ID_POS)) + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,ID_POS)) <= In_M2S.AWID; DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Len_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Len_POS)) + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Len_POS)) <= In_M2S.AWLen; DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Size_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Size_POS)) + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Size_POS)) <= In_M2S.AWSize; DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Burst_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Burst_POS)) + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Burst_POS)) <= In_M2S.AWBurst; DataFIFO_DataIn( low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Lock_POS)) <= In_M2S.AWLock(0); DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,QoS_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,QoS_POS)) + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,QoS_POS)) <= In_M2S.AWQoS; DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Region_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Region_POS)) + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Region_POS)) <= In_M2S.AWRegion; DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,User_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,User_POS)) + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,User_POS)) <= In_M2S.AWUser; --AR IN Interface DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Addr_POS)) + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Addr_POS)) <= In_M2S.ARAddr; DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Cache_POS)) + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Cache_POS)) <= In_M2S.ARCache; DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Protect_POS)) + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Protect_POS)) <= In_M2S.ARProt; DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,ID_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,ID_POS)) + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,ID_POS)) <= In_M2S.ARID; DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Len_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Len_POS)) + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Len_POS)) <= In_M2S.ARLen; DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Size_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Size_POS)) + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Size_POS)) <= In_M2S.ARSize; DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Burst_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Burst_POS)) + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Burst_POS)) <= In_M2S.ARBurst; DataFIFO_DataIn( low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Lock_POS)) <= In_M2S.ARLock(0); DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,QoS_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,QoS_POS)) + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,QoS_POS)) <= In_M2S.ARQoS; DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Region_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Region_POS)) + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Region_POS)) <= In_M2S.ARRegion; DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,User_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,User_POS)) + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,User_POS)) <= In_M2S.ARUser; --W IN Interface DataFIFO_DataIn( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Data_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)) + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)) <= In_M2S.WData; DataFIFO_DataIn( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Strobe_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)) + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)) <= In_M2S.WStrb; DataFIFO_DataIn( low(BIT_VEC,W_POS) + high(W_BIT_VEC,User_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,User_POS)) + low(BIT_VEC,W_POS) + low(W_BIT_VEC,User_POS)) <= In_M2S.WUser; DataFIFO_DataIn( low(BIT_VEC,W_POS) + low(W_BIT_VEC,Last_POS)) <= In_M2S.WLast; --R IN Interface DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Data_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)) + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)) <= Out_S2M.RData; DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Resp_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)) + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)) <= Out_S2M.RResp; DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,ID_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,ID_POS)) + low(BIT_VEC,R_POS) + low(R_BIT_VEC,ID_POS)) <= Out_S2M.RID; DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,User_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,User_POS)) + low(BIT_VEC,R_POS) + low(R_BIT_VEC,User_POS)) <= Out_S2M.RUser; DataFIFO_DataIn( low(BIT_VEC,R_POS) + low(R_BIT_VEC,Last_POS)) <= Out_S2M.RLast; --B IN Interface DataFIFO_DataIn( low(BIT_VEC,B_POS) + high(R_BIT_VEC,Resp_POS) downto - low(BIT_VEC,B_POS) + low(R_BIT_VEC,Resp_POS)) + low(BIT_VEC,B_POS) + low(R_BIT_VEC,Resp_POS)) <= Out_S2M.BResp; DataFIFO_DataIn( low(BIT_VEC,B_POS) + high(R_BIT_VEC,ID_POS) downto - low(BIT_VEC,B_POS) + low(R_BIT_VEC,ID_POS)) + low(BIT_VEC,B_POS) + low(R_BIT_VEC,ID_POS)) <= Out_S2M.BID; DataFIFO_DataIn( low(BIT_VEC,B_POS) + high(R_BIT_VEC,User_POS) downto - low(BIT_VEC,B_POS) + low(R_BIT_VEC,User_POS)) + low(BIT_VEC,B_POS) + low(R_BIT_VEC,User_POS)) <= Out_S2M.BUser; ----OUTPUT --AW Out Interface Out_M2S.AWAddr <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Addr_POS)); + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Addr_POS)); Out_M2S.AWCache <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Cache_POS)); + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Cache_POS)); Out_M2S.AWProt <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Protect_POS)); + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Protect_POS)); Out_M2S.AWID <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,ID_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,ID_POS)); + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,ID_POS)); Out_M2S.AWLen <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Len_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Len_POS)); + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Len_POS)); Out_M2S.AWSize <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Size_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Size_POS)); + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Size_POS)); Out_M2S.AWBurst <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Burst_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Burst_POS)); + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Burst_POS)); Out_M2S.AWLock(0) <= DataFIFO_DataOut(low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Lock_POS)); Out_M2S.AWQoS <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,QoS_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,QoS_POS)); + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,QoS_POS)); Out_M2S.AWRegion <= DataFIFO_DataOut(low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Region_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Region_POS)); + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Region_POS)); Out_M2S.AWUser <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,User_POS) downto - low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,User_POS)); + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,User_POS)); --AR Out Interface Out_M2S.ARAddr <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Addr_POS)); + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Addr_POS)); Out_M2S.ARCache <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Cache_POS)); + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Cache_POS)); Out_M2S.ARProt <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Protect_POS)); + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Protect_POS)); Out_M2S.ARID <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,ID_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,ID_POS)); + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,ID_POS)); Out_M2S.ARLen <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Len_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Len_POS)); + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Len_POS)); Out_M2S.ARSize <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Size_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Size_POS)); + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Size_POS)); Out_M2S.ARBurst <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Burst_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Burst_POS)); + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Burst_POS)); Out_M2S.ARLock(0) <= DataFIFO_DataOut(low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Lock_POS)); Out_M2S.ARQoS <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,QoS_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,QoS_POS)); + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,QoS_POS)); Out_M2S.ARRegion <= DataFIFO_DataOut(low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Region_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Region_POS)); + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Region_POS)); Out_M2S.ARUser <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,User_POS) downto - low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,User_POS)); + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,User_POS)); --W Out Interface Out_M2S.WData <= DataFIFO_DataOut(low(BIT_VEC,W_POS) + high(W_BIT_VEC,Data_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)); + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)); Out_M2S.WStrb <= DataFIFO_DataOut(low(BIT_VEC,W_POS) + high(W_BIT_VEC,Strobe_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)); + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)); Out_M2S.WUser <= DataFIFO_DataOut(low(BIT_VEC,W_POS) + high(W_BIT_VEC,User_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,User_POS)); + low(BIT_VEC,W_POS) + low(W_BIT_VEC,User_POS)); Out_M2S.WLast <= DataFIFO_DataOut(low(BIT_VEC,W_POS) + low(W_BIT_VEC,Last_POS)); --R Out Interface In_S2M.RData <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Data_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)); + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)); In_S2M.RResp <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Resp_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)); + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)); In_S2M.RUser <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,User_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,User_POS)); + low(BIT_VEC,R_POS) + low(R_BIT_VEC,User_POS)); In_S2M.RLast <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + low(R_BIT_VEC,Last_POS)); In_S2M.RID <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,ID_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,ID_POS)); + low(BIT_VEC,R_POS) + low(R_BIT_VEC,ID_POS)); --B Out Interface In_S2M.BResp <= DataFIFO_DataOut( low(BIT_VEC,B_POS) + high(R_BIT_VEC,Resp_POS) downto - low(BIT_VEC,B_POS) + low(R_BIT_VEC,Resp_POS)); + low(BIT_VEC,B_POS) + low(R_BIT_VEC,Resp_POS)); In_S2M.BUser <= DataFIFO_DataOut( low(BIT_VEC,B_POS) + high(R_BIT_VEC,User_POS) downto - low(BIT_VEC,B_POS) + low(R_BIT_VEC,User_POS)); + low(BIT_VEC,B_POS) + low(R_BIT_VEC,User_POS)); In_S2M.BID <= DataFIFO_DataOut( low(BIT_VEC,B_POS) + high(R_BIT_VEC,ID_POS) downto - low(BIT_VEC,B_POS) + low(R_BIT_VEC,ID_POS)); + low(BIT_VEC,B_POS) + low(R_BIT_VEC,ID_POS)); gen : for i in 0 to 4 generate @@ -360,52 +360,52 @@ begin DataFifo : entity work.fifo_cc_got generic map ( - D_BITS => BIT_VEC(i), -- Data Width + DATA_BITS => BIT_VEC(i), -- Data Width MIN_DEPTH => MIN_DEPTH(i), -- Minimum FIFO Depth - DATA_REG => FALSE, -- Store Data Content in Registers - STATE_REG => TRUE, -- Registered Full/Empty Indicators - OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + DATA_REG => FALSE, -- Store Data Content in Registers + STATE_REG => TRUE, -- Registered Full/Empty Indicators + OUTPUT_REG => FALSE, -- Registered FIFO Output + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) port map ( -- Global Reset and Clock - rst => Reset, - clk => Clock, + Reset => Reset, + Clock => Clock, -- Writing Interface - put => DataFIFO_put, - din => DataFIFO_DataIn_i, - full => DataFIFO_Full, - estate_wr => open, + Put => DataFIFO_put, + DataIn => DataFIFO_DataIn_i, + Full => DataFIFO_Full, + EmptyState => open, -- Reading Interface - got => DataFIFO_got, - dout => DataFIFO_DataOut_i, - valid => DataFIFO_Valid, - fstate_rd => open + Got => DataFIFO_got, + DataOut => DataFIFO_DataOut_i, + Valid => DataFIFO_Valid, + FillState => open ); else generate - Stage : entity work.fifo_stage + Stage : entity work.fifo_Stage generic map( - D_BITS => BIT_VEC(i), + DATA_BITS => BIT_VEC(i), STAGES => FRAMES +1, LIGHT_WEIGHT => (i = AW_POS) or (i = AR_POS) or (i = B_POS) ) port map( -- Control - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Input - put => DataFIFO_put, - di => DataFIFO_DataIn_i, - ful => DataFIFO_Full, + Put => DataFIFO_put, + DataIn => DataFIFO_DataIn_i, + Full => DataFIFO_Full, -- Output - vld => DataFIFO_Valid, - do => DataFIFO_DataOut_i, - got => DataFIFO_got + Valid => DataFIFO_Valid, + DataOut => DataFIFO_DataOut_i, + Got => DataFIFO_got ); end generate; diff --git a/src/bus/axi4/axi4_FIFO_CDC.vhdl b/src/bus/axi4/axi4_FIFO_CDC.vhdl new file mode 100644 index 000000000..dac1c0d96 --- /dev/null +++ b/src/bus/axi4/axi4_FIFO_CDC.vhdl @@ -0,0 +1,392 @@ +-- ============================================================================= +-- Authors: Stefan Unrein +-- +-- Entity: axi4_FIFO_CDC +-- +-- Description: +-- ------------------------------------- +-- A wrapper of fifo_ic_got for AXI4-MM interface. It creates a separate +-- CDC-FIFO for every of the five substreams. The size of the data-channels is +-- FRAMES * FRAMES_DEPTH, the size of the control-channels is FRAMES. +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.utils.all; +use work.vectors.all; +use work.components.all; +use work.axi4_Full.all; +use work.axi4_Common.all; + + +entity axi4_FIFO_CDC is + generic ( + FRAMES : positive := 2; + FRAME_DEPTH : positive := 1; + DATA_REG : boolean := false; -- Store Data Content in Registers + OUTPUT_REG : boolean := false -- Registered FIFO Output + ); + port ( + -- IN Port + In_Clock : in std_logic; + In_Reset : in std_logic; + In_M2S : in T_AXI4_Bus_M2S; + In_S2M : out T_AXI4_Bus_S2M; + -- OUT Port + Out_Clock : in std_logic; + Out_Reset : in std_logic; + Out_M2S : out T_AXI4_Bus_M2S; + Out_S2M : in T_AXI4_Bus_S2M + ); +end entity; + + +architecture rtl of axi4_FIFO_CDC is + constant LOCK_BITS : natural := 1; + constant LAST_BITS : natural := 1; + + constant ID_POS : natural := 0; + constant User_POS : natural := 1; + constant Addr_POS : natural := 2; + constant Cache_POS : natural := 3; + constant Protect_POS : natural := 4; + constant Len_POS : natural := 5; + constant Size_POS : natural := 6; + constant Burst_POS : natural := 7; + constant Lock_POS : natural := 8; + constant QoS_POS : natural := 9; + constant Region_POS : natural := 10; + + --Data-Only + constant Data_POS : natural := 3; + constant Last_POS : natural := 4; + --Write-Only + constant Strobe_POS : natural := 2; + --Ready/Write-Response-Only + constant Resp_POS : natural := 2; + + constant W_Addr_BIT_VEC : positive_vector := ( ID_POS => In_M2S.AWID'length, User_POS => In_M2S.AWUser'length, Addr_POS => In_M2S.AWAddr'length, + Cache_POS => In_M2S.AWCache'length, Protect_POS => In_M2S.AWProt'length, Len_POS => In_M2S.AWLen'length, + Size_POS => In_M2S.AWSize'length, Burst_POS => In_M2S.AWBurst'length, Lock_POS => LOCK_BITS, + QoS_POS => In_M2S.AWQoS'length, Region_POS => In_M2S.AWRegion'length + ); + constant R_Addr_BIT_VEC : positive_vector := ( ID_POS => In_M2S.ARID'length, User_POS => In_M2S.ARUser'length, Addr_POS => In_M2S.ARAddr'length, + Cache_POS => In_M2S.ARCache'length, Protect_POS => In_M2S.ARProt'length, Len_POS => In_M2S.ARLen'length, + Size_POS => In_M2S.ARSize'length, Burst_POS => In_M2S.ARBurst'length, Lock_POS => LOCK_BITS, + QoS_POS => In_M2S.ARQoS'length, Region_POS => In_M2S.ARRegion'length + ); + constant W_BIT_VEC : positive_vector := (User_POS => In_M2S.WUser'length, Strobe_POS => In_M2S.WStrb'length, Data_POS => In_M2S.WData'length, + Last_POS => LAST_BITS + ); + constant R_BIT_VEC : positive_vector := (ID_POS => In_S2M.RID'length, User_POS => In_S2M.RUser'length, Resp_POS => In_S2M.RResp'length, + Data_POS => In_S2M.RData'length, Last_POS => LAST_BITS + ); + constant B_BIT_VEC : positive_vector := (ID_POS => In_S2M.BID'length, User_POS => In_S2M.BUser'length, Resp_POS => In_S2M.BResp'length); + + constant AW_POS : natural := 0; + constant AR_POS : natural := 1; + constant W_POS : natural := 2; + constant R_POS : natural := 3; + constant B_POS : natural := 4; + + constant BIT_VEC : positive_vector := ( + AW_POS => isum(W_Addr_BIT_VEC), + AR_POS => isum(R_Addr_BIT_VEC), + W_POS => isum(W_BIT_VEC), + R_POS => isum(R_BIT_VEC), + B_POS => isum(B_BIT_VEC) + ); + + constant MIN_DEPTH : positive_vector := ( + AW_POS => FRAMES, + AR_POS => FRAMES, + W_POS => FRAMES * FRAME_DEPTH, + R_POS => FRAMES * FRAME_DEPTH, + B_POS => FRAMES + ); + + signal In_Ready_vec : std_logic_vector(0 to 4); + signal In_Valid_vec : std_logic_vector(0 to 4); + signal Out_Ready_vec : std_logic_vector(0 to 4); + signal Out_Valid_vec : std_logic_vector(0 to 4); + signal DataFIFO_DataIn : std_logic_vector(isum(BIT_VEC) -1 downto 0); + signal DataFIFO_DataOut : std_logic_vector(isum(BIT_VEC) -1 downto 0); + + + +begin + -----INPUT + In_S2M.AWReady <= In_Ready_vec(AW_POS); + In_S2M.ARReady <= In_Ready_vec(AR_POS); + In_S2M.WReady <= In_Ready_vec(W_POS ); + Out_M2S.RReady <= In_Ready_vec(R_POS ); + Out_M2S.BReady <= In_Ready_vec(B_POS ); + + In_Valid_vec(AW_POS) <= In_M2S.AWValid; + In_Valid_vec(AR_POS) <= In_M2S.ARValid; + In_Valid_vec(W_POS ) <= In_M2S.WValid; + In_Valid_vec(R_POS ) <= Out_S2M.RValid; + In_Valid_vec(B_POS ) <= Out_S2M.BValid; + + -----OUTPUT + Out_Ready_vec(AW_POS) <= Out_S2M.AWReady; + Out_Ready_vec(AR_POS) <= Out_S2M.ARReady; + Out_Ready_vec(W_POS ) <= Out_S2M.WReady ; + Out_Ready_vec(R_POS ) <= In_M2S.RReady; + Out_Ready_vec(B_POS ) <= In_M2S.BReady; + + Out_M2S.AWValid <= Out_Valid_vec(AW_POS); + Out_M2S.ARValid <= Out_Valid_vec(AR_POS); + Out_M2S.WValid <= Out_Valid_vec(W_POS ); + In_S2M.RValid <= Out_Valid_vec(R_POS ); + In_S2M.BValid <= Out_Valid_vec(B_POS ); + + -----INPUT + --AW IN Interface + DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Addr_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Addr_POS)) + <= In_M2S.AWAddr; + DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Cache_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Cache_POS)) + <= In_M2S.AWCache; + DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Protect_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Protect_POS)) + <= In_M2S.AWProt; + DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,ID_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,ID_POS)) + <= In_M2S.AWID; + DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Len_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Len_POS)) + <= In_M2S.AWLen; + DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Size_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Size_POS)) + <= In_M2S.AWSize; + DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Burst_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Burst_POS)) + <= In_M2S.AWBurst; + DataFIFO_DataIn( low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Lock_POS)) + <= In_M2S.AWLock(0); + + DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,QoS_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,QoS_POS)) + <= In_M2S.AWQoS; + DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Region_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Region_POS)) + <= In_M2S.AWRegion; + DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,User_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,User_POS)) + <= In_M2S.AWUser; + --AR IN Interface + DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Addr_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Addr_POS)) + <= In_M2S.ARAddr; + DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Cache_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Cache_POS)) + <= In_M2S.ARCache; + DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Protect_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Protect_POS)) + <= In_M2S.ARProt; + DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,ID_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,ID_POS)) + <= In_M2S.ARID; + DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Len_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Len_POS)) + <= In_M2S.ARLen; + DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Size_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Size_POS)) + <= In_M2S.ARSize; + DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Burst_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Burst_POS)) + <= In_M2S.ARBurst; + DataFIFO_DataIn( low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Lock_POS)) + <= In_M2S.ARLock(0); + + DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,QoS_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,QoS_POS)) + <= In_M2S.ARQoS; + DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Region_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Region_POS)) + <= In_M2S.ARRegion; + DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,User_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,User_POS)) + <= In_M2S.ARUser; + --W IN Interface + DataFIFO_DataIn( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Data_POS) downto + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)) + <= In_M2S.WData; + DataFIFO_DataIn( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Strobe_POS) downto + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)) + <= In_M2S.WStrb; + DataFIFO_DataIn( low(BIT_VEC,W_POS) + high(W_BIT_VEC,User_POS) downto + low(BIT_VEC,W_POS) + low(W_BIT_VEC,User_POS)) + <= In_M2S.WUser; + DataFIFO_DataIn( low(BIT_VEC,W_POS) + low(W_BIT_VEC,Last_POS)) + <= In_M2S.WLast; + --R IN Interface + DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Data_POS) downto + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)) + <= Out_S2M.RData; + DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Resp_POS) downto + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)) + <= Out_S2M.RResp; + DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,ID_POS) downto + low(BIT_VEC,R_POS) + low(R_BIT_VEC,ID_POS)) + <= Out_S2M.RID; + DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,User_POS) downto + low(BIT_VEC,R_POS) + low(R_BIT_VEC,User_POS)) + <= Out_S2M.RUser; + DataFIFO_DataIn( low(BIT_VEC,R_POS) + low(R_BIT_VEC,Last_POS)) + <= Out_S2M.RLast; + --B IN Interface + DataFIFO_DataIn( low(BIT_VEC,B_POS) + high(R_BIT_VEC,Resp_POS) downto + low(BIT_VEC,B_POS) + low(R_BIT_VEC,Resp_POS)) + <= Out_S2M.BResp; + DataFIFO_DataIn( low(BIT_VEC,B_POS) + high(R_BIT_VEC,ID_POS) downto + low(BIT_VEC,B_POS) + low(R_BIT_VEC,ID_POS)) + <= Out_S2M.BID; + DataFIFO_DataIn( low(BIT_VEC,B_POS) + high(R_BIT_VEC,User_POS) downto + low(BIT_VEC,B_POS) + low(R_BIT_VEC,User_POS)) + <= Out_S2M.BUser; + + ----OUTPUT + --AW Out Interface + Out_M2S.AWAddr <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Addr_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Addr_POS)); + Out_M2S.AWCache <= DataFIFO_DataOut(low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Cache_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Cache_POS)); + Out_M2S.AWProt <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Protect_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Protect_POS)); + Out_M2S.AWID <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,ID_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,ID_POS)); + Out_M2S.AWLen <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Len_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Len_POS)); + Out_M2S.AWSize <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Size_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Size_POS)); + Out_M2S.AWBurst <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Burst_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Burst_POS)); + Out_M2S.AWLock(0) <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Lock_POS)); + + Out_M2S.AWQoS <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,QoS_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,QoS_POS)); + Out_M2S.AWRegion <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,Region_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,Region_POS)); + Out_M2S.AWUser <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(W_Addr_BIT_VEC,User_POS) downto + low(BIT_VEC,AW_POS) + low(W_Addr_BIT_VEC,User_POS)); + --AR Out Interface + Out_M2S.ARAddr <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Addr_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Addr_POS)); + Out_M2S.ARCache <= DataFIFO_DataOut(low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Cache_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Cache_POS)); + Out_M2S.ARProt <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Protect_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Protect_POS)); + Out_M2S.ARID <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,ID_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,ID_POS)); + Out_M2S.ARLen <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Len_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Len_POS)); + Out_M2S.ARSize <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Size_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Size_POS)); + Out_M2S.ARBurst <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Burst_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Burst_POS)); + Out_M2S.ARLock(0) <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Lock_POS)); + + Out_M2S.ARQoS <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,QoS_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,QoS_POS)); + Out_M2S.ARRegion <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,Region_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,Region_POS)); + Out_M2S.ARUser <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(R_Addr_BIT_VEC,User_POS) downto + low(BIT_VEC,AR_POS) + low(R_Addr_BIT_VEC,User_POS)); + --W Out Interface + Out_M2S.WData <= DataFIFO_DataOut( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Data_POS) downto + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)); + Out_M2S.WStrb <= DataFIFO_DataOut( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Strobe_POS) downto + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)); + Out_M2S.WUser <= DataFIFO_DataOut( low(BIT_VEC,W_POS) + high(W_BIT_VEC,User_POS) downto + low(BIT_VEC,W_POS) + low(W_BIT_VEC,User_POS)); + Out_M2S.WLast <= DataFIFO_DataOut( low(BIT_VEC,W_POS) + low(W_BIT_VEC,Last_POS)); + + --R Out Interface + In_S2M.RData <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Data_POS) downto + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)); + In_S2M.RResp <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Resp_POS) downto + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)); + In_S2M.RUser <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,User_POS) downto + low(BIT_VEC,R_POS) + low(R_BIT_VEC,User_POS)); + In_S2M.RLast <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + low(R_BIT_VEC,Last_POS)); + + In_S2M.RID <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,ID_POS) downto + low(BIT_VEC,R_POS) + low(R_BIT_VEC,ID_POS)); + --B Out Interface + In_S2M.BResp <= DataFIFO_DataOut( low(BIT_VEC,B_POS) + high(R_BIT_VEC,Resp_POS) downto + low(BIT_VEC,B_POS) + low(R_BIT_VEC,Resp_POS)); + In_S2M.BUser <= DataFIFO_DataOut( low(BIT_VEC,B_POS) + high(R_BIT_VEC,User_POS) downto + low(BIT_VEC,B_POS) + low(R_BIT_VEC,User_POS)); + In_S2M.BID <= DataFIFO_DataOut( low(BIT_VEC,B_POS) + high(R_BIT_VEC,ID_POS) downto + low(BIT_VEC,B_POS) + low(R_BIT_VEC,ID_POS)); + + + gen : for i in 0 to 4 generate + signal DataFIFO_put : std_logic; + signal DataFIFO_DataIn_i : std_logic_vector(BIT_VEC(i) -1 downto 0); + signal DataFIFO_DataOut_i : std_logic_vector(BIT_VEC(i) -1 downto 0); + signal DataFIFO_Full : std_logic; + signal DataFIFO_got : std_logic; + signal DataFIFO_Valid : std_logic; + begin + + DataFIFO_put <= In_Valid_vec(i) and not DataFIFO_Full; + In_Ready_vec(i) <= not DataFIFO_Full; + DataFIFO_DataIn_i <= DataFIFO_DataIn(high(BIT_VEC,i) downto low(BIT_VEC,i)); + + DataFIFO_DataOut(high(BIT_VEC,i) downto low(BIT_VEC,i)) <= DataFIFO_DataOut_i; + DataFIFO_got <= Out_Ready_vec(i); + Out_Valid_vec(i) <= DataFIFO_Valid; + + DataFifo : entity work.fifo_ic_got + generic map ( + DATA_BITS => BIT_VEC(i), -- Data Width + MIN_DEPTH => MIN_DEPTH(i), -- Minimum FIFO Depth + DATA_REG => DATA_REG, -- Store Data Content in Registers + OUTPUT_REG => OUTPUT_REG, -- Registered FIFO Output + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits + ) + port map ( + -- Writing Interface + clk_wr => ite(i<3,In_Clock,Out_Clock), + rst_wr => ite(i<3,In_Reset,Out_Reset), + put => DataFIFO_put, + din => DataFIFO_DataIn_i, + full => DataFIFO_Full, + estate_wr => open, + + -- Reading Interface + clk_rd => ite(i<3,Out_Clock,In_Clock), + rst_rd => ite(i<3,Out_Reset,In_Reset), + got => DataFIFO_got, + dout => DataFIFO_DataOut_i, + valid => DataFIFO_Valid, + fstate_rd => open + ); + + end generate; + + +end architecture; diff --git a/src/bus/axi4/AXI4_Full.pkg.vhdl b/src/bus/axi4/axi4_Full.pkg.vhdl similarity index 82% rename from src/bus/axi4/AXI4_Full.pkg.vhdl rename to src/bus/axi4/axi4_Full.pkg.vhdl index 484ec6a97..db1a02bfb 100644 --- a/src/bus/axi4/AXI4_Full.pkg.vhdl +++ b/src/bus/axi4/axi4_Full.pkg.vhdl @@ -53,47 +53,47 @@ use IEEE.numeric_std.all; use work.utils.all; use work.strings.all; -use work.AXI4_Common.all; - - -package AXI4_Full is - alias T_AXI4_Response is work.AXI4_Common.T_AXI4_Response; - alias C_AXI4_RESPONSE_OKAY is work.AXI4_Common.C_AXI4_RESPONSE_OKAY; - alias C_AXI4_RESPONSE_EX_OKAY is work.AXI4_Common.C_AXI4_RESPONSE_EX_OKAY; - alias C_AXI4_RESPONSE_SLAVE_ERROR is work.AXI4_Common.C_AXI4_RESPONSE_SLAVE_ERROR; - alias C_AXI4_RESPONSE_DECODE_ERROR is work.AXI4_Common.C_AXI4_RESPONSE_DECODE_ERROR; - alias C_AXI4_RESPONSE_INIT is work.AXI4_Common.C_AXI4_RESPONSE_INIT; - - alias T_AXI4_Cache is work.AXI4_Common.T_AXI4_Cache; - alias C_AXI4_CACHE_INIT is work.AXI4_Common.C_AXI4_CACHE_INIT; - alias C_AXI4_CACHE is work.AXI4_Common.C_AXI4_CACHE; - - alias T_AXI4_Protect is work.AXI4_Common.T_AXI4_Protect; - alias C_AXI4_PROTECT_INIT is work.AXI4_Common.C_AXI4_PROTECT_INIT; - alias C_AXI4_PROTECT is work.AXI4_Common.C_AXI4_PROTECT; - - alias T_AXI4_QoS is work.AXI4_Common.T_AXI4_QoS; - alias C_AXI4_QOS_INIT is work.AXI4_Common.C_AXI4_QOS_INIT; - - alias T_AXI4_Region is work.AXI4_Common.T_AXI4_Region; - alias C_AXI4_REGION_INIT is work.AXI4_Common.C_AXI4_REGION_INIT; - - alias T_AXI4_Size is work.AXI4_Common.T_AXI4_Size; - alias C_AXI4_SIZE_1 is work.AXI4_Common.C_AXI4_SIZE_1; - alias C_AXI4_SIZE_2 is work.AXI4_Common.C_AXI4_SIZE_2; - alias C_AXI4_SIZE_4 is work.AXI4_Common.C_AXI4_SIZE_4; - alias C_AXI4_SIZE_8 is work.AXI4_Common.C_AXI4_SIZE_8; - alias C_AXI4_SIZE_16 is work.AXI4_Common.C_AXI4_SIZE_16; - alias C_AXI4_SIZE_32 is work.AXI4_Common.C_AXI4_SIZE_32; - alias C_AXI4_SIZE_64 is work.AXI4_Common.C_AXI4_SIZE_64; - alias C_AXI4_SIZE_128 is work.AXI4_Common.C_AXI4_SIZE_128; - alias C_AXI4_SIZE_INIT is work.AXI4_Common.C_AXI4_SIZE_INIT; - - alias T_AXI4_Burst is work.AXI4_Common.T_AXI4_Burst; - alias C_AXI4_BURST_FIXED is work.AXI4_Common.C_AXI4_BURST_FIXED; - alias C_AXI4_BURST_INCR is work.AXI4_Common.C_AXI4_BURST_INCR; - alias C_AXI4_BURST_WRAP is work.AXI4_Common.C_AXI4_BURST_WRAP; - alias C_AXI4_BURST_INIT is work.AXI4_Common.C_AXI4_BURST_INIT; +use work.axi4_Common.all; + + +package axi4_Full is + alias T_AXI4_Response is work.axi4_Common.T_AXI4_Response; + alias C_AXI4_RESPONSE_OKAY is work.axi4_Common.C_AXI4_RESPONSE_OKAY; + alias C_AXI4_RESPONSE_EX_OKAY is work.axi4_Common.C_AXI4_RESPONSE_EX_OKAY; + alias C_AXI4_RESPONSE_SLAVE_ERROR is work.axi4_Common.C_AXI4_RESPONSE_SLAVE_ERROR; + alias C_AXI4_RESPONSE_DECODE_ERROR is work.axi4_Common.C_AXI4_RESPONSE_DECODE_ERROR; + alias C_AXI4_RESPONSE_INIT is work.axi4_Common.C_AXI4_RESPONSE_INIT; + + alias T_AXI4_Cache is work.axi4_Common.T_AXI4_Cache; + alias C_AXI4_CACHE_INIT is work.axi4_Common.C_AXI4_CACHE_INIT; + alias C_AXI4_CACHE is work.axi4_Common.C_AXI4_CACHE; + + alias T_AXI4_Protect is work.axi4_Common.T_AXI4_Protect; + alias C_AXI4_PROTECT_INIT is work.axi4_Common.C_AXI4_PROTECT_INIT; + alias C_AXI4_PROTECT is work.axi4_Common.C_AXI4_PROTECT; + + alias T_AXI4_QoS is work.axi4_Common.T_AXI4_QoS; + alias C_AXI4_QOS_INIT is work.axi4_Common.C_AXI4_QOS_INIT; + + alias T_AXI4_Region is work.axi4_Common.T_AXI4_Region; + alias C_AXI4_REGION_INIT is work.axi4_Common.C_AXI4_REGION_INIT; + + alias T_AXI4_Size is work.axi4_Common.T_AXI4_Size; + alias C_AXI4_SIZE_1 is work.axi4_Common.C_AXI4_SIZE_1; + alias C_AXI4_SIZE_2 is work.axi4_Common.C_AXI4_SIZE_2; + alias C_AXI4_SIZE_4 is work.axi4_Common.C_AXI4_SIZE_4; + alias C_AXI4_SIZE_8 is work.axi4_Common.C_AXI4_SIZE_8; + alias C_AXI4_SIZE_16 is work.axi4_Common.C_AXI4_SIZE_16; + alias C_AXI4_SIZE_32 is work.axi4_Common.C_AXI4_SIZE_32; + alias C_AXI4_SIZE_64 is work.axi4_Common.C_AXI4_SIZE_64; + alias C_AXI4_SIZE_128 is work.axi4_Common.C_AXI4_SIZE_128; + alias C_AXI4_SIZE_INIT is work.axi4_Common.C_AXI4_SIZE_INIT; + + alias T_AXI4_Burst is work.axi4_Common.T_AXI4_Burst; + alias C_AXI4_BURST_FIXED is work.axi4_Common.C_AXI4_BURST_FIXED; + alias C_AXI4_BURST_INCR is work.axi4_Common.C_AXI4_BURST_INCR; + alias C_AXI4_BURST_WRAP is work.axi4_Common.C_AXI4_BURST_WRAP; + alias C_AXI4_BURST_INIT is work.axi4_Common.C_AXI4_BURST_INIT; type T_AXI4_Bus_S2M is record AWReady : std_logic; @@ -167,11 +167,13 @@ package AXI4_Full is function AddressMask(InBus : T_AXI4_Bus_M2S; AddressBits : natural) return T_AXI4_Bus_M2S; function AddressMask(InBus : T_AXI4_Bus_M2S; Mask : std_logic_vector) return T_AXI4_Bus_M2S; function AddressResize(InBus : T_AXI4_Bus_M2S; AddressBits : natural) return T_AXI4_Bus_M2S; + function IDResize(InBus : T_AXI4_Bus_M2S; AWIDBits : natural; ARIDBits : natural) return T_AXI4_Bus_M2S; + function IDResize(InBus : T_AXI4_Bus_S2M; RIDBits : natural; BIDBits : natural) return T_AXI4_Bus_S2M; function Initialize_AXI4_Bus_S2M(AddressBits : natural; DataBits : natural; UserBits : natural := 0; IDBits : natural := 0; Value : std_logic := 'Z') return T_AXI4_Bus_S2M; function Initialize_AXI4_Bus_M2S(AddressBits : natural; DataBits : natural; UserBits : natural := 0; IDBits : natural := 0; Value : std_logic := 'Z') return T_AXI4_Bus_M2S; - procedure ConnectAndResize(signal In_M2S : in T_AXI4_Bus_M2S; signal In_S2M : out T_AXI4_Bus_S2M; signal Out_M2S : out T_AXI4_Bus_M2S; signal Out_S2M : in T_AXI4_Bus_S2M; constant Info_Prefix : string := ""); + procedure ConnectAndResize(signal In_M2S : in T_AXI4_Bus_M2S; signal In_S2M : out T_AXI4_Bus_S2M; signal Out_M2S : out T_AXI4_Bus_M2S; signal Out_S2M : in T_AXI4_Bus_S2M; constant Info_Prefix : string := ""); type T_AXI4_Bus is record M2S : T_AXI4_Bus_M2S; S2M : T_AXI4_Bus_S2M; @@ -183,7 +185,7 @@ package AXI4_Full is type T_Address_Translate_Command is (None, Increase, Decrease, Hold); type T_Address_Translate_Command_Vector is array(natural range <>) of T_Address_Translate_Command; end package; -package body AXI4_Full is +package body axi4_Full is function EnableTransaction(InBus : T_AXI4_Bus_M2S; Enable : std_logic) return T_AXI4_Bus_M2S is variable temp : InBus'subtype; @@ -234,7 +236,7 @@ package body AXI4_Full is function AddressTranslate(InBus : T_AXI4_Bus_M2S; Offset : signed) return T_AXI4_Bus_M2S is variable temp : InBus'subtype; begin - assert Offset'length = InBus.AWAddr'length report "PoC.AXI4_Full.AddressTranslate: Length of Offeset-Bits and Address-Bits is no equal!" severity failure; + assert Offset'length = InBus.AWAddr'length report "PoC.axi4_Full.AddressTranslate: Length of Offeset-Bits and Address-Bits is no equal!" severity failure; temp.AWID := InBus.AWID; temp.AWAddr := std_logic_vector(unsigned(InBus.AWAddr) + unsigned(std_logic_vector(Offset))); @@ -311,7 +313,7 @@ package body AXI4_Full is function AddressMask(InBus : T_AXI4_Bus_M2S; Mask : std_logic_vector) return T_AXI4_Bus_M2S is variable temp : InBus'subtype; begin - assert Mask'length = InBus.AWAddr'length report "PoC.AXI4_Full.AddressTranslate: Length of Mask-Bits and Address-Bits is no equal!" severity failure; + assert Mask'length = InBus.AWAddr'length report "PoC.axi4_Full.AddressMask: Length of Mask-Bits and Address-Bits is no equal!" severity failure; temp.AWID := InBus.AWID; temp.AWAddr := InBus.AWAddr and Mask; @@ -389,6 +391,70 @@ package body AXI4_Full is return temp; end function; + function IDResize(InBus : T_AXI4_Bus_M2S; AWIDBits : natural; ARIDBits : natural) return T_AXI4_Bus_M2S is + variable temp : T_AXI4_Bus_M2S( + AWID(AWIDBits -1 downto 0), ARID(ARIDBits -1 downto 0), + AWUser(InBus.AWUser'range), ARUser(InBus.ARUser'range), WUser(InBus.WUser'range), + WData(InBus.WData'range), WStrb(InBus.WStrb'range), + AWAddr(InBus.AWAddr'range), ARAddr(InBus.ARAddr'range) + ); + begin + temp.AWID := resize(InBus.AWID, AWIDBits); + temp.AWAddr := InBus.AWAddr; + temp.AWLen := InBus.AWLen; + temp.AWSize := InBus.AWSize; + temp.AWBurst := InBus.AWBurst; + temp.AWLock := InBus.AWLock; + temp.AWQOS := InBus.AWQOS; + temp.AWRegion := InBus.AWRegion; + temp.AWUser := InBus.AWUser; + temp.AWValid := InBus.AWValid; + temp.AWCache := InBus.AWCache; + temp.AWProt := InBus.AWProt; + temp.WValid := InBus.WValid; + temp.WLast := InBus.WLast; + temp.WUser := InBus.WUser; + temp.WData := InBus.WData; + temp.WStrb := InBus.WStrb; + temp.BReady := InBus.BReady; + temp.ARValid := InBus.ARValid; + temp.ARAddr := InBus.ARAddr; + temp.ARCache := InBus.ARCache; + temp.ARProt := InBus.ARProt; + temp.ARID := resize(InBus.ARID, ARIDBits); + temp.ARLen := InBus.ARLen; + temp.ARSize := InBus.ARSize; + temp.ARBurst := InBus.ARBurst; + temp.ARLock := InBus.ARLock; + temp.ARQOS := InBus.ARQOS; + temp.ARRegion := InBus.ARRegion; + temp.ARUser := InBus.ARUser; + temp.RReady := InBus.RReady; + return temp; + end function; + function IDResize(InBus : T_AXI4_Bus_S2M; RIDBits : natural; BIDBits : natural) return T_AXI4_Bus_S2M is + variable temp : T_AXI4_Bus_S2M( + BID(BIDBits -1 downto 0), RID(RIDBits -1 downto 0), + BUser(InBus.BUser'range), RUser(InBus.RUser'range), + RData(InBus.RData'range) + ); + begin + temp.AWReady := InBus.AWReady; + temp.WReady := InBus.WReady ; + temp.BValid := InBus.BValid ; + temp.BResp := InBus.BResp ; + temp.BID := resize(InBus.BID, BIDBits); + temp.BUser := InBus.BUser ; + temp.ARReady := InBus.ARReady; + temp.RValid := InBus.RValid ; + temp.RData := InBus.RData ; + temp.RResp := InBus.RResp ; + temp.RID := resize(InBus.RID, RIDBits); + temp.RLast := InBus.RLast ; + temp.RUser := InBus.RUser ; + return temp; + end function; + function EnableTransaction(InBus : T_AXI4_Bus_S2M; Enable : std_logic) return T_AXI4_Bus_S2M is variable temp : InBus'subtype; begin @@ -643,12 +709,12 @@ package body AXI4_Full is ); end function; - procedure ConnectAndResize(signal In_M2S : in T_AXI4_Bus_M2S; signal In_S2M : out T_AXI4_Bus_S2M; signal Out_M2S : out T_AXI4_Bus_M2S; signal Out_S2M : in T_AXI4_Bus_S2M; constant Info_Prefix : string := "") is + procedure ConnectAndResize(signal In_M2S : in T_AXI4_Bus_M2S; signal In_S2M : out T_AXI4_Bus_S2M; signal Out_M2S : out T_AXI4_Bus_M2S; signal Out_S2M : in T_AXI4_Bus_S2M; constant Info_Prefix : string := "") is begin - assert In_S2M.RID'length = Out_S2M.RID'length report Info_Prefix & " AXI4_Full.pkg.ConnectAndResize:: Resizing RID from " & to_string(Out_S2M.RID'length) & " to " & to_string(In_S2M.RID'length) severity NOTE; - assert In_S2M.BID'length = Out_S2M.BID'length report Info_Prefix & " AXI4_Full.pkg.ConnectAndResize:: Resizing BID from " & to_string(Out_S2M.BID'length) & " to " & to_string(In_S2M.BID'length) severity NOTE; - assert In_S2M.BUser'length = Out_S2M.BUser'length report Info_Prefix & " AXI4_Full.pkg.ConnectAndResize:: Resizing BUser from " & to_string(Out_S2M.BUser'length) & " to " & to_string(In_S2M.BUser'length) severity NOTE; - assert In_S2M.RUser'length = Out_S2M.RUser'length report Info_Prefix & " AXI4_Full.pkg.ConnectAndResize:: Resizing RUser from " & to_string(Out_S2M.RUser'length) & " to " & to_string(In_S2M.RUser'length) severity NOTE; + assert In_S2M.RID'length = Out_S2M.RID'length report Info_Prefix & " axi4_Full.pkg.ConnectAndResize:: Resizing RID from " & to_string(Out_S2M.RID'length) & " to " & to_string(In_S2M.RID'length) severity NOTE; + assert In_S2M.BID'length = Out_S2M.BID'length report Info_Prefix & " axi4_Full.pkg.ConnectAndResize:: Resizing BID from " & to_string(Out_S2M.BID'length) & " to " & to_string(In_S2M.BID'length) severity NOTE; + assert In_S2M.BUser'length = Out_S2M.BUser'length report Info_Prefix & " axi4_Full.pkg.ConnectAndResize:: Resizing BUser from " & to_string(Out_S2M.BUser'length) & " to " & to_string(In_S2M.BUser'length) severity NOTE; + assert In_S2M.RUser'length = Out_S2M.RUser'length report Info_Prefix & " axi4_Full.pkg.ConnectAndResize:: Resizing RUser from " & to_string(Out_S2M.RUser'length) & " to " & to_string(In_S2M.RUser'length) severity NOTE; In_S2M.RUser <= resize(Out_S2M.RUser, In_S2M.RUser'length);--: std_logic_vector; In_S2M.BUser <= resize(Out_S2M.BUser, In_S2M.BUser'length);--: std_logic_vector; In_S2M.BID <= resize(Out_S2M.BID, In_S2M.BID'length);--: std_logic_vector; @@ -663,13 +729,13 @@ package body AXI4_Full is In_S2M.RResp <= Out_S2M.RResp;--: T_AXI4_Response; In_S2M.RLast <= Out_S2M.RLast;--: std_logic; - assert Out_M2S.ARID'length = In_M2S.ARID'length report Info_Prefix & " AXI4_Full.pkg.ConnectAndResize:: Resizing ARID from " & to_string(In_M2S.ARID'length) & " to " & to_string(Out_M2S.ARID'length) severity NOTE; - assert Out_M2S.AWID'length = In_M2S.AWID'length report Info_Prefix & " AXI4_Full.pkg.ConnectAndResize:: Resizing AWID from " & to_string(In_M2S.AWID'length) & " to " & to_string(Out_M2S.AWID'length) severity NOTE; - assert Out_M2S.AWAddr'length = In_M2S.AWAddr'length report Info_Prefix & " AXI4_Full.pkg.ConnectAndResize:: Resizing AWAddr from " & to_string(In_M2S.AWAddr'length) & " to " & to_string(Out_M2S.AWAddr'length) severity NOTE; - assert Out_M2S.ARAddr'length = In_M2S.ARAddr'length report Info_Prefix & " AXI4_Full.pkg.ConnectAndResize:: Resizing ARAddr from " & to_string(In_M2S.ARAddr'length) & " to " & to_string(Out_M2S.ARAddr'length) severity NOTE; - assert Out_M2S.ARUser'length = In_M2S.ARUser'length report Info_Prefix & " AXI4_Full.pkg.ConnectAndResize:: Resizing ARUser from " & to_string(In_M2S.ARUser'length) & " to " & to_string(Out_M2S.ARUser'length) severity NOTE; - assert Out_M2S.AWUser'length = In_M2S.AWUser'length report Info_Prefix & " AXI4_Full.pkg.ConnectAndResize:: Resizing AWUser from " & to_string(In_M2S.AWUser'length) & " to " & to_string(Out_M2S.AWUser'length) severity NOTE; - assert Out_M2S.WUser'length = In_M2S.WUser'length report Info_Prefix & " AXI4_Full.pkg.ConnectAndResize:: Resizing WUser from " & to_string(In_M2S.WUser'length) & " to " & to_string(Out_M2S.WUser'length) severity NOTE; + assert Out_M2S.ARID'length = In_M2S.ARID'length report Info_Prefix & " axi4_Full.pkg.ConnectAndResize:: Resizing ARID from " & to_string(In_M2S.ARID'length) & " to " & to_string(Out_M2S.ARID'length) severity NOTE; + assert Out_M2S.AWID'length = In_M2S.AWID'length report Info_Prefix & " axi4_Full.pkg.ConnectAndResize:: Resizing AWID from " & to_string(In_M2S.AWID'length) & " to " & to_string(Out_M2S.AWID'length) severity NOTE; + assert Out_M2S.AWAddr'length = In_M2S.AWAddr'length report Info_Prefix & " axi4_Full.pkg.ConnectAndResize:: Resizing AWAddr from " & to_string(In_M2S.AWAddr'length) & " to " & to_string(Out_M2S.AWAddr'length) severity NOTE; + assert Out_M2S.ARAddr'length = In_M2S.ARAddr'length report Info_Prefix & " axi4_Full.pkg.ConnectAndResize:: Resizing ARAddr from " & to_string(In_M2S.ARAddr'length) & " to " & to_string(Out_M2S.ARAddr'length) severity NOTE; + assert Out_M2S.ARUser'length = In_M2S.ARUser'length report Info_Prefix & " axi4_Full.pkg.ConnectAndResize:: Resizing ARUser from " & to_string(In_M2S.ARUser'length) & " to " & to_string(Out_M2S.ARUser'length) severity NOTE; + assert Out_M2S.AWUser'length = In_M2S.AWUser'length report Info_Prefix & " axi4_Full.pkg.ConnectAndResize:: Resizing AWUser from " & to_string(In_M2S.AWUser'length) & " to " & to_string(Out_M2S.AWUser'length) severity NOTE; + assert Out_M2S.WUser'length = In_M2S.WUser'length report Info_Prefix & " axi4_Full.pkg.ConnectAndResize:: Resizing WUser from " & to_string(In_M2S.WUser'length) & " to " & to_string(Out_M2S.WUser'length) severity NOTE; Out_M2S.ARID <= resize(In_M2S.ARID, Out_M2S.ARID'length);--: std_logic_vector; Out_M2S.AWID <= resize(In_M2S.AWID, Out_M2S.AWID'length);--: std_logic_vector; Out_M2S.AWAddr <= resize(In_M2S.AWAddr, Out_M2S.AWAddr'length);--: std_logic_vector; @@ -704,7 +770,7 @@ package body AXI4_Full is end procedure; end package body; -use work.AXI4_Full.all; +use work.axi4_Full.all; package AXI4Full_Sized is generic ( diff --git a/src/bus/axi4/axi4_Mux.vhdl b/src/bus/axi4/axi4_Mux.vhdl new file mode 100644 index 000000000..353270d95 --- /dev/null +++ b/src/bus/axi4/axi4_Mux.vhdl @@ -0,0 +1,607 @@ +-- ============================================================================= +-- Authors: Stefan Unrein +-- +-- Entity: AXI4 Multiplexer +-- +-- Description: +-- ------------------------------------- +-- The module provides a multiplexing function between generic +-- AXI4 channel to one AXI4 channel. +-- Note that this module terminates ID's on the input and genrates new ID's for +-- every output-port. On response reception, the response is forwarded with the +-- original ID to the manager. The number of read and write ID's is defined by +-- NUM_OUTSTANDING_READS and NUM_OUTSTANDING_WRITES, where the ID's from +-- 0 to NUM_OUTSTANDING_* -1 are generated. +-- The subordinate must support the given number of ID's to work. Leave +-- NUM_OUTSTANDING_* at init value 0 to generate ID's of the full ID-width +-- (2**ID-width). +-- PIPELINE_IN and PIPELINE_OUT provide the settings for input and ouput +-- pipelining stages as a timing relaxantion setting. +-- The inputs are arbitrated in a round-robin fashion for all active data +-- channels. +-- +-- Utilization compared to Xilinx Crossbar (2.1) 4 Slave => 1 Master (32 Addr/Data) +-- | LUT | FF | Comment | +-- | ---- | ---- | ---------------------- | +-- | 439 | 349 | Xilinx Crosbar ( 2 IDs)| +-- | 953 | 688 | Xilinx Crosbar (16 IDs)| +-- | 309 | 21 | 0 Glue ( 2 IDs) | +-- | 447 | 55 | 0 Glue (16 IDs) | +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.utils.all; +use work.vectors.all; +use work.components.all; +use work.axi4_Full.all; +use work.axi4stream.all; + +entity axi4_Mux is + generic( + PIPELINE_IN : natural_vector := (0 => 0); + PIPELINE_OUT : natural := 0; + NUM_OUTSTANDING_READS : natural := 0; -- if zero, use full ID width (2**ID) + NUM_OUTSTANDING_WRITES : natural := 0 -- if zero, use full ID width (2**ID) + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + -- IN Port + In_M2S : in T_AXI4_Bus_M2S_VECTOR; + In_S2M : out T_AXI4_Bus_S2M_VECTOR; + -- OUT Port + Out_M2S : out T_AXI4_Bus_M2S; + Out_S2M : in T_AXI4_Bus_S2M + ); +end entity; + +architecture rtl of axi4_Mux is + constant PORTS : positive := In_M2S'length; + constant PORT_BITS : positive := log2ceilnz(PORTS); + + constant IN_AW_ID_BITS : natural := In_M2S(In_M2S'low).AWID'length; + constant Out_AW_ID_BITS : natural := Out_M2S.AWID'length; + constant IN_AR_ID_BITS : natural := In_M2S(In_M2S'low).ARID'length; + constant Out_AR_ID_BITS : natural := Out_M2S.ARID'length; + -- constant ADDRESS_BITS : natural := In_M2S(In_M2S'low).AWAddr'length; + -- constant DATA_BITS : natural := Out_M2S.WData'length; + + signal In_M2S_g : In_M2S'subtype; + signal In_S2M_g : In_S2M'subtype; + signal In_M2S_write : In_M2S'subtype; + signal In_S2M_write : In_S2M'subtype; + signal In_M2S_read : In_M2S'subtype; + signal In_S2M_read : In_S2M'subtype; + + signal Out_M2S_g : Out_M2S'subtype; + signal Out_S2M_g : Out_S2M'subtype; + signal Out_M2S_write : Out_M2S'subtype; + signal Out_S2M_write : Out_S2M'subtype; + signal Out_M2S_read : Out_M2S'subtype; + signal Out_S2M_read : Out_S2M'subtype; + +begin + assert In_M2S(In_M2S'low).AWAddr'length = Out_M2S.AWAddr'length report "PoC.axi4_Mux:: AWAddr size of in and out not matching!" severity failure; + assert In_M2S(In_M2S'low).ARAddr'length = Out_M2S.ARAddr'length report "PoC.axi4_Mux:: ARAddr size of in and out not matching!" severity failure; + assert In_M2S(In_M2S'low).WData'length = Out_M2S.WData'length report "PoC.axi4_Mux:: WData size of in and out not matching!" severity failure; + assert In_S2M(In_M2S'low).RData'length = Out_S2M.RData'length report "PoC.axi4_Mux:: RData size of in and out not matching!" severity failure; + -- assert In_S2M(In_M2S'low).AWID'length = Out_S2M.BID'length report "PoC.axi4_Mux:: Write ID size of in and out not matching!" severity failure; + -- assert In_S2M(In_M2S'low).ARID'length = Out_S2M.RID'length report "PoC.axi4_Mux:: Read ID size of in and out not matching!" severity failure; + assert PIPELINE_IN'length = PORTS report "PoC.axi4_Mux:: PIPELINE_IN-Length is not equal to Number Port-Vector!" severity failure; + + glue_in_loop_gen : for i in In_M2S'range generate + glue_in_gen : if PIPELINE_IN(i) > 0 generate + Glue_in : entity work.axi4_FIFO + generic map( + FRAMES => PIPELINE_IN(i) -1 + ) + port map( + Clock => Clock, + Reset => Reset, + -- IN Port + In_M2S => In_M2S(i), + In_S2M => In_S2M(i), + -- OUT Port + Out_M2S => In_M2S_g(i), + Out_S2M => In_S2M_g(i) + ); + else generate + In_M2S_g(i) <= In_M2S(i); + In_S2M(i) <= In_S2M_g(i); + end generate; + end generate; + + glue_out_gen : if PIPELINE_OUT > 0 generate + Glue_out : entity work.axi4_FIFO + generic map( + FRAMES => PIPELINE_OUT -1 + ) + port map( + Clock => Clock, + Reset => Reset, + -- IN Port + In_M2S => Out_M2S_g, + In_S2M => Out_S2M_g, + -- OUT Port + Out_M2S => Out_M2S, + Out_S2M => Out_S2M + ); + else generate + Out_M2S <= Out_M2S_g; + Out_S2M_g <= Out_S2M; + end generate; + + write_blk : block + type T_STATE is (ST_Idle, ST_Dataflow, ST_DataOnly, ST_AddressOnly); + + signal State : T_STATE := ST_Idle; + signal NextState : T_STATE; + + --OoO-Buffer Signals + -- Put Port + signal Put : std_logic; + signal Full : std_logic; + signal DataIn : std_logic_vector(PORT_BITS + In_AW_ID_BITS - 1 downto 0); + signal IndexOut : unsigned(log2ceilnz(ite(NUM_OUTSTANDING_WRITES = 0, 2**Out_AW_ID_BITS, NUM_OUTSTANDING_WRITES)) - 1 downto 0); + -- Get Port + signal Got : std_logic; + signal Valid : std_logic; + signal DataOut : std_logic_vector(PORT_BITS + In_AW_ID_BITS - 1 downto 0); + + signal Arbitrate : std_logic; + signal RequestVector : std_logic_vector(PORTS - 1 downto 0); + signal Arbitrated : std_logic; + signal GrantVector : std_logic_vector(PORTS - 1 downto 0); + signal GrantIndex : unsigned(log2ceilnz(PORTS) - 1 downto 0); + + signal RequestWithSelf : std_logic; + signal RequestWithoutSelf : std_logic; + + signal Write_Response_Error : std_logic; + begin + assign_gen : for i in 0 to PORTS - 1 generate + RequestVector(i) <= In_M2S_write(i).AWValid and In_M2S_write(i).WValid; + end generate; + + RequestWithSelf <= slv_or(RequestVector); + RequestWithoutSelf <= slv_or(RequestVector and not GrantVector); + + process(Clock) + begin + if rising_edge(Clock) then + if (Reset = '1') then + State <= ST_Idle; + else + State <= NextState; + end if; + end if; + end process; + + process(all) + variable writeResponseIndex : natural; + begin + NextState <= State; + + In_S2M_write <= (In_S2M'range => Initialize_AXI4_Bus_S2M(Out_M2S.AWAddr'length, Out_S2M.RData'length, Out_S2M.RUser'length, In_S2M(In_S2M'low).BID'length, '0')); + Out_M2S_write <= Initialize_AXI4_Bus_M2S(Out_M2S.AWAddr'length, Out_M2S.WData'length, Out_M2S.WUser'length, Out_M2S.AWID'length, '0'); + + Arbitrate <= '0'; + Put <= '0'; + DataIn <= (others => '0'); + Got <= '0'; + + case State is + when ST_Idle => + if (RequestWithSelf = '1') and (Full = '0') then + Arbitrate <= '1'; + NextState <= ST_Dataflow; + end if; + + when ST_Dataflow => + -- Arbitrated is always set a clock cycle after request + Out_M2S_write <= IDResize(In_M2S_write(to_integer(GrantIndex)), Out_AW_ID_BITS, Out_AR_ID_BITS); + In_S2M_write(to_integer(GrantIndex)) <= IDResize(Out_S2M_write, In_AW_ID_BITS, In_AR_ID_BITS); + + DataIn(In_AW_ID_BITS -1 downto 0) <= In_M2S_write(to_integer(GrantIndex)).AWID; + DataIn(PORT_BITS + In_AW_ID_BITS -1 downto In_AW_ID_BITS) <= std_logic_vector(GrantIndex); + + if (Out_S2M_write.AWReady and In_M2S_write(to_integer(GrantIndex)).WValid and In_M2S_write(to_integer(GrantIndex)).WLast and Out_S2M_write.WReady) = '1' then --Write Data and Address finished at the same time, AW Valid was set and checked in Idle state + Put <= '1'; + NextState <= ST_Idle; -- We need always to go to Idle, because we put the data into OoO-buffer in this CC and full is updated in next CC + + elsif Out_S2M_write.AWReady = '1' then -- We transmitted the Write Address + Put <= '1'; + NextState <= ST_DataOnly; + + elsif (In_M2S_write(to_integer(GrantIndex)).WValid and In_M2S_write(to_integer(GrantIndex)).WLast and Out_S2M_write.WReady) = '1' then -- We transmitted the Write Data + NextState <= ST_AddressOnly; + end if; + + when ST_DataOnly => + Out_M2S_write <= IDResize(In_M2S_write(to_integer(GrantIndex)), Out_AW_ID_BITS, Out_AR_ID_BITS); + Out_M2S_write.AWValid <= '0'; + In_S2M_write(to_integer(GrantIndex)) <= IDResize(Out_S2M_write, In_AW_ID_BITS, In_AR_ID_BITS); + In_S2M_write(to_integer(GrantIndex)).AWReady <= '0'; + + if (In_M2S_write(to_integer(GrantIndex)).WValid and In_M2S_write(to_integer(GrantIndex)).WLast and Out_S2M_write.WReady) = '1' then -- We transmitted the Write Data + if (RequestWithoutSelf = '1') and (Full = '0') then -- We have another request that can be processed immediately + Arbitrate <= '1'; + NextState <= ST_Dataflow; + else + NextState <= ST_Idle; + end if; + end if; + + when ST_AddressOnly => + Out_M2S_write <= IDResize(In_M2S_write(to_integer(GrantIndex)), Out_AW_ID_BITS, Out_AR_ID_BITS); + Out_M2S_write.WValid <= '0'; + In_S2M_write(to_integer(GrantIndex)) <= IDResize(Out_S2M_write, In_AW_ID_BITS, In_AR_ID_BITS); + In_S2M_write(to_integer(GrantIndex)).WReady <= '0'; + + DataIn(In_AW_ID_BITS -1 downto 0) <= In_M2S_write(to_integer(GrantIndex)).AWID; + DataIn(PORT_BITS + In_AW_ID_BITS -1 downto In_AW_ID_BITS) <= std_logic_vector(GrantIndex); + + if Out_S2M_write.AWReady = '1' then -- We transmitted the Write Address + Put <= '1'; + NextState <= ST_Idle; + end if; + end case; + + -- Have AWID always connected to OoO Index + Out_M2S_write.AWID <= to_slv(resize(IndexOut, Out_AW_ID_BITS)); + + -- Handle write response + writeResponseIndex := to_integer(unsigned(DataOut(PORT_BITS + In_AW_ID_BITS -1 downto In_AW_ID_BITS))); + + for i in 0 to PORTS -1 loop -- Write response data can stay always the same + In_S2M_write(i).BID <= DataOut(In_AW_ID_BITS -1 downto 0); + In_S2M_write(i).BResp <= Out_S2M_write.BResp; + In_S2M_write(i).BUser <= Out_S2M_write.BUser; + In_S2M_write(i).BValid <= '0'; + end loop; + + Out_M2S_write.BReady <= '0'; + if writeResponseIndex < PORTS then + In_S2M_write(writeResponseIndex).BValid <= Out_S2M_write.BValid and Valid; + Out_M2S_write.BReady <= In_M2S_write(writeResponseIndex).BReady; + Got <= In_M2S_write(writeResponseIndex).BReady and Out_S2M_write.BValid; + end if; + end process; + + Write_Response_Error <= Got and not Valid when rising_edge(Clock); + assert Write_Response_Error = '0' report "PoC.axi4_Mux:: Got write response but no matching index!" severity warning; + + Write_idx : entity work.dstruct_OutOfOrderBuffer + generic map( + DATA_BITS => PORT_BITS + In_AW_ID_BITS, + NUM_INDEX => ite(NUM_OUTSTANDING_WRITES = 0, 2**Out_AW_ID_BITS, NUM_OUTSTANDING_WRITES) + ) + port map( + -- INPUTS + Clock => Clock, + Reset => Reset, + + -- Put Port + Put => Put, + Full => Full, + DataIn => DataIn, + IndexOut => IndexOut, + + -- Get Port + Got => Got, + Valid => Valid, + IndexIn => resize(unsigned(Out_S2M_write.BID), IndexOut'length), + DataOut => DataOut + ); + + Arbiter : entity work.bus_Arbiter + generic map( + STRATEGY => "RR", + PORTS => PORTS, + OUTPUT_REG => TRUE + ) + port map( + Clock => Clock, + Reset => Reset, + + Arbitrate => Arbitrate, + RequestVector => RequestVector, + + Arbitrated => Arbitrated, + GrantVector => GrantVector, + GrantIndex => GrantIndex + ); + end block; + + read_blk : block + constant AR_Addr_POS : natural := 0; + constant AR_Len_POS : natural := 1; + constant AR_Size_POS : natural := 2; + constant AR_Burst_POS : natural := 3; + constant AR_ID_POS : natural := 4; + constant AR_User_POS : natural := 5; + constant AR_Cache_POS : natural := 6; + constant AR_Protect_POS : natural := 7; + constant AR_Lock_POS : natural := 8; + constant AR_QoS_POS : natural := 9; + constant AR_Region_POS : natural := 10; + + constant FORWARD_BIT_VEC : positive_vector := ( + AR_Addr_POS => Out_M2S.ARAddr'length, + AR_Len_POS => Out_M2S.ARLen'length, + AR_Size_POS => Out_M2S.ARSize'length, + AR_Burst_POS => Out_M2S.ARBurst'length, + AR_ID_POS => Out_M2S.ARID'length, + AR_User_POS => Out_M2S.ARUser'length, + AR_Cache_POS => Out_M2S.ARCache'length, + AR_Protect_POS => Out_M2S.ARProt'length, + AR_Lock_POS => Out_M2S.ARLock'length, + AR_QoS_POS => Out_M2S.ARQoS'length, + AR_Region_POS => Out_M2S.ARRegion'length + ); + + -- IN Ports + signal Mux_In_M2S : T_AXI4Stream_M2S_VECTOR(PORTS - 1 downto 0)(Data(isum(FORWARD_BIT_VEC) - 1 downto 0), Keep(0 downto 0), User(0 downto 0), ID(0 downto 0), Dest(0 downto 0)); + signal Mux_In_S2M : T_AXI4Stream_S2M_VECTOR(PORTS - 1 downto 0)(User(0 downto 0)); + -- OUT Ports + signal Mux_Out_M2S : T_AXI4Stream_M2S(Data(isum(FORWARD_BIT_VEC) - 1 downto 0), Keep(0 downto 0), User(0 downto 0), ID(0 downto 0), Dest(0 downto 0)); + signal Mux_Out_S2M : T_AXI4Stream_S2M(User(0 downto 0)); + + --Index Signals + -- Put Port + signal Put : std_logic; + signal Full : std_logic; + signal DataIn : std_logic_vector(PORT_BITS + In_AR_ID_BITS - 1 downto 0); + signal IndexOut : unsigned(log2ceilnz(ite(NUM_OUTSTANDING_READS = 0, 2**Out_AR_ID_BITS, NUM_OUTSTANDING_READS)) - 1 downto 0); + -- Get Port + signal Got : std_logic; + signal Valid : std_logic; + signal DataOut : std_logic_vector(PORT_BITS + In_AR_ID_BITS - 1 downto 0); + + begin + assign_gen : for i in 0 to PORTS - 1 generate + + signal ForwardDataIn : std_logic_vector(isum(FORWARD_BIT_VEC) - 1 downto 0); + + alias Mux_Valid : std_logic is Mux_In_M2S(i).Valid; + alias Mux_Ready : std_logic is Mux_In_S2M(i).Ready; + -- alias Mux_SoF : std_logic is Mux_In_M2S(i).SoF; + alias Mux_Last : std_logic is Mux_In_M2S(i).Last; + + alias Mux_ARValid : std_logic is In_M2S_read(i).ARValid; + alias Mux_RReady : std_logic is In_M2S_read(i).RReady; + + signal Mux_ARReady : std_logic; + signal Mux_RValid : std_logic; + signal Mux_RLast : std_logic; + + signal Is_Packet : std_logic := '0'; + + begin + ForwardDataIn(high(FORWARD_BIT_VEC, AR_Addr_POS ) downto low(FORWARD_BIT_VEC, AR_Addr_POS )) <= resize(In_M2S_read(i).ARAddr, FORWARD_BIT_VEC(AR_Addr_POS)); + ForwardDataIn(high(FORWARD_BIT_VEC, AR_Len_POS ) downto low(FORWARD_BIT_VEC, AR_Len_POS )) <= In_M2S_read(i).ARLen; + ForwardDataIn(high(FORWARD_BIT_VEC, AR_Size_POS ) downto low(FORWARD_BIT_VEC, AR_Size_POS )) <= In_M2S_read(i).ARSize; + ForwardDataIn(high(FORWARD_BIT_VEC, AR_Burst_POS ) downto low(FORWARD_BIT_VEC, AR_Burst_POS )) <= In_M2S_read(i).ARBurst; + ForwardDataIn(high(FORWARD_BIT_VEC, AR_ID_POS ) downto low(FORWARD_BIT_VEC, AR_ID_POS )) <= resize(std_logic_vector(IndexOut), Out_AR_ID_BITS); + ForwardDataIn(high(FORWARD_BIT_VEC, AR_User_POS ) downto low(FORWARD_BIT_VEC, AR_User_POS )) <= In_M2S_read(i).ARUser; + ForwardDataIn(high(FORWARD_BIT_VEC, AR_Cache_POS ) downto low(FORWARD_BIT_VEC, AR_Cache_POS )) <= In_M2S_read(i).ARCache; + ForwardDataIn(high(FORWARD_BIT_VEC, AR_Protect_POS) downto low(FORWARD_BIT_VEC, AR_Protect_POS)) <= In_M2S_read(i).ARProt; + ForwardDataIn(high(FORWARD_BIT_VEC, AR_Lock_POS ) downto low(FORWARD_BIT_VEC, AR_Lock_POS )) <= In_M2S_read(i).ARLock; + ForwardDataIn(high(FORWARD_BIT_VEC, AR_QoS_POS ) downto low(FORWARD_BIT_VEC, AR_QoS_POS )) <= In_M2S_read(i).ARQoS; + ForwardDataIn(high(FORWARD_BIT_VEC, AR_Region_POS ) downto low(FORWARD_BIT_VEC, AR_Region_POS )) <= In_M2S_read(i).ARRegion; + + Mux_In_M2S(i).Data <= ForwardDataIn; + + In_S2M_read(i).ARReady <= Mux_Ready and not Full; + + Mux_Valid <= In_M2S_read(i).ARValid and not Full; + -- Mux_SoF <= '1'; + Mux_Last <= '1'; + + In_S2M_read(i).RLast <= Out_S2M_read.RLast; + In_S2M_read(i).RData <= Out_S2M_read.RData; + In_S2M_read(i).RResp <= Out_S2M_read.RResp; + In_S2M_read(i).RUser <= Out_S2M_read.RUser; + In_S2M_read(i).RID <= DataOut(In_AR_ID_BITS - 1 downto 0); + In_S2M_read(i).RValid <= Out_S2M_read.RValid and Valid and to_sl(unsigned(DataOut(PORT_BITS + In_AR_ID_BITS - 1 downto In_AR_ID_BITS)) = i); + + end generate; + + process(all) + variable readResponseIndex : natural; + begin + -- Address Read assignment + Out_M2S_read.ARValid <= Mux_Out_M2S.Valid; + Out_M2S_read.ARAddr <= Mux_Out_M2S.Data(high(FORWARD_BIT_VEC, AR_Addr_POS ) downto low(FORWARD_BIT_VEC, AR_Addr_POS )); + Out_M2S_read.ARLen <= Mux_Out_M2S.Data(high(FORWARD_BIT_VEC, AR_Len_POS ) downto low(FORWARD_BIT_VEC, AR_Len_POS )); + Out_M2S_read.ARSize <= Mux_Out_M2S.Data(high(FORWARD_BIT_VEC, AR_Size_POS ) downto low(FORWARD_BIT_VEC, AR_Size_POS )); + Out_M2S_read.ARBurst <= Mux_Out_M2S.Data(high(FORWARD_BIT_VEC, AR_Burst_POS ) downto low(FORWARD_BIT_VEC, AR_Burst_POS )); + Out_M2S_read.ARID <= Mux_Out_M2S.Data(high(FORWARD_BIT_VEC, AR_ID_POS ) downto low(FORWARD_BIT_VEC, AR_ID_POS )); + Out_M2S_read.ARUser <= Mux_Out_M2S.Data(high(FORWARD_BIT_VEC, AR_User_POS ) downto low(FORWARD_BIT_VEC, AR_User_POS )); + Out_M2S_read.ARCache <= Mux_Out_M2S.Data(high(FORWARD_BIT_VEC, AR_Cache_POS ) downto low(FORWARD_BIT_VEC, AR_Cache_POS )); + Out_M2S_read.ARProt <= Mux_Out_M2S.Data(high(FORWARD_BIT_VEC, AR_Protect_POS) downto low(FORWARD_BIT_VEC, AR_Protect_POS)); + Out_M2S_read.ARLock <= Mux_Out_M2S.Data(high(FORWARD_BIT_VEC, AR_Lock_POS ) downto low(FORWARD_BIT_VEC, AR_Lock_POS )); + Out_M2S_read.ARQoS <= Mux_Out_M2S.Data(high(FORWARD_BIT_VEC, AR_QoS_POS ) downto low(FORWARD_BIT_VEC, AR_QoS_POS )); + Out_M2S_read.ARRegion <= Mux_Out_M2S.Data(high(FORWARD_BIT_VEC, AR_Region_POS ) downto low(FORWARD_BIT_VEC, AR_Region_POS )); + + -- Read response ready + readResponseIndex := to_integer(unsigned(DataOut(PORT_BITS + In_AR_ID_BITS - 1 downto In_AR_ID_BITS))); + if readResponseIndex < PORTS then + Out_M2S_read.RReady <= In_M2S_read(readResponseIndex).RReady and Valid; + Got <= In_M2S_read(readResponseIndex).RReady and Valid and Out_S2M_read.RValid and Out_S2M_read.RLast; + else + Out_M2S_read.RReady <= '0'; + Got <= '0'; + end if; + end process; + + process (all) + begin + Put <= '0'; + DataIn <= (others => '0'); + + for i in 0 to PORTS - 1 loop + if (Mux_In_M2S(i).Valid and Mux_In_S2M(i).Ready) = '1' and Full = '0' then + + DataIn(In_AR_ID_BITS - 1 downto 0) <= In_M2S_read(i).ARID;-- ID + DataIn(PORT_BITS + In_AR_ID_BITS - 1 downto In_AR_ID_BITS) <= std_logic_vector(to_unsigned(i, PORT_BITS));-- Port + Put <= '1'; + end if; + end loop; + end process; + + Read_idx : entity work.dstruct_OutOfOrderBuffer + generic map( + DATA_BITS => PORT_BITS + In_AR_ID_BITS, + NUM_INDEX => ite(NUM_OUTSTANDING_READS = 0, 2**Out_AR_ID_BITS, NUM_OUTSTANDING_READS) + ) + port map( + -- INPUTS + Clock => Clock, + Reset => Reset, + + -- Put Port + Put => Put, + Full => Full, + DataIn => DataIn, + IndexOut => IndexOut, + + -- Get Port + Got => Got, + Valid => Valid, + IndexIn => resize(unsigned(Out_S2M_read.RID), IndexOut'length), + DataOut => DataOut + ); + + Read_mux : entity work.axi4stream_Mux + generic map( + PORTS => PORTS + ) + port map( + Clock => Clock, + Reset => Reset, + -- IN Ports + In_M2S => Mux_In_M2S, + In_S2M => Mux_In_S2M, + -- OUT Port + Out_M2S => Mux_Out_M2S, + Out_S2M => Mux_Out_S2M + ); + Mux_Out_S2M.Ready <= Out_S2M_read.ARReady; + end block; + + + assign_gen : for i in 0 to PORTS - 1 generate + In_M2S_write(i).AWID <= In_M2S_g(i).AWID ; + In_M2S_write(i).AWAddr <= In_M2S_g(i).AWAddr ; + In_M2S_write(i).AWLen <= In_M2S_g(i).AWLen ; + In_M2S_write(i).AWSize <= In_M2S_g(i).AWSize ; + In_M2S_write(i).AWBurst <= In_M2S_g(i).AWBurst ; + In_M2S_write(i).AWLock <= In_M2S_g(i).AWLock ; + In_M2S_write(i).AWQOS <= In_M2S_g(i).AWQOS ; + In_M2S_write(i).AWRegion <= In_M2S_g(i).AWRegion; + In_M2S_write(i).AWUser <= In_M2S_g(i).AWUser ; + In_M2S_write(i).AWValid <= In_M2S_g(i).AWValid ; + In_M2S_write(i).AWCache <= In_M2S_g(i).AWCache ; + In_M2S_write(i).AWProt <= In_M2S_g(i).AWProt ; + In_M2S_write(i).WValid <= In_M2S_g(i).WValid ; + In_M2S_write(i).WLast <= In_M2S_g(i).WLast ; + In_M2S_write(i).WUser <= In_M2S_g(i).WUser ; + In_M2S_write(i).WData <= In_M2S_g(i).WData ; + In_M2S_write(i).WStrb <= In_M2S_g(i).WStrb ; + In_M2S_write(i).BReady <= In_M2S_g(i).BReady ; + In_M2S_read(i).ARValid <= In_M2S_g(i).ARValid ; + In_M2S_read(i).ARAddr <= In_M2S_g(i).ARAddr ; + In_M2S_read(i).ARCache <= In_M2S_g(i).ARCache ; + In_M2S_read(i).ARProt <= In_M2S_g(i).ARProt ; + In_M2S_read(i).ARID <= In_M2S_g(i).ARID ; + In_M2S_read(i).ARLen <= In_M2S_g(i).ARLen ; + In_M2S_read(i).ARSize <= In_M2S_g(i).ARSize ; + In_M2S_read(i).ARBurst <= In_M2S_g(i).ARBurst ; + In_M2S_read(i).ARLock <= In_M2S_g(i).ARLock ; + In_M2S_read(i).ARQOS <= In_M2S_g(i).ARQOS ; + In_M2S_read(i).ARRegion <= In_M2S_g(i).ARRegion; + In_M2S_read(i).ARUser <= In_M2S_g(i).ARUser ; + In_M2S_read(i).RReady <= In_M2S_g(i).RReady ; + + In_S2M_g(i).AWReady <= In_S2M_write(i).AWReady; + In_S2M_g(i).WReady <= In_S2M_write(i).WReady ; + In_S2M_g(i).BValid <= In_S2M_write(i).BValid ; + In_S2M_g(i).BResp <= In_S2M_write(i).BResp ; + In_S2M_g(i).BID <= In_S2M_write(i).BID ; + In_S2M_g(i).BUser <= In_S2M_write(i).BUser ; + In_S2M_g(i).ARReady <= In_S2M_read(i).ARReady ; + In_S2M_g(i).RValid <= In_S2M_read(i).RValid ; + In_S2M_g(i).RData <= In_S2M_read(i).RData ; + In_S2M_g(i).RResp <= In_S2M_read(i).RResp ; + In_S2M_g(i).RID <= In_S2M_read(i).RID ; + In_S2M_g(i).RLast <= In_S2M_read(i).RLast ; + In_S2M_g(i).RUser <= In_S2M_read(i).RUser ; + end generate; + + Out_M2S_g.AWID <= Out_M2S_write.AWID ; + Out_M2S_g.AWAddr <= Out_M2S_write.AWAddr ; + Out_M2S_g.AWLen <= Out_M2S_write.AWLen ; + Out_M2S_g.AWSize <= Out_M2S_write.AWSize ; + Out_M2S_g.AWBurst <= Out_M2S_write.AWBurst ; + Out_M2S_g.AWLock <= Out_M2S_write.AWLock ; + Out_M2S_g.AWQOS <= Out_M2S_write.AWQOS ; + Out_M2S_g.AWRegion <= Out_M2S_write.AWRegion; + Out_M2S_g.AWUser <= Out_M2S_write.AWUser ; + Out_M2S_g.AWValid <= Out_M2S_write.AWValid ; + Out_M2S_g.AWCache <= Out_M2S_write.AWCache ; + Out_M2S_g.AWProt <= Out_M2S_write.AWProt ; + Out_M2S_g.WValid <= Out_M2S_write.WValid ; + Out_M2S_g.WLast <= Out_M2S_write.WLast ; + Out_M2S_g.WUser <= Out_M2S_write.WUser ; + Out_M2S_g.WData <= Out_M2S_write.WData ; + Out_M2S_g.WStrb <= Out_M2S_write.WStrb ; + Out_M2S_g.BReady <= Out_M2S_write.BReady ; + Out_M2S_g.ARValid <= Out_M2S_read.ARValid ; + Out_M2S_g.ARAddr <= Out_M2S_read.ARAddr ; + Out_M2S_g.ARCache <= Out_M2S_read.ARCache ; + Out_M2S_g.ARProt <= Out_M2S_read.ARProt ; + Out_M2S_g.ARID <= Out_M2S_read.ARID ; + Out_M2S_g.ARLen <= Out_M2S_read.ARLen ; + Out_M2S_g.ARSize <= Out_M2S_read.ARSize ; + Out_M2S_g.ARBurst <= Out_M2S_read.ARBurst ; + Out_M2S_g.ARLock <= Out_M2S_read.ARLock ; + Out_M2S_g.ARQOS <= Out_M2S_read.ARQOS ; + Out_M2S_g.ARRegion <= Out_M2S_read.ARRegion; + Out_M2S_g.ARUser <= Out_M2S_read.ARUser ; + Out_M2S_g.RReady <= Out_M2S_read.RReady ; + + Out_S2M_write.AWReady <= Out_S2M_g.AWReady; + Out_S2M_write.WReady <= Out_S2M_g.WReady ; + Out_S2M_write.BValid <= Out_S2M_g.BValid ; + Out_S2M_write.BResp <= Out_S2M_g.BResp ; + Out_S2M_write.BID <= Out_S2M_g.BID ; + Out_S2M_write.BUser <= Out_S2M_g.BUser ; + Out_S2M_read.ARReady <= Out_S2M_g.ARReady; + Out_S2M_read.RValid <= Out_S2M_g.RValid ; + Out_S2M_read.RData <= Out_S2M_g.RData ; + Out_S2M_read.RResp <= Out_S2M_g.RResp ; + Out_S2M_read.RID <= Out_S2M_g.RID ; + Out_S2M_read.RLast <= Out_S2M_g.RLast ; + Out_S2M_read.RUser <= Out_S2M_g.RUser ; +end architecture; diff --git a/src/bus/axi4/AXI4_OSVVM.pkg.vhdl b/src/bus/axi4/axi4_OSVVM.pkg.vhdl similarity index 98% rename from src/bus/axi4/AXI4_OSVVM.pkg.vhdl rename to src/bus/axi4/axi4_OSVVM.pkg.vhdl index cd4d7c996..8d5023cba 100644 --- a/src/bus/axi4/AXI4_OSVVM.pkg.vhdl +++ b/src/bus/axi4/axi4_OSVVM.pkg.vhdl @@ -32,17 +32,17 @@ library osvvm_axi4; use osvvm_axi4.Axi4InterfacePkg.all; use work.utils.all; -use work.AXI4.all; +use work.axi4.all; use work.AXI4_FULL.all; -package AXI4_OSVVM is +package axi4_OSVVM is procedure to_PoC_AXI4_Bus_Slave(signal PoC_M2S : in T_AXI4_BUS_M2S; signal PoC_S2M : out T_AXI4_BUS_S2M; signal OSVVM_Bus : inout Axi4RecType); procedure to_PoC_AXI4_Bus_Master(signal PoC_M2S : out T_AXI4_BUS_M2S; signal PoC_S2M : in T_AXI4_BUS_S2M; signal OSVVM_Bus : inout Axi4RecType); end package; -package body AXI4_OSVVM is +package body axi4_OSVVM is procedure to_PoC_AXI4_Bus_Slave(signal PoC_M2S : in T_AXI4_BUS_M2S; signal PoC_S2M : out T_AXI4_BUS_S2M; signal OSVVM_Bus : inout Axi4RecType) is begin InitAxi4Rec (AxiBusRec => OSVVM_Bus) ; diff --git a/src/bus/axi4/axi4_Sink.vhdl b/src/bus/axi4/axi4_Sink.vhdl new file mode 100644 index 000000000..547a9b7b0 --- /dev/null +++ b/src/bus/axi4/axi4_Sink.vhdl @@ -0,0 +1,261 @@ +-- ============================================================================= +-- Authors: Stefan Unrein +-- +-- Entity: A subordinate-side bus Sink module for AXI4 (full). +-- +-- Description: +-- ------------------------------------- +-- This entity is a bus sink module for AXI4 (full) that represents a +-- dummy subordinate. This subordinate collects all data on write port and sends +-- out dummy data on read port. +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.utils.all; +use work.vectors.all; +use work.axi4_Full.all; + +entity axi4_Sink is + port ( + Clock : in std_logic; + Reset : in std_logic; + + AXI4_M2S : in T_AXI4_Bus_M2S; + AXI4_S2M : out T_AXI4_Bus_S2M + ); +end entity; + +architecture rtl of axi4_Sink is + constant AddressBits : natural := AXI4_M2S.AWAddr'length; + constant IDBits : natural := AXI4_M2S.AWID'length; + constant UserBits : natural := AXI4_M2S.AWUser'length; + constant DataBits : natural := AXI4_M2S.WData'length; + constant WData_Pos : natural := 0; + constant WBurst_Pos : natural := 1; + constant RData_Pos : natural := 2; + constant RBurst_Pos : natural := 3; + constant Split : positive_vector := ( + WData_Pos => DataBits / 4, + WBurst_Pos => DataBits / 4, + RData_Pos => DataBits / 4, + RBurst_Pos => DataBits - (3 * (DataBits / 4)) + ); + + signal AXI4_M2S_i : T_AXI4_Bus_M2S ( + AWID(IDBits - 1 downto 0), ARID(IDBits - 1 downto 0), + AWUser(UserBits - 1 downto 0), ARUser(UserBits - 1 downto 0), WUser(UserBits - 1 downto 0), + WData(DataBits - 1 downto 0), WStrb((DataBits / 8) - 1 downto 0), + AWAddr(AddressBits - 1 downto 0), ARAddr(AddressBits - 1 downto 0) + ); + signal AXI4_S2M_i : T_AXI4_Bus_S2M ( + BID(IDBits - 1 downto 0), RID(IDBits - 1 downto 0), + BUser(UserBits - 1 downto 0), RUser(UserBits - 1 downto 0), + RData(DataBits - 1 downto 0) + ); + + signal WData_inc : std_logic; + signal WBurst_inc : std_logic; + signal WData_Count : unsigned(Split(WData_Pos) - 1 downto 0) := (others => '0'); + signal WBurst_Count : unsigned(Split(WBurst_Pos) - 1 downto 0) := (others => '0'); + signal RData_inc : std_logic; + signal RBurst_inc : std_logic; + signal RData_Count : unsigned(Split(RData_Pos) - 1 downto 0) := (others => '0'); + signal RBurst_Count : unsigned(Split(RBurst_Pos) - 1 downto 0) := (others => '0'); + + signal WTransf_Inc : std_logic; + signal WTransf_Rst : std_logic; + signal WTransf_count : unsigned(7 downto 0) := (others => '0'); + signal RTransf_Inc : std_logic; + signal RTransf_Rst : std_logic; + signal RTransf_count : unsigned(7 downto 0) := (others => '0'); + type T_wstate is (Idle, Write_data, Write_resp_OK, Write_resp_Error); + type T_rstate is (Idle, Read_send, Read_resp); + + signal wstate : T_wstate := Idle; + signal rstate : T_rstate := Idle; + signal nxt_wstate : T_wstate; + signal nxt_rstate : T_rstate; + + signal AWLen_d : std_logic_vector(7 downto 0); + signal AWLen : std_logic_vector(7 downto 0); + signal ARLen_d : std_logic_vector(7 downto 0); + signal ARLen : std_logic_vector(7 downto 0); + signal AWID_d : std_logic_vector(IDBits - 1 downto 0); + signal AWID : std_logic_vector(IDBits - 1 downto 0); + signal ARID_d : std_logic_vector(IDBits - 1 downto 0); + signal ARID : std_logic_vector(IDBits - 1 downto 0); + + signal Is_WriteData : std_logic; + signal Is_ReadData : std_logic; + +begin + AXI4_M2S_i <= AXI4_M2S; + AXI4_S2M <= AXI4_S2M_i; + + AXI4_S2M_i.RUser <= (others => '0'); + AXI4_S2M_i.BUser <= (others => '0'); + + AXI4_S2M_i.RData(high(Split, WBurst_Pos) downto low(Split, WBurst_Pos)) <= std_logic_vector(WBurst_Count); + AXI4_S2M_i.RData(high(Split, WData_Pos) downto low(Split, WData_Pos)) <= std_logic_vector(WData_Count); + AXI4_S2M_i.RData(high(Split, RBurst_Pos) downto low(Split, RBurst_Pos)) <= std_logic_vector(RBurst_Count); + AXI4_S2M_i.RData(high(Split, RData_Pos) downto low(Split, RData_Pos)) <= std_logic_vector(RData_Count); + + WData_inc <= Is_WriteData and AXI4_S2M_i.WReady and AXI4_M2S_i.WValid; + WTransf_Inc <= WData_inc; + WBurst_inc <= Is_WriteData and AXI4_S2M_i.WReady and AXI4_M2S_i.WValid and AXI4_M2S_i.WLast; + WTransf_Rst <= WBurst_inc;-- when rising_edge(Clock); + RData_inc <= Is_ReadData and AXI4_S2M_i.RValid and AXI4_M2S_i.RReady; + RTransf_Inc <= RData_inc; + RBurst_inc <= Is_ReadData and AXI4_S2M_i.RValid and AXI4_M2S_i.RReady and AXI4_S2M_i.RLast; + RTransf_Rst <= RBurst_inc;-- when rising_edge(Clock); + AWLen_d <= AXI4_M2S.AWLen when rising_edge(Clock) and (AXI4_M2S_i.AWValid and AXI4_S2M_i.AWReady) = '1'; + AWLen <= AXI4_M2S.AWLen when (AXI4_M2S_i.AWValid and AXI4_S2M_i.AWReady) = '1' else AWLen_d; + ARLen_d <= AXI4_M2S.ARLen when rising_edge(Clock) and (AXI4_M2S_i.ARValid and AXI4_S2M_i.ARReady) = '1'; + ARLen <= AXI4_M2S.ARLen when (AXI4_M2S_i.ARValid and AXI4_S2M_i.ARReady) = '1' else ARLen_d; + + AXI4_S2M_i.RLast <= '1' when unsigned(ARLen) = RTransf_count else '0'; + + AWID_d <= AXI4_M2S.AWID when rising_edge(Clock) and (AXI4_M2S_i.AWValid and AXI4_S2M_i.AWReady) = '1'; + AWID <= AXI4_M2S.AWID when (AXI4_M2S_i.AWValid and AXI4_S2M_i.AWReady) = '1' else AWID_d; + ARID_d <= AXI4_M2S.ARID when rising_edge(Clock) and (AXI4_M2S_i.ARValid and AXI4_S2M_i.ARReady) = '1'; + ARID <= AXI4_M2S.ARID when (AXI4_M2S_i.ARValid and AXI4_S2M_i.ARReady) = '1' else ARID_d; + AXI4_S2M_i.BID <= AWID; + AXI4_S2M_i.RID <= ARID; + + Is_WriteData <= '1' when wState = Write_data else '0'; + Is_ReadData <= '1' when rState = Read_send else '0'; + + AXI4_S2M_i.WReady <= Is_WriteData; + AXI4_S2M_i.RValid <= Is_ReadData; + + write_proc : process (all) + begin + nxt_wstate <= wState; + + AXI4_S2M_i.AWReady <= '0'; + AXI4_S2M_i.BResp <= C_AXI4_RESPONSE_OKAY; + AXI4_S2M_i.BValid <= '0'; + case wState is + when Idle => + if AXI4_M2S_i.AWValid = '1' then + AXI4_S2M_i.AWReady <= '1'; + nxt_wstate <= Write_data; + end if; + + when Write_data => + if (WTransf_count = unsigned(AWLen)) and (AXI4_S2M_i.WReady and AXI4_M2S_i.WValid and AXI4_M2S_i.WLast) = '1' then + nxt_wstate <= Write_resp_OK; + elsif (AXI4_S2M_i.WReady and AXI4_M2S_i.WValid and AXI4_M2S_i.WLast) = '1' then + nxt_wstate <= Write_resp_Error; + end if; + + when Write_resp_OK => + AXI4_S2M_i.BValid <= '1'; + if AXI4_M2S_i.BReady = '1' then + nxt_wstate <= Idle; + end if; + + when Write_resp_Error => + AXI4_S2M_i.BValid <= '1'; + AXI4_S2M_i.BResp <= C_AXI4_RESPONSE_DECODE_ERROR; + if AXI4_M2S_i.BReady = '1' then + nxt_wstate <= Idle; + end if; + + when others => nxt_wstate <= Idle; + + end case; + end process; + + read_proc : process (all) + begin + nxt_rstate <= rState; + AXI4_S2M_i.ARReady <= '0'; + AXI4_S2M_i.RResp <= C_AXI4_RESPONSE_OKAY; + + case rState is + when Idle => + if AXI4_M2S_i.ARValid = '1' then + AXI4_S2M_i.ARReady <= '1'; + nxt_rstate <= Read_send; + end if; + + when Read_send => + if (AXI4_S2M_i.RLast and AXI4_S2M_i.RValid and AXI4_M2S_i.RReady) = '1' then + nxt_rstate <= Idle; + end if; + + when others => nxt_rstate <= Idle; + end case; + end process; + + process (Clock) + begin + if rising_edge(Clock) then + if Reset = '1' then + wState <= Idle; + rState <= Idle; + else + wState <= nxt_wstate; + rState <= nxt_rstate; + end if; + end if; + end process; + + process (Clock) + begin + if rising_edge(Clock) then + if Reset = '1' then + WData_Count <= (others => '0'); + WBurst_Count <= (others => '0'); + RData_Count <= (others => '0'); + RBurst_Count <= (others => '0'); + WTransf_count <= (others => '0'); + RTransf_count <= (others => '0'); + else + if WData_inc = '1' then + WData_Count <= WData_Count + 1; + end if; + if WBurst_inc = '1' then + WBurst_Count <= WBurst_Count + 1; + end if; + if RData_inc = '1' then + RData_Count <= RData_Count + 1; + end if; + if RBurst_inc = '1' then + RBurst_Count <= RBurst_Count + 1; + end if; + if WTransf_Rst = '1' then + WTransf_count <= (others => '0'); + elsif WTransf_Inc = '1' then + WTransf_count <= WTransf_count + 1; + end if; + if RTransf_Rst = '1' then + RTransf_count <= (others => '0'); + elsif RTransf_Inc = '1' then + RTransf_count <= RTransf_count + 1; + end if; + end if; + end if; + end process; + +end architecture; diff --git a/src/bus/axi4/AXI4_Termination_Manager.vhdl b/src/bus/axi4/axi4_Termination_Manager.vhdl similarity index 95% rename from src/bus/axi4/AXI4_Termination_Manager.vhdl rename to src/bus/axi4/axi4_Termination_Manager.vhdl index 86ff0cf4a..4f473ff90 100644 --- a/src/bus/axi4/AXI4_Termination_Manager.vhdl +++ b/src/bus/axi4/axi4_Termination_Manager.vhdl @@ -33,7 +33,7 @@ use IEEE.std_logic_1164.all; use work.axi4_full.all; -entity AXI4_Termination_Manager is +entity axi4_Termination_Manager is generic ( VALUE : std_logic := '0' ); @@ -43,7 +43,7 @@ entity AXI4_Termination_Manager is ); end entity; -architecture rtl of AXI4_Termination_Manager is +architecture rtl of axi4_Termination_Manager is constant AddrBits : natural := AXI4_M2S.AWAddr'length; constant IDBits : natural := AXI4_M2S.AWID'length; constant UserBits : natural := AXI4_M2S.AWUser'length; diff --git a/src/bus/axi4/AXI4_Termination_Subordinate.vhdl b/src/bus/axi4/axi4_Termination_Subordinate.vhdl similarity index 70% rename from src/bus/axi4/AXI4_Termination_Subordinate.vhdl rename to src/bus/axi4/axi4_Termination_Subordinate.vhdl index bdedd3d02..f9fb4ec5e 100644 --- a/src/bus/axi4/AXI4_Termination_Subordinate.vhdl +++ b/src/bus/axi4/axi4_Termination_Subordinate.vhdl @@ -34,21 +34,22 @@ use IEEE.std_logic_1164.all; use work.axi4_Full.all; use work.fifo.all; - -entity AXI4_Termination_Subordinate is +-- XXX: In the termination manager, a bit value can be specified. +entity axi4_Termination_Subordinate is generic( RESPONSE_CODE : T_AXI4_Response := C_AXI4_RESPONSE_SLAVE_ERROR ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; + AXI4_M2S : in T_AXI4_Bus_M2S; AXI4_S2M : out T_AXI4_Bus_S2M ); end entity; -architecture rtl of AXI4_Termination_Subordinate is +architecture rtl of axi4_Termination_Subordinate is signal fifo_aw_valid : std_logic; signal fifo_w_valid : std_logic; signal AWFull_i : std_logic; @@ -72,48 +73,48 @@ begin fifo_aw: fifo_cc_got generic map( - D_BITS => AXI4_M2S.AWID'length, + DATA_BITS => AXI4_M2S.AWID'length, MIN_DEPTH => 4 ) port map( - clk => Clock, - rst => Reset, - put => AXI4_M2S.AWValid, - din => AXI4_M2S.AWID, - full => AWFull_i, - got => AXI4_M2S.BReady and fifo_w_valid, - dout => AXI4_S2M.BID, - valid => fifo_aw_valid + Clock => Clock, + Reset => Reset, + Put => AXI4_M2S.AWValid, + DataIn => AXI4_M2S.AWID, + Full => AWFull_i, + Got => AXI4_M2S.BReady and fifo_w_valid, + DataOut => AXI4_S2M.BID, + Valid => fifo_aw_valid ); fifo_w: fifo_cc_got generic map( - D_BITS => 1, + DATA_BITS => 1, MIN_DEPTH => 4 ) port map( - clk => Clock, - rst => Reset, - put => AXI4_M2S.WValid, - din => "0", - full => WFull_i, - got => AXI4_M2S.BReady and fifo_aw_valid, - valid => fifo_w_valid + Clock => Clock, + Reset => Reset, + Put => AXI4_M2S.WValid, + DataIn => "0", + Full => WFull_i, + Got => AXI4_M2S.BReady and fifo_aw_valid, + Valid => fifo_w_valid ); fifo_r: fifo_cc_got generic map( - D_BITS => AXI4_M2S.ARID'length, + DATA_BITS => AXI4_M2S.ARID'length, MIN_DEPTH => 4 ) port map( - clk => Clock, - rst => Reset, - put => AXI4_M2S.ARValid, - din => AXI4_M2S.ARID, - full => ARFull_i, - got => AXI4_M2S.RReady, - dout => AXI4_S2M.RID, - valid => AXI4_S2M.RValid + Clock => Clock, + Reset => Reset, + Put => AXI4_M2S.ARValid, + DataIn => AXI4_M2S.ARID, + Full => ARFull_i, + Got => AXI4_M2S.RReady, + DataOut => AXI4_S2M.RID, + Valid => AXI4_S2M.RValid ); end architecture; diff --git a/src/bus/axi4/build.pro b/src/bus/axi4/build.pro new file mode 100644 index 000000000..451adf8b8 --- /dev/null +++ b/src/bus/axi4/build.pro @@ -0,0 +1,40 @@ +# ============================================================================= +# Authors: +# Adrian Weiland +# Stefan Unrein +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +#analyze axi4_Common.pkg.vhdl; # analyzed in PoC.pro +#analyze axi4_Full.pkg.vhdl; # analyzed in PoC.pro +#analyze axi4.pkg.vhdl; # analyzed in PoC.pro + +disabled axi4_Address_Data_Aligner.vhdl +disabled axi4_Address_Translate.vhdl +disabled axi4_Address_Translate_n_Filter.vhdl +disabled axi4_Data_Swapper.vhdl +analyze axi4_FIFO.vhdl +analyze axi4_FIFO_CDC.vhdl +analyze axi4_DeMux.vhdl +analyze axi4_Mux.vhdl +disabled axi4_Packet_FIFO.vhdl +analyze axi4_Sink.vhdl +analyze axi4_Termination_Manager.vhdl +analyze axi4_Termination_Subordinate.vhdl +analyze axi4_AXI4Lite_Converter.vhdl +analyze axi4_OSVVM.pkg.vhdl diff --git a/src/bus/axi4/AXI4Lite/AXI4Lite.pkg.vhdl b/src/bus/axi4lite/axi4lite.pkg.vhdl similarity index 73% rename from src/bus/axi4/AXI4Lite/AXI4Lite.pkg.vhdl rename to src/bus/axi4lite/axi4lite.pkg.vhdl index ec1c81c78..59b4dbb90 100644 --- a/src/bus/axi4/AXI4Lite/AXI4Lite.pkg.vhdl +++ b/src/bus/axi4lite/axi4lite.pkg.vhdl @@ -16,19 +16,19 @@ -- You can use this record type as a normal, unconstrained record. Create signal -- with a constrained subtype and connect it to the desired components. -- To avoid constraining overhead, you can use the generic sized-package: --- package AXI4Lite_Sized_32A_64D is --- new work.AXI4Lite_Sized +-- package axi4lite_Sized_32A_64D is +-- new work.axi4lite_Sized -- generic map( -- ADDRESS_BITS => 32, -- DATA_BITS => 64 -- ); -- Then simply use the sized subtypes: --- signal DeMux_M2S : AXI4Lite_Sized_32A_64D.Sized_M2S; --- signal DeMux_S2M : AXI4Lite_Sized_32A_64D.Sized_S2M; +-- signal DeMux_M2S : axi4lite_Sized_32A_64D.Sized_M2S; +-- signal DeMux_S2M : axi4lite_Sized_32A_64D.Sized_S2M; -- -- If multiple components need to be connected, you can also use the predefined -- vector type T_AXI4LITE_BUS_M2S_VECTOR and T_AXI4LITE_BUS_S2M_VECTOR, which --- gives you a vector of AXI4Lite records. This is also available in the generic +-- gives you a vector of axi4lite records. This is also available in the generic -- package as Sized_M2S_Vector and Sized_S2M_Vector. -- -- License: @@ -58,27 +58,27 @@ use work.config.all; use work.utils.all; use work.strings.all; use work.vectors.all; -use work.AXI4_Common.all; +use work.axi4_Common.all; -package AXI4Lite is +package axi4lite is constant DEBUG : boolean := POC_VERBOSE; attribute Count : integer; - alias T_AXI4_Response is work.AXI4_Common.T_AXI4_Response; - alias C_AXI4_RESPONSE_OKAY is work.AXI4_Common.C_AXI4_RESPONSE_OKAY; - alias C_AXI4_RESPONSE_EX_OKAY is work.AXI4_Common.C_AXI4_RESPONSE_EX_OKAY; - alias C_AXI4_RESPONSE_SLAVE_ERROR is work.AXI4_Common.C_AXI4_RESPONSE_SLAVE_ERROR; - alias C_AXI4_RESPONSE_DECODE_ERROR is work.AXI4_Common.C_AXI4_RESPONSE_DECODE_ERROR; - alias C_AXI4_RESPONSE_INIT is work.AXI4_Common.C_AXI4_RESPONSE_INIT; + alias T_AXI4_Response is work.axi4_Common.T_AXI4_Response; + alias C_AXI4_RESPONSE_OKAY is work.axi4_Common.C_AXI4_RESPONSE_OKAY; + alias C_AXI4_RESPONSE_EX_OKAY is work.axi4_Common.C_AXI4_RESPONSE_EX_OKAY; + alias C_AXI4_RESPONSE_SLAVE_ERROR is work.axi4_Common.C_AXI4_RESPONSE_SLAVE_ERROR; + alias C_AXI4_RESPONSE_DECODE_ERROR is work.axi4_Common.C_AXI4_RESPONSE_DECODE_ERROR; + alias C_AXI4_RESPONSE_INIT is work.axi4_Common.C_AXI4_RESPONSE_INIT; - alias T_AXI4_Cache is work.AXI4_Common.T_AXI4_Cache; - alias C_AXI4_CACHE_INIT is work.AXI4_Common.C_AXI4_CACHE_INIT; - alias C_AXI4_CACHE is work.AXI4_Common.C_AXI4_CACHE; + alias T_AXI4_Cache is work.axi4_Common.T_AXI4_Cache; + alias C_AXI4_CACHE_INIT is work.axi4_Common.C_AXI4_CACHE_INIT; + alias C_AXI4_CACHE is work.axi4_Common.C_AXI4_CACHE; - alias T_AXI4_Protect is work.AXI4_Common.T_AXI4_Protect; - alias C_AXI4_PROTECT_INIT is work.AXI4_Common.C_AXI4_PROTECT_INIT; - alias C_AXI4_PROTECT is work.AXI4_Common.C_AXI4_PROTECT; + alias T_AXI4_Protect is work.axi4_Common.T_AXI4_Protect; + alias C_AXI4_PROTECT_INIT is work.axi4_Common.C_AXI4_PROTECT_INIT; + alias C_AXI4_PROTECT is work.axi4_Common.C_AXI4_PROTECT; type T_AXI4LITE_BUS_M2S is record AWValid : std_logic; @@ -118,22 +118,22 @@ package AXI4Lite is function EnableTransaction(InBus : T_AXI4LITE_BUS_S2M; Enable : std_logic) return T_AXI4LITE_BUS_S2M; function EnableTransaction(InBus : T_AXI4LITE_BUS_S2M_VECTOR; Enable : std_logic_vector) return T_AXI4LITE_BUS_S2M_VECTOR; - type T_AXI4Lite_Bus is record + type T_axi4lite_Bus is record M2S : T_AXI4LITE_BUS_M2S; S2M : T_AXI4LITE_BUS_S2M; end record; - type T_AXI4Lite_Bus_VECTOR is array(natural range <>) of T_AXI4Lite_Bus; + type T_axi4lite_Bus_VECTOR is array(natural range <>) of T_axi4lite_Bus; + + function Initialize_axi4lite_Bus_M2S(AddressBits : natural; DataBits : natural; Value : std_logic := 'Z') return T_AXI4LITE_BUS_M2S; + function Initialize_axi4lite_Bus_S2M(AddressBits : natural; DataBits : natural; Value : std_logic := 'Z') return T_AXI4LITE_BUS_S2M; + function Initialize_axi4lite_Bus(AddressBits : natural; DataBits : natural) return T_axi4lite_Bus; - function Initialize_AXI4Lite_Bus_M2S(AddressBits : natural; DataBits : natural; Value : std_logic := 'Z') return T_AXI4LITE_BUS_M2S; - function Initialize_AXI4Lite_Bus_S2M(AddressBits : natural; DataBits : natural; Value : std_logic := 'Z') return T_AXI4LITE_BUS_S2M; - function Initialize_AXI4Lite_Bus(AddressBits : natural; DataBits : natural) return T_AXI4Lite_Bus; - -------Define AXI Register structure------------- constant ADDRESS_BITS : natural := 32; constant DATA_BITS : natural := 32; constant NAME_LENGTH : natural := 64; - type T_AXI4Lite_RegisterModes is ( + type T_axi4lite_RegisterModes is ( ConstantValue, ReadOnly, ReadOnly_NotRegistered, ReadWrite, ReadWrite_NotRegistered, @@ -143,12 +143,12 @@ package AXI4Lite is Reserved ); - attribute Count of T_AXI4Lite_RegisterModes : type is T_AXI4Lite_RegisterModes'pos(T_AXI4Lite_RegisterModes'high) + 1; + attribute Count of T_axi4lite_RegisterModes : type is T_axi4lite_RegisterModes'pos(T_axi4lite_RegisterModes'high) + 1; type T_AXI4_Register is record Name : string(1 to NAME_LENGTH); Address : unsigned(ADDRESS_BITS - 1 downto 0); - RegisterMode : T_AXI4Lite_RegisterModes; + RegisterMode : T_axi4lite_RegisterModes; Init_Value : std_logic_vector(DATA_BITS - 1 downto 0); AutoClear_Mask : std_logic_vector(DATA_BITS - 1 downto 0); IsInterruptRegister : boolean; @@ -171,7 +171,7 @@ package AXI4Lite is function to_AXI4_Register( Name : string; Address : unsigned(ADDRESS_BITS - 1 downto 0); - RegisterMode : T_AXI4Lite_RegisterModes := ReadWrite; + RegisterMode : T_axi4lite_RegisterModes := ReadWrite; Init_Value : std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); AutoClear_Mask : std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); IsInterruptRegister : boolean := false @@ -183,11 +183,11 @@ package AXI4Lite is function get_AutoClearMask(description_vector : T_AXI4_Register_Vector) return T_SLVV; function get_Index(Name : string; Register_Vector : T_AXI4_Register_Vector) return integer; function get_NumberOfIndexes(Name : string; Register_Vector : T_AXI4_Register_Vector) return integer; - function get_IndexRange(Name : string; Register_Vector : T_AXI4_Register_Vector) return T_INTVEC; + function get_IndexRange(Name : string; Register_Vector : T_AXI4_Register_Vector) return integer_vector; function get_Address(Name : string; Register_Vector : T_AXI4_Register_Vector) return unsigned; function get_Name(Address : unsigned(ADDRESS_BITS - 1 downto 0); Register_Vector : T_AXI4_Register_Vector) return string; function get_Interrupt_count(Register_Vector : T_AXI4_Register_Vector) return natural; - function get_Interrupt_range(Register_Vector : T_AXI4_Register_Vector) return T_NATVEC; + function get_Interrupt_range(Register_Vector : T_AXI4_Register_Vector) return natural_vector; function get_RegisterAddressBits(Config : T_AXI4_Register_Vector) return positive; function get_StrobeVector(Config : T_AXI4_Register_Vector) return std_logic_vector; @@ -197,32 +197,32 @@ package AXI4Lite is constant Atomic_RegisterDescription_Vector : T_AXI4_Register_Vector(0 to 3); procedure Create_AtomicRegister( - constant Reset : in std_logic; - constant RegisterFile_ReadPort : in T_SLVV(Atomic_RegisterDescription_Vector'range)(DATA_BITS - 1 downto 0); + constant Reset : in std_logic; + constant RegisterFile_ReadPort : in T_SLVV(Atomic_RegisterDescription_Vector'range)(DATA_BITS - 1 downto 0); signal RegisterFile_WritePort : out T_SLVV(Atomic_RegisterDescription_Vector'range)(DATA_BITS - 1 downto 0); - constant RegisterFile_ReadPort_hit : in std_logic_vector(Atomic_RegisterDescription_Vector'range); - constant PL_WriteValue : in std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); - constant PL_WriteStrobe : in std_logic := '0'; - constant Value_reg : in std_logic_vector(DATA_BITS - 1 downto 0); -- make this signal as `<= nextValue_reg when rising_edge(Clock);` + constant RegisterFile_ReadPort_hit : in std_logic_vector(Atomic_RegisterDescription_Vector'range); + constant PL_WriteValue : in std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); + constant PL_WriteStrobe : in std_logic := '0'; + constant Value_reg : in std_logic_vector(DATA_BITS - 1 downto 0); -- make this signal as `<= nextValue_reg when rising_edge(Clock);` signal nextValue_reg : out std_logic_vector(DATA_BITS - 1 downto 0) ); constant IO_RegisterDescription_Vector : T_AXI4_Register_Vector(0 to 7); procedure Create_IORegister( - constant Reset : in std_logic; - constant RegisterFile_ReadPort : in T_SLVV(IO_RegisterDescription_Vector'range)(DATA_BITS - 1 downto 0); + constant Reset : in std_logic; + constant RegisterFile_ReadPort : in T_SLVV(IO_RegisterDescription_Vector'range)(DATA_BITS - 1 downto 0); signal RegisterFile_WritePort : out T_SLVV(IO_RegisterDescription_Vector'range)(DATA_BITS - 1 downto 0); - constant RegisterFile_ReadPort_hit : in std_logic_vector(IO_RegisterDescription_Vector'range); - constant Input : in std_logic_vector(DATA_BITS - 1 downto 0); + constant RegisterFile_ReadPort_hit : in std_logic_vector(IO_RegisterDescription_Vector'range); + constant Input : in std_logic_vector(DATA_BITS - 1 downto 0); signal Output : out std_logic_vector(DATA_BITS - 1 downto 0); signal Tristate : out std_logic_vector(DATA_BITS - 1 downto 0); - constant IO_reg : in std_logic_vector(DATA_BITS - 1 downto 0); -- make this signal as `<= nextIO_reg when rising_edge(Clock);` + constant IO_reg : in std_logic_vector(DATA_BITS - 1 downto 0); -- make this signal as `<= nextIO_reg when rising_edge(Clock);` signal nextIO_reg : out std_logic_vector(DATA_BITS - 1 downto 0); - constant T_reg : in std_logic_vector(DATA_BITS - 1 downto 0); -- make this signal as `<= nextT_reg when rising_edge(Clock);` + constant T_reg : in std_logic_vector(DATA_BITS - 1 downto 0); -- make this signal as `<= nextT_reg when rising_edge(Clock);` signal nextT_reg : out std_logic_vector(DATA_BITS - 1 downto 0) ); - + ---------------------------------------------------------------------- -- procedure to easily define a description vector inside a function-- ---------------------------------------------------------------------- @@ -231,25 +231,25 @@ package AXI4Lite is -- TODO: Test in newer versions. If this works, reactivate. -- **To use this procedure, this variables need to be defined: - -- variable temp : T_AXI4_Register_Vector(0 to 127); - -- variable idx : natural := 0; - -- variable addr : natural := 0; + -- variable temp : T_AXI4_Register_Vector(0 to 127); + -- variable idx : natural := 0; + -- variable addr : natural := 0; -- **Example: - -- procedure assign( - -- variable description_vector : inout T_AXI4_Register_Vector; - -- variable idx : inout natural; - -- variable addr : inout natural; - -- constant offset : in natural := 4; - -- constant Name : in string := ""; - -- constant RegisterMode : in T_AXI4Lite_RegisterModes; - -- constant Init_Value : in std_logic_vector(DATA_BITS -1 downto 0) := (others => '0'); - -- constant AutoClear_Mask : in std_logic_vector(DATA_BITS -1 downto 0) := (others => '0'); - -- constant IsInterruptRegister : in boolean := false - -- ); + -- procedure assign( + -- variable description_vector : inout T_AXI4_Register_Vector; + -- variable idx : inout natural; + -- variable addr : inout natural; + -- constant offset : in natural := 4; + -- constant Name : in string := ""; + -- constant RegisterMode : in T_axi4lite_RegisterModes; + -- constant Init_Value : in std_logic_vector(DATA_BITS -1 downto 0) := (others => '0'); + -- constant AutoClear_Mask : in std_logic_vector(DATA_BITS -1 downto 0) := (others => '0'); + -- constant IsInterruptRegister : in boolean := false + -- ); end package; -package body AXI4Lite is +package body axi4lite is function EnableTransaction(InBus : T_AXI4LITE_BUS_M2S; Enable : std_logic) return T_AXI4LITE_BUS_M2S is variable temp : InBus'subtype; @@ -294,7 +294,7 @@ package body AXI4Lite is function AddressTranslate(InBus : T_AXI4LITE_BUS_M2S; Offset : signed) return T_AXI4LITE_BUS_M2S is variable temp : InBus'subtype; begin - assert Offset'length = InBus.AWAddr'length report "PoC.AXI4Lite.AddressTranslate: Length of Offeset-Bits and Address-Bits is no equal!" severity failure; + assert Offset'length = InBus.AWAddr'length report "PoC.axi4lite.AddressTranslate: Length of Offeset-Bits and Address-Bits is no equal!" severity failure; temp.AWValid := InBus.AWValid; temp.AWAddr := std_logic_vector(unsigned(InBus.AWAddr) + unsigned(std_logic_vector(Offset))); @@ -315,7 +315,7 @@ package body AXI4Lite is function AddressMask(InBus : T_AXI4LITE_BUS_M2S; Mask : std_logic_vector) return T_AXI4LITE_BUS_M2S is variable temp : InBus'subtype; begin - assert Mask'length = InBus.AWAddr'length report "PoC.AXI4Lite.AddressTranslate: Length of Mask-Bits and Address-Bits is no equal!" severity failure; + assert Mask'length = InBus.AWAddr'length report "PoC.axi4lite.AddressTranslate: Length of Mask-Bits and Address-Bits is no equal!" severity failure; temp.AWValid := InBus.AWValid; temp.AWAddr := InBus.AWAddr and Mask; @@ -360,52 +360,54 @@ package body AXI4Lite is temp(i).RData := InBus(i).RData; temp(i).RResp := InBus(i).RResp; end loop; + return temp; end function; - function Initialize_AXI4Lite_Bus_M2S(AddressBits : natural; DataBits : natural; Value : std_logic := 'Z') return T_AXI4Lite_Bus_M2S is - variable var : T_AXI4Lite_Bus_M2S( - AWAddr(AddressBits - 1 downto 0), WData(DataBits - 1 downto 0), - WStrb((DataBits /8) - 1 downto 0), ARAddr(AddressBits - 1 downto 0)) := ( - -- AClk => Value, - -- AResetN => Value, - AWValid => Value, - AWCache => (others => Value), - AWAddr => (AddressBits - 1 downto 0 => Value), - AWProt => (others => Value), - WValid => Value, - WData => (DataBits - 1 downto 0 => Value), - WStrb => ((DataBits / 8) - 1 downto 0 => Value), - BReady => Value, - ARValid => Value, - ARCache => (others => Value), - ARAddr => (AddressBits - 1 downto 0 => Value), - ARProt => (others => Value), - RReady => Value + + function Initialize_axi4lite_Bus_M2S(AddressBits : natural; DataBits : natural; Value : std_logic := 'Z') return T_axi4lite_Bus_M2S is + variable var : T_axi4lite_Bus_M2S( + AWAddr(AddressBits - 1 downto 0), WData(DataBits - 1 downto 0), + WStrb((DataBits /8) - 1 downto 0), ARAddr(AddressBits - 1 downto 0)) := ( + -- AClk => Value, + -- AResetN => Value, + AWValid => Value, + AWCache => (others => Value), + AWAddr => (AddressBits - 1 downto 0 => Value), + AWProt => (others => Value), + WValid => Value, + WData => (DataBits - 1 downto 0 => Value), + WStrb => ((DataBits / 8) - 1 downto 0 => Value), + BReady => Value, + ARValid => Value, + ARCache => (others => Value), + ARAddr => (AddressBits - 1 downto 0 => Value), + ARProt => (others => Value), + RReady => Value ); begin return var; end function; - function Initialize_AXI4Lite_Bus_S2M(AddressBits : natural; DataBits : natural; Value : std_logic := 'Z') return T_AXI4Lite_Bus_S2M is - variable var : T_AXI4Lite_Bus_S2M(RData(DataBits - 1 downto 0)) := ( - AWReady => Value, - WReady => Value, - BValid => Value, - BResp => (others => Value), - ARReady => Value, - RValid => Value, - RData => (DataBits - 1 downto 0 => 'Z'), - RResp => (others => Value) + function Initialize_axi4lite_Bus_S2M(AddressBits : natural; DataBits : natural; Value : std_logic := 'Z') return T_axi4lite_Bus_S2M is + variable var : T_axi4lite_Bus_S2M(RData(DataBits - 1 downto 0)) := ( + AWReady => Value, + WReady => Value, + BValid => Value, + BResp => (others => Value), + ARReady => Value, + RValid => Value, + RData => (DataBits - 1 downto 0 => 'Z'), + RResp => (others => Value) ); begin return var; end function; - function Initialize_AXI4Lite_Bus(AddressBits : natural; DataBits : natural) return T_AXI4Lite_Bus is + function Initialize_axi4lite_Bus(AddressBits : natural; DataBits : natural) return T_axi4lite_Bus is begin return ( - M2S => Initialize_AXI4Lite_Bus_M2S(AddressBits, DataBits), - S2M => Initialize_AXI4Lite_Bus_S2M(AddressBits, DataBits) + M2S => Initialize_axi4lite_Bus_M2S(AddressBits, DataBits), + S2M => Initialize_axi4lite_Bus_S2M(AddressBits, DataBits) ); end function; @@ -415,7 +417,7 @@ package body AXI4Lite is & ", Address: 0x" & to_string(std_logic_vector(reg.address), 'h', 4) & ", Init_Value: 0x" & to_string(reg.Init_Value, 'h', 4) & ", AutoClear_Mask : 0x" & to_string(reg.AutoClear_Mask , 'h', 4) - & ", RegisterMode: " & T_AXI4Lite_RegisterModes'image(reg.RegisterMode); + & ", RegisterMode: " & T_axi4lite_RegisterModes'image(reg.RegisterMode); end function; impure function write_csv_file(FileName : string; reg : T_AXI4_Register_Vector) return boolean is @@ -432,7 +434,7 @@ package body AXI4Lite is begin write("Automatically generated File from VHDL PoC Library"); - write("Poc.AXI4Lite.T_AXI4_Register"); + write("Poc.axi4lite.T_AXI4_Register"); write("generated CSV File"); write(" "); write(" "); @@ -444,11 +446,12 @@ package body AXI4Lite is "0x" & to_string(std_logic_vector(reg(i - reg'low).address), 'h', 4) & " ; " & "0x" & to_string(std_logic_vector(reg(i - reg'low).Init_Value), 'h', 4) & " ; " & "0x" & to_string(std_logic_vector(reg(i - reg'low).AutoClear_Mask ), 'h', 4) & " ; " & - T_AXI4Lite_RegisterModes'image(reg(i - reg'low).RegisterMode) & " ; " & + T_axi4lite_RegisterModes'image(reg(i - reg'low).RegisterMode) & " ; " & boolean'image(reg(i - reg'low).IsInterruptRegister ) ); end loop; write(" "); + return true; end function; @@ -463,11 +466,11 @@ package body AXI4Lite is variable Pos : natural := 0; variable temp : T_AXI4_Register_Vector(0 to 511); - variable elem : T_POSVEC(0 to 5); + variable elem : positive_vector(0 to 5); variable Name : string(1 to NAME_LENGTH); variable Address : unsigned(ADDRESS_BITS - 1 downto 0); - variable RegisterMode : T_AXI4Lite_RegisterModes := ReadWrite; + variable RegisterMode : T_axi4lite_RegisterModes := ReadWrite; variable Init_Value : std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); variable AutoClear_Mask : std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); variable IsInterruptRegister : boolean := false; @@ -480,7 +483,7 @@ package body AXI4Lite is exit; end if; end loop; - -- result_s(Len +1 to result_s'high) := (others => NUL); + -- result_s(Len +1 to result_s'high) := (others => NUL); while true loop ------------------------------------------- @@ -493,9 +496,9 @@ package body AXI4Lite is Address := to_unsigned(to_natural_hex(result_s(elem(1) + 4 to elem(2) - 2)), Address'length); Init_Value := std_logic_vector(to_unsigned(to_natural_hex(result_s(elem(2) + 4 to elem(3) - 2)), Init_Value'length)); AutoClear_Mask := std_logic_vector(to_unsigned(to_natural_hex(result_s(elem(3) + 4 to elem(4) - 2)), AutoClear_Mask 'length)); - for i in 0 to T_AXI4Lite_RegisterModes'pos(T_AXI4Lite_RegisterModes'high) loop - if T_AXI4Lite_RegisterModes'image(T_AXI4Lite_RegisterModes'val(i)) = result_s(elem(4) + 2 to elem(5) - 2) then - RegisterMode := T_AXI4Lite_RegisterModes'val(i); + for i in 0 to T_axi4lite_RegisterModes'pos(T_axi4lite_RegisterModes'high) loop + if T_axi4lite_RegisterModes'image(T_axi4lite_RegisterModes'val(i)) = result_s(elem(4) + 2 to elem(5) - 2) then + RegisterMode := T_axi4lite_RegisterModes'val(i); end if; end loop; if result_s(elem(5) + 2 to elem(5) + 5) = "true" then @@ -507,7 +510,7 @@ package body AXI4Lite is temp(Pos) := to_AXI4_Register( Name, --: string := ""; Address, --: unsigned(ADDRESS_BITS -1 downto 0); - RegisterMode, --: T_AXI4Lite_RegisterModes := ReadWrite; + RegisterMode, --: T_axi4lite_RegisterModes := ReadWrite; Init_Value, --: std_logic_vector(DATA_BITS -1 downto 0) := (others => '0'); AutoClear_Mask , --: std_logic_vector(DATA_BITS -1 downto 0) := (others => '0'); IsInterruptRegister --: boolean := false @@ -517,11 +520,12 @@ package body AXI4Lite is readline(FileHandle, CurrentLine); Len := CurrentLine'length; read(CurrentLine, result_s(1 to Len)); - -- result_s(Len +1 to result_s'high) := (others => NUL); + -- result_s(Len +1 to result_s'high) := (others => NUL); if result_s(1) = ' ' then exit; end if; end loop; + return temp(0 to Pos - 1); end function; @@ -531,13 +535,14 @@ package body AXI4Lite is for i in 0 to Config'length - 1 loop temp(i) := Config(i + Config'low); end loop; + return temp; end function; function to_AXI4_Register( Name : string; Address : unsigned(ADDRESS_BITS - 1 downto 0); - RegisterMode : T_AXI4Lite_RegisterModes := ReadWrite; + RegisterMode : T_axi4lite_RegisterModes := ReadWrite; Init_Value : std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); AutoClear_Mask : std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); IsInterruptRegister : boolean := false @@ -548,7 +553,7 @@ package body AXI4Lite is RegisterMode => RegisterMode, Init_Value => Init_Value, AutoClear_Mask => AutoClear_Mask , - IsInterruptRegister => IsInterruptRegister + IsInterruptRegister => IsInterruptRegister ); begin return temp; @@ -558,12 +563,12 @@ package body AXI4Lite is variable description_vector : inout T_AXI4_Register_Vector; variable idx : inout natural; variable addr : inout natural; - constant offset : in natural := 4; - constant Name : in string := ""; - constant RegisterMode : in T_AXI4Lite_RegisterModes; - constant Init_Value : in std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); - constant AutoClear_Mask : in std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); - constant IsInterruptRegister : in boolean := false + constant offset : in natural := 4; + constant Name : in string := ""; + constant RegisterMode : in T_axi4lite_RegisterModes; + constant Init_Value : in std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); + constant AutoClear_Mask : in std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); + constant IsInterruptRegister : in boolean := false ) is begin description_vector(idx) := to_AXI4_Register( Name => Name, @@ -571,7 +576,7 @@ package body AXI4Lite is RegisterMode => RegisterMode, Init_Value => Init_Value, AutoClear_Mask => AutoClear_Mask , - IsInterruptRegister => IsInterruptRegister + IsInterruptRegister => IsInterruptRegister ); idx := idx + 1; addr := addr + offset; @@ -583,7 +588,7 @@ package body AXI4Lite is begin for i in description_vector'range loop if description_vector(i).name(str'range) /= str then - -- if not str_ifind(description_vector(i).name, str) then + -- if not str_ifind(description_vector(i).name, str) then temp(pos) := description_vector(i); pos := pos + 1; end if; @@ -597,7 +602,7 @@ package body AXI4Lite is begin for i in description_vector'range loop if description_vector(i).name(1) /= char then - -- if not str_ifind(description_vector(i).name, str) then + -- if not str_ifind(description_vector(i).name, str) then temp(pos) := description_vector(i); pos := pos + 1; end if; @@ -671,7 +676,7 @@ package body AXI4Lite is variable temp : T_AXI4_Register_Vector(0 to hammingWeight(filter) - 1); variable pos : natural := 0; begin - assert Config'length = filter'length report "PoC.AXI4Lite.pkg: Filter_DescriptionVector: Config has not the same size as Filter!" severity failure; + assert Config'length = filter'length report "PoC.axi4lite: Filter_DescriptionVector: Config has not the same size as Filter!" severity failure; for i in temp'range loop if filter(i) = '1' then temp(pos) := Config(i); @@ -685,15 +690,15 @@ package body AXI4Lite is begin for i in Register_Vector'range loop if str_imatch(Register_Vector(i).Name, Name) then - assert not DEBUG report "PoC.AXI4Lite.pkg.vhdl: get_Index('" & Name & "' , Register_Vector) : found at " & integer'image(i) severity note; + assert not DEBUG report "PoC.axi4lite: get_Index('" & Name & "' , Register_Vector) : found at " & integer'image(i) severity note; return i; end if; end loop; if DEBUG then - assert false report "PoC.AXI4Lite.pkg.vhdl: get_Index('" & Name & "' , Register_Vector) : no match found!" severity warning; + assert false report "PoC.axi4lite: get_Index('" & Name & "' , Register_Vector) : no match found!" severity warning; return 0; else - assert false report "PoC.AXI4Lite.pkg.vhdl: get_Index('" & Name & "' , Register_Vector) : no match found!" severity failure; + assert false report "PoC.axi4lite: get_Index('" & Name & "' , Register_Vector) : no match found!" severity failure; end if; return -1; end function; @@ -709,8 +714,8 @@ package body AXI4Lite is return temp; end function; - function get_IndexRange(Name : string; Register_Vector : T_AXI4_Register_Vector) return T_INTVEC is - variable temp : T_INTVEC(0 to get_NumberOfIndexes(Name, Register_Vector) - 1) := (others => - 1); + function get_IndexRange(Name : string; Register_Vector : T_AXI4_Register_Vector) return integer_vector is + variable temp : integer_vector(0 to get_NumberOfIndexes(Name, Register_Vector) - 1) := (others => - 1); variable pos : integer := 0; begin for i in Register_Vector'range loop @@ -726,14 +731,14 @@ package body AXI4Lite is begin for i in Register_Vector'range loop if str_imatch(Register_Vector(i).Name, Name) then - assert not DEBUG report "PoC.AXI4Lite.pkg.vhdl: get_Address('" & Name & "' , Register_Vector) : found at " & integer'image(i) severity note; + assert not DEBUG report "PoC.axi4lite: get_Address('" & Name & "' , Register_Vector) : found at " & integer'image(i) severity note; return Register_Vector(i).Address; end if; end loop; if DEBUG then - assert false report "PoC.AXI4Lite.pkg.vhdl: get_Address('" & Name & "' , Register_Vector) : no match found!" severity warning; + assert false report "PoC.axi4lite: get_Address('" & Name & "' , Register_Vector) : no match found!" severity warning; else - assert false report "PoC.AXI4Lite.pkg.vhdl: get_Address('" & Name & "' , Register_Vector) : no match found!" severity failure; + assert false report "PoC.axi4lite: get_Address('" & Name & "' , Register_Vector) : no match found!" severity failure; end if; return unsigned'(ADDRESS_BITS - 1 downto 0 => '1'); end function; @@ -742,14 +747,14 @@ package body AXI4Lite is begin for i in Register_Vector'range loop if Register_Vector(i).Address = Address then - assert not DEBUG report "PoC.AXI4Lite.pkg.vhdl: get_Name(" & to_string(std_logic_vector(Address), 'h', 4) & " , Register_Vector) : found match at " & integer'image(i) severity note; + assert not DEBUG report "PoC.axi4lite: get_Name(" & to_string(std_logic_vector(Address), 'h', 4) & " , Register_Vector) : found match at " & integer'image(i) severity note; return Register_Vector(i).Name; end if; end loop; if DEBUG then - assert false report "PoC.AXI4Lite.pkg.vhdl: get_Name(" & to_string(std_logic_vector(Address), 'h', 4) & " , Register_Vector) : no match found!" severity warning; + assert false report "PoC.axi4lite: get_Name(" & to_string(std_logic_vector(Address), 'h', 4) & " , Register_Vector) : no match found!" severity warning; else - assert false report "PoC.AXI4Lite.pkg.vhdl: get_Name(" & to_string(std_logic_vector(Address), 'h', 4) & " , Register_Vector) : no match found!" severity failure; + assert false report "PoC.axi4lite: get_Name(" & to_string(std_logic_vector(Address), 'h', 4) & " , Register_Vector) : no match found!" severity failure; end if; return resize("", NAME_LENGTH); end function; @@ -765,8 +770,8 @@ package body AXI4Lite is return temp; end function; - function get_Interrupt_range(Register_Vector : T_AXI4_Register_Vector) return T_NATVEC is - variable temp : T_NATVEC(0 to get_Interrupt_count(Register_Vector) - 1) := (others => 0); + function get_Interrupt_range(Register_Vector : T_AXI4_Register_Vector) return natural_vector is + variable temp : natural_vector(0 to get_Interrupt_count(Register_Vector) - 1) := (others => 0); variable count : natural := 0; begin for i in Register_Vector'range loop @@ -780,14 +785,14 @@ package body AXI4Lite is end function; procedure Create_AtomicRegister( - -- signal Clock : in std_logic; - constant Reset : in std_logic; - constant RegisterFile_ReadPort : in T_SLVV(Atomic_RegisterDescription_Vector'range)(DATA_BITS - 1 downto 0); + -- signal Clock : in std_logic; + constant Reset : in std_logic; + constant RegisterFile_ReadPort : in T_SLVV(Atomic_RegisterDescription_Vector'range)(DATA_BITS - 1 downto 0); signal RegisterFile_WritePort : out T_SLVV(Atomic_RegisterDescription_Vector'range)(DATA_BITS - 1 downto 0); - constant RegisterFile_ReadPort_hit : in std_logic_vector(Atomic_RegisterDescription_Vector'range); - constant PL_WriteValue : in std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); - constant PL_WriteStrobe : in std_logic := '0'; - constant Value_reg : in std_logic_vector(DATA_BITS - 1 downto 0); + constant RegisterFile_ReadPort_hit : in std_logic_vector(Atomic_RegisterDescription_Vector'range); + constant PL_WriteValue : in std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); + constant PL_WriteStrobe : in std_logic := '0'; + constant Value_reg : in std_logic_vector(DATA_BITS - 1 downto 0); signal nextValue_reg : out std_logic_vector(DATA_BITS - 1 downto 0) ) is constant Value_idx : natural := 0; @@ -802,8 +807,7 @@ package body AXI4Lite is RegisterFile_WritePort(BitClr_idx) <= (others => '0'); RegisterFile_WritePort(BitTgl_idx) <= (others => '0'); - newValue := PL_WriteValue when PL_WriteStrobe = '1' else - Value_reg; + newValue := PL_WriteValue when PL_WriteStrobe = '1' else Value_reg; if Reset = '1' then newValue := (others => '0'); elsif RegisterFile_ReadPort_hit(Value_idx) = '1' then @@ -819,17 +823,17 @@ package body AXI4Lite is end procedure; procedure Create_IORegister( - -- signal Clock : in std_logic; - constant Reset : in std_logic; - constant RegisterFile_ReadPort : in T_SLVV(IO_RegisterDescription_Vector'range)(DATA_BITS - 1 downto 0); + -- signal Clock : in std_logic; + constant Reset : in std_logic; + constant RegisterFile_ReadPort : in T_SLVV(IO_RegisterDescription_Vector'range)(DATA_BITS - 1 downto 0); signal RegisterFile_WritePort : out T_SLVV(IO_RegisterDescription_Vector'range)(DATA_BITS - 1 downto 0); - constant RegisterFile_ReadPort_hit : in std_logic_vector(IO_RegisterDescription_Vector'range); - constant Input : in std_logic_vector(DATA_BITS - 1 downto 0); + constant RegisterFile_ReadPort_hit : in std_logic_vector(IO_RegisterDescription_Vector'range); + constant Input : in std_logic_vector(DATA_BITS - 1 downto 0); signal Output : out std_logic_vector(DATA_BITS - 1 downto 0); signal Tristate : out std_logic_vector(DATA_BITS - 1 downto 0); - constant IO_reg : in std_logic_vector(DATA_BITS - 1 downto 0); + constant IO_reg : in std_logic_vector(DATA_BITS - 1 downto 0); signal nextIO_reg : out std_logic_vector(DATA_BITS - 1 downto 0); - constant T_reg : in std_logic_vector(DATA_BITS - 1 downto 0); + constant T_reg : in std_logic_vector(DATA_BITS - 1 downto 0); signal nextT_reg : out std_logic_vector(DATA_BITS - 1 downto 0) ) is constant Value_idx : natural := 0; @@ -842,17 +846,17 @@ package body AXI4Lite is --IO Register Output <= IO_reg; Create_AtomicRegister( - Reset => Reset, RegisterFile_ReadPort => RegisterFile_ReadPort(0 to 3), - RegisterFile_WritePort => RegisterFile_WritePort(0 to 3), RegisterFile_ReadPort_hit => RegisterFile_ReadPort_hit(0 to 3), - PL_WriteValue => Input, Value_reg => IO_reg, nextValue_reg => nextIO_reg + Reset => Reset, RegisterFile_ReadPort => RegisterFile_ReadPort(0 to 3), + RegisterFile_WritePort => RegisterFile_WritePort(0 to 3), RegisterFile_ReadPort_hit => RegisterFile_ReadPort_hit(0 to 3), + PL_WriteValue => Input, Value_reg => IO_reg, nextValue_reg => nextIO_reg ); --T Reg Tristate <= T_reg; Create_AtomicRegister( - Reset => Reset, RegisterFile_ReadPort => RegisterFile_ReadPort(4 to 7), - RegisterFile_WritePort => RegisterFile_WritePort(4 to 7), RegisterFile_ReadPort_hit => RegisterFile_ReadPort_hit(4 to 7), - Value_reg => T_reg, nextValue_reg => nextT_reg + Reset => Reset, RegisterFile_ReadPort => RegisterFile_ReadPort(4 to 7), + RegisterFile_WritePort => RegisterFile_WritePort(4 to 7), RegisterFile_ReadPort_hit => RegisterFile_ReadPort_hit(4 to 7), + Value_reg => T_reg, nextValue_reg => nextT_reg ); end procedure; @@ -871,8 +875,9 @@ package body AXI4Lite is end package body; -use work.AXI4Lite.all; -package AXI4Lite_Sized is +use work.axi4lite.all; + +package axi4lite_Sized is generic ( ADDRESS_BITS : positive; DATA_BITS : positive diff --git a/src/bus/axi4lite/axi4lite_DeMux.vhdl b/src/bus/axi4lite/axi4lite_DeMux.vhdl new file mode 100644 index 000000000..f051c9fa4 --- /dev/null +++ b/src/bus/axi4lite/axi4lite_DeMux.vhdl @@ -0,0 +1,120 @@ +-- ============================================================================= +-- Authors: Stefan Unrein +-- +-- Entity: AXI4 Lite De-Multiplexer +-- +-- Description: +-- ------------------------------------- +-- This module provides a demultiplexing functionality for AXI4 busses. +-- Based on the provided address on write or read channels, the packets are +-- forwarded to the matching output interface. The address of the connected +-- subordinates is defined by the BASE_ADDRESS and the corresponding +-- BASE_ADDRESS_MASK. Every transaction not matching any outputs is internally +-- discarted and a decode-error response is generated. +-- PIPELINE_IN and PIPELINE_OUT provide the settings for input and ouput +-- pipelining stages as a timing relaxantion setting. +-- +-- Example configuration: +-- 3 Subordinates with 512kB each, starting at 0x0008_0000 +-- BASE_ADDRESS => (0 => 32x"x0008_0000", 1 => 32x"x0009_0000", 2 => 32x"x000A_0000") +-- BASE_ADDRESS_MASK => (0 to 2 => 32x"x0007_FFFF") +-- +-- Utilization compared to Xilinx Crossbar (2.1) 1 Slave => 4 Master (32 Addr/Data) +-- | LUT | FF | Comment | +-- | ---- | ---- | -------------- | +-- | 104 | 126 | Xilinx Crosbar | +-- | 193 | 46 | 0 Glue | +-- | 452 | 1191 | 1 Glue | +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.utils.all; +use work.vectors.all; +use work.components.all; +use work.axi4.all; +use work.axi4_Full.all; +use work.axi4lite.all; + + +entity axi4lite_DeMux is + generic( + BASE_ADDRESS : T_SLUV; + BASE_ADDRESS_MASK : BASE_ADDRESS'subtype; + PIPELINE_IN : natural := 0; + PIPELINE_OUT : natural_vector(BASE_ADDRESS'range) := (others => 0) + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + -- IN Port + In_M2S : in T_AXI4Lite_Bus_M2S; + In_S2M : out T_AXI4Lite_Bus_S2M; + -- OUT Port + Out_M2S : out T_AXI4Lite_Bus_M2S_VECTOR; + Out_S2M : in T_AXI4Lite_Bus_S2M_VECTOR + ); +end entity; + + +architecture rtl of axi4lite_DeMux is + package full_record is + new work.AXI4Full_Sized + generic map( + ADDRESS_BITS => In_M2S.AWAddr'length, + DATA_BITS => In_M2S.WData'length + ); + signal In_M2S_full : full_record.Sized_M2S; + signal In_S2M_full : full_record.Sized_S2M; + signal Out_M2S_full : full_record.Sized_M2S_Vector(Out_M2S'range); + signal Out_S2M_full : full_record.Sized_S2M_Vector(Out_M2S'range); + + +begin + In_M2S_full <= to_AXI4_BUS(In_M2S); + In_S2M <= to_AXI4LITE_BUS(In_S2M_full); + + assign_gen : for i in Out_M2S'range generate + Out_M2S(i) <= to_AXI4LITE_BUS(Out_M2S_full(i)); + Out_S2M_full(i) <= to_AXI4_BUS(Out_S2M(i)); + end generate; + + Full_DeMux : entity work.axi4_DeMux + generic map( + BASE_ADDRESS => BASE_ADDRESS, + BASE_ADDRESS_MASK => BASE_ADDRESS_MASK, + PIPELINE_IN => PIPELINE_IN, + PIPELINE_OUT => PIPELINE_OUT, + NUM_OUTSTANDING_READS => 1, + NUM_OUTSTANDING_WRITES => 1 + ) + port map( + Clock => Clock, + Reset => Reset, + -- IN Port + In_M2S => In_M2S_full, + In_S2M => In_S2M_full, + -- OUT Port + Out_M2S => Out_M2S_full, + Out_S2M => Out_S2M_full + ); +end architecture; diff --git a/src/bus/axi4/AXI4Lite/AXI4Lite_FIFO.vhdl b/src/bus/axi4lite/axi4lite_FIFO.vhdl similarity index 71% rename from src/bus/axi4/AXI4Lite/AXI4Lite_FIFO.vhdl rename to src/bus/axi4lite/axi4lite_FIFO.vhdl index d88d3fd91..5e7697320 100644 --- a/src/bus/axi4/AXI4Lite/AXI4Lite_FIFO.vhdl +++ b/src/bus/axi4lite/axi4lite_FIFO.vhdl @@ -2,15 +2,15 @@ -- Authors: -- Stefan Unrein -- --- Entity: AXI4Lite_FIFO +-- Entity: axi4lite_FIFO -- -- Description: -- ------------------------------------- -- A wrapper of fifo_cc_got for AXI4-Lite interface. It creates a separate -- FIFO for every of the five substreams. -- --- TRANSACTIONS: Defines how many AXI4Lite transactions should be buffered. --- A value of up to 3 is generating a stage of this depth, a value above 3 +-- TRANSACTIONS: Defines how many AXI4Lite transactions should be buffered. +-- A value of up to 3 is generating a stage of this depth, a value above 3 -- creates a real FIFO. -- -- License: @@ -37,11 +37,11 @@ use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; use work.components.all; -use work.axi4Lite.all; +use work.axi4lite.all; use work.axi4_Common.all; -entity AXI4Lite_FIFO is +entity axi4lite_FIFO is generic ( TRANSACTIONS : natural := 2 ); @@ -58,7 +58,7 @@ entity AXI4Lite_FIFO is end entity; -architecture rtl of AXI4Lite_FIFO is +architecture rtl of axi4lite_FIFO is constant Address_BITS : natural := In_M2S.AWAddr'length; constant Data_BITS : natural := In_M2S.WData'length; constant STRB_BITS : natural := In_M2S.WData'length / 8; @@ -72,10 +72,10 @@ architecture rtl of AXI4Lite_FIFO is constant Data_POS : natural := 0; constant Strobe_POS : natural := 1; constant Resp_POS : natural := 1; - constant Addr_BIT_VEC : T_POSVEC := (Addr_POS => Address_BITS, Cache_POS => CACHE_BITS, Protect_POS => PROTECT_BITS); - constant W_BIT_VEC : T_POSVEC := (Data_POS => Data_BITS, Strobe_POS => STRB_BITS); - constant R_BIT_VEC : T_POSVEC := (Data_POS => Data_BITS, Resp_POS => RESPONSE_BITS); - constant B_BIT_VEC : T_POSVEC := (Resp_POS => RESPONSE_BITS); + constant Addr_BIT_VEC : positive_vector := (Addr_POS => Address_BITS, Cache_POS => CACHE_BITS, Protect_POS => PROTECT_BITS); + constant W_BIT_VEC : positive_vector := (Data_POS => Data_BITS, Strobe_POS => STRB_BITS); + constant R_BIT_VEC : positive_vector := (Data_POS => Data_BITS, Resp_POS => RESPONSE_BITS); + constant B_BIT_VEC : positive_vector := (Resp_POS => RESPONSE_BITS); constant AW_POS : natural := 0; constant AR_POS : natural := 1; @@ -83,7 +83,7 @@ architecture rtl of AXI4Lite_FIFO is constant R_POS : natural := 3; constant B_POS : natural := 4; - constant BIT_VEC : T_POSVEC := ( + constant BIT_VEC : positive_vector := ( AW_POS => isum(Addr_BIT_VEC), AR_POS => isum(Addr_BIT_VEC), W_POS => isum(W_BIT_VEC), @@ -130,71 +130,71 @@ begin -----INPUT --AW IN Interface DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Addr_POS)) + low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Addr_POS)) <= In_M2S.AWAddr; DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Cache_POS)) + low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Cache_POS)) <= In_M2S.AWCache; DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Protect_POS)) + low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Protect_POS)) <= In_M2S.AWProt; --AR IN Interface DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Addr_POS)) + low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Addr_POS)) <= In_M2S.ARAddr; DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Cache_POS)) + low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Cache_POS)) <= In_M2S.ARCache; DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Protect_POS)) + low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Protect_POS)) <= In_M2S.ARProt; --W IN Interface DataFIFO_DataIn( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Data_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)) + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)) <= In_M2S.WData; DataFIFO_DataIn( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Strobe_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)) + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)) <= In_M2S.WStrb; --R IN Interface DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Data_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)) + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)) <= Out_S2M.RData; DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Resp_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)) + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)) <= Out_S2M.RResp; --B IN Interface DataFIFO_DataIn( low(BIT_VEC,B_POS) + high(B_BIT_VEC,Resp_POS) downto - low(BIT_VEC,B_POS) + low(B_BIT_VEC,Resp_POS)) + low(BIT_VEC,B_POS) + low(B_BIT_VEC,Resp_POS)) <= Out_S2M.BResp; ----OUTPUT --AW Out Interface Out_M2S.AWAddr <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Addr_POS)); + low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Addr_POS)); Out_M2S.AWCache <= DataFIFO_DataOut(low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Cache_POS)); + low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Cache_POS)); Out_M2S.AWProt <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Protect_POS)); + low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Protect_POS)); --AR Out Interface Out_M2S.ARAddr <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Addr_POS) downto - low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Addr_POS)); + low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Addr_POS)); Out_M2S.ARCache <= DataFIFO_DataOut(low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Cache_POS) downto - low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Cache_POS)); + low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Cache_POS)); Out_M2S.ARProt <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Protect_POS) downto - low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Protect_POS)); + low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Protect_POS)); --W Out Interface Out_M2S.WData <= DataFIFO_DataOut( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Data_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)); + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)); Out_M2S.WStrb <= DataFIFO_DataOut( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Strobe_POS) downto - low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)); + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)); --R Out Interface In_S2M.RData <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Data_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)); + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)); In_S2M.RResp <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Resp_POS) downto - low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)); + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)); --B Out Interface In_S2M.BResp <= DataFIFO_DataOut( low(BIT_VEC,B_POS) + high(B_BIT_VEC,Resp_POS) downto - low(BIT_VEC,B_POS) + low(B_BIT_VEC,Resp_POS)); + low(BIT_VEC,B_POS) + low(B_BIT_VEC,Resp_POS)); gen_fifo : for i in 0 to 4 generate @@ -219,52 +219,52 @@ begin DataFifo : entity work.fifo_cc_got generic map ( - D_BITS => BIT_VEC(i), + DATA_BITS => BIT_VEC(i), MIN_DEPTH => TRANSACTIONS, DATA_REG => FALSE, STATE_REG => TRUE, OUTPUT_REG => FALSE, - ESTATE_WR_BITS => 0, - FSTATE_RD_BITS => 0 + EMPTY_STATE_BITS => 0, + FILL_STATE_BITS => 0 ) port map ( -- Global Reset and Clock - rst => Reset, - clk => Clock, + Reset => Reset, + Clock => Clock, -- Writing Interface - put => DataFIFO_put, - din => DataFIFO_DataIn_i, - full => DataFIFO_Full, - estate_wr => open, + Put => DataFIFO_put, + DataIn => DataFIFO_DataIn_i, + Full => DataFIFO_Full, + EmptyState => open, -- Reading Interface - got => DataFIFO_got, - dout => DataFIFO_DataOut_i, - valid => DataFIFO_Valid, - fstate_rd => open + Got => DataFIFO_got, + DataOut => DataFIFO_DataOut_i, + Valid => DataFIFO_Valid, + FillState => open ); else generate - Stage : entity work.fifo_stage + Stage : entity work.fifo_Stage generic map( - D_BITS => BIT_VEC(i), + DATA_BITS => BIT_VEC(i), STAGES => TRANSACTIONS +1, LIGHT_WEIGHT => true ) port map( -- Control - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Input - put => DataFIFO_put, - di => DataFIFO_DataIn_i, - ful => DataFIFO_Full, + Put => DataFIFO_put, + DataIn => DataFIFO_DataIn_i, + Full => DataFIFO_Full, -- Output - vld => DataFIFO_Valid, - do => DataFIFO_DataOut_i, - got => DataFIFO_got + Valid => DataFIFO_Valid, + DataOut => DataFIFO_DataOut_i, + Got => DataFIFO_got ); end generate; diff --git a/src/bus/axi4lite/axi4lite_FIFO_CDC.vhdl b/src/bus/axi4lite/axi4lite_FIFO_CDC.vhdl new file mode 100644 index 000000000..10db87dfa --- /dev/null +++ b/src/bus/axi4lite/axi4lite_FIFO_CDC.vhdl @@ -0,0 +1,250 @@ +-- ============================================================================= +-- Authors: +-- Stefan Unrein +-- +-- Entity: axi4lite_FIFO_CDC +-- +-- Description: +-- ------------------------------------- +-- A wrapper of fifo_ic_got for AXI4-Lite interface. It creates a separate +-- CDC-FIFO for every of the five substreams. +-- +-- TRANSACTIONS: Defines how many AXI4Lite transactions should be buffered. +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.utils.all; +use work.vectors.all; +use work.components.all; +use work.axi4lite.all; +use work.axi4_Common.all; + + +entity axi4lite_FIFO_CDC is + generic ( + TRANSACTIONS : positive := 2; + DATA_REG : boolean := false; -- Store Data Content in Registers + OUTPUT_REG : boolean := false -- Registered FIFO Output + ); + port ( + -- IN Port + In_Clock : in std_logic; + In_Reset : in std_logic; + In_M2S : in T_AXI4Lite_Bus_M2S; + In_S2M : out T_AXI4Lite_Bus_S2M; + -- OUT Port + Out_Clock : in std_logic; + Out_Reset : in std_logic; + Out_M2S : out T_AXI4Lite_Bus_M2S; + Out_S2M : in T_AXI4Lite_Bus_S2M + ); +end entity; + + +architecture rtl of axi4lite_FIFO_CDC is + constant Address_BITS : natural := In_M2S.AWAddr'length; + constant Data_BITS : natural := In_M2S.WData'length; + constant STRB_BITS : natural := In_M2S.WData'length / 8; + constant CACHE_BITS : natural := In_M2S.AWCache'length; + constant PROTECT_BITS : natural := In_M2S.AWProt'length; + constant RESPONSE_BITS : natural := In_S2M.RResp'length; + + constant Addr_POS : natural := 0; + constant Cache_POS : natural := 1; + constant Protect_POS : natural := 2; + constant Data_POS : natural := 0; + constant Strobe_POS : natural := 1; + constant Resp_POS : natural := 1; + constant Addr_BIT_VEC : positive_vector := (Addr_POS => Address_BITS, Cache_POS => CACHE_BITS, Protect_POS => PROTECT_BITS); + constant W_BIT_VEC : positive_vector := (Data_POS => Data_BITS, Strobe_POS => STRB_BITS); + constant R_BIT_VEC : positive_vector := (Data_POS => Data_BITS, Resp_POS => RESPONSE_BITS); + constant B_BIT_VEC : positive_vector := (Resp_POS => RESPONSE_BITS); + + constant AW_POS : natural := 0; + constant AR_POS : natural := 1; + constant W_POS : natural := 2; + constant R_POS : natural := 3; + constant B_POS : natural := 4; + + constant BIT_VEC : positive_vector := ( + AW_POS => isum(Addr_BIT_VEC), + AR_POS => isum(Addr_BIT_VEC), + W_POS => isum(W_BIT_VEC), + R_POS => isum(R_BIT_VEC), + B_POS => isum(B_BIT_VEC) + ); + + signal In_Ready_vec : std_logic_vector(0 to 4); + signal In_Valid_vec : std_logic_vector(0 to 4); + signal Out_Ready_vec : std_logic_vector(0 to 4); + signal Out_Valid_vec : std_logic_vector(0 to 4); + signal DataFIFO_DataIn : std_logic_vector(isum(BIT_VEC) -1 downto 0); + signal DataFIFO_DataOut : std_logic_vector(isum(BIT_VEC) -1 downto 0); + + + +begin + -----INPUT + In_S2M.AWReady <= In_Ready_vec(AW_POS); + In_S2M.ARReady <= In_Ready_vec(AR_POS); + In_S2M.WReady <= In_Ready_vec(W_POS ); + Out_M2S.RReady <= In_Ready_vec(R_POS ); + Out_M2S.BReady <= In_Ready_vec(B_POS ); + + In_Valid_vec(AW_POS) <= In_M2S.AWValid; + In_Valid_vec(AR_POS) <= In_M2S.ARValid; + In_Valid_vec(W_POS ) <= In_M2S.WValid; + In_Valid_vec(R_POS ) <= Out_S2M.RValid; + In_Valid_vec(B_POS ) <= Out_S2M.BValid; + + -----OUTPUT + Out_Ready_vec(AW_POS) <= Out_S2M.AWReady; + Out_Ready_vec(AR_POS) <= Out_S2M.ARReady; + Out_Ready_vec(W_POS ) <= Out_S2M.WReady ; + Out_Ready_vec(R_POS ) <= In_M2S.RReady; + Out_Ready_vec(B_POS ) <= In_M2S.BReady; + + Out_M2S.AWValid <= Out_Valid_vec(AW_POS); + Out_M2S.ARValid <= Out_Valid_vec(AR_POS); + Out_M2S.WValid <= Out_Valid_vec(W_POS ); + In_S2M.RValid <= Out_Valid_vec(R_POS ); + In_S2M.BValid <= Out_Valid_vec(B_POS ); + + -----INPUT + --AW IN Interface + DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Addr_POS) downto + low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Addr_POS)) + <= In_M2S.AWAddr; + DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Cache_POS) downto + low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Cache_POS)) + <= In_M2S.AWCache; + DataFIFO_DataIn( low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Protect_POS) downto + low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Protect_POS)) + <= In_M2S.AWProt; + --AR IN Interface + DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Addr_POS) downto + low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Addr_POS)) + <= In_M2S.ARAddr; + DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Cache_POS) downto + low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Cache_POS)) + <= In_M2S.ARCache; + DataFIFO_DataIn( low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Protect_POS) downto + low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Protect_POS)) + <= In_M2S.ARProt; + --W IN Interface + DataFIFO_DataIn( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Data_POS) downto + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)) + <= In_M2S.WData; + DataFIFO_DataIn( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Strobe_POS) downto + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)) + <= In_M2S.WStrb; + --R IN Interface + DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Data_POS) downto + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)) + <= Out_S2M.RData; + DataFIFO_DataIn( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Resp_POS) downto + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)) + <= Out_S2M.RResp; + --B IN Interface + DataFIFO_DataIn( low(BIT_VEC,B_POS) + high(B_BIT_VEC,Resp_POS) downto + low(BIT_VEC,B_POS) + low(B_BIT_VEC,Resp_POS)) + <= Out_S2M.BResp; + + ----OUTPUT + --AW Out Interface + Out_M2S.AWAddr <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Addr_POS) downto + low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Addr_POS)); + Out_M2S.AWCache <= DataFIFO_DataOut(low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Cache_POS) downto + low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Cache_POS)); + Out_M2S.AWProt <= DataFIFO_DataOut( low(BIT_VEC,AW_POS) + high(Addr_BIT_VEC,Protect_POS) downto + low(BIT_VEC,AW_POS) + low(Addr_BIT_VEC,Protect_POS)); + --AR Out Interface + Out_M2S.ARAddr <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Addr_POS) downto + low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Addr_POS)); + Out_M2S.ARCache <= DataFIFO_DataOut(low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Cache_POS) downto + low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Cache_POS)); + Out_M2S.ARProt <= DataFIFO_DataOut( low(BIT_VEC,AR_POS) + high(Addr_BIT_VEC,Protect_POS) downto + low(BIT_VEC,AR_POS) + low(Addr_BIT_VEC,Protect_POS)); + --W Out Interface + Out_M2S.WData <= DataFIFO_DataOut( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Data_POS) downto + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Data_POS)); + Out_M2S.WStrb <= DataFIFO_DataOut( low(BIT_VEC,W_POS) + high(W_BIT_VEC,Strobe_POS) downto + low(BIT_VEC,W_POS) + low(W_BIT_VEC,Strobe_POS)); + --R Out Interface + In_S2M.RData <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Data_POS) downto + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Data_POS)); + In_S2M.RResp <= DataFIFO_DataOut( low(BIT_VEC,R_POS) + high(R_BIT_VEC,Resp_POS) downto + low(BIT_VEC,R_POS) + low(R_BIT_VEC,Resp_POS)); + --B Out Interface + In_S2M.BResp <= DataFIFO_DataOut( low(BIT_VEC,B_POS) + high(B_BIT_VEC,Resp_POS) downto + low(BIT_VEC,B_POS) + low(B_BIT_VEC,Resp_POS)); + + + gen : for i in 0 to 4 generate + signal DataFIFO_put : std_logic; + signal DataFIFO_DataIn_i : std_logic_vector(BIT_VEC(i) -1 downto 0); + signal DataFIFO_DataOut_i : std_logic_vector(BIT_VEC(i) -1 downto 0); + signal DataFIFO_Full : std_logic; + signal DataFIFO_got : std_logic; + signal DataFIFO_Valid : std_logic; + begin + + DataFIFO_put <= In_Valid_vec(i) and not DataFIFO_Full; + In_Ready_vec(i) <= not DataFIFO_Full; + DataFIFO_DataIn_i <= DataFIFO_DataIn(high(BIT_VEC,i) downto low(BIT_VEC,i)); + + DataFIFO_DataOut(high(BIT_VEC,i) downto low(BIT_VEC,i)) <= DataFIFO_DataOut_i; + DataFIFO_got <= Out_Ready_vec(i); + Out_Valid_vec(i) <= DataFIFO_Valid; + + DataFifo : entity work.fifo_ic_got + generic map ( + DATA_BITS => BIT_VEC(i), + MIN_DEPTH => TRANSACTIONS, + DATA_REG => DATA_REG, + OUTPUT_REG => OUTPUT_REG, + EMPTY_STATE_BITS => 0, + FILL_STATE_BITS => 0 + ) + port map ( + -- Writing Interface + clk_wr => ite(i<3,In_Clock,Out_Clock), + rst_wr => ite(i<3,In_Reset,Out_Reset), + put => DataFIFO_put, + din => DataFIFO_DataIn_i, + full => DataFIFO_Full, + estate_wr => open, + + -- Reading Interface + clk_rd => ite(i<3,Out_Clock,In_Clock), + rst_rd => ite(i<3,Out_Reset,In_Reset), + got => DataFIFO_got, + dout => DataFIFO_DataOut_i, + valid => DataFIFO_Valid, + fstate_rd => open + ); + + + end generate; + + +end architecture; diff --git a/src/bus/axi4/AXI4Lite/AXI4Lite_GitVersionRegister.vhdl b/src/bus/axi4lite/axi4lite_GitVersionRegister.vhdl similarity index 95% rename from src/bus/axi4/AXI4Lite/AXI4Lite_GitVersionRegister.vhdl rename to src/bus/axi4lite/axi4lite_GitVersionRegister.vhdl index c5883ad6a..ef128a202 100644 --- a/src/bus/axi4/AXI4Lite/AXI4Lite_GitVersionRegister.vhdl +++ b/src/bus/axi4lite/axi4lite_GitVersionRegister.vhdl @@ -15,7 +15,7 @@ -- constant My_Version : T_VersionRegister := to_VersionRegister(MEM_PATH); -- -- Use the pre-synthesis script from --- PoC/tools/git/preSynth_GitVersionRegister_Vivado.tcl +-- /tools/Vivado/preSynth_GitVersionRegister_Vivado.tcl -- to create a memory file with all necessary information. Add this file name to -- the VERSION_FILE_NAME generic. -- @@ -50,7 +50,7 @@ use work.xil.all; use work.mem_GitVersionRegister.all; -entity AXI4Lite_GitVersionRegister is +entity axi4lite_GitVersionRegister is Generic ( VERSION_FILE_NAME : string; -- Path to version-memory generated by preSynth_GitVersionRegister_Vivado.tcl WRITE_FILE_NAME : string := ""; -- Writes the Version-Register structure to a csv file with this name. Leave empty if not used. @@ -72,7 +72,7 @@ entity AXI4Lite_GitVersionRegister is end entity; -architecture rtl of AXI4Lite_GitVersionRegister is +architecture rtl of axi4lite_GitVersionRegister is constant CONFIG : T_AXI4_Register_Vector := get_Version_Descriptor; constant VersionData : T_SLVV_32(0 to C_Num_VersionHeader - 1) := read_Version_from_mem(PROJECT_DIR & VERSION_FILE_NAME); @@ -87,7 +87,7 @@ begin assert write_csv_file(PROJECT_DIR & WRITE_FILE_NAME, CONFIG) report "Failure in writing CSV File" severity warning; end generate; - AXI4LiteReg : entity work.AXI4Lite_Register + AXI4LiteReg : entity work.axi4lite_Register generic map( CONFIG => CONFIG, IGNORE_HIGH_ADDRESS => IGNORE_HIGH_ADDRESS, @@ -128,7 +128,7 @@ begin end generate; efuse_gen : if INCLUDE_XIL_USER_EFUSE generate - assert false report "AXI4Lite_GitVersionRegister:: INCLUDE_XIL_USR_EFUSE is currently not supported, feel free to implement it ;)" severity failure; + assert false report "axi4lite_GitVersionRegister:: INCLUDE_XIL_USR_EFUSE is currently not supported, feel free to implement it ;)" severity failure; else generate UID_vec(low(C_Num_reg_UID_vec, 1) to high(C_Num_reg_UID_vec, 1)) <= (others => (others => '0')); end generate; diff --git a/src/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock.vhdl b/src/bus/axi4lite/axi4lite_HighResolutionClock.vhdl similarity index 94% rename from src/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock.vhdl rename to src/bus/axi4lite/axi4lite_HighResolutionClock.vhdl index c61399193..bc0bc2bc0 100644 --- a/src/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock.vhdl +++ b/src/bus/axi4lite/axi4lite_HighResolutionClock.vhdl @@ -17,7 +17,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -35,7 +35,7 @@ use work.axi4lite.all; use work.clock.all; -entity AXI4Lite_HighResolutionClock is +entity axi4lite_HighResolutionClock is generic ( CLOCK_FREQUENCY : FREQ; -- Frequency of input clock USE_CDC : boolean := False; -- enable/disable CDC FIFO @@ -43,8 +43,8 @@ entity AXI4Lite_HighResolutionClock is SECOND_RESOLUTION : T_SECOND_RESOLUTION := NANOSECONDS -- Time_sec_res in NANOSECONDS, MICROSECONDS or MILLISECONDS ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; AXI4Lite_Clock : in std_logic; AXI4Lite_Reset : in std_logic; @@ -57,7 +57,7 @@ entity AXI4Lite_HighResolutionClock is end entity; -architecture rtl of AXI4Lite_HighResolutionClock is +architecture rtl of axi4lite_HighResolutionClock is constant PERIOD_NANOSECONDS : natural := TimingToCycles(1.0e-9, CLOCK_FREQUENCY); function generateRegisterConfiguration return T_AXI4_Register_Vector is @@ -139,7 +139,7 @@ begin Nanoseconds <= Nanoseconds_registers(REGISTER_NANOSECONDS); CDC_gen: if USE_CDC generate - FIFO_CDC: entity work.AXI4Lite_FIFO_CDC + FIFO_CDC: entity work.axi4lite_FIFO_CDC port map ( -- IN Port In_Clock => AXI4Lite_Clock, @@ -157,18 +157,18 @@ begin AXI4Lite_s2m <= AXI4Lite_s2m_b; end generate; - ClockRegister : entity work.AXI4Lite_Register + ClockRegister : entity work.axi4lite_Register generic map ( CONFIG => RegisterConfiguration ) port map ( - Clock => Clock, - Reset => Reset, - AXI4Lite_m2s => AXI4Lite_m2s_b, - AXI4Lite_s2m => AXI4Lite_s2m_b, - RegisterFile_ReadPort => Reg_ReadPort, - RegisterFile_ReadPort_hit => Reg_ReadPort_hit, - RegisterFile_WritePort => Reg_WritePort + Clock => Clock, + Reset => Reset, + AXI4Lite_m2s => AXI4Lite_m2s_b, + AXI4Lite_s2m => AXI4Lite_s2m_b, + RegisterFile_ReadPort => Reg_ReadPort, + RegisterFile_ReadPort_hit => Reg_ReadPort_hit, + RegisterFile_WritePort => Reg_WritePort ); Reg_WritePort(get_index("Nanoseconds_lower", RegisterConfiguration)) <= std_logic_vector(Nanoseconds(31 downto 0)); diff --git a/src/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter.vhdl b/src/bus/axi4lite/axi4lite_OCRAM_Adapter.vhdl similarity index 89% rename from src/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter.vhdl rename to src/bus/axi4lite/axi4lite_OCRAM_Adapter.vhdl index 8f3252eff..2ba67e640 100644 --- a/src/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter.vhdl +++ b/src/bus/axi4lite/axi4lite_OCRAM_Adapter.vhdl @@ -4,7 +4,7 @@ -- Srikanth Boppudi -- Stefan Unrein -- --- Entity: AXI4Lite_OCRAM_Adapter +-- Entity: axi4lite_OCRAM_Adapter -- -- Description: -- This module bridges the AXI4-Lite bus to a simplified synchronous RAM interface. @@ -28,7 +28,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -44,29 +44,30 @@ use IEEE.numeric_std.all; use work.utils.all; use work.axi4lite.all; -entity AXI4Lite_OCRAM_Adapter is +entity axi4lite_OCRAM_Adapter is generic ( OCRAM_ADDRESS_BITS : positive; OCRAM_DATA_BITS : positive; PREFFERED_READ_ACCESS : boolean := TRUE; - INPUT_STAGES : natural := 0 + INPUT_STAGES : natural := 0; + ADD_READ_DELAY : boolean := FALSE -- delay read if data is available on the bus after two clock cycles ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - AXI4Lite_m2s : in T_AXI4Lite_Bus_m2s; + AXI4Lite_m2s : in T_AXI4Lite_Bus_m2s; AXI4Lite_s2m : out T_AXI4Lite_Bus_s2m; OCRAM_Address : out unsigned(OCRAM_ADDRESS_BITS - 1 downto 0) := (others => '0'); OCRAM_WriteEnable : out std_logic; OCRAM_ByteEnable : out std_logic_vector((OCRAM_DATA_BITS / 8) - 1 downto 0); - OCRAM_DataIn : in std_logic_vector(OCRAM_DATA_BITS - 1 downto 0); + OCRAM_DataIn : in std_logic_vector(OCRAM_DATA_BITS - 1 downto 0); OCRAM_DataOut : out std_logic_vector(OCRAM_DATA_BITS - 1 downto 0) ); end entity; -architecture rtl of AXI4Lite_OCRAM_Adapter is +architecture rtl of axi4lite_OCRAM_Adapter is constant ADDRESS_BITS : positive := AXI4Lite_m2s.AWAddr'length; constant DATA_BITS : positive := AXI4Lite_m2s.WData'length; constant ADDR_LSB : positive := log2ceil(DATA_BITS) - 3; @@ -91,6 +92,7 @@ architecture rtl of AXI4Lite_OCRAM_Adapter is st_read_data_ack, st_write_response_wait, st_read_response_wait, + st_read_response_wait_delay, st_error ); @@ -98,11 +100,11 @@ architecture rtl of AXI4Lite_OCRAM_Adapter is signal nextState : t_state; begin - assert (ADDRESS_BITS - ADDR_LSB) >= OCRAM_ADDRESS_BITS report "PoC.AXI4Lite_OCRAM_Adapter:: Not enough address bits in AXI4L bus for " & integer'image(OCRAM_ADDRESS_BITS) & " OCRAM-address-bits!" severity failure; - assert DATA_BITS >= OCRAM_DATA_BITS report "PoC.AXI4Lite_OCRAM_Adapter:: Not enough data bits in AXI4L bus for " & integer'image(OCRAM_DATA_BITS) & " OCRAM-data-bits!" severity failure; + assert (ADDRESS_BITS - ADDR_LSB) >= OCRAM_ADDRESS_BITS report "PoC.axi4lite_OCRAM_Adapter:: Not enough address bits in AXI4L bus for " & integer'image(OCRAM_ADDRESS_BITS) & " OCRAM-address-bits!" severity failure; + assert DATA_BITS >= OCRAM_DATA_BITS report "PoC.axi4lite_OCRAM_Adapter:: Not enough data bits in AXI4L bus for " & integer'image(OCRAM_DATA_BITS) & " OCRAM-data-bits!" severity failure; pipeline_in : if INPUT_STAGES > 0 generate - pipeline : entity work.AXI4Lite_FIFO + pipeline : entity work.axi4lite_FIFO generic map( TRANSACTIONS => INPUT_STAGES ) @@ -239,9 +241,17 @@ begin end if; when st_read_data_ack => - axi_arready <= '1'; - nextState <= st_read_response_wait; + if not ADD_READ_DELAY then + axi_arready <= '1'; + nextState <= st_read_response_wait; + else + nextState <= st_read_response_wait_delay; + end if; + + when st_read_response_wait_delay => + axi_arready <= '1'; + nextState <= st_read_response_wait; when st_write_response_wait => axi_bvalid <= '1'; diff --git a/src/bus/axi4/AXI4Lite/AXI4Lite_OSVVM.pkg.vhdl b/src/bus/axi4lite/axi4lite_OSVVM.pkg.vhdl similarity index 95% rename from src/bus/axi4/AXI4Lite/AXI4Lite_OSVVM.pkg.vhdl rename to src/bus/axi4lite/axi4lite_OSVVM.pkg.vhdl index acc384bc4..8cf00ec1a 100644 --- a/src/bus/axi4/AXI4Lite/AXI4Lite_OSVVM.pkg.vhdl +++ b/src/bus/axi4lite/axi4lite_OSVVM.pkg.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Stefan Unrein +-- Authors: Stefan Unrein -- --- Entity: Generic AMBA AXI4-Lite bus description +-- Entity: Generic AMBA AXI4-Lite bus description -- -- Description: -- ------------------------------------- @@ -30,17 +30,17 @@ use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use work.utils.all; -use work.AXI4Lite.all; +use work.axi4lite.all; library OSVVM_AXI4; use OSVVM_AXI4.Axi4LiteInterfacePkg.all; -package AXI4Lite_OSVVM is +package axi4lite_OSVVM is procedure to_PoC_AXI4Lite_Bus_Slave(signal PoC_M2S : in T_AXI4LITE_BUS_M2S; signal PoC_S2M : out T_AXI4LITE_BUS_S2M; signal OSVVM_Bus : inout Axi4LiteRecType); procedure to_PoC_AXI4Lite_Bus_Master(signal PoC_M2S : out T_AXI4LITE_BUS_M2S; signal PoC_S2M : in T_AXI4LITE_BUS_S2M; signal OSVVM_Bus : inout Axi4LiteRecType); end package; -package body AXI4Lite_OSVVM is +package body axi4lite_OSVVM is procedure to_PoC_AXI4Lite_Bus_Slave(signal PoC_M2S : in T_AXI4LITE_BUS_M2S; signal PoC_S2M : out T_AXI4LITE_BUS_S2M; signal OSVVM_Bus : inout Axi4LiteRecType) is begin InitAxi4LiteRec (AxiBusRec => OSVVM_Bus) ; diff --git a/src/bus/axi4/AXI4Lite/AXI4Lite_Register.vhdl b/src/bus/axi4lite/axi4lite_Register.vhdl similarity index 94% rename from src/bus/axi4/AXI4Lite/AXI4Lite_Register.vhdl rename to src/bus/axi4lite/axi4lite_Register.vhdl index 20630c253..1e303d1b6 100644 --- a/src/bus/axi4/AXI4Lite/AXI4Lite_Register.vhdl +++ b/src/bus/axi4lite/axi4lite_Register.vhdl @@ -6,7 +6,7 @@ -- Asif Iqbal -- Max Kraft-Kugler -- --- Entity: AXI4Lite_Register +-- Entity: axi4lite_Register -- -- Description: -- ------------------------------------- @@ -46,7 +46,7 @@ use work.strings.all; use work.axi4lite.all; -entity AXI4Lite_Register is +entity axi4lite_Register is generic ( CONFIG : T_AXI4_Register_Vector; -- Register configuration INTERRUPT_IS_STROBE : boolean := true; -- If set to true, generates a strobe for an interrupt, on false, generate level interrupt @@ -64,7 +64,7 @@ entity AXI4Lite_Register is AXI4Lite_m2s : in T_AXI4Lite_BUS_M2S; AXI4Lite_s2m : out T_AXI4Lite_BUS_S2M; - AXI4Lite_IRQ : out std_logic := '0'; + AXI4Lite_irq : out std_logic := '0'; RegisterFile_ReadPort : out T_SLVV(0 to CONFIG'Length - 1)(DATA_BITS - 1 downto 0); RegisterFile_ReadPort_hit : out std_logic_vector(0 to CONFIG'Length - 1); @@ -73,12 +73,12 @@ entity AXI4Lite_Register is RegisterFile_WritePort_strobe : in std_logic_vector(0 to CONFIG'Length - 1) := get_strobeVector(CONFIG) ); attribute MARK_DEBUG : string; - attribute mark_debug of AXI4Lite_IRQ : signal is to_string(DEBUG); + attribute mark_debug of AXI4Lite_irq : signal is to_string(DEBUG); end entity; -architecture rtl of AXI4Lite_Register is - constant Assert_prefix : string := "PoC.Axi4LiteRegister"; +architecture rtl of axi4lite_Register is + constant Assert_prefix : string := "PoC.axi4lite_Register"; constant ADDRESS_BITS : positive := AXI4Lite_m2s.AWAddr'length; constant DATA_BITS : positive := AXI4Lite_m2s.WData'length; constant DATA_BITS_intern : positive := 32; @@ -116,7 +116,7 @@ architecture rtl of AXI4Lite_Register is constant CONFIG_i : T_AXI4_Register_Vector := gen_config; - constant Interrupt_range : T_NATVEC := get_Interrupt_range(CONFIG_i); + constant Interrupt_range : natural_vector := get_Interrupt_range(CONFIG_i); --Highest bit is for Reason Register signal Is_Interrupt : std_logic_vector(0 to NUMBER_INTERRUPT_REGISTERS - 1); @@ -140,7 +140,7 @@ architecture rtl of AXI4Lite_Register is addr := CONFIG_i(i).Address(addr'range); for ii in i + 1 to CONFIG_i'high loop if addr = CONFIG_i(ii).Address(addr'range) then - report "PoC.AXI4Lite_Register Error: Address conflict (0x" & to_hstring(addr) & ") between: CONFIG(" & integer'image(i) & ")=" & CONFIG_i(i).Name & " and CONFIG(" & integer'image(ii) & ")=" & CONFIG_i(ii).Name & " are equal!" severity failure; + report "PoC.axi4lite_Register Error: Address conflict (0x" & to_hstring(addr) & ") between: CONFIG(" & integer'image(i) & ")=" & CONFIG_i(i).Name & " and CONFIG(" & integer'image(ii) & ")=" & CONFIG_i(ii).Name & " are equal!" severity failure; return false; end if; end loop; @@ -153,7 +153,7 @@ architecture rtl of AXI4Lite_Register is begin for i in CONFIG_i'range loop report "CONFIG(" & resize(integer'image(i), 2, ' ') & "):" & to_string(CONFIG_i(i)) severity note; --- report to_string(CONFIG_i(i)) severity note; +-- report to_string(CONFIG_i(i)) severity note; end loop; return "-"; end function; @@ -378,7 +378,7 @@ begin when others => --Unsupported - assert false report "AXI4Lite_Register::: RegisterMode : " + assert false report "axi4lite_Register::: RegisterMode : " & T_AXI4Lite_RegisterModes'image(CONFIG_i(i).RegisterMode) & " of Config(" & integer'image(i) & ") is not supported!" severity failure; end case; @@ -505,15 +505,15 @@ begin -- output the read data -- Read address mux --- axi_rdata <= RegisterFile(lssb_idx(hit_r)); +-- axi_rdata <= RegisterFile(lssb_idx(hit_r)); axi_rdata(DATA_BITS_intern -1 downto 0) <= axi_rdata_mux(idx); --- axi_rdata <= first_out(hit_r, RegisterFile); --- rdata_mux : for i in hit_r'high downto hit_r'low loop --- if (hit_r(i)) = '1' then --- axi_rdata <= RegisterFile(i); --- exit; --- end if; --- end loop; +-- axi_rdata <= first_out(hit_r, RegisterFile); +-- rdata_mux : for i in hit_r'high downto hit_r'low loop +-- if (hit_r(i)) = '1' then +-- axi_rdata <= RegisterFile(i); +-- exit; +-- end if; +-- end loop; if MODE_64bit then if (idx + 1 <= hit_r_1'high) and (hit_r_1(idx + 1) = '1') then axi_rdata(axi_rdata'high downto DATA_BITS_intern) <= axi_rdata_mux(idx +1); @@ -529,7 +529,7 @@ begin begin read_mux_gen_i : if i = CONFIG_i'high and ENABLE_INTERRUPT generate axi_rdata_mux(i) <= reverse(resize(Is_Interrupt, DATA_BITS_intern)); - elsif CONFIG_i(i).RegisterMode = ReadOnly_NotRegistered generate + elsif CONFIG_i(i).RegisterMode = ReadOnly_NotRegistered generate axi_rdata_mux(i) <= RegisterFile_WritePort(i); elsif CONFIG_i(i).RegisterMode = ReadWrite_NotRegistered generate axi_rdata_mux(i) <= RegisterFile_WritePort(i); @@ -592,7 +592,7 @@ begin constant config_addr : unsigned(REG_ADDRESS_BITS - 1 downto ADDR_LSB) := CONFIG_i(i).Address(REG_ADDRESS_BITS - 1 downto ADDR_LSB) -1; constant is_config : std_logic := ite( config_addr = CONFIG_i(i - 1).Address(REG_ADDRESS_BITS - 1 downto ADDR_LSB) and CONFIG_i(i - 1).Address(ADDR_LSB) = '0' --Data aligned access --- and (CONFIG_i(i).RegisterMode = CONFIG_i(i -1).RegisterMode) +-- and (CONFIG_i(i).RegisterMode = CONFIG_i(i -1).RegisterMode) and ( (CONFIG_i(i).RegisterMode = ReadWrite) or (CONFIG_i(i).RegisterMode = LatchValue_ClearOnWrite) or (CONFIG_i(i).RegisterMode = LatchHighBit_ClearOnWrite) @@ -600,8 +600,8 @@ begin , '1', '0'); begin assert (is_config /= '1' or not DEBUG) - report Assert_prefix & ":: Creating 64bit-Write-Register for Config(" & integer'image(i) & ") and Config(" & integer'image(i - 1) & ")" - severity note; + report Assert_prefix & ":: Creating 64bit-Write-Register for Config(" & integer'image(i) & ") and Config(" & integer'image(i - 1) & ")" + severity note; hit_w_1(i) <= is_address_w(i -1) when (is_config = '1') else '0'; end generate; @@ -622,9 +622,9 @@ begin end generate; -- WORKAROUND: for Xilinx Vivado - -- Version: Last tested 2018.3 - -- Issue: Null range in generate loop not correctly handled - -- Solution: Add another if generate around the generate loop + -- Version: Last tested 2018.3 + -- Issue: Null range in generate loop not correctly handled + -- Solution: Add another if generate around the generate loop Interrupt_Count : if ENABLE_INTERRUPT generate Interrupt_gen : for i in Is_Interrupt'range generate constant num : natural := Interrupt_range(i); @@ -648,7 +648,7 @@ begin Is_Interrupt(i) <= slv_or(RegisterFile_WritePort(num)) and RegisterFile(CONFIG'high + 1)(i) and not (slv_reg_rden_re and (hit_r(num) or hit_r_1(num))); when others => - assert false report "AXI4Lite_Register::: Interrupt_gen : IRQ Register for type " & T_AXI4Lite_RegisterModes'image(CONFIG_i(num).RegisterMode) & " is not possible!" severity failure; + assert false report "axi4lite_Register::: Interrupt_gen : IRQ Register for type " & T_AXI4Lite_RegisterModes'image(CONFIG_i(num).RegisterMode) & " is not possible!" severity failure; end case; end process; @@ -657,11 +657,11 @@ begin Is_Interrupt_d <= Is_Interrupt when rising_edge(Clock); Is_Interrupt_re <= Is_Interrupt and not Is_Interrupt_d; - AXI4Lite_IRQ <= or(Is_Interrupt_re) when INTERRUPT_IS_STROBE else or(Is_Interrupt); + AXI4Lite_irq <= or(Is_Interrupt_re) when INTERRUPT_IS_STROBE else or(Is_Interrupt); else generate - AXI4Lite_IRQ <= '0'; + AXI4Lite_irq <= '0'; end generate; end architecture; diff --git a/src/bus/axi4/AXI4Lite/AXI4Lite_Termination_Manager.vhdl b/src/bus/axi4lite/axi4lite_Termination_Manager.vhdl similarity index 88% rename from src/bus/axi4/AXI4Lite/AXI4Lite_Termination_Manager.vhdl rename to src/bus/axi4lite/axi4lite_Termination_Manager.vhdl index da20aee9e..d6352aef5 100644 --- a/src/bus/axi4/AXI4Lite/AXI4Lite_Termination_Manager.vhdl +++ b/src/bus/axi4lite/axi4lite_Termination_Manager.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Stefan Unrein +-- Authors: Stefan Unrein -- --- Entity: A master-side bus termination module for AXI4-Lite. +-- Entity: A master-side bus termination module for AXI4-Lite. -- -- Description: -- ------------------------------------- @@ -31,7 +31,7 @@ use IEEE.std_logic_1164.all; use work.axi4lite.all; -entity AXI4Lite_Termination_Manager is +entity axi4lite_Termination_Manager is generic ( VALUE : std_logic := '0' ); @@ -42,7 +42,7 @@ entity AXI4Lite_Termination_Manager is end entity; -architecture rtl of AXI4Lite_Termination_Manager is +architecture rtl of axi4lite_Termination_Manager is constant AddrBits : natural := AXI4Lite_M2S.AWAddr'length; constant DataBits : natural := AXI4Lite_M2S.WData'length; begin diff --git a/src/bus/axi4/AXI4Lite/AXI4Lite_Termination_Subordinate.vhdl b/src/bus/axi4lite/axi4lite_Termination_Subordinate.vhdl similarity index 72% rename from src/bus/axi4/AXI4Lite/AXI4Lite_Termination_Subordinate.vhdl rename to src/bus/axi4lite/axi4lite_Termination_Subordinate.vhdl index 7f03901a0..6d50ed076 100644 --- a/src/bus/axi4/AXI4Lite/AXI4Lite_Termination_Subordinate.vhdl +++ b/src/bus/axi4lite/axi4lite_Termination_Subordinate.vhdl @@ -34,20 +34,20 @@ use work.axi4lite.all; use work.fifo.all; -entity AXI4Lite_Termination_Subordinate is +entity axi4lite_Termination_Subordinate is generic( RESPONSE_CODE : T_AXI4_Response := C_AXI4_RESPONSE_SLAVE_ERROR ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; AXI4Lite_M2S : in T_AXI4LITE_BUS_M2S; AXI4Lite_S2M : out T_AXI4LITE_BUS_S2M ); end entity; -architecture rtl of AXI4Lite_Termination_Subordinate is +architecture rtl of axi4lite_Termination_Subordinate is signal fifo_aw_valid : std_logic; signal fifo_w_valid : std_logic; signal AWFull_i : std_logic; @@ -68,46 +68,46 @@ begin fifo_aw: fifo_cc_got generic map( - D_BITS => 1, + DATA_BITS => 1, MIN_DEPTH => 4 ) port map( - clk => Clock, - rst => Reset, - put => AXI4Lite_M2S.AWValid, - din => "0", - full => AWFull_i, - got => AXI4Lite_M2S.BReady and fifo_w_valid, - valid => fifo_aw_valid + Clock => Clock, + Reset => Reset, + Put => AXI4Lite_M2S.AWValid, + DataIn => "0", + Full => AWFull_i, + Got => AXI4Lite_M2S.BReady and fifo_w_valid, + Valid => fifo_aw_valid ); fifo_w: fifo_cc_got generic map( - D_BITS => 1, + DATA_BITS => 1, MIN_DEPTH => 4 ) port map( - clk => Clock, - rst => Reset, - put => AXI4Lite_M2S.WValid, - din => "0", - full => WFull_i, - got => AXI4Lite_M2S.BReady and fifo_aw_valid, - valid => fifo_w_valid + Clock => Clock, + Reset => Reset, + Put => AXI4Lite_M2S.WValid, + DataIn => "0", + Full => WFull_i, + Got => AXI4Lite_M2S.BReady and fifo_aw_valid, + Valid => fifo_w_valid ); fifo_r: fifo_cc_got generic map( - D_BITS => 1, + DATA_BITS => 1, MIN_DEPTH => 4 ) port map( - clk => Clock, - rst => Reset, - din => "0", - put => AXI4Lite_M2S.ARValid, - full => ARFull_i, - got => AXI4Lite_M2S.RReady, - valid => AXI4Lite_S2M.RValid + Clock => Clock, + Reset => Reset, + DataIn => "0", + Put => AXI4Lite_M2S.ARValid, + Full => ARFull_i, + Got => AXI4Lite_M2S.RReady, + Valid => AXI4Lite_S2M.RValid ); end architecture; diff --git a/src/bus/axi4/AXI4Lite/AXI4Lite_UART.vhdl b/src/bus/axi4lite/axi4lite_UART.vhdl similarity index 85% rename from src/bus/axi4/AXI4Lite/AXI4Lite_UART.vhdl rename to src/bus/axi4lite/axi4lite_UART.vhdl index ef792ce03..ee4c00d27 100644 --- a/src/bus/axi4/AXI4Lite/AXI4Lite_UART.vhdl +++ b/src/bus/axi4lite/axi4lite_UART.vhdl @@ -19,7 +19,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -28,9 +28,9 @@ -- limitations under the License. -- ============================================================================= -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.axi4lite.all; use work.vectors.all; @@ -39,7 +39,7 @@ use work.components.all; use work.utils.all; use work.UART.all; -entity AXI4Lite_UART is +entity axi4lite_UART is generic ( -- UART communication parameters CLOCK_FREQ : FREQ; @@ -54,37 +54,39 @@ entity AXI4Lite_UART is RX_FIFO_DEPTH : positive := 16; -- Flow Control - FLOWCONTROL : T_IO_UART_FLOWCONTROL_KIND := UART_FLOWCONTROL_NONE; + FLOWCONTROL : T_UART_FLOWCONTROL_KIND := UART_FLOWCONTROL_NONE; SWFC_XON_CHAR : std_logic_vector(7 downto 0) := x"11"; -- ^Q SWFC_XOFF_CHAR : std_logic_vector(7 downto 0) := x"13" -- ^S ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - AXI4Lite_m2s : in T_AXI4LITE_BUS_M2S; + AXI4Lite_m2s : in T_AXI4LITE_BUS_M2S; AXI4Lite_s2m : out T_AXI4LITE_BUS_S2M; AXI4Lite_irq : out std_logic; -- UART Pins UART_TX : out std_logic; - UART_RX : in std_logic; + UART_RX : in std_logic; UART_RTS : out std_logic; - UART_CTS : in std_logic + UART_CTS : in std_logic ); end entity; -architecture rtl of AXI4Lite_UART is + +architecture rtl of axi4lite_UART is constant TX_EMPTY_STATE_BITS : natural := 4; constant RX_FULL_STATE_BITS : natural := 4; constant Reg_config : T_AXI4_Register_Vector := ( - to_AXI4_Register(Name => "Rx", Address => 32x"00", RegisterMode => ReadOnly_NotRegistered, Init_Value => x"00000000"), - to_AXI4_Register(Name => "Tx", Address => 32x"04", RegisterMode => ReadWrite_NotRegistered, Init_Value => x"00000000"), - to_AXI4_Register(Name => "Status", Address => 32x"08", RegisterMode => ReadOnly, Init_Value => x"00000000"), - to_AXI4_Register(Name => "Control", Address => 32x"0C", RegisterMode => ReadWrite, Init_Value => x"00000000") + to_AXI4_Register(Name => "Rx", Address => 32x"00", RegisterMode => ReadOnly_NotRegistered, Init_Value => x"00000000"), + to_AXI4_Register(Name => "Tx", Address => 32x"04", RegisterMode => ReadWrite_NotRegistered, Init_Value => x"00000000"), + to_AXI4_Register(Name => "Status", Address => 32x"08", RegisterMode => ReadOnly, Init_Value => x"00000000"), + to_AXI4_Register(Name => "Control", Address => 32x"0C", RegisterMode => ReadWrite, Init_Value => x"00000000") ); subtype RegPortType is T_SLVV(0 to (Reg_Config'length - 1))(31 downto 0); + signal Reg_ReadPort : RegPortType; signal Reg_WritePort : RegPortType := (others => (others => '0')); signal Reg_ReadPort_hit : std_logic_vector(RegPortType'range); @@ -98,21 +100,21 @@ architecture rtl of AXI4Lite_UART is --Bit positions of the above registers signal Status_RX_Valid : std_logic; - signal Status_RX_Valid_d : std_logic; + signal Status_RX_Valid_d : std_logic := '0'; signal RX_Got : std_logic; signal Control_RX_Reset : std_logic; signal Status_InterruptEnable : std_logic; - signal Status_RX_Overrun : std_logic; + signal Status_RX_Overrun : std_logic := '0'; signal RX_OverFlow : std_logic; signal Status_RX_Full : std_logic; signal RX_StatusReg_hit : std_logic; --signal status_Frame_Error : std_logic; - signal status_Parity_error : std_logic; + signal status_Parity_error : std_logic := '0'; signal parity_error : std_logic; signal TX_Put : std_logic; signal TXFIFO_Empty : std_logic; - signal TXFIFO_Empty_d : std_logic; + signal TXFIFO_Empty_d : std_logic := '0'; signal Status_TX_Full : std_logic; signal Control_TX_Reset : std_logic; signal Control_InterruptEnable : std_logic; @@ -120,7 +122,7 @@ architecture rtl of AXI4Lite_UART is signal Status_TX_EmptyState : std_logic_vector(imax(0, TX_EMPTY_STATE_BITS - 1) downto 0); signal Status_RX_FullState : std_logic_vector(imax(0, RX_FULL_STATE_BITS - 1) downto 0); begin - Reg : entity work.AXI4Lite_Register + Reg : entity work.axi4lite_Register generic map( INIT_ON_RESET => true, CONFIG => Reg_config @@ -174,7 +176,7 @@ begin TXFIFO_Empty_d <= TXFIFO_Empty when rising_edge(Clock); -- Delay flag by one CC AXI4Lite_irq <= Status_InterruptEnable when ((Status_RX_Valid and not Status_RX_Valid_d) or (TXFIFO_Empty and not TXFIFO_Empty_d)) = '1' else '0'; -- Create IRQ for rising-edge of both flags - UART : entity work.UART_fifo + UART : entity work.uart_FIFO generic map( -- Communication Parameters CLOCK_FREQ => CLOCK_FREQ, @@ -191,8 +193,8 @@ begin RX_FSTATE_BITS => RX_FULL_STATE_BITS, -- Flow Control - FLOWCONTROL => FLOWCONTROL, - SWFC_XON_CHAR => SWFC_XON_CHAR, + FLOWCONTROL => FLOWCONTROL, + SWFC_XON_CHAR => SWFC_XON_CHAR, SWFC_XOFF_CHAR => SWFC_XOFF_CHAR ) port map ( @@ -200,7 +202,7 @@ begin Reset => Reset, -- FIFO interface - TX_put => TX_Put, + TX_Put => TX_Put, TX_Data => TX_Data, TX_Full => Status_TX_Full, TX_EmptyState => Status_TX_EmptyState, @@ -208,7 +210,7 @@ begin TXFIFO_Empty => TXFIFO_Empty, RX_Valid => Status_RX_Valid, RX_Data => RX_Data, - RX_got => RX_Got, + RX_Got => RX_Got, RX_FullState => Status_RX_FullState, RX_Overflow => RX_OverFlow, RXFIFO_Full => Status_RX_Full, @@ -219,7 +221,7 @@ begin UART_RX => UART_RX, UART_RTS => UART_RTS, UART_CTS => UART_CTS, - UART_parity_error => parity_error + UART_ParityError => parity_error ); end architecture; diff --git a/src/bus/axi4lite/build.pro b/src/bus/axi4lite/build.pro new file mode 100644 index 000000000..f863e8604 --- /dev/null +++ b/src/bus/axi4lite/build.pro @@ -0,0 +1,43 @@ +# ============================================================================= +# Authors: +# Stefan Unrein +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +#analyze ./axi4lite.pkg.vhdl; # analyzed in PoC.pro + +disabled ./axi4lite_AddressMask.vhdl +disabled ./axi4lite_AddressTruncate.vhdl +disabled ./axi4lite_Writer.vhdl +disabled ./axi4lite_Reader.vhdl +# disabled ./axi4lite_Configurator.vhdl # Does not work right now +analyze ./axi4lite_DeMux.vhdl +disabled ./axi4lite_ErrorFilter.vhdl +analyze ./axi4lite_FIFO.vhdl +analyze ./axi4lite_FIFO_CDC.vhdl +analyze ./axi4lite_Register.vhdl +disabled ./axi4lite_Register_split.vhdl +analyze ./axi4lite_Termination_Manager.vhdl +analyze ./axi4lite_Termination_Subordinate.vhdl +analyze ./axi4lite_HighResolutionClock.vhdl +# disabled ./axi4lite_Interrupt_Controller.vhdl # Does not work right now +analyze ./axi4lite_OCRAM_Adapter.vhdl +analyze ./axi4lite_OSVVM.pkg.vhdl +analyze ./axi4lite_GitVersionRegister.vhdl +disabled ./axi4lite_SimpleInterface.vhdl +analyze ./axi4lite_UART.vhdl diff --git a/src/bus/axi4/AXI4Stream/AXI4Stream.pkg.vhdl b/src/bus/axi4stream/axi4stream.pkg.vhdl similarity index 64% rename from src/bus/axi4/AXI4Stream/AXI4Stream.pkg.vhdl rename to src/bus/axi4stream/axi4stream.pkg.vhdl index f6bb57ef3..f9d20334c 100644 --- a/src/bus/axi4/AXI4Stream/AXI4Stream.pkg.vhdl +++ b/src/bus/axi4stream/axi4stream.pkg.vhdl @@ -8,26 +8,26 @@ -- Description: -- ------------------------------------- -- This package implements a generic AMBA AXI4-Stream description. --- The bus created by the two main unconstrained records T_AXI4Stream_BUS_M2S and --- T_AXI4Stream_BUS_S2M. *_M2S stands for Master-to-Slave and defines the direction +-- The bus created by the two main unconstrained records T_AXI4Stream_m2s and +-- T_AXI4Stream_s2m. *_M2S stands for Master-to-Slave and defines the direction -- from master to the slave component of the bus. Vice versa for the *_S2M type. -- -- Usage: -- You can use this record type as a normal, unconstrained record. Create signal -- with a constrained subtype and connect it to the desired components. -- To avoid constraining overhead, you can use the generic sized-package: --- package AXI4Stream_Sized_64D_1ID_1Dest_1User is --- new work.AXI4Stream_Sized +-- package axi4stream_Sized_64D_1ID_1Dest_1User is +-- new work.axi4stream_Sized -- generic map( -- DATA_BITS => 64 -- ); -- Then simply use the sized subtypes: --- signal DeMux_M2S : AXI4Stream_Sized_64D_1ID_1Dest_1User.Sized_M2S; --- signal DeMux_S2M : AXI4Stream_Sized_64D_1ID_1Dest_1User.Sized_S2M; +-- signal DeMux_M2S : axi4stream_Sized_64D_1ID_1Dest_1User.Sized_M2S; +-- signal DeMux_S2M : axi4stream_Sized_64D_1ID_1Dest_1User.Sized_S2M; -- -- If multiple components need to be connected, you can also use the predefined --- vector type T_AXI4Stream_BUS_M2S_VECTOR and T_AXI4Stream_BUS_S2M_VECTOR, which --- gives you a vector of AXI4Stream records. This is also available in the generic +-- vector type T_AXI4Stream_m2s_VECTOR and T_AXI4Stream_s2m_VECTOR, which +-- gives you a vector of axi4stream records. This is also available in the generic -- package as Sized_M2S_Vector and Sized_S2M_Vector. -- -- License: @@ -51,8 +51,8 @@ library IEEE; use IEEE.std_logic_1164.all; -package AXI4Stream is - type T_AXI4Stream_M2S is record +package axi4stream is + type T_axi4stream_M2S is record Valid : std_logic; Data : std_logic_vector; Keep : std_logic_vector; @@ -62,34 +62,33 @@ package AXI4Stream is ID : std_logic_vector; end record; - type T_AXI4Stream_S2M is record + type T_axi4stream_S2M is record Ready : std_logic; User : std_logic_vector; end record; - type T_AXI4Stream_M2S_VECTOR is array(natural range <>) of T_AXI4Stream_M2S; - type T_AXI4Stream_S2M_VECTOR is array(natural range <>) of T_AXI4Stream_S2M; + type T_axi4stream_M2S_VECTOR is array(natural range <>) of T_axi4stream_M2S; + type T_axi4stream_S2M_VECTOR is array(natural range <>) of T_axi4stream_S2M; - function Initialize_AXI4Stream_M2S(DataBits : natural; UserBits : positive := 1; DestBits : positive := 1; IDBits : positive := 1; Value : std_logic := 'Z') return T_AXI4Stream_M2S; - function Initialize_AXI4Stream_S2M(UserBits : positive := 1; Value : std_logic := 'Z') return T_AXI4Stream_S2M; + function Initialize_axi4stream_M2S(DataBits : natural; UserBits : positive := 1; DestBits : positive := 1; IDBits : positive := 1; Value : std_logic := 'Z') return T_axi4stream_M2S; + function Initialize_axi4stream_S2M(UserBits : positive := 1; Value : std_logic := 'Z') return T_axi4stream_S2M; - function EnableTransaction(EnableTransaction : std_logic; In_M2S : T_AXI4Stream_M2S) return T_AXI4Stream_M2S; - function EnableTransaction(EnableTransaction : std_logic; In_S2M : T_AXI4Stream_S2M) return T_AXI4Stream_S2M; - function get_TotalDataBits(In_M2S : T_AXI4Stream_M2S) return positive; - function serialize(In_M2S : T_AXI4Stream_M2S) return std_logic_vector; --Puts all data-fields in a std_logic_vector - function get_LastFromSerialized(Serialized : std_logic_vector; In_M2S : T_AXI4Stream_M2S) return std_logic; - function get_DataFromSerialized(Serialized : std_logic_vector; In_M2S : T_AXI4Stream_M2S) return std_logic_vector; - function get_UserFromSerialized(Serialized : std_logic_vector; In_M2S : T_AXI4Stream_M2S) return std_logic_vector; - function get_DestFromSerialized(Serialized : std_logic_vector; In_M2S : T_AXI4Stream_M2S) return std_logic_vector; - function get_IDFromSerialized(Serialized : std_logic_vector; In_M2S : T_AXI4Stream_M2S) return std_logic_vector; - function get_KeepFromSerialized(Serialized : std_logic_vector; In_M2S : T_AXI4Stream_M2S) return std_logic_vector; + function EnableTransaction(EnableTransaction : std_logic; In_M2S : T_axi4stream_M2S) return T_axi4stream_M2S; + function EnableTransaction(EnableTransaction : std_logic; In_S2M : T_axi4stream_S2M) return T_axi4stream_S2M; + function get_TotalDataBits(In_M2S : T_axi4stream_M2S) return positive; + function serialize(In_M2S : T_axi4stream_M2S) return std_logic_vector; --Puts all data-fields in a std_logic_vector + function get_LastFromSerialized(Serialized : std_logic_vector; In_M2S : T_axi4stream_M2S) return std_logic; + function get_DataFromSerialized(Serialized : std_logic_vector; In_M2S : T_axi4stream_M2S) return std_logic_vector; + function get_UserFromSerialized(Serialized : std_logic_vector; In_M2S : T_axi4stream_M2S) return std_logic_vector; + function get_DestFromSerialized(Serialized : std_logic_vector; In_M2S : T_axi4stream_M2S) return std_logic_vector; + function get_IDFromSerialized(Serialized : std_logic_vector; In_M2S : T_axi4stream_M2S) return std_logic_vector; + function get_KeepFromSerialized(Serialized : std_logic_vector; In_M2S : T_axi4stream_M2S) return std_logic_vector; end package; -package body AXI4Stream is - - function Initialize_AXI4Stream_M2S(DataBits : natural; UserBits : positive := 1; DestBits : positive := 1; IDBits : positive := 1; Value : std_logic := 'Z') return T_AXI4Stream_M2S is - constant init : T_AXI4Stream_M2S( +package body axi4stream is + function Initialize_axi4stream_M2S(DataBits : natural; UserBits : positive := 1; DestBits : positive := 1; IDBits : positive := 1; Value : std_logic := 'Z') return T_axi4stream_M2S is + constant init : T_axi4stream_M2S( Data(DataBits - 1 downto 0), User(UserBits - 1 downto 0), Dest(DestBits - 1 downto 0), @@ -108,8 +107,8 @@ package body AXI4Stream is return init; end function; - function Initialize_AXI4Stream_S2M(UserBits : positive := 1; Value : std_logic := 'Z') return T_AXI4Stream_S2M is - constant init : T_AXI4Stream_S2M(User(UserBits - 1 downto 0)) := ( + function Initialize_axi4stream_S2M(UserBits : positive := 1; Value : std_logic := 'Z') return T_axi4stream_S2M is + constant init : T_axi4stream_S2M(User(UserBits - 1 downto 0)) := ( Ready => Value, User => (others => Value) ); @@ -117,7 +116,7 @@ package body AXI4Stream is return init; end function; - function EnableTransaction(EnableTransaction : std_logic; In_M2S : T_AXI4Stream_M2S) return T_AXI4Stream_M2S is + function EnableTransaction(EnableTransaction : std_logic; In_M2S : T_axi4stream_M2S) return T_axi4stream_M2S is variable temp : In_M2S'subtype; begin temp.Valid := In_M2S.Valid and not EnableTransaction; @@ -130,7 +129,7 @@ package body AXI4Stream is return temp; end function; - function EnableTransaction(EnableTransaction : std_logic; In_S2M : T_AXI4Stream_S2M) return T_AXI4Stream_S2M is + function EnableTransaction(EnableTransaction : std_logic; In_S2M : T_axi4stream_S2M) return T_axi4stream_S2M is variable temp : In_S2M'subtype; begin temp.Ready := In_S2M.Ready and not EnableTransaction; @@ -138,59 +137,62 @@ package body AXI4Stream is return temp; end function; - function get_TotalDataBits(In_M2S : T_AXI4Stream_M2S) return positive is + function get_TotalDataBits(In_M2S : T_axi4stream_M2S) return positive is begin return In_M2S.Data'length + 1 + In_M2S.User'length + In_M2S.Dest'length + In_M2S.ID'length + In_M2S.Keep'length; end function; - function serialize(In_M2S : T_AXI4Stream_M2S) return std_logic_vector is + function serialize(In_M2S : T_axi4stream_M2S) return std_logic_vector is begin return In_M2S.ID & In_M2S.Dest & In_M2S.User & In_M2S.Last & In_M2S.Keep & In_M2S.Data; end function; - function get_LastFromSerialized(Serialized : std_logic_vector; In_M2S : T_AXI4Stream_M2S) return std_logic is + function get_LastFromSerialized(Serialized : std_logic_vector; In_M2S : T_axi4stream_M2S) return std_logic is begin - assert get_TotalDataBits(In_M2S) = Serialized'length report "AXI4Stream.pkg.get_LastFromSerialized:: Size of Serialized Data does not metch packing size of In_M2S!" severity failure; + assert get_TotalDataBits(In_M2S) = Serialized'length report "axi4stream.get_LastFromSerialized:: Size of Serialized Data does not metch packing size of In_M2S!" severity failure; return Serialized(In_M2S.Data'length + In_M2S.Keep'length + Serialized'low); end function; - function get_DataFromSerialized(Serialized : std_logic_vector; In_M2S : T_AXI4Stream_M2S) return std_logic_vector is + function get_DataFromSerialized(Serialized : std_logic_vector; In_M2S : T_axi4stream_M2S) return std_logic_vector is begin - assert get_TotalDataBits(In_M2S) = Serialized'length report "AXI4Stream.pkg.get_LastFromSerialized:: Size of Serialized Data does not metch packing size of In_M2S!" severity failure; + assert get_TotalDataBits(In_M2S) = Serialized'length report "axi4stream.get_LastFromSerialized:: Size of Serialized Data does not metch packing size of In_M2S!" severity failure; return Serialized(In_M2S.Data'length - 1 + Serialized'low downto Serialized'low); end function; - function get_KeepFromSerialized(Serialized : std_logic_vector; In_M2S : T_AXI4Stream_M2S) return std_logic_vector is + function get_KeepFromSerialized(Serialized : std_logic_vector; In_M2S : T_axi4stream_M2S) return std_logic_vector is begin - assert get_TotalDataBits(In_M2S) = Serialized'length report "AXI4Stream.pkg.get_LastFromSerialized:: Size of Serialized Data does not metch packing size of In_M2S!" severity failure; + assert get_TotalDataBits(In_M2S) = Serialized'length report "axi4stream.get_LastFromSerialized:: Size of Serialized Data does not metch packing size of In_M2S!" severity failure; return Serialized(In_M2S.Keep'length - 1 + In_M2S.Data'length + Serialized'low downto In_M2S.Data'length + Serialized'low); end function; - function get_UserFromSerialized(Serialized : std_logic_vector; In_M2S : T_AXI4Stream_M2S) return std_logic_vector is + function get_UserFromSerialized(Serialized : std_logic_vector; In_M2S : T_axi4stream_M2S) return std_logic_vector is begin - assert get_TotalDataBits(In_M2S) = Serialized'length report "AXI4Stream.pkg.get_LastFromSerialized:: Size of Serialized Data does not metch packing size of In_M2S!" severity failure; + assert get_TotalDataBits(In_M2S) = Serialized'length report "axi4stream.get_LastFromSerialized:: Size of Serialized Data does not metch packing size of In_M2S!" severity failure; return Serialized(In_M2S.User'length - 1 + 1 + In_M2S.Keep'length + In_M2S.Data'length + Serialized'low downto 1 + In_M2S.Keep'length + In_M2S.Data'length + Serialized'low); end function; - function get_DestFromSerialized(Serialized : std_logic_vector; In_M2S : T_AXI4Stream_M2S) return std_logic_vector is + function get_DestFromSerialized(Serialized : std_logic_vector; In_M2S : T_axi4stream_M2S) return std_logic_vector is begin - assert get_TotalDataBits(In_M2S) = Serialized'length report "AXI4Stream.pkg.get_LastFromSerialized:: Size of Serialized Data does not metch packing size of In_M2S!" severity failure; + assert get_TotalDataBits(In_M2S) = Serialized'length report "axi4stream.get_LastFromSerialized:: Size of Serialized Data does not metch packing size of In_M2S!" severity failure; return Serialized(In_M2S.Dest'length - 1 + In_M2S.User'length + 1 + In_M2S.Keep'length + In_M2S.Data'length + Serialized'low downto In_M2S.User'length + 1 + In_M2S.Keep'length + In_M2S.Data'length + Serialized'low); end function; - function get_IDFromSerialized(Serialized : std_logic_vector; In_M2S : T_AXI4Stream_M2S) return std_logic_vector is + function get_IDFromSerialized(Serialized : std_logic_vector; In_M2S : T_axi4stream_M2S) return std_logic_vector is begin - assert get_TotalDataBits(In_M2S) = Serialized'length report "AXI4Stream.pkg.get_LastFromSerialized:: Size of Serialized Data does not metch packing size of In_M2S!" severity failure; + assert get_TotalDataBits(In_M2S) = Serialized'length report "axi4stream.get_LastFromSerialized:: Size of Serialized Data does not metch packing size of In_M2S!" severity failure; return Serialized(In_M2S.ID'length - 1 + In_M2S.Dest'length + In_M2S.User'length + 1 + In_M2S.Keep'length + In_M2S.Data'length + Serialized'low downto In_M2S.Dest'length + In_M2S.User'length + 1 + In_M2S.Keep'length + In_M2S.Data'length + Serialized'low); end function; end package body; -use work.AXI4Stream.all; -package AXI4Stream_Sized is + +-- XXX: split into separate file? +use work.axi4stream.all; + +package axi4stream_Sized is generic ( DATA_BITS : positive; USER_BITS : positive := 1; diff --git a/src/bus/axi4/AXI4Stream/AXI4Stream_DeMux.vhdl b/src/bus/axi4stream/axi4stream_DeMux.vhdl similarity index 88% rename from src/bus/axi4/AXI4Stream/AXI4Stream_DeMux.vhdl rename to src/bus/axi4stream/axi4stream_DeMux.vhdl index c28f65225..676ed941b 100644 --- a/src/bus/axi4/AXI4Stream/AXI4Stream_DeMux.vhdl +++ b/src/bus/axi4stream/axi4stream_DeMux.vhdl @@ -2,11 +2,19 @@ -- Authors: Patrick Lehmann -- Stefan Unrein -- --- Entity: A generic AXI4-Stream multiplexer. +-- Entity: A generic AXI4-Stream de-multiplexer. -- -- Description: -- ------------------------------------- --- .. TODO:: No documentation available. +-- This module takes a input AXI4Stream and forwards it to one or more outputs +-- based on the 'DeMuxControl' input. 'DeMuxControl' is one-hot encoded. +-- If ADD_MIRROR_MODE is used, this module can forward a packet to multiple +-- destinations at the same time. Every set output by 'DeMuxControl' gets a copy +-- of the input packet. +-- OUTPUT_STAGES: Provides number of pipelining-stages on every output port. +-- Note: If ADD_MIRROR_MODE is used, a combinatorial loop could be created +-- depending on the data source and sink. In this case, a OUTPUT_STAGE can +-- resolve this. -- -- License: -- ============================================================================= @@ -35,7 +43,7 @@ use work.components.all; use work.axi4stream.all; -entity AXI4Stream_DeMux is +entity axi4stream_DeMux is generic ( ADD_MIRROR_MODE : boolean := false; OUTPUT_STAGES : natural := 0; @@ -56,7 +64,7 @@ entity AXI4Stream_DeMux is end entity; -architecture rtl of AXI4Stream_DeMux is +architecture rtl of axi4stream_DeMux is constant PORTS : positive := Out_M2S'length; type T_STATE is (ST_IDLE, ST_DATAFLOW, ST_DISCARD_FRAME); @@ -193,7 +201,7 @@ begin Out_M2S_d(i).ID <= In_M2S.ID; Out_M2S_d(i).Last <= In_M2S.Last; - OutStage : entity work.AXI4Stream_stage + OutStage : entity work.axi4stream_Stage generic map( STAGES => OUTPUT_STAGES ) diff --git a/src/bus/axi4/AXI4Stream/AXI4Stream_FIFO.vhdl b/src/bus/axi4stream/axi4stream_FIFO.vhdl similarity index 67% rename from src/bus/axi4/AXI4Stream/AXI4Stream_FIFO.vhdl rename to src/bus/axi4stream/axi4stream_FIFO.vhdl index 0d7095ba8..d979b9309 100644 --- a/src/bus/axi4/AXI4Stream/AXI4Stream_FIFO.vhdl +++ b/src/bus/axi4stream/axi4stream_FIFO.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= -- Authors: Stefan Unrein -- --- Entity: AXI4Stream_FIFO +-- Entity: axi4stream_FIFO -- -- Description: -- ------------------------------------- @@ -37,7 +37,7 @@ use work.axi4.all; use work.axi4stream.all; -entity AXI4Stream_FIFO is +entity axi4stream_FIFO is generic ( FRAMES : positive := 2; MAX_PACKET_DEPTH : positive := 8; @@ -48,21 +48,21 @@ entity AXI4Stream_FIFO is Clock : in std_logic; Reset : in std_logic; -- IN Port - In_M2S : in T_AXI4Stream_M2S; - In_S2M : out T_AXI4Stream_S2M; + In_m2s : in T_AXI4Stream_M2S; + In_s2m : out T_AXI4Stream_S2M; -- OUT Port - Out_M2S : out T_AXI4Stream_M2S; - Out_S2M : in T_AXI4Stream_S2M + Out_m2s : out T_AXI4Stream_M2S; + Out_s2m : in T_AXI4Stream_S2M ); end entity; -architecture rtl of AXI4Stream_FIFO is - constant USER_BITS : natural := In_M2S.User'length; - constant DATA_BITS : positive := In_M2S.Data'length; - constant KEEP_BITS : positive := In_M2S.Keep'length; - constant DEST_BITS : positive := In_M2S.Dest'length; - constant ID_BITS : positive := In_M2S.ID'length; +architecture rtl of axi4stream_FIFO is + constant USER_BITS : natural := In_m2s.User'length; + constant DATA_BITS : positive := In_m2s.Data'length; + constant KEEP_BITS : positive := In_m2s.Keep'length; + constant DEST_BITS : positive := In_m2s.Dest'length; + constant ID_BITS : positive := In_m2s.ID'length; constant INCLUDE_META : boolean := (METADATA_IS_DYNAMIC) and (USER_BITS > 0); @@ -79,7 +79,7 @@ architecture rtl of AXI4Stream_FIFO is constant Last_Pos : natural := 2; constant User_Pos : natural := 3; - constant Data_Bits_Vec : T_NATVEC := ( + constant Data_Bits_Vec : natural_vector := ( Keep_Pos => KEEP_BITS, Data_Pos => DATA_BITS, Last_Pos => 1, @@ -96,7 +96,7 @@ architecture rtl of AXI4Stream_FIFO is signal DataFIFO_DataOut : std_logic_vector(DataFIFO_DataIn'range); signal DataFIFO_Valid : std_logic; - signal Out_M2S_i : Out_M2S'subtype; + signal Out_M2S_i : Out_m2s'subtype; begin @@ -116,34 +116,34 @@ begin process(all) begin Writer_NextState <= Writer_State; - In_S2M.Ready <= '0'; + In_s2m.Ready <= '0'; DataFIFO_put <= '0'; MetaFIFO_put <= '0'; - DataFIFO_DataIn(high(Data_Bits_Vec, Data_Pos) downto low(Data_Bits_Vec, Data_Pos)) <= In_M2S.Data; - DataFIFO_DataIn(high(Data_Bits_Vec, Last_Pos)) <= In_M2S.Last; - DataFIFO_DataIn(high(Data_Bits_Vec, Keep_Pos) downto low(Data_Bits_Vec, Keep_Pos)) <= In_M2S.Keep; + DataFIFO_DataIn(high(Data_Bits_Vec, Data_Pos) downto low(Data_Bits_Vec, Data_Pos)) <= In_m2s.Data; + DataFIFO_DataIn(high(Data_Bits_Vec, Last_Pos)) <= In_m2s.Last; + DataFIFO_DataIn(high(Data_Bits_Vec, Keep_Pos) downto low(Data_Bits_Vec, Keep_Pos)) <= In_m2s.Keep; -- concatinate dynamic metadata with data if (METADATA_IS_DYNAMIC) and (USER_BITS > 0) then - DataFIFO_DataIn(high(Data_Bits_Vec, User_Pos) downto low(Data_Bits_Vec, User_Pos)) <= In_M2S.User; + DataFIFO_DataIn(high(Data_Bits_Vec, User_Pos) downto low(Data_Bits_Vec, User_Pos)) <= In_m2s.User; end if; case Writer_State is when ST_IDLE => - In_S2M.Ready <= not DataFIFO_Full and not MetaFIFO_Full; - DataFIFO_put <= In_M2S.Valid and not MetaFIFO_Full; - MetaFIFO_put <= In_M2S.Valid and not DataFIFO_Full; + In_s2m.Ready <= not DataFIFO_Full and not MetaFIFO_Full; + DataFIFO_put <= In_m2s.Valid and not MetaFIFO_Full; + MetaFIFO_put <= In_m2s.Valid and not DataFIFO_Full; - if ((In_M2S.Valid and not In_M2S.Last and not MetaFIFO_Full and not DataFIFO_Full) = '1') then + if ((In_m2s.Valid and not In_m2s.Last and not MetaFIFO_Full and not DataFIFO_Full) = '1') then Writer_NextState <= ST_FRAME; end if; when ST_FRAME => - In_S2M.Ready <= not DataFIFO_Full; - DataFIFO_put <= In_M2S.Valid; + In_s2m.Ready <= not DataFIFO_Full; + DataFIFO_put <= In_m2s.Valid; - if ((In_M2S.Valid and In_M2S.Last and not DataFIFO_Full) = '1') then + if ((In_m2s.Valid and In_m2s.Last and not DataFIFO_Full) = '1') then Writer_NextState <= ST_IDLE; end if; end case; @@ -170,17 +170,17 @@ begin case Reader_State is when ST_IDLE => Out_M2S_i.Valid <= DataFIFO_Valid; - DataFIFO_got <= Out_S2M.Ready; + DataFIFO_got <= Out_s2m.Ready; - if ((DataFIFO_Valid and not DataFIFO_DataOut(high(Data_Bits_Vec, Last_Pos)) and Out_S2M.Ready) = '1') then + if ((DataFIFO_Valid and not DataFIFO_DataOut(high(Data_Bits_Vec, Last_Pos)) and Out_s2m.Ready) = '1') then Reader_NextState <= ST_FRAME; end if; when ST_FRAME => Out_M2S_i.Valid <= DataFIFO_Valid; - DataFIFO_got <= Out_S2M.Ready; + DataFIFO_got <= Out_s2m.Ready; - if ((DataFIFO_Valid and DataFIFO_DataOut(high(Data_Bits_Vec, Last_Pos)) and Out_S2M.Ready) = '1') then + if ((DataFIFO_Valid and DataFIFO_DataOut(high(Data_Bits_Vec, Last_Pos)) and Out_s2m.Ready) = '1') then Reader_NextState <= ST_IDLE; end if; @@ -193,66 +193,66 @@ begin DataFifo : entity work.fifo_cc_got generic map ( - D_BITS => ite(METADATA_IS_DYNAMIC and (USER_BITS > 0), isum(Data_Bits_Vec), isum(Data_Bits_Vec(0 to Last_Pos))), -- Data Width + DATA_BITS => ite(METADATA_IS_DYNAMIC and (USER_BITS > 0), isum(Data_Bits_Vec), isum(Data_Bits_Vec(0 to Last_Pos))), -- Data Width MIN_DEPTH => (MAX_PACKET_DEPTH * FRAMES), -- Minimum FIFO Depth RAM_TYPE => RAM_TYPE, DATA_REG => ((MAX_PACKET_DEPTH * FRAMES) <= 128), -- Store Data Content in Registers STATE_REG => TRUE, -- Registered Full/Empty Indicators OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) port map ( -- Global Reset and Clock - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Writing Interface - put => DataFIFO_put, - din => DataFIFO_DataIn(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), - full => DataFIFO_Full, - estate_wr => open, + Put => DataFIFO_put, + DataIn => DataFIFO_DataIn(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), + Full => DataFIFO_Full, + EmptyState => open, -- Reading Interface - got => DataFIFO_got, - dout => DataFIFO_DataOut(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), - valid => DataFIFO_Valid, - fstate_rd => open + Got => DataFIFO_got, + DataOut => DataFIFO_DataOut(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), + Valid => DataFIFO_Valid, + FillState => open ); else generate - Stage : entity work.fifo_stage + Stage : entity work.fifo_Stage generic map( - D_BITS => ite(METADATA_IS_DYNAMIC and (USER_BITS > 0), isum(Data_Bits_Vec), isum(Data_Bits_Vec(0 to Last_Pos))), + DATA_BITS => ite(METADATA_IS_DYNAMIC and (USER_BITS > 0), isum(Data_Bits_Vec), isum(Data_Bits_Vec(0 to Last_Pos))), STAGES => FRAMES ) port map( -- Control - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Input - put => DataFIFO_put, - di => DataFIFO_DataIn(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), - ful => DataFIFO_Full, + Put => DataFIFO_put, + DataIn => DataFIFO_DataIn(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), + Full => DataFIFO_Full, -- Output - vld => DataFIFO_Valid, - do => DataFIFO_DataOut(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), - got => DataFIFO_got + Valid => DataFIFO_Valid, + DataOut => DataFIFO_DataOut(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), + Got => DataFIFO_got ); end generate; ------------------------------------------------------------------- - Out_M2S <= Out_M2S_i; + Out_m2s <= Out_M2S_i; genMeta : if ((not METADATA_IS_DYNAMIC) and (USER_BITS > 0)) or (DEST_BITS > 0) or (ID_BITS > 0) generate constant Dest_Pos : natural := 0; constant ID_Pos : natural := 1; constant User_Pos : natural := 2; - constant Data_Bits_Vec : T_NATVEC := ( + constant Data_Bits_Vec : natural_vector := ( Dest_Pos => DEST_BITS, ID_Pos => ID_BITS, User_Pos => USER_BITS @@ -260,42 +260,42 @@ begin signal Meta_In : std_logic_vector(ite(METADATA_IS_DYNAMIC, DEST_BITS + ID_BITS, DEST_BITS + ID_BITS + USER_BITS) -1 downto 0); signal Meta_Out : Meta_In'subtype; begin - Meta_In(high(Data_Bits_Vec, Dest_Pos) downto low(Data_Bits_Vec, Dest_Pos)) <= In_M2S.Dest; - Meta_In(high(Data_Bits_Vec, ID_Pos ) downto low(Data_Bits_Vec, ID_Pos )) <= In_M2S.ID; + Meta_In(high(Data_Bits_Vec, Dest_Pos) downto low(Data_Bits_Vec, Dest_Pos)) <= In_m2s.Dest; + Meta_In(high(Data_Bits_Vec, ID_Pos ) downto low(Data_Bits_Vec, ID_Pos )) <= In_m2s.ID; Out_M2S_i.Dest <= Meta_Out(high(Data_Bits_Vec, Dest_Pos) downto low(Data_Bits_Vec, Dest_Pos)); Out_M2S_i.ID <= Meta_Out(high(Data_Bits_Vec, ID_Pos ) downto low(Data_Bits_Vec, ID_Pos )); data_gen : if not METADATA_IS_DYNAMIC generate - Meta_In(high(Data_Bits_Vec, User_Pos) downto low(Data_Bits_Vec, User_Pos)) <= In_M2S.User; + Meta_In(high(Data_Bits_Vec, User_Pos) downto low(Data_Bits_Vec, User_Pos)) <= In_m2s.User; Out_M2S_i.User <= Meta_Out(high(Data_Bits_Vec, User_Pos) downto low(Data_Bits_Vec, User_Pos)); end generate; MetaFIFO : entity work.fifo_cc_got generic map ( - D_BITS => Meta_In'length, -- Data Width + DATA_BITS => Meta_In'length, -- Data Width MIN_DEPTH => imax(FRAMES, 16), -- Minimum FIFO Depth DATA_REG => ((Meta_In'length * imax(FRAMES, 16)) <= 128), -- Store Data Content in Registers STATE_REG => TRUE, -- Registered Full/Empty Indicators OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) port map ( -- Global Reset and Clock - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Writing Interface - put => MetaFIFO_put, - din => Meta_In, - full => MetaFIFO_Full, - estate_wr => open, + Put => MetaFIFO_put, + DataIn => Meta_In, + Full => MetaFIFO_Full, + EmptyState => open, -- Reading Interface - got => Out_M2S_i.Valid and Out_M2S_i.Last and Out_S2M.Ready, - dout => Meta_Out, - valid => open, - fstate_rd => open + Got => Out_M2S_i.Valid and Out_M2S_i.Last and Out_s2m.Ready, + DataOut => Meta_Out, + Valid => open, + FillState => open ); else generate diff --git a/src/bus/axi4/AXI4Stream/AXI4Stream_FIFO_cdc.vhdl b/src/bus/axi4stream/axi4stream_FIFO_CDC.vhdl similarity index 91% rename from src/bus/axi4/AXI4Stream/AXI4Stream_FIFO_cdc.vhdl rename to src/bus/axi4stream/axi4stream_FIFO_CDC.vhdl index 200d056fd..0803d2e15 100644 --- a/src/bus/axi4/AXI4Stream/AXI4Stream_FIFO_cdc.vhdl +++ b/src/bus/axi4stream/axi4stream_FIFO_CDC.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= -- Authors: Stefan Unrein -- --- Entity: AXI4Stream_FIFO_cdc +-- Entity: axi4stream_FIFO_CDC -- -- Description: -- ------------------------------------- @@ -33,10 +33,10 @@ use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; use work.components.all; -use work.axi4Stream.all; +use work.axi4stream.all; -entity AXI4Stream_FIFO_cdc is +entity axi4stream_FIFO_CDC is generic ( FRAMES : positive := 2; MAX_PACKET_DEPTH : positive := 8; @@ -58,7 +58,7 @@ entity AXI4Stream_FIFO_cdc is end entity; -architecture rtl of AXI4Stream_FIFO_cdc is +architecture rtl of axi4stream_FIFO_CDC is constant DATA_BITS : positive := In_M2S.Data'length; constant LAST_BITS : positive := 1; -- Last is always single bit constant KEEP_BITS : positive := In_M2S.Keep'length; @@ -71,7 +71,7 @@ architecture rtl of AXI4Stream_FIFO_cdc is constant KEEP_POS : natural := 2; constant USER_POS : natural := 3; - constant FIFO_BIT_VEC : T_POSVEC := ( + constant FIFO_BIT_VEC : positive_vector := ( DATA_POS => DATA_BITS, LAST_POS => LAST_BITS, KEEP_POS => KEEP_BITS, @@ -165,13 +165,13 @@ begin DataFIFO : entity work.fifo_ic_got generic map ( - D_BITS => ite(USER_IS_DYNAMIC, isum(FIFO_BIT_VEC), isum(FIFO_BIT_VEC) - USER_BITS), -- Data Width + DATA_BITS => ite(USER_IS_DYNAMIC, isum(FIFO_BIT_VEC), isum(FIFO_BIT_VEC) - USER_BITS), -- Data Width MIN_DEPTH => (MAX_PACKET_DEPTH * FRAMES), -- Minimum FIFO Depth DATA_REG => ((MAX_PACKET_DEPTH * FRAMES) <= 128), -- Store Data Content in Registers -- STATE_REG => TRUE, -- Registered Full/Empty Indicators OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) port map ( -- Writing Interface @@ -198,7 +198,7 @@ begin constant ID_Pos : natural := 1; constant User_Pos : natural := 2; - constant Data_Bits_Vec : T_NATVEC := ( + constant Data_Bits_Vec : natural_vector := ( Dest_Pos => DEST_BITS, ID_Pos => ID_BITS, User_Pos => USER_BITS @@ -219,13 +219,13 @@ begin NO_META_FIFO_gen : if not NO_META_FIFO generate MetaFIFO : entity work.fifo_ic_got generic map ( - D_BITS => Meta_In'length, -- Data Width + DATA_BITS => Meta_In'length, -- Data Width MIN_DEPTH => imax(FRAMES, 16), -- Minimum FIFO Depth DATA_REG => ((Meta_In'length * imax(FRAMES, 16)) <= 128), -- Store Data Content in Registers -- STATE_REG => TRUE, -- Registered Full/Empty Indicators OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) port map ( -- Writing Interface diff --git a/src/bus/axi4/AXI4Stream/AXI4Stream_FIFO_tempgot.vhdl b/src/bus/axi4stream/axi4stream_FIFO_TempGot.vhdl similarity index 62% rename from src/bus/axi4/AXI4Stream/AXI4Stream_FIFO_tempgot.vhdl rename to src/bus/axi4stream/axi4stream_FIFO_TempGot.vhdl index d01168e77..fc62688d5 100644 --- a/src/bus/axi4/AXI4Stream/AXI4Stream_FIFO_tempgot.vhdl +++ b/src/bus/axi4stream/axi4stream_FIFO_TempGot.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= -- Authors: Stefan Unrein -- --- Entity: AXI4Stream_FIFO_tempgot +-- Entity: axi4stream_FIFO_TempGot -- -- Description: -- ------------------------------------- @@ -40,33 +40,33 @@ use work.components.all; use work.axi4stream.all; -entity AXI4Stream_FIFO_tempgot is +entity axi4stream_FIFO_TempGot is generic ( - FRAMES : positive := 2; - MAX_PACKET_DEPTH : positive := 8; + FRAMES : positive := 2; + MAX_PACKET_DEPTH : positive := 8; METADATA_IS_DYNAMIC : boolean := true ); port ( Clock : in std_logic; Reset : in std_logic; -- IN Port - In_M2S : in T_AXI4Stream_M2S; - In_S2M : out T_AXI4Stream_S2M; + In_m2s : in T_AXI4Stream_M2S; + In_s2m : out T_AXI4Stream_S2M; -- OUT Port - Out_M2S : out T_AXI4Stream_M2S; - Out_S2M : in T_AXI4Stream_S2M; + Out_m2s : out T_AXI4Stream_M2S; + Out_s2m : in T_AXI4Stream_S2M; Out_Commit : in std_logic; Out_Rollback : in std_logic ); end entity; -architecture rtl of AXI4Stream_FIFO_tempgot is - constant USER_BITS : natural := In_M2S.User'length; - constant DATA_BITS : positive := In_M2S.Data'length; - constant KEEP_BITS : positive := In_M2S.Keep'length; - constant DEST_BITS : positive := In_M2S.Dest'length; - constant ID_BITS : positive := In_M2S.ID'length; +architecture rtl of axi4stream_FIFO_TempGot is + constant USER_BITS : natural := In_m2s.User'length; + constant DATA_BITS : positive := In_m2s.Data'length; + constant KEEP_BITS : positive := In_m2s.Keep'length; + constant DEST_BITS : positive := In_m2s.Dest'length; + constant ID_BITS : positive := In_m2s.ID'length; constant INCLUDE_META : boolean := (METADATA_IS_DYNAMIC) and (USER_BITS > 0); @@ -83,7 +83,7 @@ architecture rtl of AXI4Stream_FIFO_tempgot is constant Last_Pos : natural := 2; constant User_Pos : natural := 3; - constant Data_Bits_Vec : T_NATVEC := ( + constant Data_Bits_Vec : natural_vector := ( Keep_Pos => KEEP_BITS, Data_Pos => DATA_BITS, Last_Pos => 1, @@ -105,11 +105,11 @@ architecture rtl of AXI4Stream_FIFO_tempgot is signal In_SOF : std_logic; signal started : std_logic := '0'; - signal Out_M2S_i : In_M2S'subtype; + signal Out_M2S_i : In_m2s'subtype; begin - In_SOF <= In_M2S.Valid and not started; - started <= ffrs(q => started, rst => ((In_M2S.Valid and In_M2S.Last) or Reset), set => (In_M2S.Valid)) when rising_edge(Clock); + In_SOF <= In_m2s.Valid and not started; + started <= ffrs(q => started, rst => ((In_m2s.Valid and In_m2s.Last) or Reset), set => (In_m2s.Valid)) when rising_edge(Clock); process(Clock) begin @@ -128,35 +128,35 @@ begin begin Writer_NextState <= Writer_State; - In_S2M.Ready <= '0'; + In_s2m.Ready <= '0'; DataFIFO_put <= '0'; MetaFIFO_put <= '0'; - DataFIFO_DataIn(high(Data_Bits_Vec, Data_Pos) downto low(Data_Bits_Vec, Data_Pos))<= In_M2S.Data; - DataFIFO_DataIn(high(Data_Bits_Vec, Keep_Pos) downto low(Data_Bits_Vec, Keep_Pos))<= In_M2S.Keep; - DataFIFO_DataIn(high(Data_Bits_Vec, Last_Pos)) <= In_M2S.Last; + DataFIFO_DataIn(high(Data_Bits_Vec, Data_Pos) downto low(Data_Bits_Vec, Data_Pos))<= In_m2s.Data; + DataFIFO_DataIn(high(Data_Bits_Vec, Keep_Pos) downto low(Data_Bits_Vec, Keep_Pos))<= In_m2s.Keep; + DataFIFO_DataIn(high(Data_Bits_Vec, Last_Pos)) <= In_m2s.Last; -- concatinate dynamic metadata with data if (METADATA_IS_DYNAMIC) and (USER_BITS > 0) then - DataFIFO_DataIn(high(Data_Bits_Vec, User_Pos) downto low(Data_Bits_Vec, User_Pos)) <= In_M2S.User; + DataFIFO_DataIn(high(Data_Bits_Vec, User_Pos) downto low(Data_Bits_Vec, User_Pos)) <= In_m2s.User; end if; case Writer_State is when ST_IDLE => - In_S2M.Ready <= not DataFIFO_Full and not MetaFIFO_Full; - DataFIFO_put <= In_M2S.Valid and not MetaFIFO_Full; - MetaFIFO_put <= In_M2S.Valid and not DataFIFO_Full; + In_s2m.Ready <= not DataFIFO_Full and not MetaFIFO_Full; + DataFIFO_put <= In_m2s.Valid and not MetaFIFO_Full; + MetaFIFO_put <= In_m2s.Valid and not DataFIFO_Full; - if ((In_M2S.Valid and not In_M2S.Last and not MetaFIFO_Full and not DataFIFO_Full) = '1') then + if ((In_m2s.Valid and not In_m2s.Last and not MetaFIFO_Full and not DataFIFO_Full) = '1') then Writer_NextState <= ST_FRAME; end if; when ST_FRAME => - In_S2M.Ready <= not DataFIFO_Full; - DataFIFO_put <= In_M2S.Valid; + In_s2m.Ready <= not DataFIFO_Full; + DataFIFO_put <= In_m2s.Valid; - if ((In_M2S.Valid and In_M2S.Last and not DataFIFO_Full) = '1') then + if ((In_m2s.Valid and In_m2s.Last and not DataFIFO_Full) = '1') then Writer_NextState <= ST_IDLE; end if; end case; @@ -183,17 +183,17 @@ begin case Reader_State is when ST_IDLE => Out_M2S_i.Valid <= DataFIFO_Valid; - DataFIFO_got <= Out_S2M.Ready; + DataFIFO_got <= Out_s2m.Ready; - if ((DataFIFO_Valid and not DataFIFO_DataOut(high(Data_Bits_Vec, Last_Pos)) and Out_S2M.Ready) = '1') then + if ((DataFIFO_Valid and not DataFIFO_DataOut(high(Data_Bits_Vec, Last_Pos)) and Out_s2m.Ready) = '1') then Reader_NextState <= ST_FRAME; end if; when ST_FRAME => Out_M2S_i.Valid <= DataFIFO_Valid; - DataFIFO_got <= Out_S2M.Ready; + DataFIFO_got <= Out_s2m.Ready; - if ((DataFIFO_Valid and DataFIFO_DataOut(high(Data_Bits_Vec, Last_Pos)) and Out_S2M.Ready) = '1') then + if ((DataFIFO_Valid and DataFIFO_DataOut(high(Data_Bits_Vec, Last_Pos)) and Out_s2m.Ready) = '1') then Reader_NextState <= ST_IDLE; end if; @@ -202,43 +202,43 @@ begin DataFifo : entity work.fifo_cc_got_tempgot generic map ( - D_BITS => ite(METADATA_IS_DYNAMIC and (USER_BITS > 0), isum(Data_Bits_Vec), isum(Data_Bits_Vec(0 to Last_Pos))), -- Data Width - MIN_DEPTH => (MAX_PACKET_DEPTH * FRAMES), -- Minimum FIFO Depth - DATA_REG => ((MAX_PACKET_DEPTH * FRAMES) <= 128), -- Store Data Content in Registers - STATE_REG => TRUE, -- Registered Full/Empty Indicators - OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + DATA_BITS => ite(METADATA_IS_DYNAMIC and (USER_BITS > 0), isum(Data_Bits_Vec), isum(Data_Bits_Vec(0 to Last_Pos))), -- Data Width + MIN_DEPTH => (MAX_PACKET_DEPTH * FRAMES), -- Minimum FIFO Depth + DATA_REG => ((MAX_PACKET_DEPTH * FRAMES) <= 128), -- Store Data Content in Registers + STATE_REG => TRUE, -- Registered Full/Empty Indicators + OUTPUT_REG => FALSE, -- Registered FIFO Output + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) port map ( -- Global Reset and Clock - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Writing Interface - put => DataFIFO_put, - din => DataFIFO_DataIn(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), - full => DataFIFO_Full, - estate_wr => open, + Put => DataFIFO_put, + DataIn => DataFIFO_DataIn(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), + Full => DataFIFO_Full, + EmptyState => open, -- Reading Interface - got => DataFIFO_got, - dout => DataFIFO_DataOut(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), - valid => DataFIFO_Valid, - fstate_rd => open, + Got => DataFIFO_got, + DataOut => DataFIFO_DataOut(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), + Valid => DataFIFO_Valid, + FillState => open, - commit => Out_Commit, - rollback => Out_Rollback + Commit => Out_Commit, + Rollback => Out_Rollback ); - Out_M2S <= Out_M2S_i; + Out_m2s <= Out_M2S_i; genMeta : if ((not METADATA_IS_DYNAMIC) and (USER_BITS > 0)) or (DEST_BITS > 0) or (ID_BITS > 0) generate constant Dest_Pos : natural := 0; constant ID_Pos : natural := 1; constant User_Pos : natural := 2; - constant Data_Bits_Vec : T_NATVEC := ( + constant Data_Bits_Vec : natural_vector := ( Dest_Pos => DEST_BITS, ID_Pos => ID_BITS, User_Pos => USER_BITS @@ -246,45 +246,45 @@ begin signal Meta_In : std_logic_vector(ite(METADATA_IS_DYNAMIC, DEST_BITS + ID_BITS, DEST_BITS + ID_BITS + USER_BITS) -1 downto 0); signal Meta_Out : Meta_In'subtype; begin - Meta_In(high(Data_Bits_Vec, Dest_Pos) downto low(Data_Bits_Vec, Dest_Pos)) <= In_M2S.Dest; - Meta_In(high(Data_Bits_Vec, ID_Pos ) downto low(Data_Bits_Vec, ID_Pos )) <= In_M2S.ID; + Meta_In(high(Data_Bits_Vec, Dest_Pos) downto low(Data_Bits_Vec, Dest_Pos)) <= In_m2s.Dest; + Meta_In(high(Data_Bits_Vec, ID_Pos ) downto low(Data_Bits_Vec, ID_Pos )) <= In_m2s.ID; Out_M2S_i.Dest <= Meta_Out(high(Data_Bits_Vec, Dest_Pos) downto low(Data_Bits_Vec, Dest_Pos)); Out_M2S_i.ID <= Meta_Out(high(Data_Bits_Vec, ID_Pos ) downto low(Data_Bits_Vec, ID_Pos )); data_gen : if not METADATA_IS_DYNAMIC generate - Meta_In(high(Data_Bits_Vec, User_Pos) downto low(Data_Bits_Vec, User_Pos)) <= In_M2S.User; + Meta_In(high(Data_Bits_Vec, User_Pos) downto low(Data_Bits_Vec, User_Pos)) <= In_m2s.User; Out_M2S_i.User <= Meta_Out(high(Data_Bits_Vec, User_Pos) downto low(Data_Bits_Vec, User_Pos)); end generate; MetaFIFO : entity work.fifo_cc_got_tempgot generic map ( - D_BITS => Meta_In'length, -- Data Width - MIN_DEPTH => imax(FRAMES, 16), -- Minimum FIFO Depth - DATA_REG => ((Meta_In'length * imax(FRAMES, 16)) <= 128), -- Store Data Content in Registers - STATE_REG => TRUE, -- Registered Full/Empty Indicators - OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + DATA_BITS => Meta_In'length, -- Data Width + MIN_DEPTH => imax(FRAMES, 16), -- Minimum FIFO Depth + DATA_REG => ((Meta_In'length * imax(FRAMES, 16)) <= 128), -- Store Data Content in Registers + STATE_REG => TRUE, -- Registered Full/Empty Indicators + OUTPUT_REG => FALSE, -- Registered FIFO Output + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) port map ( -- Global Reset and Clock - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Writing Interface - put => MetaFIFO_put, - din => Meta_In, - full => MetaFIFO_Full, - estate_wr => open, + Put => MetaFIFO_put, + DataIn => Meta_In, + Full => MetaFIFO_Full, + EmptyState => open, -- Reading Interface - got => Out_M2S_i.Valid and Out_M2S_i.Last and Out_S2M.Ready, - dout => Meta_Out, - valid => open, - fstate_rd => open, + Got => Out_M2S_i.Valid and Out_M2S_i.Last and Out_s2m.Ready, + DataOut => Meta_Out, + Valid => open, + FillState => open, - commit => Out_Commit, - rollback => Out_Rollback + Commit => Out_Commit, + Rollback => Out_Rollback ); end generate; diff --git a/src/bus/axi4/AXI4Stream/AXI4Stream_FIFO_tempput.vhdl b/src/bus/axi4stream/axi4stream_FIFO_TempPut.vhdl similarity index 80% rename from src/bus/axi4/AXI4Stream/AXI4Stream_FIFO_tempput.vhdl rename to src/bus/axi4stream/axi4stream_FIFO_TempPut.vhdl index 5f5d23e0d..0be119977 100644 --- a/src/bus/axi4/AXI4Stream/AXI4Stream_FIFO_tempput.vhdl +++ b/src/bus/axi4stream/axi4stream_FIFO_TempPut.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= -- Authors: Stefan Unrein -- --- Entity: AXI4Stream_FIFO_tempput +-- Entity: axi4stream_FIFO_TempPut -- -- Description: -- ------------------------------------- @@ -51,15 +51,15 @@ use work.axi4stream.all; use work.mem.all; -entity AXI4Stream_FIFO_tempput is +entity axi4stream_FIFO_TempPut is generic ( RAM_TYPE : T_RAM_TYPE := RAM_TYPE_OPTIMIZED;--RAM_TYPE_AUTO; FRAMES : positive := 2; MAX_PACKET_DEPTH : positive := 8; USER_IS_DYNAMIC : boolean := true; NO_META_FIFO : boolean := false; - ESTATE_WR_BITS : natural := 0; -- Empty State Bits - FSTATE_RD_BITS : natural := 0 -- Full State Bits + EMPTY_STATE_BITS : natural := 0; -- Empty State Bits + FILL_STATE_BITS : natural := 0 -- Full State Bits ); port ( Clock : in std_logic; @@ -69,16 +69,16 @@ entity AXI4Stream_FIFO_tempput is In_S2M : out T_AXI4Stream_S2M; In_Commit : in std_logic; In_Rollback : in std_logic; - EState_WR : out std_logic_vector(imax(0, ESTATE_WR_BITS-1) downto 0); + EmptyState : out std_logic_vector(imax(0, EMPTY_STATE_BITS-1) downto 0); -- OUT Port Out_M2S : out T_AXI4Stream_M2S; Out_S2M : in T_AXI4Stream_S2M; - FState_RD : out std_logic_vector(imax(0, FSTATE_RD_BITS-1) downto 0) + FillState : out std_logic_vector(imax(0, FILL_STATE_BITS-1) downto 0) ); end entity; -architecture rtl of AXI4Stream_FIFO_tempput is +architecture rtl of axi4stream_FIFO_TempPut is constant USER_BITS : natural := In_M2S.User'length; constant DATA_BITS : positive := In_M2S.Data'length; constant KEEP_BITS : positive := In_M2S.Keep'length; @@ -100,7 +100,7 @@ architecture rtl of AXI4Stream_FIFO_tempput is constant Last_Pos : natural := 2; constant User_Pos : natural := 3; - constant Data_Bits_Vec : T_NATVEC := ( + constant Data_Bits_Vec : natural_vector := ( Keep_Pos => KEEP_BITS, Data_Pos => DATA_BITS, Last_Pos => 1, @@ -124,7 +124,7 @@ architecture rtl of AXI4Stream_FIFO_tempput is signal Out_M2S_i : T_AXI4Stream_M2S(Data(DATA_BITS -1 downto 0), Keep(DATA_BITS /8 -1 downto 0), User(USER_BITS -1 downto 0), ID(ID_BITS-1 downto 0), DEST(DEST_BITS-1 downto 0)); begin - assert not NO_META_FIFO report "PoC.AXI4Stream_FIFO_tempput:: NO_META_FIFO is set. Meta Fifo is removed! Dest, ID and, depending on USER_IS_DYNAMIC, User is removed" severity warning; + assert not NO_META_FIFO report "PoC.axi4stream_FIFO_TempPut:: NO_META_FIFO is set. Meta Fifo is removed! Dest, ID and, depending on USER_IS_DYNAMIC, User is removed" severity warning; In_SOF <= In_M2S.Valid and not started; started <= ffrs(q => started, rst => ((In_M2S.Valid and In_M2S.Last) or Reset), set => (In_M2S.Valid)) when rising_edge(Clock); @@ -219,33 +219,33 @@ begin DataFifo : entity work.fifo_cc_got_tempput generic map ( RAM_TYPE => RAM_TYPE, - D_BITS => ite(USER_IS_DYNAMIC and (USER_BITS > 0), isum(Data_Bits_Vec), isum(Data_Bits_Vec(0 to Last_Pos))), -- Data Width - MIN_DEPTH => (MAX_PACKET_DEPTH * FRAMES), -- Minimum FIFO Depth - DATA_REG => ((MAX_PACKET_DEPTH * FRAMES) <= 128), -- Store Data Content in Registers - STATE_REG => TRUE, -- Registered Full/Empty Indicators - OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => ESTATE_WR_BITS, -- Empty State Bits - FSTATE_RD_BITS => FSTATE_RD_BITS -- Full State Bits + DATA_BITS => ite(USER_IS_DYNAMIC and (USER_BITS > 0), isum(Data_Bits_Vec), isum(Data_Bits_Vec(0 to Last_Pos))), -- Data Width + MIN_DEPTH => (MAX_PACKET_DEPTH * FRAMES), -- Minimum FIFO Depth + DATA_REG => ((MAX_PACKET_DEPTH * FRAMES) <= 128), -- Store Data Content in Registers + STATE_REG => TRUE, -- Registered Full/Empty Indicators + OUTPUT_REG => FALSE, -- Registered FIFO Output + EMPTY_STATE_BITS => EMPTY_STATE_BITS, -- Empty State Bits + FILL_STATE_BITS => FILL_STATE_BITS -- Full State Bits ) port map ( -- Global Reset and Clock - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Writing Interface - put => DataFIFO_put, - din => DataFIFO_DataIn(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), - full => DataFIFO_Full, - estate_wr => estate_wr, + Put => DataFIFO_put, + DataIn => DataFIFO_DataIn(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), + Full => DataFIFO_Full, + EmptyState => EmptyState, - commit => In_Commit, - rollback => In_Rollback, + Commit => In_Commit, + Rollback => In_Rollback, -- Reading Interface - got => DataFIFO_got, - dout => DataFIFO_DataOut(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), - valid => DataFIFO_Valid, - fstate_rd => fstate_rd + Got => DataFIFO_got, + DataOut => DataFIFO_DataOut(high(Data_Bits_Vec, ite(INCLUDE_META, User_Pos, Last_Pos)) downto low(Data_Bits_Vec, 0)), + Valid => DataFIFO_Valid, + FillState => FillState ); Out_M2S <= Out_M2S_i; @@ -255,7 +255,7 @@ begin constant ID_Pos : natural := 1; constant User_Pos : natural := 2; - constant Data_Bits_Vec : T_NATVEC := ( + constant Data_Bits_Vec : natural_vector := ( Dest_Pos => DEST_BITS, ID_Pos => ID_BITS, User_Pos => USER_BITS @@ -276,33 +276,33 @@ begin NO_META_FIFO_gen : if not NO_META_FIFO generate MetaFIFO : entity work.fifo_cc_got_tempput generic map ( - D_BITS => Meta_In'length, -- Data Width + DATA_BITS => Meta_In'length, -- Data Width MIN_DEPTH => imax(FRAMES, 16), -- Minimum FIFO Depth DATA_REG => ((Meta_In'length * imax(FRAMES, 16)) <= 128), -- Store Data Content in Registers STATE_REG => TRUE, -- Registered Full/Empty Indicators OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) port map ( -- Global Reset and Clock - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Writing Interface - put => MetaFIFO_put, - din => Meta_In, - full => MetaFIFO_Full, - estate_wr => open, + Put => MetaFIFO_put, + DataIn => Meta_In, + Full => MetaFIFO_Full, + EmptyState => open, - commit => In_Commit, - rollback => In_Rollback, + Commit => In_Commit, + Rollback => In_Rollback, -- Reading Interface - got => Out_M2S_i.Valid and Out_M2S_i.Last and Out_S2M.Ready, - dout => Meta_Out, - valid => open, - fstate_rd => open + Got => Out_M2S_i.Valid and Out_M2S_i.Last and Out_S2M.Ready, + DataOut => Meta_Out, + Valid => open, + FillState => open ); else generate MetaFIFO_Full <= '0'; diff --git a/src/bus/axi4/AXI4Stream/AXI4Stream_Mux.vhdl b/src/bus/axi4stream/axi4stream_Mux.vhdl similarity index 96% rename from src/bus/axi4/AXI4Stream/AXI4Stream_Mux.vhdl rename to src/bus/axi4stream/axi4stream_Mux.vhdl index 727a18f2e..b348e1bf5 100644 --- a/src/bus/axi4/AXI4Stream/AXI4Stream_Mux.vhdl +++ b/src/bus/axi4stream/axi4stream_Mux.vhdl @@ -7,7 +7,7 @@ -- -- Description: -- ------------------------------------- --- The IP core module provides a multiplexing function between generic +-- The module provides a multiplexing function between generic -- AXI4 stream channel to one AXI4 stream channel. -- Features -- * Round Robin bus arbitration if the mux control is not enabled. @@ -40,10 +40,10 @@ use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; -use work.AXI4Stream.all; +use work.axi4stream.all; -entity AXI4Stream_Mux is +entity axi4stream_Mux is generic ( USE_CONTROL_VECTOR : boolean := false; APPEND_DEST_BITS : boolean := false; @@ -64,7 +64,7 @@ entity AXI4Stream_Mux is end entity; -architecture rtl of AXI4Stream_Mux is +architecture rtl of axi4stream_Mux is subtype T_CHANNEL_INDEX is natural range 0 to PORTS - 1; @@ -108,6 +108,7 @@ begin genMapping : for i in 0 to PORTS -1 generate RequestVector(i) <= In_M2S(i).Valid and (MuxControl(i) or not to_sl(USE_CONTROL_VECTOR)); In_S2M(i).Ready <= (Out_S2M.Ready and FSM_Dataflow_en) and ChannelPointer(i); + In_S2M(i).User <= Out_S2M.User; end generate; process(Clock) diff --git a/src/bus/axi4stream/axi4stream_Pause.vhdl b/src/bus/axi4stream/axi4stream_Pause.vhdl new file mode 100644 index 000000000..d885bace5 --- /dev/null +++ b/src/bus/axi4stream/axi4stream_Pause.vhdl @@ -0,0 +1,135 @@ +-- ============================================================================= +-- Authors: Patrick Lehmann +-- Stefan Unrein +-- Max Kraft-Kugler +-- +-- Entity: A generic AXI4-Stream module to pause a stream. +-- +-- Description: +-- ------------------------------------- +-- Applying a '1' to Pause input stops the stream. By enabling PACKET_MODE the +-- stream is only paused outside of a packet. If Pause is released for one +-- clock-cycle, the next whole packet is flowing through. +-- Flags 'In_Packet', 'Data_Available' and 'Data_Blocked' are only used in +-- PACKET_MODE. +-- +-- License: +-- ============================================================================= +-- Copyright 2024-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.utils.all; +use work.vectors.all; +use work.axi4stream.all; + + +entity axi4stream_Pause is + generic ( + PACKET_MODE : boolean := false + ); + port ( + Clock : in std_logic := '0'; + Reset : in std_logic := '0'; + -- Control Signal + Pause : in std_logic; + In_Packet : out std_logic; + Data_Available : out std_logic; + Data_Blocked : out std_logic; + -- IN AXIS Port + In_M2S : in T_AXI4STREAM_M2S; + In_S2M : out T_AXI4STREAM_S2M; + -- OUT AXIS Port + Out_M2S : out T_AXI4STREAM_M2S; + Out_S2M : in T_AXI4STREAM_S2M + ); +end entity; + + +architecture rtl of axi4stream_Pause is + + signal Pause_internal : std_logic; + +begin + + gen_SM : if PACKET_MODE generate + + signal is_transaction : boolean; -- FIXME: no boolean usage in synthesis + signal is_packet_end : boolean; + + type T_PACKET_STATE is (ST_IDLE, ST_IN_PACKET); + signal pause_state : T_PACKET_STATE; + signal pause_state_next : T_PACKET_STATE; + begin + + is_transaction <= (In_M2S.Valid and In_S2M.Ready) = '1'; + is_packet_end <= In_M2S.Last = '1'; + + process(all) + begin + pause_state_next <= pause_state; + Pause_internal <= '0'; + In_Packet <= '0'; + case pause_state is + when ST_IDLE => + Pause_internal <= Pause; + if (is_transaction and not is_packet_end) then + In_Packet <= '1'; + pause_state_next <= ST_IN_PACKET; + end if; + + when ST_IN_PACKET => + In_Packet <= '1'; + if (is_transaction and is_packet_end) then + In_Packet <= '0'; + pause_state_next <= ST_IDLE; + end if; + end case; + end process; + + process(Clock) + begin + if rising_edge(Clock) then + if(Reset = '1') then + pause_state <= ST_IDLE; + else + pause_state <= pause_state_next; + end if; + end if; + end process; + + else generate + + Pause_internal <= Pause; + + end generate; + + Data_Available <= In_M2S.Valid; + Data_Blocked <= Pause_internal; + + Out_M2S.Valid <= In_M2S.Valid and not Pause_internal; + Out_M2S.Data <= In_M2S.Data; + Out_M2S.Keep <= In_M2S.Keep; + Out_M2S.Last <= In_M2S.Last; + Out_M2S.User <= In_M2S.User; + Out_M2S.Dest <= In_M2S.Dest; + Out_M2S.ID <= In_M2S.ID; + + In_S2M.Ready <= Out_S2M.Ready and not Pause_internal; + +end architecture; diff --git a/src/bus/axi4/AXI4Stream/AXI4Stream_Stage.vhdl b/src/bus/axi4stream/axi4stream_Stage.vhdl similarity index 85% rename from src/bus/axi4/AXI4Stream/AXI4Stream_Stage.vhdl rename to src/bus/axi4stream/axi4stream_Stage.vhdl index 2443752ab..e6b914d14 100644 --- a/src/bus/axi4/AXI4Stream/AXI4Stream_Stage.vhdl +++ b/src/bus/axi4stream/axi4stream_Stage.vhdl @@ -32,7 +32,7 @@ use work.vectors.all; use work.axi4stream.all; -entity AXI4Stream_Stage is +entity axi4stream_Stage is generic ( STAGES : natural := 2 ); @@ -49,14 +49,14 @@ entity AXI4Stream_Stage is end entity; -architecture rtl of AXI4Stream_Stage is +architecture rtl of axi4stream_Stage is constant Data_Pos : natural := 0; constant Keep_Pos : natural := 1; constant Last_Pos : natural := 2; constant User_Pos : natural := 3; constant Dest_Pos : natural := 4; constant ID_Pos : natural := 5; - constant Data_Bits_Vec : T_NATVEC := ( + constant Data_Bits_Vec : natural_vector := ( Keep_Pos => In_M2S.Keep'length, Data_Pos => In_M2S.Data'length, Last_Pos => 1, @@ -74,7 +74,7 @@ begin FIFO_data_in(high(Data_Bits_Vec, Data_Pos) downto low(Data_Bits_Vec, Data_Pos)) <= In_M2S.Data; FIFO_data_in(high(Data_Bits_Vec, Keep_Pos) downto low(Data_Bits_Vec, Keep_Pos)) <= In_M2S.Keep; - FIFO_data_in(high(Data_Bits_Vec, Last_Pos)) <= In_M2S.Last; + FIFO_data_in(high(Data_Bits_Vec, Last_Pos)) <= In_M2S.Last; FIFO_data_in(high(Data_Bits_Vec, User_Pos) downto low(Data_Bits_Vec, User_Pos)) <= In_M2S.User; FIFO_data_in(high(Data_Bits_Vec, Dest_Pos) downto low(Data_Bits_Vec, Dest_Pos)) <= In_M2S.Dest; FIFO_data_in(high(Data_Bits_Vec, ID_Pos ) downto low(Data_Bits_Vec, ID_Pos )) <= In_M2S.ID; @@ -82,30 +82,30 @@ begin FIFO_put <= In_M2S.Valid; In_S2M.Ready <= not FIFO_full; - FIFO : entity work.fifo_stage + FIFO : entity work.fifo_Stage generic map ( - D_BITS => isum(Data_Bits_Vec), + DATA_BITS => isum(Data_Bits_Vec), STAGES => STAGES ) port map ( -- Global Reset and Clock - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Writing Interface - put => FIFO_put, - di => FIFO_data_in, - ful => FIFO_full, + Put => FIFO_put, + DataIn => FIFO_data_in, + Full => FIFO_full, -- Reading Interface - vld => Out_M2S.Valid, - do => FIFO_data_out, - got => Out_S2M.Ready + Valid => Out_M2S.Valid, + DataOut => FIFO_data_out, + Got => Out_S2M.Ready ); Out_M2S.Data <= FIFO_data_out(high(Data_Bits_Vec, Data_Pos) downto low(Data_Bits_Vec, Data_Pos)); Out_M2S.Keep <= FIFO_data_out(high(Data_Bits_Vec, Keep_Pos) downto low(Data_Bits_Vec, Keep_Pos)); - Out_M2S.Last <= FIFO_data_out(high(Data_Bits_Vec, Last_Pos)) ; + Out_M2S.Last <= FIFO_data_out(high(Data_Bits_Vec, Last_Pos)) ; Out_M2S.User <= FIFO_data_out(high(Data_Bits_Vec, User_Pos) downto low(Data_Bits_Vec, User_Pos)); Out_M2S.Dest <= FIFO_data_out(high(Data_Bits_Vec, Dest_Pos) downto low(Data_Bits_Vec, Dest_Pos)); Out_M2S.ID <= FIFO_data_out(high(Data_Bits_Vec, ID_Pos ) downto low(Data_Bits_Vec, ID_Pos )); diff --git a/src/bus/axi4stream/axi4stream_Termination_Receiver.vhdl b/src/bus/axi4stream/axi4stream_Termination_Receiver.vhdl new file mode 100644 index 000000000..cd68687bd --- /dev/null +++ b/src/bus/axi4stream/axi4stream_Termination_Receiver.vhdl @@ -0,0 +1,55 @@ +-- ============================================================================= +-- Authors: Stefan Unrein +-- Patrick Lehmann +-- +-- Entity: A slave-side bus termination module for AXI4-Stream. +-- +-- Description: +-- ------------------------------------- +-- This entity is a bus termination module for AXI4-Stream that represents a +-- dummy slave. +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; + +use work.utils.all; +use work.axi4stream.all; + + +entity axi4stream_Termination_Receiver is + generic ( + VALUE : std_logic := '0' + ); + port ( + -- IN Port + In_M2S : in T_AXI4Stream_M2S; + In_S2M : out T_AXI4Stream_S2M + ); +end entity; + + +architecture rtl of axi4stream_Termination_Receiver is + constant DataBits : natural := In_M2S.Data'length; + constant UserBits : natural := In_M2S.User'length; +begin + + In_S2M <= Initialize_AXI4Stream_S2M(UserBits, VALUE); + +end architecture; diff --git a/src/bus/axi4stream/axi4stream_Termination_Transmitter.vhdl b/src/bus/axi4stream/axi4stream_Termination_Transmitter.vhdl new file mode 100644 index 000000000..8b3e1b355 --- /dev/null +++ b/src/bus/axi4stream/axi4stream_Termination_Transmitter.vhdl @@ -0,0 +1,58 @@ +-- ============================================================================= +-- Authors: Stefan Unrein +-- Patrick Lehmann +-- +-- Entity: A master-side bus termination module for AXI4-Stream. +-- +-- Description: +-- ------------------------------------- +-- This entity is a bus termination module for AXI4-Stream that represents a +-- dummy master. +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.utils.all; +use work.axi4stream.all; + + +entity axi4stream_Termination_Transmitter is + generic ( + VALUE : std_logic := '0' + ); + port ( + -- OUT Port + Out_M2S : out T_AXI4Stream_M2S; + Out_S2M : in T_AXI4Stream_S2M + ); +end entity; + + +architecture rtl of axi4stream_Termination_Transmitter is + constant DataBits : natural := Out_M2S.Data'length; + constant UserBits : natural := Out_M2S.User'length; + constant DestBits : natural := Out_M2S.Dest'length; + constant IDBits : natural := Out_M2S.ID'length; +begin + + Out_M2S <= Initialize_AXI4Stream_M2S(DataBits, UserBits, DestBits, IDBits, VALUE); + +end architecture; diff --git a/src/bus/axi4stream/build.pro b/src/bus/axi4stream/build.pro new file mode 100644 index 000000000..4f0943ed4 --- /dev/null +++ b/src/bus/axi4stream/build.pro @@ -0,0 +1,48 @@ +# ============================================================================= +# Authors: +# Stefan Unrein +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +#analyze ./axi4stream.pkg.vhdl; # analyzed in PoC.pro + +analyze ./axi4stream_FIFO.vhdl +analyze ./axi4stream_FIFO_CDC.vhdl +analyze ./axi4stream_FIFO_TempGot.vhdl +analyze ./axi4stream_FIFO_TempPut.vhdl +analyze ./axi4stream_Stage.vhdl +disabled ./axi4stream_Mirror.vhdl +analyze ./axi4stream_Mux.vhdl +analyze ./axi4stream_Pause.vhdl +analyze ./axi4stream_DeMux.vhdl +analyze ./axi4stream_Termination_Transmitter.vhdl +analyze ./axi4stream_Termination_Receiver.vhdl +disabled ./axi4stream_DataExtractor.vhdl +disabled ./axi4stream_PatternFinder.vhdl +disabled ./axi4stream_FieldReplacer.vhd +disabled ./axi4stream_Crossbar.vhdl +# disabled ./axi4stream_Frame_Buffer.vhdl # Does not work right now +disabled ./axi4stream_PRBSGenerator.vhdl +disabled ./axi4stream_Buffer_no_backpressure.vhdl +disabled ./axi4stream_To_Stream.vhdl +disabled ./axi4stream_Splitter.vhdl +disabled ./axi4stream_Delay.vhdl +disabled ./axi4stream_Realign.vhdl +analyze ../../misc/gearbox/gearbox_Down_cc.vhdl +analyze ../../misc/gearbox/gearbox_Up_cc.vhdl +disabled ./axi4stream_Gearbox.vhdl diff --git a/src/bus/bus.pro b/src/bus/build.pro similarity index 81% rename from src/bus/bus.pro rename to src/bus/build.pro index dee247607..99750dbb6 100644 --- a/src/bus/bus.pro +++ b/src/bus/build.pro @@ -27,11 +27,11 @@ analyze ./stream/stream_Mux.vhdl disabled ./stream/stream_To_AXI4Stream.vhdl disabled ./stream/stream_Delay.vhdl -include ./axi4/axi4.pro -include ./stream/stream.pro +include ./axi4stream +include ./axi4 +include ./axi4lite +include ./stream -duplicate ./axi4/AXI4Stream/AXI4Stream_To_Stream.vhdl - -# analyze ./drp/drp.generic.vhdl # Currently not working analyze ./drp/drp.pkg.vhdl -# analyze ./drp/DRP_To_AXI4Lite_Bridge.vhdl # Currently not working +analyze ./drp/drp.generic.vhdl +analyze ./drp/drp_AXI4Lite_Bridge.vhdl diff --git a/src/bus/bus_Arbiter.vhdl b/src/bus/bus_Arbiter.vhdl index 9bfcf6716..b4b05ca63 100644 --- a/src/bus/bus_Arbiter.vhdl +++ b/src/bus/bus_Arbiter.vhdl @@ -1,7 +1,8 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann +-- Stefan Unrein -- --- Entity: Generic arbiter +-- Entity: Generic arbiter -- -- Description: -- ------------------------------------- @@ -20,7 +21,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,110 +31,98 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; - entity bus_Arbiter is generic ( - STRATEGY : string := "RR"; -- RR, LOT - PORTS : positive := 1; - WEIGHTS : T_INTVEC := (0 => 1); - OUTPUT_REG : boolean := TRUE + STRATEGY : string := "RR"; -- RR, LOT + PORTS : positive := 1; + WEIGHTS : integer_vector := (0 => 1); + OUTPUT_REG : boolean := FALSE ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - Arbitrate : in std_logic; - Request_Vector : in std_logic_vector(PORTS - 1 downto 0); + Arbitrate : in std_logic; + RequestVector : in std_logic_vector(PORTS - 1 downto 0); - Arbitrated : out std_logic; - Grant_Vector : out std_logic_vector(PORTS - 1 downto 0); - Grant_Index : out std_logic_vector(log2ceilnz(PORTS) - 1 downto 0) + Arbitrated : out std_logic; + GrantVector : out std_logic_vector(PORTS - 1 downto 0); + GrantIndex : out unsigned(log2ceilnz(PORTS) - 1 downto 0) ); end entity; - - architecture rtl of bus_Arbiter is - attribute KEEP : boolean; - attribute FSM_ENCODING : string; + attribute KEEP : boolean; + attribute FSM_ENCODING : string; begin + -- XXX: How does arith_FirstOne relate to an arbiter and to RR or Priority arbitration? + gen_Strategy : if STRATEGY = "RR" generate -- Round Robin Arbiter + signal RequestLeft : unsigned(PORTS - 1 downto 0); + signal SelectLeft : unsigned(PORTS - 1 downto 0); + signal SelectRight : unsigned(PORTS - 1 downto 0); - -- Assert STRATEGY for known strings - -- ========================================================================================================================================================== - assert ((STRATEGY = "RR") )--or (STRATEGY = "LOT")) - report "Unknown arbiter strategy." severity FAILURE; - - -- Round Robin Arbiter - -- ========================================================================================================================================================== - genRR : if STRATEGY = "RR" generate - signal RequestLeft : unsigned(PORTS - 1 downto 0); - signal SelectLeft : unsigned(PORTS - 1 downto 0); - signal SelectRight : unsigned(PORTS - 1 downto 0); - - signal ChannelPointer_en : std_logic; - signal ChannelPointer : std_logic_vector(PORTS - 1 downto 0); - signal ChannelPointer_d : std_logic_vector(PORTS - 1 downto 0) := to_slv(1, PORTS); - signal ChannelPointer_nxt : std_logic_vector(PORTS - 1 downto 0); + signal ChannelPointer_d : std_logic_vector(PORTS - 1 downto 0) := to_slv(1, PORTS); + signal ChannelPointer_nxt : std_logic_vector(PORTS - 1 downto 0); begin - ChannelPointer_en <= Arbitrate; - - RequestLeft <= (not ((unsigned(ChannelPointer_d) - 1) or unsigned(ChannelPointer_d))) and unsigned(Request_Vector); - SelectLeft <= (unsigned(not RequestLeft) + 1) and RequestLeft; - SelectRight <= (unsigned(not Request_Vector) + 1) and unsigned(Request_Vector); - ChannelPointer_nxt <= std_logic_vector(ite((RequestLeft = (RequestLeft'range => '0')), SelectRight, SelectLeft)); + RequestLeft <= (not ((unsigned(ChannelPointer_d) - 1) or unsigned(ChannelPointer_d))) and unsigned(RequestVector); + SelectLeft <= (unsigned(not RequestLeft) + 1) and RequestLeft; -- Is the next index above the current pointer + SelectRight <= (unsigned(not RequestVector) + 1) and unsigned(RequestVector); -- Is the first index that is requested from 0 (including self) + ChannelPointer_nxt <= std_logic_vector(ite((RequestLeft = (RequestLeft'range => '0')), SelectRight, SelectLeft)); - -- generate ChannelPointer register and unregistered outputs - genREG0 : if not OUTPUT_REG generate - process(Clock) + genREG : if OUTPUT_REG generate + signal ChannelPointer_bin_d : unsigned(log2ceilnz(PORTS) - 1 downto 0) := (others => '0'); + begin + process (Clock) begin if rising_edge(Clock) then + Arbitrated <= '0'; + if (Reset = '1') then - ChannelPointer_d <= to_slv(1, PORTS); - elsif (ChannelPointer_en = '1') then - ChannelPointer_d <= ChannelPointer_nxt; + ChannelPointer_d <= to_slv(1, PORTS); + ChannelPointer_bin_d <= (others => '0'); + + elsif (Arbitrate = '1') then + Arbitrated <= '1'; + ChannelPointer_d <= ChannelPointer_nxt; + ChannelPointer_bin_d <= onehot2bin(ChannelPointer_nxt); end if; end if; end process; - Arbitrated <= Arbitrate; - Grant_Vector <= ChannelPointer_nxt; - Grant_Index <= std_logic_vector(onehot2bin(ChannelPointer_nxt)); - end generate; + GrantVector <= ChannelPointer_d; + GrantIndex <= ChannelPointer_bin_d; - -- generate ChannelPointer register and registered outputs - genREG1 : if OUTPUT_REG generate - signal ChannelPointer_bin_d : std_logic_vector(log2ceilnz(PORTS) - 1 downto 0) := (others => '0'); - begin - process(Clock) + else generate + process (Clock) begin if rising_edge(Clock) then if (Reset = '1') then - ChannelPointer_d <= to_slv(1, PORTS); - ChannelPointer_bin_d <= (others => '0'); - elsif (ChannelPointer_en = '1') then - ChannelPointer_d <= ChannelPointer_nxt; - ChannelPointer_bin_d <= std_logic_vector(onehot2bin(ChannelPointer_nxt, 0)); + ChannelPointer_d <= to_slv(1, PORTS); + + elsif (Arbitrate = '1') then + ChannelPointer_d <= ChannelPointer_nxt; end if; end if; end process; - Arbitrated <= Arbitrate when rising_edge(Clock); - Grant_Vector <= ChannelPointer_d; - Grant_Index <= ChannelPointer_bin_d; + Arbitrated <= Arbitrated; + GrantVector <= ChannelPointer_nxt; + GrantIndex <= onehot2bin(ChannelPointer_nxt); + end generate; + + -- elsif STRATEGY = "LOT" generate -- Lottery Arbiter + -- elsif STRATEGY = "WRR" generate -- Weighted Round Robin Arbiter + + else generate + assert false report "PoC.bus_Arbiter:: Strategy '" & STRATEGY & "' not implemented!" severity failure; end generate; - -- Lottery Arbiter - -- ========================================================================================================================================================== --- genLOT : if (STRATEGY = "RR") generate --- begin --- --- end generate; end architecture; diff --git a/src/bus/drp/drp.generic.vhdl b/src/bus/drp/drp.generic.vhdl index 715a2d353..20a5b583e 100644 --- a/src/bus/drp/drp.generic.vhdl +++ b/src/bus/drp/drp.generic.vhdl @@ -16,7 +16,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -25,16 +25,15 @@ -- limitations under the License. -- ============================================================================= -use work.DRP.all; +use work.drp.all; -package DRP_Sized is +package drp_Sized is generic ( ADDRESS_BITS : natural; DATA_BITS : natural ); - subtype SIZED_S2M is T_DRP_Bus_S2M( DataOut(DATA_BITS -1 downto 0) ); diff --git a/src/bus/drp/drp.pkg.vhdl b/src/bus/drp/drp.pkg.vhdl index 2bfa1b533..c493c8d48 100644 --- a/src/bus/drp/drp.pkg.vhdl +++ b/src/bus/drp/drp.pkg.vhdl @@ -16,7 +16,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -32,13 +32,13 @@ use IEEE.numeric_std.all; use work.utils.all; -package DRP is +package drp is type T_DRP_Bus_S2M is record Ready : std_logic; DataOut : std_logic_vector; end record; - type T_DRP_Bus_S2M_VECTOR is array(natural range <>) of T_DRP_Bus_S2M; + type T_DRP_Bus_S2M_VECTOR is array(natural range <>) of T_DRP_Bus_S2M; type T_DRP_Bus_M2S is record Enable : std_logic; @@ -46,13 +46,13 @@ package DRP is Address : unsigned; DataIn : std_logic_vector; end record; - type T_DRP_Bus_M2S_VECTOR is array(natural range <>) of T_DRP_Bus_M2S; + type T_DRP_Bus_M2S_VECTOR is array(natural range <>) of T_DRP_Bus_M2S; - type T_DRP_Bus is record - M2S : T_DRP_Bus_M2S; - S2M : T_DRP_Bus_S2M; - end record; - type T_DRP_Bus_VECTOR is array(natural range <>) of T_DRP_Bus; + type T_DRP_Bus is record + M2S : T_DRP_Bus_M2S; + S2M : T_DRP_Bus_S2M; + end record; + type T_DRP_Bus_VECTOR is array(natural range <>) of T_DRP_Bus; function Initialize_DRP_Bus_M2S(AddressBits : natural; DataBits : natural := 16; Value : std_logic := 'Z') return T_DRP_Bus_M2S; @@ -62,34 +62,36 @@ package DRP is end package; -package body DRP is - function Initialize_DRP_Bus_M2S(AddressBits : natural; DataBits : natural := 16; Value : std_logic := 'Z') return T_DRP_Bus_M2S is - variable var : T_DRP_Bus_M2S( - Address(AddressBits -1 downto 0), DataIn(DataBits -1 downto 0)) :=( - Enable => Value, - WriteEnable => Value, - Address => (AddressBits-1 downto 0 => Value), - DataIn => (DataBits - 1 downto 0 => Value) - ); - begin - return var; - end function; +package body drp is + function Initialize_DRP_Bus_M2S(AddressBits : natural; DataBits : natural := 16; Value : std_logic := 'Z') return T_DRP_Bus_M2S is + variable var : T_DRP_Bus_M2S( + Address(AddressBits -1 downto 0), + DataIn(DataBits -1 downto 0) + ) :=( + Enable => Value, + WriteEnable => Value, + Address => (AddressBits-1 downto 0 => Value), + DataIn => (DataBits - 1 downto 0 => Value) + ); + begin + return var; + end function; - function Initialize_DRP_Bus_S2M(DataBits : natural := 16; Value : std_logic := 'Z') return T_DRP_Bus_S2M is - variable var : T_DRP_Bus_S2M(DataOut(DataBits -1 downto 0)) :=( - Ready => Value, - DataOut => (DataBits - 1 downto 0 => Value) - ); - begin - return var; - end function; + function Initialize_DRP_Bus_S2M(DataBits : natural := 16; Value : std_logic := 'Z') return T_DRP_Bus_S2M is + variable var : T_DRP_Bus_S2M(DataOut(DataBits -1 downto 0)) :=( + Ready => Value, + DataOut => (DataBits - 1 downto 0 => Value) + ); + begin + return var; + end function; - function Initialize_DRP_Bus(AddressBits : natural; DataBits : natural := 16; Value : std_logic := 'Z') return T_DRP_Bus is - begin - return ( - M2S => Initialize_DRP_Bus_M2S(AddressBits, DataBits, Value), - S2M => Initialize_DRP_Bus_S2M(DataBits, Value) - ); - end function; + function Initialize_DRP_Bus(AddressBits : natural; DataBits : natural := 16; Value : std_logic := 'Z') return T_DRP_Bus is + begin + return ( + M2S => Initialize_DRP_Bus_M2S(AddressBits, DataBits, Value), + S2M => Initialize_DRP_Bus_S2M(DataBits, Value) + ); + end function; end package body; diff --git a/src/bus/drp/DRP_AXI4Lite_Bridge.vhdl b/src/bus/drp/drp_AXI4Lite_Bridge.vhdl similarity index 94% rename from src/bus/drp/DRP_AXI4Lite_Bridge.vhdl rename to src/bus/drp/drp_AXI4Lite_Bridge.vhdl index 7df8953ed..e8dfc4e00 100644 --- a/src/bus/drp/DRP_AXI4Lite_Bridge.vhdl +++ b/src/bus/drp/drp_AXI4Lite_Bridge.vhdl @@ -16,7 +16,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,21 +26,21 @@ -- ============================================================================= library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -use work.utils.all; -use work.axi4lite.all; -use work.drp.all; +use work.utils.all; +use work.axi4lite.all; +use work.drp.all; -entity DRP_AXI4Lite_Bridge is +entity drp_AXI4Lite_Bridge is generic ( DRP_COUNT : positive := 1; DRP_ADDR_BITS : positive := 10 --Register Address, NO Word-Address; 10 bit for US+, 9 bit for US ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- IN Port AXI4Lite_M2S : in T_AXI4Lite_Bus_M2S; AXI4Lite_S2M : out T_AXI4Lite_Bus_S2M; @@ -49,7 +49,8 @@ entity DRP_AXI4Lite_Bridge is DRP_S2M : in T_DRP_Bus_S2M_VECTOR(0 to DRP_COUNT - 1) ); end entity; -architecture rtl of DRP_AXI4Lite_Bridge is + +architecture rtl of drp_AXI4Lite_Bridge is constant DRP_DATA_BITS : positive := 16; constant C_COUNT_BITS : natural := log2ceil(DRP_COUNT); constant C_AXI_ADDR_BITS : natural := C_COUNT_BITS + DRP_ADDR_BITS; @@ -75,8 +76,8 @@ architecture rtl of DRP_AXI4Lite_Bridge is signal State : T_State := idle; signal State_nxt : T_State; begin - assert AXI4Lite_M2S.WData'length = 32 report "PoC.DRP_AXI4Lite_Bridge:: Bridge can only support 32bit data width for AXI4L!" severity failure; - assert AXI4Lite_M2S.AWAddr'length >= C_AXI_ADDR_BITS +2 report "PoC.DRP_AXI4Lite_Bridge:: Not enough address bits in AXI4L!" severity failure; + assert AXI4Lite_M2S.WData'length = 32 report "PoC.drp_AXI4Lite_Bridge:: Bridge can only support 32bit data width for AXI4L!" severity failure; + assert AXI4Lite_M2S.AWAddr'length >= C_AXI_ADDR_BITS +2 report "PoC.drp_AXI4Lite_Bridge:: Not enough address bits in AXI4L!" severity failure; process (all) begin diff --git a/src/bus/stream/README.md b/src/bus/stream/README.md index e63d7d3c9..874ab2e83 100644 --- a/src/bus/stream/README.md +++ b/src/bus/stream/README.md @@ -1,7 +1,10 @@ # Namespace `PoC.bus.stream` -The namespace `PoC.bus.stream` offers different modules for the *PoC.Stream* bus. +The namespace `PoC.bus.stream` offers different modules for the *PoC.Stream* interface. +> [!IMPORTANT] +> *PoC.Stream* components will be replaced by *AXI4-Stream* components. +> ## Package @@ -10,21 +13,19 @@ The package [`PoC.stream`][stream.pkg] holds all component declarations for this ## Entities - - [`stream_FIFO`][stream_FIFO] a generic stream buffer/FIFO implementation. - [`stream_DeMux`][stream_DeMux] a generic de-multiplexer implementation. + - [`stream_FIFO`][stream_FIFO] a generic stream buffer/FIFO implementation. - [`stream_FrameGenerator`][stream_FrameGenerator] - [`stream_Mirror`][stream_Mirror] a generic stream-mirror implementation. - [`stream_Mux`][stream_Mux] a generic multiplexer implementation. - - [`stream_Sink`][stream_Sink] a generic data sink for simulation. - [`stream_Source`][stream_Source] a generic data source for simulation. [stream.pkg]: stream.pkg.vhdl - [stream_FIFO]: stream_FIFO.vhdl [stream_DeMux]: stream_DeMux.vhdl + [stream_FIFO]: stream_FIFO.vhdl [stream_FrameGenerator]: stream_FrameGenerator.vhdl [stream_Mirror]: stream_Mirror.vhdl [stream_Mux]: stream_Mux.vhdl - [stream_Sink]: stream_Sink.vhdl [stream_Source]: stream_Source.vhdl diff --git a/src/bus/stream/stream.pro b/src/bus/stream/build.pro similarity index 100% rename from src/bus/stream/stream.pro rename to src/bus/stream/build.pro diff --git a/src/bus/stream/stream.pkg.vhdl b/src/bus/stream/stream.pkg.vhdl index fad84e642..e15bac146 100644 --- a/src/bus/stream/stream.pkg.vhdl +++ b/src/bus/stream/stream.pkg.vhdl @@ -42,8 +42,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; @@ -51,196 +51,196 @@ use work.strings.all; package stream is - type T_Stream_M2S is record - Valid : std_logic; - Data : std_logic_vector; - SoF : std_logic; - EoF : std_logic; - BE : std_logic_vector; - Meta : std_logic_vector; - end record; - - type T_Stream_S2M is record - ACK : std_logic; - Meta : std_logic_vector; - end record; - - type T_Stream_M2S_VECTOR is array(natural range <>) of T_Stream_M2S; - type T_Stream_S2M_VECTOR is array(natural range <>) of T_Stream_S2M; - - function Initialize(DataBits : natural; MetaBits : positive := 1; Value : std_logic := 'Z') return T_Stream_M2S; - function Initialize( MetaBits : positive := 1; Value : std_logic := 'Z') return T_Stream_S2M; - - function Get_Valid_vector(M2S : T_Stream_M2S_VECTOR) return std_logic_vector; - function Get_SoF_vector( M2S : T_Stream_M2S_VECTOR) return std_logic_vector; - function Get_EoF_vector( M2S : T_Stream_M2S_VECTOR) return std_logic_vector; - function Get_ACK_vector( S2M : T_Stream_S2M_VECTOR) return std_logic_vector; - function Get_Data_vector( M2S : T_Stream_M2S_VECTOR) return T_SLVV; - function Get_BE_vector( M2S : T_Stream_M2S_VECTOR) return T_SLVV; - function Get_Meta_vector( M2S : T_Stream_M2S_VECTOR) return T_SLVV; - function Get_Meta_vector( S2M : T_Stream_S2M_VECTOR) return T_SLVV; - function Resize_meta( M2S : T_Stream_M2S; length : natural) return T_Stream_M2S; - function Replace_meta( M2S : T_Stream_M2S; slv : std_logic_vector) return T_Stream_M2S; - - type T_Stream_Stage_Meta_Kind is ( - With_Data, - None, - Single_Reg - ); - function ite(cond : boolean; value1 : T_Stream_Stage_Meta_Kind; value2 : T_Stream_Stage_Meta_Kind) return T_Stream_Stage_Meta_Kind; - - - attribute Count : integer; - - --types for stream_FrameGenerator - type T_FRAMEGEN_COMMAND is ( - FRAMEGEN_CMD_NONE, - FRAMEGEN_CMD_SEQUENCE, - FRAMEGEN_CMD_RANDOM, - FRAMEGEN_CMD_SINGLE_FRAME, - FRAMEGEN_CMD_SINGLE_FRAMEGROUP, - FRAMEGEN_CMD_ALL_FRAMES - ); - attribute Count of T_FRAMEGEN_COMMAND : type is T_FRAMEGEN_COMMAND'pos(T_FRAMEGEN_COMMAND'high) + 1; - function to_slv(val : T_FRAMEGEN_COMMAND) return std_logic_vector; - function to_FRAMEGEN_COMMAND(slv : std_logic_vector) return T_FRAMEGEN_COMMAND; - - type T_FRAMEGEN_STATUS is ( - FRAMEGEN_STATUS_IDLE, - FRAMEGEN_STATUS_GENERATING, - FRAMEGEN_STATUS_COMPLETE, - FRAMEGEN_STATUS_ERROR - ); - attribute Count of T_FRAMEGEN_STATUS : type is T_FRAMEGEN_STATUS'pos(T_FRAMEGEN_STATUS'high) + 1; - function to_slv(val : T_FRAMEGEN_STATUS) return std_logic_vector; - function to_FRAMEGEN_STATUS(slv : std_logic_vector) return T_FRAMEGEN_STATUS; - - -- single dataword for TestRAM - type T_SIM_STREAM_WORD_8 is record - Valid : std_logic; - Data : T_SLV_8; - SOF : std_logic; - EOF : std_logic; - Ready : std_logic; - EOFG : boolean; - end record; - - type T_SIM_STREAM_WORD_32 is record - Valid : std_logic; - Data : T_SLV_32; - SOF : std_logic; - EOF : std_logic; - Ready : std_logic; - EOFG : boolean; - end record; - - -- define array indices - constant C_SIM_STREAM_MAX_PATTERN_COUNT : positive := 128;-- * 1024; -- max data size per testcase - constant C_SIM_STREAM_MAX_FRAMEGROUP_COUNT : positive := 8; - - constant C_SIM_STREAM_WORD_INDEX_BW : positive := log2ceilnz(C_SIM_STREAM_MAX_PATTERN_COUNT); - constant C_SIM_STREAM_FRAMEGROUP_INDEX_BW : positive := log2ceilnz(C_SIM_STREAM_MAX_FRAMEGROUP_COUNT); - - subtype T_SIM_STREAM_WORD_INDEX is integer range 0 to C_SIM_STREAM_MAX_PATTERN_COUNT - 1; - subtype T_SIM_STREAM_FRAMEGROUP_INDEX is integer range 0 to C_SIM_STREAM_MAX_FRAMEGROUP_COUNT - 1; - - subtype T_SIM_DELAY is T_UINT_16; - type T_SIM_DELAY_VECTOR is array (natural range <>) of T_SIM_DELAY; - - -- define array of datawords - type T_SIM_STREAM_WORD_VECTOR_8 is array (natural range <>) of T_SIM_STREAM_WORD_8; - type T_SIM_STREAM_WORD_VECTOR_32 is array (natural range <>) of T_SIM_STREAM_WORD_32; - - -- define link layer directions - type T_SIM_STREAM_DIRECTION is (Send, RECEIVE); - - -- define framegroup information - type T_SIM_STREAM_FRAMEGROUP_8 is record - Active : boolean; - Name : string(1 to 64); - PrePause : natural; - PostPause : natural; - DataCount : T_SIM_STREAM_WORD_INDEX; - Data : T_SIM_STREAM_WORD_VECTOR_8(0 to C_SIM_STREAM_MAX_PATTERN_COUNT - 1); - end record; - - type T_SIM_STREAM_FRAMEGROUP_32 is record - Active : boolean; - Name : string(1 to 64); - PrePause : natural; - PostPause : natural; - DataCount : T_SIM_STREAM_WORD_INDEX; - Data : T_SIM_STREAM_WORD_VECTOR_32(T_SIM_STREAM_WORD_INDEX); - end record; - - -- define array of framegroups - type T_SIM_STREAM_FRAMEGROUP_VECTOR_8 is array (natural range <>) of T_SIM_STREAM_FRAMEGROUP_8; - type T_SIM_STREAM_FRAMEGROUP_VECTOR_32 is array (natural range <>) of T_SIM_STREAM_FRAMEGROUP_32; - - -- define constants (stored in RAMB36's parity-bits) - constant C_SIM_STREAM_WORD_8_EMPTY : T_SIM_STREAM_WORD_8 := (Valid => '0', Data => (others => 'U'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); - constant C_SIM_STREAM_WORD_32_EMPTY : T_SIM_STREAM_WORD_32 := (Valid => '0', Data => (others => 'U'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); - constant C_SIM_STREAM_WORD_8_INVALID : T_SIM_STREAM_WORD_8 := (Valid => '0', Data => (others => 'U'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); - constant C_SIM_STREAM_WORD_32_INVALID : T_SIM_STREAM_WORD_32 := (Valid => '0', Data => (others => 'U'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); - constant C_SIM_STREAM_WORD_8_ZERO : T_SIM_STREAM_WORD_8 := (Valid => '1', Data => (others => 'Z'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); - constant C_SIM_STREAM_WORD_32_ZERO : T_SIM_STREAM_WORD_32 := (Valid => '1', Data => (others => 'Z'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); - constant C_SIM_STREAM_WORD_8_UNDEF : T_SIM_STREAM_WORD_8 := (Valid => '1', Data => (others => 'U'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); - constant C_SIM_STREAM_WORD_32_UNDEF : T_SIM_STREAM_WORD_32 := (Valid => '1', Data => (others => 'U'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); - - constant C_SIM_STREAM_FRAMEGROUP_8_EMPTY : T_SIM_STREAM_FRAMEGROUP_8 := ( - Active => FALSE, - Name => (others => C_POC_NUL), - PrePause => 0, - PostPause => 0, - DataCount => 0, - Data => (others => C_SIM_STREAM_WORD_8_EMPTY) - ); - constant C_SIM_STREAM_FRAMEGROUP_32_EMPTY : T_SIM_STREAM_FRAMEGROUP_32 := ( - Active => FALSE, - Name => (others => C_POC_NUL), - PrePause => 0, - PostPause => 0, - DataCount => 0, - Data => (others => C_SIM_STREAM_WORD_32_EMPTY) - ); - - function CountPatterns(Data : T_SIM_STREAM_WORD_VECTOR_8) return natural; - function CountPatterns(Data : T_SIM_STREAM_WORD_VECTOR_32) return natural; - - function dat(slv : T_SLV_8) return T_SIM_STREAM_WORD_8; - function dat(slvv : T_SLVV_8) return T_SIM_STREAM_WORD_VECTOR_8; - function dat(slv : T_SLV_32) return T_SIM_STREAM_WORD_32; - function dat(slvv : T_SLVV_32) return T_SIM_STREAM_WORD_VECTOR_32; - function sof(slv : T_SLV_8) return T_SIM_STREAM_WORD_8; - function sof(slvv : T_SLVV_8) return T_SIM_STREAM_WORD_VECTOR_8; - function sof(slv : T_SLV_32) return T_SIM_STREAM_WORD_32; - function sof(slvv : T_SLVV_32) return T_SIM_STREAM_WORD_VECTOR_32; - function eof(slv : T_SLV_8) return T_SIM_STREAM_WORD_8; - function eof(slvv : T_SLVV_8) return T_SIM_STREAM_WORD_VECTOR_8; - function eof(slv : T_SLV_32) return T_SIM_STREAM_WORD_32; - function eof(slvv : T_SLVV_32) return T_SIM_STREAM_WORD_VECTOR_32; - function eof(stmw : T_SIM_STREAM_WORD_8) return T_SIM_STREAM_WORD_8; - function eof(stmwv : T_SIM_STREAM_WORD_VECTOR_8) return T_SIM_STREAM_WORD_VECTOR_8; - function eof(stmw : T_SIM_STREAM_WORD_32) return T_SIM_STREAM_WORD_32; - function eofg(stmw : T_SIM_STREAM_WORD_8) return T_SIM_STREAM_WORD_8; - function eofg(stmwv : T_SIM_STREAM_WORD_VECTOR_8) return T_SIM_STREAM_WORD_VECTOR_8; - function eofg(stmw : T_SIM_STREAM_WORD_32) return T_SIM_STREAM_WORD_32; - - function to_string(stmw : T_SIM_STREAM_WORD_8) return string; - function to_string(stmw : T_SIM_STREAM_WORD_32) return string; - - -- checksum functions - -- ================================================================ - function sim_CRC8(words : T_SIM_STREAM_WORD_VECTOR_8) return std_logic_vector; + type T_Stream_M2S is record + Valid : std_logic; + Data : std_logic_vector; + SoF : std_logic; + EoF : std_logic; + BE : std_logic_vector; + Meta : std_logic_vector; + end record; + + type T_Stream_S2M is record + ACK : std_logic; + Meta : std_logic_vector; + end record; + + type T_Stream_M2S_VECTOR is array(natural range <>) of T_Stream_M2S; + type T_Stream_S2M_VECTOR is array(natural range <>) of T_Stream_S2M; + + function Initialize(DataBits : natural; MetaBits : positive := 1; Value : std_logic := 'Z') return T_Stream_M2S; + function Initialize( MetaBits : positive := 1; Value : std_logic := 'Z') return T_Stream_S2M; + + function Get_Valid_vector(M2S : T_Stream_M2S_VECTOR) return std_logic_vector; + function Get_SoF_vector( M2S : T_Stream_M2S_VECTOR) return std_logic_vector; + function Get_EoF_vector( M2S : T_Stream_M2S_VECTOR) return std_logic_vector; + function Get_ACK_vector( S2M : T_Stream_S2M_VECTOR) return std_logic_vector; + function Get_Data_vector( M2S : T_Stream_M2S_VECTOR) return T_SLVV; + function Get_BE_vector( M2S : T_Stream_M2S_VECTOR) return T_SLVV; + function Get_Meta_vector( M2S : T_Stream_M2S_VECTOR) return T_SLVV; + function Get_Meta_vector( S2M : T_Stream_S2M_VECTOR) return T_SLVV; + function Resize_meta( M2S : T_Stream_M2S; length : natural) return T_Stream_M2S; + function Replace_meta( M2S : T_Stream_M2S; slv : std_logic_vector) return T_Stream_M2S; + + type T_Stream_Stage_Meta_Kind is ( + With_Data, + None, + Single_Reg + ); + function ite(cond : boolean; value1 : T_Stream_Stage_Meta_Kind; value2 : T_Stream_Stage_Meta_Kind) return T_Stream_Stage_Meta_Kind; + + +attribute Count : integer; + + --types for stream_FrameGenerator + type T_FRAMEGEN_COMMAND is ( + FRAMEGEN_CMD_NONE, + FRAMEGEN_CMD_SEQUENCE, + FRAMEGEN_CMD_RANDOM, + FRAMEGEN_CMD_SINGLE_FRAME, + FRAMEGEN_CMD_SINGLE_FRAMEGROUP, + FRAMEGEN_CMD_ALL_FRAMES + ); + attribute Count of T_FRAMEGEN_COMMAND : type is T_FRAMEGEN_COMMAND'pos(T_FRAMEGEN_COMMAND'high) + 1; + function to_slv(val : T_FRAMEGEN_COMMAND) return std_logic_vector; + function to_FRAMEGEN_COMMAND(slv : std_logic_vector) return T_FRAMEGEN_COMMAND; + + type T_FRAMEGEN_STATUS is ( + FRAMEGEN_STATUS_IDLE, + FRAMEGEN_STATUS_GENERATING, + FRAMEGEN_STATUS_COMPLETE, + FRAMEGEN_STATUS_ERROR + ); + attribute Count of T_FRAMEGEN_STATUS : type is T_FRAMEGEN_STATUS'pos(T_FRAMEGEN_STATUS'high) + 1; + function to_slv(val : T_FRAMEGEN_STATUS) return std_logic_vector; + function to_FRAMEGEN_STATUS(slv : std_logic_vector) return T_FRAMEGEN_STATUS; + + -- single dataword for TestRAM + type T_SIM_STREAM_WORD_8 is record + Valid : std_logic; + Data : T_SLV_8; + SOF : std_logic; + EOF : std_logic; + Ready : std_logic; + EOFG : boolean; + end record; + + type T_SIM_STREAM_WORD_32 is record + Valid : std_logic; + Data : T_SLV_32; + SOF : std_logic; + EOF : std_logic; + Ready : std_logic; + EOFG : boolean; + end record; + + -- define array indices + constant C_SIM_STREAM_MAX_PATTERN_COUNT : positive := 128;-- * 1024; -- max data size per testcase + constant C_SIM_STREAM_MAX_FRAMEGROUP_COUNT : positive := 8; + + constant C_SIM_STREAM_WORD_INDEX_BW : positive := log2ceilnz(C_SIM_STREAM_MAX_PATTERN_COUNT); + constant C_SIM_STREAM_FRAMEGROUP_INDEX_BW : positive := log2ceilnz(C_SIM_STREAM_MAX_FRAMEGROUP_COUNT); + + subtype T_SIM_STREAM_WORD_INDEX is integer range 0 to C_SIM_STREAM_MAX_PATTERN_COUNT - 1; + subtype T_SIM_STREAM_FRAMEGROUP_INDEX is integer range 0 to C_SIM_STREAM_MAX_FRAMEGROUP_COUNT - 1; + + subtype T_SIM_DELAY is T_UINT_16; + type T_SIM_DELAY_VECTOR is array (natural range <>) of T_SIM_DELAY; + + -- define array of datawords + type T_SIM_STREAM_WORD_VECTOR_8 is array (natural range <>) of T_SIM_STREAM_WORD_8; + type T_SIM_STREAM_WORD_VECTOR_32 is array (natural range <>) of T_SIM_STREAM_WORD_32; + + -- define link layer directions + type T_SIM_STREAM_DIRECTION is (Send, RECEIVE); + + -- define framegroup information + type T_SIM_STREAM_FRAMEGROUP_8 is record + Active : boolean; + Name : string(1 to 64); + PrePause : natural; + PostPause : natural; + DataCount : T_SIM_STREAM_WORD_INDEX; + Data : T_SIM_STREAM_WORD_VECTOR_8(0 to C_SIM_STREAM_MAX_PATTERN_COUNT - 1); + end record; + + type T_SIM_STREAM_FRAMEGROUP_32 is record + Active : boolean; + Name : string(1 to 64); + PrePause : natural; + PostPause : natural; + DataCount : T_SIM_STREAM_WORD_INDEX; + Data : T_SIM_STREAM_WORD_VECTOR_32(T_SIM_STREAM_WORD_INDEX); + end record; + + -- define array of framegroups + type T_SIM_STREAM_FRAMEGROUP_VECTOR_8 is array (natural range <>) of T_SIM_STREAM_FRAMEGROUP_8; + type T_SIM_STREAM_FRAMEGROUP_VECTOR_32 is array (natural range <>) of T_SIM_STREAM_FRAMEGROUP_32; + + -- define constants (stored in RAMB36's parity-bits) + constant C_SIM_STREAM_WORD_8_EMPTY : T_SIM_STREAM_WORD_8 := (Valid => '0', Data => (others => 'U'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); + constant C_SIM_STREAM_WORD_32_EMPTY : T_SIM_STREAM_WORD_32 := (Valid => '0', Data => (others => 'U'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); + constant C_SIM_STREAM_WORD_8_INVALID : T_SIM_STREAM_WORD_8 := (Valid => '0', Data => (others => 'U'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); + constant C_SIM_STREAM_WORD_32_INVALID : T_SIM_STREAM_WORD_32 := (Valid => '0', Data => (others => 'U'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); + constant C_SIM_STREAM_WORD_8_ZERO : T_SIM_STREAM_WORD_8 := (Valid => '1', Data => (others => 'Z'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); + constant C_SIM_STREAM_WORD_32_ZERO : T_SIM_STREAM_WORD_32 := (Valid => '1', Data => (others => 'Z'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); + constant C_SIM_STREAM_WORD_8_UNDEF : T_SIM_STREAM_WORD_8 := (Valid => '1', Data => (others => 'U'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); + constant C_SIM_STREAM_WORD_32_UNDEF : T_SIM_STREAM_WORD_32 := (Valid => '1', Data => (others => 'U'), SOF => '0', EOF => '0', Ready => '0', EOFG => FALSE); + + constant C_SIM_STREAM_FRAMEGROUP_8_EMPTY : T_SIM_STREAM_FRAMEGROUP_8 := ( + Active => FALSE, + Name => (others => C_POC_NUL), + PrePause => 0, + PostPause => 0, + DataCount => 0, + Data => (others => C_SIM_STREAM_WORD_8_EMPTY) + ); + constant C_SIM_STREAM_FRAMEGROUP_32_EMPTY : T_SIM_STREAM_FRAMEGROUP_32 := ( + Active => FALSE, + Name => (others => C_POC_NUL), + PrePause => 0, + PostPause => 0, + DataCount => 0, + Data => (others => C_SIM_STREAM_WORD_32_EMPTY) + ); + + function CountPatterns(Data : T_SIM_STREAM_WORD_VECTOR_8) return natural; + function CountPatterns(Data : T_SIM_STREAM_WORD_VECTOR_32) return natural; + + function dat(slv : T_SLV_8) return T_SIM_STREAM_WORD_8; + function dat(slvv : T_SLVV_8) return T_SIM_STREAM_WORD_VECTOR_8; + function dat(slv : T_SLV_32) return T_SIM_STREAM_WORD_32; + function dat(slvv : T_SLVV_32) return T_SIM_STREAM_WORD_VECTOR_32; + function sof(slv : T_SLV_8) return T_SIM_STREAM_WORD_8; + function sof(slvv : T_SLVV_8) return T_SIM_STREAM_WORD_VECTOR_8; + function sof(slv : T_SLV_32) return T_SIM_STREAM_WORD_32; + function sof(slvv : T_SLVV_32) return T_SIM_STREAM_WORD_VECTOR_32; + function eof(slv : T_SLV_8) return T_SIM_STREAM_WORD_8; + function eof(slvv : T_SLVV_8) return T_SIM_STREAM_WORD_VECTOR_8; + function eof(slv : T_SLV_32) return T_SIM_STREAM_WORD_32; + function eof(slvv : T_SLVV_32) return T_SIM_STREAM_WORD_VECTOR_32; + function eof(stmw : T_SIM_STREAM_WORD_8) return T_SIM_STREAM_WORD_8; + function eof(stmwv : T_SIM_STREAM_WORD_VECTOR_8) return T_SIM_STREAM_WORD_VECTOR_8; + function eof(stmw : T_SIM_STREAM_WORD_32) return T_SIM_STREAM_WORD_32; + function eofg(stmw : T_SIM_STREAM_WORD_8) return T_SIM_STREAM_WORD_8; + function eofg(stmwv : T_SIM_STREAM_WORD_VECTOR_8) return T_SIM_STREAM_WORD_VECTOR_8; + function eofg(stmw : T_SIM_STREAM_WORD_32) return T_SIM_STREAM_WORD_32; + + function to_string(stmw : T_SIM_STREAM_WORD_8) return string; + function to_string(stmw : T_SIM_STREAM_WORD_32) return string; + + -- checksum functions + -- ================================================================ + function sim_CRC8(words : T_SIM_STREAM_WORD_VECTOR_8) return std_logic_vector; -- function sim_CRC16(words : T_SIM_STREAM_WORD_VECTOR_8) return STD_LOGIC_VECTOR; - function Stream_serialize(Data : std_logic_vector; BE : std_logic_vector; SoF : std_logic; EoF : std_logic) return std_logic_vector; - function Stream_get_EoF(Serialized : std_logic_vector) return std_logic; - function Stream_get_SoF(Serialized : std_logic_vector) return std_logic; - function Stream_get_BE(Serialized : std_logic_vector) return std_logic_vector; - function Stream_get_Data(Serialized : std_logic_vector) return std_logic_vector; + function Stream_serialize(Data : std_logic_vector; BE : std_logic_vector; SoF : std_logic; EoF : std_logic) return std_logic_vector; + function Stream_get_EoF(Serialized : std_logic_vector) return std_logic; + function Stream_get_SoF(Serialized : std_logic_vector) return std_logic; + function Stream_get_BE(Serialized : std_logic_vector) return std_logic_vector; + function Stream_get_Data(Serialized : std_logic_vector) return std_logic_vector; -end; +end package; package body stream is function Initialize(DataBits : natural; MetaBits : positive := 1; Value : std_logic := 'Z') return T_Stream_M2S is @@ -379,7 +379,7 @@ package body stream is end loop; return 0; - end; + end function; function CountPatterns(Data : T_SIM_STREAM_WORD_VECTOR_32) return natural is begin @@ -390,7 +390,7 @@ package body stream is end loop; return 0; - end; + end function; function dat(slv : T_SLV_8) return T_SIM_STREAM_WORD_8 is variable result : T_SIM_STREAM_WORD_8; @@ -398,7 +398,7 @@ package body stream is result := (Valid => '1', Data => slv, SOF => '0', EOF => '0', Ready => '-', EOFG => FALSE); report "dat: " & to_string(result) severity NOTE; return result; - end; + end function; function dat(slvv : T_SLVV_8) return T_SIM_STREAM_WORD_VECTOR_8 is variable result : T_SIM_STREAM_WORD_VECTOR_8(slvv'range); @@ -408,7 +408,7 @@ package body stream is end loop; return result; - end; + end function; function dat(slv : T_SLV_32) return T_SIM_STREAM_WORD_32 is variable result : T_SIM_STREAM_WORD_32; @@ -416,7 +416,7 @@ package body stream is result := (Valid => '1', Data => slv, SOF => '0', EOF => '0', Ready => '-', EOFG => FALSE); report "dat: " & to_string(result) severity NOTE; return result; - end; + end function; function dat(slvv : T_SLVV_32) return T_SIM_STREAM_WORD_VECTOR_32 is variable result : T_SIM_STREAM_WORD_VECTOR_32(slvv'range); @@ -426,7 +426,7 @@ package body stream is end loop; return result; - end; + end function; function sof(slv : T_SLV_8) return T_SIM_STREAM_WORD_8 is variable result : T_SIM_STREAM_WORD_8; @@ -434,7 +434,7 @@ package body stream is result := (Valid => '1', Data => slv, SOF => '1', EOF => '0', Ready => '-', EOFG => FALSE); report "sof: " & to_string(result) severity NOTE; return result; - end; + end function; function sof(slvv : T_SLVV_8) return T_SIM_STREAM_WORD_VECTOR_8 is variable result : T_SIM_STREAM_WORD_VECTOR_8(slvv'range); @@ -444,7 +444,7 @@ package body stream is result(i) := dat(slvv(i)); end loop; return result; - end; + end function; function sof(slv : T_SLV_32) return T_SIM_STREAM_WORD_32 is variable result : T_SIM_STREAM_WORD_32; @@ -452,7 +452,7 @@ package body stream is result := (Valid => '1', Data => slv, SOF => '1', EOF => '0', Ready => '-', EOFG => FALSE); report "sof: " & to_string(result) severity NOTE; return result; - end; + end function; function sof(slvv : T_SLVV_32) return T_SIM_STREAM_WORD_VECTOR_32 is variable result : T_SIM_STREAM_WORD_VECTOR_32(slvv'range); @@ -462,7 +462,7 @@ package body stream is result(i) := dat(slvv(i)); end loop; return result; - end; + end function; function eof(slv : T_SLV_8) return T_SIM_STREAM_WORD_8 is variable result : T_SIM_STREAM_WORD_8; @@ -470,7 +470,7 @@ package body stream is result := (Valid => '1', Data => slv, SOF => '0', EOF => '1', Ready => '-', EOFG => FALSE); report "eof: " & to_string(result) severity NOTE; return result; - end; + end function; function eof(slvv : T_SLVV_8) return T_SIM_STREAM_WORD_VECTOR_8 is variable result : T_SIM_STREAM_WORD_VECTOR_8(slvv'range); @@ -480,7 +480,7 @@ package body stream is end loop; result(slvv'high) := eof(slvv(slvv'high)); return result; - end; + end function; function eof(slv : T_SLV_32) return T_SIM_STREAM_WORD_32 is variable result : T_SIM_STREAM_WORD_32; @@ -488,7 +488,7 @@ package body stream is result := (Valid => '1', Data => slv, SOF => '0', EOF => '1', Ready => '-', EOFG => FALSE); report "eof: " & to_string(result) severity NOTE; return result; - end; + end function; function eof(slvv : T_SLVV_32) return T_SIM_STREAM_WORD_VECTOR_32 is variable result : T_SIM_STREAM_WORD_VECTOR_32(slvv'range); @@ -498,7 +498,7 @@ package body stream is end loop; result(slvv'high) := eof(slvv(slvv'high)); return result; - end; + end function; function eof(stmw : T_SIM_STREAM_WORD_8) return T_SIM_STREAM_WORD_8 is begin @@ -531,7 +531,7 @@ package body stream is result(stmwv'high) := eof(stmwv(stmwv'high)); return result; - end; + end function; function eofg(stmw : T_SIM_STREAM_WORD_8) return T_SIM_STREAM_WORD_8 is begin @@ -564,7 +564,7 @@ package body stream is result(stmwv'high) := eofg(stmwv(stmwv'high)); return result; - end; + end function; function to_flag1_string(stmw : T_SIM_STREAM_WORD_8) return string is variable flag : std_logic_vector(2 downto 0) := to_sl(stmw.EOFG) & stmw.EOF & stmw.SOF; @@ -672,7 +672,7 @@ package body stream is -- report " CRC8: 0x" & to_string(CRC8_Value, 'h') severity NOTE; return CRC8_Value; - end; + end function; -- function sim_CRC16(words : T_SIM_STREAM_WORD_VECTOR_8) return STD_LOGIC_VECTOR is -- constant CRC16_INIT : T_SLV_16 := x"FFFF"; @@ -784,7 +784,7 @@ package body stream is end package body; -use work.Stream.all; +use work.Stream.all; package Stream_Sized is generic ( diff --git a/src/bus/stream/stream_DeMux.vhdl b/src/bus/stream/stream_DeMux.vhdl index 5601215f5..592aa104c 100644 --- a/src/bus/stream/stream_DeMux.vhdl +++ b/src/bus/stream/stream_DeMux.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: A generic buffer module for the PoC.Stream protocol. +-- Entity: A generic buffer module for the PoC.Stream protocol. -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -36,126 +36,126 @@ use work.vectors.all; entity stream_DeMux is generic ( - PORTS : positive := 2; - DATA_BITS : positive := 8; - META_BITS : natural := 8; - META_REV_BITS : natural := 2 + PORTS : positive := 2; + DATA_BITS : positive := 8; + META_BITS : natural := 8; + META_REV_BITS : natural := 2 ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- Control interface - DeMuxControl : in std_logic_vector(PORTS - 1 downto 0); + DeMuxControl : in std_logic_vector(PORTS - 1 downto 0); -- IN Port - In_Valid : in std_logic; - In_Data : in std_logic_vector(DATA_BITS - 1 downto 0); - In_Meta : in std_logic_vector(META_BITS - 1 downto 0); - In_Meta_rev : out std_logic_vector(META_REV_BITS - 1 downto 0); - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; + In_Valid : in std_logic; + In_Data : in std_logic_vector(DATA_BITS - 1 downto 0); + In_Meta : in std_logic_vector(META_BITS - 1 downto 0); + In_Meta_rev : out std_logic_vector(META_REV_BITS - 1 downto 0); + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; -- OUT Ports - Out_Valid : out std_logic_vector(PORTS - 1 downto 0); - Out_Data : out T_SLM(PORTS - 1 downto 0, DATA_BITS - 1 downto 0); - Out_Meta : out T_SLM(PORTS - 1 downto 0, META_BITS - 1 downto 0); - Out_Meta_rev : in T_SLM(PORTS - 1 downto 0, META_REV_BITS - 1 downto 0); - Out_SOF : out std_logic_vector(PORTS - 1 downto 0); - Out_EOF : out std_logic_vector(PORTS - 1 downto 0); - Out_Ack : in std_logic_vector(PORTS - 1 downto 0) + Out_Valid : out std_logic_vector(PORTS - 1 downto 0); + Out_Data : out T_SLM(PORTS - 1 downto 0, DATA_BITS - 1 downto 0); + Out_Meta : out T_SLM(PORTS - 1 downto 0, META_BITS - 1 downto 0); + Out_Meta_rev : in T_SLM(PORTS - 1 downto 0, META_REV_BITS - 1 downto 0); + Out_SOF : out std_logic_vector(PORTS - 1 downto 0); + Out_EOF : out std_logic_vector(PORTS - 1 downto 0); + Out_Ack : in std_logic_vector(PORTS - 1 downto 0) ); end entity; architecture rtl of stream_DeMux is - attribute KEEP : boolean; - attribute FSM_ENCODING : string; + attribute KEEP : boolean; + attribute FSM_ENCODING : string; subtype T_CHANNEL_INDEX is natural range 0 to PORTS - 1; - type T_STATE is (ST_IDLE, ST_DATAFLOW, ST_DISCARD_FRAME); + type T_STATE is (ST_IDLE, ST_DATAFLOW, ST_DISCARD_FRAME); - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; - signal Is_SOF : std_logic; - signal Is_EOF : std_logic; + signal Is_SOF : std_logic; + signal Is_EOF : std_logic; - signal In_Ack_i : std_logic; - signal Out_Valid_i : std_logic; - signal DiscardFrame : std_logic; + signal In_Ack_i : std_logic; + signal Out_Valid_i : std_logic; + signal DiscardFrame : std_logic; - signal ChannelPointer_rst : std_logic; - signal ChannelPointer_en : std_logic; - signal ChannelPointer : std_logic_vector(PORTS - 1 downto 0); - signal ChannelPointer_d : std_logic_vector(PORTS - 1 downto 0) := (others => '0'); + signal ChannelPointer_rst : std_logic; + signal ChannelPointer_en : std_logic; + signal ChannelPointer : std_logic_vector(PORTS - 1 downto 0); + signal ChannelPointer_d : std_logic_vector(PORTS - 1 downto 0) := (others => '0'); - signal ChannelPointer_bin : unsigned(log2ceilnz(PORTS) - 1 downto 0); - signal idx : T_CHANNEL_INDEX; + signal ChannelPointer_bin : unsigned(log2ceilnz(PORTS) - 1 downto 0); + signal idx : T_CHANNEL_INDEX; - signal Out_Data_i : T_SLM(PORTS - 1 downto 0, DATA_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal Out_Meta_i : T_SLM(PORTS - 1 downto 0, META_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal Out_Data_i : T_SLM(PORTS - 1 downto 0, DATA_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal Out_Meta_i : T_SLM(PORTS - 1 downto 0, META_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) begin - In_Ack_i <= slv_or(Out_Ack and ChannelPointer); - DiscardFrame <= slv_nor(DeMuxControl); + In_Ack_i <= slv_or(Out_Ack and ChannelPointer); + DiscardFrame <= slv_nor(DeMuxControl); - Is_SOF <= In_Valid and In_SOF; - Is_EOF <= In_Valid and In_EOF; + Is_SOF <= In_Valid and In_SOF; + Is_EOF <= In_Valid and In_EOF; process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; process(State, In_Ack_i, In_Valid, Is_SOF, Is_EOF, DiscardFrame, DeMuxControl, ChannelPointer_d) begin - NextState <= State; + NextState <= State; - ChannelPointer_rst <= Is_EOF; - ChannelPointer_en <= '0'; - ChannelPointer <= ChannelPointer_d; + ChannelPointer_rst <= Is_EOF; + ChannelPointer_en <= '0'; + ChannelPointer <= ChannelPointer_d; - In_Ack <= '0'; - Out_Valid_i <= '0'; + In_Ack <= '0'; + Out_Valid_i <= '0'; case State is when ST_IDLE => - ChannelPointer <= DeMuxControl; + ChannelPointer <= DeMuxControl; if (Is_SOF = '1') then if (DiscardFrame = '0') then - ChannelPointer_en <= '1'; - In_Ack <= In_Ack_i; - Out_Valid_i <= '1'; + ChannelPointer_en <= '1'; + In_Ack <= In_Ack_i; + Out_Valid_i <= '1'; - NextState <= ST_DATAFLOW; + NextState <= ST_DATAFLOW; else - In_Ack <= '1'; + In_Ack <= '1'; - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; end if; when ST_DATAFLOW => - In_Ack <= In_Ack_i; - Out_Valid_i <= In_Valid; - ChannelPointer <= ChannelPointer_d; + In_Ack <= In_Ack_i; + Out_Valid_i <= In_Valid; + ChannelPointer <= ChannelPointer_d; if (Is_EOF = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; when ST_DISCARD_FRAME => - In_Ack <= '1'; + In_Ack <= '1'; if (Is_EOF = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end case; end process; @@ -165,27 +165,27 @@ begin begin if rising_edge(Clock) then if ((Reset or ChannelPointer_rst) = '1') then - ChannelPointer_d <= (others => '0'); + ChannelPointer_d <= (others => '0'); elsif (ChannelPointer_en = '1') then - ChannelPointer_d <= DeMuxControl; + ChannelPointer_d <= DeMuxControl; end if; end if; end process; - ChannelPointer_bin <= onehot2bin(ChannelPointer_d); - idx <= to_integer(ChannelPointer_bin); + ChannelPointer_bin <= onehot2bin(ChannelPointer_d); + idx <= to_integer(ChannelPointer_bin); - In_Meta_rev <= get_row(Out_Meta_rev, idx); + In_Meta_rev <= get_row(Out_Meta_rev, idx); genOutput : for i in 0 to PORTS - 1 generate - Out_Valid(i) <= Out_Valid_i and ChannelPointer(i); + Out_Valid(i) <= Out_Valid_i and ChannelPointer(i); assign_row(Out_Data_i, In_Data, i); assign_row(Out_Meta_i, In_Meta, i); - Out_SOF(i) <= In_SOF; - Out_EOF(i) <= In_EOF; + Out_SOF(i) <= In_SOF; + Out_EOF(i) <= In_EOF; end generate; - Out_Data <= Out_Data_i; - Out_Meta <= Out_Meta_i; + Out_Data <= Out_Data_i; + Out_Meta <= Out_Meta_i; end architecture; diff --git a/src/bus/stream/stream_FIFO.vhdl b/src/bus/stream/stream_FIFO.vhdl index 740e7c5f0..259e53801 100644 --- a/src/bus/stream/stream_FIFO.vhdl +++ b/src/bus/stream/stream_FIFO.vhdl @@ -30,8 +30,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -43,8 +43,8 @@ entity stream_FIFO is FRAMES : positive := 2; DATA_BITS : positive := 8; DATA_FIFO_DEPTH : positive := 8; - META_BITS : T_POSVEC := (0 => 8); - META_FIFO_DEPTH : T_POSVEC := (0 => 16) + META_BITS : positive_vector := (0 => 8); + META_FIFO_DEPTH : positive_vector := (0 => 16) ); port ( Clock : in std_logic; @@ -179,30 +179,30 @@ begin DataFIFO: entity work.fifo_cc_got generic map ( - D_BITS => DATA_BITS + 1, -- Data Width + DATA_BITS => DATA_BITS + 1, -- Data Width MIN_DEPTH => (DATA_FIFO_DEPTH * FRAMES), -- Minimum FIFO Depth DATA_REG => ((DATA_FIFO_DEPTH * FRAMES) <= 128), -- Store Data Content in Registers STATE_REG => TRUE, -- Registered Full/Empty Indicators OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) port map ( -- Global Reset and Clock - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Writing Interface - put => DataFIFO_put, - din => DataFIFO_DataIn, - full => DataFIFO_Full, - estate_wr => open, + Put => DataFIFO_put, + DataIn => DataFIFO_DataIn, + Full => DataFIFO_Full, + EmptyState => open, -- Reading Interface - got => DataFIFO_got, - dout => DataFIFO_DataOut, - valid => DataFIFO_Valid, - fstate_rd => open + Got => DataFIFO_got, + DataOut => DataFIFO_DataOut, + Valid => DataFIFO_Valid, + FillState => open ); FrameCommit <= DataFIFO_Valid and DataFIFO_DataOut(EOF_BIT) and Out_Ack; @@ -282,33 +282,33 @@ begin MetaFIFO: entity work.fifo_cc_got_tempgot generic map ( - D_BITS => META_BITS(i), -- Data Width + DATA_BITS => META_BITS(i), -- Data Width MIN_DEPTH => (META_FIFO_DEPTH(i) * FRAMES), -- Minimum FIFO Depth DATA_REG => TRUE, -- Store Data Content in Registers STATE_REG => FALSE, -- Registered Full/Empty Indicators OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) port map ( -- Global Reset and Clock - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Writing Interface - put => MetaFIFO_put, - din => MetaFIFO_DataIn, - full => MetaFIFO_Full, - estate_wr => open, + Put => MetaFIFO_put, + DataIn => MetaFIFO_DataIn, + Full => MetaFIFO_Full, + EmptyState => open, -- Reading Interface - got => MetaFIFO_got, - dout => MetaFIFO_DataOut, - valid => MetaFIFO_Valid, - fstate_rd => open, + Got => MetaFIFO_got, + DataOut => MetaFIFO_DataOut, + Valid => MetaFIFO_Valid, + FillState => open, - commit => MetaFIFO_Commit, - rollback => MetaFIFO_Rollback + Commit => MetaFIFO_Commit, + Rollback => MetaFIFO_Rollback ); MetaFIFO_got <= Out_Meta_nxt(i); diff --git a/src/bus/stream/stream_FrameGenerator.vhdl b/src/bus/stream/stream_FrameGenerator.vhdl index 58c0fd962..435c0622d 100644 --- a/src/bus/stream/stream_FrameGenerator.vhdl +++ b/src/bus/stream/stream_FrameGenerator.vhdl @@ -27,8 +27,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use ieee.numeric_std.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; @@ -279,7 +279,7 @@ begin arith_gen : for i in 0 to N_arith -1 generate constant high : natural := ite(i = (N_arith -1), DATA_BITS -1, (i * 168) + 167); begin - PRNG : entity work.arith_prng + PRNG : entity work.arith_PRNG generic map ( BITS => ite(i = (N_arith -1), DATA_BITS -(i * 168), 168), SEED => std_logic_vector(unsigned'("110001100011101100101111110")+i) diff --git a/src/bus/stream/stream_Mirror.vhdl b/src/bus/stream/stream_Mirror.vhdl index cdfa31abb..04d5e47b2 100644 --- a/src/bus/stream/stream_Mirror.vhdl +++ b/src/bus/stream/stream_Mirror.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: A generic buffer module for the PoC.Stream protocol. +-- Entity: A generic buffer module for the PoC.Stream protocol. -- -- Description: -- ------------------------------------- @@ -11,13 +11,13 @@ -- ============================================================================= -- Copyright 2025 The PoC-Library Authors -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -27,40 +27,40 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -use work.config.all; -use work.utils.all; -use work.vectors.all; +use work.config.all; +use work.utils.all; +use work.vectors.all; entity stream_Mirror is generic ( PORTS : positive := 2; DATA_BITS : positive := 8; - META_BITS : T_POSVEC := (0 => 8); - META_LENGTH : T_POSVEC := (0 => 16) + META_BITS : positive_vector := (0 => 8); + META_LENGTH : positive_vector := (0 => 16) ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- IN Port - In_Valid : in std_logic; - In_Data : in std_logic_vector(DATA_BITS - 1 downto 0); - In_SOF : in std_logic; - In_EOF : in std_logic; + In_Valid : in std_logic; + In_Data : in std_logic_vector(DATA_BITS - 1 downto 0); + In_SOF : in std_logic; + In_EOF : in std_logic; In_Ack : out std_logic; In_Meta_rst : out std_logic; In_Meta_nxt : out std_logic_vector(META_BITS'length - 1 downto 0); - In_Meta_Data : in std_logic_vector(isum(META_BITS) - 1 downto 0); + In_Meta_Data : in std_logic_vector(isum(META_BITS) - 1 downto 0); -- OUT Port Out_Valid : out std_logic_vector(PORTS - 1 downto 0); Out_Data : out T_SLM(PORTS - 1 downto 0, DATA_BITS - 1 downto 0); Out_SOF : out std_logic_vector(PORTS - 1 downto 0); Out_EOF : out std_logic_vector(PORTS - 1 downto 0); - Out_Ack : in std_logic_vector(PORTS - 1 downto 0); - Out_Meta_rst : in std_logic_vector(PORTS - 1 downto 0); - Out_Meta_nxt : in T_SLM(PORTS - 1 downto 0, META_BITS'length - 1 downto 0); + Out_Ack : in std_logic_vector(PORTS - 1 downto 0); + Out_Meta_rst : in std_logic_vector(PORTS - 1 downto 0); + Out_Meta_nxt : in T_SLM(PORTS - 1 downto 0, META_BITS'length - 1 downto 0); Out_Meta_Data : out T_SLM(PORTS - 1 downto 0, isum(META_BITS) - 1 downto 0) ); end entity; @@ -93,25 +93,25 @@ begin In_Ack <= not FifoStage_Full; - FIFOstage : entity work.fifo_stage + FIFOstage : entity work.fifo_Stage generic map( - D_BITS => DATA_BITS + 2 -- Data Width + DATA_BITS => DATA_BITS + 2 -- Data Width ) port map ( -- Control - clk => Clock, -- Clock - rst => Reset, -- Synchronous Reset + Clock => Clock, -- Clock + Reset => Reset, -- Synchronous Reset -- Input - put => FifoStage_put, -- Put Value - di => FifoStage_DataIn, -- Data Input - ful => FifoStage_Full, -- Full + Put => FifoStage_put, -- Put Value + DataIn => FifoStage_DataIn, -- Data Input + Full => FifoStage_Full, -- Full -- Output - vld => FifoStage_Valid, -- Data Available - do => FifoStage_DataOut, -- Data Output - got => FifoStage_got -- Data Consumed + Valid => FifoStage_Valid, -- Data Available + DataOut => FifoStage_DataOut, -- Data Output + Got => FifoStage_got -- Data Consumed ); genPorts : for i in 0 to PORTS - 1 generate diff --git a/src/bus/stream/stream_Mux.vhdl b/src/bus/stream/stream_Mux.vhdl index 4a9792daf..db146249a 100644 --- a/src/bus/stream/stream_Mux.vhdl +++ b/src/bus/stream/stream_Mux.vhdl @@ -28,8 +28,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; diff --git a/src/bus/stream/stream_Source.vhdl b/src/bus/stream/stream_Source.vhdl index b968c1e9d..f865a194c 100644 --- a/src/bus/stream/stream_Source.vhdl +++ b/src/bus/stream/stream_Source.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: A generic buffer module for the PoC.Stream protocol. +-- Entity: A generic buffer module for the PoC.Stream protocol. -- -- Description: -- ------------------------------------- @@ -11,13 +11,13 @@ -- ============================================================================= -- Copyright 2025 The PoC-Library Authors -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -27,8 +27,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; @@ -38,46 +38,46 @@ use work.stream.all; entity stream_Source is generic ( - TESTCASES : T_SIM_STREAM_FRAMEGROUP_VECTOR_8 + TESTCASES : T_SIM_STREAM_FRAMEGROUP_VECTOR_8 ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- Control interface - Enable : in std_logic; + Enable : in std_logic; -- OUT Port - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic ); end entity; architecture rtl of stream_Source is - constant MAX_CYCLES : natural := 10 * 1000; - constant MAX_ERRORS : natural := 50; + constant MAX_CYCLES : natural := 10 * 1000; + constant MAX_ERRORS : natural := 50; -- dummy signals for iSIM - signal FrameGroupNumber_us : unsigned(log2ceilnz(TESTCASES'length) - 1 downto 0) := (others => '0'); + signal FrameGroupNumber_us : unsigned(log2ceilnz(TESTCASES'length) - 1 downto 0) := (others => '0'); begin process - variable Cycles : natural := 0; - variable Errors : natural := 0; + variable Cycles : natural := 0; + variable Errors : natural := 0; - variable FrameGroupNumber : natural := 0; + variable FrameGroupNumber : natural := 0; - variable WordIndex : natural := 0; - variable CurFG : T_SIM_STREAM_FRAMEGROUP_8; + variable WordIndex : natural := 0; + variable CurFG : T_SIM_STREAM_FRAMEGROUP_8; begin -- set interface to default values - Out_Valid <= '0'; - Out_Data <= (others => 'U'); - Out_SOF <= '0'; - Out_EOF <= '0'; + Out_Valid <= '0'; + Out_Data <= (others => 'U'); + Out_SOF <= '0'; + Out_EOF <= '0'; -- wait for global enable signal wait until (Enable = '1'); @@ -88,42 +88,42 @@ begin -- for each testcase in list for TestcaseIndex in 0 to TESTCASES'length - 1 loop -- initialize per loop - Cycles := 0; - Errors := 0; - CurFG := TESTCASES(TestcaseIndex); + Cycles := 0; + Errors := 0; + CurFG := TESTCASES(TestcaseIndex); -- continue with next frame if current is disabled assert FALSE report "active=" & to_string(CurFG.Active) severity WARNING; next when CurFG.Active = FALSE; -- write dummy signals for iSIM - FrameGroupNumber := TestcaseIndex; - FrameGroupNumber_us <= to_unsigned(FrameGroupNumber, FrameGroupNumber_us'length); + FrameGroupNumber := TestcaseIndex; + FrameGroupNumber_us <= to_unsigned(FrameGroupNumber, FrameGroupNumber_us'length); -- PrePause for i in 1 to CurFG.PrePause loop wait until rising_edge(Clock); end loop; - WordIndex := 0; + WordIndex := 0; -- infinite loop loop -- check for to many simulation cycles assert (Cycles < MAX_CYCLES) report "MAX_CYCLES reached: framegroup=" & integer'image(to_integer(FrameGroupNumber_us)) severity FAILURE; --- assert (Errors < MAX_ERRORS) report "MAX_ERRORS reached" severity FAILURE; +-- assert (Errors < MAX_ERRORS) report "MAX_ERRORS reached" severity FAILURE; Cycles := Cycles + 1; wait until rising_edge(Clock); -- write frame data to interface - Out_Valid <= CurFG.Data(WordIndex).Valid; - Out_Data <= CurFG.Data(WordIndex).Data; - Out_SOF <= CurFG.Data(WordIndex).SOF; - Out_EOF <= CurFG.Data(WordIndex).EOF; + Out_Valid <= CurFG.Data(WordIndex).Valid; + Out_Data <= CurFG.Data(WordIndex).Data; + Out_SOF <= CurFG.Data(WordIndex).SOF; + Out_EOF <= CurFG.Data(WordIndex).EOF; wait until falling_edge(Clock); -- go to next word if interface counterpart has accepted the current word - if (Out_Ack = '1') then + if (Out_Ack = '1') then WordIndex := WordIndex + 1; end if; @@ -142,10 +142,10 @@ begin -- set interface to default values wait until rising_edge(Clock); - Out_Valid <= '0'; - Out_Data <= (others => 'U'); - Out_SOF <= '0'; - Out_EOF <= '0'; + Out_Valid <= '0'; + Out_Data <= (others => 'U'); + Out_SOF <= '0'; + Out_EOF <= '0'; end process; end architecture; diff --git a/src/bus/wb/README.md b/src/bus/wb/README.md index 990c1ad3f..7fd746db4 100644 --- a/src/bus/wb/README.md +++ b/src/bus/wb/README.md @@ -1,11 +1,11 @@ # Namespace `PoC.bus.wb` -The namespace `PoC.bus.wb` offers different modules for the -[WISHBONE][wishbone] bus from [OpenCores.org][opencores]. +The namespace `PoC.bus.wb` offers different modules for the [WISHBONE][wishbone] bus from [OpenCores.org][opencores]. [wishbone]: http://opencores.org/opencores,wishbone [opencores]: http://opencores.org/ + diff --git a/src/cache/README.md b/src/cache/README.md index 7974f4e21..ed8df9f64 100644 --- a/src/cache/README.md +++ b/src/cache/README.md @@ -10,23 +10,23 @@ namespace as well as public constants and functions. ## Entities - - [`cache_cpu`][cache_cpu] - - [`cache_mem`][cache_mem] - - [`cache_par`][cache_par] - - [`cache_par2`][cache_par2] + - [`cache_CPU`][cache_CPU] + - [`cache_Memory`][cache_Memory] + - [`cache_Parallel`][cache_Parallel] + - [`cache_Parallel2`][cache_Parallel2] - [`cache_replacement_policy`][cache_replacement_policy] - - [`cache_tagunit_par`][cache_tagunit_par] - - [`cache_tagunit_seq`][cache_tagunit_seq] + - [`cache_TagUnit_Parallel`][cache_TagUnit_Parallel] + - [`cache_TagUnit_Sequential`][cache_TagUnit_Sequential] Read detailed documentation on [ReadTheDocs](http://poc-library.readthedocs.io/en/latest/PoC/cache/index.html). [cache.pkg]: cache.pkg.vhdl -[cache_cpu]: cache_cpu.vhdl -[cache_mem]: cache_mem.vhdl -[cache_par]: cache_par.vhdl -[cache_par2]: cache_par2.vhdl +[cache_CPU]: cache_CPU.vhdl +[cache_Memory]: cache_Memory.vhdl +[cache_Parallel]: cache_Parallel.vhdl +[cache_Parallel2]: cache_Parallel2.vhdl [cache_replacement_policy]: cache_replacement_policy.vhdl -[cache_tagunit_par]: cache_tagunit_par.vhdl -[cache_tagunit_seq]: cache_tagunit_seq.vhdl +[cache_TagUnit_Parallel]: cache_TagUnit_Parallel.vhdl +[cache_TagUnit_Sequential]: cache_TagUnit_Sequential.vhdl diff --git a/src/cache/cache.pro b/src/cache/build.pro similarity index 80% rename from src/cache/cache.pro rename to src/cache/build.pro index 0034da617..4fb8afcd9 100644 --- a/src/cache/cache.pro +++ b/src/cache/build.pro @@ -21,11 +21,11 @@ # ============================================================================= analyze cache.pkg.vhdl -analyze cache_replacement_policy.vhdl -analyze cache_tagunit_seq.vhdl -analyze cache_tagunit_par.vhdl -analyze cache_par2.vhdl -analyze cache_cpu.vhdl -analyze cache_mem.vhdl -analyze cache_par.vhdl +analyze cache_ReplacementPolicy.vhdl +analyze cache_TagUnit_Sequential.vhdl +analyze cache_TagUnit_Parallel.vhdl +analyze cache_Parallel.vhdl +analyze cache_Parallel2.vhdl +analyze cache_CPU.vhdl +analyze cache_Memory.vhdl diff --git a/src/cache/cache.pkg.vhdl b/src/cache/cache.pkg.vhdl index eaa30eaea..a96fca938 100644 --- a/src/cache/cache.pkg.vhdl +++ b/src/cache/cache.pkg.vhdl @@ -1,22 +1,22 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Package: Cache functions and types +-- Package: Cache functions and types -- -- Description: -- ------------------------------------- --- For detailed documentation see below. +-- For detailed documentation see below. -- -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -25,13 +25,13 @@ -- limitations under the License. -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; package cache is -- cache-lookup Result - type T_CACHE_RESULT is (CACHE_RESULT_NONE, CACHE_RESULT_HIT, CACHE_RESULT_MISS); + type T_CACHE_RESULT is (CACHE_RESULT_NONE, CACHE_RESULT_HIT, CACHE_RESULT_MISS); function to_Cache_Result(CacheHit : std_logic; CacheMiss : std_logic) return T_CACHE_RESULT; diff --git a/src/cache/cache_cpu.vhdl b/src/cache/cache_CPU.vhdl similarity index 74% rename from src/cache/cache_cpu.vhdl rename to src/cache/cache_CPU.vhdl index 17cf0fb65..9e3ae4a2a 100644 --- a/src/cache/cache_cpu.vhdl +++ b/src/cache/cache_CPU.vhdl @@ -5,7 +5,7 @@ -- -- Description: -- ------------------------------------- --- This unit provides a cache (:ref:`IP:cache_par2`) together +-- This unit provides a cache (:ref:`IP:cache_Parallel2`) together -- with a cache controller which reads / writes cache lines from / to memory. -- The memory is accessed using a :ref:`INT:PoC.Mem` interfaces, the related -- ports and parameters are prefixed with ``mem_``. @@ -35,11 +35,11 @@ -- unintentionally executing the cache access twice or missing the read data. -- -- Of course, the EX/LS1 pipeline register can be omitted and the CPU side --- directly fed by the address caculator. But be aware of the high setup time --- of this unit and high propate time for ``cpu_got``. +-- directly fed by the address calculator. But be aware of the high setup time +-- of this unit and high propagate time for ``cpu_got``. -- -- This unit supports only one outstanding CPU request. More outstanding --- requests are provided by :ref:`IP:cache_mem`. +-- requests are provided by :ref:`IP:cache_Memory`. -- -- -- Configuration @@ -142,18 +142,18 @@ -- option "Keep Hierarchy" must be set to SOFT or TRUE. -- -- SeeAlso: --- :ref:`IP:cache_mem` +-- :ref:`IP:cache_Memory` -- -- License: -- ============================================================================= -- Copyright 2016-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -162,15 +162,15 @@ -- limitations under the License. -- ============================================================================= -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -use work.utils.all; +use work.utils.all; -entity cache_cpu is +entity cache_CPU is generic ( - REPLACEMENT_POLICY : string := "LRU"; + REPLACEMENT_POLICY : string := "LRU"; CACHE_LINES : positive; ASSOCIATIVITY : positive; CPU_DATA_BITS : positive; @@ -178,31 +178,31 @@ entity cache_cpu is MEM_DATA_BITS : positive ); port ( - clk : in std_logic; -- clock - rst : in std_logic; -- reset - - -- "CPU" side - cpu_req : in std_logic; - cpu_write : in std_logic; - cpu_addr : in unsigned(log2ceil(MEM_DATA_BITS/CPU_DATA_BITS)+MEM_ADDR_BITS-1 downto 0); - cpu_wdata : in std_logic_vector(CPU_DATA_BITS-1 downto 0); - cpu_wmask : in std_logic_vector(CPU_DATA_BITS/8-1 downto 0); - cpu_got : out std_logic; - cpu_rdata : out std_logic_vector(CPU_DATA_BITS-1 downto 0); + Clock : in std_logic; + Reset : in std_logic; + + -- "CPU" side + cpu_Request : in std_logic; + cpu_Write : in std_logic; + cpu_Address : in unsigned(log2ceil(MEM_DATA_BITS/CPU_DATA_BITS)+MEM_ADDR_BITS-1 downto 0); + cpu_WriteData : in std_logic_vector(CPU_DATA_BITS-1 downto 0); + cpu_WriteMask : in std_logic_vector(CPU_DATA_BITS/8-1 downto 0); + cpu_Got : out std_logic; + cpu_ReadData : out std_logic_vector(CPU_DATA_BITS-1 downto 0); -- Memory side - mem_req : out std_logic; - mem_write : out std_logic; - mem_addr : out unsigned(MEM_ADDR_BITS-1 downto 0); - mem_wdata : out std_logic_vector(MEM_DATA_BITS-1 downto 0); - mem_wmask : out std_logic_vector(MEM_DATA_BITS/8-1 downto 0); - mem_rdy : in std_logic; - mem_rstb : in std_logic; - mem_rdata : in std_logic_vector(MEM_DATA_BITS-1 downto 0) - ); + mem_Request : out std_logic; + mem_Write : out std_logic; + mem_Address : out unsigned(MEM_ADDR_BITS-1 downto 0); + mem_WriteData : out std_logic_vector(MEM_DATA_BITS-1 downto 0); + mem_WriteMask : out std_logic_vector(MEM_DATA_BITS/8-1 downto 0); + mem_Ready : in std_logic; + mem_ReadStrobe : in std_logic; + mem_ReadData : in std_logic_vector(MEM_DATA_BITS-1 downto 0) + ); end entity; -architecture rtl of cache_cpu is +architecture rtl of cache_CPU is -- Ratio 1:n between CPU data bus and cache-line size (memory data bus) constant RATIO : positive := MEM_DATA_BITS/CPU_DATA_BITS; @@ -214,39 +214,39 @@ architecture rtl of cache_cpu is signal cpu_wmask_wide : std_logic_vector(MEM_DATA_BITS/8-1 downto 0); -- Interface to Cache instance. - signal cache_Request : std_logic; - signal cache_ReadWrite : std_logic; - signal cache_Writemask : std_logic_vector(MEM_DATA_BITS/8-1 downto 0); + signal cache_Request : std_logic; + signal cache_ReadWrite : std_logic; + signal cache_Writemask : std_logic_vector(MEM_DATA_BITS/8-1 downto 0); signal cache_Invalidate : std_logic; - signal cache_Replace : std_logic; - signal cache_Address : std_logic_vector(MEM_ADDR_BITS-1 downto 0); - signal cache_LineIn : std_logic_vector(MEM_DATA_BITS-1 downto 0); - signal cache_LineOut : std_logic_vector(MEM_DATA_BITS-1 downto 0); - signal cache_Hit : std_logic; - signal cache_Miss : std_logic; - - -- FSM and other state registers - type T_FSM is (READY, ACCESS_MEM, READING_MEM, UNKNOWN); - signal fsm_cs : T_FSM -- current state + signal cache_Replace : std_logic; + signal cache_Address : std_logic_vector(MEM_ADDR_BITS-1 downto 0); + signal cache_LineIn : std_logic_vector(MEM_DATA_BITS-1 downto 0); + signal cache_LineOut : std_logic_vector(MEM_DATA_BITS-1 downto 0); + signal cache_Hit : std_logic; + signal cache_Miss : std_logic; + + -- FSM and other state registers + type T_FSM is (READY, ACCESS_MEM, READING_MEM, UNKNOWN); + signal fsm_cs : T_FSM -- current state -- synthesis translate_off := UNKNOWN -- synthesis translate_on ; - signal fsm_ns : T_FSM;-- next state + signal fsm_ns : T_FSM;-- next state begin -- architecture rtl - cache_inst: entity work.cache_par2 - generic map ( + cache_inst: entity work.cache_Parallel2 + generic map ( REPLACEMENT_POLICY => REPLACEMENT_POLICY, CACHE_LINES => CACHE_LINES, ASSOCIATIVITY => ASSOCIATIVITY, ADDR_BITS => MEM_ADDR_BITS, DATA_BITS => MEM_DATA_BITS, HIT_MISS_REG => false) - port map ( - Clock => clk, - Reset => rst, + port map ( + Clock => Clock, + Reset => Reset, Request => cache_Request, ReadWrite => cache_ReadWrite, WriteMask => cache_WriteMask, @@ -259,12 +259,12 @@ begin -- architecture rtl CacheMiss => cache_Miss, OldAddress => open); - -- Address and Data path - -- =========================================================================== + -- Address and Data path + -- =========================================================================== gEqual: if RATIO = 1 generate -- Cache line size equals CPU data bus size - cpu_wdata_wide <= cpu_wdata; - cpu_wmask_wide <= cpu_wmask; - cpu_rdata <= cache_LineOut; + cpu_wdata_wide <= cpu_WriteData; + cpu_wmask_wide <= cpu_WriteMask; + cpu_ReadData <= cache_LineOut; end generate gEqual; gWider: if RATIO > 1 generate -- Cache line size is greater than CPU data bus size @@ -274,27 +274,27 @@ begin -- architecture rtl signal cache_LineOut_array : T_ARRAY; begin -- CPU Request Data Path - lower_addr <= cpu_addr(LOWER_ADDR_BITS-1 downto 0); + lower_addr <= cpu_Address(LOWER_ADDR_BITS-1 downto 0); l0: for i in 0 to RATIO-1 generate - cpu_wdata_wide((i+1)*CPU_DATA_BITS-1 downto i*CPU_DATA_BITS) <= cpu_wdata; + cpu_wdata_wide((i+1)*CPU_DATA_BITS-1 downto i*CPU_DATA_BITS) <= cpu_WriteData; cpu_wmask_wide((i+1)*CPU_DATA_BITS/8-1 downto i*CPU_DATA_BITS/8) <= -- synthesis translate_off (others => 'X') when is_x(lower_addr) else -- synthesis translate_on - cpu_wmask when to_integer(lower_addr) = i else + cpu_WriteMask when to_integer(lower_addr) = i else (others => '1'); end generate l0; -- CPU Reply Data Path - lower_addr_r <= lower_addr when rising_edge(clk); -- pipeline register + lower_addr_r <= lower_addr when rising_edge(Clock); -- pipeline register l1: for i in 0 to RATIO-1 generate cache_LineOut_array(i) <= cache_LineOut((i+1)*CPU_DATA_BITS-1 downto i*CPU_DATA_BITS); end generate l1; - cpu_rdata <= + cpu_ReadData <= -- synthesis translate_off (others => 'X') when is_x(lower_addr_r) else -- synthesis translate_on @@ -302,81 +302,81 @@ begin -- architecture rtl end generate gWider; -- Cache Request Data Path - cache_Address <= std_logic_vector(cpu_addr(cpu_addr'left downto LOWER_ADDR_BITS)); - cache_LineIn <= mem_rdata when fsm_cs = READING_MEM else cpu_wdata_wide; + cache_Address <= std_logic_vector(cpu_Address(cpu_Address'left downto LOWER_ADDR_BITS)); + cache_LineIn <= mem_ReadData when fsm_cs = READING_MEM else cpu_wdata_wide; cache_WriteMask <= (others => '0') when fsm_cs = READING_MEM else cpu_wmask_wide; -- These outputs can be fed from buffer registers, but this is not -- neccessary because the cpu_* signals will typically be connected to a -- pipeline register. And even if this pipeline register is omitted, then the -- cache tag comparison will dominate the critical path. - mem_write <= cpu_write; - mem_addr <= cpu_addr(cpu_addr'left downto LOWER_ADDR_BITS); - mem_wdata <= cpu_wdata_wide; - mem_wmask <= cpu_wmask_wide; + mem_Write <= cpu_Write; + mem_Address <= cpu_Address(cpu_Address'left downto LOWER_ADDR_BITS); + mem_WriteData <= cpu_wdata_wide; + mem_WriteMask <= cpu_wmask_wide; -- FSM -- =========================================================================== - process(fsm_cs, cpu_req, cpu_write, cache_Hit, cache_Miss, mem_rdy, mem_rstb) + process(fsm_cs, cpu_Request, cpu_Write, cache_Hit, cache_Miss, mem_Ready, mem_ReadStrobe) begin -- Update state registers fsm_ns <= fsm_cs; -- Control signals for cache access - cache_Request <= '0'; - cache_ReadWrite <= '-'; + cache_Request <= '0'; + cache_ReadWrite <= '-'; cache_Invalidate <= '-'; - cache_Replace <= '0'; + cache_Replace <= '0'; -- Control / status signals for CPU and MEM side - cpu_got <= '0'; - mem_req <= '0'; + cpu_Got <= '0'; + mem_Request <= '0'; case fsm_cs is when READY => -- Ready for a new cache access. -- ----------------------------- - cache_Request <= to_x01(cpu_req); - cache_ReadWrite <= to_x01(cpu_write); -- doesn't care if no request + cache_Request <= to_x01(cpu_Request); + cache_ReadWrite <= to_x01(cpu_Write); -- doesn't care if no request cache_Invalidate <= '0'; - case ((cache_Hit and cpu_write) or cache_Miss) is - when '1' => -- write successfull but write-through, or cache miss + case ((cache_Hit and cpu_Write) or cache_Miss) is + when '1' => -- write successfull but write-through, or cache miss fsm_ns <= ACCESS_MEM; when '0' => -- read successfull, or no request - cpu_got <= to_x01(cpu_req); + cpu_Got <= to_x01(cpu_Request); when others => -- invalid input fsm_ns <= UNKNOWN; - cpu_got <= 'X'; + cpu_Got <= 'X'; end case; when ACCESS_MEM => -- Access memory. -- -------------- - mem_req <= '1'; - case to_x01(mem_rdy) is + mem_Request <= '1'; + case to_x01(mem_Ready) is when '1' => -- access granted - case to_x01(cpu_write) is - when '1' => fsm_ns <= READY; cpu_got <= '1'; -- write + case to_x01(cpu_Write) is + when '1' => fsm_ns <= READY; cpu_Got <= '1'; -- write when '0' => fsm_ns <= READING_MEM; -- read - when others => fsm_ns <= UNKNOWN; cpu_got <= 'X'; -- invalid input + when others => fsm_ns <= UNKNOWN; cpu_Got <= 'X'; -- invalid input end case; - when '0' => null; -- still waiting + when '0' => null; -- still waiting when others => fsm_ns <= UNKNOWN; -- invalid input end case; - when READING_MEM => - -- Wait for incoming read data and write it to cache. + when READING_MEM => + -- Wait for incoming read data and write it to cache. -- -------------------------------------------------- cache_ReadWrite <= '1'; - case to_x01(mem_rstb) is + case to_x01(mem_ReadStrobe) is when '1' => -- read data available fsm_ns <= READY; - cpu_got <= '1'; -- cache access is complete now + cpu_Got <= '1'; -- cache access is complete now cache_Replace <= '1'; -- replace cache line -- The new data will be available on cache_LineOut in the following -- clock cycle. @@ -384,7 +384,7 @@ begin -- architecture rtl when '0' => null;-- still waiting when others => -- invalid input fsm_ns <= UNKNOWN; - cpu_got <= 'X'; + cpu_Got <= 'X'; cache_Replace <= 'X'; end case; @@ -393,18 +393,18 @@ begin -- architecture rtl -- Catches invalid state transitions. -- ---------------------------------- fsm_ns <= UNKNOWN; - cpu_got <= 'X'; + cpu_Got <= 'X'; cache_Request <= 'X'; - cache_ReadWrite <= 'X'; + cache_ReadWrite <= 'X'; cache_Invalidate <= 'X'; cache_Replace <= 'X'; end case; end process; - process(clk) + process(Clock) begin - if rising_edge(clk) then - case to_x01(rst) is + if rising_edge(Clock) then + case to_x01(Reset) is when '1' => fsm_cs <= READY; when '0' => @@ -415,4 +415,4 @@ begin -- architecture rtl end if; end process; -end architecture rtl; +end architecture; diff --git a/src/cache/cache_mem.vhdl b/src/cache/cache_Memory.vhdl similarity index 78% rename from src/cache/cache_mem.vhdl rename to src/cache/cache_Memory.vhdl index 7989243ed..be522a169 100644 --- a/src/cache/cache_mem.vhdl +++ b/src/cache/cache_Memory.vhdl @@ -5,7 +5,7 @@ -- -- Description: -- ------------------------------------- --- This unit provides a cache (:ref:`IP:cache_par2`) together +-- This unit provides a cache (:ref:`IP:cache_Parallel2`) together -- with a cache controller which reads / writes cache lines from / to memory. -- It has two :ref:`INT:PoC.Mem` interfaces: -- @@ -14,7 +14,7 @@ -- -- Thus, this unit can be placed into an already available memory path between -- the CPU and the memory (controller). If you want to plugin a cache into a --- CPU pipeline, see :ref:`IP:cache_cpu`. +-- CPU pipeline, see :ref:`IP:cache_CPU`. -- -- -- Configuration @@ -63,7 +63,7 @@ -- critical path (clock-to-output delay) for ``cpu_rdy``, the throughput is -- degraded to one request per 2 clock cycles at maximum. -- --- * 2: then 2 requests are buffered by :ref:`IP:fifo_stage`. This setting has +-- * 2: then 2 requests are buffered by :ref:`IP:fifo_Stage`. This setting has -- the lowest area requirements without degrading the performance. -- -- * >2: then the requests are buffered by :ref:`IP:fifo_cc_got`. The number of @@ -102,19 +102,19 @@ -- option "Keep Hierarchy" must be set to SOFT or TRUE. -- -- SeeAlso: --- :ref:`IP:cache_cpu` +-- :ref:`IP:cache_CPU` -- -- License: -- ============================================================================= -- Copyright 2025 The PoC-Library Authors -- Copyright 2016-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -123,15 +123,15 @@ -- limitations under the License. -- ============================================================================= -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -use work.utils.all; +use work.utils.all; -entity cache_mem is +entity cache_Memory is generic ( - REPLACEMENT_POLICY : string := "LRU"; + REPLACEMENT_POLICY : string := "LRU"; CACHE_LINES : positive; ASSOCIATIVITY : positive; CPU_DATA_BITS : positive; @@ -140,8 +140,8 @@ entity cache_mem is OUTSTANDING_REQ : positive := 2 ); port ( - clk : in std_logic; -- clock - rst : in std_logic; -- reset + Clock : in std_logic; -- clock + Reset : in std_logic; -- reset -- "CPU" side cpu_req : in std_logic; @@ -162,13 +162,13 @@ entity cache_mem is mem_rdy : in std_logic; mem_rstb : in std_logic; mem_rdata : in std_logic_vector(MEM_DATA_BITS-1 downto 0) - ); + ); end entity; -architecture rtl of cache_mem is +architecture rtl of cache_Memory is constant CPU_ADDR_BITS : positive := log2ceil(MEM_DATA_BITS/CPU_DATA_BITS)+MEM_ADDR_BITS; - -- signals to internal cache_cpu + -- signals to internal cache_CPU signal int_req : std_logic; signal int_write : std_logic; signal int_addr : unsigned(CPU_ADDR_BITS-1 downto 0); @@ -179,7 +179,7 @@ architecture rtl of cache_mem is begin - cache_cpu_inst: entity work.cache_cpu + cache_CPU_inst: entity work.cache_CPU generic map ( REPLACEMENT_POLICY => REPLACEMENT_POLICY, CACHE_LINES => CACHE_LINES, @@ -188,47 +188,47 @@ begin MEM_ADDR_BITS => MEM_ADDR_BITS, MEM_DATA_BITS => MEM_DATA_BITS) port map ( - clk => clk, - rst => rst, - cpu_req => int_req, - cpu_write => int_write, - cpu_addr => int_addr, - cpu_wdata => int_wdata, - cpu_wmask => int_wmask, - cpu_got => int_got, - cpu_rdata => int_rdata, - mem_req => mem_req, - mem_write => mem_write, - mem_addr => mem_addr, - mem_wdata => mem_wdata, - mem_wmask => mem_wmask, - mem_rdy => mem_rdy, - mem_rstb => mem_rstb, - mem_rdata => mem_rdata); + Clock => Clock, + Reset => Reset, + cpu_Request => int_req, + cpu_Write => int_write, + cpu_Address => int_addr, + cpu_WriteData => int_wdata, + cpu_WriteMask => int_wmask, + cpu_Got => int_got, + cpu_ReadData => int_rdata, + mem_Request => mem_req, + mem_Write => mem_write, + mem_Address => mem_addr, + mem_WriteData => mem_wdata, + mem_WriteMask => mem_wmask, + mem_Ready => mem_rdy, + mem_ReadStrobe => mem_rstb, + mem_ReadData => mem_rdata); -- read data is valid one clock cycle after int_got is asserted - cpu_rstb <= (not rst) and (not int_write) and int_got when rising_edge(clk); + cpu_rstb <= (not Reset) and (not int_write) and int_got when rising_edge(Clock); cpu_rdata <= int_rdata; -- already delayed by one clock cycle ------------------------------------------------------------------------------ g1: if OUTSTANDING_REQ = 1 generate - signal cpu_req_r : std_logic; - signal cpu_write_r : std_logic; - signal cpu_addr_r : unsigned(CPU_ADDR_BITS-1 downto 0); - signal cpu_wdata_r : std_logic_vector(CPU_DATA_BITS-1 downto 0); - signal cpu_wmask_r : std_logic_vector(CPU_DATA_BITS/8-1 downto 0); - signal cpu_rdy_r : std_logic; - signal cpu_rstb_r : std_logic; - signal cpu_rdata_r : std_logic_vector(CPU_DATA_BITS-1 downto 0); + signal cpu_req_r : std_logic; + signal cpu_write_r : std_logic; + signal cpu_addr_r : unsigned(CPU_ADDR_BITS-1 downto 0); + signal cpu_wdata_r : std_logic_vector(CPU_DATA_BITS-1 downto 0); + signal cpu_wmask_r : std_logic_vector(CPU_DATA_BITS/8-1 downto 0); + signal cpu_rdy_r : std_logic; + signal cpu_rstb_r : std_logic; + signal cpu_rdata_r : std_logic_vector(CPU_DATA_BITS-1 downto 0); begin -- cpu_rdy should have a short clock-to-output delay, but int_got has a large -- propagation delay. Thus, do not depend cpu_rdy and int_got. -- This single entry FIFO stores a valid request if cpu_req_r = '1', -- otherwise it is empty. - process(clk) + process(Clock) begin - if rising_edge(clk) then + if rising_edge(Clock) then -- store new request only if FIFO is empty case to_x01(cpu_req_r) is when '1' => null; -- FIFO is full @@ -246,9 +246,9 @@ begin end case; -- FIFO state logic - case to_x01(rst) is + case to_x01(Reset) is when '1' => cpu_req_r <= '0'; - when '0' => cpu_req_r <= + when '0' => cpu_req_r <= (cpu_req_r and not int_got) or -- keep if not yet acknowledged (not cpu_req_r and cpu_req); -- or new request when empty when others => cpu_req_r <= 'X'; @@ -270,24 +270,24 @@ begin g2: if OUTSTANDING_REQ = 2 generate constant D_BITS : positive := CPU_DATA_BITS/8+CPU_DATA_BITS+CPU_ADDR_BITS+1; - signal put : std_logic; - signal din : std_logic_vector(D_BITS-1 downto 0); - signal full : std_logic; - signal valid : std_logic; - signal dout : std_logic_vector(D_BITS-1 downto 0); + signal put : std_logic; + signal din : std_logic_vector(D_BITS-1 downto 0); + signal full : std_logic; + signal valid : std_logic; + signal dout : std_logic_vector(D_BITS-1 downto 0); begin - req_fifo: entity work.fifo_stage + req_fifo: entity work.fifo_Stage generic map ( - D_BITS => D_BITS) + DATA_BITS => D_BITS) port map ( - clk => clk, - rst => rst, - put => put, - di => din, - ful => full, - vld => valid, - do => dout, - got => int_got); + Clock => Clock, + Reset => Reset, + Put => put, + DataIn => din, + Full => full, + Valid => valid, + DataOut => dout, + Got => int_got); din <= cpu_wmask & cpu_wdata & std_logic_vector(cpu_addr) & (0 downto 0 => cpu_write); put <= cpu_req; @@ -306,30 +306,30 @@ begin gt2: if OUTSTANDING_REQ > 2 generate constant D_BITS : positive := CPU_DATA_BITS/8+CPU_DATA_BITS+CPU_ADDR_BITS+1; - signal put : std_logic; - signal din : std_logic_vector(D_BITS-1 downto 0); - signal full : std_logic; - signal valid : std_logic; - signal dout : std_logic_vector(D_BITS-1 downto 0); + signal put : std_logic; + signal din : std_logic_vector(D_BITS-1 downto 0); + signal full : std_logic; + signal valid : std_logic; + signal dout : std_logic_vector(D_BITS-1 downto 0); begin req_fifo: entity work.fifo_cc_got - generic map ( - D_BITS => D_BITS, - MIN_DEPTH => OUTSTANDING_REQ, - DATA_REG => false, -- otherwise OUTPUT_REG has no effect - STATE_REG => true, - OUTPUT_REG => true) -- extra register required for optimal synthesis on Altera FPGAs - port map ( - rst => rst, - clk => clk, - put => put, - din => din, - full => full, - estate_wr => open, - got => int_got, - dout => dout, - valid => valid, - fstate_rd => open); + generic map ( + DATA_BITS => D_BITS, + MIN_DEPTH => OUTSTANDING_REQ, + DATA_REG => false, -- otherwise OUTPUT_REG has no effect + STATE_REG => true, + OUTPUT_REG => true) -- extra register required for optimal synthesis on Altera FPGAs + port map ( + Reset => Reset, + Clock => Clock, + Put => put, + DataIn => din, + Full => full, + EmptyState => open, + Got => int_got, + DataOut => dout, + Valid => valid, + FillState => open); din <= cpu_wmask & cpu_wdata & std_logic_vector(cpu_addr) & (0 downto 0 => cpu_write); put <= cpu_req; diff --git a/src/cache/cache_par.vhdl b/src/cache/cache_Parallel.vhdl similarity index 73% rename from src/cache/cache_par.vhdl rename to src/cache/cache_Parallel.vhdl index 400a24ee9..33d3d9266 100644 --- a/src/cache/cache_par.vhdl +++ b/src/cache/cache_Parallel.vhdl @@ -13,7 +13,7 @@ -- is, upon writes the old-data is returned on the read output. Such memory -- (e.g. LUT-RAM) is not available on all devices. Thus, synthesis may -- infer a lot of flip-flops plus multiplexers instead, which is very inefficient. --- It is recommended to use :doc:`PoC.cache.par2 ` instead which has a +-- It is recommended to use :doc:`PoC.cache.par2 ` instead which has a -- slightly different interface. -- -- All inputs are synchronous to the rising-edge of the clock `clock`. @@ -46,11 +46,11 @@ -- latency of one clock cycle. -- -- Upon writing a cache line, the new content is given by ``CacheLineIn``. --- Upon reading a cache line, the current content is outputed on ``CacheLineOut`` +-- Upon reading a cache line, the current content is outputted on ``CacheLineOut`` -- with a latency of one clock cycle. -- -- Upon replacing a cache line, the new content is given by ``CacheLineIn``. The --- old content is outputed on ``CacheLineOut`` and the old tag on ``OldAddress``, +-- old content is outputted on ``CacheLineOut`` and the old tag on ``OldAddress``, -- both with a latency of one clock cycle. -- -- .. WARNING:: @@ -61,13 +61,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -77,41 +77,41 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; -entity cache_par is +entity cache_Parallel is generic ( - REPLACEMENT_POLICY : string := "LRU"; - CACHE_LINES : positive := 32;--1024; - ASSOCIATIVITY : positive := 32;--4; - ADDRESS_BITS : positive := 8; --32-6; - DATA_BITS : positive := 8 --64*8 + REPLACEMENT_POLICY : string := "LRU"; + CACHE_LINES : positive := 32;--1024; + ASSOCIATIVITY : positive := 32;--4; + ADDRESS_BITS : positive := 8; --32-6; + DATA_BITS : positive := 8 --64*8 ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - Request : in std_logic; - ReadWrite : in std_logic; - Invalidate : in std_logic; - Replace : in std_logic; - Address : in std_logic_vector(ADDRESS_BITS - 1 downto 0); + Request : in std_logic; + ReadWrite : in std_logic; + Invalidate : in std_logic; + Replace : in std_logic; + Address : in std_logic_vector(ADDRESS_BITS - 1 downto 0); - CacheLineIn : in std_logic_vector(DATA_BITS - 1 downto 0); + CacheLineIn : in std_logic_vector(DATA_BITS - 1 downto 0); CacheLineOut : out std_logic_vector(DATA_BITS - 1 downto 0); - CacheHit : out std_logic := '0'; - CacheMiss : out std_logic := '0'; - OldAddress : out std_logic_vector(ADDRESS_BITS - 1 downto 0) + CacheHit : out std_logic := '0'; + CacheMiss : out std_logic := '0'; + OldAddress : out std_logic_vector(ADDRESS_BITS - 1 downto 0) ); end entity; -architecture rtl of cache_par is +architecture rtl of cache_Parallel is attribute KEEP : boolean; constant LINE_INDEX_BITS : positive := log2ceilnz(CACHE_LINES); @@ -121,41 +121,41 @@ architecture rtl of cache_par is -- look-up (request) signal TU_LineIndex : std_logic_vector(LINE_INDEX_BITS - 1 downto 0); - signal TU_TagHit : std_logic; - signal TU_TagMiss : std_logic; + signal TU_TagHit : std_logic; + signal TU_TagMiss : std_logic; -- replace signal TU_ReplaceLineIndex : std_logic_vector(LINE_INDEX_BITS - 1 downto 0); - signal TU_OldAddress : std_logic_vector(ADDRESS_BITS - 1 downto 0); + signal TU_OldAddress : std_logic_vector(ADDRESS_BITS - 1 downto 0); signal MemoryIndex_us : unsigned(LINE_INDEX_BITS - 1 downto 0); - signal CacheMemory : T_CACHE_LINE_VECTOR(CACHE_LINES - 1 downto 0); + signal CacheMemory : T_CACHE_LINE_VECTOR(CACHE_LINES - 1 downto 0); begin -- Cache TagUnit - TU: entity work.cache_tagunit_par + TU: entity work.cache_TagUnit_Parallel generic map ( REPLACEMENT_POLICY => REPLACEMENT_POLICY, - CACHE_LINES => CACHE_LINES, - ASSOCIATIVITY => ASSOCIATIVITY, - ADDRESS_BITS => ADDRESS_BITS + CACHE_LINES => CACHE_LINES, + ASSOCIATIVITY => ASSOCIATIVITY, + ADDRESS_BITS => ADDRESS_BITS ) port map ( Clock => Clock, Reset => Reset, - Replace => Replace, + Replace => Replace, ReplaceLineIndex => TU_ReplaceLineIndex, - OldAddress => TU_OldAddress, + OldAddress => TU_OldAddress, - Request => Request, - ReadWrite => ReadWrite, + Request => Request, + ReadWrite => ReadWrite, Invalidate => Invalidate, - Address => Address, - LineIndex => TU_LineIndex, - TagHit => TU_TagHit, - TagMiss => TU_TagMiss + Address => Address, + LineIndex => TU_LineIndex, + TagHit => TU_TagHit, + TagMiss => TU_TagMiss ); -- Address selector @@ -170,16 +170,16 @@ begin end if; -- Single-port memory with read before write is required here. - -- Cannot be mapped to `PoC.ocram_sdp`. + -- Cannot be mapped to `PoC.ocram_SimpleDualPort`. CacheLineOut <= CacheMemory(to_integer(MemoryIndex_us)); -- Control outputs have same latency as cache line data. if Reset = '1' then CacheMiss <= '0'; - CacheHit <= '0'; + CacheHit <= '0'; else CacheMiss <= TU_TagMiss; - CacheHit <= TU_TagHit; + CacheHit <= TU_TagHit; end if; OldAddress <= TU_OldAddress; diff --git a/src/cache/cache_par2.vhdl b/src/cache/cache_Parallel2.vhdl similarity index 76% rename from src/cache/cache_par2.vhdl rename to src/cache/cache_Parallel2.vhdl index 696b9512d..f5d7c8a0f 100644 --- a/src/cache/cache_par2.vhdl +++ b/src/cache/cache_Parallel2.vhdl @@ -7,7 +7,7 @@ -- Description: -- ------------------------------------- -- Cache with parallel tag-unit and data memory. For the data memory, --- :ref:`IP:ocram_sp` is used. +-- :ref:`IP:ocram_SinglePort` is used. -- -- Configuration -- ************* @@ -93,13 +93,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -109,59 +109,59 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; -entity cache_par2 is +entity cache_Parallel2 is generic ( - REPLACEMENT_POLICY : string := "LRU"; - CACHE_LINES : positive := 32; - ASSOCIATIVITY : positive := 32; - ADDR_BITS : positive := 8; - DATA_BITS : positive := 8; - HIT_MISS_REG : boolean := true -- must be true for Cocotb. + REPLACEMENT_POLICY : string := "LRU"; + CACHE_LINES : positive := 32; + ASSOCIATIVITY : positive := 32; + ADDR_BITS : positive := 8; + DATA_BITS : positive := 8; + HIT_MISS_REG : boolean := true -- must be true for Cocotb. ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - Request : in std_logic; - ReadWrite : in std_logic; - WriteMask : in std_logic_vector(DATA_BITS/8 - 1 downto 0) := (others => '0'); - Invalidate : in std_logic; - Replace : in std_logic; - Address : in std_logic_vector(ADDR_BITS-1 downto 0); + Request : in std_logic; + ReadWrite : in std_logic; + WriteMask : in std_logic_vector(DATA_BITS/8 - 1 downto 0) := (others => '0'); + Invalidate : in std_logic; + Replace : in std_logic; + Address : in std_logic_vector(ADDR_BITS-1 downto 0); - CacheLineIn : in std_logic_vector(DATA_BITS - 1 downto 0); + CacheLineIn : in std_logic_vector(DATA_BITS - 1 downto 0); CacheLineOut : out std_logic_vector(DATA_BITS - 1 downto 0); - CacheHit : out std_logic := '0'; - CacheMiss : out std_logic := '0'; - OldAddress : out std_logic_vector(ADDR_BITS-1 downto 0) + CacheHit : out std_logic := '0'; + CacheMiss : out std_logic := '0'; + OldAddress : out std_logic_vector(ADDR_BITS-1 downto 0) ); end entity; -architecture rtl of cache_par2 is +architecture rtl of cache_Parallel2 is attribute KEEP : boolean; constant LINE_INDEX_BITS : positive := log2ceilnz(CACHE_LINES); subtype T_CACHE_LINE is std_logic_vector(DATA_BITS - 1 downto 0); - type T_CACHE_LINE_VECTOR is array (natural range <>) of T_CACHE_LINE; + type T_CACHE_LINE_VECTOR is array (natural range <>) of T_CACHE_LINE; -- FIXME: T_SLVV -- look-up (request) signal TU_LineIndex : std_logic_vector(LINE_INDEX_BITS - 1 downto 0); - signal TU_TagHit : std_logic; - signal TU_TagMiss : std_logic; + signal TU_TagHit : std_logic; + signal TU_TagMiss : std_logic; - -- replace - signal ReplaceWrite : std_logic; - signal TU_ReplaceLineIndex : std_logic_vector(LINE_INDEX_BITS - 1 downto 0); - signal TU_OldAddress : std_logic_vector(OldAddress'range); + -- replace + signal ReplaceWrite : std_logic; + signal TU_ReplaceLineIndex : std_logic_vector(LINE_INDEX_BITS - 1 downto 0); + signal TU_OldAddress : std_logic_vector(OldAddress'range); -- data memory signal MemoryIndex_us : unsigned(LINE_INDEX_BITS - 1 downto 0); @@ -172,28 +172,28 @@ begin ReplaceWrite <= Replace and ReadWrite; -- Cache TagUnit - TU: entity work.cache_tagunit_par + TU: entity work.cache_TagUnit_Parallel generic map ( REPLACEMENT_POLICY => REPLACEMENT_POLICY, - CACHE_LINES => CACHE_LINES, - ASSOCIATIVITY => ASSOCIATIVITY, - ADDRESS_BITS => ADDR_BITS + CACHE_LINES => CACHE_LINES, + ASSOCIATIVITY => ASSOCIATIVITY, + ADDRESS_BITS => ADDR_BITS ) port map ( Clock => Clock, Reset => Reset, - Replace => ReplaceWrite, + Replace => ReplaceWrite, ReplaceLineIndex => TU_ReplaceLineIndex, - OldAddress => TU_OldAddress, + OldAddress => TU_OldAddress, - Request => Request, - ReadWrite => ReadWrite, + Request => Request, + ReadWrite => ReadWrite, Invalidate => Invalidate, - Address => Address, - LineIndex => TU_LineIndex, - TagHit => TU_TagHit, - TagMiss => TU_TagMiss + Address => Address, + LineIndex => TU_LineIndex, + TagHit => TU_TagHit, + TagMiss => TU_TagMiss ); -- Address selector @@ -208,36 +208,36 @@ begin begin we <= ReadWrite and not WriteMask(i); - data_mem: entity work.ocram_sp + data_mem: entity work.ocram_SinglePort generic map ( - A_BITS => LINE_INDEX_BITS, - D_BITS => 8, -- 8 bit per lane + ADDRESS_BITS => LINE_INDEX_BITS, + DATA_BITS => 8, -- 8 bit per lane FILENAME => "") port map ( - clk => Clock, - ce => MemoryAccess, - we => we, - a => MemoryIndex_us, - d => CacheLineIn (i*8+7 downto i*8), - q => CacheLineOut(i*8+7 downto i*8)); + Clock => Clock, + ClockEnable => MemoryAccess, + WriteEnable => we, + Address => MemoryIndex_us, + DataIn => CacheLineIn (i*8+7 downto i*8), + DataOut => CacheLineOut(i*8+7 downto i*8)); end generate gLane; -- Hit / Miss gNoHitMissReg: if not HIT_MISS_REG generate CacheMiss <= TU_TagMiss; - CacheHit <= TU_TagHit; + CacheHit <= TU_TagHit; end generate gNoHitMissReg; - gHitMissReg: if HIT_MISS_REG generate -- Pipelined outputs. + gHitMissReg: if HIT_MISS_REG generate -- Pipelined outputs. process(Clock) begin if rising_edge(Clock) then if Reset = '1' then CacheMiss <= '0'; - CacheHit <= '0'; + CacheHit <= '0'; else CacheMiss <= TU_TagMiss; - CacheHit <= TU_TagHit; + CacheHit <= TU_TagHit; end if; end if; end process; diff --git a/src/cache/cache_replacement_policy.vhdl b/src/cache/cache_ReplacementPolicy.vhdl similarity index 68% rename from src/cache/cache_replacement_policy.vhdl rename to src/cache/cache_ReplacementPolicy.vhdl index 4e792bb9c..8bb1e4be0 100644 --- a/src/cache/cache_replacement_policy.vhdl +++ b/src/cache/cache_ReplacementPolicy.vhdl @@ -1,8 +1,8 @@ -- ============================================================================= --- Authors: Patrick Lehmann --- Martin Zabel +-- Authors: Patrick Lehmann +-- Martin Zabel -- --- Entity: Wrap different cache replacement policies. +-- Entity: Wrap different cache replacement policies. -- -- Description: -- ------------------------------------- @@ -23,7 +23,7 @@ -- | LFU | least frequently used | not yet | -- +----------+-----------------------+-----------+ -- --- **Command thruth table:** +-- **Command truth table:** -- -- +-----------+-----------+-------------+---------+-----------------------------------------------------+ -- | TagAccess | ReadWrite | Invalidate | Replace | Command | @@ -53,13 +53,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -69,39 +69,39 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -use work.config.all; -use work.utils.all; -use work.vectors.all; -use work.strings.all; +use work.config.all; +use work.utils.all; +use work.vectors.all; +use work.strings.all; -entity cache_replacement_policy is +entity cache_ReplacementPolicy is generic ( - REPLACEMENT_POLICY : string := "LRU"; - CACHE_WAYS : positive := 32 + REPLACEMENT_POLICY : string := "LRU"; + CACHE_WAYS : positive := 32 ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- replacement interface - Replace : in std_logic; + Replace : in std_logic; ReplaceWay : out std_logic_vector(log2ceilnz(CACHE_WAYS) - 1 downto 0); -- cacheline usage update interface - TagAccess : in std_logic; - ReadWrite : in std_logic; - Invalidate : in std_logic; - HitWay : in std_logic_vector(log2ceilnz(CACHE_WAYS) - 1 downto 0) + TagAccess : in std_logic; + ReadWrite : in std_logic; + Invalidate : in std_logic; + HitWay : in std_logic_vector(log2ceilnz(CACHE_WAYS) - 1 downto 0) ); end entity; -architecture rtl of cache_replacement_policy is - attribute KEEP : boolean; +architecture rtl of cache_ReplacementPolicy is + attribute KEEP : boolean; attribute FSM_ENCODING : string; constant KEY_BITS : positive := log2ceilnz(CACHE_WAYS); @@ -123,64 +123,64 @@ begin type T_OPTION_LINE_VECTOR is array (natural range <>) of T_OPTION_LINE; signal OptionMemory : T_OPTION_LINE_VECTOR(CACHE_WAYS - 1 downto 0) := (others => ( - VALID_BIT => '0') + VALID_BIT => '0') ); - signal ValidHit : std_logic; + signal ValidHit : std_logic; signal Pointer_us : unsigned(log2ceilnz(CACHE_WAYS) - 1 downto 0) := (others => '0'); begin --- ValidHit <= OptionMemory(to_integer(unsigned(HitWay)))(VALID_BIT); --- IsValid <= ValidHit; --- --- process(Clock) --- begin --- if rising_edge(Clock) then --- if (Reset = '1') then --- for i in 0 to CACHE_WAYS - 1 loop --- OptionMemory(I)(VALID_BIT) <= '0'; --- end loop; --- else --- if (Insert = '1') then --- OptionMemory(to_integer(Pointer_us))(VALID_BIT) <= '1'; --- end if; --- --- if (Invalidate = '1') then --- OptionMemory(to_integer(unsigned(HitWay)))(VALID_BIT) <= '0'; --- end if; --- end if; --- end if; --- end process; --- --- Replace <= Insert; --- ReplaceWay <= std_logic_vector(Pointer_us); --- --- process(Clock) --- begin --- if rising_edge(Clock) then --- if (Reset = '1') then --- Pointer_us <= (others => '0'); --- else --- if (Insert = '1') then --- Pointer_us <= Pointer_us + 1; --- end if; --- end if; --- end if; --- end process; +-- ValidHit <= OptionMemory(to_integer(unsigned(HitWay)))(VALID_BIT); +-- IsValid <= ValidHit; +-- +-- process(Clock) +-- begin +-- if rising_edge(Clock) then +-- if (Reset = '1') then +-- for i in 0 to CACHE_WAYS - 1 loop +-- OptionMemory(I)(VALID_BIT) <= '0'; +-- end loop; +-- else +-- if (Insert = '1') then +-- OptionMemory(to_integer(Pointer_us))(VALID_BIT) <= '1'; +-- end if; +-- +-- if (Invalidate = '1') then +-- OptionMemory(to_integer(unsigned(HitWay)))(VALID_BIT) <= '0'; +-- end if; +-- end if; +-- end if; +-- end process; +-- +-- Replace <= Insert; +-- ReplaceWay <= std_logic_vector(Pointer_us); +-- +-- process(Clock) +-- begin +-- if rising_edge(Clock) then +-- if (Reset = '1') then +-- Pointer_us <= (others => '0'); +-- else +-- if (Insert = '1') then +-- Pointer_us <= Pointer_us + 1; +-- end if; +-- end if; +-- end if; +-- end process; end generate; -- =========================================================================== -- policy: LRU - least recently used -- =========================================================================== genLRU : if str_equal(REPLACEMENT_POLICY, "LRU") generate - signal LRU_Insert : std_logic; + signal LRU_Insert : std_logic; signal LRU_Invalidate : std_logic; - signal KeyIn : std_logic_vector(log2ceilnz(CACHE_WAYS) - 1 downto 0); - signal LRU_Key : std_logic_vector(log2ceilnz(CACHE_WAYS) - 1 downto 0); + signal KeyIn : std_logic_vector(log2ceilnz(CACHE_WAYS) - 1 downto 0); + signal LRU_Key : std_logic_vector(log2ceilnz(CACHE_WAYS) - 1 downto 0); begin -- Command Decoding - LRU_Insert <= (TagAccess and not Invalidate) or Replace; + LRU_Insert <= (TagAccess and not Invalidate) or Replace; LRU_Invalidate <= TagAccess and Invalidate; KeyIn <= LRU_Key when Replace = '1' else HitWay; @@ -188,7 +188,7 @@ begin -- Output ReplaceWay <= LRU_Key; - LRU: entity work.sort_lru_cache + LRU: entity work.sort_LeastRecentlyUsed_Cache generic map ( ELEMENTS => CACHE_WAYS ) @@ -197,8 +197,8 @@ begin Reset => Reset, Insert => LRU_Insert, - Free => LRU_Invalidate, - KeyIn => KeyIn, + Free => LRU_Invalidate, + KeyIn => KeyIn, KeyOut => LRU_Key ); diff --git a/src/cache/cache_tagunit_par.vhdl b/src/cache/cache_TagUnit_Parallel.vhdl similarity index 78% rename from src/cache/cache_tagunit_par.vhdl rename to src/cache/cache_TagUnit_Parallel.vhdl index e95541510..55db1ac9e 100644 --- a/src/cache/cache_tagunit_par.vhdl +++ b/src/cache/cache_TagUnit_Parallel.vhdl @@ -1,8 +1,8 @@ -- ============================================================================= --- Authors: Patrick Lehmann --- Martin Zabel +-- Authors: Patrick Lehmann +-- Martin Zabel -- --- Entity: Tag-unit with fully-parallel compare of tag. +-- Entity: Tag-unit with fully-parallel compare of tag. -- -- Description: -- ------------------------------------- @@ -55,7 +55,7 @@ -- Each command is completed within one clock cycle. -- -- Upon requests, the outputs ``CacheMiss`` and ``CacheHit`` indicate (high-active) --- immediately (combinational) whether the ``Address`` is stored within the cache, or not. +-- immediately (combinatorial) whether the ``Address`` is stored within the cache, or not. -- But, the cache-line usage is updated at the rising-edge of the clock. -- If hit, ``LineIndex`` specifies the cache line where to find the content. -- @@ -85,13 +85,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -101,38 +101,38 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; -entity cache_tagunit_par is +entity cache_TagUnit_Parallel is generic ( - REPLACEMENT_POLICY : string := "LRU"; - CACHE_LINES : positive := 32; - ASSOCIATIVITY : positive := 32; - ADDRESS_BITS : positive := 8 + REPLACEMENT_POLICY : string := "LRU"; + CACHE_LINES : positive := 32; + ASSOCIATIVITY : positive := 32; + ADDRESS_BITS : positive := 8 ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - Replace : in std_logic; + Replace : in std_logic; ReplaceLineIndex : out std_logic_vector(log2ceilnz(CACHE_LINES) - 1 downto 0); - OldAddress : out std_logic_vector(ADDRESS_BITS - 1 downto 0); - - Request : in std_logic; - ReadWrite : in std_logic; - Invalidate : in std_logic; - Address : in std_logic_vector(ADDRESS_BITS - 1 downto 0); - LineIndex : out std_logic_vector(log2ceilnz(CACHE_LINES) - 1 downto 0); - TagHit : out std_logic; - TagMiss : out std_logic + OldAddress : out std_logic_vector(ADDRESS_BITS - 1 downto 0); + + Request : in std_logic; + ReadWrite : in std_logic; + Invalidate : in std_logic; + Address : in std_logic_vector(ADDRESS_BITS - 1 downto 0); + LineIndex : out std_logic_vector(log2ceilnz(CACHE_LINES) - 1 downto 0); + TagHit : out std_logic; + TagMiss : out std_logic ); end entity; -architecture rtl of cache_tagunit_par is +architecture rtl of cache_TagUnit_Parallel is attribute KEEP : boolean; constant SETS : positive := CACHE_LINES / ASSOCIATIVITY; @@ -155,23 +155,23 @@ begin -- Full-Associative Cache -- =========================================================================== genFA : if CACHE_LINES = ASSOCIATIVITY generate - constant TAG_BITS : positive := ADDRESS_BITS; - constant WAY_BITS : positive := log2ceilnz(ASSOCIATIVITY); + constant TAG_BITS : positive := ADDRESS_BITS; + constant WAY_BITS : positive := log2ceilnz(ASSOCIATIVITY); subtype T_TAG_LINE is std_logic_vector(TAG_BITS - 1 downto 0); type T_TAG_LINE_VECTOR is array (natural range <>) of T_TAG_LINE; signal TagHits : std_logic_vector(CACHE_LINES - 1 downto 0); -- includes Valid - signal TagMemory : T_TAG_LINE_VECTOR(CACHE_LINES - 1 downto 0); - signal ValidMemory : std_logic_vector(CACHE_LINES - 1 downto 0) := (others => '0'); + signal TagMemory : T_TAG_LINE_VECTOR(CACHE_LINES - 1 downto 0); + signal ValidMemory : std_logic_vector(CACHE_LINES - 1 downto 0) := (others => '0'); signal HitWay : unsigned(WAY_BITS - 1 downto 0); signal Policy_ReplaceWay : std_logic_vector(WAY_BITS - 1 downto 0); - signal ReplaceWay_us : unsigned(WAY_BITS - 1 downto 0); + signal ReplaceWay_us : unsigned(WAY_BITS - 1 downto 0); - signal TagHit_i : std_logic; -- includes Valid and Request + signal TagHit_i : std_logic; -- includes Valid and Request signal TagMiss_i : std_logic; -- includes Valid and Request begin @@ -186,14 +186,14 @@ begin end loop; TagHits <= hits; - HitWay <= onehot2bin(hits, 0); + HitWay <= onehot2bin(hits, 0); end process; process(Clock) begin if rising_edge(Clock) then if (Replace = '1') then - TagMemory(to_integer(ReplaceWay_us)) <= Address; + TagMemory(to_integer(ReplaceWay_us)) <= Address; end if; for i in ValidMemory'range loop @@ -209,56 +209,56 @@ begin end process; -- hit/miss calculation - TagHit_i <= slv_or(TagHits) and Request; + TagHit_i <= slv_or(TagHits) and Request; TagMiss_i <= not slv_or(TagHits) and Request; -- outputs LineIndex <= std_logic_vector(HitWay); - TagHit <= TagHit_i; - TagMiss <= TagMiss_i; + TagHit <= TagHit_i; + TagMiss <= TagMiss_i; - ReplaceWay_us <= unsigned(Policy_ReplaceWay); + ReplaceWay_us <= unsigned(Policy_ReplaceWay); ReplaceLineIndex <= Policy_ReplaceWay; - OldAddress <= (others => 'X') when contains_x(ReplaceWay_us) else + OldAddress <= (others => 'X') when contains_x(ReplaceWay_us) else TagMemory(to_integer(ReplaceWay_us)); -- replacement policy - Policy: entity work.cache_replacement_policy + Policy: entity work.cache_ReplacementPolicy generic map ( REPLACEMENT_POLICY => REPLACEMENT_POLICY, - CACHE_WAYS => ASSOCIATIVITY + CACHE_WAYS => ASSOCIATIVITY ) port map ( Clock => Clock, Reset => Reset, - Replace => Replace, + Replace => Replace, ReplaceWay => Policy_ReplaceWay, - TagAccess => TagHit_i, - ReadWrite => ReadWrite, - Invalidate => Invalidate, - HitWay => std_logic_vector(HitWay) - ); - end generate; - - -- =========================================================================== - -- Direct-Mapped Cache - -- =========================================================================== - genDM : if ASSOCIATIVITY = 1 generate - -- Addresses are splitted into a tag part and an index part. - constant INDEX_BITS : positive := log2ceilnz(CACHE_LINES); - constant TAG_BITS : positive := ADDRESS_BITS - INDEX_BITS; + TagAccess => TagHit_i, + ReadWrite => ReadWrite, + Invalidate => Invalidate, + HitWay => std_logic_vector(HitWay) + ); + end generate; + + -- =========================================================================== + -- Direct-Mapped Cache + -- =========================================================================== + genDM : if ASSOCIATIVITY = 1 generate + -- Addresses are splitted into a tag part and an index part. + constant INDEX_BITS : positive := log2ceilnz(CACHE_LINES); + constant TAG_BITS : positive := ADDRESS_BITS - INDEX_BITS; subtype T_TAG_LINE is std_logic_vector(TAG_BITS-1 downto 0); type T_TAG_LINE_VECTOR is array(natural range <>) of T_TAG_LINE; - signal Address_Tag : T_TAG_LINE; - signal Address_Index : unsigned(INDEX_BITS - 1 downto 0); + signal Address_Tag : T_TAG_LINE; + signal Address_Index : unsigned(INDEX_BITS - 1 downto 0); - signal DM_TagHit : std_logic; -- includes Valid + signal DM_TagHit : std_logic; -- includes Valid - signal TagMemory : T_TAG_LINE_VECTOR(CACHE_LINES-1 downto 0); + signal TagMemory : T_TAG_LINE_VECTOR(CACHE_LINES-1 downto 0); signal ValidMemory : std_logic_vector(CACHE_LINES-1 downto 0) := (others => '0'); -- If Address is fed from a register, then: @@ -279,22 +279,22 @@ begin attribute ram_style : string; -- XST specific attribute ram_style of TagMemory : signal is "distributed"; - signal TagHit_i : std_logic; + signal TagHit_i : std_logic; signal TagMiss_i : std_logic; signal Tag : T_TAG_LINE; -- read tag from memory signal Valid : std_logic; -- read valid from memory - begin + begin assert CACHE_LINES = 2**INDEX_BITS report "Unsupported number of cache lines." severity failure; - -- Split incoming 'Address' - Address_Tag <= Address(Address'left downto INDEX_BITS); - Address_Index <= unsigned(Address(INDEX_BITS-1 downto 0)); + -- Split incoming 'Address' + Address_Tag <= Address(Address'left downto INDEX_BITS); + Address_Index <= unsigned(Address(INDEX_BITS-1 downto 0)); -- Access tag / valid memory and compare tags. Tag <= (others => 'X') when contains_x(Address_Index) else - TagMemory (to_integer(Address_Index)); + TagMemory (to_integer(Address_Index)); Valid <= 'X' when contains_x(Address_Index) else ValidMemory(to_integer(Address_Index)); DM_TagHit <= to_sl(Tag = Address_Tag) and Valid; @@ -308,34 +308,34 @@ begin if Reset = '1' then ValidMemory <= (others => '0'); - elsif (Replace = '1') or (TagHit_i = '1' and Invalidate = '1') then + elsif (Replace = '1') or (TagHit_i = '1' and Invalidate = '1') then ValidMemory(to_integer(Address_Index)) <= Replace; -- clear when Invalidate end if; end if; end process; -- hit/miss calculation - TagHit_i <= DM_TagHit and Request; + TagHit_i <= DM_TagHit and Request; TagMiss_i <= not DM_TagHit and Request; -- outputs LineIndex <= std_logic_vector(Address_Index); - TagHit <= TagHit_i; - TagMiss <= TagMiss_i; + TagHit <= TagHit_i; + TagMiss <= TagMiss_i; ReplaceLineIndex <= std_logic_vector(Address_Index); - OldAddress <= Tag & std_logic_vector(Address_Index); + OldAddress <= Tag & std_logic_vector(Address_Index); end generate; -- =========================================================================== -- Set-Assoziative Cache -- =========================================================================== genSA : if (ASSOCIATIVITY > 1) and (SETS > 1) generate - -- Addresses are splitted into a tag part and an index part. + -- Addresses are splitted into a tag part and an index part. constant CACHE_SETS : positive := CACHE_LINES / ASSOCIATIVITY; - constant INDEX_BITS : positive := log2ceilnz(CACHE_SETS); - constant TAG_BITS : positive := ADDRESS_BITS - INDEX_BITS; - constant WAY_BITS : positive := log2ceilnz(ASSOCIATIVITY); + constant INDEX_BITS : positive := log2ceilnz(CACHE_SETS); + constant TAG_BITS : positive := ADDRESS_BITS - INDEX_BITS; + constant WAY_BITS : positive := log2ceilnz(ASSOCIATIVITY); subtype T_TAG_LINE is std_logic_vector(TAG_BITS-1 downto 0); type T_TAG_LINE_VECTOR is array(natural range <>) of T_TAG_LINE; @@ -343,24 +343,24 @@ begin type T_WAY_VECTOR is array(natural range<>) of std_logic_vector(WAY_BITS-1 downto 0); -- Splitted address - signal Address_Tag : T_TAG_LINE; - signal Address_Index : unsigned(INDEX_BITS - 1 downto 0); + signal Address_Tag : T_TAG_LINE; + signal Address_Index : unsigned(INDEX_BITS - 1 downto 0); -- Way-specific signals signal TagHits : std_logic_vector(ASSOCIATIVITY-1 downto 0); -- includes Valid signal OldTags : T_TAG_LINE_VECTOR(ASSOCIATIVITY-1 downto 0); -- Cache-set specific signals - signal CS_TagAccess : std_logic_vector(CACHE_SETS-1 downto 0); + signal CS_TagAccess : std_logic_vector(CACHE_SETS-1 downto 0); signal CS_Invalidate : std_logic_vector(CACHE_SETS-1 downto 0); - signal CS_Replace : std_logic_vector(CACHE_SETS-1 downto 0); + signal CS_Replace : std_logic_vector(CACHE_SETS-1 downto 0); signal Policy_ReplaceWay : T_WAY_VECTOR(CACHE_SETS-1 downto 0); -- Way where hit occurs and way to replace - signal HitWay : unsigned(WAY_BITS-1 downto 0); + signal HitWay : unsigned(WAY_BITS-1 downto 0); signal ReplaceWay : unsigned(WAY_BITS-1 downto 0); - signal TagHit_i : std_logic; + signal TagHit_i : std_logic; signal TagMiss_i : std_logic; begin @@ -368,18 +368,18 @@ begin assert CACHE_SETS = 2**INDEX_BITS report "Unsupported number of cache-sets." severity failure; ---------------------------------------------------------------------------- - -- Split incoming 'Address' + -- Split incoming 'Address' -- Enable only one cache-set ---------------------------------------------------------------------------- - Address_Tag <= Address(Address'left downto INDEX_BITS); - Address_Index <= unsigned(Address(INDEX_BITS-1 downto 0)); + Address_Tag <= Address(Address'left downto INDEX_BITS); + Address_Index <= unsigned(Address(INDEX_BITS-1 downto 0)); ---------------------------------------------------------------------------- -- Generate tag-memory and comparators for each way ---------------------------------------------------------------------------- genWay : for way in 0 to ASSOCIATIVITY-1 generate - signal TagMemory : T_TAG_LINE_VECTOR(CACHE_SETS-1 downto 0); + signal TagMemory : T_TAG_LINE_VECTOR(CACHE_SETS-1 downto 0); signal ValidMemory : std_logic_vector(CACHE_SETS-1 downto 0) := (others => '0'); -- If Address is fed from a register, then: @@ -438,19 +438,19 @@ begin ---------------------------------------------------------------------------- -- Global hit / miss calculation and output ---------------------------------------------------------------------------- - TagHit_i <= slv_or(TagHits) and Request; + TagHit_i <= slv_or(TagHits) and Request; TagMiss_i <= not slv_or(TagHits) and Request; LineIndex <= std_logic_vector(HitWay) & std_logic_vector(Address_Index); - TagHit <= TagHit_i; - TagMiss <= TagMiss_i; + TagHit <= TagHit_i; + TagMiss <= TagMiss_i; ---------------------------------------------------------------------------- -- Generate policy for each cache-set ---------------------------------------------------------------------------- process(Address_Index, TagHit_i) begin - CS_TagAccess <= (others => '0'); + CS_TagAccess <= (others => '0'); if contains_x(Address_Index) then -- for simulation only null;--TODO: CS_TagAccess <= (others => 'X'); else @@ -460,7 +460,7 @@ begin process(Address_Index, Invalidate) begin - CS_Invalidate <= (others => '0'); + CS_Invalidate <= (others => '0'); if contains_x(Address_Index) then -- for simulation only null;--TODO: CS_Invalidate <= (others => 'X'); else @@ -470,7 +470,7 @@ begin process(Address_Index, Replace) begin - CS_Replace <= (others => '0'); + CS_Replace <= (others => '0'); if contains_x(Address_Index) then -- for simulation only null;--TODO: CS_Replace <= (others => 'X'); else @@ -480,22 +480,22 @@ begin genSet : for cs in 0 to CACHE_SETS-1 generate begin - Policy: entity work.cache_replacement_policy + Policy: entity work.cache_ReplacementPolicy generic map ( REPLACEMENT_POLICY => REPLACEMENT_POLICY, - CACHE_WAYS => ASSOCIATIVITY + CACHE_WAYS => ASSOCIATIVITY ) port map ( Clock => Clock, Reset => Reset, - Replace => CS_Replace(cs), + Replace => CS_Replace(cs), ReplaceWay => Policy_ReplaceWay(cs), -- way to replace - TagAccess => CS_TagAccess(cs), - ReadWrite => ReadWrite, + TagAccess => CS_TagAccess(cs), + ReadWrite => ReadWrite, Invalidate => CS_Invalidate(cs), - HitWay => std_logic_vector(HitWay) -- accessed way + HitWay => std_logic_vector(HitWay) -- accessed way ); end generate genSet; @@ -506,7 +506,7 @@ begin -- Replace-specific outputs ---------------------------------------------------------------------------- ReplaceLineIndex <= std_logic_vector(ReplaceWay) & std_logic_vector(Address_Index); - OldAddress <= (others => 'X') when contains_x(ReplaceWay) else + OldAddress <= (others => 'X') when contains_x(ReplaceWay) else OldTags(to_integer(ReplaceWay)) & std_logic_vector(Address_Index); end generate; diff --git a/src/cache/cache_tagunit_seq.vhdl b/src/cache/cache_TagUnit_Sequential.vhdl similarity index 93% rename from src/cache/cache_tagunit_seq.vhdl rename to src/cache/cache_TagUnit_Sequential.vhdl index 2f884c2ad..33446a6df 100644 --- a/src/cache/cache_tagunit_seq.vhdl +++ b/src/cache/cache_TagUnit_Sequential.vhdl @@ -27,13 +27,13 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; -entity cache_tagunit_seq is +entity cache_TagUnit_Sequential is generic ( REPLACEMENT_POLICY : string := "LRU"; CACHE_LINES : positive := 32; @@ -45,8 +45,8 @@ entity cache_tagunit_seq is INITIAL_TAGS : T_SLM := (0 downto 0 => (127 downto 0 => '0')) ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; Replace : in std_logic; Replaced : out std_logic; @@ -70,7 +70,7 @@ entity cache_tagunit_seq is end entity; -architecture rtl of cache_tagunit_seq is +architecture rtl of cache_TagUnit_Sequential is attribute KEEP : boolean; constant SETS : positive := CACHE_LINES / ASSOCIATIVITY; @@ -110,7 +110,7 @@ begin constant tag_line : std_logic_vector(slm'high(2) downto slm'low(2)) := get_row(slm, row); variable result : T_TAG_LINE(FA_CHUNKS - 1 downto 0); begin --- report "tagline @row " & INTEGER'image(row) & " = " & to_string(tag_line, 'h') severity NOTE; +-- report "tagline @row " & INTEGER'image(row) & " = " & to_string(tag_line, 'h') severity NOTE; for I in result'range loop result(I) := tag_line((I * CHUNK_BITS) + CHUNK_BITS - 1 downto (I * CHUNK_BITS)); end loop; @@ -125,10 +125,10 @@ begin signal RequestComplete : std_logic; signal NewTagSeqCounter_rst : std_logic; --- signal NewTagSeqCounter_en : STD_LOGIC; +-- signal NewTagSeqCounter_en : STD_LOGIC; signal NewTagSeqCounter_us : unsigned(FA_CHUNK_INDEX_BITS - 1 downto 0) := (others => '0'); signal TagSeqCounter_rst : std_logic; --- signal TagSeqCounter_en : STD_LOGIC; +-- signal TagSeqCounter_en : STD_LOGIC; signal TagSeqCounter_us : unsigned(FA_CHUNK_INDEX_BITS - 1 downto 0) := (others => '0'); signal TagMemory_we : std_logic; @@ -179,7 +179,7 @@ begin Replaced <= '0'; NewTagSeqCounter_rst <= '0'; --- NewTagSeqCounter_en <= '0'; +-- NewTagSeqCounter_en <= '0'; TagMemory_we <= '0'; case Replace_State is @@ -192,7 +192,7 @@ begin Replace_NewTag_nxt <= '1'; NewTagSeqCounter_rst <= '0'; --- NewTagSeqCounter_en <= '1'; +-- NewTagSeqCounter_en <= '1'; TagMemory_we <= '1'; if FA_CHUNKS = 1 then @@ -204,7 +204,7 @@ begin when ST_REPLACE => Replace_NewTag_nxt <= '1'; --- NewTagSeqCounter_en <= '1'; +-- NewTagSeqCounter_en <= '1'; TagMemory_we <= '1'; if NewTagSeqCounter_us = ite((TAG_BYTE_ORDER = LITTLE_ENDIAN), (FA_CHUNKS - 1), 0) then @@ -221,7 +221,7 @@ begin Request_NextState <= Request_State; TagSeqCounter_rst <= '0'; --- TagSeqCounter_en <= '0'; +-- TagSeqCounter_en <= '0'; TagHits_en <= '0'; Request_Tag_rst <= '0'; @@ -242,7 +242,7 @@ begin Request_Tag_nxt <= '1'; TagSeqCounter_rst <= '0'; --- TagSeqCounter_en <= '1'; +-- TagSeqCounter_en <= '1'; TagHits_en <= '1'; if FA_CHUNKS = 1 then @@ -258,7 +258,7 @@ begin when ST_COMPARE => Request_Tag_nxt <= '1'; --- TagSeqCounter_en <= '1'; +-- TagSeqCounter_en <= '1'; TagHits_en <= '1'; if (TagHits_nor = '1') then @@ -288,7 +288,7 @@ begin Request_Tag_nxt <= '1'; TagSeqCounter_rst <= '0'; --- TagSeqCounter_en <= '1'; +-- TagSeqCounter_en <= '1'; TagHits_en <= '1'; if FA_CHUNKS = 1 then @@ -346,9 +346,9 @@ begin constant C_TAGMEMORY : T_TAG_LINE(FA_CHUNKS - 1 downto 0) := to_tagmemory(FA_INITIAL_TAGS_RESIZED, I); signal TagMemory : T_TAG_LINE(FA_CHUNKS - 1 downto 0) := C_TAGMEMORY; begin --- genASS : for j in 0 to FA_CHUNKS - 1 generate --- assert FALSE report "line=" & INTEGER'image(I) & " chunk=" & INTEGER'image(J) & " tag=" & to_string(C_TAGMEMORY(J), 'h') severity NOTE; --- end generate; +-- genASS : for j in 0 to FA_CHUNKS - 1 generate +-- assert FALSE report "line=" & INTEGER'image(I) & " chunk=" & INTEGER'image(J) & " tag=" & to_string(C_TAGMEMORY(J), 'h') severity NOTE; +-- end generate; process(Clock) begin @@ -420,7 +420,7 @@ begin TagIndex <= MemoryIndex_i when rising_edge(Clock); -- replacement policy - Policy: entity work.cache_replacement_policy + Policy: entity work.cache_ReplacementPolicy generic map ( REPLACEMENT_POLICY => REPLACEMENT_POLICY, CACHE_WAYS => FA_CACHE_LINES @@ -457,7 +457,7 @@ begin signal TagHit_i : std_logic; signal TagMiss_i : std_logic; begin - assert false report "PoC.cache_tagunit_seq:: Implementation of 'ASSOCIATIVITY = 1' not available!" severity failure; + assert false report "PoC.cache_TagUnit_Sequential:: Implementation of 'ASSOCIATIVITY = 1' not available!" severity failure; -- -- generate comparators -- genVectors : for i in 0 to FA_CACHE_LINES - 1 generate @@ -534,7 +534,7 @@ begin signal TagHit_i : std_logic; signal TagMiss_i : std_logic; begin - assert false report "PoC.cache_tagunit_seq:: Implementation of '(ASSOCIATIVITY > 1) and (SETS > 1)' not available!" severity failure; + assert false report "PoC.cache_TagUnit_Sequential:: Implementation of '(ASSOCIATIVITY > 1) and (SETS > 1)' not available!" severity failure; -- -- generate comparators -- genVectors : for i in 0 to FA_CACHE_LINES - 1 generate diff --git a/src/comm/README.md b/src/comm/README.md index bd6896116..b830408bf 100644 --- a/src/comm/README.md +++ b/src/comm/README.md @@ -10,11 +10,11 @@ The package [`PoC.comm`][comm.pkg] holds all component declarations for this nam ## Entities - - [`comm_crc`][comm_crc] - implements a generic Cyclic Redundancy Check (CRC). - - [`comm_scramble`][comm_scramble] - implements a generic LFSR based scrambler. + - [`comm_CRC`][comm_CRC] - implements a generic Cyclic Redundancy Check (CRC). + - [`comm_Scramble`][comm_Scramble] - implements a generic LFSR based scrambler. [comm.pkg]: comm.pkg.vhdl - [comm_crc]: comm_crc.vhdl - [comm_scramble]: comm_scramble.vhdl + [comm_CRC]: comm_CRC.vhdl + [comm_Scramble]: comm_Scramble.vhdl diff --git a/src/comm/comm.pro b/src/comm/build.pro similarity index 90% rename from src/comm/comm.pro rename to src/comm/build.pro index 7e1937cf1..2b29dbd66 100644 --- a/src/comm/comm.pro +++ b/src/comm/build.pro @@ -20,8 +20,8 @@ # ============================================================================= analyze ./comm.pkg.vhdl -analyze ./comm_crc.vhdl +analyze ./comm_CRC.vhdl disabled ./comm_crc_parallel.vhdl -analyze ./comm_scramble.vhdl -analyze ./remote/remote_terminal_control.vhdl +analyze ./comm_Scramble.vhdl +analyze ./remote/remote_TerminalControl.vhdl diff --git a/src/comm/comm.pkg.vhdl b/src/comm/comm.pkg.vhdl index bac95e18e..f548d4147 100644 --- a/src/comm/comm.pkg.vhdl +++ b/src/comm/comm.pkg.vhdl @@ -1,8 +1,8 @@ -- ============================================================================= --- Authors: Thomas B. Preusser +-- Authors: Thomas B. Preusser -- --- Entity: VHDL package for component declarations, types and --- functions associated to the PoC.comm namespace +-- Entity: VHDL package for component declarations, types and +-- functions associated to the PoC.comm namespace -- -- Description: -- ------------------------------------- @@ -10,14 +10,15 @@ -- -- License: -- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,45 +27,44 @@ -- limitations under the License. -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; package comm is -- Calculates the Remainder of the Division by the Generator Polynomial GEN. - component comm_crc is + component comm_CRC is generic ( - GEN : bit_vector; -- Generator Polynom - BITS : positive -- Number of Bits to be processed in parallel + POLYNOMIAL : bit_vector; -- Generator Polynom + BITS : positive -- Number of Bits to be processed in parallel ); port ( - clk : in std_logic; -- Clock + Clock : in std_logic; -- Clock - set : in std_logic; -- Parallel Preload of Remainder - init : in std_logic_vector(GEN'length-2 downto 0); -- - step : in std_logic; -- Process Input Data (MSB first) - din : in std_logic_vector(BITS-1 downto 0); -- + Load : in std_logic; -- Parallel Preload of Remainder + Seed : in std_logic_vector(POLYNOMIAL'length-2 downto 0); -- + Enable : in std_logic; -- Process Input Data (MSB first) + DataIn : in std_logic_vector(BITS-1 downto 0); -- - rmd : out std_logic_vector(GEN'length-2 downto 0); -- Remainder - zero : out std_logic -- Remainder is Zero + Remainder : out std_logic_vector(POLYNOMIAL'length-2 downto 0); -- Remainder + IsZero : out std_logic -- Remainder is Zero ); end component; -- Computes XOR masks for stream scrambling from an LFSR generator. - component comm_scramble is + component comm_Scramble is generic ( - GEN : bit_vector; -- Generator Polynomial (little endian) - BITS : positive -- Width of Mask Bits to be computed in parallel + POLYNOMIAL : bit_vector; -- Generator Polynomial (little endian) + BITS : positive -- Width of Mask Bits to be computed in parallel ); port ( - clk : in std_logic; -- Clock + Clock : in std_logic; -- Clock - set : in std_logic; -- Set LFSR to provided Value - din : in std_logic_vector(GEN'length-2 downto 0); -- + Load : in std_logic; -- Set LFSR to provided Value + Seed : in std_logic_vector(POLYNOMIAL'length-2 downto 0); -- - step : in std_logic; -- Compute a Mask Output - mask : out std_logic_vector(BITS-1 downto 0) -- + Enable : in std_logic; -- Compute a Mask Output + Value : out std_logic_vector(BITS-1 downto 0) -- ); end component; - end package; diff --git a/src/comm/comm_crc.vhdl b/src/comm/comm_CRC.vhdl similarity index 64% rename from src/comm/comm_crc.vhdl rename to src/comm/comm_CRC.vhdl index 97eb943f6..49405b1b0 100644 --- a/src/comm/comm_crc.vhdl +++ b/src/comm/comm_CRC.vhdl @@ -23,6 +23,7 @@ -- -- License: -- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors -- Copyright 2007-2015 Technische Universitaet Dresden - Germany -- Chair of VLSI-Design, Diagnostics and Architecture -- @@ -45,31 +46,31 @@ use IEEE.std_logic_1164.all; use work.utils.all; -entity comm_crc is +entity comm_CRC is generic ( - GEN : bit_vector; -- Generator Polynomial + POLYNOMIAL : bit_vector; -- Generator Polynomial BITS : positive; -- Number of Bits to be processed in parallel CHUNK_BITS : positive := BITS; -- Bus width for 'en' port - STARTUP_RMD : std_logic_vector := "0"; + INIT : std_logic_vector := "0"; OUTPUT_REGS : boolean := true ); port ( - clk : in std_logic; -- Clock + Clock : in std_logic; -- Clock - set : in std_logic; -- Parallel Preload of Remainder - init : in std_logic_vector(abs(mssb_idx(GEN)-GEN'right)-1 downto 0); -- - step : in std_logic; -- Process Input Data (MSB first) - cen : in std_logic_vector(CHUNK_BITS-1 downto 0) := (CHUNK_BITS-1 downto 0 => '1'); -- Chunck Enable - din : in std_logic_vector(BITS-1 downto 0); + Load : in std_logic; -- Parallel Preload of Remainder + Seed : in std_logic_vector(abs(mssb_idx(POLYNOMIAL)-POLYNOMIAL'right)-1 downto 0); -- + Enable : in std_logic; -- Process Input Data (MSB first) + ChunkEnable : in std_logic_vector(CHUNK_BITS-1 downto 0) := (CHUNK_BITS-1 downto 0 => '1'); -- Chunk Enable + DataIn : in std_logic_vector(BITS-1 downto 0); - rmd : out std_logic_vector(abs(mssb_idx(GEN)-GEN'right)-1 downto 0); -- Remainder - zero : out std_logic -- Remainder is Zero + Remainder : out std_logic_vector(abs(mssb_idx(POLYNOMIAL)-POLYNOMIAL'right)-1 downto 0); + IsZero : out std_logic -- Remainder is Zero ); end entity; -architecture rtl of comm_crc is +architecture rtl of comm_CRC is ----------------------------------------------------------------------------- -- Normalizes the generator representation: @@ -84,12 +85,14 @@ architecture rtl of comm_crc is return GN(i-1 downto 0); end if; end loop; - report "Cannot use absolute constant as generator." - severity failure; + + report "Cannot use absolute constant as generator." severity failure; + return GN; - end normalize; + end function; - function dcr_check(data_bits:positive; chunk_bits:positive) return positive is + -- XXX: do assert in function really trigger? + function dcr_check(data_bits : positive; chunk_bits : positive) return positive is begin assert data_bits >= chunk_bits report "Generic 'BITS' must be greater or equal to generic 'CHUNK_BITS'." @@ -101,15 +104,15 @@ architecture rtl of comm_crc is end function; -- Normalized Generator - constant GN : std_logic_vector := to_stdlogicvector(normalize(GEN)); + constant NORMALIZED_GENERATOR : std_logic_vector := to_stdlogicvector(normalize(POLYNOMIAL)); -- data-chunk lengths ratio constant DCR : positive := dcr_check(BITS, CHUNK_BITS); -- LFSR Value - signal lfsr : std_logic_vector(GN'range) := resize(descend(STARTUP_RMD), GN'length); - signal lfsn : std_logic_vector(GN'range); -- Next Value - signal lfso : std_logic_vector(GN'range); -- Output + signal lfsr : std_logic_vector(NORMALIZED_GENERATOR'range) := resize(descend(INIT), NORMALIZED_GENERATOR'length); + signal lfsn : std_logic_vector(NORMALIZED_GENERATOR'range); -- Next Value + signal lfso : std_logic_vector(NORMALIZED_GENERATOR'range); -- Output begin @@ -119,28 +122,28 @@ begin begin v := lfsr; for i in BITS-1 downto 0 loop - if cen(i/DCR) = '1' then - v := (v(v'left-1 downto 0) & '0') xor (GN and (GN'range => (din(i) xor v(v'left)))); + if ChunkEnable(i/DCR) = '1' then + v := (v(v'left-1 downto 0) & '0') xor (NORMALIZED_GENERATOR and (NORMALIZED_GENERATOR'range => (DataIn(i) xor v(v'left)))); end if; end loop; lfsn <= v; end process; -- Remainder Register - process(clk) + process(Clock) begin - if rising_edge(clk) then - if set = '1' then - lfsr <= init(lfsr'range); - elsif step = '1' then + if rising_edge(Clock) then + if Load = '1' then + lfsr <= Seed(lfsr'range); + elsif Enable = '1' then lfsr <= lfsn; end if; end if; end process; -- Provide Outputs - lfso <= lfsr when OUTPUT_REGS else lfsn; - rmd <= lfso; - zero <= '1' when lfso = (lfso'range => '0') else '0'; + lfso <= lfsr when OUTPUT_REGS else lfsn; + Remainder <= lfso; + IsZero <= '1' when lfso = (lfso'range => '0') else '0'; end architecture; diff --git a/src/comm/comm_scramble.vhdl b/src/comm/comm_Scramble.vhdl similarity index 69% rename from src/comm/comm_scramble.vhdl rename to src/comm/comm_Scramble.vhdl index 344a673d1..d0c100abf 100644 --- a/src/comm/comm_scramble.vhdl +++ b/src/comm/comm_Scramble.vhdl @@ -32,24 +32,24 @@ library IEEE; use IEEE.std_logic_1164.all; -entity comm_scramble is +entity comm_Scramble is generic ( - GEN : bit_vector; -- Generator Polynomial (little endian) - BITS : positive -- Width of Mask Bits to be computed in parallel in each step + POLYNOMIAL : bit_vector; -- Generator Polynomial (little endian) + BITS : positive -- Width of Mask Bits to be computed in parallel in each step ); port ( - clk : in std_logic; -- Clock + Clock : in std_logic; -- Clock - set : in std_logic; -- Set LFSR to value provided on din - din : in std_logic_vector(GEN'length-2 downto 0) := (others => '0'); + Load : in std_logic; -- Set LFSR to value provided on din + Seed : in std_logic_vector(POLYNOMIAL'length-2 downto 0) := (others => '0'); - step : in std_logic; -- Compute a Mask Output - mask : out std_logic_vector(BITS-1 downto 0) + Enable : in std_logic; -- Compute a Mask Output + Value : out std_logic_vector(BITS-1 downto 0) ); -end entity comm_scramble; +end entity; -architecture rtl of comm_scramble is +architecture rtl of comm_Scramble is ----------------------------------------------------------------------------- -- Normalizes a generator representation: @@ -64,29 +64,29 @@ architecture rtl of comm_scramble is return GN(i-1 downto 0); end if; end loop; - report "PoC.comm_scramble:: Cannot use absolute constant as generator." severity failure; + report "PoC.comm_Scramble:: Cannot use absolute constant as generator." severity failure; return "0"; end function; -- Normalized Generator - constant GN : bit_vector := normalize(GEN); + constant NORMALIZED_GENERATOR : bit_vector := normalize(POLYNOMIAL); -- LFSR Value - signal lfsr : std_logic_vector(GN'range); + signal lfsr : std_logic_vector(NORMALIZED_GENERATOR'range); begin - process(clk) + process(Clock) -- Intermediate LFSR Values for single-bit Steps variable v : std_logic_vector(lfsr'range); begin - if rising_edge(clk) then - if set = '1' then - lfsr <= din(lfsr'range); - elsif step = '1' then + if rising_edge(Clock) then + if Load = '1' then + lfsr <= Seed(lfsr'range); + elsif Enable = '1' then v := lfsr; for i in 0 to BITS-1 loop - mask(i) <= v(v'left); - v := (v(v'left-1 downto 0) & '0') xor (to_stdlogicvector(GN) and (GN'range => v(v'left))); + Value(i) <= v(v'left); + v := (v(v'left-1 downto 0) & '0') xor (to_stdlogicvector(NORMALIZED_GENERATOR) and (NORMALIZED_GENERATOR'range => v(v'left))); end loop; lfsr <= v; end if; diff --git a/src/comm/remote/remote_terminal_control.vhdl b/src/comm/remote/remote_TerminalControl.vhdl similarity index 92% rename from src/comm/remote/remote_terminal_control.vhdl rename to src/comm/remote/remote_TerminalControl.vhdl index 4b99cac0e..0ab6a073b 100644 --- a/src/comm/remote/remote_terminal_control.vhdl +++ b/src/comm/remote/remote_TerminalControl.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width:2 -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- ------------------------------------------------------------------------------- -- Description: Simple terminal interface to monitor and manipulate -- basic IO components such as buttons, slide switches, LED @@ -82,7 +78,7 @@ use IEEE.std_logic_1164.all; use work.utils.all; -entity remote_terminal_control is +entity remote_TerminalControl is generic ( RESET_COUNT : natural; PULSE_COUNT : natural; @@ -94,10 +90,11 @@ entity remote_terminal_control is ); port ( -- Global Control - clk : in std_logic; - rst : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- UART Connectivity + -- XXX: discusss UART interface: UART_* signals don't match UART naming, why 7 bits? Parity? idat : in std_logic_vector(6 downto 0); istb : in std_logic; odat : out std_logic_vector(6 downto 0); @@ -105,21 +102,21 @@ entity remote_terminal_control is oput : out std_logic; -- Control Outputs - resets : out std_logic_vector(imax(RESET_COUNT -1, 0) downto 0); - pulses : out std_logic_vector(imax(PULSE_COUNT -1, 0) downto 0); - switches : out std_logic_vector(imax(SWITCH_COUNT-1, 0) downto 0); + Resets : out std_logic_vector(imax(RESET_COUNT -1, 0) downto 0); + Pulses : out std_logic_vector(imax(PULSE_COUNT -1, 0) downto 0); + Switches : out std_logic_vector(imax(SWITCH_COUNT-1, 0) downto 0); -- Monitor Inputs - lights : in std_logic_vector(imax( LIGHT_COUNT-1, 0) downto 0); - digits : in std_logic_vector(imax(4*DIGIT_COUNT-1, 0) downto 0) + Lights : in std_logic_vector(imax( LIGHT_COUNT-1, 0) downto 0); + Digits : in std_logic_vector(imax(4*DIGIT_COUNT-1, 0) downto 0) ); -end remote_terminal_control; +end entity; library IEEE; -use IEEE.numeric_std.all; +use IEEE.numeric_std.all; -architecture rtl of remote_terminal_control is +architecture rtl of remote_TerminalControl is type tKind is (KIND_NONE, KIND_RESET, KIND_PULSE, KIND_SWITCH, @@ -234,10 +231,10 @@ begin begin -- State Registers - process(clk) + process(Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then State <= Idle; Cmd <= (others => '-'); Arg <= (others => '-'); @@ -300,13 +297,13 @@ begin -- Control not used genNone: if COUNTS(i) = 0 generate genReset: if i = KIND_RESET generate - resets <= "X"; + Resets <= "X"; end generate genReset; genPulse: if i = KIND_PULSE generate - pulses <= "X"; + Pulses <= "X"; end generate genPulse; genSwitch: if i = KIND_SWITCH generate - switches <= "X"; + Switches <= "X"; end generate genSwitch; echos(i) <= (others => '-'); end generate genNone; @@ -319,10 +316,10 @@ begin -- Output Computation: Strobed genStrobed: if STROBES(i) generate - process(clk) + process(Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then Outputs <= (others => '0'); else if Commit = '1' and Sel = i then @@ -338,9 +335,9 @@ begin -- Output Computation: State genState: if not STROBES(i) generate - process(clk) + process(Clock) begin - if rising_edge(clk) then + if rising_edge(Clock) then if Commit = '1' and Sel = i then Outputs <= onxt; end if; @@ -352,35 +349,35 @@ begin -- Assign to Output Pins genReset: if i = KIND_RESET generate - resets <= Outputs; + Resets <= Outputs; end generate genReset; genPulse: if i = KIND_PULSE generate - pulses <= Outputs; + Pulses <= Outputs; end generate genPulse; genSwitch: if i = KIND_SWITCH generate - switches <= Outputs; + Switches <= Outputs; end generate genSwitch; end generate genAvail; end generate genInputs; - process(lights, digits) + process(Lights, Digits) begin echos(KIND_LIGHT) <= (others => '-'); echos(KIND_DIGIT) <= (others => '-'); if LIGHT_COUNT > 0 then - echos(KIND_LIGHT) <= leftAlignedBCD(lights); + echos(KIND_LIGHT) <= leftAlignedBCD(Lights); end if; if DIGIT_COUNT > 0 then - echos(KIND_DIGIT) <= leftAlignedBCD(digits); + echos(KIND_DIGIT) <= leftAlignedBCD(Digits); end if; end process; -- Build Data Record for Writer - process(clk) + process(Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then BufVld <= '0'; BufCmd <= (others => '-'); BufCnt <= (others => '-'); @@ -424,10 +421,10 @@ begin begin - process(clk) + process(Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then State <= Idle; OutCmd <= (others => '-'); @@ -473,10 +470,10 @@ begin genMultiDig: if OutCnt'length > 4 generate signal Cnt : unsigned(log2ceil(OutCnt'length/4)-1 downto 0) := (others => '-'); begin - process(clk) + process(Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then Cnt <= (others => '-'); else if BufAck = '1' then diff --git a/src/common/README.md b/src/common/README.md index b469bac50..b77de3438 100644 --- a/src/common/README.md +++ b/src/common/README.md @@ -40,8 +40,8 @@ use work.vectors.all; ## Templates - - [`PoC.my_config`][my_config] - - [`PoC.my_project`][my_project] + - [`PoC.project_configuration`][project_configuration] + - [`PoC.local_configuration`][local_configuration] [config]: config.vhdl @@ -56,5 +56,5 @@ use work.vectors.all; [common]: common.vhdl - [my_config]: my_config.vhdl.template - [my_project]: my_project.vhdl.template + [project_configuration]: project_configuration.vhdl.template + [local_configuration]: local_configuration.vhdl.template diff --git a/src/common/common.pro b/src/common/build.pro similarity index 98% rename from src/common/common.pro rename to src/common/build.pro index 381689d34..8f2ce4ef1 100644 --- a/src/common/common.pro +++ b/src/common/build.pro @@ -22,7 +22,6 @@ analyze utils.vhdl analyze config.vhdl analyze strings.vhdl -analyze debug.vhdl analyze protected.v08.vhdl analyze math.vhdl analyze vectors.vhdl diff --git a/src/common/common.vhdl b/src/common/common.vhdl index 07b0c831d..dd19855dd 100644 --- a/src/common/common.vhdl +++ b/src/common/common.vhdl @@ -1,22 +1,23 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Context: Provides all packages from /src/common. +-- Context: Provides all packages from /src/common. -- -- Description: -- ------------------------------------- --- This package provides all common packages as a single context. +-- This package provides all common packages as a single context. -- -- License: -- ============================================================================= +-- Copyright 2024-2026 The PoC-Library Authors -- Copyright 2007-2015 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -25,14 +26,13 @@ -- limitations under the License. -- ============================================================================= -context Common is +context common is library PoC ; - use PoC.config.all; - use PoC.debug.all; --- use PoC.FileIO.all; - use PoC.math.all; - use PoC.physical.all; - use PoC.strings.all; - use PoC.utils.all; - use PoC.vectors.all; + use PoC.config.all; + use PoC.components.all; + use PoC.math.all; + use PoC.physical.all; + use PoC.strings.all; + use PoC.utils.all; + use PoC.vectors.all; end context; diff --git a/src/common/components.vhdl b/src/common/components.vhdl index a8691727e..5c1b9bed0 100644 --- a/src/common/components.vhdl +++ b/src/common/components.vhdl @@ -33,8 +33,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; diff --git a/src/common/config.vhdl b/src/common/config.vhdl index d7647ee2a..7be2176dc 100644 --- a/src/common/config.vhdl +++ b/src/common/config.vhdl @@ -8,8 +8,8 @@ -- -- Description: -- ------------------------------------- --- This file evaluates the settings declared in the project specific package my_config. --- See also template file my_config.vhdl.template. +-- This file evaluates the settings declared in the project specific package project_configuration. +-- See also template file project_configuration.vhdl.template. -- -- License: -- ============================================================================= @@ -419,15 +419,14 @@ library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; -use work.my_config.all; -use work.my_project.all; +use work.project_configuration.all; +use work.local_configuration.all; use work.config_private.all; use work.utils.all; package config is - constant PROJECT_DIR : string := normalizePath(MY_PROJECT_DIR); - constant OPERATING_SYSTEM : string := MY_OPERATING_SYSTEM; + constant PROJECT_DIR : string := normalizePath(LOCAL_PROJECT_DIR); constant POC_VERBOSE : boolean := MY_VERBOSE; -- List of known FPGA / Chip vendors @@ -578,7 +577,7 @@ package config is constant THIS_DEVICE : T_DEVICE_INFO; -- Functions extracting board and PCB properties from "MY_BOARD" - -- which is declared in package "my_config". + -- which is declared in package "project_configuration". -- =========================================================================== function BOARD (BoardConfig : string := C_BOARD_STRING_EMPTY) return natural; function BOARD_INFO (BoardConfig : string := C_BOARD_STRING_EMPTY) return T_BOARD_INFO; @@ -593,7 +592,7 @@ package config is function BOARD_ETH_PHY_ManagementInterface (EthID : natural := 0; BoardConfig : string := C_BOARD_STRING_EMPTY) return string; -- Functions extracting device and architecture properties from "MY_DEVICE" - -- which is declared in package "my_config". + -- which is declared in package "project_configuration". -- =========================================================================== function VENDOR(DeviceString : string := C_DEVICE_STRING_EMPTY) return T_VENDOR; function SYNTHESIS_TOOL(DeviceString : string := C_DEVICE_STRING_EMPTY) return T_SYNTHESIS_TOOL; @@ -640,7 +639,7 @@ package body config is function chr_isAlpha(chr : character) return boolean is begin return (((character'pos('a') <= CHARACTER'pos(chr)) and (character'pos(chr) <= CHARACTER'pos('z'))) or - ((character'pos('A') <= CHARACTER'pos(chr)) and (character'pos(chr) <= CHARACTER'pos('Z')))); + ((character'pos('A') <= CHARACTER'pos(chr)) and (character'pos(chr) <= CHARACTER'pos('Z')))); end function; function chr_isLowerAlpha(chr : character) return boolean is diff --git a/src/common/debug.vhdl b/src/common/debug.vhdl deleted file mode 100644 index 3f50674ba..000000000 --- a/src/common/debug.vhdl +++ /dev/null @@ -1,82 +0,0 @@ --- ============================================================================= --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Debug helper functions. --- --- Description: --- ------------------------------------- --- This file declares a debug helper function to export enum encodings as a --- ChipScope readable token file (*.tok). --- --- License: --- ============================================================================= --- Copyright 2007-2015 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -use STD.TextIO.all; - -use work.strings.all; - - -package debug is - impure function dbg_ExportEncoding(Name : string; encodings : string; tokenFileName : string) return boolean; - -end package; - - -package body debug is - impure function dbg_ExportEncoding(Name : string; encodings : string; tokenFileName : string) return boolean is - file tokenFile : TEXT open WRITE_MODE is tokenFileName; - - variable cnt, base : integer; - variable l : line; - begin - report "Exporting encoding of '" & Name & "' to '" & tokenFileName & "'..." severity note; - report "dbg_ExportEncoding: '" & encodings & "'" severity note; - - -- write file header - write(l, string'("# Encoding file for '" & Name & "'")); writeline(tokenFile, l); - write(l, string'("#")); writeline(tokenFile, l); - write(l, string'("# ChipScope Token File Version")); writeline(tokenFile, l); - write(l, string'("@FILE_VERSION=1.0.0")); writeline(tokenFile, l); - write(l, string'("#")); writeline(tokenFile, l); - write(l, string'("# Default token value")); writeline(tokenFile, l); - write(l, string'("@DEFAULT_TOKEN=")); writeline(tokenFile, l); - write(l, string'("#")); writeline(tokenFile, l); - - -- write state entires - cnt := 0; - base := encodings'left; - for i in encodings'range loop - if encodings(i) = ';' then - -- Leave the str_trim call in! - -- Otherwise, the new parser of ISE 14.7 fails to slice properly. - write(l, str_trim(encodings(base to i-1))); - write(l, character'('=')); - write(l, raw_format_nat_hex(cnt)); - writeline(tokenFile, l); - cnt := cnt + 1; - base := i+1; - end if; - end loop; - - file_close(tokenFile); - return true; - end function; -end package body; - diff --git a/src/common/my_project.vhdl.template b/src/common/local_configuration.vhdl.template similarity index 58% rename from src/common/my_project.vhdl.template rename to src/common/local_configuration.vhdl.template index 245b3c998..1ea265d52 100644 --- a/src/common/my_project.vhdl.template +++ b/src/common/local_configuration.vhdl.template @@ -1,28 +1,26 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- --- Package: Project specific configuration. +-- Package: Project specific configuration. -- -- Description: -- ------------------------------------ --- This is a template file. +-- This is a template file for your local machine. +-- +-- This file needs to be ignored by your version control system! -- --- TODO +-- TODO -- --- USAGE: --- 1) Copy this file into your project's source directory and rename it to --- "my_project.vhdl". --- 2) Add file to library "poc" in your synthesis tool. --- 3) Change setup appropriately. +-- USAGE: +-- 1) Copy this file into your project's source directory and rename it to +-- "local_configuration.vhdl". +-- 2) Add file to library "poc" in your synthesis tool. +-- 3) Change setup appropriately. -- -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany, --- Chair for VLSI-Design, Diagnostics and Architecture +-- Chair for VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. @@ -38,8 +36,7 @@ -- ============================================================================= -package my_project is +package local_configuration is -- Change these lines to setup configuration. - constant MY_PROJECT_DIR : string := "CHANGE THIS"; -- e.g. "d:/vhdl/myproject/", "/home/me/projects/myproject/" - constant MY_OPERATING_SYSTEM : string := "CHANGE THIS"; -- e.g. "WINDOWS", "LINUX" + constant LOCAL_PROJECT_DIR : string := "CHANGE THIS in local_configuration.vhdl"; -- e.g. "d:/vhdl/myproject/", "/home/me/projects/myproject/" end package; diff --git a/src/common/math.vhdl b/src/common/math.vhdl index ac3081532..68089e814 100644 --- a/src/common/math.vhdl +++ b/src/common/math.vhdl @@ -62,8 +62,8 @@ package math is -- ReturnValue.denominator -> denominator of the real's fractional part function fract(F : real; maxDenominator : natural := 1000; maxError : real := 1.0E-6) return T_FRACTIONAL; -- calculate time increments to met fraction - function fract2timing(numerator : natural; denominator : natural) return T_NATVEC; - function fract2timing(fractional : T_FRACTIONAL) return T_NATVEC; + function fract2timing(numerator : natural; denominator : natural) return natural_vector; + function fract2timing(fractional : T_FRACTIONAL) return natural_vector; end package; package body math is @@ -162,14 +162,14 @@ package body math is end function; -- calculate time increments to met fraction - function fract2timing(numerator : natural; denominator : natural) return T_NATVEC is + function fract2timing(numerator : natural; denominator : natural) return natural_vector is constant fractionalInReal: real := real(numerator) / real(denominator); - constant zeroes : T_NATVEC(0 to 0) := (others => 0); + constant zeroes : natural_vector(0 to 0) := (others => 0); variable actualNumerator : natural := 1; variable tab : natural := 0; variable increment : real := fractionalInReal; variable remainder : real := fractionalInReal; - variable result : T_NATVEC(0 to numerator -1) := (others => 0); + variable result : natural_vector(0 to numerator -1) := (others => 0); begin if numerator = 0 then return zeroes; @@ -189,7 +189,7 @@ package body math is return result; end function; -- calculate time increments to met fraction - function fract2timing(fractional : T_FRACTIONAL) return T_NATVEC is + function fract2timing(fractional : T_FRACTIONAL) return natural_vector is begin return fract2timing(fractional.numerator,fractional.denominator); end function; diff --git a/src/common/physical.vhdl b/src/common/physical.vhdl index 2b6390e67..1f136b52b 100644 --- a/src/common/physical.vhdl +++ b/src/common/physical.vhdl @@ -575,7 +575,7 @@ package body physical is end if; end loop; return res; - end; + end function; -- Calculates: min(vec) for a frequency vector function fmin(vec : T_FREQVEC) return FREQ is @@ -587,7 +587,7 @@ package body physical is end if; end loop; return res; - end; + end function; -- Calculates: min(vec) for a baud vector function bmin(vec : T_BAUDVEC) return BAUD is @@ -599,7 +599,7 @@ package body physical is end if; end loop; return res; - end; + end function; -- Calculates: min(vec) for a memory vector function mmin(vec : T_MEMVEC) return MEMORY is @@ -611,7 +611,7 @@ package body physical is end if; end loop; return res; - end; + end function; -- Calculates: max(vec) for a time vector function tmax(vec : T_TIMEVEC) return T_TIME is @@ -623,7 +623,7 @@ package body physical is end if; end loop; return res; - end; + end function; -- Calculates: max(vec) for a frequency vector function fmax(vec : T_FREQVEC) return FREQ is @@ -635,7 +635,7 @@ package body physical is end if; end loop; return res; - end; + end function; -- Calculates: max(vec) for a baud vector function bmax(vec : T_BAUDVEC) return BAUD is @@ -647,7 +647,7 @@ package body physical is end if; end loop; return res; - end; + end function; -- Calculates: max(vec) for a memory vector function mmax(vec : T_MEMVEC) return MEMORY is @@ -659,7 +659,7 @@ package body physical is end if; end loop; return res; - end; + end function; -- Calculates: sum(vec) for a time vector function tsum(vec : T_TIMEVEC) return T_TIME is @@ -669,7 +669,7 @@ package body physical is res := res + vec(i); end loop; return res; - end; + end function; -- Calculates: sum(vec) for a frequency vector function fsum(vec : T_FREQVEC) return FREQ is @@ -679,7 +679,7 @@ package body physical is res := res + vec(i); end loop; return res; - end; + end function; -- Calculates: sum(vec) for a baud vector function bsum(vec : T_BAUDVEC) return BAUD is @@ -689,7 +689,7 @@ package body physical is res := res + vec(i); end loop; return res; - end; + end function; -- Calculates: sum(vec) for a memory vector function msum(vec : T_MEMVEC) return MEMORY is @@ -699,7 +699,7 @@ package body physical is res := res + vec(i); end loop; return res; - end; + end function; -- convert standard types (NATURAL, REAL) to time (T_TIME) -- =========================================================================== @@ -862,7 +862,7 @@ package body physical is else report "to_real: scale must have a value of '1 '" severity failure; return 0.0; end if; - end; + end function; function to_real(t : T_TIME; scale : T_TIME) return REAL is begin @@ -873,7 +873,7 @@ package body physical is end if; end if; return t/scale; - end; + end function; function to_real(f : FREQ; scale : FREQ) return REAL is begin @@ -884,7 +884,7 @@ package body physical is else report "to_real: scale must have a value of '1 '" severity failure; end if; return 0.0; - end; + end function; function to_real(br : BAUD; scale : BAUD) return REAL is begin @@ -895,7 +895,7 @@ package body physical is else report "to_real: scale must have a value of '1 '" severity failure; end if; return 0.0; - end; + end function; function to_real(mem : MEMORY; scale : MEMORY) return REAL is begin @@ -906,7 +906,7 @@ package body physical is else report "to_real: scale must have a value of '1 '" severity failure; end if; return 0.0; - end; + end function; -- convert physical types to standard type (INTEGER) -- =========================================================================== @@ -920,7 +920,7 @@ package body physical is end case; report "to_int: unsupported RoundingStyle: " & T_ROUNDING_STYLE'image(RoundingStyle) severity failure; return 0; - end; + end function; function to_int(f : FREQ; scale : FREQ; RoundingStyle : T_ROUNDING_STYLE := ROUND_TO_NEAREST) return integer is begin @@ -932,7 +932,7 @@ package body physical is end case; report "to_int: unsupported RoundingStyle: " & T_ROUNDING_STYLE'image(RoundingStyle) severity failure; return 0; - end; + end function; function to_int(br : BAUD; scale : BAUD; RoundingStyle : T_ROUNDING_STYLE := ROUND_TO_NEAREST) return integer is begin @@ -944,7 +944,7 @@ package body physical is end case; report "to_int: unsupported RoundingStyle: " & T_ROUNDING_STYLE'image(RoundingStyle) severity failure; return 0; - end; + end function; function to_int(mem : MEMORY; scale : MEMORY; RoundingStyle : T_ROUNDING_STYLE := ROUND_UP) return integer is begin @@ -956,7 +956,7 @@ package body physical is end case; report "to_int: unsupported RoundingStyle: " & T_ROUNDING_STYLE'image(RoundingStyle) severity failure; return 0; - end; + end function; -- calculate needed counter cycles to achieve a given 1. timing/delay and 2. frequency/period -- =========================================================================== @@ -1005,7 +1005,7 @@ package body physical is end if; return res_nat; - end; + end function; function TimingToCycles(Timing : T_TIME; Clock_Frequency : FREQ; RoundingStyle : T_ROUNDING_STYLE := ROUND_UP) return natural is begin diff --git a/src/common/my_config.vhdl.template b/src/common/project_configuration.vhdl.template similarity index 76% rename from src/common/my_config.vhdl.template rename to src/common/project_configuration.vhdl.template index a125b7ba5..b471c9d79 100644 --- a/src/common/my_config.vhdl.template +++ b/src/common/project_configuration.vhdl.template @@ -1,51 +1,47 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------------------------------ --- This is a template file. --- --- The global packages common/config and common/board evaluate the settings --- declared in this file. --- --- USAGE: --- 1) Copy this file into your project's source directory and rename it to --- "my_config.vhdl". --- 2) Add file to library "PoC" in your synthesis tool. --- 3) Change setup appropriately. --- --- License: --- ============================================================================= --- Copyright 2007-2015 Technische Universitaet Dresden - Germany, --- Chair for VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "CHANGE THIS"; -- e.g. Custom, ML505, KC705, Atlys - constant MY_DEVICE : string := "CHANGE THIS"; -- e.g. GENERIC, XC5VLX50T-1FF1136, EP2SGX90FF1508C3 - - -- For internal use only - constant MY_VERBOSE : boolean := FALSE; -- activate detailed report statements in functions and procedures -end package; +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Martin Zabel +-- Patrick Lehmann +-- +-- Package: Project specific configuration. +-- +-- Description: +-- ------------------------------------ +-- This is a template file. +-- +-- The global packages common/config and common/board evaluate the settings +-- declared in this file. +-- +-- USAGE: +-- 1) Copy this file into your project's source directory and rename it to +-- "project_configuration.vhdl". +-- 2) Add file to library "PoC" in your synthesis tool. +-- 3) Change setup appropriately. +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2015 Technische Universitaet Dresden - Germany, +-- Chair for VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + + +package project_configuration is + -- Change these lines to setup configuration. + constant MY_BOARD : string := "CHANGE THIS"; -- e.g. Custom, ML505, KC705, Atlys + constant MY_DEVICE : string := "CHANGE THIS"; -- e.g. GENERIC, XC5VLX50T-1FF1136, EP2SGX90FF1508C3 + + -- For internal use only + constant MY_VERBOSE : boolean := FALSE; -- activate detailed report statements in functions and procedures +end package; diff --git a/src/common/protected.v08.vhdl b/src/common/protected.v08.vhdl index 6d7122957..7546e376d 100644 --- a/src/common/protected.v08.vhdl +++ b/src/common/protected.v08.vhdl @@ -1,10 +1,7 @@ --- EMACS settings: -*- tab-width: 2;indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2;replace-tabs off;indent-width 2; -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Package: Protected type implementations. +-- Package: Protected type implementations. -- -- Description: -- ------------------------------------- @@ -13,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -35,9 +32,9 @@ package ProtectedTypes is -- protected BOOLEAN implementation -- =========================================================================== type P_BOOLEAN is protected - procedure Clear; - procedure Set(Value : boolean := TRUE); - impure function Get return boolean; + procedure Clear; + procedure Set(Value : boolean := TRUE); + impure function Get return boolean; impure function Toggle return boolean; end protected; @@ -45,12 +42,12 @@ package ProtectedTypes is -- =========================================================================== -- TODO: Mult, Div, Pow, Mod, Rem type P_INTEGER is protected - procedure Clear; - procedure Set(Value : integer); - impure function Get return integer; - procedure Add(Value : integer); + procedure Clear; + procedure Set(Value : integer); + impure function Get return integer; + procedure Add(Value : integer); impure function Add(Value : integer) return integer; - procedure Sub(Value : integer); + procedure Sub(Value : integer); impure function Sub(Value : integer) return integer; end protected; @@ -58,12 +55,12 @@ package ProtectedTypes is -- =========================================================================== -- TODO: Mult, Div, Pow, Mod, Rem type P_NATURAL is protected - procedure Clear; - procedure Set(Value : natural); - impure function Get return natural; - procedure Add(Value : natural); + procedure Clear; + procedure Set(Value : natural); + impure function Get return natural; + procedure Add(Value : natural); impure function Add(Value : natural) return natural; - procedure Sub(Value : natural); + procedure Sub(Value : natural); impure function Sub(Value : natural) return natural; end protected; @@ -71,12 +68,12 @@ package ProtectedTypes is -- =========================================================================== -- TODO: Mult, Div, Pow, Mod, Rem type P_POSITIVE is protected - procedure Clear; - procedure Set(Value : positive); - impure function Get return positive; - procedure Add(Value : positive); + procedure Clear; + procedure Set(Value : positive); + impure function Get return positive; + procedure Add(Value : positive); impure function Add(Value : positive) return positive; - procedure Sub(Value : positive); + procedure Sub(Value : positive); impure function Sub(Value : positive) return positive; end protected; @@ -84,12 +81,12 @@ package ProtectedTypes is -- =========================================================================== -- TODO: Round, Mult, Div, Pow, Mod type P_REAL is protected - procedure Clear; - procedure Set(Value : REAL); - impure function Get return REAL; - procedure Add(Value : REAL); + procedure Clear; + procedure Set(Value : REAL); + impure function Get return REAL; + procedure Add(Value : REAL); impure function Add(Value : REAL) return REAL; - procedure Sub(Value : REAL); + procedure Sub(Value : REAL); impure function Sub(Value : REAL) return REAL; end protected; end package; @@ -99,16 +96,16 @@ package body ProtectedTypes is -- protected BOOLEAN implementation -- =========================================================================== type P_BOOLEAN is protected body - variable InnerValue : boolean := FALSE; + variable InnerValue : boolean := FALSE; procedure Clear is begin - InnerValue := FALSE; + InnerValue := FALSE; end procedure; procedure Set(Value : boolean := TRUE) is begin - InnerValue := Value; + InnerValue := Value; end procedure; impure function Get return boolean is @@ -118,7 +115,7 @@ package body ProtectedTypes is impure function Toggle return boolean is begin - InnerValue := not InnerValue; + InnerValue := not InnerValue; return InnerValue; end function; end protected body; @@ -126,16 +123,16 @@ package body ProtectedTypes is -- protected INTEGER implementation -- =========================================================================== type P_INTEGER is protected body - variable InnerValue : integer := 0; + variable InnerValue : integer := 0; procedure Clear is begin - InnerValue := 0; + InnerValue := 0; end procedure; procedure Set(Value : integer) is begin - InnerValue := Value; + InnerValue := Value; end procedure; impure function Get return integer is @@ -145,7 +142,7 @@ package body ProtectedTypes is procedure Add(Value : integer) is begin - InnerValue := InnerValue + Value; + InnerValue := InnerValue + Value; end procedure; impure function Add(Value : integer) return integer is @@ -156,7 +153,7 @@ package body ProtectedTypes is procedure Sub(Value : integer) is begin - InnerValue := InnerValue - Value; + InnerValue := InnerValue - Value; end procedure; impure function Sub(Value : integer) return integer is @@ -169,16 +166,16 @@ package body ProtectedTypes is -- protected NATURAL implementation -- =========================================================================== type P_NATURAL is protected body - variable InnerValue : natural := 0; + variable InnerValue : natural := 0; procedure Clear is begin - InnerValue := 0; + InnerValue := 0; end procedure; procedure Set(Value : natural) is begin - InnerValue := Value; + InnerValue := Value; end procedure; impure function Get return natural is @@ -188,7 +185,7 @@ package body ProtectedTypes is procedure Add(Value : natural) is begin - InnerValue := InnerValue + Value; + InnerValue := InnerValue + Value; end procedure; impure function Add(Value : natural) return natural is @@ -199,7 +196,7 @@ package body ProtectedTypes is procedure Sub(Value : natural) is begin - InnerValue := InnerValue - Value; + InnerValue := InnerValue - Value; end procedure; impure function Sub(Value : natural) return natural is @@ -212,16 +209,16 @@ package body ProtectedTypes is -- protected POSITIVE implementation -- =========================================================================== type P_POSITIVE is protected body - variable InnerValue : positive := 1; + variable InnerValue : positive := 1; procedure Clear is begin - InnerValue := 1; + InnerValue := 1; end procedure; procedure Set(Value : positive) is begin - InnerValue := Value; + InnerValue := Value; end procedure; impure function Get return positive is @@ -231,7 +228,7 @@ package body ProtectedTypes is procedure Add(Value : positive) is begin - InnerValue := InnerValue + Value; + InnerValue := InnerValue + Value; end procedure; impure function Add(Value : positive) return positive is @@ -242,7 +239,7 @@ package body ProtectedTypes is procedure Sub(Value : positive) is begin - InnerValue := InnerValue - Value; + InnerValue := InnerValue - Value; end procedure; impure function Sub(Value : positive) return positive is @@ -255,16 +252,16 @@ package body ProtectedTypes is -- protected REAL implementation -- =========================================================================== type P_REAL is protected body - variable InnerValue : REAL := 0.0; + variable InnerValue : REAL := 0.0; procedure Clear is begin - InnerValue := 0.0; + InnerValue := 0.0; end procedure; procedure Set(Value : REAL) is begin - InnerValue := Value; + InnerValue := Value; end procedure; impure function Get return REAL is @@ -274,7 +271,7 @@ package body ProtectedTypes is procedure Add(Value : REAL) is begin - InnerValue := InnerValue + Value; + InnerValue := InnerValue + Value; end procedure; impure function Add(Value : REAL) return REAL is @@ -285,7 +282,7 @@ package body ProtectedTypes is procedure Sub(Value : REAL) is begin - InnerValue := InnerValue - Value; + InnerValue := InnerValue - Value; end procedure; impure function Sub(Value : REAL) return REAL is diff --git a/src/common/strings.vhdl b/src/common/strings.vhdl index d3a15d0d4..9952c2e0d 100644 --- a/src/common/strings.vhdl +++ b/src/common/strings.vhdl @@ -29,10 +29,10 @@ -- limitations under the License. -- ============================================================================= -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; -use IEEE.math_real.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use IEEE.math_real.all; use work.config.all; use work.utils.all; @@ -98,7 +98,7 @@ package strings is -- to_string function to_string(Value : boolean) return string; - function to_string(Value : integer; base : positive := 10) return string; -- Do not initialize base to 10. This causes signature overlap to to_string from std packages + function to_string(Value : integer; base : positive := 10) return string; function to_string(slv : std_logic_vector; format : character := 'h'; Length : natural := 0; fill : character := '0') return string; function to_string(slv : unsigned; format : character := 'h'; Length : natural := 0; fill : character := '0') return string; function to_string(rawstring : T_RAWSTRING) return string; @@ -132,8 +132,8 @@ package strings is function to_RawString(str : string) return T_RAWSTRING; -- resize - function resize(str : string; size : positive; FillChar : character := C_POC_NUL) return string; --- function resize(rawstr : T_RAWSTRING; size : POSITIVE; FillChar : T_RAWCHAR := x"00") return T_RAWSTRING; + function resize(str : string; size : positive; FillChar : character := C_POC_NUL) return string; +-- function resize(rawstr : T_RAWSTRING; size : POSITIVE; FillChar : T_RAWCHAR := x"00") return T_RAWSTRING; -- Character functions function chr_toLower(chr : character) return character; @@ -477,11 +477,11 @@ package body strings is end loop; elsif (format = 'd') then -- TODO: enable big integer conversion --- if (slv'length < 32) then --- return INTEGER'image(int); --- else --- return raw_format_slv_dec(slv); --- end if; +-- if (slv'length < 32) then +-- return INTEGER'image(int); +-- else +-- return raw_format_slv_dec(slv); +-- end if; Result(Result'length - str'length + 1 to Result'high) := str; elsif (format = 'h') then for i in Result'reverse_range loop @@ -801,9 +801,9 @@ package body strings is else return false; end if; --- return (((str1'length = len) and (str2'length = len)) or -- both strings are fully consumed and equal --- ((str1'length > len) and (str1(str1'low + len) = C_POC_NUL)) or -- str1 is longer, but str_length equals len --- ((str2'length > len) and (str2(str2'low + len) = C_POC_NUL))); -- str2 is longer, but str_length equals len +-- return (((str1'length = len) and (str2'length = len)) or -- both strings are fully consumed and equal +-- ((str1'length > len) and (str1(str1'low + len) = C_POC_NUL)) or -- str1 is longer, but str_length equals len +-- ((str2'length > len) and (str2(str2'low + len) = C_POC_NUL))); -- str2 is longer, but str_length equals len end function; -- compare two POC_NUL terminated STRINGs; case insentitve diff --git a/src/common/utils.vhdl b/src/common/utils.vhdl index d7dd927e6..dd4322042 100644 --- a/src/common/utils.vhdl +++ b/src/common/utils.vhdl @@ -36,44 +36,41 @@ use IEEE.math_real.all; package utils is - -- Environment -- ========================================================================== -- Distinguishes simulation from synthesis - constant SIMULATION : boolean; -- deferred constant declaration + constant SIMULATION : boolean; -- deferred constant declaration + constant INTEGER_BITS : positive; -- Type declarations -- ========================================================================== --+ Vectors of primitive standard types +++++++++++++++++++++++++++++++++++++ - type T_BOOLVEC is array(natural range <>) of boolean; - type T_INTVEC is array(natural range <>) of integer; - type T_NATVEC is array(natural range <>) of natural; - type T_POSVEC is array(natural range <>) of positive; - type T_REALVEC is array(natural range <>) of real; - - function "/"(vec : T_INTVEC; int : integer) return T_INTVEC; - function "*"(vec : T_INTVEC; int : integer) return T_INTVEC; - function "-"(vec : T_INTVEC; int : integer) return T_INTVEC; - function "+"(vec : T_INTVEC; int : integer) return T_INTVEC; - function "/"(vec : T_NATVEC; int : positive) return T_NATVEC; - function "*"(vec : T_NATVEC; int : natural) return T_NATVEC; - function "-"(vec : T_NATVEC; int : integer) return T_NATVEC; - function "+"(vec : T_NATVEC; int : integer) return T_NATVEC; - function "/"(vec : T_POSVEC; int : positive) return T_POSVEC; - function "*"(vec : T_POSVEC; int : positive) return T_POSVEC; - function "-"(vec : T_POSVEC; int : integer) return T_POSVEC; - function "+"(vec : T_POSVEC; int : integer) return T_POSVEC; - function "/"(vec : T_REALVEC; int : real) return T_REALVEC; - function "*"(vec : T_REALVEC; int : real) return T_REALVEC; - function "-"(vec : T_REALVEC; int : real) return T_REALVEC; - function "+"(vec : T_REALVEC; int : real) return T_REALVEC; + type natural_vector is array(natural range <>) of natural; + type positive_vector is array(natural range <>) of positive; + + function "/"(vec : integer_vector; int : integer) return integer_vector; + function "*"(vec : integer_vector; int : integer) return integer_vector; + function "-"(vec : integer_vector; int : integer) return integer_vector; + function "+"(vec : integer_vector; int : integer) return integer_vector; + function "/"(vec : natural_vector; int : positive) return natural_vector; + function "*"(vec : natural_vector; int : natural) return natural_vector; + function "-"(vec : natural_vector; int : integer) return natural_vector; + function "+"(vec : natural_vector; int : integer) return natural_vector; + function "/"(vec : positive_vector; int : positive) return positive_vector; + function "*"(vec : positive_vector; int : positive) return positive_vector; + function "-"(vec : positive_vector; int : integer) return positive_vector; + function "+"(vec : positive_vector; int : integer) return positive_vector; + function "/"(vec : real_vector; int : real) return real_vector; + function "*"(vec : real_vector; int : real) return real_vector; + function "-"(vec : real_vector; int : real) return real_vector; + function "+"(vec : real_vector; int : real) return real_vector; --Filter - function remove_zero(vec : T_NATVEC) return T_POSVEC; - function remove_zero(vec : T_POSVEC) return T_POSVEC; - function remove_zero(vec : T_NATVEC) return T_NATVEC; - function remove_zero(vec : T_POSVEC) return T_NATVEC; + function remove_zero(vec : natural_vector) return positive_vector; + function remove_zero(vec : positive_vector) return positive_vector; + function remove_zero(vec : natural_vector) return natural_vector; + function remove_zero(vec : positive_vector) return natural_vector; --+ Integer subranges sometimes useful for speeding up simulation ++++++++++ subtype T_INT_8 is integer range -128 to 127; @@ -171,34 +168,33 @@ package utils is function dec_if(cond : boolean; value : integer; decrement : integer := 1) return integer; --+ Max / Min / Sum ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + -- FIXME: replace *min, *max functions by VHDL-2008 minimum and maximum functions function imin(arg1 : integer; arg2 : integer) return integer; -- Calculates: min(arg1, arg2) for integers alias rmin is IEEE.math_real.realmin[real, real return real]; - -- function rmin(arg1 : real; arg2 : real) return real; -- Calculates: min(arg1, arg2) for reals - function imin(vec : T_INTVEC) return integer; -- Calculates: min(vec) for a integer vector - function imin(vec : T_NATVEC) return natural; -- Calculates: min(vec) for a natural vector - function imin(vec : T_POSVEC) return positive; -- Calculates: min(vec) for a positive vector - function rmin(vec : T_REALVEC) return real; -- Calculates: min(vec) of real vector + function imin(vec : integer_vector) return integer; -- Calculates: min(vec) for a integer vector + function imin(vec : natural_vector) return natural; -- Calculates: min(vec) for a natural vector + function imin(vec : positive_vector) return positive; -- Calculates: min(vec) for a positive vector + function rmin(vec : real_vector) return real; -- Calculates: min(vec) of real vector function imax(arg1 : integer; arg2 : integer) return integer; -- Calculates: max(arg1, arg2) for integers alias rmax is IEEE.math_real.realmax[real, real return real]; - -- function rmax(arg1 : real; arg2 : real) return real; -- Calculates: max(arg1, arg2) for reals - function imax(vec : T_INTVEC) return integer; -- Calculates: max(vec) for a integer vector - function imax(vec : T_NATVEC) return natural; -- Calculates: max(vec) for a natural vector - function imax(vec : T_POSVEC) return positive; -- Calculates: max(vec) for a positive vector - function rmax(vec : T_REALVEC) return real; -- Calculates: max(vec) of real vector + function imax(vec : integer_vector) return integer; -- Calculates: max(vec) for a integer vector + function imax(vec : natural_vector) return natural; -- Calculates: max(vec) for a natural vector + function imax(vec : positive_vector) return positive; -- Calculates: max(vec) for a positive vector + function rmax(vec : real_vector) return real; -- Calculates: max(vec) of real vector - function isum(vec : T_NATVEC) return natural; -- Calculates: sum(vec) for a natural vector - function isum(vec : T_POSVEC) return natural; -- Calculates: sum(vec) for a positive vector - function isum(vec : T_INTVEC) return integer; -- Calculates: sum(vec) of integer vector - function rsum(vec : T_REALVEC) return real; -- Calculates: sum(vec) of real vector + function isum(vec : natural_vector) return natural; -- Calculates: sum(vec) for a natural vector + function isum(vec : positive_vector) return natural; -- Calculates: sum(vec) for a positive vector + function isum(vec : integer_vector) return integer; -- Calculates: sum(vec) of integer vector + function rsum(vec : real_vector) return real; -- Calculates: sum(vec) of real vector --+ Find index in array +++++++++++++++++++++++++++++++++++++++++++++++++++ - function indexof(vec : T_INTVEC; comp : integer; falseNum : integer := -1) return integer; - function indexof(vec : T_NATVEC; comp : natural; falseNum : integer := -1) return integer; - function indexof(vec : T_POSVEC; comp : positive; falseNum : integer := -1) return integer; - function indexof(vec : T_REALVEC; comp : real; falseNum : integer := -1; epsilon : real := 1.0E-6) return integer; + function indexof(vec : integer_vector; comp : integer; falseNum : integer := -1) return integer; + function indexof(vec : natural_vector; comp : natural; falseNum : integer := -1) return integer; + function indexof(vec : positive_vector; comp : positive; falseNum : integer := -1) return integer; + function indexof(vec : real_vector; comp : real; falseNum : integer := -1; epsilon : real := 1.0E-6) return integer; --+ Conversions ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -352,22 +348,26 @@ package body utils is function is_simulation return boolean is variable temp : boolean := false; begin - -- WORKAROUND: for Xilinx ISE - -- Version: all versions with enabled 'use_new_parser' option - -- Issue: Is_X('X') does not evaluate to TRUE in synthesis - -- Solution: Use '--synthesis translate_on/off' pragmas --synthesis translate_off temp := true; --synthesis translate_on + return temp; end function; + function get_integer_bits return positive is + begin + return integer(log2(real(integer'high))) +1; + end function; + + -- deferred constant assignment - constant SIMULATION : boolean := is_simulation; + constant SIMULATION : boolean := is_simulation; + constant INTEGER_BITS : positive := get_integer_bits; -- Vector Opperations -- =========================================================================== - function "/"(vec : T_INTVEC; int : integer) return T_INTVEC is + function "/"(vec : integer_vector; int : integer) return integer_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -376,7 +376,7 @@ package body utils is return result; end function; - function "*"(vec : T_INTVEC; int : integer) return T_INTVEC is + function "*"(vec : integer_vector; int : integer) return integer_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -385,7 +385,7 @@ package body utils is return result; end function; - function "-"(vec : T_INTVEC; int : integer) return T_INTVEC is + function "-"(vec : integer_vector; int : integer) return integer_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -394,7 +394,7 @@ package body utils is return result; end function; - function "+"(vec : T_INTVEC; int : integer) return T_INTVEC is + function "+"(vec : integer_vector; int : integer) return integer_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -403,7 +403,7 @@ package body utils is return result; end function; - function "/"(vec : T_NATVEC; int : positive) return T_NATVEC is + function "/"(vec : natural_vector; int : positive) return natural_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -412,7 +412,7 @@ package body utils is return result; end function; - function "*"(vec : T_NATVEC; int : natural) return T_NATVEC is + function "*"(vec : natural_vector; int : natural) return natural_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -421,7 +421,7 @@ package body utils is return result; end function; - function "-"(vec : T_NATVEC; int : integer) return T_NATVEC is + function "-"(vec : natural_vector; int : integer) return natural_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -430,7 +430,7 @@ package body utils is return result; end function; - function "+"(vec : T_NATVEC; int : integer) return T_NATVEC is + function "+"(vec : natural_vector; int : integer) return natural_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -439,7 +439,7 @@ package body utils is return result; end function; - function "/"(vec : T_POSVEC; int : positive) return T_POSVEC is + function "/"(vec : positive_vector; int : positive) return positive_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -448,7 +448,7 @@ package body utils is return result; end function; - function "*"(vec : T_POSVEC; int : positive) return T_POSVEC is + function "*"(vec : positive_vector; int : positive) return positive_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -457,7 +457,7 @@ package body utils is return result; end function; - function "-"(vec : T_POSVEC; int : integer) return T_POSVEC is + function "-"(vec : positive_vector; int : integer) return positive_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -466,7 +466,7 @@ package body utils is return result; end function; - function "+"(vec : T_POSVEC; int : integer) return T_POSVEC is + function "+"(vec : positive_vector; int : integer) return positive_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -475,7 +475,7 @@ package body utils is return result; end function; - function "/"(vec : T_REALVEC; int : real) return T_REALVEC is + function "/"(vec : real_vector; int : real) return real_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -484,7 +484,7 @@ package body utils is return result; end function; - function "*"(vec : T_REALVEC; int : real) return T_REALVEC is + function "*"(vec : real_vector; int : real) return real_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -493,7 +493,7 @@ package body utils is return result; end function; - function "-"(vec : T_REALVEC; int : real) return T_REALVEC is + function "-"(vec : real_vector; int : real) return real_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -502,7 +502,7 @@ package body utils is return result; end function; - function "+"(vec : T_REALVEC; int : real) return T_REALVEC is + function "+"(vec : real_vector; int : real) return real_vector is variable result : vec'subtype; begin for i in vec'range loop @@ -512,8 +512,8 @@ package body utils is end function; - function remove_zero(vec : T_NATVEC) return T_POSVEC is - variable temp : T_POSVEC(0 to vec'high); + function remove_zero(vec : natural_vector) return positive_vector is + variable temp : positive_vector(0 to vec'high); variable pos : natural := 0; begin for i in 0 to vec'length -1 loop @@ -526,8 +526,8 @@ package body utils is return temp(0 to pos -1); end function; - function remove_zero(vec : T_POSVEC) return T_POSVEC is - variable temp : T_POSVEC(0 to vec'high); + function remove_zero(vec : positive_vector) return positive_vector is + variable temp : positive_vector(0 to vec'high); variable pos : natural := 0; begin for i in 0 to vec'length -1 loop @@ -540,8 +540,8 @@ package body utils is return temp(0 to pos -1); end function; - function remove_zero(vec : T_NATVEC) return T_NATVEC is - variable temp : T_NATVEC(0 to vec'high); + function remove_zero(vec : natural_vector) return natural_vector is + variable temp : natural_vector(0 to vec'high); variable pos : natural := 0; begin for i in 0 to vec'length -1 loop @@ -554,8 +554,8 @@ package body utils is return temp(0 to pos -1); end function; - function remove_zero(vec : T_POSVEC) return T_NATVEC is - variable temp : T_NATVEC(0 to vec'high); + function remove_zero(vec : positive_vector) return natural_vector is + variable temp : natural_vector(0 to vec'high); variable pos : natural := 0; begin for i in 0 to vec'length -1 loop @@ -750,11 +750,12 @@ package body utils is variable log : natural := 1; begin if arg = 1 then return 0; end if; - while arg > tmp loop - tmp := tmp * 2; - log := log + 1; + for i in 1 to INTEGER_BITS -2 loop + if arg <= 2**i then + return i; + end if; end loop; - return log; + return INTEGER_BITS -1; end function; -- return log2; always rounded up; the return value is >= 1 @@ -912,13 +913,7 @@ package body utils is end if; end function; - -- function rmin(arg1 : real; arg2 : real) return real is - -- begin - -- if arg1 < arg2 then return arg1; end if; - -- return arg2; - -- end function; - - function imin(vec : T_INTVEC) return integer is + function imin(vec : integer_vector) return integer is variable result : integer; begin result := integer'high; @@ -930,7 +925,7 @@ package body utils is return result; end function; - function imin(vec : T_NATVEC) return natural is + function imin(vec : natural_vector) return natural is variable result : natural; begin result := natural'high; @@ -942,7 +937,7 @@ package body utils is return result; end function; - function imin(vec : T_POSVEC) return positive is + function imin(vec : positive_vector) return positive is variable result : positive; begin result := positive'high; @@ -954,7 +949,7 @@ package body utils is return result; end function; - function rmin(vec : T_REALVEC) return real is + function rmin(vec : real_vector) return real is variable result : real; begin result := real'high; @@ -972,13 +967,7 @@ package body utils is return arg2; end function; - -- function rmax(arg1 : real; arg2 : real) return real is - -- begin - -- if arg1 > arg2 then return arg1; end if; - -- return arg2; - -- end function; - - function imax(vec : T_INTVEC) return integer is + function imax(vec : integer_vector) return integer is variable result : integer; begin result := integer'low; @@ -990,7 +979,7 @@ package body utils is return result; end function; - function imax(vec : T_NATVEC) return natural is + function imax(vec : natural_vector) return natural is variable result : natural; begin result := natural'low; @@ -1002,7 +991,7 @@ package body utils is return result; end function; - function imax(vec : T_POSVEC) return positive is + function imax(vec : positive_vector) return positive is variable result : positive; begin result := positive'low; @@ -1014,7 +1003,7 @@ package body utils is return result; end function; - function rmax(vec : T_REALVEC) return real is + function rmax(vec : real_vector) return real is variable result : real; begin result := real'low; @@ -1026,7 +1015,7 @@ package body utils is return result; end function; - function isum(vec : T_INTVEC) return integer is + function isum(vec : integer_vector) return integer is variable result : integer; begin result := 0; @@ -1036,7 +1025,7 @@ package body utils is return result; end function; - function isum(vec : T_NATVEC) return natural is + function isum(vec : natural_vector) return natural is variable result : natural; begin result := 0; @@ -1046,7 +1035,7 @@ package body utils is return result; end function; - function isum(vec : T_POSVEC) return natural is + function isum(vec : positive_vector) return natural is variable result : natural; begin result := 0; @@ -1056,7 +1045,7 @@ package body utils is return result; end function; - function rsum(vec : T_REALVEC) return real is + function rsum(vec : real_vector) return real is variable result : real; begin result := 0.0; @@ -1068,46 +1057,46 @@ package body utils is -- Find Index in array --============================================================================= - function indexof(vec : T_NATVEC; comp : natural; falseNum : integer := -1) return integer is + function indexof(vec : natural_vector; comp : natural; falseNum : integer := -1) return integer is begin - for i in vec'range loop - if vec(i) = comp then - return i; - end if; - end loop; - return falseNum; + for i in vec'range loop + if vec(i) = comp then + return i; + end if; + end loop; + return falseNum; end function; - function indexof(vec : T_INTVEC; comp : integer; falseNum : integer := -1) return integer is + function indexof(vec : integer_vector; comp : integer; falseNum : integer := -1) return integer is begin - for i in vec'range loop - if vec(i) = comp then - return i; - end if; - end loop; - return falseNum; + for i in vec'range loop + if vec(i) = comp then + return i; + end if; + end loop; + return falseNum; end function; - function indexof(vec : T_POSVEC; comp : positive; falseNum : integer := -1) return integer is + function indexof(vec : positive_vector; comp : positive; falseNum : integer := -1) return integer is begin - for i in vec'range loop - if vec(i) = comp then - return i; - end if; - end loop; - return falseNum; + for i in vec'range loop + if vec(i) = comp then + return i; + end if; + end loop; + return falseNum; end function; - function indexof(vec : T_REALVEC; comp : real; falseNum : integer := -1; epsilon : real := 1.0E-6) return integer is - constant upper : real := comp + (comp * epsilon); - constant lower : real := comp - (comp * epsilon); + function indexof(vec : real_vector; comp : real; falseNum : integer := -1; epsilon : real := 1.0E-6) return integer is + constant upper : real := comp + (comp * epsilon); + constant lower : real := comp - (comp * epsilon); begin - for i in vec'range loop - if (vec(i) >= lower) and (vec(i) <= upper) then - return i; - end if; - end loop; - return falseNum; + for i in vec'range loop + if (vec(i) >= lower) and (vec(i) <= upper) then + return i; + end if; + end loop; + return falseNum; end function; -- Vector aggregate functions: slv_* @@ -1152,7 +1141,7 @@ package body utils is return res; end function; - --Example from: https://riptutorial.com/vhdl/example/32304/computing-the-hamming-weight-of-a-vector + -- Example from: https://riptutorial.com/vhdl/example/32304/computing-the-hamming-weight-of-a-vector function hammingWeight(v: std_logic_vector) return natural is constant size: natural := v'length; constant vv: std_logic_vector(size - 1 downto 0) := v; @@ -1650,7 +1639,7 @@ package body utils is function movez(vec : std_logic_vector) return std_logic_vector is begin - return move(vec, -vec'low); + return move(vec, -vec'low); end function; function ascend(vec : std_logic_vector) return std_logic_vector is @@ -1661,10 +1650,9 @@ package body utils is end function; function descend(vec : std_logic_vector) return std_logic_vector is - variable res : std_logic_vector(vec'high downto vec'low); + variable res : std_logic_vector(vec'high downto vec'low); begin res := vec; return res; end function; - end package body; diff --git a/src/common/vectors.vhdl b/src/common/vectors.vhdl index 07f900920..aa7733574 100644 --- a/src/common/vectors.vhdl +++ b/src/common/vectors.vhdl @@ -96,7 +96,7 @@ package vectors is type T_DATA_BE_VECTOR is array(natural range <>) of T_DATA_BE; -- STD_LOGIC_VECTOR_VECTORs - type T_SLVV is array(NATURAL range <>) of STD_LOGIC_VECTOR; -- VHDL 2008 syntax - not yet supported by Xilinx + type T_SLVV is array(NATURAL range <>) of STD_LOGIC_VECTOR; subtype T_SLVV_2 is T_SLVV(open)(1 downto 0); subtype T_SLVV_3 is T_SLVV(open)(2 downto 0); subtype T_SLVV_4 is T_SLVV(open)(3 downto 0); @@ -111,7 +111,7 @@ package vectors is subtype T_SLVV_256 is T_SLVV(open)(255 downto 0); subtype T_SLVV_512 is T_SLVV(open)(511 downto 0); -- UNSIGNED_VECTORs - type T_SLUV is array(NATURAL range <>) of UNSIGNED; -- VHDL 2008 syntax - not yet supported by Xilinx + type T_SLUV is array(NATURAL range <>) of UNSIGNED; subtype T_SLUV_2 is T_SLUV(open)(1 downto 0); subtype T_SLUV_3 is T_SLUV(open)(2 downto 0); subtype T_SLUV_4 is T_SLUV(open)(3 downto 0); @@ -126,7 +126,7 @@ package vectors is subtype T_SLUV_256 is T_SLUV(open)(255 downto 0); subtype T_SLUV_512 is T_SLUV(open)(511 downto 0); -- SIGNED_VECTORs - type T_SLSV is array(NATURAL range <>) of SIGNED; -- VHDL 2008 syntax - not yet supported by Xilinx + type T_SLSV is array(NATURAL range <>) of SIGNED; subtype T_SLSV_2 is T_SLSV(open)(1 downto 0); subtype T_SLSV_3 is T_SLSV(open)(2 downto 0); subtype T_SLSV_4 is T_SLSV(open)(3 downto 0); @@ -150,29 +150,23 @@ package vectors is -- ATTENTION: -- 1. you MUST initialize your matrix signal with 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) -- Example: signal myMatrix : T_SLM(3 downto 0, 7 downto 0) := (others => (others => 'Z')); - -- 2. Xilinx iSIM bug: DON'T use myMatrix'range(n) for n >= 2 - -- myMatrix'range(2) returns always myMatrix'range(1); see work-around notes below -- -- USAGE NOTES: -- dimension 1 => rows - e.g. Words -- dimension 2 => columns - e.g. Bits/Bytes in a word - -- - -- WORKAROUND: for Xilinx ISE/iSim - -- Version: 14.2 - -- Issue: myMatrix'range(n) for n >= 2 returns always myMatrix'range(1) -- ========================================================================== -- Function declarations -- ========================================================================== -- slicing boundary calculations - function low (lenvec : T_POSVEC; index : natural) return natural; - function low (lenvec : T_NATVEC; index : natural) return natural; - function high(lenvec : T_POSVEC; index : natural) return natural; - function high(lenvec : T_NATVEC; index : natural) return natural; + function low (lenvec : positive_vector; index : natural) return natural; + function low (lenvec : natural_vector; index : natural) return natural; + function high(lenvec : positive_vector; index : natural) return natural; + function high(lenvec : natural_vector; index : natural) return natural; -- Make vector of constant - function genVector(const : std_logic; length : natural) return std_logic_vector; - function genVector(const : T_SLV_8; length : natural) return T_SLVV_8; -- FIXME; input should be std_logic_vector and output any SLVV + function genVector(const : std_logic; length : natural) return std_logic_vector; + function genVector(const : std_logic_vector; length : natural) return T_SLVV; -- FIXME: provide also for SLUV, SLSV -- Assign procedures: assign_* @@ -180,8 +174,8 @@ package vectors is procedure assign_row(signal slm : out T_SLM_8 ; slv : T_SLVV_8 ; constant RowIndex : natural); -- assign vector to complete row procedure assign_row(signal slm : out T_SLM_32; slv : T_SLVV_32 ; constant RowIndex : natural); -- assign vector to complete row procedure assign_row(signal slm : out T_SLM ; slv : std_logic_vector; constant RowIndex : natural; Position : natural); -- assign short vector to row starting at position - procedure assign_row(signal slm : out T_SLM ; slv : std_logic_vector; constant RowIndex : natural; High : natural; Low : natural); -- assign short vector to row in range high:low - procedure assign_row(signal slm : out T_SLM_8 ; slv : T_SLVV_8 ; constant RowIndex : natural; High : natural; Low : natural); -- assign short vector to row in range high:low + procedure assign_row(signal slm : out T_SLM ; slv : std_logic_vector; constant RowIndex : natural; High : natural; Low : natural); -- assign short vector to row in range high:low + procedure assign_row(signal slm : out T_SLM_8 ; slv : T_SLVV_8 ; constant RowIndex : natural; High : natural; Low : natural); -- assign short vector to row in range high:low procedure assign_col(signal slm : out T_SLM ; slv : std_logic_vector; constant ColIndex : natural); -- assign vector to complete column -- ATTENTION: see T_SLM definition for further details and work-arounds @@ -339,7 +333,7 @@ end package vectors; package body vectors is -- slicing boundary calulations -- ========================================================================== - function low(lenvec : T_POSVEC; index : natural) return natural is + function low(lenvec : positive_vector; index : natural) return natural is variable pos : natural := 0; begin for i in lenvec'low to index - 1 loop @@ -348,7 +342,7 @@ package body vectors is return pos; end function; - function low(lenvec : T_NATVEC; index : natural) return natural is + function low(lenvec : natural_vector; index : natural) return natural is variable pos : natural := 0; begin for i in lenvec'low to index - 1 loop @@ -357,7 +351,7 @@ package body vectors is return pos; end function; - function high(lenvec : T_POSVEC; index : natural) return natural is + function high(lenvec : positive_vector; index : natural) return natural is variable pos : natural := 0; begin for i in lenvec'low to index loop @@ -366,7 +360,7 @@ package body vectors is return pos - 1; end function; - function high(lenvec : T_NATVEC; index : natural) return natural is + function high(lenvec : natural_vector; index : natural) return natural is variable pos : natural := 0; begin for i in lenvec'low to index loop @@ -383,8 +377,8 @@ package body vectors is end function; -- FIXME: input as std_logic, return an SLVV of that size - function genVector(const : T_SLV_8; length : natural) return T_SLVV_8 is - variable slv : T_SLVV_8(length -1 downto 0) := (others => const); -- FIXME: use (length - 1 downto 0 => ...) directly in return statement + function genVector(const : std_logic_vector; length : natural) return T_SLVV is + variable slv : T_SLVV(length -1 downto 0)(const'range) := (others => const); -- FIXME: use (length - 1 downto 0 => ...) directly in return statement begin return slv; end function; @@ -392,7 +386,7 @@ package body vectors is -- Assign procedures: assign_* -- ========================================================================== procedure assign_row(signal slm : out T_SLM; slv : std_logic_vector; constant RowIndex : natural) is - variable temp : std_logic_vector(slm'high(2) downto slm'low(2)); -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + variable temp : std_logic_vector(slm'range(2)); begin temp := slv; for i in temp'range loop @@ -402,7 +396,7 @@ package body vectors is --todo : test procedure assign_row(signal slm : out T_SLM_8; slv : T_SLVV_8; constant RowIndex : natural) is - variable temp : T_SLVV_8(slm'high(2) downto slm'low(2)); -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + variable temp : T_SLVV_8(slm'range(2)); begin temp := slv; for i in temp'range loop @@ -412,7 +406,7 @@ package body vectors is --todo : test procedure assign_row(signal slm : out T_SLM_32; slv : T_SLVV_32; constant RowIndex : natural) is - variable temp : T_SLVV_32(slm'high(2) downto slm'low(2)); -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + variable temp : T_SLVV_32(slm'range(2)); begin temp := slv; for i in temp'range loop @@ -460,7 +454,7 @@ package body vectors is -- Matrix to matrix conversion: slm_slice* -- ========================================================================== function slm_slice(slm : T_SLM; RowIndex : natural; ColIndex : natural; Height : natural; Width : natural) return T_SLM is - variable Result : T_SLM(Height - 1 downto 0, Width - 1 downto 0) := (others => (others => '0')); + variable Result : T_SLM(Height - 1 downto 0, Width - 1 downto 0) := (others => (others => '0')); begin for i in 0 to Height - 1 loop for j in 0 to Width - 1 loop @@ -471,7 +465,7 @@ package body vectors is end function; function slm_slice_rows(slm : T_SLM; High : natural; Low : natural) return T_SLM is - variable Result : T_SLM(High - Low downto 0, slm'length(2) - 1 downto 0) := (others => (others => '0')); + variable Result : T_SLM(High - Low downto 0, slm'length(2) - 1 downto 0) := (others => (others => '0')); begin for i in 0 to High - Low loop for j in 0 to slm'length(2) - 1 loop @@ -482,7 +476,7 @@ package body vectors is end function; function slm_slice_cols(slm : T_SLM; High : natural; Low : natural) return T_SLM is - variable Result : T_SLM(slm'length(1) - 1 downto 0, High - Low downto 0) := (others => (others => '0')); + variable Result : T_SLM(slm'length(1) - 1 downto 0, High - Low downto 0) := (others => (others => '0')); begin for i in 0 to slm'length(1) - 1 loop for j in 0 to High - Low loop @@ -494,7 +488,7 @@ package body vectors is -- Boolean Operators function "not"(a : t_slm) return t_slm is - variable res : t_slm(a'range(1), a'range(2)); + variable res : t_slm(a'range(1), a'range(2)); begin for i in res'range(1) loop for j in res'range(2) loop @@ -505,7 +499,8 @@ package body vectors is end function; function "and"(a, b : t_slm) return t_slm is - variable bb, res : t_slm(a'range(1), a'range(2)); + variable bb : t_slm(a'range(1), a'range(2)); + variable res : t_slm(a'range(1), a'range(2)); begin bb := b; for i in res'range(1) loop @@ -517,7 +512,8 @@ package body vectors is end function; function "or"(a, b : t_slm) return t_slm is - variable bb, res : t_slm(a'range(1), a'range(2)); + variable bb : t_slm(a'range(1), a'range(2)); + variable res : t_slm(a'range(1), a'range(2)); begin bb := b; for i in res'range(1) loop @@ -529,7 +525,8 @@ package body vectors is end function; function "xor"(a, b : t_slm) return t_slm is - variable bb, res : t_slm(a'range(1), a'range(2)); + variable bb : t_slm(a'range(1), a'range(2)); + variable res : t_slm(a'range(1), a'range(2)); begin bb := b; for i in res'range(1) loop @@ -562,12 +559,12 @@ package body vectors is variable slm : T_SLM(ROWS - 1 downto 0, COLUMNS - 1 downto 0); begin for i in slm1'range(1) loop - for j in slm1'low(2) to slm1'high(2) loop -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + for j in slm1'range(2) loop slm(i, j) := slm1(i, j); end loop; end loop; for i in slm2'range(1) loop - for j in slm2'low(2) to slm2'high(2) loop -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + for j in slm2'range(2) loop slm(slm1'length(1) + i, j) := slm2(i, j); end loop; end loop; @@ -580,10 +577,10 @@ package body vectors is variable slm : T_SLM(ROWS - 1 downto 0, COLUMNS - 1 downto 0); begin for i in slm1'range(1) loop - for j in slm1'low(2) to slm1'high(2) loop -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + for j in slm1'range(2) loop slm(i, j) := slm1(i, j); end loop; - for j in slm2'low(2) to slm2'high(2) loop -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + for j in slm2'range(2) loop slm(i, slm1'length(2) + j) := slm2(i, j); end loop; end loop; @@ -605,7 +602,7 @@ package body vectors is -- get a matrix row function get_row(slm : T_SLM; RowIndex : natural) return std_logic_vector is - variable slv : std_logic_vector(slm'high(2) downto slm'low(2)); -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + variable slv : std_logic_vector(slm'range(2)); begin for i in slv'range loop slv(i) := slm(RowIndex, i); @@ -614,7 +611,7 @@ package body vectors is end function; function get_row(slm : T_SLM; RowIndex : natural) return unsigned is - variable us : unsigned(slm'high(2) downto slm'low(2)); -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + variable us : unsigned(slm'range(2)); begin for i in us'range loop us(i) := slm(RowIndex, i); @@ -623,7 +620,7 @@ package body vectors is end function; function get_row(slm : T_SLM; RowIndex : natural) return signed is - variable s : signed(slm'high(2) downto slm'low(2)); -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + variable s : signed(slm'range(2)); begin for i in s'range loop s(i) := slm(RowIndex, i); @@ -633,7 +630,7 @@ package body vectors is -- TODO: test function get_row(slm : T_SLM_8; RowIndex : natural) return T_SLVV_8 is - variable slv : T_SLVV_8(slm'high(2) downto slm'low(2)); -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + variable slv : T_SLVV_8(slm'range(2)); begin for i in slv'range loop slv(i) := slm(RowIndex, i); @@ -643,7 +640,7 @@ package body vectors is -- TODO: test function get_row(slm : T_SLM_32; RowIndex : natural) return T_SLVV_32 is - variable slv : T_SLVV_32(slm'high(2) downto slm'low(2)); -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + variable slv : T_SLVV_32(slm'range(2)); begin for i in slv'range loop slv(i) := slm(RowIndex, i); @@ -671,7 +668,7 @@ package body vectors is -- ========================================================================== -- get a vector-vector row function extract_row(slvv : T_SLVV; RowIndex : natural) return std_logic_vector is - variable slv : std_logic_vector(slvv'range); + variable slv : std_logic_vector(slvv'range); begin for i in slv'range loop slv(i) := slvv(i)(RowIndex); @@ -680,7 +677,7 @@ package body vectors is end function; function extract_row(sluv : T_SLUV; RowIndex : natural) return unsigned is - variable us : unsigned(sluv'range); + variable us : unsigned(sluv'range); begin for i in us'range loop us(i) := sluv(i)(RowIndex); @@ -689,7 +686,7 @@ package body vectors is end function; function extract_row(slsv : T_SLSV; RowIndex : natural) return signed is - variable s : signed(slsv'range); + variable s : signed(slsv'range); begin for i in s'range loop s(i) := slsv(i)(RowIndex); @@ -706,7 +703,7 @@ package body vectors is variable slv : std_logic_vector((first_len * second_len) - 1 downto 0); begin for i in slvv'range loop - slv(((i - slvv'low) * second_len) + second_len -1 downto ((i - slvv'low) * second_len)) := slvv(i); + slv(((i - slvv'low) * second_len) + second_len -1 downto ((i - slvv'low) * second_len)) := slvv(i); end loop; return slv; end function; @@ -717,7 +714,7 @@ package body vectors is variable slv : std_logic_vector((first_len * second_len) - 1 downto 0); begin for i in sluv'range loop - slv(((i - sluv'low) * second_len) + second_len -1 downto ((i - sluv'low) * second_len)) := std_logic_vector(sluv(i)); + slv(((i - sluv'low) * second_len) + second_len -1 downto ((i - sluv'low) * second_len)) := std_logic_vector(sluv(i)); end loop; return slv; end function; @@ -728,7 +725,7 @@ package body vectors is variable slv : std_logic_vector((first_len * second_len) - 1 downto 0); begin for i in slsv'range loop - slv(((i - slsv'low) * second_len) + second_len -1 downto ((i - slsv'low) * second_len)) := std_logic_vector(slsv(i)); + slv(((i - slsv'low) * second_len) + second_len -1 downto ((i - slsv'low) * second_len)) := std_logic_vector(slsv(i)); end loop; return slv; end function; @@ -760,7 +757,7 @@ package body vectors is variable slv : std_logic_vector((slm'length(1) * slm'length(2)) - 1 downto 0); begin for i in slm'range(1) loop - for j in slm'high(2) downto slm'low(2) loop -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + for j in slm'range(2) loop slv((i * slm'length(2)) + j) := slm(i, j); end loop; end loop; @@ -771,7 +768,7 @@ package body vectors is variable us : unsigned((slm'length(1) * slm'length(2)) - 1 downto 0); begin for i in slm'range(1) loop - for j in slm'high(2) downto slm'low(2) loop -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + for j in slm'range(2) loop us((i * slm'length(2)) + j) := slm(i, j); end loop; end loop; @@ -782,7 +779,7 @@ package body vectors is variable s : signed((slm'length(1) * slm'length(2)) - 1 downto 0); begin for i in slm'range(1) loop - for j in slm'high(2) downto slm'low(2) loop -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + for j in slm'range(2) loop s((i * slm'length(2)) + j) := slm(i, j); end loop; end loop; @@ -794,7 +791,7 @@ package body vectors is -- ========================================================================== -- create vector-vector from vector function to_slvv(slv : std_logic_vector; sub_element_length : natural) return T_SLVV is - variable Result : T_SLVV((slv'length / sub_element_length) - 1 downto 0)(sub_element_length -1 downto 0); + variable Result : T_SLVV((slv'length / sub_element_length) - 1 downto 0)(sub_element_length -1 downto 0); begin assert ((slv'length mod sub_element_length) = 0) report "to_slvv: width mismatch - slv'length is no multiple of sub_element_length (slv'length=" & INTEGER'image(slv'length) & ")" severity FAILURE; assert slv'left >= slv'right report "to_slvv:: slv is not descending: slv'left=" & integer'image(slv'left) & ", slv'right=" & integer'image(slv'right) severity FAILURE; @@ -806,7 +803,7 @@ package body vectors is end function; function to_sluv(slv : std_logic_vector; sub_element_length : natural) return T_SLUV is - variable Result : T_SLUV((slv'length / sub_element_length) - 1 downto 0)(sub_element_length -1 downto 0); + variable Result : T_SLUV((slv'length / sub_element_length) - 1 downto 0)(sub_element_length -1 downto 0); begin if ((slv'length mod sub_element_length) /= 0) then report "to_sluv: width mismatch - slv'length is no multiple of sub_element_length (slv'length=" & INTEGER'image(slv'length) & ")" severity FAILURE; end if; @@ -1113,7 +1110,7 @@ package body vectors is -- ========================================================================== -- create vector-vector from matrix function to_slvv(slm : T_SLM) return T_SLVV is - variable Result : T_SLVV(slm'length(1) -1 downto 0)(slm'length(2) -1 downto 0); + variable Result : T_SLVV(slm'length(1) -1 downto 0)(slm'length(2) -1 downto 0); begin for i in slm'range(1) loop Result(i) := get_row(slm, i); @@ -1122,7 +1119,7 @@ package body vectors is end function; function to_sluv(slm : T_SLM) return T_SLUV is - variable Result : T_SLUV(slm'length(1) -1 downto 0)(slm'length(2) -1 downto 0); + variable Result : T_SLUV(slm'length(1) -1 downto 0)(slm'length(2) -1 downto 0); begin for i in slm'range(1) loop Result(i) := get_row(slm, i); @@ -1131,7 +1128,7 @@ package body vectors is end function; function to_slsv(slm : T_SLM) return T_SLSV is - variable Result : T_SLSV(slm'length(1) -1 downto 0)(slm'length(2) -1 downto 0); + variable Result : T_SLSV(slm'length(1) -1 downto 0)(slm'length(2) -1 downto 0); begin for i in slm'range(1) loop Result(i) := get_row(slm, i); @@ -1142,6 +1139,7 @@ package body vectors is -- create vector-vector from matrix (2 bit) function to_slvv_2(slm : T_SLM) return T_SLVV_2 is begin + -- FIXME: change to assert statement if (slm'length(2) /= 2) then report "to_slvv_2: type mismatch - slm'length(2)=" & integer'image(slm'length(2)) severity FAILURE; end if; return to_slvv(slm); end function; @@ -1333,7 +1331,7 @@ package body vectors is -- ========================================================================== -- create matrix from vector function to_slm(slv : std_logic_vector; ROWS : positive; COLS : positive) return T_SLM is - variable slm : T_SLM(ROWS - 1 downto 0, COLS - 1 downto 0); + variable slm : T_SLM(ROWS - 1 downto 0, COLS - 1 downto 0); begin for i in 0 to ROWS - 1 loop for j in 0 to COLS - 1 loop @@ -1344,7 +1342,7 @@ package body vectors is end function; function to_slm(us : unsigned; ROWS : positive; COLS : positive) return T_SLM is - variable slm : T_SLM(ROWS - 1 downto 0, COLS - 1 downto 0); + variable slm : T_SLM(ROWS - 1 downto 0, COLS - 1 downto 0); begin for i in 0 to ROWS - 1 loop for j in 0 to COLS - 1 loop @@ -1355,7 +1353,7 @@ package body vectors is end function; function to_slm(s : signed; ROWS : positive; COLS : positive) return T_SLM is - variable slm : T_SLM(ROWS - 1 downto 0, COLS - 1 downto 0); + variable slm : T_SLM(ROWS - 1 downto 0, COLS - 1 downto 0); begin for i in 0 to ROWS - 1 loop for j in 0 to COLS - 1 loop @@ -1367,35 +1365,33 @@ package body vectors is -- create matrix from vector-vector function to_slm(slvv : T_SLVV) return T_SLM is - variable slm : T_SLM(slvv'range, slvv(slvv'left)'range); + variable slm : T_SLM(slvv'range, slvv(slvv'left)'range); begin for i in slvv'range loop for j in slvv(slvv'left)'range loop - slm(i, j) := slvv(i)(j); + slm(i, j) := slvv(i)(j); end loop; end loop; return slm; end function; - function to_slm(sluv : T_SLUV) return T_SLM is - variable slm : T_SLM(sluv'range, sluv(sluv'left)'range); + variable slm : T_SLM(sluv'range, sluv(sluv'left)'range); begin for i in sluv'range loop for j in sluv(sluv'left)'range loop - slm(i, j) := sluv(i)(j); + slm(i, j) := sluv(i)(j); end loop; end loop; return slm; end function; - function to_slm(slsv : T_SLSV) return T_SLM is - variable slm : T_SLM(slsv'range, slsv(slsv'left)'range); + variable slm : T_SLM(slsv'range, slsv(slsv'left)'range); begin for i in slsv'range loop for j in slsv(slsv'left)'range loop - slm(i, j) := slsv(i)(j); + slm(i, j) := slsv(i)(j); end loop; end loop; return slm; @@ -1458,7 +1454,7 @@ package body vectors is -- vectors are extended on the left by the provided fill value (default: '0'). Use the resize functions of the numeric_std package for -- value-preserving resizes of the signed and unsigned data types. function resize(slm : T_SLM; size : positive) return T_SLM is - variable Result : T_SLM(size - 1 downto 0, slm'high(2) downto slm'low(2)) := (others => (others => '0')); -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + variable Result : T_SLM(size - 1 downto 0, slm'high(2) downto slm'low(2)) := (others => (others => '0')); -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration begin for i in slm'range(1) loop for j in slm'high(2) downto slm'low(2) loop -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration @@ -1469,9 +1465,9 @@ package body vectors is end function; function to_string(slvv : T_SLVV_8; sep : character := ':') return string is - constant hex_len : positive := ite((sep = C_POC_NUL), (slvv'length * 2), (slvv'length * 3) - 1); - variable Result : string(1 to hex_len) := (others => sep); - variable pos : positive := 1; + constant hex_len : positive := ite((sep = C_POC_NUL), (slvv'length * 2), (slvv'length * 3) - 1); + variable Result : string(1 to hex_len) := (others => sep); + variable pos : positive := 1; begin for i in slvv'range loop Result(pos to pos + 1) := to_string(slvv(i), 'h'); @@ -1491,7 +1487,7 @@ package body vectors is Writer := 2; GroupCounter := 0; for i in slm'low(1) to slm'high(1) loop - for j in slm'high(2) downto slm'low(2) loop -- WORKAROUND: Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); see work-around notes at T_SLM type declaration + for j in slm'range(2) loop Result(Writer) := to_char(slm(i, j)); Writer := Writer + 1; GroupCounter := GroupCounter + 1; diff --git a/src/dstruct/README.md b/src/dstruct/README.md index 9bda49ceb..b1f201f62 100644 --- a/src/dstruct/README.md +++ b/src/dstruct/README.md @@ -10,14 +10,14 @@ The package [`PoC.dstruct`][dstruct.pkg] holds all component declarations for th ## Entities - - [`dstruct_deque`][dstruct_deque] - implements a deque (double-ended queue) - - [`dstruct_stack`][dstruct_stack] - implements a stack (LIFO) + - [`dstruct_DoubleEndedQueue`][dstruct_DoubleEndedQueue] - implements a deque (double-ended queue) + - [`dstruct_Stack`][dstruct_Stack] - implements a stack (LIFO) *Note*: For FIFO storage elements see the namespace [`PoC.fifo`][src_fifo]. [dstruct.pkg]: dstruct.pkg.vhdl - [dstruct_deque]: dstruct_deque.vhdl - [dstruct_stack]: dstruct_stack.vhdl + [dstruct_DoubleEndedQueue]: dstruct_DoubleEndedQueue.vhdl + [dstruct_Stack]: dstruct_Stack.vhdl [src_fifo]: ../fifo diff --git a/src/dstruct/dstruct.pro b/src/dstruct/build.pro similarity index 67% rename from src/dstruct/dstruct.pro rename to src/dstruct/build.pro index aff0f9992..bb988ddd7 100644 --- a/src/dstruct/dstruct.pro +++ b/src/dstruct/build.pro @@ -4,6 +4,6 @@ # ============================================================================= analyze dstruct.pkg.vhdl -disabled dstruct_deque.vhdl -disabled dstruct_OutOfOrder_buffer.vhdl -analyze dstruct_stack.vhdl +analyze dstruct_DoubleEndedQueue.vhdl +analyze dstruct_OutOfOrderBuffer.vhdl +analyze dstruct_Stack.vhdl diff --git a/src/dstruct/dstruct.pkg.vhdl b/src/dstruct/dstruct.pkg.vhdl index ac97d171c..274b7c2b7 100644 --- a/src/dstruct/dstruct.pkg.vhdl +++ b/src/dstruct/dstruct.pkg.vhdl @@ -27,56 +27,58 @@ -- ============================================================================= library IEEE; -use IEEE.std_logic_1164.all; +use IEEE.std_logic_1164.all; package dstruct is - component dstruct_stack is - generic ( - D_BITS : positive; -- Data Width - MIN_DEPTH : positive -- Minimum Stack Depth - ); - port ( - -- INPUTS - clk, rst : in std_logic; + component dstruct_Stack is + generic ( + DATA_BITS : positive; -- Data Width + MIN_DEPTH : positive -- Minimum Stack Depth + ); + port ( + -- INPUTS + Clock : in std_logic; + Reset : in std_logic; - -- Write Ports - din : in std_logic_vector(D_BITS-1 downto 0); -- Data Input - put : in std_logic; -- 0 -> pop, 1 -> push - full : out std_logic; + -- Write Ports + Put : in std_logic; -- 0 -> top, 1 -> push + DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- Data Input + Full : out std_logic; - -- Read Ports - got : in std_logic; - dout : out std_logic_vector(D_BITS-1 downto 0); - valid : out std_logic - ); - end component dstruct_stack; + -- Read Ports + Got : in std_logic; + DataOut : out std_logic_vector(DATA_BITS-1 downto 0); + Valid : out std_logic + ); + end component dstruct_Stack; - component dstruct_deque is - generic ( - D_BITS : positive; -- Data Width - MIN_DEPTH : positive -- Minimum Deque Depth - ); - port ( - -- Shared Ports - clk, rst : in std_logic; + component dstruct_DoubleEndedQueue is + generic ( + DATA_BITS : positive; -- Data Width + MIN_DEPTH : positive -- Minimum Deque Depth + ); + port ( + -- Shared Ports + Clock : in std_logic; + Reset : in std_logic; - -- Port A - dinA : in std_logic_vector(D_BITS-1 downto 0); -- DataA Input - putA : in std_logic; - gotA : in std_logic; - doutA : out std_logic_vector(D_BITS-1 downto 0); -- DataA Output - validA : out std_logic; - fullA : out std_logic; + -- Port A + PortA_Put : in std_logic; + PortA_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- DataA Input + PortA_Full : out std_logic; + PortA_Got : in std_logic; + PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); -- DataA Output + PortA_Valid : out std_logic; - -- Port B - dinB : in std_logic_vector(D_BITS-1 downto 0); -- DataB Input - putB : in std_logic; - gotB : in std_logic; - doutB : out std_logic_vector(D_BITS-1 downto 0); - validB : out std_logic; - fullB : out std_logic - ); - end component dstruct_deque; + -- Port B + PortB_Put : in std_logic; + PortB_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- DataB Input + PortB_Full : out std_logic; + PortB_Got : in std_logic; + PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); + PortB_Valid : out std_logic + ); + end component dstruct_DoubleEndedQueue; end package; diff --git a/src/dstruct/dstruct_DoubleEndedQueue.vhdl b/src/dstruct/dstruct_DoubleEndedQueue.vhdl new file mode 100644 index 000000000..afc1c5909 --- /dev/null +++ b/src/dstruct/dstruct_DoubleEndedQueue.vhdl @@ -0,0 +1,744 @@ +-- ============================================================================= +-- Authors: Jens Voss +-- +-- Entity: Double-ended queue +-- +-- Description: +-- ------------------------------------- +-- Implements a deque (double-ended queue). This data structure allows two +-- acting entities to queue data elements for the consumption by the other while +-- still being able to unqueue untaken ones in LIFO fashion. +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; + +-- XXX: what name to use? +entity dstruct_DoubleEndedQueue is + generic ( + DATA_BITS : positive; -- Data Width + MIN_DEPTH : positive -- Minimum Deque Depth + ); + port ( + -- Shared Ports + Clock : in std_logic; + Reset : in std_logic; + + -- Port A + PortA_Put : in std_logic; + PortA_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- DataA Input + PortA_Full : out std_logic; + PortA_Got : in std_logic; + PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); -- DataA Output + PortA_Valid : out std_logic; + + -- Port B + PortB_Put : in std_logic; + PortB_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- DataB Input + PortB_Full : out std_logic; + PortB_Got : in std_logic; + PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); + PortB_Valid : out std_logic + ); +end entity; + + +library IEEE; +use IEEE.numeric_std.all; + +use work.config.all; +use work.utils.all; +use work.ocram.all; + +architecture rtl of dstruct_DoubleEndedQueue is + -- Constants + constant ADDRESS_BITS : natural := log2ceil(MIN_DEPTH); + + -- Signals + signal combined : std_logic_vector(3 downto 0); + signal ctrl : std_logic_vector(1 downto 0) := (others => '1'); + signal sub : unsigned(ADDRESS_BITS-1 downto 0) := (others => '0'); + + -- last operation flag + signal last_operation : std_logic := '0'; -- save last operation 0 -> read, 1 -> write + type last_op_ctrl_t is (IDLE, SET, UNSET); + signal last_op_ctrl : last_op_ctrl_t := IDLE; + + signal delayed_valid : std_logic := '0'; + signal delay : std_logic; + + -- Stackpointer + -- A + signal stackpointerA : unsigned (ADDRESS_BITS-1 downto 0) := shift_right(to_unsigned(MIN_DEPTH-1,ADDRESS_BITS),1); + signal weA : std_logic; + -- B + signal stackpointerB : unsigned (ADDRESS_BITS-1 downto 0) := shift_right(to_unsigned(MIN_DEPTH-1,ADDRESS_BITS),1) + 1; + signal weB : std_logic; + + + -- ctrl signal for stackpointer operations + type ctrl_t is (PUSH, POP, NOOP); + signal ctrlA : ctrl_t := NOOP; + signal ctrlB : ctrl_t := NOOP; + + -- RAM Signals + signal adrA : unsigned(ADDRESS_BITS-1 downto 0); + signal adrB : unsigned(ADDRESS_BITS-1 downto 0); + +begin + + ram : entity work.ocram_TrueDualPort_WriteFirst + generic map( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS + ) + port map( + Clock => Clock, + ClockEnable => '1', + PortA_WriteEnable => weA, + PortB_WriteEnable => weB, + PortA_Address => adrA, + PortB_Address => adrB, + PortA_DataIn => PortA_DataIn, + PortB_DataIn => PortB_DataIn, + PortA_DataOut => PortA_DataOut, + PortB_DataOut => PortB_DataOut + ); + + sub <= stackpointerB - stackpointerA; + + combined <= PortA_Put & PortA_Got & PortB_Put & PortB_Got; + + process(combined, stackpointerA, stackpointerB, last_operation, ctrl) + begin + ctrlA <= NOOP; + ctrlB <= NOOP; + -- reA <= '1'; + -- reB <= '1'; + adrA <= stackpointerA + 1; + adrB <= stackpointerB - 1; + weA <= '0'; + weB <= '0'; + last_op_ctrl <= IDLE; + delay <= '0'; + case(combined) is + when x"0" => --nothing + -- nothing happened/happens + -- don't update stackpointers + ctrlA <= NOOP; + ctrlB <= NOOP; + when x"1" => --readB + -- B read a valid value + -- update stackpointer + ctrlB <= POP; + -- reB <= '1'; + adrB <= stackpointerB - 2; + last_op_ctrl <= UNSET; + if ctrl = "01" then + if(last_operation = '0') then + --> deque is empty! + -- B couldn't read a valid value => don't update SP! + ctrlB <= NOOP; + adrB <= stackpointerB - 1; + last_op_ctrl <= UNSET; + end if; + elsif ctrl = "10" then + --> only one element left + -- side B saw empty signal + -- so B couldn't read a valid value + ctrlB <= NOOP; + adrB <= stackpointerB - 1; + last_op_ctrl <= IDLE; + end if; + when x"2" => --writeB + ctrlB <= PUSH; + weB <= '1'; + adrB <= stackpointerB; + last_op_ctrl <= SET; + if ctrl = "01" then + if(last_operation = '1') then + --> deque is full! + -- B cant write => don't update SP! + ctrlB <= NOOP; + weB <= '0'; + adrB <= stackpointerB - 1; + else + --> deque is empty! + --> delay validA signal for one clk cycle + delay <= '1'; + end if; + elsif ctrl = "00" then + --> only one spot left + -- B isn't allowed to write + -- B sees full signal atm + weB <= '0'; + adrB <= stackpointerB - 1; + ctrlB <= NOOP; + end if; + when x"3" => --readB, writeB + -- B read a valid value and writes a new value at the same spot + -- don't update stackpointer + -- reB <= '1'; + adrB <= stackpointerB - 1; + weB <= '1'; + last_op_ctrl <= SET; + if ctrl = "01" then + if (last_operation = '1') then + --> deque is full! + -- B read a valid value but new value cant be pushed! + ctrlB <= POP; + weB <= '0'; + adrB <= stackpointerB - 2; + last_op_ctrl <= UNSET; + else + --> deque is empty! + -- B couldn't read a valid value, but new value can be written! + -- delay validA signal one clk cycle + ctrlB <= PUSH; + weB <= '1'; + adrB <= stackpointerB; + last_op_ctrl <= SET; + delay <= '1'; + end if; + elsif ctrl = "10" then + --> only one element left + -- B couldn't read it, but can write new value + ctrlB <= PUSH; + weB <= '1'; + adrB <= stackpointerB; + last_op_ctrl <= SET; + elsif ctrl = "00" then + -- only one spot left + -- B read a valid value but cant write new value + ctrlB <= POP; + weB <= '0'; + adrB <= stackpointerB - 2; + last_op_ctrl <= UNSET; + end if; + when x"4" => --readA + -- A read a valid values + -- update stackpointer + ctrlA <= POP; + -- reA <= '1'; + adrA <= stackpointerA + 2; + last_op_ctrl <= UNSET; + if (ctrl = "01" and last_operation = '0') then + --> deque is empty! + -- A couldn't read a valid value => don't update SP! + ctrlA <= NOOP; + adrA <= stackpointerA + 1; + end if; + when x"5" => --readA, readB + -- A and B read both valid values + -- update both stackpointers + ctrlA <= POP; + ctrlB <= POP; + -- reB <= '1'; + adrB <= stackpointerB - 2; + -- reA <= '1'; + adrA <= stackpointerA + 2; + last_op_ctrl <= UNSET; + if ctrl = "01" then + if (last_operation = '1') then + --> deque is full + -- A and B read a valid value! + last_op_ctrl <= UNSET; + else + --> deque is empty! + -- A and B couldn't a valid value => don't update SP! + ctrlB <= NOOP; + ctrlA <= NOOP; + adrA <= stackpointerA + 1; + adrB <= stackpointerB - 1; + end if; + elsif ctrl = "10" then + -- A and B both tried to read last value! + -- but only A was allowed to read value so only update stackpointerA + ctrlA <= POP; + ctrlB <= NOOP; + end if; + when x"6" => --readA, writeB + -- A read a valid value and B writes a new value + -- update both stackpointers + ctrlA <= POP; + ctrlB <= PUSH; + -- reA <= '1'; + adrA <= stackpointerA + 2; + weB <= '1'; + adrB <= stackpointerB; + last_op_ctrl <= SET; + if ctrl = "01" then + if(last_operation = '1') then + --> deque is full! + -- A read a valid value, but B cant push! + ctrlB <= NOOP; + weB <= '0'; + last_op_ctrl <= UNSET; + adrB <= stackpointerB - 1; + else + --> deque is empty! + -- A couldn't read a valid value, but B can push! + -- delay validA signal one clk cycle + ctrlA <= NOOP; + adrA <= stackpointerA + 1; + last_op_ctrl <= SET; + delay <= '1'; + end if; + elsif ctrl = "10" then + --> only one element in deque + --> A read valid value and B can write new value + --> But validA has to be delayed! + delay <= '1'; + elsif ctrl = "00" then + --> only one spot left + -- A read valid value, but B isn't allowed to write last value + ctrlB <= NOOP; + weB <= '0'; + last_op_ctrl <= UNSET; + adrB <= stackpointerB - 1; + end if; + when x"7" => --readA, readB, writeB + -- A and B read valid values and B writes a new value at the same spot + -- Update stackpointerA and don't update stackpointer B + ctrlA <= POP; + adrB <= stackpointerB - 1; + -- reB <= '1'; + weB <= '1'; + adrA <= stackpointerA + 2; + -- reA <= '1'; + last_op_ctrl <= SET; + if ctrl = "01" then + if last_operation = '1' then + --> deque is full! + -- A and B read a valid value, but B cant push! + ctrlB <= POP; + weB <= '0'; + adrB <= stackpointerB - 2; + last_op_ctrl <= UNSET; + else + --> deque is empty! + -- A and B couldn't have read a valid value, but B can push! + -- delay validA signal one clk cycle + adrA <= stackpointerA + 1; + ctrlA <= NOOP; + ctrlB <= PUSH; + weB <= '1'; + adrB <= stackpointerB; + last_op_ctrl <= SET; + delay <= '1'; + end if; + elsif ctrl = "00" then + --> only one spot left + -- A and B read valid values, but B isn't allowed to write new value + -- B sees full signal atm + ctrlB <= POP; + weB <= '0'; + adrB <= stackpointerB - 2; + last_op_ctrl <= UNSET; + elsif ctrl = "10" then + --> only one element in deque + -- only A read a valid value, but B can write a new value + --> validA has to be delayed! + ctrlB <= PUSH; + weB <= '1'; + adrB <= stackpointerB; + last_op_ctrl <= SET; + delay <= '1'; + end if; + when x"8" => --writeA + -- A writes a new value + -- update stackpointer + ctrlA <= PUSH; + weA <= '1'; + adrA <= stackpointerA; + last_op_ctrl <= SET; + if ctrl = "01" then + if (last_operation = '1') then + --> deque is full + -- A cant write! + ctrlA <= NOOP; + weA <= '0'; + adrA <= stackpointerA + 1; + end if; + end if; + when x"9" => --writeA, readB + -- A writes new value and B reads a valid value + -- update both stackpointers + ctrlA <= PUSH; + ctrlB <= POP; + -- reB <= '1'; + weA <= '1'; + adrA <= stackpointerA; + adrB <= stackpointerB - 2; + last_op_ctrl <= SET; + if ctrl = "01" then + if (last_operation = '1') then + --> deque is full! + -- A cant write, but B read a valid value! + weA <= '0'; + ctrlA <= NOOP; + adrA <= stackpointerA + 1; + last_op_ctrl <= SET; + else + --> deque is empty! + -- A can write, but B couldn't read a valid value! + ctrlB <= NOOP; + adrB <= stackpointerB - 1; + last_op_ctrl <= SET; + end if; + elsif ctrl = "10" then + --> only one element left + -- A can write new value, but B couldn't read a valid value + -- B sees empty signal atm + ctrlB <= NOOP; + adrB <= stackpointerB - 1; + last_op_ctrl <= SET; + end if; + when x"A" => --writeA, writeB + -- A and B write new values + -- update both Stackpointers + ctrlA <= PUSH; + ctrlB <= PUSH; + weA <= '1'; + adrA <= stackpointerA; + weB <= '1'; + adrB <= stackpointerB; + last_op_ctrl <= SET; + if ctrl = "01" then + if (last_operation = '1') then + --> deque is full! + -- A and B cant write! + ctrlA <= NOOP; + ctrlB <= NOOP; + weA <= '0'; + weB <= '0'; + adrB <= stackpointerB - 1; + adrA <= stackpointerA + 1; + last_op_ctrl <= UNSET; + else + --> deque is empty! + --> A and B can write! + last_op_ctrl <= SET; + end if; + elsif ctrl = "00" then + --> only one spot left. + -- only A is allowed to write + -- B got full signal + weB <= '0'; + ctrlB <= NOOP; + adrB <= stackpointerB - 1; + end if; + when x"B" => --writeA, readB, writeB + --> A writes a value and B read a valid value and writes a new value at the same spot! + -- update stackpointerA and don't update stackpointerB + ctrlA <= PUSH; + weA <= '1'; + adrA <= stackpointerA; + -- reB <= '1'; + weB <= '1'; + adrB <= stackpointerB - 1; + last_op_ctrl <= SET; + if ctrl = "01" then + if (last_operation = '1') then + --> deque is full! + -- A and B cant write, but B read a valid value! + ctrlB <= POP; + ctrlA <= NOOP; + weA <= '0'; + weB <= '0'; + adrA <= stackpointerA + 1; + adrB <= stackpointerB - 2; + last_op_ctrl <= UNSET; + else + --> deque is empty + --> A and B can write, but B couldn't read a valid value! + ctrlB <= PUSH; + adrB <= stackpointerB; + last_op_ctrl <= SET; + end if; + elsif ctrl = "00" then + --> only one spot left + -- only A can write last value + -- B only read a valid value + ctrlB <= POP; + weB <= '0'; + adrB <= stackpointerB - 2; + elsif ctrl = "10" then + --> only one element left + --> B couldn't read value but A and B are allowed to write new values + ctrlB <= PUSH; + adrB <= stackpointerB; + last_op_ctrl <= SET; + end if; + when x"C" => --readA, writeA + --> A read a valid value and writes a new value at the same spot! + -- => don't update stackpointer! + ctrlA <= NOOP; + -- reA <= '1'; + weA <= '1'; + adrA <= stackpointerA + 1; + last_op_ctrl <= SET; + if ctrl = "01" then + if (last_operation = '1') then + --> deque is full! + -- A cant write, but read a valid value! + ctrlA <= POP; + weA <= '0'; + adrA <= stackpointerA + 2; + last_op_ctrl <= UNSET; + else + --> deque is empty! + -- A can write, but couldn't read a valid value! + ctrlA <= PUSH; + adrA <= stackpointerA; + last_op_ctrl <= SET; + end if; + end if; + when x"D" => --readA, writeA, readB + -- A and B read valid values and A writes a new value at the same spot + -- don't update stackpointerA and update stackpointerB + ctrlB <= POP; + ctrlA <= NOOP; + -- reA <= '1'; + weA <= '1'; + adrA <= stackpointerA + 1; + -- reB <= '1'; + adrB <= stackpointerB - 2; + last_op_ctrl <= SET; + if ctrl = "01" then + if (last_operation = '1') then + --> deque is full! + -- A cant write new values, but A and B could read a valid value + ctrlA <= POP; + ctrlB <= POP; + adrA <= stackpointerA + 2; + weA <= '0'; + last_op_ctrl <= UNSET; + else + --> deque is empty! + -- A and B couldn't read a valid value, but A can write a new value + ctrlA <= PUSH; + adrB <= stackpointerB - 1; + ctrlB <= NOOP; + adrA <= stackpointerA; + last_op_ctrl <= SET; + end if; + elsif ctrl = "10" then + --> only one element in deque + -- only A read valid value and can write a new value + adrB <= stackpointerB - 1; + ctrlB <= NOOP; + ctrlA <= NOOP; + adrA <= stackpointerA + 1; + last_op_ctrl <= SET; + end if; + when x"E" => --readA, writeA, writeB + -- B writes a new value, A read a valid value and writes a new value at the same spot + -- update stackpiunterB and don't update stackpointerA + ctrlB <= PUSH; + ctrlA <= NOOP; + -- reA <= '1'; + weA <= '1'; + adrA <= stackpointerA + 1; + weB <= '1'; + adrB <= stackpointerB; + last_op_ctrl <= SET; + if ctrl = "01" then + if (last_operation = '1') then + --> deque is full! + -- A and B cant write, but A could read valid value + weA <= '0'; + weB <= '0'; + ctrlA <= POP; + ctrlB <= NOOP; + adrB <= stackpointerB - 1; + adrA <= stackpointerA + 2; + last_op_ctrl <= UNSET; + else + --> deque is empty! + -- A couldn't read a valid value, but A and B can write new values + ctrlA <= PUSH; + ctrlB <= PUSH; + adrA <= stackpointerA; + last_op_ctrl <= SET; + end if; + elsif ctrl = "00" then + --> only one spot left + -- B cant write new value + ctrlB <= NOOP; + weB <= '0'; + adrB <= stackpointerB - 1; + end if; + when x"F" => --readA, writeA,readB, writeB + -- A and B read valid values and write new values at the same stackpointers + -- don't update both stackpointers + ctrlA <= NOOP; + ctrlB <= NOOP; + -- reA <= '1'; + weA <= '1'; + adrA <= stackpointerA + 1; + weB <= '1'; + -- reB <= '1'; + adrB <= stackpointerB - 1; + last_op_ctrl <= SET; + if ctrl = "01" then + if last_operation = '1' then + --> deque is full + -- A and B could read valid values but cant write new values + ctrlA <= POP; + ctrlB <= POP; + weA <= '0'; + weB <= '0'; + adrA <= stackpointerA + 2; + adrB <= stackpointerB - 2; + last_op_ctrl <= UNSET; + else + --> deque is empty + -- A and B couldn't read valid values but can both write new values + ctrlA <= PUSH; + ctrlB <= PUSH; + adrA <= stackpointerA; + adrB <= stackpointerB; + last_op_ctrl <= SET; + end if; + elsif ctrl = "10" then + --> only one element left + -- only A read last value, A replaces the last element + -- B just writes new value + -- B sees empty signal atm + ctrlB <= PUSH; + adrB <= stackpointerB; + elsif ctrl = "00" then + --> only one spot left + -- B read a valid value, but isn't allowed to write + -- B sees full signal atm + ctrlB <= POP; + adrB <= stackpointerB - 2; + weB <= '0'; + end if; + when others => --nothing + -- nothing happened/happens + -- don't update stackpointers + last_op_ctrl <= IDLE; + end case; + end process; + + process(Clock) + begin + if rising_edge(Clock) then + if Reset = '1' then + last_operation <= '0'; + else + case last_op_ctrl is + when IDLE => last_operation <= last_operation; + when SET => last_operation <= '1'; + when UNSET => last_operation <= '0'; + end case; + end if; + end if; + end process; + + --stackpointerA operations + process(Clock) + begin + if rising_edge(Clock) then + if Reset = '1' then + stackpointerA <= shift_right(to_unsigned(MIN_DEPTH-1,ADDRESS_BITS),1); + else + case ctrlA is + when NOOP => stackpointerA <= stackpointerA; + when PUSH => stackpointerA <= stackpointerA - 1; + when POP => stackpointerA <= stackpointerA + 1; + end case; + end if; + end if; + end process; + + -- stackpointerB operations + process(Clock) + begin + if rising_edge(Clock) then + if (Reset = '1') then + stackpointerB <= shift_right(to_unsigned(MIN_DEPTH-1,ADDRESS_BITS),1) + 1; + else + case( ctrlB ) is + when NOOP => stackpointerB <= stackpointerB; + when PUSH => stackpointerB <= stackpointerB + 1; + when POP => stackpointerB <= stackpointerB - 1; + end case; + end if; + end if; + end process; + + -- delayed_valid register + process(Clock) + begin + if rising_edge(Clock) then + if Reset = '1' then + delayed_valid <= '0'; + elsif delay = '1' then + delayed_valid <= '1'; + else + delayed_valid <= '0'; + end if; + end if; + end process; + + -- sub of B and A + process(sub, last_operation, delayed_valid) + begin + PortA_Full <= '0'; + PortB_Full <= '0'; + PortB_Valid <= '1'; + if(delayed_valid = '1') then + PortA_Valid <= '0'; + else + PortA_Valid <= '1'; + end if; + case(to_integer(sub)) is + when 0 => + ctrl <= "00"; -- let a or b write? + -- only one spot left + -- set one side to full! + -- at the moment A has higher priority + PortB_Full <= '1'; + when 1 => + ctrl <= "01"; -- empty or full? + if (last_operation = '1') then + PortA_Full <= '1'; + PortB_Full <= '1'; + else + PortA_Valid <= '0'; + PortB_Valid <= '0'; + end if; + when 2 => + ctrl <= "10"; -- let a or b read? + -- only one element left + -- set one side to empty! + -- at the moment A has higher priority + PortB_Valid <= '0'; + when 3 => + ctrl <= "11"; -- both can write/read + when others => + ctrl <= "11"; + end case; + end process; + +end architecture; diff --git a/src/dstruct/dstruct_OutOfOrderBuffer.vhdl b/src/dstruct/dstruct_OutOfOrderBuffer.vhdl new file mode 100644 index 000000000..508388412 --- /dev/null +++ b/src/dstruct/dstruct_OutOfOrderBuffer.vhdl @@ -0,0 +1,130 @@ +-- ============================================================================= +-- Authors: Stefan Unrein +-- +-- Entity: Out of Order Buffer +-- +-- When data (DataIn) is put in (Put = '1'), an index (IndexOut) is returned. +-- If later, this index is given to this component (IndexIn and Got = '1') the +-- Data of the corresponding index is returned. +-- IndexOut is hold and stable until data is Put into the buffer. +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + + +use work.config.all; +use work.utils.all; +use work.ocram.all; + + +entity dstruct_OutOfOrderBuffer is + generic ( + DATA_BITS : positive; + NUM_INDEX : positive + ); + port ( + -- INPUTS + Clock : in std_logic; + Reset : in std_logic; + + -- Put Port + Put : in std_logic; + DataIn : in std_logic_vector(DATA_BITS-1 downto 0); + Full : out std_logic; + IndexOut : out unsigned(log2ceilnz(NUM_INDEX) -1 downto 0); + + -- Get Port + Got : in std_logic; + IndexIn : in unsigned(log2ceilnz(NUM_INDEX) -1 downto 0); + DataOut : out std_logic_vector(DATA_BITS-1 downto 0); + Valid : out std_logic + ); +end entity; + +architecture rtl of dstruct_OutOfOrderBuffer is + subtype T_Data is std_logic_vector(DATA_BITS-1 downto 0); + type T_Data_Vector is array (natural range <>) of T_Data; -- FIXME: T_SLVV + + signal IndexValid : std_logic_vector(0 to NUM_INDEX -1) := (others => '0'); + signal DataBuffer : T_Data_Vector(0 to NUM_INDEX -1) := (others => (others => '0')); + + signal NextIndex : unsigned(log2ceilnz(NUM_INDEX) -1 downto 0) := (others => '0'); + signal NextIndex_i : unsigned(log2ceilnz(NUM_INDEX) -1 downto 0); + signal full_i : std_logic := '0'; + signal full_next : std_logic; + + function get_next_Index(Used : std_logic_vector(0 to NUM_INDEX -1); NextIndex : unsigned(log2ceilnz(NUM_INDEX) -1 downto 0)) return unsigned is + begin + for i in 0 to NUM_INDEX -1 loop + if Used(i) = '0' and i /= to_integer(NextIndex) then + return to_unsigned(i, log2ceilnz(NUM_INDEX)); + end if; + end loop; + return to_unsigned(0, log2ceilnz(NUM_INDEX)); + end function; + +begin + IndexOut <= NextIndex; + Full <= full_i; + + full_next <= '1' when (not (unsigned(IndexValid) or reverse(unsigned(bin2onehot(NextIndex, NUM_INDEX))))) = 0 else '0'; --will the buffer be full with the next put? + + NextIndex_i <= get_next_Index(IndexValid, NextIndex); + + process(all) + begin + DataOut <= (others => '1'); + Valid <= '0'; + if IndexIn < NUM_INDEX then -- range check for index + DataOut <= DataBuffer(to_integer(IndexIn)); + Valid <= IndexValid(to_integer(IndexIn)); + end if; + end process; + + process(Clock) + begin + if rising_edge(Clock) then + if Reset = '1' then + IndexValid <= (others => '0'); + NextIndex <= (others => '0'); + full_i <= '0'; + else + if full_i = '0' and Put = '1' then + IndexValid(to_integer(NextIndex)) <= '1'; + DataBuffer(to_integer(NextIndex)) <= DataIn; + NextIndex <= NextIndex_i; + full_i <= full_next; + end if; + + if IndexIn < NUM_INDEX then -- range check for index + if Got = '1' and IndexValid(to_integer(IndexIn)) = '1' then + IndexValid(to_integer(IndexIn)) <= '0'; + full_i <= '0'; + if full_next = '1' then + NextIndex <= IndexIn; + end if; + end if; + end if; + end if; + end if; + end process; + +end architecture; diff --git a/src/dstruct/dstruct_Stack.vhdl b/src/dstruct/dstruct_Stack.vhdl new file mode 100644 index 000000000..a34979270 --- /dev/null +++ b/src/dstruct/dstruct_Stack.vhdl @@ -0,0 +1,193 @@ +-- ============================================================================= +-- Authors: Jens Voss +-- +-- Entity: Stack (LIFO) +-- +-- Description: +-- ------------------------------------- +-- Implements a stack, a LIFO storage abstraction. +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; + + +entity dstruct_Stack is + generic ( + DATA_BITS : positive; -- Data Width + MIN_DEPTH : positive -- Minimum Stack Depth + ); + port ( + -- INPUTS + Clock : in std_logic; + Reset : in std_logic; + + -- Write Ports + Put : in std_logic; -- 0 -> top, 1 -> push + DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- Data Input + Full : out std_logic; + + -- Read Ports + Got : in std_logic; + DataOut : out std_logic_vector(DATA_BITS-1 downto 0); + Valid : out std_logic + ); +end entity; + + +library IEEE; +use IEEE.numeric_std.all; + +use work.config.all; +use work.utils.all; +use work.ocram.all; + +architecture rtl of dstruct_Stack is + + -- Constants + constant ADDRESS_BITS : natural := log2ceil(MIN_DEPTH); + + -- Signals + signal stackpointer : unsigned(ADDRESS_BITS-1 downto 0) := (others => '0'); + signal we : std_logic := '0'; + signal adr : unsigned(ADDRESS_BITS-1 downto 0) := (others => '0'); + signal s_adr : unsigned(ADDRESS_BITS-1 downto 0) := (others => '0'); + signal s_dout : std_logic_vector(DATA_BITS-1 downto 0) := (others => '0'); + signal s_valid : std_logic := '0'; + signal s_din : std_logic_vector(DATA_BITS-1 downto 0) := (others => '0'); + + -- ctrl signal for stackpointer operations + type ctrl_t is (PUSH, POP, NOOP); + signal ctrl : ctrl_t; + + type state is (SEMPTY, NOTFULL, WAITING, SFULL); + signal current_state, next_state : state; -- current and next state + +begin + + -- Backing Memory + ram : entity work.ocram_SinglePort + generic map( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS, + FILENAME => "" + ) + port map( + Clock => Clock, + ClockEnable => '1', + WriteEnable => we, + Address => adr, + DataIn => s_din, + DataOut => s_dout + ); + + process(Clock) + begin + if rising_edge(Clock) then + if(Reset = '1') then + current_state <= SEMPTY; + else + current_state <= next_state; + end if; + end if; + end process; + + process(current_state, Put, stackpointer, Got) + begin + ctrl <= NOOP; + we <= '0'; + s_adr <= (others =>'0'); + Valid <= '1'; + Full <= '0'; + case( current_state ) is + when SEMPTY => + Valid <= '0'; + next_state <= SEMPTY; + if(Put = '1') then + -- push to empty stack! + next_state <= NOTFULL; + ctrl <= PUSH; + we <= '1'; + else + -- enable is 0 -> do nothing + ctrl <= NOOP; + end if; + when NOTFULL=> + next_state <= NOTFULL; + s_adr <= stackpointer - 1; + if(Got = '1' and Put = '0') then + ctrl <= POP; + s_adr <= stackpointer - 2; + if stackpointer = 1 then + -- last value popped from stack -> empty + next_state <= SEMPTY; + end if; + elsif (Got = '0' and Put = '1') then + -- push to Stack + ctrl <= PUSH; + s_adr <= stackpointer; + we <= '1'; + if stackpointer = (MIN_DEPTH - 1) then + next_state <= SFULL; + end if; + elsif (Got = '1' and Put = '1') then + -- overwrite ToS + we <= '1'; + ctrl <= NOOP; + else + -- do nothing + ctrl <= NOOP; + end if; + when SFULL=> + next_state <= SFULL; + Full <= '1'; + s_adr <= stackpointer-1; + if(Got = '1') then + -- pop from Stack + ctrl <= POP; + next_state <= NOTFULL; + s_adr <= stackpointer-2; + else + -- got is 0 -> do nothing + ctrl <= NOOP; + end if; + when others => + ctrl <= NOOP; + next_state <= SEMPTY; + end case; + end process; + + process(Clock) + begin + if rising_edge(Clock) then + case ctrl is + when NOOP => stackpointer <= stackpointer; + when PUSH => stackpointer <= stackpointer + 1; + when POP => stackpointer <= stackpointer - 1; + end case; + end if; + end process; + + s_din <= DataIn; + DataOut <= s_dout; + + -- map local signals to ports + adr <= s_adr; +end architecture; diff --git a/src/dstruct/dstruct_deque.vhdl b/src/dstruct/dstruct_deque.vhdl deleted file mode 100644 index d67cdaa48..000000000 --- a/src/dstruct/dstruct_deque.vhdl +++ /dev/null @@ -1,769 +0,0 @@ --- ============================================================================= --- Authors: Jens Voss --- --- Entity: Double-ended queue --- --- Description: --- ------------------------------------- --- Implements a deque (double-ended queue). This data structure allows two --- acting entities to queue data elements for the consumption by the other while --- still being able to unqueue untaken ones in LIFO fashion. --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; - - -entity dstruct_deque is - generic ( - D_BITS : positive; -- Data Width - MIN_DEPTH : positive -- Minimum Deque Depth - ); - port ( - -- Shared Ports - clk, rst : in std_logic; - - -- Port A - dinA : in std_logic_vector(D_BITS-1 downto 0); -- DataA Input - putA : in std_logic; - gotA : in std_logic; - doutA : out std_logic_vector(D_BITS-1 downto 0); -- DataA Output - validA : out std_logic; - fullA : out std_logic; - - -- Port B - dinB : in std_logic_vector(D_BITS-1 downto 0); -- DataB Input - putB : in std_logic; - gotB : in std_logic; - doutB : out std_logic_vector(D_BITS-1 downto 0); - validB : out std_logic; - fullB : out std_logic - ); -end entity dstruct_deque; - - -library IEEE; -use IEEE.numeric_std.all; - -use work.config.all; -use work.utils.all; -use work.ocram.all; - -architecture rtl of dstruct_deque is - -- Constants - constant A_BITS : natural := log2ceil(MIN_DEPTH); - - -- MEMORY variable - -- type memory_t is array ((2**A_BITS)-1 downto 0) of std_logic_vector(D_BITS-1 downto 0); - -- signal memory : memory_t := (others => (others => '0')); - - -- Signals - signal combined : std_logic_vector(3 downto 0) := (others => '0'); - signal ctrl : std_logic_vector(1 downto 0) := (others => '1'); - signal sub : unsigned(A_BITS-1 downto 0) := (others => '0'); - - -- last operation flag - signal last_operation : std_logic := '0'; -- save last operation 0 -> read, 1 -> write - type last_op_ctrl_t is (IDLE, SET, UNSET); - signal last_op_ctrl : last_op_ctrl_t := IDLE; - - signal delayed_valid : std_logic := '0'; - signal delay : std_logic := '0'; - -- signal s_validA : std_logic := '0'; - -- signal s_validB : std_logic := '0'; - - -- Stackpointer - -- A - signal stackpointerA : unsigned (A_BITS-1 downto 0) := shift_right(to_unsigned(MIN_DEPTH-1,A_BITS),1); - -- signal reA : std_logic := '0'; - signal weA : std_logic := '0'; - -- B - signal stackpointerB : unsigned (A_BITS-1 downto 0) := shift_right(to_unsigned(MIN_DEPTH-1,A_BITS),1) + 1; - -- signal reB : std_logic := '0'; - signal weB : std_logic := '0'; - - - -- ctrl signal for stackpointer operations - type ctrl_t is (PUSH, POP, IDLE); - signal ctrlA : ctrl_t := IDLE; - signal ctrlB : ctrl_t := IDLE; - - -- RAM Signals - signal adrA : unsigned(A_BITS-1 downto 0) := (others => '0'); - signal adrB : unsigned(A_BITS-1 downto 0) := (others => '0'); - -begin - - ram: entity work.ocram_tdp_wf - generic map( - A_BITS => A_BITS, - D_BITS => D_BITS, - FILENAME => "" - ) - port map( - clk => clk, - ce => '1', - we1 => weA, - we2 => weB, - a1 => adrA, - a2 => adrB, - d1 => dinA, - d2 => dinB, - q1 => doutA, - q2 => doutB - ); - - sub <= stackpointerB - stackpointerA; - - combined <= putA & gotA & putB & gotB; - - process(combined, stackpointerA, stackpointerB, last_operation, ctrl) - begin - ctrlA <= IDLE; - ctrlB <= IDLE; - -- reA <= '1'; - -- reB <= '1'; - adrA <= stackpointerA + 1; - adrB <= stackpointerB - 1; - weA <= '0'; - weB <= '0'; - last_op_ctrl <= IDLE; - delay <= '0'; - case(combined) is - when x"0" => --nothing - -- nothing happened/happens - -- don't update stackpointers - ctrlA <= IDLE; - ctrlB <= IDLE; - when x"1" => --readB - -- B read a valid value - -- update stackpointer - ctrlB <= POP; - -- reB <= '1'; - adrB <= stackpointerB - 2; - last_op_ctrl <= UNSET; - if ctrl = "01" then - if(last_operation = '0') then - --> deque is empty! - -- B couldn't read a valid value => don't update SP! - ctrlB <= IDLE; - adrB <= stackpointerB - 1; - last_op_ctrl <= UNSET; - end if; - elsif ctrl = "10" then - --> only one element left - -- side B saw empty signal - -- so B couldn't read a valid value - ctrlB <= IDLE; - adrB <= stackpointerB - 1; - last_op_ctrl <= IDLE; - end if; - when x"2" => --writeB - ctrlB <= PUSH; - weB <= '1'; - adrB <= stackpointerB; - last_op_ctrl <= SET; - if ctrl = "01" then - if(last_operation = '1') then - --> deque is full! - -- B cant write => don't update SP! - ctrlB <= IDLE; - weB <= '0'; - adrB <= stackpointerB - 1; - else - --> deque is empty! - --> delay validA signal for one clk cycle - delay <= '1'; - end if; - elsif ctrl = "00" then - --> only one spot left - -- B isn't allowed to write - -- B sees full signal atm - weB <= '0'; - adrB <= stackpointerB - 1; - ctrlB <= IDLE; - end if; - when x"3" => --readB, writeB - -- B read a valid value and writes a new value at the same spot - -- don't update stackpointer - -- reB <= '1'; - adrB <= stackpointerB - 1; - weB <= '1'; - last_op_ctrl <= SET; - if ctrl = "01" then - if (last_operation = '1') then - --> deque is full! - -- B read a valid value but new value cant be pushed! - ctrlB <= POP; - weB <= '0'; - adrB <= stackpointerB - 2; - last_op_ctrl <= UNSET; - else - --> deque is empty! - -- B couldn't read a valid value, but new value can be written! - -- delay validA signal one clk cycle - ctrlB <= PUSH; - weB <= '1'; - adrB <= stackpointerB; - last_op_ctrl <= SET; - delay <= '1'; - end if; - elsif ctrl = "10" then - --> only one element left - -- B couldn't read it, but can write new value - ctrlB <= PUSH; - weB <= '1'; - adrB <= stackpointerB; - last_op_ctrl <= SET; - elsif ctrl = "00" then - -- only one spot left - -- B read a valid value but cant write new value - ctrlB <= POP; - weB <= '0'; - adrB <= stackpointerB - 2; - last_op_ctrl <= UNSET; - end if; - when x"4" => --readA - -- A read a valid values - -- update stackpointer - ctrlA <= POP; - -- reA <= '1'; - adrA <= stackpointerA + 2; - last_op_ctrl <= UNSET; - if (ctrl = "01" and last_operation = '0') then - --> deque is empty! - -- A couldn't read a valid value => don't update SP! - ctrlA <= IDLE; - adrA <= stackpointerA + 1; - end if; - when x"5" => --readA, readB - -- A and B read both valid values - -- update both stackpointers - ctrlA <= POP; - ctrlB <= POP; - -- reB <= '1'; - adrB <= stackpointerB - 2; - -- reA <= '1'; - adrA <= stackpointerA + 2; - last_op_ctrl <= UNSET; - if ctrl = "01" then - if (last_operation = '1') then - --> deque is full - -- A and B read a valid value! - last_op_ctrl <= UNSET; - else - --> deque is empty! - -- A and B couldn't a valid value => don't update SP! - ctrlB <= IDLE; - ctrlA <= IDLE; - adrA <= stackpointerA + 1; - adrB <= stackpointerB - 1; - end if; - elsif ctrl = "10" then - -- A and B both tried to read last value! - -- but only A was allowed to read value so only update stackpointerA - ctrlA <= POP; - ctrlB <= IDLE; - end if; - when x"6" => --readA, writeB - -- A read a valid value and B writes a new value - -- update both stackpointers - ctrlA <= POP; - ctrlB <= PUSH; - -- reA <= '1'; - adrA <= stackpointerA + 2; - weB <= '1'; - adrB <= stackpointerB; - last_op_ctrl <= SET; - if ctrl = "01" then - if(last_operation = '1') then - --> deque is full! - -- A read a valid value, but B cant push! - ctrlB <= IDLE; - weB <= '0'; - last_op_ctrl <= UNSET; - adrB <= stackpointerB - 1; - else - --> deque is empty! - -- A couldn't read a valid value, but B can push! - -- delay validA signal one clk cycle - ctrlA <= IDLE; - adrA <= stackpointerA + 1; - last_op_ctrl <= SET; - delay <= '1'; - end if; - elsif ctrl = "10" then - --> only one element in deque - --> A read valid value and B can write new value - --> But validA has to be delayed! - delay <= '1'; - elsif ctrl = "00" then - --> only one spot left - -- A read valid value, but B isn't allowed to write last value - ctrlB <= IDLE; - weB <= '0'; - last_op_ctrl <= UNSET; - adrB <= stackpointerB - 1; - end if; - when x"7" => --readA, readB, writeB - -- A and B read valid values and B writes a new value at the same spot - -- Update stackpointerA and don't update stackpointer B - ctrlA <= POP; - adrB <= stackpointerB - 1; - -- reB <= '1'; - weB <= '1'; - adrA <= stackpointerA + 2; - -- reA <= '1'; - last_op_ctrl <= SET; - if ctrl = "01" then - if last_operation = '1' then - --> deque is full! - -- A and B read a valid value, but B cant push! - ctrlB <= POP; - weB <= '0'; - adrB <= stackpointerB - 2; - last_op_ctrl <= UNSET; - else - --> deque is empty! - -- A and B couldn't have read a valid value, but B can push! - -- delay validA signal one clk cycle - adrA <= stackpointerA + 1; - ctrlA <= IDLE; - ctrlB <= PUSH; - weB <= '1'; - adrB <= stackpointerB; - last_op_ctrl <= SET; - delay <= '1'; - end if; - elsif ctrl = "00" then - --> only one spot left - -- A and B read valid values, but B isn't allowed to write new value - -- B sees full signal atm - ctrlB <= POP; - weB <= '0'; - adrB <= stackpointerB - 2; - last_op_ctrl <= UNSET; - elsif ctrl = "10" then - --> only one element in deque - -- only A read a valid value, but B can write a new value - --> validA has to be delayed! - ctrlB <= PUSH; - weB <= '1'; - adrB <= stackpointerB; - last_op_ctrl <= SET; - delay <= '1'; - end if; - when x"8" => --writeA - -- A writes a new value - -- update stackpointer - ctrlA <= PUSH; - weA <= '1'; - adrA <= stackpointerA; - last_op_ctrl <= SET; - if ctrl = "01" then - if (last_operation = '1') then - --> deque is full - -- A cant write! - ctrlA <= IDLE; - weA <= '0'; - adrA <= stackpointerA + 1; - end if; - end if; - when x"9" => --writeA, readB - -- A writes new value and B reads a valid value - -- update both stackpointers - ctrlA <= PUSH; - ctrlB <= POP; - -- reB <= '1'; - weA <= '1'; - adrA <= stackpointerA; - adrB <= stackpointerB - 2; - last_op_ctrl <= SET; - if ctrl = "01" then - if (last_operation = '1') then - --> deque is full! - -- A cant write, but B read a valid value! - weA <= '0'; - ctrlA <= IDLE; - adrA <= stackpointerA + 1; - last_op_ctrl <= SET; - else - --> deque is empty! - -- A can write, but B couldn't read a valid value! - ctrlB <= IDLE; - adrB <= stackpointerB - 1; - last_op_ctrl <= SET; - end if; - elsif ctrl = "10" then - --> only one element left - -- A can write new value, but B couldn't read a valid value - -- B sees empty signal atm - ctrlB <= IDLE; - adrB <= stackpointerB - 1; - last_op_ctrl <= SET; - end if; - when x"A" => --writeA, writeB - -- A and B write new values - -- update both Stackpointers - ctrlA <= PUSH; - ctrlB <= PUSH; - weA <= '1'; - adrA <= stackpointerA; - weB <= '1'; - adrB <= stackpointerB; - last_op_ctrl <= SET; - if ctrl = "01" then - if (last_operation = '1') then - --> deque is full! - -- A and B cant write! - ctrlA <= IDLE; - ctrlB <= IDLE; - weA <= '0'; - weB <= '0'; - adrB <= stackpointerB - 1; - adrA <= stackpointerA + 1; - last_op_ctrl <= UNSET; - else - --> deque is empty! - --> A and B can write! - last_op_ctrl <= SET; - end if; - elsif ctrl = "00" then - --> only one spot left. - -- only A is allowed to write - -- B got full signal - weB <= '0'; - ctrlB <= IDLE; - adrB <= stackpointerB - 1; - end if; - when x"B" => --writeA, readB, writeB - --> A writes a value and B read a valid value and writes a new value at the same spot! - -- update stackpointerA and don't update stackpointerB - ctrlA <= PUSH; - weA <= '1'; - adrA <= stackpointerA; - -- reB <= '1'; - weB <= '1'; - adrB <= stackpointerB - 1; - last_op_ctrl <= SET; - if ctrl = "01" then - if (last_operation = '1') then - --> deque is full! - -- A and B cant write, but B read a valid value! - ctrlB <= POP; - ctrlA <= IDLE; - weA <= '0'; - weB <= '0'; - adrA <= stackpointerA + 1; - adrB <= stackpointerB - 2; - last_op_ctrl <= UNSET; - else - --> deque is empty - --> A and B can write, but B couldn't read a valid value! - ctrlB <= PUSH; - adrB <= stackpointerB; - last_op_ctrl <= SET; - end if; - elsif ctrl = "00" then - --> only one spot left - -- only A can write last value - -- B only read a valid value - ctrlB <= POP; - weB <= '0'; - adrB <= stackpointerB - 2; - elsif ctrl = "10" then - --> only one element left - --> B couldn't read value but A and B are allowed to write new values - ctrlB <= PUSH; - adrB <= stackpointerB; - last_op_ctrl <= SET; - end if; - when x"C" => --readA, writeA - --> A read a valid value and writes a new value at the same spot! - -- => don't update stackpointer! - ctrlA <= IDLE; - -- reA <= '1'; - weA <= '1'; - adrA <= stackpointerA + 1; - last_op_ctrl <= SET; - if ctrl = "01" then - if (last_operation = '1') then - --> deque is full! - -- A cant write, but read a valid value! - ctrlA <= POP; - weA <= '0'; - adrA <= stackpointerA + 2; - last_op_ctrl <= UNSET; - else - --> deque is empty! - -- A can write, but couldn't read a valid value! - ctrlA <= PUSH; - adrA <= stackpointerA; - last_op_ctrl <= SET; - end if; - end if; - when x"D" => --readA, writeA, readB - -- A and B read valid values and A writes a new value at the same spot - -- don't update stackpointerA and update stackpointerB - ctrlB <= POP; - ctrlA <= IDLE; - -- reA <= '1'; - weA <= '1'; - adrA <= stackpointerA + 1; - -- reB <= '1'; - adrB <= stackpointerB - 2; - last_op_ctrl <= SET; - if ctrl = "01" then - if (last_operation = '1') then - --> deque is full! - -- A cant write new values, but A and B could read a valid value - ctrlA <= POP; - ctrlB <= POP; - adrA <= stackpointerA + 2; - weA <= '0'; - last_op_ctrl <= UNSET; - else - --> deque is empty! - -- A and B couldn't read a valid value, but A can write a new value - ctrlA <= PUSH; - adrB <= stackpointerB - 1; - ctrlB <= IDLE; - adrA <= stackpointerA; - last_op_ctrl <= SET; - end if; - elsif ctrl = "10" then - --> only one element in deque - -- only A read valid value and can write a new value - adrB <= stackpointerB - 1; - ctrlB <= IDLE; - ctrlA <= IDLE; - adrA <= stackpointerA + 1; - last_op_ctrl <= SET; - end if; - when x"E" => --readA, writeA, writeB - -- B writes a new value, A read a valid value and writes a new value at the same spot - -- update stackpiunterB and don't update stackpointerA - ctrlB <= PUSH; - ctrlA <= IDLE; - -- reA <= '1'; - weA <= '1'; - adrA <= stackpointerA + 1; - weB <= '1'; - adrB <= stackpointerB; - last_op_ctrl <= SET; - if ctrl = "01" then - if (last_operation = '1') then - --> deque is full! - -- A and B cant write, but A could read valid value - weA <= '0'; - weB <= '0'; - ctrlA <= POP; - ctrlB <= IDLE; - adrB <= stackpointerB - 1; - adrA <= stackpointerA + 2; - last_op_ctrl <= UNSET; - else - --> deque is empty! - -- A couldn't read a valid value, but A and B can write new values - ctrlA <= PUSH; - ctrlB <= PUSH; - adrA <= stackpointerA; - last_op_ctrl <= SET; - end if; - elsif ctrl = "00" then - --> only one spot left - -- B cant write new value - ctrlB <= IDLE; - weB <= '0'; - adrB <= stackpointerB - 1; - end if; - when x"F" => --readA, writeA,readB, writeB - -- A and B read valid values and write new values at the same stackpointers - -- don't update both stackpointers - ctrlA <= IDLE; - ctrlB <= IDLE; - -- reA <= '1'; - weA <= '1'; - adrA <= stackpointerA + 1; - weB <= '1'; - -- reB <= '1'; - adrB <= stackpointerB - 1; - last_op_ctrl <= SET; - if ctrl = "01" then - if last_operation = '1' then - --> deque is full - -- A and B could read valid values but cant write new values - ctrlA <= POP; - ctrlB <= POP; - weA <= '0'; - weB <= '0'; - adrA <= stackpointerA + 2; - adrB <= stackpointerB - 2; - last_op_ctrl <= UNSET; - else - --> deque is empty - -- A and B couldn't read valid values but can both write new values - ctrlA <= PUSH; - ctrlB <= PUSH; - adrA <= stackpointerA; - adrB <= stackpointerB; - last_op_ctrl <= SET; - end if; - elsif ctrl = "10" then - --> only one element left - -- only A read last value, A replaces the last element - -- B just writes new value - -- B sees empty signal atm - ctrlB <= PUSH; - adrB <= stackpointerB; - elsif ctrl = "00" then - --> only one spot left - -- B read a valid value, but isn't allowed to write - -- B sees full signal atm - ctrlB <= POP; - adrB <= stackpointerB - 2; - weB <= '0'; - end if; - when others => --nothing - -- nothing happened/happens - -- don't update stackpointers - last_op_ctrl <= IDLE; - end case; - end process; - - process(clk) - begin - if rising_edge(clk) then - if (rst = '1') then - last_operation <= '0'; - else - case( last_op_ctrl ) is - when IDLE => - last_operation <= last_operation; - when SET => - last_operation <= '1'; - when UNSET => - last_operation <= '0'; - when others => - last_operation <= last_operation; - end case; - end if; - end if; - end process; - - --stackpointerA operations - process(clk) - begin - if rising_edge(clk) then - if (rst = '1') then - stackpointerA <= shift_right(to_unsigned(MIN_DEPTH-1,A_BITS),1); - else - case( ctrlA ) is - when IDLE => - stackpointerA <= stackpointerA; - when PUSH => - stackpointerA <= stackpointerA - 1; - when POP => - stackpointerA <= stackpointerA + 1; - when others => - stackpointerA <= stackpointerA; - end case; - end if; - end if; - end process; - - -- stackpointerB operations - process(clk) - begin - if rising_edge(clk) then - if (rst = '1') then - stackpointerB <= shift_right(to_unsigned(MIN_DEPTH-1,A_BITS),1) + 1; - else - case( ctrlB ) is - when IDLE => - stackpointerB <= stackpointerB; - when PUSH => - stackpointerB <= stackpointerB + 1; - when POP => - stackpointerB <= stackpointerB - 1; - when others => - stackpointerB <= stackpointerB; - end case; - end if; - end if; - end process; - - -- delayed_valid register - process(clk) - begin - if rising_edge(clk) then - if(rst = '1') then - delayed_valid <= '0'; - else - if (delay = '1') then - delayed_valid <= '1'; - else - delayed_valid <= '0'; - end if; - end if; - end if; - end process; - - -- sub of B and A - process(sub, last_operation, delayed_valid) - begin - fullA <= '0'; - fullB <= '0'; - validB <= '1'; - if(delayed_valid = '1') then - validA <= '0'; - else - validA <= '1'; - end if; - case(to_integer(sub)) is - when 0 => - ctrl <= "00"; -- let a or b write? - -- only one spot left - -- set one side to full! - -- at the moment A has higher priority - fullB <= '1'; - when 1 => - ctrl <= "01"; -- empty or full? - if (last_operation = '1') then - fullA <= '1'; - fullB <= '1'; - else - validA <= '0'; - validB <= '0'; - end if; - when 2 => - ctrl <= "10"; -- let a or b read? - -- only one element left - -- set one side to empty! - -- at the moment A has higher priority - validB <= '0'; - when 3 => - ctrl <= "11"; -- both can write/read - when others => - ctrl <= "11"; - end case; - end process; - -end architecture; diff --git a/src/dstruct/dstruct_stack.vhdl b/src/dstruct/dstruct_stack.vhdl deleted file mode 100644 index 14a054971..000000000 --- a/src/dstruct/dstruct_stack.vhdl +++ /dev/null @@ -1,197 +0,0 @@ --- ============================================================================= --- Authors: Jens Voss --- --- Entity: Stack (LIFO) --- --- Description: --- ------------------------------------- --- Implements a stack, a LIFO storage abstraction. --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; - - -entity dstruct_stack is - generic ( - D_BITS : positive; -- Data Width - MIN_DEPTH : positive -- Minimum Stack Depth - ); - port ( - -- INPUTS - clk, rst : in std_logic; - - -- Write Ports - din : in std_logic_vector(D_BITS-1 downto 0); -- Data Input - put : in std_logic; -- 0 -> pop, 1 -> push - full : out std_logic; - - -- Read Ports - got : in std_logic; - dout : out std_logic_vector(D_BITS-1 downto 0); - valid : out std_logic - ); -end entity dstruct_stack; - - -library IEEE; -use IEEE.numeric_std.all; - -use work.config.all; -use work.utils.all; -use work.ocram.all; - -architecture rtl of dstruct_stack is - - -- Constants - constant A_BITS : natural := log2ceil(MIN_DEPTH); - - -- Signals - signal stackpointer : unsigned(A_BITS-1 downto 0) := (others => '0'); - signal we : std_logic := '0'; - signal adr : unsigned(A_BITS-1 downto 0) := (others => '0'); - signal s_adr : unsigned(A_BITS-1 downto 0) := (others => '0'); - signal s_dout : std_logic_vector(D_BITS-1 downto 0) := (others => '0'); - signal s_valid : std_logic := '0'; - signal s_din : std_logic_vector(D_BITS-1 downto 0) := (others => '0'); - - -- ctrl signal for stackpointer operations - type ctrl_t is (PUSH, POP, IDLE); - signal ctrl : ctrl_t; - - type state is (SEMPTY, NOTFULL, WAITING, SFULL); - signal current_state, next_state : state; -- current and next state - -begin - - -- Backing Memory - ram: entity work.ocram_sp - generic map( - A_BITS => A_BITS, - D_BITS => D_BITS, - FILENAME => "" - ) - port map( - clk => clk, - ce => '1', - we => we, - a => adr, - d => s_din, - q => s_dout - ); - - process(clk) - begin - if rising_edge(clk) then - if(rst = '1') then - current_state <= SEMPTY; - else - current_state <= next_state; - end if; - end if; - end process; - - process(current_state, put, stackpointer, got) - begin - ctrl <= IDLE; - we <= '0'; - s_adr <= (others =>'0'); - valid <= '1'; - full <= '0'; - case( current_state ) is - when SEMPTY => - valid <= '0'; - next_state <= SEMPTY; - if(put = '1') then - -- push to empty stack! - next_state <= NOTFULL; - ctrl <= PUSH; - we <= '1'; - else - -- enable is 0 -> do nothing - ctrl <= IDLE; - end if; - when NOTFULL=> - next_state <= NOTFULL; - s_adr <= stackpointer - 1; - if(got = '1' and put = '0') then - ctrl <= POP; - s_adr <= stackpointer - 2; - if stackpointer = 1 then - -- last value popped from stack -> empty - next_state <= SEMPTY; - end if; - elsif (got = '0' and put = '1') then - -- push to Stack - ctrl <= PUSH; - s_adr <= stackpointer; - we <= '1'; - if stackpointer = (MIN_DEPTH - 1) then - next_state <= SFULL; - end if; - elsif (got = '1' and put = '1') then - -- overwrite ToS - we <= '1'; - ctrl <= IDLE; - else - -- do nothing - ctrl <= IDLE; - end if; - when SFULL=> - next_state <= SFULL; - full <= '1'; - s_adr <= stackpointer-1; - if(got = '1') then - -- pop from Stack - ctrl <= POP; - next_state <= NOTFULL; - s_adr <= stackpointer-2; - else - -- got is 0 -> do nothing - ctrl <= IDLE; - end if; - when others => - ctrl <= IDLE; - next_state <= SEMPTY; - end case; - end process; - - process(clk) - begin - if rising_edge(clk) then - case( ctrl ) is - when IDLE => - stackpointer <= stackpointer; - when PUSH => - stackpointer <= stackpointer + 1; - when POP => - stackpointer <= stackpointer - 1; - when others => - stackpointer <= stackpointer; - end case; - end if; - end process; - - s_din <= din; - dout <= s_dout; - - -- map local signals to ports - adr <= s_adr; -end rtl; diff --git a/src/fifo/README.md b/src/fifo/README.md index 0b2548b1f..dc6c67ad2 100644 --- a/src/fifo/README.md +++ b/src/fifo/README.md @@ -30,8 +30,8 @@ clock) refer to the write- and read-side clock relationship. This FIFO needs to be constrained, so static timing analysis will report the correct results. See the [constraint folder][const_fifo] for applieable constraint files for your synthesis tool. - - [`fifo_stage`][fifo_stage] implements a two-stage FIFO (one common clock, got-interface) - - [`fifo_shift`][fifo_shift] implements a regular FIFO (one common clock, + - [`fifo_Stage`][fifo_Stage] implements a two-stage FIFO (one common clock, got-interface) + - [`fifo_Shift`][fifo_Shift] implements a regular FIFO (one common clock, got-interface, optimized for FPGAs with shifter primitives) @@ -43,8 +43,8 @@ clock) refer to the write- and read-side clock relationship. [fifo_dc_got]: fifo_dc_got.vhdl [fifo_ic_got]: fifo_ic_got.vhdl [fifo_ic_assembly]: fifo_ic_assembly.vhdl - [fifo_stage]: fifo_stage.vhdl - [fifo_shift]: fifo_shift.vhdl + [fifo_Stage]: fifo_Stage.vhdl + [fifo_Shift]: fifo_Shift.vhdl [const_fifo]: ../../../ucf/fifo diff --git a/src/fifo/fifo.pro b/src/fifo/build.pro similarity index 96% rename from src/fifo/fifo.pro rename to src/fifo/build.pro index 2be3b9fbb..934f7509f 100644 --- a/src/fifo/fifo.pro +++ b/src/fifo/build.pro @@ -20,9 +20,9 @@ # ============================================================================= analyze fifo.pkg.vhdl -analyze fifo_shift.vhdl +analyze fifo_Shift.vhdl disabled fifo_stageFar.vhdl -analyze fifo_stage.vhdl +analyze fifo_Stage.vhdl analyze fifo_ic_got.vhdl analyze fifo_ic_assembly.vhdl analyze fifo_cc_got.vhdl diff --git a/src/fifo/fifo.pkg.vhdl b/src/fifo/fifo.pkg.vhdl index 0e7d866e9..d6eaf9f96 100644 --- a/src/fifo/fifo.pkg.vhdl +++ b/src/fifo/fifo.pkg.vhdl @@ -1,26 +1,26 @@ -- ============================================================================= --- Authors: Thomas B. Preusser --- Steffen Koehler --- Martin Zabel --- Patrick Lehmann +-- Authors: Thomas B. Preusser +-- Steffen Koehler +-- Martin Zabel +-- Patrick Lehmann -- --- Package: VHDL package for component declarations, types and functions --- associated to the PoC.fifo namespace +-- Package: VHDL package for component declarations, types and functions +-- associated to the PoC.fifo namespace -- -- Description: -- ------------------------------------- --- For detailed documentation see below. +-- For detailed documentation see below. -- -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,7 +29,7 @@ -- limitations under the License. -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; @@ -38,182 +38,182 @@ use work.utils.all; package fifo is - -- Minimal FIFO with single clock to decouple enable domains. - component fifo_Stage - generic ( - D_BITS : positive; - STAGES : natural := 1; - LIGHT_WEIGHT : boolean := FALSE - ); - port ( - -- Control - clk : in std_logic; -- Clock - rst : in std_logic; -- Synchronous Reset - - -- Input - put : in std_logic; -- Put Value - di : in std_logic_vector(D_BITS - 1 downto 0); -- Data Input - ful : out std_logic; -- Full - - -- Output - vld : out std_logic; -- Data Available - do : out std_logic_vector(D_BITS - 1 downto 0); -- Data Output - got : in std_logic -- Data Consumed - ); - end component; - - -- Simple FIFO backed by a shift register. - component fifo_shift - generic ( - D_BITS : positive; -- Data Width - MIN_DEPTH : positive -- Minimum FIFO Size in Words - ); - port ( - -- Global Control - clk : in std_logic; - rst : in std_logic; - - -- Writing Interface - put : in std_logic; -- Write Request - din : in std_logic_vector(D_BITS - 1 downto 0); -- Input Data - ful : out std_logic; -- Capacity Exhausted - - -- Reading Interface - got : in std_logic; -- Read Done Strobe - dout : out std_logic_vector(D_BITS - 1 downto 0); -- Output Data - vld : out std_logic -- Data Valid - ); - end component; - - -- Full-fledged FIFO with single clock domain using on-chip RAM. - component fifo_cc_got - generic ( - D_BITS : positive; -- Data Width - MIN_DEPTH : positive; -- Minimum FIFO Depth - DATA_REG : boolean := false; -- Store Data Content in Registers - STATE_REG : boolean := false; -- Registered Full/Empty Indicators - OUTPUT_REG : boolean := false; -- Registered FIFO Output - ESTATE_WR_BITS : natural := 0; -- Empty State Bits - FSTATE_RD_BITS : natural := 0 -- Full State Bits - ); - port ( - -- Global Reset and Clock - rst, clk : in std_logic; - - -- Writing Interface - put : in std_logic; -- Write Request - din : in std_logic_vector(D_BITS - 1 downto 0); -- Input Data - full : out std_logic; - estate_wr : out std_logic_vector(imax(0, ESTATE_WR_BITS - 1) downto 0); - - -- Reading Interface - got : in std_logic; -- Read Completed - dout : out std_logic_vector(D_BITS - 1 downto 0); -- Output Data - valid : out std_logic; - fstate_rd : out std_logic_vector(imax(0, FSTATE_RD_BITS - 1) downto 0) - ); - end component; - - component fifo_ic_got - generic ( - D_BITS : positive; -- Data Width - MIN_DEPTH : positive; -- Minimum FIFO Depth - DATA_REG : boolean := false; -- Store Data Content in Registers - OUTPUT_REG : boolean := false; -- Registered FIFO Output - ESTATE_WR_BITS : natural := 0; -- Empty State Bits - FSTATE_RD_BITS : natural := 0 -- Full State Bits - ); - port ( - -- Write Interface - clk_wr : in std_logic; - rst_wr : in std_logic; - put : in std_logic; - din : in std_logic_vector(D_BITS - 1 downto 0); - full : out std_logic; - estate_wr : out std_logic_vector(imax(ESTATE_WR_BITS - 1, 0) downto 0); - - -- Read Interface - clk_rd : in std_logic; - rst_rd : in std_logic; - got : in std_logic; - valid : out std_logic; - dout : out std_logic_vector(D_BITS - 1 downto 0); - fstate_rd : out std_logic_vector(imax(FSTATE_RD_BITS - 1, 0) downto 0) - ); - end component; - - component fifo_cc_got_tempput - generic ( - D_BITS : positive; -- Data Width - MIN_DEPTH : positive; -- Minimum FIFO Depth - DATA_REG : boolean := false; -- Store Data Content in Registers - STATE_REG : boolean := false; -- Registered Full/Empty Indicators - OUTPUT_REG : boolean := false; -- Registered FIFO Output - ESTATE_WR_BITS : natural := 0; -- Empty State Bits - FSTATE_RD_BITS : natural := 0 -- Full State Bits - ); - port ( - -- Global Reset and Clock - rst, clk : in std_logic; - - -- Writing Interface - put : in std_logic; -- Write Request - din : in std_logic_vector(D_BITS - 1 downto 0); -- Input Data - full : out std_logic; - estate_wr : out std_logic_vector(imax(0, ESTATE_WR_BITS - 1) downto 0); - - commit : in std_logic; - rollback : in std_logic; - - -- Reading Interface - got : in std_logic; -- Read Completed - dout : out std_logic_vector(D_BITS - 1 downto 0); -- Output Data - valid : out std_logic; - fstate_rd : out std_logic_vector(imax(0, FSTATE_RD_BITS - 1) downto 0) - ); - end component; - - component fifo_cc_got_tempgot is - generic ( - D_BITS : positive; -- Data Width - MIN_DEPTH : positive; -- Minimum FIFO Depth - DATA_REG : boolean := false; -- Store Data Content in Registers - STATE_REG : boolean := false; -- Registered Full/Empty Indicators - OUTPUT_REG : boolean := false; -- Registered FIFO Output - ESTATE_WR_BITS : natural := 0; -- Empty State Bits - FSTATE_RD_BITS : natural := 0 -- Full State Bits - ); - port ( - -- Global Reset and Clock - rst, clk : in std_logic; - - -- Writing Interface - put : in std_logic; -- Write Request - din : in std_logic_vector(D_BITS - 1 downto 0); -- Input Data - full : out std_logic; - estate_wr : out std_logic_vector(imax(0, ESTATE_WR_BITS - 1) downto 0); - - -- Reading Interface - got : in std_logic; -- Read Completed - dout : out std_logic_vector(D_BITS - 1 downto 0); -- Output Data - valid : out std_logic; - fstate_rd : out std_logic_vector(imax(0, FSTATE_RD_BITS - 1) downto 0); - - commit : in std_logic; - rollback : in std_logic - ); - end component; + -- Minimal FIFO with single clock to decouple enable domains. + component fifo_Stage + generic ( + DATA_BITS : positive; + STAGES : natural := 1; + LIGHT_WEIGHT : boolean := FALSE + ); + port ( + -- Control + Clock : in std_logic; -- Clock + Reset : in std_logic; -- Synchronous Reset + + -- Input + Put : in std_logic; -- Put Value + DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); -- Data Input + Full : out std_logic; -- Full + + -- Output + Valid : out std_logic; -- Data Available + DataOut : out std_logic_vector(DATA_BITS - 1 downto 0); -- Data Output + Got : in std_logic -- Data Consumed + ); + end component; + + -- Simple FIFO backed by a shift register. + component fifo_Shift + generic ( + DATA_BITS : positive; -- Data Width + MIN_DEPTH : positive -- Minimum FIFO Size in Words + ); + port ( + -- Global Control + Clock : in std_logic; + Reset : in std_logic; + + -- Writing Interface + Put : in std_logic; -- Write Request + DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); -- Input Data + Full : out std_logic; -- Capacity Exhausted + + -- Reading Interface + Got : in std_logic; -- Read Done Strobe + DataOut : out std_logic_vector(DATA_BITS - 1 downto 0); -- Output Data + Valid : out std_logic -- Data Valid + ); + end component; + + -- Full-fledged FIFO with single clock domain using on-chip RAM. + component fifo_cc_got + generic ( + DATA_BITS : positive; -- Data Width + MIN_DEPTH : positive; -- Minimum FIFO Depth + DATA_REG : boolean := false; -- Store Data Content in Registers + STATE_REG : boolean := false; -- Registered Full/Empty Indicators + OUTPUT_REG : boolean := false; -- Registered FIFO Output + EMPTY_STATE_BITS : natural := 0; -- Empty State Bits + FILL_STATE_BITS : natural := 0 -- Full State Bits + ); + port ( + -- Global Reset and Clock + Reset, Clock : in std_logic; + + -- Writing Interface + Put : in std_logic; -- Write Request + DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); -- Input Data + Full : out std_logic; + EmptyState : out std_logic_vector(imax(0, EMPTY_STATE_BITS - 1) downto 0); + + -- Reading Interface + Got : in std_logic; -- Read Completed + DataOut : out std_logic_vector(DATA_BITS - 1 downto 0); -- Output Data + Valid : out std_logic; + FillState : out std_logic_vector(imax(0, FILL_STATE_BITS - 1) downto 0) + ); + end component; + + component fifo_ic_got + generic ( + DATA_BITS : positive; -- Data Width + MIN_DEPTH : positive; -- Minimum FIFO Depth + DATA_REG : boolean := false; -- Store Data Content in Registers + OUTPUT_REG : boolean := false; -- Registered FIFO Output + EMPTY_STATE_BITS : natural := 0; -- Empty State Bits + FILL_STATE_BITS : natural := 0 -- Full State Bits + ); + port ( + -- Write Interface + clk_wr : in std_logic; + rst_wr : in std_logic; + put : in std_logic; + din : in std_logic_vector(DATA_BITS - 1 downto 0); + full : out std_logic; + estate_wr : out std_logic_vector(imax(EMPTY_STATE_BITS - 1, 0) downto 0); + + -- Read Interface + clk_rd : in std_logic; + rst_rd : in std_logic; + got : in std_logic; + valid : out std_logic; + dout : out std_logic_vector(DATA_BITS - 1 downto 0); + fstate_rd : out std_logic_vector(imax(FILL_STATE_BITS - 1, 0) downto 0) + ); + end component; + + component fifo_cc_got_tempput + generic ( + DATA_BITS : positive; -- Data Width + MIN_DEPTH : positive; -- Minimum FIFO Depth + DATA_REG : boolean := false; -- Store Data Content in Registers + STATE_REG : boolean := false; -- Registered Full/Empty Indicators + OUTPUT_REG : boolean := false; -- Registered FIFO Output + EMPTY_STATE_BITS : natural := 0; -- Empty State Bits + FILL_STATE_BITS : natural := 0 -- Full State Bits + ); + port ( + -- Global Reset and Clock + Reset, Clock : in std_logic; + + -- Writing Interface + Put : in std_logic; -- Write Request + DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); -- Input Data + Full : out std_logic; + EmptyState : out std_logic_vector(imax(0, EMPTY_STATE_BITS - 1) downto 0); + + Commit : in std_logic; + Rollback : in std_logic; + + -- Reading Interface + Got : in std_logic; -- Read Completed + DataOut : out std_logic_vector(DATA_BITS - 1 downto 0); -- Output Data + Valid : out std_logic; + FillState : out std_logic_vector(imax(0, FILL_STATE_BITS - 1) downto 0) + ); + end component; + + component fifo_cc_got_tempgot is + generic ( + DATA_BITS : positive; -- Data Width + MIN_DEPTH : positive; -- Minimum FIFO Depth + DATA_REG : boolean := false; -- Store Data Content in Registers + STATE_REG : boolean := false; -- Registered Full/Empty Indicators + OUTPUT_REG : boolean := false; -- Registered FIFO Output + EMPTY_STATE_BITS : natural := 0; -- Empty State Bits + FILL_STATE_BITS : natural := 0 -- Full State Bits + ); + port ( + -- Global Reset and Clock + Reset, Clock : in std_logic; + + -- Writing Interface + Put : in std_logic; -- Write Request + DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); -- Input Data + Full : out std_logic; + EmptyState : out std_logic_vector(imax(0, EMPTY_STATE_BITS - 1) downto 0); + + -- Reading Interface + Got : in std_logic; -- Read Completed + DataOut : out std_logic_vector(DATA_BITS - 1 downto 0); -- Output Data + Valid : out std_logic; + FillState : out std_logic_vector(imax(0, FILL_STATE_BITS - 1) downto 0); + + Commit : in std_logic; + Rollback : in std_logic + ); + end component; component fifo_ic_assembly is generic ( - D_BITS : positive; -- Data Width - A_BITS : positive; -- Address Bits - G_BITS : positive -- Generation Guard Bits + D_BITS : positive; -- Data Width + A_BITS : positive; -- Address Bits + G_BITS : positive -- Generation Guard Bits ); port ( -- Write Interface - clk_wr : in std_logic; - rst_wr : in std_logic; + clk_wr : in std_logic; + rst_wr : in std_logic; -- Only write addresses in the range [base, base+2**(A_BITS-G_BITS)) are -- acceptable. This is equivalent to the test @@ -230,8 +230,8 @@ package fifo is put : in std_logic; -- Read Interface - clk_rd : in std_logic; - rst_rd : in std_logic; + clk_rd : in std_logic; + rst_rd : in std_logic; dout : out std_logic_vector(D_BITS-1 downto 0); vld : out std_logic; diff --git a/src/fifo/fifo_shift.vhdl b/src/fifo/fifo_Shift.vhdl similarity index 60% rename from src/fifo/fifo_shift.vhdl rename to src/fifo/fifo_Shift.vhdl index 0bf3d2d16..eb5406ed0 100644 --- a/src/fifo/fifo_shift.vhdl +++ b/src/fifo/fifo_Shift.vhdl @@ -40,38 +40,38 @@ use IEEE.numeric_std.all; use work.utils.all; -entity fifo_shift is +entity fifo_Shift is generic ( - D_BITS : positive; -- Data Width + DATA_BITS : positive; -- Data Width MIN_DEPTH : positive -- Minimum FIFO Size in Words ); port ( -- Global Control - clk : in std_logic; - rst : in std_logic; - fill : out std_logic_vector(log2ceilnz(MIN_DEPTH) downto 0); -- Fill'left = Empty, Fill'left = no vld - -- If vld='1' then fill(fill'left -1 downto 0) +1 is the number of Words saved + Clock : in std_logic; + Reset : in std_logic; + FillLevel : out std_logic_vector(log2ceilnz(MIN_DEPTH) downto 0); -- Fill'left = Empty, Fill'left = no vld + -- If vld='1' then fill(fill'left -1 downto 0) +1 is the number of Words saved -- Writing Interface - put : in std_logic; -- Write Request - din : in std_logic_vector(D_BITS-1 downto 0); -- Input Data - ful : out std_logic; -- Capacity Exhausted + Put : in std_logic; -- Write Request + DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- Input Data + Full : out std_logic; -- Capacity Exhausted -- Reading Interface - got : in std_logic; -- Read Done Strobe - dout : out std_logic_vector(D_BITS-1 downto 0); -- Output Data - vld : out std_logic -- Data Valid + Got : in std_logic; -- Read Done Strobe + DataOut : out std_logic_vector(DATA_BITS-1 downto 0); -- Output Data + Valid : out std_logic -- Data Valid ); -end entity fifo_shift; +end entity; -architecture rtl of fifo_shift is - constant A_BITS : positive := log2ceilnz(MIN_DEPTH); - constant DEPTH : positive := 2**A_BITS; +architecture rtl of fifo_Shift is + constant ADDRESS_BITS : positive := log2ceilnz(MIN_DEPTH); + constant DEPTH : positive := 2**ADDRESS_BITS; -- Data Register - type tData is array(natural range<>) of std_logic_vector(D_BITS-1 downto 0); + type tData is array(natural range<>) of std_logic_vector(DATA_BITS-1 downto 0); signal Dat : tData(0 to DEPTH-1); - signal Ptr : unsigned(A_BITS downto 0) := (others => '1'); + signal Ptr : unsigned(ADDRESS_BITS downto 0) := (others => '1'); signal ful_i : std_logic; signal vld_i : std_logic; @@ -79,23 +79,23 @@ architecture rtl of fifo_shift is begin -- Data anf Pointer Registers - process(clk) + process(Clock) begin - if rising_edge(clk) then - if (put and not ful_i) = '1' then - Dat <= din & Dat(0 to DEPTH-2); + if rising_edge(Clock) then + if (Put and not ful_i) = '1' then + Dat <= DataIn & Dat(0 to DEPTH-2); end if; end if; end process; - process(clk) + process(Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then Ptr <= (others => '1'); else - if (put and not ful_i) /= (got and vld_i) then - if (put and not ful_i) = '1' then + if (Put and not ful_i) /= (Got and vld_i) then + if (Put and not ful_i) = '1' then Ptr <= Ptr + 1; else Ptr <= Ptr - 1; @@ -106,11 +106,10 @@ begin end process; -- Outputs - dout <= Dat(to_integer(Ptr(Ptr'left-1 downto 0))); + DataOut <= Dat(to_integer(Ptr(Ptr'left-1 downto 0))); vld_i <= not Ptr(Ptr'left); ful_i <= vld_i when (Ptr(Ptr'left-1 downto 0) and to_unsigned(DEPTH-1, Ptr'length-1)) = DEPTH-1 else '0'; - vld <= vld_i; - ful <= ful_i; - fill <= std_logic_vector(Ptr); - -end rtl; + Valid <= vld_i; + Full <= ful_i; + FillLevel <= std_logic_vector(Ptr); +end architecture; diff --git a/src/fifo/fifo_stage.vhdl b/src/fifo/fifo_Stage.vhdl similarity index 75% rename from src/fifo/fifo_stage.vhdl rename to src/fifo/fifo_Stage.vhdl index 66acf19f0..90a5bfb0f 100644 --- a/src/fifo/fifo_stage.vhdl +++ b/src/fifo/fifo_Stage.vhdl @@ -34,49 +34,49 @@ use IEEE.std_logic_1164.all; entity fifo_Stage is generic ( - D_BITS : positive; + DATA_BITS : positive; STAGES : natural := 1; -- 0 creates a passthrough, all values above creates one pipeline stage of the set depth - LIGHT_WEIGHT : boolean := FALSE -- This option uses half of registers but oszilates between full and empty! Use only when restriction is acceptable (e.g. for Address channel in AXI) + LIGHT_WEIGHT : boolean := FALSE -- This option uses half of registers but oscillates between full and empty! Use only when restriction is acceptable (e.g. for Address channel in AXI) ); port ( -- Control - clk : in std_logic; -- Clock - rst : in std_logic; -- Synchronous Reset + Clock : in std_logic; -- Clock + Reset : in std_logic; -- Synchronous Reset -- Input - put : in std_logic; -- Put Value - di : in std_logic_vector(D_BITS - 1 downto 0); -- Data Input - ful : out std_logic; -- Full + Put : in std_logic; -- Put Value + DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); -- Data Input + Full : out std_logic; -- Full -- Output - vld : out std_logic; -- Data Available - do : out std_logic_vector(D_BITS - 1 downto 0); -- Data Output - got : in std_logic -- Data Consumed + Valid : out std_logic; -- Data Available + DataOut : out std_logic_vector(DATA_BITS - 1 downto 0); -- Data Output + Got : in std_logic -- Data Consumed ); -end entity fifo_Stage; +end entity; architecture rtl of fifo_Stage is begin - + passthroughGen : if STAGES > 0 generate - subtype T_slv_d is std_logic_vector(D_BITS - 1 downto 0); + subtype T_slv_d is std_logic_vector(DATA_BITS - 1 downto 0); type T_slvv_d is array(natural range <>) of T_slv_d; - + signal di_v : T_slvv_d(0 to STAGES - 1);-- := (others => (others => '0')); signal do_v : T_slvv_d(0 to STAGES - 1);-- := (others => (others => '0')); - + signal Avail_v : std_logic_vector(0 to STAGES - 1); signal Full_v : std_logic_vector(0 to STAGES - 1); - + signal put_v : std_logic_vector(0 to STAGES - 1); signal got_v : std_logic_vector(0 to STAGES - 1); begin - ful <= Full_v(0); - vld <= Avail_v(Avail_v'high); - do <= do_v(do_v'high); - di_v(0) <= di; - put_v(0) <= put; - got_v(got_v'high) <= got; + Full <= Full_v(0); + Valid <= Avail_v(Avail_v'high); + DataOut <= do_v(do_v'high); + di_v(0) <= DataIn; + put_v(0) <= Put; + got_v(got_v'high) <= Got; connect_gen : for i in 1 to STAGES - 1 generate di_v(i) <= do_v(i - 1); @@ -93,10 +93,10 @@ begin signal Full : std_logic := '0'; begin - process (clk) + process (Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then Full <= '0'; Avail <= '0'; else @@ -104,7 +104,7 @@ begin Full <= Avail and not got_v(i) and (Full or put_v(i)); end if; end if; - if rising_edge(clk) then + if rising_edge(Clock) then if Full = '0' then A <= di_v(i); end if; @@ -127,15 +127,15 @@ begin genStage : for i in 0 to STAGES - 1 generate signal A : T_slv_d := (others => '0'); signal B : T_slv_d := (others => '0'); - + signal Avail : std_logic := '0'; signal Full : std_logic := '0'; begin - - process(clk) + + process(Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then Avail <= '0'; else if Avail = '1' then @@ -146,18 +146,18 @@ begin end if; end if; end process; - - B <= di_v(i) when rising_edge(clk) and Avail = '0'; - + + B <= di_v(i) when rising_edge(Clock) and Avail = '0'; + Full_v(i) <= Avail; Avail_v(i) <= Avail; do_v(i) <= B; end generate; end generate; else generate - ful <= not got; - vld <= put; - do <= di; + Full <= not Got; + Valid <= Put; + DataOut <= DataIn; end generate; end architecture; diff --git a/src/fifo/fifo_cc_got.vhdl b/src/fifo/fifo_cc_got.vhdl index 425d43dae..7c3ffaef9 100644 --- a/src/fifo/fifo_cc_got.vhdl +++ b/src/fifo/fifo_cc_got.vhdl @@ -95,57 +95,58 @@ use work.ocram.all; entity fifo_cc_got is generic ( - D_BITS : positive; -- Data Width + DATA_BITS : positive; -- Data Width MIN_DEPTH : positive; -- Minimum FIFO Depth RAM_TYPE : T_RAM_TYPE := RAM_TYPE_OPTIMIZED; DATA_REG : boolean := false; -- Store Data Content in Registers LUT_SHIFT_LOGIC : boolean := false; -- Store Data Content in Lut-Shift-Logic (only possible in Xilinx devices) STATE_REG : boolean := false; -- Registered Full/Empty Indicators OUTPUT_REG : boolean := false; -- Registered FIFO Output - ESTATE_WR_BITS : natural := 0; -- Empty State Bits - FSTATE_RD_BITS : natural := 0 -- Full State Bits + EMPTY_STATE_BITS : natural := 0; -- Empty State Bits + FILL_STATE_BITS : natural := 0 -- Full State Bits ); port ( -- Global Reset and Clock - rst, clk : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- Writing Interface - put : in std_logic; -- Write Request - din : in std_logic_vector(D_BITS - 1 downto 0); -- Input Data - full : out std_logic; - estate_wr : out std_logic_vector(imax(0, ESTATE_WR_BITS - 1) downto 0); + Put : in std_logic; -- Write Request + DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); -- Input Data + Full : out std_logic; + EmptyState : out std_logic_vector(imax(0, EMPTY_STATE_BITS - 1) downto 0); -- Reading Interface - got : in std_logic; -- Read Completed - dout : out std_logic_vector(D_BITS - 1 downto 0); -- Output Data - valid : out std_logic; - fstate_rd : out std_logic_vector(imax(0, FSTATE_RD_BITS - 1) downto 0) + Got : in std_logic; -- Read Completed + DataOut : out std_logic_vector(DATA_BITS - 1 downto 0); -- Output Data + Valid : out std_logic; + FillState : out std_logic_vector(imax(0, FILL_STATE_BITS - 1) downto 0) ); end entity fifo_cc_got; architecture rtl of fifo_cc_got is -- Address Width - constant A_BITS : natural := log2ceilnz(MIN_DEPTH); + constant ADDRESS_BITS : natural := log2ceilnz(MIN_DEPTH); ----------------------------------------------------------------------------- -- Memory Pointers -- Actual Input and Output Pointers - signal IP0 : unsigned(A_BITS - 1 downto 0) := (others => '0'); - signal OP0 : unsigned(A_BITS - 1 downto 0) := (others => '0'); + signal IP0 : unsigned(ADDRESS_BITS - 1 downto 0) := (others => '0'); + signal OP0 : unsigned(ADDRESS_BITS - 1 downto 0) := (others => '0'); -- Incremented Input and Output Pointers - signal IP1 : unsigned(A_BITS - 1 downto 0); - signal OP1 : unsigned(A_BITS - 1 downto 0); + signal IP1 : unsigned(ADDRESS_BITS - 1 downto 0); + signal OP1 : unsigned(ADDRESS_BITS - 1 downto 0); ----------------------------------------------------------------------------- -- Backing Memory Connectivity -- Write Port - signal wa : unsigned(A_BITS - 1 downto 0); + signal wa : unsigned(ADDRESS_BITS - 1 downto 0); signal we : std_logic; -- Read Port - signal ra : unsigned(A_BITS - 1 downto 0); + signal ra : unsigned(ADDRESS_BITS - 1 downto 0); signal re : std_logic; -- Internal full and empty indicators @@ -154,29 +155,29 @@ architecture rtl of fifo_cc_got is begin - Lut_reg_gen : if LUT_SHIFT_LOGIC and MIN_DEPTH <= 32 and D_BITS <= 128 and ESTATE_WR_BITS = 0 and FSTATE_RD_BITS = 0 generate - Lut_fifo : entity work.fifo_shift + Lut_reg_gen : if LUT_SHIFT_LOGIC and MIN_DEPTH <= 32 and DATA_BITS <= 128 and EMPTY_STATE_BITS = 0 and FILL_STATE_BITS = 0 generate + Lut_fifo : entity work.fifo_Shift generic map( - D_BITS => D_BITS, - MIN_DEPTH => 2 ** A_BITS + DATA_BITS => DATA_BITS, + MIN_DEPTH => 2 ** ADDRESS_BITS ) port map ( -- Global Control - clk => clk, - rst => rst, + Clock => Clock, + Reset => Reset, - put => put, - din => din, - ful => full, + Put => Put, + DataIn => DataIn, + Full => Full, - got => got, - dout => dout, - vld => valid + Got => Got, + DataOut => DataOut, + Valid => Valid ); - estate_wr <= (others => '0'); - fstate_rd <= (others => '0'); + EmptyState <= (others => '0'); + FillState <= (others => '0'); else generate assert LUT_SHIFT_LOGIC = false report "PoC.fifo_cc_got.vhdl :: Implementing FIFO in LUT_SHIFT_LOGIC was not possible. Following conditions are not met: 'MIN_DEPTH <= 32 and D_BITS <= 128 and ESTATE_WR_BITS = 0 and FSTATE_RD_BITS = 0'" @@ -192,34 +193,34 @@ begin IP0_slv <= std_logic_vector(IP0); OP0_slv <= std_logic_vector(OP0); - incIP : entity work.arith_carrychain_inc + incIP : entity work.arith_CarryChain_inc generic map( - BITS => A_BITS + BITS => ADDRESS_BITS ) port map ( - X => IP0_slv, - Y => IP1_slv + A => IP0_slv, + Sum => IP1_slv ); - incOP : entity work.arith_carrychain_inc + incOP : entity work.arith_CarryChain_inc generic map( - BITS => A_BITS + BITS => ADDRESS_BITS ) port map ( - X => OP0_slv, - Y => OP1_slv + A => OP0_slv, + Sum => OP1_slv ); IP1 <= unsigned(IP1_slv); OP1 <= unsigned(OP1_slv); end block; - process (clk) + process (Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then IP0 <= (others => '0'); OP0 <= (others => '0'); else @@ -241,10 +242,10 @@ begin -- Fill State Computation (soft indicators) process (IP0, OP0, fulli) - variable d : std_logic_vector(A_BITS - 1 downto 0); + variable d : std_logic_vector(ADDRESS_BITS - 1 downto 0); begin - estate_wr <= (others => 'X'); - fstate_rd <= (others => 'X'); + EmptyState <= (others => 'X'); + FillState <= (others => 'X'); -- Compute Pointer Difference if fulli = '1' then @@ -254,13 +255,13 @@ begin end if; -- Fix assignment to outputs - if ESTATE_WR_BITS > 0 then + if EMPTY_STATE_BITS > 0 then -- one's complement is pessimistically low by one but -- benefits optimization by synthesis - estate_wr <= not d(d'left downto d'left - ESTATE_WR_BITS + 1); + EmptyState <= not d(d'left downto d'left - EMPTY_STATE_BITS + 1); end if; - if FSTATE_RD_BITS > 0 then - fstate_rd <= d(d'left downto d'left - FSTATE_RD_BITS + 1); + if FILL_STATE_BITS > 0 then + FillState <= d(d'left downto d'left - FILL_STATE_BITS + 1); end if; end process; @@ -277,10 +278,10 @@ begin begin -- Direction Flag remembering the last Operation - process (clk) + process (Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then DF <= '0'; -- get => empty elsif we /= re then DF <= we; @@ -300,10 +301,10 @@ begin signal Ful : std_logic := '0'; signal Avl : std_logic := '0'; begin - process (clk) + process (Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then Ful <= '0'; Avl <= '0'; elsif we /= re then @@ -333,80 +334,80 @@ begin -- Memory Access -- Write Interface => Input - full <= fulli; - we <= put and not fulli; + Full <= fulli; + we <= Put and not fulli; -- Backing Memory and Read Interface => Output genLarge : if not DATA_REG generate - signal do : std_logic_vector(D_BITS - 1 downto 0); + signal do : std_logic_vector(DATA_BITS - 1 downto 0); begin -- Backing Memory - ram : entity work.ocram_sdp_optimized + ram : entity work.ocram_SimpleDualPort_Optimized generic map( - A_BITS => A_BITS, - D_BITS => D_BITS, + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS, RAM_TYPE => RAM_TYPE ) port map ( - wclk => clk, - rclk => clk, - wce => '1', + Write_Clock => Clock, + Read_Clock => Clock, + Write_ClockEnable => '1', - wa => wa, - we => we, - d => din, + Write_Address => wa, + Write_WriteEnable => we, + Write_DataIn => DataIn, - ra => ra, - rce => re, - q => do + Read_Address => ra, + Read_ClockEnable => re, + Read_DataOut => do ); -- Read Interface => Output genOutputCmb : if not OUTPUT_REG generate signal Vld : std_logic := '0'; -- valid output of RAM module begin - process (clk) + process (Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then Vld <= '0'; else - Vld <= (Vld and not got) or not empti; + Vld <= (Vld and not Got) or not empti; end if; end if; end process; - re <= (not Vld or got) and not empti; - dout <= do; - valid <= Vld; + re <= (not Vld or Got) and not empti; + DataOut <= do; + Valid <= Vld; end generate genOutputCmb; genOutputReg : if OUTPUT_REG generate -- Extra Buffer Register for Output Data - signal Buf : std_logic_vector(D_BITS - 1 downto 0) := (others => '-'); + signal Buf : std_logic_vector(DATA_BITS - 1 downto 0) := (others => '-'); signal Vld : std_logic_vector(0 to 1) := (others => '0'); -- Vld(0) -- valid output of RAM module -- Vld(1) -- valid word in Buf begin - process (clk) + process (Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then Buf <= (others => '-'); Vld <= (others => '0'); else - Vld(0) <= (Vld(0) and Vld(1) and not got) or not empti; - Vld(1) <= (Vld(1) and not got) or Vld(0); - if Vld(1) = '0' or got = '1' then + Vld(0) <= (Vld(0) and Vld(1) and not Got) or not empti; + Vld(1) <= (Vld(1) and not Got) or Vld(0); + if Vld(1) = '0' or Got = '1' then Buf <= do; end if; end if; end if; end process; - re <= (not Vld(0) or not Vld(1) or got) and not empti; - dout <= Buf; - valid <= Vld(1); + re <= (not Vld(0) or not Vld(1) or Got) and not empti; + DataOut <= Buf; + Valid <= Vld(1); end generate genOutputReg; end generate genLarge; @@ -414,7 +415,7 @@ begin genSmall : if DATA_REG generate -- Memory modelled as Array - type regfile_t is array(0 to 2 ** A_BITS - 1) of std_logic_vector(D_BITS - 1 downto 0); + type regfile_t is array(0 to 2 ** ADDRESS_BITS - 1) of std_logic_vector(DATA_BITS - 1 downto 0); signal regfile : regfile_t; attribute ram_style : string; -- XST specific attribute ram_style of regfile : signal is "distributed"; @@ -427,16 +428,16 @@ begin begin -- Memory State - process (clk) + process (Clock) begin - if rising_edge(clk) then + if rising_edge(Clock) then --synthesis translate_off - if SIMULATION and (rst = '1') then + if SIMULATION and (Reset = '1') then regfile <= (others => (others => '-')); else --synthesis translate_on if we = '1' then - regfile(to_integer(wa)) <= din; + regfile(to_integer(wa)) <= DataIn; end if; --synthesis translate_off end if; @@ -445,10 +446,10 @@ begin end process; -- Memory Output - re <= got and not empti; - dout <= (others => 'X') when Is_X(std_logic_vector(ra)) else + re <= Got and not empti; + DataOut <= (others => 'X') when Is_X(std_logic_vector(ra)) else regfile(to_integer(ra)); - valid <= not empti; + Valid <= not empti; end generate genSmall; end generate; diff --git a/src/fifo/fifo_cc_got_tempgot.vhdl b/src/fifo/fifo_cc_got_tempgot.vhdl index 1f00aac61..0275873a2 100644 --- a/src/fifo/fifo_cc_got_tempgot.vhdl +++ b/src/fifo/fifo_cc_got_tempgot.vhdl @@ -78,70 +78,72 @@ use IEEE.numeric_std.all; use work.config.all; use work.mem.all; use work.utils.all; -use work.ocram.ocram_sdp; +use work.ocram.ocram_SimpleDualPort; entity fifo_cc_got_tempgot is generic ( - RAM_TYPE : T_RAM_TYPE := RAM_TYPE_OPTIMIZED;--RAM_TYPE_AUTO; - D_BITS : positive; -- Data Width - MIN_DEPTH : positive; -- Minimum FIFO Depth - DATA_REG : boolean := false; -- Store Data Content in Registers - STATE_REG : boolean := false; -- Registered Full/Empty Indicators - OUTPUT_REG : boolean := false; -- Registered FIFO Output - ESTATE_WR_BITS : natural := 0; -- Empty State Bits - FSTATE_RD_BITS : natural := 0 -- Full State Bits + RAM_TYPE : T_RAM_TYPE := RAM_TYPE_OPTIMIZED;--RAM_TYPE_AUTO; + DATA_BITS : positive; -- Data Width + MIN_DEPTH : positive; -- Minimum FIFO Depth + DATA_REG : boolean := false; -- Store Data Content in Registers + STATE_REG : boolean := false; -- Registered Full/Empty Indicators + OUTPUT_REG : boolean := false; -- Registered FIFO Output + EMPTY_STATE_BITS : natural := 0; -- Empty State Bits + FILL_STATE_BITS : natural := 0 -- Full State Bits ); port ( -- Global Reset and Clock - rst, clk : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- Writing Interface - put : in std_logic; -- Write Request - din : in std_logic_vector(D_BITS - 1 downto 0); -- Input Data - full : out std_logic; - estate_wr : out std_logic_vector(imax(0, ESTATE_WR_BITS - 1) downto 0); + Put : in std_logic; -- Write Request + DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); -- Input Data + Full : out std_logic; + EmptyState : out std_logic_vector(imax(0, EMPTY_STATE_BITS - 1) downto 0); -- Reading Interface - got : in std_logic; -- Read Completed - dout : out std_logic_vector(D_BITS - 1 downto 0); -- Output Data - valid : out std_logic; - fstate_rd : out std_logic_vector(imax(0, FSTATE_RD_BITS - 1) downto 0); + Got : in std_logic; -- Read Completed + DataOut : out std_logic_vector(DATA_BITS - 1 downto 0); -- Output Data + Valid : out std_logic; + FillState : out std_logic_vector(imax(0, FILL_STATE_BITS - 1) downto 0); - commit : in std_logic; - rollback : in std_logic + Commit : in std_logic; + Rollback : in std_logic ); -end entity fifo_cc_got_tempgot; +end entity; + architecture rtl of fifo_cc_got_tempgot is -- Address Width - constant A_BITS : natural := log2ceil(MIN_DEPTH); + constant ADDRESS_BITS : natural := log2ceil(MIN_DEPTH); -- Force Carry-Chain Use for Pointer Increments on Xilinx Architectures - constant FORCE_XILCY : boolean := (not SIMULATION) and (VENDOR = VENDOR_XILINX) and STATE_REG and (A_BITS > 4); + constant FORCE_XILCY : boolean := (not SIMULATION) and (VENDOR = VENDOR_XILINX) and STATE_REG and (ADDRESS_BITS > 4); ----------------------------------------------------------------------------- -- Memory Pointers -- Actual Input and Output Pointers - signal IP0 : unsigned(A_BITS - 1 downto 0) := (others => '0'); - signal OP0 : unsigned(A_BITS - 1 downto 0) := (others => '0'); + signal IP0 : unsigned(ADDRESS_BITS - 1 downto 0) := (others => '0'); + signal OP0 : unsigned(ADDRESS_BITS - 1 downto 0) := (others => '0'); -- Incremented Input and Output Pointers - signal IP1 : unsigned(A_BITS - 1 downto 0); - signal OP1 : unsigned(A_BITS - 1 downto 0); + signal IP1 : unsigned(ADDRESS_BITS - 1 downto 0); + signal OP1 : unsigned(ADDRESS_BITS - 1 downto 0); -- Committed Read Pointer (Commit Marker) - signal OPm : unsigned(A_BITS - 1 downto 0) := (others => '0'); + signal OPm : unsigned(ADDRESS_BITS - 1 downto 0) := (others => '0'); ----------------------------------------------------------------------------- -- Backing Memory Connectivity -- Write Port - signal wa : unsigned(A_BITS - 1 downto 0); + signal wa : unsigned(ADDRESS_BITS - 1 downto 0); signal we : std_logic; -- Read Port - signal ra : unsigned(A_BITS - 1 downto 0); + signal ra : unsigned(ADDRESS_BITS - 1 downto 0); signal re : std_logic; -- Internal full and empty indicators @@ -152,7 +154,7 @@ begin ----------------------------------------------------------------------------- -- Pointer Logic - blkPointer : block + blkPointer : block signal IP0_slv : std_logic_vector(IP0'range); signal IP1_slv : std_logic_vector(IP0'range); signal OP0_slv : std_logic_vector(IP0'range); @@ -161,34 +163,34 @@ begin IP0_slv <= std_logic_vector(IP0); OP0_slv <= std_logic_vector(OP0); - incIP : entity work.arith_carrychain_inc + incIP : entity work.arith_CarryChain_inc generic map( - BITS => A_BITS + BITS => ADDRESS_BITS ) port map ( - X => IP0_slv, - Y => IP1_slv + A => IP0_slv, + Sum => IP1_slv ); - incOP : entity work.arith_carrychain_inc + incOP : entity work.arith_CarryChain_inc generic map( - BITS => A_BITS + BITS => ADDRESS_BITS ) port map ( - X => OP0_slv, - Y => OP1_slv + A => OP0_slv, + Sum => OP1_slv ); IP1 <= unsigned(IP1_slv); OP1 <= unsigned(OP1_slv); end block; - process (clk) + process (Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then IP0 <= (others => '0'); OP0 <= (others => '0'); OPm <= (others => '0'); @@ -199,14 +201,14 @@ begin end if; -- Update Output Pointer upon Read or Rollback - if rollback = '1' then + if Rollback = '1' then OP0 <= OPm; elsif re = '1' then OP0 <= OP1; end if; -- Update Commit Marker - if commit = '1' then + if Commit = '1' then if re = '1' then OPm <= OP1; else @@ -222,33 +224,33 @@ begin -- Fill State Computation (soft indicators) process (fulli, IP0, OP0, OPm) - variable d : std_logic_vector(A_BITS - 1 downto 0); + variable d : std_logic_vector(ADDRESS_BITS - 1 downto 0); begin -- Available Space - if ESTATE_WR_BITS > 0 then + if EMPTY_STATE_BITS > 0 then -- Compute Pointer Difference if fulli = '1' then d := (others => '1'); -- true number minus one when full else d := std_logic_vector(IP0 - OPm); -- true number of valid entries end if; - estate_wr <= not d(d'left downto d'left - ESTATE_WR_BITS + 1); + EmptyState <= not d(d'left downto d'left - EMPTY_STATE_BITS + 1); else - estate_wr <= (others => 'X'); + EmptyState <= (others => 'X'); end if; -- Available Content - if FSTATE_RD_BITS > 0 then + if FILL_STATE_BITS > 0 then -- Compute Pointer Difference if fulli = '1' then d := (others => '1'); -- true number minus one when full else d := std_logic_vector(IP0 - OP0); -- true number of valid entries end if; - fstate_rd <= d(d'left downto d'left - FSTATE_RD_BITS + 1); + FillState <= d(d'left downto d'left - FILL_STATE_BITS + 1); else - fstate_rd <= (others => 'X'); + FillState <= (others => 'X'); end if; end process; @@ -259,36 +261,36 @@ begin -- The STATE_REG generic is ignored as two different comparators are -- needed to compare IP with OPm (full) and IP with OP (empty) anyways. -- So the register implementation is always used. - blkState : block + blkState : block signal Ful : std_logic := '0'; signal Pnd : std_logic := '0'; signal Avl : std_logic := '0'; begin - process (clk) + process (Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then Ful <= '0'; Pnd <= '0'; Avl <= '0'; else -- Pending Indicator for uncommitted Data - if commit = '1' or rollback = '1' then + if Commit = '1' or Rollback = '1' then Pnd <= '0'; elsif re = '1' then Pnd <= '1'; end if; -- Update Full Indicator - if commit = '1' and (re = '1' or Pnd = '1') then + if Commit = '1' and (re = '1' or Pnd = '1') then Ful <= '0'; elsif we = '1' and IP1 = OPm then Ful <= '1'; end if; -- Update Empty Indicator - if we = '1' or (rollback = '1' and Pnd = '1') then + if we = '1' or (Rollback = '1' and Pnd = '1') then Avl <= '1'; elsif re = '1' and we = '0' and OP1 = IP0 then Avl <= '0'; @@ -305,80 +307,80 @@ begin -- Memory Access -- Write Interface => Input - full <= fulli; - we <= put and not fulli; + Full <= fulli; + we <= Put and not fulli; -- Backing Memory and Read Interface => Output genLarge : if not DATA_REG generate - signal do : std_logic_vector(D_BITS - 1 downto 0); + signal do : std_logic_vector(DATA_BITS - 1 downto 0); begin -- Backing Memory - ram : entity work.ocram_sdp_optimized + ram : entity work.ocram_SimpleDualPort_Optimized generic map( RAM_TYPE => RAM_TYPE, - A_BITS => A_BITS, - D_BITS => D_BITS + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS ) port map ( - wclk => clk, - rclk => clk, - wce => '1', + Write_Clock => Clock, + Read_Clock => Clock, + Write_ClockEnable => '1', - wa => wa, - we => we, - d => din, + Write_Address => wa, + Write_WriteEnable => we, + Write_DataIn => DataIn, - ra => ra, - rce => re, - q => do + Read_Address => ra, + Read_ClockEnable => re, + Read_DataOut => do ); -- Read Interface => Output genOutputCmb : if not OUTPUT_REG generate signal Vld : std_logic := '0'; -- valid output of RAM module begin - process (clk) + process (Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then Vld <= '0'; else - Vld <= (Vld and not got) or not empti; + Vld <= (Vld and not Got) or not empti; end if; end if; end process; - re <= (not Vld or got) and not empti; - dout <= do; - valid <= Vld; + re <= (not Vld or Got) and not empti; + DataOut <= do; + Valid <= Vld; end generate genOutputCmb; genOutputReg : if OUTPUT_REG generate -- Extra Buffer Register for Output Data - signal Buf : std_logic_vector(D_BITS - 1 downto 0) := (others => '-'); + signal Buf : std_logic_vector(DATA_BITS - 1 downto 0) := (others => '-'); signal Vld : std_logic_vector(0 to 1) := (others => '0'); -- Vld(0) -- valid output of RAM module -- Vld(1) -- valid word in Buf begin - process (clk) + process (Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then Buf <= (others => '-'); Vld <= (others => '0'); else - Vld(0) <= (Vld(0) and Vld(1) and not got) or not empti; - Vld(1) <= (Vld(1) and not got) or Vld(0); - if Vld(1) = '0' or got = '1' then + Vld(0) <= (Vld(0) and Vld(1) and not Got) or not empti; + Vld(1) <= (Vld(1) and not Got) or Vld(0); + if Vld(1) = '0' or Got = '1' then Buf <= do; end if; end if; end if; end process; - re <= (not Vld(0) or not Vld(1) or got) and not empti; - dout <= Buf; - valid <= Vld(1); + re <= (not Vld(0) or not Vld(1) or Got) and not empti; + DataOut <= Buf; + Valid <= Vld(1); end generate genOutputReg; end generate genLarge; @@ -386,7 +388,7 @@ begin genSmall : if DATA_REG generate -- Memory modelled as Array - type regfile_t is array(0 to 2 ** A_BITS - 1) of std_logic_vector(D_BITS - 1 downto 0); + type regfile_t is array(0 to 2 ** ADDRESS_BITS - 1) of std_logic_vector(DATA_BITS - 1 downto 0); signal regfile : regfile_t; attribute ram_style : string; -- XST specific attribute ram_style of regfile : signal is "distributed"; @@ -399,16 +401,16 @@ begin begin -- Memory State - process (clk) + process (Clock) begin - if rising_edge(clk) then + if rising_edge(Clock) then --synthesis translate_off - if SIMULATION and (rst = '1') then + if SIMULATION and (Reset = '1') then regfile <= (others => (others => '-')); else --synthesis translate_on if we = '1' then - regfile(to_integer(wa)) <= din; + regfile(to_integer(wa)) <= DataIn; end if; --synthesis translate_off end if; @@ -417,10 +419,10 @@ begin end process; -- Memory Output - re <= got and not empti; - dout <= (others => 'X') when Is_X(std_logic_vector(ra)) else + re <= Got and not empti; + DataOut <= (others => 'X') when Is_X(std_logic_vector(ra)) else regfile(to_integer(ra)); - valid <= not empti; + Valid <= not empti; end generate genSmall; diff --git a/src/fifo/fifo_cc_got_tempput.vhdl b/src/fifo/fifo_cc_got_tempput.vhdl index fd427f130..532c92a8e 100644 --- a/src/fifo/fifo_cc_got_tempput.vhdl +++ b/src/fifo/fifo_cc_got_tempput.vhdl @@ -78,70 +78,71 @@ use IEEE.numeric_std.all; use work.config.all; use work.utils.all; use work.mem.all; -use work.ocram.ocram_sdp; +use work.ocram.ocram_SimpleDualPort; entity fifo_cc_got_tempput is generic ( - RAM_TYPE : T_RAM_TYPE := RAM_TYPE_OPTIMIZED;--RAM_TYPE_AUTO; - D_BITS : positive; -- Data Width - MIN_DEPTH : positive; -- Minimum FIFO Depth - DATA_REG : boolean := false; -- Store Data Content in Registers - STATE_REG : boolean := false; -- Registered Full/Empty Indicators - OUTPUT_REG : boolean := false; -- Registered FIFO Output - ESTATE_WR_BITS : natural := 0; -- Empty State Bits - FSTATE_RD_BITS : natural := 0 -- Full State Bits + RAM_TYPE : T_RAM_TYPE := RAM_TYPE_OPTIMIZED;--RAM_TYPE_AUTO; + DATA_BITS : positive; -- Data Width + MIN_DEPTH : positive; -- Minimum FIFO Depth + DATA_REG : boolean := false; -- Store Data Content in Registers + STATE_REG : boolean := false; -- Registered Full/Empty Indicators + OUTPUT_REG : boolean := false; -- Registered FIFO Output + EMPTY_STATE_BITS : natural := 0; -- Empty State Bits + FILL_STATE_BITS : natural := 0 -- Full State Bits ); port ( -- Global Reset and Clock - rst, clk : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- Writing Interface - put : in std_logic; -- Write Request - din : in std_logic_vector(D_BITS - 1 downto 0); -- Input Data - full : out std_logic; - estate_wr : out std_logic_vector(imax(0, ESTATE_WR_BITS - 1) downto 0); + Put : in std_logic; -- Write Request + DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); -- Input Data + Full : out std_logic; + EmptyState : out std_logic_vector(imax(0, EMPTY_STATE_BITS - 1) downto 0); - commit : in std_logic; - rollback : in std_logic; + Commit : in std_logic; + Rollback : in std_logic; -- Reading Interface - got : in std_logic; -- Read Completed - dout : out std_logic_vector(D_BITS - 1 downto 0); -- Output Data - valid : out std_logic; - fstate_rd : out std_logic_vector(imax(0, FSTATE_RD_BITS - 1) downto 0) + Got : in std_logic; -- Read Completed + DataOut : out std_logic_vector(DATA_BITS - 1 downto 0); -- Output Data + Valid : out std_logic; + FillState : out std_logic_vector(imax(0, FILL_STATE_BITS - 1) downto 0) ); end entity; architecture rtl of fifo_cc_got_tempput is -- Address Width - constant A_BITS : natural := log2ceil(MIN_DEPTH); + constant ADDRESS_BITS : natural := log2ceil(MIN_DEPTH); -- Force Carry-Chain Use for Pointer Increments on Xilinx Architectures - constant FORCE_XILCY : boolean := (not SIMULATION) and (VENDOR = VENDOR_XILINX) and STATE_REG and (A_BITS > 4); + constant FORCE_XILCY : boolean := (not SIMULATION) and (VENDOR = VENDOR_XILINX) and STATE_REG and (ADDRESS_BITS > 4); ----------------------------------------------------------------------------- -- Memory Pointers -- Actual Input and Output Pointers - signal IP0 : unsigned(A_BITS - 1 downto 0) := (others => '0'); - signal OP0 : unsigned(A_BITS - 1 downto 0) := (others => '0'); + signal IP0 : unsigned(ADDRESS_BITS - 1 downto 0) := (others => '0'); + signal OP0 : unsigned(ADDRESS_BITS - 1 downto 0) := (others => '0'); -- Incremented Input and Output Pointers - signal IP1 : unsigned(A_BITS - 1 downto 0); - signal OP1 : unsigned(A_BITS - 1 downto 0); + signal IP1 : unsigned(ADDRESS_BITS - 1 downto 0); + signal OP1 : unsigned(ADDRESS_BITS - 1 downto 0); -- Committed Write Pointer (Commit Marker) - signal IPm : unsigned(A_BITS - 1 downto 0) := (others => '0'); + signal IPm : unsigned(ADDRESS_BITS - 1 downto 0) := (others => '0'); ----------------------------------------------------------------------------- -- Backing Memory Connectivity -- Write Port - signal wa : unsigned(A_BITS - 1 downto 0); + signal wa : unsigned(ADDRESS_BITS - 1 downto 0); signal we : std_logic; -- Read Port - signal ra : unsigned(A_BITS - 1 downto 0); + signal ra : unsigned(ADDRESS_BITS - 1 downto 0); signal re : std_logic; -- Internal full and empty indicators @@ -152,7 +153,7 @@ begin ----------------------------------------------------------------------------- -- Pointer Logic - blkPointer : block + blkPointer : block signal IP0_slv : std_logic_vector(IP0'range); signal IP1_slv : std_logic_vector(IP0'range); signal OP0_slv : std_logic_vector(IP0'range); @@ -161,45 +162,45 @@ begin IP0_slv <= std_logic_vector(IP0); OP0_slv <= std_logic_vector(OP0); - incIP : entity work.arith_carrychain_inc + incIP : entity work.arith_CarryChain_inc generic map ( - BITS => A_BITS + BITS => ADDRESS_BITS ) port map ( - X => IP0_slv, - Y => IP1_slv + A => IP0_slv, + Sum => IP1_slv ); - incOP : entity work.arith_carrychain_inc + incOP : entity work.arith_CarryChain_inc generic map ( - BITS => A_BITS + BITS => ADDRESS_BITS ) port map ( - X => OP0_slv, - Y => OP1_slv + A => OP0_slv, + Sum => OP1_slv ); IP1 <= unsigned(IP1_slv); OP1 <= unsigned(OP1_slv); end block; - process (clk) + process (Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then IP0 <= (others => '0'); IPm <= (others => '0'); OP0 <= (others => '0'); else -- Update Input Pointer upon Write - if rollback = '1' then + if Rollback = '1' then IP0 <= IPm; elsif we = '1' then IP0 <= IP1; end if; -- Update Commit Marker - if commit = '1' then + if Commit = '1' then if we = '1' then IPm <= IP1; else @@ -220,33 +221,33 @@ begin -- Fill State Computation (soft indicators) process (fulli, IP0, IPm, OP0) - variable d : std_logic_vector(A_BITS - 1 downto 0); + variable d : std_logic_vector(ADDRESS_BITS - 1 downto 0); begin -- Available Space - if ESTATE_WR_BITS > 0 then + if EMPTY_STATE_BITS > 0 then -- Compute Pointer Difference if fulli = '1' then d := (others => '1'); -- true number minus one when full else d := std_logic_vector(IP0 - OP0); -- true number of valid entries end if; - estate_wr <= not d(d'left downto d'left - ESTATE_WR_BITS + 1); + EmptyState <= not d(d'left downto d'left - EMPTY_STATE_BITS + 1); else - estate_wr <= (others => 'X'); + EmptyState <= (others => 'X'); end if; -- Available Content - if FSTATE_RD_BITS > 0 then + if FILL_STATE_BITS > 0 then -- Compute Pointer Difference if fulli = '1' then d := (others => '1'); -- true number minus one when full else d := std_logic_vector(IPm - OP0); -- true number of valid entries end if; - fstate_rd <= d(d'left downto d'left - FSTATE_RD_BITS + 1); + FillState <= d(d'left downto d'left - FILL_STATE_BITS + 1); else - fstate_rd <= (others => 'X'); + FillState <= (others => 'X'); end if; end process; @@ -257,36 +258,36 @@ begin -- The STATE_REG generic is ignored as two different comparators are -- needed to compare OP with IPm (empty) and IP with OP (full) anyways. -- So the register implementation is always used. - blkState : block + blkState : block signal Ful : std_logic := '0'; signal Pnd : std_logic := '0'; signal Avl : std_logic := '0'; begin - process (clk) + process (Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then Ful <= '0'; Pnd <= '0'; Avl <= '0'; else -- Pending Indicator for uncommitted Data - if commit = '1' or rollback = '1' then + if Commit = '1' or Rollback = '1' then Pnd <= '0'; elsif we = '1' then Pnd <= '1'; end if; -- Update Full Indicator - if re = '1' or (rollback = '1' and Pnd = '1') then + if re = '1' or (Rollback = '1' and Pnd = '1') then Ful <= '0'; elsif we = '1' and re = '0' and IP1 = OP0 then Ful <= '1'; end if; -- Update Empty Indicator - if commit = '1' and (we = '1' or Pnd = '1') then + if Commit = '1' and (we = '1' or Pnd = '1') then Avl <= '1'; elsif re = '1' and OP1 = IPm then Avl <= '0'; @@ -303,79 +304,79 @@ begin -- Memory Access -- Write Interface => Input - full <= fulli; - we <= put and not fulli; + Full <= fulli; + we <= Put and not fulli; -- Backing Memory and Read Interface => Output genLarge : if not DATA_REG generate - signal do : std_logic_vector(D_BITS - 1 downto 0); + signal do : std_logic_vector(DATA_BITS - 1 downto 0); begin -- Backing Memory - ram : entity work.ocram_sdp_optimized + ram : entity work.ocram_SimpleDualPort_Optimized generic map ( RAM_TYPE => RAM_TYPE, - A_BITS => A_BITS, - D_BITS => D_BITS + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS ) port map ( - wclk => clk, - rclk => clk, - wce => '1', + Write_Clock => Clock, + Read_Clock => Clock, + Write_ClockEnable => '1', - wa => wa, - we => we, - d => din, + Write_Address => wa, + Write_WriteEnable => we, + Write_DataIn => DataIn, - ra => ra, - rce => re, - q => do + Read_Address => ra, + Read_ClockEnable => re, + Read_DataOut => do ); -- Read Interface => Output genOutputCmb : if not OUTPUT_REG generate signal Vld : std_logic := '0'; -- valid output of RAM module begin - process (clk) + process (Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then Vld <= '0'; else - Vld <= (Vld and not got) or not empti; + Vld <= (Vld and not Got) or not empti; end if; end if; end process; - re <= (not Vld or got) and not empti; - dout <= do; - valid <= Vld; + re <= (not Vld or Got) and not empti; + DataOut <= do; + Valid <= Vld; end generate genOutputCmb; genOutputReg : if OUTPUT_REG generate -- Extra Buffer Register for Output Data - signal Buf : std_logic_vector(D_BITS - 1 downto 0) := (others => '-'); + signal Buf : std_logic_vector(DATA_BITS - 1 downto 0) := (others => '-'); signal Vld : std_logic_vector(0 to 1) := (others => '0'); -- Vld(0) -- valid output of RAM module -- Vld(1) -- valid word in Buf begin - process (clk) + process (Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then Buf <= (others => '-'); Vld <= (others => '0'); else - Vld(0) <= (Vld(0) and Vld(1) and not got) or not empti; - Vld(1) <= (Vld(1) and not got) or Vld(0); - if Vld(1) = '0' or got = '1' then + Vld(0) <= (Vld(0) and Vld(1) and not Got) or not empti; + Vld(1) <= (Vld(1) and not Got) or Vld(0); + if Vld(1) = '0' or Got = '1' then Buf <= do; end if; end if; end if; end process; - re <= (not Vld(0) or not Vld(1) or got) and not empti; - dout <= Buf; - valid <= Vld(1); + re <= (not Vld(0) or not Vld(1) or Got) and not empti; + DataOut <= Buf; + Valid <= Vld(1); end generate genOutputReg; end generate genLarge; @@ -383,7 +384,7 @@ begin genSmall : if DATA_REG generate -- Memory modelled as Array - type regfile_t is array(0 to 2 ** A_BITS - 1) of std_logic_vector(D_BITS - 1 downto 0); + type regfile_t is array(0 to 2 ** ADDRESS_BITS - 1) of std_logic_vector(DATA_BITS - 1 downto 0); signal regfile : regfile_t; attribute ram_style : string; -- XST specific attribute ram_style of regfile : signal is "distributed"; @@ -396,16 +397,16 @@ begin begin -- Memory State - process (clk) + process (Clock) begin - if rising_edge(clk) then + if rising_edge(Clock) then --synthesis translate_off - if SIMULATION and (rst = '1') then + if SIMULATION and (Reset = '1') then regfile <= (others => (others => '-')); else --synthesis translate_on if we = '1' then - regfile(to_integer(wa)) <= din; + regfile(to_integer(wa)) <= DataIn; end if; --synthesis translate_off end if; @@ -414,10 +415,10 @@ begin end process; -- Memory Output - re <= got and not empti; - dout <= (others => 'X') when Is_X(std_logic_vector(ra)) else + re <= Got and not empti; + DataOut <= (others => 'X') when Is_X(std_logic_vector(ra)) else regfile(to_integer(ra)); - valid <= not empti; + Valid <= not empti; end generate genSmall; diff --git a/src/fifo/fifo_ic_assembly.vhdl b/src/fifo/fifo_ic_assembly.vhdl index d81aabf14..3494c7a88 100644 --- a/src/fifo/fifo_ic_assembly.vhdl +++ b/src/fifo/fifo_ic_assembly.vhdl @@ -36,8 +36,8 @@ -- limitations under the License. -- ============================================================================= -library IEEE; -use IEEE.std_logic_1164.all; +library IEEE; +use IEEE.std_logic_1164.all; entity fifo_ic_assembly is generic ( @@ -47,8 +47,8 @@ entity fifo_ic_assembly is ); port ( -- Write Interface - clk_wr : in std_logic; - rst_wr : in std_logic; + clk_wr : in std_logic; + rst_wr : in std_logic; -- Only write addresses in the range [base, base+2**(A_BITS-G_BITS)) are -- acceptable. This is equivalent to the test @@ -65,21 +65,21 @@ entity fifo_ic_assembly is put : in std_logic; -- Read Interface - clk_rd : in std_logic; - rst_rd : in std_logic; + clk_rd : in std_logic; + rst_rd : in std_logic; dout : out std_logic_vector(D_BITS-1 downto 0); vld : out std_logic; got : in std_logic ); -end entity fifo_ic_assembly; +end entity; library IEEE; -use IEEE.numeric_std.all; +use IEEE.numeric_std.all; -use work.utils.all; -use work.ocram.all; +use work.utils.all; +use work.ocram.all; architecture rtl of fifo_ic_assembly is @@ -198,23 +198,23 @@ begin end block blkRead; -- Backing internal assembly memory - ram : ocram_sdp + ram : ocram_SimpleDualPort generic map ( - A_BITS => AN, - D_BITS => DN + ADDRESS_BITS => AN, + DATA_BITS => DN ) port map ( - wclk => clk_wr, - rclk => clk_rd, + Write_Clock => clk_wr, + Read_Clock => clk_rd, - wa => wa, - wce => '1', - we => we, - d => di, + Write_Address => wa, + Write_ClockEnable => '1', + Write_WriteEnable => we, + Write_DataIn => di, - ra => ra, - rce => '1', - q => do + Read_Address => ra, + Read_ClockEnable => '1', + Read_DataOut => do ); end rtl; diff --git a/src/fifo/fifo_ic_got.vhdl b/src/fifo/fifo_ic_got.vhdl index c04202c1e..16be0edb1 100644 --- a/src/fifo/fifo_ic_got.vhdl +++ b/src/fifo/fifo_ic_got.vhdl @@ -73,332 +73,332 @@ use work.ocram.all; -- "all" required by Quartus RTL simulation entity fifo_ic_got is - generic ( - D_BITS : positive; -- Data Width - MIN_DEPTH : positive; -- Minimum FIFO Depth - DATA_REG : boolean := false; -- Store Data Content in Registers - OUTPUT_REG : boolean := false; -- Registered FIFO Output - ESTATE_WR_BITS : natural := 0; -- Empty State Bits - FSTATE_RD_BITS : natural := 0 -- Full State Bits - ); - port ( - -- Write Interface - clk_wr : in std_logic; - rst_wr : in std_logic; - put : in std_logic; - din : in std_logic_vector(D_BITS-1 downto 0); - full : out std_logic; - estate_wr : out std_logic_vector(imax(ESTATE_WR_BITS-1, 0) downto 0); - - -- Read Interface - clk_rd : in std_logic; - rst_rd : in std_logic; - got : in std_logic; - valid : out std_logic; - dout : out std_logic_vector(D_BITS-1 downto 0); - fstate_rd : out std_logic_vector(imax(FSTATE_RD_BITS-1, 0) downto 0) - ); -end entity fifo_ic_got; + generic ( + DATA_BITS : positive; -- Data Width + MIN_DEPTH : positive; -- Minimum FIFO Depth + DATA_REG : boolean := false; -- Store Data Content in Registers + OUTPUT_REG : boolean := false; -- Registered FIFO Output + EMPTY_STATE_BITS : natural := 0; -- Empty State Bits + FILL_STATE_BITS : natural := 0 -- Full State Bits + ); + port ( + -- Write Interface + clk_wr : in std_logic; + rst_wr : in std_logic; + put : in std_logic; + din : in std_logic_vector(DATA_BITS-1 downto 0); + full : out std_logic; + estate_wr : out std_logic_vector(imax(EMPTY_STATE_BITS-1, 0) downto 0); + + -- Read Interface + clk_rd : in std_logic; + rst_rd : in std_logic; + got : in std_logic; + valid : out std_logic; + dout : out std_logic_vector(DATA_BITS-1 downto 0); + fstate_rd : out std_logic_vector(imax(FILL_STATE_BITS-1, 0) downto 0) + ); +end entity; architecture rtl of fifo_ic_got is - -- Constants - constant A_BITS : positive := log2ceilnz(MIN_DEPTH); - constant AN : positive := A_BITS + 1; + -- Constants + constant ADDRESS_BITS : positive := log2ceilnz(MIN_DEPTH); + constant AN : positive := ADDRESS_BITS + 1; - -- Registers, clk_wr domain - signal IP1 : std_logic_vector(AN-1 downto 0); -- IP + 1 - signal IP0 : std_logic_vector(AN-1 downto 0) := (others => '0'); -- Write Pointer IP - signal IP0_d : std_logic_vector(AN-1 downto 0) := (others => '0'); -- Write Pointer IP delayed - signal OPc : std_logic_vector(AN-1 downto 0) := (others => '0'); -- Copy of OP - signal Ful : std_logic := '0'; -- RAM full + -- Registers, clk_wr domain + signal IP1 : std_logic_vector(AN-1 downto 0); -- IP + 1 + signal IP0 : std_logic_vector(AN-1 downto 0) := (others => '0'); -- Write Pointer IP + signal IP0_d : std_logic_vector(AN-1 downto 0) := (others => '0'); -- Write Pointer IP delayed + signal OPc : std_logic_vector(AN-1 downto 0) := (others => '0'); -- Copy of OP + signal Ful : std_logic := '0'; -- RAM full - -- Registers, clk_rd domain - signal OP1 : std_logic_vector(AN-1 downto 0); -- OP + 1 - signal OP0 : std_logic_vector(AN-1 downto 0) := (others => '0'); -- Read Pointer OP - signal OP0_d : std_logic_vector(AN-1 downto 0) := (others => '0'); -- Read Pointer OP delayed - signal IPc : std_logic_vector(AN-1 downto 0) := (others => '0'); -- Copy of IP - signal Avl : std_logic := '0'; -- RAM Data available - signal Vld : std_logic := '0'; -- Output Valid + -- Registers, clk_rd domain + signal OP1 : std_logic_vector(AN-1 downto 0); -- OP + 1 + signal OP0 : std_logic_vector(AN-1 downto 0) := (others => '0'); -- Read Pointer OP + signal OP0_d : std_logic_vector(AN-1 downto 0) := (others => '0'); -- Read Pointer OP delayed + signal IPc : std_logic_vector(AN-1 downto 0) := (others => '0'); -- Copy of IP + signal Avl : std_logic := '0'; -- RAM Data available + signal Vld : std_logic := '0'; -- Output Valid - -- Memory Connectivity - signal wa : unsigned(A_BITS-1 downto 0); - signal di : std_logic_vector(D_BITS-1 downto 0); - signal puti : std_logic; + -- Memory Connectivity + signal wa : unsigned(ADDRESS_BITS-1 downto 0); + signal di : std_logic_vector(DATA_BITS-1 downto 0); + signal puti : std_logic; - signal ra : unsigned(A_BITS-1 downto 0); - signal do : std_logic_vector(D_BITS-1 downto 0); - signal geti : std_logic; + signal ra : unsigned(ADDRESS_BITS-1 downto 0); + signal do : std_logic_vector(DATA_BITS-1 downto 0); + signal geti : std_logic; - signal goti : std_logic; -- Internal Read ACK + signal goti : std_logic; -- Internal Read ACK begin - ----------------------------------------------------------------------------- - -- Write clock domain - ----------------------------------------------------------------------------- - blkIP: block - signal Cnt : unsigned(AN-1 downto 0) := to_unsigned(1, AN); - begin - process(clk_wr) - begin - if rising_edge(clk_wr) then - if rst_wr = '1' then - Cnt <= to_unsigned(1, AN); - elsif puti = '1' then - Cnt <= Cnt + 1; - end if; - end if; - end process; - IP1 <= std_logic_vector(Cnt(A_BITS) & (Cnt(A_BITS-1 downto 0) xor ('0' & Cnt(A_BITS-1 downto 1)))); - end block blkIP; - - -- Update Write Pointer upon puti - process(clk_wr) - begin - if rising_edge(clk_wr) then - if rst_wr = '1' then - IP0 <= (others => '0'); - Ful <= '0'; - else - if puti = '1' then - IP0 <= IP1; - if IP1(A_BITS-1 downto 0) = OPc(A_BITS-1 downto 0) then - Ful <= '1'; - else - Ful <= '0'; - end if; - end if; - if Ful = '1' then - if IP0 = (not OPc(A_BITS) & OPc(A_BITS-1 downto 0)) then - Ful <= '1'; - else - Ful <= '0'; - end if; - end if; - end if; - end if; - end process; - puti <= put and not Ful; - full <= Ful; - - di <= din; - wa <= unsigned(IP0(A_BITS-1 downto 0)); - - -- write pointer needs to be delayed by one CC to asure that data - -- is fully stored before giving it free to the other side. - -- Problem when clk_rd > 2* clk_wr - IP0_d <= IP0 when rising_edge(clk_wr); - Read_pointer_sync : entity work.sync_Bits - generic map( - BITS => AN, - REGISTER_OUTPUT => false - ) - port map( - Clock => clk_rd, - Input => IP0_d, - Output => IPc - ); - - ----------------------------------------------------------------------------- - -- Read clock domain - ----------------------------------------------------------------------------- - blkOP: block - signal Cnt : unsigned(AN-1 downto 0) := to_unsigned(1, AN); - begin - process(clk_rd) - begin - if rising_edge(clk_rd) then - if rst_rd = '1' then - Cnt <= to_unsigned(1, AN); - elsif geti = '1' then - Cnt <= Cnt + 1; - end if; - end if; - end process; - OP1 <= std_logic_vector(Cnt(A_BITS) & (Cnt(A_BITS-1 downto 0) xor ('0' & Cnt(A_BITS-1 downto 1)))); - end block blkOP; - - process(clk_rd) - begin - if rising_edge(clk_rd) then - if rst_rd = '1' then - OP0 <= (others => '0'); - Avl <= '0'; - Vld <= '0'; - else - if geti = '1' then - OP0 <= OP1; - if OP1(A_BITS-1 downto 0) = IPc(A_BITS-1 downto 0) then - Avl <= '0'; - else - Avl <= '1'; - end if; - Vld <= '1'; - elsif goti = '1' then - Vld <= '0'; - end if; - - if Avl = '0' then - if OP0 = IPc then - Avl <= '0'; - else - Avl <= '1'; - end if; - end if; - - end if; - end if; - end process; - geti <= (not Vld or goti) and Avl; - ra <= unsigned(OP0(A_BITS-1 downto 0)); - - -- read pointer needs to be delayed by one CC to asure that data - -- is read out before giving it free to the other side - -- Problem when clk_wr > 2* clk_rd - OP0_d <= OP0 when rising_edge(clk_rd); - Write_pointer_sync : entity work.sync_Bits - generic map( - BITS => AN, - REGISTER_OUTPUT => false - ) - port map( - Clock => clk_wr, - Input => OP0_d, - Output => OPc - ); - - ----------------------------------------------------------------------------- - -- Add register to data output - -- - -- Not needed if DATA_REG = true, because "dout" is already feed from a - -- register in that case. - ----------------------------------------------------------------------------- - genRegN: if DATA_REG or not OUTPUT_REG generate - goti <= got; - dout <= do; - valid <= Vld; - end generate genRegN; - genRegY: if (not DATA_REG) and OUTPUT_REG generate - signal Buf : std_logic_vector(D_BITS-1 downto 0) := (others => '-'); - signal VldB : std_logic := '0'; - begin - process(clk_rd) - begin - if rising_edge(clk_rd) then - if rst_rd = '1' then - Buf <= (others => '-'); - VldB <= '0'; - elsif goti = '1' then - Buf <= do; - VldB <= Vld; - end if; - end if; - end process; - goti <= not VldB or got; - dout <= Buf; - valid <= VldB; - end generate genRegY; - - ----------------------------------------------------------------------------- - -- Fill State - ----------------------------------------------------------------------------- - -- Write Clock Domain - gEstateWr: if ESTATE_WR_BITS >= 1 generate - signal d : unsigned(A_BITS-1 downto 0); - begin - d <= gray2bin(OPc(A_BITS-1 downto 0)) + not gray2bin(IP0(A_BITS-1 downto 0)); - estate_wr <= (others => '0') when Ful = '1' else - std_logic_vector(d(d'left downto d'left-ESTATE_WR_BITS+1)); - end generate gEstateWr; - gNoEstateWr: if ESTATE_WR_BITS = 0 generate - estate_wr <= "X"; - end generate gNoEstateWr; - - -- Read Clock Domain - gFstateRd: if FSTATE_RD_BITS >= 1 generate - signal d : unsigned(A_BITS-1 downto 0); - begin - d <= gray2bin(IPc(A_BITS-1 downto 0)) + not gray2bin(OP0(A_BITS-1 downto 0)); - fstate_rd <= (others => '0') when Avl = '0' else - std_logic_vector(d(d'left downto d'left-FSTATE_RD_BITS+1)); - end generate gFstateRd; - gNoFstateRd: if FSTATE_RD_BITS = 0 generate - fstate_rd <= "X"; - end generate gNoFstateRd; - - ----------------------------------------------------------------------------- - -- Memory Instantiation - ----------------------------------------------------------------------------- - gLarge: if not DATA_REG generate - ram : entity work.ocram_sdp - generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS - ) - port map ( - wclk => clk_wr, - rclk => clk_rd, - wce => '1', - rce => geti, - we => puti, - ra => ra, - wa => wa, - d => di, - q => do - ); - end generate gLarge; - - gSmall: if DATA_REG generate - -- Memory modelled as Array - type regfile_t is array(0 to 2**A_BITS-1) of std_logic_vector(D_BITS-1 downto 0); - signal regfile : regfile_t; - attribute ram_style : string; -- XST specific - attribute ram_style of regfile : signal is "distributed"; - - -- Altera Quartus II: Allow automatic RAM type selection. - -- For small RAMs, registers are used on Cyclone devices and the M512 type - -- is used on Stratix devices. Pass-through logic is not required as - -- reads do not occur on write addresses. - -- Warning about undefined read-during-write behaviour can be ignored. - attribute ramstyle : string; - attribute ramstyle of regfile : signal is "no_rw_check"; - begin - - -- Memory State - process(clk_wr) - begin - if rising_edge(clk_wr) then - --synthesis translate_off - if SIMULATION and (rst_wr = '1') then - regfile <= (others => (others => '-')); - else - --synthesis translate_on - if puti = '1' then - regfile(to_integer(wa)) <= di; - end if; - --synthesis translate_off - end if; - --synthesis translate_on - end if; - end process; - - -- Memory Output - process (clk_rd) - begin -- process - if rising_edge(clk_rd) then - if SIMULATION and (rst_rd = '1') then - do <= (others => 'U'); - elsif geti = '1' then - if Is_X(std_logic_vector(ra)) then - do <= (others => 'X'); - else - do <= regfile(to_integer(ra)); - end if; - end if; - end if; - end process; - end generate gSmall; - -end rtl; + ----------------------------------------------------------------------------- + -- Write clock domain + ----------------------------------------------------------------------------- + blkIP: block + signal Cnt : unsigned(AN-1 downto 0) := to_unsigned(1, AN); + begin + process(clk_wr) + begin + if rising_edge(clk_wr) then + if rst_wr = '1' then + Cnt <= to_unsigned(1, AN); + elsif puti = '1' then + Cnt <= Cnt + 1; + end if; + end if; + end process; + IP1 <= std_logic_vector(Cnt(ADDRESS_BITS) & (Cnt(ADDRESS_BITS-1 downto 0) xor ('0' & Cnt(ADDRESS_BITS-1 downto 1)))); + end block blkIP; + + -- Update Write Pointer upon puti + process(clk_wr) + begin + if rising_edge(clk_wr) then + if rst_wr = '1' then + IP0 <= (others => '0'); + Ful <= '0'; + else + if puti = '1' then + IP0 <= IP1; + if IP1(ADDRESS_BITS-1 downto 0) = OPc(ADDRESS_BITS-1 downto 0) then + Ful <= '1'; + else + Ful <= '0'; + end if; + end if; + if Ful = '1' then + if IP0 = (not OPc(ADDRESS_BITS) & OPc(ADDRESS_BITS-1 downto 0)) then + Ful <= '1'; + else + Ful <= '0'; + end if; + end if; + end if; + end if; + end process; + puti <= put and not Ful; + full <= Ful; + + di <= din; + wa <= unsigned(IP0(ADDRESS_BITS-1 downto 0)); + + -- write pointer needs to be delayed by one CC to asure that data + -- is fully stored before giving it free to the other side. + -- Problem when clk_rd > 2* clk_wr + IP0_d <= IP0 when rising_edge(clk_wr); + Read_pointer_sync : entity work.sync_Bits + generic map( + BITS => AN, + REGISTER_OUTPUT => false + ) + port map( + Clock => clk_rd, + Input => IP0_d, + Output => IPc + ); + + ----------------------------------------------------------------------------- + -- Read clock domain + ----------------------------------------------------------------------------- + blkOP: block + signal Cnt : unsigned(AN-1 downto 0) := to_unsigned(1, AN); + begin + process(clk_rd) + begin + if rising_edge(clk_rd) then + if rst_rd = '1' then + Cnt <= to_unsigned(1, AN); + elsif geti = '1' then + Cnt <= Cnt + 1; + end if; + end if; + end process; + OP1 <= std_logic_vector(Cnt(ADDRESS_BITS) & (Cnt(ADDRESS_BITS-1 downto 0) xor ('0' & Cnt(ADDRESS_BITS-1 downto 1)))); + end block blkOP; + + process(clk_rd) + begin + if rising_edge(clk_rd) then + if rst_rd = '1' then + OP0 <= (others => '0'); + Avl <= '0'; + Vld <= '0'; + else + if geti = '1' then + OP0 <= OP1; + if OP1(ADDRESS_BITS-1 downto 0) = IPc(ADDRESS_BITS-1 downto 0) then + Avl <= '0'; + else + Avl <= '1'; + end if; + Vld <= '1'; + elsif goti = '1' then + Vld <= '0'; + end if; + + if Avl = '0' then + if OP0 = IPc then + Avl <= '0'; + else + Avl <= '1'; + end if; + end if; + + end if; + end if; + end process; + geti <= (not Vld or goti) and Avl; + ra <= unsigned(OP0(ADDRESS_BITS-1 downto 0)); + + -- read pointer needs to be delayed by one CC to asure that data + -- is read out before giving it free to the other side + -- Problem when clk_wr > 2* clk_rd + OP0_d <= OP0 when rising_edge(clk_rd); + Write_pointer_sync : entity work.sync_Bits + generic map( + BITS => AN, + REGISTER_OUTPUT => false + ) + port map( + Clock => clk_wr, + Input => OP0_d, + Output => OPc + ); + + ----------------------------------------------------------------------------- + -- Add register to data output + -- + -- Not needed if DATA_REG = true, because "dout" is already feed from a + -- register in that case. + ----------------------------------------------------------------------------- + genRegN: if DATA_REG or not OUTPUT_REG generate + goti <= got; + dout <= do; + valid <= Vld; + end generate genRegN; + genRegY: if (not DATA_REG) and OUTPUT_REG generate + signal Buf : std_logic_vector(DATA_BITS-1 downto 0) := (others => '-'); + signal VldB : std_logic := '0'; + begin + process(clk_rd) + begin + if rising_edge(clk_rd) then + if rst_rd = '1' then + Buf <= (others => '-'); + VldB <= '0'; + elsif goti = '1' then + Buf <= do; + VldB <= Vld; + end if; + end if; + end process; + goti <= not VldB or got; + dout <= Buf; + valid <= VldB; + end generate genRegY; + + ----------------------------------------------------------------------------- + -- Fill State + ----------------------------------------------------------------------------- + -- Write Clock Domain + gEstateWr: if EMPTY_STATE_BITS >= 1 generate + signal d : unsigned(ADDRESS_BITS-1 downto 0); + begin + d <= gray2bin(OPc(ADDRESS_BITS-1 downto 0)) + not gray2bin(IP0(ADDRESS_BITS-1 downto 0)); + estate_wr <= (others => '0') when Ful = '1' else + std_logic_vector(d(d'left downto d'left-EMPTY_STATE_BITS+1)); + end generate gEstateWr; + gNoEstateWr: if EMPTY_STATE_BITS = 0 generate + estate_wr <= "X"; + end generate gNoEstateWr; + + -- Read Clock Domain + gFstateRd: if FILL_STATE_BITS >= 1 generate + signal d : unsigned(ADDRESS_BITS-1 downto 0); + begin + d <= gray2bin(IPc(ADDRESS_BITS-1 downto 0)) + not gray2bin(OP0(ADDRESS_BITS-1 downto 0)); + fstate_rd <= (others => '0') when Avl = '0' else + std_logic_vector(d(d'left downto d'left-FILL_STATE_BITS+1)); + end generate gFstateRd; + gNoFstateRd: if FILL_STATE_BITS = 0 generate + fstate_rd <= "X"; + end generate gNoFstateRd; + + ----------------------------------------------------------------------------- + -- Memory Instantiation + ----------------------------------------------------------------------------- + gLarge: if not DATA_REG generate + ram : entity work.ocram_SimpleDualPort + generic map ( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS + ) + port map ( + Write_Clock => clk_wr, + Read_Clock => clk_rd, + Write_ClockEnable => '1', + Read_ClockEnable => geti, + Write_WriteEnable => puti, + Read_Address => ra, + Write_Address => wa, + Write_DataIn => di, + Read_DataOut => do + ); + end generate gLarge; + + gSmall: if DATA_REG generate + -- Memory modelled as Array + type regfile_t is array(0 to 2**ADDRESS_BITS-1) of std_logic_vector(DATA_BITS-1 downto 0); + signal regfile : regfile_t; + attribute ram_style : string; -- XST specific + attribute ram_style of regfile : signal is "distributed"; + + -- Altera Quartus II: Allow automatic RAM type selection. + -- For small RAMs, registers are used on Cyclone devices and the M512 type + -- is used on Stratix devices. Pass-through logic is not required as + -- reads do not occur on write addresses. + -- Warning about undefined read-during-write behaviour can be ignored. + attribute ramstyle : string; + attribute ramstyle of regfile : signal is "no_rw_check"; + begin + + -- Memory State + process(clk_wr) + begin + if rising_edge(clk_wr) then + --synthesis translate_off + if SIMULATION and (rst_wr = '1') then + regfile <= (others => (others => '-')); + else + --synthesis translate_on + if puti = '1' then + regfile(to_integer(wa)) <= di; + end if; + --synthesis translate_off + end if; + --synthesis translate_on + end if; + end process; + + -- Memory Output + process (clk_rd) + begin -- process + if rising_edge(clk_rd) then + if SIMULATION and (rst_rd = '1') then + do <= (others => 'U'); + elsif geti = '1' then + if Is_X(std_logic_vector(ra)) then + do <= (others => 'X'); + else + do <= regfile(to_integer(ra)); + end if; + end if; + end if; + end process; + end generate gSmall; + +end architecture; diff --git a/src/io/io.pro b/src/io/build.pro similarity index 71% rename from src/io/io.pro rename to src/io/build.pro index 912a18934..9d4b8a62c 100644 --- a/src/io/io.pro +++ b/src/io/build.pro @@ -30,28 +30,10 @@ analyze ./io_7SegmentMux_BCD.vhdl analyze ./io_7SegmentMux_HEX.vhdl analyze ./io_FanControl.vhdl -analyze ./ddrio/ddrio.pkg.vhdl -analyze ./ddrio/ddrio_in.vhdl -analyze ./ddrio/ddrio_inout.vhdl -analyze ./ddrio/ddrio_out.vhdl - -if { $::poc::vendorName eq "Xilinx" } { - analyze ./ddrio/ddrio_in_xilinx.vhdl - analyze ./ddrio/ddrio_inout_xilinx.vhdl - analyze ./ddrio/ddrio_out_xilinx.vhdl - -} elseif { $::poc::vendorName eq "Altera" } { - analyze ./ddrio/ddrio_in_altera.vhdl - analyze ./ddrio/ddrio_inout_altera.vhdl - analyze ./ddrio/ddrio_out_altera.vhdl - -} elseif { $::poc::vendorName ne "GENERIC" } { - puts "Unknown vendor '$::poc::vendorName' in io!" - exit 1 -} +include ./ddrio disabled ./spi/spi.pro -include ./uart/uart.pro +include ./uart disabled ./iic/iic.pro disabled ./fan/fan.pro diff --git a/src/io/ddrio/README.md b/src/io/ddrio/README.md index 9b9c952e8..743465f21 100644 --- a/src/io/ddrio/README.md +++ b/src/io/ddrio/README.md @@ -4,7 +4,7 @@ The namespace `PoC.io.ddrio` offers components for dual-data-rate (DDR) input and output of data. It uses the DDR flip flops in the FPGA I/O buffers, if available. PoC has two platform specific implementations for Altera and Xilinx, which are chosen, if the -appropriate `MY_DEVICE` is configured in [`my_config.vhdl`][my_config]. +appropriate `MY_DEVICE` is configured in [`project_configuration.vhdl`][project_configuration]. ## Package(s) @@ -16,23 +16,23 @@ The package [`PoC.ddrio`][ddrio.pkg] holds all component declarations for this n #### Dual-Data-Rate Input -The module [`ddrio_in`][ddrio_in] captures the input data at the pad +The module [`ddrio_In`][ddrio_In] captures the input data at the pad with both edges of the clock. The data captured with the falling edge is again synchronized to the rising edge, so that both data parts are provided for the internal logic with the rising edge of the clock. It's possible to configure the width of the data bus as well as the initialization state provided for the internal logic. The vendor specific -implementations are named [`ddrio_in_altera`][ddrio_in_altera] and -[`ddrio_in_xilinx`][ddrio_in_xilinx] respectively. +implementations are named [`ddrio_In_Altera`][ddrio_In_Altera] and +[`ddrio_In_Xilinx`][ddrio_In_Xilinx] respectively. -See the ASCII art inside the [VHDL description][ddrio_in] for more +See the ASCII art inside the [VHDL description][ddrio_In] for more details on how data to is sampled at the pad. #### Dual-Data-Rate Output -The module [`ddrio_out`][ddrio_out] brings out the ouput data at the pad +The module [`ddrio_Out`][ddrio_Out] brings out the ouput data at the pad with both edges of the clock. The data is sampled from the internal logic with the rising edge only. @@ -40,37 +40,37 @@ It's possible to configure the width of the data bus as well as the initialization state of the value present at the pad. The output driver can be disabled by a synchronous control signal. This control signal can be removed by a parameter to save some logic. The vendor specific -implementations are named [`ddrio_out_altera`][ddrio_out_altera] and -[`ddrio_out_xilinx`][ddrio_out_xilinx] respectively. +implementations are named [`ddrio_Out_Altera`][ddrio_Out_Altera] and +[`ddrio_Out_Xilinx`][ddrio_Out_Xilinx] respectively. -See the ASCII art inside the [VHDL description][ddrio_out] for more +See the ASCII art inside the [VHDL description][ddrio_Out] for more details on how data to is driven at the pad. #### Dual-Data-Rate Input and Output -The module [`ddrio_inout`][ddrio_inout] is combination of the DDR +The module [`ddrio_InOut`][ddrio_InOut] is combination of the DDR input and DDR output functionality described above. Two different clocks are available for the input side and the output side. It's possible to configure the width of the data bus, but not the initialization state due to a limitation of the Altera specific implementation. The vendor specific implementations are named -[`ddrio_inout_altera`][ddrio_inout_altera] and -[`ddrio_inout_xilinx`][ddrio_inout_xilinx] respectively. +[`ddrio_InOut_Altera`][ddrio_InOut_Altera] and +[`ddrio_InOut_Xilinx`][ddrio_InOut_Xilinx] respectively. -See the ASCII art inside the [VHDL description][ddrio_inout] for more +See the ASCII art inside the [VHDL description][ddrio_InOut] for more details on how data to is sampled and driven at the pad. - [my_config]: ../../common/my_config.vhdl.template + [project_configuration]: ../../common/project_configuration.vhdl.template [ddrio.pkg]: ddrio.pkg.vhdl - [ddrio_in]: ddrio_in.vhdl - [ddrio_in_altera]: ddrio_in_altera.vhdl - [ddrio_in_xilinx]: ddrio_in_xilinx.vhdl - [ddrio_inout]: ddrio_inout.vhdl - [ddrio_inout_altera]: ddrio_inout_altera.vhdl - [ddrio_inout_xilinx]: ddrio_inout_xilinx.vhdl - [ddrio_out]: ddrio_out.vhdl - [ddrio_out_altera]: ddrio_out_altera.vhdl - [ddrio_out_xilinx]: ddrio_out_xilinx.vhdl + [ddrio_In]: ddrio_In.vhdl + [ddrio_In_Altera]: ddrio_In_Altera.vhdl + [ddrio_In_Xilinx]: ddrio_In_Xilinx.vhdl + [ddrio_InOut]: ddrio_InOut.vhdl + [ddrio_InOut_Altera]: ddrio_InOut_Altera.vhdl + [ddrio_InOut_Xilinx]: ddrio_InOut_Xilinx.vhdl + [ddrio_Out]: ddrio_Out.vhdl + [ddrio_Out_Altera]: ddrio_Out_Altera.vhdl + [ddrio_Out_Xilinx]: ddrio_Out_Xilinx.vhdl diff --git a/src/io/ddrio/build.pro b/src/io/ddrio/build.pro new file mode 100644 index 000000000..38b23b6a9 --- /dev/null +++ b/src/io/ddrio/build.pro @@ -0,0 +1,39 @@ +# ============================================================================= +# Authors: Stefan Unrein +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +analyze ./ddrio.pkg.vhdl +analyze ./ddrio_In.vhdl +analyze ./ddrio_InOut.vhdl +analyze ./ddrio_Out.vhdl + +if { $::poc::vendorName eq "Xilinx" } { + analyze ./ddrio_In_Xilinx.vhdl + analyze ./ddrio_InOut_Xilinx.vhdl + analyze ./ddrio_Out_Xilinx.vhdl + +} elseif { $::poc::vendorName eq "Altera" } { + analyze ./ddrio_In_Altera.vhdl + analyze ./ddrio_InOut_Altera.vhdl + analyze ./ddrio_Out_Altera.vhdl + +} elseif { $::poc::vendorName ne "GENERIC" } { + puts "Unknown vendor '$::poc::vendorName' in io!" + exit 1 +} diff --git a/src/io/ddrio/ddrio.pkg.vhdl b/src/io/ddrio/ddrio.pkg.vhdl index 3bb108d37..bfe678f89 100644 --- a/src/io/ddrio/ddrio.pkg.vhdl +++ b/src/io/ddrio/ddrio.pkg.vhdl @@ -1,24 +1,24 @@ -- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann +-- Authors: Martin Zabel +-- Patrick Lehmann -- --- Package: VHDL package for component declarations, types and --- functions associated to the PoC.io.ddrio namespace +-- Package: VHDL package for component declarations, types and +-- functions associated to the PoC.io.ddrio namespace -- -- Description: -- ------------------------------------- --- For detailed documentation see below. +-- For detailed documentation see below. -- -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -27,145 +27,145 @@ -- limitations under the License. -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; package ddrio is - component ddrio_in is + component ddrio_In is generic ( - BITS : positive; - INIT_VALUE : bit_vector := x"FFFFFFFF" + BITS : positive; + INIT_VALUE : bit_vector := x"FFFFFFFF" ); port ( - Clock : in std_logic; - ClockEnable : in std_logic; - DataIn_high : out std_logic_vector(BITS - 1 downto 0); - DataIn_low : out std_logic_vector(BITS - 1 downto 0); - Pad : in std_logic_vector(BITS - 1 downto 0)); + Clock : in std_logic; + ClockEnable : in std_logic; + DataIn_high : out std_logic_vector(BITS - 1 downto 0); + DataIn_low : out std_logic_vector(BITS - 1 downto 0); + Pad : in std_logic_vector(BITS - 1 downto 0)); end component; - component ddrio_inout is + component ddrio_InOut is generic ( - BITS : positive); + BITS : positive); port ( - ClockOut : in std_logic; - ClockOutEnable : in std_logic; - OutputEnable : in std_logic; - DataOut_high : in std_logic_vector(BITS - 1 downto 0); - DataOut_low : in std_logic_vector(BITS - 1 downto 0); - ClockIn : in std_logic; - ClockInEnable : in std_logic; - DataIn_high : out std_logic_vector(BITS - 1 downto 0); - DataIn_low : out std_logic_vector(BITS - 1 downto 0); - Pad : inout std_logic_vector(BITS - 1 downto 0)); + ClockOut : in std_logic; + ClockOutEnable : in std_logic; + OutputEnable : in std_logic; + DataOut_high : in std_logic_vector(BITS - 1 downto 0); + DataOut_low : in std_logic_vector(BITS - 1 downto 0); + ClockIn : in std_logic; + ClockInEnable : in std_logic; + DataIn_high : out std_logic_vector(BITS - 1 downto 0); + DataIn_low : out std_logic_vector(BITS - 1 downto 0); + Pad : inout std_logic_vector(BITS - 1 downto 0)); end component; - component ddrio_out is + component ddrio_Out is generic ( - NO_OUTPUT_ENABLE : boolean := false; - BITS : positive; - INIT_VALUE : bit_vector := x"FFFFFFFF" + NO_OUTPUT_ENABLE : boolean := false; + BITS : positive; + INIT_VALUE : bit_vector := x"FFFFFFFF" ); port ( - Clock : in std_logic; - ClockEnable : in std_logic; - OutputEnable : in std_logic; - DataOut_high : in std_logic_vector(BITS - 1 downto 0); - DataOut_low : in std_logic_vector(BITS - 1 downto 0); - Pad : out std_logic_vector(BITS - 1 downto 0) + Clock : in std_logic; + ClockEnable : in std_logic; + OutputEnable : in std_logic; + DataOut_high : in std_logic_vector(BITS - 1 downto 0); + DataOut_low : in std_logic_vector(BITS - 1 downto 0); + Pad : out std_logic_vector(BITS - 1 downto 0) ); end component; -- Vendor specific modules ---------------------------------------------- - component ddrio_in_altera is + component ddrio_In_Altera is generic ( - BITS : positive; - INIT_VALUE : bit_vector := x"FFFFFFFF" + BITS : positive; + INIT_VALUE : bit_vector := x"FFFFFFFF" ); port ( - Clock : in std_logic; - ClockEnable : in std_logic; - DataIn_high : out std_logic_vector(BITS - 1 downto 0); - DataIn_low : out std_logic_vector(BITS - 1 downto 0); - Pad : in std_logic_vector(BITS - 1 downto 0)); + Clock : in std_logic; + ClockEnable : in std_logic; + DataIn_high : out std_logic_vector(BITS - 1 downto 0); + DataIn_low : out std_logic_vector(BITS - 1 downto 0); + Pad : in std_logic_vector(BITS - 1 downto 0)); end component; - component ddrio_in_xilinx is + component ddrio_In_Xilinx is generic ( - BITS : positive; - INIT_VALUE : bit_vector := x"FFFFFFFF" + BITS : positive; + INIT_VALUE : bit_vector := x"FFFFFFFF" ); port ( - Clock : in std_logic; - ClockEnable : in std_logic; - DataIn_high : out std_logic_vector(BITS - 1 downto 0); - DataIn_low : out std_logic_vector(BITS - 1 downto 0); - Pad : in std_logic_vector(BITS - 1 downto 0)); + Clock : in std_logic; + ClockEnable : in std_logic; + DataIn_high : out std_logic_vector(BITS - 1 downto 0); + DataIn_low : out std_logic_vector(BITS - 1 downto 0); + Pad : in std_logic_vector(BITS - 1 downto 0)); end component; - component ddrio_inout_altera is + component ddrio_InOut_Altera is generic ( - BITS : positive); + BITS : positive); port ( - ClockOut : in std_logic; - ClockOutEnable : in std_logic; - OutputEnable : in std_logic; - DataOut_high : in std_logic_vector(BITS - 1 downto 0); - DataOut_low : in std_logic_vector(BITS - 1 downto 0); - ClockIn : in std_logic; - ClockInEnable : in std_logic; - DataIn_high : out std_logic_vector(BITS - 1 downto 0); - DataIn_low : out std_logic_vector(BITS - 1 downto 0); - Pad : inout std_logic_vector(BITS - 1 downto 0)); + ClockOut : in std_logic; + ClockOutEnable : in std_logic; + OutputEnable : in std_logic; + DataOut_high : in std_logic_vector(BITS - 1 downto 0); + DataOut_low : in std_logic_vector(BITS - 1 downto 0); + ClockIn : in std_logic; + ClockInEnable : in std_logic; + DataIn_high : out std_logic_vector(BITS - 1 downto 0); + DataIn_low : out std_logic_vector(BITS - 1 downto 0); + Pad : inout std_logic_vector(BITS - 1 downto 0)); end component; - component ddrio_inout_xilinx is + component ddrio_InOut_Xilinx is generic ( - BITS : positive); + BITS : positive); port ( - ClockOut : in std_logic; - ClockOutEnable : in std_logic; - OutputEnable : in std_logic; - DataOut_high : in std_logic_vector(BITS - 1 downto 0); - DataOut_low : in std_logic_vector(BITS - 1 downto 0); - ClockIn : in std_logic; - ClockInEnable : in std_logic; - DataIn_high : out std_logic_vector(BITS - 1 downto 0); - DataIn_low : out std_logic_vector(BITS - 1 downto 0); - Pad : inout std_logic_vector(BITS - 1 downto 0)); + ClockOut : in std_logic; + ClockOutEnable : in std_logic; + OutputEnable : in std_logic; + DataOut_high : in std_logic_vector(BITS - 1 downto 0); + DataOut_low : in std_logic_vector(BITS - 1 downto 0); + ClockIn : in std_logic; + ClockInEnable : in std_logic; + DataIn_high : out std_logic_vector(BITS - 1 downto 0); + DataIn_low : out std_logic_vector(BITS - 1 downto 0); + Pad : inout std_logic_vector(BITS - 1 downto 0)); end component; - component ddrio_out_altera is + component ddrio_Out_Altera is generic ( - NO_OUTPUT_ENABLE : boolean := false; - BITS : positive; - INIT_VALUE : bit_vector := x"FFFFFFFF" + NO_OUTPUT_ENABLE : boolean := false; + BITS : positive; + INIT_VALUE : bit_vector := x"FFFFFFFF" ); port ( - Clock : in std_logic; - ClockEnable : in std_logic; - OutputEnable : in std_logic; - DataOut_high : in std_logic_vector(BITS - 1 downto 0); - DataOut_low : in std_logic_vector(BITS - 1 downto 0); - Pad : out std_logic_vector(BITS - 1 downto 0) + Clock : in std_logic; + ClockEnable : in std_logic; + OutputEnable : in std_logic; + DataOut_high : in std_logic_vector(BITS - 1 downto 0); + DataOut_low : in std_logic_vector(BITS - 1 downto 0); + Pad : out std_logic_vector(BITS - 1 downto 0) ); end component; - component ddrio_out_xilinx is + component ddrio_Out_Xilinx is generic ( - NO_OUTPUT_ENABLE : boolean := false; - BITS : positive; - INIT_VALUE : bit_vector := x"FFFFFFFF" + NO_OUTPUT_ENABLE : boolean := false; + BITS : positive; + INIT_VALUE : bit_vector := x"FFFFFFFF" ); port ( - Clock : in std_logic; - ClockEnable : in std_logic; - OutputEnable : in std_logic; - DataOut_high : in std_logic_vector(BITS - 1 downto 0); - DataOut_low : in std_logic_vector(BITS - 1 downto 0); - Pad : out std_logic_vector(BITS - 1 downto 0) + Clock : in std_logic; + ClockEnable : in std_logic; + OutputEnable : in std_logic; + DataOut_high : in std_logic_vector(BITS - 1 downto 0); + DataOut_low : in std_logic_vector(BITS - 1 downto 0); + Pad : out std_logic_vector(BITS - 1 downto 0) ); end component; diff --git a/src/io/ddrio/ddrio_in.vhdl b/src/io/ddrio/ddrio_In.vhdl similarity index 64% rename from src/io/ddrio/ddrio_in.vhdl rename to src/io/ddrio/ddrio_In.vhdl index dd7b44e27..34881369c 100644 --- a/src/io/ddrio/ddrio_in.vhdl +++ b/src/io/ddrio/ddrio_In.vhdl @@ -1,8 +1,8 @@ -- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann +-- Authors: Martin Zabel +-- Patrick Lehmann -- --- Entity: Chip-Specific DDR Input Registers +-- Entity: Chip-Specific DDR Input Registers -- -- Description: -- ------------------------------------- @@ -43,13 +43,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -59,7 +59,7 @@ -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use work.config.all; @@ -67,22 +67,22 @@ use work.utils.all; use work.ddrio.all; -entity ddrio_in is +entity ddrio_In is generic ( - BITS : positive; - INIT_VALUE : bit_vector := x"FFFFFFFF" + BITS : positive; + INIT_VALUE : bit_vector := x"FFFFFFFF" ); port ( - Clock : in std_logic; - ClockEnable : in std_logic; - DataIn_high : out std_logic_vector(BITS - 1 downto 0); - DataIn_low : out std_logic_vector(BITS - 1 downto 0); - Pad : in std_logic_vector(BITS - 1 downto 0) - ); + Clock : in std_logic; + ClockEnable : in std_logic; + DataIn_high : out std_logic_vector(BITS - 1 downto 0); + DataIn_low : out std_logic_vector(BITS - 1 downto 0); + Pad : in std_logic_vector(BITS - 1 downto 0) + ); end entity; -architecture rtl of ddrio_in is +architecture rtl of ddrio_In is begin assert ((VENDOR = VENDOR_ALTERA) or ((SIMULATION = TRUE) and (VENDOR = VENDOR_GENERIC)) or (VENDOR = VENDOR_XILINX)) @@ -90,45 +90,45 @@ begin severity FAILURE; genXilinx : if VENDOR = VENDOR_XILINX generate - i : ddrio_in_xilinx + i : ddrio_In_Xilinx generic map ( - BITS => BITS, - INIT_VALUE => INIT_VALUE + BITS => BITS, + INIT_VALUE => INIT_VALUE ) port map ( - Clock => Clock, - ClockEnable => ClockEnable, - DataIn_high => DataIn_high, - DataIn_low => DataIn_low, - Pad => Pad + Clock => Clock, + ClockEnable => ClockEnable, + DataIn_high => DataIn_high, + DataIn_low => DataIn_low, + Pad => Pad ); end generate; genAltera : if VENDOR = VENDOR_ALTERA generate - i : ddrio_in_altera + i : ddrio_In_Altera generic map ( - BITS => BITS, - INIT_VALUE => INIT_VALUE + BITS => BITS, + INIT_VALUE => INIT_VALUE ) port map ( - Clock => Clock, - ClockEnable => ClockEnable, - DataIn_high => DataIn_high, - DataIn_low => DataIn_low, - Pad => Pad + Clock => Clock, + ClockEnable => ClockEnable, + DataIn_high => DataIn_high, + DataIn_low => DataIn_low, + Pad => Pad ); end generate; genGeneric : if SIMULATION and (VENDOR = VENDOR_GENERIC) generate - signal Pad_d_fe : std_logic_vector(BITS - 1 downto 0) := to_stdlogicvector(INIT_VALUE); - signal DataIn_high_d : std_logic_vector(BITS - 1 downto 0) := to_stdlogicvector(INIT_VALUE); - signal DataIn_low_d : std_logic_vector(BITS - 1 downto 0) := to_stdlogicvector(INIT_VALUE); + signal Pad_d_fe : std_logic_vector(BITS - 1 downto 0) := to_stdlogicvector(INIT_VALUE); + signal DataIn_high_d : std_logic_vector(BITS - 1 downto 0) := to_stdlogicvector(INIT_VALUE); + signal DataIn_low_d : std_logic_vector(BITS - 1 downto 0) := to_stdlogicvector(INIT_VALUE); begin - Pad_d_fe <= Pad when falling_edge(Clock) and (ClockEnable = '1'); - DataIn_high_d <= Pad when rising_edge(Clock) and (ClockEnable = '1'); - DataIn_low_d <= Pad_d_fe when rising_edge(Clock) and (ClockEnable = '1'); + Pad_d_fe <= Pad when falling_edge(Clock) and (ClockEnable = '1'); + DataIn_high_d <= Pad when rising_edge(Clock) and (ClockEnable = '1'); + DataIn_low_d <= Pad_d_fe when rising_edge(Clock) and (ClockEnable = '1'); - DataIn_high <= DataIn_high_d; - DataIn_low <= DataIn_low_d; + DataIn_high <= DataIn_high_d; + DataIn_low <= DataIn_low_d; end generate; end architecture; diff --git a/src/io/ddrio/ddrio_inout.vhdl b/src/io/ddrio/ddrio_InOut.vhdl similarity index 59% rename from src/io/ddrio/ddrio_inout.vhdl rename to src/io/ddrio/ddrio_InOut.vhdl index 5f1977376..8de4ab797 100644 --- a/src/io/ddrio/ddrio_inout.vhdl +++ b/src/io/ddrio/ddrio_InOut.vhdl @@ -1,8 +1,8 @@ -- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann +-- Authors: Martin Zabel +-- Patrick Lehmann -- --- Entity: Chip-Specific DDR Input and Output Registers +-- Entity: Chip-Specific DDR Input and Output Registers -- -- Description: -- ------------------------------------- @@ -58,13 +58,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -74,7 +74,7 @@ -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use work.utils.all; @@ -82,28 +82,28 @@ use work.config.all; use work.ddrio.all; -entity ddrio_inout is +entity ddrio_InOut is generic ( - BITS : positive + BITS : positive ); port ( - ClockOut : in std_logic; - ClockOutEnable : in std_logic; - OutputEnable : in std_logic; - DataOut_high : in std_logic_vector(BITS - 1 downto 0); - DataOut_low : in std_logic_vector(BITS - 1 downto 0); - - ClockIn : in std_logic; - ClockInEnable : in std_logic; - DataIn_high : out std_logic_vector(BITS - 1 downto 0); - DataIn_low : out std_logic_vector(BITS - 1 downto 0); - - Pad : inout std_logic_vector(BITS - 1 downto 0) + ClockOut : in std_logic; + ClockOutEnable : in std_logic; + OutputEnable : in std_logic; + DataOut_high : in std_logic_vector(BITS - 1 downto 0); + DataOut_low : in std_logic_vector(BITS - 1 downto 0); + + ClockIn : in std_logic; + ClockInEnable : in std_logic; + DataIn_high : out std_logic_vector(BITS - 1 downto 0); + DataIn_low : out std_logic_vector(BITS - 1 downto 0); + + Pad : inout std_logic_vector(BITS - 1 downto 0) ); end entity; -architecture rtl of ddrio_inout is +architecture rtl of ddrio_InOut is begin assert ((VENDOR = VENDOR_ALTERA) or ((SIMULATION = TRUE) and (VENDOR = VENDOR_GENERIC)) or (VENDOR = VENDOR_XILINX)) @@ -111,78 +111,78 @@ begin severity FAILURE; genXilinx : if VENDOR = VENDOR_XILINX generate - inst : ddrio_inout_xilinx + inst : ddrio_InOut_Xilinx generic map ( - BITS => BITS + BITS => BITS ) port map ( - ClockOut => ClockOut, - ClockOutEnable => ClockOutEnable, - OutputEnable => OutputEnable, - DataOut_high => DataOut_high, - DataOut_low => DataOut_low, - ClockIn => ClockIn, - ClockInEnable => ClockInEnable, - DataIn_high => DataIn_high, - DataIn_low => DataIn_low, - Pad => Pad + ClockOut => ClockOut, + ClockOutEnable => ClockOutEnable, + OutputEnable => OutputEnable, + DataOut_high => DataOut_high, + DataOut_low => DataOut_low, + ClockIn => ClockIn, + ClockInEnable => ClockInEnable, + DataIn_high => DataIn_high, + DataIn_low => DataIn_low, + Pad => Pad ); end generate; genAltera : if VENDOR = VENDOR_ALTERA generate - inst : ddrio_inout_altera + inst : ddrio_InOut_Altera generic map ( - BITS => BITS + BITS => BITS ) port map ( - ClockOut => ClockOut, - ClockOutEnable => ClockOutEnable, - OutputEnable => OutputEnable, - DataOut_high => DataOut_high, - DataOut_low => DataOut_low, - ClockIn => ClockIn, - ClockInEnable => ClockInEnable, - DataIn_high => DataIn_high, - DataIn_low => DataIn_low, - Pad => Pad + ClockOut => ClockOut, + ClockOutEnable => ClockOutEnable, + OutputEnable => OutputEnable, + DataOut_high => DataOut_high, + DataOut_low => DataOut_low, + ClockIn => ClockIn, + ClockInEnable => ClockInEnable, + DataIn_high => DataIn_high, + DataIn_low => DataIn_low, + Pad => Pad ); end generate; genGeneric : if SIMULATION and (VENDOR = VENDOR_GENERIC) generate - signal DataOut_high_d : std_logic_vector(BITS - 1 downto 0); - signal DataOut_low_d : std_logic_vector(BITS - 1 downto 0); - signal OutputEnable_d : std_logic; - signal Pad_o : std_logic_vector(BITS - 1 downto 0); - - signal Pad_d_fe : std_logic_vector(BITS - 1 downto 0); - signal DataIn_high_d : std_logic_vector(BITS - 1 downto 0); - signal DataIn_low_d : std_logic_vector(BITS - 1 downto 0); + signal DataOut_high_d : std_logic_vector(BITS - 1 downto 0); + signal DataOut_low_d : std_logic_vector(BITS - 1 downto 0); + signal OutputEnable_d : std_logic; + signal Pad_o : std_logic_vector(BITS - 1 downto 0); + + signal Pad_d_fe : std_logic_vector(BITS - 1 downto 0); + signal DataIn_high_d : std_logic_vector(BITS - 1 downto 0); + signal DataIn_low_d : std_logic_vector(BITS - 1 downto 0); begin - DataOut_high_d <= DataOut_high when rising_edge(ClockOut) and (ClockOutEnable = '1'); - DataOut_low_d <= DataOut_low when rising_edge(ClockOut) and (ClockOutEnable = '1'); - OutputEnable_d <= OutputEnable when rising_edge(ClockOut) and (ClockOutEnable = '1'); + DataOut_high_d <= DataOut_high when rising_edge(ClockOut) and (ClockOutEnable = '1'); + DataOut_low_d <= DataOut_low when rising_edge(ClockOut) and (ClockOutEnable = '1'); + OutputEnable_d <= OutputEnable when rising_edge(ClockOut) and (ClockOutEnable = '1'); process(ClockOut, OutputEnable_d, DataOut_high_d, DataOut_low_d) type T_MUX is array(bit) of std_logic_vector(BITS - 1 downto 0); - variable MuxInput : T_MUX; + variable MuxInput : T_MUX; begin - MuxInput('1') := DataOut_high_d; - MuxInput('0') := DataOut_low_d; + MuxInput('1') := DataOut_high_d; + MuxInput('0') := DataOut_low_d; if (OutputEnable_d = '1') then - Pad_o <= MuxInput(to_bit(ClockOut)); + Pad_o <= MuxInput(to_bit(ClockOut)); else - Pad_o <= (others => 'Z'); + Pad_o <= (others => 'Z'); end if; end process; - Pad <= Pad_o; + Pad <= Pad_o; - Pad_d_fe <= Pad when falling_edge(ClockIn) and (ClockInEnable = '1'); - DataIn_high_d <= Pad when rising_edge(ClockIn) and (ClockInEnable = '1'); - DataIn_low_d <= Pad_d_fe when rising_edge(ClockIn) and (ClockInEnable = '1'); + Pad_d_fe <= Pad when falling_edge(ClockIn) and (ClockInEnable = '1'); + DataIn_high_d <= Pad when rising_edge(ClockIn) and (ClockInEnable = '1'); + DataIn_low_d <= Pad_d_fe when rising_edge(ClockIn) and (ClockInEnable = '1'); - DataIn_high <= DataIn_high_d; - DataIn_low <= DataIn_low_d; + DataIn_high <= DataIn_high_d; + DataIn_low <= DataIn_low_d; end generate; end architecture; diff --git a/src/io/ddrio/ddrio_InOut_Altera.vhdl b/src/io/ddrio/ddrio_InOut_Altera.vhdl new file mode 100644 index 000000000..d198d5e54 --- /dev/null +++ b/src/io/ddrio/ddrio_InOut_Altera.vhdl @@ -0,0 +1,82 @@ +-- ============================================================================= +-- Authors: Martin Zabel +-- Patrick Lehmann +-- +-- Entity: Instantiates Chip-Specific DDR Input/Output Registers for Xilinx FPGAs. +-- +-- Description: +-- ------------------------------------- +-- See PoC.io.ddrio.inout for interface description. +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2015 Technische Universitaet Dresden - Germany, +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + + +library IEEE; +use IEEE.std_logic_1164.all; + +library Altera_mf; +use Altera_mf.Altera_MF_Components.all; + + +entity ddrio_InOut_Altera is + generic ( + BITS : positive + ); + port ( + ClockOut : in std_logic; + ClockOutEnable : in std_logic; + OutputEnable : in std_logic; + DataOut_high : in std_logic_vector(BITS - 1 downto 0); + DataOut_low : in std_logic_vector(BITS - 1 downto 0); + + ClockIn : in std_logic; + ClockInEnable : in std_logic; + DataIn_high : out std_logic_vector(BITS - 1 downto 0); + DataIn_low : out std_logic_vector(BITS - 1 downto 0); + + Pad : inout std_logic_vector(BITS - 1 downto 0) + ); +end entity; + + +architecture rtl of ddrio_InOut_Altera is + +begin + -- Generic POWER_UP_HIGH must be left "OFF" to disable output after power-up. + -- In consequence data input register power-up low. + ioff : altddio_bidir + generic map ( + OE_REG => "REGISTERED", + WIDTH => BITS + ) + port map ( + outclock => ClockOut, + outclocken => ClockOutEnable, + oe => OutputEnable, + datain_h => DataOut_high, + datain_l => DataOut_low, + + inclock => ClockIn, + inclocken => ClockInEnable, + dataout_h => DataIn_high, + dataout_l => DataIn_low, + + padio => Pad + ); +end architecture; diff --git a/src/io/ddrio/ddrio_inout_xilinx.vhdl b/src/io/ddrio/ddrio_InOut_Xilinx.vhdl similarity index 50% rename from src/io/ddrio/ddrio_inout_xilinx.vhdl rename to src/io/ddrio/ddrio_InOut_Xilinx.vhdl index e77964477..ab9e18e62 100644 --- a/src/io/ddrio/ddrio_inout_xilinx.vhdl +++ b/src/io/ddrio/ddrio_InOut_Xilinx.vhdl @@ -1,23 +1,23 @@ -- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann +-- Authors: Martin Zabel +-- Patrick Lehmann -- --- Entity: Instantiates Chip-Specific DDR Input/Output Registers for Xilinx FPGAs. +-- Entity: Instantiates Chip-Specific DDR Input/Output Registers for Xilinx FPGAs. -- -- Description: -- ------------------------------------- --- See PoC.io.ddrio.inout for interface description. +-- See PoC.io.ddrio.inout for interface description. -- -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,88 +30,88 @@ library IEEE; use IEEE.std_logic_1164.all; -library UniSim; +library UniSim; use UniSim.vComponents.all; -entity ddrio_inout_xilinx is +entity ddrio_InOut_Xilinx is generic ( - BITS : positive + BITS : positive ); port ( - ClockOut : in std_logic; - ClockOutEnable : in std_logic; - OutputEnable : in std_logic; - DataOut_high : in std_logic_vector(BITS - 1 downto 0); - DataOut_low : in std_logic_vector(BITS - 1 downto 0); + ClockOut : in std_logic; + ClockOutEnable : in std_logic; + OutputEnable : in std_logic; + DataOut_high : in std_logic_vector(BITS - 1 downto 0); + DataOut_low : in std_logic_vector(BITS - 1 downto 0); - ClockIn : in std_logic; - ClockInEnable : in std_logic; - DataIn_high : out std_logic_vector(BITS - 1 downto 0); - DataIn_low : out std_logic_vector(BITS - 1 downto 0); + ClockIn : in std_logic; + ClockInEnable : in std_logic; + DataIn_high : out std_logic_vector(BITS - 1 downto 0); + DataIn_low : out std_logic_vector(BITS - 1 downto 0); - Pad : inout std_logic_vector(BITS - 1 downto 0) + Pad : inout std_logic_vector(BITS - 1 downto 0) ); end entity; -architecture rtl of ddrio_inout_xilinx is +architecture rtl of ddrio_InOut_Xilinx is begin -- INIT_VALUE is not supported because it is not available in the Altera -- specific implementation. gen : for i in 0 to BITS - 1 generate - signal o : std_logic; + signal o : std_logic; signal oe_n : std_logic; signal t : std_logic; signal inp : std_logic; begin off : ODDR generic map( - DDR_CLK_EDGE => "SAME_EDGE", - SRTYPE => "SYNC" + DDR_CLK_EDGE => "SAME_EDGE", + SRTYPE => "SYNC" ) port map ( - Q => o, - C => ClockOut, - CE => ClockOutEnable, - D1 => DataOut_high(i), - D2 => DataOut_low(i), - R => '0', - S => '0' + Q => o, + C => ClockOut, + CE => ClockOutEnable, + D1 => DataOut_high(i), + D2 => DataOut_low(i), + R => '0', + S => '0' ); iff : IDDR generic map( - DDR_CLK_EDGE => "SAME_EDGE", - SRTYPE => "SYNC" + DDR_CLK_EDGE => "SAME_EDGE", + SRTYPE => "SYNC" ) port map ( - C => ClockIn, - CE => ClockInEnable, - D => inp, - Q1 => DataIn_high(i), - Q2 => DataIn_low(i), - R => '0', - S => '0' + C => ClockIn, + CE => ClockInEnable, + D => inp, + Q1 => DataIn_high(i), + Q2 => DataIn_low(i), + R => '0', + S => '0' ); oe_n <= not OutputEnable; tff : ODDR generic map( - DDR_CLK_EDGE => "SAME_EDGE", - INIT => '1', -- output disabled after power-up - SRTYPE => "SYNC" + DDR_CLK_EDGE => "SAME_EDGE", + INIT => '1', -- output disabled after power-up + SRTYPE => "SYNC" ) port map ( - Q => t, - C => ClockOut, - CE => ClockOutEnable, - D1 => oe_n, - D2 => oe_n, - R => '0', - S => '0' + Q => t, + C => ClockOut, + CE => ClockOutEnable, + D1 => oe_n, + D2 => oe_n, + R => '0', + S => '0' ); -- Explicit instantiation of tri-statable I/O buffers. Required if entity diff --git a/src/io/ddrio/ddrio_in_altera.vhdl b/src/io/ddrio/ddrio_In_Altera.vhdl similarity index 59% rename from src/io/ddrio/ddrio_in_altera.vhdl rename to src/io/ddrio/ddrio_In_Altera.vhdl index c61500f0d..23f3a8560 100644 --- a/src/io/ddrio/ddrio_in_altera.vhdl +++ b/src/io/ddrio/ddrio_In_Altera.vhdl @@ -1,23 +1,23 @@ -- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann +-- Authors: Martin Zabel +-- Patrick Lehmann -- --- Entity: Instantiates Chip-Specific DDR Input Registers for Altera FPGAs. +-- Entity: Instantiates Chip-Specific DDR Input Registers for Altera FPGAs. -- -- Description: -- ------------------------------------- --- See PoC.io.ddrio.in for interface description. +-- See PoC.io.ddrio.in for interface description. -- -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,27 +29,27 @@ library IEEE; use IEEE.std_logic_1164.all; -library Altera_mf; +library Altera_mf; use Altera_mf.Altera_MF_Components.all; -use work.utils.all; +use work.utils.all; -entity ddrio_in_altera is +entity ddrio_In_Altera is generic ( - BITS : positive; - INIT_VALUE : bit_vector := x"FFFFFFFF" + BITS : positive; + INIT_VALUE : bit_vector := x"FFFFFFFF" ); port ( - Clock : in std_logic; - ClockEnable : in std_logic; - DataIn_high : out std_logic_vector(BITS - 1 downto 0); - DataIn_low : out std_logic_vector(BITS - 1 downto 0); - Pad : in std_logic_vector(BITS - 1 downto 0) + Clock : in std_logic; + ClockEnable : in std_logic; + DataIn_high : out std_logic_vector(BITS - 1 downto 0); + DataIn_low : out std_logic_vector(BITS - 1 downto 0); + Pad : in std_logic_vector(BITS - 1 downto 0) ); end entity; -architecture rtl of ddrio_in_altera is +architecture rtl of ddrio_In_Altera is begin -- One instantiation for each output pin is required to support different @@ -58,15 +58,15 @@ begin gen : for i in 0 to BITS - 1 generate iff : altddio_in generic map ( - WIDTH => 1, + WIDTH => 1, POWER_UP_HIGH => ite(INIT_VALUE(i) = '1', "ON", "OFF") ) port map ( - inclock => Clock, - inclocken => ClockEnable, - dataout_h(0) => DataIn_high(i), - dataout_l(0) => DataIn_low(i), - datain(0) => Pad(i) + inclock => Clock, + inclocken => ClockEnable, + dataout_h(0) => DataIn_high(i), + dataout_l(0) => DataIn_low(i), + datain(0) => Pad(i) ); end generate; end architecture; diff --git a/src/io/ddrio/ddrio_in_xilinx.vhdl b/src/io/ddrio/ddrio_In_Xilinx.vhdl similarity index 53% rename from src/io/ddrio/ddrio_in_xilinx.vhdl rename to src/io/ddrio/ddrio_In_Xilinx.vhdl index c2910f5da..a369448f9 100644 --- a/src/io/ddrio/ddrio_in_xilinx.vhdl +++ b/src/io/ddrio/ddrio_In_Xilinx.vhdl @@ -1,23 +1,23 @@ -- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann +-- Authors: Martin Zabel +-- Patrick Lehmann -- --- Entity: Instantiates Chip-Specific DDR Input Registers for Xilinx FPGAs. +-- Entity: Instantiates Chip-Specific DDR Input Registers for Xilinx FPGAs. -- -- Description: -- ------------------------------------- --- See PoC.io.ddrio.in for interface description. +-- See PoC.io.ddrio.in for interface description. -- -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,44 +29,44 @@ library IEEE; use IEEE.std_logic_1164.all; -library UniSim; +library UniSim; use UniSim.vComponents.all; -entity ddrio_in_xilinx is +entity ddrio_In_Xilinx is generic ( - BITS : positive; - INIT_VALUE : bit_vector := x"FFFFFFFF" + BITS : positive; + INIT_VALUE : bit_vector := x"FFFFFFFF" ); port ( - Clock : in std_logic; - ClockEnable : in std_logic; - DataIn_high : out std_logic_vector(BITS - 1 downto 0); - DataIn_low : out std_logic_vector(BITS - 1 downto 0); - Pad : in std_logic_vector(BITS - 1 downto 0) + Clock : in std_logic; + ClockEnable : in std_logic; + DataIn_high : out std_logic_vector(BITS - 1 downto 0); + DataIn_low : out std_logic_vector(BITS - 1 downto 0); + Pad : in std_logic_vector(BITS - 1 downto 0) ); end entity; -architecture rtl of ddrio_in_xilinx is +architecture rtl of ddrio_In_Xilinx is begin gen : for i in 0 to BITS - 1 generate iff : IDDR generic map( - DDR_CLK_EDGE => "SAME_EDGE", - INIT_Q1 => INIT_VALUE(i), - INIT_Q2 => INIT_VALUE(i), - SRTYPE => "SYNC" + DDR_CLK_EDGE => "SAME_EDGE", + INIT_Q1 => INIT_VALUE(i), + INIT_Q2 => INIT_VALUE(i), + SRTYPE => "SYNC" ) port map ( - C => Clock, - CE => ClockEnable, - D => Pad(i), - Q1 => DataIn_high(i), - Q2 => DataIn_low(i), - R => '0', - S => '0' + C => Clock, + CE => ClockEnable, + D => Pad(i), + Q1 => DataIn_high(i), + Q2 => DataIn_low(i), + R => '0', + S => '0' ); end generate; end architecture; diff --git a/src/io/ddrio/ddrio_out.vhdl b/src/io/ddrio/ddrio_Out.vhdl similarity index 61% rename from src/io/ddrio/ddrio_out.vhdl rename to src/io/ddrio/ddrio_Out.vhdl index 940f34732..ce726e3fa 100644 --- a/src/io/ddrio/ddrio_out.vhdl +++ b/src/io/ddrio/ddrio_Out.vhdl @@ -1,8 +1,8 @@ -- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann +-- Authors: Martin Zabel +-- Patrick Lehmann -- --- Entity: Chip-Specific DDR Output Registers +-- Entity: Chip-Specific DDR Output Registers -- -- Description: -- ------------------------------------- @@ -48,13 +48,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -64,7 +64,7 @@ -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use work.config.all; @@ -72,24 +72,24 @@ use work.utils.all; use work.ddrio.all; -entity ddrio_out is +entity ddrio_Out is generic ( - NO_OUTPUT_ENABLE : boolean := false; - BITS : positive; - INIT_VALUE : bit_vector := x"FFFFFFFF" + NO_OUTPUT_ENABLE : boolean := false; + BITS : positive; + INIT_VALUE : bit_vector := x"FFFFFFFF" ); port ( - Clock : in std_logic; - ClockEnable : in std_logic := '1'; - OutputEnable : in std_logic := '1'; - DataOut_high : in std_logic_vector(BITS - 1 downto 0); - DataOut_low : in std_logic_vector(BITS - 1 downto 0); - Pad : out std_logic_vector(BITS - 1 downto 0) + Clock : in std_logic; + ClockEnable : in std_logic := '1'; + OutputEnable : in std_logic := '1'; + DataOut_high : in std_logic_vector(BITS - 1 downto 0); + DataOut_low : in std_logic_vector(BITS - 1 downto 0); + Pad : out std_logic_vector(BITS - 1 downto 0) ); end entity; -architecture rtl of ddrio_out is +architecture rtl of ddrio_Out is begin assert ((VENDOR = VENDOR_ALTERA) or ((SIMULATION = TRUE) and (VENDOR = VENDOR_GENERIC)) or (VENDOR = VENDOR_XILINX)) @@ -97,63 +97,63 @@ begin severity FAILURE; genXilinx : if VENDOR = VENDOR_XILINX generate - i : ddrio_out_xilinx + i : ddrio_Out_Xilinx generic map ( - NO_OUTPUT_ENABLE => NO_OUTPUT_ENABLE, - BITS => BITS, - INIT_VALUE => INIT_VALUE + NO_OUTPUT_ENABLE => NO_OUTPUT_ENABLE, + BITS => BITS, + INIT_VALUE => INIT_VALUE ) port map ( - Clock => Clock, - ClockEnable => ClockEnable, - OutputEnable => OutputEnable, - DataOut_high => DataOut_high, - DataOut_low => DataOut_low, - Pad => Pad + Clock => Clock, + ClockEnable => ClockEnable, + OutputEnable => OutputEnable, + DataOut_high => DataOut_high, + DataOut_low => DataOut_low, + Pad => Pad ); end generate; genAltera : if VENDOR = VENDOR_ALTERA generate - i : ddrio_out_altera + i : ddrio_Out_Altera generic map ( - NO_OUTPUT_ENABLE => NO_OUTPUT_ENABLE, - BITS => BITS, - INIT_VALUE => INIT_VALUE + NO_OUTPUT_ENABLE => NO_OUTPUT_ENABLE, + BITS => BITS, + INIT_VALUE => INIT_VALUE ) port map ( - Clock => Clock, - ClockEnable => ClockEnable, - OutputEnable => OutputEnable, - DataOut_high => DataOut_high, - DataOut_low => DataOut_low, - Pad => Pad + Clock => Clock, + ClockEnable => ClockEnable, + OutputEnable => OutputEnable, + DataOut_high => DataOut_high, + DataOut_low => DataOut_low, + Pad => Pad ); end generate; genGeneric : if SIMULATION and (VENDOR = VENDOR_GENERIC) generate - signal DataOut_high_d : std_logic_vector(BITS - 1 downto 0) := to_stdlogicvector(INIT_VALUE); - signal DataOut_low_d : std_logic_vector(BITS - 1 downto 0) := to_stdlogicvector(INIT_VALUE); - signal OutputEnable_d : std_logic; - signal Pad_o : std_logic_vector(BITS - 1 downto 0) := to_stdlogicvector(INIT_VALUE); + signal DataOut_high_d : std_logic_vector(BITS - 1 downto 0) := to_stdlogicvector(INIT_VALUE); + signal DataOut_low_d : std_logic_vector(BITS - 1 downto 0) := to_stdlogicvector(INIT_VALUE); + signal OutputEnable_d : std_logic; + signal Pad_o : std_logic_vector(BITS - 1 downto 0) := to_stdlogicvector(INIT_VALUE); begin - DataOut_high_d <= DataOut_high when rising_edge(Clock) and (ClockEnable = '1'); - DataOut_low_d <= DataOut_low when rising_edge(Clock) and (ClockEnable = '1'); - OutputEnable_d <= OutputEnable when rising_edge(Clock) and (ClockEnable = '1'); + DataOut_high_d <= DataOut_high when rising_edge(Clock) and (ClockEnable = '1'); + DataOut_low_d <= DataOut_low when rising_edge(Clock) and (ClockEnable = '1'); + OutputEnable_d <= OutputEnable when rising_edge(Clock) and (ClockEnable = '1'); process(Clock, OutputEnable_d, DataOut_high_d, DataOut_low_d) type T_MUX is array(bit) of std_logic_vector(BITS - 1 downto 0); - variable MuxInput : T_MUX; + variable MuxInput : T_MUX; begin - MuxInput('1') := DataOut_high_d; - MuxInput('0') := DataOut_low_d; + MuxInput('1') := DataOut_high_d; + MuxInput('0') := DataOut_low_d; if (OutputEnable_d = '1') or NO_OUTPUT_ENABLE then - Pad_o <= MuxInput(to_bit(Clock)); + Pad_o <= MuxInput(to_bit(Clock)); else - Pad_o <= (others => 'Z'); + Pad_o <= (others => 'Z'); end if; end process; - Pad <= Pad_o; + Pad <= Pad_o; end generate; end architecture; diff --git a/src/io/ddrio/ddrio_out_altera.vhdl b/src/io/ddrio/ddrio_Out_Altera.vhdl similarity index 57% rename from src/io/ddrio/ddrio_out_altera.vhdl rename to src/io/ddrio/ddrio_Out_Altera.vhdl index 2702584e5..aab03fb64 100644 --- a/src/io/ddrio/ddrio_out_altera.vhdl +++ b/src/io/ddrio/ddrio_Out_Altera.vhdl @@ -1,23 +1,23 @@ -- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann +-- Authors: Martin Zabel +-- Patrick Lehmann -- --- Entity: Instantiates Chip-Specific DDR Output Registers for Altera FPGAs. +-- Entity: Instantiates Chip-Specific DDR Output Registers for Altera FPGAs. -- -- Description: -- ------------------------------------- --- See PoC.io.ddrio.out for interface description. +-- See PoC.io.ddrio.out for interface description. -- -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,32 +26,32 @@ -- limitations under the License. -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; -library Altera_mf; +library Altera_mf; use Altera_mf.Altera_MF_Components.all; -use work.utils.all; +use work.utils.all; -entity ddrio_out_altera is +entity ddrio_Out_Altera is generic ( - NO_OUTPUT_ENABLE : boolean := false; - BITS : positive; - INIT_VALUE : bit_vector := x"FFFFFFFF" + NO_OUTPUT_ENABLE : boolean := false; + BITS : positive; + INIT_VALUE : bit_vector := x"FFFFFFFF" ); port ( - Clock : in std_logic; - ClockEnable : in std_logic; - OutputEnable : in std_logic; - DataOut_high : in std_logic_vector(BITS - 1 downto 0); - DataOut_low : in std_logic_vector(BITS - 1 downto 0); - Pad : out std_logic_vector(BITS - 1 downto 0) + Clock : in std_logic; + ClockEnable : in std_logic; + OutputEnable : in std_logic; + DataOut_high : in std_logic_vector(BITS - 1 downto 0); + DataOut_low : in std_logic_vector(BITS - 1 downto 0); + Pad : out std_logic_vector(BITS - 1 downto 0) ); end entity; -architecture rtl of ddrio_out_altera is +architecture rtl of ddrio_Out_Altera is signal oe : std_logic; begin -- The real output enable; @@ -65,19 +65,19 @@ begin begin off : altddio_out generic map ( - OE_REG => ite(NO_OUTPUT_ENABLE, "UNREGISTERED", "REGISTERED"), - POWER_UP_HIGH => ite(NO_OUTPUT_ENABLE, + OE_REG => ite(NO_OUTPUT_ENABLE, "UNREGISTERED", "REGISTERED"), + POWER_UP_HIGH => ite(NO_OUTPUT_ENABLE, ite(INIT_VALUE(i) = '1', "ON", "OFF"), "OFF"), - WIDTH => 1 + WIDTH => 1 ) port map ( - outclock => Clock, - outclocken => ClockEnable, - oe => oe, - datain_h(0) => DataOut_high(i), - datain_l(0) => DataOut_low(i), - dataout(0) => Pad(i) + outclock => Clock, + outclocken => ClockEnable, + oe => oe, + datain_h(0) => DataOut_high(i), + datain_l(0) => DataOut_low(i), + dataout(0) => Pad(i) ); end generate; diff --git a/src/io/ddrio/ddrio_out_xilinx.vhdl b/src/io/ddrio/ddrio_Out_Xilinx.vhdl similarity index 56% rename from src/io/ddrio/ddrio_out_xilinx.vhdl rename to src/io/ddrio/ddrio_Out_Xilinx.vhdl index 361a1a39b..21e3fefc2 100644 --- a/src/io/ddrio/ddrio_out_xilinx.vhdl +++ b/src/io/ddrio/ddrio_Out_Xilinx.vhdl @@ -1,23 +1,23 @@ -- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann +-- Authors: Martin Zabel +-- Patrick Lehmann -- --- Entity: Instantiates Chip-Specific DDR Output Registers for Xilinx FPGAs. +-- Entity: Instantiates Chip-Specific DDR Output Registers for Xilinx FPGAs. -- -- Description: -- ------------------------------------- --- See PoC.io.ddrio.out for interface description. +-- See PoC.io.ddrio.out for interface description. -- -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,28 +30,28 @@ library IEEE; use IEEE.std_logic_1164.all; -library UniSim; +library UniSim; use UniSim.vComponents.all; -entity ddrio_out_xilinx is +entity ddrio_Out_Xilinx is generic ( - NO_OUTPUT_ENABLE : boolean := false; - BITS : positive; - INIT_VALUE : bit_vector := x"FFFFFFFF" + NO_OUTPUT_ENABLE : boolean := false; + BITS : positive; + INIT_VALUE : bit_vector := x"FFFFFFFF" ); port ( - Clock : in std_logic; - ClockEnable : in std_logic; - OutputEnable : in std_logic; - DataOut_high : in std_logic_vector(BITS - 1 downto 0); - DataOut_low : in std_logic_vector(BITS - 1 downto 0); - Pad : out std_logic_vector(BITS - 1 downto 0) + Clock : in std_logic; + ClockEnable : in std_logic; + OutputEnable : in std_logic; + DataOut_high : in std_logic_vector(BITS - 1 downto 0); + DataOut_low : in std_logic_vector(BITS - 1 downto 0); + Pad : out std_logic_vector(BITS - 1 downto 0) ); end entity; -architecture rtl of ddrio_out_xilinx is +architecture rtl of ddrio_Out_Xilinx is begin gen : for i in 0 to BITS - 1 generate @@ -59,18 +59,18 @@ begin begin off : ODDR generic map( - DDR_CLK_EDGE => "SAME_EDGE", - INIT => INIT_VALUE(i), - SRTYPE => "SYNC" + DDR_CLK_EDGE => "SAME_EDGE", + INIT => INIT_VALUE(i), + SRTYPE => "SYNC" ) port map ( - Q => o, - C => Clock, - CE => ClockEnable, - D1 => DataOut_high(i), - D2 => DataOut_low(i), - R => '0', - S => '0' + Q => o, + C => Clock, + CE => ClockEnable, + D1 => DataOut_high(i), + D2 => DataOut_low(i), + R => '0', + S => '0' ); genOE : if not NO_OUTPUT_ENABLE generate @@ -81,18 +81,18 @@ begin tff : ODDR generic map( - DDR_CLK_EDGE => "SAME_EDGE", - INIT => '1', - SRTYPE => "SYNC" + DDR_CLK_EDGE => "SAME_EDGE", + INIT => '1', + SRTYPE => "SYNC" ) port map ( - Q => t, - C => Clock, - CE => ClockEnable, - D1 => oe_n, - D2 => oe_n, - R => '0', - S => '0' + Q => t, + C => Clock, + CE => ClockEnable, + D1 => oe_n, + D2 => oe_n, + R => '0', + S => '0' ); -- Explicit instantiation of tri-statable I/O buffers. Required if entity diff --git a/src/io/ddrio/ddrio_inout_altera.vhdl b/src/io/ddrio/ddrio_inout_altera.vhdl deleted file mode 100644 index 3d7e51162..000000000 --- a/src/io/ddrio/ddrio_inout_altera.vhdl +++ /dev/null @@ -1,82 +0,0 @@ --- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann --- --- Entity: Instantiates Chip-Specific DDR Input/Output Registers for Xilinx FPGAs. --- --- Description: --- ------------------------------------- --- See PoC.io.ddrio.inout for interface description. --- --- License: --- ============================================================================= --- Copyright 2007-2015 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -library IEEE; -use IEEE.std_logic_1164.all; - -library Altera_mf; -use Altera_mf.Altera_MF_Components.all; - - -entity ddrio_inout_altera is - generic ( - BITS : positive - ); - port ( - ClockOut : in std_logic; - ClockOutEnable : in std_logic; - OutputEnable : in std_logic; - DataOut_high : in std_logic_vector(BITS - 1 downto 0); - DataOut_low : in std_logic_vector(BITS - 1 downto 0); - - ClockIn : in std_logic; - ClockInEnable : in std_logic; - DataIn_high : out std_logic_vector(BITS - 1 downto 0); - DataIn_low : out std_logic_vector(BITS - 1 downto 0); - - Pad : inout std_logic_vector(BITS - 1 downto 0) - ); -end entity; - - -architecture rtl of ddrio_inout_altera is - -begin - -- Generic POWER_UP_HIGH must be left "OFF" to disable output after power-up. - -- In consequence data input register power-up low. - ioff : altddio_bidir - generic map ( - OE_REG => "REGISTERED", - WIDTH => BITS - ) - port map ( - outclock => ClockOut, - outclocken => ClockOutEnable, - oe => OutputEnable, - datain_h => DataOut_high, - datain_l => DataOut_low, - - inclock => ClockIn, - inclocken => ClockInEnable, - dataout_h => DataIn_high, - dataout_l => DataIn_low, - - padio => Pad - ); -end architecture; diff --git a/src/io/iic/iic.pro b/src/io/iic/build.pro similarity index 100% rename from src/io/iic/iic.pro rename to src/io/iic/build.pro diff --git a/src/io/iic/iic.pkg.vhdl b/src/io/iic/iic.pkg.vhdl index 1493cd93d..e42cf86d8 100644 --- a/src/io/iic/iic.pkg.vhdl +++ b/src/io/iic/iic.pkg.vhdl @@ -31,9 +31,9 @@ library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; -use work.utils.all; -use work.physical.all; -use work.io.all; +use work.utils.all; +use work.physical.all; +use work.io.all; package iic is diff --git a/src/io/io.pkg.vhdl b/src/io/io.pkg.vhdl index cf95b6798..548e131b0 100644 --- a/src/io/io.pkg.vhdl +++ b/src/io/io.pkg.vhdl @@ -28,8 +28,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.physical.all; @@ -46,7 +46,7 @@ package io is O : std_logic; -- output / from FPGA to device T : std_logic; -- output disable / tristate enable end record; - -- use instead: + -- use instead: type T_IO_TRISTATE_IN is record I : std_logic; -- input / from device to FPGA end record; @@ -61,7 +61,7 @@ package io is -- values in both directions, see also -- :ref:`ISSUES:General:inout_records`. type T_IO_TRISTATE_VECTOR is array(natural range <>) of T_IO_TRISTATE; - -- use instead: + -- use instead: type T_IO_TRISTATE_IN_VECTOR is array(natural range <>) of T_IO_TRISTATE_IN; type T_IO_TRISTATE_OUT_VECTOR is array(natural range <>) of T_IO_TRISTATE_OUT; @@ -213,11 +213,11 @@ package io is CLOCK_FREQ_MHZ : real ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; Fan_PWM : out std_logic; - Fan_Tacho : in std_logic; + Fan_Tacho : in std_logic; TachoFrequency : out std_logic_vector(15 downto 0) ); diff --git a/src/io/io_7SegmentMux_BCD.vhdl b/src/io/io_7SegmentMux_BCD.vhdl index 46ed793f0..e298a1004 100644 --- a/src/io/io_7SegmentMux_BCD.vhdl +++ b/src/io/io_7SegmentMux_BCD.vhdl @@ -30,14 +30,14 @@ -- limitations under the License. -- ============================================================================= -library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -use work.utils.all; -use work.physical.all; -use work.components.all; -use work.io.all; +use work.utils.all; +use work.physical.all; +use work.components.all; +use work.io.all; entity io_7SegmentMux_BCD is diff --git a/src/io/io_7SegmentMux_HEX.vhdl b/src/io/io_7SegmentMux_HEX.vhdl index 392bfb2ba..36d8da55b 100644 --- a/src/io/io_7SegmentMux_HEX.vhdl +++ b/src/io/io_7SegmentMux_HEX.vhdl @@ -29,8 +29,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; @@ -51,8 +51,8 @@ entity io_7SegmentMux_HEX is HexDigits : in T_SLVV_4(DIGITS - 1 downto 0); HexDots : in std_logic_vector(DIGITS - 1 downto 0); - SegmentControl : out std_logic_vector(7 downto 0); - DigitControl : out std_logic_vector(DIGITS - 1 downto 0) + SegmentControl : out std_logic_vector(7 downto 0); + DigitControl : out std_logic_vector(DIGITS - 1 downto 0) ); end entity; diff --git a/src/io/io_Debounce.vhdl b/src/io/io_Debounce.vhdl index 5f481a6e3..5233b9e67 100644 --- a/src/io/io_Debounce.vhdl +++ b/src/io/io_Debounce.vhdl @@ -1,8 +1,8 @@ -- ============================================================================= --- Authors: Patrick Lehmann --- Thomas B. Preusser +-- Authors: Patrick Lehmann +-- Thomas B. Preusser -- --- Entity: Debounce module for BITS many bouncing input pins. +-- Entity: Debounce module for BITS many bouncing input pins. -- -- Description: -- ------------------------------------- @@ -22,13 +22,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -38,7 +38,7 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; +use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use work.utils.all; @@ -73,7 +73,7 @@ architecture rtl of io_Debounce is signal active : std_logic_vector(Input'range); -- Allow Output Updates begin - ----------------------------------------------------------------------------- + ----------------------------------------------------------------------------- -- Input Synchronization genNoSync: if not ADD_INPUT_SYNCHRONIZERS generate sync <= Input; diff --git a/src/io/io_FanControl.vhdl b/src/io/io_FanControl.vhdl index 363f1572d..5020b6e2b 100644 --- a/src/io/io_FanControl.vhdl +++ b/src/io/io_FanControl.vhdl @@ -45,7 +45,7 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; +use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use work.config.all; @@ -69,7 +69,7 @@ entity io_FanControl is Reset : in std_logic; -- Fan Control derived from internal System Health Monitor - Fan_PWM : out std_logic; + Fan_PWM : out std_logic; -- Decoding of Speed Sensor (Requires ENABLE_TACHO) Fan_Tacho : in std_logic := 'X'; @@ -250,4 +250,4 @@ begin -- multiply by 64; divide by 2 for RPMs (2 impulses per revolution) => append 5x '0' TachoFrequency <= resize(Tacho_Freq & "00000", TachoFrequency'length); -- resizing to 16 bit end generate; -end; +end architecture; diff --git a/src/io/io_FrequencyCounter.vhdl b/src/io/io_FrequencyCounter.vhdl index 2873ca73a..3a44858dc 100644 --- a/src/io/io_FrequencyCounter.vhdl +++ b/src/io/io_FrequencyCounter.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2014 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,12 +26,12 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -use work.utils.all; -use work.physical.all; +use work.utils.all; +use work.physical.all; entity io_FrequencyCounter is @@ -41,9 +41,9 @@ entity io_FrequencyCounter is RESOLUTION : positive := 8 ); port ( - Clock : in std_logic; - Reset : in std_logic; - FreqIn : in std_logic; + Clock : in std_logic; + Reset : in std_logic; + FreqIn : in std_logic; FreqOut : out std_logic_vector(RESOLUTION - 1 downto 0); FreqOut_Strobe : out std_logic ); @@ -61,7 +61,7 @@ architecture rtl of io_FrequencyCounter is signal FrequencyCounter_us : unsigned(FREQUENCYCOUNTER_BITS downto 0) := (others => '0'); signal FrequencyCounter_ov : std_logic; - signal FreqIn_d : std_logic := '0'; + signal FreqIn_d : std_logic := '0'; signal FreqIn_re : std_logic; signal FreqOut_d : std_logic_vector(RESOLUTION - 1 downto 0) := (others => '0'); @@ -96,7 +96,7 @@ begin end if; end process; - FrequencyCounter_ov <= FrequencyCounter_us(FrequencyCounter_us'high); + FrequencyCounter_ov <= FrequencyCounter_us(FrequencyCounter_us'high); -- hold counter value until next TimeBaseCounter event process(Clock) @@ -117,4 +117,4 @@ begin end process; FreqOut <= FreqOut_d; -end; +end architecture; diff --git a/src/io/io_GlitchFilter.vhdl b/src/io/io_GlitchFilter.vhdl index c29d9e718..98d20a259 100644 --- a/src/io/io_GlitchFilter.vhdl +++ b/src/io/io_GlitchFilter.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Glitch Filter +-- Entity: Glitch Filter -- -- Description: -- ------------------------------------- @@ -11,13 +11,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -27,92 +27,92 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; -- use work.io.all; entity io_GlitchFilter is - generic ( - HIGH_SPIKE_SUPPRESSION_CYCLES : natural := 5; - LOW_SPIKE_SUPPRESSION_CYCLES : natural := 5 + generic ( + HIGH_SPIKE_SUPPRESSION_CYCLES : natural := 5; + LOW_SPIKE_SUPPRESSION_CYCLES : natural := 5 ); - port ( - Clock : in std_logic; - Input : in std_logic; - Output : out std_logic + port ( + Clock : in std_logic; + Input : in std_logic; + Output : out std_logic ); end entity; architecture rtl of io_GlitchFilter is -- Timing table ID - constant TTID_HIGH_SPIKE : natural := 0; - constant TTID_LOW_SPIKE : natural := 1; + constant TTID_HIGH_SPIKE : natural := 0; + constant TTID_LOW_SPIKE : natural := 1; -- Timing table - constant TIMING_TABLE : T_NATVEC := ( - TTID_HIGH_SPIKE => HIGH_SPIKE_SUPPRESSION_CYCLES, - TTID_LOW_SPIKE => LOW_SPIKE_SUPPRESSION_CYCLES + constant TIMING_TABLE : natural_vector := ( + TTID_HIGH_SPIKE => HIGH_SPIKE_SUPPRESSION_CYCLES, + TTID_LOW_SPIKE => LOW_SPIKE_SUPPRESSION_CYCLES ); - signal State : std_logic := '0'; - signal NextState : std_logic; + signal State : std_logic := '0'; + signal NextState : std_logic; - signal TC_en : std_logic; - signal TC_Load : std_logic; - signal TC_Slot : natural; - signal TC_Timeout : std_logic; + signal TC_en : std_logic; + signal TC_Load : std_logic; + signal TC_Slot : natural; + signal TC_Timeout : std_logic; begin assert FALSE report "GlitchFilter: " & - "HighSpikeSuppressionCycles=" & integer'image(TIMING_TABLE(TTID_HIGH_SPIKE)) & " " & - "LowSpikeSuppressionCycles=" & integer'image(TIMING_TABLE(TTID_LOW_SPIKE)) & " " + "HighSpikeSuppressionCycles=" & integer'image(TIMING_TABLE(TTID_HIGH_SPIKE)) & " " & + "LowSpikeSuppressionCycles=" & integer'image(TIMING_TABLE(TTID_LOW_SPIKE)) & " " severity NOTE; process(Clock) begin if rising_edge(Clock) then - State <= NextState; + State <= NextState; end if; end process; process(State, Input, TC_Timeout) begin - NextState <= State; + NextState <= State; - TC_en <= '0'; - TC_Load <= '0'; - TC_Slot <= 0; + TC_en <= '0'; + TC_Load <= '0'; + TC_Slot <= 0; case State is when '0' => - TC_Slot <= TTID_HIGH_SPIKE; + TC_Slot <= TTID_HIGH_SPIKE; if (Input = '1') then - TC_en <= '1'; + TC_en <= '1'; else - TC_Load <= '1'; + TC_Load <= '1'; end if; if ((Input and TC_Timeout) = '1') then - NextState <= '1'; + NextState <= '1'; end if; when '1' => - TC_Slot <= TTID_LOW_SPIKE; + TC_Slot <= TTID_LOW_SPIKE; if (Input = '0') then - TC_en <= '1'; + TC_en <= '1'; else - TC_Load <= '1'; + TC_Load <= '1'; end if; if ((not Input and TC_Timeout) = '1') then - NextState <= '0'; + NextState <= '0'; end if; when others => @@ -123,14 +123,14 @@ begin TC : entity work.io_TimingCounter generic map ( - TIMING_TABLE => TIMING_TABLE -- timing table + TIMING_TABLE => TIMING_TABLE -- timing table ) port map ( - Clock => Clock, -- clock - Enable => TC_en, -- enable counter - Load => TC_Load, -- load Timing Value from TIMING_TABLE selected by slot - Slot => TC_Slot, -- - Timeout => TC_Timeout -- timing reached + Clock => Clock, -- clock + Enable => TC_en, -- enable counter + Load => TC_Load, -- load Timing Value from TIMING_TABLE selected by slot + Slot => TC_Slot, -- + Timeout => TC_Timeout -- timing reached ); Output <= State; diff --git a/src/io/io_KeyPadScanner.vhdl b/src/io/io_KeyPadScanner.vhdl index 4978c2882..ea56894fe 100644 --- a/src/io/io_KeyPadScanner.vhdl +++ b/src/io/io_KeyPadScanner.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Keypad button matrix scanner +-- Entity: Keypad button matrix scanner -- -- Description: -- ------------------------------------- @@ -14,13 +14,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,8 +30,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; @@ -41,72 +41,72 @@ use work.components.all; entity io_KeyPadScanner is generic ( - CLOCK_FREQ : FREQ := 100 MHz; - SCAN_FREQ : FREQ := 1 kHz; - ROWS : positive := 4; - COLUMNS : positive := 4; - ADD_INPUT_SYNCHRONIZERS : boolean := TRUE + CLOCK_FREQ : FREQ := 100 MHz; + SCAN_FREQ : FREQ := 1 kHz; + ROWS : positive := 4; + COLUMNS : positive := 4; + ADD_INPUT_SYNCHRONIZERS : boolean := TRUE ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- Matrix interface - KeyPadMatrix : out T_SLM(COLUMNS - 1 downto 0, ROWS - 1 downto 0); + KeyPadMatrix : out T_SLM(COLUMNS - 1 downto 0, ROWS - 1 downto 0); -- KeyPad interface - ColumnVector : out std_logic_vector(COLUMNS - 1 downto 0); - RowVector : in std_logic_vector(ROWS - 1 downto 0) + ColumnVector : out std_logic_vector(COLUMNS - 1 downto 0); + RowVector : in std_logic_vector(ROWS - 1 downto 0) ); end entity; architecture rtl of io_KeyPadScanner is - constant SHIFT_FREQ : FREQ := SCAN_FREQ * COLUMNS; + constant SHIFT_FREQ : FREQ := SCAN_FREQ * COLUMNS; - constant COLUMNTIMER_MAX : positive := TimingToCycles(to_time(SHIFT_FREQ), CLOCK_FREQ) - 1; - constant COLUMNTIMER_BITS : positive := log2ceilnz(COLUMNTIMER_MAX) + 1; + constant COLUMNTIMER_MAX : positive := TimingToCycles(to_time(SHIFT_FREQ), CLOCK_FREQ) - 1; + constant COLUMNTIMER_BITS : positive := log2ceilnz(COLUMNTIMER_MAX) + 1; - signal ColumnTimer_rst : std_logic; - signal ColumnTimer_s : signed(COLUMNTIMER_BITS - 1 downto 0) := to_signed(COLUMNTIMER_MAX, COLUMNTIMER_BITS); + signal ColumnTimer_rst : std_logic; + signal ColumnTimer_s : signed(COLUMNTIMER_BITS - 1 downto 0) := to_signed(COLUMNTIMER_MAX, COLUMNTIMER_BITS); - signal ColumnSelect_en : std_logic; - signal ColumnSelect_d : std_logic_vector(COLUMNS - 1 downto 0) := (0 => '1', others => '0'); + signal ColumnSelect_en : std_logic; + signal ColumnSelect_d : std_logic_vector(COLUMNS - 1 downto 0) := (0 => '1', others => '0'); - signal Rows_sync : std_logic_vector(ROWS - 1 downto 0); - signal KeyPadMatrix_r : T_SLM(COLUMNS - 1 downto 0, ROWS - 1 downto 0) := (others => (others => '0')); + signal Rows_sync : std_logic_vector(ROWS - 1 downto 0); + signal KeyPadMatrix_r : T_SLM(COLUMNS - 1 downto 0, ROWS - 1 downto 0) := (others => (others => '0')); begin -- generate a < 100 kHz shift enable to 'clock' the ColumnSelect shift register - ColumnTimer_s <= downcounter_next(cnt => ColumnTimer_s, rst => ColumnTimer_rst, INIT => COLUMNTIMER_MAX) when rising_edge(Clock); - ColumnTimer_rst <= downcounter_neg(cnt => ColumnTimer_s); + ColumnTimer_s <= downcounter_next(cnt => ColumnTimer_s, rst => ColumnTimer_rst, INIT => COLUMNTIMER_MAX) when rising_edge(Clock); + ColumnTimer_rst <= downcounter_neg(cnt => ColumnTimer_s); -- generate a column scan signal (one-hot encoded), based on a one-hot rotate register - ColumnSelect_en <= ColumnTimer_rst; - ColumnSelect_d <= rreg_left(q => ColumnSelect_d, en => ColumnSelect_en) when rising_edge(Clock); - ColumnVector <= ColumnSelect_d; + ColumnSelect_en <= ColumnTimer_rst; + ColumnSelect_d <= rreg_left(q => ColumnSelect_d, en => ColumnSelect_en) when rising_edge(Clock); + ColumnVector <= ColumnSelect_d; -- synchronize input signals genSync : if ADD_INPUT_SYNCHRONIZERS generate sync : entity work.sync_Bits generic map ( - BITS => ROWS + BITS => ROWS ) port map ( - Clock => Clock, - Input => RowVector, - Output => Rows_sync + Clock => Clock, + Input => RowVector, + Output => Rows_sync ); end generate; genNoSync : if not ADD_INPUT_SYNCHRONIZERS generate - Rows_sync <= RowVector; + Rows_sync <= RowVector; end generate; geni : for i in 0 to COLUMNS - 1 generate genj : for j in 0 to ROWS - 1 generate - KeyPadMatrix_r(i, j) <= ffsr(q => KeyPadMatrix_r(i, j), + KeyPadMatrix_r(i, j) <= ffsr(q => KeyPadMatrix_r(i, j), set => (ColumnSelect_d(i) and Rows_sync(j)), rst => (Reset or (ColumnSelect_d(i) and not Rows_sync(j)))) when rising_edge(Clock); end generate; end generate; - KeyPadMatrix <= KeyPadMatrix_r; + KeyPadMatrix <= KeyPadMatrix_r; end architecture; diff --git a/src/io/io_PulseWidthModulation.vhdl b/src/io/io_PulseWidthModulation.vhdl index 41e912c7f..54d6bdb35 100644 --- a/src/io/io_PulseWidthModulation.vhdl +++ b/src/io/io_PulseWidthModulation.vhdl @@ -19,7 +19,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,8 +29,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.physical.all; @@ -91,4 +91,4 @@ begin PWM_PulseCounter_ov <= to_sl(PWM_PulseCounter_us = ((2**PWM_RESOLUTION) - 1)) and PWM_FrequencyCounter_ov; PWMOut <= to_sl(PWM_PulseCounter_us < PWMIn); -end; +end architecture; diff --git a/src/io/io_TimingCounter.vhdl b/src/io/io_TimingCounter.vhdl index ead99f39f..1bd0b6674 100644 --- a/src/io/io_TimingCounter.vhdl +++ b/src/io/io_TimingCounter.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: optimized down-counter to control timings for low speed signals +-- Entity: optimized down-counter to control timings for low speed signals -- -- Description: -- ------------------------------------- @@ -13,13 +13,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,18 +29,18 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -use work.my_config.all; +use work.project_configuration.all; use work.utils.all; entity io_TimingCounter is - generic ( - TIMING_TABLE : T_NATVEC -- timing table + generic ( + TIMING_TABLE : natural_vector -- timing table ); - port ( + port ( Clock : in std_logic; -- clock Enable : in std_logic; -- enable counter Load : in std_logic; -- load Timing Value from TIMING_TABLE selected by slot @@ -51,18 +51,18 @@ end entity; architecture rtl of io_TimingCounter is - function transform(vec : T_NATVEC) return T_INTVEC is - variable Result : T_INTVEC(vec'range); - begin + function transform(vec : natural_vector) return integer_vector is + variable Result : integer_vector(vec'range); + begin assert (not MY_VERBOSE) report "TIMING_TABLE (transformed):" severity NOTE; - for i in vec'range loop - Result(i) := vec(i) - 1; + for i in vec'range loop + Result(i) := vec(i) - 1; assert (not MY_VERBOSE) report " " & integer'image(i) & " - " & INTEGER'image(Result(i)) severity NOTE; end loop; return Result; - end; + end function; - constant TIMING_TABLE2 : T_INTVEC := transform(TIMING_TABLE); + constant TIMING_TABLE2 : integer_vector := transform(TIMING_TABLE); constant TIMING_MAX : natural := imax(TIMING_TABLE2); constant COUNTER_BITS : natural := log2ceilnz(TIMING_MAX + 1); @@ -81,4 +81,4 @@ begin end process; Timeout <= Counter_s(Counter_s'high); -end; +end architecture; diff --git a/src/io/pmod/pmod.pkg.vhdl b/src/io/pmod/pmod.pkg.vhdl index 1b1ab917d..05f777d2c 100644 --- a/src/io/pmod/pmod.pkg.vhdl +++ b/src/io/pmod/pmod.pkg.vhdl @@ -28,16 +28,16 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; package pmod is subtype T_PMOD_SINGLE is std_logic_vector(4 downto 1); - type T_PMOD_SINGLE_VECTOR is array(natural range <>) of T_PMOD_SINGLE; + type T_PMOD_SINGLE_VECTOR is array(natural range <>) of T_PMOD_SINGLE; -- FIXME: T_SLVV subtype T_PMOD_DUAL is std_logic_vector(8 downto 1); - type T_PMOD_DUAL_VECTOR is array(natural range <>) of T_PMOD_DUAL; + type T_PMOD_DUAL_VECTOR is array(natural range <>) of T_PMOD_DUAL; -- FIXME: T_SLVV type T_PMOD_KYPD_KEYPAD is record Key0 : std_logic; diff --git a/src/io/pmod/pmod_KYPD.vhdl b/src/io/pmod/pmod_KYPD.vhdl index a9ec59706..d8769f367 100644 --- a/src/io/pmod/pmod_KYPD.vhdl +++ b/src/io/pmod/pmod_KYPD.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Digilent Peripherial Module: 4x4 Keypad (Pmod_KYPD) +-- Entity: Digilent Peripherial Module: 4x4 Keypad (pmod_KYPD) -- -- Description: -- ------------------------------------- @@ -15,13 +15,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,8 +31,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.vectors.all; use work.physical.all; @@ -41,84 +41,84 @@ use work.pmod.all; entity pmod_KYPD is generic ( - CLOCK_FREQ : FREQ := 100 MHz; - SCAN_FREQ : FREQ := 1 kHz; - BOUNCE_TIME : T_TIME := 10.0e-3 + CLOCK_FREQ : FREQ := 100 MHz; + SCAN_FREQ : FREQ := 1 kHz; + BOUNCE_TIME : T_TIME := 10.0e-3 ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- Matrix interface - Keys : out T_PMOD_KYPD_KEYPAD; + Keys : out T_PMOD_KYPD_KEYPAD; -- KeyPad interface - Columns_n : out std_logic_vector(3 downto 0); - Rows_n : in std_logic_vector(3 downto 0) + Columns_n : out std_logic_vector(3 downto 0); + Rows_n : in std_logic_vector(3 downto 0) ); end entity; architecture rtl of pmod_KYPD is - signal ColumnVector : std_logic_vector(3 downto 0); - signal RowVector : std_logic_vector(3 downto 0); + signal ColumnVector : std_logic_vector(3 downto 0); + signal RowVector : std_logic_vector(3 downto 0); - signal KeyPadMatrix : T_SLM(3 downto 0, 3 downto 0); - signal KeyPadMatrix_slv : std_logic_vector(15 downto 0); - signal KeyPadVector : std_logic_vector(15 downto 0); - signal KeyPad : T_SLM(3 downto 0, 3 downto 0); + signal KeyPadMatrix : T_SLM(3 downto 0, 3 downto 0); + signal KeyPadMatrix_slv : std_logic_vector(15 downto 0); + signal KeyPadVector : std_logic_vector(15 downto 0); + signal KeyPad : T_SLM(3 downto 0, 3 downto 0); begin -- KeyPad interface (low-active) - Columns_n <= not ColumnVector; - RowVector <= Rows_n; + Columns_n <= not ColumnVector; + RowVector <= Rows_n; -- initialize a 4x4 matrix scanner scanner: entity work.io_KeyPadScanner generic map ( - CLOCK_FREQ => CLOCK_FREQ, - SCAN_FREQ => SCAN_FREQ, - COLUMNS => 4, - ROWS => 4, - ADD_INPUT_SYNCHRONIZERS => TRUE + CLOCK_FREQ => CLOCK_FREQ, + SCAN_FREQ => SCAN_FREQ, + COLUMNS => 4, + ROWS => 4, + ADD_INPUT_SYNCHRONIZERS => TRUE ) port map ( - Clock => Clock, - Reset => Reset, - KeyPadMatrix => KeyPadMatrix, - ColumnVector => ColumnVector, - RowVector => RowVector + Clock => Clock, + Reset => Reset, + KeyPadMatrix => KeyPadMatrix, + ColumnVector => ColumnVector, + RowVector => RowVector ); -- serialize the keypad matrix for debouncing - KeyPadMatrix_slv <= to_slv(KeyPadMatrix); + KeyPadMatrix_slv <= to_slv(KeyPadMatrix); debounce: entity work.io_Debounce generic map ( - CLOCK_FREQ => CLOCK_FREQ, - BOUNCE_TIME => BOUNCE_TIME, - BITS => 16, - ADD_INPUT_SYNCHRONIZERS => FALSE + CLOCK_FREQ => CLOCK_FREQ, + BOUNCE_TIME => BOUNCE_TIME, + BITS => 16, + ADD_INPUT_SYNCHRONIZERS => FALSE ) port map ( - Clock => Clock, - Input => KeyPadMatrix_slv, - Output => KeyPadVector + Clock => Clock, + Input => KeyPadMatrix_slv, + Output => KeyPadVector ); - KeyPad <= to_slm(KeyPadVector, 4, 4); - Keys.Key1 <= KeyPad(0, 0); - Keys.Key2 <= KeyPad(1, 0); - Keys.Key3 <= KeyPad(2, 0); - Keys.KeyA <= KeyPad(3, 0); - Keys.Key4 <= KeyPad(0, 1); - Keys.Key5 <= KeyPad(1, 1); - Keys.Key6 <= KeyPad(2, 1); - Keys.KeyB <= KeyPad(3, 1); - Keys.Key7 <= KeyPad(0, 2); - Keys.Key8 <= KeyPad(1, 2); - Keys.Key9 <= KeyPad(2, 2); - Keys.KeyC <= KeyPad(3, 2); - Keys.Key0 <= KeyPad(0, 3); - Keys.KeyF <= KeyPad(1, 3); - Keys.KeyE <= KeyPad(2, 3); - Keys.KeyD <= KeyPad(3, 3); + KeyPad <= to_slm(KeyPadVector, 4, 4); + Keys.Key1 <= KeyPad(0, 0); + Keys.Key2 <= KeyPad(1, 0); + Keys.Key3 <= KeyPad(2, 0); + Keys.KeyA <= KeyPad(3, 0); + Keys.Key4 <= KeyPad(0, 1); + Keys.Key5 <= KeyPad(1, 1); + Keys.Key6 <= KeyPad(2, 1); + Keys.KeyB <= KeyPad(3, 1); + Keys.Key7 <= KeyPad(0, 2); + Keys.Key8 <= KeyPad(1, 2); + Keys.Key9 <= KeyPad(2, 2); + Keys.KeyC <= KeyPad(3, 2); + Keys.Key0 <= KeyPad(0, 3); + Keys.KeyF <= KeyPad(1, 3); + Keys.KeyE <= KeyPad(2, 3); + Keys.KeyD <= KeyPad(3, 3); end architecture; diff --git a/src/io/pmod/pmod_SSD.vhdl b/src/io/pmod/pmod_SSD.vhdl index d2a342880..ef7a30a09 100644 --- a/src/io/pmod/pmod_SSD.vhdl +++ b/src/io/pmod/pmod_SSD.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Digilent Peritherial Module: Pmod_SSD +-- Entity: Digilent Peritherial Module: pmod_SSD -- -- Description: -- ------------------------------------- --- This module drives a dual-digit 7-segment display (Pmod_SSD). The module +-- This module drives a dual-digit 7-segment display (pmod_SSD). The module -- expects two binary encoded 4-bit ``Digit`` signals and drives a 2x6 bit -- Pmod connector (7 anode bits, 1 cathode bit). -- @@ -23,13 +23,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -39,8 +39,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.physical.all; @@ -51,49 +51,49 @@ use work.pmod.all; entity pmod_SSD is generic ( - CLOCK_FREQ : FREQ := 100 MHz; - REFRESH_RATE : FREQ := 1 kHz + CLOCK_FREQ : FREQ := 100 MHz; + REFRESH_RATE : FREQ := 1 kHz ); port ( - Clock : in std_logic; + Clock : in std_logic; - Digit0 : in std_logic_vector(3 downto 0); - Digit1 : in std_logic_vector(3 downto 0); + Digit0 : in std_logic_vector(3 downto 0); + Digit1 : in std_logic_vector(3 downto 0); - SSD : out T_PMOD_SSD_PINS + SSD : out T_PMOD_SSD_PINS ); end entity; architecture rtl of pmod_SSD is - constant REFRESHTIMER_MAX : positive := TimingToCycles(to_time(REFRESH_RATE), CLOCK_FREQ) - 1; - constant REFRESHTIMER_BITS : positive := log2ceilnz(REFRESHTIMER_MAX) + 1; + constant REFRESHTIMER_MAX : positive := TimingToCycles(to_time(REFRESH_RATE), CLOCK_FREQ) - 1; + constant REFRESHTIMER_BITS : positive := log2ceilnz(REFRESHTIMER_MAX) + 1; - signal RefreshTimer_rst : std_logic; - signal RefreshTimer_s : signed(REFRESHTIMER_BITS - 1 downto 0) := to_signed(REFRESHTIMER_MAX, REFRESHTIMER_BITS); + signal RefreshTimer_rst : std_logic; + signal RefreshTimer_s : signed(REFRESHTIMER_BITS - 1 downto 0) := to_signed(REFRESHTIMER_MAX, REFRESHTIMER_BITS); - signal CathodeSelect_en : std_logic; - signal CathodeSelect_r : std_logic := '0'; + signal CathodeSelect_en : std_logic; + signal CathodeSelect_r : std_logic := '0'; - signal Digit : std_logic_vector(3 downto 0); - signal Segments : std_logic_vector(6 downto 0); + signal Digit : std_logic_vector(3 downto 0); + signal Segments : std_logic_vector(6 downto 0); begin -- generate a < 1 kHz enable to toggle the CathodeSelect register - RefreshTimer_s <= downcounter_next(cnt => RefreshTimer_s, rst => RefreshTimer_rst, INIT => REFRESHTIMER_MAX) when rising_edge(Clock); - RefreshTimer_rst <= downcounter_neg(cnt => RefreshTimer_s); + RefreshTimer_s <= downcounter_next(cnt => RefreshTimer_s, rst => RefreshTimer_rst, INIT => REFRESHTIMER_MAX) when rising_edge(Clock); + RefreshTimer_rst <= downcounter_neg(cnt => RefreshTimer_s); -- generate a cathode select signal, based on a T-FF - CathodeSelect_en <= RefreshTimer_rst; - CathodeSelect_r <= fftre(q => CathodeSelect_r, t => CathodeSelect_en) when rising_edge(Clock); + CathodeSelect_en <= RefreshTimer_rst; + CathodeSelect_r <= fftre(q => CathodeSelect_r, t => CathodeSelect_en) when rising_edge(Clock); - Digit <= mux(CathodeSelect_r, Digit0, Digit1); - Segments <= io_7SegmentDisplayEncoding(Digit); - SSD.AnodeA <= Segments(0); - SSD.AnodeB <= Segments(1); - SSD.AnodeC <= Segments(2); - SSD.AnodeD <= Segments(3); - SSD.AnodeE <= Segments(4); - SSD.AnodeF <= Segments(5); - SSD.AnodeG <= Segments(6); - SSD.Cathode <= CathodeSelect_r; + Digit <= mux(CathodeSelect_r, Digit0, Digit1); + Segments <= io_7SegmentDisplayEncoding(Digit); + SSD.AnodeA <= Segments(0); + SSD.AnodeB <= Segments(1); + SSD.AnodeC <= Segments(2); + SSD.AnodeD <= Segments(3); + SSD.AnodeE <= Segments(4); + SSD.AnodeF <= Segments(5); + SSD.AnodeG <= Segments(6); + SSD.Cathode <= CathodeSelect_r; end architecture; diff --git a/src/io/pmod/pmod_USBUART.vhdl b/src/io/pmod/pmod_USBUART.vhdl index 089185b1a..5b3693393 100644 --- a/src/io/pmod/pmod_USBUART.vhdl +++ b/src/io/pmod/pmod_USBUART.vhdl @@ -1,25 +1,25 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Digilent Peripherial Module: USB-UART (Pmod_USBUART) +-- Entity: Digilent Peripherial Module: USB-UART (pmod_USBUART) -- -- Description: -- ------------------------------------- -- This module abstracts a FTDI FT232R USB-UART bridge by instantiating a --- :doc:`PoC.io.uart.fifo <../uart/uart_fifo>`. The FT232R supports up to +-- :doc:`PoC.io.uart.fifo <../uart/uart_FIFO>`. The FT232R supports up to -- 3 MBaud. A synchronous FIFO interface with a 32 words buffer is provided. -- Hardware flow control (RTS_CTS) is enabled. -- -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,8 +29,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.physical.all; use work.uart.all; @@ -38,25 +38,25 @@ use work.uart.all; entity pmod_USBUART is generic ( - CLOCK_FREQ : FREQ := 100 MHz; - BAUDRATE : BAUD := 115200 Bd + CLOCK_FREQ : FREQ := 100 MHz; + BAUDRATE : BAUD := 115200 Bd ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - TX_put : in std_logic; - TX_Data : in std_logic_vector(7 downto 0); - TX_Full : out std_logic; + TX_put : in std_logic; + TX_Data : in std_logic_vector(7 downto 0); + TX_Full : out std_logic; - RX_Valid : out std_logic; - RX_Data : out std_logic_vector(7 downto 0); - RX_got : in std_logic; + RX_Valid : out std_logic; + RX_Data : out std_logic_vector(7 downto 0); + RX_got : in std_logic; - UART_TX : out std_logic; - UART_RX : in std_logic; - UART_RTS : out std_logic; - UART_CTS : in std_logic + UART_TX : out std_logic; + UART_RX : in std_logic; + UART_RTS : out std_logic; + UART_CTS : in std_logic ); end entity; @@ -64,34 +64,36 @@ end entity; architecture rtl of pmod_USBUART is begin - UART: entity work.uart_fifo + UART: entity work.uart_FIFO generic map ( - CLOCK_FREQ => CLOCK_FREQ, - BAUDRATE => BAUDRATE, - ADD_INPUT_SYNCHRONIZERS => TRUE, + CLOCK_FREQ => CLOCK_FREQ, + BAUDRATE => BAUDRATE, + ADD_INPUT_SYNCHRONIZERS => TRUE, - TX_MIN_DEPTH => 32, - TX_ESTATE_BITS => 0, - RX_MIN_DEPTH => 32, - RX_FSTATE_BITS => 0, + TX_MIN_DEPTH => 32, + TX_ESTATE_BITS => 0, + RX_MIN_DEPTH => 32, + RX_FSTATE_BITS => 0, - FLOWCONTROL => UART_FLOWCONTROL_RTS_CTS + FLOWCONTROL => UART_FLOWCONTROL_RTS_CTS ) port map ( - Clock => Clock, - Reset => Reset, + Clock => Clock, + Reset => Reset, - TX_put => TX_put, - TX_Data => TX_Data, - TX_Full => TX_Full, + TXFIFO_Reset => Reset, + TX_put => TX_put, + TX_Data => TX_Data, + TX_Full => TX_Full, - RX_Valid => RX_Valid, - RX_Data => RX_Data, - RX_got => RX_got, + RXFIFO_Reset => Reset, + RX_Valid => RX_Valid, + RX_Data => RX_Data, + RX_got => RX_got, - UART_TX => UART_TX, - UART_RX => UART_RX, - UART_RTS => UART_RTS, - UART_CTS => UART_CTS + UART_TX => UART_TX, + UART_RX => UART_RX, + UART_RTS => UART_RTS, + UART_CTS => UART_CTS ); end architecture; diff --git a/src/io/spi/spi.pro b/src/io/spi/spi.pro deleted file mode 100644 index e8f06567c..000000000 --- a/src/io/spi/spi.pro +++ /dev/null @@ -1,14 +0,0 @@ -# ============================================================================= -# Authors: -# -# -# License: -# ============================================================================= -# Copyright (c) 2024 PLC2 Design GmbH - All Rights Reserved -# Unauthorized copying of this file, via any medium is strictly prohibited. -# Proprietary and confidential -# ============================================================================= - -analyze spi.pkg.vhdl -analyze spi_Slave.vhdl -analyze spi_Master.vhdl \ No newline at end of file diff --git a/src/io/uart/README.md b/src/io/uart/README.md index 8869d8999..1a73442a2 100644 --- a/src/io/uart/README.md +++ b/src/io/uart/README.md @@ -11,15 +11,15 @@ The package [`PoC.uart`][uart.pkg] holds all component declarations for this nam ## Entities - - [`uart_bclk`][uart_bclk] - bit-clock generator for 8x oversampling - - [`uart_rx`][uart_rx] - the receiver - - [`uart_tx`][uart_tx] - the transmitter - - [`uart_fifo`][uart_fifo] - a UART with FIFO interface and internal send and receive FIFOs + - [`uart_BitClock`][uart_BitClock] - bit-clock generator for 8x oversampling + - [`uart_RX`][uart_RX] - the receiver + - [`uart_TX`][uart_TX] - the transmitter + - [`uart_FIFO`][uart_FIFO] - a UART with FIFO interface and internal send and receive FIFOs [uart.pkg]: uart.pkg.vhdl - [uart_bclk]: uart_bclk.vhdl - [uart_rx]: uart_rx.vhdl - [uart_tx]: uart_tx.vhdl - [uart_fifo]: uart_fifo.vhdl + [uart_BitClock]: uart_BitClock.vhdl + [uart_RX]: uart_RX.vhdl + [uart_TX]: uart_TX.vhdl + [uart_FIFO]: uart_FIFO.vhdl diff --git a/src/io/uart/uart.pro b/src/io/uart/build.pro similarity index 86% rename from src/io/uart/uart.pro rename to src/io/uart/build.pro index b2fc8b1a3..5c21e3fdd 100644 --- a/src/io/uart/uart.pro +++ b/src/io/uart/build.pro @@ -19,9 +19,8 @@ # ============================================================================= analyze uart.pkg.vhdl -analyze uart_bclk.vhdl -analyze uart_rx.vhdl -analyze uart_tx.vhdl -analyze uart_fifo.vhdl -analyze uart_ft245.vhdl -# analyze uart_axiLite.vhdl +analyze uart_BitClock.vhdl +analyze uart_RX.vhdl +analyze uart_TX.vhdl +analyze uart_FIFO.vhdl +analyze uart_FT245.vhdl diff --git a/src/io/uart/uart.pkg.vhdl b/src/io/uart/uart.pkg.vhdl index f195322e5..fbb95a4f9 100644 --- a/src/io/uart/uart.pkg.vhdl +++ b/src/io/uart/uart.pkg.vhdl @@ -32,22 +32,25 @@ use work.physical.all; package uart is - type T_IO_UART_FLOWCONTROL_KIND is ( + type T_UART_FLOWCONTROL_KIND is ( UART_FLOWCONTROL_NONE, UART_FLOWCONTROL_XON_XOFF, UART_FLOWCONTROL_RTS_CTS, UART_FLOWCONTROL_RTR_CTS ); + type T_UART_PARITY_MODE is ( PARITY_NONE, - PARITY_EVEN, + PARITY_EVEN, PARITY_ODD ); + type T_UART_PARITY_ERROR_HANDLING is ( - REPLACE_ERROR_BYTE, - PASSTHROUGH_ERROR_BYTE, - DROP_ERROR_BYTE + REPLACE_ERROR_BYTE, + PASSTHROUGH_ERROR_BYTE, + DROP_ERROR_BYTE ); + constant C_IO_UART_TYPICAL_BAUDRATES : T_BAUDVEC := ( 0 => 300 Bd, 1 => 600 Bd, 2 => 1200 Bd, 3 => 1800 Bd, 4 => 2400 Bd, 5 => 4000 Bd, 6 => 4800 Bd, 7 => 7200 Bd, 8 => 9600 Bd, 9 => 14400 Bd, @@ -60,100 +63,106 @@ package uart is function io_UART_IsTypicalBaudRate(br : BAUD) return boolean; -- Bit Clock Generator: 8 Ticks per Bit - component uart_bclk - generic ( - CLK_FREQ : positive; - BAUDRATE : positive + component uart_BitClock + generic( + CLOCK_FREQ : FREQ := 100 MHz; + BAUDRATE : BAUD := 115200 Bd; + OVERSAMPLING_RATE : positive := 8 ); - port ( - clk : in std_logic; - rst : in std_logic; - bclk : out std_logic; - bclk_x8 : out std_logic + port( + Clock : in std_logic; + Reset : in std_logic; + BitClock : out std_logic; + SampleClock : out std_logic ); - end component; + end component uart_BitClock; -- Receiver - component uart_rx is - generic ( - SYNC_DEPTH : natural := 2 -- use zero for already clock-synchronous rx + component uart_RX + generic( + SYNC_DEPTH : natural := 2; -- Use 0 for already clock-synchronous RX signal + PARITY : T_UART_PARITY_MODE := PARITY_NONE; + PARITY_ERROR_HANDLING : T_UART_PARITY_ERROR_HANDLING := PASSTHROUGH_ERROR_BYTE; + PARITY_ERROR_IDENTIFIER : std_logic_vector(7 downto 0) := x"15" ); - port ( - -- Global Control - clk : in std_logic; - rst : in std_logic; + port( + Clock : in std_logic; + Reset : in std_logic; - -- Bit Clock and RX Line - bclk_x8 : in std_logic; -- bit clock, eight strobes per bit length - rx : in std_logic; + SampleClock : in std_logic; + RX : in std_logic; - -- Byte Stream Output - do : out std_logic_vector(7 downto 0); - stb : out std_logic + DataOut : out std_logic_vector(7 downto 0); + Strobe : out std_logic; + ParityError : out std_logic ); - end component; + end component uart_RX; -- Transmitter - component uart_tx is - port ( - -- Global Control - clk : in std_logic; - rst : in std_logic; - - -- Bit Clock and TX Line - bclk : in std_logic; -- bit clock, one strobe each bit length - tx : out std_logic; - - -- Byte Stream Input - di : in std_logic_vector(7 downto 0); - put : in std_logic; - ful : out std_logic + component uart_TX + generic( + PARITY : T_UART_PARITY_MODE := PARITY_NONE ); - end component; + port( + Clock : in std_logic; + Reset : in std_logic; + + BitClock : in std_logic; + TX : out std_logic; + + Put : in std_logic; + DataIn : in std_logic_vector(7 downto 0); + Full : out std_logic + ); + end component uart_TX; -- Wrappers -- =========================================================================== -- UART with FIFOs and optional flow control - component uart_fifo is - generic ( - -- Communication Parameters - CLOCK_FREQ : FREQ; - BAUDRATE : BAUD; - - -- Buffer Dimensioning - TX_MIN_DEPTH : positive := 16; - TX_ESTATE_BITS : natural := 0; - RX_MIN_DEPTH : positive := 16; - RX_FSTATE_BITS : natural := 0; - - -- Flow Control - FLOWCONTROL : T_IO_UART_FLOWCONTROL_KIND := UART_FLOWCONTROL_NONE; - SWFC_XON_CHAR : std_logic_vector(7 downto 0) := x"11"; -- ^Q - SWFC_XON_TRIGGER : real := 0.0625; - SWFC_XOFF_CHAR : std_logic_vector(7 downto 0) := x"13"; -- ^S - SWFC_XOFF_TRIGGER : real := 0.75 + component uart_FIFO + generic( + CLOCK_FREQ : FREQ; + BAUDRATE : BAUD; + PARITY : T_UART_PARITY_MODE := PARITY_NONE; + PARITY_ERROR_HANDLING : T_UART_PARITY_ERROR_HANDLING := PASSTHROUGH_ERROR_BYTE; + PARITY_ERROR_IDENTIFIER : std_logic_vector(7 downto 0) := 8x"0"; + ADD_INPUT_SYNCHRONIZERS : boolean := TRUE; + TX_MIN_DEPTH : positive := 16; + TX_ESTATE_BITS : natural := 0; + RX_MIN_DEPTH : positive := 16; + RX_FSTATE_BITS : natural := 0; + FLOWCTRL_XON_THRESHOLD : real := 0.0625; + FLOWCTRL_XOFF_THRESHOLD : real := 0.75; + FLOWCONTROL : T_UART_FLOWCONTROL_KIND := UART_FLOWCONTROL_NONE; + SWFC_XON_CHAR : std_logic_vector(7 downto 0) := x"11"; + SWFC_XOFF_CHAR : std_logic_vector(7 downto 0) := x"13" ); - port ( - Clock : in std_logic; - Reset : in std_logic; - - -- FIFO interface - TX_put : in std_logic; - TX_Data : in std_logic_vector(7 downto 0); - TX_Full : out std_logic; - TX_EmptyState : out std_logic_vector(TX_ESTATE_BITS - 1 downto 0); - - RX_Valid : out std_logic; - RX_Data : out std_logic_vector(7 downto 0); - RX_got : in std_logic; - RX_FullState : out std_logic_vector(RX_FSTATE_BITS - 1 downto 0); - RX_Overflow : out std_logic; - - -- External Pins - UART_RX : in std_logic; - UART_TX : out std_logic + port( + Clock : in std_logic; + Reset : in std_logic; + + TX_Put : in std_logic; + TX_Data : in std_logic_vector(7 downto 0); + TX_Full : out std_logic; + TX_EmptyState : out std_logic_vector(imax(0, TX_ESTATE_BITS-1) downto 0); + TXFIFO_Reset : in std_logic; + TXFIFO_Empty : out std_logic; + + RX_Valid : out std_logic; + RX_Data : out std_logic_vector(7 downto 0); + RX_Got : in std_logic; + RX_FullState : out std_logic_vector(imax(0, RX_FSTATE_BITS-1) downto 0); + RX_Overflow : out std_logic; + RXFIFO_Full : out std_logic; + RXFIFO_Reset : in std_logic; + + UART_TX : out std_logic; + UART_RX : in std_logic; + UART_RTS : out std_logic; + UART_CTS : in std_logic; + UART_ParityError : out std_logic ); - end component; + end component uart_FIFO; -- USB-UART component ft245_uart is @@ -162,25 +171,25 @@ package uart is ); port ( -- common signals - clk : in std_logic; - reset : in std_logic; - - -- send data - snd_ready : out std_logic; - snd_strobe : in std_logic; - snd_data : in std_logic_vector(7 downto 0); - - -- receive data - rec_strobe : out std_logic; - rec_data : out std_logic_vector(7 downto 0); - - -- connection to ft245 - ft245_data : inout std_logic_vector (7 downto 0); - ft245_rdn : out std_logic; - ft245_wrn : out std_logic; - ft245_rxfn : in std_logic; - ft245_txen : in std_logic; - ft245_pwrenn : in std_logic + Clock : in std_logic; + Reset : in std_logic; + + -- Send data + TX_Put : in std_logic; + TX_Data : in std_logic_vector(7 downto 0); + TX_Full : out std_logic; + + -- Receive data + RX_Valid : out std_logic; + RX_Data : out std_logic_vector(7 downto 0); + + -- Connection to FT245 + FT245_PowerEnable_n : in std_logic; + FT245_Read_n : out std_logic; + FT245_Write_n : out std_logic; + FT245_Data : inout std_logic_vector(7 downto 0); + FT245_RXF_n : in std_logic; + FT245_TXE_n : in std_logic ); end component; diff --git a/src/io/uart/uart_BitClock.vhdl b/src/io/uart/uart_BitClock.vhdl new file mode 100644 index 000000000..443a0d1a7 --- /dev/null +++ b/src/io/uart/uart_BitClock.vhdl @@ -0,0 +1,104 @@ +-- ============================================================================= +-- Authors: Martin Zabel +-- Patrick Lehmann +-- +-- Entity: UART bit clock / baud rate generator +-- +-- Description: +-- ------------------------------------- +-- .. TODO:: No documentation available. +-- +-- old comments: +-- :abbr:`UART (Universal Asynchronous Receiver Transmitter)` BAUD rate generator +-- bclk_r = bit clock is rising +-- bclk_x8_r = bit clock times 8 is rising +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2008-2015 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.utils.all; +use work.strings.all; +use work.physical.all; +use work.components.all; +use work.uart.all; + + +entity uart_BitClock is + generic ( + CLOCK_FREQ : FREQ := 100 MHz; -- XXX: FREQ and BAUD ? + BAUDRATE : BAUD := 115200 Bd; -- FIXME: add oversampling factor + OVERSAMPLING_RATE : positive := 8 + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + + BitClock : out std_logic; + SampleClock : out std_logic + ); +end entity; + + +architecture rtl of uart_BitClock is + constant TIME_UNIT_INTERVAL : T_TIME := 1.0 / (to_real(BAUDRATE, 1 Bd) * real(OVERSAMPLING_RATE)); + constant BAUDRATE_COUNTER_MAX : positive := TimingToCycles(TIME_UNIT_INTERVAL, CLOCK_FREQ); + constant BAUDRATE_COUNTER_BITS : positive := log2ceilnz(BAUDRATE_COUNTER_MAX + 1); + + -- registers + signal x8_cnt : unsigned(BAUDRATE_COUNTER_BITS - 1 downto 0) := (others => '0'); + signal x1_cnt : unsigned(2 downto 0) := (others => '0'); + + -- control signals + signal x8_cnt_done : std_logic; + signal x1_cnt_done : std_logic; + + signal bclk_r : std_logic := '0'; + signal bclk_x8_r : std_logic := '0'; +begin + assert FALSE -- LF works in QuartusII + report "uart_BitClock:" & LF & + " CLOCK_FREQ=" & to_string(CLOCK_FREQ, 3) & LF & + " BAUDRATE=" & to_string(BAUDRATE, 3) & LF & + " COUNTER_MAX=" & integer'image(BAUDRATE_COUNTER_MAX) & LF & + " COUNTER_BITS=" & integer'image(BAUDRATE_COUNTER_BITS) + severity NOTE; + + assert io_UART_IsTypicalBaudRate(BAUDRATE) + report "The baudrate " & to_string(BAUDRATE, 3) & " is not known to be a typical baudrate!" + severity WARNING; + + x8_cnt <= upcounter_next(cnt => x8_cnt, rst => (Reset or x8_cnt_done)) when rising_edge(Clock); + x8_cnt_done <= upcounter_equal(cnt => x8_cnt, value => BAUDRATE_COUNTER_MAX - 1); + + x1_cnt <= upcounter_next(cnt => x1_cnt, rst => Reset, en => x8_cnt_done) when rising_edge(Clock); + x1_cnt_done <= comp_allzero(x1_cnt); + + -- outputs + -- --------------------------------------------------------------------------- + -- only x8_cnt_done is pulsed for one clock cycle! + bclk_r <= (x1_cnt_done and x8_cnt_done) when rising_edge(Clock); + bclk_x8_r <= x8_cnt_done when rising_edge(Clock); + + BitClock <= bclk_r; + SampleClock <= bclk_x8_r; +end architecture; diff --git a/src/io/uart/uart_fifo.vhdl b/src/io/uart/uart_FIFO.vhdl similarity index 78% rename from src/io/uart/uart_fifo.vhdl rename to src/io/uart/uart_FIFO.vhdl index fdd2119b7..4c42501ee 100644 --- a/src/io/uart/uart_fifo.vhdl +++ b/src/io/uart/uart_FIFO.vhdl @@ -49,7 +49,7 @@ use work.utils.all; use work.uart.all; -entity uart_fifo is +entity uart_FIFO is generic ( -- Communication Parameters CLOCK_FREQ : FREQ; @@ -61,7 +61,7 @@ entity uart_fifo is -- Buffer Dimensioning TX_MIN_DEPTH : positive := 16; - TX_ESTATE_BITS : natural := 0; + TX_ESTATE_BITS : natural := 0; -- XXX: adjust to FIFO naming RX_MIN_DEPTH : positive := 16; RX_FSTATE_BITS : natural := 0; @@ -69,43 +69,42 @@ entity uart_fifo is FLOWCTRL_XOFF_THRESHOLD : real := 0.75; -- Flow Control - FLOWCONTROL : T_IO_UART_FLOWCONTROL_KIND := UART_FLOWCONTROL_NONE; + FLOWCONTROL : T_UART_FLOWCONTROL_KIND := UART_FLOWCONTROL_NONE; SWFC_XON_CHAR : std_logic_vector(7 downto 0) := x"11"; -- ^Q SWFC_XOFF_CHAR : std_logic_vector(7 downto 0) := x"13" -- ^S - ); port ( Clock : in std_logic; Reset : in std_logic; -- FIFO interface - TX_put : in std_logic; - TX_Data : in std_logic_vector(7 downto 0); - TX_Full : out std_logic; - TX_EmptyState : out std_logic_vector(imax(0, TX_ESTATE_BITS-1) downto 0); - TXFIFO_Reset : in std_logic; - TXFIFO_Empty : out std_logic; - - RX_Valid : out std_logic; - RX_Data : out std_logic_vector(7 downto 0); - RX_got : in std_logic; - RX_FullState : out std_logic_vector(imax(0, RX_FSTATE_BITS-1) downto 0); - RX_Overflow : out std_logic; - RXFIFO_Full : out std_logic; - RXFIFO_Reset : in std_logic; + TX_Put : in std_logic; + TX_Data : in std_logic_vector(7 downto 0); + TX_Full : out std_logic; + TX_EmptyState : out std_logic_vector(imax(0, TX_ESTATE_BITS-1) downto 0); + TXFIFO_Reset : in std_logic; + TXFIFO_Empty : out std_logic; + + RX_Valid : out std_logic; + RX_Data : out std_logic_vector(7 downto 0); + RX_Got : in std_logic; + RX_FullState : out std_logic_vector(imax(0, RX_FSTATE_BITS-1) downto 0); -- XXX: FullState or FillState ? + RX_Overflow : out std_logic; + RXFIFO_Full : out std_logic; + RXFIFO_Reset : in std_logic; -- External pins - UART_TX : out std_logic; - UART_RX : in std_logic; - UART_RTS : out std_logic; - UART_CTS : in std_logic; - UART_parity_error : out std_logic + UART_TX : out std_logic; + UART_RX : in std_logic; + UART_RTS : out std_logic; + UART_CTS : in std_logic; + UART_ParityError : out std_logic ); end entity; -architecture rtl of uart_fifo is +architecture rtl of uart_FIFO is signal FC_TX_Strobe : std_logic; signal FC_TX_Data : T_SLV_8; @@ -132,7 +131,7 @@ architecture rtl of uart_fifo is signal UART_RX_sync : std_logic; begin - assert FALSE report "uart_fifo: BAUDRATE=: " & to_string(BAUDRATE, 3) severity NOTE; + assert FALSE report "uart_FIFO: BAUDRATE=: " & to_string(BAUDRATE, 3) severity NOTE; -- =========================================================================== @@ -140,50 +139,50 @@ begin -- =========================================================================== TXFIFO : entity work.fifo_cc_got generic map ( - D_BITS => 8, -- Data Width + DATA_BITS => 8, -- Data Width MIN_DEPTH => TX_MIN_DEPTH, -- Minimum FIFO Depth DATA_REG => TRUE, -- Store Data Content in Registers STATE_REG => FALSE, -- Registered Full/Empty Indicators OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => TX_ESTATE_BITS, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + EMPTY_STATE_BITS => TX_ESTATE_BITS, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) port map ( - rst => Reset or TXFIFO_Reset, - clk => Clock, - put => TX_put, - din => TX_Data, - full => TX_Full, - estate_wr => TX_EmptyState, - - valid => TXFIFO_Valid, - dout => TXFIFO_Data, - got => FC_TX_got, - fstate_rd => open + Reset => Reset or TXFIFO_Reset, + Clock => Clock, + Put => TX_Put, + DataIn => TX_Data, + Full => TX_Full, + EmptyState => TX_EmptyState, + + Valid => TXFIFO_Valid, + DataOut => TXFIFO_Data, + Got => FC_TX_got, + FillState => open ); RXFIFO : entity work.fifo_cc_got generic map ( - D_BITS => 8, -- Data Width + DATA_BITS => 8, -- Data Width MIN_DEPTH => RX_MIN_DEPTH, -- Minimum FIFO Depth DATA_REG => TRUE, -- Store Data Content in Registers STATE_REG => FALSE, -- Registered Full/Empty Indicators OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => RX_FSTATE_BITS -- Full State Bits + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => RX_FSTATE_BITS -- Full State Bits ) port map ( - rst => Reset or RXFIFO_Reset, - clk => Clock, - put => FC_RX_put, - din => FC_RX_Data, - full => RXFIFO_Full_int, - estate_wr => open, - - valid => RX_Valid, - dout => RX_Data, - got => RX_got, - fstate_rd => RX_FullState_int + Reset => Reset or RXFIFO_Reset, + Clock => Clock, + Put => FC_RX_put, + DataIn => FC_RX_Data, + Full => RXFIFO_Full_int, + EmptyState => open, + + Valid => RX_Valid, + DataOut => RX_Data, + Got => RX_Got, + FillState => RX_FullState_int ); RXFIFO_Full <= RXFIFO_Full_int; @@ -239,8 +238,8 @@ begin discard_user_rx <= '1' when (RXUART_Data = SWFC_XON_CHAR) or (RXUART_Data = SWFC_XOFF_CHAR) else '0'; -- tx / tf control FC_TX_Data <= SWFC_XOFF_CHAR when (send_xoff = '1') else - SWFC_XON_CHAR when (send_xon = '1') else - TXFIFO_Data; + SWFC_XON_CHAR when (send_xon = '1') else + TXFIFO_Data; FC_TX_Strobe <= send_xoff or send_xon or (TXFIFO_Valid and transmit_enable and (not discard_user_tx)) ; FC_TX_got <= (send_xoff nor send_xon) and TXFIFO_Valid and (not TXUART_Full); -- always check TXFIFO_Valid @@ -309,7 +308,7 @@ begin genHWFC2 : if FLOWCONTROL = UART_FLOWCONTROL_RTR_CTS generate begin - assert false report"FLOWCONTROL=" & T_IO_UART_FLOWCONTROL_KIND'image(FLOWCONTROL) & " is currently not supported!" severity failure; + assert false report"FLOWCONTROL=" & T_UART_FLOWCONTROL_KIND'image(FLOWCONTROL) & " is currently not supported!" severity failure; end generate; -- =========================================================================== @@ -320,6 +319,9 @@ begin end generate; genSync : if ADD_INPUT_SYNCHRONIZERS generate sync_i : entity work.sync_Bits + generic map ( + INIT => "1" + ) port map ( Clock => Clock, -- Clock to be synchronized to Input(0) => UART_RX, -- Data to be synchronized @@ -329,46 +331,46 @@ begin -- =========================================================================== -- BitClock, Transmitter, Receiver -- =========================================================================== - bclk : entity work.uart_bclk + bclk : entity work.uart_BitClock generic map ( CLOCK_FREQ => CLOCK_FREQ, BAUDRATE => BAUDRATE ) port map ( - clk => Clock, - rst => Reset, - bclk => BitClock, - bclk_x8 => BitClock_x8 + Clock => Clock, + Reset => Reset, + BitClock => BitClock, + SampleClock => BitClock_x8 ); - TX : entity work.uart_tx + TX : entity work.uart_TX generic map ( PARITY => PARITY ) port map ( - clk => Clock, - rst => Reset, - bclk => BitClock, - tx => UART_TX, - di => FC_TX_Data, - put => FC_TX_Strobe, - ful => TXUART_Full + Clock => Clock, + Reset => Reset, + BitClock => BitClock, + TX => UART_TX, + DataIn => FC_TX_Data, + Put => FC_TX_Strobe, + Full => TXUART_Full ); - RX : entity work.uart_rx + RX : entity work.uart_RX generic map ( PARITY => PARITY, PARITY_ERROR_HANDLING => PARITY_ERROR_HANDLING, PARITY_ERROR_IDENTIFIER => PARITY_ERROR_IDENTIFIER ) port map ( - clk => Clock, - rst => Reset, - bclk_x8 => BitClock_x8, - rx => UART_RX_sync, - do => RXUART_Data, - stb => RXUART_Strobe, - parity_error => UART_parity_error + Clock => Clock, + Reset => Reset, + SampleClock => BitClock_x8, + RX => UART_RX_sync, + DataOut => RXUART_Data, + Strobe => RXUART_Strobe, + ParityError => UART_ParityError ); end architecture; diff --git a/src/io/uart/uart_FT245.vhdl b/src/io/uart/uart_FT245.vhdl new file mode 100644 index 000000000..1b1052b35 --- /dev/null +++ b/src/io/uart/uart_FT245.vhdl @@ -0,0 +1,258 @@ +-- ============================================================================= +-- Authors: Peter Reichel +-- Jan Schirok +-- Steffen Koehler +-- +-- Entity: UART controller for FTDI FT245M UART-over-USB converter. +-- +-- Description: +-- ------------ +-- .. TODO:: No documentation available. +-- +-- License: +-- ============================================================================= +-- Copyright 2008-2015 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + + +library IEEE; +use IEEE.std_logic_1164.all; + +entity uart_FT245 is + generic ( + CLOCK_FREQ : positive -- XXX: use FREQ + ); + port ( + -- common signals + Clock : in std_logic; + Reset : in std_logic; + + -- send data + snd_ready : out std_logic; -- XXX: this should fit the FIFO interface + snd_strobe : in std_logic; + snd_data : in std_logic_vector(7 downto 0); + + -- receive data + rec_strobe : out std_logic; + rec_data : out std_logic_vector(7 downto 0); + + -- connection to ft245 + ft245_data : inout std_logic_vector(7 downto 0); + ft245_rdn : out std_logic; + ft245_wrn : out std_logic; + ft245_rxfn : in std_logic; + ft245_txen : in std_logic; + ft245_pwrenn : in std_logic + ); +end entity; + + +library IEEE; +use IEEE.numeric_std.all; + +use work.utils.all; + +architecture rtl of uart_FT245 is + + -- clock frequency (MHz) + constant CLK_FREQ_MHZ : integer := CLOCK_FREQ / 1000000; + + -- FT245 communication delay cycles (minimum delay is 50 ns = 1/20 us) + constant DELAY_CYCLES : integer := CLK_FREQ_MHZ / 20; + + -- delay register width + constant DELAY_WIDTH : integer := log2ceilnz(DELAY_CYCLES + 1); + + -- delay register load value + constant DELAY_LOAD : unsigned(DELAY_WIDTH-1 downto 0) := + to_unsigned(DELAY_CYCLES, DELAY_WIDTH); + + -- delay register + signal reg_delay : unsigned(DELAY_WIDTH-1 downto 0); + + -- FSM + type tState is ( IDLE, RD1, RD2, RD3, RD4, WR1, WR2, WR3, WR4 ); + signal fsm_state : tState := IDLE; + signal fsm_nextstate : tState; + + -- registers + signal reg_data_snd : std_logic_vector(7 downto 0); + signal reg_data_rec : std_logic_vector(7 downto 0); + signal reg_ld_rec : std_logic; + signal reg_dto_b : std_logic := '1'; -- low-active + signal reg_wr_b : std_logic := '1'; -- low-active + signal reg_rd_b : std_logic := '1'; -- low-active + + signal ff_susp : std_logic := '1'; -- low-active + signal ff_rxf : std_logic := '1'; -- low-active + signal ff_txe : std_logic := '1'; -- low-active + + -- control signals + signal ctrl_ld_rec : std_logic; + signal ctrl_delay : std_logic; + signal ctrl_rd : std_logic; + signal ctrl_wr : std_logic; + signal ctrl_dto : std_logic; + + signal data_in : std_logic_vector(7 downto 0); + +begin + ---------------------------------------------- + -- Synchronize Inputs + process(Clock) + begin + if rising_edge(Clock) then + if Reset = '1' then + -- Neutral PowerUp / Reset + ff_susp <= '1'; + ff_rxf <= '1'; + ff_txe <= '1'; + else + -- Wait for Initilization to Complete + ff_susp <= ft245_pwrenn; + + -- Now forward Fill Signals + ff_rxf <= ft245_rxfn; + ff_txe <= ft245_txen; + end if; + end if; + end process; + + process(fsm_state, snd_strobe, reg_delay, ff_susp, ff_rxf, ff_txe) + begin + fsm_nextstate <= fsm_state; + ctrl_ld_rec <= '0'; + ctrl_rd <= '0'; + ctrl_wr <= '0'; + ctrl_dto <= '0'; + ctrl_delay <= '0'; + + case fsm_state is + when IDLE => + if ff_susp = '0' then + if ff_rxf = '0' then + -- receive data + fsm_nextstate <= RD1; + elsif ff_txe = '0' and snd_strobe = '1' then + -- ok, send... + fsm_nextstate <= WR1; + end if; + end if; + when RD1 => + -- load delay counter + ctrl_rd <= '1'; + ctrl_delay <= '1'; + fsm_nextstate <= RD2; + when RD2 => + -- wait until delay counter has expired + ctrl_rd <= '1'; + if reg_delay = 0 then + fsm_nextstate <= RD3; + end if; + when RD3 => + -- data is valid now => load + ctrl_rd <= '1'; + ctrl_ld_rec <= '1'; + -- load delay counter again + ctrl_delay <= '1'; + fsm_nextstate <= RD4; + when RD4 => + -- wait until delay counter has expired + if reg_delay = 0 then + fsm_nextstate <= IDLE; + end if; + + when WR1 => + -- load delay counter + ctrl_dto <= '1'; + ctrl_delay <= '1'; + fsm_nextstate <= WR2; + when WR2 => + -- set wr (active pulse) + ctrl_dto <= '1'; + ctrl_wr <= '1'; + -- wait until delay counter has expired + if reg_delay = 0 then + fsm_nextstate <= WR3; + end if; + when WR3 => + -- clear wr (pre-charge time) + ctrl_dto <= '1'; + -- load delay counter again + ctrl_delay <= '1'; + fsm_nextstate <= WR4; + when WR4 => + -- wait until delay counter has expired + if reg_delay = 0 then + fsm_nextstate <= IDLE; + end if; + end case; + end process; + + ---------------------------------------------- + -- registers + process(Clock) + begin + if rising_edge(Clock) then + + -- control signals + if Reset = '1' then + fsm_state <= IDLE; + reg_rd_b <= '1'; + reg_wr_b <= '1'; + reg_dto_b <= '1'; + reg_ld_rec <= '0'; + else + fsm_state <= fsm_nextstate; + reg_rd_b <= not ctrl_rd; + reg_wr_b <= not ctrl_wr; + reg_dto_b <= not ctrl_dto; + reg_ld_rec <= ctrl_ld_rec; + end if; + + -- delay counter + if ctrl_delay = '1' then + reg_delay <= DELAY_LOAD; + else + reg_delay <= reg_delay - 1; + end if; + + -- received data + if ctrl_ld_rec = '1' then + reg_data_rec <= data_in; + end if; + + -- data to send + if snd_strobe = '1' then + reg_data_snd <= snd_data; + end if; + + end if; + end process; + + ---------------------------------------------- + -- tristate driver and output assignments + ft245_data <= reg_data_snd when reg_dto_b = '0' else (others => 'Z'); + data_in <= ft245_data; + + ft245_rdn <= reg_rd_b; + ft245_wrn <= reg_wr_b; + + rec_data <= reg_data_rec; + rec_strobe <= reg_ld_rec; + snd_ready <= ff_rxf and not ff_txe and not ff_susp when fsm_state = IDLE else '0'; + +end architecture; diff --git a/src/io/uart/uart_rx.vhdl b/src/io/uart/uart_RX.vhdl similarity index 66% rename from src/io/uart/uart_rx.vhdl rename to src/io/uart/uart_RX.vhdl index 1756e86eb..3c0311306 100644 --- a/src/io/uart/uart_rx.vhdl +++ b/src/io/uart/uart_RX.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= -- Authors: Thomas B. Preusser -- --- Entity: Universal Asynchronous Receiver Transmitter (UART) - Receiver +-- Entity: Universal Asynchronous Receiver Transmitter (UART) - Receiver -- -- Description: -- ------------------------------------- @@ -10,18 +10,19 @@ -- with odd parity the frame will be 0 + 01100010 + 0 + 1 -- with no parity the frame will be 0 + 01100010 + 1 -- 8 bits of data |(count of 1-bits)| 8 bits including parity --- | | even odd --- 00000000 | 0 | 000000000 000000001 --- 10100010 | 3 | 101000101 101000100 --- 11010010 | 4 | 110100100 110100101 --- 11111110 | 7 | 111111101 111111100 --- When parity error occured, --- if PARITY_ERROR_HANDLING = PASSTHROUGH_ERROR_BYTE then error byte passed to FIFO --- = REPLACE_ERROR_BYTE then error byte will replaced with PARITY_ERROR_IDENTIFIER which is generic --- = DROP_ERROR_BYTE then error byte will be dropped +-- | | even odd +-- 00000000 | 0 | 000000000 000000001 +-- 10100010 | 3 | 101000101 101000100 +-- 11010010 | 4 | 110100100 110100101 +-- 11111110 | 7 | 111111101 111111100 +-- When parity error occured, +-- if PARITY_ERROR_HANDLING = PASSTHROUGH_ERROR_BYTE then error byte passed to FIFO +-- = REPLACE_ERROR_BYTE then error byte will replaced with PARITY_ERROR_IDENTIFIER which is generic +-- = DROP_ERROR_BYTE then error byte will be dropped -- and all three scenarios, error flag will be raised. -- License: -- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors -- Copyright 2008-2016 Technische Universitaet Dresden - Germany -- Chair of VLSI-Design, Diagnostics and Architecture -- @@ -38,37 +39,38 @@ -- limitations under the License. -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use work.uart.all; -entity uart_rx is +entity uart_RX is generic ( SYNC_DEPTH : natural := 2; -- use zero for already clock-synchronous rx PARITY : T_UART_PARITY_MODE := PARITY_NONE; --PARITY_EVEN, PARITY_ODD, PARITY_NONE PARITY_ERROR_HANDLING : T_UART_PARITY_ERROR_HANDLING := PASSTHROUGH_ERROR_BYTE; --PASSTHROUGH_ERROR_BYTE,REPLACE_ERROR_BYTE PARITY_ERROR_IDENTIFIER : std_logic_vector(7 downto 0) := x"15" -- ^NAK + -- FIXME: oversampling rate ); port ( -- Global Control - clk : in std_logic; - rst : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- Bit Clock and RX Line - bclk_x8 : in std_logic; -- bit clock, eight strobes per bit length - rx : in std_logic; + SampleClock : in std_logic; -- bit clock, eight strobes per bit length + RX : in std_logic; -- Byte Stream Output - do : out std_logic_vector(7 downto 0); - stb : out std_logic; - parity_error : out std_logic + DataOut : out std_logic_vector(7 downto 0); + Strobe : out std_logic; + ParityError : out std_logic ); end entity; -architecture rtl of uart_rx is +architecture rtl of uart_RX is -- RX Synchronization signal rxs : std_logic; @@ -87,23 +89,23 @@ architecture rtl of uart_rx is signal parity_bit_cal : std_logic := '0'; signal parity_bit : std_logic := '0'; signal parity_error_flag : std_logic := '0'; - begin - -- Input synchronization + -- Input synchronization sync : entity work.sync_Bits generic map ( - INIT => (SYNC_DEPTH - 1 downto 0 => '1'), -- initialitation bits - SYNC_DEPTH => SYNC_DEPTH -- generate SYNC_DEPTH many stages, at least 2 + INIT => (SYNC_DEPTH - 1 downto 0 => '1'), -- initialitation bits + SYNC_DEPTH => SYNC_DEPTH -- generate SYNC_DEPTH many stages, at least 2 ) port map ( - Clock => clk, -- output clock domain - Input(0) => rx, -- @async: input bits - Output(0) => rxs -- @Clock: output bits + Clock => Clock, -- output clock domain + Input(0) => RX, -- @async: input bits + Output(0) => rxs -- @Clock: output bits ); + paritycal: process(Buf) - begin - case PARITY is + begin + case PARITY is when PARITY_EVEN => -- Even parity: parity_bit_cal is '1' if the number of '1's in data is odd (to make total even) parity_bit_cal <= xor(Buf(9 downto 2)); @@ -115,13 +117,14 @@ begin parity_bit_cal <= '0'; end case; end process; + -- Reception state - process(clk) + process(Clock) begin - if rising_edge(clk) then + if rising_edge(Clock) then Vld <= '0'; parity_error_flag <= '0'; - if rst = '1' then + if Reset = '1' then Buf <= (0 => '0', others => '-'); Cnt <= (others => '-'); else @@ -135,14 +138,14 @@ begin Buf <= (0 => '0', others => '-'); Cnt <= (others => '-'); end if; - elsif bclk_x8 = '1' then + elsif SampleClock = '1' then parity_bit <= Buf(10); - if Cnt(Cnt'left) = '1' then - Buf <= rxs & Buf(Buf'left downto 1); - if PARITY = PARITY_NONE then - Vld <= rxs and not Buf(2); - elsif Buf(1) = '0' then - if parity_bit /= parity_bit_cal then + if Cnt(Cnt'left) = '1' then + Buf <= rxs & Buf(Buf'left downto 1); + if PARITY = PARITY_NONE then + Vld <= rxs and not Buf(2); + elsif Buf(1) = '0' then + if parity_bit /= parity_bit_cal then parity_error_flag <= '1'; end if; Vld <= rxs; @@ -156,26 +159,26 @@ begin -- Outputs ouput:process(all) - begin - if PARITY = PARITY_NONE then - do <= Buf(9 downto 2); - stb <= Vld; - elsif parity_error_flag = '1' then - if PARITY_ERROR_HANDLING = DROP_ERROR_BYTE then - do <= Buf(8 downto 1); - stb <= '0'; - elsif PARITY_ERROR_HANDLING = PASSTHROUGH_ERROR_BYTE then - do <= Buf(8 downto 1); - stb <= Vld; - elsif PARITY_ERROR_HANDLING = REPLACE_ERROR_BYTE then - do <= PARITY_ERROR_IDENTIFIER; - stb <= Vld; - end if; - else - do <= Buf(8 downto 1); - stb <= Vld and not parity_error_flag; + begin + if PARITY = PARITY_NONE then + DataOut <= Buf(9 downto 2); + Strobe <= Vld; + elsif parity_error_flag = '1' then + if PARITY_ERROR_HANDLING = DROP_ERROR_BYTE then + DataOut <= Buf(8 downto 1); + Strobe <= '0'; + elsif PARITY_ERROR_HANDLING = PASSTHROUGH_ERROR_BYTE then + DataOut <= Buf(8 downto 1); + Strobe <= Vld; + elsif PARITY_ERROR_HANDLING = REPLACE_ERROR_BYTE then + DataOut <= PARITY_ERROR_IDENTIFIER; + Strobe <= Vld; end if; - end process; - parity_error <= parity_error_flag; + else + DataOut <= Buf(8 downto 1); + Strobe <= Vld and not parity_error_flag; + end if; + end process; + ParityError <= parity_error_flag; end architecture; diff --git a/src/io/uart/uart_tx.vhdl b/src/io/uart/uart_TX.vhdl similarity index 70% rename from src/io/uart/uart_tx.vhdl rename to src/io/uart/uart_TX.vhdl index 1ea1f53e4..00f90568d 100644 --- a/src/io/uart/uart_tx.vhdl +++ b/src/io/uart/uart_TX.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Thomas B. Preusser +-- Authors: Thomas B. Preusser -- --- Entity: Universal Asynchronous Receiver Transmitter (UART) - Transmitter +-- Entity: Universal Asynchronous Receiver Transmitter (UART) - Transmitter -- -- Description: -- ------------------------------------- @@ -11,11 +11,11 @@ -- with odd parity the frame will be 0 + 01100010 + 0 + 1 -- with no parity the frame will be 0 + 01100010 + 1 -- 8 bits of data |(count of 1-bits)| 8 bits including parity --- | | even odd --- 00000000 | 0 | 000000000 000000001 --- 10100010 | 3 | 101000101 101000100 --- 11010010 | 4 | 110100100 110100101 --- 11111110 | 7 | 111111101 111111100 +-- | | even odd +-- 00000000 | 0 | 000000000 000000001 +-- 10100010 | 3 | 101000101 101000100 +-- 11010010 | 4 | 110100100 110100101 +-- 11111110 | 7 | 111111101 111111100 -- -- License: -- ============================================================================= @@ -35,77 +35,77 @@ -- limitations under the License. -- ============================================================================= -library IEEE; -use IEEE.std_logic_1164.all; +library IEEE; +use IEEE.std_logic_1164.all; use work.uart.all; -entity uart_tx is +entity uart_TX is generic( PARITY : T_UART_PARITY_MODE := PARITY_NONE --PARITY_EVEN, PARITY_ODD,PARITY_NONE ); port ( -- Global Control - clk : in std_logic; - rst : in std_logic; - + Clock : in std_logic; + Reset : in std_logic; + -- Bit Clock and TX Line - bclk : in std_logic; -- bit clock, one strobe each bit length - tx : out std_logic; - + BitClock : in std_logic; -- bit clock, one strobe each bit length + TX : out std_logic; + -- Byte Stream Input - di : in std_logic_vector(7 downto 0); - put : in std_logic; - ful : out std_logic + Put : in std_logic; + DataIn : in std_logic_vector(7 downto 0); + Full : out std_logic ); end entity; library IEEE; -use IEEE.numeric_std.all; +use IEEE.numeric_std.all; -architecture rtl of uart_tx is +architecture rtl of uart_TX is -- Buf Cnt -- Idle "----------1" "0----" -- Start "1hgfedcba01" -10 -- Send "11111hgfedc" -10 -> -1 -- Done "11111111111" 0 - + signal Buf : std_logic_vector(10 downto 0) := (0 => '1', others => '-'); signal Cnt : signed(4 downto 0) := "0----"; signal parity_bit : std_logic; begin - paritycal:process(di) + paritycal:process(DataIn) begin case PARITY is when PARITY_EVEN => -- Even parity: parity_bit is '1' if the number of '1's in di is odd (to make total even) - parity_bit <= xor(di); + parity_bit <= xor(DataIn); when PARITY_ODD => -- Odd parity: parity_bit is '1' if the number of '1's in di is even (to make total odd) - parity_bit <= not (xor(di)); + parity_bit <= not (xor(DataIn)); when others => -- No parity (PARITY = "NONE"): parity_bit not used parity_bit <= '0'; end case; end process; - - process(clk) + + process(Clock) begin - if rising_edge(clk) then - if rst = '1' then + if rising_edge(Clock) then + if Reset = '1' then Buf <= (0 => '1', others => '-'); Cnt <= "0----"; else if Cnt(Cnt'left) = '0' then -- Idle - if put = '1' then -- Start Transmission - if PARITY = PARITY_NONE then - Buf <= "1" & di & "01"; + if Put = '1' then -- Start Transmission + if PARITY = PARITY_NONE then + Buf <= "1" & DataIn & "01"; Cnt <= to_signed(-10, Cnt'length); else - Buf <= parity_bit & di & "01"; + Buf <= parity_bit & DataIn & "01"; Cnt <= to_signed(-11, Cnt'length); end if; else @@ -113,7 +113,7 @@ begin Cnt <= "0----"; end if; else -- Transmitting - if bclk = '1' then + if BitClock = '1' then Buf <= '1' & Buf(Buf'left downto 1); Cnt <= Cnt + 1; end if; @@ -121,6 +121,6 @@ begin end if; end if; end process; - tx <= Buf(0); - ful <= Cnt(Cnt'left); -end; + TX <= Buf(0); + Full <= Cnt(Cnt'left); +end architecture; diff --git a/src/io/uart/uart_bclk.vhdl b/src/io/uart/uart_bclk.vhdl deleted file mode 100644 index 7dbeb1553..000000000 --- a/src/io/uart/uart_bclk.vhdl +++ /dev/null @@ -1,103 +0,0 @@ --- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann --- --- Entity: UART bit clock / baud rate generator --- --- Description: --- ------------------------------------- --- .. TODO:: No documentation available. --- --- old comments: --- :abbr:`UART (Universal Asynchronous Receiver Transmitter)` BAUD rate generator --- bclk_r = bit clock is rising --- bclk_x8_r = bit clock times 8 is rising --- --- --- License: --- ============================================================================= --- Copyright 2008-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -use work.utils.all; -use work.strings.all; -use work.physical.all; -use work.components.all; -use work.uart.all; - - -entity uart_bclk is - generic ( - CLOCK_FREQ : FREQ := 100 MHz; - BAUDRATE : BAUD := 115200 Bd - ); - port ( - clk : in std_logic; - rst : in std_logic; - bclk : out std_logic; - bclk_x8 : out std_logic - ); -end entity; - - -architecture rtl of uart_bclk is - constant UART_OVERSAMPLING_RATE : positive := 8; - constant TIME_UNIT_INTERVAL : T_TIME := 1.0 / (to_real(BAUDRATE, 1 Bd) * real(UART_OVERSAMPLING_RATE)); - constant BAUDRATE_COUNTER_MAX : positive := TimingToCycles(TIME_UNIT_INTERVAL, CLOCK_FREQ); - constant BAUDRATE_COUNTER_BITS : positive := log2ceilnz(BAUDRATE_COUNTER_MAX + 1); - - -- registers - signal x8_cnt : unsigned(BAUDRATE_COUNTER_BITS - 1 downto 0) := (others => '0'); - signal x1_cnt : unsigned(2 downto 0) := (others => '0'); - - -- control signals - signal x8_cnt_done : std_logic; - signal x1_cnt_done : std_logic; - - signal bclk_r : std_logic := '0'; - signal bclk_x8_r : std_logic := '0'; -begin - assert FALSE -- LF works in QuartusII - report "uart_bclk:" & LF & - " CLOCK_FREQ=" & to_string(CLOCK_FREQ, 3) & LF & - " BAUDRATE=" & to_string(BAUDRATE, 3) & LF & - " COUNTER_MAX=" & integer'image(BAUDRATE_COUNTER_MAX) & LF & - " COUNTER_BITS=" & integer'image(BAUDRATE_COUNTER_BITS) - severity NOTE; - - assert io_UART_IsTypicalBaudRate(BAUDRATE) - report "The baudrate " & to_string(BAUDRATE, 3) & " is not known to be a typical baudrate!" - severity WARNING; - - x8_cnt <= upcounter_next(cnt => x8_cnt, rst => (rst or x8_cnt_done)) when rising_edge(clk); - x8_cnt_done <= upcounter_equal(cnt => x8_cnt, value => BAUDRATE_COUNTER_MAX - 1); - - x1_cnt <= upcounter_next(cnt => x1_cnt, rst => rst, en => x8_cnt_done) when rising_edge(clk); - x1_cnt_done <= comp_allzero(x1_cnt); - - -- outputs - -- --------------------------------------------------------------------------- - -- only x8_cnt_done is pulsed for one clock cycle! - bclk_r <= (x1_cnt_done and x8_cnt_done) when rising_edge(clk); - bclk_x8_r <= x8_cnt_done when rising_edge(clk); - - bclk <= bclk_r; - bclk_x8 <= bclk_x8_r; -end; diff --git a/src/io/uart/uart_ft245.vhdl b/src/io/uart/uart_ft245.vhdl deleted file mode 100644 index 8b8d0c0f2..000000000 --- a/src/io/uart/uart_ft245.vhdl +++ /dev/null @@ -1,259 +0,0 @@ --- ============================================================================= --- Authors: Peter Reichel --- Jan Schirok --- Steffen Koehler --- --- Entity: UART controller for FTDI FT245M UART-over-USB converter. --- --- Description: --- ------------ --- .. TODO:: No documentation available. --- --- License: --- ============================================================================= --- Copyright 2008-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -library IEEE; -use IEEE.std_logic_1164.all; - -entity uart_ft245 is - generic ( - CLK_FREQ : positive - ); - port ( - -- common signals - clk : in std_logic; - rst : in std_logic; - - -- send data - snd_ready : out std_logic; - snd_strobe : in std_logic; - snd_data : in std_logic_vector(7 downto 0); - - -- receive data - rec_strobe : out std_logic; - rec_data : out std_logic_vector(7 downto 0); - - -- connection to ft245 - ft245_data : inout std_logic_vector(7 downto 0); - ft245_rdn : out std_logic; - ft245_wrn : out std_logic; - ft245_rxfn : in std_logic; - ft245_txen : in std_logic; - ft245_pwrenn : in std_logic - ); -end entity; - - -library IEEE; -use IEEE.numeric_std.all; - -use work.utils.all; - -architecture rtl of uart_ft245 is - - -- clock frequency (MHz) - constant CLK_FREQ_MHZ : integer := CLK_FREQ / 1000000; - - -- FT245 communication delay cycles (minimum delay is 50 ns = 1/20 us) - constant DELAY_CYCLES : integer := CLK_FREQ_MHZ / 20; - - -- delay register width - constant DELAY_WIDTH : integer := log2ceilnz(DELAY_CYCLES + 1); - - -- delay register load value - constant DELAY_LOAD : unsigned(DELAY_WIDTH-1 downto 0) := - to_unsigned(DELAY_CYCLES, DELAY_WIDTH); - - -- delay register - signal reg_delay : unsigned(DELAY_WIDTH-1 downto 0); - - -- FSM - type tState is ( IDLE, RD1, RD2, RD3, RD4, WR1, WR2, WR3, WR4 ); - signal fsm_state : tState := IDLE; - signal fsm_nextstate : tState; - - -- registers - signal reg_data_snd : std_logic_vector(7 downto 0); - signal reg_data_rec : std_logic_vector(7 downto 0); - signal reg_ld_rec : std_logic; - signal reg_dto_b : std_logic := '1'; -- low-active - signal reg_wr_b : std_logic := '1'; -- low-active - signal reg_rd_b : std_logic := '1'; -- low-active - - signal ff_susp : std_logic := '1'; -- low-active - signal ff_rxf : std_logic := '1'; -- low-active - signal ff_txe : std_logic := '1'; -- low-active - - -- control signals - signal ctrl_ld_rec : std_logic; - signal ctrl_delay : std_logic; - signal ctrl_rd : std_logic; - signal ctrl_wr : std_logic; - signal ctrl_dto : std_logic; - - signal data_in : std_logic_vector(7 downto 0); - -begin - ---------------------------------------------- - -- Synchronize Inputs - process(clk) - begin - if rising_edge(clk) then - if rst = '1' then - -- Neutral PowerUp / Reset - ff_susp <= '1'; - ff_rxf <= '1'; - ff_txe <= '1'; - else - -- Wait for Initilization to Complete - ff_susp <= ft245_pwrenn; - - -- Now forward Fill Signals - ff_rxf <= ft245_rxfn; - ff_txe <= ft245_txen; - end if; - end if; - end process; - - process(fsm_state, snd_strobe, reg_delay, ff_susp, ff_rxf, ff_txe) - begin - fsm_nextstate <= fsm_state; - ctrl_ld_rec <= '0'; - ctrl_rd <= '0'; - ctrl_wr <= '0'; - ctrl_dto <= '0'; - ctrl_delay <= '0'; - - case fsm_state is - when IDLE => - if ff_susp = '0' then - if ff_rxf = '0' then - -- receive data - fsm_nextstate <= RD1; - elsif ff_txe = '0' and snd_strobe = '1' then - -- ok, send... - fsm_nextstate <= WR1; - end if; - end if; - when RD1 => - -- load delay counter - ctrl_rd <= '1'; - ctrl_delay <= '1'; - fsm_nextstate <= RD2; - when RD2 => - -- wait until delay counter has expired - ctrl_rd <= '1'; - if reg_delay = 0 then - fsm_nextstate <= RD3; - end if; - when RD3 => - -- data is valid now => load - ctrl_rd <= '1'; - ctrl_ld_rec <= '1'; - -- load delay counter again - ctrl_delay <= '1'; - fsm_nextstate <= RD4; - when RD4 => - -- wait until delay counter has expired - if reg_delay = 0 then - fsm_nextstate <= IDLE; - end if; - - when WR1 => - -- load delay counter - ctrl_dto <= '1'; - ctrl_delay <= '1'; - fsm_nextstate <= WR2; - when WR2 => - -- set wr (active pulse) - ctrl_dto <= '1'; - ctrl_wr <= '1'; - -- wait until delay counter has expired - if reg_delay = 0 then - fsm_nextstate <= WR3; - end if; - when WR3 => - -- clear wr (pre-charge time) - ctrl_dto <= '1'; - -- load delay counter again - ctrl_delay <= '1'; - fsm_nextstate <= WR4; - when WR4 => - -- wait until delay counter has expired - if reg_delay = 0 then - fsm_nextstate <= IDLE; - end if; - end case; - end process; - - ---------------------------------------------- - -- registers - process(clk) - begin - if rising_edge(clk) then - - -- control signals - if rst = '1' then - fsm_state <= IDLE; - reg_rd_b <= '1'; - reg_wr_b <= '1'; - reg_dto_b <= '1'; - reg_ld_rec <= '0'; - else - fsm_state <= fsm_nextstate; - reg_rd_b <= not ctrl_rd; - reg_wr_b <= not ctrl_wr; - reg_dto_b <= not ctrl_dto; - reg_ld_rec <= ctrl_ld_rec; - end if; - - -- delay counter - if ctrl_delay = '1' then - reg_delay <= DELAY_LOAD; - else - reg_delay <= reg_delay - 1; - end if; - - -- received data - if ctrl_ld_rec = '1' then - reg_data_rec <= data_in; - end if; - - -- data to send - if snd_strobe = '1' then - reg_data_snd <= snd_data; - end if; - - end if; - end process; - - ---------------------------------------------- - -- tristate driver and output assignments - ft245_data <= reg_data_snd when reg_dto_b = '0' else (others => 'Z'); - data_in <= ft245_data; - - ft245_rdn <= reg_rd_b; - ft245_wrn <= reg_wr_b; - - rec_data <= reg_data_rec; - rec_strobe <= reg_ld_rec; - snd_ready <= ff_rxf and not ff_txe and not ff_susp - when fsm_state = IDLE else '0'; - -end rtl; diff --git a/src/list/list_expire.vhdl b/src/list/list_Expire.vhdl similarity index 82% rename from src/list/list_expire.vhdl rename to src/list/list_Expire.vhdl index eb44f5e28..35a976b32 100644 --- a/src/list/list_expire.vhdl +++ b/src/list/list_Expire.vhdl @@ -1,9 +1,5 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================ --- Module: list_expire +-- Module: list_Expire -- -- Authors: Patrick Lehmann -- @@ -36,11 +32,11 @@ USE IEEE.NUMERIC_STD.ALL; use work.utils.ALL; --- list_expire_fixed +-- list_Expire_fixed -- expire = list of expireable items -- fixed = insert_time := current_time + fixed interval -ENTITY list_expire IS +ENTITY list_Expire IS GENERIC ( CLOCK_CYCLE_TICKS : POSITIVE := 1024; EXPIRATION_TIME_TICKS : NATURAL := 10; @@ -62,7 +58,7 @@ ENTITY list_expire IS END ENTITY; -ARCHITECTURE rtl OF list_expire IS +ARCHITECTURE rtl OF list_Expire IS ATTRIBUTE KEEP : BOOLEAN; CONSTANT CLOCK_BITS : POSITIVE := log2ceilnz(CLOCK_CYCLE_TICKS); @@ -102,30 +98,30 @@ BEGIN FIFO : entity work.fifo_cc_got GENERIC MAP ( - D_BITS => CLOCK_BITS + KEY_BITS, -- Data Width + DATA_BITS => CLOCK_BITS + KEY_BITS, -- Data Width MIN_DEPTH => ELEMENTS, -- Minimum FIFO Depth DATA_REG => TRUE, -- Store Data Content in Registers STATE_REG => TRUE, -- Registered Full/Empty Indicators OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) PORT MAP ( -- Global Reset and Clock - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Writing Interface - put => FIFO_put, - din => FIFO_DataIn, - full => OPEN,--FIFO_Full, - estate_wr => OPEN, + Put => FIFO_put, + DataIn => FIFO_DataIn, + Full => OPEN,--FIFO_Full, + EmptyState => OPEN, -- Reading Interface - got => FIFO_got, - dout => FIFO_DataOut, - valid => FIFO_Valid, - fstate_rd => OPEN + Got => FIFO_got, + DataOut => FIFO_DataOut, + Valid => FIFO_Valid, + FillState => OPEN ); FIFO_got <= Expired_i; diff --git a/src/mem/mem.pro b/src/mem/build.pro similarity index 75% rename from src/mem/mem.pro rename to src/mem/build.pro index d68ad319e..283d43769 100644 --- a/src/mem/mem.pro +++ b/src/mem/build.pro @@ -21,21 +21,21 @@ analyze ./mem.pkg.vhdl analyze ./ocram/ocram.pkg.vhdl -analyze ./ocram/ocram_tdp_sim.vhdl -analyze ./ocram/ocram_tdp.vhdl -analyze ./ocram/ocram_esdp.vhdl -analyze ./ocram/ocram_sdp.vhdl -analyze ./ocram/ocram_sdp_optimized.vhdl -analyze ./ocram/ocram_sdp_wf.vhdl -analyze ./ocram/ocram_sp.vhdl -analyze ./ocram/ocram_tdp_wf.vhdl +analyze ./ocram/ocram_TrueDualPort_Simulation.vhdl +analyze ./ocram/ocram_TrueDualPort.vhdl +analyze ./ocram/ocram_TrueDualPort_WriteFirst.vhdl +analyze ./ocram/ocram_EnhancedSimpleDualPort.vhdl +analyze ./ocram/ocram_SimpleDualPort.vhdl +analyze ./ocram/ocram_SimpleDualPort_Optimized.vhdl +analyze ./ocram/ocram_SimpleDualPort_WriteFirst.vhdl +analyze ./ocram/ocram_SinglePort.vhdl if { $::poc::vendorName eq "Xilinx" } { puts "No files for Xilinx." } elseif { $::poc::vendorName eq "Altera" } { - analyze ./ocram/altera/ocram_sp_altera.vhdl - analyze ./ocram/altera/ocram_tdp_altera.vhdl + analyze ./ocram/altera/ocram_SimplePort_Altera.vhdl + analyze ./ocram/altera/ocram_TrueDualPort_Altera.vhdl } elseif { $::poc::vendorName ne "GENERIC" } { puts "Unknown vendor '$::poc::vendorName'!" @@ -43,8 +43,8 @@ if { $::poc::vendorName eq "Xilinx" } { } analyze ./ocrom/ocrom.pkg.vhdl -analyze ./ocrom/ocrom_dp.vhdl -analyze ./ocrom/ocrom_sp.vhdl +analyze ./ocrom/ocrom_DualPort.vhdl +analyze ./ocrom/ocrom_SinglePort.vhdl analyze ./sdram/sdram_ctrl_fsm.vhdl diff --git a/src/mem/lut/lut_Sine.vhdl b/src/mem/lut/lut_Sine.vhdl index b58cb9ca8..68d49735b 100644 --- a/src/mem/lut/lut_Sine.vhdl +++ b/src/mem/lut/lut_Sine.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -35,18 +35,19 @@ use work.strings.all; entity lut_Sine is generic ( - REG_OUTPUT : boolean := TRUE; + OUTPUT_REG : boolean := TRUE; MAX_AMPLITUDE : positive := 255; POINTS : positive := 4096; OFFSET_DEG : REAL := 0.0; QUARTERS : positive := 4 ); port ( - Clock : in std_logic; - Input : in std_logic_vector(log2ceilnz(POINTS) - 1 downto 0); - Output : out std_logic_vector(log2ceilnz(MAX_AMPLITUDE + ((QUARTERS - 1) / 2)) downto 0) + Clock : in std_logic; + Input : in std_logic_vector(log2ceilnz(POINTS) - 1 downto 0); -- XXX: unsigned (offset?) + Output : out std_logic_vector(log2ceilnz(MAX_AMPLITUDE + ((QUARTERS - 1) / 2)) downto 0) -- XXX: unsigned (negative?) ); end entity; + architecture rtl of lut_Sine is signal Output_nxt : std_logic_vector(Output'range); begin @@ -77,7 +78,7 @@ begin Output_nxt <= std_logic_vector(to_unsigned(LUT(to_index(Input, LUT'length)), Output_nxt'length)); end generate; - + -- =========================================================================== -- 2 Qudrant LUT -- =========================================================================== @@ -105,14 +106,14 @@ begin Output_nxt <= std_logic_vector(to_unsigned(LUT(to_index(Input, LUT'length)), Output_nxt'length)); end generate; - + -- =========================================================================== -- 3 Qudrant LUT -> ERROR -- =========================================================================== genQ13 : if QUARTERS = 3 generate assert false report "QUARTERS=3 is not supported." severity FAILURE; end generate; - + -- =========================================================================== -- 4 Qudrant LUT -- =========================================================================== @@ -139,23 +140,23 @@ begin Output_nxt <= std_logic_vector(to_signed(LUT(to_index(Input, LUT'length)), Output_nxt'length)); end generate; - + -- =========================================================================== -- No output registers -- =========================================================================== - genNoReg : if not REG_OUTPUT generate + genNoReg : if not OUTPUT_REG generate -- FIXME: else generate begin Output <= Output_nxt; end generate; - + -- =========================================================================== -- Output registers -- =========================================================================== - genReg : if REG_OUTPUT generate + genReg : if OUTPUT_REG generate signal Output_d : std_logic_vector(Output'range) := (others => '0'); begin Output_d <= Output_nxt when rising_edge(Clock); Output <= Output_d; end generate; -end; +end architecture; diff --git a/src/mem/mem.pkg.vhdl b/src/mem/mem.pkg.vhdl index 7a0fb9a1a..05737b7b1 100644 --- a/src/mem/mem.pkg.vhdl +++ b/src/mem/mem.pkg.vhdl @@ -78,6 +78,11 @@ package mem is ); function mem_FileExtension(Filename : string) return string; + impure function mem_InitMemory( + FilePath : string; + WORDS : positive; + DATA_BITS : positive + ) return T_SLVV; impure function mem_ReadMemoryFile( FileName : string; @@ -89,7 +94,7 @@ package mem is function get_ram_style_string(ram_style : T_RAM_TYPE) return string; function get_ramstyle_string(ram_style : T_RAM_TYPE) return string; - function get_ram_type(a : positive; d : positive) return T_INTVEC; + function get_ram_type(a : positive; d : positive) return integer_vector; function get_BRAM_half_width(a : positive) return integer; function get_BRAM_full_width(a : positive) return integer; @@ -107,6 +112,26 @@ package body mem is return ""; end function; + impure function mem_InitMemory( + FilePath : string; + WORDS : positive; + DATA_BITS : positive + ) return T_SLVV is + variable memory : T_SLM(WORDS - 1 downto 0, DATA_BITS - 1 downto 0); + variable empty : T_SLVV(0 to WORDS - 1)(DATA_BITS - 1 downto 0) := (others => (others => ite(SIMULATION, 'U', '0'))); + begin + if str_length(FilePath) = 0 then + -- shortcut required by Vivado + return empty; + elsif mem_FileExtension(FilePath) = "mem" then + memory := mem_ReadMemoryFile(FilePath, WORDS, DATA_BITS, MEM_FILEFORMAT_XILINX_MEM, MEM_CONTENT_HEX); + else + memory := mem_ReadMemoryFile(FilePath, WORDS, DATA_BITS, MEM_FILEFORMAT_INTEL_HEX, MEM_CONTENT_HEX); + end if; + + return to_slvv(memory); + end function; + procedure ReadHex(L : inout LINE; Value : out std_logic_vector; Good : out boolean) is variable ok : boolean; variable Char : character; @@ -136,11 +161,11 @@ package body mem is -- Reads a memory file and returns a 2D std_logic matrix impure function mem_ReadMemoryFile( - FileName : string; - MemoryLines : positive; + FileName : string; + MemoryLines : positive; BitsPerMemoryLine : positive; - FORMAT : T_MEM_FILEFORMAT; - CONTENT : T_MEM_CONTENT := MEM_CONTENT_HEX + FORMAT : T_MEM_FILEFORMAT; + CONTENT : T_MEM_CONTENT := MEM_CONTENT_HEX ) return T_SLM is file FileHandle : TEXT open READ_MODE is FileName; variable CurrentLine : LINE; @@ -151,7 +176,7 @@ package body mem is Result := (others => (others => ite(SIMULATION, 'U', '0'))); if FORMAT = MEM_FILEFORMAT_XILINX_MEM then - -- discard the first line of a mem file + report "PoC.mem.pkg:: Using XILINX memory format - First line of mem file is discarded." severity warning; readline(FileHandle, CurrentLine); end if; @@ -159,8 +184,8 @@ package body mem is exit when endfile(FileHandle); readline(FileHandle, CurrentLine); --- report CurrentLine.all severity NOTE; --- ReadHex(CurrentLine, TempWord, Good); +-- report CurrentLine.all severity NOTE; +-- ReadHex(CurrentLine, TempWord, Good); -- WORKAROUND: for Xilinx Vivado (tested with 2018.3) -- Version: All versions -- Issue: User defined procedures using access types like line are not supported (synthesizable). @@ -202,19 +227,19 @@ package body mem is end if; end function; - function get_ram_type(a : positive; d : positive) return T_INTVEC is + function get_ram_type(a : positive; d : positive) return integer_vector is constant URAM : natural := 0; constant BRAM : natural := 1; --- constant LRAM : natural := 2; - +-- constant LRAM : natural := 2; + variable reminder : natural := d; - variable result : T_INTVEC(0 to 1) := (others => 0); + variable result : integer_vector(0 to 1) := (others => 0); begin --================================================================== --***********depth smaler than 512, everithing in LUT_RAM*********** if a <= 8 then --- LRAM := d; +-- LRAM := d; return result; --================================================================== @@ -224,8 +249,8 @@ package body mem is reminder := reminder - (result(BRAM) * 36); if reminder > 28 then result(BRAM) := result(BRAM) +1; --- else --- LRAM := (d - reminder); +-- else +-- LRAM := (d - reminder); end if; --================================================================== @@ -235,8 +260,8 @@ package body mem is reminder := reminder - (result(BRAM) * 18); if reminder > 14 then result(BRAM) := result(BRAM) +1; --- else --- LRAM := (d - reminder); +-- else +-- LRAM := (d - reminder); end if; --================================================================== @@ -246,8 +271,8 @@ package body mem is reminder := reminder - (result(BRAM) * 9); if reminder > 6 then result(BRAM) := result(BRAM) +1; --- else --- LRAM := (d - reminder); +-- else +-- LRAM := (d - reminder); end if; --================================================================== @@ -264,8 +289,8 @@ package body mem is reminder := reminder - (result(BRAM) * 4); if reminder > 2 then result(BRAM) := result(BRAM) +1; --- else --- LRAM := (d - reminder); +-- else +-- LRAM := (d - reminder); end if; end if; diff --git a/src/mem/mem_GitVersionRegister.pkg.vhdl b/src/mem/mem_GitVersionRegister.pkg.vhdl index 7ae4667b4..9264a5111 100644 --- a/src/mem/mem_GitVersionRegister.pkg.vhdl +++ b/src/mem/mem_GitVersionRegister.pkg.vhdl @@ -9,7 +9,7 @@ -- Description: -- ------------------------------------- -- This package defines the Functions, Strings and Records necessary for --- the AXI4Lite_GitVersionRegister module. +-- the axi4lite_GitVersionRegister module. -- -- License: -- ============================================================================= @@ -60,7 +60,7 @@ package mem_GitVersionRegister is ToolVersion_Release : std_logic_vector(7 downto 0); ToolVersion_SubRelease : std_logic_vector(7 downto 0); - ProjektName : std_logic_vector(159 downto 0); + ProjectName : std_logic_vector(159 downto 0); end record; type T_VersionRegister_Top is record @@ -105,7 +105,7 @@ package mem_GitVersionRegister is User_ID => (others => '0') ); - constant C_Num_reg_UID_vec : T_NATVEC := ( + constant C_Num_reg_UID_vec : natural_vector := ( 0 => C_VersionRegister_UID_INIT.UID'length / 32, 1 => C_VersionRegister_UID_INIT.User_eFuse'length / 32, 2 => C_VersionRegister_UID_INIT.User_ID'length / 32 @@ -145,7 +145,7 @@ package body mem_GitVersionRegister is temp(pos) := to_AXI4_Register(Name => "Common.ToolVersion", Address => to_unsigned(addr, 32), RegisterMode => ReadOnly_NotRegistered); addr := addr +4; pos := pos +1; for i in 0 to 4 loop - temp(pos) := to_AXI4_Register(Name => "Common.ProjektName(" & integer'image(i) & ")", Address => to_unsigned(addr, 32), RegisterMode => ReadOnly_NotRegistered); + temp(pos) := to_AXI4_Register(Name => "Common.ProjectName(" & integer'image(i) & ")", Address => to_unsigned(addr, 32), RegisterMode => ReadOnly_NotRegistered); addr := addr +4; pos := pos +1; end loop; @@ -195,7 +195,7 @@ package body mem_GitVersionRegister is temp.Common.ToolVersion_Release := registerValues(2)(15 downto 8); temp.Common.ToolVersion_SubRelease := registerValues(2)( 7 downto 0); for i in 0 to 4 loop - temp.Common.ProjektName(32 * i +31 downto 32 * i) := registerValues(i + 3); + temp.Common.ProjectName(32 * i +31 downto 32 * i) := registerValues(i + 3); end loop; temp.Top.Version_Major := registerValues(8)(31 downto 24); @@ -248,7 +248,7 @@ package body mem_GitVersionRegister is function to_SLVV_32_Common(data : T_VersionRegister_Common) return T_SLVV_32 is variable temp : T_SLVV_32(0 to 7) := (others => (others => '0')); - constant name : T_SLVV_32(4 downto 0) := to_slvv_32(data.ProjektName); + constant name : T_SLVV_32(4 downto 0) := to_slvv_32(data.ProjectName); begin temp(0) := data.BuildDate_Day & data.BuildDate_Month & data.BuildDate_Year; temp(1) := data.NumberModule & data.VersionOfVersionReg; @@ -361,7 +361,7 @@ package body mem_GitVersionRegister is Len := CurrentLine'length; read(CurrentLine, result_s(1 to Len), Good); assert not Verbose report result_s(1 to Len) severity note; - HW_BUILD_VERSION_COMMON.ProjektName := to_slv(to_RawString(resize(result_s(1 to Len), 20, NUL))); + HW_BUILD_VERSION_COMMON.ProjectName := to_slv(to_RawString(resize(result_s(1 to Len), 20, NUL))); readline(FileHandle, CurrentLine); diff --git a/src/mem/ocram/altera/ocram_SimplePort_Altera.vhdl b/src/mem/ocram/altera/ocram_SimplePort_Altera.vhdl new file mode 100644 index 000000000..aafbc07fd --- /dev/null +++ b/src/mem/ocram/altera/ocram_SimplePort_Altera.vhdl @@ -0,0 +1,90 @@ +-- ============================================================================= +-- Authors: Martin Zabel +-- Patrick Lehmann +-- +-- Entity: Instantiate single-port memory on Altera FPGAs. +-- +-- Description: +-- ------------------------------------- +-- Quartus synthesis does not infer this RAM type correctly. +-- Instead, altsyncram is instantiated directly. +-- +-- For further documentation see module "ocram_SinglePort" +-- (src/mem/ocram/ocram_SinglePort.vhdl). +-- +-- License: +-- ============================================================================= +-- Copyright 2008-2015 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library Altera_mf; +use Altera_mf.Altera_MF_Components.all; + +use work.config.all; +use work.utils.all; +use work.strings.all; + + +entity ocram_SimplePort_Altera is + generic ( + ADDRESS_BITS : positive; + DATA_BITS : positive; + FILENAME : string := "" + ); + port ( + Clock : in std_logic; + ClockEnable : in std_logic; + WriteEnable : in std_logic; + Address : in unsigned(ADDRESS_BITS-1 downto 0); + DataIn : in std_logic_vector(DATA_BITS-1 downto 0); + DataOut : out std_logic_vector(DATA_BITS-1 downto 0) + ); +end entity; + + +architecture rtl of ocram_SimplePort_Altera is +begin + mem : component altsyncram + generic map ( + address_aclr_a => "NONE", + indata_aclr_a => "NONE", + init_file => ite((str_length(FILENAME) = 0), "UNUSED", FILENAME), + intended_device_family => getAlteraDeviceName(DEVICE), + lpm_hint => "ENABLE_RUNTIME_MOD = NO", + lpm_type => "altsyncram", + numwords_a => 2**ADDRESS_BITS, + operation_mode => "SINGLE_PORT", + outdata_aclr_a => "NONE", + outdata_reg_a => "UNREGISTERED", + power_up_uninitialized => "FALSE", + widthad_a => ADDRESS_BITS, + width_a => DATA_BITS, + width_byteena_a => 1, + wrcontrol_aclr_a => "NONE" + ) + port map ( + clocken0 => ClockEnable, + wren_a => WriteEnable, + clock0 => Clock, + address_a => std_logic_vector(Address), + data_a => DataIn, + q_a => DataOut + ); +end architecture; diff --git a/src/mem/ocram/altera/ocram_TrueDualPort_Altera.vhdl b/src/mem/ocram/altera/ocram_TrueDualPort_Altera.vhdl new file mode 100644 index 000000000..f132460ea --- /dev/null +++ b/src/mem/ocram/altera/ocram_TrueDualPort_Altera.vhdl @@ -0,0 +1,115 @@ +-- ============================================================================= +-- Authors: Martin Zabel +-- Patrick Lehmann +-- +-- Entity: Instantiate true dual-port memory on Altera FPGAs. +-- +-- Description: +-- ------------------------------------- +-- Quartus synthesis does not infer this RAM type correctly. +-- Instead, altsyncram is instantiated directly. +-- +-- For further documentation see module "ocram_TrueDualPort" +-- (src/mem/ocram/ocram_TrueDualPort.vhdl). +-- +-- License: +-- ============================================================================= +-- Copyright 2008-2015 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library Altera_mf; +use Altera_mf.Altera_MF_Components.all; + +use work.config.all; +use work.utils.all; +use work.strings.all; + +entity ocram_TrueDualPort_Altera is + generic ( + ADDRESS_BITS : positive; + DATA_BITS : positive; + FILENAME : string := "" + ); + port ( + PortA_Clock : in std_logic; + PortA_ClockEnable : in std_logic; + PortA_WriteEnable : in std_logic; + PortA_Address : in unsigned(ADDRESS_BITS-1 downto 0); + PortA_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); + PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); + + PortB_Clock : in std_logic; + PortB_ClockEnable : in std_logic; + PortB_WriteEnable : in std_logic; + PortB_Address : in unsigned(ADDRESS_BITS-1 downto 0); + PortB_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); + PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) + ); +end entity; + + +architecture rtl of ocram_TrueDualPort_Altera is + constant DEPTH : positive := 2**ADDRESS_BITS; + constant INIT_FILE : string := ite((str_length(FILENAME) = 0), "UNUSED", FILENAME); +begin + mem : component altsyncram + generic map ( + address_aclr_a => "NONE", + address_aclr_b => "NONE", + address_reg_b => "CLOCK1", + indata_aclr_a => "NONE", + indata_aclr_b => "NONE", + indata_reg_b => "CLOCK1", + init_file => INIT_FILE, + intended_device_family => getAlteraDeviceName(DEVICE), + lpm_type => "altsyncram", + numwords_a => DEPTH, + numwords_b => DEPTH, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", + outdata_reg_b => "UNREGISTERED", + power_up_uninitialized => "FALSE", + widthad_a => ADDRESS_BITS, + widthad_b => ADDRESS_BITS, + width_a => DATA_BITS, + width_b => DATA_BITS, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_aclr_a => "NONE", + wrcontrol_aclr_b => "NONE", + wrcontrol_wraddress_reg_b => "CLOCK1" + ) + port map ( + clock0 => PortA_Clock, + clock1 => PortB_Clock, + clocken0 => PortA_ClockEnable, + clocken1 => PortB_ClockEnable, + wren_a => PortA_WriteEnable, + wren_b => PortB_WriteEnable, + address_a => std_logic_vector(PortA_Address), + address_b => std_logic_vector(PortB_Address), + data_a => PortA_DataIn, + data_b => PortB_DataIn, + q_a => PortA_DataOut, + q_b => PortB_DataOut + ); +end architecture; diff --git a/src/mem/ocram/altera/ocram_sp_altera.vhdl b/src/mem/ocram/altera/ocram_sp_altera.vhdl deleted file mode 100644 index 47f65ffac..000000000 --- a/src/mem/ocram/altera/ocram_sp_altera.vhdl +++ /dev/null @@ -1,97 +0,0 @@ --- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann --- --- Entity: Instantiate single-port memory on Altera FPGAs. --- --- Description: --- ------------------------------------- --- Quartus synthesis does not infer this RAM type correctly. --- Instead, altsyncram is instantiated directly. --- --- For further documentation see module "ocram_sp" --- (src/mem/ocram/ocram_sp.vhdl). --- --- License: --- ============================================================================= --- Copyright 2008-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library Altera_mf; -use Altera_mf.Altera_MF_Components.all; - -use work.config.all; -use work.utils.all; -use work.strings.all; - - -entity ocram_sp_altera is - generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string := "" - ); - port ( - clk : in std_logic; - ce : in std_logic; - we : in std_logic; - a : in unsigned(A_BITS-1 downto 0); - d : in std_logic_vector(D_BITS-1 downto 0); - q : out std_logic_vector(D_BITS-1 downto 0) - ); -end entity; - - -architecture rtl of ocram_sp_altera is - constant DEPTH : positive := 2**A_BITS; - constant INIT_FILE : string := ite((str_length(FILENAME) = 0), "UNUSED", FILENAME); - - signal a_sl : std_logic_vector(A_BITS-1 downto 0); - -begin - a_sl <= std_logic_vector(a); - - mem : component altsyncram - generic map ( - address_aclr_a => "NONE", - indata_aclr_a => "NONE", - init_file => INIT_FILE, - intended_device_family => getAlteraDeviceName(DEVICE), - lpm_hint => "ENABLE_RUNTIME_MOD = NO", - lpm_type => "altsyncram", - numwords_a => DEPTH, - operation_mode => "SINGLE_PORT", - outdata_aclr_a => "NONE", - outdata_reg_a => "UNREGISTERED", - power_up_uninitialized => "FALSE", - widthad_a => A_BITS, - width_a => D_BITS, - width_byteena_a => 1, - wrcontrol_aclr_a => "NONE" - ) - port map ( - clocken0 => ce, - wren_a => we, - clock0 => clk, - address_a => a_sl, - data_a => d, - q_a => q - ); -end architecture; diff --git a/src/mem/ocram/altera/ocram_tdp_altera.vhdl b/src/mem/ocram/altera/ocram_tdp_altera.vhdl deleted file mode 100644 index 5cf4181a0..000000000 --- a/src/mem/ocram/altera/ocram_tdp_altera.vhdl +++ /dev/null @@ -1,123 +0,0 @@ --- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann --- --- Entity: Instantiate true dual-port memory on Altera FPGAs. --- --- Description: --- ------------------------------------- --- Quartus synthesis does not infer this RAM type correctly. --- Instead, altsyncram is instantiated directly. --- --- For further documentation see module "ocram_tdp" --- (src/mem/ocram/ocram_tdp.vhdl). --- --- License: --- ============================================================================= --- Copyright 2008-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library Altera_mf; -use Altera_mf.Altera_MF_Components.all; - -use work.config.all; -use work.utils.all; -use work.strings.all; - - -entity ocram_tdp_altera is - generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string := "" - ); - port ( - clk1 : in std_logic; - clk2 : in std_logic; - ce1 : in std_logic; - ce2 : in std_logic; - we1 : in std_logic; - we2 : in std_logic; - a1 : in unsigned(A_BITS-1 downto 0); - a2 : in unsigned(A_BITS-1 downto 0); - d1 : in std_logic_vector(D_BITS-1 downto 0); - d2 : in std_logic_vector(D_BITS-1 downto 0); - q1 : out std_logic_vector(D_BITS-1 downto 0); - q2 : out std_logic_vector(D_BITS-1 downto 0) - ); -end ocram_tdp_altera; - - -architecture rtl of ocram_tdp_altera is - constant DEPTH : positive := 2**A_BITS; - constant INIT_FILE : string := ite((str_length(FILENAME) = 0), "UNUSED", FILENAME); - - signal a1_sl : std_logic_vector(A_BITS-1 downto 0); - signal a2_sl : std_logic_vector(A_BITS-1 downto 0); - -begin - - a1_sl <= std_logic_vector(a1); - a2_sl <= std_logic_vector(a2); - - mem : component altsyncram - generic map ( - address_aclr_a => "NONE", - address_aclr_b => "NONE", - address_reg_b => "CLOCK1", - indata_aclr_a => "NONE", - indata_aclr_b => "NONE", - indata_reg_b => "CLOCK1", - init_file => INIT_FILE, - intended_device_family => getAlteraDeviceName(DEVICE), - lpm_type => "altsyncram", - numwords_a => DEPTH, - numwords_b => DEPTH, - operation_mode => "BIDIR_DUAL_PORT", - outdata_aclr_a => "NONE", - outdata_aclr_b => "NONE", - outdata_reg_a => "UNREGISTERED", - outdata_reg_b => "UNREGISTERED", - power_up_uninitialized => "FALSE", - widthad_a => A_BITS, - widthad_b => A_BITS, - width_a => D_BITS, - width_b => D_BITS, - width_byteena_a => 1, - width_byteena_b => 1, - wrcontrol_aclr_a => "NONE", - wrcontrol_aclr_b => "NONE", - wrcontrol_wraddress_reg_b => "CLOCK1" - ) - port map ( - clock0 => clk1, - clock1 => clk2, - clocken0 => ce1, - clocken1 => ce2, - wren_a => we1, - wren_b => we2, - address_a => a1_sl, - address_b => a2_sl, - data_a => d1, - data_b => d2, - q_a => q1, - q_b => q2 - ); -end architecture; diff --git a/src/mem/ocram/ocram.pkg.vhdl b/src/mem/ocram/ocram.pkg.vhdl index 1e436fa0d..97a9d314d 100644 --- a/src/mem/ocram/ocram.pkg.vhdl +++ b/src/mem/ocram/ocram.pkg.vhdl @@ -1,26 +1,26 @@ -- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann +-- Authors: Martin Zabel +-- Patrick Lehmann -- --- Package: VHDL package for component declarations, types and functions --- associated to the PoC.mem.ocram namespace +-- Package: VHDL package for component declarations, types and functions +-- associated to the PoC.mem.ocram namespace -- -- Description: -- ------------------------------------- --- On-Chip RAMs (Random-Access-Memory/Read-Write-Memory - RWM) for FPGAs. +-- On-Chip RAMs (Random-Access-Memory/Read-Write-Memory - RWM) for FPGAs. -- --- A detailed documentation is included in each module. +-- A detailed documentation is included in each module. -- -- License: -- ============================================================================= -- Copyright 2008-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,90 +29,179 @@ -- limitations under the License. -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; +use work.utils.all; use work.mem.all; package ocram is + attribute ram_style : string; + attribute ramstyle : string; + + function addressIsEqual(addressA : unsigned; addressB : unsigned) return X01; + -- Single-Port - component ocram_sp - generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string := "" + component ocram_SinglePort + generic ( + ADDRESS_BITS : positive; + DATA_BITS : positive; + FILENAME : string := "" + ); + port ( + Clock : in std_logic; + ClockEnable : in std_logic; + WriteEnable : in std_logic; + Address : in unsigned(ADDRESS_BITS-1 downto 0); + DataIn : in std_logic_vector(DATA_BITS-1 downto 0); + DataOut : out std_logic_vector(DATA_BITS-1 downto 0)); + end component; + + component ocram_SimplePort_Altera is + generic ( + ADDRESS_BITS : positive; + DATA_BITS : positive; + FILENAME : string := "" + ); + port ( + Clock : in std_logic; + ClockEnable : in std_logic; + WriteEnable : in std_logic; + Address : in unsigned(ADDRESS_BITS-1 downto 0); + DataIn : in std_logic_vector(DATA_BITS-1 downto 0); + DataOut : out std_logic_vector(DATA_BITS-1 downto 0) ); - port ( - clk : in std_logic; - ce : in std_logic; - we : in std_logic; - a : in unsigned(A_BITS-1 downto 0); - d : in std_logic_vector(D_BITS-1 downto 0); - q : out std_logic_vector(D_BITS-1 downto 0)); - end component; + end component; -- Simple-Dual-Port - component ocram_sdp - generic( - A_BITS : positive; - D_BITS : positive; - RAM_TYPE : T_RAM_TYPE := RAM_TYPE_AUTO; - FILENAME : string := "" - ); - port( - rclk : in std_logic; - rce : in std_logic; - wclk : in std_logic; - wce : in std_logic; - we : in std_logic; - ra : in unsigned(A_BITS-1 downto 0); - wa : in unsigned(A_BITS-1 downto 0); - d : in std_logic_vector(D_BITS-1 downto 0); - q : out std_logic_vector(D_BITS-1 downto 0) - ); - end component ocram_sdp; + component ocram_SimpleDualPort + generic( + ADDRESS_BITS : positive; + DATA_BITS : positive; + RAM_TYPE : T_RAM_TYPE := RAM_TYPE_AUTO; + FILENAME : string := "" + ); + port( + Write_Clock : in std_logic; + Write_ClockEnable : in std_logic; + Write_WriteEnable : in std_logic; + Write_Address : in unsigned(ADDRESS_BITS-1 downto 0); + Write_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); + + Read_Clock : in std_logic; + Read_ClockEnable : in std_logic; + Read_Address : in unsigned(ADDRESS_BITS-1 downto 0); + Read_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) + ); + end component ocram_SimpleDualPort; -- Enhanced-Simple-Dual-Port - component ocram_esdp - generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string := "" + component ocram_EnhancedSimpleDualPort + generic ( + ADDRESS_BITS : positive; + DATA_BITS : positive; + FILENAME : string := "" ); - port ( - clk1 : in std_logic; - clk2 : in std_logic; - ce1 : in std_logic; - ce2 : in std_logic; - we1 : in std_logic; - a1 : in unsigned(A_BITS-1 downto 0); - a2 : in unsigned(A_BITS-1 downto 0); - d1 : in std_logic_vector(D_BITS-1 downto 0); - q1 : out std_logic_vector(D_BITS-1 downto 0); - q2 : out std_logic_vector(D_BITS-1 downto 0)); - end component; + port ( + PortA_Clock : in std_logic; + PortB_Clock : in std_logic; + PortA_ClockEnable : in std_logic; + PortB_ClockEnable : in std_logic; + PortA_WriteEnable : in std_logic; + PortA_Address : in unsigned(ADDRESS_BITS-1 downto 0); + PortB_Address : in unsigned(ADDRESS_BITS-1 downto 0); + PortA_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); + PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); + PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0)); + end component; -- True-Dual-Port - component ocram_tdp - generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string := "" + component ocram_TrueDualPort + generic ( + ADDRESS_BITS : positive; + DATA_BITS : positive; + FILENAME : string := "" ); - port ( - clk1 : in std_logic; - clk2 : in std_logic; - ce1 : in std_logic; - ce2 : in std_logic; - we1 : in std_logic; - we2 : in std_logic; - a1 : in unsigned(A_BITS-1 downto 0); - a2 : in unsigned(A_BITS-1 downto 0); - d1 : in std_logic_vector(D_BITS-1 downto 0); - d2 : in std_logic_vector(D_BITS-1 downto 0); - q1 : out std_logic_vector(D_BITS-1 downto 0); - q2 : out std_logic_vector(D_BITS-1 downto 0)); - end component; + port ( + PortA_Clock : in std_logic; + PortA_ClockEnable : in std_logic; + PortA_WriteEnable : in std_logic; + PortA_Address : in unsigned(ADDRESS_BITS-1 downto 0); + PortA_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); + PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); + + PortB_Clock : in std_logic; + PortB_ClockEnable : in std_logic; + PortB_WriteEnable : in std_logic; + PortB_Address : in unsigned(ADDRESS_BITS-1 downto 0); + PortB_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); + PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) + ); + end component; + + component ocram_TrueDualPort_Altera is + generic ( + ADDRESS_BITS : positive; + DATA_BITS : positive; + FILENAME : string := "" + ); + port ( + PortA_Clock : in std_logic; + PortA_ClockEnable : in std_logic; + PortA_WriteEnable : in std_logic; + PortA_Address : in unsigned(ADDRESS_BITS-1 downto 0); + PortA_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); + PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); + + PortB_Clock : in std_logic; + PortB_ClockEnable : in std_logic; + PortB_WriteEnable : in std_logic; + PortB_Address : in unsigned(ADDRESS_BITS-1 downto 0); + PortB_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); + PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) + ); + end component; + + component ocram_TrueDualPort_Simulation is + generic ( + ADDRESS_BITS : positive; -- number of address bits + DATA_BITS : positive; -- number of data bits + FILENAME : string := "" -- file-name for RAM initialization + ); + port ( + PortA_Clock : in std_logic; -- clock for 1st port + PortA_ClockEnable : in std_logic; -- clock-enable for 1st port + PortA_WriteEnable : in std_logic; -- write-enable for 1st port + PortA_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- address for 1st port + PortA_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- write-data for 1st port + PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); -- read-data from 1st port + + PortB_Clock : in std_logic; -- clock for 2nd port + PortB_ClockEnable : in std_logic; -- clock-enable for 2nd port + PortB_WriteEnable : in std_logic; -- write-enable for 2nd port + PortB_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- address for 2nd port + PortB_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- write-data for 2nd port + PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) -- read-data from 2nd port + ); + end component; end package; + +package body ocram is + -- Compares two addresses, returns 'X' if either ``a1`` or ``a2`` contains + -- meta-values, otherwise returns '1' if ``a1 == a2`` is true else + -- '0'. Returns 'X' even when the addresses contain '-' values, to signal an + -- undefined outcome. + function addressIsEqual(addressA : unsigned; addressB : unsigned) return X01 is + begin + -- synthesis translate_off + if is_x(addressA) or is_x(addressB) then + return 'X'; + end if; + -- synthesis translate_on + + return to_sl(to_x01(std_logic_vector(addressA)) = to_x01(std_logic_vector(addressB))); + end function; +end package body ocram; + diff --git a/src/mem/ocram/ocram_EnhancedSimpleDualPort.vhdl b/src/mem/ocram/ocram_EnhancedSimpleDualPort.vhdl new file mode 100644 index 000000000..3a174f2cb --- /dev/null +++ b/src/mem/ocram/ocram_EnhancedSimpleDualPort.vhdl @@ -0,0 +1,195 @@ +-- ============================================================================= +-- Authors: Martin Zabel +-- Patrick Lehmann +-- +-- Entity: Enhanced simple dual-port memory. +-- +-- Description: +-- ------------------------------------- +-- Inferring / instantiating enhanced simple dual-port memory, with: +-- +-- * dual clock, clock enable, +-- * 1 read/write port (1st port) plus 1 read port (2nd port). +-- +-- .. deprecated:: 1.1 +-- +-- **Please use** :ref:`IP:ocram_TrueDualPort` **for new designs. +-- This component has been provided because older FPGA compilers where not +-- able to infer true dual-port memory from an RTL description.** +-- +-- Command truth table for port 1: +-- +-- === === ================ +-- ce1 we1 Command +-- === === ================ +-- 0 X No operation +-- 1 0 Read from memory +-- 1 1 Write to memory +-- === === ================ +-- +-- Command truth table for port 2: +-- +-- === ================ +-- ce2 Command +-- === ================ +-- 0 No operation +-- 1 Read from memory +-- === ================ +-- +-- Both reading and writing are synchronous to the rising-edge of the clock. +-- Thus, when reading, the memory data will be outputted after the +-- clock edge, i.e, in the following clock cycle. +-- +-- The generalized behavior across Altera and Xilinx FPGAs since +-- Stratix/Cyclone and Spartan-3/Virtex-5, respectively, is as follows: +-- +-- Same-Port Read-During-Write +-- When writing data through port 1, the read output of the same port +-- (``q1``) will output the new data (``d1``, in the following clock cycle) +-- which is aka. "write-first behavior". +-- +-- Mixed-Port Read-During-Write +-- When reading at the write address, the read value will be unknown which is +-- aka. "don't care behavior". This applies to all reads (at the same +-- address) which are issued during the write-cycle time, which starts at the +-- rising-edge of the write clock (``clk1``) and (in the worst case) extends +-- until the next rising-edge of the write clock. +-- +-- For simulation, always our dedicated simulation model :ref:`IP:ocram_TrueDualPort_Simulation` +-- is used. +-- +-- License: +-- ============================================================================= +-- Copyright 2008-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +use STD.TextIO.all; + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.config.all; +use work.utils.all; +use work.strings.all; +use work.vectors.all; +use work.mem.all; +use work.ocram.all; + + +entity ocram_EnhancedSimpleDualPort is + generic ( + ADDRESS_BITS : positive; -- number of address bits + DATA_BITS : positive; -- number of data bits + FILENAME : string := "" -- file-name for RAM initialization + ); + port ( + PortA_Clock : in std_logic; -- clock for 1st port + PortA_ClockEnable : in std_logic; -- clock-enable for 1st port + PortA_WriteEnable : in std_logic; -- write-enable for 1st port + PortA_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- address for 1st port + PortA_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- write-data for 1st port + PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); -- read-data from 1st port + + PortB_Clock : in std_logic; -- clock for 2nd port + PortB_ClockEnable : in std_logic; -- clock-enable for 2nd port + PortB_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- address for 2nd port + PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) -- read-data from 2nd port + ); +end entity; + + +architecture rtl of ocram_EnhancedSimpleDualPort is + constant DEPTH : positive := 2**ADDRESS_BITS; + +begin + gen: if gInfer: not SIMULATION and ((VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) generate + -- For Xilinx ISE, Xilinx Vivado and Lattice LSE we can reuse the ocram_TrueDualPort. + -- + -- **Attention**: This encapsulation is mandatory for Xilinx Vivado, + -- otherwise Vivado synthesizes a lot of LUT-RAM instead of Block-RAM. + tdp: entity work.ocram_TrueDualPort + generic map ( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS, + FILENAME => FILENAME + ) + port map ( + PortA_Clock => PortA_Clock, + PortA_ClockEnable => PortA_ClockEnable, + PortA_WriteEnable => PortA_WriteEnable, + PortA_Address => PortA_Address, + PortA_DataIn => PortA_DataIn, + PortA_DataOut => PortA_DataOut, + + PortB_Clock => PortB_Clock, + PortB_ClockEnable => PortB_ClockEnable, + PortB_WriteEnable => '0', + PortB_Address => PortB_Address, + PortB_DataIn => (others => '0'), + PortB_DataOut => PortB_DataOut + ); + elsif gAltera: not SIMULATION and (VENDOR = VENDOR_ALTERA) generate + -- Direct instantiation of altsyncram (including component + -- declaration above) is not sufficient for ModelSim. + -- That requires also usage of altera_mf library. + tdp: component ocram_TrueDualPort_Altera + generic map ( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS, + FILENAME => FILENAME + ) + port map ( + PortA_Clock => PortA_Clock, + PortA_ClockEnable => PortA_ClockEnable, + PortA_WriteEnable => PortA_WriteEnable, + PortA_Address => PortA_Address, + PortA_DataIn => PortA_DataIn, + PortA_DataOut => PortA_DataOut, + + PortB_Clock => PortB_Clock, + PortB_ClockEnable => PortB_ClockEnable, + PortB_WriteEnable => '0', + PortB_Address => PortB_Address, + PortB_DataIn => (others => '0'), + PortB_DataOut => PortB_DataOut + ); + elsif gSim: SIMULATION generate + tdp: component ocram_TrueDualPort_Simulation -- XXX: why is this not a second architecture? + generic map ( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS, + FILENAME => FILENAME + ) + port map ( + PortA_Clock => PortA_Clock, + PortA_ClockEnable => PortA_ClockEnable, + PortA_WriteEnable => PortA_WriteEnable, + PortA_Address => PortA_Address, + PortA_DataIn => PortA_DataIn, + PortA_DataOut => PortA_DataOut, + + PortB_Clock => PortB_Clock, + PortB_ClockEnable => PortB_ClockEnable, + PortB_WriteEnable => '0', + PortB_Address => PortB_Address, + PortB_DataIn => (others => '0'), + PortB_DataOut => PortB_DataOut + ); + else generate + assert FALSE report "Vendor '" & T_VENDOR'image(VENDOR) & "' not yet supported." severity failure; + end generate; +end architecture; diff --git a/src/mem/ocram/ocram_SimpleDualPort.vhdl b/src/mem/ocram/ocram_SimpleDualPort.vhdl new file mode 100644 index 000000000..fc8c33ae4 --- /dev/null +++ b/src/mem/ocram/ocram_SimpleDualPort.vhdl @@ -0,0 +1,150 @@ +-- ============================================================================= +-- Authors: Martin Zabel +-- Thomas B. Preusser +-- Patrick Lehmann +-- Stefan Unrein +-- +-- Entity: Simple dual-port memory. +-- +-- Description: +-- ------------------------------------- +-- Inferring / instantiating simple dual-port memory, with: +-- +-- * dual clock, clock enable, +-- * 1 read port plus 1 write port. +-- +-- Both reading and writing are synchronous to the rising-edge of the clock. +-- Thus, when reading, the memory data will be outputted after the +-- clock edge, i.e, in the following clock cycle. +-- +-- The generalized behavior across Altera and Xilinx FPGAs since +-- Stratix/Cyclone and Spartan-3/Virtex-5, respectively, is as follows: +-- +-- Mixed-Port Read-During-Write +-- When reading at the write address, the read value will be unknown which is +-- aka. "don't care behavior". This applies to all reads (at the same +-- address) which are issued during the write-cycle time, which starts at the +-- rising-edge of the write clock and (in the worst case) extends until the +-- next rising-edge of the write clock. +-- +-- For simulation, always our dedicated simulation model :ref:`IP:ocram_TrueDualPort_sim` +-- is used. +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- Copyright 2008-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.config.all; +use work.utils.all; +use work.strings.all; +use work.vectors.all; +use work.mem.all; +use work.ocram.all; + + +entity ocram_SimpleDualPort is + generic ( + RAM_TYPE : T_RAM_TYPE := RAM_TYPE_AUTO; + ADDRESS_BITS : positive; -- number of address bits + DATA_BITS : positive; -- number of data bits + FILENAME : string := "" -- file-name for RAM initialization + ); + port ( + Write_Clock : in std_logic; -- write clock + Write_ClockEnable : in std_logic; -- write clock-enable + Write_WriteEnable : in std_logic; -- write enable + Write_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- write address + Write_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- data in + + Read_Clock : in std_logic; -- read clock + Read_ClockEnable : in std_logic; -- read clock-enable + Read_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- read address + Read_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) -- data out + ); +end entity; + + +architecture rtl of ocram_SimpleDualPort is + constant DEPTH : positive := 2**ADDRESS_BITS; + +begin + gen: if gInfer: not SIMULATION and ((VENDOR = VENDOR_ALTERA) or (VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) generate + -- RAM can be inferred correctly + -- Xilinx notes: + -- WRITE_MODE is set to WRITE_FIRST, but this also means that read data + -- is unknown on the opposite port. (As expected.) + -- Altera notes: + -- Setting attribute "ramstyle" to "no_rw_check" suppresses generation of + -- bypass logic, when 'clk1'='clk2' and 'ra' is feed from a register. + -- This is the expected behavior. + -- With two different clocks, synthesis complains about an undefined + -- read-write behavior, that can be ignored. + + signal ram : T_SLVV := mem_InitMemory(FILENAME, DEPTH, DATA_BITS); + attribute ramstyle of ram : signal is get_ramstyle_string(RAM_TYPE); + attribute ram_style of ram : signal is get_ram_style_string(RAM_TYPE); + + begin + process(Write_Clock) + begin + if rising_edge(Write_Clock) then + if (Write_ClockEnable and Write_WriteEnable) = '1' then + ram(to_integer(Write_Address)) <= Write_DataIn; + end if; + end if; + end process; + + process(Read_Clock) + begin + if rising_edge(Read_Clock) then + if Read_ClockEnable = '1' then + Read_DataOut <= ram(to_integer(Read_Address)); + end if; + end if; + end process; + elsif gSim: SIMULATION generate + begin + sim_tdp: ocram_TrueDualPort_Simulation + generic map ( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS, + FILENAME => FILENAME + ) + port map ( + PortA_Clock => Write_Clock, + PortA_ClockEnable => Write_ClockEnable, + PortA_WriteEnable => Write_WriteEnable, + PortA_Address => Write_Address, + PortA_DataIn => Write_DataIn, + PortA_DataOut => open, + + PortB_Clock => Read_Clock, + PortB_ClockEnable => Read_ClockEnable, + PortB_WriteEnable => '0', + PortB_Address => Read_Address, + PortB_DataIn => (others => '0'), + PortB_DataOut => Read_DataOut + ); + else generate + assert FALSE report "Vendor '" & T_VENDOR'image(VENDOR) & "' not yet supported." severity failure; + end generate; +end architecture; diff --git a/src/mem/ocram/ocram_SimpleDualPort_Optimized.vhdl b/src/mem/ocram/ocram_SimpleDualPort_Optimized.vhdl new file mode 100644 index 000000000..5988557e9 --- /dev/null +++ b/src/mem/ocram/ocram_SimpleDualPort_Optimized.vhdl @@ -0,0 +1,197 @@ +-- ============================================================================= +-- Authors: Patrick Lehmann +-- Stefan Unrein +-- +-- Entity: Simple dual-port memory. +-- +-- Description: +-- ------------------------------------- +-- Inferring / instantiating simple dual-port memory, with: +-- +-- * dual clock, clock enable, +-- * 1 read port plus 1 write port. +-- +-- Both reading and writing are synchronous to the rising-edge of the clock. +-- Thus, when reading, the memory data will be outputted after the +-- clock edge, i.e, in the following clock cycle. +-- +-- The generalized behavior across Altera and Xilinx FPGAs since +-- Stratix/Cyclone and Spartan-3/Virtex-5, respectively, is as follows: +-- +-- Mixed-Port Read-During-Write +-- When reading at the write address, the read value will be unknown which is +-- aka. "don't care behavior". This applies to all reads (at the same +-- address) which are issued during the write-cycle time, which starts at the +-- rising-edge of the write clock and (in the worst case) extends until the +-- next rising-edge of the write clock. +-- +-- For simulation, always our dedicated simulation model :ref:`IP:ocram_TrueDualPort_sim` +-- is used. +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.config.all; +use work.utils.all; +use work.strings.all; +use work.vectors.all; +use work.mem.all; + + +entity ocram_SimpleDualPort_Optimized is + generic ( + RAM_TYPE : T_RAM_TYPE := RAM_TYPE_AUTO; + ADDRESS_BITS : positive; -- number of address bits + DATA_BITS : positive; -- number of data bits + FILENAME : string := "" -- file-name for RAM initialization + ); + port ( + Write_Clock : in std_logic; -- write clock + Write_ClockEnable : in std_logic; -- write clock-enable + Write_WriteEnable : in std_logic; -- write enable + Write_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- write address + Write_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- data in + + Read_Clock : in std_logic; -- read clock + Read_ClockEnable : in std_logic; -- read clock-enable + Read_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- read address + Read_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) -- data out + ); +end entity; + + +architecture rtl of ocram_SimpleDualPort_Optimized is + constant RAM_Type_Depth : integer_vector := get_ram_type(ADDRESS_BITS, DATA_BITS); + + constant BRAM_width : integer := get_BRAM_half_width(ADDRESS_BITS); + + constant U_Low_Bit : integer := 0; + constant U_High_Bit : integer := ite((RAM_Type_Depth(0) * 72) > DATA_BITS, DATA_BITS, (RAM_Type_Depth(0) * 72)) -1; + constant B_Low_Bit : integer := U_High_Bit +1; + constant B_High_Bit : integer := ite((RAM_Type_Depth(1) * BRAM_width + U_High_Bit +1) > DATA_BITS, DATA_BITS -1, (RAM_Type_Depth(1) * BRAM_width + U_High_Bit)); + constant L_Low_Bit : integer := B_High_Bit +1; + constant L_High_Bit : integer := DATA_BITS -1; + + constant debug_ranges : boolean := false; +begin + assert not debug_ranges report "PoC.ocram_SimpleDualPort_optimized:: D_BITS : " & integer'image(DATA_BITS) severity warning; + assert not debug_ranges report "PoC.ocram_SimpleDualPort_optimized:: U-Ram-Depth : " & integer'image(RAM_Type_Depth(0)) severity warning; + assert not debug_ranges report "PoC.ocram_SimpleDualPort_optimized:: B-Ram-Depth : " & integer'image(RAM_Type_Depth(1)) severity warning; + assert not debug_ranges report "PoC.ocram_SimpleDualPort_optimized:: BRAM_width : " & integer'image(BRAM_width) severity warning; + assert not debug_ranges report "PoC.ocram_SimpleDualPort_optimized:: U_Low_Bit : " & integer'image(U_Low_Bit) severity warning; + assert not debug_ranges report "PoC.ocram_SimpleDualPort_optimized:: U_High_Bit : " & integer'image(U_High_Bit) severity warning; + assert not debug_ranges report "PoC.ocram_SimpleDualPort_optimized:: B_Low_Bit : " & integer'image(B_Low_Bit) severity warning; + assert not debug_ranges report "PoC.ocram_SimpleDualPort_optimized:: B_High_Bit : " & integer'image(B_High_Bit) severity warning; + assert not debug_ranges report "PoC.ocram_SimpleDualPort_optimized:: L_Low_Bit : " & integer'image(L_Low_Bit) severity warning; + assert not debug_ranges report "PoC.ocram_SimpleDualPort_optimized:: L_High_Bit : " & integer'image(L_High_Bit) severity warning; + + optimized_gen : if RAM_TYPE = RAM_TYPE_OPTIMIZED and RAM_Type_Depth(0) /= -1 generate + genURAM : if RAM_Type_Depth(0) > 0 generate + begin + -- Backing Memory + ram : entity work.ocram_SimpleDualPort + generic map ( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => U_High_Bit - U_Low_Bit +1, + RAM_TYPE => RAM_TYPE_ULTRA_RAM + ) + port map ( + Write_Clock => Write_Clock, + Read_Clock => Read_Clock, + Write_ClockEnable => Write_ClockEnable, + + Write_Address => Write_Address, + Write_WriteEnable => Write_WriteEnable, + Write_DataIn => Write_DataIn(U_High_Bit downto U_Low_Bit), + + Read_Address => Read_Address, + Read_ClockEnable => Read_ClockEnable, + Read_DataOut => Read_DataOut(U_High_Bit downto U_Low_Bit) + ); + end generate; + genBRAM : if RAM_Type_Depth(1) > 0 generate + begin + -- Backing Memory + ram : entity work.ocram_SimpleDualPort + generic map ( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => B_High_Bit - B_Low_Bit +1, + RAM_TYPE => RAM_TYPE_BLOCK_RAM + ) + port map ( + Write_Clock => Write_Clock, + Read_Clock => Read_Clock, + Write_ClockEnable => Write_ClockEnable, + + Write_Address => Write_Address, + Write_WriteEnable => Write_WriteEnable, + Write_DataIn => Write_DataIn(B_High_Bit downto B_Low_Bit), + + Read_Address => Read_Address, + Read_ClockEnable => Read_ClockEnable, + Read_DataOut => Read_DataOut(B_High_Bit downto B_Low_Bit) + ); + end generate; + genLRAM : if L_High_Bit >= L_Low_Bit generate + begin + -- Backing Memory + ram : entity work.ocram_SimpleDualPort + generic map ( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => L_High_Bit - L_Low_Bit +1, + RAM_TYPE => RAM_TYPE_LUT_RAM + ) + port map ( + Write_Clock => Write_Clock, + Read_Clock => Read_Clock, + Write_ClockEnable => Write_ClockEnable, + + Write_Address => Write_Address, + Write_WriteEnable => Write_WriteEnable, + Write_DataIn => Write_DataIn(L_High_Bit downto L_Low_Bit), + + Read_Address => Read_Address, + Read_ClockEnable => Read_ClockEnable, + Read_DataOut => Read_DataOut(L_High_Bit downto L_Low_Bit) + ); + end generate; + else generate + ram : entity work.ocram_SimpleDualPort + generic map( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS, + RAM_TYPE => RAM_TYPE, + FILENAME => FILENAME + ) + port map( + Read_Clock => Read_Clock, + Read_ClockEnable => Read_ClockEnable, + Write_Clock => Write_Clock, + Write_ClockEnable => Write_ClockEnable, + Write_WriteEnable => Write_WriteEnable, + Read_Address => Read_Address, + Write_Address => Write_Address, + Write_DataIn => Write_DataIn, + Read_DataOut => Read_DataOut + ); + + end generate; +end architecture; diff --git a/src/mem/ocram/ocram_sdp_wf.vhdl b/src/mem/ocram/ocram_SimpleDualPort_WriteFirst.vhdl similarity index 53% rename from src/mem/ocram/ocram_sdp_wf.vhdl rename to src/mem/ocram/ocram_SimpleDualPort_WriteFirst.vhdl index dae5a1ea6..e48b43580 100644 --- a/src/mem/ocram/ocram_sdp_wf.vhdl +++ b/src/mem/ocram/ocram_SimpleDualPort_WriteFirst.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Entity: Simple dual-port memory with write-first behavior. +-- Entity: Simple dual-port memory with write-first behavior. -- -- Description: -- ------------------------------------- @@ -31,14 +31,15 @@ -- -- License: -- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors -- Copyright 2008-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -47,33 +48,38 @@ -- limitations under the License. -- ============================================================================= -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -entity ocram_sdp_wf is +use work.ocram.all; + +-- XXX: why is this not a mode to ocram_SimpleDualPort? +entity ocram_SimpleDualPort_WriteFirst is generic ( - A_BITS : positive; -- number of address bits - D_BITS : positive; -- number of data bits - FILENAME : string := "" -- file-name for RAM initialization + ADDRESS_BITS : positive; -- number of address bits + DATA_BITS : positive; -- number of data bits + FILENAME : string := "" -- file-name for RAM initialization ); port ( - clk : in std_logic; -- clock - ce : in std_logic; -- clock-enable - we : in std_logic; -- write enable - ra : in unsigned(A_BITS-1 downto 0); -- read address - wa : in unsigned(A_BITS-1 downto 0); -- write address - d : in std_logic_vector(D_BITS-1 downto 0); -- data in - q : out std_logic_vector(D_BITS-1 downto 0) -- data out + Clock : in std_logic; -- clock + ClockEnable : in std_logic; -- clock-enable + + Write_Enable : in std_logic; -- write enable + Write_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- write address + Write_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- data in + + Read_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- read address + Read_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) -- data out ); end entity; -architecture rtl of ocram_sdp_wf is +architecture rtl of ocram_SimpleDualPort_WriteFirst is -- Implementation Notes: -- --------------------- -- - -- I have also checked a modified version of the unit `ocram_sp` with just a + -- I have also checked a modified version of the unit `ocram_SinglePort` with just a -- single clock and an asynchronous read like:: -- -- process(clk) @@ -92,11 +98,11 @@ architecture rtl of ocram_sdp_wf is -- * Altera Quartus 13.0: adds proper bypass-logic as expected. -- -- * Lattice Synthesis Engine: adds proper bypass-logic, but there was an - -- unneccessary multiplexer for the read address to mimic the read enable. + -- unnecessary multiplexer for the read address to mimic the read enable. -- -- * XST 14.7: RAM is mapped to Block-RAM which has not the desired -- read-during-write behavior and also no bypass logic is added. XST adds - -- also an unneccessary multiplexer for the read address to mimic the read + -- also an unnecessary multiplexer for the read address to mimic the read -- enable. -- -- Enforcing distributed RAM gives the desired behavior when synthesizing @@ -105,72 +111,59 @@ architecture rtl of ocram_sdp_wf is -- -- * Vivado 2016.2: RAM is mapped to Block-RAM which has not the desired -- read-during-write behavior and also no bypass logic is added. Vivado - -- adds also an unneccessary multiplexer for the read address to mimic the + -- adds also an unnecessary multiplexer for the read address to mimic the -- read enable. -- -- Enforcing distributed RAM gives the desired behavior when synthesizing -- just this unit. Synthesis results have not yet been checked for larger -- designs. -- - -- Thus, the solution below is to explictly implement the bypass logic. + -- Thus, the solution below is to explicitly implement the bypass logic. - - signal wd_r : std_logic_vector(d'range); -- write data - signal fwd_r : std_logic; -- forward write data - signal ram_q : std_logic_vector(q'range); -- RAM output - - -- Compares two addresses, returns 'X' if either ``a1`` or ``a2`` contains - -- meta-values, otherwise returns '1' if ``a1 == a2`` is true else - -- '0'. Returns 'X' even when the addresses contain '-' values, to signal an - -- undefined outcome. - function addr_equal(a1 : unsigned; a2 : unsigned) return X01 is - begin - -- synthesis translate_off - if is_x(a1) or is_x(a2) then return 'X'; end if; - -- synthesis translate_on - if to_x01(std_logic_vector(a1)) = to_x01(std_logic_vector(a2)) then - return '1'; - end if; - return '0'; - end function; + signal WriteData_d : Write_DataIn'subtype; -- write data + signal Forward_d : std_logic; -- forward write data + signal RAM_DataOut : Read_DataOut'subtype; -- RAM output begin - process(clk) + process(Clock) begin - if rising_edge(clk) then - case to_x01(ce) is + if rising_edge(Clock) then + case to_x01(ClockEnable) is when '1' => - wd_r <= to_x01(d); - fwd_r <= addr_equal(ra, wa) and we; + WriteData_d <= to_x01(Write_DataIn); + Forward_d <= addressIsEqual(Write_Address, Read_Address) and Write_Enable; - when '0' => null; -- keep previous state + when '0' => -- keep previous state + null; when others => -- X propagation in simulation - wd_r <= (others => 'X'); - fwd_r <= 'X'; + WriteData_d <= (others => 'X'); + Forward_d <= 'X'; end case; end if; end process; - ram_sdp: entity work.ocram_sdp + ram_sdp: entity work.ocram_SimpleDualPort generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, - FILENAME => FILENAME) + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS, + FILENAME => FILENAME + ) port map ( - rclk => clk, - rce => ce, - wclk => clk, - wce => ce, - we => we, - ra => ra, - wa => wa, - d => d, - q => ram_q); + Write_Clock => Clock, + Write_ClockEnable => ClockEnable, + Write_WriteEnable => Write_Enable, + Write_Address => Write_Address, + Write_DataIn => Write_DataIn, - with fwd_r select q <= - wd_r when '1', - ram_q when '0', - (others => 'X') when others; -- X propagation in simulation + Read_Clock => Clock, + Read_ClockEnable => ClockEnable, + Read_Address => Read_Address, + Read_DataOut => RAM_DataOut + ); + with Forward_d select Read_DataOut <= + WriteData_d when '1', + RAM_DataOut when '0', + (others => 'X') when others; -- X propagation in simulation end architecture; diff --git a/src/mem/ocram/ocram_SinglePort.vhdl b/src/mem/ocram/ocram_SinglePort.vhdl new file mode 100644 index 000000000..2754d8766 --- /dev/null +++ b/src/mem/ocram/ocram_SinglePort.vhdl @@ -0,0 +1,141 @@ +-- ============================================================================= +-- Authors: Martin Zabel +-- Patrick Lehmann +-- +-- Entity: Single-port memory. +-- +-- Description: +-- ------------------------------------- +-- Inferring / instantiating single port memory, with: +-- +-- * single clock, clock enable, +-- * 1 read/write port. +-- +-- Command Truth Table: +-- +-- == == ================ +-- ce we Command +-- == == ================ +-- 0 X No operation +-- 1 0 Read from memory +-- 1 1 Write to memory +-- == == ================ +-- +-- Both reading and writing are synchronous to the rising-edge of the clock. +-- Thus, when reading, the memory data will be outputted after the +-- clock edge, i.e, in the following clock cycle. +-- +-- When writing data, the read output will output the new data (in the +-- following clock cycle) which is aka. "write-first behavior". This behavior +-- also applies to Altera M20K memory blocks as described in the Altera: +-- "Stratix 5 Device Handbook" (S5-5V1). The documentation in the Altera: +-- "Embedded Memory User Guide" (UG-01068) is wrong. +-- +-- License: +-- ============================================================================= +-- Copyright 2008-2015 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.config.all; +use work.utils.all; +use work.strings.all; +use work.vectors.all; +use work.mem.all; + + +entity ocram_SinglePort is + generic ( + -- FIXME: RAM_STYLE? + ADDRESS_BITS : positive; -- number of address bits + DATA_BITS : positive; -- number of data bits + FILENAME : string := "" -- file-name for RAM initialization + ); + port ( + Clock : in std_logic; -- clock + ClockEnable : in std_logic; -- clock enable + WriteEnable : in std_logic; -- write enable + Address : in unsigned(ADDRESS_BITS-1 downto 0); -- address + DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- write data + DataOut : out std_logic_vector(DATA_BITS-1 downto 0) -- read output + ); +end entity; + + +architecture rtl of ocram_SinglePort is + constant DEPTH : positive := 2**ADDRESS_BITS; + +begin + gen: if gInfer: (VENDOR = VENDOR_GENERIC) or (VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX) generate + signal ram : T_SLVV := mem_InitMemory(FILENAME, DEPTH, DATA_BITS); + signal a_reg : unsigned(ADDRESS_BITS-1 downto 0); + + begin + process (Clock) + begin + if rising_edge(Clock) then + if ClockEnable = '1' then + if WriteEnable = '1' then + ram(to_integer(Address)) <= DataIn; + end if; + + a_reg <= Address; + end if; + end if; + end process; + + DataOut <= (others => 'X') when SIMULATION and is_x(std_logic_vector(a_reg)) else ram(to_integer(a_reg)); -- gets new data + elsif gAltera: VENDOR = VENDOR_ALTERA generate + component ocram_SimplePort_Altera + generic ( + ADDRESS_BITS : positive; + DATA_BITS : positive; + FILENAME : string := "" + ); + port ( + Clock : in std_logic; + ClockEnable : in std_logic; + WriteEnable : in std_logic; + Address : in unsigned(ADDRESS_BITS-1 downto 0); + DataIn : in std_logic_vector(DATA_BITS-1 downto 0); + DataOut : out std_logic_vector(DATA_BITS-1 downto 0)); + end component; + begin + -- Direct instantiation of altsyncram (including component + -- declaration above) is not sufficient for ModelSim. + -- That requires also usage of altera_mf library. + ram_altera: ocram_SimplePort_Altera + generic map ( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS, + FILENAME => FILENAME + ) + port map ( + Clock => Clock, + ClockEnable => ClockEnable, + WriteEnable => WriteEnable, + Address => Address, + DataIn => DataIn, + DataOut => DataOut + ); + else generate + assert FALSE report "Vendor '" & T_VENDOR'image(VENDOR) & "' not yet supported." severity failure; + end generate; +end architecture; diff --git a/src/mem/ocram/ocram_TrueDualPort.vhdl b/src/mem/ocram/ocram_TrueDualPort.vhdl new file mode 100644 index 000000000..e8444509d --- /dev/null +++ b/src/mem/ocram/ocram_TrueDualPort.vhdl @@ -0,0 +1,190 @@ +-- ============================================================================= +-- Authors: Martin Zabel +-- Patrick Lehmann +-- +-- Entity: True dual-port memory. +-- +-- Description: +-- ------------------------------------- +-- Inferring / instantiating true dual-port memory, with: +-- +-- * dual clock, clock enable, +-- * 2 read/write ports. +-- +-- Command truth table for port 1, same applies to port 2: +-- +-- === === ================ +-- ce1 we1 Command +-- === === ================ +-- 0 X No operation +-- 1 0 Read from memory +-- 1 1 Write to memory +-- === === ================ +-- +-- Both reading and writing are synchronous to the rising-edge of the clock. +-- Thus, when reading, the memory data will be outputted after the +-- clock edge, i.e, in the following clock cycle. +-- +-- The generalized behavior across Altera and Xilinx FPGAs since +-- Stratix/Cyclone and Spartan-3/Virtex-5, respectively, is as follows: +-- +-- Same-Port Read-During-Write +-- When writing data through port 1, the read output of the same port +-- (``q1``) will output the new data (``d1``, in the following clock cycle) +-- which is aka. "write-first behavior". +-- +-- Same applies to port 2. +-- +-- Mixed-Port Read-During-Write +-- When reading at the write address, the read value will be unknown which is +-- aka. "don't care behavior". This applies to all reads (at the same +-- address) which are issued during the write-cycle time, which starts at the +-- rising-edge of the write clock and (in the worst case) extends +-- until the next rising-edge of that write clock. +-- +-- For simulation, always our dedicated simulation model :ref:`IP:ocram_TrueDualPort_sim` +-- is used. +-- +-- License: +-- ============================================================================= +-- Copyright 2008-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.config.all; +use work.utils.all; +use work.strings.all; +use work.vectors.all; +use work.mem.all; +use work.ocram.all; + + +entity ocram_TrueDualPort is + generic ( + -- FIXME: Why doesn't it support RAM_STYLE (a subset like BlockRAM and UltraRAM)? + ADDRESS_BITS : positive; -- number of address bits + DATA_BITS : positive; -- number of data bits + FILENAME : string := "" -- file-name for RAM initialization + ); + port ( + PortA_Clock : in std_logic; -- clock for 1st port + PortA_ClockEnable : in std_logic; -- clock-enable for 1st port + PortA_WriteEnable : in std_logic; -- write-enable for 1st port + PortA_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- address for 1st port + PortA_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- write-data for 1st port + PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); -- read-data from 1st port + + PortB_Clock : in std_logic; -- clock for 2nd port + PortB_ClockEnable : in std_logic; -- clock-enable for 2nd port + PortB_WriteEnable : in std_logic; -- write-enable for 2nd port + PortB_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- address for 2nd port + PortB_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- write-data for 2nd port + PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) -- read-data from 2nd port + ); +end entity; + + +architecture rtl of ocram_TrueDualPort is + constant DEPTH : positive := 2**ADDRESS_BITS; + +begin + gen: if gInfer: not SIMULATION and ((VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) generate + signal ram : T_SLVV := mem_InitMemory(FILENAME, DEPTH, DATA_BITS); + signal a1_reg : unsigned(ADDRESS_BITS-1 downto 0) := (others => 'U'); + signal a2_reg : unsigned(ADDRESS_BITS-1 downto 0) := (others => 'U'); + + begin + process (PortA_Clock, PortB_Clock) + begin -- process + if rising_edge(PortA_Clock) then + if PortA_ClockEnable = '1' then + if PortA_WriteEnable = '1' then + ram(to_integer(PortA_Address)) <= PortA_DataIn; + end if; + + a1_reg <= PortA_Address; + end if; + end if; + + if rising_edge(PortB_Clock) then + if PortB_ClockEnable = '1' then + if PortB_WriteEnable = '1' then + ram(to_integer(PortB_Address)) <= PortB_DataIn; + end if; + + a2_reg <= PortB_Address; + end if; + end if; + end process; + + PortA_DataOut <= (others => 'X') when SIMULATION and is_x(std_logic_vector(a1_reg)) else ram(to_integer(a1_reg)); -- returns new data + PortB_DataOut <= (others => 'X') when SIMULATION and is_x(std_logic_vector(a2_reg)) else ram(to_integer(a2_reg)); -- returns new data + elsif gAltera: not SIMULATION and (VENDOR = VENDOR_ALTERA) generate + -- Direct instantiation of altsyncram (including component + -- declaration above) is not sufficient for ModelSim. + -- That requires also usage of altera_mf library. + + ram_altera: component ocram_TrueDualPort_Altera + generic map ( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS, + FILENAME => FILENAME + ) + port map ( + PortA_Clock => PortA_Clock, + PortA_ClockEnable => PortA_ClockEnable, + PortA_WriteEnable => PortA_WriteEnable, + PortA_Address => PortA_Address, + PortA_DataIn => PortA_DataIn, + PortA_DataOut => PortA_DataOut, + + PortB_Clock => PortB_Clock, + PortB_ClockEnable => PortB_ClockEnable, + PortB_WriteEnable => PortB_WriteEnable, + PortB_Address => PortB_Address, + PortB_DataIn => PortB_DataIn, + PortB_DataOut => PortB_DataOut + ); + elsif gSim: SIMULATION generate + sim_tdp: ocram_TrueDualPort_Simulation + generic map ( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS, + FILENAME => FILENAME + ) + port map ( + PortA_Clock => PortA_Clock, + PortA_ClockEnable => PortA_ClockEnable, + PortA_WriteEnable => PortA_WriteEnable, + PortA_Address => PortA_Address, + PortA_DataIn => PortA_DataIn, + PortA_DataOut => PortA_DataOut, + + PortB_Clock => PortB_Clock, + PortB_ClockEnable => PortB_ClockEnable, + PortB_WriteEnable => PortB_WriteEnable, + PortB_Address => PortB_Address, + PortB_DataIn => PortB_DataIn, + PortB_DataOut => PortB_DataOut + ); + else generate + assert FALSE report "Vendor '" & T_VENDOR'image(VENDOR) & "' not yet supported." severity failure; + end generate; +end architecture; diff --git a/src/mem/ocram/ocram_tdp_sim.vhdl b/src/mem/ocram/ocram_TrueDualPort_Simulation.vhdl similarity index 54% rename from src/mem/ocram/ocram_tdp_sim.vhdl rename to src/mem/ocram/ocram_TrueDualPort_Simulation.vhdl index 91f53db23..78e8d7836 100644 --- a/src/mem/ocram/ocram_tdp_sim.vhdl +++ b/src/mem/ocram/ocram_TrueDualPort_Simulation.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Entity: Simulation model for true dual-port memory. +-- Entity: Simulation model for true dual-port memory. -- -- Description: -- ------------------------------------- @@ -18,13 +18,13 @@ -- License: -- ============================================================================= -- Copyright 2016-2016 Technische Universitaet Dresden - Germany --- Chair for VLSI-Design, Diagnostics and Architecture +-- Chair for VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,7 +34,7 @@ -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; @@ -44,56 +44,34 @@ use work.vectors.all; use work.mem.all; -entity ocram_tdp_sim is +entity ocram_TrueDualPort_Simulation is generic ( - A_BITS : positive; -- number of address bits - D_BITS : positive; -- number of data bits - FILENAME : string := "" -- file-name for RAM initialization + ADDRESS_BITS : positive; -- number of address bits + DATA_BITS : positive; -- number of data bits + FILENAME : string := "" -- file-name for RAM initialization ); port ( - clk1 : in std_logic; -- clock for 1st port - clk2 : in std_logic; -- clock for 2nd port - ce1 : in std_logic; -- clock-enable for 1st port - ce2 : in std_logic; -- clock-enable for 2nd port - we1 : in std_logic; -- write-enable for 1st port - we2 : in std_logic; -- write-enable for 2nd port - a1 : in unsigned(A_BITS-1 downto 0); -- address for 1st port - a2 : in unsigned(A_BITS-1 downto 0); -- address for 2nd port - d1 : in std_logic_vector(D_BITS-1 downto 0); -- write-data for 1st port - d2 : in std_logic_vector(D_BITS-1 downto 0); -- write-data for 2nd port - q1 : out std_logic_vector(D_BITS-1 downto 0); -- read-data from 1st port - q2 : out std_logic_vector(D_BITS-1 downto 0) -- read-data from 2nd port + PortA_Clock : in std_logic; -- clock for 1st port + PortA_ClockEnable : in std_logic; -- clock-enable for 1st port + PortA_WriteEnable : in std_logic; -- write-enable for 1st port + PortA_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- address for 1st port + PortA_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- write-data for 1st port + PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); -- read-data from 1st port + + PortB_Clock : in std_logic; -- clock for 2nd port + PortB_ClockEnable : in std_logic; -- clock-enable for 2nd port + PortB_WriteEnable : in std_logic; -- write-enable for 2nd port + PortB_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- address for 2nd port + PortB_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- write-data for 2nd port + PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) -- read-data from 2nd port ); end entity; -architecture sim of ocram_tdp_sim is - constant DEPTH : positive := 2**A_BITS; - subtype word_t is std_logic_vector(D_BITS - 1 downto 0); - type ram_t is array(0 to DEPTH - 1) of word_t; - - impure function ocram_InitMemory(FilePath : string) return ram_t is - variable Memory : T_SLM(DEPTH - 1 downto 0, word_t'range); - variable res : ram_t; - begin - if str_length(FilePath) = 0 then - -- shortcut required by Vivado - return (others => (others => ite(SIMULATION, 'U', '0'))); - elsif mem_FileExtension(FilePath) = "mem" then - Memory := mem_ReadMemoryFile(FilePath, DEPTH, word_t'length, MEM_FILEFORMAT_XILINX_MEM, MEM_CONTENT_HEX); - else - Memory := mem_ReadMemoryFile(FilePath, DEPTH, word_t'length, MEM_FILEFORMAT_INTEL_HEX, MEM_CONTENT_HEX); - end if; +architecture sim of ocram_TrueDualPort_Simulation is + constant WORDS : positive := 2**ADDRESS_BITS; - for i in Memory'range(1) loop - for j in word_t'range loop - res(i)(j) := Memory(i, j); - end loop; - end loop; - return res; - end function; - - signal ram : ram_t := ocram_InitMemory(FILENAME); + signal ram : T_SLVV(0 to WORDS - 1)(DATA_BITS - 1 downto 0) := mem_InitMemory(FILENAME, WORDS, DATA_BITS); -- write to memory, 'X' means maybe write signal write1 : X01; @@ -106,193 +84,193 @@ begin assert SIMULATION report "This model is only for simulation." severity error; -- handle 'U' as 'X' - write1 <= to_x01(ce1 and we1); - read1 <= to_x01(ce1 and not we1); - write2 <= to_x01(ce2 and we2); - read2 <= to_x01(ce2 and not we2); + write1 <= to_x01(PortA_ClockEnable and PortA_WriteEnable); + read1 <= to_x01(PortA_ClockEnable and not PortA_WriteEnable); + write2 <= to_x01(PortB_ClockEnable and PortB_WriteEnable); + read2 <= to_x01(PortB_ClockEnable and not PortB_WriteEnable); - process (clk1, clk2) - -- Flag and address indicating whether a write occurs in the current clock + process (PortA_Clock, PortB_Clock) + -- Flag and address indicating whether a write occurs in the current clock -- cycle. Set and cleared at the rising_edge of the port's clock. -- The write address is set to don't care when the write location is -- undefined, to match all addresses in collision checks from other port. - variable writing1 : boolean; - variable writing2 : boolean; - variable waddr1 : unsigned(A_BITS-1 downto 0); - variable waddr2 : unsigned(A_BITS-1 downto 0); + variable writing1 : boolean; + variable writing2 : boolean; + variable waddr1 : unsigned(ADDRESS_BITS-1 downto 0); + variable waddr2 : unsigned(ADDRESS_BITS-1 downto 0); -- Check for write-collision check on port 1. Only set during one execution -- of the process. variable check_wr1 : boolean; - -- Flag and address indicating whether a read occurs in the current clock + -- Flag and address indicating whether a read occurs in the current clock -- cycle. Set and cleared at the rising_edge of the port's clock. -- In opposition to the writing flag, the reading flag is only set if the -- address is well known and the read succeeded at the rising clock edge. -- A read fails afterwards if a write happens during the read clock cycle. - variable reading1 : boolean; - variable reading2 : boolean; - variable raddr1 : unsigned(A_BITS-1 downto 0); - variable raddr2 : unsigned(A_BITS-1 downto 0); + variable reading1 : boolean; + variable reading2 : boolean; + variable raddr1 : unsigned(ADDRESS_BITS-1 downto 0); + variable raddr2 : unsigned(ADDRESS_BITS-1 downto 0); - begin -- process + begin -- process check_wr1 := false; -- Writing to Memory -- ========================================================================= - if rising_edge(clk1) then + if rising_edge(PortA_Clock) then writing1 := false; waddr1 := (others => '-'); if write1 = '1' then -- RAM is definitely written ... writing1 := true; - if is_x(std_logic_vector(a1)) then + if is_x(std_logic_vector(PortA_Address)) then -- ... but address is unknown ram <= (others => (others => 'X')); else --- ... and address is well known - waddr1 := a1; - ram(to_integer(a1)) <= to_ux01(d1); + waddr1 := PortA_Address; + ram(to_integer(PortA_Address)) <= to_ux01(PortA_DataIn); -- writing2 and waddr2 are not yet up-to-date, check for -- write-collision below check_wr1 := true; end if; -- same-port read during write: return new data - q1 <= to_ux01(d1); + PortA_DataOut <= to_ux01(PortA_DataIn); elsif write1 = 'X' then -- RAM may be written ... writing1 := true; - if is_x(std_logic_vector(a1)) then + if is_x(std_logic_vector(PortA_Address)) then -- ... but address is unknown ram <= (others => (others => 'X')); else --- ... and address is well known - waddr1 := a1; - ram(to_integer(a1)) <= (others => 'X'); + waddr1 := PortA_Address; + ram(to_integer(PortA_Address)) <= (others => 'X'); end if; -- same-port read during write: unknown data - q1 <= (others => 'X'); + PortA_DataOut <= (others => 'X'); end if; end if; -- Must be executed after write to port 1 due to write-collsion check - if rising_edge(clk2) then + if rising_edge(PortB_Clock) then writing2 := false; waddr2 := (others => '-'); if write2 = '1' then -- RAM is definitely written ... writing2 := true; - if is_x(std_logic_vector(a2)) then + if is_x(std_logic_vector(PortB_Address)) then -- ... but address is unknown ram <= (others => (others => 'X')); else --- ... and address is well known - waddr2 := a2; + waddr2 := PortB_Address; -- writing1 and waddr1 are up-to-date, check for write-collision - if writing1 and std_match(waddr1, a2) then - ram(to_integer(a2)) <= (others => 'X'); + if writing1 and std_match(waddr1, PortB_Address) then + ram(to_integer(PortB_Address)) <= (others => 'X'); else - ram(to_integer(a2)) <= to_ux01(d2); + ram(to_integer(PortB_Address)) <= to_ux01(PortB_DataIn); end if; end if; -- same-port read during write: return new data - q2 <= to_ux01(d2); + PortB_DataOut <= to_ux01(PortB_DataIn); elsif write2 = 'X' then -- RAM may be written ... writing2 := true; - if is_x(std_logic_vector(a2)) then + if is_x(std_logic_vector(PortB_Address)) then -- ... but address is unknown ram <= (others => (others => 'X')); else --- ... and address is well known - waddr2 := a2; - ram(to_integer(a2)) <= (others => 'X'); + waddr2 := PortB_Address; + ram(to_integer(PortB_Address)) <= (others => 'X'); end if; -- same-port read during write: unknown data - q1 <= (others => 'X'); + PortA_DataOut <= (others => 'X'); end if; end if; -- writing1 and waddr1 are up-to-date, check for write-collision if check_wr1 then - if writing2 and std_match(waddr2, a1) then - ram(to_integer(a1)) <= (others => 'X'); + if writing2 and std_match(waddr2, PortA_Address) then + ram(to_integer(PortA_Address)) <= (others => 'X'); end if; end if; -- Reading (only) from Memory -- ========================================================================= - if rising_edge(clk1) then + if rising_edge(PortA_Clock) then reading1 := false; raddr1 := (others => '-'); if read1 = '1' then -- Definitely read only from RAM ... - if is_x(std_logic_vector(a1)) then + if is_x(std_logic_vector(PortA_Address)) then -- ... but address is unknown - q1 <= (others => 'X'); + PortA_DataOut <= (others => 'X'); else -- check for mixed-port read-during-write - if writing2 and std_match(a1,waddr2) then - q1 <= (others => 'X'); + if writing2 and std_match(PortA_Address,waddr2) then + PortA_DataOut <= (others => 'X'); else -- further checks are only required if address is well known reading1 := true; - raddr1 := a1; - q1 <= ram(to_integer(a1)); + raddr1 := PortA_Address; + PortA_DataOut <= ram(to_integer(PortA_Address)); end if; end if; elsif read1 = 'X' then -- Maybe read only from RAM - q1 <= (others => 'X'); + PortA_DataOut <= (others => 'X'); end if; end if; - if rising_edge(clk2) then + if rising_edge(PortB_Clock) then reading2 := false; raddr2 := (others => '-'); if read2 = '1' then -- Definitely read only from RAM ... - if is_x(std_logic_vector(a2)) then + if is_x(std_logic_vector(PortB_Address)) then -- ... but address is unknown - q2 <= (others => 'X'); + PortB_DataOut <= (others => 'X'); else -- check for mixed-port read-during-write - if writing1 and std_match(a2,waddr1) then - q2 <= (others => 'X'); + if writing1 and std_match(PortB_Address,waddr1) then + PortB_DataOut <= (others => 'X'); else -- further checks are only required if address is well known reading2 := true; - raddr2 := a2; - q2 <= ram(to_integer(a2)); + raddr2 := PortB_Address; + PortB_DataOut <= ram(to_integer(PortB_Address)); end if; end if; elsif read2 = 'X' then -- Maybe read only from RAM - q2 <= (others => 'X'); + PortB_DataOut <= (others => 'X'); end if; end if; - -- Write-during-read check - -- ========================================================================= + -- Write-during-read check + -- ========================================================================= -- cannot be included in read part above, because check is performed on a -- following rising edge of the write clock (not read clock!). - if rising_edge(clk1) and writing1 then + if rising_edge(PortA_Clock) and writing1 then if reading2 and std_match(raddr2, waddr1) then -- read is disturbed by a write during the read clock cycle - q2 <= (others => 'X'); + PortB_DataOut <= (others => 'X'); end if; end if; - if rising_edge(clk2) and writing2 then + if rising_edge(PortB_Clock) and writing2 then if reading1 and std_match(raddr1, waddr2) then -- read is disturbed by a write during the read clock cycle - q1 <= (others => 'X'); + PortA_DataOut <= (others => 'X'); end if; end if; end process; diff --git a/src/mem/ocram/ocram_tdp_wf.vhdl b/src/mem/ocram/ocram_TrueDualPort_WriteFirst.vhdl similarity index 54% rename from src/mem/ocram/ocram_tdp_wf.vhdl rename to src/mem/ocram/ocram_TrueDualPort_WriteFirst.vhdl index e062adf6a..c673205bc 100644 --- a/src/mem/ocram/ocram_tdp_wf.vhdl +++ b/src/mem/ocram/ocram_TrueDualPort_WriteFirst.vhdl @@ -1,8 +1,8 @@ -- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann +-- Authors: Martin Zabel +-- Patrick Lehmann -- --- Entity: True dual-port memory with write-first behavior. +-- Entity: True dual-port memory with write-first behavior. -- -- Description: -- ------------------------------------- @@ -43,19 +43,20 @@ -- If a write is issued on both ports to the same address, then the output of -- this unit and the content of the addressed memory cell are undefined. -- --- For simulation, always our dedicated simulation model :ref:`IP:ocram_tdp_sim` +-- For simulation, always our dedicated simulation model :ref:`IP:ocram_TrueDualPort_sim` -- is used. -- -- License: -- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors -- Copyright 2008-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -65,7 +66,7 @@ -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; @@ -74,72 +75,61 @@ use work.utils.all; use work.strings.all; use work.vectors.all; use work.mem.all; +use work.ocram.all; -entity ocram_tdp_wf is +entity ocram_TrueDualPort_WriteFirst is generic ( - A_BITS : positive; -- number of address bits - D_BITS : positive; -- number of data bits - FILENAME : string := "" -- file-name for RAM initialization + ADDRESS_BITS : positive; -- number of address bits + DATA_BITS : positive; -- number of data bits + FILENAME : string := "" -- file-name for RAM initialization ); port ( - clk : in std_logic; -- clock - ce : in std_logic; -- clock-enable - we1 : in std_logic; -- write-enable for 1st port - we2 : in std_logic; -- write-enable for 2nd port - a1 : in unsigned(A_BITS-1 downto 0); -- address for 1st port - a2 : in unsigned(A_BITS-1 downto 0); -- address for 2nd port - d1 : in std_logic_vector(D_BITS-1 downto 0); -- write-data for 1st port - d2 : in std_logic_vector(D_BITS-1 downto 0); -- write-data for 2nd port - q1 : out std_logic_vector(D_BITS-1 downto 0); -- read-data from 1st port - q2 : out std_logic_vector(D_BITS-1 downto 0) -- read-data from 2nd port + Clock : in std_logic; -- clock + ClockEnable : in std_logic; -- clock-enable + PortA_WriteEnable : in std_logic; -- write-enable for 1st port + PortB_WriteEnable : in std_logic; -- write-enable for 2nd port + PortA_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- address for 1st port + PortB_Address : in unsigned(ADDRESS_BITS-1 downto 0); -- address for 2nd port + PortA_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- write-data for 1st port + PortB_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); -- write-data for 2nd port + PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); -- read-data from 1st port + PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) -- read-data from 2nd port ); end entity; -architecture rtl of ocram_tdp_wf is +architecture rtl of ocram_TrueDualPort_WriteFirst is -- Two read/write ports are only supported in true-dual port block memories -- on FPGAs. But not all synthesis tools, do infer the required bypass logic - -- as already shown for :ref:`IP:ocram_sdp_wf`. + -- as already shown for :ref:`IP:ocram_SimpleDualPort_wf`. -- Thus, bypass logic has to be explicitly described to get the intended -- write-first behavior. - signal wd1_r : std_logic_vector(d1'range); -- write data from port 1 - signal wd2_r : std_logic_vector(d2'range); -- write data from port 2 + signal wd1_r : std_logic_vector(PortA_DataIn'range); -- write data from port 1 + signal wd2_r : std_logic_vector(PortB_DataIn'range); -- write data from port 2 signal fwd1_r : std_logic; -- forward write data from port 1 to port 2 signal fwd2_r : std_logic; -- forward write data from port 2 to port 1 - signal ram_q1 : std_logic_vector(q1'range); -- RAM output, port 1 - signal ram_q2 : std_logic_vector(q2'range); -- RAM output, port 2 - - -- Compares two addresses, returns 'X' if either ``a1`` or ``a2`` contains - -- meta-values, otherwise returns '1' if ``a1 == a2`` is true else - -- '0'. Returns 'X' even when the addresses contain '-' values, to signal an - -- undefined outcome. - function addr_equal(a1 : unsigned; a2 : unsigned) return X01 is - begin - -- synthesis translate_off - if is_x(a1) or is_x(a2) then return 'X'; end if; - -- synthesis translate_on - if to_x01(std_logic_vector(a1)) = to_x01(std_logic_vector(a2)) then - return '1'; - end if; - return '0'; - end function; + signal ram_q1 : std_logic_vector(PortA_DataOut'range); -- RAM output, port 1 + signal ram_q2 : std_logic_vector(PortB_DataOut'range); -- RAM output, port 2 + + begin - process(clk) + process(Clock) variable addr_eq : X01; begin - if rising_edge(clk) then - case to_x01(ce) is + if rising_edge(Clock) then + case to_x01(ClockEnable) is when '1' => - wd1_r <= to_x01(d1); - wd2_r <= to_x01(d2); - addr_eq := addr_equal(a1, a2); - fwd1_r <= addr_eq and we1; - fwd2_r <= addr_eq and we2; + wd1_r <= to_x01(PortA_DataIn); + wd2_r <= to_x01(PortB_DataIn); + addr_eq := addressIsEqual(PortA_Address, PortB_Address); + fwd1_r <= addr_eq and PortA_WriteEnable; + fwd2_r <= addr_eq and PortB_WriteEnable; - when '0' => null; -- keep previous state + when '0' => -- keep previous state + null; when others => -- X propagation in simulation wd1_r <= (others => 'X'); @@ -148,38 +138,36 @@ begin end case; if SIMULATION then - if (fwd1_r and fwd2_r) = '1' then - report "ERROR: both ports write to the same address." severity error; - end if; + assert (fwd1_r and fwd2_r) /= '1' report "ERROR: both ports write to the same address." severity error; end if; end if; end process; - ram_tdp: entity work.ocram_tdp + ram_tdp: entity work.ocram_TrueDualPort generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS, FILENAME => FILENAME) port map ( - clk1 => clk, - clk2 => clk, - ce1 => ce, - ce2 => ce, - we1 => we1, - we2 => we2, - a1 => a1, - a2 => a2, - d1 => d1, - d2 => d2, - q1 => ram_q1, - q2 => ram_q2); - - with fwd1_r select q2 <= + PortA_Clock => Clock, + PortB_Clock => Clock, + PortA_ClockEnable => ClockEnable, + PortB_ClockEnable => ClockEnable, + PortA_WriteEnable => PortA_WriteEnable, + PortB_WriteEnable => PortB_WriteEnable, + PortA_Address => PortA_Address, + PortB_Address => PortB_Address, + PortA_DataIn => PortA_DataIn, + PortB_DataIn => PortB_DataIn, + PortA_DataOut => ram_q1, + PortB_DataOut => ram_q2); + + with fwd1_r select PortB_DataOut <= wd1_r when '1', ram_q2 when '0', (others => 'X') when others; -- X propagation in simulation - with fwd2_r select q1 <= + with fwd2_r select PortA_DataOut <= wd2_r when '1', ram_q1 when '0', (others => 'X') when others; -- X propagation in simulation diff --git a/src/mem/ocram/ocram_esdp.vhdl b/src/mem/ocram/ocram_esdp.vhdl deleted file mode 100644 index c5b760b88..000000000 --- a/src/mem/ocram/ocram_esdp.vhdl +++ /dev/null @@ -1,237 +0,0 @@ --- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann --- --- Entity: Enhanced simple dual-port memory. --- --- Description: --- ------------------------------------- --- Inferring / instantiating enhanced simple dual-port memory, with: --- --- * dual clock, clock enable, --- * 1 read/write port (1st port) plus 1 read port (2nd port). --- --- .. deprecated:: 1.1 --- --- **Please use** :ref:`IP:ocram_tdp` **for new designs. --- This component has been provided because older FPGA compilers where not --- able to infer true dual-port memory from an RTL description.** --- --- Command truth table for port 1: --- --- === === ================ --- ce1 we1 Command --- === === ================ --- 0 X No operation --- 1 0 Read from memory --- 1 1 Write to memory --- === === ================ --- --- Command truth table for port 2: --- --- === ================ --- ce2 Command --- === ================ --- 0 No operation --- 1 Read from memory --- === ================ --- --- Both reading and writing are synchronous to the rising-edge of the clock. --- Thus, when reading, the memory data will be outputted after the --- clock edge, i.e, in the following clock cycle. --- --- The generalized behavior across Altera and Xilinx FPGAs since --- Stratix/Cyclone and Spartan-3/Virtex-5, respectively, is as follows: --- --- Same-Port Read-During-Write --- When writing data through port 1, the read output of the same port --- (``q1``) will output the new data (``d1``, in the following clock cycle) --- which is aka. "write-first behavior". --- --- Mixed-Port Read-During-Write --- When reading at the write address, the read value will be unknown which is --- aka. "don't care behavior". This applies to all reads (at the same --- address) which are issued during the write-cycle time, which starts at the --- rising-edge of the write clock (``clk1``) and (in the worst case) extends --- until the next rising-edge of the write clock. --- --- For simulation, always our dedicated simulation model :ref:`IP:ocram_tdp_sim` --- is used. --- --- License: --- ============================================================================= --- Copyright 2008-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -use STD.TextIO.all; - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -use work.config.all; -use work.utils.all; -use work.strings.all; -use work.vectors.all; -use work.mem.all; - - -entity ocram_esdp is - generic ( - A_BITS : positive; -- number of address bits - D_BITS : positive; -- number of data bits - FILENAME : string := "" -- file-name for RAM initialization - ); - port ( - clk1 : in std_logic; -- clock for 1st port - clk2 : in std_logic; -- clock for 2nd port - ce1 : in std_logic; -- clock-enable for 1st port - ce2 : in std_logic; -- clock-enable for 2nd port - we1 : in std_logic; -- write-enable for 1st port - a1 : in unsigned(A_BITS-1 downto 0); -- address for 1st port - a2 : in unsigned(A_BITS-1 downto 0); -- address for 2nd port - d1 : in std_logic_vector(D_BITS-1 downto 0); -- write-data for 1st port - q1 : out std_logic_vector(D_BITS-1 downto 0); -- read-data from 1st port - q2 : out std_logic_vector(D_BITS-1 downto 0) -- read-data from 2nd port - ); -end entity; - - -architecture rtl of ocram_esdp is - constant DEPTH : positive := 2**A_BITS; - -begin - gInfer : if not SIMULATION and ((VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) generate - - -- For Xilinx ISE, Xilinx Vivado and Lattice LSE we can reuse the ocram_tdp. - -- - -- **Attention**: This encapsulation is mandatory for Xilinx Vivado, - -- otherwise Vivado synthesizes a lot of LUT-RAM instead of Block-RAM. - ram_tdp: entity work.ocram_tdp - generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, - FILENAME => FILENAME) - port map ( - clk1 => clk1, - clk2 => clk2, - ce1 => ce1, - ce2 => ce2, - we1 => we1, - we2 => '0', - a1 => a1, - a2 => a2, - d1 => d1, - d2 => (others => '0'), - q1 => q1, - q2 => q2); - end generate gInfer; - - gAltera: if not SIMULATION and (VENDOR = VENDOR_ALTERA) generate - component ocram_tdp_altera - generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string := "" - ); - port ( - clk1 : in std_logic; - clk2 : in std_logic; - ce1 : in std_logic; - ce2 : in std_logic; - we1 : in std_logic; - we2 : in std_logic; - a1 : in unsigned(A_BITS-1 downto 0); - a2 : in unsigned(A_BITS-1 downto 0); - d1 : in std_logic_vector(D_BITS-1 downto 0); - d2 : in std_logic_vector(D_BITS-1 downto 0); - q1 : out std_logic_vector(D_BITS-1 downto 0); - q2 : out std_logic_vector(D_BITS-1 downto 0) - ); - end component; - begin - -- Direct instantiation of altsyncram (including component - -- declaration above) is not sufficient for ModelSim. - -- That requires also usage of altera_mf library. - ram_altera: ocram_tdp_altera - generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, - FILENAME => FILENAME - ) - port map ( - clk1 => clk1, - clk2 => clk2, - ce1 => ce1, - ce2 => ce2, - we1 => we1, - we2 => '0', - a1 => a1, - a2 => a2, - d1 => d1, - d2 => (others => '0'), - q1 => q1, - q2 => q2 - ); - end generate gAltera; - - gSim: if SIMULATION generate - -- Use component instantiation so that simulation model can be excluded - -- from synthesis. - component ocram_tdp_sim is - generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string); - port ( - clk1 : in std_logic; - clk2 : in std_logic; - ce1 : in std_logic; - ce2 : in std_logic; - we1 : in std_logic; - we2 : in std_logic; - a1 : in unsigned(A_BITS-1 downto 0); - a2 : in unsigned(A_BITS-1 downto 0); - d1 : in std_logic_vector(D_BITS-1 downto 0); - d2 : in std_logic_vector(D_BITS-1 downto 0); - q1 : out std_logic_vector(D_BITS-1 downto 0); - q2 : out std_logic_vector(D_BITS-1 downto 0)); - end component ocram_tdp_sim; - begin - sim_tdp: ocram_tdp_sim - generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, - FILENAME => FILENAME) - port map ( - clk1 => clk1, - clk2 => clk2, - ce1 => ce1, - ce2 => ce2, - we1 => we1, - we2 => '0', - a1 => a1, - a2 => a2, - d1 => d1, - d2 => (others => '0'), - q1 => q1, - q2 => q2); - end generate gSim; - - assert ((VENDOR = VENDOR_ALTERA) or (VENDOR = VENDOR_GENERIC and SIMULATION) or (VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) - report "Vendor '" & T_VENDOR'image(VENDOR) & "' not yet supported." - severity failure; -end architecture; diff --git a/src/mem/ocram/ocram_sdp.vhdl b/src/mem/ocram/ocram_sdp.vhdl deleted file mode 100644 index f387e4326..000000000 --- a/src/mem/ocram/ocram_sdp.vhdl +++ /dev/null @@ -1,198 +0,0 @@ --- ============================================================================= --- Authors: Martin Zabel --- Thomas B. Preusser --- Patrick Lehmann --- Stefan Unrein --- --- Entity: Simple dual-port memory. --- --- Description: --- ------------------------------------- --- Inferring / instantiating simple dual-port memory, with: --- --- * dual clock, clock enable, --- * 1 read port plus 1 write port. --- --- Both reading and writing are synchronous to the rising-edge of the clock. --- Thus, when reading, the memory data will be outputted after the --- clock edge, i.e, in the following clock cycle. --- --- The generalized behavior across Altera and Xilinx FPGAs since --- Stratix/Cyclone and Spartan-3/Virtex-5, respectively, is as follows: --- --- Mixed-Port Read-During-Write --- When reading at the write address, the read value will be unknown which is --- aka. "don't care behavior". This applies to all reads (at the same --- address) which are issued during the write-cycle time, which starts at the --- rising-edge of the write clock and (in the worst case) extends until the --- next rising-edge of the write clock. --- --- For simulation, always our dedicated simulation model :ref:`IP:ocram_tdp_sim` --- is used. --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- Copyright 2008-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -use work.config.all; -use work.utils.all; -use work.strings.all; -use work.vectors.all; -use work.mem.all; - - -entity ocram_sdp is - generic ( - A_BITS : positive; -- number of address bits - D_BITS : positive; -- number of data bits - RAM_TYPE : T_RAM_TYPE := RAM_TYPE_AUTO; - FILENAME : string := "" -- file-name for RAM initialization - ); - port ( - rclk : in std_logic; -- read clock - rce : in std_logic; -- read clock-enable - wclk : in std_logic; -- write clock - wce : in std_logic; -- write clock-enable - we : in std_logic; -- write enable - ra : in unsigned(A_BITS-1 downto 0); -- read address - wa : in unsigned(A_BITS-1 downto 0); -- write address - d : in std_logic_vector(D_BITS-1 downto 0); -- data in - q : out std_logic_vector(D_BITS-1 downto 0) -- data out - ); -end entity; - - -architecture rtl of ocram_sdp is - constant DEPTH : positive := 2**A_BITS; - -begin - - gInfer : if not SIMULATION and ((VENDOR = VENDOR_ALTERA) or (VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) generate - -- RAM can be inferred correctly - -- Xilinx notes: - -- WRITE_MODE is set to WRITE_FIRST, but this also means that read data - -- is unknown on the opposite port. (As expected.) - -- Altera notes: - -- Setting attribute "ramstyle" to "no_rw_check" suppresses generation of - -- bypass logic, when 'clk1'='clk2' and 'ra' is feed from a register. - -- This is the expected behaviour. - -- With two different clocks, synthesis complains about an undefined - -- read-write behaviour, that can be ignored. - attribute ram_style : string; - attribute ramstyle : string; - - subtype word_t is std_logic_vector(D_BITS - 1 downto 0); - type ram_t is array(0 to DEPTH - 1) of word_t; - - -- Compute the initialization of a RAM array, if specified, from the passed file. - impure function ocram_InitMemory(FilePath : string) return ram_t is - variable Memory : T_SLM(DEPTH - 1 downto 0, word_t'range); - variable res : ram_t; - begin - if str_length(FilePath) = 0 then - -- shortcut required by Vivado - return (others => (others => ite(SIMULATION, 'U', '0'))); - elsif mem_FileExtension(FilePath) = "mem" then - Memory := mem_ReadMemoryFile(FilePath, DEPTH, word_t'length, MEM_FILEFORMAT_XILINX_MEM, MEM_CONTENT_HEX); - else - Memory := mem_ReadMemoryFile(FilePath, DEPTH, word_t'length, MEM_FILEFORMAT_INTEL_HEX, MEM_CONTENT_HEX); - end if; - - for i in Memory'range(1) loop - for j in word_t'range loop - res(i)(j) := Memory(i, j); - end loop; - end loop; - return res; - end function; - - signal ram : ram_t := ocram_InitMemory(FILENAME); - attribute ramstyle of ram : signal is get_ramstyle_string(RAM_TYPE); - attribute ram_style of ram : signal is get_ram_style_string(RAM_TYPE); - - begin - process(wclk) - begin - if rising_edge(wclk) then - if (wce and we) = '1' then - ram(to_integer(wa)) <= d; - end if; - end if; - end process; - - process(rclk) - begin - if rising_edge(rclk) then - if rce = '1' then - q <= ram(to_integer(ra)); - end if; - end if; - end process; - end generate gInfer; - - gSim: if SIMULATION generate - -- Use component instantiation so that simulation model can be excluded - -- from synthesis. - component ocram_tdp_sim is - generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string); - port ( - clk1 : in std_logic; - clk2 : in std_logic; - ce1 : in std_logic; - ce2 : in std_logic; - we1 : in std_logic; - we2 : in std_logic; - a1 : in unsigned(A_BITS-1 downto 0); - a2 : in unsigned(A_BITS-1 downto 0); - d1 : in std_logic_vector(D_BITS-1 downto 0); - d2 : in std_logic_vector(D_BITS-1 downto 0); - q1 : out std_logic_vector(D_BITS-1 downto 0); - q2 : out std_logic_vector(D_BITS-1 downto 0)); - end component ocram_tdp_sim; - begin - sim_tdp: ocram_tdp_sim - generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, - FILENAME => FILENAME) - port map ( - clk1 => wclk, - clk2 => rclk, - ce1 => wce, - ce2 => rce, - we1 => we, - we2 => '0', - a1 => wa, - a2 => ra, - d1 => d, - d2 => (others => '0'), - q1 => open, - q2 => q); - end generate gSim; - - assert ((VENDOR = VENDOR_ALTERA) or (VENDOR = VENDOR_GENERIC and SIMULATION) or (VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) - report "Vendor '" & T_VENDOR'image(VENDOR) & "' not yet supported." - severity failure; -end architecture; diff --git a/src/mem/ocram/ocram_sdp_optimized.vhdl b/src/mem/ocram/ocram_sdp_optimized.vhdl deleted file mode 100644 index 5a3dd05e4..000000000 --- a/src/mem/ocram/ocram_sdp_optimized.vhdl +++ /dev/null @@ -1,196 +0,0 @@ --- ============================================================================= --- Authors: Patrick Lehmann --- Stefan Unrein --- --- Entity: Simple dual-port memory. --- --- Description: --- ------------------------------------- --- Inferring / instantiating simple dual-port memory, with: --- --- * dual clock, clock enable, --- * 1 read port plus 1 write port. --- --- Both reading and writing are synchronous to the rising-edge of the clock. --- Thus, when reading, the memory data will be outputted after the --- clock edge, i.e, in the following clock cycle. --- --- The generalized behavior across Altera and Xilinx FPGAs since --- Stratix/Cyclone and Spartan-3/Virtex-5, respectively, is as follows: --- --- Mixed-Port Read-During-Write --- When reading at the write address, the read value will be unknown which is --- aka. "don't care behavior". This applies to all reads (at the same --- address) which are issued during the write-cycle time, which starts at the --- rising-edge of the write clock and (in the worst case) extends until the --- next rising-edge of the write clock. --- --- For simulation, always our dedicated simulation model :ref:`IP:ocram_tdp_sim` --- is used. --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -use work.config.all; -use work.utils.all; -use work.strings.all; -use work.vectors.all; -use work.mem.all; - - -entity ocram_sdp_optimized is - generic ( - A_BITS : positive; -- number of address bits - D_BITS : positive; -- number of data bits - RAM_TYPE : T_RAM_TYPE := RAM_TYPE_AUTO; - FILENAME : string := "" -- file-name for RAM initialization - ); - port ( - rclk : in std_logic; -- read clock - rce : in std_logic; -- read clock-enable - wclk : in std_logic; -- write clock - wce : in std_logic; -- write clock-enable - we : in std_logic; -- write enable - ra : in unsigned(A_BITS-1 downto 0); -- read address - wa : in unsigned(A_BITS-1 downto 0); -- write address - d : in std_logic_vector(D_BITS-1 downto 0); -- data in - q : out std_logic_vector(D_BITS-1 downto 0) -- data out - ); -end entity; - - -architecture rtl of ocram_sdp_optimized is - constant RAM_Type_Depth : T_INTVEC := get_ram_type(A_BITS, D_BITS); - - constant BRAM_width : integer := get_BRAM_half_width(A_BITS); - - constant U_Low_Bit : integer := 0; - constant U_High_Bit : integer := ite((RAM_Type_Depth(0) * 72) > D_BITS, D_BITS, (RAM_Type_Depth(0) * 72)) -1; - constant B_Low_Bit : integer := U_High_Bit +1; - constant B_High_Bit : integer := ite((RAM_Type_Depth(1) * BRAM_width + U_High_Bit +1) > D_BITS, D_BITS -1, (RAM_Type_Depth(1) * BRAM_width + U_High_Bit)); - constant L_Low_Bit : integer := B_High_Bit +1; - constant L_High_Bit : integer := D_BITS -1; - - constant debug_ranges : boolean := false; -begin - assert not debug_ranges report "PoC.ocram_sdp_optimized:: D_BITS : " & integer'image(D_BITS) severity warning; - assert not debug_ranges report "PoC.ocram_sdp_optimized:: U-Ram-Depth : " & integer'image(RAM_Type_Depth(0)) severity warning; - assert not debug_ranges report "PoC.ocram_sdp_optimized:: B-Ram-Depth : " & integer'image(RAM_Type_Depth(1)) severity warning; - assert not debug_ranges report "PoC.ocram_sdp_optimized:: BRAM_width : " & integer'image(BRAM_width) severity warning; - assert not debug_ranges report "PoC.ocram_sdp_optimized:: U_Low_Bit : " & integer'image(U_Low_Bit) severity warning; - assert not debug_ranges report "PoC.ocram_sdp_optimized:: U_High_Bit : " & integer'image(U_High_Bit) severity warning; - assert not debug_ranges report "PoC.ocram_sdp_optimized:: B_Low_Bit : " & integer'image(B_Low_Bit) severity warning; - assert not debug_ranges report "PoC.ocram_sdp_optimized:: B_High_Bit : " & integer'image(B_High_Bit) severity warning; - assert not debug_ranges report "PoC.ocram_sdp_optimized:: L_Low_Bit : " & integer'image(L_Low_Bit) severity warning; - assert not debug_ranges report "PoC.ocram_sdp_optimized:: L_High_Bit : " & integer'image(L_High_Bit) severity warning; - - optimized_gen : if RAM_TYPE = RAM_TYPE_OPTIMIZED and RAM_Type_Depth(0) /= -1 generate - genURAM : if RAM_Type_Depth(0) > 0 generate - begin - -- Backing Memory - ram : entity work.ocram_sdp - generic map ( - A_BITS => A_BITS, - D_BITS => U_High_Bit - U_Low_Bit +1, - RAM_TYPE => RAM_TYPE_ULTRA_RAM - ) - port map ( - wclk => wclk, - rclk => rclk, - wce => wce, - - wa => wa, - we => we, - d => d(U_High_Bit downto U_Low_Bit), - - ra => ra, - rce => rce, - q => q(U_High_Bit downto U_Low_Bit) - ); - end generate; - genBRAM : if RAM_Type_Depth(1) > 0 generate - begin - -- Backing Memory - ram : entity work.ocram_sdp - generic map ( - A_BITS => A_BITS, - D_BITS => B_High_Bit - B_Low_Bit +1, - RAM_TYPE => RAM_TYPE_BLOCK_RAM - ) - port map ( - wclk => wclk, - rclk => rclk, - wce => wce, - - wa => wa, - we => we, - d => d(B_High_Bit downto B_Low_Bit), - - ra => ra, - rce => rce, - q => q(B_High_Bit downto B_Low_Bit) - ); - end generate; - genLRAM : if L_High_Bit >= L_Low_Bit generate - begin - -- Backing Memory - ram : entity work.ocram_sdp - generic map ( - A_BITS => A_BITS, - D_BITS => L_High_Bit - L_Low_Bit +1, - RAM_TYPE => RAM_TYPE_LUT_RAM - ) - port map ( - wclk => wclk, - rclk => rclk, - wce => wce, - - wa => wa, - we => we, - d => d(L_High_Bit downto L_Low_Bit), - - ra => ra, - rce => rce, - q => q(L_High_Bit downto L_Low_Bit) - ); - end generate; - else generate - ram : entity work.ocram_sdp - generic map( - A_BITS => A_BITS, - D_BITS => D_BITS, - RAM_TYPE => RAM_TYPE, - FILENAME => FILENAME - ) - port map( - rclk => rclk, - rce => rce, - wclk => wclk, - wce => wce, - we => we, - ra => ra, - wa => wa, - d => d, - q => q - ); - - end generate; -end architecture; diff --git a/src/mem/ocram/ocram_sp.vhdl b/src/mem/ocram/ocram_sp.vhdl deleted file mode 100644 index 27d2f76af..000000000 --- a/src/mem/ocram/ocram_sp.vhdl +++ /dev/null @@ -1,173 +0,0 @@ --- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann --- --- Entity: Single-port memory. --- --- Description: --- ------------------------------------- --- Inferring / instantiating single port memory, with: --- --- * single clock, clock enable, --- * 1 read/write port. --- --- Command Truth Table: --- --- == == ================ --- ce we Command --- == == ================ --- 0 X No operation --- 1 0 Read from memory --- 1 1 Write to memory --- == == ================ --- --- Both reading and writing are synchronous to the rising-edge of the clock. --- Thus, when reading, the memory data will be outputted after the --- clock edge, i.e, in the following clock cycle. --- --- When writing data, the read output will output the new data (in the --- following clock cycle) which is aka. "write-first behavior". This behavior --- also applies to Altera M20K memory blocks as described in the Altera: --- "Stratix 5 Device Handbook" (S5-5V1). The documentation in the Altera: --- "Embedded Memory User Guide" (UG-01068) is wrong. --- --- License: --- ============================================================================= --- Copyright 2008-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -use work.config.all; -use work.utils.all; -use work.strings.all; -use work.vectors.all; -use work.mem.all; - - -entity ocram_sp is - generic ( - A_BITS : positive; -- number of address bits - D_BITS : positive; -- number of data bits - FILENAME : string := "" -- file-name for RAM initialization - ); - port ( - clk : in std_logic; -- clock - ce : in std_logic; -- clock enable - we : in std_logic; -- write enable - a : in unsigned(A_BITS-1 downto 0); -- address - d : in std_logic_vector(D_BITS-1 downto 0); -- write data - q : out std_logic_vector(D_BITS-1 downto 0) -- read output - ); -end entity; - - -architecture rtl of ocram_sp is - constant DEPTH : positive := 2**A_BITS; - -begin - - gInfer : if (VENDOR = VENDOR_GENERIC) or (VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX) generate - -- RAM can be inferred correctly - -- XST Advanced HDL Synthesis generates single-port memory as expected. - subtype word_t is std_logic_vector(D_BITS - 1 downto 0); - type ram_t is array(0 to DEPTH - 1) of word_t; - - -- Compute the initialization of a RAM array, if specified, from the passed file. - impure function ocram_InitMemory(FilePath : string) return ram_t is - variable Memory : T_SLM(DEPTH - 1 downto 0, word_t'range); - variable res : ram_t; - begin - if str_length(FilePath) = 0 then - -- shortcut required by Vivado - return (others => (others => ite(SIMULATION, 'U', '0'))); - elsif mem_FileExtension(FilePath) = "mem" then - Memory := mem_ReadMemoryFile(FilePath, DEPTH, word_t'length, MEM_FILEFORMAT_XILINX_MEM, MEM_CONTENT_HEX); - else - Memory := mem_ReadMemoryFile(FilePath, DEPTH, word_t'length, MEM_FILEFORMAT_INTEL_HEX, MEM_CONTENT_HEX); - end if; - - for i in Memory'range(1) loop - for j in word_t'range loop - res(i)(j) := Memory(i, j); - end loop; - end loop; - return res; - end function; - - signal ram : ram_t := ocram_InitMemory(FILENAME); - signal a_reg : unsigned(A_BITS-1 downto 0); - - begin - process (clk) - begin - if rising_edge(clk) then - if ce = '1' then - if we = '1' then - ram(to_integer(a)) <= d; - end if; - - a_reg <= a; - end if; - end if; - end process; - - q <= (others => 'X') when SIMULATION and is_x(std_logic_vector(a_reg)) else - ram(to_integer(a_reg)); -- gets new data - end generate gInfer; - - gAltera: if VENDOR = VENDOR_ALTERA generate - component ocram_sp_altera - generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string := "" - ); - port ( - clk : in std_logic; - ce : in std_logic; - we : in std_logic; - a : in unsigned(A_BITS-1 downto 0); - d : in std_logic_vector(D_BITS-1 downto 0); - q : out std_logic_vector(D_BITS-1 downto 0)); - end component; - begin - -- Direct instantiation of altsyncram (including component - -- declaration above) is not sufficient for ModelSim. - -- That requires also usage of altera_mf library. - ram_altera: ocram_sp_altera - generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, - FILENAME => FILENAME - ) - port map ( - clk => clk, - ce => ce, - we => we, - a => a, - d => d, - q => q - ); - end generate gAltera; - - assert ((VENDOR = VENDOR_ALTERA) or (VENDOR = VENDOR_GENERIC) or (VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) - report "Vendor '" & T_VENDOR'image(VENDOR) & "' not yet supported." - severity failure; -end architecture; diff --git a/src/mem/ocram/ocram_tdp.vhdl b/src/mem/ocram/ocram_tdp.vhdl deleted file mode 100644 index bb3fd2752..000000000 --- a/src/mem/ocram/ocram_tdp.vhdl +++ /dev/null @@ -1,262 +0,0 @@ --- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann --- --- Entity: True dual-port memory. --- --- Description: --- ------------------------------------- --- Inferring / instantiating true dual-port memory, with: --- --- * dual clock, clock enable, --- * 2 read/write ports. --- --- Command truth table for port 1, same applies to port 2: --- --- === === ================ --- ce1 we1 Command --- === === ================ --- 0 X No operation --- 1 0 Read from memory --- 1 1 Write to memory --- === === ================ --- --- Both reading and writing are synchronous to the rising-edge of the clock. --- Thus, when reading, the memory data will be outputted after the --- clock edge, i.e, in the following clock cycle. --- --- The generalized behavior across Altera and Xilinx FPGAs since --- Stratix/Cyclone and Spartan-3/Virtex-5, respectively, is as follows: --- --- Same-Port Read-During-Write --- When writing data through port 1, the read output of the same port --- (``q1``) will output the new data (``d1``, in the following clock cycle) --- which is aka. "write-first behavior". --- --- Same applies to port 2. --- --- Mixed-Port Read-During-Write --- When reading at the write address, the read value will be unknown which is --- aka. "don't care behavior". This applies to all reads (at the same --- address) which are issued during the write-cycle time, which starts at the --- rising-edge of the write clock and (in the worst case) extends --- until the next rising-edge of that write clock. --- --- For simulation, always our dedicated simulation model :ref:`IP:ocram_tdp_sim` --- is used. --- --- License: --- ============================================================================= --- Copyright 2008-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -use work.config.all; -use work.utils.all; -use work.strings.all; -use work.vectors.all; -use work.mem.all; - - -entity ocram_tdp is - generic ( - A_BITS : positive; -- number of address bits - D_BITS : positive; -- number of data bits - FILENAME : string := "" -- file-name for RAM initialization - ); - port ( - clk1 : in std_logic; -- clock for 1st port - clk2 : in std_logic; -- clock for 2nd port - ce1 : in std_logic; -- clock-enable for 1st port - ce2 : in std_logic; -- clock-enable for 2nd port - we1 : in std_logic; -- write-enable for 1st port - we2 : in std_logic; -- write-enable for 2nd port - a1 : in unsigned(A_BITS-1 downto 0); -- address for 1st port - a2 : in unsigned(A_BITS-1 downto 0); -- address for 2nd port - d1 : in std_logic_vector(D_BITS-1 downto 0); -- write-data for 1st port - d2 : in std_logic_vector(D_BITS-1 downto 0); -- write-data for 2nd port - q1 : out std_logic_vector(D_BITS-1 downto 0); -- read-data from 1st port - q2 : out std_logic_vector(D_BITS-1 downto 0) -- read-data from 2nd port - ); -end entity; - - -architecture rtl of ocram_tdp is - constant DEPTH : positive := 2**A_BITS; - -begin - gInfer : if not SIMULATION and ((VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) generate - -- RAM can be inferred correctly only if '-use_new_parser yes' is enabled in XST options - subtype word_t is std_logic_vector(D_BITS - 1 downto 0); - type ram_t is array(0 to DEPTH - 1) of word_t; - - -- Compute the initialization of a RAM array, if specified, from the passed file. - impure function ocram_InitMemory(FilePath : string) return ram_t is - variable Memory : T_SLM(DEPTH - 1 downto 0, word_t'range); - variable res : ram_t; - begin - if str_length(FilePath) = 0 then - -- shortcut required by Vivado - return (others => (others => ite(SIMULATION, 'U', '0'))); - elsif mem_FileExtension(FilePath) = "mem" then - Memory := mem_ReadMemoryFile(FilePath, DEPTH, word_t'length, MEM_FILEFORMAT_XILINX_MEM, MEM_CONTENT_HEX); - else - Memory := mem_ReadMemoryFile(FilePath, DEPTH, word_t'length, MEM_FILEFORMAT_INTEL_HEX, MEM_CONTENT_HEX); - end if; - - for i in Memory'range(1) loop - for j in word_t'range loop - res(i)(j) := Memory(i, j); - end loop; - end loop; - return res; - end function; - - signal ram : ram_t := ocram_InitMemory(FILENAME); - signal a1_reg : unsigned(A_BITS-1 downto 0); - signal a2_reg : unsigned(A_BITS-1 downto 0); - - begin - - process (clk1, clk2) - begin -- process - if rising_edge(clk1) then - if ce1 = '1' then - if we1 = '1' then - ram(to_integer(a1)) <= d1; - end if; - - a1_reg <= a1; - end if; - end if; - - if rising_edge(clk2) then - if ce2 = '1' then - if we2 = '1' then - ram(to_integer(a2)) <= d2; - end if; - - a2_reg <= a2; - end if; - end if; - end process; - - q1 <= (others => 'X') when SIMULATION and is_x(std_logic_vector(a1_reg)) else - ram(to_integer(a1_reg)); -- returns new data - q2 <= (others => 'X') when SIMULATION and is_x(std_logic_vector(a2_reg)) else - ram(to_integer(a2_reg)); -- returns new data - end generate gInfer; - - gAltera: if not SIMULATION and (VENDOR = VENDOR_ALTERA) generate - component ocram_tdp_altera - generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string := "" - ); - port ( - clk1 : in std_logic; - clk2 : in std_logic; - ce1 : in std_logic; - ce2 : in std_logic; - we1 : in std_logic; - we2 : in std_logic; - a1 : in unsigned(A_BITS-1 downto 0); - a2 : in unsigned(A_BITS-1 downto 0); - d1 : in std_logic_vector(D_BITS-1 downto 0); - d2 : in std_logic_vector(D_BITS-1 downto 0); - q1 : out std_logic_vector(D_BITS-1 downto 0); - q2 : out std_logic_vector(D_BITS-1 downto 0) - ); - end component; - begin - -- Direct instantiation of altsyncram (including component - -- declaration above) is not sufficient for ModelSim. - -- That requires also usage of altera_mf library. - - ram_altera: ocram_tdp_altera - generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, - FILENAME => FILENAME - ) - port map ( - clk1 => clk1, - clk2 => clk2, - ce1 => ce1, - ce2 => ce2, - we1 => we1, - we2 => we2, - a1 => a1, - a2 => a2, - d1 => d1, - d2 => d2, - q1 => q1, - q2 => q2 - ); - end generate gAltera; - - gSim: if SIMULATION generate - -- Use component instantiation so that simulation model can be excluded - -- from synthesis. - component ocram_tdp_sim is - generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string); - port ( - clk1 : in std_logic; - clk2 : in std_logic; - ce1 : in std_logic; - ce2 : in std_logic; - we1 : in std_logic; - we2 : in std_logic; - a1 : in unsigned(A_BITS-1 downto 0); - a2 : in unsigned(A_BITS-1 downto 0); - d1 : in std_logic_vector(D_BITS-1 downto 0); - d2 : in std_logic_vector(D_BITS-1 downto 0); - q1 : out std_logic_vector(D_BITS-1 downto 0); - q2 : out std_logic_vector(D_BITS-1 downto 0)); - end component ocram_tdp_sim; - begin - sim_tdp: ocram_tdp_sim - generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, - FILENAME => FILENAME) - port map ( - clk1 => clk1, - clk2 => clk2, - ce1 => ce1, - ce2 => ce2, - we1 => we1, - we2 => we2, - a1 => a1, - a2 => a2, - d1 => d1, - d2 => d2, - q1 => q1, - q2 => q2); - end generate gSim; - - assert ((VENDOR = VENDOR_ALTERA) or (VENDOR = VENDOR_GENERIC and SIMULATION) or (VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) - report "Vendor '" & T_VENDOR'image(VENDOR) & "' not yet supported." - severity failure; -end architecture; diff --git a/src/mem/ocrom/ocrom.pkg.vhdl b/src/mem/ocrom/ocrom.pkg.vhdl index 6096df4c4..7d7bdadb1 100644 --- a/src/mem/ocrom/ocrom.pkg.vhdl +++ b/src/mem/ocrom/ocrom.pkg.vhdl @@ -1,26 +1,26 @@ -- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann +-- Authors: Martin Zabel +-- Patrick Lehmann -- --- Package: VHDL package for component declarations, types and functions --- associated to the PoC.mem.ocram namespace +-- Package: VHDL package for component declarations, types and functions +-- associated to the PoC.mem.ocram namespace -- -- Description: -- ------------------------------------- --- On-Chip ROMs (Read-Only-Memory) for FPGAs. +-- On-Chip ROMs (Read-Only-Memory) for FPGAs. -- --- A detailed documentation is included in each module. +-- A detailed documentation is included in each module. -- -- License: -- ============================================================================= -- Copyright 2008-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,43 +29,43 @@ -- limitations under the License. -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; package ocrom is -- Single-Port - component ocrom_sp is + component ocrom_SinglePort is generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string := "" + ADDRESS_BITS : positive; + DATA_BITS : positive; + FILENAME : string := "" ); port ( - clk : in std_logic; - ce : in std_logic; - a : in unsigned(A_BITS-1 downto 0); - q : out std_logic_vector(D_BITS-1 downto 0) + Clock : in std_logic; + ClockEnable : in std_logic; + Address : in unsigned(ADDRESS_BITS-1 downto 0); + DataOut : out std_logic_vector(DATA_BITS-1 downto 0) ); end component; -- Dual-Port - component ocrom_dp is + component ocrom_DualPort is generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string := "" + ADDRESS_BITS : positive; + DATA_BITS : positive; + FILENAME : string := "" ); port ( - clk1 : in std_logic; - clk2 : in std_logic; - ce1 : in std_logic; - ce2 : in std_logic; - a1 : in unsigned(A_BITS-1 downto 0); - a2 : in unsigned(A_BITS-1 downto 0); - q1 : out std_logic_vector(D_BITS-1 downto 0); - q2 : out std_logic_vector(D_BITS-1 downto 0) + PortA_Clock : in std_logic; + PortB_Clock : in std_logic; + PortA_ClockEnable : in std_logic; + PortB_ClockEnable : in std_logic; + PortA_Address : in unsigned(ADDRESS_BITS-1 downto 0); + PortB_Address : in unsigned(ADDRESS_BITS-1 downto 0); + PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); + PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) ); end component; end package; diff --git a/src/mem/ocrom/ocrom_DualPort.vhdl b/src/mem/ocrom/ocrom_DualPort.vhdl new file mode 100644 index 000000000..a9b3be5ef --- /dev/null +++ b/src/mem/ocrom/ocrom_DualPort.vhdl @@ -0,0 +1,135 @@ +-- ============================================================================= +-- Authors: Martin Zabel +-- Patrick Lehmann +-- +-- Entity: True dual-port memory. +-- +-- Description: +-- ------------------------------------- +-- Inferring / instantiating dual-port read-only memory, with: +-- +-- * dual clock, clock enable, +-- * 2 read ports. +-- +-- The generalized behavior across Altera and Xilinx FPGAs since +-- Stratix/Cyclone and Spartan-3/Virtex-5, respectively, is as follows: +-- +-- WARNING: The simulated behavior on RT-level is not correct. +-- +-- TODO: add timing diagram +-- TODO: implement correct behavior for RT-level simulation +-- +-- License: +-- ============================================================================= +-- Copyright 2008-2015 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +use STD.TextIO.all; + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use IEEE.std_logic_textio.all; + +use work.config.all; +use work.utils.all; +use work.strings.all; +use work.vectors.all; +use work.mem.all; +use work.ocram.all; + + +entity ocrom_DualPort is + generic ( + ADDRESS_BITS : positive; + DATA_BITS : positive; + FILENAME : string := "" + ); + port ( + PortA_Clock : in std_logic; + PortA_ClockEnable : in std_logic; + PortA_Address : in unsigned(ADDRESS_BITS-1 downto 0); + PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); + + PortB_Clock : in std_logic; + PortB_ClockEnable : in std_logic; + PortB_Address : in unsigned(ADDRESS_BITS-1 downto 0); + PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) + ); +end entity; + + +architecture rtl of ocrom_DualPort is + constant DEPTH : positive := 2**ADDRESS_BITS; + +begin + assert (str_length(FILENAME) /= 0) report "Do you really want to generate a block of zeros?" severity FAILURE; + + gen: if gInfer: (VENDOR = VENDOR_GENERIC) or (VENDOR = VENDOR_XILINX) generate + constant rom : T_SLVV := mem_InitMemory(FILENAME, DEPTH, DATA_BITS); + signal a1_reg : unsigned(ADDRESS_BITS-1 downto 0); + signal a2_reg : unsigned(ADDRESS_BITS-1 downto 0); + + begin + process(PortA_Clock) + begin + if rising_edge(PortA_Clock) then + if PortA_ClockEnable = '1' then + a1_reg <= PortA_Address; + end if; + end if; + end process; + + process(PortB_Clock) + begin + if rising_edge(PortB_Clock) then + if PortB_ClockEnable = '1' then + a2_reg <= PortB_Address; + end if; + end if; + end process; + + PortA_DataOut <= rom(to_integer(a1_reg)); -- returns new data + PortB_DataOut <= rom(to_integer(a2_reg)); -- returns new data + elsif gAltera: VENDOR = VENDOR_ALTERA generate + -- Direct instantiation of altsyncram (including component + -- declaration above) is not sufficient for ModelSim. + -- That requires also usage of altera_mf library. + + rom: component ocram_TrueDualPort_Altera + generic map ( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS, + FILENAME => FILENAME + ) + port map ( + PortA_Clock => PortA_Clock, + PortB_Clock => PortB_Clock, + PortA_ClockEnable => PortA_ClockEnable, + PortB_ClockEnable => PortB_ClockEnable, + PortA_WriteEnable => '0', + PortB_WriteEnable => '0', + PortA_Address => PortA_Address, + PortB_Address => PortB_Address, + PortA_DataIn => (others => '0'), + PortB_DataIn => (others => '0'), + PortA_DataOut => PortA_DataOut, + PortB_DataOut => PortB_DataOut + ); + else generate + assert FALSE report "Vendor '" & T_VENDOR'image(VENDOR) & "' not yet supported." severity failure; + end generate; +end architecture; diff --git a/src/mem/ocrom/ocrom_SinglePort.vhdl b/src/mem/ocrom/ocrom_SinglePort.vhdl new file mode 100644 index 000000000..70d497279 --- /dev/null +++ b/src/mem/ocrom/ocrom_SinglePort.vhdl @@ -0,0 +1,104 @@ +-- ============================================================================= +-- Authors: Martin Zabel +-- Patrick Lehmann +-- +-- Entity: Single-port memory. +-- +-- Description: +-- ------------------------------------- +-- Inferring / instantiating single-port read-only memory +-- +-- - single clock, clock enable +-- - 1 read port +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2008-2015 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +use STD.TextIO.all; + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use IEEE.std_logic_textio.all; + +use work.config.all; +use work.utils.all; +use work.strings.all; +use work.vectors.all; +use work.mem.all; +use work.ocram.all; + + +entity ocrom_SinglePort is + generic ( + ADDRESS_BITS : positive; + DATA_BITS : positive; + FILENAME : string := "" + ); + port ( + Clock : in std_logic; + ClockEnable : in std_logic; + Address : in unsigned(ADDRESS_BITS-1 downto 0); + DataOut : out std_logic_vector(DATA_BITS-1 downto 0) + ); +end entity; + + +architecture rtl of ocrom_SinglePort is + constant DEPTH : positive := 2**ADDRESS_BITS; + +begin + assert (str_length(FILENAME) /= 0) report "Do you really want to generate a block of zeros?" severity FAILURE; + + gen: if gInfer: (VENDOR = VENDOR_GENERIC) or (VENDOR = VENDOR_XILINX) generate + constant rom : T_SLVV := mem_InitMemory(FILENAME, DEPTH, DATA_BITS); + signal a_reg : unsigned(ADDRESS_BITS-1 downto 0); + begin + process (Clock) + begin + if rising_edge(Clock) then + if ClockEnable = '1' then + a_reg <= Address; + end if; + end if; + end process; + + DataOut <= rom(to_integer(a_reg)); -- gets new data + elsif gAltera: VENDOR = VENDOR_ALTERA generate + -- Direct instantiation of altsyncram (including component + -- declaration above) is not sufficient for ModelSim. + -- That requires also usage of altera_mf library. + rom: component ocram_SimplePort_Altera + generic map ( + ADDRESS_BITS => ADDRESS_BITS, + DATA_BITS => DATA_BITS, + FILENAME => FILENAME + ) + port map ( + Clock => Clock, + ClockEnable => ClockEnable, + WriteEnable => '0', + Address => Address, + DataIn => (others => '0'), + DataOut => DataOut + ); + else generate + assert FALSE report "Vendor '" & T_VENDOR'image(VENDOR) & "' not yet supported." severity failure; + end generate; +end architecture; diff --git a/src/mem/ocrom/ocrom_dp.vhdl b/src/mem/ocrom/ocrom_dp.vhdl deleted file mode 100644 index dbfddabc7..000000000 --- a/src/mem/ocrom/ocrom_dp.vhdl +++ /dev/null @@ -1,185 +0,0 @@ --- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann --- --- Entity: True dual-port memory. --- --- Description: --- ------------------------------------- --- Inferring / instantiating dual-port read-only memory, with: --- --- * dual clock, clock enable, --- * 2 read ports. --- --- The generalized behavior across Altera and Xilinx FPGAs since --- Stratix/Cyclone and Spartan-3/Virtex-5, respectively, is as follows: --- --- WARNING: The simulated behavior on RT-level is not correct. --- --- TODO: add timing diagram --- TODO: implement correct behavior for RT-level simulation --- --- License: --- ============================================================================= --- Copyright 2008-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -use STD.TextIO.all; - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; -use IEEE.std_logic_textio.all; - -use work.config.all; -use work.utils.all; -use work.strings.all; -use work.vectors.all; -use work.mem.all; - - -entity ocrom_dp is - generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string := "" - ); - port ( - clk1 : in std_logic; - clk2 : in std_logic; - ce1 : in std_logic; - ce2 : in std_logic; - a1 : in unsigned(A_BITS-1 downto 0); - a2 : in unsigned(A_BITS-1 downto 0); - q1 : out std_logic_vector(D_BITS-1 downto 0); - q2 : out std_logic_vector(D_BITS-1 downto 0) - ); -end entity; - - -architecture rtl of ocrom_dp is - constant DEPTH : positive := 2**A_BITS; - -begin - assert (str_length(FILENAME) /= 0) report "Do you really want to generate a block of zeros?" severity FAILURE; - - gInfer: if (VENDOR = VENDOR_GENERIC) or (VENDOR = VENDOR_XILINX) generate - -- RAM can be inferred correctly only for newer FPGAs! - subtype word_t is std_logic_vector(D_BITS - 1 downto 0); - type rom_t is array(0 to DEPTH - 1) of word_t; - - -- Compute the initialization of a RAM array, if specified, from the passed file. - impure function ocrom_InitMemory(FilePath : string) return rom_t is - variable Memory : T_SLM(DEPTH - 1 downto 0, word_t'range); - variable res : rom_t; - begin - if str_length(FilePath) = 0 then - -- shortcut required by Vivado (assert above is ignored) - return (others => (others => ite(SIMULATION, 'U', '0'))); - elsif mem_FileExtension(FilePath) = "mem" then - Memory := mem_ReadMemoryFile(FilePath, DEPTH, word_t'length, MEM_FILEFORMAT_XILINX_MEM, MEM_CONTENT_HEX); - else - Memory := mem_ReadMemoryFile(FilePath, DEPTH, word_t'length, MEM_FILEFORMAT_INTEL_HEX, MEM_CONTENT_HEX); - end if; - - for i in Memory'range(1) loop - for j in word_t'range loop - res(i)(j) := Memory(i, j); - end loop; - end loop; - return res; - end function; - - constant rom : rom_t := ocrom_InitMemory(FILENAME); - signal a1_reg : unsigned(A_BITS-1 downto 0); - signal a2_reg : unsigned(A_BITS-1 downto 0); - - begin - process(clk1) - begin - if rising_edge(clk1) then - if ce1 = '1' then - a1_reg <= a1; - end if; - end if; - end process; - - process(clk2) - begin - if rising_edge(clk2) then - if ce2 = '1' then - a2_reg <= a2; - end if; - end if; - end process; - - q1 <= rom(to_integer(a1_reg)); -- returns new data - q2 <= rom(to_integer(a2_reg)); -- returns new data - end generate gInfer; - - gAltera: if VENDOR = VENDOR_ALTERA generate - component ocram_tdp_altera - generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string := "" - ); - port ( - clk1 : in std_logic; - clk2 : in std_logic; - ce1 : in std_logic; - ce2 : in std_logic; - we1 : in std_logic; - we2 : in std_logic; - a1 : in unsigned(A_BITS-1 downto 0); - a2 : in unsigned(A_BITS-1 downto 0); - d1 : in std_logic_vector(D_BITS-1 downto 0); - d2 : in std_logic_vector(D_BITS-1 downto 0); - q1 : out std_logic_vector(D_BITS-1 downto 0); - q2 : out std_logic_vector(D_BITS-1 downto 0) - ); - end component; - begin - -- Direct instantiation of altsyncram (including component - -- declaration above) is not sufficient for ModelSim. - -- That requires also usage of altera_mf library. - - i: ocram_tdp_altera - generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, - FILENAME => FILENAME - ) - port map ( - clk1 => clk1, - clk2 => clk2, - ce1 => ce1, - ce2 => ce2, - we1 => '0', - we2 => '0', - a1 => a1, - a2 => a2, - d1 => (others => '0'), - d2 => (others => '0'), - q1 => q1, - q2 => q2 - ); - end generate gAltera; - - assert ((VENDOR = VENDOR_ALTERA) or (VENDOR = VENDOR_GENERIC) or (VENDOR = VENDOR_XILINX)) - report "Vendor '" & T_VENDOR'image(VENDOR) & "' not yet supported." - severity failure; -end architecture; diff --git a/src/mem/ocrom/ocrom_sp.vhdl b/src/mem/ocrom/ocrom_sp.vhdl deleted file mode 100644 index 7609e2a0b..000000000 --- a/src/mem/ocrom/ocrom_sp.vhdl +++ /dev/null @@ -1,149 +0,0 @@ --- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann --- --- Entity: Single-port memory. --- --- Description: --- ------------------------------------- --- Inferring / instantiating single-port read-only memory --- --- - single clock, clock enable --- - 1 read port --- --- --- License: --- ============================================================================= --- Copyright 2008-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -use STD.TextIO.all; - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; -use IEEE.std_logic_textio.all; - -use work.config.all; -use work.utils.all; -use work.strings.all; -use work.vectors.all; -use work.mem.all; - - -entity ocrom_sp is - generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string := "" - ); - port ( - clk : in std_logic; - ce : in std_logic; - a : in unsigned(A_BITS-1 downto 0); - q : out std_logic_vector(D_BITS-1 downto 0) - ); -end entity; - - -architecture rtl of ocrom_sp is - constant DEPTH : positive := 2**A_BITS; - -begin - assert (str_length(FILENAME) /= 0) report "Do you really want to generate a block of zeros?" severity FAILURE; - - gInfer: if (VENDOR = VENDOR_GENERIC) or (VENDOR = VENDOR_XILINX) generate - -- RAM can be inferred correctly - -- XST Advanced HDL Synthesis generates single-port memory as expected. - subtype word_t is std_logic_vector(D_BITS - 1 downto 0); - type rom_t is array(0 to DEPTH - 1) of word_t; - - -- Compute the initialization of a RAM array, if specified, from the passed file. - impure function ocrom_InitMemory(FilePath : string) return rom_t is - variable Memory : T_SLM(DEPTH - 1 downto 0, word_t'range); - variable res : rom_t; - begin - if str_length(FilePath) = 0 then - -- shortcut required by Vivado (assert above is ignored) - return (others => (others => ite(SIMULATION, 'U', '0'))); - elsif mem_FileExtension(FilePath) = "mem" then - Memory := mem_ReadMemoryFile(FilePath, DEPTH, word_t'length, MEM_FILEFORMAT_XILINX_MEM, MEM_CONTENT_HEX); - else - Memory := mem_ReadMemoryFile(FilePath, DEPTH, word_t'length, MEM_FILEFORMAT_INTEL_HEX, MEM_CONTENT_HEX); - end if; - - for i in Memory'range(1) loop - for j in word_t'range loop - res(i)(j) := Memory(i, j); - end loop; - end loop; - return res; - end function; - - constant rom : rom_t := ocrom_InitMemory(FILENAME); - signal a_reg : unsigned(A_BITS-1 downto 0); - begin - process (clk) - begin - if rising_edge(clk) then - if ce = '1' then - a_reg <= a; - end if; - end if; - end process; - - q <= rom(to_integer(a_reg)); -- gets new data - end generate gInfer; - - gAltera: if VENDOR = VENDOR_ALTERA generate - component ocram_sp_altera - generic ( - A_BITS : positive; - D_BITS : positive; - FILENAME : string := "" - ); - port ( - clk : in std_logic; - ce : in std_logic; - we : in std_logic; - a : in unsigned(A_BITS-1 downto 0); - d : in std_logic_vector(D_BITS-1 downto 0); - q : out std_logic_vector(D_BITS-1 downto 0)); - end component; - begin - -- Direct instantiation of altsyncram (including component - -- declaration above) is not sufficient for ModelSim. - -- That requires also usage of altera_mf library. - i: ocram_sp_altera - generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, - FILENAME => FILENAME - ) - port map ( - clk => clk, - ce => ce, - we => '0', - a => a, - d => (others => '0'), - q => q - ); - end generate gAltera; - - assert ((VENDOR = VENDOR_ALTERA) or (VENDOR = VENDOR_GENERIC) or (VENDOR = VENDOR_XILINX)) - report "Vendor '" & T_VENDOR'image(VENDOR) & "' not yet supported." - severity failure; -end architecture; diff --git a/src/mem/sdram/sdram_ctrl_de0.vhdl b/src/mem/sdram/sdram_ctrl_de0.vhdl index c18d5953a..b6efc8cec 100644 --- a/src/mem/sdram/sdram_ctrl_de0.vhdl +++ b/src/mem/sdram/sdram_ctrl_de0.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Entity: Controller for ISSI SDR-SDRAM for Altera DE0 Board +-- Entity: Controller for ISSI SDR-SDRAM for Altera DE0 Board -- -- Description: -- ------------------------------------- @@ -40,13 +40,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -55,151 +55,151 @@ -- limitations under the License. -- ============================================================================= -- -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; -use ieee.math_real.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use IEEE.math_real.all; entity sdram_ctrl_de0 is - generic ( - CLK_PERIOD : real; - CL : positive; - BL : positive); + generic ( + CLK_PERIOD : real; + CL : positive; + BL : positive); - port ( - clk : in std_logic; - clkout : in std_logic; - rst : in std_logic; + port ( + clk : in std_logic; + clkout : in std_logic; + rst : in std_logic; - user_cmd_valid : in std_logic; - user_wdata_valid : in std_logic; - user_write : in std_logic; - user_addr : in std_logic_vector(21 downto 0); - user_wdata : in std_logic_vector(15 downto 0); - user_got_cmd : out std_logic; - user_got_wdata : out std_logic; - user_rdata : out std_logic_vector(15 downto 0); - user_rstb : out std_logic; + user_cmd_valid : in std_logic; + user_wdata_valid : in std_logic; + user_write : in std_logic; + user_addr : in std_logic_vector(21 downto 0); + user_wdata : in std_logic_vector(15 downto 0); + user_got_cmd : out std_logic; + user_got_wdata : out std_logic; + user_rdata : out std_logic_vector(15 downto 0); + user_rstb : out std_logic; - sd_ck : out std_logic; - sd_cke : out std_logic; - sd_cs : out std_logic; - sd_ras : out std_logic; - sd_cas : out std_logic; - sd_we : out std_logic; - sd_ba : out std_logic_vector(1 downto 0); - sd_a : out std_logic_vector(11 downto 0); - sd_dq : inout std_logic_vector(15 downto 0)); + sd_ck : out std_logic; + sd_cke : out std_logic; + sd_cs : out std_logic; + sd_ras : out std_logic; + sd_cas : out std_logic; + sd_we : out std_logic; + sd_ba : out std_logic_vector(1 downto 0); + sd_a : out std_logic_vector(11 downto 0); + sd_dq : inout std_logic_vector(15 downto 0)); end sdram_ctrl_de0; architecture rtl of sdram_ctrl_de0 is - -- - -- Configuration - -- - constant A_BITS : positive := 22; -- 4M - constant D_BITS : positive := 16; -- x16 - constant R_BITS : positive := 12; -- 4096 rows - constant C_BITS : positive := 8; -- 256 columns - constant B_BITS : positive := 2; -- 4 banks + -- + -- Configuration + -- + constant A_BITS : positive := 22; -- 4M + constant D_BITS : positive := 16; -- x16 + constant R_BITS : positive := 12; -- 4096 rows + constant C_BITS : positive := 8; -- 256 columns + constant B_BITS : positive := 2; -- 4 banks - -- Divide timings from datasheet by clock period. - -- SDRAM device: IS42S16400F - constant T_MRD : integer := 2; -- fix - constant T_RAS : integer := integer(ceil(42.0/CLK_PERIOD)); - constant T_RCD : integer := integer(ceil(18.0/CLK_PERIOD)); - constant T_RFC : integer := integer(ceil(60.0/CLK_PERIOD)); -- t_RC - constant T_RP : integer := integer(ceil(18.0/CLK_PERIOD)); - constant T_WR : integer := 2; -- fix - constant T_WTR : integer := 1; - constant T_REFI : integer := integer(ceil(15625.0/ -- 64 ms / 4096 rows - CLK_PERIOD))-50; - constant INIT_WAIT : integer := integer(ceil(100000.0/ -- 100 us - (real(T_REFI)*CLK_PERIOD))); + -- Divide timings from datasheet by clock period. + -- SDRAM device: IS42S16400F + constant T_MRD : integer := 2; -- fix + constant T_RAS : integer := integer(ceil(42.0/CLK_PERIOD)); + constant T_RCD : integer := integer(ceil(18.0/CLK_PERIOD)); + constant T_RFC : integer := integer(ceil(60.0/CLK_PERIOD)); -- t_RC + constant T_RP : integer := integer(ceil(18.0/CLK_PERIOD)); + constant T_WR : integer := 2; -- fix + constant T_WTR : integer := 1; + constant T_REFI : integer := integer(ceil(15625.0/ -- 64 ms / 4096 rows + CLK_PERIOD))-50; + constant INIT_WAIT : integer := integer(ceil(100000.0/ -- 100 us + (real(T_REFI)*CLK_PERIOD))); - -- - -- Signals - -- - signal sd_cke_nxt : std_logic; - signal sd_cs_nxt : std_logic; - signal sd_ras_nxt : std_logic; - signal sd_cas_nxt : std_logic; - signal sd_we_nxt : std_logic; - signal sd_a_nxt : std_logic_vector(11 downto 0); - signal sd_ba_nxt : std_logic_vector(1 downto 0); - signal rden_nxt : std_logic; - signal wren_nxt : std_logic; + -- + -- Signals + -- + signal sd_cke_nxt : std_logic; + signal sd_cs_nxt : std_logic; + signal sd_ras_nxt : std_logic; + signal sd_cas_nxt : std_logic; + signal sd_we_nxt : std_logic; + signal sd_a_nxt : std_logic_vector(11 downto 0); + signal sd_ba_nxt : std_logic_vector(1 downto 0); + signal rden_nxt : std_logic; + signal wren_nxt : std_logic; begin -- rtl - fsm: entity work.sdram_ctrl_fsm - generic map ( - SDRAM_TYPE => 0, -- SDR-SDRAM - A_BITS => A_BITS, - D_BITS => D_BITS, - R_BITS => R_BITS, - C_BITS => C_BITS, - B_BITS => B_BITS, - CL => CL, - BL => BL, - T_MRD => T_MRD, - T_RAS => T_RAS, - T_RCD => T_RCD, - T_RFC => T_RFC, - T_RP => T_RP, - T_WR => T_WR, - T_WTR => T_WTR, - T_REFI => T_REFI, - INIT_WAIT => INIT_WAIT) - port map ( - clk => clk, - rst => rst, - user_cmd_valid => user_cmd_valid, - user_wdata_valid => user_wdata_valid, - user_write => user_write, - user_addr => user_addr, - user_got_cmd => user_got_cmd, - user_got_wdata => user_got_wdata, - sd_cke_nxt => sd_cke_nxt, - sd_cs_nxt => sd_cs_nxt, - sd_ras_nxt => sd_ras_nxt, - sd_cas_nxt => sd_cas_nxt, - sd_we_nxt => sd_we_nxt, - sd_a_nxt => sd_a_nxt, - sd_ba_nxt => sd_ba_nxt, - rden_nxt => rden_nxt, - wren_nxt => wren_nxt); + fsm: entity work.sdram_ctrl_fsm + generic map ( + SDRAM_TYPE => 0, -- SDR-SDRAM + A_BITS => A_BITS, + D_BITS => D_BITS, + R_BITS => R_BITS, + C_BITS => C_BITS, + B_BITS => B_BITS, + CL => CL, + BL => BL, + T_MRD => T_MRD, + T_RAS => T_RAS, + T_RCD => T_RCD, + T_RFC => T_RFC, + T_RP => T_RP, + T_WR => T_WR, + T_WTR => T_WTR, + T_REFI => T_REFI, + INIT_WAIT => INIT_WAIT) + port map ( + clk => clk, + rst => rst, + user_cmd_valid => user_cmd_valid, + user_wdata_valid => user_wdata_valid, + user_write => user_write, + user_addr => user_addr, + user_got_cmd => user_got_cmd, + user_got_wdata => user_got_wdata, + sd_cke_nxt => sd_cke_nxt, + sd_cs_nxt => sd_cs_nxt, + sd_ras_nxt => sd_ras_nxt, + sd_cas_nxt => sd_cas_nxt, + sd_we_nxt => sd_we_nxt, + sd_a_nxt => sd_a_nxt, + sd_ba_nxt => sd_ba_nxt, + rden_nxt => rden_nxt, + wren_nxt => wren_nxt); - phy: entity work.sdram_ctrl_phy_de0 - generic map ( - CL => CL) - port map ( - clk => clk, - clkout => clkout, - rst => rst, - sd_cke_nxt => sd_cke_nxt, - sd_cs_nxt => sd_cs_nxt, - sd_ras_nxt => sd_ras_nxt, - sd_cas_nxt => sd_cas_nxt, - sd_we_nxt => sd_we_nxt, - sd_ba_nxt => sd_ba_nxt, - sd_a_nxt => sd_a_nxt, - wren_nxt => wren_nxt, - wdata_nxt => user_wdata, - rden_nxt => rden_nxt, - rdata => user_rdata, - rstb => user_rstb, - sd_ck => sd_ck, - sd_cke => sd_cke, - sd_cs => sd_cs, - sd_ras => sd_ras, - sd_cas => sd_cas, - sd_we => sd_we, - sd_ba => sd_ba, - sd_a => sd_a, - sd_dq => sd_dq); + phy: entity work.sdram_ctrl_phy_de0 + generic map ( + CL => CL) + port map ( + clk => clk, + clkout => clkout, + rst => rst, + sd_cke_nxt => sd_cke_nxt, + sd_cs_nxt => sd_cs_nxt, + sd_ras_nxt => sd_ras_nxt, + sd_cas_nxt => sd_cas_nxt, + sd_we_nxt => sd_we_nxt, + sd_ba_nxt => sd_ba_nxt, + sd_a_nxt => sd_a_nxt, + wren_nxt => wren_nxt, + wdata_nxt => user_wdata, + rden_nxt => rden_nxt, + rdata => user_rdata, + rstb => user_rstb, + sd_ck => sd_ck, + sd_cke => sd_cke, + sd_cs => sd_cs, + sd_ras => sd_ras, + sd_cas => sd_cas, + sd_we => sd_we, + sd_ba => sd_ba, + sd_a => sd_a, + sd_dq => sd_dq); end rtl; diff --git a/src/mem/sdram/sdram_ctrl_fsm.vhdl b/src/mem/sdram/sdram_ctrl_fsm.vhdl index 989fc540d..1ac4f44df 100644 --- a/src/mem/sdram/sdram_ctrl_fsm.vhdl +++ b/src/mem/sdram/sdram_ctrl_fsm.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Entity: Generic controller for SDRAM memory. +-- Entity: Generic controller for SDRAM memory. -- -- Description: -- ------------------------------------- @@ -76,13 +76,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -91,665 +91,665 @@ -- limitations under the License. -- ============================================================================= -- -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -use work.utils.all; +use work.utils.all; entity sdram_ctrl_fsm is - generic ( - SDRAM_TYPE : natural; -- SDRAM type - - A_BITS : positive; -- log2ceil(memory cell count) - D_BITS : positive; -- native data width - R_BITS : positive; -- log2ceil(rows) - C_BITS : positive; -- log2ceil(columns) - B_BITS : positive; -- log2ceil(banks) - - CL : positive; -- CAS Latency in clock cycles - BL : positive; -- Burst Length - - T_MRD : integer; -- in clock cycles - T_RAS : integer; -- in clock cycles - T_RCD : integer; -- in clock cycles - T_RFC : integer; -- (or T_RC) in clock cycles - T_RP : integer; -- in clock cycles - T_WR : integer; -- in clock cycles - T_WTR : integer; -- in clock cycles - T_REFI : integer; -- in clock cycles - INIT_WAIT : integer); -- in T_REFI periods - port ( - clk : in std_logic; - rst : in std_logic; - - user_cmd_valid : in std_logic; - user_wdata_valid : in std_logic; - user_write : in std_logic; - user_addr : in std_logic_vector(A_BITS-1 downto 0); - user_got_cmd : out std_logic; - user_got_wdata : out std_logic; - - sd_cke_nxt : out std_logic; - sd_cs_nxt : out std_logic; - sd_ras_nxt : out std_logic; - sd_cas_nxt : out std_logic; - sd_we_nxt : out std_logic; - sd_a_nxt : out std_logic_vector(imax(R_BITS,C_BITS+1)-1 downto 0); - sd_ba_nxt : out std_logic_vector(B_BITS-1 downto 0); - rden_nxt : out std_logic; - wren_nxt : out std_logic); + generic ( + SDRAM_TYPE : natural; -- SDRAM type + + A_BITS : positive; -- log2ceil(memory cell count) + D_BITS : positive; -- native data width + R_BITS : positive; -- log2ceil(rows) + C_BITS : positive; -- log2ceil(columns) + B_BITS : positive; -- log2ceil(banks) + + CL : positive; -- CAS Latency in clock cycles + BL : positive; -- Burst Length + + T_MRD : integer; -- in clock cycles + T_RAS : integer; -- in clock cycles + T_RCD : integer; -- in clock cycles + T_RFC : integer; -- (or T_RC) in clock cycles + T_RP : integer; -- in clock cycles + T_WR : integer; -- in clock cycles + T_WTR : integer; -- in clock cycles + T_REFI : integer; -- in clock cycles + INIT_WAIT : integer); -- in T_REFI periods + port ( + clk : in std_logic; + rst : in std_logic; + + user_cmd_valid : in std_logic; + user_wdata_valid : in std_logic; + user_write : in std_logic; + user_addr : in std_logic_vector(A_BITS-1 downto 0); + user_got_cmd : out std_logic; + user_got_wdata : out std_logic; + + sd_cke_nxt : out std_logic; + sd_cs_nxt : out std_logic; + sd_ras_nxt : out std_logic; + sd_cas_nxt : out std_logic; + sd_we_nxt : out std_logic; + sd_a_nxt : out std_logic_vector(imax(R_BITS,C_BITS+1)-1 downto 0); + sd_ba_nxt : out std_logic_vector(B_BITS-1 downto 0); + rden_nxt : out std_logic; + wren_nxt : out std_logic); end sdram_ctrl_fsm; architecture rtl of sdram_ctrl_fsm is - -- length of burst in clock cycles of "clk" - function burst_clock_cycles return positive is - begin - if SDRAM_TYPE > 0 then return BL/2; end if; - return BL; - end; - - constant BCC : natural := burst_clock_cycles; - - -- FSM - type FSM_TYPE is (INIT1, INIT2, INIT3, INIT4, INIT5, INIT6, INIT7, INIT8, - INIT9, INIT10, INIT11, - DO_ACTIVATE, - DO_READ1, DO_READ2, - DO_WRITE1, DO_WRITE2, - CHECKNXT, - DO_PRECHARGE, DO_AUTO_REFRESH); - signal fsm_cs : FSM_TYPE; - signal fsm_ns : FSM_TYPE; - - -- SDRAM Commands - subtype SD_CMD_TYPE is std_logic_vector(3 downto 0); - constant SD_CMD_DESELECT : SD_CMD_TYPE := "1---"; - constant SD_CMD_NOP : SD_CMD_TYPE := "0111"; - constant SD_CMD_ACTIVE : SD_CMD_TYPE := "0011"; - constant SD_CMD_READ : SD_CMD_TYPE := "0101"; - constant SD_CMD_WRITE : SD_CMD_TYPE := "0100"; - constant SD_CMD_BURST_TERMINATE : SD_CMD_TYPE := "0110"; - constant SD_CMD_PRECHARGE : SD_CMD_TYPE := "0010"; - constant SD_CMD_AUTO_REFRESH : SD_CMD_TYPE := "0001"; - constant SD_CMD_LOAD_MODE_REG : SD_CMD_TYPE := "0000"; - signal sd_cmd_nxt : SD_CMD_TYPE; - - -- SDRAM address - signal bank_addr : std_logic_vector(B_BITS-1 downto 0); - signal row_addr : std_logic_vector(R_BITS-1 downto 0); - signal col_addr : std_logic_vector(C_BITS-1 downto 0); - signal precharge_all : std_logic; - signal reset_dll : std_logic; - - type SD_A_SEL_TYPE is (SD_A_SEL_EXT_MODE_REG, - SD_A_SEL_MODE_REG, - SD_A_SEL_ROW_ADDR, - SD_A_SEL_COL_ADDR); - signal sd_a_sel : SD_A_SEL_TYPE; - - type SD_BA_SEL_TYPE is (SD_BA_SEL_EXT_MODE_REG, - SD_BA_SEL_MODE_REG, - SD_BA_SEL_ADDR); - signal sd_ba_sel : SD_BA_SEL_TYPE; - - -- Value for Extended Mode Register: - -- bit 1--0: normal drive strength, enable DLL - constant EXT_MODE_REG : std_logic_vector(1 downto 0) := - (others => '0'); - - -- Value for Mode Register - -- bit 6--0: CL, sequential burst, BL - -- bit 8: reset DLL - constant MODE_REG : std_logic_vector(8 downto 0) := - "00" & std_logic_vector(to_unsigned(CL, 3)) & - "0" & std_logic_vector(to_unsigned(BL-1, 3)); - - -------- - -- Timer - -------- - - -- Timer for average periodic refresh interval. - -- Timer counts from T_REFI-2 downto -1 for easy detection of - -- "timer done". MSB is sign bit. - signal timer_tREFI : signed(log2ceil(T_REFI-2) downto 0); - constant TIMER_TREFI_INIT : signed(log2ceil(T_REFI-2) downto 0) - := to_signed(T_REFI-2, timer_tREFI'length); - signal timer_tREFI_start : std_logic; - signal timer_tREFI_done : std_logic; - - -- Timer for SDRAM commands. To wait for n clock cycles, the timer must be - -- initiated to the value n-2. The minimum allowed initial value is -1. In - -- this case the timer is done in the next clock cycles. - signal timer_cmd : signed(5 downto 0); - signal timer_cmd_init : signed(5 downto 0); - signal timer_cmd_start : std_logic; - signal timer_cmd_done : std_logic; - - -- Timer for ACTIVE-to-PRECHARGE. - -- Timer counts from T_RAS-2 downto -1 for easy detection of - -- "timer done". MSB is sign bit. - -- Substract 1, because timer is checked one cycle before DO_PRECHARGE. - signal timer_tRAS : signed(log2ceil(T_RAS-2) downto 0); - constant TIMER_TRAS_INIT : signed(log2ceil(T_RAS-2) downto 0) - := to_signed(T_RAS-1 -2, timer_tRAS'length); - signal timer_tRAS_start : std_logic; - signal timer_tRAS_done : std_logic; - - -------- - -- Counter - -------- - - -- Misc down counter. Counter is "done", when value == -1. - -- Thus, if counter is inited to n, then counter is done n+2 decrements - -- later. - signal downcnt : signed(log2ceil(INIT_WAIT-2) downto 0); - signal downcnt_init : signed(downcnt'range); - signal downcnt_set : std_logic; - signal downcnt_dec : std_logic; - signal downcnt_done : std_logic; - - -------- - -- Last address - -------- - signal last_bank_addr_r : std_logic_vector(bank_addr'range); - signal last_bank_addr_nxt : std_logic_vector(bank_addr'range); - signal last_row_addr_r : std_logic_vector(row_addr'range); - signal last_row_addr_nxt : std_logic_vector(row_addr'range); - signal last_write_r : std_logic; - signal last_write_nxt : std_logic; - signal save_cmd_addr : std_logic; - signal same_bank_row : std_logic; + -- length of burst in clock cycles of "clk" + function burst_clock_cycles return positive is + begin + if SDRAM_TYPE > 0 then return BL/2; end if; + return BL; + end function; + + constant BCC : natural := burst_clock_cycles; + + -- FSM + type FSM_TYPE is (INIT1, INIT2, INIT3, INIT4, INIT5, INIT6, INIT7, INIT8, + INIT9, INIT10, INIT11, + DO_ACTIVATE, + DO_READ1, DO_READ2, + DO_WRITE1, DO_WRITE2, + CHECKNXT, + DO_PRECHARGE, DO_AUTO_REFRESH); + signal fsm_cs : FSM_TYPE; + signal fsm_ns : FSM_TYPE; + + -- SDRAM Commands + subtype SD_CMD_TYPE is std_logic_vector(3 downto 0); + constant SD_CMD_DESELECT : SD_CMD_TYPE := "1---"; + constant SD_CMD_NOP : SD_CMD_TYPE := "0111"; + constant SD_CMD_ACTIVE : SD_CMD_TYPE := "0011"; + constant SD_CMD_READ : SD_CMD_TYPE := "0101"; + constant SD_CMD_WRITE : SD_CMD_TYPE := "0100"; + constant SD_CMD_BURST_TERMINATE : SD_CMD_TYPE := "0110"; + constant SD_CMD_PRECHARGE : SD_CMD_TYPE := "0010"; + constant SD_CMD_AUTO_REFRESH : SD_CMD_TYPE := "0001"; + constant SD_CMD_LOAD_MODE_REG : SD_CMD_TYPE := "0000"; + signal sd_cmd_nxt : SD_CMD_TYPE; + + -- SDRAM address + signal bank_addr : std_logic_vector(B_BITS-1 downto 0); + signal row_addr : std_logic_vector(R_BITS-1 downto 0); + signal col_addr : std_logic_vector(C_BITS-1 downto 0); + signal precharge_all : std_logic; + signal reset_dll : std_logic; + + type SD_A_SEL_TYPE is (SD_A_SEL_EXT_MODE_REG, + SD_A_SEL_MODE_REG, + SD_A_SEL_ROW_ADDR, + SD_A_SEL_COL_ADDR); + signal sd_a_sel : SD_A_SEL_TYPE; + + type SD_BA_SEL_TYPE is (SD_BA_SEL_EXT_MODE_REG, + SD_BA_SEL_MODE_REG, + SD_BA_SEL_ADDR); + signal sd_ba_sel : SD_BA_SEL_TYPE; + + -- Value for Extended Mode Register: + -- bit 1--0: normal drive strength, enable DLL + constant EXT_MODE_REG : std_logic_vector(1 downto 0) := + (others => '0'); + + -- Value for Mode Register + -- bit 6--0: CL, sequential burst, BL + -- bit 8: reset DLL + constant MODE_REG : std_logic_vector(8 downto 0) := + "00" & std_logic_vector(to_unsigned(CL, 3)) & + "0" & std_logic_vector(to_unsigned(BL-1, 3)); + + -------- + -- Timer + -------- + + -- Timer for average periodic refresh interval. + -- Timer counts from T_REFI-2 downto -1 for easy detection of + -- "timer done". MSB is sign bit. + signal timer_tREFI : signed(log2ceil(T_REFI-2) downto 0); + constant TIMER_TREFI_INIT : signed(log2ceil(T_REFI-2) downto 0) + := to_signed(T_REFI-2, timer_tREFI'length); + signal timer_tREFI_start : std_logic; + signal timer_tREFI_done : std_logic; + + -- Timer for SDRAM commands. To wait for n clock cycles, the timer must be + -- initiated to the value n-2. The minimum allowed initial value is -1. In + -- this case the timer is done in the next clock cycles. + signal timer_cmd : signed(5 downto 0); + signal timer_cmd_init : signed(5 downto 0); + signal timer_cmd_start : std_logic; + signal timer_cmd_done : std_logic; + + -- Timer for ACTIVE-to-PRECHARGE. + -- Timer counts from T_RAS-2 downto -1 for easy detection of + -- "timer done". MSB is sign bit. + -- Substract 1, because timer is checked one cycle before DO_PRECHARGE. + signal timer_tRAS : signed(log2ceil(T_RAS-2) downto 0); + constant TIMER_TRAS_INIT : signed(log2ceil(T_RAS-2) downto 0) + := to_signed(T_RAS-1 -2, timer_tRAS'length); + signal timer_tRAS_start : std_logic; + signal timer_tRAS_done : std_logic; + + -------- + -- Counter + -------- + + -- Misc down counter. Counter is "done", when value == -1. + -- Thus, if counter is inited to n, then counter is done n+2 decrements + -- later. + signal downcnt : signed(log2ceil(INIT_WAIT-2) downto 0); + signal downcnt_init : signed(downcnt'range); + signal downcnt_set : std_logic; + signal downcnt_dec : std_logic; + signal downcnt_done : std_logic; + + -------- + -- Last address + -------- + signal last_bank_addr_r : std_logic_vector(bank_addr'range); + signal last_bank_addr_nxt : std_logic_vector(bank_addr'range); + signal last_row_addr_r : std_logic_vector(row_addr'range); + signal last_row_addr_nxt : std_logic_vector(row_addr'range); + signal last_write_r : std_logic; + signal last_write_nxt : std_logic; + signal save_cmd_addr : std_logic; + signal same_bank_row : std_logic; begin -- rtl - ----------------------------------------------------------------------------- - -- Configuration check - ----------------------------------------------------------------------------- - - assert (D_BITS = 16) or (D_BITS = 8) or (D_BITS = 4) - report "Data width not yet supported." - severity failure; - - ----------------------------------------------------------------------------- - -- Datapath not depending on FSM - ----------------------------------------------------------------------------- - - -- address mapping - col_addr <= user_addr( C_BITS-1 downto 0); - row_addr <= user_addr( R_BITS+C_BITS-1 downto C_BITS); - bank_addr <= user_addr(B_BITS+R_BITS+C_BITS-1 downto R_BITS+C_BITS); - - timer_tREFI_done <= timer_tREFI(timer_tREFI'left); - timer_cmd_done <= timer_cmd(timer_cmd'left); - timer_tRAS_done <= timer_tRAS(timer_tRAS'left); - downcnt_done <= downcnt(downcnt'left); - - same_bank_row <= '1' when (last_bank_addr_r & last_row_addr_r) = - (bank_addr & row_addr) else '0'; - - last_bank_addr_nxt <= bank_addr; - last_row_addr_nxt <= row_addr; - last_write_nxt <= user_write; - - ----------------------------------------------------------------------------- - -- FSM - ----------------------------------------------------------------------------- - process (fsm_cs, - timer_tREFI_done, timer_cmd_done, timer_tRAS_done, - downcnt_done, - same_bank_row, last_write_r, - user_cmd_valid, user_write, user_wdata_valid) - begin -- process - fsm_ns <= fsm_cs; - sd_cke_nxt <= '1'; - sd_cmd_nxt <= SD_CMD_DESELECT; - sd_a_sel <= SD_A_SEL_COL_ADDR; - sd_ba_sel <= SD_BA_SEL_ADDR; - precharge_all <= '0'; - reset_dll <= '-'; -- only when load_mode_reg - rden_nxt <= '0'; - wren_nxt <= '0'; - - timer_tREFI_start <= '0'; - timer_tRAS_start <= '0'; - - timer_cmd_init <= (others => '-'); - timer_cmd_start <= '0'; - - downcnt_init <= (others => '-'); - downcnt_set <= '0'; - downcnt_dec <= '0'; - - user_got_cmd <= '0'; - user_got_wdata <= '0'; - - save_cmd_addr <= '0'; - - case fsm_cs is - when INIT1 => - -- Wait for SDRAM power up. See description for INIT_WAIT in header. - -- Hold sd_cke low. - sd_cke_nxt <= '0'; - downcnt_init <= to_signed(INIT_WAIT-2, downcnt_init'length); - downcnt_set <= '1'; - timer_tREFI_start <= '1'; - fsm_ns <= INIT2; - - when INIT2 => - sd_cke_nxt <= '0'; - - if timer_tREFI_done = '1' then - if downcnt_done = '1' then - fsm_ns <= INIT3; - else - timer_tREFI_start <= '1'; - downcnt_dec <= '1'; - end if; - end if; - - when INIT3 => - -- Bring up sd_cke with a NOP command. - sd_cmd_nxt <= SD_CMD_NOP; - fsm_ns <= INIT4; - - when INIT4 => - -- Precharge all. - sd_cmd_nxt <= SD_CMD_PRECHARGE; - sd_a_sel <= SD_A_SEL_COL_ADDR; - precharge_all <= '1'; - timer_cmd_init <= to_signed(T_RP-2, timer_cmd_init'length); - timer_cmd_start <= '1'; - - if SDRAM_TYPE >= 1 then - fsm_ns <= INIT5; - else - -- skip if SDR-SDRAM - fsm_ns <= INIT8; - end if; - - when INIT5 => - sd_a_sel <= SD_A_SEL_EXT_MODE_REG; - sd_ba_sel <= SD_BA_SEL_EXT_MODE_REG; - timer_cmd_init <= to_signed(T_MRD-2, timer_cmd_init'length); - - if timer_cmd_done = '1' then - -- Load extended mode register - sd_cmd_nxt <= SD_CMD_LOAD_MODE_REG; - timer_cmd_start <= '1'; - fsm_ns <= INIT6; - end if; - - when INIT6 => - reset_dll <= '1'; - sd_a_sel <= SD_A_SEL_MODE_REG; - sd_ba_sel <= SD_BA_SEL_MODE_REG; - timer_cmd_init <= to_signed(T_MRD-2, timer_cmd_init'length); - - if timer_cmd_done = '1' then - -- Load mode register - sd_cmd_nxt <= SD_CMD_LOAD_MODE_REG; - timer_cmd_start <= '1'; - - -- Wait for 200 cycles, by waiting for T_REFI. - -- This is juzst for reuse. - timer_tREFI_start <= '1'; - fsm_ns <= INIT7; - end if; - - when INIT7 => - sd_a_sel <= SD_A_SEL_COL_ADDR; - precharge_all <= '1'; - timer_cmd_init <= to_signed(T_RP-2, timer_cmd_init'length); - - if timer_cmd_done = '1' then - -- Precharge all. - sd_cmd_nxt <= SD_CMD_PRECHARGE; - timer_cmd_start <= '1'; - fsm_ns <= INIT8; - end if; - - when INIT8 => - timer_cmd_init <= to_signed(T_RFC-2, timer_cmd_init'length); - - if timer_cmd_done = '1' then - -- First auto refresh. - sd_cmd_nxt <= SD_CMD_AUTO_REFRESH; - timer_cmd_start <= '1'; - fsm_ns <= INIT9; - end if; - - when INIT9 => - timer_cmd_init <= to_signed(T_RFC-2, timer_cmd_init'length); - - if timer_cmd_done = '1' then - -- Second auto refresh. - sd_cmd_nxt <= SD_CMD_AUTO_REFRESH; - timer_cmd_start <= '1'; - fsm_ns <= INIT10; - end if; - - when INIT10 => - reset_dll <= '0'; - sd_a_sel <= SD_A_SEL_MODE_REG; - sd_ba_sel <= SD_BA_SEL_MODE_REG; - timer_cmd_init <= to_signed(T_MRD-2, timer_cmd_init'length); - - if (timer_cmd_done = '1') and (timer_tREFI_done = '1') then - -- Now, we have waited for at least 200 cycles. - -- Load mode register, with "reset DLL" cleared. - sd_cmd_nxt <= SD_CMD_LOAD_MODE_REG; - timer_cmd_start <= '1'; - fsm_ns <= INIT11; - end if; - - when INIT11 => - timer_cmd_init <= to_signed(T_RFC-2, timer_cmd_init'length); - - if timer_cmd_done = '1' then - -- Schedule another auto refresh and restart T_REFI timer. - sd_cmd_nxt <= SD_CMD_AUTO_REFRESH; - timer_cmd_start <= '1'; - timer_tREFI_start <= '1'; - fsm_ns <= DO_ACTIVATE; - end if; - - - when DO_ACTIVATE => - -- For activate row. - sd_a_sel <= SD_A_SEL_ROW_ADDR; - sd_ba_sel <= SD_BA_SEL_ADDR; - - -- wait for finish of last command, before executing new one - if timer_cmd_done = '1' then - if user_cmd_valid = '1' then - -- Activate Row - sd_cmd_nxt <= SD_CMD_ACTIVE; - timer_cmd_init <= to_signed(T_RCD-2, timer_cmd_init'length); - timer_cmd_start <= '1'; - timer_tRAS_start<= '1'; - - if user_write = '1' then - fsm_ns <= DO_WRITE1; - else - fsm_ns <= DO_READ1; - end if; - - elsif timer_tREFI_done = '1' then - -- Auto Refresh - sd_cmd_nxt <= SD_CMD_AUTO_REFRESH; - timer_cmd_init <= to_signed(T_RFC-2, timer_cmd_init'length); - timer_cmd_start <= '1'; - timer_tREFI_start <= '1'; - --fsm_ns <= DO_ACTIVATE; - end if; - end if; - - when DO_READ1 => - -- wait for CL cycles. - -- Substract 1 because CHECKNXT is entered before - -- DO_PRECHARGE. - timer_cmd_init <= to_signed(CL-1 -2, - timer_cmd_init'length); - - -- Additional burst cycles: BCC-1 - downcnt_init <= to_signed(BCC-1-2, downcnt_init'length); - - sd_a_sel <= SD_A_SEL_COL_ADDR; - sd_ba_sel <= SD_BA_SEL_ADDR; - - if timer_cmd_done = '1' then - -- Read first - sd_cmd_nxt <= SD_CMD_READ; - rden_nxt <= '1'; - timer_cmd_start <= '1'; - downcnt_set <= '1'; - user_got_cmd <= '1'; - save_cmd_addr <= '1'; - - if (SDRAM_TYPE = 0 and BL = 1) or - (SDRAM_TYPE > 0 and BL = 2) then - fsm_ns <= CHECKNXT; - else - fsm_ns <= DO_READ2; - end if; - end if; - - when DO_READ2 => - if (SDRAM_TYPE = 0 and BL > 1) or - (SDRAM_TYPE > 0 and BL > 2) - then - -- Read more - downcnt_dec <= '1'; - rden_nxt <= '1'; - - if downcnt_done = '1' then - fsm_ns <= CHECKNXT; - end if; - end if; - - when DO_WRITE1 => - -- wait for 1 + BCC + T_WR cycles - -- Substract 1 because CHECKNXT is entered before - -- DO_PRECHARGE. - timer_cmd_init <= to_signed(1+BCC+T_WR-1 -2, - timer_cmd_init'length); - - -- Additional burst cycles: BCC-1 - downcnt_init <= to_signed(BCC-1-2, downcnt_init'length); - - sd_a_sel <= SD_A_SEL_COL_ADDR; - sd_ba_sel <= SD_BA_SEL_ADDR; - - if (timer_cmd_done and user_wdata_valid) = '1' then - -- Write first - sd_cmd_nxt <= SD_CMD_WRITE; - wren_nxt <= '1'; - timer_cmd_start <= '1'; - downcnt_set <= '1'; - user_got_cmd <= '1'; - user_got_wdata <= '1'; - save_cmd_addr <= '1'; - - if (SDRAM_TYPE = 0 and BL = 1) or - (SDRAM_TYPE > 0 and BL = 2) then - fsm_ns <= CHECKNXT; - else - fsm_ns <= DO_WRITE2; - end if; - end if; - - when DO_WRITE2 => - if (SDRAM_TYPE = 0 and BL > 1) or - (SDRAM_TYPE > 0 and BL > 2) then - -- Write more - downcnt_dec <= '1'; - wren_nxt <= '1'; - user_got_wdata <= '1'; - - if downcnt_done = '1' then - fsm_ns <= CHECKNXT; - end if; - end if; - - when CHECKNXT => - if last_write_r = '1' then - -- last was write - if user_write = '1' then - -- write-to-write to same bank and row - -- Set timer to zero. - timer_cmd_init <= to_signed(-2, timer_cmd_init'length); - else - -- write-to-read to same bank and row - -- We must wait for 1+BCC+T_WTR cycles since start of write. - -- We already waited for BCC due to execution of burst. - timer_cmd_init <= to_signed(1+T_WTR -2, timer_cmd_init'length); - end if; - else - -- last was read - if user_write = '1' then - -- read-to-write to same bank and row - -- We must wait for BCC+CL cycles since start of read. - -- We already waited for BCC due to execution of burst. - timer_cmd_init <= to_signed(CL -2, timer_cmd_init'length); - else - -- read-to-read to same bank and row - -- Set timer to zero. - timer_cmd_init <= to_signed(-2, timer_cmd_init'length); - end if; - - end if; - - if timer_tREFI_done = '1' then - -- A refresh is pending. - -- Wait here until timer_tRAS is done. - if timer_tRAS_done = '1' then - fsm_ns <= DO_PRECHARGE; - end if; - - elsif (user_cmd_valid and same_bank_row) = '1' then - -- Access to same bank and row. - -- Wait timer is initiated above. - timer_cmd_start <= '1'; - if user_write = '1' then - fsm_ns <= DO_WRITE1; - else - fsm_ns <= DO_READ1; - end if; - - elsif timer_cmd_done = '1' then - -- Execute a precharge now for minimum latency of next access to - -- another bank/row. - -- Wait here until timer_tRAS is done. - if timer_tRAS_done = '1' then - fsm_ns <= DO_PRECHARGE; - end if; - - --else: check again - end if; - - when DO_PRECHARGE => - timer_cmd_init <= to_signed(T_RP-2, timer_cmd_init'length); - - if timer_cmd_done = '1' then - -- Precharge - -- NOTE: It is sufficient to precharge the bank in use. - -- But, because the address isn't saved, the bank is unknown. - -- Thus, precharge ALL. - sd_cmd_nxt <= SD_CMD_PRECHARGE; - precharge_all <= '1'; - timer_cmd_start <= '1'; - if timer_tREFI_done = '1' then - fsm_ns <= DO_AUTO_REFRESH; - else - fsm_ns <= DO_ACTIVATE; - end if; - end if; - - when DO_AUTO_REFRESH => - timer_cmd_init <= to_signed(T_RFC-2, timer_cmd_init'length); - - if timer_cmd_done = '1' then - -- Auto refresh - sd_cmd_nxt <= SD_CMD_AUTO_REFRESH; - timer_cmd_start <= '1'; - timer_tREFI_start <= '1'; - fsm_ns <= DO_ACTIVATE; - end if; - - end case; - end process; - - ----------------------------------------------------------------------------- - -- Datapath depending on FSM output - -- - -- Command and address are registered again in the physical layer. - ----------------------------------------------------------------------------- - - sd_cs_nxt <= sd_cmd_nxt(3); - sd_ras_nxt <= sd_cmd_nxt(2); - sd_cas_nxt <= sd_cmd_nxt(1); - sd_we_nxt <= sd_cmd_nxt(0); - - process (sd_a_sel, reset_dll, row_addr, col_addr, precharge_all) - begin -- process - sd_a_nxt <= (others => '0'); - - case sd_a_sel is - when SD_A_SEL_EXT_MODE_REG => - sd_a_nxt(EXT_MODE_REG'range) <= EXT_MODE_REG; - - when SD_A_SEL_MODE_REG => - sd_a_nxt(MODE_REG'range) <= MODE_REG; - sd_a_nxt(MODE_REG'left) <= reset_dll; - - when SD_A_SEL_ROW_ADDR => - sd_a_nxt(R_BITS-1 downto 0) <= row_addr; - - when SD_A_SEL_COL_ADDR => - sd_a_nxt (imin(10, C_BITS)-1 downto 0) - <= col_addr(imin(10, C_BITS)-1 downto 0); - sd_a_nxt(10) <= precharge_all; - if C_BITS > 10 then - sd_a_nxt(C_BITS downto 11) <= col_addr(C_BITS-1 downto 10); - end if; - end case; - end process; - - with sd_ba_sel select - sd_ba_nxt <= - "01" when SD_BA_SEL_EXT_MODE_REG, - "00" when SD_BA_SEL_MODE_REG, - bank_addr when others; -- SD_BA_SEL_ADDR - - ----------------------------------------------------------------------------- - -- Registers - ----------------------------------------------------------------------------- - - process (clk) - begin -- process - if rising_edge(clk) then - if rst = '1' then - fsm_cs <= INIT1; - else - fsm_cs <= fsm_ns; - end if; - - if timer_tREFI_start = '1' then - timer_tREFI <= TIMER_TREFI_INIT; - elsif timer_tREFI_done = '0' then - -- auto decrement - timer_tREFI <= timer_tREFI - 1; - end if; - - if timer_cmd_start = '1' then - timer_cmd <= timer_cmd_init; - elsif timer_cmd_done = '0' then - -- auto decrement - timer_cmd <= timer_cmd - 1; - end if; - - if timer_tRAS_start = '1' then - timer_tRAS <= TIMER_TRAS_INIT; - elsif timer_tRAS_done = '0' then - -- auto decrement - timer_tRAS <= timer_tRAS - 1; - end if; - - if downcnt_set = '1' then - downcnt <= downcnt_init; - elsif downcnt_dec = '1' then - downcnt <= downcnt - 1; - end if; - - if save_cmd_addr = '1' then - last_write_r <= last_write_nxt; - last_bank_addr_r <= last_bank_addr_nxt; - last_row_addr_r <= last_row_addr_nxt; - end if; - end if; - end process; + ----------------------------------------------------------------------------- + -- Configuration check + ----------------------------------------------------------------------------- + + assert (D_BITS = 16) or (D_BITS = 8) or (D_BITS = 4) + report "Data width not yet supported." + severity failure; + + ----------------------------------------------------------------------------- + -- Datapath not depending on FSM + ----------------------------------------------------------------------------- + + -- address mapping + col_addr <= user_addr( C_BITS-1 downto 0); + row_addr <= user_addr( R_BITS+C_BITS-1 downto C_BITS); + bank_addr <= user_addr(B_BITS+R_BITS+C_BITS-1 downto R_BITS+C_BITS); + + timer_tREFI_done <= timer_tREFI(timer_tREFI'left); + timer_cmd_done <= timer_cmd(timer_cmd'left); + timer_tRAS_done <= timer_tRAS(timer_tRAS'left); + downcnt_done <= downcnt(downcnt'left); + + same_bank_row <= '1' when (last_bank_addr_r & last_row_addr_r) = + (bank_addr & row_addr) else '0'; + + last_bank_addr_nxt <= bank_addr; + last_row_addr_nxt <= row_addr; + last_write_nxt <= user_write; + + ----------------------------------------------------------------------------- + -- FSM + ----------------------------------------------------------------------------- + process (fsm_cs, + timer_tREFI_done, timer_cmd_done, timer_tRAS_done, + downcnt_done, + same_bank_row, last_write_r, + user_cmd_valid, user_write, user_wdata_valid) + begin -- process + fsm_ns <= fsm_cs; + sd_cke_nxt <= '1'; + sd_cmd_nxt <= SD_CMD_DESELECT; + sd_a_sel <= SD_A_SEL_COL_ADDR; + sd_ba_sel <= SD_BA_SEL_ADDR; + precharge_all <= '0'; + reset_dll <= '-'; -- only when load_mode_reg + rden_nxt <= '0'; + wren_nxt <= '0'; + + timer_tREFI_start <= '0'; + timer_tRAS_start <= '0'; + + timer_cmd_init <= (others => '-'); + timer_cmd_start <= '0'; + + downcnt_init <= (others => '-'); + downcnt_set <= '0'; + downcnt_dec <= '0'; + + user_got_cmd <= '0'; + user_got_wdata <= '0'; + + save_cmd_addr <= '0'; + + case fsm_cs is + when INIT1 => + -- Wait for SDRAM power up. See description for INIT_WAIT in header. + -- Hold sd_cke low. + sd_cke_nxt <= '0'; + downcnt_init <= to_signed(INIT_WAIT-2, downcnt_init'length); + downcnt_set <= '1'; + timer_tREFI_start <= '1'; + fsm_ns <= INIT2; + + when INIT2 => + sd_cke_nxt <= '0'; + + if timer_tREFI_done = '1' then + if downcnt_done = '1' then + fsm_ns <= INIT3; + else + timer_tREFI_start <= '1'; + downcnt_dec <= '1'; + end if; + end if; + + when INIT3 => + -- Bring up sd_cke with a NOP command. + sd_cmd_nxt <= SD_CMD_NOP; + fsm_ns <= INIT4; + + when INIT4 => + -- Precharge all. + sd_cmd_nxt <= SD_CMD_PRECHARGE; + sd_a_sel <= SD_A_SEL_COL_ADDR; + precharge_all <= '1'; + timer_cmd_init <= to_signed(T_RP-2, timer_cmd_init'length); + timer_cmd_start <= '1'; + + if SDRAM_TYPE >= 1 then + fsm_ns <= INIT5; + else + -- skip if SDR-SDRAM + fsm_ns <= INIT8; + end if; + + when INIT5 => + sd_a_sel <= SD_A_SEL_EXT_MODE_REG; + sd_ba_sel <= SD_BA_SEL_EXT_MODE_REG; + timer_cmd_init <= to_signed(T_MRD-2, timer_cmd_init'length); + + if timer_cmd_done = '1' then + -- Load extended mode register + sd_cmd_nxt <= SD_CMD_LOAD_MODE_REG; + timer_cmd_start <= '1'; + fsm_ns <= INIT6; + end if; + + when INIT6 => + reset_dll <= '1'; + sd_a_sel <= SD_A_SEL_MODE_REG; + sd_ba_sel <= SD_BA_SEL_MODE_REG; + timer_cmd_init <= to_signed(T_MRD-2, timer_cmd_init'length); + + if timer_cmd_done = '1' then + -- Load mode register + sd_cmd_nxt <= SD_CMD_LOAD_MODE_REG; + timer_cmd_start <= '1'; + + -- Wait for 200 cycles, by waiting for T_REFI. + -- This is juzst for reuse. + timer_tREFI_start <= '1'; + fsm_ns <= INIT7; + end if; + + when INIT7 => + sd_a_sel <= SD_A_SEL_COL_ADDR; + precharge_all <= '1'; + timer_cmd_init <= to_signed(T_RP-2, timer_cmd_init'length); + + if timer_cmd_done = '1' then + -- Precharge all. + sd_cmd_nxt <= SD_CMD_PRECHARGE; + timer_cmd_start <= '1'; + fsm_ns <= INIT8; + end if; + + when INIT8 => + timer_cmd_init <= to_signed(T_RFC-2, timer_cmd_init'length); + + if timer_cmd_done = '1' then + -- First auto refresh. + sd_cmd_nxt <= SD_CMD_AUTO_REFRESH; + timer_cmd_start <= '1'; + fsm_ns <= INIT9; + end if; + + when INIT9 => + timer_cmd_init <= to_signed(T_RFC-2, timer_cmd_init'length); + + if timer_cmd_done = '1' then + -- Second auto refresh. + sd_cmd_nxt <= SD_CMD_AUTO_REFRESH; + timer_cmd_start <= '1'; + fsm_ns <= INIT10; + end if; + + when INIT10 => + reset_dll <= '0'; + sd_a_sel <= SD_A_SEL_MODE_REG; + sd_ba_sel <= SD_BA_SEL_MODE_REG; + timer_cmd_init <= to_signed(T_MRD-2, timer_cmd_init'length); + + if (timer_cmd_done = '1') and (timer_tREFI_done = '1') then + -- Now, we have waited for at least 200 cycles. + -- Load mode register, with "reset DLL" cleared. + sd_cmd_nxt <= SD_CMD_LOAD_MODE_REG; + timer_cmd_start <= '1'; + fsm_ns <= INIT11; + end if; + + when INIT11 => + timer_cmd_init <= to_signed(T_RFC-2, timer_cmd_init'length); + + if timer_cmd_done = '1' then + -- Schedule another auto refresh and restart T_REFI timer. + sd_cmd_nxt <= SD_CMD_AUTO_REFRESH; + timer_cmd_start <= '1'; + timer_tREFI_start <= '1'; + fsm_ns <= DO_ACTIVATE; + end if; + + + when DO_ACTIVATE => + -- For activate row. + sd_a_sel <= SD_A_SEL_ROW_ADDR; + sd_ba_sel <= SD_BA_SEL_ADDR; + + -- wait for finish of last command, before executing new one + if timer_cmd_done = '1' then + if user_cmd_valid = '1' then + -- Activate Row + sd_cmd_nxt <= SD_CMD_ACTIVE; + timer_cmd_init <= to_signed(T_RCD-2, timer_cmd_init'length); + timer_cmd_start <= '1'; + timer_tRAS_start<= '1'; + + if user_write = '1' then + fsm_ns <= DO_WRITE1; + else + fsm_ns <= DO_READ1; + end if; + + elsif timer_tREFI_done = '1' then + -- Auto Refresh + sd_cmd_nxt <= SD_CMD_AUTO_REFRESH; + timer_cmd_init <= to_signed(T_RFC-2, timer_cmd_init'length); + timer_cmd_start <= '1'; + timer_tREFI_start <= '1'; + --fsm_ns <= DO_ACTIVATE; + end if; + end if; + + when DO_READ1 => + -- wait for CL cycles. + -- Substract 1 because CHECKNXT is entered before + -- DO_PRECHARGE. + timer_cmd_init <= to_signed(CL-1 -2, + timer_cmd_init'length); + + -- Additional burst cycles: BCC-1 + downcnt_init <= to_signed(BCC-1-2, downcnt_init'length); + + sd_a_sel <= SD_A_SEL_COL_ADDR; + sd_ba_sel <= SD_BA_SEL_ADDR; + + if timer_cmd_done = '1' then + -- Read first + sd_cmd_nxt <= SD_CMD_READ; + rden_nxt <= '1'; + timer_cmd_start <= '1'; + downcnt_set <= '1'; + user_got_cmd <= '1'; + save_cmd_addr <= '1'; + + if (SDRAM_TYPE = 0 and BL = 1) or + (SDRAM_TYPE > 0 and BL = 2) then + fsm_ns <= CHECKNXT; + else + fsm_ns <= DO_READ2; + end if; + end if; + + when DO_READ2 => + if (SDRAM_TYPE = 0 and BL > 1) or + (SDRAM_TYPE > 0 and BL > 2) + then + -- Read more + downcnt_dec <= '1'; + rden_nxt <= '1'; + + if downcnt_done = '1' then + fsm_ns <= CHECKNXT; + end if; + end if; + + when DO_WRITE1 => + -- wait for 1 + BCC + T_WR cycles + -- Substract 1 because CHECKNXT is entered before + -- DO_PRECHARGE. + timer_cmd_init <= to_signed(1+BCC+T_WR-1 -2, + timer_cmd_init'length); + + -- Additional burst cycles: BCC-1 + downcnt_init <= to_signed(BCC-1-2, downcnt_init'length); + + sd_a_sel <= SD_A_SEL_COL_ADDR; + sd_ba_sel <= SD_BA_SEL_ADDR; + + if (timer_cmd_done and user_wdata_valid) = '1' then + -- Write first + sd_cmd_nxt <= SD_CMD_WRITE; + wren_nxt <= '1'; + timer_cmd_start <= '1'; + downcnt_set <= '1'; + user_got_cmd <= '1'; + user_got_wdata <= '1'; + save_cmd_addr <= '1'; + + if (SDRAM_TYPE = 0 and BL = 1) or + (SDRAM_TYPE > 0 and BL = 2) then + fsm_ns <= CHECKNXT; + else + fsm_ns <= DO_WRITE2; + end if; + end if; + + when DO_WRITE2 => + if (SDRAM_TYPE = 0 and BL > 1) or + (SDRAM_TYPE > 0 and BL > 2) then + -- Write more + downcnt_dec <= '1'; + wren_nxt <= '1'; + user_got_wdata <= '1'; + + if downcnt_done = '1' then + fsm_ns <= CHECKNXT; + end if; + end if; + + when CHECKNXT => + if last_write_r = '1' then + -- last was write + if user_write = '1' then + -- write-to-write to same bank and row + -- Set timer to zero. + timer_cmd_init <= to_signed(-2, timer_cmd_init'length); + else + -- write-to-read to same bank and row + -- We must wait for 1+BCC+T_WTR cycles since start of write. + -- We already waited for BCC due to execution of burst. + timer_cmd_init <= to_signed(1+T_WTR -2, timer_cmd_init'length); + end if; + else + -- last was read + if user_write = '1' then + -- read-to-write to same bank and row + -- We must wait for BCC+CL cycles since start of read. + -- We already waited for BCC due to execution of burst. + timer_cmd_init <= to_signed(CL -2, timer_cmd_init'length); + else + -- read-to-read to same bank and row + -- Set timer to zero. + timer_cmd_init <= to_signed(-2, timer_cmd_init'length); + end if; + + end if; + + if timer_tREFI_done = '1' then + -- A refresh is pending. + -- Wait here until timer_tRAS is done. + if timer_tRAS_done = '1' then + fsm_ns <= DO_PRECHARGE; + end if; + + elsif (user_cmd_valid and same_bank_row) = '1' then + -- Access to same bank and row. + -- Wait timer is initiated above. + timer_cmd_start <= '1'; + if user_write = '1' then + fsm_ns <= DO_WRITE1; + else + fsm_ns <= DO_READ1; + end if; + + elsif timer_cmd_done = '1' then + -- Execute a precharge now for minimum latency of next access to + -- another bank/row. + -- Wait here until timer_tRAS is done. + if timer_tRAS_done = '1' then + fsm_ns <= DO_PRECHARGE; + end if; + + --else: check again + end if; + + when DO_PRECHARGE => + timer_cmd_init <= to_signed(T_RP-2, timer_cmd_init'length); + + if timer_cmd_done = '1' then + -- Precharge + -- NOTE: It is sufficient to precharge the bank in use. + -- But, because the address isn't saved, the bank is unknown. + -- Thus, precharge ALL. + sd_cmd_nxt <= SD_CMD_PRECHARGE; + precharge_all <= '1'; + timer_cmd_start <= '1'; + if timer_tREFI_done = '1' then + fsm_ns <= DO_AUTO_REFRESH; + else + fsm_ns <= DO_ACTIVATE; + end if; + end if; + + when DO_AUTO_REFRESH => + timer_cmd_init <= to_signed(T_RFC-2, timer_cmd_init'length); + + if timer_cmd_done = '1' then + -- Auto refresh + sd_cmd_nxt <= SD_CMD_AUTO_REFRESH; + timer_cmd_start <= '1'; + timer_tREFI_start <= '1'; + fsm_ns <= DO_ACTIVATE; + end if; + + end case; + end process; + + ----------------------------------------------------------------------------- + -- Datapath depending on FSM output + -- + -- Command and address are registered again in the physical layer. + ----------------------------------------------------------------------------- + + sd_cs_nxt <= sd_cmd_nxt(3); + sd_ras_nxt <= sd_cmd_nxt(2); + sd_cas_nxt <= sd_cmd_nxt(1); + sd_we_nxt <= sd_cmd_nxt(0); + + process (sd_a_sel, reset_dll, row_addr, col_addr, precharge_all) + begin -- process + sd_a_nxt <= (others => '0'); + + case sd_a_sel is + when SD_A_SEL_EXT_MODE_REG => + sd_a_nxt(EXT_MODE_REG'range) <= EXT_MODE_REG; + + when SD_A_SEL_MODE_REG => + sd_a_nxt(MODE_REG'range) <= MODE_REG; + sd_a_nxt(MODE_REG'left) <= reset_dll; + + when SD_A_SEL_ROW_ADDR => + sd_a_nxt(R_BITS-1 downto 0) <= row_addr; + + when SD_A_SEL_COL_ADDR => + sd_a_nxt (imin(10, C_BITS)-1 downto 0) + <= col_addr(imin(10, C_BITS)-1 downto 0); + sd_a_nxt(10) <= precharge_all; + if C_BITS > 10 then + sd_a_nxt(C_BITS downto 11) <= col_addr(C_BITS-1 downto 10); + end if; + end case; + end process; + + with sd_ba_sel select + sd_ba_nxt <= + "01" when SD_BA_SEL_EXT_MODE_REG, + "00" when SD_BA_SEL_MODE_REG, + bank_addr when others; -- SD_BA_SEL_ADDR + + ----------------------------------------------------------------------------- + -- Registers + ----------------------------------------------------------------------------- + + process (clk) + begin -- process + if rising_edge(clk) then + if rst = '1' then + fsm_cs <= INIT1; + else + fsm_cs <= fsm_ns; + end if; + + if timer_tREFI_start = '1' then + timer_tREFI <= TIMER_TREFI_INIT; + elsif timer_tREFI_done = '0' then + -- auto decrement + timer_tREFI <= timer_tREFI - 1; + end if; + + if timer_cmd_start = '1' then + timer_cmd <= timer_cmd_init; + elsif timer_cmd_done = '0' then + -- auto decrement + timer_cmd <= timer_cmd - 1; + end if; + + if timer_tRAS_start = '1' then + timer_tRAS <= TIMER_TRAS_INIT; + elsif timer_tRAS_done = '0' then + -- auto decrement + timer_tRAS <= timer_tRAS - 1; + end if; + + if downcnt_set = '1' then + downcnt <= downcnt_init; + elsif downcnt_dec = '1' then + downcnt <= downcnt - 1; + end if; + + if save_cmd_addr = '1' then + last_write_r <= last_write_nxt; + last_bank_addr_r <= last_bank_addr_nxt; + last_row_addr_r <= last_row_addr_nxt; + end if; + end if; + end process; end rtl; diff --git a/src/mem/sdram/sdram_ctrl_phy_de0.vhdl b/src/mem/sdram/sdram_ctrl_phy_de0.vhdl index 1cb3d7fe1..c132cddf4 100644 --- a/src/mem/sdram/sdram_ctrl_phy_de0.vhdl +++ b/src/mem/sdram/sdram_ctrl_phy_de0.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Entity: Physical layer of SDRAM-Controller for Altera DE0 Board +-- Entity: Physical layer of SDRAM-Controller for Altera DE0 Board -- -- Description: -- ------------------------------------- @@ -42,13 +42,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -77,192 +77,192 @@ -- tristate internal signal "*_z" ------------------------------------------------------------------------------- -library ieee; -use ieee.std_logic_1164.all; +library IEEE; +use IEEE.std_logic_1164.all; library altera_mf; -use altera_mf.altera_mf_components.all; +use altera_mf.altera_mf_components.all; entity sdram_ctrl_phy_de0 is - generic ( - CL : positive); -- CAS latency - port ( - clk : in std_logic; - clkout : in std_logic; - rst : in std_logic; + generic ( + CL : positive); -- CAS latency + port ( + clk : in std_logic; + clkout : in std_logic; + rst : in std_logic; - sd_cke_nxt : in std_logic; - sd_cs_nxt : in std_logic; - sd_ras_nxt : in std_logic; - sd_cas_nxt : in std_logic; - sd_we_nxt : in std_logic; - sd_ba_nxt : in std_logic_vector(1 downto 0); - sd_a_nxt : in std_logic_vector(11 downto 0); + sd_cke_nxt : in std_logic; + sd_cs_nxt : in std_logic; + sd_ras_nxt : in std_logic; + sd_cas_nxt : in std_logic; + sd_we_nxt : in std_logic; + sd_ba_nxt : in std_logic_vector(1 downto 0); + sd_a_nxt : in std_logic_vector(11 downto 0); - wren_nxt : in std_logic; - wdata_nxt : in std_logic_vector(15 downto 0); + wren_nxt : in std_logic; + wdata_nxt : in std_logic_vector(15 downto 0); - rden_nxt : in std_logic; - rdata : out std_logic_vector(15 downto 0); - rstb : out std_logic; + rden_nxt : in std_logic; + rdata : out std_logic_vector(15 downto 0); + rstb : out std_logic; - sd_ck : out std_logic; - sd_cke : out std_logic; - sd_cs : out std_logic; - sd_ras : out std_logic; - sd_cas : out std_logic; - sd_we : out std_logic; - sd_ba : out std_logic_vector(1 downto 0); - sd_a : out std_logic_vector(11 downto 0); - sd_dq : inout std_logic_vector(15 downto 0)); + sd_ck : out std_logic; + sd_cke : out std_logic; + sd_cs : out std_logic; + sd_ras : out std_logic; + sd_cas : out std_logic; + sd_we : out std_logic; + sd_ba : out std_logic_vector(1 downto 0); + sd_a : out std_logic_vector(11 downto 0); + sd_dq : inout std_logic_vector(15 downto 0)); end sdram_ctrl_phy_de0; architecture rtl of sdram_ctrl_phy_de0 is - -- memory command: domain clk - signal sd_cke_r : std_logic := '0'; - signal sd_cs_r : std_logic := '1'; - signal sd_ras_r : std_logic; - signal sd_cas_r : std_logic; - signal sd_we_r : std_logic; - signal sd_ba_r : std_logic_vector(1 downto 0); - signal sd_a_r : std_logic_vector(11 downto 0); + -- memory command: domain clk + signal sd_cke_r : std_logic := '0'; + signal sd_cs_r : std_logic := '1'; + signal sd_ras_r : std_logic; + signal sd_cas_r : std_logic; + signal sd_we_r : std_logic; + signal sd_ba_r : std_logic_vector(1 downto 0); + signal sd_a_r : std_logic_vector(11 downto 0); - -- control / data signals for write - signal dq_en_r : std_logic_vector(15 downto 0); - signal dq_o_r : std_logic_vector(15 downto 0); + -- control / data signals for write + signal dq_en_r : std_logic_vector(15 downto 0); + signal dq_o_r : std_logic_vector(15 downto 0); - -- control / data signals for read - -- adjust read delay through length of vector - signal dq_i : std_logic_vector(15 downto 0); - signal rden_r : std_logic_vector(CL downto 0); - signal rstb_r : std_logic; - signal rdata_r : std_logic_vector(15 downto 0); + -- control / data signals for read + -- adjust read delay through length of vector + signal dq_i : std_logic_vector(15 downto 0); + signal rden_r : std_logic_vector(CL downto 0); + signal rstb_r : std_logic; + signal rdata_r : std_logic_vector(15 downto 0); begin -- rtl - ----------------------------------------------------------------------------- - -- SDRAM clock generation - ----------------------------------------------------------------------------- + ----------------------------------------------------------------------------- + -- SDRAM clock generation + ----------------------------------------------------------------------------- - sd_ck_obuf : altiobuf_out generic map ( - NUMBER_OF_CHANNELS => 1) - port map ( - datain(0) => clkout, - dataout(0) => sd_ck); + sd_ck_obuf : altiobuf_out generic map ( + NUMBER_OF_CHANNELS => 1) + port map ( + datain(0) => clkout, + dataout(0) => sd_ck); - -- Output clock 180 deg phase-shifted with respect to control/data signals - --sd_ck_off : altddio_out - -- generic map ( - -- WIDTH => 1) - -- port map ( - -- datain_h => "0", - -- datain_l => "1", - -- dataout(0) => sd_ck, - -- outclock => clk); + -- Output clock 180 deg phase-shifted with respect to control/data signals + --sd_ck_off : altddio_out + -- generic map ( + -- WIDTH => 1) + -- port map ( + -- datain_h => "0", + -- datain_l => "1", + -- dataout(0) => sd_ck, + -- outclock => clk); - ----------------------------------------------------------------------------- - -- SDRAM command & address - -- - -- These registers should be placed in the I/O blocks. - -- Use appriopate timing constraints. - ----------------------------------------------------------------------------- + ----------------------------------------------------------------------------- + -- SDRAM command & address + -- + -- These registers should be placed in the I/O blocks. + -- Use appriopate timing constraints. + ----------------------------------------------------------------------------- - process (clk) - begin -- process - if rising_edge(clk) then - if rst = '1' then - sd_cke_r <= '0'; - sd_cs_r <= '1'; -- Deselect - else - sd_cke_r <= sd_cke_nxt; - sd_cs_r <= sd_cs_nxt; - end if; + process (clk) + begin -- process + if rising_edge(clk) then + if rst = '1' then + sd_cke_r <= '0'; + sd_cs_r <= '1'; -- Deselect + else + sd_cke_r <= sd_cke_nxt; + sd_cs_r <= sd_cs_nxt; + end if; - sd_ras_r <= sd_ras_nxt; - sd_cas_r <= sd_cas_nxt; - sd_we_r <= sd_we_nxt; - sd_ba_r <= sd_ba_nxt; - sd_a_r <= sd_a_nxt; - end if; - end process; + sd_ras_r <= sd_ras_nxt; + sd_cas_r <= sd_cas_nxt; + sd_we_r <= sd_we_nxt; + sd_ba_r <= sd_ba_nxt; + sd_a_r <= sd_a_nxt; + end if; + end process; - sd_cke <= sd_cke_r; - sd_cs <= sd_cs_r; - sd_ras <= sd_ras_r; - sd_cas <= sd_cas_r; - sd_we <= sd_we_r; - sd_ba <= sd_ba_r; - sd_a <= sd_a_r; + sd_cke <= sd_cke_r; + sd_cs <= sd_cs_r; + sd_ras <= sd_ras_r; + sd_cas <= sd_cas_r; + sd_we <= sd_we_r; + sd_ba <= sd_ba_r; + sd_a <= sd_a_r; - ----------------------------------------------------------------------------- - -- Write data - -- - -- These registers should be placed in the I/O blocks. - -- Use appriopate timing constraints. - ----------------------------------------------------------------------------- + ----------------------------------------------------------------------------- + -- Write data + -- + -- These registers should be placed in the I/O blocks. + -- Use appriopate timing constraints. + ----------------------------------------------------------------------------- - process (clk) - begin -- process - if rising_edge(clk) then - -- prevent unnecessary toggling - if wren_nxt = '1' then - dq_o_r <= wdata_nxt; - end if; + process (clk) + begin -- process + if rising_edge(clk) then + -- prevent unnecessary toggling + if wren_nxt = '1' then + dq_o_r <= wdata_nxt; + end if; - if rst = '1' then - dq_en_r <= (others => '0'); - else - dq_en_r <= (others => wren_nxt); - end if; - end if; - end process; + if rst = '1' then + dq_en_r <= (others => '0'); + else + dq_en_r <= (others => wren_nxt); + end if; + end if; + end process; - ----------------------------------------------------------------------------- - -- DQ I/O Buffers - ----------------------------------------------------------------------------- + ----------------------------------------------------------------------------- + -- DQ I/O Buffers + ----------------------------------------------------------------------------- -- Explicit instantiation of I/O buffers. May be required if entity is part -- of a netlist, which is used in another design. -- If altiobuf_bidir is used instead, then meaningless warnings are issued by -- Quartus. - dq_obuf : altiobuf_out generic map ( - NUMBER_OF_CHANNELS => 16, USE_OE => "TRUE") - port map ( - datain => dq_o_r, - oe => dq_en_r, - dataout => sd_dq); + dq_obuf : altiobuf_out generic map ( + NUMBER_OF_CHANNELS => 16, USE_OE => "TRUE") + port map ( + datain => dq_o_r, + oe => dq_en_r, + dataout => sd_dq); - dq_ibuf : altiobuf_in generic map ( - NUMBER_OF_CHANNELS => 16) - port map ( - datain => sd_dq, - dataout => dq_i); + dq_ibuf : altiobuf_in generic map ( + NUMBER_OF_CHANNELS => 16) + port map ( + datain => sd_dq, + dataout => dq_i); - ----------------------------------------------------------------------------- - -- Read data capture - ----------------------------------------------------------------------------- + ----------------------------------------------------------------------------- + -- Read data capture + ----------------------------------------------------------------------------- - process (clk) - begin -- process - if rising_edge(clk) then - -- Read enable pipeline - if rst = '1' then - rden_r <= (others => '0'); - rstb_r <= '0'; - else - rden_r <= rden_r(rden_r'left-1 downto 0) & rden_nxt; - rstb_r <= rden_r(rden_r'left); -- aligned with rdata_r - end if; + process (clk) + begin -- process + if rising_edge(clk) then + -- Read enable pipeline + if rst = '1' then + rden_r <= (others => '0'); + rstb_r <= '0'; + else + rden_r <= rden_r(rden_r'left-1 downto 0) & rden_nxt; + rstb_r <= rden_r(rden_r'left); -- aligned with rdata_r + end if; - -- Data capture - if rden_r(rden_r'left) = '1' then - rdata_r <= dq_i; - end if; - end if; - end process; + -- Data capture + if rden_r(rden_r'left) = '1' then + rdata_r <= dq_i; + end if; + end if; + end process; - rdata <= rdata_r; - rstb <= rstb_r; + rdata <= rdata_r; + rstb <= rstb_r; end rtl; diff --git a/src/mem/sdram/sdram_ctrl_phy_s3esk.vhdl b/src/mem/sdram/sdram_ctrl_phy_s3esk.vhdl index 620d3fb44..c37b5bd71 100644 --- a/src/mem/sdram/sdram_ctrl_phy_s3esk.vhdl +++ b/src/mem/sdram/sdram_ctrl_phy_s3esk.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Entity: Physical layer of SDRAM-Controller for Spartan-3E Starter Kit +-- Entity: Physical layer of SDRAM-Controller for Spartan-3E Starter Kit -- -- Description: -- ------------------------------------- @@ -80,13 +80,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -95,224 +95,224 @@ -- limitations under the License. -- ============================================================================= -- -library ieee; -use ieee.std_logic_1164.all; +library IEEE; +use IEEE.std_logic_1164.all; library unisim; -use unisim.VComponents.all; +use unisim.VComponents.all; entity sdram_ctrl_phy_s3esk is - port ( - clk : in std_logic; - clk_n : in std_logic; - clk90 : in std_logic; - clk90_n : in std_logic; - rst : in std_logic; - rst90 : in std_logic; - rst180 : in std_logic; - rst270 : in std_logic; - - clk_fb90 : in std_logic; - clk_fb90_n : in std_logic; - rst_fb90 : in std_logic; - rst_fb270 : in std_logic; - - sd_cke_nxt : in std_logic; - sd_cs_nxt : in std_logic; - sd_ras_nxt : in std_logic; - sd_cas_nxt : in std_logic; - sd_we_nxt : in std_logic; - sd_ba_nxt : in std_logic_vector(1 downto 0); - sd_a_nxt : in std_logic_vector(12 downto 0); - - wren_nxt : in std_logic; - wdata_nxt : in std_logic_vector(31 downto 0); - - rden_nxt : in std_logic; - rdata : out std_logic_vector(31 downto 0); - rstb : out std_logic; - - sd_ck_p : out std_logic; - sd_ck_n : out std_logic; - sd_cke : out std_logic; - sd_cs : out std_logic; - sd_ras : out std_logic; - sd_cas : out std_logic; - sd_we : out std_logic; - sd_ba : out std_logic_vector(1 downto 0); - sd_a : out std_logic_vector(12 downto 0); - sd_ldqs : out std_logic; - sd_udqs : out std_logic; - sd_dq : inout std_logic_vector(15 downto 0)); + port ( + clk : in std_logic; + clk_n : in std_logic; + clk90 : in std_logic; + clk90_n : in std_logic; + rst : in std_logic; + rst90 : in std_logic; + rst180 : in std_logic; + rst270 : in std_logic; + + clk_fb90 : in std_logic; + clk_fb90_n : in std_logic; + rst_fb90 : in std_logic; + rst_fb270 : in std_logic; + + sd_cke_nxt : in std_logic; + sd_cs_nxt : in std_logic; + sd_ras_nxt : in std_logic; + sd_cas_nxt : in std_logic; + sd_we_nxt : in std_logic; + sd_ba_nxt : in std_logic_vector(1 downto 0); + sd_a_nxt : in std_logic_vector(12 downto 0); + + wren_nxt : in std_logic; + wdata_nxt : in std_logic_vector(31 downto 0); + + rden_nxt : in std_logic; + rdata : out std_logic_vector(31 downto 0); + rstb : out std_logic; + + sd_ck_p : out std_logic; + sd_ck_n : out std_logic; + sd_cke : out std_logic; + sd_cs : out std_logic; + sd_ras : out std_logic; + sd_cas : out std_logic; + sd_we : out std_logic; + sd_ba : out std_logic_vector(1 downto 0); + sd_a : out std_logic_vector(12 downto 0); + sd_ldqs : out std_logic; + sd_udqs : out std_logic; + sd_dq : inout std_logic_vector(15 downto 0)); end sdram_ctrl_phy_s3esk; architecture rtl of sdram_ctrl_phy_s3esk is - -- memory command: domain clk - signal sd_cke_r : std_logic := '0'; - signal sd_cs_r : std_logic := '1'; - signal sd_ras_r : std_logic; - signal sd_cas_r : std_logic; - signal sd_we_r : std_logic; - signal sd_ba_r : std_logic_vector(1 downto 0); - signal sd_a_r : std_logic_vector(12 downto 0); - - -- control / data signals for write - signal wren_r_n : std_logic := '1'; - - signal dqs_en0_nxt_n : std_logic; - signal dqs_en0_r_n : std_logic_vector(1 downto 0) := (others => '1'); - signal dqs_en1_r_n : std_logic_vector(1 downto 0); -- inited below - signal dqs_o_r : std_logic_vector(1 downto 0); - - signal dq_en0_n : std_logic; - signal dq_en1_r_n : std_logic_vector(15 downto 0); -- inited below - signal dq_o_r : std_logic_vector(15 downto 0); - signal dq_i : std_logic_vector(15 downto 0); - - signal wdata_r : std_logic_vector(31 downto 0); - signal wdata_fal_r : std_logic_vector(15 downto 0); - - -- control / data signals for read - signal rden_r : std_logic := '0'; - signal rden1_r : std_logic := '0'; - signal rden2_r : std_logic := '0'; - signal rden3_r : std_logic := '0'; - signal rstb_r : std_logic := '0'; - - signal rdata_ris_r : std_logic_vector(15 downto 0); - signal rdata_r : std_logic_vector(31 downto 0); - - attribute keep : string; - attribute keep of rden1_r : signal is "true"; + -- memory command: domain clk + signal sd_cke_r : std_logic := '0'; + signal sd_cs_r : std_logic := '1'; + signal sd_ras_r : std_logic; + signal sd_cas_r : std_logic; + signal sd_we_r : std_logic; + signal sd_ba_r : std_logic_vector(1 downto 0); + signal sd_a_r : std_logic_vector(12 downto 0); + + -- control / data signals for write + signal wren_r_n : std_logic := '1'; + + signal dqs_en0_nxt_n : std_logic; + signal dqs_en0_r_n : std_logic_vector(1 downto 0) := (others => '1'); + signal dqs_en1_r_n : std_logic_vector(1 downto 0); -- inited below + signal dqs_o_r : std_logic_vector(1 downto 0); + + signal dq_en0_n : std_logic; + signal dq_en1_r_n : std_logic_vector(15 downto 0); -- inited below + signal dq_o_r : std_logic_vector(15 downto 0); + signal dq_i : std_logic_vector(15 downto 0); + + signal wdata_r : std_logic_vector(31 downto 0); + signal wdata_fal_r : std_logic_vector(15 downto 0); + + -- control / data signals for read + signal rden_r : std_logic := '0'; + signal rden1_r : std_logic := '0'; + signal rden2_r : std_logic := '0'; + signal rden3_r : std_logic := '0'; + signal rstb_r : std_logic := '0'; + + signal rdata_ris_r : std_logic_vector(15 downto 0); + signal rdata_r : std_logic_vector(31 downto 0); + + attribute keep : string; + attribute keep of rden1_r : signal is "true"; begin -- rtl - ----------------------------------------------------------------------------- - -- SDRAM clock generation - -- - -- DO NOT RESET THESE! Reset is hold until clk_fb gets stable which is driven - -- externally by sd_ck_p. - ----------------------------------------------------------------------------- - - sd_ck_p_off : ODDR2 - generic map ( - INIT => '0', - SRTYPE => "SYNC") - port map ( - C0 => clk90, - C1 => clk90_n, - CE => '1', - D0 => '1', - D1 => '0', - Q => sd_ck_p, - R => '0', - S => '0'); - - sd_ck_n_off : ODDR2 - generic map ( - INIT => '1', - SRTYPE => "SYNC") - port map ( - C0 => clk90, - C1 => clk90_n, - CE => '1', - D0 => '0', - D1 => '1', - Q => sd_ck_n, - R => '0', - S => '0'); - - ----------------------------------------------------------------------------- - -- SDRAM command & address - ----------------------------------------------------------------------------- - - process (clk) - begin -- process - if rising_edge(clk) then - if rst = '1' then - sd_cke_r <= '0'; - sd_cs_r <= '1'; -- Deselect - else - sd_cke_r <= sd_cke_nxt; - sd_cs_r <= sd_cs_nxt; - end if; - - sd_ras_r <= sd_ras_nxt; - sd_cas_r <= sd_cas_nxt; - sd_we_r <= sd_we_nxt; - sd_ba_r <= sd_ba_nxt; - sd_a_r <= sd_a_nxt; - end if; - end process; - - sd_cke <= sd_cke_r; - sd_cs <= sd_cs_r; - sd_ras <= sd_ras_r; - sd_cas <= sd_cas_r; - sd_we <= sd_we_r; - sd_ba <= sd_ba_r; - sd_a <= sd_a_r; - - ----------------------------------------------------------------------------- - -- Write data - ----------------------------------------------------------------------------- - -- - -- Write Enable, DQS Enable, DQ Enable - -- NOTE: Do not optimize too much, otherwise timing constraints can't be met. - -- - dqs_en0_nxt_n <= not (wren_nxt or (not wren_r_n)); - - process (clk) - begin -- process - if rising_edge(clk) then - if rst = '1' then - wren_r_n <= '1'; - dqs_en0_r_n <= (others => '1'); - else - wren_r_n <= not wren_nxt; - dqs_en0_r_n <= (others => dqs_en0_nxt_n); - end if; - end if; - end process; - - dq_en0_n <= wren_r_n; - - -- - -- DQS output - -- NOTE: clock domain change. Timing is critical because destination clock - -- is only 90 degrees after source clock. - -- - - dqs_out : for i in 0 to 1 generate - -- Both "tff" and "off" must be placed in the IOB. Thus, due to placement - -- constraints, the "off" must be reset with rst90. - - tff : FDRSE - generic map ( - INIT => '1') -- disable output - port map ( - Q => dqs_en1_r_n(i), - C => clk90, - CE => '1', - D => dqs_en0_r_n(i), - R => '0', - S => rst90); -- disable output - - off : ODDR2 - generic map ( - SRTYPE => "SYNC") - port map ( - Q => dqs_o_r(i), - C0 => clk90, - C1 => clk90_n, - CE => '1', - D0 => '1', -- same as sd_ck_p - D1 => '0', -- dito - R => rst90, -- only due to placement constraints - S => '0'); - - end generate; + ----------------------------------------------------------------------------- + -- SDRAM clock generation + -- + -- DO NOT RESET THESE! Reset is hold until clk_fb gets stable which is driven + -- externally by sd_ck_p. + ----------------------------------------------------------------------------- + + sd_ck_p_off : ODDR2 + generic map ( + INIT => '0', + SRTYPE => "SYNC") + port map ( + C0 => clk90, + C1 => clk90_n, + CE => '1', + D0 => '1', + D1 => '0', + Q => sd_ck_p, + R => '0', + S => '0'); + + sd_ck_n_off : ODDR2 + generic map ( + INIT => '1', + SRTYPE => "SYNC") + port map ( + C0 => clk90, + C1 => clk90_n, + CE => '1', + D0 => '0', + D1 => '1', + Q => sd_ck_n, + R => '0', + S => '0'); + + ----------------------------------------------------------------------------- + -- SDRAM command & address + ----------------------------------------------------------------------------- + + process (clk) + begin -- process + if rising_edge(clk) then + if rst = '1' then + sd_cke_r <= '0'; + sd_cs_r <= '1'; -- Deselect + else + sd_cke_r <= sd_cke_nxt; + sd_cs_r <= sd_cs_nxt; + end if; + + sd_ras_r <= sd_ras_nxt; + sd_cas_r <= sd_cas_nxt; + sd_we_r <= sd_we_nxt; + sd_ba_r <= sd_ba_nxt; + sd_a_r <= sd_a_nxt; + end if; + end process; + + sd_cke <= sd_cke_r; + sd_cs <= sd_cs_r; + sd_ras <= sd_ras_r; + sd_cas <= sd_cas_r; + sd_we <= sd_we_r; + sd_ba <= sd_ba_r; + sd_a <= sd_a_r; + + ----------------------------------------------------------------------------- + -- Write data + ----------------------------------------------------------------------------- + -- + -- Write Enable, DQS Enable, DQ Enable + -- NOTE: Do not optimize too much, otherwise timing constraints can't be met. + -- + dqs_en0_nxt_n <= not (wren_nxt or (not wren_r_n)); + + process (clk) + begin -- process + if rising_edge(clk) then + if rst = '1' then + wren_r_n <= '1'; + dqs_en0_r_n <= (others => '1'); + else + wren_r_n <= not wren_nxt; + dqs_en0_r_n <= (others => dqs_en0_nxt_n); + end if; + end if; + end process; + + dq_en0_n <= wren_r_n; + + -- + -- DQS output + -- NOTE: clock domain change. Timing is critical because destination clock + -- is only 90 degrees after source clock. + -- + + dqs_out : for i in 0 to 1 generate + -- Both "tff" and "off" must be placed in the IOB. Thus, due to placement + -- constraints, the "off" must be reset with rst90. + + tff : FDRSE + generic map ( + INIT => '1') -- disable output + port map ( + Q => dqs_en1_r_n(i), + C => clk90, + CE => '1', + D => dqs_en0_r_n(i), + R => '0', + S => rst90); -- disable output + + off : ODDR2 + generic map ( + SRTYPE => "SYNC") + port map ( + Q => dqs_o_r(i), + C0 => clk90, + C1 => clk90_n, + CE => '1', + D0 => '1', -- same as sd_ck_p + D1 => '0', -- dito + R => rst90, -- only due to placement constraints + S => '0'); + + end generate; -- Explicit instantiation of I/O buffers. Required if entity is part of a -- netlist, which is used in another design. @@ -328,61 +328,61 @@ begin -- rtl T => dqs_en1_r_n(1), O => sd_udqs); - -- - -- Write Data - -- - process (clk) - begin -- process - if rising_edge(clk) then - -- prevent unnecessary toggling - if wren_nxt = '1' then - wdata_r <= wdata_nxt; - end if; - end if; - end process; - - process (clk_n) - begin -- process - if rising_edge(clk_n) then - wdata_fal_r <= wdata_r(31 downto 16); - end if; - end process; - - dq_out: for i in 0 to 15 generate - -- A reset can't be applied to the "tff" because then it must also be - -- applied to the "iff" which is driven be another clock domain. - -- (Applying reset to "off" is not a problem.) - -- Thus, the "tff" is reset only due to reset of dq_en0_n. - - tff : FDRSE - generic map ( - INIT => '1') -- disable output - port map ( - Q => dq_en1_r_n(i), - C => clk, - CE => '1', - D => dq_en0_n, - R => '0', - S => '0'); - - off : ODDR2 - generic map ( - SRTYPE => "SYNC") - port map ( - Q => dq_o_r(i), - C0 => clk, - C1 => clk_n, - CE => '1', - D0 => wdata_r(i), -- for rising_edge(dqs) - D1 => wdata_fal_r(i), -- for falling_edge(dqs) - R => '0', - S => '0'); - - end generate; - - ----------------------------------------------------------------------------- - -- DQ I/O Buffers - ----------------------------------------------------------------------------- + -- + -- Write Data + -- + process (clk) + begin -- process + if rising_edge(clk) then + -- prevent unnecessary toggling + if wren_nxt = '1' then + wdata_r <= wdata_nxt; + end if; + end if; + end process; + + process (clk_n) + begin -- process + if rising_edge(clk_n) then + wdata_fal_r <= wdata_r(31 downto 16); + end if; + end process; + + dq_out: for i in 0 to 15 generate + -- A reset can't be applied to the "tff" because then it must also be + -- applied to the "iff" which is driven be another clock domain. + -- (Applying reset to "off" is not a problem.) + -- Thus, the "tff" is reset only due to reset of dq_en0_n. + + tff : FDRSE + generic map ( + INIT => '1') -- disable output + port map ( + Q => dq_en1_r_n(i), + C => clk, + CE => '1', + D => dq_en0_n, + R => '0', + S => '0'); + + off : ODDR2 + generic map ( + SRTYPE => "SYNC") + port map ( + Q => dq_o_r(i), + C0 => clk, + C1 => clk_n, + CE => '1', + D0 => wdata_r(i), -- for rising_edge(dqs) + D1 => wdata_fal_r(i), -- for falling_edge(dqs) + R => '0', + S => '0'); + + end generate; + + ----------------------------------------------------------------------------- + -- DQ I/O Buffers + ----------------------------------------------------------------------------- -- Explicit instantiation of I/O buffers. Required if entity is part of a -- netlist, which is used in another design. @@ -395,85 +395,85 @@ begin -- rtl O => dq_i(i)); end generate; - ----------------------------------------------------------------------------- - -- Read data capture - ----------------------------------------------------------------------------- - -- Register read enable - -- rden1_r is a separate signal for simple identification in constraints. - -- This signal must be kept. - process (clk) - begin -- process - if rising_edge(clk) then - if rst = '1' then - rden_r <= '0'; - rden1_r <= '0'; - else - rden_r <= rden_nxt; - rden1_r <= rden_r; - end if; - end if; - end process; - - -- Register read enable with clk_fb90_n which equals sd_ck_p + 270 degrees - -- delayed by external feedback. - -- NOTE: Timing constraints must ensure, that read enable is captured with - -- the rising edge of clk_fb90_n directly following rising edge of clk. - process (clk_fb90_n) - begin -- process - if rising_edge(clk_fb90_n) then - if rst_fb270 = '1' then - rden2_r <= '0'; - else - rden2_r <= rden1_r; - end if; - end if; - end process; - - -- Delay once more - -- If timing is critical, then rden3_r should be duplicated before it used as - -- clock enable for input FFs. - process (clk_fb90_n) - begin - if rising_edge(clk_fb90_n) then - if rst_fb270 = '1' then - rden3_r <= '0'; - else - rden3_r <= rden2_r; - end if; - end if; - end process; - - dq_in : for i in 0 to 15 generate - iff : IDDR2 - generic map ( - SRTYPE => "SYNC") - port map ( - D => dq_i(i), - C0 => clk_fb90, - C1 => clk_fb90_n, - CE => rden3_r, - Q0 => rdata_ris_r(i), - Q1 => rdata_r(16+i), - R => '0', - S => '0'); - end generate; - - process (clk_fb90_n) - begin -- process - if rising_edge(clk_fb90_n) then - -- align both parts of data word - rdata_r(15 downto 0) <= rdata_ris_r; - - -- align strobe with data - if rst_fb270 = '1' then - rstb_r <= '0'; - else - rstb_r <= rden3_r; - end if; - end if; - end process; - - rdata <= rdata_r; - rstb <= rstb_r; + ----------------------------------------------------------------------------- + -- Read data capture + ----------------------------------------------------------------------------- + -- Register read enable + -- rden1_r is a separate signal for simple identification in constraints. + -- This signal must be kept. + process (clk) + begin -- process + if rising_edge(clk) then + if rst = '1' then + rden_r <= '0'; + rden1_r <= '0'; + else + rden_r <= rden_nxt; + rden1_r <= rden_r; + end if; + end if; + end process; + + -- Register read enable with clk_fb90_n which equals sd_ck_p + 270 degrees + -- delayed by external feedback. + -- NOTE: Timing constraints must ensure, that read enable is captured with + -- the rising edge of clk_fb90_n directly following rising edge of clk. + process (clk_fb90_n) + begin -- process + if rising_edge(clk_fb90_n) then + if rst_fb270 = '1' then + rden2_r <= '0'; + else + rden2_r <= rden1_r; + end if; + end if; + end process; + + -- Delay once more + -- If timing is critical, then rden3_r should be duplicated before it used as + -- clock enable for input FFs. + process (clk_fb90_n) + begin + if rising_edge(clk_fb90_n) then + if rst_fb270 = '1' then + rden3_r <= '0'; + else + rden3_r <= rden2_r; + end if; + end if; + end process; + + dq_in : for i in 0 to 15 generate + iff : IDDR2 + generic map ( + SRTYPE => "SYNC") + port map ( + D => dq_i(i), + C0 => clk_fb90, + C1 => clk_fb90_n, + CE => rden3_r, + Q0 => rdata_ris_r(i), + Q1 => rdata_r(16+i), + R => '0', + S => '0'); + end generate; + + process (clk_fb90_n) + begin -- process + if rising_edge(clk_fb90_n) then + -- align both parts of data word + rdata_r(15 downto 0) <= rdata_ris_r; + + -- align strobe with data + if rst_fb270 = '1' then + rstb_r <= '0'; + else + rstb_r <= rden3_r; + end if; + end if; + end process; + + rdata <= rdata_r; + rstb <= rstb_r; end rtl; diff --git a/src/mem/sdram/sdram_ctrl_s3esk.vhdl b/src/mem/sdram/sdram_ctrl_s3esk.vhdl index 1d49b6189..82caf165b 100644 --- a/src/mem/sdram/sdram_ctrl_s3esk.vhdl +++ b/src/mem/sdram/sdram_ctrl_s3esk.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Entity: Controller for Micron DDR-SDRAM on Spartan-3E Starter Kit Board. +-- Entity: Controller for Micron DDR-SDRAM on Spartan-3E Starter Kit Board. -- -- Description: -- ------------------------------------- @@ -41,13 +41,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -56,172 +56,172 @@ -- limitations under the License. -- ============================================================================= -- -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; -use ieee.math_real.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use IEEE.math_real.all; entity sdram_ctrl_s3esk is - generic ( - CLK_PERIOD : real; - BL : positive); + generic ( + CLK_PERIOD : real; + BL : positive); - port ( - clk : in std_logic; - clk_n : in std_logic; - clk90 : in std_logic; - clk90_n : in std_logic; - rst : in std_logic; - rst90 : in std_logic; - rst180 : in std_logic; - rst270 : in std_logic; - clk_fb90 : in std_logic; - clk_fb90_n : in std_logic; - rst_fb90 : in std_logic; - rst_fb270 : in std_logic; + port ( + clk : in std_logic; + clk_n : in std_logic; + clk90 : in std_logic; + clk90_n : in std_logic; + rst : in std_logic; + rst90 : in std_logic; + rst180 : in std_logic; + rst270 : in std_logic; + clk_fb90 : in std_logic; + clk_fb90_n : in std_logic; + rst_fb90 : in std_logic; + rst_fb270 : in std_logic; - user_cmd_valid : in std_logic; - user_wdata_valid : in std_logic; - user_write : in std_logic; - user_addr : in std_logic_vector(24 downto 0); - user_wdata : in std_logic_vector(31 downto 0); - user_got_cmd : out std_logic; - user_got_wdata : out std_logic; - user_rdata : out std_logic_vector(31 downto 0); - user_rstb : out std_logic; + user_cmd_valid : in std_logic; + user_wdata_valid : in std_logic; + user_write : in std_logic; + user_addr : in std_logic_vector(24 downto 0); + user_wdata : in std_logic_vector(31 downto 0); + user_got_cmd : out std_logic; + user_got_wdata : out std_logic; + user_rdata : out std_logic_vector(31 downto 0); + user_rstb : out std_logic; - sd_ck_p : out std_logic; - sd_ck_n : out std_logic; - sd_cke : out std_logic; - sd_cs : out std_logic; - sd_ras : out std_logic; - sd_cas : out std_logic; - sd_we : out std_logic; - sd_ba : out std_logic_vector(1 downto 0); - sd_a : out std_logic_vector(12 downto 0); - sd_ldqs : out std_logic; - sd_udqs : out std_logic; - sd_dq : inout std_logic_vector(15 downto 0)); + sd_ck_p : out std_logic; + sd_ck_n : out std_logic; + sd_cke : out std_logic; + sd_cs : out std_logic; + sd_ras : out std_logic; + sd_cas : out std_logic; + sd_we : out std_logic; + sd_ba : out std_logic_vector(1 downto 0); + sd_a : out std_logic_vector(12 downto 0); + sd_ldqs : out std_logic; + sd_udqs : out std_logic; + sd_dq : inout std_logic_vector(15 downto 0)); end sdram_ctrl_s3esk; architecture rtl of sdram_ctrl_s3esk is - -- - -- Configuration - -- - constant A_BITS : positive := 25; -- 32M - constant D_BITS : positive := 16; -- x16 - constant R_BITS : positive := 13; -- 8192 rows - constant C_BITS : positive := 10; -- 1024 columns - constant B_BITS : positive := 2; -- 4 banks - constant CL : positive := 2; -- CAS latency (req. by PHY) + -- + -- Configuration + -- + constant A_BITS : positive := 25; -- 32M + constant D_BITS : positive := 16; -- x16 + constant R_BITS : positive := 13; -- 8192 rows + constant C_BITS : positive := 10; -- 1024 columns + constant B_BITS : positive := 2; -- 4 banks + constant CL : positive := 2; -- CAS latency (req. by PHY) - -- Divide timings from datasheet by clock period. - -- SDRAM device: MT46V32M16-6T - constant T_MRD : integer := integer(ceil(12.0/CLK_PERIOD)); - constant T_RAS : integer := integer(ceil(42.0/CLK_PERIOD)); - constant T_RCD : integer := integer(ceil(15.0/CLK_PERIOD)); - constant T_RFC : integer := integer(ceil(72.0/CLK_PERIOD)); - constant T_RP : integer := integer(ceil(15.0/CLK_PERIOD)); - constant T_WR : integer := integer(ceil(15.0/CLK_PERIOD)); - constant T_WTR : integer := 1; - constant T_REFI : integer := integer(ceil((7800.0)/CLK_PERIOD))-50; - constant INIT_WAIT : integer := integer(ceil(200000.0/ -- 200 us - (real(T_REFI)*CLK_PERIOD))); + -- Divide timings from datasheet by clock period. + -- SDRAM device: MT46V32M16-6T + constant T_MRD : integer := integer(ceil(12.0/CLK_PERIOD)); + constant T_RAS : integer := integer(ceil(42.0/CLK_PERIOD)); + constant T_RCD : integer := integer(ceil(15.0/CLK_PERIOD)); + constant T_RFC : integer := integer(ceil(72.0/CLK_PERIOD)); + constant T_RP : integer := integer(ceil(15.0/CLK_PERIOD)); + constant T_WR : integer := integer(ceil(15.0/CLK_PERIOD)); + constant T_WTR : integer := 1; + constant T_REFI : integer := integer(ceil((7800.0)/CLK_PERIOD))-50; + constant INIT_WAIT : integer := integer(ceil(200000.0/ -- 200 us + (real(T_REFI)*CLK_PERIOD))); - -- - -- Signals - -- - signal sd_cke_nxt : std_logic; - signal sd_cs_nxt : std_logic; - signal sd_ras_nxt : std_logic; - signal sd_cas_nxt : std_logic; - signal sd_we_nxt : std_logic; - signal sd_a_nxt : std_logic_vector(12 downto 0); - signal sd_ba_nxt : std_logic_vector(1 downto 0); - signal rden_nxt : std_logic; - signal wren_nxt : std_logic; + -- + -- Signals + -- + signal sd_cke_nxt : std_logic; + signal sd_cs_nxt : std_logic; + signal sd_ras_nxt : std_logic; + signal sd_cas_nxt : std_logic; + signal sd_we_nxt : std_logic; + signal sd_a_nxt : std_logic_vector(12 downto 0); + signal sd_ba_nxt : std_logic_vector(1 downto 0); + signal rden_nxt : std_logic; + signal wren_nxt : std_logic; begin -- rtl - fsm: entity work.sdram_ctrl_fsm - generic map ( - SDRAM_TYPE => 1, -- DDR-SDRAM - A_BITS => A_BITS, - D_BITS => D_BITS, - R_BITS => R_BITS, - C_BITS => C_BITS, - B_BITS => B_BITS, - CL => CL, - BL => BL, - T_MRD => T_MRD, - T_RAS => T_RAS, - T_RCD => T_RCD, - T_RFC => T_RFC, - T_RP => T_RP, - T_WR => T_WR, - T_WTR => T_WTR, - T_REFI => T_REFI, - INIT_WAIT => INIT_WAIT) - port map ( - clk => clk, - rst => rst, - user_cmd_valid => user_cmd_valid, - user_wdata_valid => user_wdata_valid, - user_write => user_write, - user_addr => user_addr, - user_got_cmd => user_got_cmd, - user_got_wdata => user_got_wdata, - sd_cke_nxt => sd_cke_nxt, - sd_cs_nxt => sd_cs_nxt, - sd_ras_nxt => sd_ras_nxt, - sd_cas_nxt => sd_cas_nxt, - sd_we_nxt => sd_we_nxt, - sd_a_nxt => sd_a_nxt, - sd_ba_nxt => sd_ba_nxt, - rden_nxt => rden_nxt, - wren_nxt => wren_nxt); + fsm: entity work.sdram_ctrl_fsm + generic map ( + SDRAM_TYPE => 1, -- DDR-SDRAM + A_BITS => A_BITS, + D_BITS => D_BITS, + R_BITS => R_BITS, + C_BITS => C_BITS, + B_BITS => B_BITS, + CL => CL, + BL => BL, + T_MRD => T_MRD, + T_RAS => T_RAS, + T_RCD => T_RCD, + T_RFC => T_RFC, + T_RP => T_RP, + T_WR => T_WR, + T_WTR => T_WTR, + T_REFI => T_REFI, + INIT_WAIT => INIT_WAIT) + port map ( + clk => clk, + rst => rst, + user_cmd_valid => user_cmd_valid, + user_wdata_valid => user_wdata_valid, + user_write => user_write, + user_addr => user_addr, + user_got_cmd => user_got_cmd, + user_got_wdata => user_got_wdata, + sd_cke_nxt => sd_cke_nxt, + sd_cs_nxt => sd_cs_nxt, + sd_ras_nxt => sd_ras_nxt, + sd_cas_nxt => sd_cas_nxt, + sd_we_nxt => sd_we_nxt, + sd_a_nxt => sd_a_nxt, + sd_ba_nxt => sd_ba_nxt, + rden_nxt => rden_nxt, + wren_nxt => wren_nxt); - phy: entity work.sdram_ctrl_phy_s3esk - port map ( - clk => clk, - clk_n => clk_n, - clk90 => clk90, - clk90_n => clk90_n, - rst => rst, - rst90 => rst90, - rst180 => rst180, - rst270 => rst270, - clk_fb90 => clk_fb90, - clk_fb90_n => clk_fb90_n, - rst_fb90 => rst_fb90, - rst_fb270 => rst_fb270, - sd_cke_nxt => sd_cke_nxt, - sd_cs_nxt => sd_cs_nxt, - sd_ras_nxt => sd_ras_nxt, - sd_cas_nxt => sd_cas_nxt, - sd_we_nxt => sd_we_nxt, - sd_ba_nxt => sd_ba_nxt, - sd_a_nxt => sd_a_nxt, - wren_nxt => wren_nxt, - wdata_nxt => user_wdata, - rden_nxt => rden_nxt, - rdata => user_rdata, - rstb => user_rstb, - sd_ck_p => sd_ck_p, - sd_ck_n => sd_ck_n, - sd_cke => sd_cke, - sd_cs => sd_cs, - sd_ras => sd_ras, - sd_cas => sd_cas, - sd_we => sd_we, - sd_ba => sd_ba, - sd_a => sd_a, - sd_ldqs => sd_ldqs, - sd_udqs => sd_udqs, - sd_dq => sd_dq); + phy: entity work.sdram_ctrl_phy_s3esk + port map ( + clk => clk, + clk_n => clk_n, + clk90 => clk90, + clk90_n => clk90_n, + rst => rst, + rst90 => rst90, + rst180 => rst180, + rst270 => rst270, + clk_fb90 => clk_fb90, + clk_fb90_n => clk_fb90_n, + rst_fb90 => rst_fb90, + rst_fb270 => rst_fb270, + sd_cke_nxt => sd_cke_nxt, + sd_cs_nxt => sd_cs_nxt, + sd_ras_nxt => sd_ras_nxt, + sd_cas_nxt => sd_cas_nxt, + sd_we_nxt => sd_we_nxt, + sd_ba_nxt => sd_ba_nxt, + sd_a_nxt => sd_a_nxt, + wren_nxt => wren_nxt, + wdata_nxt => user_wdata, + rden_nxt => rden_nxt, + rdata => user_rdata, + rstb => user_rstb, + sd_ck_p => sd_ck_p, + sd_ck_n => sd_ck_n, + sd_cke => sd_cke, + sd_cs => sd_cs, + sd_ras => sd_ras, + sd_cas => sd_cas, + sd_we => sd_we, + sd_ba => sd_ba, + sd_a => sd_a, + sd_ldqs => sd_ldqs, + sd_udqs => sd_udqs, + sd_dq => sd_dq); end rtl; diff --git a/src/misc/misc.pro b/src/misc/build.pro similarity index 94% rename from src/misc/misc.pro rename to src/misc/build.pro index d51ad9dcf..340f6b57f 100644 --- a/src/misc/misc.pro +++ b/src/misc/build.pro @@ -35,7 +35,7 @@ analyze ./clock/clock_Counter.vhdl analyze ./clock/clock_Timer.vhdl analyze ./clock/clock_HighResolution.vhdl -include ./filter/filter.pro -include ./stat/stat.pro +include ./filter +include ./stat -include ./gearbox/gearbox.pro +include ./gearbox diff --git a/src/misc/clock/clock.pkg.vhdl b/src/misc/clock/clock.pkg.vhdl index 98e36ac40..80d8968ba 100644 --- a/src/misc/clock/clock.pkg.vhdl +++ b/src/misc/clock/clock.pkg.vhdl @@ -16,7 +16,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,8 +29,8 @@ library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; -use work.physical.all; -use work.utils.all; +use work.physical.all; +use work.utils.all; package clock is @@ -42,7 +42,7 @@ package clock is type T_SECOND_RESOLUTION is (NANOSECONDS, MICROSECONDS, MILLISECONDS); attribute Count of T_SECOND_RESOLUTION : type is T_SECOND_RESOLUTION'pos(T_SECOND_RESOLUTION'high) + 1; -- to find the num of registers available - attribute Bits of T_SECOND_RESOLUTION : type is log2ceil(T_SECOND_RESOLUTION'Count); -- no of bits required to represent the num of registers constant RESOLUTION_TIMES : T_TIME_VEC(0 to 2) := (1.0e-9, 1.0e-6, 1.0e-3); + attribute Bits of T_SECOND_RESOLUTION : type is log2ceil(T_SECOND_RESOLUTION'Count); -- no of bits required to represent the num of registers constant RESOLUTION_TIMES : T_TIME_VEC(0 to 2) := (1.0e-9, 1.0e-6, 1.0e-3); function to_enum(value : std_logic_vector) return T_SECOND_RESOLUTION; function to_timebase(resolution : T_SECOND_RESOLUTION) return T_TIME; diff --git a/src/misc/clock/clock_Counter.vhdl b/src/misc/clock/clock_Counter.vhdl index 4d30680f6..88d3dbfc9 100644 --- a/src/misc/clock/clock_Counter.vhdl +++ b/src/misc/clock/clock_Counter.vhdl @@ -16,7 +16,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,7 +31,7 @@ use IEEE.numeric_std.all; use work.utils.all; - +-- XXX: How does it relate to arith_Counter_Free ? entity clock_Counter is generic ( MODULO : positive; diff --git a/src/misc/clock/clock_HighResolution.vhdl b/src/misc/clock/clock_HighResolution.vhdl index 88f183281..d1aeee160 100644 --- a/src/misc/clock/clock_HighResolution.vhdl +++ b/src/misc/clock/clock_HighResolution.vhdl @@ -16,7 +16,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -40,15 +40,15 @@ entity clock_HighResolution is CLOCK_FREQUENCY : FREQ ); port ( - Clock : in std_logic; - Reset : in std_logic; - - Load_nanoseconds : in std_logic; - Load_datetime : in std_logic; - Nanoseconds_to_load : in unsigned(63 downto 0); - Datetime_to_load : in T_CLOCK_Datetime; - Ns_inc : in std_logic; - Ns_dec : in std_logic; + Clock : in std_logic; + Reset : in std_logic; + + Load_nanoseconds : in std_logic; + Load_datetime : in std_logic; + Nanoseconds_to_load : in unsigned(63 downto 0); + Datetime_to_load : in T_CLOCK_Datetime; + Ns_inc : in std_logic; + Ns_dec : in std_logic; Nanoseconds : out unsigned(63 downto 0); Datetime : out T_CLOCK_Datetime diff --git a/src/misc/clock/clock_Timer.vhdl b/src/misc/clock/clock_Timer.vhdl index de32264de..c2404bfa2 100644 --- a/src/misc/clock/clock_Timer.vhdl +++ b/src/misc/clock/clock_Timer.vhdl @@ -16,7 +16,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -57,8 +57,8 @@ end entity; architecture rtl of clock_Timer is - function "-" (left : t_natvec; right : integer) return t_natvec is - variable result : t_natvec(left'range) := (others => 0); + function "-" (left : natural_vector; right : integer) return natural_vector is + variable result : natural_vector(left'range) := (others => 0); begin for i in left'range loop if left(i) > right then @@ -71,7 +71,7 @@ architecture rtl of clock_Timer is constant PERIOD : T_TIME := to_time(CLOCK_FREQ); constant PERIOD_FRACT : t_fractional := fract(PERIOD / TIME_BASE, 1000000, 1.0e-12); constant INCREMENT_FULL : natural := PERIOD_FRACT.whole; - constant INCREMENT_VEC : t_natvec := fract2timing(PERIOD_FRACT); + constant INCREMENT_VEC : natural_vector := fract2timing(PERIOD_FRACT); constant WRAP_VALUE : integer := ite(WRAP_TIME /= 0.0, to_int(WRAP_TIME / TIME_BASE, 1.0), 0); diff --git a/src/misc/filter/README.md b/src/misc/filter/README.md index e3e2bc0e4..442ae3b17 100644 --- a/src/misc/filter/README.md +++ b/src/misc/filter/README.md @@ -10,12 +10,12 @@ The package [`PoC.filter`][filter.pkg] holds all component declarations for this ## Entities - - [`filter_and`][filter_and] - - [`filter_or`][filter_or] - - [`filter_mean`][filter_mean] + - [`filter_And`][filter_And] + - [`filter_Or`][filter_Or] + - [`filter_Mean`][filter_Mean] [filter.pkg]: filter.pkg.vhdl - [filter_and]: filter_and.vhdl - [filter_or]: filter_or.vhdl - [filter_mean]: filter_mean.vhdl + [filter_And]: filter_And.vhdl + [filter_Or]: filter_Or.vhdl + [filter_Mean]: filter_Mean.vhdl diff --git a/src/misc/filter/build.pro b/src/misc/filter/build.pro new file mode 100644 index 000000000..4bb36f044 --- /dev/null +++ b/src/misc/filter/build.pro @@ -0,0 +1,25 @@ +# ============================================================================= +# Authors: +# Stefan Unrein +# +# License: +# ============================================================================= +# Copyright 2025-2025 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +analyze ./filter_And.vhdl +analyze ./filter_Or.vhdl +analyze ./filter_Mean.vhdl +disabled ./filter_PatternFinder.vhdl diff --git a/src/misc/filter/filter.pro b/src/misc/filter/filter.pro deleted file mode 100644 index a8850d2d9..000000000 --- a/src/misc/filter/filter.pro +++ /dev/null @@ -1,3 +0,0 @@ -analyze ./filter_and.vhdl -analyze ./filter_or.vhdl -analyze ./filter_mean.vhdl diff --git a/src/misc/filter/filter_and.vhdl b/src/misc/filter/filter_And.vhdl similarity index 52% rename from src/misc/filter/filter_and.vhdl rename to src/misc/filter/filter_And.vhdl index e6b182901..c094f69db 100644 --- a/src/misc/filter/filter_and.vhdl +++ b/src/misc/filter/filter_And.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2014 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -25,40 +25,40 @@ -- limitations under the License. -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; +use IEEE.std_logic_1164.all; use work.utils.all; -entity filter_and is +entity filter_And is generic ( - TAPS : positive := 4; -- - INIT : std_logic := '0'; -- - ADD_OUTPUT_REG : boolean := FALSE -- + TAPS : positive := 4; -- + INIT : std_logic := '0'; -- + ADD_OUTPUT_REG : boolean := FALSE -- ); port ( - Clock : in std_logic; -- clock - DataIn : in std_logic; -- data to filter - DataOut : out std_logic -- filtered signal + Clock : in std_logic; -- clock + DataIn : in std_logic; -- data to filter + DataOut : out std_logic -- filtered signal ); end entity; -architecture rtl of filter_and is - signal Delays : std_logic_vector(TAPS - 1 downto 0) := (others => INIT); - signal FilterOut : std_logic; +architecture rtl of filter_And is + signal Delays : std_logic_vector(TAPS - 1 downto 0) := (others => INIT); + signal FilterOut : std_logic; begin - Delays <= Delays(Delays'high - 1 downto 0) & DataIn when rising_edge(Clock); - FilterOut <= slv_and(Delays); + Delays <= Delays(Delays'high - 1 downto 0) & DataIn when rising_edge(Clock); + FilterOut <= slv_and(Delays); genOutReg0 : if not ADD_OUTPUT_REG generate - DataOut <= FilterOut; + DataOut <= FilterOut; end generate; genOutReg1 : if ADD_OUTPUT_REG generate - signal FilterOut_d : std_logic := INIT; + signal FilterOut_d : std_logic := INIT; begin - FilterOut_d <= FilterOut when rising_edge(Clock); - DataOut <= FilterOut_d; + FilterOut_d <= FilterOut when rising_edge(Clock); + DataOut <= FilterOut_d; end generate; -end; +end architecture; diff --git a/src/misc/filter/filter_mean.vhdl b/src/misc/filter/filter_Mean.vhdl similarity index 55% rename from src/misc/filter/filter_mean.vhdl rename to src/misc/filter/filter_Mean.vhdl index da0584892..85136456b 100644 --- a/src/misc/filter/filter_mean.vhdl +++ b/src/misc/filter/filter_Mean.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2014 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -25,31 +25,31 @@ -- limitations under the License. -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; +use IEEE.std_logic_1164.all; use work.utils.all; -entity filter_mean is +entity filter_Mean is generic ( - TAPS : positive := 4; -- - INIT : std_logic := '1'; -- - ADD_OUTPUT_REG : boolean := FALSE -- + TAPS : positive := 4; -- + INIT : std_logic := '1'; -- + ADD_OUTPUT_REG : boolean := FALSE -- ); port ( - Clock : in std_logic; -- clock - DataIn : in std_logic; -- data to filter - DataOut : out std_logic -- filtered signal + Clock : in std_logic; -- clock + DataIn : in std_logic; -- data to filter + DataOut : out std_logic -- filtered signal ); end entity; -architecture rtl of filter_mean is - signal Delays : std_logic_vector(TAPS - 1 downto 0) := (others => INIT); - signal FilterOut : std_logic; +architecture rtl of filter_Mean is + signal Delays : std_logic_vector(TAPS - 1 downto 0) := (others => INIT); + signal FilterOut : std_logic; begin - Delays <= Delays(Delays'high - 1 downto 0) & DataIn when rising_edge(Clock); + Delays <= Delays(Delays'high - 1 downto 0) & DataIn when rising_edge(Clock); process(Delays) variable popcnt : natural range 0 to Delays'length; @@ -58,20 +58,20 @@ begin for I in Delays'range loop if (Delays(I) = '1') then - popcnt := popcnt + 1; + popcnt := popcnt + 1; end if; end loop; - FilterOut <= to_sl(popcnt > (Delays'length - popcnt)); + FilterOut <= to_sl(popcnt > (Delays'length - popcnt)); end process; genOutReg0 : if not ADD_OUTPUT_REG generate - DataOut <= FilterOut; + DataOut <= FilterOut; end generate; genOutReg1 : if ADD_OUTPUT_REG generate - signal FilterOut_d : std_logic := INIT; + signal FilterOut_d : std_logic := INIT; begin - FilterOut_d <= FilterOut when rising_edge(Clock); - DataOut <= FilterOut_d; + FilterOut_d <= FilterOut when rising_edge(Clock); + DataOut <= FilterOut_d; end generate; -end; +end architecture; diff --git a/src/misc/filter/filter_or.vhdl b/src/misc/filter/filter_Or.vhdl similarity index 52% rename from src/misc/filter/filter_or.vhdl rename to src/misc/filter/filter_Or.vhdl index 3554efeac..ecc272b71 100644 --- a/src/misc/filter/filter_or.vhdl +++ b/src/misc/filter/filter_Or.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2014 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -25,40 +25,40 @@ -- limitations under the License. -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; +use IEEE.std_logic_1164.all; use work.utils.all; -entity filter_or is +entity filter_Or is generic ( - TAPS : positive := 4; -- - INIT : std_logic := '1'; -- - ADD_OUTPUT_REG : boolean := FALSE -- + TAPS : positive := 4; -- + INIT : std_logic := '1'; -- + ADD_OUTPUT_REG : boolean := FALSE -- ); port ( - Clock : in std_logic; -- clock - DataIn : in std_logic; -- data to filter - DataOut : out std_logic -- filtered signal + Clock : in std_logic; -- clock + DataIn : in std_logic; -- data to filter + DataOut : out std_logic -- filtered signal ); end entity; -architecture rtl of filter_or is - signal Delays : std_logic_vector(TAPS - 1 downto 0) := (others => INIT); - signal FilterOut : std_logic; +architecture rtl of filter_Or is + signal Delays : std_logic_vector(TAPS - 1 downto 0) := (others => INIT); + signal FilterOut : std_logic; begin - Delays <= Delays(Delays'high - 1 downto 0) & DataIn when rising_edge(Clock); - FilterOut <= slv_or(Delays); + Delays <= Delays(Delays'high - 1 downto 0) & DataIn when rising_edge(Clock); + FilterOut <= slv_or(Delays); genOutReg0 : if not ADD_OUTPUT_REG generate - DataOut <= FilterOut; + DataOut <= FilterOut; end generate; genOutReg1 : if ADD_OUTPUT_REG generate - signal FilterOut_d : std_logic := INIT; + signal FilterOut_d : std_logic := INIT; begin - FilterOut_d <= FilterOut when rising_edge(Clock); - DataOut <= FilterOut_d; + FilterOut_d <= FilterOut when rising_edge(Clock); + DataOut <= FilterOut_d; end generate; -end; +end architecture; diff --git a/src/misc/gearbox/README.md b/src/misc/gearbox/README.md index 92ffe3971..7a52f00be 100644 --- a/src/misc/gearbox/README.md +++ b/src/misc/gearbox/README.md @@ -19,7 +19,7 @@ Gearboxes with common clock (`cc`) interface ... TODO ### `gearbox_...._dc` Modules Gearboxes with full transfer rate preservation use a dependent clock (`dc`) -interface. For example a 32:8 `gearbox_down_dc` with an input frequency of 75 MHz +interface. For example a 32:8 `gearbox_Down_dc` with an input frequency of 75 MHz requires an output frequency of 300 MHz, because the scaling factor is 4. The clocks MUST be multiples of each other and have a FIXED phase difference. @@ -28,7 +28,7 @@ clocks MUST be multiples of each other and have a FIXED phase difference. 1. A SATA 3,0 Gbps controller uses an embedded multi-gigabit transceiver (MGT) in an FPGA to transmit and receive 300 MBps. The MGT interface is configured as a byte interface at 300 MHz. The link layer protocol works on 32 bit - words. A gearbox_up_dc is used to pack 4 bytes into one 32 bit SATA word at + words. A gearbox_Up_dc is used to pack 4 bytes into one 32 bit SATA word at a frequency of 75 MHz. **FIFO use case:** @@ -41,13 +41,13 @@ clocks MUST be multiples of each other and have a FIXED phase difference. ## Entities - - [`gearbox_down_cc`][gearbox_down_cc] - - [`gearbox_up_cc`][gearbox_up_cc] - - [`gearbox_down_dc`][gearbox_down_dc] - - [`gearbox_up_dc`][gearbox_up_dc] + - [`gearbox_Down_cc`][gearbox_Down_cc] + - [`gearbox_Up_cc`][gearbox_Up_cc] + - [`gearbox_Down_dc`][gearbox_Down_dc] + - [`gearbox_Up_dc`][gearbox_Up_dc] - [gearbox_down_cc]: gearbox_down_cc.vhdl - [gearbox_up_cc]: gearbox_up_cc.vhdl - [gearbox_down_dc]: gearbox_down_dc.vhdl - [gearbox_up_dc]: gearbox_up_dc.vhdl + [gearbox_Down_cc]: gearbox_Down_cc.vhdl + [gearbox_Up_cc]: gearbox_Up_cc.vhdl + [gearbox_Down_dc]: gearbox_Down_dc.vhdl + [gearbox_Up_dc]: gearbox_Up_dc.vhdl \ No newline at end of file diff --git a/src/misc/gearbox/gearbox.pro b/src/misc/gearbox/build.pro similarity index 83% rename from src/misc/gearbox/gearbox.pro rename to src/misc/gearbox/build.pro index 71df4b9e1..2904961f9 100644 --- a/src/misc/gearbox/gearbox.pro +++ b/src/misc/gearbox/build.pro @@ -18,7 +18,7 @@ # limitations under the License. # ============================================================================= -# analyze ./gearbox_down_cc.vhdl listed in axi4.pro -analyze ./gearbox_down_dc.vhdl -# analyze ./gearbox_up_cc.vhdl listed in axi4.pro -analyze ./gearbox_up_dc.vhdl +# analyze ./gearbox_Down_cc.vhdl listed in axi4.pro +analyze ./gearbox_Down_dc.vhdl +# analyze ./gearbox_Up_cc.vhdl listed in axi4.pro +analyze ./gearbox_Up_dc.vhdl diff --git a/src/misc/gearbox/gearbox_Down_cc.vhdl b/src/misc/gearbox/gearbox_Down_cc.vhdl new file mode 100644 index 000000000..20317654f --- /dev/null +++ b/src/misc/gearbox/gearbox_Down_cc.vhdl @@ -0,0 +1,262 @@ +-- ============================================================================= +-- Authors: Patrick Lehmann +-- +-- Entity: A downscaling gearbox module with a common clock (cc) interface. +-- +-- Description: +-- ------------------------------------- +-- This module provides a downscaling gearbox with a common clock (cc) +-- interface. It perfoems a 'word' to 'byte' splitting. The default order is +-- LITTLE_ENDIAN (starting at byte(0)). Input "In_Data" and output "Out_Data" +-- are of the same clock domain "Clock". Optional input and output registers +-- can be added by enabling (ADD_***PUT_REGISTERS = TRUE). +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2015 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.math.all; +use work.utils.all; +use work.vectors.all; +use work.components.all; + + +entity gearbox_Down_cc is + generic ( + INPUT_BITS : positive := 32; + OUTPUT_BITS : positive := 24; + META_BITS : natural := 0; + ADD_INPUT_REGISTERS : boolean := FALSE; + ADD_OUTPUT_REGISTERS : boolean := FALSE + ); + port ( + Clock : in std_logic; + + In_Sync : in std_logic; + In_Valid : in std_logic; + In_Next : out std_logic; + In_Data : in std_logic_vector(INPUT_BITS - 1 downto 0); + In_Meta : in std_logic_vector(META_BITS - 1 downto 0); + + Out_Sync : out std_logic; + Out_Valid : out std_logic; + Out_Data : out std_logic_vector(OUTPUT_BITS - 1 downto 0); + Out_Meta : out std_logic_vector(META_BITS - 1 downto 0); + Out_First : out std_logic; + Out_Last : out std_logic + ); +end entity; + + +architecture rtl of gearbox_Down_cc is + constant C_VERBOSE : boolean := FALSE; --POC_VERBOSE; + + constant BITS_PER_CHUNK : positive := greatestCommonDivisor(INPUT_BITS, OUTPUT_BITS); + constant INPUT_CHUNKS : positive := INPUT_BITS / BITS_PER_CHUNK; + constant OUTPUT_CHUNKS : positive := OUTPUT_BITS / BITS_PER_CHUNK; + + subtype T_CHUNK is std_logic_vector(BITS_PER_CHUNK - 1 downto 0); + type T_CHUNK_VECTOR is array(natural range <>) of T_CHUNK; + + subtype T_MUX_INDEX is integer range 0 to INPUT_CHUNKS - 1; + type T_MUX_INPUT is record + Index : T_MUX_INDEX; + UseBuffer : boolean; + end record; + + type T_MUX_INPUT_LIST is array(natural range <>) of T_MUX_INPUT; + type T_MUX_INPUT_STRUCT is record + List : T_MUX_INPUT_LIST(0 to OUTPUT_CHUNKS - 1); + Reg_en : std_logic; + Nxt : std_logic; + First : std_logic; + Last : std_logic; + end record; + type T_MUX_DESCRIPTIONS is array(natural range <>) of T_MUX_INPUT_STRUCT; + + function genMuxDescription return T_MUX_DESCRIPTIONS is + variable DESC : T_MUX_DESCRIPTIONS(0 to INPUT_CHUNKS - 1); + variable UseBuffer : boolean; + variable k : T_MUX_INDEX; + begin + if C_VERBOSE then report "genMuxDescription: IC=" & integer'image(INPUT_CHUNKS) severity NOTE; end if; + + k := INPUT_CHUNKS - 1; + for i in 0 to INPUT_CHUNKS - 1 loop + if C_VERBOSE then report " i: " & integer'image(i) & " List:" severity NOTE; end if; + UseBuffer := TRUE; + for j in 0 to OUTPUT_CHUNKS - 1 loop + k := (k + 1) mod INPUT_CHUNKS; + UseBuffer := UseBuffer and (k /= 0); + DESC(i).List(j).Index := k; + DESC(i).List(j).UseBuffer := UseBuffer; + + if C_VERBOSE then report " j= " & integer'image(j) & " k=" & INTEGER'image(DESC(i).List(j).Index) severity NOTE; end if; + end loop; + DESC(i).Reg_en := to_sl(not UseBuffer); + DESC(i).Nxt := to_sl(k + OUTPUT_CHUNKS >= INPUT_CHUNKS); + DESC(i).First := to_sl(i = 0); + DESC(i).Last := to_sl(i = INPUT_CHUNKS - 1); + + if C_VERBOSE then report " en=" & std_logic'image(DESC(i).Reg_en) & " nxt=" & STD_LOGIC'image(DESC(i).Nxt) severity NOTE; end if; + end loop; + return DESC; + end function; + + constant MUX_INPUT_TRANSLATION : T_MUX_DESCRIPTIONS := genMuxDescription; + + -- create vector-vector from vector (4 bit) + function to_chunkv(slv : std_logic_vector) return T_CHUNK_VECTOR is + constant CHUNKS : positive := slv'length / BITS_PER_CHUNK; + variable Result : T_CHUNK_VECTOR(CHUNKS - 1 downto 0); + begin + if ((slv'length mod BITS_PER_CHUNK) /= 0) then report "to_chunkv: width mismatch - slv'length is no multiple of BITS_PER_CHUNK (slv'length=" & INTEGER'image(slv'length) & "; BITS_PER_CHUNK=" & INTEGER'image(BITS_PER_CHUNK) & ")" severity FAILURE; end if; + + for i in 0 to CHUNKS - 1 loop + Result(i) := slv(slv'low + ((i + 1) * BITS_PER_CHUNK) - 1 downto slv'low + (i * BITS_PER_CHUNK)); + end loop; + return Result; + end function; + + -- convert vector-vector to flatten vector + function to_slv(slvv : T_CHUNK_VECTOR) return std_logic_vector is + variable slv : std_logic_vector((slvv'length * BITS_PER_CHUNK) - 1 downto 0); + begin + for i in slvv'range loop + slv(((i + 1) * BITS_PER_CHUNK) - 1 downto (i * BITS_PER_CHUNK)) := slvv(i); + end loop; + return slv; + end function; + + signal In_Sync_d : std_logic := '0'; + signal In_Data_d : std_logic_vector(INPUT_BITS - 1 downto 0) := (others => '0'); + signal In_Meta_d : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); + signal In_Valid_d : std_logic := '0'; + + signal MuxSelect_rst : std_logic; + signal MuxSelect_en : std_logic; + signal MuxSelect_us : unsigned(log2ceilnz(INPUT_CHUNKS) - 1 downto 0) := (others => '0'); + signal MuxSelect_ov : std_logic; + + signal Nxt : std_logic; + signal AutoIncrement : std_logic; + + signal GearBoxInput : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); + signal GearBoxBuffer_en : std_logic; + signal GearBoxBuffer : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 1) := (others => (others => '0')); + signal GearBoxOutput : T_CHUNK_VECTOR(OUTPUT_CHUNKS - 1 downto 0); + + signal SyncOut : std_logic; + signal ValidOut : std_logic; + signal DataOut : std_logic_vector(OUTPUT_BITS - 1 downto 0); + signal MetaOut : std_logic_vector(META_BITS - 1 downto 0); + signal FirstOut : std_logic; + signal LastOut : std_logic; + + signal Out_Sync_d : std_logic := '0'; + signal Out_Valid_d : std_logic := '0'; + signal Out_Data_d : std_logic_vector(OUTPUT_BITS - 1 downto 0) := (others => '0'); + signal Out_Meta_d : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); + signal Out_First_d : std_logic := '0'; + signal Out_Last_d : std_logic := '0'; + +begin + assert (not C_VERBOSE) + report "gearbox_Down_cc:" & LF & + " INPUT_BITS=" & integer'image(INPUT_BITS) & + " OUTPUT_BITS=" & integer'image(OUTPUT_BITS) & + " INPUT_CHUNKS=" & integer'image(INPUT_CHUNKS) & + " OUTPUT_CHUNKS=" & integer'image(OUTPUT_CHUNKS) & + " BITS_PER_CHUNK=" & integer'image(BITS_PER_CHUNK) + severity NOTE; + assert (INPUT_BITS > OUTPUT_BITS) report "OUTPUT_BITS must be less than INPUT_BITS, otherwise it's no down-sizing gearbox." severity FAILURE; + + In_Sync_d <= In_Sync;-- when registered(Clock, ADD_INPUT_REGISTERS); + In_Valid_d <= In_Valid when registered(Clock, ADD_INPUT_REGISTERS); + In_Data_d <= In_Data when registered(Clock, ADD_INPUT_REGISTERS); + In_Meta_d <= In_Meta when registered(Clock, ADD_INPUT_REGISTERS); + + GearBoxInput <= to_chunkv(In_Data_d(INPUT_BITS - 1 downto 0)); + GearBoxBuffer_en <= MUX_INPUT_TRANSLATION(to_index(MuxSelect_us, INPUT_CHUNKS)).Reg_en and In_Valid_d; + + process(Clock) + begin + if rising_edge(Clock) then + if (GearBoxBuffer_en = '1') then + GearBoxBuffer <= to_chunkv(In_Data_d(INPUT_BITS - 1 downto BITS_PER_CHUNK)); + end if; + end if; + end process; + + MuxSelect_rst <= In_Sync_d or MuxSelect_ov; + MuxSelect_en <= In_Valid_d or MuxSelect_ov or AutoIncrement; + MuxSelect_us <= upcounter_next(cnt => MuxSelect_us, rst => MuxSelect_rst, en => MuxSelect_en) when rising_edge(Clock); + MuxSelect_ov <= upcounter_equal(cnt => MuxSelect_us, value => (INPUT_CHUNKS - 1)); + + Nxt <= MUX_INPUT_TRANSLATION(to_index(MuxSelect_us, INPUT_CHUNKS)).Nxt; + AutoIncrement <= not Nxt; + + In_Next <= Nxt; + + -- generate gearbox multiplexer structure + genMux : for j in 0 to OUTPUT_CHUNKS - 1 generate + signal MuxInput : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); + begin + genMuxInputs : for i in 0 to INPUT_CHUNKS - 1 generate + assert (not C_VERBOSE) + report "i= " & integer'image(i) & " " & + "j= " & integer'image(j) & " " & + "-> idx= " & integer'image(MUX_INPUT_TRANSLATION(i).List(j).Index) & " " & + "-> useBuffer= " & boolean'image(MUX_INPUT_TRANSLATION(i).List(j).UseBuffer) & " " & + "-> Nxt= " & std_logic'image(MUX_INPUT_TRANSLATION(i).Nxt) + severity NOTE; + + connectToInput : if (MUX_INPUT_TRANSLATION(i).List(j).UseBuffer = FALSE) generate + MuxInput(i) <= GearBoxInput(MUX_INPUT_TRANSLATION(i).List(j).Index); + end generate; + connectToBuffer : if (MUX_INPUT_TRANSLATION(i).List(j).UseBuffer = TRUE) generate + MuxInput(i) <= GearBoxBuffer(MUX_INPUT_TRANSLATION(i).List(j).Index); + end generate; + end generate; + + GearBoxOutput(j) <= MuxInput(to_index(MuxSelect_us, INPUT_CHUNKS)); + end generate; + + SyncOut <= MuxSelect_ov; + ValidOut <= In_Valid_d or MuxSelect_ov or AutoIncrement; + DataOut <= to_slv(GearBoxOutput); + FirstOut <= MUX_INPUT_TRANSLATION(to_index(MuxSelect_us, INPUT_CHUNKS)).First; + LastOut <= MUX_INPUT_TRANSLATION(to_index(MuxSelect_us, INPUT_CHUNKS)).Last; + + Out_Sync_d <= SyncOut when registered(Clock, ADD_OUTPUT_REGISTERS); + Out_Valid_d <= ValidOut when registered(Clock, ADD_OUTPUT_REGISTERS); + Out_Data_d <= DataOut when registered(Clock, ADD_OUTPUT_REGISTERS); + Out_Meta_d <= MetaOut when registered(Clock, ADD_OUTPUT_REGISTERS); + Out_First_d <= FirstOut when registered(Clock, ADD_OUTPUT_REGISTERS); + Out_Last_d <= LastOut when registered(Clock, ADD_OUTPUT_REGISTERS); + + Out_Sync <= Out_Sync_d; + Out_Valid <= Out_Valid_d; + Out_Data <= Out_Data_d; + Out_Meta <= Out_Meta_d; + Out_First <= Out_First_d; + Out_Last <= Out_Last_d; +end architecture; diff --git a/src/misc/gearbox/gearbox_Down_dc.vhdl b/src/misc/gearbox/gearbox_Down_dc.vhdl new file mode 100644 index 000000000..dbcc67514 --- /dev/null +++ b/src/misc/gearbox/gearbox_Down_dc.vhdl @@ -0,0 +1,108 @@ +-- ============================================================================= +-- Authors: Patrick Lehmann +-- +-- Entity: A downscaling gearbox module with a dependent clock (dc) interface. +-- +-- Description: +-- ------------------------------------- +-- This module provides a downscaling gearbox with a dependent clock (dc) +-- interface. It perfoems a 'word' to 'byte' splitting. The default order is +-- LITTLE_ENDIAN (starting at byte(0)). Input "In_Data" is of clock domain +-- "Clock1"; output "Out_Data" is of clock domain "Clock2". Optional input and +-- output registers can be added by enabling (ADD_***PUT_REGISTERS = TRUE). +-- +-- Assertions: +-- =========== +-- - Clock periods of Clock1 and Clock2 MUST be multiples of each other. +-- - Clock1 and Clock2 MUST be phase aligned (related) to each other. +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2015 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.utils.all; +use work.components.all; + + +entity gearbox_Down_dc is + generic ( + INPUT_BITS : positive := 32; -- input bits ('words') + OUTPUT_BITS : positive := 8; -- output bits ('byte') + OUTPUT_ORDER : T_BIT_ORDER := LSB_FIRST; -- LSB_FIRST: start at byte(0), MSB_FIRST: start at byte(n-1) + ADD_INPUT_REGISTERS : boolean := FALSE; -- add input register @Clock1 + ADD_OUTPUT_REGISTERS : boolean := FALSE -- add output register @Clock2 + ); + port ( + Clock1 : in std_logic; -- input clock domain + Clock2 : in std_logic; -- output clock domain + In_Data : in std_logic_vector(INPUT_BITS - 1 downto 0); -- input word + Out_Data : out std_logic_vector(OUTPUT_BITS - 1 downto 0) -- output word + ); +end entity; + + +architecture rtl of gearbox_Down_dc is + constant BIT_RATIO : REAL := real(INPUT_BITS) / real(OUTPUT_BITS); + constant COUNTER_BITS : positive := log2ceil(integer(BIT_RATIO)); + + type T_MUX_INPUT is array (natural range <>) of std_logic_vector(OUTPUT_BITS - 1 downto 0); + + signal WordBoundary : std_logic := '0'; + signal WordBoundary_d : std_logic := '0'; + signal Align : std_logic; + + signal Data_d : std_logic_vector(INPUT_BITS - 1 downto 0) := (others => '0'); + signal DataIn : std_logic_vector(INPUT_BITS - 1 downto 0); + signal DataOut_d : std_logic_vector(OUTPUT_BITS - 1 downto 0) := (others => '0'); + signal MuxInput : T_MUX_INPUT(2**COUNTER_BITS - 1 downto 0); + signal MuxOutput : std_logic_vector(OUTPUT_BITS - 1 downto 0); + signal MuxCounter_us : unsigned(COUNTER_BITS - 1 downto 0) := (others => '0'); + signal MuxSelect_us : unsigned(COUNTER_BITS - 1 downto 0); + +begin + assert (INPUT_BITS > OUTPUT_BITS) report "OUTPUT_BITS must be less than INPUT_BITS, otherwise it's no down-sizing gearbox." severity FAILURE; + + -- input register @Clock1 + Data_d <= In_Data when registered(Clock1, ADD_INPUT_REGISTERS); + + -- switch byte order if neccessary + DataIn <= ite((OUTPUT_ORDER = LSB_FIRST), Data_d, swap(Data_d, OUTPUT_BITS)); + + -- selection multiplexer + genMuxInput : for j in 0 to (2 ** COUNTER_BITS) - 1 generate + MuxInput(j) <= DataIn(((j + 1) * OUTPUT_BITS) - 1 downto (j * OUTPUT_BITS)); + end generate; + + -- multiplexer control @Clock2 + MuxCounter_us <= upcounter_next(cnt => MuxCounter_us, rst => Align, INIT => 1) when rising_edge(Clock2); + MuxSelect_us <= mux(Align, MuxCounter_us, (MuxCounter_us'range => '0')); + MuxOutput <= MuxInput(to_index(MuxSelect_us)); + + -- word boundary T-FF @Clock1 and D-FF @Clock2 + WordBoundary <= not WordBoundary when rising_edge(Clock1); + WordBoundary_d <= WordBoundary when rising_edge(Clock2); + Align <= WordBoundary xor WordBoundary_d; + + -- add output register @Clock2 + DataOut_d <= MuxOutput when registered(Clock2, ADD_OUTPUT_REGISTERS); + Out_Data <= DataOut_d; +end architecture; diff --git a/src/misc/gearbox/gearbox_Up_cc.vhdl b/src/misc/gearbox/gearbox_Up_cc.vhdl new file mode 100644 index 000000000..9aab493b4 --- /dev/null +++ b/src/misc/gearbox/gearbox_Up_cc.vhdl @@ -0,0 +1,325 @@ +-- ============================================================================= +-- Authors: Patrick Lehmann +-- +-- Entity: A upscaling gearbox module with a commonc clock (cc) interface. +-- +-- Description: +-- ------------------------------------- +-- This module provides a downscaling gearbox with a common clock (cc) +-- interface. It perfoems a 'byte' to 'word' collection. The default order is +-- LITTLE_ENDIAN (starting at byte(0)). Input "In_Data" and output "Out_Data" +-- are of the same clock domain "Clock". Optional input and output registers +-- can be added by enabling (ADD_***PUT_REGISTERS = TRUE). +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.math.all; +use work.utils.all; +use work.vectors.all; +use work.components.all; + + +entity gearbox_Up_cc is + generic ( + INPUT_BITS : positive := 24; + OUTPUT_BITS : positive := 32; + META_BITS : natural := 0; + ADD_INPUT_REGISTERS : boolean := FALSE; + ADD_OUTPUT_REGISTERS : boolean := FALSE + ); + port ( + Clock : in std_logic; + + In_Sync : in std_logic; + In_Valid : in std_logic; + In_Data : in std_logic_vector(INPUT_BITS - 1 downto 0); + In_Meta : in std_logic_vector(META_BITS - 1 downto 0); + + Out_Sync : out std_logic; + Out_Valid : out std_logic; + Out_Data : out std_logic_vector(OUTPUT_BITS - 1 downto 0); + Out_Meta : out std_logic_vector(META_BITS - 1 downto 0); + Out_First : out std_logic; + Out_Last : out std_logic + ); +end entity; + + +architecture rtl of gearbox_Up_cc is + constant C_VERBOSE : boolean := FALSE; --POC_VERBOSE; + + constant BITS_PER_CHUNK : positive := greatestCommonDivisor(INPUT_BITS, OUTPUT_BITS); + constant INPUT_CHUNKS : positive := INPUT_BITS / BITS_PER_CHUNK; + constant OUTPUT_CHUNKS : positive := OUTPUT_BITS / BITS_PER_CHUNK; + constant STAGES : positive := div_ceil(OUTPUT_CHUNKS, INPUT_CHUNKS); + + subtype T_CHUNK is std_logic_vector(BITS_PER_CHUNK - 1 downto 0); + type T_CHUNK_VECTOR is array(natural range <>) of T_CHUNK; + type T_BUFFER_MATRIX is array(natural range <>) of T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); + + subtype T_STAGE_INDEX is integer range 0 to STAGES; + subtype T_MUX_INDEX is integer range 0 to INPUT_CHUNKS - 1; + type T_MUX_INPUT is record + Index : T_MUX_INDEX; + Stage : T_STAGE_INDEX; + end record; + + type T_MUX_INPUT_LIST is array(natural range <>) of T_MUX_INPUT; + type T_MUX_DESCRIPTIONS is array(natural range <>) of T_MUX_INPUT_LIST(0 to OUTPUT_CHUNKS - 1); + + type T_COUNTER_STRUCT is record + First : std_logic; + Valid : std_logic; + Last : std_logic; + Reg_en : std_logic; + Reg_Stage : T_STAGE_INDEX; + end record; + type T_COUNTER_DESCRIPTIONS is array(natural range <>) of T_COUNTER_STRUCT; + + function genCounterDescription return T_COUNTER_DESCRIPTIONS is + variable First : std_logic; + variable DESC : T_COUNTER_DESCRIPTIONS(0 to OUTPUT_CHUNKS - 1); + begin + First := '1'; + + if C_VERBOSE then + report "genCounterDescription:" & + " INPUT_CHUNKS=" & integer'image(INPUT_CHUNKS) & + " OUTPUT_CHUNKS=" & integer'image(OUTPUT_CHUNKS) & + " STAGES=" & integer'image(STAGES) + severity NOTE; + end if; + for i in 0 to STAGES - 1 loop + DESC(i).Reg_en := to_sl(i /= (OUTPUT_CHUNKS - 1)); + DESC(i).Reg_Stage := i; + DESC(i).Valid := to_sl(i = (OUTPUT_CHUNKS - 1)); + DESC(i).First := First and DESC(i).Valid; + DESC(i).Last := to_sl(i = (OUTPUT_CHUNKS - 1)); + First := First and not DESC(i).First; + + if C_VERBOSE then + report " i: " & integer'image(i) & + " en=" & std_logic'image(DESC(i).Reg_en) & + " stg=" & integer'image(DESC(i).Reg_Stage) & + " vld=" & std_logic'image(DESC(i).Valid) + severity NOTE; + end if; + end loop; + if C_VERBOSE and (STAGES < OUTPUT_CHUNKS) then report "----------------------------------------" severity NOTE; end if; + for i in STAGES to OUTPUT_CHUNKS - 1 loop + DESC(i).Reg_en := to_sl(i /= (OUTPUT_CHUNKS - 1)); + DESC(i).Reg_Stage := i mod STAGES; + DESC(i).Valid := to_sl(((i mod STAGES) = 0) or (i = (OUTPUT_CHUNKS - 1))); + DESC(i).First := First and DESC(i).Valid; + DESC(i).Last := to_sl(i = (OUTPUT_CHUNKS - 1)); + First := First and not DESC(i).First; + + if C_VERBOSE then + report " i: " & integer'image(i) & + " en=" & std_logic'image(DESC(i).Reg_en) & + " stg=" & integer'image(DESC(i).Reg_Stage) & + " vld=" & std_logic'image(DESC(i).Valid) + severity NOTE; + end if; + end loop; + return DESC; + end function; + + function genMuxDescription return T_MUX_DESCRIPTIONS is + variable DESC : T_MUX_DESCRIPTIONS(0 to INPUT_CHUNKS - 1); + variable k : T_MUX_INDEX; + variable s : T_STAGE_INDEX; + begin + if C_VERBOSE then + report "genMuxDescription:" & + " INPUT_CHUNKS=" & integer'image(INPUT_CHUNKS) & + " OUTPUT_CHUNKS=" & integer'image(OUTPUT_CHUNKS) & + " STAGES=" & integer'image(STAGES) + severity NOTE; + end if; + k := INPUT_CHUNKS - 1; + for i in 0 to INPUT_CHUNKS - 1 loop + s := ite((i = 0), STAGES, 0); + if C_VERBOSE then report " Mux " & integer'image(i) severity NOTE; end if; + for j in 0 to OUTPUT_CHUNKS - 1 loop + s := ite(((k + 1) = INPUT_CHUNKS), (s + 1) mod (STAGES + 1), s); + k := (k + 1) mod INPUT_CHUNKS; + DESC(i)(j).Stage := s; + DESC(i)(j).Index := k; + if C_VERBOSE then + report " port: " & integer'image(j) & + " idx=" & integer'image(DESC(i)(j).Stage) & + " stg=" & integer'image(DESC(i)(j).Index) + severity NOTE; + end if; + end loop; + end loop; + + return DESC; + end function; + + constant COUNTER_TRANSLATION : T_COUNTER_DESCRIPTIONS := genCounterDescription; + constant MUX_INPUT_TRANSLATION : T_MUX_DESCRIPTIONS := genMuxDescription; + + -- create vector-vector from vector (4 bit) + function to_chunkv(slv : std_logic_vector) return T_CHUNK_VECTOR is + constant CHUNKS : positive := slv'length / BITS_PER_CHUNK; + variable Result : T_CHUNK_VECTOR(CHUNKS - 1 downto 0); + begin + if ((slv'length mod BITS_PER_CHUNK) /= 0) then report "to_chunkv: width mismatch - slv'length is no multiple of BITS_PER_CHUNK (slv'length=" & INTEGER'image(slv'length) & "; BITS_PER_CHUNK=" & INTEGER'image(BITS_PER_CHUNK) & ")" severity FAILURE; end if; + + for i in 0 to CHUNKS - 1 loop + Result(i) := slv(slv'low + ((i + 1) * BITS_PER_CHUNK) - 1 downto slv'low + (i * BITS_PER_CHUNK)); + end loop; + return Result; + end function; + + -- convert vector-vector to flatten vector + function to_slv(slvv : T_CHUNK_VECTOR) return std_logic_vector is + variable slv : std_logic_vector((slvv'length * BITS_PER_CHUNK) - 1 downto 0); + begin + for i in slvv'range loop + slv(((i + 1) * BITS_PER_CHUNK) - 1 downto (i * BITS_PER_CHUNK)) := slvv(i); + end loop; + return slv; + end function; + + signal In_Sync_d : std_logic := '0'; + signal In_Data_d : std_logic_vector(INPUT_BITS - 1 downto 0) := (others => '0'); + signal In_Meta_d : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); + signal In_Valid_d : std_logic := '0'; + + signal StageSelect_rst : std_logic; + signal StageSelect_en : std_logic; + signal StageSelect_us : unsigned(log2ceilnz(OUTPUT_CHUNKS) - 1 downto 0) := (others => '0'); + signal StageSelect_ov : std_logic; + + signal MuxSelect_rst : std_logic; + signal MuxSelect_en : std_logic; + signal MuxSelect_us : unsigned(log2ceilnz(INPUT_CHUNKS) - 1 downto 0) := (others => '0'); + signal MuxSelect_ov : std_logic; + + signal GearBoxInput : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); + signal GearBoxBuffer_en : std_logic; + signal GearBoxBuffer : T_BUFFER_MATRIX(STAGES - 1 downto 0) := (others => (others => (others => '0'))); + signal MetaBuffer : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); + signal GearBoxOutput : T_CHUNK_VECTOR(OUTPUT_CHUNKS - 1 downto 0); + + signal SyncOut : std_logic; + signal ValidOut : std_logic; + signal DataOut : std_logic_vector(OUTPUT_BITS - 1 downto 0); + signal MetaOut : std_logic_vector(META_BITS - 1 downto 0); + signal FirstOut : std_logic; + signal LastOut : std_logic; + + signal Out_Sync_d : std_logic := '0'; + signal Out_Valid_d : std_logic := '0'; + signal Out_Data_d : std_logic_vector(OUTPUT_BITS - 1 downto 0) := (others => '0'); + signal Out_Meta_d : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); + signal Out_First_d : std_logic := '0'; + signal Out_Last_d : std_logic := '0'; + +begin + assert (not C_VERBOSE) + report "gearbox_Up_cc:" & LF & + " INPUT_BITS=" & integer'image(INPUT_BITS) & + " OUTPUT_BITS=" & integer'image(OUTPUT_BITS) & + " INPUT_CHUNKS=" & integer'image(INPUT_CHUNKS) & + " OUTPUT_CHUNKS=" & integer'image(OUTPUT_CHUNKS) & + " BITS_PER_CHUNK=" & integer'image(BITS_PER_CHUNK) + severity NOTE; + assert (INPUT_BITS < OUTPUT_BITS) report "INPUT_BITS must be less than OUTPUT_BITS, otherwise it's no up-sizing gearbox." severity FAILURE; + + In_Sync_d <= In_Sync;-- when registered(Clock, ADD_INPUT_REGISTERS); + In_Valid_d <= In_Valid when registered(Clock, ADD_INPUT_REGISTERS); + In_Data_d <= In_Data when registered(Clock, ADD_INPUT_REGISTERS); + In_Meta_d <= In_Meta when registered(Clock, ADD_INPUT_REGISTERS); + + GearBoxInput <= to_chunkv(In_Data_d); + GearBoxBuffer_en <= COUNTER_TRANSLATION(to_index(StageSelect_us, OUTPUT_CHUNKS - 1)).Reg_en and In_Valid_d and not In_Sync_d; + + process(Clock) + begin + if rising_edge(Clock) then + if (GearBoxBuffer_en = '1') then + GearBoxBuffer(COUNTER_TRANSLATION(to_index(StageSelect_us, OUTPUT_CHUNKS - 1)).Reg_Stage) <= to_chunkv(In_Data_d); + MetaBuffer <= In_Meta_d; + end if; + end if; + end process; + + StageSelect_rst <= In_Sync_d or (StageSelect_ov and In_Valid_d); + StageSelect_en <= In_Valid_d or (StageSelect_ov and In_Valid_d); + StageSelect_us <= upcounter_next(cnt => StageSelect_us, rst => StageSelect_rst, en => StageSelect_en) when rising_edge(Clock); + StageSelect_ov <= upcounter_equal(cnt => StageSelect_us, value => (OUTPUT_CHUNKS - 1)); + + MuxSelect_rst <= (StageSelect_ov and MuxSelect_ov and In_Valid_d) or In_Sync_d; + MuxSelect_en <= COUNTER_TRANSLATION(to_index(StageSelect_us, OUTPUT_CHUNKS - 1)).Valid and In_Valid_d; + MuxSelect_us <= upcounter_next(cnt => MuxSelect_us, rst => MuxSelect_rst, en => MuxSelect_en) when rising_edge(Clock); + MuxSelect_ov <= upcounter_equal(cnt => MuxSelect_us, value => (INPUT_CHUNKS - 1)); + + -- generate gearbox multiplexer structure + genMux : for j in 0 to OUTPUT_CHUNKS - 1 generate + signal MuxInput : T_CHUNK_VECTOR(OUTPUT_CHUNKS - 1 downto 0); + begin + genMuxInputs : for i in 0 to INPUT_CHUNKS - 1 generate + -- assert (not C_VERBOSE) + -- report "mux = " & INTEGER'image(j) & " " & + -- "port = " & INTEGER'image(i) & " " & + -- "-> idx= " & INTEGER'image(MUX_INPUT_TRANSLATION(i)(j).Index) & " " & + -- "-> stg= " & INTEGER'image(MUX_INPUT_TRANSLATION(i)(j).Stage) & " " & + -- "-> Vld= " & STD_LOGIC'image(COUNTER_TRANSLATION(i).Valid) + -- severity NOTE; + + connectToInput : if (MUX_INPUT_TRANSLATION(i)(j).Stage = STAGES) generate + MuxInput(i) <= GearBoxInput(MUX_INPUT_TRANSLATION(i)(j).Index); + end generate; + connectToBuffer : if (MUX_INPUT_TRANSLATION(i)(j).Stage /= STAGES) generate + MuxInput(i) <= GearBoxBuffer(MUX_INPUT_TRANSLATION(i)(j).Stage)(MUX_INPUT_TRANSLATION(i)(j).Index); + end generate; + end generate; + + GearBoxOutput(j) <= MuxInput(to_index(MuxSelect_us, OUTPUT_CHUNKS - 1)); + end generate; + + ValidOut <= COUNTER_TRANSLATION(to_index(StageSelect_us, OUTPUT_CHUNKS - 1)).Valid and In_Valid_d; + SyncOut <= not COUNTER_TRANSLATION(to_index(StageSelect_us, OUTPUT_CHUNKS - 1)).Reg_en and ValidOut; + DataOut <= to_slv(GearBoxOutput); + MetaOut <= MetaBuffer; + FirstOut <= COUNTER_TRANSLATION(to_index(StageSelect_us, OUTPUT_CHUNKS - 1)).First; + LastOut <= COUNTER_TRANSLATION(to_index(StageSelect_us, OUTPUT_CHUNKS - 1)).Last; + + Out_Sync_d <= SyncOut when registered(Clock, ADD_OUTPUT_REGISTERS); + Out_Valid_d <= ValidOut when registered(Clock, ADD_OUTPUT_REGISTERS); + Out_Data_d <= DataOut when registered(Clock, ADD_OUTPUT_REGISTERS); + Out_Meta_d <= MetaOut when registered(Clock, ADD_OUTPUT_REGISTERS); + Out_First_d <= FirstOut when registered(Clock, ADD_OUTPUT_REGISTERS); + Out_Last_d <= LastOut when registered(Clock, ADD_OUTPUT_REGISTERS); + + Out_Sync <= Out_Sync_d; + Out_Valid <= Out_Valid_d; + Out_Data <= Out_Data_d; + Out_Meta <= Out_Meta_d; + Out_First <= Out_First_d; + Out_Last <= Out_Last_d; +end architecture; diff --git a/src/misc/gearbox/gearbox_Up_dc.vhdl b/src/misc/gearbox/gearbox_Up_dc.vhdl new file mode 100644 index 000000000..06fc5bd9d --- /dev/null +++ b/src/misc/gearbox/gearbox_Up_dc.vhdl @@ -0,0 +1,151 @@ +-- ============================================================================= +-- Authors: Patrick Lehmann +-- +-- Entity: An upscaling gearbox module with a dependent clock (dc) interface. +-- +-- Description: +-- ------------------------------------- +-- This module provides a upscaling gearbox with a dependent clock (dc) +-- interface. It perfoems a 'byte' to 'word' collection. The default order is +-- LITTLE_ENDIAN (starting at byte(0)). Input "In_Data" is of clock domain +-- "Clock1"; output "Out_Data" is of clock domain "Clock2". The "In_Align" +-- is required to mark the starting byte in the word. An optional input +-- register can be added by enabling (ADD_INPUT_REGISTERS = TRUE). +-- +-- Assertions: +-- =========== +-- - Clock periods of Clock1 and Clock2 MUST be multiples of each other. +-- - Clock1 and Clock2 MUST be phase aligned (related) to each other. +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.utils.all; +use work.components.all; + + +entity gearbox_Up_dc is + generic ( + INPUT_BITS : positive := 8; -- input bit width + INPUT_ORDER : T_BIT_ORDER := LSB_FIRST; -- LSB_FIRST: start at byte(0), MSB_FIRST: start at byte(n-1) + OUTPUT_BITS : positive := 32; -- output bit width + ADD_INPUT_REGISTERS : boolean := FALSE -- add input register @Clock1 + ); + port ( + Clock1 : in std_logic; -- input clock domain + Clock2 : in std_logic; -- output clock domain + In_Align : in std_logic; -- align word (one cycle high impulse) + In_Data : in std_logic_vector(INPUT_BITS - 1 downto 0); -- input word + Out_Data : out std_logic_vector(OUTPUT_BITS - 1 downto 0); -- output word + Out_Valid : out std_logic -- output is valid + ); +end entity; + + +architecture rtl of gearbox_Up_dc is + constant BIT_RATIO : REAL := real(OUTPUT_BITS) / real(INPUT_BITS); + + constant INPUT_CHUNKS : positive := integer(BIT_RATIO); + constant BITS_PER_CHUNK : positive := INPUT_BITS; + + constant COUNTER_MAX : positive := INPUT_CHUNKS - 1; + constant COUNTER_BITS : positive := log2ceil(COUNTER_MAX + 1); + + subtype T_CHUNK is std_logic_vector(BITS_PER_CHUNK - 1 downto 0); + type T_CHUNK_VECTOR is array(natural range <>) of T_CHUNK; + + -- convert chunk-vector to flatten vector + function to_slv(slvv : T_CHUNK_VECTOR) return std_logic_vector is + variable slv : std_logic_vector((slvv'length * BITS_PER_CHUNK) - 1 downto 0); + begin + for i in slvv'range loop + slv(((i + 1) * BITS_PER_CHUNK) - 1 downto i * BITS_PER_CHUNK) := slvv(i); + end loop; + return slv; + end function; + + signal Counter_us : unsigned(COUNTER_BITS - 1 downto 0) := (others => '0'); + signal Select_us : unsigned(COUNTER_BITS - 1 downto 0); + + signal In_Data_d : std_logic_vector(INPUT_BITS - 1 downto 0) := (others => '0'); + signal In_Align_d : std_logic; + signal Data_d : T_CHUNK_VECTOR(INPUT_CHUNKS - 2 downto 0) := (others => (others => '0')); + signal Collected : std_logic_vector(OUTPUT_BITS - 1 downto 0); + signal Collected_swapped : std_logic_vector(OUTPUT_BITS - 1 downto 0); + signal Collected_en : std_logic; + signal Collected_d : std_logic_vector(OUTPUT_BITS - 1 downto 0) := (others => '0'); + signal DataOut_d : std_logic_vector(OUTPUT_BITS - 1 downto 0) := (others => '0'); + + signal Valid_r : std_logic := '0'; + signal Valid_d : std_logic := '0'; +begin + assert (INPUT_BITS < OUTPUT_BITS) report "INPUT_BITS must be less than OUTPUT_BITS, otherwise it's no up-sizing gearbox." severity FAILURE; + + -- input register @Clock1 + In_Align_d <= In_Align when registered(Clock1, ADD_INPUT_REGISTERS); + In_Data_d <= In_Data when registered(Clock1, ADD_INPUT_REGISTERS); + + -- byte alignment counter @Clock1 + process(Clock1) + begin + if rising_edge(Clock1) then + if (In_Align_d = '1') then + Counter_us <= to_unsigned(1, Counter_us'length); + Valid_r <= '0'; + elsif (upcounter_equal(cnt => Counter_us, value => COUNTER_MAX) = '1') then + Counter_us <= to_unsigned(0, Counter_us'length); + Valid_r <= '1'; + else + Counter_us <= Counter_us + 1; + end if; + end if; + end process; + + Select_us <= mux(In_Align_d, Counter_us, (Counter_us'range => '0')); + + -- delay registers @Clock1 + process(Clock1) + begin + if rising_edge(Clock1) then + for j in 0 to INPUT_CHUNKS - 2 loop + if j = to_index(Select_us, COUNTER_MAX) then -- D-FF enable + Data_d(j) <= In_Data_d; + end if; + end loop; + end if; + end process; + + -- compose output word + Collected <= In_Data_d & to_slv(Data_d); + Collected_swapped <= ite((INPUT_ORDER = LSB_FIRST), Collected, swap(Collected, INPUT_BITS)); + + -- register collected signals again @Clock1 + Collected_en <= upcounter_equal(cnt => Select_us, value => COUNTER_MAX); + Collected_d <= ffdre(q => Collected_d, d => Collected_swapped, en => Collected_en) when rising_edge(Clock1); + + -- add output register @Clock2 + DataOut_d <= Collected_d when rising_edge(Clock2); + Valid_d <= Valid_r when rising_edge(Clock2); + Out_Data <= DataOut_d; + Out_Valid <= Valid_d; +end architecture; diff --git a/src/misc/gearbox/gearbox_down_cc.vhdl b/src/misc/gearbox/gearbox_down_cc.vhdl deleted file mode 100644 index 885dbdd4d..000000000 --- a/src/misc/gearbox/gearbox_down_cc.vhdl +++ /dev/null @@ -1,262 +0,0 @@ --- ============================================================================= --- Authors: Patrick Lehmann --- --- Entity: A downscaling gearbox module with a common clock (cc) interface. --- --- Description: --- ------------------------------------- --- This module provides a downscaling gearbox with a common clock (cc) --- interface. It perfoems a 'word' to 'byte' splitting. The default order is --- LITTLE_ENDIAN (starting at byte(0)). Input "In_Data" and output "Out_Data" --- are of the same clock domain "Clock". Optional input and output registers --- can be added by enabling (ADD_***PUT_REGISTERS = TRUE). --- --- License: --- ============================================================================= --- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -use work.math.all; -use work.utils.all; -use work.vectors.all; -use work.components.all; - - -entity gearbox_down_cc is - generic ( - INPUT_BITS : positive := 32; - OUTPUT_BITS : positive := 24; - META_BITS : natural := 0; - ADD_INPUT_REGISTERS : boolean := FALSE; - ADD_OUTPUT_REGISTERS : boolean := FALSE - ); - port ( - Clock : in std_logic; - - In_Sync : in std_logic; - In_Valid : in std_logic; - In_Next : out std_logic; - In_Data : in std_logic_vector(INPUT_BITS - 1 downto 0); - In_Meta : in std_logic_vector(META_BITS - 1 downto 0); - - Out_Sync : out std_logic; - Out_Valid : out std_logic; - Out_Data : out std_logic_vector(OUTPUT_BITS - 1 downto 0); - Out_Meta : out std_logic_vector(META_BITS - 1 downto 0); - Out_First : out std_logic; - Out_Last : out std_logic - ); -end entity; - - -architecture rtl of gearbox_down_cc is - constant C_VERBOSE : boolean := FALSE; --POC_VERBOSE; - - constant BITS_PER_CHUNK : positive := greatestCommonDivisor(INPUT_BITS, OUTPUT_BITS); - constant INPUT_CHUNKS : positive := INPUT_BITS / BITS_PER_CHUNK; - constant OUTPUT_CHUNKS : positive := OUTPUT_BITS / BITS_PER_CHUNK; - - subtype T_CHUNK is std_logic_vector(BITS_PER_CHUNK - 1 downto 0); - type T_CHUNK_VECTOR is array(natural range <>) of T_CHUNK; - - subtype T_MUX_INDEX is integer range 0 to INPUT_CHUNKS - 1; - type T_MUX_INPUT is record - Index : T_MUX_INDEX; - UseBuffer : boolean; - end record; - - type T_MUX_INPUT_LIST is array(natural range <>) of T_MUX_INPUT; - type T_MUX_INPUT_STRUCT is record - List : T_MUX_INPUT_LIST(0 to OUTPUT_CHUNKS - 1); - Reg_en : std_logic; - Nxt : std_logic; - First : std_logic; - Last : std_logic; - end record; - type T_MUX_DESCRIPTIONS is array(natural range <>) of T_MUX_INPUT_STRUCT; - - function genMuxDescription return T_MUX_DESCRIPTIONS is - variable DESC : T_MUX_DESCRIPTIONS(0 to INPUT_CHUNKS - 1); - variable UseBuffer : boolean; - variable k : T_MUX_INDEX; - begin - if C_VERBOSE then report "genMuxDescription: IC=" & integer'image(INPUT_CHUNKS) severity NOTE; end if; - - k := INPUT_CHUNKS - 1; - for i in 0 to INPUT_CHUNKS - 1 loop - if C_VERBOSE then report " i: " & integer'image(i) & " List:" severity NOTE; end if; - UseBuffer := TRUE; - for j in 0 to OUTPUT_CHUNKS - 1 loop - k := (k + 1) mod INPUT_CHUNKS; - UseBuffer := UseBuffer and (k /= 0); - DESC(i).List(j).Index := k; - DESC(i).List(j).UseBuffer := UseBuffer; - - if C_VERBOSE then report " j= " & integer'image(j) & " k=" & INTEGER'image(DESC(i).List(j).Index) severity NOTE; end if; - end loop; - DESC(i).Reg_en := to_sl(not UseBuffer); - DESC(i).Nxt := to_sl(k + OUTPUT_CHUNKS >= INPUT_CHUNKS); - DESC(i).First := to_sl(i = 0); - DESC(i).Last := to_sl(i = INPUT_CHUNKS - 1); - - if C_VERBOSE then report " en=" & std_logic'image(DESC(i).Reg_en) & " nxt=" & STD_LOGIC'image(DESC(i).Nxt) severity NOTE; end if; - end loop; - return DESC; - end function; - - constant MUX_INPUT_TRANSLATION : T_MUX_DESCRIPTIONS := genMuxDescription; - - -- create vector-vector from vector (4 bit) - function to_chunkv(slv : std_logic_vector) return T_CHUNK_VECTOR is - constant CHUNKS : positive := slv'length / BITS_PER_CHUNK; - variable Result : T_CHUNK_VECTOR(CHUNKS - 1 downto 0); - begin - if ((slv'length mod BITS_PER_CHUNK) /= 0) then report "to_chunkv: width mismatch - slv'length is no multiple of BITS_PER_CHUNK (slv'length=" & INTEGER'image(slv'length) & "; BITS_PER_CHUNK=" & INTEGER'image(BITS_PER_CHUNK) & ")" severity FAILURE; end if; - - for i in 0 to CHUNKS - 1 loop - Result(i) := slv(slv'low + ((i + 1) * BITS_PER_CHUNK) - 1 downto slv'low + (i * BITS_PER_CHUNK)); - end loop; - return Result; - end function; - - -- convert vector-vector to flatten vector - function to_slv(slvv : T_CHUNK_VECTOR) return std_logic_vector is - variable slv : std_logic_vector((slvv'length * BITS_PER_CHUNK) - 1 downto 0); - begin - for i in slvv'range loop - slv(((i + 1) * BITS_PER_CHUNK) - 1 downto (i * BITS_PER_CHUNK)) := slvv(i); - end loop; - return slv; - end function; - - signal In_Sync_d : std_logic := '0'; - signal In_Data_d : std_logic_vector(INPUT_BITS - 1 downto 0) := (others => '0'); - signal In_Meta_d : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); - signal In_Valid_d : std_logic := '0'; - - signal MuxSelect_rst : std_logic; - signal MuxSelect_en : std_logic; - signal MuxSelect_us : unsigned(log2ceilnz(INPUT_CHUNKS) - 1 downto 0) := (others => '0'); - signal MuxSelect_ov : std_logic; - - signal Nxt : std_logic; - signal AutoIncrement : std_logic; - - signal GearBoxInput : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); - signal GearBoxBuffer_en : std_logic; - signal GearBoxBuffer : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 1) := (others => (others => '0')); - signal GearBoxOutput : T_CHUNK_VECTOR(OUTPUT_CHUNKS - 1 downto 0); - - signal SyncOut : std_logic; - signal ValidOut : std_logic; - signal DataOut : std_logic_vector(OUTPUT_BITS - 1 downto 0); - signal MetaOut : std_logic_vector(META_BITS - 1 downto 0); - signal FirstOut : std_logic; - signal LastOut : std_logic; - - signal Out_Sync_d : std_logic := '0'; - signal Out_Valid_d : std_logic := '0'; - signal Out_Data_d : std_logic_vector(OUTPUT_BITS - 1 downto 0) := (others => '0'); - signal Out_Meta_d : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); - signal Out_First_d : std_logic := '0'; - signal Out_Last_d : std_logic := '0'; - -begin - assert (not C_VERBOSE) - report "gearbox_down_cc:" & LF & - " INPUT_BITS=" & integer'image(INPUT_BITS) & - " OUTPUT_BITS=" & integer'image(OUTPUT_BITS) & - " INPUT_CHUNKS=" & integer'image(INPUT_CHUNKS) & - " OUTPUT_CHUNKS=" & integer'image(OUTPUT_CHUNKS) & - " BITS_PER_CHUNK=" & integer'image(BITS_PER_CHUNK) - severity NOTE; - assert (INPUT_BITS > OUTPUT_BITS) report "OUTPUT_BITS must be less than INPUT_BITS, otherwise it's no down-sizing gearbox." severity FAILURE; - - In_Sync_d <= In_Sync;-- when registered(Clock, ADD_INPUT_REGISTERS); - In_Valid_d <= In_Valid when registered(Clock, ADD_INPUT_REGISTERS); - In_Data_d <= In_Data when registered(Clock, ADD_INPUT_REGISTERS); - In_Meta_d <= In_Meta when registered(Clock, ADD_INPUT_REGISTERS); - - GearBoxInput <= to_chunkv(In_Data_d(INPUT_BITS - 1 downto 0)); - GearBoxBuffer_en <= MUX_INPUT_TRANSLATION(to_index(MuxSelect_us, INPUT_CHUNKS)).Reg_en and In_Valid_d; - - process(Clock) - begin - if rising_edge(Clock) then - if (GearBoxBuffer_en = '1') then - GearBoxBuffer <= to_chunkv(In_Data_d(INPUT_BITS - 1 downto BITS_PER_CHUNK)); - end if; - end if; - end process; - - MuxSelect_rst <= In_Sync_d or MuxSelect_ov; - MuxSelect_en <= In_Valid_d or MuxSelect_ov or AutoIncrement; - MuxSelect_us <= upcounter_next(cnt => MuxSelect_us, rst => MuxSelect_rst, en => MuxSelect_en) when rising_edge(Clock); - MuxSelect_ov <= upcounter_equal(cnt => MuxSelect_us, value => (INPUT_CHUNKS - 1)); - - Nxt <= MUX_INPUT_TRANSLATION(to_index(MuxSelect_us, INPUT_CHUNKS)).Nxt; - AutoIncrement <= not Nxt; - - In_Next <= Nxt; - - -- generate gearbox multiplexer structure - genMux : for j in 0 to OUTPUT_CHUNKS - 1 generate - signal MuxInput : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); - begin - genMuxInputs : for i in 0 to INPUT_CHUNKS - 1 generate - assert (not C_VERBOSE) - report "i= " & integer'image(i) & " " & - "j= " & integer'image(j) & " " & - "-> idx= " & integer'image(MUX_INPUT_TRANSLATION(i).List(j).Index) & " " & - "-> useBuffer= " & boolean'image(MUX_INPUT_TRANSLATION(i).List(j).UseBuffer) & " " & - "-> Nxt= " & std_logic'image(MUX_INPUT_TRANSLATION(i).Nxt) - severity NOTE; - - connectToInput : if (MUX_INPUT_TRANSLATION(i).List(j).UseBuffer = FALSE) generate - MuxInput(i) <= GearBoxInput(MUX_INPUT_TRANSLATION(i).List(j).Index); - end generate; - connectToBuffer : if (MUX_INPUT_TRANSLATION(i).List(j).UseBuffer = TRUE) generate - MuxInput(i) <= GearBoxBuffer(MUX_INPUT_TRANSLATION(i).List(j).Index); - end generate; - end generate; - - GearBoxOutput(j) <= MuxInput(to_index(MuxSelect_us, INPUT_CHUNKS)); - end generate; - - SyncOut <= MuxSelect_ov; - ValidOut <= In_Valid_d or MuxSelect_ov or AutoIncrement; - DataOut <= to_slv(GearBoxOutput); - FirstOut <= MUX_INPUT_TRANSLATION(to_index(MuxSelect_us, INPUT_CHUNKS)).First; - LastOut <= MUX_INPUT_TRANSLATION(to_index(MuxSelect_us, INPUT_CHUNKS)).Last; - - Out_Sync_d <= SyncOut when registered(Clock, ADD_OUTPUT_REGISTERS); - Out_Valid_d <= ValidOut when registered(Clock, ADD_OUTPUT_REGISTERS); - Out_Data_d <= DataOut when registered(Clock, ADD_OUTPUT_REGISTERS); - Out_Meta_d <= MetaOut when registered(Clock, ADD_OUTPUT_REGISTERS); - Out_First_d <= FirstOut when registered(Clock, ADD_OUTPUT_REGISTERS); - Out_Last_d <= LastOut when registered(Clock, ADD_OUTPUT_REGISTERS); - - Out_Sync <= Out_Sync_d; - Out_Valid <= Out_Valid_d; - Out_Data <= Out_Data_d; - Out_Meta <= Out_Meta_d; - Out_First <= Out_First_d; - Out_Last <= Out_Last_d; -end architecture; diff --git a/src/misc/gearbox/gearbox_down_dc.vhdl b/src/misc/gearbox/gearbox_down_dc.vhdl deleted file mode 100644 index c84136097..000000000 --- a/src/misc/gearbox/gearbox_down_dc.vhdl +++ /dev/null @@ -1,108 +0,0 @@ --- ============================================================================= --- Authors: Patrick Lehmann --- --- Entity: A downscaling gearbox module with a dependent clock (dc) interface. --- --- Description: --- ------------------------------------- --- This module provides a downscaling gearbox with a dependent clock (dc) --- interface. It perfoems a 'word' to 'byte' splitting. The default order is --- LITTLE_ENDIAN (starting at byte(0)). Input "In_Data" is of clock domain --- "Clock1"; output "Out_Data" is of clock domain "Clock2". Optional input and --- output registers can be added by enabling (ADD_***PUT_REGISTERS = TRUE). --- --- Assertions: --- =========== --- - Clock periods of Clock1 and Clock2 MUST be multiples of each other. --- - Clock1 and Clock2 MUST be phase aligned (related) to each other. --- --- License: --- ============================================================================= --- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; - -use work.utils.all; -use work.components.all; - - -entity gearbox_down_dc is - generic ( - INPUT_BITS : positive := 32; -- input bits ('words') - OUTPUT_BITS : positive := 8; -- output bits ('byte') - OUTPUT_ORDER : T_BIT_ORDER := LSB_FIRST; -- LSB_FIRST: start at byte(0), MSB_FIRST: start at byte(n-1) - ADD_INPUT_REGISTERS : boolean := FALSE; -- add input register @Clock1 - ADD_OUTPUT_REGISTERS : boolean := FALSE -- add output register @Clock2 - ); - port ( - Clock1 : in std_logic; -- input clock domain - Clock2 : in std_logic; -- output clock domain - In_Data : in std_logic_vector(INPUT_BITS - 1 downto 0); -- input word - Out_Data : out std_logic_vector(OUTPUT_BITS - 1 downto 0) -- output word - ); -end entity; - - -architecture rtl of gearbox_down_dc is - constant BIT_RATIO : REAL := real(INPUT_BITS) / real(OUTPUT_BITS); - constant COUNTER_BITS : positive := log2ceil(integer(BIT_RATIO)); - - type T_MUX_INPUT is array (natural range <>) of std_logic_vector(OUTPUT_BITS - 1 downto 0); - - signal WordBoundary : std_logic := '0'; - signal WordBoundary_d : std_logic := '0'; - signal Align : std_logic; - - signal Data_d : std_logic_vector(INPUT_BITS - 1 downto 0) := (others => '0'); - signal DataIn : std_logic_vector(INPUT_BITS - 1 downto 0); - signal DataOut_d : std_logic_vector(OUTPUT_BITS - 1 downto 0) := (others => '0'); - signal MuxInput : T_MUX_INPUT(2**COUNTER_BITS - 1 downto 0); - signal MuxOutput : std_logic_vector(OUTPUT_BITS - 1 downto 0); - signal MuxCounter_us : unsigned(COUNTER_BITS - 1 downto 0) := (others => '0'); - signal MuxSelect_us : unsigned(COUNTER_BITS - 1 downto 0); - -begin - assert (INPUT_BITS > OUTPUT_BITS) report "OUTPUT_BITS must be less than INPUT_BITS, otherwise it's no down-sizing gearbox." severity FAILURE; - - -- input register @Clock1 - Data_d <= In_Data when registered(Clock1, ADD_INPUT_REGISTERS); - - -- switch byte order if neccessary - DataIn <= ite((OUTPUT_ORDER = LSB_FIRST), Data_d, swap(Data_d, OUTPUT_BITS)); - - -- selection multiplexer - genMuxInput : for j in 0 to (2 ** COUNTER_BITS) - 1 generate - MuxInput(j) <= DataIn(((j + 1) * OUTPUT_BITS) - 1 downto (j * OUTPUT_BITS)); - end generate; - - -- multiplexer control @Clock2 - MuxCounter_us <= upcounter_next(cnt => MuxCounter_us, rst => Align, INIT => 1) when rising_edge(Clock2); - MuxSelect_us <= mux(Align, MuxCounter_us, (MuxCounter_us'range => '0')); - MuxOutput <= MuxInput(to_index(MuxSelect_us)); - - -- word boundary T-FF @Clock1 and D-FF @Clock2 - WordBoundary <= not WordBoundary when rising_edge(Clock1); - WordBoundary_d <= WordBoundary when rising_edge(Clock2); - Align <= WordBoundary xor WordBoundary_d; - - -- add output register @Clock2 - DataOut_d <= MuxOutput when registered(Clock2, ADD_OUTPUT_REGISTERS); - Out_Data <= DataOut_d; -end architecture; diff --git a/src/misc/gearbox/gearbox_up_cc.vhdl b/src/misc/gearbox/gearbox_up_cc.vhdl deleted file mode 100644 index 53ddc35cd..000000000 --- a/src/misc/gearbox/gearbox_up_cc.vhdl +++ /dev/null @@ -1,325 +0,0 @@ --- ============================================================================= --- Authors: Patrick Lehmann --- --- Entity: A upscaling gearbox module with a commonc clock (cc) interface. --- --- Description: --- ------------------------------------- --- This module provides a downscaling gearbox with a common clock (cc) --- interface. It perfoems a 'byte' to 'word' collection. The default order is --- LITTLE_ENDIAN (starting at byte(0)). Input "In_Data" and output "Out_Data" --- are of the same clock domain "Clock". Optional input and output registers --- can be added by enabling (ADD_***PUT_REGISTERS = TRUE). --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -use work.math.all; -use work.utils.all; -use work.vectors.all; -use work.components.all; - - -entity gearbox_up_cc is - generic ( - INPUT_BITS : positive := 24; - OUTPUT_BITS : positive := 32; - META_BITS : natural := 0; - ADD_INPUT_REGISTERS : boolean := FALSE; - ADD_OUTPUT_REGISTERS : boolean := FALSE - ); - port ( - Clock : in std_logic; - - In_Sync : in std_logic; - In_Valid : in std_logic; - In_Data : in std_logic_vector(INPUT_BITS - 1 downto 0); - In_Meta : in std_logic_vector(META_BITS - 1 downto 0); - - Out_Sync : out std_logic; - Out_Valid : out std_logic; - Out_Data : out std_logic_vector(OUTPUT_BITS - 1 downto 0); - Out_Meta : out std_logic_vector(META_BITS - 1 downto 0); - Out_First : out std_logic; - Out_Last : out std_logic - ); -end entity; - - -architecture rtl of gearbox_up_cc is - constant C_VERBOSE : boolean := FALSE; --POC_VERBOSE; - - constant BITS_PER_CHUNK : positive := greatestCommonDivisor(INPUT_BITS, OUTPUT_BITS); - constant INPUT_CHUNKS : positive := INPUT_BITS / BITS_PER_CHUNK; - constant OUTPUT_CHUNKS : positive := OUTPUT_BITS / BITS_PER_CHUNK; - constant STAGES : positive := div_ceil(OUTPUT_CHUNKS, INPUT_CHUNKS); - - subtype T_CHUNK is std_logic_vector(BITS_PER_CHUNK - 1 downto 0); - type T_CHUNK_VECTOR is array(natural range <>) of T_CHUNK; - type T_BUFFER_MATRIX is array(natural range <>) of T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); - - subtype T_STAGE_INDEX is integer range 0 to STAGES; - subtype T_MUX_INDEX is integer range 0 to INPUT_CHUNKS - 1; - type T_MUX_INPUT is record - Index : T_MUX_INDEX; - Stage : T_STAGE_INDEX; - end record; - - type T_MUX_INPUT_LIST is array(natural range <>) of T_MUX_INPUT; - type T_MUX_DESCRIPTIONS is array(natural range <>) of T_MUX_INPUT_LIST(0 to OUTPUT_CHUNKS - 1); - - type T_COUNTER_STRUCT is record - First : std_logic; - Valid : std_logic; - Last : std_logic; - Reg_en : std_logic; - Reg_Stage : T_STAGE_INDEX; - end record; - type T_COUNTER_DESCRIPTIONS is array(natural range <>) of T_COUNTER_STRUCT; - - function genCounterDescription return T_COUNTER_DESCRIPTIONS is - variable First : std_logic; - variable DESC : T_COUNTER_DESCRIPTIONS(0 to OUTPUT_CHUNKS - 1); - begin - First := '1'; - - if C_VERBOSE then - report "genCounterDescription:" & - " INPUT_CHUNKS=" & integer'image(INPUT_CHUNKS) & - " OUTPUT_CHUNKS=" & integer'image(OUTPUT_CHUNKS) & - " STAGES=" & integer'image(STAGES) - severity NOTE; - end if; - for i in 0 to STAGES - 1 loop - DESC(i).Reg_en := to_sl(i /= (OUTPUT_CHUNKS - 1)); - DESC(i).Reg_Stage := i; - DESC(i).Valid := to_sl(i = (OUTPUT_CHUNKS - 1)); - DESC(i).First := First and DESC(i).Valid; - DESC(i).Last := to_sl(i = (OUTPUT_CHUNKS - 1)); - First := First and not DESC(i).First; - - if C_VERBOSE then - report " i: " & integer'image(i) & - " en=" & std_logic'image(DESC(i).Reg_en) & - " stg=" & integer'image(DESC(i).Reg_Stage) & - " vld=" & std_logic'image(DESC(i).Valid) - severity NOTE; - end if; - end loop; - if C_VERBOSE and (STAGES < OUTPUT_CHUNKS) then report "----------------------------------------" severity NOTE; end if; - for i in STAGES to OUTPUT_CHUNKS - 1 loop - DESC(i).Reg_en := to_sl(i /= (OUTPUT_CHUNKS - 1)); - DESC(i).Reg_Stage := i mod STAGES; - DESC(i).Valid := to_sl(((i mod STAGES) = 0) or (i = (OUTPUT_CHUNKS - 1))); - DESC(i).First := First and DESC(i).Valid; - DESC(i).Last := to_sl(i = (OUTPUT_CHUNKS - 1)); - First := First and not DESC(i).First; - - if C_VERBOSE then - report " i: " & integer'image(i) & - " en=" & std_logic'image(DESC(i).Reg_en) & - " stg=" & integer'image(DESC(i).Reg_Stage) & - " vld=" & std_logic'image(DESC(i).Valid) - severity NOTE; - end if; - end loop; - return DESC; - end function; - - function genMuxDescription return T_MUX_DESCRIPTIONS is - variable DESC : T_MUX_DESCRIPTIONS(0 to INPUT_CHUNKS - 1); - variable k : T_MUX_INDEX; - variable s : T_STAGE_INDEX; - begin - if C_VERBOSE then - report "genMuxDescription:" & - " INPUT_CHUNKS=" & integer'image(INPUT_CHUNKS) & - " OUTPUT_CHUNKS=" & integer'image(OUTPUT_CHUNKS) & - " STAGES=" & integer'image(STAGES) - severity NOTE; - end if; - k := INPUT_CHUNKS - 1; - for i in 0 to INPUT_CHUNKS - 1 loop - s := ite((i = 0), STAGES, 0); - if C_VERBOSE then report " Mux " & integer'image(i) severity NOTE; end if; - for j in 0 to OUTPUT_CHUNKS - 1 loop - s := ite(((k + 1) = INPUT_CHUNKS), (s + 1) mod (STAGES + 1), s); - k := (k + 1) mod INPUT_CHUNKS; - DESC(i)(j).Stage := s; - DESC(i)(j).Index := k; - if C_VERBOSE then - report " port: " & integer'image(j) & - " idx=" & integer'image(DESC(i)(j).Stage) & - " stg=" & integer'image(DESC(i)(j).Index) - severity NOTE; - end if; - end loop; - end loop; - - return DESC; - end function; - - constant COUNTER_TRANSLATION : T_COUNTER_DESCRIPTIONS := genCounterDescription; - constant MUX_INPUT_TRANSLATION : T_MUX_DESCRIPTIONS := genMuxDescription; - - -- create vector-vector from vector (4 bit) - function to_chunkv(slv : std_logic_vector) return T_CHUNK_VECTOR is - constant CHUNKS : positive := slv'length / BITS_PER_CHUNK; - variable Result : T_CHUNK_VECTOR(CHUNKS - 1 downto 0); - begin - if ((slv'length mod BITS_PER_CHUNK) /= 0) then report "to_chunkv: width mismatch - slv'length is no multiple of BITS_PER_CHUNK (slv'length=" & INTEGER'image(slv'length) & "; BITS_PER_CHUNK=" & INTEGER'image(BITS_PER_CHUNK) & ")" severity FAILURE; end if; - - for i in 0 to CHUNKS - 1 loop - Result(i) := slv(slv'low + ((i + 1) * BITS_PER_CHUNK) - 1 downto slv'low + (i * BITS_PER_CHUNK)); - end loop; - return Result; - end function; - - -- convert vector-vector to flatten vector - function to_slv(slvv : T_CHUNK_VECTOR) return std_logic_vector is - variable slv : std_logic_vector((slvv'length * BITS_PER_CHUNK) - 1 downto 0); - begin - for i in slvv'range loop - slv(((i + 1) * BITS_PER_CHUNK) - 1 downto (i * BITS_PER_CHUNK)) := slvv(i); - end loop; - return slv; - end function; - - signal In_Sync_d : std_logic := '0'; - signal In_Data_d : std_logic_vector(INPUT_BITS - 1 downto 0) := (others => '0'); - signal In_Meta_d : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); - signal In_Valid_d : std_logic := '0'; - - signal StageSelect_rst : std_logic; - signal StageSelect_en : std_logic; - signal StageSelect_us : unsigned(log2ceilnz(OUTPUT_CHUNKS) - 1 downto 0) := (others => '0'); - signal StageSelect_ov : std_logic; - - signal MuxSelect_rst : std_logic; - signal MuxSelect_en : std_logic; - signal MuxSelect_us : unsigned(log2ceilnz(INPUT_CHUNKS) - 1 downto 0) := (others => '0'); - signal MuxSelect_ov : std_logic; - - signal GearBoxInput : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); - signal GearBoxBuffer_en : std_logic; - signal GearBoxBuffer : T_BUFFER_MATRIX(STAGES - 1 downto 0) := (others => (others => (others => '0'))); - signal MetaBuffer : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); - signal GearBoxOutput : T_CHUNK_VECTOR(OUTPUT_CHUNKS - 1 downto 0); - - signal SyncOut : std_logic; - signal ValidOut : std_logic; - signal DataOut : std_logic_vector(OUTPUT_BITS - 1 downto 0); - signal MetaOut : std_logic_vector(META_BITS - 1 downto 0); - signal FirstOut : std_logic; - signal LastOut : std_logic; - - signal Out_Sync_d : std_logic := '0'; - signal Out_Valid_d : std_logic := '0'; - signal Out_Data_d : std_logic_vector(OUTPUT_BITS - 1 downto 0) := (others => '0'); - signal Out_Meta_d : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); - signal Out_First_d : std_logic := '0'; - signal Out_Last_d : std_logic := '0'; - -begin - assert (not C_VERBOSE) - report "gearbox_up_cc:" & LF & - " INPUT_BITS=" & integer'image(INPUT_BITS) & - " OUTPUT_BITS=" & integer'image(OUTPUT_BITS) & - " INPUT_CHUNKS=" & integer'image(INPUT_CHUNKS) & - " OUTPUT_CHUNKS=" & integer'image(OUTPUT_CHUNKS) & - " BITS_PER_CHUNK=" & integer'image(BITS_PER_CHUNK) - severity NOTE; - assert (INPUT_BITS < OUTPUT_BITS) report "INPUT_BITS must be less than OUTPUT_BITS, otherwise it's no up-sizing gearbox." severity FAILURE; - - In_Sync_d <= In_Sync;-- when registered(Clock, ADD_INPUT_REGISTERS); - In_Valid_d <= In_Valid when registered(Clock, ADD_INPUT_REGISTERS); - In_Data_d <= In_Data when registered(Clock, ADD_INPUT_REGISTERS); - In_Meta_d <= In_Meta when registered(Clock, ADD_INPUT_REGISTERS); - - GearBoxInput <= to_chunkv(In_Data_d); - GearBoxBuffer_en <= COUNTER_TRANSLATION(to_index(StageSelect_us, OUTPUT_CHUNKS - 1)).Reg_en and In_Valid_d and not In_Sync_d; - - process(Clock) - begin - if rising_edge(Clock) then - if (GearBoxBuffer_en = '1') then - GearBoxBuffer(COUNTER_TRANSLATION(to_index(StageSelect_us, OUTPUT_CHUNKS - 1)).Reg_Stage) <= to_chunkv(In_Data_d); - MetaBuffer <= In_Meta_d; - end if; - end if; - end process; - - StageSelect_rst <= In_Sync_d or (StageSelect_ov and In_Valid_d); - StageSelect_en <= In_Valid_d or (StageSelect_ov and In_Valid_d); - StageSelect_us <= upcounter_next(cnt => StageSelect_us, rst => StageSelect_rst, en => StageSelect_en) when rising_edge(Clock); - StageSelect_ov <= upcounter_equal(cnt => StageSelect_us, value => (OUTPUT_CHUNKS - 1)); - - MuxSelect_rst <= (StageSelect_ov and MuxSelect_ov and In_Valid_d) or In_Sync_d; - MuxSelect_en <= COUNTER_TRANSLATION(to_index(StageSelect_us, OUTPUT_CHUNKS - 1)).Valid and In_Valid_d; - MuxSelect_us <= upcounter_next(cnt => MuxSelect_us, rst => MuxSelect_rst, en => MuxSelect_en) when rising_edge(Clock); - MuxSelect_ov <= upcounter_equal(cnt => MuxSelect_us, value => (INPUT_CHUNKS - 1)); - - -- generate gearbox multiplexer structure - genMux : for j in 0 to OUTPUT_CHUNKS - 1 generate - signal MuxInput : T_CHUNK_VECTOR(OUTPUT_CHUNKS - 1 downto 0); - begin - genMuxInputs : for i in 0 to INPUT_CHUNKS - 1 generate - -- assert (not C_VERBOSE) - -- report "mux = " & INTEGER'image(j) & " " & - -- "port = " & INTEGER'image(i) & " " & - -- "-> idx= " & INTEGER'image(MUX_INPUT_TRANSLATION(i)(j).Index) & " " & - -- "-> stg= " & INTEGER'image(MUX_INPUT_TRANSLATION(i)(j).Stage) & " " & - -- "-> Vld= " & STD_LOGIC'image(COUNTER_TRANSLATION(i).Valid) - -- severity NOTE; - - connectToInput : if (MUX_INPUT_TRANSLATION(i)(j).Stage = STAGES) generate - MuxInput(i) <= GearBoxInput(MUX_INPUT_TRANSLATION(i)(j).Index); - end generate; - connectToBuffer : if (MUX_INPUT_TRANSLATION(i)(j).Stage /= STAGES) generate - MuxInput(i) <= GearBoxBuffer(MUX_INPUT_TRANSLATION(i)(j).Stage)(MUX_INPUT_TRANSLATION(i)(j).Index); - end generate; - end generate; - - GearBoxOutput(j) <= MuxInput(to_index(MuxSelect_us, OUTPUT_CHUNKS - 1)); - end generate; - - ValidOut <= COUNTER_TRANSLATION(to_index(StageSelect_us, OUTPUT_CHUNKS - 1)).Valid and In_Valid_d; - SyncOut <= not COUNTER_TRANSLATION(to_index(StageSelect_us, OUTPUT_CHUNKS - 1)).Reg_en and ValidOut; - DataOut <= to_slv(GearBoxOutput); - MetaOut <= MetaBuffer; - FirstOut <= COUNTER_TRANSLATION(to_index(StageSelect_us, OUTPUT_CHUNKS - 1)).First; - LastOut <= COUNTER_TRANSLATION(to_index(StageSelect_us, OUTPUT_CHUNKS - 1)).Last; - - Out_Sync_d <= SyncOut when registered(Clock, ADD_OUTPUT_REGISTERS); - Out_Valid_d <= ValidOut when registered(Clock, ADD_OUTPUT_REGISTERS); - Out_Data_d <= DataOut when registered(Clock, ADD_OUTPUT_REGISTERS); - Out_Meta_d <= MetaOut when registered(Clock, ADD_OUTPUT_REGISTERS); - Out_First_d <= FirstOut when registered(Clock, ADD_OUTPUT_REGISTERS); - Out_Last_d <= LastOut when registered(Clock, ADD_OUTPUT_REGISTERS); - - Out_Sync <= Out_Sync_d; - Out_Valid <= Out_Valid_d; - Out_Data <= Out_Data_d; - Out_Meta <= Out_Meta_d; - Out_First <= Out_First_d; - Out_Last <= Out_Last_d; -end architecture; diff --git a/src/misc/gearbox/gearbox_up_dc.vhdl b/src/misc/gearbox/gearbox_up_dc.vhdl deleted file mode 100644 index 27a4fe706..000000000 --- a/src/misc/gearbox/gearbox_up_dc.vhdl +++ /dev/null @@ -1,151 +0,0 @@ --- ============================================================================= --- Authors: Patrick Lehmann --- --- Entity: An upscaling gearbox module with a dependent clock (dc) interface. --- --- Description: --- ------------------------------------- --- This module provides a upscaling gearbox with a dependent clock (dc) --- interface. It perfoems a 'byte' to 'word' collection. The default order is --- LITTLE_ENDIAN (starting at byte(0)). Input "In_Data" is of clock domain --- "Clock1"; output "Out_Data" is of clock domain "Clock2". The "In_Align" --- is required to mark the starting byte in the word. An optional input --- register can be added by enabling (ADD_INPUT_REGISTERS = TRUE). --- --- Assertions: --- =========== --- - Clock periods of Clock1 and Clock2 MUST be multiples of each other. --- - Clock1 and Clock2 MUST be phase aligned (related) to each other. --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; - -use work.utils.all; -use work.components.all; - - -entity gearbox_up_dc is - generic ( - INPUT_BITS : positive := 8; -- input bit width - INPUT_ORDER : T_BIT_ORDER := LSB_FIRST; -- LSB_FIRST: start at byte(0), MSB_FIRST: start at byte(n-1) - OUTPUT_BITS : positive := 32; -- output bit width - ADD_INPUT_REGISTERS : boolean := FALSE -- add input register @Clock1 - ); - port ( - Clock1 : in std_logic; -- input clock domain - Clock2 : in std_logic; -- output clock domain - In_Align : in std_logic; -- align word (one cycle high impulse) - In_Data : in std_logic_vector(INPUT_BITS - 1 downto 0); -- input word - Out_Data : out std_logic_vector(OUTPUT_BITS - 1 downto 0); -- output word - Out_Valid : out std_logic -- output is valid - ); -end entity; - - -architecture rtl of gearbox_up_dc is - constant BIT_RATIO : REAL := real(OUTPUT_BITS) / real(INPUT_BITS); - - constant INPUT_CHUNKS : positive := integer(BIT_RATIO); - constant BITS_PER_CHUNK : positive := INPUT_BITS; - - constant COUNTER_MAX : positive := INPUT_CHUNKS - 1; - constant COUNTER_BITS : positive := log2ceil(COUNTER_MAX + 1); - - subtype T_CHUNK is std_logic_vector(BITS_PER_CHUNK - 1 downto 0); - type T_CHUNK_VECTOR is array(natural range <>) of T_CHUNK; - - -- convert chunk-vector to flatten vector - function to_slv(slvv : T_CHUNK_VECTOR) return std_logic_vector is - variable slv : std_logic_vector((slvv'length * BITS_PER_CHUNK) - 1 downto 0); - begin - for i in slvv'range loop - slv(((i + 1) * BITS_PER_CHUNK) - 1 downto i * BITS_PER_CHUNK) := slvv(i); - end loop; - return slv; - end function; - - signal Counter_us : unsigned(COUNTER_BITS - 1 downto 0) := (others => '0'); - signal Select_us : unsigned(COUNTER_BITS - 1 downto 0); - - signal In_Data_d : std_logic_vector(INPUT_BITS - 1 downto 0) := (others => '0'); - signal In_Align_d : std_logic; - signal Data_d : T_CHUNK_VECTOR(INPUT_CHUNKS - 2 downto 0) := (others => (others => '0')); - signal Collected : std_logic_vector(OUTPUT_BITS - 1 downto 0); - signal Collected_swapped : std_logic_vector(OUTPUT_BITS - 1 downto 0); - signal Collected_en : std_logic; - signal Collected_d : std_logic_vector(OUTPUT_BITS - 1 downto 0) := (others => '0'); - signal DataOut_d : std_logic_vector(OUTPUT_BITS - 1 downto 0) := (others => '0'); - - signal Valid_r : std_logic := '0'; - signal Valid_d : std_logic := '0'; -begin - assert (INPUT_BITS < OUTPUT_BITS) report "INPUT_BITS must be less than OUTPUT_BITS, otherwise it's no up-sizing gearbox." severity FAILURE; - - -- input register @Clock1 - In_Align_d <= In_Align when registered(Clock1, ADD_INPUT_REGISTERS); - In_Data_d <= In_Data when registered(Clock1, ADD_INPUT_REGISTERS); - - -- byte alignment counter @Clock1 - process(Clock1) - begin - if rising_edge(Clock1) then - if (In_Align_d = '1') then - Counter_us <= to_unsigned(1, Counter_us'length); - Valid_r <= '0'; - elsif (upcounter_equal(cnt => Counter_us, value => COUNTER_MAX) = '1') then - Counter_us <= to_unsigned(0, Counter_us'length); - Valid_r <= '1'; - else - Counter_us <= Counter_us + 1; - end if; - end if; - end process; - - Select_us <= mux(In_Align_d, Counter_us, (Counter_us'range => '0')); - - -- delay registers @Clock1 - process(Clock1) - begin - if rising_edge(Clock1) then - for j in 0 to INPUT_CHUNKS - 2 loop - if j = to_index(Select_us, COUNTER_MAX) then -- D-FF enable - Data_d(j) <= In_Data_d; - end if; - end loop; - end if; - end process; - - -- compose output word - Collected <= In_Data_d & to_slv(Data_d); - Collected_swapped <= ite((INPUT_ORDER = LSB_FIRST), Collected, swap(Collected, INPUT_BITS)); - - -- register collected signals again @Clock1 - Collected_en <= upcounter_equal(cnt => Select_us, value => COUNTER_MAX); - Collected_d <= ffdre(q => Collected_d, d => Collected_swapped, en => Collected_en) when rising_edge(Clock1); - - -- add output register @Clock2 - DataOut_d <= Collected_d when rising_edge(Clock2); - Valid_d <= Valid_r when rising_edge(Clock2); - Out_Data <= DataOut_d; - Out_Valid <= Valid_d; -end architecture; diff --git a/src/misc/misc_Delay.vhdl b/src/misc/misc_Delay.vhdl index 0fa21a2d2..074de17eb 100644 --- a/src/misc/misc_Delay.vhdl +++ b/src/misc/misc_Delay.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -25,7 +25,7 @@ -- limitations under the License. -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; +use IEEE.std_logic_1164.all; use work.utils.all; use work.vectors.all; @@ -33,38 +33,38 @@ use work.vectors.all; entity misc_Delay is generic ( - BITS : positive; - TAPS : T_NATVEC -- select one or multiple delay tap points + BITS : positive; + TAPS : natural_vector -- select one or multiple delay tap points ); port ( - Clock : in std_logic; -- clock - Reset : in std_logic := '0'; -- reset; avoid reset to enable SRL16/SRL32 usage - Enable : in std_logic := '1'; -- enable - DataIn : in std_logic_vector(BITS - 1 downto 0); -- data to delay - DataOut : out T_SLM(TAPS'length - 1 downto 0, BITS - 1 downto 0) -- delayed ouputs, tapped at TAPS(i) + Clock : in std_logic; -- clock + Reset : in std_logic := '0'; -- reset; avoid reset to enable SRL16/SRL32 usage + Enable : in std_logic := '1'; -- enable + DataIn : in std_logic_vector(BITS - 1 downto 0); -- data to delay + DataOut : out T_SLM(TAPS'length - 1 downto 0, BITS - 1 downto 0) -- delayed ouputs, tapped at TAPS(i) ); end entity; architecture rtl of misc_Delay is - constant MAX_DELAY : natural := imax(TAPS); + constant MAX_DELAY : natural := imax(TAPS); - type T_DELAY_VECTOR is array (natural range <>) of std_logic_vector(BITS - 1 downto 0); + type T_DELAY_VECTOR is array (natural range <>) of std_logic_vector(BITS - 1 downto 0); - signal Shifter_nxt : T_DELAY_VECTOR(MAX_DELAY downto 0); - signal Shifter_d : T_DELAY_VECTOR(MAX_DELAY - 1 downto 0) := (others => (others => '0')); - signal DataOut_i : T_SLM(TAPS'length - 1 downto 0, BITS - 1 downto 0) := (others => (others => 'Z')); + signal Shifter_nxt : T_DELAY_VECTOR(MAX_DELAY downto 0); + signal Shifter_d : T_DELAY_VECTOR(MAX_DELAY - 1 downto 0) := (others => (others => '0')); + signal DataOut_i : T_SLM(TAPS'length - 1 downto 0, BITS - 1 downto 0) := (others => (others => 'Z')); begin - Shifter_nxt <= Shifter_d & DataIn; + Shifter_nxt <= Shifter_d & DataIn; process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - Shifter_d <= (others => (others => '0')); + Shifter_d <= (others => (others => '0')); elsif (Enable = '1') then - Shifter_d <= Shifter_nxt(Shifter_d'range); + Shifter_d <= Shifter_nxt(Shifter_d'range); end if; end if; end process; @@ -73,5 +73,5 @@ begin assign_row(DataOut_i, Shifter_nxt(TAPS(i)), i); end generate; - DataOut <= DataOut_i; -end; + DataOut <= DataOut_i; +end architecture; diff --git a/src/misc/misc_FrequencyMeasurement.vhdl b/src/misc/misc_FrequencyMeasurement.vhdl index 393086bfa..2f5aa1cc2 100644 --- a/src/misc/misc_FrequencyMeasurement.vhdl +++ b/src/misc/misc_FrequencyMeasurement.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: measures a input frequency relativ to a reference frequency +-- Entity: measures a input frequency relativ to a reference frequency -- -- Description: -- ------------------------------------- @@ -12,13 +12,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -28,8 +28,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; @@ -39,90 +39,90 @@ use work.components.all; entity misc_FrequencyMeasurement is generic ( - REFERENCE_CLOCK_FREQ : FREQ := 100 MHz + REFERENCE_CLOCK_FREQ : FREQ := 100 MHz ); port ( - Reference_Clock : in std_logic; - Input_Clock : in std_logic; + Reference_Clock : in std_logic; + Input_Clock : in std_logic; - Start : in std_logic; - Done : out std_logic; - Result : out T_SLV_32 + Start : in std_logic; + Done : out std_logic; + Result : out T_SLV_32 ); end entity; architecture rtl of misc_FrequencyMeasurement is - constant TIMEBASE_COUNTER_MAX : positive := TimingToCycles(ite(SIMULATION, 10.0e-6, 1.0), REFERENCE_CLOCK_FREQ); - constant TIMEBASE_COUNTER_BITS : positive := log2ceilnz(TIMEBASE_COUNTER_MAX); - - signal TimeBase_Counter_rst : std_logic; - signal TimeBase_Counter_s : signed(TIMEBASE_COUNTER_BITS downto 0) := to_signed(-1, TIMEBASE_COUNTER_BITS + 1); - signal TimeBase_Counter_nxt : signed(TIMEBASE_COUNTER_BITS downto 0); - signal TimeBase_Counter_uf : std_logic; - - signal Stop : std_logic; - signal sync_Start : std_logic; - signal sync_Stop : std_logic; - signal sync1_Busy : T_SLV_2; - - signal Frequency_Counter_en_r : std_logic := '0'; - signal Frequency_Counter_us : unsigned(31 downto 0) := (others => '0'); - - signal CaptureResult : std_logic; - signal CaptureResult_d : std_logic := '0'; - signal Result_en : std_logic; - signal Result_d : T_SLV_32 := (others => '0'); - signal Done_r : std_logic := '0'; + constant TIMEBASE_COUNTER_MAX : positive := TimingToCycles(ite(SIMULATION, 10.0e-6, 1.0), REFERENCE_CLOCK_FREQ); + constant TIMEBASE_COUNTER_BITS : positive := log2ceilnz(TIMEBASE_COUNTER_MAX); + + signal TimeBase_Counter_rst : std_logic; + signal TimeBase_Counter_s : signed(TIMEBASE_COUNTER_BITS downto 0) := to_signed(-1, TIMEBASE_COUNTER_BITS + 1); + signal TimeBase_Counter_nxt : signed(TIMEBASE_COUNTER_BITS downto 0); + signal TimeBase_Counter_uf : std_logic; + + signal Stop : std_logic; + signal sync_Start : std_logic; + signal sync_Stop : std_logic; + signal sync1_Busy : T_SLV_2; + + signal Frequency_Counter_en_r : std_logic := '0'; + signal Frequency_Counter_us : unsigned(31 downto 0) := (others => '0'); + + signal CaptureResult : std_logic; + signal CaptureResult_d : std_logic := '0'; + signal Result_en : std_logic; + signal Result_d : T_SLV_32 := (others => '0'); + signal Done_r : std_logic := '0'; begin - TimeBase_Counter_rst <= Start; - TimeBase_Counter_nxt <= TimeBase_Counter_s - 1; + TimeBase_Counter_rst <= Start; + TimeBase_Counter_nxt <= TimeBase_Counter_s - 1; process(Reference_Clock) begin if rising_edge(Reference_Clock) then if (TimeBase_Counter_rst = '1') then - TimeBase_Counter_s <= to_signed(TIMEBASE_COUNTER_MAX - 2, TimeBase_Counter_s'length); + TimeBase_Counter_s <= to_signed(TIMEBASE_COUNTER_MAX - 2, TimeBase_Counter_s'length); elsif (TimeBase_Counter_uf = '0') then - TimeBase_Counter_s <= TimeBase_Counter_nxt; + TimeBase_Counter_s <= TimeBase_Counter_nxt; end if; end if; end process; - TimeBase_Counter_uf <= TimeBase_Counter_s(TimeBase_Counter_s'high); - Stop <= not TimeBase_Counter_s(TimeBase_Counter_s'high) and TimeBase_Counter_nxt(TimeBase_Counter_nxt'high); + TimeBase_Counter_uf <= TimeBase_Counter_s(TimeBase_Counter_s'high); + Stop <= not TimeBase_Counter_s(TimeBase_Counter_s'high) and TimeBase_Counter_nxt(TimeBase_Counter_nxt'high); sync1: entity work.sync_Strobe generic map ( - BITS => 2 -- number of bit to be synchronized + BITS => 2 -- number of bit to be synchronized ) port map ( - Clock1 => Reference_Clock, -- input clock - Clock2 => Input_Clock, -- output clock - Input(0) => Start, -- @Clock1 input vector - Input(1) => Stop, -- - Output(0) => sync_Start, -- @Clock2: output vector - Output(1) => sync_Stop, -- - Busy => sync1_Busy + Clock1 => Reference_Clock, -- input clock + Clock2 => Input_Clock, -- output clock + Input(0) => Start, -- @Clock1 input vector + Input(1) => Stop, -- + Output(0) => sync_Start, -- @Clock2: output vector + Output(1) => sync_Stop, -- + Busy => sync1_Busy ); - Frequency_Counter_en_r <= ffrs(q => Frequency_Counter_en_r, set => sync_Start, rst => sync_Stop) when rising_edge(Input_Clock); + Frequency_Counter_en_r <= ffrs(q => Frequency_Counter_en_r, set => sync_Start, rst => sync_Stop) when rising_edge(Input_Clock); process(Input_Clock) begin if rising_edge(Input_Clock) then if (sync_Start = '1') then - Frequency_Counter_us <= to_unsigned(1, Frequency_Counter_us'length); + Frequency_Counter_us <= to_unsigned(1, Frequency_Counter_us'length); elsif (Frequency_Counter_en_r = '1') then - Frequency_Counter_us <= Frequency_Counter_us + 1; + Frequency_Counter_us <= Frequency_Counter_us + 1; end if; end if; end process; - CaptureResult <= sync1_Busy(1); - CaptureResult_d <= CaptureResult when rising_edge(Reference_Clock); - Result_en <= CaptureResult_d and not CaptureResult; + CaptureResult <= sync1_Busy(1); + CaptureResult_d <= CaptureResult when rising_edge(Reference_Clock); + Result_en <= CaptureResult_d and not CaptureResult; -- Result_d can becaptured from Frequency_Counter_us, because it's stable -- for more than one clock cycle and will not change until the next Start @@ -130,14 +130,14 @@ begin begin if rising_edge(Reference_Clock) then if (Result_en = '1') then - Result_d <= std_logic_vector(Frequency_Counter_us); - Done_r <= '1'; + Result_d <= std_logic_vector(Frequency_Counter_us); + Done_r <= '1'; elsif (Start = '1') then - Done_r <= '0'; + Done_r <= '0'; end if; end if; end process; - Done <= Done_r; - Result <= Result_d; -end; + Done <= Done_r; + Result <= Result_d; +end architecture; diff --git a/src/misc/misc_Sequencer.vhdl b/src/misc/misc_Sequencer.vhdl index 4b961430c..bf03f145d 100644 --- a/src/misc/misc_Sequencer.vhdl +++ b/src/misc/misc_Sequencer.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================ -- Module: misc_Sequencer -- @@ -51,7 +47,7 @@ ENTITY misc_Sequencer IS nxt : IN STD_LOGIC; Output : OUT STD_LOGIC_VECTOR(OUTPUT_BITS - 1 DOWNTO 0) ); -END; +end entity; ARCHITECTURE rtl OF misc_Sequencer IS diff --git a/src/misc/misc_StrobeGenerator.vhdl b/src/misc/misc_StrobeGenerator.vhdl index 5a5f3cc44..725061513 100644 --- a/src/misc/misc_StrobeGenerator.vhdl +++ b/src/misc/misc_StrobeGenerator.vhdl @@ -26,14 +26,14 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.components.all; - +-- XXX: how does it relate to arith_Counter_Free? entity misc_StrobeGenerator is generic ( COUNTER_BITS : positive := 16; diff --git a/src/misc/misc_StrobeLimiter.vhdl b/src/misc/misc_StrobeLimiter.vhdl index 1d0dbc608..135899608 100644 --- a/src/misc/misc_StrobeLimiter.vhdl +++ b/src/misc/misc_StrobeLimiter.vhdl @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; @@ -64,7 +64,7 @@ architecture rtl of misc_StrobeLimiter is else return ST_IDLE; end if; - end; + end function; signal State : T_STATE := InitialState(INITIAL_LOCKED, INITIAL_STROBE); signal NextState : T_STATE; @@ -145,4 +145,4 @@ begin Counter_ov <= Counter_s(Counter_s'high); -end; +end architecture; diff --git a/src/misc/misc_StrobeStretcher.vhdl b/src/misc/misc_StrobeStretcher.vhdl index ed544e38d..e1d4cb389 100644 --- a/src/misc/misc_StrobeStretcher.vhdl +++ b/src/misc/misc_StrobeStretcher.vhdl @@ -27,8 +27,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; @@ -73,6 +73,6 @@ begin Counter_ov <= Counter_s(Counter_s'high); - Output(i) <= ffsr(q => Output(i), rst => Counter_ov, set => Input(i)) when rising_edge(Clock); + Output(i) <= ffsr(q => Output(i), rst => Counter_ov, set => Input(i)) when rising_edge(Clock); end generate; end architecture; diff --git a/src/misc/misc_bit_lz.vhdl b/src/misc/misc_bit_lz.vhdl index bf26496d1..a0c2861b2 100644 --- a/src/misc/misc_bit_lz.vhdl +++ b/src/misc/misc_bit_lz.vhdl @@ -61,190 +61,190 @@ -- Methoden und Anwendungen (FEES 2015), Oct, 2015. -- ============================================================================= library IEEE; -use IEEE.std_logic_1164.all; +use IEEE.std_logic_1164.all; entity misc_bit_lz is - generic( - COUNT_BITS : positive; - OFFSET_BITS : positive; - OUTPUT_REGS : boolean := true; -- Register all outputs - OPTIMIZE_SPEED : boolean := true -- Favor achievable clock over size - ); - port( - -- Global Control - clk : in std_logic; - rst : in std_logic; - - -- Data Input - din : in std_logic; - put : in std_logic; - flush : in std_logic; -- end of message, - -- to be asserted after last associated put - - -- Data Output - odat : out std_logic_vector(COUNT_BITS+OFFSET_BITS downto 0); - ostb : out std_logic - ); -end misc_bit_lz; + generic( + COUNT_BITS : positive; + OFFSET_BITS : positive; + OUTPUT_REGS : boolean := true; -- Register all outputs + OPTIMIZE_SPEED : boolean := true -- Favor achievable clock over size + ); + port( + -- Global Control + Clock : in std_logic; + Reset : in std_logic; + + -- Data Input + DataIn : in std_logic; + Put : in std_logic; + Flush : in std_logic; -- end of message, + -- to be asserted after last associated put + + -- Data Output + DataOut : out std_logic_vector(COUNT_BITS+OFFSET_BITS downto 0); + Strobe : out std_logic + ); +end entity; library IEEE; -use IEEE.numeric_std.all; +use IEEE.numeric_std.all; architecture rtl of misc_bit_lz is - constant HISTORY_SIZE : positive := 2**OFFSET_BITS; - constant LITERAL_LEN : positive := COUNT_BITS + OFFSET_BITS; + constant HISTORY_SIZE : positive := 2**OFFSET_BITS; + constant LITERAL_LEN : positive := COUNT_BITS + OFFSET_BITS; - -- History and Match Buffers - signal History : std_logic_vector(HISTORY_SIZE downto 0) := (others => '0'); - signal Match : std_logic_vector(HISTORY_SIZE-1 downto 0) := (others => '1'); + -- History and Match Buffers + signal History : std_logic_vector(HISTORY_SIZE downto 0) := (others => '0'); + signal Match : std_logic_vector(HISTORY_SIZE-1 downto 0) := (others => '1'); - signal Count : signed(COUNT_BITS downto 0) := to_signed(-LITERAL_LEN-1, 1+COUNT_BITS); - signal Offset : unsigned(OFFSET_BITS-1 downto 0) := (others => '-'); - signal Term : std_logic := '0'; + signal Count : signed(COUNT_BITS downto 0) := to_signed(-LITERAL_LEN-1, 1+COUNT_BITS); + signal Offset : unsigned(OFFSET_BITS-1 downto 0) := (others => '-'); + signal Term : std_logic := '0'; - signal Offset_nxt : unsigned(Offset'range); - signal ov : X01; -- Counter Overflow - signal valid : X01; -- Still some Match available + signal Offset_nxt : unsigned(Offset'range); + signal ov : X01; -- Counter Overflow + signal valid : X01; -- Still some Match available - -- Outputs - signal data : std_logic_vector(odat'range); - signal push : std_logic; + -- Outputs + signal data : std_logic_vector(DataOut'range); + signal push : std_logic; begin - assert COUNT_BITS <= OFFSET_BITS - report "Requiring: COUNT_BITS <= OFFSET_BITS" - severity failure; - assert LITERAL_LEN < 2**COUNT_BITS - report "Requiring: COUNT_BITS + OFFSET_BITS < 2**COUNT_BITS" - severity failure; - - -- Registers - process(clk) - variable Count_nxt : signed(Count'range); - variable Match_nxt : std_logic_vector(Match'range); - begin - if rising_edge(clk) then - if rst = '1' or Term = '1' then - History <= (others => '0'); - Match <= (others => '1'); - Count <= to_signed(-LITERAL_LEN-1, Count'length); - Offset <= (others => '-'); - Term <= '0'; - elsif flush = '1' then - History <= (others => '-'); - Match <= (others => '-'); + assert COUNT_BITS <= OFFSET_BITS + report "Requiring: COUNT_BITS <= OFFSET_BITS" + severity failure; + assert LITERAL_LEN < 2**COUNT_BITS + report "Requiring: COUNT_BITS + OFFSET_BITS < 2**COUNT_BITS" + severity failure; + + -- Registers + process(Clock) + variable Count_nxt : signed(Count'range); + variable Match_nxt : std_logic_vector(Match'range); + begin + if rising_edge(Clock) then + if Reset = '1' or Term = '1' then + History <= (others => '0'); + Match <= (others => '1'); + Count <= to_signed(-LITERAL_LEN-1, Count'length); + Offset <= (others => '-'); + Term <= '0'; + elsif Flush = '1' then + History <= (others => '-'); + Match <= (others => '-'); Count <= (others => '1'); -- End Marker Count(Count'left) <= '0'; -- Output Format Selector - if Count(Count'left) = '0' then + if Count(Count'left) = '0' then Offset <= (others => '0'); - Offset(0) <= History(0); - else + Offset(0) <= History(0); + else Offset <= (others => '1'); -- Sign Extension - Offset(Count'left-1 downto 0) <= unsigned(Count(Count'left-1 downto 0)); - end if; - Term <= '1'; - else - - -- Check for an output condition - if push = '0' then - Match_nxt := Match; - Count_nxt := Count; - Offset <= Offset_nxt; - else - case ov is - when '0' => - Count_nxt := to_signed(-LITERAL_LEN-1, Count'length); - Match_nxt := (others => '1'); - when '1' => - Count_nxt := to_signed(-LITERAL_LEN, Count'length); - Match_nxt := History(History'left downto 1) xnor (Match'range => History(0)); - when 'X' => - Count_nxt := (others => 'X'); - Match_nxt := (others => 'X'); - end case; - - Offset <= (others => '-'); - end if; - - -- Check for an input condition - if put = '1' then - -- Shift input into History Buffer - History <= History(History'left-1 downto 0) & din; - - -- Update Match vector and Count - Match_nxt := Match_nxt and (History(Match'range) xnor (Match'range => din)); - Count_nxt := Count_nxt + 1; - end if; - - Match <= Match_nxt; - Count <= Count_nxt; - - end if; -- rst /= '1' - end if; -- rising_edge(clk) - - end process; - - genPlain: if OPTIMIZE_SPEED generate - process(Match) - begin - Offset_nxt <= (others => '-'); - for i in Match'range loop - if Match(i) = '1' then - Offset_nxt <= to_unsigned(i, Offset'length); - end if; - end loop; - end process; - end generate genPlain; - genArith: if not OPTIMIZE_SPEED generate - process(Match) - variable onehot : std_logic_vector(Match'range); - variable binary : unsigned(Offset'range); - begin - onehot := std_logic_vector(unsigned(not Match) + 1) and Match; - binary := (others => '0'); - for i in onehot'range loop - if onehot(i) = '1' then - binary := binary or to_unsigned(i, binary'length); - end if; - end loop; - Offset_nxt <= binary; - end process; - end generate genArith; - - -- Check for Counter Overflow - ov <= 'X' when Is_X(std_logic_vector(Count)) else - '1' when Count = 2**COUNT_BITS-2 else - '0'; - - -- Check if there is still some valid Match - valid <= '0' when Match = (Match'range => '0') else -- all '0' - 'X' when to_bitvector(std_ulogic_vector(Match)) = (Match'range => '0') else -- no '1' - '1'; -- some '1' - - -- Compute Outputs - data <= '1' & History(LITERAL_LEN-1 downto 0) when Count(Count'left) = '1' else -- literal - std_logic_vector(Count) & std_logic_vector(Offset); -- repetition - push <= '1' when flush = '1' or Term = '1' else - 'X' when Is_X(std_logic_vector(Count)) else - ov when ov /= '0' else - not valid when Count >= -1 else - '0'; - - genOutputComb: if not OUTPUT_REGS generate - odat <= data; - ostb <= push; - end generate; - genOutputRegs: if OUTPUT_REGS generate - process(clk) - begin - if rising_edge(clk) then - odat <= data; - ostb <= push; - end if; - end process; - end generate; - -end rtl; + Offset(Count'left-1 downto 0) <= unsigned(Count(Count'left-1 downto 0)); + end if; + Term <= '1'; + else + + -- Check for an output condition + if push = '0' then + Match_nxt := Match; + Count_nxt := Count; + Offset <= Offset_nxt; + else + case ov is + when '0' => + Count_nxt := to_signed(-LITERAL_LEN-1, Count'length); + Match_nxt := (others => '1'); + when '1' => + Count_nxt := to_signed(-LITERAL_LEN, Count'length); + Match_nxt := History(History'left downto 1) xnor (Match'range => History(0)); + when 'X' => + Count_nxt := (others => 'X'); + Match_nxt := (others => 'X'); + end case; + + Offset <= (others => '-'); + end if; + + -- Check for an input condition + if Put = '1' then + -- Shift input into History Buffer + History <= History(History'left-1 downto 0) & DataIn; + + -- Update Match vector and Count + Match_nxt := Match_nxt and (History(Match'range) xnor (Match'range => DataIn)); + Count_nxt := Count_nxt + 1; + end if; + + Match <= Match_nxt; + Count <= Count_nxt; + + end if; -- rst /= '1' + end if; -- rising_edge(clk) + + end process; + + genPlain: if OPTIMIZE_SPEED generate + process(Match) + begin + Offset_nxt <= (others => '-'); + for i in Match'range loop + if Match(i) = '1' then + Offset_nxt <= to_unsigned(i, Offset'length); + end if; + end loop; + end process; + end generate genPlain; + genArith: if not OPTIMIZE_SPEED generate + process(Match) + variable onehot : std_logic_vector(Match'range); + variable binary : unsigned(Offset'range); + begin + onehot := std_logic_vector(unsigned(not Match) + 1) and Match; + binary := (others => '0'); + for i in onehot'range loop + if onehot(i) = '1' then + binary := binary or to_unsigned(i, binary'length); + end if; + end loop; + Offset_nxt <= binary; + end process; + end generate genArith; + + -- Check for Counter Overflow + ov <= 'X' when Is_X(std_logic_vector(Count)) else + '1' when Count = 2**COUNT_BITS-2 else + '0'; + + -- Check if there is still some valid Match + valid <= '0' when Match = (Match'range => '0') else -- all '0' + 'X' when to_bitvector(std_ulogic_vector(Match)) = (Match'range => '0') else -- no '1' + '1'; -- some '1' + + -- Compute Outputs + data <= '1' & History(LITERAL_LEN-1 downto 0) when Count(Count'left) = '1' else -- literal + std_logic_vector(Count) & std_logic_vector(Offset); -- repetition + push <= '1' when Flush = '1' or Term = '1' else + 'X' when Is_X(std_logic_vector(Count)) else + ov when ov /= '0' else + not valid when Count >= -1 else + '0'; + + genOutputComb: if not OUTPUT_REGS generate + DataOut <= data; + Strobe <= push; + end generate; + genOutputRegs: if OUTPUT_REGS generate + process(Clock) + begin + if rising_edge(Clock) then + DataOut <= data; + Strobe <= push; + end if; + end process; + end generate; + +end architecture; diff --git a/src/misc/stat/stat.pro b/src/misc/stat/build.pro similarity index 90% rename from src/misc/stat/stat.pro rename to src/misc/stat/build.pro index 579491188..9b940ac01 100644 --- a/src/misc/stat/stat.pro +++ b/src/misc/stat/build.pro @@ -18,7 +18,10 @@ # limitations under the License. # ============================================================================= +disabled ./stat.pkg.vhdl analyze ./stat_Average.vhdl analyze ./stat_Histogram.vhdl +disabled ./stat_Histogram_man_boundary.vhdl analyze ./stat_Maximum.vhdl analyze ./stat_Minimum.vhdl +disabled ./stat_MinMaxCounter.vhdl diff --git a/src/misc/stat/stat_Average.vhdl b/src/misc/stat/stat_Average.vhdl index 6c834403b..1cf4a9838 100644 --- a/src/misc/stat/stat_Average.vhdl +++ b/src/misc/stat/stat_Average.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Computes the overall average value of all data words +-- Entity: Computes the overall average value of all data words -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -25,7 +25,7 @@ -- limitations under the License. -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; @@ -36,90 +36,90 @@ use work.arith.all; entity stat_Average is generic ( - DATA_BITS : positive := 8; - COUNTER_BITS : positive := 16 + DATA_BITS : positive := 8; + COUNTER_BITS : positive := 16 ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - Enable : in std_logic; - DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); + Enable : in std_logic; + DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); - Count : out std_logic_vector(COUNTER_BITS - 1 downto 0); - Sum : out std_logic_vector(COUNTER_BITS - 1 downto 0); - Average : out std_logic_vector(COUNTER_BITS - 1 downto 0); - Valid : out std_logic + Count : out std_logic_vector(COUNTER_BITS - 1 downto 0); + Sum : out std_logic_vector(COUNTER_BITS - 1 downto 0); + Average : out std_logic_vector(COUNTER_BITS - 1 downto 0); + Valid : out std_logic ); end entity; architecture rtl of stat_Average is - signal DataIn_us : unsigned(DataIn'range); + signal DataIn_us : unsigned(DataIn'range); - signal Counter_i : std_logic_vector(COUNTER_BITS - 1 downto 0); - signal Counter_us : unsigned(COUNTER_BITS - 1 downto 0) := (others => '0'); + signal Counter_i : std_logic_vector(COUNTER_BITS - 1 downto 0); + signal Counter_us : unsigned(COUNTER_BITS - 1 downto 0) := (others => '0'); - signal Sum_i : std_logic_vector(COUNTER_BITS - 1 downto 0); - signal Sum_us : unsigned(COUNTER_BITS - 1 downto 0) := (others => '0'); + signal Sum_i : std_logic_vector(COUNTER_BITS - 1 downto 0); + signal Sum_us : unsigned(COUNTER_BITS - 1 downto 0) := (others => '0'); - signal Quotient : std_logic_vector(COUNTER_BITS - 1 downto 0); - signal Valid_i : std_logic; + signal Quotient : std_logic_vector(COUNTER_BITS - 1 downto 0); + signal Valid_i : std_logic; - type T_SUM_VECTOR is array(natural range <>) of std_logic_vector(COUNTER_BITS - 1 downto 0); - type T_COUNT_VECTOR is array(natural range <>) of std_logic_vector(COUNTER_BITS - 1 downto 0); + type T_SUM_VECTOR is array(natural range <>) of std_logic_vector(COUNTER_BITS - 1 downto 0); + type T_COUNT_VECTOR is array(natural range <>) of std_logic_vector(COUNTER_BITS - 1 downto 0); - constant DELAY : positive := COUNTER_BITS - 1; + constant DELAY : positive := COUNTER_BITS - 1; - signal Count_d : T_COUNT_VECTOR(DELAY downto 0) := (others => (others => '0')); - signal Sum_d : T_SUM_VECTOR(DELAY downto 0) := (others => (others => '0')); --- signal Valid_d : STD_LOGIC_VECTOR(DELAY downto 0) := (others => '0'); + signal Count_d : T_COUNT_VECTOR(DELAY downto 0) := (others => (others => '0')); + signal Sum_d : T_SUM_VECTOR(DELAY downto 0) := (others => (others => '0')); +-- signal Valid_d : STD_LOGIC_VECTOR(DELAY downto 0) := (others => '0'); begin - DataIn_us <= unsigned(DataIn); + DataIn_us <= unsigned(DataIn); process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - Counter_us <= (others => '0'); - Sum_us <= (others => '0'); + Counter_us <= (others => '0'); + Sum_us <= (others => '0'); elsif (Enable = '1') then - Counter_us <= Counter_us + 1; - Sum_us <= Sum_us + resize(DataIn_us, Sum_us'length); + Counter_us <= Counter_us + 1; + Sum_us <= Sum_us + resize(DataIn_us, Sum_us'length); end if; end if; end process; - Counter_i <= std_logic_vector(Counter_us); - Sum_i <= std_logic_vector(Sum_us); - - div: entity work.arith_div - generic map ( - A_BITS => COUNTER_BITS, - D_BITS => COUNTER_BITS, - PIPELINED => true - ) - port map ( - clk => Clock, - rst => Reset, - - start => Enable, - ready => Valid_i, - - A => Sum_i, - D => Counter_i, - Q => Quotient, - R => open, - Z => open - ); - - Count_d <= Count_d(Count_d'high - 1 downto 0) & Counter_i when rising_edge(Clock); - Sum_d <= Sum_d(Sum_d'high - 1 downto 0) & Sum_i when rising_edge(Clock); --- Valid_d <= Valid_d(Valid_d'high - 1 downto 0) & Enable when rising_edge(Clock); - - Count <= Count_d(Count_d'high); - Sum <= Sum_d(Sum_d'high); - Average <= Quotient; - Valid <= Valid_i; --_d(Valid_d'high); + Counter_i <= std_logic_vector(Counter_us); + Sum_i <= std_logic_vector(Sum_us); + + div: entity work.arith_Divider + generic map ( + DIVIDEND_BITS => COUNTER_BITS, + DIVISOR_BITS => COUNTER_BITS, + PIPELINED => true + ) + port map ( + Clock => Clock, + Reset => Reset, + + Start => Enable, + Ready => Valid_i, + + Dividend => Sum_i, + Divisor => Counter_i, + Quotient => Quotient, + Remainder => open, + DivisionByZero => open + ); + + Count_d <= Count_d(Count_d'high - 1 downto 0) & Counter_i when rising_edge(Clock); + Sum_d <= Sum_d(Sum_d'high - 1 downto 0) & Sum_i when rising_edge(Clock); +-- Valid_d <= Valid_d(Valid_d'high - 1 downto 0) & Enable when rising_edge(Clock); + + Count <= Count_d(Count_d'high); + Sum <= Sum_d(Sum_d'high); + Average <= Quotient; + Valid <= Valid_i; --_d(Valid_d'high); end architecture; diff --git a/src/misc/stat/stat_Histogram.vhdl b/src/misc/stat/stat_Histogram.vhdl index 91b6a2e69..9fa9eb11d 100644 --- a/src/misc/stat/stat_Histogram.vhdl +++ b/src/misc/stat/stat_Histogram.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Creates a histogram of all input data +-- Entity: Creates a histogram of all input data -- -- Description: -- ------------------------------------- @@ -9,14 +9,15 @@ -- -- License: -- ============================================================================= +-- Copyright 2024-2026 The PoC-Library Authors -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -25,7 +26,7 @@ -- limitations under the License. -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; @@ -35,55 +36,55 @@ use work.vectors.all; entity stat_Histogram is generic ( - DATA_BITS : positive := 16; - COUNTER_BITS : positive := 16 + DATA_BITS : positive := 16; + COUNTER_BITS : positive := 16 ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - Enable : in std_logic; - DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); + Enable : in std_logic; + DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); - Histogram : out T_SLM(2**DATA_BITS - 1 downto 0, COUNTER_BITS - 1 downto 0) + Histogram : out T_SLM(2**DATA_BITS - 1 downto 0, COUNTER_BITS - 1 downto 0) ); end entity; architecture rtl of stat_Histogram is - type T_HISTOGRAM_MEMORY is array(natural range <>) of unsigned(COUNTER_BITS downto 0); + type T_HISTOGRAM_MEMORY is array(natural range <>) of unsigned(COUNTER_BITS downto 0); -- create matrix from vector-vector function to_slm(usv : T_HISTOGRAM_MEMORY) return T_SLM is - variable slm : T_SLM(usv'range, COUNTER_BITS - 1 downto 0); + variable slm : T_SLM(usv'range, COUNTER_BITS - 1 downto 0); begin for i in usv'range loop if (usv(i)(COUNTER_BITS) = '0') then for j in COUNTER_BITS - 1 downto 0 loop - slm(i, j) := usv(i)(j); + slm(i, j) := usv(i)(j); end loop; else for j in COUNTER_BITS - 1 downto 0 loop - slm(i, j) := '1'; + slm(i, j) := '1'; end loop; end if; end loop; return slm; end function; - signal HistogramMemory : T_HISTOGRAM_MEMORY(2**DATA_BITS - 1 downto 0) := (others => (others => '0')); + signal HistogramMemory : T_HISTOGRAM_MEMORY(2**DATA_BITS - 1 downto 0) := (others => (others => '0')); begin process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - HistogramMemory <= (others => (others => '0')); + HistogramMemory <= (others => (others => '0')); elsif ((Enable = '1') and (HistogramMemory(to_index(DataIn))(COUNTER_BITS) = '0')) then - HistogramMemory(to_index(DataIn)) <= HistogramMemory(to_index(DataIn)) + 1; + HistogramMemory(to_index(DataIn)) <= HistogramMemory(to_index(DataIn)) + 1; end if; end if; end process; - Histogram <= to_slm(HistogramMemory); + Histogram <= to_slm(HistogramMemory); end architecture; diff --git a/src/misc/stat/stat_Maximum.vhdl b/src/misc/stat/stat_Maximum.vhdl index 3da41e74b..33795e57c 100644 --- a/src/misc/stat/stat_Maximum.vhdl +++ b/src/misc/stat/stat_Maximum.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Counts the most significant data words +-- Entity: Counts the most significant data words -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -25,7 +25,7 @@ -- limitations under the License. -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; @@ -35,115 +35,115 @@ use work.vectors.all; entity stat_Maximum is generic ( - DEPTH : positive := 8; - DATA_BITS : positive := 16; - COUNTER_BITS : positive := 16 + DEPTH : positive := 8; + DATA_BITS : positive := 16; + COUNTER_BITS : positive := 16 ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - Enable : in std_logic; - DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); + Enable : in std_logic; + DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); - Valids : out std_logic_vector(DEPTH - 1 downto 0); - Maximums : out T_SLM(DEPTH - 1 downto 0, DATA_BITS - 1 downto 0); - Counts : out T_SLM(DEPTH - 1 downto 0, COUNTER_BITS - 1 downto 0) + Valids : out std_logic_vector(DEPTH - 1 downto 0); + Maximums : out T_SLM(DEPTH - 1 downto 0, DATA_BITS - 1 downto 0); + Counts : out T_SLM(DEPTH - 1 downto 0, COUNTER_BITS - 1 downto 0) ); end entity; architecture rtl of stat_Maximum is - type T_TAG_MEMORY is array(natural range <>) of unsigned(DATA_BITS - 1 downto 0); - type T_COUNTER_MEMORY is array(natural range <>) of unsigned(COUNTER_BITS - 1 downto 0); + type T_TAG_MEMORY is array(natural range <>) of unsigned(DATA_BITS - 1 downto 0); + type T_COUNTER_MEMORY is array(natural range <>) of unsigned(COUNTER_BITS - 1 downto 0); -- create matrix from vector-vector function to_slm(usv : T_TAG_MEMORY) return T_SLM is - variable slm : T_SLM(usv'range, DATA_BITS - 1 downto 0); + variable slm : T_SLM(usv'range, DATA_BITS - 1 downto 0); begin for i in usv'range loop for j in DATA_BITS - 1 downto 0 loop - slm(i, j) := usv(i)(j); + slm(i, j) := usv(i)(j); end loop; end loop; return slm; end function; function to_slm(usv : T_COUNTER_MEMORY) return T_SLM is - variable slm : T_SLM(usv'range, COUNTER_BITS - 1 downto 0); + variable slm : T_SLM(usv'range, COUNTER_BITS - 1 downto 0); begin for i in usv'range loop for j in COUNTER_BITS - 1 downto 0 loop - slm(i, j) := usv(i)(j); + slm(i, j) := usv(i)(j); end loop; end loop; return slm; end function; - signal DataIn_us : unsigned(DataIn'range); + signal DataIn_us : unsigned(DataIn'range); - signal TagHit : std_logic_vector(DEPTH - 1 downto 0); - signal MaximumHit : std_logic_vector(DEPTH - 1 downto 0); - signal TagMemory : T_TAG_MEMORY(DEPTH - 1 downto 0) := (others => (others => '0')); - signal CounterMemory : T_COUNTER_MEMORY(DEPTH - 1 downto 0) := (others => (others => '0')); - signal MaximumIndex : std_logic_vector(DEPTH - 1 downto 0) := '1' & (DEPTH - 2 downto 0 => '0'); --((DEPTH - 1) => '1', others => '0'); -- WORKAROUND: GHDL says not static choice exclude others choice; non-locally static choice for an aggregate is allowed only if only choice - signal ValidMemory : std_logic_vector(DEPTH - 1 downto 0) := (others => '0'); + signal TagHit : std_logic_vector(DEPTH - 1 downto 0); + signal MaximumHit : std_logic_vector(DEPTH - 1 downto 0); + signal TagMemory : T_TAG_MEMORY(DEPTH - 1 downto 0) := (others => (others => '0')); + signal CounterMemory : T_COUNTER_MEMORY(DEPTH - 1 downto 0) := (others => (others => '0')); + signal MaximumIndex : std_logic_vector(DEPTH - 1 downto 0) := '1' & (DEPTH - 2 downto 0 => '0'); --((DEPTH - 1) => '1', others => '0'); -- WORKAROUND: GHDL says not static choice exclude others choice; non-locally static choice for an aggregate is allowed only if only choice + signal ValidMemory : std_logic_vector(DEPTH - 1 downto 0) := (others => '0'); begin - DataIn_us <= unsigned(DataIn); + DataIn_us <= unsigned(DataIn); genTagHit : for i in 0 to DEPTH - 1 generate - TagHit(i) <= to_sl(TagMemory(i) = DataIn_us); - MaximumHit(i) <= to_sl(TagMemory(i) < DataIn_us); + TagHit(i) <= to_sl(TagMemory(i) = DataIn_us); + MaximumHit(i) <= to_sl(TagMemory(i) < DataIn_us); end generate; process(Clock) - variable TagHit_idx : natural; + variable TagHit_idx : natural; begin if rising_edge(Clock) then if (Reset = '1') then - ValidMemory <= (others => '0'); + ValidMemory <= (others => '0'); elsif ((slv_nand(ValidMemory) and slv_nor(TagHit) and Enable) = '1') then for i in DEPTH - 1 downto 1 loop if (MaximumHit(i) = '1') then - TagMemory(i) <= TagMemory(i - 1); - ValidMemory(i) <= ValidMemory(i - 1); - CounterMemory(i) <= CounterMemory(i - 1); + TagMemory(i) <= TagMemory(i - 1); + ValidMemory(i) <= ValidMemory(i - 1); + CounterMemory(i) <= CounterMemory(i - 1); end if; end loop; for i in 0 to DEPTH - 1 loop if (MaximumHit(i) = '1') then - TagMemory(i) <= DataIn_us; - ValidMemory(i) <= '1'; - CounterMemory(i) <= to_unsigned(1, COUNTER_BITS); + TagMemory(i) <= DataIn_us; + ValidMemory(i) <= '1'; + CounterMemory(i) <= to_unsigned(1, COUNTER_BITS); exit; end if; end loop; elsif ((slv_or(MaximumHit) and slv_nor(TagHit) and Enable) = '1') then for i in DEPTH - 1 downto 1 loop if (MaximumHit(i) = '1') then - TagMemory(i) <= TagMemory(i - 1); - ValidMemory(i) <= ValidMemory(i - 1); - CounterMemory(i) <= CounterMemory(i - 1); + TagMemory(i) <= TagMemory(i - 1); + ValidMemory(i) <= ValidMemory(i - 1); + CounterMemory(i) <= CounterMemory(i - 1); end if; end loop; for i in 0 to DEPTH - 1 loop if (MaximumHit(i) = '1') then - TagMemory(i) <= DataIn_us; - ValidMemory(i) <= '1'; - CounterMemory(i) <= to_unsigned(1, COUNTER_BITS); + TagMemory(i) <= DataIn_us; + ValidMemory(i) <= '1'; + CounterMemory(i) <= to_unsigned(1, COUNTER_BITS); exit; end if; end loop; elsif ((slv_or(TagHit) and Enable)= '1') then - TagHit_idx := to_index(onehot2bin(TagHit, 0)); - CounterMemory(TagHit_idx) <= CounterMemory(TagHit_idx) + 1; + TagHit_idx := to_index(onehot2bin(TagHit, 0)); + CounterMemory(TagHit_idx) <= CounterMemory(TagHit_idx) + 1; end if; end if; end process; - Valids <= ValidMemory; - Maximums <= to_slm(TagMemory); - Counts <= to_slm(CounterMemory); + Valids <= ValidMemory; + Maximums <= to_slm(TagMemory); + Counts <= to_slm(CounterMemory); end architecture; diff --git a/src/misc/stat/stat_Minimum.vhdl b/src/misc/stat/stat_Minimum.vhdl index 3f2bbafe3..b1480c148 100644 --- a/src/misc/stat/stat_Minimum.vhdl +++ b/src/misc/stat/stat_Minimum.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Counts the least significant data words +-- Entity: Counts the least significant data words -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -25,7 +25,7 @@ -- limitations under the License. -- ============================================================================= -library IEEE; +library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; @@ -35,115 +35,115 @@ use work.vectors.all; entity stat_Minimum is generic ( - DEPTH : positive := 8; - DATA_BITS : positive := 16; - COUNTER_BITS : positive := 16 + DEPTH : positive := 8; + DATA_BITS : positive := 16; + COUNTER_BITS : positive := 16 ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - Enable : in std_logic; - DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); + Enable : in std_logic; + DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); - Valids : out std_logic_vector(DEPTH - 1 downto 0); - Minimums : out T_SLM(DEPTH - 1 downto 0, DATA_BITS - 1 downto 0); - Counts : out T_SLM(DEPTH - 1 downto 0, COUNTER_BITS - 1 downto 0) + Valids : out std_logic_vector(DEPTH - 1 downto 0); + Minimums : out T_SLM(DEPTH - 1 downto 0, DATA_BITS - 1 downto 0); + Counts : out T_SLM(DEPTH - 1 downto 0, COUNTER_BITS - 1 downto 0) ); end entity; architecture rtl of stat_Minimum is - type T_TAG_MEMORY is array(natural range <>) of unsigned(DATA_BITS - 1 downto 0); - type T_COUNTER_MEMORY is array(natural range <>) of unsigned(COUNTER_BITS - 1 downto 0); + type T_TAG_MEMORY is array(natural range <>) of unsigned(DATA_BITS - 1 downto 0); + type T_COUNTER_MEMORY is array(natural range <>) of unsigned(COUNTER_BITS - 1 downto 0); -- create matrix from vector-vector function to_slm(usv : T_TAG_MEMORY) return T_SLM is - variable slm : T_SLM(usv'range, DATA_BITS - 1 downto 0); + variable slm : T_SLM(usv'range, DATA_BITS - 1 downto 0); begin for i in usv'range loop for j in DATA_BITS - 1 downto 0 loop - slm(i, j) := usv(i)(j); + slm(i, j) := usv(i)(j); end loop; end loop; return slm; end function; function to_slm(usv : T_COUNTER_MEMORY) return T_SLM is - variable slm : T_SLM(usv'range, COUNTER_BITS - 1 downto 0); + variable slm : T_SLM(usv'range, COUNTER_BITS - 1 downto 0); begin for i in usv'range loop for j in COUNTER_BITS - 1 downto 0 loop - slm(i, j) := usv(i)(j); + slm(i, j) := usv(i)(j); end loop; end loop; return slm; end function; - signal DataIn_us : unsigned(DataIn'range); + signal DataIn_us : unsigned(DataIn'range); - signal TagHit : std_logic_vector(DEPTH - 1 downto 0); - signal MinimumHit : std_logic_vector(DEPTH - 1 downto 0); - signal TagMemory : T_TAG_MEMORY(DEPTH - 1 downto 0) := (others => (others => '1')); - signal CounterMemory : T_COUNTER_MEMORY(DEPTH - 1 downto 0) := (others => (others => '0')); - signal MinimumIndex : std_logic_vector(DEPTH - 1 downto 0) := '1' & (DEPTH - 2 downto 0 => '0'); --((DEPTH - 1) => '1', others => '0'); -- WORKAROUND: GHDL says not static choice exclude others choice; non-locally static choice for an aggregate is allowed only if only choice - signal ValidMemory : std_logic_vector(DEPTH - 1 downto 0) := (others => '0'); + signal TagHit : std_logic_vector(DEPTH - 1 downto 0); + signal MinimumHit : std_logic_vector(DEPTH - 1 downto 0); + signal TagMemory : T_TAG_MEMORY(DEPTH - 1 downto 0) := (others => (others => '1')); + signal CounterMemory : T_COUNTER_MEMORY(DEPTH - 1 downto 0) := (others => (others => '0')); + signal MinimumIndex : std_logic_vector(DEPTH - 1 downto 0) := '1' & (DEPTH - 2 downto 0 => '0'); --((DEPTH - 1) => '1', others => '0'); -- WORKAROUND: GHDL says not static choice exclude others choice; non-locally static choice for an aggregate is allowed only if only choice + signal ValidMemory : std_logic_vector(DEPTH - 1 downto 0) := (others => '0'); begin - DataIn_us <= unsigned(DataIn); + DataIn_us <= unsigned(DataIn); genTagHit : for i in 0 to DEPTH - 1 generate - TagHit(i) <= to_sl(TagMemory(i) = DataIn_us); - MinimumHit(i) <= to_sl(TagMemory(i) > DataIn_us); + TagHit(i) <= to_sl(TagMemory(i) = DataIn_us); + MinimumHit(i) <= to_sl(TagMemory(i) > DataIn_us); end generate; process(Clock) - variable TagHit_idx : natural; + variable TagHit_idx : natural; begin if rising_edge(Clock) then if (Reset = '1') then - ValidMemory <= (others => '0'); + ValidMemory <= (others => '0'); elsif ((slv_nand(ValidMemory) and slv_nor(TagHit) and Enable) = '1') then for i in DEPTH - 1 downto 1 loop if (MinimumHit(i) = '1') then - TagMemory(i) <= TagMemory(i - 1); - ValidMemory(i) <= ValidMemory(i - 1); - CounterMemory(i) <= CounterMemory(i - 1); + TagMemory(i) <= TagMemory(i - 1); + ValidMemory(i) <= ValidMemory(i - 1); + CounterMemory(i) <= CounterMemory(i - 1); end if; end loop; for i in 0 to DEPTH - 1 loop if (MinimumHit(i) = '1') then - TagMemory(i) <= DataIn_us; - ValidMemory(i) <= '1'; - CounterMemory(i) <= to_unsigned(1, COUNTER_BITS); + TagMemory(i) <= DataIn_us; + ValidMemory(i) <= '1'; + CounterMemory(i) <= to_unsigned(1, COUNTER_BITS); exit; end if; end loop; elsif ((slv_or(MinimumHit) and slv_nor(TagHit) and Enable) = '1') then for i in DEPTH - 1 downto 1 loop if (MinimumHit(i) = '1') then - TagMemory(i) <= TagMemory(i - 1); - ValidMemory(i) <= ValidMemory(i - 1); - CounterMemory(i) <= CounterMemory(i - 1); + TagMemory(i) <= TagMemory(i - 1); + ValidMemory(i) <= ValidMemory(i - 1); + CounterMemory(i) <= CounterMemory(i - 1); end if; end loop; for i in 0 to DEPTH - 1 loop if (MinimumHit(i) = '1') then - TagMemory(i) <= DataIn_us; - ValidMemory(i) <= '1'; - CounterMemory(i) <= to_unsigned(1, COUNTER_BITS); + TagMemory(i) <= DataIn_us; + ValidMemory(i) <= '1'; + CounterMemory(i) <= to_unsigned(1, COUNTER_BITS); exit; end if; end loop; elsif ((slv_or(TagHit) and Enable)= '1') then - TagHit_idx := to_index(onehot2bin(TagHit, 0)); - CounterMemory(TagHit_idx) <= CounterMemory(TagHit_idx) + 1; + TagHit_idx := to_index(onehot2bin(TagHit, 0)); + CounterMemory(TagHit_idx) <= CounterMemory(TagHit_idx) + 1; end if; end if; end process; - Valids <= ValidMemory; - Minimums <= to_slm(TagMemory); - Counts <= to_slm(CounterMemory); + Valids <= ValidMemory; + Minimums <= to_slm(TagMemory); + Counts <= to_slm(CounterMemory); end architecture; diff --git a/src/net/arp/arp_BroadCast_Receiver.vhdl b/src/net/arp/arp_BroadCast_Receiver.vhdl index c34c79057..9cf07679f 100644 --- a/src/net/arp/arp_BroadCast_Receiver.vhdl +++ b/src/net/arp/arp_BroadCast_Receiver.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,125 +37,125 @@ use work.net.all; entity arp_BroadCast_Receiver is generic ( - ALLOWED_PROTOCOL_IPV4 : boolean := TRUE; - ALLOWED_PROTOCOL_IPV6 : boolean := FALSE + ALLOWED_PROTOCOL_IPV4 : boolean := TRUE; + ALLOWED_PROTOCOL_IPV6 : boolean := FALSE ); port ( - Clock : in std_logic; -- - Reset : in std_logic; -- - - RX_Valid : in std_logic; - RX_Data : in T_SLV_8; - RX_SOF : in std_logic; - RX_EOF : in std_logic; - RX_Ack : out std_logic; - RX_Meta_rst : out std_logic; - RX_Meta_SrcMACAddress_nxt : out std_logic; - RX_Meta_SrcMACAddress_Data : in T_SLV_8; - RX_Meta_DestMACAddress_nxt : out std_logic; - RX_Meta_DestMACAddress_Data : in T_SLV_8; - - Clear : in std_logic; - Error : out std_logic; - - RequestReceived : out std_logic; - Address_rst : in std_logic; - SenderMACAddress_nxt : in std_logic; - SenderMACAddress_Data : out T_SLV_8; - SenderIPAddress_nxt : in std_logic; - SenderIPAddress_Data : out T_SLV_8; - TargetIPAddress_nxt : in std_logic; - TargetIPAddress_Data : out T_SLV_8 + Clock : in std_logic; -- + Reset : in std_logic; -- + + RX_Valid : in std_logic; + RX_Data : in T_SLV_8; + RX_SOF : in std_logic; + RX_EOF : in std_logic; + RX_Ack : out std_logic; + RX_Meta_rst : out std_logic; + RX_Meta_SrcMACAddress_nxt : out std_logic; + RX_Meta_SrcMACAddress_Data : in T_SLV_8; + RX_Meta_DestMACAddress_nxt : out std_logic; + RX_Meta_DestMACAddress_Data : in T_SLV_8; + + Clear : in std_logic; + Error : out std_logic; + + RequestReceived : out std_logic; + Address_rst : in std_logic; + SenderMACAddress_nxt : in std_logic; + SenderMACAddress_Data : out T_SLV_8; + SenderIPAddress_nxt : in std_logic; + SenderIPAddress_Data : out T_SLV_8; + TargetIPAddress_nxt : in std_logic; + TargetIPAddress_Data : out T_SLV_8 ); end entity; architecture rtl of arp_BroadCast_Receiver is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; - type T_STATE is ( + type T_STATE is ( ST_IDLE, ST_RECEIVE_HARDWARE_type_1, ST_RECEIVE_PROTOCOL_type_0, ST_RECEIVE_PROTOCOL_type_1, ST_RECEIVE_HARDWARE_ADDRESS_LENGTH, ST_RECEIVE_PROTOCOL_ADDRESS_LENGTH, - ST_RECEIVE_OPERATION_0, ST_RECEIVE_OPERATION_1, - ST_RECEIVE_SENDER_MAC, ST_RECEIVE_SENDER_IP, - ST_RECEIVE_TARGET_MAC, ST_RECEIVE_TARGET_IP, + ST_RECEIVE_OPERATION_0, ST_RECEIVE_OPERATION_1, + ST_RECEIVE_SENDER_MAC, ST_RECEIVE_SENDER_IP, + ST_RECEIVE_TARGET_MAC, ST_RECEIVE_TARGET_IP, ST_DISCARD_ETHERNET_PADDING_BYTES, ST_COMPLETE, ST_DISCARD_FRAME, ST_ERROR ); - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is "gray"; --"speed1"; + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is "gray"; --"speed1"; - signal Is_SOF : std_logic; - signal Is_EOF : std_logic; + signal Is_SOF : std_logic; + signal Is_EOF : std_logic; - constant HARDWARE_ADDRESS_LENGTH : positive := 6; -- MAC -> 6 bytes - constant PROTOCOL_IPV4_ADDRESS_LENGTH : positive := 4; -- IPv4 -> 4 bytes - constant PROTOCOL_IPV6_ADDRESS_LENGTH : positive := 16; -- IPv6 -> 16 bytes - constant PROTOCOL_ADDRESS_LENGTH : positive := ite((ALLOWED_PROTOCOL_IPV6 = FALSE), PROTOCOL_IPV4_ADDRESS_LENGTH, PROTOCOL_IPV6_ADDRESS_LENGTH); -- IPv4 -> 4 bytes; IPv6 -> 16 bytes + constant HARDWARE_ADDRESS_LENGTH : positive := 6; -- MAC -> 6 bytes + constant PROTOCOL_IPV4_ADDRESS_LENGTH : positive := 4; -- IPv4 -> 4 bytes + constant PROTOCOL_IPV6_ADDRESS_LENGTH : positive := 16; -- IPv6 -> 16 bytes + constant PROTOCOL_ADDRESS_LENGTH : positive := ite((ALLOWED_PROTOCOL_IPV6 = FALSE), PROTOCOL_IPV4_ADDRESS_LENGTH, PROTOCOL_IPV6_ADDRESS_LENGTH); -- IPv4 -> 4 bytes; IPv6 -> 16 bytes - subtype T_HARDWARE_ADDRESS_INDEX is natural range 0 to HARDWARE_ADDRESS_LENGTH - 1; - subtype T_PROTOCOL_ADDRESS_INDEX is natural range 0 to PROTOCOL_ADDRESS_LENGTH - 1; + subtype T_HARDWARE_ADDRESS_INDEX is natural range 0 to HARDWARE_ADDRESS_LENGTH - 1; + subtype T_PROTOCOL_ADDRESS_INDEX is natural range 0 to PROTOCOL_ADDRESS_LENGTH - 1; - signal IsIPv4_set : std_logic; - signal IsIPv4_r : std_logic := '0'; - signal IsIPv6_set : std_logic; - signal IsIPv6_r : std_logic := '0'; + signal IsIPv4_set : std_logic; + signal IsIPv4_r : std_logic := '0'; + signal IsIPv6_set : std_logic; + signal IsIPv6_r : std_logic := '0'; - constant WRITER_COUNTER_BITS : positive := log2ceilnz(imax(HARDWARE_ADDRESS_LENGTH, PROTOCOL_ADDRESS_LENGTH)); - signal Writer_Counter_rst : std_logic; - signal Writer_Counter_en : std_logic; - signal Writer_Counter_us : unsigned(WRITER_COUNTER_BITS - 1 downto 0) := (others => '0'); + constant WRITER_COUNTER_BITS : positive := log2ceilnz(imax(HARDWARE_ADDRESS_LENGTH, PROTOCOL_ADDRESS_LENGTH)); + signal Writer_Counter_rst : std_logic; + signal Writer_Counter_en : std_logic; + signal Writer_Counter_us : unsigned(WRITER_COUNTER_BITS - 1 downto 0) := (others => '0'); - signal Reader_SenderMAC_Counter_rst : std_logic; - signal Reader_SenderMAC_Counter_en : std_logic; - signal Reader_SenderMAC_Counter_us : unsigned(log2ceilnz(HARDWARE_ADDRESS_LENGTH) - 1 downto 0) := (others => '0'); + signal Reader_SenderMAC_Counter_rst : std_logic; + signal Reader_SenderMAC_Counter_en : std_logic; + signal Reader_SenderMAC_Counter_us : unsigned(log2ceilnz(HARDWARE_ADDRESS_LENGTH) - 1 downto 0) := (others => '0'); - signal Reader_SenderIP_Counter_rst : std_logic; - signal Reader_SenderIP_Counter_en : std_logic; - signal Reader_SenderIP_Counter_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0) := (others => '0'); + signal Reader_SenderIP_Counter_rst : std_logic; + signal Reader_SenderIP_Counter_en : std_logic; + signal Reader_SenderIP_Counter_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0) := (others => '0'); - signal Reader_TargetIP_Counter_rst : std_logic; - signal Reader_TargetIP_Counter_en : std_logic; - signal Reader_TargetIP_Counter_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0) := (others => '0'); + signal Reader_TargetIP_Counter_rst : std_logic; + signal Reader_TargetIP_Counter_en : std_logic; + signal Reader_TargetIP_Counter_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0) := (others => '0'); --- signal SenderMACAddress_Data_rst : STD_LOGIC; - signal SenderHardwareAddress_en : std_logic; - signal SenderHardwareAddress_us : unsigned(log2ceilnz(HARDWARE_ADDRESS_LENGTH) - 1 downto 0); - signal SenderHardwareAddress_d : T_SLVV_8(HARDWARE_ADDRESS_LENGTH - 1 downto 0) := (others => (others => '0')); +-- signal SenderMACAddress_Data_rst : STD_LOGIC; + signal SenderHardwareAddress_en : std_logic; + signal SenderHardwareAddress_us : unsigned(log2ceilnz(HARDWARE_ADDRESS_LENGTH) - 1 downto 0); + signal SenderHardwareAddress_d : T_SLVV_8(HARDWARE_ADDRESS_LENGTH - 1 downto 0) := (others => (others => '0')); --- signal SenderIPv4Address_Data_rst : STD_LOGIC; - signal SenderProtocolAddress_en : std_logic; - signal SenderProtocolAddress_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0); - signal SenderProtocolAddress_d : T_SLVV_8(PROTOCOL_ADDRESS_LENGTH - 1 downto 0) := (others => (others => '0')); +-- signal SenderIPv4Address_Data_rst : STD_LOGIC; + signal SenderProtocolAddress_en : std_logic; + signal SenderProtocolAddress_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0); + signal SenderProtocolAddress_d : T_SLVV_8(PROTOCOL_ADDRESS_LENGTH - 1 downto 0) := (others => (others => '0')); --- signal TargetIPv4Address_Data_rst : STD_LOGIC; - signal TargetProtocolAddress_en : std_logic; - signal TargetProtocolAddress_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0); - signal TargetProtocolAddress_d : T_SLVV_8(PROTOCOL_ADDRESS_LENGTH - 1 downto 0) := (others => (others => '0')); +-- signal TargetIPv4Address_Data_rst : STD_LOGIC; + signal TargetProtocolAddress_en : std_logic; + signal TargetProtocolAddress_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0); + signal TargetProtocolAddress_d : T_SLVV_8(PROTOCOL_ADDRESS_LENGTH - 1 downto 0) := (others => (others => '0')); begin assert (ALLOWED_PROTOCOL_IPV4 or ALLOWED_PROTOCOL_IPV6) report "At least one protocol must be selected: IPv4, IPv6" severity FAILURE; - RX_Meta_rst <= '0'; - RX_Meta_SrcMACAddress_nxt <= '0'; - RX_Meta_DestMACAddress_nxt <= '0'; + RX_Meta_rst <= '0'; + RX_Meta_SrcMACAddress_nxt <= '0'; + RX_Meta_DestMACAddress_nxt <= '0'; - Is_SOF <= RX_Valid and RX_SOF; - Is_EOF <= RX_Valid and RX_EOF; + Is_SOF <= RX_Valid and RX_SOF; + Is_EOF <= RX_Valid and RX_EOF; process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; @@ -167,270 +167,270 @@ begin Address_rst, SenderMACAddress_nxt, SenderIPAddress_nxt, TargetIPAddress_nxt) begin - NextState <= State; + NextState <= State; - RX_Ack <= '0'; + RX_Ack <= '0'; - RequestReceived <= '0'; - Error <= '0'; + RequestReceived <= '0'; + Error <= '0'; - IsIPv4_set <= '0'; - IsIPv6_set <= '0'; + IsIPv4_set <= '0'; + IsIPv6_set <= '0'; - Writer_Counter_rst <= '0'; - Writer_Counter_en <= '0'; + Writer_Counter_rst <= '0'; + Writer_Counter_en <= '0'; - Reader_SenderMAC_Counter_rst <= Clear or Address_rst; - Reader_SenderMAC_Counter_en <= SenderMACAddress_nxt; - SenderHardwareAddress_en <= '0'; - SenderHardwareAddress_us <= Writer_Counter_us(SenderHardwareAddress_us'range); + Reader_SenderMAC_Counter_rst <= Clear or Address_rst; + Reader_SenderMAC_Counter_en <= SenderMACAddress_nxt; + SenderHardwareAddress_en <= '0'; + SenderHardwareAddress_us <= Writer_Counter_us(SenderHardwareAddress_us'range); - Reader_SenderIP_Counter_rst <= Clear or Address_rst; - Reader_SenderIP_Counter_en <= SenderIPAddress_nxt; - SenderProtocolAddress_en <= '0'; - SenderProtocolAddress_us <= Writer_Counter_us(SenderProtocolAddress_us'range); + Reader_SenderIP_Counter_rst <= Clear or Address_rst; + Reader_SenderIP_Counter_en <= SenderIPAddress_nxt; + SenderProtocolAddress_en <= '0'; + SenderProtocolAddress_us <= Writer_Counter_us(SenderProtocolAddress_us'range); - Reader_TargetIP_Counter_rst <= Clear or Address_rst; - Reader_TargetIP_Counter_en <= TargetIPAddress_nxt; - TargetProtocolAddress_en <= '0'; - TargetProtocolAddress_us <= Writer_Counter_us(TargetProtocolAddress_us'range); + Reader_TargetIP_Counter_rst <= Clear or Address_rst; + Reader_TargetIP_Counter_en <= TargetIPAddress_nxt; + TargetProtocolAddress_en <= '0'; + TargetProtocolAddress_us <= Writer_Counter_us(TargetProtocolAddress_us'range); case State is when ST_IDLE => if (Is_SOF = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if (RX_Data = x"00") then - NextState <= ST_RECEIVE_HARDWARE_type_1; + NextState <= ST_RECEIVE_HARDWARE_type_1; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_HARDWARE_type_1 => if (RX_Valid = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if (RX_Data = x"01") then - NextState <= ST_RECEIVE_PROTOCOL_type_0; + NextState <= ST_RECEIVE_PROTOCOL_type_0; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_PROTOCOL_type_0 => if (RX_Valid = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if ((ALLOWED_PROTOCOL_IPV4 = TRUE) and (RX_Data = x"08")) then - IsIPv4_set <= '1'; - NextState <= ST_RECEIVE_PROTOCOL_type_1; + IsIPv4_set <= '1'; + NextState <= ST_RECEIVE_PROTOCOL_type_1; elsif ((ALLOWED_PROTOCOL_IPV6 = TRUE) and (RX_Data = x"86")) then - IsIPv6_set <= '1'; - NextState <= ST_RECEIVE_PROTOCOL_type_1; + IsIPv6_set <= '1'; + NextState <= ST_RECEIVE_PROTOCOL_type_1; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_PROTOCOL_type_1 => if (RX_Valid = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if ((IsIPv4_r = '1') and (RX_Data = x"00")) then - NextState <= ST_RECEIVE_HARDWARE_ADDRESS_LENGTH; + NextState <= ST_RECEIVE_HARDWARE_ADDRESS_LENGTH; elsif ((IsIPv6_r = '1') and (RX_Data = x"66")) then - NextState <= ST_RECEIVE_HARDWARE_ADDRESS_LENGTH; + NextState <= ST_RECEIVE_HARDWARE_ADDRESS_LENGTH; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_HARDWARE_ADDRESS_LENGTH => if (RX_Valid = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if (RX_Data = x"06") then - NextState <= ST_RECEIVE_PROTOCOL_ADDRESS_LENGTH; + NextState <= ST_RECEIVE_PROTOCOL_ADDRESS_LENGTH; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_PROTOCOL_ADDRESS_LENGTH => if (RX_Valid = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if ((IsIPv4_r = '1') and (RX_Data = x"04")) then - NextState <= ST_RECEIVE_OPERATION_0; + NextState <= ST_RECEIVE_OPERATION_0; elsif ((IsIPv6_r = '1') and (RX_Data = x"10")) then - NextState <= ST_RECEIVE_OPERATION_0; + NextState <= ST_RECEIVE_OPERATION_0; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_OPERATION_0 => if (RX_Valid = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if (RX_Data = x"00") then - NextState <= ST_RECEIVE_OPERATION_1; + NextState <= ST_RECEIVE_OPERATION_1; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_OPERATION_1 => if (RX_Valid = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if (RX_Data = x"01") then - NextState <= ST_RECEIVE_SENDER_MAC; + NextState <= ST_RECEIVE_SENDER_MAC; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_SENDER_MAC => if (RX_Valid = '1') then - RX_Ack <= '1'; - Writer_Counter_en <= '1'; - SenderHardwareAddress_en <= '1'; + RX_Ack <= '1'; + Writer_Counter_en <= '1'; + SenderHardwareAddress_en <= '1'; if (Is_EOF = '0') then if (Writer_Counter_us = (HARDWARE_ADDRESS_LENGTH - 1)) then - Writer_Counter_rst <= '1'; - NextState <= ST_RECEIVE_SENDER_IP; + Writer_Counter_rst <= '1'; + NextState <= ST_RECEIVE_SENDER_IP; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_SENDER_IP => if (RX_Valid = '1') then - RX_Ack <= '1'; - Writer_Counter_en <= '1'; - SenderProtocolAddress_en <= '1'; + RX_Ack <= '1'; + Writer_Counter_en <= '1'; + SenderProtocolAddress_en <= '1'; if (Is_EOF = '0') then if ((IsIPv4_r = '1') and (Writer_Counter_us = (PROTOCOL_IPV4_ADDRESS_LENGTH - 1))) then - Writer_Counter_rst <= '1'; - NextState <= ST_RECEIVE_TARGET_MAC; + Writer_Counter_rst <= '1'; + NextState <= ST_RECEIVE_TARGET_MAC; elsif ((IsIPv6_r = '1') and (Writer_Counter_us = (PROTOCOL_IPV6_ADDRESS_LENGTH - 1))) then - Writer_Counter_rst <= '1'; - NextState <= ST_RECEIVE_TARGET_MAC; + Writer_Counter_rst <= '1'; + NextState <= ST_RECEIVE_TARGET_MAC; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_TARGET_MAC => if (RX_Valid = '1') then - RX_Ack <= '1'; - Writer_Counter_en <= '1'; -- needed to count incoming bytes + RX_Ack <= '1'; + Writer_Counter_en <= '1'; -- needed to count incoming bytes if (Is_EOF = '0') then if (RX_Data = x"00") then if (Writer_Counter_us = (HARDWARE_ADDRESS_LENGTH - 1)) then - Writer_Counter_rst <= '1'; - NextState <= ST_RECEIVE_TARGET_IP; + Writer_Counter_rst <= '1'; + NextState <= ST_RECEIVE_TARGET_IP; end if; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_TARGET_IP => if (RX_Valid = '1') then - RX_Ack <= '1'; - Writer_Counter_en <= '1'; - TargetProtocolAddress_en <= '1'; + RX_Ack <= '1'; + Writer_Counter_en <= '1'; + TargetProtocolAddress_en <= '1'; if (Is_EOF = '0') then if ((IsIPv4_r = '1') and (Writer_Counter_us = (PROTOCOL_IPV4_ADDRESS_LENGTH - 1))) then - Writer_Counter_rst <= '1'; - NextState <= ST_DISCARD_ETHERNET_PADDING_BYTES; + Writer_Counter_rst <= '1'; + NextState <= ST_DISCARD_ETHERNET_PADDING_BYTES; elsif ((IsIPv6_r = '1') and (Writer_Counter_us = (PROTOCOL_IPV6_ADDRESS_LENGTH - 1))) then - Writer_Counter_rst <= '1'; - NextState <= ST_DISCARD_ETHERNET_PADDING_BYTES; + Writer_Counter_rst <= '1'; + NextState <= ST_DISCARD_ETHERNET_PADDING_BYTES; end if; else if ((IsIPv4_r = '1') and (Writer_Counter_us = (PROTOCOL_IPV4_ADDRESS_LENGTH - 1))) then - Writer_Counter_rst <= '1'; - NextState <= ST_COMPLETE; + Writer_Counter_rst <= '1'; + NextState <= ST_COMPLETE; elsif ((IsIPv6_r = '1') and (Writer_Counter_us = (PROTOCOL_IPV6_ADDRESS_LENGTH - 1))) then - Writer_Counter_rst <= '1'; - NextState <= ST_COMPLETE; + Writer_Counter_rst <= '1'; + NextState <= ST_COMPLETE; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; end if; when ST_DISCARD_ETHERNET_PADDING_BYTES => - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '1') then - NextState <= ST_COMPLETE; + NextState <= ST_COMPLETE; end if; when ST_COMPLETE => - RequestReceived <= '1'; + RequestReceived <= '1'; if (Clear = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; when ST_DISCARD_FRAME => - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '1') then - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; when ST_ERROR => - Error <= '1'; + Error <= '1'; if (Clear = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end case; @@ -441,15 +441,15 @@ begin begin if rising_edge(Clock) then if ((Reset or Clear) = '1') then - IsIPv4_r <= '0'; - IsIPv6_r <= '0'; + IsIPv4_r <= '0'; + IsIPv6_r <= '0'; else if (IsIPv4_set = '1') then - IsIPv4_r <= '1'; + IsIPv4_r <= '1'; end if; if (IsIPv6_set = '1') then - IsIPv6_r <= '1'; + IsIPv6_r <= '1'; end if; end if; end if; @@ -460,27 +460,27 @@ begin begin if rising_edge(Clock) then if (Writer_Counter_rst = '1') then - Writer_Counter_us <= (others => '0'); + Writer_Counter_us <= (others => '0'); elsif (Writer_Counter_en = '1') then - Writer_Counter_us <= Writer_Counter_us + 1; + Writer_Counter_us <= Writer_Counter_us + 1; end if; if (Reader_SenderMAC_Counter_rst = '1') then - Reader_SenderMAC_Counter_us <= (others => '0'); + Reader_SenderMAC_Counter_us <= (others => '0'); elsif (Reader_SenderMAC_Counter_en = '1') then - Reader_SenderMAC_Counter_us <= Reader_SenderMAC_Counter_us + 1; + Reader_SenderMAC_Counter_us <= Reader_SenderMAC_Counter_us + 1; end if; if (Reader_SenderIP_Counter_rst = '1') then - Reader_SenderIP_Counter_us <= (others => '0'); + Reader_SenderIP_Counter_us <= (others => '0'); elsif (Reader_SenderIP_Counter_en = '1') then - Reader_SenderIP_Counter_us <= Reader_SenderIP_Counter_us + 1; + Reader_SenderIP_Counter_us <= Reader_SenderIP_Counter_us + 1; end if; if (Reader_TargetIP_Counter_rst = '1') then - Reader_TargetIP_Counter_us <= (others => '0'); + Reader_TargetIP_Counter_us <= (others => '0'); elsif (Reader_TargetIP_Counter_en = '1') then - Reader_TargetIP_Counter_us <= Reader_TargetIP_Counter_us + 1; + Reader_TargetIP_Counter_us <= Reader_TargetIP_Counter_us + 1; end if; end if; end process; @@ -490,21 +490,21 @@ begin begin if rising_edge(Clock) then if (SenderHardwareAddress_en = '1') then - SenderHardwareAddress_d(to_integer(SenderHardwareAddress_us)) <= RX_Data; + SenderHardwareAddress_d(to_integer(SenderHardwareAddress_us)) <= RX_Data; end if; if (SenderProtocolAddress_en = '1') then - SenderProtocolAddress_d(to_integer(SenderProtocolAddress_us)) <= RX_Data; + SenderProtocolAddress_d(to_integer(SenderProtocolAddress_us)) <= RX_Data; end if; if (TargetProtocolAddress_en = '1') then - TargetProtocolAddress_d(to_integer(TargetProtocolAddress_us)) <= RX_Data; + TargetProtocolAddress_d(to_integer(TargetProtocolAddress_us)) <= RX_Data; end if; end if; end process; - SenderMACAddress_Data <= SenderHardwareAddress_d(ite((not SIMULATION), to_integer(Reader_SenderMAC_Counter_us), imin(to_integer(Reader_SenderMAC_Counter_us), 5))); - SenderIPAddress_Data <= SenderProtocolAddress_d(ite((not SIMULATION), to_integer(Reader_SenderIP_Counter_us), imin(to_integer(Reader_SenderIP_Counter_us), 3))); - TargetIPAddress_Data <= TargetProtocolAddress_d(ite((not SIMULATION), to_integer(Reader_TargetIP_Counter_us), imin(to_integer(Reader_TargetIP_Counter_us), 3))); + SenderMACAddress_Data <= SenderHardwareAddress_d(ite((not SIMULATION), to_integer(Reader_SenderMAC_Counter_us), imin(to_integer(Reader_SenderMAC_Counter_us), 5))); + SenderIPAddress_Data <= SenderProtocolAddress_d(ite((not SIMULATION), to_integer(Reader_SenderIP_Counter_us), imin(to_integer(Reader_SenderIP_Counter_us), 3))); + TargetIPAddress_Data <= TargetProtocolAddress_d(ite((not SIMULATION), to_integer(Reader_TargetIP_Counter_us), imin(to_integer(Reader_TargetIP_Counter_us), 3))); end architecture; diff --git a/src/net/arp/arp_BroadCast_Requester.vhdl b/src/net/arp/arp_BroadCast_Requester.vhdl index 4653ac5f7..25be37fe8 100644 --- a/src/net/arp/arp_BroadCast_Requester.vhdl +++ b/src/net/arp/arp_BroadCast_Requester.vhdl @@ -26,293 +26,293 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -use work.config.all; -use work.utils.all; -use work.vectors.all; -use work.net.all; +use work.config.all; +use work.utils.all; +use work.vectors.all; +use work.net.all; entity arp_BroadCast_Requester is - generic ( - ALLOWED_PROTOCOL_IPV4 : boolean := TRUE; - ALLOWED_PROTOCOL_IPV6 : boolean := FALSE - ); - port ( - Clock : in std_logic; -- - Reset : in std_logic; -- - - SendRequest : in std_logic; - Complete : out std_logic; - - Address_rst : out std_logic; - SenderMACAddress_nxt : out std_logic; - SenderMACAddress_Data : in T_SLV_8; - SenderIPv4Address_nxt : out std_logic; - SenderIPv4Address_Data : in T_SLV_8; - TargetMACAddress_nxt : out std_logic; - TargetMACAddress_Data : in T_SLV_8; - TargetIPv4Address_nxt : out std_logic; - TargetIPv4Address_Data : in T_SLV_8; - - TX_Valid : out std_logic; - TX_Data : out T_SLV_8; - TX_SOF : out std_logic; - TX_EOF : out std_logic; - TX_Ack : in std_logic; - TX_Meta_DestMACAddress_rst : in std_logic; - TX_Meta_DestMACAddress_nxt : in std_logic; - TX_Meta_DestMACAddress_Data : out T_SLV_8 - ); + generic ( + ALLOWED_PROTOCOL_IPV4 : boolean := TRUE; + ALLOWED_PROTOCOL_IPV6 : boolean := FALSE + ); + port ( + Clock : in std_logic; -- + Reset : in std_logic; -- + + SendRequest : in std_logic; + Complete : out std_logic; + + Address_rst : out std_logic; + SenderMACAddress_nxt : out std_logic; + SenderMACAddress_Data : in T_SLV_8; + SenderIPv4Address_nxt : out std_logic; + SenderIPv4Address_Data : in T_SLV_8; + TargetMACAddress_nxt : out std_logic; + TargetMACAddress_Data : in T_SLV_8; + TargetIPv4Address_nxt : out std_logic; + TargetIPv4Address_Data : in T_SLV_8; + + TX_Valid : out std_logic; + TX_Data : out T_SLV_8; + TX_SOF : out std_logic; + TX_EOF : out std_logic; + TX_Ack : in std_logic; + TX_Meta_DestMACAddress_rst : in std_logic; + TX_Meta_DestMACAddress_nxt : in std_logic; + TX_Meta_DestMACAddress_Data : out T_SLV_8 + ); end entity; architecture rtl of arp_BroadCast_Requester is - attribute FSM_ENCODING : string; - - type T_STATE is ( - ST_IDLE, - ST_SEND_HARDWARE_type_0, ST_SEND_HARDWARE_type_1, - ST_SEND_PROTOCOL_type_0, ST_SEND_PROTOCOL_type_1, - ST_SEND_HARDWARE_ADDRESS_LENGTH, ST_SEND_PROTOCOL_ADDRESS_LENGTH, - ST_SEND_OPERATION_0, ST_SEND_OPERATION_1, - ST_SEND_SENDER_MAC, ST_SEND_SENDER_IP, - ST_SEND_TARGET_MAC, ST_SEND_TARGET_IP, - ST_COMPLETE - ); - - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is "gray"; - - constant HARDWARE_ADDRESS_LENGTH : positive := 6; -- MAC -> 6 bytes - constant PROTOCOL_IPV4_ADDRESS_LENGTH : positive := 4; -- IPv4 -> 4 bytes - constant PROTOCOL_IPV6_ADDRESS_LENGTH : positive := 16; -- IPv6 -> 16 bytes - constant PROTOCOL_ADDRESS_LENGTH : positive := ite((ALLOWED_PROTOCOL_IPV6 = FALSE), PROTOCOL_IPV4_ADDRESS_LENGTH, PROTOCOL_IPV6_ADDRESS_LENGTH); -- IPv4 -> 4 bytes; IPv6 -> 16 bytes - - signal IsIPv4_l : std_logic := '1'; - signal IsIPv6_l : std_logic := '0'; - - constant READER_COUNTER_BITS : positive := log2ceilnz(imax(HARDWARE_ADDRESS_LENGTH, PROTOCOL_ADDRESS_LENGTH)); - signal Reader_Counter_rst : std_logic; - signal Reader_Counter_en : std_logic; - signal Reader_Counter_us : unsigned(READER_COUNTER_BITS - 1 downto 0) := (others => '0'); + attribute FSM_ENCODING : string; + + type T_STATE is ( + ST_IDLE, + ST_SEND_HARDWARE_type_0, ST_SEND_HARDWARE_type_1, + ST_SEND_PROTOCOL_type_0, ST_SEND_PROTOCOL_type_1, + ST_SEND_HARDWARE_ADDRESS_LENGTH, ST_SEND_PROTOCOL_ADDRESS_LENGTH, + ST_SEND_OPERATION_0, ST_SEND_OPERATION_1, + ST_SEND_SENDER_MAC, ST_SEND_SENDER_IP, + ST_SEND_TARGET_MAC, ST_SEND_TARGET_IP, + ST_COMPLETE + ); + + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is "gray"; + + constant HARDWARE_ADDRESS_LENGTH : positive := 6; -- MAC -> 6 bytes + constant PROTOCOL_IPV4_ADDRESS_LENGTH : positive := 4; -- IPv4 -> 4 bytes + constant PROTOCOL_IPV6_ADDRESS_LENGTH : positive := 16; -- IPv6 -> 16 bytes + constant PROTOCOL_ADDRESS_LENGTH : positive := ite((ALLOWED_PROTOCOL_IPV6 = FALSE), PROTOCOL_IPV4_ADDRESS_LENGTH, PROTOCOL_IPV6_ADDRESS_LENGTH); -- IPv4 -> 4 bytes; IPv6 -> 16 bytes + + signal IsIPv4_l : std_logic := '1'; + signal IsIPv6_l : std_logic := '0'; + + constant READER_COUNTER_BITS : positive := log2ceilnz(imax(HARDWARE_ADDRESS_LENGTH, PROTOCOL_ADDRESS_LENGTH)); + signal Reader_Counter_rst : std_logic; + signal Reader_Counter_en : std_logic; + signal Reader_Counter_us : unsigned(READER_COUNTER_BITS - 1 downto 0) := (others => '0'); begin - IsIPv4_l <= '1'; - IsIPv6_l <= '0'; - - process(Clock) - begin - if rising_edge(Clock) then - if (Reset = '1') then - State <= ST_IDLE; - else - State <= NextState; - end if; - end if; - end process; - - process(State, - SendRequest, - IsIPv4_l, IsIPv6_l, - TX_Ack, TX_Meta_DestMACAddress_rst, TX_Meta_DestMACAddress_nxt, - SenderMACAddress_Data, SenderIPv4Address_Data, TargetMACAddress_Data, TargetIPv4Address_Data, - Reader_Counter_us) - begin - NextState <= State; - - Complete <= '0'; - - TX_Valid <= '0'; - TX_Data <= (others => '0'); - TX_SOF <= '0'; - TX_EOF <= '0'; - TX_Meta_DestMACAddress_Data <= x"FF"; - - Address_rst <= '0'; - SenderMACAddress_nxt <= '0'; - SenderIPv4Address_nxt <= '0'; - TargetMACAddress_nxt <= '0'; - TargetIPv4Address_nxt <= '0'; - - Reader_Counter_rst <= '0'; - Reader_Counter_en <= '0'; - - case State is - when ST_IDLE => - if (SendRequest = '1') then - Address_rst <= '1'; - NextState <= ST_SEND_HARDWARE_type_0; - end if; - - when ST_SEND_HARDWARE_type_0 => - TX_Valid <= '1'; - TX_Data <= x"00"; - TX_SOF <= '1'; + IsIPv4_l <= '1'; + IsIPv6_l <= '0'; + + process(Clock) + begin + if rising_edge(Clock) then + if (Reset = '1') then + State <= ST_IDLE; + else + State <= NextState; + end if; + end if; + end process; + + process(State, + SendRequest, + IsIPv4_l, IsIPv6_l, + TX_Ack, TX_Meta_DestMACAddress_rst, TX_Meta_DestMACAddress_nxt, + SenderMACAddress_Data, SenderIPv4Address_Data, TargetMACAddress_Data, TargetIPv4Address_Data, + Reader_Counter_us) + begin + NextState <= State; + + Complete <= '0'; + + TX_Valid <= '0'; + TX_Data <= (others => '0'); + TX_SOF <= '0'; + TX_EOF <= '0'; + TX_Meta_DestMACAddress_Data <= x"FF"; + + Address_rst <= '0'; + SenderMACAddress_nxt <= '0'; + SenderIPv4Address_nxt <= '0'; + TargetMACAddress_nxt <= '0'; + TargetIPv4Address_nxt <= '0'; + + Reader_Counter_rst <= '0'; + Reader_Counter_en <= '0'; + + case State is + when ST_IDLE => + if (SendRequest = '1') then + Address_rst <= '1'; + NextState <= ST_SEND_HARDWARE_type_0; + end if; + + when ST_SEND_HARDWARE_type_0 => + TX_Valid <= '1'; + TX_Data <= x"00"; + TX_SOF <= '1'; -- Address_rst <= TX_Meta_DestMACAddress_rst; -- TargetMACAddress_nxt <= TX_Meta_DestMACAddress_nxt; - if (TX_Ack = '1') then - NextState <= ST_SEND_HARDWARE_type_1; - end if; - - when ST_SEND_HARDWARE_type_1 => - TX_Valid <= '1'; - TX_Data <= x"01"; - - if (TX_Ack = '1') then - NextState <= ST_SEND_PROTOCOL_type_0; - end if; - - when ST_SEND_PROTOCOL_type_0 => - TX_Valid <= '1'; - - if (IsIPv4_l = '1') then - TX_Data <= x"08"; - elsif (IsIPv6_l = '1') then - TX_Data <= x"86"; - end if; - - if (TX_Ack = '1') then - NextState <= ST_SEND_PROTOCOL_type_1; - end if; - - when ST_SEND_PROTOCOL_type_1 => - TX_Valid <= '1'; - - if (IsIPv4_l = '1') then - TX_Data <= x"00"; - elsif (IsIPv6_l = '1') then - TX_Data <= x"DD"; - end if; - - if (TX_Ack = '1') then - NextState <= ST_SEND_HARDWARE_ADDRESS_LENGTH; - end if; - - when ST_SEND_HARDWARE_ADDRESS_LENGTH => - TX_Valid <= '1'; - TX_Data <= x"06"; - - if (TX_Ack = '1') then - NextState <= ST_SEND_PROTOCOL_ADDRESS_LENGTH; - end if; - - when ST_SEND_PROTOCOL_ADDRESS_LENGTH => - TX_Valid <= '1'; - - if (IsIPv4_l = '1') then - TX_Data <= x"04"; - elsif (IsIPv6_l = '1') then - TX_Data <= x"10"; - end if; - - if (TX_Ack = '1') then - NextState <= ST_SEND_OPERATION_0; - end if; - - when ST_SEND_OPERATION_0 => - TX_Valid <= '1'; - TX_Data <= x"00"; - - if (TX_Ack = '1') then - NextState <= ST_SEND_OPERATION_1; - end if; - - when ST_SEND_OPERATION_1 => - TX_Valid <= '1'; - TX_Data <= x"01"; - - Address_rst <= '1'; - - if (TX_Ack = '1') then - NextState <= ST_SEND_SENDER_MAC; - end if; - - when ST_SEND_SENDER_MAC => - TX_Valid <= '1'; - TX_Data <= SenderMACAddress_Data; - - if (TX_Ack = '1') then - SenderMACAddress_nxt <= '1'; - Reader_Counter_en <= '1'; - - if (Reader_Counter_us = (HARDWARE_ADDRESS_LENGTH - 1)) then - Reader_Counter_rst <= '1'; - NextState <= ST_SEND_SENDER_IP; - end if; - end if; - - when ST_SEND_SENDER_IP => - TX_Valid <= '1'; - TX_Data <= SenderIPv4Address_Data; - - if (TX_Ack = '1') then - SenderIPv4Address_nxt <= '1'; - Reader_Counter_en <= '1'; - - if ((IsIPv4_l = '1') and (Reader_Counter_us = (PROTOCOL_IPV4_ADDRESS_LENGTH - 1))) then - Reader_Counter_rst <= '1'; - NextState <= ST_SEND_TARGET_MAC; - elsif ((IsIPv6_l = '1') and (Reader_Counter_us = (PROTOCOL_IPV6_ADDRESS_LENGTH - 1))) then - Reader_Counter_rst <= '1'; - NextState <= ST_SEND_TARGET_MAC; - end if; - end if; - - when ST_SEND_TARGET_MAC => - TX_Valid <= '1'; - TX_Data <= TargetMACAddress_Data; - - if (TX_Ack = '1') then - TargetMACAddress_nxt <= '1'; - Reader_Counter_en <= '1'; - - if (Reader_Counter_us = (HARDWARE_ADDRESS_LENGTH - 1)) then - Reader_Counter_rst <= '1'; - NextState <= ST_SEND_TARGET_IP; - end if; - end if; - - when ST_SEND_TARGET_IP => - TX_Valid <= '1'; - TX_Data <= TargetIPv4Address_Data; - - if (TX_Ack = '1') then - TargetIPv4Address_nxt <= '1'; - Reader_Counter_en <= '1'; - - if ((IsIPv4_l = '1') and (Reader_Counter_us = (PROTOCOL_IPV4_ADDRESS_LENGTH - 1))) then - TX_EOF <= '1'; - Reader_Counter_rst <= '1'; - NextState <= ST_COMPLETE; - elsif ((IsIPv6_l = '1') and (Reader_Counter_us = (PROTOCOL_IPV6_ADDRESS_LENGTH - 1))) then - TX_EOF <= '1'; - Reader_Counter_rst <= '1'; - NextState <= ST_COMPLETE; - end if; - end if; - - when ST_COMPLETE => - Complete <= '1'; - NextState <= ST_IDLE; - - end case; - end process; - - - process(Clock) - begin - if rising_edge(Clock) then - if ((Reset or Reader_Counter_rst) = '1') then - Reader_Counter_us <= (others => '0'); - elsif (Reader_Counter_en = '1') then - Reader_Counter_us <= Reader_Counter_us + 1; - end if; - end if; - end process; + if (TX_Ack = '1') then + NextState <= ST_SEND_HARDWARE_type_1; + end if; + + when ST_SEND_HARDWARE_type_1 => + TX_Valid <= '1'; + TX_Data <= x"01"; + + if (TX_Ack = '1') then + NextState <= ST_SEND_PROTOCOL_type_0; + end if; + + when ST_SEND_PROTOCOL_type_0 => + TX_Valid <= '1'; + + if (IsIPv4_l = '1') then + TX_Data <= x"08"; + elsif (IsIPv6_l = '1') then + TX_Data <= x"86"; + end if; + + if (TX_Ack = '1') then + NextState <= ST_SEND_PROTOCOL_type_1; + end if; + + when ST_SEND_PROTOCOL_type_1 => + TX_Valid <= '1'; + + if (IsIPv4_l = '1') then + TX_Data <= x"00"; + elsif (IsIPv6_l = '1') then + TX_Data <= x"DD"; + end if; + + if (TX_Ack = '1') then + NextState <= ST_SEND_HARDWARE_ADDRESS_LENGTH; + end if; + + when ST_SEND_HARDWARE_ADDRESS_LENGTH => + TX_Valid <= '1'; + TX_Data <= x"06"; + + if (TX_Ack = '1') then + NextState <= ST_SEND_PROTOCOL_ADDRESS_LENGTH; + end if; + + when ST_SEND_PROTOCOL_ADDRESS_LENGTH => + TX_Valid <= '1'; + + if (IsIPv4_l = '1') then + TX_Data <= x"04"; + elsif (IsIPv6_l = '1') then + TX_Data <= x"10"; + end if; + + if (TX_Ack = '1') then + NextState <= ST_SEND_OPERATION_0; + end if; + + when ST_SEND_OPERATION_0 => + TX_Valid <= '1'; + TX_Data <= x"00"; + + if (TX_Ack = '1') then + NextState <= ST_SEND_OPERATION_1; + end if; + + when ST_SEND_OPERATION_1 => + TX_Valid <= '1'; + TX_Data <= x"01"; + + Address_rst <= '1'; + + if (TX_Ack = '1') then + NextState <= ST_SEND_SENDER_MAC; + end if; + + when ST_SEND_SENDER_MAC => + TX_Valid <= '1'; + TX_Data <= SenderMACAddress_Data; + + if (TX_Ack = '1') then + SenderMACAddress_nxt <= '1'; + Reader_Counter_en <= '1'; + + if (Reader_Counter_us = (HARDWARE_ADDRESS_LENGTH - 1)) then + Reader_Counter_rst <= '1'; + NextState <= ST_SEND_SENDER_IP; + end if; + end if; + + when ST_SEND_SENDER_IP => + TX_Valid <= '1'; + TX_Data <= SenderIPv4Address_Data; + + if (TX_Ack = '1') then + SenderIPv4Address_nxt <= '1'; + Reader_Counter_en <= '1'; + + if ((IsIPv4_l = '1') and (Reader_Counter_us = (PROTOCOL_IPV4_ADDRESS_LENGTH - 1))) then + Reader_Counter_rst <= '1'; + NextState <= ST_SEND_TARGET_MAC; + elsif ((IsIPv6_l = '1') and (Reader_Counter_us = (PROTOCOL_IPV6_ADDRESS_LENGTH - 1))) then + Reader_Counter_rst <= '1'; + NextState <= ST_SEND_TARGET_MAC; + end if; + end if; + + when ST_SEND_TARGET_MAC => + TX_Valid <= '1'; + TX_Data <= TargetMACAddress_Data; + + if (TX_Ack = '1') then + TargetMACAddress_nxt <= '1'; + Reader_Counter_en <= '1'; + + if (Reader_Counter_us = (HARDWARE_ADDRESS_LENGTH - 1)) then + Reader_Counter_rst <= '1'; + NextState <= ST_SEND_TARGET_IP; + end if; + end if; + + when ST_SEND_TARGET_IP => + TX_Valid <= '1'; + TX_Data <= TargetIPv4Address_Data; + + if (TX_Ack = '1') then + TargetIPv4Address_nxt <= '1'; + Reader_Counter_en <= '1'; + + if ((IsIPv4_l = '1') and (Reader_Counter_us = (PROTOCOL_IPV4_ADDRESS_LENGTH - 1))) then + TX_EOF <= '1'; + Reader_Counter_rst <= '1'; + NextState <= ST_COMPLETE; + elsif ((IsIPv6_l = '1') and (Reader_Counter_us = (PROTOCOL_IPV6_ADDRESS_LENGTH - 1))) then + TX_EOF <= '1'; + Reader_Counter_rst <= '1'; + NextState <= ST_COMPLETE; + end if; + end if; + + when ST_COMPLETE => + Complete <= '1'; + NextState <= ST_IDLE; + + end case; + end process; + + + process(Clock) + begin + if rising_edge(Clock) then + if ((Reset or Reader_Counter_rst) = '1') then + Reader_Counter_us <= (others => '0'); + elsif (Reader_Counter_en = '1') then + Reader_Counter_us <= Reader_Counter_us + 1; + end if; + end if; + end process; end architecture; diff --git a/src/net/arp/arp_Cache.vhdl b/src/net/arp/arp_Cache.vhdl index 18b4b3b03..e093b7046 100644 --- a/src/net/arp/arp_Cache.vhdl +++ b/src/net/arp/arp_Cache.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -39,246 +39,245 @@ use work.net.all; entity arp_Cache is generic ( - CLOCK_FREQ : FREQ := 125 MHz; - REPLACEMENT_POLICY : string := "LRU"; - TAG_BYTE_ORDER : T_BYTE_ORDER := BIG_ENDIAN; - DATA_BYTE_ORDER : T_BYTE_ORDER := BIG_ENDIAN; - INITIAL_CACHE_CONTENT : T_NET_ARP_ARPCACHE_VECTOR + CLOCK_FREQ : FREQ := 125 MHz; + REPLACEMENT_POLICY : string := "LRU"; + TAG_BYTE_ORDER : T_BYTE_ORDER := BIG_ENDIAN; + DATA_BYTE_ORDER : T_BYTE_ORDER := BIG_ENDIAN; + INITIAL_CACHE_CONTENT : T_NET_ARP_ARPCACHE_VECTOR ); port ( - Clock : in std_logic; -- - Reset : in std_logic; -- - - Command : in T_NET_ARP_ARPCACHE_COMMAND; - Status : out T_NET_ARP_ARPCACHE_STATUS; - NewIPv4Address_rst : out std_logic; - NewIPv4Address_nxt : out std_logic; - NewIPv4Address_Data : in T_SLV_8; - NewMACAddress_rst : out std_logic; - NewMACAddress_nxt : out std_logic; - NewMACAddress_Data : in T_SLV_8; - - Lookup : in std_logic; - IPv4Address_rst : out std_logic; - IPv4Address_nxt : out std_logic; - IPv4Address_Data : in T_SLV_8; - - CacheResult : out T_CACHE_RESULT; - MACAddress_rst : in std_logic; - MACAddress_nxt : in std_logic; - MACAddress_Data : out T_SLV_8 + Clock : in std_logic; -- + Reset : in std_logic; -- + + Command : in T_NET_ARP_ARPCACHE_COMMAND; + Status : out T_NET_ARP_ARPCACHE_STATUS; + NewIPv4Address_rst : out std_logic; + NewIPv4Address_nxt : out std_logic; + NewIPv4Address_Data : in T_SLV_8; + NewMACAddress_rst : out std_logic; + NewMACAddress_nxt : out std_logic; + NewMACAddress_Data : in T_SLV_8; + + Lookup : in std_logic; + IPv4Address_rst : out std_logic; + IPv4Address_nxt : out std_logic; + IPv4Address_Data : in T_SLV_8; + + CacheResult : out T_CACHE_RESULT; + MACAddress_rst : in std_logic; + MACAddress_nxt : in std_logic; + MACAddress_Data : out T_SLV_8 ); end entity; architecture rtl of arp_Cache is - constant CACHE_LINES : positive := 8; - constant TAG_BITS : positive := 32; -- IPv4 address - constant DATA_BITS : positive := 48; -- MAC address - constant TAGCHUNK_BITS : positive := 8; - constant DATACHUNK_BITS : positive := 8; + constant CACHE_LINES : positive := 8; + constant TAG_BITS : positive := 32; -- IPv4 address + constant DATA_BITS : positive := 48; -- MAC address + constant TAGCHUNK_BITS : positive := 8; + constant DATACHUNK_BITS : positive := 8; - constant DATACHUNKS : positive := div_ceil(DATA_BITS, DATACHUNK_BITS); - constant DATACHUNK_INDEX_BITS : positive := log2ceilnz(DATACHUNKS); - constant CACHEMEMORY_INDEX_BITS : positive := log2ceilnz(CACHE_LINES); + constant DATACHUNKS : positive := div_ceil(DATA_BITS, DATACHUNK_BITS); + constant DATACHUNK_INDEX_BITS : positive := log2ceilnz(DATACHUNKS); + constant CACHEMEMORY_INDEX_BITS : positive := log2ceilnz(CACHE_LINES); function to_TagData(CacheContent : T_NET_ARP_ARPCACHE_VECTOR) return T_SLM is --- variable slvv : T_SLVV_32(CACHE_LINES - 1 downto 0) := (others => (others => '0')); - variable slvv : T_SLVV_32(CacheContent'high downto CacheContent'low) := (others => (others => '0')); +-- variable slvv : T_SLVV_32(CACHE_LINES - 1 downto 0) := (others => (others => '0')); + variable slvv : T_SLVV_32(CacheContent'high downto CacheContent'low) := (others => (others => '0')); begin for i in CacheContent'range loop - slvv(i) := to_slv(CacheContent(i).Tag); + slvv(i) := to_slv(CacheContent(i).Tag); end loop; return to_slm(slvv); end function; function to_CacheData_slvv_48(CacheContent : T_NET_ARP_ARPCACHE_VECTOR) return T_SLVV_48 is - variable slvv : T_SLVV_48(CACHE_LINES - 1 downto 0) := (others => (others => '0')); + variable slvv : T_SLVV_48(CACHE_LINES - 1 downto 0) := (others => (others => '0')); begin for i in CacheContent'range loop - slvv(i) := to_slv(CacheContent(i).MAC); + slvv(i) := to_slv(CacheContent(i).MAC); end loop; return slvv; end function; function to_CacheMemory(CacheContent : T_NET_ARP_ARPCACHE_VECTOR) return T_SLVV_8 is - constant BYTES_PER_LINE : positive := 6; - constant slvv : T_SLVV_48(CACHE_LINES - 1 downto 0) := to_CacheData_slvv_48(CacheContent); - variable result : T_SLVV_8((CACHE_LINES * BYTES_PER_LINE) - 1 downto 0); + constant BYTES_PER_LINE : positive := 6; + constant slvv : T_SLVV_48(CACHE_LINES - 1 downto 0) := to_CacheData_slvv_48(CacheContent); + variable result : T_SLVV_8((CACHE_LINES * BYTES_PER_LINE) - 1 downto 0); begin for i in slvv'range loop for j in 0 to BYTES_PER_LINE - 1 loop - result((i * BYTES_PER_LINE) + j) := slvv(i)((j * 8) + 7 downto j * 8); + result((i * BYTES_PER_LINE) + j) := slvv(i)((j * 8) + 7 downto j * 8); end loop; end loop; return result; end function; - constant INITIAL_TAGS : T_SLM := to_TagData(INITIAL_CACHE_CONTENT); - constant INITIAL_DATALINES : T_SLVV_8 := to_CacheMemory(INITIAL_CACHE_CONTENT); + constant INITIAL_TAGS : T_SLM := to_TagData(INITIAL_CACHE_CONTENT); + constant INITIAL_DATALINES : T_SLVV_8 := to_CacheMemory(INITIAL_CACHE_CONTENT); - signal ReadWrite : std_logic; + signal ReadWrite : std_logic; type T_FSMREPLACE_STATE is (ST_IDLE, ST_REPLACE); - signal FSMReplace_State : T_FSMREPLACE_STATE := ST_IDLE; - signal FSMReplace_NextState : T_FSMREPLACE_STATE; + signal FSMReplace_State : T_FSMREPLACE_STATE := ST_IDLE; + signal FSMReplace_NextState : T_FSMREPLACE_STATE; - signal Insert : std_logic; + signal Insert : std_logic; - signal TU_NewTag_rst : std_logic; - signal TU_NewTag_nxt : std_logic; - signal NewTag_Data : T_SLV_8; + signal TU_NewTag_rst : std_logic; + signal TU_NewTag_nxt : std_logic; + signal NewTag_Data : T_SLV_8; - signal NewCacheLine_Data : T_SLV_8; + signal NewCacheLine_Data : T_SLV_8; - signal TU_Tag_rst : std_logic; - signal TU_Tag_nxt : std_logic; - signal TU_Tag_Data : T_SLV_8; - signal CacheHit : std_logic; - signal CacheMiss : std_logic; + signal TU_Tag_rst : std_logic; + signal TU_Tag_nxt : std_logic; + signal TU_Tag_Data : T_SLV_8; + signal CacheHit : std_logic; + signal CacheMiss : std_logic; - signal TU_Index : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); - signal TU_Index_d : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); --- signal TU_Index_us : UNSIGNED(CACHEMEMORY_INDEX_BITS - 1 downto 0); + signal TU_Index : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); + signal TU_Index_d : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); +-- signal TU_Index_us : UNSIGNED(CACHEMEMORY_INDEX_BITS - 1 downto 0); - signal TU_NewIndex : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); - signal TU_Replaced : std_logic; + signal TU_NewIndex : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); + signal TU_Replaced : std_logic; - signal TU_TagHit : std_logic; - signal TU_TagMiss : std_logic; + signal TU_TagHit : std_logic; + signal TU_TagMiss : std_logic; - constant TICKCOUNTER_RES : T_TIME := 10.0e-3; - constant TICKCOUNTER_MAX : positive := TimingToCycles(TICKCOUNTER_RES, CLOCK_FREQ); - constant TICKCOUNTER_BITS : positive := log2ceilnz(TICKCOUNTER_MAX); + constant TICKCOUNTER_RES : T_TIME := 10.0e-3; + constant TICKCOUNTER_MAX : positive := TimingToCycles(TICKCOUNTER_RES, CLOCK_FREQ); + constant TICKCOUNTER_BITS : positive := log2ceilnz(TICKCOUNTER_MAX); - signal TickCounter_s : signed(TICKCOUNTER_BITS downto 0) := to_signed(TICKCOUNTER_MAX, TICKCOUNTER_BITS + 1); - signal Tick : std_logic; + signal TickCounter_s : signed(TICKCOUNTER_BITS downto 0) := to_signed(TICKCOUNTER_MAX, TICKCOUNTER_BITS + 1); + signal Tick : std_logic; - signal Exp_Expired : std_logic; - signal Exp_KeyOut : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); + signal Exp_Expired : std_logic; + signal Exp_KeyOut : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); - signal DataChunkIndex_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); - signal DataChunkIndex_l_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); - signal NewDataChunkIndex_en : std_logic; - signal NewDataChunkIndex_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); - signal NewDataChunkIndex_max_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); - signal CacheMemory_we : std_logic; - signal CacheMemory : T_SLVV_8((CACHE_LINES * T_NET_MAC_ADDRESS'length) - 1 downto 0) := INITIAL_DATALINES; - signal Memory_ReadWrite : std_logic; + signal DataChunkIndex_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); + signal DataChunkIndex_l_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); + signal NewDataChunkIndex_en : std_logic; + signal NewDataChunkIndex_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); + signal NewDataChunkIndex_max_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); + signal CacheMemory_we : std_logic; + signal CacheMemory : T_SLVV_8((CACHE_LINES * T_NET_MAC_ADDRESS'length) - 1 downto 0) := INITIAL_DATALINES; + signal Memory_ReadWrite : std_logic; begin process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - FSMReplace_State <= ST_IDLE; + FSMReplace_State <= ST_IDLE; else - FSMReplace_State <= FSMReplace_NextState; + FSMReplace_State <= FSMReplace_NextState; end if; end if; end process; process(FSMReplace_State, Command, TU_Replaced, TU_NewTag_rst, TU_NewTag_nxt, NewDataChunkIndex_us, NewDataChunkIndex_max_us) begin - FSMReplace_NextState <= FSMReplace_State; + FSMReplace_NextState <= FSMReplace_State; - Status <= NET_ARP_ARPCACHE_STATUS_IDLE; + Status <= NET_ARP_ARPCACHE_STATUS_IDLE; - NewMACAddress_rst <= '0'; - NewMACAddress_nxt <= '0'; - NewIPv4Address_rst <= TU_NewTag_rst; - NewIPv4Address_nxt <= TU_NewTag_nxt; + NewMACAddress_rst <= '0'; + NewMACAddress_nxt <= '0'; + NewIPv4Address_rst <= TU_NewTag_rst; + NewIPv4Address_nxt <= TU_NewTag_nxt; - CacheMemory_we <= '0'; - NewDataChunkIndex_en <= '0'; + CacheMemory_we <= '0'; + NewDataChunkIndex_en <= '0'; - Insert <= '0'; + Insert <= '0'; case FSMReplace_State is when ST_IDLE => - NewMACAddress_rst <= '1'; + NewMACAddress_rst <= '1'; case Command is when NET_ARP_ARPCACHE_CMD_NONE => null; when NET_ARP_ARPCACHE_CMD_ADD => - Status <= NET_ARP_ARPCACHE_STATUS_UPDATING; + Status <= NET_ARP_ARPCACHE_STATUS_UPDATING; - Insert <= '1'; - CacheMemory_we <= '1'; - NewMACAddress_rst <= '0'; - NewMACAddress_nxt <= '1'; - NewDataChunkIndex_en <= '1'; + Insert <= '1'; + CacheMemory_we <= '1'; + NewMACAddress_rst <= '0'; + NewMACAddress_nxt <= '1'; + NewDataChunkIndex_en <= '1'; - FSMReplace_NextState <= ST_REPLACE; + FSMReplace_NextState <= ST_REPLACE; when others => null; end case; when ST_REPLACE => - Status <= NET_ARP_ARPCACHE_STATUS_UPDATING; + Status <= NET_ARP_ARPCACHE_STATUS_UPDATING; - CacheMemory_we <= '1'; - NewMACAddress_nxt <= '1'; - NewDataChunkIndex_en <= '1'; + CacheMemory_we <= '1'; + NewMACAddress_nxt <= '1'; + NewDataChunkIndex_en <= '1'; if (NewDataChunkIndex_us = NewDataChunkIndex_max_us) then - Status <= NET_ARP_ARPCACHE_STATUS_UPDATE_COMPLETE; - FSMReplace_NextState <= ST_IDLE; + Status <= NET_ARP_ARPCACHE_STATUS_UPDATE_COMPLETE; + FSMReplace_NextState <= ST_IDLE; end if; end case; end process; - ReadWrite <= '0'; - NewTag_Data <= NewIPv4Address_Data; - NewCacheLine_Data <= NewMACAddress_Data; + ReadWrite <= '0'; + NewTag_Data <= NewIPv4Address_Data; + NewCacheLine_Data <= NewMACAddress_Data; - IPv4Address_rst <= TU_Tag_rst; - IPv4Address_nxt <= TU_Tag_nxt; - TU_Tag_Data <= IPv4Address_Data; + IPv4Address_rst <= TU_Tag_rst; + IPv4Address_nxt <= TU_Tag_nxt; + TU_Tag_Data <= IPv4Address_Data; - CacheResult <= to_Cache_Result(CacheHit, CacheMiss); + CacheResult <= to_Cache_Result(CacheHit, CacheMiss); -- Cache TagUnit --- TU: entity work.Cache_TagUnit_seq - TU: entity work.cache_TagUnit_seq + TU: entity work.cache_TagUnit_Sequential generic map ( - REPLACEMENT_POLICY => REPLACEMENT_POLICY, - CACHE_LINES => CACHE_LINES, - ASSOCIATIVITY => CACHE_LINES, - TAG_BITS => TAG_BITS, - CHUNK_BITS => TAGCHUNK_BITS, - TAG_BYTE_ORDER => TAG_BYTE_ORDER, - USE_INITIAL_TAGS => TRUE, - INITIAL_TAGS => INITIAL_TAGS + REPLACEMENT_POLICY => REPLACEMENT_POLICY, + CACHE_LINES => CACHE_LINES, + ASSOCIATIVITY => CACHE_LINES, + TAG_BITS => TAG_BITS, + CHUNK_BITS => TAGCHUNK_BITS, + TAG_BYTE_ORDER => TAG_BYTE_ORDER, + USE_INITIAL_TAGS => TRUE, + INITIAL_TAGS => INITIAL_TAGS ) port map ( - Clock => Clock, - Reset => Reset, - - Replace => Insert, - Replaced => TU_Replaced, - Replace_NewTag_rst => TU_NewTag_rst, - Replace_NewTag_rev => open, - Replace_NewTag_nxt => TU_NewTag_nxt, - Replace_NewTag_Data => NewTag_Data, - Replace_NewIndex => TU_NewIndex, - - Request => Lookup, - Request_ReadWrite => '0', - Request_Invalidate => '0',--Invalidate, - Request_Tag_rst => TU_Tag_rst, - Request_Tag_rev => open, - Request_Tag_nxt => TU_Tag_nxt, - Request_Tag_Data => TU_Tag_Data, - Request_Index => TU_Index, - Request_TagHit => TU_TagHit, - Request_TagMiss => TU_TagMiss + Clock => Clock, + Reset => Reset, + + Replace => Insert, + Replaced => TU_Replaced, + Replace_NewTag_rst => TU_NewTag_rst, + Replace_NewTag_rev => open, + Replace_NewTag_nxt => TU_NewTag_nxt, + Replace_NewTag_Data => NewTag_Data, + Replace_NewIndex => TU_NewIndex, + + Request => Lookup, + Request_ReadWrite => '0', + Request_Invalidate => '0',--Invalidate, + Request_Tag_rst => TU_Tag_rst, + Request_Tag_rev => open, + Request_Tag_nxt => TU_Tag_nxt, + Request_Tag_Data => TU_Tag_Data, + Request_Index => TU_Index, + Request_TagHit => TU_TagHit, + Request_TagMiss => TU_TagMiss ); -- expiration time tick generator @@ -286,40 +285,40 @@ begin begin if rising_edge(Clock) then if (Tick = '1') then - TickCounter_s <= to_signed(TICKCOUNTER_MAX, TickCounter_s'length); + TickCounter_s <= to_signed(TICKCOUNTER_MAX, TickCounter_s'length); else - TickCounter_s <= TickCounter_s - 1; + TickCounter_s <= TickCounter_s - 1; end if; end if; end process; - Tick <= TickCounter_s(TickCounter_s'high); + Tick <= TickCounter_s(TickCounter_s'high); --- Exp: entity work.list_expire - Exp: entity work.list_expire +-- Exp: entity work.list_Expire + Exp: entity work.list_Expire generic map ( - CLOCK_CYCLE_TICKS => 65536, - EXPIRATION_TIME_TICKS => 8192, - ELEMENTS => CACHE_LINES, - KEY_BITS => CACHEMEMORY_INDEX_BITS + CLOCK_CYCLE_TICKS => 65536, + EXPIRATION_TIME_TICKS => 8192, + ELEMENTS => CACHE_LINES, + KEY_BITS => CACHEMEMORY_INDEX_BITS ) port map ( - Clock => Clock, - Reset => Reset, + Clock => Clock, + Reset => Reset, - Tick => Tick, + Tick => Tick, - Insert => Insert, - KeyIn => TU_NewIndex, + Insert => Insert, + KeyIn => TU_NewIndex, - Expired => Exp_Expired, - KeyOut => Exp_KeyOut + Expired => Exp_Expired, + KeyOut => Exp_KeyOut ); -- latch TU_Index on TagHit --- TU_Index_us <= unsigned(TU_Index) when rising_edge(Clock) AND (TU_TagHit = '1'); +-- TU_Index_us <= unsigned(TU_Index) when rising_edge(Clock) AND (TU_TagHit = '1'); -- NewDataChunkIndex counter process(Clock) @@ -327,17 +326,17 @@ begin if rising_edge(Clock) then if (NewDataChunkIndex_en = '0') then if (DATA_BYTE_ORDER = LITTLE_ENDIAN) then - NewDataChunkIndex_us <= resize(unsigned(TU_NewIndex) * 6, NewDataChunkIndex_us'length); - NewDataChunkIndex_max_us <= resize(unsigned(TU_NewIndex) * 6, NewDataChunkIndex_us'length) + to_unsigned((DATACHUNKS - 1), NewDataChunkIndex_us'length); + NewDataChunkIndex_us <= resize(unsigned(TU_NewIndex) * 6, NewDataChunkIndex_us'length); + NewDataChunkIndex_max_us <= resize(unsigned(TU_NewIndex) * 6, NewDataChunkIndex_us'length) + to_unsigned((DATACHUNKS - 1), NewDataChunkIndex_us'length); else - NewDataChunkIndex_us <= resize(unsigned(TU_NewIndex) * 6, NewDataChunkIndex_us'length) + to_unsigned((DATACHUNKS - 1), NewDataChunkIndex_us'length); - NewDataChunkIndex_max_us <= resize(unsigned(TU_NewIndex) * 6, NewDataChunkIndex_us'length); + NewDataChunkIndex_us <= resize(unsigned(TU_NewIndex) * 6, NewDataChunkIndex_us'length) + to_unsigned((DATACHUNKS - 1), NewDataChunkIndex_us'length); + NewDataChunkIndex_max_us <= resize(unsigned(TU_NewIndex) * 6, NewDataChunkIndex_us'length); end if; else if (DATA_BYTE_ORDER = LITTLE_ENDIAN) then - NewDataChunkIndex_us <= NewDataChunkIndex_us + 1; + NewDataChunkIndex_us <= NewDataChunkIndex_us + 1; else - NewDataChunkIndex_us <= NewDataChunkIndex_us - 1; + NewDataChunkIndex_us <= NewDataChunkIndex_us - 1; end if; end if; end if; @@ -345,43 +344,43 @@ begin -- DataChunkIndex counter process(Clock, TU_Index) - variable temp : unsigned(DataChunkIndex_us'range); + variable temp : unsigned(DataChunkIndex_us'range); begin if (DATA_BYTE_ORDER = LITTLE_ENDIAN) then - temp := resize(unsigned(TU_Index) * 6, DataChunkIndex_us'length); + temp := resize(unsigned(TU_Index) * 6, DataChunkIndex_us'length); else - temp := resize(unsigned(TU_Index) * 6, DataChunkIndex_us'length) + to_unsigned((DATACHUNKS - 1), DataChunkIndex_us'length); + temp := resize(unsigned(TU_Index) * 6, DataChunkIndex_us'length) + to_unsigned((DATACHUNKS - 1), DataChunkIndex_us'length); end if; if rising_edge(Clock) then if (TU_TagHit = '1') then - DataChunkIndex_us <= temp; - DataChunkIndex_l_us <= temp; + DataChunkIndex_us <= temp; + DataChunkIndex_l_us <= temp; elsif (MACAddress_rst = '1') then - DataChunkIndex_us <= DataChunkIndex_l_us; + DataChunkIndex_us <= DataChunkIndex_l_us; elsif (MACAddress_nxt = '1') then if (DATA_BYTE_ORDER = LITTLE_ENDIAN) then - DataChunkIndex_us <= DataChunkIndex_us + 1; + DataChunkIndex_us <= DataChunkIndex_us + 1; else - DataChunkIndex_us <= DataChunkIndex_us - 1; + DataChunkIndex_us <= DataChunkIndex_us - 1; end if; end if; end if; end process; -- Cache Memory - port 1 - Memory_ReadWrite <= ReadWrite; + Memory_ReadWrite <= ReadWrite; process(Clock) begin if rising_edge(Clock) then if (CacheMemory_we = '1') then - CacheMemory(to_integer(NewDataChunkIndex_us)) <= NewCacheLine_Data; + CacheMemory(to_integer(NewDataChunkIndex_us)) <= NewCacheLine_Data; end if; end if; end process; - CacheHit <= TU_TagHit; - CacheMiss <= TU_TagMiss; - MACAddress_Data <= CacheMemory(to_index(DataChunkIndex_us, CacheMemory'high)); + CacheHit <= TU_TagHit; + CacheMiss <= TU_TagMiss; + MACAddress_Data <= CacheMemory(to_index(DataChunkIndex_us, CacheMemory'high)); end architecture; diff --git a/src/net/arp/arp_IPPool.vhdl b/src/net/arp/arp_IPPool.vhdl index f179058c1..1f845dcd7 100644 --- a/src/net/arp/arp_IPPool.vhdl +++ b/src/net/arp/arp_IPPool.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -38,129 +38,128 @@ use work.net.all; entity arp_IPPool is generic ( - IPPOOL_SIZE : positive; - INITIAL_IPV4ADDRESSES : T_NET_IPV4_ADDRESS_VECTOR := (0 to 7 => C_NET_IPV4_ADDRESS_EMPTY) + IPPOOL_SIZE : positive; + INITIAL_IPV4ADDRESSES : T_NET_IPV4_ADDRESS_VECTOR := (0 to 7 => C_NET_IPV4_ADDRESS_EMPTY) ); port ( - Clock : in std_logic; -- - Reset : in std_logic; -- + Clock : in std_logic; -- + Reset : in std_logic; -- --- Command : in T_ETHERNET_ARP_IPPOOL_COMMAND; --- IPv4Address : in T_NET_IPV4_ADDRESS; --- MACAddress : in T_ETHERNET_MAC_ADDRESS; +-- Command : in T_ETHERNET_ARP_IPPOOL_COMMAND; +-- IPv4Address : in T_NET_IPV4_ADDRESS; +-- MACAddress : in T_ETHERNET_MAC_ADDRESS; - Lookup : in std_logic; - IPv4Address_rst : out std_logic; - IPv4Address_nxt : out std_logic; - IPv4Address_Data : in T_SLV_8; + Lookup : in std_logic; + IPv4Address_rst : out std_logic; + IPv4Address_nxt : out std_logic; + IPv4Address_Data : in T_SLV_8; - PoolResult : out T_CACHE_RESULT + PoolResult : out T_CACHE_RESULT ); end entity; architecture rtl of arp_IPPool is - constant CACHE_LINES : positive := imax(IPPOOL_SIZE, INITIAL_IPV4ADDRESSES'length); - constant TAG_BITS : positive := 32; - constant TAGCHUNK_BITS : positive := 8; + constant CACHE_LINES : positive := imax(IPPOOL_SIZE, INITIAL_IPV4ADDRESSES'length); + constant TAG_BITS : positive := 32; + constant TAGCHUNK_BITS : positive := 8; --- constant TAGCHUNKS : POSITIVE := div_ceil(TAG_BITS, CHUNK_BITS); --- constant CHUNK_INDEX_BITS : POSITIVE := log2ceilnz(CHUNKS); - constant CACHEMEMORY_INDEX_BITS : positive := log2ceilnz(CACHE_LINES); +-- constant TAGCHUNKS : POSITIVE := div_ceil(TAG_BITS, CHUNK_BITS); +-- constant CHUNK_INDEX_BITS : POSITIVE := log2ceilnz(CHUNKS); + constant CACHEMEMORY_INDEX_BITS : positive := log2ceilnz(CACHE_LINES); function to_TagData(CacheContent : T_NET_IPV4_ADDRESS_VECTOR) return T_SLM is - variable slvv : T_SLVV_32(CACHE_LINES - 1 downto 0) := (others => (others => '0')); + variable slvv : T_SLVV_32(CACHE_LINES - 1 downto 0) := (others => (others => '0')); begin for i in CacheContent'range loop - slvv(i) := to_slv(CacheContent(i)); + slvv(i) := to_slv(CacheContent(i)); end loop; return to_slm(slvv); end function; - constant INITIAL_TAGS : T_SLM := to_TagData(INITIAL_IPV4ADDRESSES); + constant INITIAL_TAGS : T_SLM := to_TagData(INITIAL_IPV4ADDRESSES); - signal ReadWrite : std_logic; + signal ReadWrite : std_logic; - signal Insert : std_logic; - signal TU_NewTag_rst : std_logic; - signal TU_NewTag_nxt : std_logic; - signal NewTag_Data : T_SLV_8; - signal TU_Tag_rst : std_logic; - signal TU_Tag_nxt : std_logic; - signal TU_Tag_Data : T_SLV_8; - signal CacheHit : std_logic; - signal CacheMiss : std_logic; + signal Insert : std_logic; + signal TU_NewTag_rst : std_logic; + signal TU_NewTag_nxt : std_logic; + signal NewTag_Data : T_SLV_8; + signal TU_Tag_rst : std_logic; + signal TU_Tag_nxt : std_logic; + signal TU_Tag_Data : T_SLV_8; + signal CacheHit : std_logic; + signal CacheMiss : std_logic; - signal TU_Index : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); - signal TU_Index_d : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); - signal TU_Index_us : unsigned(CACHEMEMORY_INDEX_BITS - 1 downto 0); - signal TU_NewIndex : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); - signal TU_Replace : std_logic; + signal TU_Index : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); + signal TU_Index_d : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); + signal TU_Index_us : unsigned(CACHEMEMORY_INDEX_BITS - 1 downto 0); + signal TU_NewIndex : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); + signal TU_Replace : std_logic; - signal TU_TagHit : std_logic; - signal TU_TagMiss : std_logic; + signal TU_TagHit : std_logic; + signal TU_TagMiss : std_logic; begin --- process(Command) --- begin --- Insert <= '0'; +-- process(Command) +-- begin +-- Insert <= '0'; -- --- case Command is --- when NET_NDP_NeighborCache_CMD_NONE => null; --- when NET_NDP_NeighborCache_CMD_ADD => Insert <= '1'; +-- case Command is +-- when NET_NDP_NeighborCache_CMD_NONE => null; +-- when NET_NDP_NeighborCache_CMD_ADD => Insert <= '1'; -- --- end case; --- end process; +-- end case; +-- end process; -- FIXME: add correct assignment - Insert <= '0'; + Insert <= '0'; - ReadWrite <= '0'; - NewTag_Data <= (others => '0'); + ReadWrite <= '0'; + NewTag_Data <= (others => '0'); - TU_Tag_Data <= IPv4Address_Data; - IPv4Address_rst <= TU_Tag_rst; - IPv4Address_nxt <= TU_Tag_nxt; + TU_Tag_Data <= IPv4Address_Data; + IPv4Address_rst <= TU_Tag_rst; + IPv4Address_nxt <= TU_Tag_nxt; - PoolResult <= to_Cache_Result(CacheHit, CacheMiss); + PoolResult <= to_Cache_Result(CacheHit, CacheMiss); -- Cache TagUnit --- TU: entity work.Cache_TagUnit_seq - TU: entity work.cache_TagUnit_seq + TU: entity work.cache_TagUnit_Sequential generic map ( - REPLACEMENT_POLICY => "LRU", - CACHE_LINES => CACHE_LINES, - ASSOCIATIVITY => CACHE_LINES, - TAG_BITS => TAG_BITS, - CHUNK_BITS => TAGCHUNK_BITS, - TAG_BYTE_ORDER => BIG_ENDIAN, - INITIAL_TAGS => INITIAL_TAGS + REPLACEMENT_POLICY => "LRU", + CACHE_LINES => CACHE_LINES, + ASSOCIATIVITY => CACHE_LINES, + TAG_BITS => TAG_BITS, + CHUNK_BITS => TAGCHUNK_BITS, + TAG_BYTE_ORDER => BIG_ENDIAN, + INITIAL_TAGS => INITIAL_TAGS ) port map ( - Clock => Clock, - Reset => Reset, - - Replace => Insert, - Replace_NewTag_rst => TU_NewTag_rst, - Replace_NewTag_nxt => TU_NewTag_nxt, - Replace_NewTag_Data => NewTag_Data, - Replace_NewIndex => TU_NewIndex, - Replaced => TU_Replace, - - Request => Lookup, - Request_ReadWrite => '0', - Request_Invalidate => '0',--Invalidate, - Request_Tag_rst => TU_Tag_rst, - Request_Tag_nxt => TU_Tag_nxt, - Request_Tag_Data => TU_Tag_Data, - Request_Index => open,--TU_Index, - Request_TagHit => TU_TagHit, - Request_TagMiss => TU_TagMiss + Clock => Clock, + Reset => Reset, + + Replace => Insert, + Replace_NewTag_rst => TU_NewTag_rst, + Replace_NewTag_nxt => TU_NewTag_nxt, + Replace_NewTag_Data => NewTag_Data, + Replace_NewIndex => TU_NewIndex, + Replaced => TU_Replace, + + Request => Lookup, + Request_ReadWrite => '0', + Request_Invalidate => '0',--Invalidate, + Request_Tag_rst => TU_Tag_rst, + Request_Tag_nxt => TU_Tag_nxt, + Request_Tag_Data => TU_Tag_Data, + Request_Index => open,--TU_Index, + Request_TagHit => TU_TagHit, + Request_TagMiss => TU_TagMiss ); -- latch TU_Index on TagHit --- TU_Index_us <= unsigned(TU_Index) when rising_edge(Clock) AND (TU_TagHit = '1'); +-- TU_Index_us <= unsigned(TU_Index) when rising_edge(Clock) AND (TU_TagHit = '1'); - CacheHit <= TU_TagHit; - CacheMiss <= TU_TagMiss; + CacheHit <= TU_TagHit; + CacheMiss <= TU_TagMiss; end architecture; diff --git a/src/net/arp/arp_UniCast_Receiver.vhdl b/src/net/arp/arp_UniCast_Receiver.vhdl index 40dbec925..9fb67faf2 100644 --- a/src/net/arp/arp_UniCast_Receiver.vhdl +++ b/src/net/arp/arp_UniCast_Receiver.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,134 +37,134 @@ use work.net.all; entity arp_UniCast_Receiver is generic ( - ALLOWED_PROTOCOL_IPV4 : boolean := TRUE; - ALLOWED_PROTOCOL_IPV6 : boolean := FALSE + ALLOWED_PROTOCOL_IPV4 : boolean := TRUE; + ALLOWED_PROTOCOL_IPV6 : boolean := FALSE ); port ( - Clock : in std_logic; -- - Reset : in std_logic; -- - - RX_Valid : in std_logic; - RX_Data : in T_SLV_8; - RX_SOF : in std_logic; - RX_EOF : in std_logic; - RX_Ack : out std_logic; - RX_Meta_rst : out std_logic; - RX_Meta_SrcMACAddress_nxt : out std_logic; - RX_Meta_SrcMACAddress_Data : in T_SLV_8; - RX_Meta_DestMACAddress_nxt : out std_logic; - RX_Meta_DestMACAddress_Data : in T_SLV_8; - - Clear : in std_logic; - Error : out std_logic; - - ResponseReceived : out std_logic; - Address_rst : in std_logic; - SenderMACAddress_nxt : in std_logic; - SenderMACAddress_Data : out T_SLV_8; - SenderIPAddress_nxt : in std_logic; - SenderIPAddress_Data : out T_SLV_8; - TargetIPAddress_nxt : in std_logic; - TargetIPAddress_Data : out T_SLV_8; - TargetMACAddress_nxt : in std_logic; - TargetMACAddress_Data : out T_SLV_8 + Clock : in std_logic; -- + Reset : in std_logic; -- + + RX_Valid : in std_logic; + RX_Data : in T_SLV_8; + RX_SOF : in std_logic; + RX_EOF : in std_logic; + RX_Ack : out std_logic; + RX_Meta_rst : out std_logic; + RX_Meta_SrcMACAddress_nxt : out std_logic; + RX_Meta_SrcMACAddress_Data : in T_SLV_8; + RX_Meta_DestMACAddress_nxt : out std_logic; + RX_Meta_DestMACAddress_Data : in T_SLV_8; + + Clear : in std_logic; + Error : out std_logic; + + ResponseReceived : out std_logic; + Address_rst : in std_logic; + SenderMACAddress_nxt : in std_logic; + SenderMACAddress_Data : out T_SLV_8; + SenderIPAddress_nxt : in std_logic; + SenderIPAddress_Data : out T_SLV_8; + TargetIPAddress_nxt : in std_logic; + TargetIPAddress_Data : out T_SLV_8; + TargetMACAddress_nxt : in std_logic; + TargetMACAddress_Data : out T_SLV_8 ); end entity; architecture rtl of arp_UniCast_Receiver is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; - subtype T_MAC_BYTEINDEX is natural range 0 to 5; - subtype T_IP_BYTEINDEX is natural range 0 to 3; + subtype T_MAC_BYTEINDEX is natural range 0 to 5; + subtype T_IP_BYTEINDEX is natural range 0 to 3; - type T_STATE is ( + type T_STATE is ( ST_IDLE, ST_RECEIVE_HARDWARE_TYPE_1, ST_RECEIVE_PROTOCOL_TYPE_0, ST_RECEIVE_PROTOCOL_TYPE_1, ST_RECEIVE_HARDWARE_ADDRESS_LENGTH, ST_RECEIVE_PROTOCOL_ADDRESS_LENGTH, - ST_RECEIVE_OPERATION_0, ST_RECEIVE_OPERATION_1, - ST_RECEIVE_SENDER_MAC, ST_RECEIVE_SENDER_IP, - ST_RECEIVE_TARGET_MAC, ST_RECEIVE_TARGET_IP, + ST_RECEIVE_OPERATION_0, ST_RECEIVE_OPERATION_1, + ST_RECEIVE_SENDER_MAC, ST_RECEIVE_SENDER_IP, + ST_RECEIVE_TARGET_MAC, ST_RECEIVE_TARGET_IP, ST_DISCARD_ETHERNET_PADDING_BYTES, ST_COMPLETE, ST_DISCARD_FRAME, ST_ERROR ); - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is "gray"; --"speed1"; + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is "gray"; --"speed1"; - signal Is_SOF : std_logic; - signal Is_EOF : std_logic; + signal Is_SOF : std_logic; + signal Is_EOF : std_logic; - constant HARDWARE_ADDRESS_LENGTH : positive := 6; -- MAC -> 6 bytes - constant PROTOCOL_IPV4_ADDRESS_LENGTH : positive := 4; -- IPv4 -> 4 bytes - constant PROTOCOL_IPV6_ADDRESS_LENGTH : positive := 16; -- IPv6 -> 16 bytes - constant PROTOCOL_ADDRESS_LENGTH : positive := ite((ALLOWED_PROTOCOL_IPV6 = FALSE), PROTOCOL_IPV4_ADDRESS_LENGTH, PROTOCOL_IPV6_ADDRESS_LENGTH); -- IPv4 -> 4 bytes; IPv6 -> 16 bytes + constant HARDWARE_ADDRESS_LENGTH : positive := 6; -- MAC -> 6 bytes + constant PROTOCOL_IPV4_ADDRESS_LENGTH : positive := 4; -- IPv4 -> 4 bytes + constant PROTOCOL_IPV6_ADDRESS_LENGTH : positive := 16; -- IPv6 -> 16 bytes + constant PROTOCOL_ADDRESS_LENGTH : positive := ite((ALLOWED_PROTOCOL_IPV6 = FALSE), PROTOCOL_IPV4_ADDRESS_LENGTH, PROTOCOL_IPV6_ADDRESS_LENGTH); -- IPv4 -> 4 bytes; IPv6 -> 16 bytes - subtype T_HARDWARE_ADDRESS_INDEX is natural range 0 to HARDWARE_ADDRESS_LENGTH - 1; - subtype T_PROTOCOL_ADDRESS_INDEX is natural range 0 to PROTOCOL_ADDRESS_LENGTH - 1; + subtype T_HARDWARE_ADDRESS_INDEX is natural range 0 to HARDWARE_ADDRESS_LENGTH - 1; + subtype T_PROTOCOL_ADDRESS_INDEX is natural range 0 to PROTOCOL_ADDRESS_LENGTH - 1; - signal IsIPv4_set : std_logic; - signal IsIPv4_r : std_logic := '0'; - signal IsIPv6_set : std_logic; - signal IsIPv6_r : std_logic := '0'; + signal IsIPv4_set : std_logic; + signal IsIPv4_r : std_logic := '0'; + signal IsIPv6_set : std_logic; + signal IsIPv6_r : std_logic := '0'; - constant WRITER_COUNTER_BITS : positive := log2ceilnz(imax(HARDWARE_ADDRESS_LENGTH, PROTOCOL_ADDRESS_LENGTH)); - signal Writer_Counter_rst : std_logic; - signal Writer_Counter_en : std_logic; - signal Writer_Counter_us : unsigned(WRITER_COUNTER_BITS - 1 downto 0) := (others => '0'); + constant WRITER_COUNTER_BITS : positive := log2ceilnz(imax(HARDWARE_ADDRESS_LENGTH, PROTOCOL_ADDRESS_LENGTH)); + signal Writer_Counter_rst : std_logic; + signal Writer_Counter_en : std_logic; + signal Writer_Counter_us : unsigned(WRITER_COUNTER_BITS - 1 downto 0) := (others => '0'); - signal Reader_SenderMAC_Counter_rst : std_logic; - signal Reader_SenderMAC_Counter_en : std_logic; - signal Reader_SenderMAC_Counter_us : unsigned(log2ceilnz(HARDWARE_ADDRESS_LENGTH) - 1 downto 0) := (others => '0'); + signal Reader_SenderMAC_Counter_rst : std_logic; + signal Reader_SenderMAC_Counter_en : std_logic; + signal Reader_SenderMAC_Counter_us : unsigned(log2ceilnz(HARDWARE_ADDRESS_LENGTH) - 1 downto 0) := (others => '0'); - signal Reader_SenderIP_Counter_rst : std_logic; - signal Reader_SenderIP_Counter_en : std_logic; - signal Reader_SenderIP_Counter_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0) := (others => '0'); + signal Reader_SenderIP_Counter_rst : std_logic; + signal Reader_SenderIP_Counter_en : std_logic; + signal Reader_SenderIP_Counter_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0) := (others => '0'); - signal Reader_TargetMAC_Counter_rst : std_logic; - signal Reader_TargetMAC_Counter_en : std_logic; - signal Reader_TargetMAC_Counter_us : unsigned(log2ceilnz(HARDWARE_ADDRESS_LENGTH) - 1 downto 0) := (others => '0'); + signal Reader_TargetMAC_Counter_rst : std_logic; + signal Reader_TargetMAC_Counter_en : std_logic; + signal Reader_TargetMAC_Counter_us : unsigned(log2ceilnz(HARDWARE_ADDRESS_LENGTH) - 1 downto 0) := (others => '0'); - signal Reader_TargetIP_Counter_rst : std_logic; - signal Reader_TargetIP_Counter_en : std_logic; - signal Reader_TargetIP_Counter_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0) := (others => '0'); + signal Reader_TargetIP_Counter_rst : std_logic; + signal Reader_TargetIP_Counter_en : std_logic; + signal Reader_TargetIP_Counter_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0) := (others => '0'); - signal SenderHardwareAddress_en : std_logic; - signal SenderHardwareAddress_us : unsigned(log2ceilnz(HARDWARE_ADDRESS_LENGTH) - 1 downto 0); - signal SenderHardwareAddress_d : T_SLVV_8(HARDWARE_ADDRESS_LENGTH - 1 downto 0) := (others => (others => '0')); + signal SenderHardwareAddress_en : std_logic; + signal SenderHardwareAddress_us : unsigned(log2ceilnz(HARDWARE_ADDRESS_LENGTH) - 1 downto 0); + signal SenderHardwareAddress_d : T_SLVV_8(HARDWARE_ADDRESS_LENGTH - 1 downto 0) := (others => (others => '0')); - signal SenderProtocolAddress_en : std_logic; - signal SenderProtocolAddress_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0); - signal SenderProtocolAddress_d : T_SLVV_8(PROTOCOL_ADDRESS_LENGTH - 1 downto 0) := (others => (others => '0')); + signal SenderProtocolAddress_en : std_logic; + signal SenderProtocolAddress_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0); + signal SenderProtocolAddress_d : T_SLVV_8(PROTOCOL_ADDRESS_LENGTH - 1 downto 0) := (others => (others => '0')); - signal TargetHardwareAddress_en : std_logic; - signal TargetHardwareAddress_us : unsigned(log2ceilnz(HARDWARE_ADDRESS_LENGTH) - 1 downto 0); - signal TargetHardwareAddress_d : T_SLVV_8(HARDWARE_ADDRESS_LENGTH - 1 downto 0) := (others => (others => '0')); + signal TargetHardwareAddress_en : std_logic; + signal TargetHardwareAddress_us : unsigned(log2ceilnz(HARDWARE_ADDRESS_LENGTH) - 1 downto 0); + signal TargetHardwareAddress_d : T_SLVV_8(HARDWARE_ADDRESS_LENGTH - 1 downto 0) := (others => (others => '0')); - signal TargetProtocolAddress_en : std_logic; - signal TargetProtocolAddress_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0); - signal TargetProtocolAddress_d : T_SLVV_8(PROTOCOL_ADDRESS_LENGTH - 1 downto 0) := (others => (others => '0')); + signal TargetProtocolAddress_en : std_logic; + signal TargetProtocolAddress_us : unsigned(log2ceilnz(PROTOCOL_ADDRESS_LENGTH) - 1 downto 0); + signal TargetProtocolAddress_d : T_SLVV_8(PROTOCOL_ADDRESS_LENGTH - 1 downto 0) := (others => (others => '0')); begin assert (ALLOWED_PROTOCOL_IPV4 or ALLOWED_PROTOCOL_IPV6) report "At least one protocol must be selected: IPv4, IPv6" severity FAILURE; - RX_Meta_rst <= '0'; - RX_Meta_SrcMACAddress_nxt <= '0'; - RX_Meta_DestMACAddress_nxt <= '0'; + RX_Meta_rst <= '0'; + RX_Meta_SrcMACAddress_nxt <= '0'; + RX_Meta_DestMACAddress_nxt <= '0'; - Is_SOF <= RX_Valid and RX_SOF; - Is_EOF <= RX_Valid and RX_EOF; + Is_SOF <= RX_Valid and RX_SOF; + Is_EOF <= RX_Valid and RX_EOF; process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; @@ -175,273 +175,273 @@ begin IsIPv4_r, IsIPv6_r, Writer_Counter_us, Address_rst, SenderMACAddress_nxt, SenderIPAddress_nxt, TargetMACAddress_nxt, TargetIPAddress_nxt) begin - NextState <= State; + NextState <= State; - RX_Ack <= '0'; + RX_Ack <= '0'; - ResponseReceived <= '0'; - Error <= '0'; + ResponseReceived <= '0'; + Error <= '0'; - IsIPv4_set <= '0'; - IsIPv6_set <= '0'; + IsIPv4_set <= '0'; + IsIPv6_set <= '0'; - Writer_Counter_rst <= '0'; - Writer_Counter_en <= '0'; + Writer_Counter_rst <= '0'; + Writer_Counter_en <= '0'; - Reader_SenderMAC_Counter_rst <= Clear or Address_rst; - Reader_SenderMAC_Counter_en <= SenderMACAddress_nxt; - SenderHardwareAddress_en <= '0'; - SenderHardwareAddress_us <= Writer_Counter_us(SenderHardwareAddress_us'range); + Reader_SenderMAC_Counter_rst <= Clear or Address_rst; + Reader_SenderMAC_Counter_en <= SenderMACAddress_nxt; + SenderHardwareAddress_en <= '0'; + SenderHardwareAddress_us <= Writer_Counter_us(SenderHardwareAddress_us'range); - Reader_SenderIP_Counter_rst <= Clear or Address_rst; - Reader_SenderIP_Counter_en <= SenderIPAddress_nxt; - SenderProtocolAddress_en <= '0'; - SenderProtocolAddress_us <= Writer_Counter_us(SenderProtocolAddress_us'range); + Reader_SenderIP_Counter_rst <= Clear or Address_rst; + Reader_SenderIP_Counter_en <= SenderIPAddress_nxt; + SenderProtocolAddress_en <= '0'; + SenderProtocolAddress_us <= Writer_Counter_us(SenderProtocolAddress_us'range); - Reader_TargetMAC_Counter_rst <= Clear or Address_rst; - Reader_TargetMAC_Counter_en <= TargetMACAddress_nxt; - TargetHardwareAddress_en <= '0'; - TargetHardwareAddress_us <= Writer_Counter_us(TargetHardwareAddress_us'range); + Reader_TargetMAC_Counter_rst <= Clear or Address_rst; + Reader_TargetMAC_Counter_en <= TargetMACAddress_nxt; + TargetHardwareAddress_en <= '0'; + TargetHardwareAddress_us <= Writer_Counter_us(TargetHardwareAddress_us'range); - Reader_TargetIP_Counter_rst <= Clear or Address_rst; - Reader_TargetIP_Counter_en <= TargetIPAddress_nxt; - TargetProtocolAddress_en <= '0'; - TargetProtocolAddress_us <= Writer_Counter_us(TargetProtocolAddress_us'range); + Reader_TargetIP_Counter_rst <= Clear or Address_rst; + Reader_TargetIP_Counter_en <= TargetIPAddress_nxt; + TargetProtocolAddress_en <= '0'; + TargetProtocolAddress_us <= Writer_Counter_us(TargetProtocolAddress_us'range); case State is when ST_IDLE => if (Is_SOF = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if (RX_Data = x"00") then - NextState <= ST_RECEIVE_HARDWARE_TYPE_1; + NextState <= ST_RECEIVE_HARDWARE_TYPE_1; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_HARDWARE_TYPE_1 => if (RX_Valid = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if (RX_Data = x"01") then - NextState <= ST_RECEIVE_PROTOCOL_TYPE_0; + NextState <= ST_RECEIVE_PROTOCOL_TYPE_0; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_PROTOCOL_TYPE_0 => if (RX_Valid = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if ((ALLOWED_PROTOCOL_IPV4 = TRUE) and (RX_Data = x"08")) then - IsIPv4_set <= '1'; - NextState <= ST_RECEIVE_PROTOCOL_TYPE_1; + IsIPv4_set <= '1'; + NextState <= ST_RECEIVE_PROTOCOL_TYPE_1; elsif ((ALLOWED_PROTOCOL_IPV6 = TRUE) and (RX_Data = x"86")) then - IsIPv6_set <= '1'; - NextState <= ST_RECEIVE_PROTOCOL_TYPE_1; + IsIPv6_set <= '1'; + NextState <= ST_RECEIVE_PROTOCOL_TYPE_1; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_PROTOCOL_TYPE_1 => if (RX_Valid = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if ((IsIPv4_r = '1') and (RX_Data = x"00")) then - NextState <= ST_RECEIVE_HARDWARE_ADDRESS_LENGTH; + NextState <= ST_RECEIVE_HARDWARE_ADDRESS_LENGTH; elsif ((IsIPv6_r = '1') and (RX_Data = x"66")) then - NextState <= ST_RECEIVE_HARDWARE_ADDRESS_LENGTH; + NextState <= ST_RECEIVE_HARDWARE_ADDRESS_LENGTH; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_HARDWARE_ADDRESS_LENGTH => if (RX_Valid = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if (RX_Data = x"06") then - NextState <= ST_RECEIVE_PROTOCOL_ADDRESS_LENGTH; + NextState <= ST_RECEIVE_PROTOCOL_ADDRESS_LENGTH; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_PROTOCOL_ADDRESS_LENGTH => if (RX_Valid = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if ((IsIPv4_r = '1') and (RX_Data = x"04")) then - NextState <= ST_RECEIVE_OPERATION_0; + NextState <= ST_RECEIVE_OPERATION_0; elsif ((IsIPv6_r = '1') and (RX_Data = x"10")) then - NextState <= ST_RECEIVE_OPERATION_0; + NextState <= ST_RECEIVE_OPERATION_0; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_OPERATION_0 => if (RX_Valid = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if (RX_Data = x"00") then - NextState <= ST_RECEIVE_OPERATION_1; + NextState <= ST_RECEIVE_OPERATION_1; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_OPERATION_1 => if (RX_Valid = '1') then - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '0') then if (RX_Data = x"02") then - NextState <= ST_RECEIVE_SENDER_MAC; + NextState <= ST_RECEIVE_SENDER_MAC; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_SENDER_MAC => if (RX_Valid = '1') then - RX_Ack <= '1'; - Writer_Counter_en <= '1'; - SenderHardwareAddress_en <= '1'; + RX_Ack <= '1'; + Writer_Counter_en <= '1'; + SenderHardwareAddress_en <= '1'; if (Is_EOF = '0') then if (Writer_Counter_us = (HARDWARE_ADDRESS_LENGTH - 1)) then - Writer_Counter_rst <= '1'; - NextState <= ST_RECEIVE_SENDER_IP; + Writer_Counter_rst <= '1'; + NextState <= ST_RECEIVE_SENDER_IP; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_SENDER_IP => if (RX_Valid = '1') then - RX_Ack <= '1'; - Writer_Counter_en <= '1'; - SenderProtocolAddress_en <= '1'; + RX_Ack <= '1'; + Writer_Counter_en <= '1'; + SenderProtocolAddress_en <= '1'; if (Is_EOF = '0') then if ((IsIPv4_r = '1') and (Writer_Counter_us = (PROTOCOL_IPV4_ADDRESS_LENGTH - 1))) then - Writer_Counter_rst <= '1'; - NextState <= ST_RECEIVE_TARGET_MAC; + Writer_Counter_rst <= '1'; + NextState <= ST_RECEIVE_TARGET_MAC; elsif ((IsIPv6_r = '1') and (Writer_Counter_us = (PROTOCOL_IPV6_ADDRESS_LENGTH - 1))) then - Writer_Counter_rst <= '1'; - NextState <= ST_RECEIVE_TARGET_MAC; + Writer_Counter_rst <= '1'; + NextState <= ST_RECEIVE_TARGET_MAC; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_TARGET_MAC => if (RX_Valid = '1') then - RX_Ack <= '1'; - Writer_Counter_en <= '1'; - TargetHardwareAddress_en <= '1'; + RX_Ack <= '1'; + Writer_Counter_en <= '1'; + TargetHardwareAddress_en <= '1'; if (Is_EOF = '0') then if (Writer_Counter_us = (HARDWARE_ADDRESS_LENGTH - 1)) then - Writer_Counter_rst <= '1'; - NextState <= ST_RECEIVE_TARGET_IP; + Writer_Counter_rst <= '1'; + NextState <= ST_RECEIVE_TARGET_IP; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_TARGET_IP => if (RX_Valid = '1') then - RX_Ack <= '1'; - Writer_Counter_en <= '1'; - TargetProtocolAddress_en <= '1'; + RX_Ack <= '1'; + Writer_Counter_en <= '1'; + TargetProtocolAddress_en <= '1'; if (Is_EOF = '0') then if ((IsIPv4_r = '1') and (Writer_Counter_us = (PROTOCOL_IPV4_ADDRESS_LENGTH - 1))) then - Writer_Counter_rst <= '1'; - NextState <= ST_DISCARD_ETHERNET_PADDING_BYTES; + Writer_Counter_rst <= '1'; + NextState <= ST_DISCARD_ETHERNET_PADDING_BYTES; elsif ((IsIPv6_r = '1') and (Writer_Counter_us = (PROTOCOL_IPV6_ADDRESS_LENGTH - 1))) then - Writer_Counter_rst <= '1'; - NextState <= ST_DISCARD_ETHERNET_PADDING_BYTES; + Writer_Counter_rst <= '1'; + NextState <= ST_DISCARD_ETHERNET_PADDING_BYTES; end if; else if ((IsIPv4_r = '1') and (Writer_Counter_us = (PROTOCOL_IPV4_ADDRESS_LENGTH - 1))) then - Writer_Counter_rst <= '1'; - NextState <= ST_COMPLETE; + Writer_Counter_rst <= '1'; + NextState <= ST_COMPLETE; elsif ((IsIPv6_r = '1') and (Writer_Counter_us = (PROTOCOL_IPV6_ADDRESS_LENGTH - 1))) then - Writer_Counter_rst <= '1'; - NextState <= ST_COMPLETE; + Writer_Counter_rst <= '1'; + NextState <= ST_COMPLETE; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; end if; when ST_DISCARD_ETHERNET_PADDING_BYTES => - ResponseReceived <= '1'; - RX_Ack <= '1'; + ResponseReceived <= '1'; + RX_Ack <= '1'; if (Is_EOF = '1') then - NextState <= ST_COMPLETE; + NextState <= ST_COMPLETE; end if; when ST_COMPLETE => - ResponseReceived <= '1'; + ResponseReceived <= '1'; if (Clear = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; when ST_DISCARD_FRAME => - RX_Ack <= '1'; + RX_Ack <= '1'; if (Is_EOF = '1') then - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; when ST_ERROR => - Error <= '1'; + Error <= '1'; if (Clear = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end case; @@ -452,15 +452,15 @@ begin begin if rising_edge(Clock) then if ((Reset or Clear) = '1') then - IsIPv4_r <= '0'; - IsIPv6_r <= '0'; + IsIPv4_r <= '0'; + IsIPv6_r <= '0'; else if (IsIPv4_set = '1') then - IsIPv4_r <= '1'; + IsIPv4_r <= '1'; end if; if (IsIPv6_set = '1') then - IsIPv6_r <= '1'; + IsIPv6_r <= '1'; end if; end if; end if; @@ -471,42 +471,42 @@ begin begin if rising_edge(Clock) then if (Writer_Counter_rst = '1') then - Writer_Counter_us <= (others => '0'); + Writer_Counter_us <= (others => '0'); else if (Writer_Counter_en = '1') then - Writer_Counter_us <= Writer_Counter_us + 1; + Writer_Counter_us <= Writer_Counter_us + 1; end if; end if; if (Reader_SenderMAC_Counter_rst = '1') then - Reader_SenderMAC_Counter_us <= (others => '0'); + Reader_SenderMAC_Counter_us <= (others => '0'); else if (Reader_SenderMAC_Counter_en = '1') then - Reader_SenderMAC_Counter_us <= Reader_SenderMAC_Counter_us + 1; + Reader_SenderMAC_Counter_us <= Reader_SenderMAC_Counter_us + 1; end if; end if; if (Reader_SenderIP_Counter_rst = '1') then - Reader_SenderIP_Counter_us <= (others => '0'); + Reader_SenderIP_Counter_us <= (others => '0'); else if (Reader_SenderIP_Counter_en = '1') then - Reader_SenderIP_Counter_us <= Reader_SenderIP_Counter_us + 1; + Reader_SenderIP_Counter_us <= Reader_SenderIP_Counter_us + 1; end if; end if; if (Reader_TargetMAC_Counter_rst = '1') then - Reader_TargetMAC_Counter_us <= (others => '0'); + Reader_TargetMAC_Counter_us <= (others => '0'); else if (Reader_TargetMAC_Counter_en = '1') then - Reader_TargetMAC_Counter_us <= Reader_TargetMAC_Counter_us + 1; + Reader_TargetMAC_Counter_us <= Reader_TargetMAC_Counter_us + 1; end if; end if; if (Reader_TargetIP_Counter_rst = '1') then - Reader_TargetIP_Counter_us <= (others => '0'); + Reader_TargetIP_Counter_us <= (others => '0'); else if (Reader_TargetIP_Counter_en = '1') then - Reader_TargetIP_Counter_us <= Reader_TargetIP_Counter_us + 1; + Reader_TargetIP_Counter_us <= Reader_TargetIP_Counter_us + 1; end if; end if; end if; @@ -517,26 +517,26 @@ begin begin if rising_edge(Clock) then if (SenderHardwareAddress_en = '1') then - SenderHardwareAddress_d(to_index(SenderHardwareAddress_us, SenderHardwareAddress_d'high)) <= RX_Data; + SenderHardwareAddress_d(to_index(SenderHardwareAddress_us, SenderHardwareAddress_d'high)) <= RX_Data; end if; if (SenderProtocolAddress_en = '1') then - SenderProtocolAddress_d(to_index(SenderProtocolAddress_us, SenderProtocolAddress_d'high)) <= RX_Data; + SenderProtocolAddress_d(to_index(SenderProtocolAddress_us, SenderProtocolAddress_d'high)) <= RX_Data; end if; if (TargetHardwareAddress_en = '1') then - TargetHardwareAddress_d(to_index(TargetHardwareAddress_us, TargetHardwareAddress_d'high)) <= RX_Data; + TargetHardwareAddress_d(to_index(TargetHardwareAddress_us, TargetHardwareAddress_d'high)) <= RX_Data; end if; if (TargetProtocolAddress_en = '1') then - TargetProtocolAddress_d(to_index(TargetProtocolAddress_us, TargetProtocolAddress_d'high)) <= RX_Data; + TargetProtocolAddress_d(to_index(TargetProtocolAddress_us, TargetProtocolAddress_d'high)) <= RX_Data; end if; end if; end process; - SenderMACAddress_Data <= SenderHardwareAddress_d(to_index(Reader_SenderMAC_Counter_us, SenderHardwareAddress_d'high)); - SenderIPAddress_Data <= SenderProtocolAddress_d(to_index(Reader_SenderIP_Counter_us, SenderProtocolAddress_d'high)); - TargetMACAddress_Data <= TargetHardwareAddress_d(to_index(Reader_TargetMAC_Counter_us, TargetHardwareAddress_d'high)); - TargetIPAddress_Data <= TargetProtocolAddress_d(to_index(Reader_TargetIP_Counter_us, TargetProtocolAddress_d'high)); + SenderMACAddress_Data <= SenderHardwareAddress_d(to_index(Reader_SenderMAC_Counter_us, SenderHardwareAddress_d'high)); + SenderIPAddress_Data <= SenderProtocolAddress_d(to_index(Reader_SenderIP_Counter_us, SenderProtocolAddress_d'high)); + TargetMACAddress_Data <= TargetHardwareAddress_d(to_index(Reader_TargetMAC_Counter_us, TargetHardwareAddress_d'high)); + TargetIPAddress_Data <= TargetProtocolAddress_d(to_index(Reader_TargetIP_Counter_us, TargetProtocolAddress_d'high)); end architecture; diff --git a/src/net/arp/arp_UniCast_Responder.vhdl b/src/net/arp/arp_UniCast_Responder.vhdl index 216af6948..cc1f36467 100644 --- a/src/net/arp/arp_UniCast_Responder.vhdl +++ b/src/net/arp/arp_UniCast_Responder.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,81 +37,81 @@ use work.net.all; entity arp_UniCast_Responder is generic ( - ALLOWED_PROTOCOL_IPV4 : boolean := TRUE; - ALLOWED_PROTOCOL_IPV6 : boolean := FALSE + ALLOWED_PROTOCOL_IPV4 : boolean := TRUE; + ALLOWED_PROTOCOL_IPV6 : boolean := FALSE ); port ( - Clock : in std_logic; -- - Reset : in std_logic; -- - - SendResponse : in std_logic; - Complete : out std_logic; - - Address_rst : out std_logic; - SenderMACAddress_nxt : out std_logic; - SenderMACAddress_Data : in T_SLV_8; - SenderIPv4Address_nxt : out std_logic; - SenderIPv4Address_Data : in T_SLV_8; - TargetMACAddress_nxt : out std_logic; - TargetMACAddress_Data : in T_SLV_8; - TargetIPv4Address_nxt : out std_logic; - TargetIPv4Address_Data : in T_SLV_8; - - TX_Valid : out std_logic; - TX_Data : out T_SLV_8; - TX_SOF : out std_logic; - TX_EOF : out std_logic; - TX_Ack : in std_logic; - TX_Meta_DestMACAddress_rst : in std_logic; - TX_Meta_DestMACAddress_nxt : in std_logic; - TX_Meta_DestMACAddress_Data : out T_SLV_8 + Clock : in std_logic; -- + Reset : in std_logic; -- + + SendResponse : in std_logic; + Complete : out std_logic; + + Address_rst : out std_logic; + SenderMACAddress_nxt : out std_logic; + SenderMACAddress_Data : in T_SLV_8; + SenderIPv4Address_nxt : out std_logic; + SenderIPv4Address_Data : in T_SLV_8; + TargetMACAddress_nxt : out std_logic; + TargetMACAddress_Data : in T_SLV_8; + TargetIPv4Address_nxt : out std_logic; + TargetIPv4Address_Data : in T_SLV_8; + + TX_Valid : out std_logic; + TX_Data : out T_SLV_8; + TX_SOF : out std_logic; + TX_EOF : out std_logic; + TX_Ack : in std_logic; + TX_Meta_DestMACAddress_rst : in std_logic; + TX_Meta_DestMACAddress_nxt : in std_logic; + TX_Meta_DestMACAddress_Data : out T_SLV_8 ); end entity; architecture rtl of arp_UniCast_Responder is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; - type T_STATE is ( + type T_STATE is ( ST_IDLE, - ST_SEND_HARDWARE_TYPE_0, ST_SEND_HARDWARE_TYPE_1, - ST_SEND_PROTOCOL_TYPE_0, ST_SEND_PROTOCOL_TYPE_1, + ST_SEND_HARDWARE_TYPE_0, ST_SEND_HARDWARE_TYPE_1, + ST_SEND_PROTOCOL_TYPE_0, ST_SEND_PROTOCOL_TYPE_1, ST_SEND_HARDWARE_ADDRESS_LENGTH, ST_SEND_PROTOCOL_ADDRESS_LENGTH, - ST_SEND_OPERATION_0, ST_SEND_OPERATION_1, - ST_SEND_SENDER_MAC, ST_SEND_SENDER_IP, - ST_SEND_TARGET_MAC, ST_SEND_TARGET_IP, + ST_SEND_OPERATION_0, ST_SEND_OPERATION_1, + ST_SEND_SENDER_MAC, ST_SEND_SENDER_IP, + ST_SEND_TARGET_MAC, ST_SEND_TARGET_IP, ST_COMPLETE ); - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is "gray"; + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is "gray"; - constant HARDWARE_ADDRESS_LENGTH : positive := 6; -- MAC -> 6 bytes - constant PROTOCOL_IPV4_ADDRESS_LENGTH : positive := 4; -- IPv4 -> 4 bytes - constant PROTOCOL_IPV6_ADDRESS_LENGTH : positive := 16; -- IPv6 -> 16 bytes - constant PROTOCOL_ADDRESS_LENGTH : positive := ite((ALLOWED_PROTOCOL_IPV6 = FALSE), PROTOCOL_IPV4_ADDRESS_LENGTH, PROTOCOL_IPV6_ADDRESS_LENGTH); -- IPv4 -> 4 bytes; IPv6 -> 16 bytes + constant HARDWARE_ADDRESS_LENGTH : positive := 6; -- MAC -> 6 bytes + constant PROTOCOL_IPV4_ADDRESS_LENGTH : positive := 4; -- IPv4 -> 4 bytes + constant PROTOCOL_IPV6_ADDRESS_LENGTH : positive := 16; -- IPv6 -> 16 bytes + constant PROTOCOL_ADDRESS_LENGTH : positive := ite((ALLOWED_PROTOCOL_IPV6 = FALSE), PROTOCOL_IPV4_ADDRESS_LENGTH, PROTOCOL_IPV6_ADDRESS_LENGTH); -- IPv4 -> 4 bytes; IPv6 -> 16 bytes - signal IsIPv4_l : std_logic; - signal IsIPv6_l : std_logic; + signal IsIPv4_l : std_logic; + signal IsIPv6_l : std_logic; - constant READER_COUNTER_BITS : positive := log2ceilnz(imax(HARDWARE_ADDRESS_LENGTH, PROTOCOL_ADDRESS_LENGTH)); - signal Reader_Counter_rst : std_logic; - signal Reader_Counter_en : std_logic; - signal Reader_Counter_us : unsigned(READER_COUNTER_BITS - 1 downto 0) := (others => '0'); + constant READER_COUNTER_BITS : positive := log2ceilnz(imax(HARDWARE_ADDRESS_LENGTH, PROTOCOL_ADDRESS_LENGTH)); + signal Reader_Counter_rst : std_logic; + signal Reader_Counter_en : std_logic; + signal Reader_Counter_us : unsigned(READER_COUNTER_BITS - 1 downto 0) := (others => '0'); begin - IsIPv4_l <= '1'; - IsIPv6_l <= '0'; + IsIPv4_l <= '1'; + IsIPv6_l <= '0'; process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; @@ -123,184 +123,184 @@ begin SenderMACAddress_Data, SenderIPv4Address_Data, TargetMACAddress_Data, TargetIPv4Address_Data, Reader_Counter_us) begin - NextState <= State; + NextState <= State; - Complete <= '0'; + Complete <= '0'; - TX_Valid <= '0'; - TX_Data <= (others => '0'); - TX_SOF <= '0'; - TX_EOF <= '0'; - TX_Meta_DestMACAddress_Data <= TargetMACAddress_Data; + TX_Valid <= '0'; + TX_Data <= (others => '0'); + TX_SOF <= '0'; + TX_EOF <= '0'; + TX_Meta_DestMACAddress_Data <= TargetMACAddress_Data; - Address_rst <= '0'; - SenderMACAddress_nxt <= '0'; - SenderIPv4Address_nxt <= '0'; - TargetMACAddress_nxt <= '0'; - TargetIPv4Address_nxt <= '0'; + Address_rst <= '0'; + SenderMACAddress_nxt <= '0'; + SenderIPv4Address_nxt <= '0'; + TargetMACAddress_nxt <= '0'; + TargetIPv4Address_nxt <= '0'; - Reader_Counter_rst <= '0'; - Reader_Counter_en <= '0'; + Reader_Counter_rst <= '0'; + Reader_Counter_en <= '0'; case State is when ST_IDLE => if (SendResponse = '1') then - Address_rst <= '1'; - NextState <= ST_SEND_HARDWARE_TYPE_0; + Address_rst <= '1'; + NextState <= ST_SEND_HARDWARE_TYPE_0; end if; when ST_SEND_HARDWARE_TYPE_0 => - TX_Valid <= '1'; - TX_Data <= x"00"; - TX_SOF <= '1'; + TX_Valid <= '1'; + TX_Data <= x"00"; + TX_SOF <= '1'; - Address_rst <= TX_Meta_DestMACAddress_rst; - TargetMACAddress_nxt <= TX_Meta_DestMACAddress_nxt; + Address_rst <= TX_Meta_DestMACAddress_rst; + TargetMACAddress_nxt <= TX_Meta_DestMACAddress_nxt; - if (TX_Ack = '1') then - NextState <= ST_SEND_HARDWARE_TYPE_1; + if (TX_Ack = '1') then + NextState <= ST_SEND_HARDWARE_TYPE_1; end if; when ST_SEND_HARDWARE_TYPE_1 => - TX_Valid <= '1'; - TX_Data <= x"01"; + TX_Valid <= '1'; + TX_Data <= x"01"; - if (TX_Ack = '1') then - NextState <= ST_SEND_PROTOCOL_TYPE_0; + if (TX_Ack = '1') then + NextState <= ST_SEND_PROTOCOL_TYPE_0; end if; when ST_SEND_PROTOCOL_TYPE_0 => - TX_Valid <= '1'; + TX_Valid <= '1'; if (IsIPv4_l = '1') then - TX_Data <= x"08"; + TX_Data <= x"08"; elsif (IsIPv6_l = '1') then - TX_Data <= x"86"; + TX_Data <= x"86"; end if; - if (TX_Ack = '1') then - NextState <= ST_SEND_PROTOCOL_TYPE_1; + if (TX_Ack = '1') then + NextState <= ST_SEND_PROTOCOL_TYPE_1; end if; when ST_SEND_PROTOCOL_TYPE_1 => - TX_Valid <= '1'; + TX_Valid <= '1'; if (IsIPv4_l = '1') then - TX_Data <= x"00"; + TX_Data <= x"00"; elsif (IsIPv6_l = '1') then - TX_Data <= x"DD"; + TX_Data <= x"DD"; end if; - if (TX_Ack = '1') then - NextState <= ST_SEND_HARDWARE_ADDRESS_LENGTH; + if (TX_Ack = '1') then + NextState <= ST_SEND_HARDWARE_ADDRESS_LENGTH; end if; when ST_SEND_HARDWARE_ADDRESS_LENGTH => - TX_Valid <= '1'; - TX_Data <= x"06"; + TX_Valid <= '1'; + TX_Data <= x"06"; - if (TX_Ack = '1') then - NextState <= ST_SEND_PROTOCOL_ADDRESS_LENGTH; + if (TX_Ack = '1') then + NextState <= ST_SEND_PROTOCOL_ADDRESS_LENGTH; end if; when ST_SEND_PROTOCOL_ADDRESS_LENGTH => - TX_Valid <= '1'; + TX_Valid <= '1'; if (IsIPv4_l = '1') then - TX_Data <= x"04"; + TX_Data <= x"04"; elsif (IsIPv6_l = '1') then - TX_Data <= x"10"; + TX_Data <= x"10"; end if; - if (TX_Ack = '1') then - NextState <= ST_SEND_OPERATION_0; + if (TX_Ack = '1') then + NextState <= ST_SEND_OPERATION_0; end if; when ST_SEND_OPERATION_0 => - TX_Valid <= '1'; - TX_Data <= x"00"; + TX_Valid <= '1'; + TX_Data <= x"00"; - if (TX_Ack = '1') then - NextState <= ST_SEND_OPERATION_1; + if (TX_Ack = '1') then + NextState <= ST_SEND_OPERATION_1; end if; when ST_SEND_OPERATION_1 => - TX_Valid <= '1'; - TX_Data <= x"02"; + TX_Valid <= '1'; + TX_Data <= x"02"; - Address_rst <= '1'; + Address_rst <= '1'; - if (TX_Ack = '1') then - NextState <= ST_SEND_SENDER_MAC; + if (TX_Ack = '1') then + NextState <= ST_SEND_SENDER_MAC; end if; when ST_SEND_SENDER_MAC => - TX_Valid <= '1'; - TX_Data <= SenderMACAddress_Data; + TX_Valid <= '1'; + TX_Data <= SenderMACAddress_Data; - if (TX_Ack = '1') then - SenderMACAddress_nxt <= '1'; - Reader_Counter_en <= '1'; + if (TX_Ack = '1') then + SenderMACAddress_nxt <= '1'; + Reader_Counter_en <= '1'; if (Reader_Counter_us = (HARDWARE_ADDRESS_LENGTH - 1)) then - Reader_Counter_rst <= '1'; - NextState <= ST_SEND_SENDER_IP; + Reader_Counter_rst <= '1'; + NextState <= ST_SEND_SENDER_IP; end if; end if; when ST_SEND_SENDER_IP => - TX_Valid <= '1'; - TX_Data <= SenderIPv4Address_Data; + TX_Valid <= '1'; + TX_Data <= SenderIPv4Address_Data; - if (TX_Ack = '1') then - SenderIPv4Address_nxt <= '1'; - Reader_Counter_en <= '1'; + if (TX_Ack = '1') then + SenderIPv4Address_nxt <= '1'; + Reader_Counter_en <= '1'; if ((IsIPv4_l = '1') and (Reader_Counter_us = (PROTOCOL_IPV4_ADDRESS_LENGTH - 1))) then - Reader_Counter_rst <= '1'; - NextState <= ST_SEND_TARGET_MAC; + Reader_Counter_rst <= '1'; + NextState <= ST_SEND_TARGET_MAC; elsif ((IsIPv6_l = '1') and (Reader_Counter_us = (PROTOCOL_IPV6_ADDRESS_LENGTH - 1))) then - Reader_Counter_rst <= '1'; - NextState <= ST_SEND_TARGET_MAC; + Reader_Counter_rst <= '1'; + NextState <= ST_SEND_TARGET_MAC; end if; end if; when ST_SEND_TARGET_MAC => - TX_Valid <= '1'; - TX_Data <= TargetMACAddress_Data; + TX_Valid <= '1'; + TX_Data <= TargetMACAddress_Data; - if (TX_Ack = '1') then - TargetMACAddress_nxt <= '1'; - Reader_Counter_en <= '1'; + if (TX_Ack = '1') then + TargetMACAddress_nxt <= '1'; + Reader_Counter_en <= '1'; if (Reader_Counter_us = (HARDWARE_ADDRESS_LENGTH - 1)) then - Reader_Counter_rst <= '1'; - NextState <= ST_SEND_TARGET_IP; + Reader_Counter_rst <= '1'; + NextState <= ST_SEND_TARGET_IP; end if; end if; when ST_SEND_TARGET_IP => - TX_Valid <= '1'; - TX_Data <= TargetIPv4Address_Data; + TX_Valid <= '1'; + TX_Data <= TargetIPv4Address_Data; - if (TX_Ack = '1') then - TargetIPv4Address_nxt <= '1'; - Reader_Counter_en <= '1'; + if (TX_Ack = '1') then + TargetIPv4Address_nxt <= '1'; + Reader_Counter_en <= '1'; if ((IsIPv4_l = '1') and (Reader_Counter_us = (PROTOCOL_IPV4_ADDRESS_LENGTH - 1))) then - TX_EOF <= '1'; - Reader_Counter_rst <= '1'; - NextState <= ST_COMPLETE; + TX_EOF <= '1'; + Reader_Counter_rst <= '1'; + NextState <= ST_COMPLETE; elsif ((IsIPv6_l = '1') and (Reader_Counter_us = (PROTOCOL_IPV6_ADDRESS_LENGTH - 1))) then - TX_EOF <= '1'; - Reader_Counter_rst <= '1'; - NextState <= ST_COMPLETE; + TX_EOF <= '1'; + Reader_Counter_rst <= '1'; + NextState <= ST_COMPLETE; end if; end if; when ST_COMPLETE => - Complete <= '1'; - NextState <= ST_IDLE; + Complete <= '1'; + NextState <= ST_IDLE; end case; end process; @@ -309,9 +309,9 @@ begin begin if rising_edge(Clock) then if ((Reset or Reader_Counter_rst) = '1') then - Reader_Counter_us <= (others => '0'); + Reader_Counter_us <= (others => '0'); elsif (Reader_Counter_en = '1') then - Reader_Counter_us <= Reader_Counter_us + 1; + Reader_Counter_us <= Reader_Counter_us + 1; end if; end if; end process; diff --git a/src/net/arp/arp_Wrapper.vhdl b/src/net/arp/arp_Wrapper.vhdl index 4901cb7f7..8faa24421 100644 --- a/src/net/arp/arp_Wrapper.vhdl +++ b/src/net/arp/arp_Wrapper.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -39,69 +39,69 @@ use work.net.all; entity arp_Wrapper is generic ( - CLOCK_FREQ : FREQ := 125 MHz; - INTERFACE_MACADDRESS : T_NET_MAC_ADDRESS := C_NET_MAC_ADDRESS_EMPTY; - INITIAL_IPV4ADDRESSES : T_NET_IPV4_ADDRESS_VECTOR := (0 => C_NET_IPV4_ADDRESS_EMPTY); - INITIAL_ARPCACHE_CONTENT : T_NET_ARP_ARPCACHE_VECTOR := (0 => (Tag => C_NET_IPV4_ADDRESS_EMPTY, MAC => C_NET_MAC_ADDRESS_EMPTY)); - APR_REQUEST_TIMEOUT : T_TIME := 100.0e-3 + CLOCK_FREQ : FREQ := 125 MHz; + INTERFACE_MACADDRESS : T_NET_MAC_ADDRESS := C_NET_MAC_ADDRESS_EMPTY; + INITIAL_IPV4ADDRESSES : T_NET_IPV4_ADDRESS_VECTOR := (0 => C_NET_IPV4_ADDRESS_EMPTY); + INITIAL_ARPCACHE_CONTENT : T_NET_ARP_ARPCACHE_VECTOR := (0 => (Tag => C_NET_IPV4_ADDRESS_EMPTY, MAC => C_NET_MAC_ADDRESS_EMPTY)); + APR_REQUEST_TIMEOUT : T_TIME := 100.0e-3 ); port ( - Clock : in std_logic; - Reset : in std_logic; - - IPPool_Announce : in std_logic; - IPPool_Announced : out std_logic; - - IPCache_Lookup : in std_logic; - IPCache_IPv4Address_rst : out std_logic; - IPCache_IPv4Address_nxt : out std_logic; - IPCache_IPv4Address_Data : in T_SLV_8; - - IPCache_Valid : out std_logic; - IPCache_MACAddress_rst : in std_logic; - IPCache_MACAddress_nxt : in std_logic; - IPCache_MACAddress_Data : out T_SLV_8; - - Eth_UC_TX_Valid : out std_logic; - Eth_UC_TX_Data : out T_SLV_8; - Eth_UC_TX_SOF : out std_logic; - Eth_UC_TX_EOF : out std_logic; - Eth_UC_TX_Ack : in std_logic; - Eth_UC_TX_Meta_rst : in std_logic; - Eth_UC_TX_Meta_DestMACAddress_nxt : in std_logic; - Eth_UC_TX_Meta_DestMACAddress_Data : out T_SLV_8; - - Eth_UC_RX_Valid : in std_logic; - Eth_UC_RX_Data : in T_SLV_8; - Eth_UC_RX_SOF : in std_logic; - Eth_UC_RX_EOF : in std_logic; - Eth_UC_RX_Ack : out std_logic; - Eth_UC_RX_Meta_rst : out std_logic; - Eth_UC_RX_Meta_SrcMACAddress_nxt : out std_logic; - Eth_UC_RX_Meta_SrcMACAddress_Data : in T_SLV_8; - Eth_UC_RX_Meta_DestMACAddress_nxt : out std_logic; - Eth_UC_RX_Meta_DestMACAddress_Data : in T_SLV_8; - - Eth_BC_RX_Valid : in std_logic; - Eth_BC_RX_Data : in T_SLV_8; - Eth_BC_RX_SOF : in std_logic; - Eth_BC_RX_EOF : in std_logic; - Eth_BC_RX_Ack : out std_logic; - Eth_BC_RX_Meta_rst : out std_logic; - Eth_BC_RX_Meta_SrcMACAddress_nxt : out std_logic; - Eth_BC_RX_Meta_SrcMACAddress_Data : in T_SLV_8; - Eth_BC_RX_Meta_DestMACAddress_nxt : out std_logic; - Eth_BC_RX_Meta_DestMACAddress_Data : in T_SLV_8 + Clock : in std_logic; + Reset : in std_logic; + + IPPool_Announce : in std_logic; + IPPool_Announced : out std_logic; + + IPCache_Lookup : in std_logic; + IPCache_IPv4Address_rst : out std_logic; + IPCache_IPv4Address_nxt : out std_logic; + IPCache_IPv4Address_Data : in T_SLV_8; + + IPCache_Valid : out std_logic; + IPCache_MACAddress_rst : in std_logic; + IPCache_MACAddress_nxt : in std_logic; + IPCache_MACAddress_Data : out T_SLV_8; + + Eth_UC_TX_Valid : out std_logic; + Eth_UC_TX_Data : out T_SLV_8; + Eth_UC_TX_SOF : out std_logic; + Eth_UC_TX_EOF : out std_logic; + Eth_UC_TX_Ack : in std_logic; + Eth_UC_TX_Meta_rst : in std_logic; + Eth_UC_TX_Meta_DestMACAddress_nxt : in std_logic; + Eth_UC_TX_Meta_DestMACAddress_Data : out T_SLV_8; + + Eth_UC_RX_Valid : in std_logic; + Eth_UC_RX_Data : in T_SLV_8; + Eth_UC_RX_SOF : in std_logic; + Eth_UC_RX_EOF : in std_logic; + Eth_UC_RX_Ack : out std_logic; + Eth_UC_RX_Meta_rst : out std_logic; + Eth_UC_RX_Meta_SrcMACAddress_nxt : out std_logic; + Eth_UC_RX_Meta_SrcMACAddress_Data : in T_SLV_8; + Eth_UC_RX_Meta_DestMACAddress_nxt : out std_logic; + Eth_UC_RX_Meta_DestMACAddress_Data : in T_SLV_8; + + Eth_BC_RX_Valid : in std_logic; + Eth_BC_RX_Data : in T_SLV_8; + Eth_BC_RX_SOF : in std_logic; + Eth_BC_RX_EOF : in std_logic; + Eth_BC_RX_Ack : out std_logic; + Eth_BC_RX_Meta_rst : out std_logic; + Eth_BC_RX_Meta_SrcMACAddress_nxt : out std_logic; + Eth_BC_RX_Meta_SrcMACAddress_Data : in T_SLV_8; + Eth_BC_RX_Meta_DestMACAddress_nxt : out std_logic; + Eth_BC_RX_Meta_DestMACAddress_Data : in T_SLV_8 ); end entity; architecture rtl of arp_Wrapper is - signal ARPCache_Command : T_NET_ARP_ARPCACHE_COMMAND; - signal IPPool_Command : T_NET_ARP_IPPOOL_COMMAND; + signal ARPCache_Command : T_NET_ARP_ARPCACHE_COMMAND; + signal IPPool_Command : T_NET_ARP_IPPOOL_COMMAND; - signal IPPool_Announce_l : std_logic := '0'; - signal IPPool_Announced_i : std_logic; + signal IPPool_Announce_l : std_logic := '0'; + signal IPPool_Announced_i : std_logic; type T_FSMPOOL_STATE is ( ST_IDLE, @@ -111,65 +111,65 @@ architecture rtl of arp_Wrapper is ST_ERROR ); - signal FSMPool_State : T_FSMPOOL_STATE := ST_IDLE; - signal FSMPool_NextState : T_FSMPOOL_STATE; + signal FSMPool_State : T_FSMPOOL_STATE := ST_IDLE; + signal FSMPool_NextState : T_FSMPOOL_STATE; - signal FSMPool_MACSeq1_SenderMACAddress_rst : std_logic; - signal FSMPool_MACSeq1_SenderMACAddress_nxt : std_logic; + signal FSMPool_MACSeq1_SenderMACAddress_rst : std_logic; + signal FSMPool_MACSeq1_SenderMACAddress_nxt : std_logic; - signal FSMPool_BCRcv_Clear : std_logic; - signal FSMPool_BCRcv_Address_rst : std_logic; - signal FSMPool_BCRcv_SenderMACAddress_nxt : std_logic; - signal FSMPool_BCRcv_SenderIPv4Address_nxt : std_logic; - signal FSMPool_BCRcv_TargetIPv4Address_nxt : std_logic; + signal FSMPool_BCRcv_Clear : std_logic; + signal FSMPool_BCRcv_Address_rst : std_logic; + signal FSMPool_BCRcv_SenderMACAddress_nxt : std_logic; + signal FSMPool_BCRcv_SenderIPv4Address_nxt : std_logic; + signal FSMPool_BCRcv_TargetIPv4Address_nxt : std_logic; - signal FSMPool_Command : T_NET_ARP_IPPOOL_COMMAND; - signal FSMPool_NewIPv4Address_Data : T_NET_IPV4_ADDRESS; - signal FSMPool_NewMACAddress_Data : T_NET_MAC_ADDRESS; - signal FSMPool_IPPool_Lookup : std_logic; - signal FSMPool_IPPool_IPv4Address_Data : T_SLV_8; + signal FSMPool_Command : T_NET_ARP_IPPOOL_COMMAND; + signal FSMPool_NewIPv4Address_Data : T_NET_IPV4_ADDRESS; + signal FSMPool_NewMACAddress_Data : T_NET_MAC_ADDRESS; + signal FSMPool_IPPool_Lookup : std_logic; + signal FSMPool_IPPool_IPv4Address_Data : T_SLV_8; - signal FSMPool_UCRsp_SendResponse : std_logic; - signal FSMPool_UCRsp_SenderMACAddress_Data : T_SLV_8; - signal FSMPool_UCRsp_SenderIPv4Address_Data : T_SLV_8; - signal FSMPool_UCRsp_TargetMACAddress_Data : T_SLV_8; - signal FSMPool_UCRsp_TargetIPv4Address_Data : T_SLV_8; + signal FSMPool_UCRsp_SendResponse : std_logic; + signal FSMPool_UCRsp_SenderMACAddress_Data : T_SLV_8; + signal FSMPool_UCRsp_SenderIPv4Address_Data : T_SLV_8; + signal FSMPool_UCRsp_TargetMACAddress_Data : T_SLV_8; + signal FSMPool_UCRsp_TargetIPv4Address_Data : T_SLV_8; -- Sender MACAddress sequencer - signal MACSeq1_SenderMACAddress_Data : T_SLV_8; + signal MACSeq1_SenderMACAddress_Data : T_SLV_8; -- broadcast receiver - signal BCRcv_Error : std_logic; + signal BCRcv_Error : std_logic; - signal BCRcv_RequestReceived : std_logic; - signal BCRcv_SenderMACAddress_Data : T_SLV_8; - signal BCRcv_SenderIPv4Address_Data : T_SLV_8; - signal BCRcv_TargetIPv4Address_Data : T_SLV_8; + signal BCRcv_RequestReceived : std_logic; + signal BCRcv_SenderMACAddress_Data : T_SLV_8; + signal BCRcv_SenderIPv4Address_Data : T_SLV_8; + signal BCRcv_TargetIPv4Address_Data : T_SLV_8; -- ippool - signal IPPool_Insert : std_logic; - signal IPPool_UCRsp_SendResponse : std_logic; - signal IPPool_IPv4Address_rst : std_logic; - signal IPPool_IPv4Address_nxt : std_logic; - signal IPPool_PoolResult : T_CACHE_RESULT; + signal IPPool_Insert : std_logic; + signal IPPool_UCRsp_SendResponse : std_logic; + signal IPPool_IPv4Address_rst : std_logic; + signal IPPool_IPv4Address_nxt : std_logic; + signal IPPool_PoolResult : T_CACHE_RESULT; -- unicast responder - signal UCRsp_Complete : std_logic; - - signal UCRsp_Address_rst : std_logic; - signal UCRsp_SenderMACAddress_nxt : std_logic; - signal UCRsp_SenderIPv4Address_nxt : std_logic; - signal UCRsp_TargetMACAddress_nxt : std_logic; - signal UCRsp_TargetIPv4Address_nxt : std_logic; - - signal UCRsp_TX_Valid : std_logic; - signal UCRsp_TX_Data : T_SLV_8; - signal UCRsp_TX_SOF : std_logic; - signal UCRsp_TX_EOF : std_logic; - signal UCRsp_TX_Ack : std_logic; - signal UCRsp_TX_Meta_DestMACAddress_rst : std_logic; - signal UCRsp_TX_Meta_DestMACAddress_nxt : std_logic; - signal UCRsp_TX_Meta_DestMACAddress_Data : T_SLV_8; + signal UCRsp_Complete : std_logic; + + signal UCRsp_Address_rst : std_logic; + signal UCRsp_SenderMACAddress_nxt : std_logic; + signal UCRsp_SenderIPv4Address_nxt : std_logic; + signal UCRsp_TargetMACAddress_nxt : std_logic; + signal UCRsp_TargetIPv4Address_nxt : std_logic; + + signal UCRsp_TX_Valid : std_logic; + signal UCRsp_TX_Data : T_SLV_8; + signal UCRsp_TX_SOF : std_logic; + signal UCRsp_TX_EOF : std_logic; + signal UCRsp_TX_Ack : std_logic; + signal UCRsp_TX_Meta_DestMACAddress_rst : std_logic; + signal UCRsp_TX_Meta_DestMACAddress_nxt : std_logic; + signal UCRsp_TX_Meta_DestMACAddress_Data : T_SLV_8; type T_FSMCACHE_STATE is ( ST_IDLE, @@ -179,118 +179,118 @@ architecture rtl of arp_Wrapper is ST_ERROR ); - signal FSMCache_State : T_FSMCACHE_STATE := ST_IDLE; - signal FSMCache_NextState : T_FSMCACHE_STATE; + signal FSMCache_State : T_FSMCACHE_STATE := ST_IDLE; + signal FSMCache_NextState : T_FSMCACHE_STATE; - signal FSMCache_ARPCache_Command : T_NET_ARP_ARPCACHE_COMMAND; - signal FSMCache_ARPCache_NewIPv4Address_Data : T_SLV_8; - signal FSMCache_ARPCache_NewMACAddress_Data : T_SLV_8; + signal FSMCache_ARPCache_Command : T_NET_ARP_ARPCACHE_COMMAND; + signal FSMCache_ARPCache_NewIPv4Address_Data : T_SLV_8; + signal FSMCache_ARPCache_NewMACAddress_Data : T_SLV_8; - signal FSMCache_MACSeq2_SenderMACAddress_rst : std_logic; - signal FSMCache_MACSeq2_SenderMACAddress_nxt : std_logic; - signal FSMCache_IPSeq2_SenderIPv4Address_rst : std_logic; - signal FSMCache_IPSeq2_SenderIPv4Address_nxt : std_logic; + signal FSMCache_MACSeq2_SenderMACAddress_rst : std_logic; + signal FSMCache_MACSeq2_SenderMACAddress_nxt : std_logic; + signal FSMCache_IPSeq2_SenderIPv4Address_rst : std_logic; + signal FSMCache_IPSeq2_SenderIPv4Address_nxt : std_logic; - signal FSMCache_UCRcv_Clear : std_logic; - signal FSMCache_UCRcv_Address_rst : std_logic; - signal FSMCache_UCRcv_SenderMACAddress_nxt : std_logic; - signal FSMCache_UCRcv_SenderIPv4Address_nxt : std_logic; - signal FSMCache_UCRcv_TargetMACAddress_nxt : std_logic; - signal FSMCache_UCRcv_TargetIPv4Address_nxt : std_logic; + signal FSMCache_UCRcv_Clear : std_logic; + signal FSMCache_UCRcv_Address_rst : std_logic; + signal FSMCache_UCRcv_SenderMACAddress_nxt : std_logic; + signal FSMCache_UCRcv_SenderIPv4Address_nxt : std_logic; + signal FSMCache_UCRcv_TargetMACAddress_nxt : std_logic; + signal FSMCache_UCRcv_TargetIPv4Address_nxt : std_logic; - signal FSMCache_ARPCache_Lookup : std_logic; - signal FSMCache_ARPCache_IPv4Address_Data : T_SLV_8; - signal FSMCache_ARPCache_MACAddress_rst : std_logic; - signal FSMCache_ARPCache_MACAddress_nxt : std_logic; + signal FSMCache_ARPCache_Lookup : std_logic; + signal FSMCache_ARPCache_IPv4Address_Data : T_SLV_8; + signal FSMCache_ARPCache_MACAddress_rst : std_logic; + signal FSMCache_ARPCache_MACAddress_nxt : std_logic; - signal FSMCache_BCReq_SendRequest : std_logic; - signal FSMCache_BCReq_SenderMACAddress_Data : T_SLV_8; - signal FSMCache_BCReq_SenderIPv4Address_Data : T_SLV_8; - signal FSMCache_BCReq_TargetMACAddress_Data : T_SLV_8; - signal FSMCache_BCReq_TargetIPv4Address_Data : T_SLV_8; + signal FSMCache_BCReq_SendRequest : std_logic; + signal FSMCache_BCReq_SenderMACAddress_Data : T_SLV_8; + signal FSMCache_BCReq_SenderIPv4Address_Data : T_SLV_8; + signal FSMCache_BCReq_TargetMACAddress_Data : T_SLV_8; + signal FSMCache_BCReq_TargetIPv4Address_Data : T_SLV_8; -- Sender ***Address sequencer - signal MACSeq2_SenderMACAddress_Data : T_SLV_8; - signal IPSeq2_SenderIPv4Address_Data : T_SLV_8; + signal MACSeq2_SenderMACAddress_Data : T_SLV_8; + signal IPSeq2_SenderIPv4Address_Data : T_SLV_8; -- ARP request timeout counter - constant ARPREQ_TIMEOUTCOUNTER_MAX : positive := TimingToCycles(APR_REQUEST_TIMEOUT, CLOCK_FREQ); - constant ARPREQ_TIMEOUTCOUNTER_BITS : positive := log2ceilnz(ARPREQ_TIMEOUTCOUNTER_MAX); + constant ARPREQ_TIMEOUTCOUNTER_MAX : positive := TimingToCycles(APR_REQUEST_TIMEOUT, CLOCK_FREQ); + constant ARPREQ_TIMEOUTCOUNTER_BITS : positive := log2ceilnz(ARPREQ_TIMEOUTCOUNTER_MAX); - signal FSMCache_ARPReq_TimeoutCounter_rst : std_logic; - signal ARPReq_TimeoutCounter_s : signed(ARPREQ_TIMEOUTCOUNTER_BITS downto 0) := to_signed(ARPREQ_TIMEOUTCOUNTER_MAX, ARPREQ_TIMEOUTCOUNTER_BITS + 1); - signal ARPReq_Timeout : std_logic; + signal FSMCache_ARPReq_TimeoutCounter_rst : std_logic; + signal ARPReq_TimeoutCounter_s : signed(ARPREQ_TIMEOUTCOUNTER_BITS downto 0) := to_signed(ARPREQ_TIMEOUTCOUNTER_MAX, ARPREQ_TIMEOUTCOUNTER_BITS + 1); + signal ARPReq_Timeout : std_logic; -- unicast receiver - signal UCRcv_Error : std_logic; - signal UCRcv_ResponseReceived : std_logic; - signal UCRcv_SenderMACAddress_Data : T_SLV_8; - signal UCRcv_SenderIPv4Address_Data : T_SLV_8; - signal UCRcv_TargetMACAddress_Data : T_SLV_8; - signal UCRcv_TargetIPv4Address_Data : T_SLV_8; + signal UCRcv_Error : std_logic; + signal UCRcv_ResponseReceived : std_logic; + signal UCRcv_SenderMACAddress_Data : T_SLV_8; + signal UCRcv_SenderIPv4Address_Data : T_SLV_8; + signal UCRcv_TargetMACAddress_Data : T_SLV_8; + signal UCRcv_TargetIPv4Address_Data : T_SLV_8; -- arp cache - signal ARPCache_Status : T_NET_ARP_ARPCACHE_STATUS; - signal ARPCache_NewMACAddress_nxt : std_logic; - signal ARPCache_NewIPv4Address_nxt : std_logic; - signal ARPCache_CacheResult : T_CACHE_RESULT; - signal ARPCache_IPv4Address_rst : std_logic; - signal ARPCache_IPv4Address_nxt : std_logic; - signal ARPCache_MACAddress_Data : T_SLV_8; + signal ARPCache_Status : T_NET_ARP_ARPCACHE_STATUS; + signal ARPCache_NewMACAddress_nxt : std_logic; + signal ARPCache_NewIPv4Address_nxt : std_logic; + signal ARPCache_CacheResult : T_CACHE_RESULT; + signal ARPCache_IPv4Address_rst : std_logic; + signal ARPCache_IPv4Address_nxt : std_logic; + signal ARPCache_MACAddress_Data : T_SLV_8; -- broadcast requester - signal BCReq_Complete : std_logic; - - signal BCReq_Address_rst : std_logic; - signal BCReq_SenderMACAddress_nxt : std_logic; - signal BCReq_SenderIPv4Address_nxt : std_logic; - signal BCReq_TargetMACAddress_nxt : std_logic; - signal BCReq_TargetIPv4Address_nxt : std_logic; - - signal BCReq_TX_Valid : std_logic; - signal BCReq_TX_Data : T_SLV_8; - signal BCReq_TX_SOF : std_logic; - signal BCReq_TX_EOF : std_logic; - signal BCReq_TX_Ack : std_logic; - signal BCReq_TX_Meta_DestMACAddress_rst : std_logic; - signal BCReq_TX_Meta_DestMACAddress_nxt : std_logic; - signal BCReq_TX_Meta_DestMACAddress_Data : T_SLV_8; + signal BCReq_Complete : std_logic; + + signal BCReq_Address_rst : std_logic; + signal BCReq_SenderMACAddress_nxt : std_logic; + signal BCReq_SenderIPv4Address_nxt : std_logic; + signal BCReq_TargetMACAddress_nxt : std_logic; + signal BCReq_TargetIPv4Address_nxt : std_logic; + + signal BCReq_TX_Valid : std_logic; + signal BCReq_TX_Data : T_SLV_8; + signal BCReq_TX_SOF : std_logic; + signal BCReq_TX_EOF : std_logic; + signal BCReq_TX_Ack : std_logic; + signal BCReq_TX_Meta_DestMACAddress_rst : std_logic; + signal BCReq_TX_Meta_DestMACAddress_nxt : std_logic; + signal BCReq_TX_Meta_DestMACAddress_Data : T_SLV_8; begin -- latched inputs (high-active) - IPPool_Announce_l <= ((IPPool_Announce or IPPool_Announce_l) and not IPPool_Announced_i) when rising_edge(Clock); - IPPool_Announced <= IPPool_Announced_i; + IPPool_Announce_l <= ((IPPool_Announce or IPPool_Announce_l) and not IPPool_Announced_i) when rising_edge(Clock); + IPPool_Announced <= IPPool_Announced_i; -- FIXME: assign correct value - IPPool_Insert <= '0'; + IPPool_Insert <= '0'; -- ============================================================================= -- Responder Path -- ============================================================================= MACSeq1: entity work.misc_Sequencer generic map ( - INPUT_BITS => 48, - OUTPUT_BITS => 8, - REGISTERED => FALSE + INPUT_BITS => 48, + OUTPUT_BITS => 8, + REGISTERED => FALSE ) port map ( - Clock => Clock, - Reset => Reset, - - Input => to_slv(INTERFACE_MACADDRESS), - rst => FSMPool_MACSeq1_SenderMACAddress_rst, - rev => '1', - nxt => FSMPool_MACSeq1_SenderMACAddress_nxt, - Output => MACSeq1_SenderMACAddress_Data + Clock => Clock, + Reset => Reset, + + Input => to_slv(INTERFACE_MACADDRESS), + rst => FSMPool_MACSeq1_SenderMACAddress_rst, + rev => '1', + nxt => FSMPool_MACSeq1_SenderMACAddress_nxt, + Output => MACSeq1_SenderMACAddress_Data ); process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - FSMPool_State <= ST_IDLE; + FSMPool_State <= ST_IDLE; else - FSMPool_State <= FSMPool_NextState; + FSMPool_State <= FSMPool_NextState; end if; end if; end process; @@ -305,77 +305,77 @@ begin IPPool_PoolResult, IPPool_IPv4Address_nxt, UCRsp_Address_rst, UCRsp_SenderMACAddress_nxt, UCRsp_SenderIPv4Address_nxt, UCRsp_TargetMACAddress_nxt, UCRsp_TargetIPv4Address_nxt, UCRsp_Complete) begin - FSMPool_NextState <= FSMPool_State; + FSMPool_NextState <= FSMPool_State; --- FSMPool_Command <= NET_ARP_CACHE_CMD_NONE; --- FSMPool_NewIPv4Address_Data <= UCRcv_SenderIPv4Address_Data; --- FSMPool_NewMACAddress_Data <= UCRcv_SenderMACAddress_Data; +-- FSMPool_Command <= NET_ARP_CACHE_CMD_NONE; +-- FSMPool_NewIPv4Address_Data <= UCRcv_SenderIPv4Address_Data; +-- FSMPool_NewMACAddress_Data <= UCRcv_SenderMACAddress_Data; - IPPool_Announced_i <= '0'; + IPPool_Announced_i <= '0'; - FSMPool_MACSeq1_SenderMACAddress_rst <= '0'; - FSMPool_MACSeq1_SenderMACAddress_nxt <= '0'; + FSMPool_MACSeq1_SenderMACAddress_rst <= '0'; + FSMPool_MACSeq1_SenderMACAddress_nxt <= '0'; - FSMPool_BCRcv_Clear <= '0'; - FSMPool_BCRcv_Address_rst <= '0'; - FSMPool_BCRcv_SenderMACAddress_nxt <= '0'; - FSMPool_BCRcv_SenderIPv4Address_nxt <= '0'; - FSMPool_BCRcv_TargetIPv4Address_nxt <= '0'; + FSMPool_BCRcv_Clear <= '0'; + FSMPool_BCRcv_Address_rst <= '0'; + FSMPool_BCRcv_SenderMACAddress_nxt <= '0'; + FSMPool_BCRcv_SenderIPv4Address_nxt <= '0'; + FSMPool_BCRcv_TargetIPv4Address_nxt <= '0'; - FSMPool_IPPool_Lookup <= '0'; - FSMPool_IPPool_IPv4Address_Data <= BCRcv_TargetIPv4Address_Data; + FSMPool_IPPool_Lookup <= '0'; + FSMPool_IPPool_IPv4Address_Data <= BCRcv_TargetIPv4Address_Data; - FSMPool_UCRsp_SendResponse <= '0'; - FSMPool_UCRsp_SenderMACAddress_Data <= MACSeq1_SenderMACAddress_Data; - FSMPool_UCRsp_SenderIPv4Address_Data <= BCRcv_TargetIPv4Address_Data; - FSMPool_UCRsp_TargetMACAddress_Data <= BCRcv_SenderMACAddress_Data; - FSMPool_UCRsp_TargetIPv4Address_Data <= BCRcv_SenderIPv4Address_Data; + FSMPool_UCRsp_SendResponse <= '0'; + FSMPool_UCRsp_SenderMACAddress_Data <= MACSeq1_SenderMACAddress_Data; + FSMPool_UCRsp_SenderIPv4Address_Data <= BCRcv_TargetIPv4Address_Data; + FSMPool_UCRsp_TargetMACAddress_Data <= BCRcv_SenderMACAddress_Data; + FSMPool_UCRsp_TargetIPv4Address_Data <= BCRcv_SenderIPv4Address_Data; case FSMPool_State is when ST_IDLE => if (BCRcv_RequestReceived = '1') then - FSMPool_IPPool_Lookup <= '1'; - FSMPool_BCRcv_TargetIPv4Address_nxt <= IPPool_IPv4Address_nxt; + FSMPool_IPPool_Lookup <= '1'; + FSMPool_BCRcv_TargetIPv4Address_nxt <= IPPool_IPv4Address_nxt; - FSMPool_NextState <= ST_IPPOOL_WAIT; + FSMPool_NextState <= ST_IPPOOL_WAIT; elsif (IPPool_Announce_l = '1') then --- FSMPool_UCRsp_SendResponse <= '1'; +-- FSMPool_UCRsp_SendResponse <= '1'; --- FSMPool_NextState <= ST_SEND_ANNOUNCE; +-- FSMPool_NextState <= ST_SEND_ANNOUNCE; end if; when ST_IPPOOL_WAIT => - FSMPool_BCRcv_TargetIPv4Address_nxt <= IPPool_IPv4Address_nxt; + FSMPool_BCRcv_TargetIPv4Address_nxt <= IPPool_IPv4Address_nxt; if (IPPool_PoolResult = CACHE_RESULT_HIT) then - FSMPool_BCRcv_Address_rst <= '1'; - FSMPool_MACSeq1_SenderMACAddress_rst <= '1'; - FSMPool_UCRsp_SendResponse <= '1'; + FSMPool_BCRcv_Address_rst <= '1'; + FSMPool_MACSeq1_SenderMACAddress_rst <= '1'; + FSMPool_UCRsp_SendResponse <= '1'; - FSMPool_NextState <= ST_SEND_RESPONSE; + FSMPool_NextState <= ST_SEND_RESPONSE; elsif (IPPool_PoolResult = CACHE_RESULT_MISS) then - FSMPool_BCRcv_Clear <= '1'; - FSMPool_NextState <= ST_IDLE; + FSMPool_BCRcv_Clear <= '1'; + FSMPool_NextState <= ST_IDLE; end if; when ST_SEND_RESPONSE => - FSMPool_BCRcv_Address_rst <= UCRsp_Address_rst; - FSMPool_BCRcv_SenderMACAddress_nxt <= UCRsp_TargetMACAddress_nxt; - FSMPool_BCRcv_SenderIPv4Address_nxt <= UCRsp_TargetIPv4Address_nxt; - FSMPool_MACSeq1_SenderMACAddress_nxt <= UCRsp_SenderMACAddress_nxt; - FSMPool_BCRcv_TargetIPv4Address_nxt <= UCRsp_SenderIPv4Address_nxt; + FSMPool_BCRcv_Address_rst <= UCRsp_Address_rst; + FSMPool_BCRcv_SenderMACAddress_nxt <= UCRsp_TargetMACAddress_nxt; + FSMPool_BCRcv_SenderIPv4Address_nxt <= UCRsp_TargetIPv4Address_nxt; + FSMPool_MACSeq1_SenderMACAddress_nxt <= UCRsp_SenderMACAddress_nxt; + FSMPool_BCRcv_TargetIPv4Address_nxt <= UCRsp_SenderIPv4Address_nxt; if (UCRsp_Complete = '1') then - FSMPool_BCRcv_Clear <= '1'; - FSMPool_NextState <= ST_IDLE; + FSMPool_BCRcv_Clear <= '1'; + FSMPool_NextState <= ST_IDLE; end if; when ST_SEND_ANNOUNCE => if (UCRsp_Complete = '1') then - IPPool_Announced_i <= '1'; - FSMPool_BCRcv_Clear <= '1'; + IPPool_Announced_i <= '1'; + FSMPool_BCRcv_Clear <= '1'; - FSMPool_NextState <= ST_IDLE; + FSMPool_NextState <= ST_IDLE; end if; when ST_ERROR => @@ -386,278 +386,278 @@ begin BCRcv: entity work.arp_BroadCast_Receiver generic map ( - ALLOWED_PROTOCOL_IPV4 => TRUE, - ALLOWED_PROTOCOL_IPV6 => FALSE + ALLOWED_PROTOCOL_IPV4 => TRUE, + ALLOWED_PROTOCOL_IPV6 => FALSE ) port map ( - Clock => Clock, - Reset => Reset, - - RX_Valid => Eth_BC_RX_Valid, - RX_Data => Eth_BC_RX_Data, - RX_SOF => Eth_BC_RX_SOF, - RX_EOF => Eth_BC_RX_EOF, - RX_Ack => Eth_BC_RX_Ack, - RX_Meta_rst => Eth_BC_RX_Meta_rst, - RX_Meta_SrcMACAddress_nxt => Eth_BC_RX_Meta_SrcMACAddress_nxt, - RX_Meta_SrcMACAddress_Data => Eth_BC_RX_Meta_SrcMACAddress_Data, - RX_Meta_DestMACAddress_nxt => Eth_BC_RX_Meta_DestMACAddress_nxt, - RX_Meta_DestMACAddress_Data => Eth_BC_RX_Meta_DestMACAddress_Data, - - Clear => FSMPool_BCRcv_Clear, - Error => BCRcv_Error, - - RequestReceived => BCRcv_RequestReceived, - Address_rst => FSMPool_BCRcv_Address_rst, - SenderMACAddress_nxt => FSMPool_BCRcv_SenderMACAddress_nxt, - SenderMACAddress_Data => BCRcv_SenderMACAddress_Data, - SenderIPAddress_nxt => FSMPool_BCRcv_SenderIPv4Address_nxt, - SenderIPAddress_Data => BCRcv_SenderIPv4Address_Data, - TargetIPAddress_nxt => FSMPool_BCRcv_TargetIPv4Address_nxt, - TargetIPAddress_Data => BCRcv_TargetIPv4Address_Data + Clock => Clock, + Reset => Reset, + + RX_Valid => Eth_BC_RX_Valid, + RX_Data => Eth_BC_RX_Data, + RX_SOF => Eth_BC_RX_SOF, + RX_EOF => Eth_BC_RX_EOF, + RX_Ack => Eth_BC_RX_Ack, + RX_Meta_rst => Eth_BC_RX_Meta_rst, + RX_Meta_SrcMACAddress_nxt => Eth_BC_RX_Meta_SrcMACAddress_nxt, + RX_Meta_SrcMACAddress_Data => Eth_BC_RX_Meta_SrcMACAddress_Data, + RX_Meta_DestMACAddress_nxt => Eth_BC_RX_Meta_DestMACAddress_nxt, + RX_Meta_DestMACAddress_Data => Eth_BC_RX_Meta_DestMACAddress_Data, + + Clear => FSMPool_BCRcv_Clear, + Error => BCRcv_Error, + + RequestReceived => BCRcv_RequestReceived, + Address_rst => FSMPool_BCRcv_Address_rst, + SenderMACAddress_nxt => FSMPool_BCRcv_SenderMACAddress_nxt, + SenderMACAddress_Data => BCRcv_SenderMACAddress_Data, + SenderIPAddress_nxt => FSMPool_BCRcv_SenderIPv4Address_nxt, + SenderIPAddress_Data => BCRcv_SenderIPv4Address_Data, + TargetIPAddress_nxt => FSMPool_BCRcv_TargetIPv4Address_nxt, + TargetIPAddress_Data => BCRcv_TargetIPv4Address_Data ); IPPool: entity work.arp_IPPool generic map ( - IPPOOL_SIZE => 8, - INITIAL_IPV4ADDRESSES => INITIAL_IPV4ADDRESSES + IPPOOL_SIZE => 8, + INITIAL_IPV4ADDRESSES => INITIAL_IPV4ADDRESSES ) port map ( - Clock => Clock, - Reset => Reset, + Clock => Clock, + Reset => Reset, --- Command => IPPool_Command, --- IPv4Address_Data => (others => '0'), --- MACAddress_Data => (others => '0'), +-- Command => IPPool_Command, +-- IPv4Address_Data => (others => '0'), +-- MACAddress_Data => (others => '0'), - Lookup => FSMPool_IPPool_Lookup, - IPv4Address_rst => IPPool_IPv4Address_rst, - IPv4Address_nxt => IPPool_IPv4Address_nxt, - IPv4Address_Data => FSMPool_IPPool_IPv4Address_Data, + Lookup => FSMPool_IPPool_Lookup, + IPv4Address_rst => IPPool_IPv4Address_rst, + IPv4Address_nxt => IPPool_IPv4Address_nxt, + IPv4Address_Data => FSMPool_IPPool_IPv4Address_Data, - PoolResult => IPPool_PoolResult + PoolResult => IPPool_PoolResult ); UCRsp: entity work.arp_UniCast_Responder --- generic map ( +-- generic map ( -- --- ) +-- ) port map ( - Clock => Clock, - Reset => Reset, - - SendResponse => FSMPool_UCRsp_SendResponse, - Complete => UCRsp_Complete, - - Address_rst => UCRsp_Address_rst, - SenderMACAddress_nxt => UCRsp_SenderMACAddress_nxt, - SenderMACAddress_Data => FSMPool_UCRsp_SenderMACAddress_Data, -- self - SenderIPv4Address_nxt => UCRsp_SenderIPv4Address_nxt, - SenderIPv4Address_Data => FSMPool_UCRsp_SenderIPv4Address_Data, -- self - TargetMACAddress_nxt => UCRsp_TargetMACAddress_nxt, - TargetMACAddress_Data => FSMPool_UCRsp_TargetMACAddress_Data, -- requester - TargetIPv4Address_nxt => UCRsp_TargetIPv4Address_nxt, - TargetIPv4Address_Data => FSMPool_UCRsp_TargetIPv4Address_Data, -- requester - - TX_Valid => UCRsp_TX_Valid, - TX_Data => UCRsp_TX_Data, - TX_SOF => UCRsp_TX_SOF, - TX_EOF => UCRsp_TX_EOF, - TX_Ack => UCRsp_TX_Ack, - TX_Meta_DestMACAddress_rst => UCRsp_TX_Meta_DestMACAddress_rst, - TX_Meta_DestMACAddress_nxt => UCRsp_TX_Meta_DestMACAddress_nxt, - TX_Meta_DestMACAddress_Data => UCRsp_TX_Meta_DestMACAddress_Data + Clock => Clock, + Reset => Reset, + + SendResponse => FSMPool_UCRsp_SendResponse, + Complete => UCRsp_Complete, + + Address_rst => UCRsp_Address_rst, + SenderMACAddress_nxt => UCRsp_SenderMACAddress_nxt, + SenderMACAddress_Data => FSMPool_UCRsp_SenderMACAddress_Data, -- self + SenderIPv4Address_nxt => UCRsp_SenderIPv4Address_nxt, + SenderIPv4Address_Data => FSMPool_UCRsp_SenderIPv4Address_Data, -- self + TargetMACAddress_nxt => UCRsp_TargetMACAddress_nxt, + TargetMACAddress_Data => FSMPool_UCRsp_TargetMACAddress_Data, -- requester + TargetIPv4Address_nxt => UCRsp_TargetIPv4Address_nxt, + TargetIPv4Address_Data => FSMPool_UCRsp_TargetIPv4Address_Data, -- requester + + TX_Valid => UCRsp_TX_Valid, + TX_Data => UCRsp_TX_Data, + TX_SOF => UCRsp_TX_SOF, + TX_EOF => UCRsp_TX_EOF, + TX_Ack => UCRsp_TX_Ack, + TX_Meta_DestMACAddress_rst => UCRsp_TX_Meta_DestMACAddress_rst, + TX_Meta_DestMACAddress_nxt => UCRsp_TX_Meta_DestMACAddress_nxt, + TX_Meta_DestMACAddress_Data => UCRsp_TX_Meta_DestMACAddress_Data ); -- ============================================================================= -- ARPCache Path -- ============================================================================= MACSeq2: entity work.misc_Sequencer generic map ( - INPUT_BITS => 48, - OUTPUT_BITS => 8, - REGISTERED => FALSE + INPUT_BITS => 48, + OUTPUT_BITS => 8, + REGISTERED => FALSE ) port map ( - Clock => Clock, - Reset => Reset, - - Input => to_slv(INTERFACE_MACADDRESS), - rst => FSMCache_MACSeq2_SenderMACAddress_rst, - rev => '1', - nxt => FSMCache_MACSeq2_SenderMACAddress_nxt, - Output => MACSeq2_SenderMACAddress_Data + Clock => Clock, + Reset => Reset, + + Input => to_slv(INTERFACE_MACADDRESS), + rst => FSMCache_MACSeq2_SenderMACAddress_rst, + rev => '1', + nxt => FSMCache_MACSeq2_SenderMACAddress_nxt, + Output => MACSeq2_SenderMACAddress_Data ); IPSeq2: entity work.misc_Sequencer generic map ( - INPUT_BITS => 32, - OUTPUT_BITS => 8, - REGISTERED => FALSE + INPUT_BITS => 32, + OUTPUT_BITS => 8, + REGISTERED => FALSE ) port map ( - Clock => Clock, - Reset => Reset, - - Input => to_slv(INITIAL_IPV4ADDRESSES(0)), - rst => FSMCache_IPSeq2_SenderIPv4Address_rst, - rev => '1', - nxt => FSMCache_IPSeq2_SenderIPv4Address_nxt, - Output => IPSeq2_SenderIPv4Address_Data + Clock => Clock, + Reset => Reset, + + Input => to_slv(INITIAL_IPV4ADDRESSES(0)), + rst => FSMCache_IPSeq2_SenderIPv4Address_rst, + rev => '1', + nxt => FSMCache_IPSeq2_SenderIPv4Address_nxt, + Output => IPSeq2_SenderIPv4Address_Data ); process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - FSMCache_State <= ST_IDLE; + FSMCache_State <= ST_IDLE; else - FSMCache_State <= FSMCache_NextState; + FSMCache_State <= FSMCache_NextState; end if; end if; end process; process(FSMCache_State, - IPCache_Lookup, IPCache_IPv4Address_Data, IPCache_MACAddress_rst, IPCache_MACAddress_nxt, + IPCache_Lookup, IPCache_IPv4Address_Data, IPCache_MACAddress_rst, IPCache_MACAddress_nxt, MACSeq2_SenderMACAddress_Data, IPSeq2_SenderIPv4Address_Data, ARPReq_Timeout, UCRcv_Error, UCRcv_ResponseReceived, UCRcv_SenderIPv4Address_Data, UCRcv_SenderMACAddress_Data, UCRcv_TargetIPv4Address_Data, UCRcv_TargetMACAddress_Data, ARPCache_Status, ARPCache_CacheResult, ARPCache_IPv4Address_rst, ARPCache_IPv4Address_nxt, ARPCache_MACAddress_Data, ARPCache_NewMACAddress_nxt, ARPCache_NewIPv4Address_nxt, BCReq_Address_rst, BCReq_SenderMACAddress_nxt, BCReq_SenderIPv4Address_nxt, BCReq_TargetMACAddress_nxt, BCReq_TargetIPv4Address_nxt, BCReq_Complete) begin - FSMCache_NextState <= FSMCache_State; + FSMCache_NextState <= FSMCache_State; - IPCache_IPv4Address_rst <= '0'; - IPCache_IPv4Address_nxt <= '0'; + IPCache_IPv4Address_rst <= '0'; + IPCache_IPv4Address_nxt <= '0'; - IPCache_Valid <= '0'; - IPCache_MACAddress_Data <= ARPCache_MACAddress_Data; + IPCache_Valid <= '0'; + IPCache_MACAddress_Data <= ARPCache_MACAddress_Data; - FSMCache_ARPCache_Command <= NET_ARP_ARPCACHE_CMD_NONE; - FSMCache_ARPCache_NewMACAddress_Data <= UCRcv_SenderMACAddress_Data; - FSMCache_ARPCache_NewIPv4Address_Data <= UCRcv_SenderIPv4Address_Data; + FSMCache_ARPCache_Command <= NET_ARP_ARPCACHE_CMD_NONE; + FSMCache_ARPCache_NewMACAddress_Data <= UCRcv_SenderMACAddress_Data; + FSMCache_ARPCache_NewIPv4Address_Data <= UCRcv_SenderIPv4Address_Data; - FSMCache_MACSeq2_SenderMACAddress_rst <= '0'; - FSMCache_MACSeq2_SenderMACAddress_nxt <= '0'; - FSMCache_IPSeq2_SenderIPv4Address_rst <= '0'; - FSMCache_IPSeq2_SenderIPv4Address_nxt <= '0'; + FSMCache_MACSeq2_SenderMACAddress_rst <= '0'; + FSMCache_MACSeq2_SenderMACAddress_nxt <= '0'; + FSMCache_IPSeq2_SenderIPv4Address_rst <= '0'; + FSMCache_IPSeq2_SenderIPv4Address_nxt <= '0'; - FSMCache_ARPReq_TimeoutCounter_rst <= '1'; + FSMCache_ARPReq_TimeoutCounter_rst <= '1'; - FSMCache_ARPCache_Lookup <= '0'; - FSMCache_ARPCache_IPv4Address_Data <= IPCache_IPv4Address_Data; - FSMCache_ARPCache_MACAddress_rst <= IPCache_MACAddress_rst; - FSMCache_ARPCache_MACAddress_nxt <= IPCache_MACAddress_nxt; + FSMCache_ARPCache_Lookup <= '0'; + FSMCache_ARPCache_IPv4Address_Data <= IPCache_IPv4Address_Data; + FSMCache_ARPCache_MACAddress_rst <= IPCache_MACAddress_rst; + FSMCache_ARPCache_MACAddress_nxt <= IPCache_MACAddress_nxt; - FSMCache_BCReq_SendRequest <= '0'; - FSMCache_BCReq_SenderMACAddress_Data <= MACSeq2_SenderMACAddress_Data; - FSMCache_BCReq_SenderIPv4Address_Data <= IPSeq2_SenderIPv4Address_Data; - FSMCache_BCReq_TargetMACAddress_Data <= x"00"; - FSMCache_BCReq_TargetIPv4Address_Data <= IPCache_IPv4Address_Data; + FSMCache_BCReq_SendRequest <= '0'; + FSMCache_BCReq_SenderMACAddress_Data <= MACSeq2_SenderMACAddress_Data; + FSMCache_BCReq_SenderIPv4Address_Data <= IPSeq2_SenderIPv4Address_Data; + FSMCache_BCReq_TargetMACAddress_Data <= x"00"; + FSMCache_BCReq_TargetIPv4Address_Data <= IPCache_IPv4Address_Data; - FSMCache_UCRcv_Clear <= UCRcv_ResponseReceived; -- discard all ARP packets, which are not requested / expected - FSMCache_UCRcv_Address_rst <= '0'; - FSMCache_UCRcv_SenderMACAddress_nxt <= '0'; - FSMCache_UCRcv_SenderIPv4Address_nxt <= '0'; - FSMCache_UCRcv_TargetMACAddress_nxt <= '0'; -- default assignment for unsed metadata TargetMACAddress - FSMCache_UCRcv_TargetIPv4Address_nxt <= '0'; -- default assignment for unsed metadata TargetIPv4Address + FSMCache_UCRcv_Clear <= UCRcv_ResponseReceived; -- discard all ARP packets, which are not requested / expected + FSMCache_UCRcv_Address_rst <= '0'; + FSMCache_UCRcv_SenderMACAddress_nxt <= '0'; + FSMCache_UCRcv_SenderIPv4Address_nxt <= '0'; + FSMCache_UCRcv_TargetMACAddress_nxt <= '0'; -- default assignment for unsed metadata TargetMACAddress + FSMCache_UCRcv_TargetIPv4Address_nxt <= '0'; -- default assignment for unsed metadata TargetIPv4Address case FSMCache_State is when ST_IDLE => - IPCache_IPv4Address_rst <= '1'; + IPCache_IPv4Address_rst <= '1'; if (IPCache_Lookup = '1') then - FSMCache_NextState <= ST_CACHE; + FSMCache_NextState <= ST_CACHE; end if; when ST_CACHE => - FSMCache_ARPCache_Lookup <= '1'; - IPCache_IPv4Address_rst <= ARPCache_IPv4Address_rst; - IPCache_IPv4Address_nxt <= ARPCache_IPv4Address_nxt; + FSMCache_ARPCache_Lookup <= '1'; + IPCache_IPv4Address_rst <= ARPCache_IPv4Address_rst; + IPCache_IPv4Address_nxt <= ARPCache_IPv4Address_nxt; if (ARPCache_CacheResult = CACHE_RESULT_MISS) then - FSMCache_NextState <= ST_SEND_BROADCAST_REQUEST; + FSMCache_NextState <= ST_SEND_BROADCAST_REQUEST; else - FSMCache_NextState <= ST_CACHE_WAIT; + FSMCache_NextState <= ST_CACHE_WAIT; end if; when ST_CACHE_WAIT => - IPCache_IPv4Address_rst <= ARPCache_IPv4Address_rst; - IPCache_IPv4Address_nxt <= ARPCache_IPv4Address_nxt; + IPCache_IPv4Address_rst <= ARPCache_IPv4Address_rst; + IPCache_IPv4Address_nxt <= ARPCache_IPv4Address_nxt; if (ARPCache_CacheResult = CACHE_RESULT_HIT) then - FSMCache_NextState <= ST_READ_CACHE; + FSMCache_NextState <= ST_READ_CACHE; elsif (ARPCache_CacheResult = CACHE_RESULT_MISS) then - FSMCache_NextState <= ST_SEND_BROADCAST_REQUEST; + FSMCache_NextState <= ST_SEND_BROADCAST_REQUEST; end if; when ST_READ_CACHE => - IPCache_IPv4Address_rst <= '1'; - IPCache_Valid <= '1'; + IPCache_IPv4Address_rst <= '1'; + IPCache_Valid <= '1'; - FSMCache_ARPCache_MACAddress_rst <= IPCache_MACAddress_rst; - FSMCache_ARPCache_MACAddress_nxt <= IPCache_MACAddress_nxt; + FSMCache_ARPCache_MACAddress_rst <= IPCache_MACAddress_rst; + FSMCache_ARPCache_MACAddress_nxt <= IPCache_MACAddress_nxt; if (IPCache_Lookup = '1') then - FSMCache_NextState <= ST_CACHE; + FSMCache_NextState <= ST_CACHE; end if; when ST_SEND_BROADCAST_REQUEST => - FSMCache_MACSeq2_SenderMACAddress_rst <= '1'; - FSMCache_IPSeq2_SenderIPv4Address_rst <= '1'; - FSMCache_BCReq_SendRequest <= '1'; + FSMCache_MACSeq2_SenderMACAddress_rst <= '1'; + FSMCache_IPSeq2_SenderIPv4Address_rst <= '1'; + FSMCache_BCReq_SendRequest <= '1'; - IPCache_IPv4Address_rst <= BCReq_Address_rst; - IPCache_IPv4Address_nxt <= BCReq_TargetIPv4Address_nxt; + IPCache_IPv4Address_rst <= BCReq_Address_rst; + IPCache_IPv4Address_nxt <= BCReq_TargetIPv4Address_nxt; - FSMCache_NextState <= ST_SEND_BROADCAST_REQUEST_WAIT; + FSMCache_NextState <= ST_SEND_BROADCAST_REQUEST_WAIT; when ST_SEND_BROADCAST_REQUEST_WAIT => - FSMCache_MACSeq2_SenderMACAddress_rst <= BCReq_Address_rst; - FSMCache_MACSeq2_SenderMACAddress_nxt <= BCReq_SenderMACAddress_nxt; - FSMCache_IPSeq2_SenderIPv4Address_rst <= BCReq_Address_rst; - FSMCache_IPSeq2_SenderIPv4Address_nxt <= BCReq_SenderIPv4Address_nxt; + FSMCache_MACSeq2_SenderMACAddress_rst <= BCReq_Address_rst; + FSMCache_MACSeq2_SenderMACAddress_nxt <= BCReq_SenderMACAddress_nxt; + FSMCache_IPSeq2_SenderIPv4Address_rst <= BCReq_Address_rst; + FSMCache_IPSeq2_SenderIPv4Address_nxt <= BCReq_SenderIPv4Address_nxt; - IPCache_IPv4Address_rst <= BCReq_Address_rst; - IPCache_IPv4Address_nxt <= BCReq_TargetIPv4Address_nxt; + IPCache_IPv4Address_rst <= BCReq_Address_rst; + IPCache_IPv4Address_nxt <= BCReq_TargetIPv4Address_nxt; if (BCReq_Complete = '1') then - FSMCache_NextState <= ST_WAIT_FOR_UNICAST_RESPONSE; + FSMCache_NextState <= ST_WAIT_FOR_UNICAST_RESPONSE; end if; when ST_WAIT_FOR_UNICAST_RESPONSE => - FSMCache_UCRcv_Clear <= '0'; - FSMCache_ARPReq_TimeoutCounter_rst <= '0'; + FSMCache_UCRcv_Clear <= '0'; + FSMCache_ARPReq_TimeoutCounter_rst <= '0'; -- TODO: check received ARP packet data with ethernet metadata if (UCRcv_Error = '1') then -- FIXME: error handling - FSMCache_NextState <= ST_ERROR; + FSMCache_NextState <= ST_ERROR; elsif (UCRcv_ResponseReceived = '1') then - FSMCache_ARPCache_Command <= NET_ARP_ARPCACHE_CMD_ADD; - FSMCache_UCRcv_SenderMACAddress_nxt <= ARPCache_NewMACAddress_nxt; - FSMCache_UCRcv_SenderIPv4Address_nxt <= ARPCache_NewIPv4Address_nxt; + FSMCache_ARPCache_Command <= NET_ARP_ARPCACHE_CMD_ADD; + FSMCache_UCRcv_SenderMACAddress_nxt <= ARPCache_NewMACAddress_nxt; + FSMCache_UCRcv_SenderIPv4Address_nxt <= ARPCache_NewIPv4Address_nxt; - FSMCache_NextState <= ST_UPDATE_CACHE; + FSMCache_NextState <= ST_UPDATE_CACHE; elsif (ARPReq_Timeout = '1') then -- FIXME: error handling --- FSMCache_NextState <= ST_ERROR; - FSMCache_NextState <= ST_SEND_BROADCAST_REQUEST; +-- FSMCache_NextState <= ST_ERROR; + FSMCache_NextState <= ST_SEND_BROADCAST_REQUEST; end if; when ST_UPDATE_CACHE => - FSMCache_UCRcv_Clear <= '0'; - FSMCache_UCRcv_SenderMACAddress_nxt <= ARPCache_NewMACAddress_nxt; - FSMCache_UCRcv_SenderIPv4Address_nxt <= ARPCache_NewIPv4Address_nxt; + FSMCache_UCRcv_Clear <= '0'; + FSMCache_UCRcv_SenderMACAddress_nxt <= ARPCache_NewMACAddress_nxt; + FSMCache_UCRcv_SenderIPv4Address_nxt <= ARPCache_NewIPv4Address_nxt; if (ARPCache_Status = NET_ARP_ARPCACHE_STATUS_UPDATE_COMPLETE) then - FSMCache_UCRcv_Clear <= '1'; - IPCache_IPv4Address_rst <= '1'; + FSMCache_UCRcv_Clear <= '1'; + IPCache_IPv4Address_rst <= '1'; - FSMCache_NextState <= ST_CACHE; + FSMCache_NextState <= ST_CACHE; end if; when ST_ERROR => -- FIXME: error handling - FSMCache_NextState <= ST_IDLE; + FSMCache_NextState <= ST_IDLE; end case; end process; @@ -667,188 +667,188 @@ begin begin if rising_edge(Clock) then if (FSMCache_ARPReq_TimeoutCounter_rst = '1') then - ARPReq_TimeoutCounter_s <= to_signed(ARPREQ_TIMEOUTCOUNTER_MAX, ARPReq_TimeoutCounter_s'length); + ARPReq_TimeoutCounter_s <= to_signed(ARPREQ_TIMEOUTCOUNTER_MAX, ARPReq_TimeoutCounter_s'length); else - ARPReq_TimeoutCounter_s <= ARPReq_TimeoutCounter_s - 1; + ARPReq_TimeoutCounter_s <= ARPReq_TimeoutCounter_s - 1; end if; end if; end process; - ARPReq_Timeout <= ARPReq_TimeoutCounter_s(ARPReq_TimeoutCounter_s'high); + ARPReq_Timeout <= ARPReq_TimeoutCounter_s(ARPReq_TimeoutCounter_s'high); UCRcv: entity work.arp_UniCast_Receiver generic map ( - ALLOWED_PROTOCOL_IPV4 => TRUE, - ALLOWED_PROTOCOL_IPV6 => FALSE + ALLOWED_PROTOCOL_IPV4 => TRUE, + ALLOWED_PROTOCOL_IPV6 => FALSE ) port map ( - Clock => Clock, - Reset => Reset, - - RX_Valid => Eth_UC_RX_Valid, - RX_Data => Eth_UC_RX_Data, - RX_SOF => Eth_UC_RX_SOF, - RX_EOF => Eth_UC_RX_EOF, - RX_Ack => Eth_UC_RX_Ack, - RX_Meta_rst => Eth_UC_RX_Meta_rst, - RX_Meta_SrcMACAddress_nxt => Eth_UC_RX_Meta_SrcMACAddress_nxt, - RX_Meta_SrcMACAddress_Data => Eth_UC_RX_Meta_SrcMACAddress_Data, - RX_Meta_DestMACAddress_nxt => Eth_UC_RX_Meta_DestMACAddress_nxt, - RX_Meta_DestMACAddress_Data => Eth_UC_RX_Meta_DestMACAddress_Data, - - Clear => FSMCache_UCRcv_Clear, - Error => UCRcv_Error, - - ResponseReceived => UCRcv_ResponseReceived, - Address_rst => FSMCache_UCRcv_Address_rst, - SenderIPAddress_nxt => FSMCache_UCRcv_SenderIPv4Address_nxt, - SenderIPAddress_Data => UCRcv_SenderIPv4Address_Data, - SenderMACAddress_nxt => FSMCache_UCRcv_SenderMACAddress_nxt, - SenderMACAddress_Data => UCRcv_SenderMACAddress_Data, - TargetIPAddress_nxt => FSMCache_UCRcv_TargetIPv4Address_nxt, - TargetIPAddress_Data => UCRcv_TargetIPv4Address_Data, - TargetMACAddress_nxt => FSMCache_UCRcv_TargetMACAddress_nxt, - TargetMACAddress_Data => UCRcv_TargetMACAddress_Data + Clock => Clock, + Reset => Reset, + + RX_Valid => Eth_UC_RX_Valid, + RX_Data => Eth_UC_RX_Data, + RX_SOF => Eth_UC_RX_SOF, + RX_EOF => Eth_UC_RX_EOF, + RX_Ack => Eth_UC_RX_Ack, + RX_Meta_rst => Eth_UC_RX_Meta_rst, + RX_Meta_SrcMACAddress_nxt => Eth_UC_RX_Meta_SrcMACAddress_nxt, + RX_Meta_SrcMACAddress_Data => Eth_UC_RX_Meta_SrcMACAddress_Data, + RX_Meta_DestMACAddress_nxt => Eth_UC_RX_Meta_DestMACAddress_nxt, + RX_Meta_DestMACAddress_Data => Eth_UC_RX_Meta_DestMACAddress_Data, + + Clear => FSMCache_UCRcv_Clear, + Error => UCRcv_Error, + + ResponseReceived => UCRcv_ResponseReceived, + Address_rst => FSMCache_UCRcv_Address_rst, + SenderIPAddress_nxt => FSMCache_UCRcv_SenderIPv4Address_nxt, + SenderIPAddress_Data => UCRcv_SenderIPv4Address_Data, + SenderMACAddress_nxt => FSMCache_UCRcv_SenderMACAddress_nxt, + SenderMACAddress_Data => UCRcv_SenderMACAddress_Data, + TargetIPAddress_nxt => FSMCache_UCRcv_TargetIPv4Address_nxt, + TargetIPAddress_Data => UCRcv_TargetIPv4Address_Data, + TargetMACAddress_nxt => FSMCache_UCRcv_TargetMACAddress_nxt, + TargetMACAddress_Data => UCRcv_TargetMACAddress_Data ); ARPCache: entity work.arp_Cache generic map ( - CLOCK_FREQ => CLOCK_FREQ, - REPLACEMENT_POLICY => "LRU", - TAG_BYTE_ORDER => BIG_ENDIAN, - DATA_BYTE_ORDER => BIG_ENDIAN, - INITIAL_CACHE_CONTENT => INITIAL_ARPCACHE_CONTENT + CLOCK_FREQ => CLOCK_FREQ, + REPLACEMENT_POLICY => "LRU", + TAG_BYTE_ORDER => BIG_ENDIAN, + DATA_BYTE_ORDER => BIG_ENDIAN, + INITIAL_CACHE_CONTENT => INITIAL_ARPCACHE_CONTENT ) port map ( - Clock => Clock, - Reset => Reset, - - Command => FSMCache_ARPCache_Command, - Status => ARPCache_Status, - NewMACAddress_nxt => ARPCache_NewMACAddress_nxt, - NewMACAddress_Data => FSMCache_ARPCache_NewMACAddress_Data, - NewIPv4Address_nxt => ARPCache_NewIPv4Address_nxt, - NewIPv4Address_Data => FSMCache_ARPCache_NewIPv4Address_Data, - - Lookup => FSMCache_ARPCache_Lookup, - IPv4Address_rst => ARPCache_IPv4Address_rst, - IPv4Address_nxt => ARPCache_IPv4Address_nxt, - IPv4Address_Data => FSMCache_ARPCache_IPv4Address_Data, - - CacheResult => ARPCache_CacheResult, - MACAddress_rst => FSMCache_ARPCache_MACAddress_rst, - MACAddress_nxt => FSMCache_ARPCache_MACAddress_nxt, - MACAddress_Data => ARPCache_MACAddress_Data + Clock => Clock, + Reset => Reset, + + Command => FSMCache_ARPCache_Command, + Status => ARPCache_Status, + NewMACAddress_nxt => ARPCache_NewMACAddress_nxt, + NewMACAddress_Data => FSMCache_ARPCache_NewMACAddress_Data, + NewIPv4Address_nxt => ARPCache_NewIPv4Address_nxt, + NewIPv4Address_Data => FSMCache_ARPCache_NewIPv4Address_Data, + + Lookup => FSMCache_ARPCache_Lookup, + IPv4Address_rst => ARPCache_IPv4Address_rst, + IPv4Address_nxt => ARPCache_IPv4Address_nxt, + IPv4Address_Data => FSMCache_ARPCache_IPv4Address_Data, + + CacheResult => ARPCache_CacheResult, + MACAddress_rst => FSMCache_ARPCache_MACAddress_rst, + MACAddress_nxt => FSMCache_ARPCache_MACAddress_nxt, + MACAddress_Data => ARPCache_MACAddress_Data ); BCReq: entity work.arp_BroadCast_Requester --- generic map ( +-- generic map ( -- --- ) +-- ) port map ( - Clock => Clock, - Reset => Reset, - - SendRequest => FSMCache_BCReq_SendRequest, - Complete => BCReq_Complete, - Address_rst => BCReq_Address_rst, - SenderMACAddress_nxt => BCReq_SenderMACAddress_nxt, - SenderMACAddress_Data => FSMCache_BCReq_SenderMACAddress_Data, -- self - SenderIPv4Address_nxt => BCReq_SenderIPv4Address_nxt, - SenderIPv4Address_Data => FSMCache_BCReq_SenderIPv4Address_Data, -- self - TargetMACAddress_nxt => BCReq_TargetMACAddress_nxt, - TargetMACAddress_Data => FSMCache_BCReq_TargetMACAddress_Data, -- broadcast + request for mac-to-ip mapping - TargetIPv4Address_nxt => BCReq_TargetIPv4Address_nxt, - TargetIPv4Address_Data => FSMCache_BCReq_TargetIPv4Address_Data, -- broadcast + request for mac-to-ip mapping - - TX_Valid => BCReq_TX_Valid, - TX_Data => BCReq_TX_Data, - TX_SOF => BCReq_TX_SOF, - TX_EOF => BCReq_TX_EOF, - TX_Ack => BCReq_TX_Ack, - TX_Meta_DestMACAddress_rst => BCReq_TX_Meta_DestMACAddress_rst, - TX_Meta_DestMACAddress_nxt => BCReq_TX_Meta_DestMACAddress_nxt, - TX_Meta_DestMACAddress_Data => BCReq_TX_Meta_DestMACAddress_Data + Clock => Clock, + Reset => Reset, + + SendRequest => FSMCache_BCReq_SendRequest, + Complete => BCReq_Complete, + Address_rst => BCReq_Address_rst, + SenderMACAddress_nxt => BCReq_SenderMACAddress_nxt, + SenderMACAddress_Data => FSMCache_BCReq_SenderMACAddress_Data, -- self + SenderIPv4Address_nxt => BCReq_SenderIPv4Address_nxt, + SenderIPv4Address_Data => FSMCache_BCReq_SenderIPv4Address_Data, -- self + TargetMACAddress_nxt => BCReq_TargetMACAddress_nxt, + TargetMACAddress_Data => FSMCache_BCReq_TargetMACAddress_Data, -- broadcast + request for mac-to-ip mapping + TargetIPv4Address_nxt => BCReq_TargetIPv4Address_nxt, + TargetIPv4Address_Data => FSMCache_BCReq_TargetIPv4Address_Data, -- broadcast + request for mac-to-ip mapping + + TX_Valid => BCReq_TX_Valid, + TX_Data => BCReq_TX_Data, + TX_SOF => BCReq_TX_SOF, + TX_EOF => BCReq_TX_EOF, + TX_Ack => BCReq_TX_Ack, + TX_Meta_DestMACAddress_rst => BCReq_TX_Meta_DestMACAddress_rst, + TX_Meta_DestMACAddress_nxt => BCReq_TX_Meta_DestMACAddress_nxt, + TX_Meta_DestMACAddress_Data => BCReq_TX_Meta_DestMACAddress_Data ); blkStmMux : block - constant LLMUX_PORT_BCREQ : natural := 0; - constant LLMUX_PORT_UCRSP : natural := 1; - constant LLMUX_PORTS : positive := 2; + constant LLMUX_PORT_BCREQ : natural := 0; + constant LLMUX_PORT_UCRSP : natural := 1; + constant LLMUX_PORTS : positive := 2; - constant META_RST_BIT : natural := 0; - constant META_DEST_NXT_BIT : natural := 1; + constant META_RST_BIT : natural := 0; + constant META_DEST_NXT_BIT : natural := 1; - constant META_BITS : positive := 8; - constant META_REV_BITS : positive := 2; + constant META_BITS : positive := 8; + constant META_REV_BITS : positive := 2; - signal Temp_Meta : T_SLVV_48(LLMUX_PORTS - 1 downto 0); - signal Temp_Meta2 : T_SLV_48; + signal Temp_Meta : T_SLVV_48(LLMUX_PORTS - 1 downto 0); + signal Temp_Meta2 : T_SLV_48; - signal StmMux_In_Valid : std_logic_vector(LLMUX_PORTS - 1 downto 0); - signal StmMux_In_Data : T_SLM(LLMUX_PORTS - 1 downto 0, T_SLV_8'range) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmMux_In_Meta : T_SLM(LLMUX_PORTS - 1 downto 0, META_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmMux_In_Meta_rev : T_SLM(LLMUX_PORTS - 1 downto 0, META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmMux_In_SOF : std_logic_vector(LLMUX_PORTS - 1 downto 0); - signal StmMux_In_EOF : std_logic_vector(LLMUX_PORTS - 1 downto 0); - signal StmMux_In_Ack : std_logic_vector(LLMUX_PORTS - 1 downto 0); + signal StmMux_In_Valid : std_logic_vector(LLMUX_PORTS - 1 downto 0); + signal StmMux_In_Data : T_SLM(LLMUX_PORTS - 1 downto 0, T_SLV_8'range) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal StmMux_In_Meta : T_SLM(LLMUX_PORTS - 1 downto 0, META_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal StmMux_In_Meta_rev : T_SLM(LLMUX_PORTS - 1 downto 0, META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal StmMux_In_SOF : std_logic_vector(LLMUX_PORTS - 1 downto 0); + signal StmMux_In_EOF : std_logic_vector(LLMUX_PORTS - 1 downto 0); + signal StmMux_In_Ack : std_logic_vector(LLMUX_PORTS - 1 downto 0); - signal StmMux_Out_Meta : std_logic_vector(META_BITS - 1 downto 0); - signal StmMux_Out_Meta_rev : std_logic_vector(META_REV_BITS - 1 downto 0); + signal StmMux_Out_Meta : std_logic_vector(META_BITS - 1 downto 0); + signal StmMux_Out_Meta_rev : std_logic_vector(META_REV_BITS - 1 downto 0); begin -- StmMux Port 0 - broadcast requester - StmMux_In_Valid(LLMUX_PORT_BCREQ) <= BCReq_TX_Valid; - assign_row(StmMux_In_Data, BCReq_TX_Data, LLMUX_PORT_BCREQ); - StmMux_In_SOF(LLMUX_PORT_BCREQ) <= BCReq_TX_SOF; - StmMux_In_EOF(LLMUX_PORT_BCREQ) <= BCReq_TX_EOF; - BCReq_TX_Ack <= StmMux_In_Ack (LLMUX_PORT_BCREQ); + StmMux_In_Valid(LLMUX_PORT_BCREQ) <= BCReq_TX_Valid; + assign_row(StmMux_In_Data, BCReq_TX_Data, LLMUX_PORT_BCREQ); + StmMux_In_SOF(LLMUX_PORT_BCREQ) <= BCReq_TX_SOF; + StmMux_In_EOF(LLMUX_PORT_BCREQ) <= BCReq_TX_EOF; + BCReq_TX_Ack <= StmMux_In_Ack (LLMUX_PORT_BCREQ); assign_row(StmMux_In_Meta, BCReq_TX_Meta_DestMACAddress_Data, LLMUX_PORT_BCREQ); - BCReq_TX_Meta_DestMACAddress_rst <= StmMux_In_Meta_rev(LLMUX_PORT_BCREQ, META_RST_BIT); - BCReq_TX_Meta_DestMACAddress_nxt <= StmMux_In_Meta_rev(LLMUX_PORT_BCREQ, META_DEST_NXT_BIT); + BCReq_TX_Meta_DestMACAddress_rst <= StmMux_In_Meta_rev(LLMUX_PORT_BCREQ, META_RST_BIT); + BCReq_TX_Meta_DestMACAddress_nxt <= StmMux_In_Meta_rev(LLMUX_PORT_BCREQ, META_DEST_NXT_BIT); -- StmMux Port 1 - unicast responder - StmMux_In_Valid(LLMUX_PORT_UCRSP) <= UCRsp_TX_Valid; - assign_row(StmMux_In_Data, UCRsp_TX_Data, LLMUX_PORT_UCRSP); - StmMux_In_SOF(LLMUX_PORT_UCRSP) <= UCRsp_TX_SOF; - StmMux_In_EOF(LLMUX_PORT_UCRSP) <= UCRsp_TX_EOF; - UCRsp_TX_Ack <= StmMux_In_Ack (LLMUX_PORT_UCRSP); - UCRsp_TX_Meta_DestMACAddress_rst <= StmMux_In_Meta_rev(LLMUX_PORT_UCRSP, META_RST_BIT); - UCRsp_TX_Meta_DestMACAddress_nxt <= StmMux_In_Meta_rev(LLMUX_PORT_UCRSP, META_DEST_NXT_BIT); + StmMux_In_Valid(LLMUX_PORT_UCRSP) <= UCRsp_TX_Valid; + assign_row(StmMux_In_Data, UCRsp_TX_Data, LLMUX_PORT_UCRSP); + StmMux_In_SOF(LLMUX_PORT_UCRSP) <= UCRsp_TX_SOF; + StmMux_In_EOF(LLMUX_PORT_UCRSP) <= UCRsp_TX_EOF; + UCRsp_TX_Ack <= StmMux_In_Ack (LLMUX_PORT_UCRSP); + UCRsp_TX_Meta_DestMACAddress_rst <= StmMux_In_Meta_rev(LLMUX_PORT_UCRSP, META_RST_BIT); + UCRsp_TX_Meta_DestMACAddress_nxt <= StmMux_In_Meta_rev(LLMUX_PORT_UCRSP, META_DEST_NXT_BIT); assign_row(StmMux_In_Meta, UCRsp_TX_Meta_DestMACAddress_Data, LLMUX_PORT_UCRSP); StmMux: entity work.stream_Mux generic map ( - PORTS => LLMUX_PORTS, - DATA_BITS => Eth_UC_TX_Data'length, - META_BITS => META_BITS, - META_REV_BITS => META_REV_BITS + PORTS => LLMUX_PORTS, + DATA_BITS => Eth_UC_TX_Data'length, + META_BITS => META_BITS, + META_REV_BITS => META_REV_BITS ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => StmMux_In_Valid, - In_Data => StmMux_In_Data, - In_Meta => StmMux_In_Meta, - In_Meta_rev => StmMux_In_Meta_rev, - In_SOF => StmMux_In_SOF, - In_EOF => StmMux_In_EOF, - In_Ack => StmMux_In_Ack, - - Out_Valid => Eth_UC_TX_Valid, - Out_Data => Eth_UC_TX_Data, - Out_Meta => StmMux_Out_Meta, - Out_Meta_rev => StmMux_Out_Meta_rev, - Out_SOF => Eth_UC_TX_SOF, - Out_EOF => Eth_UC_TX_EOF, - Out_Ack => Eth_UC_TX_Ack + Clock => Clock, + Reset => Reset, + + In_Valid => StmMux_In_Valid, + In_Data => StmMux_In_Data, + In_Meta => StmMux_In_Meta, + In_Meta_rev => StmMux_In_Meta_rev, + In_SOF => StmMux_In_SOF, + In_EOF => StmMux_In_EOF, + In_Ack => StmMux_In_Ack, + + Out_Valid => Eth_UC_TX_Valid, + Out_Data => Eth_UC_TX_Data, + Out_Meta => StmMux_Out_Meta, + Out_Meta_rev => StmMux_Out_Meta_rev, + Out_SOF => Eth_UC_TX_SOF, + Out_EOF => Eth_UC_TX_EOF, + Out_Ack => Eth_UC_TX_Ack ); - StmMux_Out_Meta_rev(META_RST_BIT) <= Eth_UC_TX_Meta_rst; - StmMux_Out_Meta_rev(META_DEST_NXT_BIT) <= Eth_UC_TX_Meta_DestMACAddress_nxt; - Eth_UC_TX_Meta_DestMACAddress_Data <= StmMux_Out_Meta(Eth_UC_TX_Meta_DestMACAddress_Data'range); + StmMux_Out_Meta_rev(META_RST_BIT) <= Eth_UC_TX_Meta_rst; + StmMux_Out_Meta_rev(META_DEST_NXT_BIT) <= Eth_UC_TX_Meta_DestMACAddress_nxt; + Eth_UC_TX_Meta_DestMACAddress_Data <= StmMux_Out_Meta(Eth_UC_TX_Meta_DestMACAddress_Data'range); end block; end architecture; diff --git a/src/net/arp/arp.pro b/src/net/arp/build.pro similarity index 100% rename from src/net/arp/arp.pro rename to src/net/arp/build.pro diff --git a/src/net/net.pro b/src/net/build.pro similarity index 86% rename from src/net/net.pro rename to src/net/build.pro index 4a103dcf5..d8cc7757e 100644 --- a/src/net/net.pro +++ b/src/net/build.pro @@ -22,9 +22,9 @@ analyze ./net.pkg.vhdl analyze ./net_FrameChecksum.vhdl -include ./arp/arp.pro -include ./icmpv4/icmpv4.pro -include ./ipv4/ipv4.pro -include ./ipv6/ipv6.pro -include ./mac/mac.pro -include ./udp/udp.pro +include ./arp +include ./icmpv4 +include ./ipv4 +include ./ipv6 +include ./mac +include ./udp diff --git a/src/net/icmpv4/icmpv4.pro b/src/net/icmpv4/build.pro similarity index 100% rename from src/net/icmpv4/icmpv4.pro rename to src/net/icmpv4/build.pro diff --git a/src/net/icmpv4/icmpv4_RX.vhdl b/src/net/icmpv4/icmpv4_RX.vhdl index b7928c16e..bc70a0947 100644 --- a/src/net/icmpv4/icmpv4_RX.vhdl +++ b/src/net/icmpv4/icmpv4_RX.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,57 +37,57 @@ use work.net.all; entity icmpv4_RX is generic ( - DEBUG : boolean := FALSE + DEBUG : boolean := FALSE ); port ( - Clock : in std_logic; -- - Reset : in std_logic; -- + Clock : in std_logic; -- + Reset : in std_logic; -- -- CSE interface - Command : in T_NET_ICMPV4_RX_COMMAND; - Status : out T_NET_ICMPV4_RX_STATUS; - Error : out T_NET_ICMPV4_RX_ERROR; + Command : in T_NET_ICMPV4_RX_COMMAND; + Status : out T_NET_ICMPV4_RX_STATUS; + Error : out T_NET_ICMPV4_RX_ERROR; -- IN port - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - In_Meta_rst : out std_logic; - In_Meta_SrcMACAddress_nxt : out std_logic; - In_Meta_SrcMACAddress_Data : in T_SLV_8; - In_Meta_DestMACAddress_nxt : out std_logic; - In_Meta_DestMACAddress_Data : in T_SLV_8; - In_Meta_SrcIPv4Address_nxt : out std_logic; - In_Meta_SrcIPv4Address_Data : in T_SLV_8; - In_Meta_DestIPv4Address_nxt : out std_logic; - In_Meta_DestIPv4Address_Data : in T_SLV_8; - In_Meta_Length : in T_SLV_16; + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + In_Meta_rst : out std_logic; + In_Meta_SrcMACAddress_nxt : out std_logic; + In_Meta_SrcMACAddress_Data : in T_SLV_8; + In_Meta_DestMACAddress_nxt : out std_logic; + In_Meta_DestMACAddress_Data : in T_SLV_8; + In_Meta_SrcIPv4Address_nxt : out std_logic; + In_Meta_SrcIPv4Address_Data : in T_SLV_8; + In_Meta_DestIPv4Address_nxt : out std_logic; + In_Meta_DestIPv4Address_Data : in T_SLV_8; + In_Meta_Length : in T_SLV_16; -- OUT Port - Out_Meta_rst : in std_logic; - Out_Meta_SrcMACAddress_nxt : in std_logic; - Out_Meta_SrcMACAddress_Data : out T_SLV_8; - Out_Meta_DestMACAddress_nxt : in std_logic; - Out_Meta_DestMACAddress_Data : out T_SLV_8; - Out_Meta_SrcIPv4Address_nxt : in std_logic; - Out_Meta_SrcIPv4Address_Data : out T_SLV_8; - Out_Meta_DestIPv4Address_nxt : in std_logic; - Out_Meta_DestIPv4Address_Data : out T_SLV_8; - Out_Meta_Length : out T_SLV_16; - Out_Meta_Type : out T_SLV_8; - Out_Meta_Code : out T_SLV_8; - Out_Meta_Identification : out T_SLV_16; - Out_Meta_SequenceNumber : out T_SLV_16; - Out_Meta_Payload_nxt : in std_logic; - Out_Meta_Payload_last : out std_logic; - Out_Meta_Payload_Data : out T_SLV_8 + Out_Meta_rst : in std_logic; + Out_Meta_SrcMACAddress_nxt : in std_logic; + Out_Meta_SrcMACAddress_Data : out T_SLV_8; + Out_Meta_DestMACAddress_nxt : in std_logic; + Out_Meta_DestMACAddress_Data : out T_SLV_8; + Out_Meta_SrcIPv4Address_nxt : in std_logic; + Out_Meta_SrcIPv4Address_Data : out T_SLV_8; + Out_Meta_DestIPv4Address_nxt : in std_logic; + Out_Meta_DestIPv4Address_Data : out T_SLV_8; + Out_Meta_Length : out T_SLV_16; + Out_Meta_Type : out T_SLV_8; + Out_Meta_Code : out T_SLV_8; + Out_Meta_Identification : out T_SLV_16; + Out_Meta_SequenceNumber : out T_SLV_16; + Out_Meta_Payload_nxt : in std_logic; + Out_Meta_Payload_last : out std_logic; + Out_Meta_Payload_Data : out T_SLV_8 ); end entity; architecture rtl of icmpv4_RX is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; - type T_STATE is ( + type T_STATE is ( ST_IDLE, ST_RECEIVE_ECHO_CODE, ST_RECEIVE_ECHO_CHECKSUM_0, @@ -102,36 +102,36 @@ architecture rtl of icmpv4_RX is ST_ERROR ); - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); - signal Register_rst : std_logic; + signal Register_rst : std_logic; -- UDP header fields - signal Type_en : std_logic; - signal Code_en : std_logic; - signal Checksum_en0 : std_logic; - signal Checksum_en1 : std_logic; - signal Identification_en0 : std_logic; - signal Identification_en1 : std_logic; - signal SequenceNumber_en0 : std_logic; - signal SequenceNumber_en1 : std_logic; - - signal Type_d : T_SLV_8 := (others => '0'); - signal Code_d : T_SLV_8 := (others => '0'); - signal Checksum_d : T_SLV_16 := (others => '0'); - signal Identification_d : T_SLV_16 := (others => '0'); - signal SequenceNumber_d : T_SLV_16 := (others => '0'); - - signal MetaFIFO_put : std_logic; - signal MetaFIFO_DataIn : std_logic_vector(8 downto 0); - signal MetaFIFO_Full : std_logic; - signal MetaFIFO_Commit : std_logic; - signal MetaFIFO_Rollback : std_logic; --- signal MetaFIFO_Valid : STD_LOGIC; - signal MetaFIFO_DataOut : std_logic_vector(8 downto 0); - signal MetaFIFO_got : std_logic; + signal Type_en : std_logic; + signal Code_en : std_logic; + signal Checksum_en0 : std_logic; + signal Checksum_en1 : std_logic; + signal Identification_en0 : std_logic; + signal Identification_en1 : std_logic; + signal SequenceNumber_en0 : std_logic; + signal SequenceNumber_en1 : std_logic; + + signal Type_d : T_SLV_8 := (others => '0'); + signal Code_d : T_SLV_8 := (others => '0'); + signal Checksum_d : T_SLV_16 := (others => '0'); + signal Identification_d : T_SLV_16 := (others => '0'); + signal SequenceNumber_d : T_SLV_16 := (others => '0'); + + signal MetaFIFO_put : std_logic; + signal MetaFIFO_DataIn : std_logic_vector(8 downto 0); + signal MetaFIFO_Full : std_logic; + signal MetaFIFO_Commit : std_logic; + signal MetaFIFO_Rollback : std_logic; +-- signal MetaFIFO_Valid : STD_LOGIC; + signal MetaFIFO_DataOut : std_logic_vector(8 downto 0); + signal MetaFIFO_got : std_logic; begin @@ -139,214 +139,214 @@ begin begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; process(State, Command, In_Valid, In_Data, In_SOF, In_EOF, Out_Meta_rst, Out_Meta_Payload_nxt) begin - NextState <= State; - - Status <= NET_ICMPV4_RX_STATUS_IDLE; - Error <= NET_ICMPV4_RX_ERROR_NONE; - - In_Ack <= '0'; - In_Meta_rst <= '0'; - In_Meta_SrcMACAddress_nxt <= '0'; - In_Meta_DestMACAddress_nxt <= '0'; - In_Meta_SrcIPv4Address_nxt <= '0'; - In_Meta_DestIPv4Address_nxt <= '0'; - - Register_rst <= to_sl(Command = NET_ICMPV4_RX_CMD_CLEAR); - Type_en <= '0'; - Code_en <= '0'; - Checksum_en0 <= '0'; - Checksum_en1 <= '0'; - Identification_en0 <= '0'; - Identification_en1 <= '0'; - SequenceNumber_en0 <= '0'; - SequenceNumber_en1 <= '0'; - - MetaFIFO_put <= '0'; - MetaFIFO_DataIn(In_Data'range) <= In_Data; - MetaFIFO_DataIn(In_Data'length) <= In_EOF; - MetaFIFO_got <= '0'; - MetaFIFO_Commit <= '0'; - MetaFIFO_Rollback <= '0'; + NextState <= State; + + Status <= NET_ICMPV4_RX_STATUS_IDLE; + Error <= NET_ICMPV4_RX_ERROR_NONE; + + In_Ack <= '0'; + In_Meta_rst <= '0'; + In_Meta_SrcMACAddress_nxt <= '0'; + In_Meta_DestMACAddress_nxt <= '0'; + In_Meta_SrcIPv4Address_nxt <= '0'; + In_Meta_DestIPv4Address_nxt <= '0'; + + Register_rst <= to_sl(Command = NET_ICMPV4_RX_CMD_CLEAR); + Type_en <= '0'; + Code_en <= '0'; + Checksum_en0 <= '0'; + Checksum_en1 <= '0'; + Identification_en0 <= '0'; + Identification_en1 <= '0'; + SequenceNumber_en0 <= '0'; + SequenceNumber_en1 <= '0'; + + MetaFIFO_put <= '0'; + MetaFIFO_DataIn(In_Data'range) <= In_Data; + MetaFIFO_DataIn(In_Data'length) <= In_EOF; + MetaFIFO_got <= '0'; + MetaFIFO_Commit <= '0'; + MetaFIFO_Rollback <= '0'; case State is when ST_IDLE => if ((In_Valid and In_SOF) = '1') then - In_Ack <= '1'; + In_Ack <= '1'; if (In_EOF = '0') then - Type_en <= '1'; + Type_en <= '1'; if (In_Data = C_NET_ICMPV4_TYPE_ECHO_REPLY) then - NextState <= ST_RECEIVE_ECHO_CODE; + NextState <= ST_RECEIVE_ECHO_CODE; elsif (In_Data = C_NET_ICMPV4_TYPE_ECHO_REQUEST) then - NextState <= ST_RECEIVE_ECHO_CODE; + NextState <= ST_RECEIVE_ECHO_CODE; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_ECHO_CODE => - Status <= NET_ICMPV4_RX_STATUS_RECEIVING; + Status <= NET_ICMPV4_RX_STATUS_RECEIVING; if (In_Valid = '1') then - In_Ack <= '1'; + In_Ack <= '1'; if (In_EOF = '0') then - Code_en <= '1'; + Code_en <= '1'; if (In_Data = C_NET_ICMPV4_CODE_ECHO_REPLY) then - NextState <= ST_RECEIVE_ECHO_CHECKSUM_0; + NextState <= ST_RECEIVE_ECHO_CHECKSUM_0; elsif (In_Data = C_NET_ICMPV4_CODE_ECHO_REQUEST) then - NextState <= ST_RECEIVE_ECHO_CHECKSUM_0; + NextState <= ST_RECEIVE_ECHO_CHECKSUM_0; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_ECHO_CHECKSUM_0 => - Status <= NET_ICMPV4_RX_STATUS_RECEIVING; + Status <= NET_ICMPV4_RX_STATUS_RECEIVING; if (In_Valid = '1') then - In_Ack <= '1'; + In_Ack <= '1'; if (In_EOF = '0') then - Checksum_en0 <= '1'; - NextState <= ST_RECEIVE_ECHO_CHECKSUM_1; + Checksum_en0 <= '1'; + NextState <= ST_RECEIVE_ECHO_CHECKSUM_1; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_ECHO_CHECKSUM_1 => - Status <= NET_ICMPV4_RX_STATUS_RECEIVING; + Status <= NET_ICMPV4_RX_STATUS_RECEIVING; if (In_Valid = '1') then - In_Ack <= '1'; + In_Ack <= '1'; if (In_EOF = '0') then - Checksum_en1 <= '1'; - NextState <= ST_RECEIVE_ECHO_IDENTIFIER_0; + Checksum_en1 <= '1'; + NextState <= ST_RECEIVE_ECHO_IDENTIFIER_0; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_ECHO_IDENTIFIER_0 => - Status <= NET_ICMPV4_RX_STATUS_RECEIVING; + Status <= NET_ICMPV4_RX_STATUS_RECEIVING; if (In_Valid = '1') then - In_Ack <= '1'; + In_Ack <= '1'; if (In_EOF = '0') then - Identification_en0 <= '1'; - NextState <= ST_RECEIVE_ECHO_IDENTIFIER_1; + Identification_en0 <= '1'; + NextState <= ST_RECEIVE_ECHO_IDENTIFIER_1; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_ECHO_IDENTIFIER_1 => - Status <= NET_ICMPV4_RX_STATUS_RECEIVING; + Status <= NET_ICMPV4_RX_STATUS_RECEIVING; if (In_Valid = '1') then - In_Ack <= '1'; + In_Ack <= '1'; if (In_EOF = '0') then - Identification_en1 <= '1'; - NextState <= ST_RECEIVE_ECHO_SEQ_NUMBER_0; + Identification_en1 <= '1'; + NextState <= ST_RECEIVE_ECHO_SEQ_NUMBER_0; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_ECHO_SEQ_NUMBER_0 => - Status <= NET_ICMPV4_RX_STATUS_RECEIVING; + Status <= NET_ICMPV4_RX_STATUS_RECEIVING; if (In_Valid = '1') then - In_Ack <= '1'; + In_Ack <= '1'; if (In_EOF = '0') then - SequenceNumber_en0 <= '1'; - NextState <= ST_RECEIVE_ECHO_SEQ_NUMBER_1; + SequenceNumber_en0 <= '1'; + NextState <= ST_RECEIVE_ECHO_SEQ_NUMBER_1; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_ECHO_SEQ_NUMBER_1 => - Status <= NET_ICMPV4_RX_STATUS_RECEIVING; + Status <= NET_ICMPV4_RX_STATUS_RECEIVING; if (In_Valid = '1') then - In_Ack <= '1'; + In_Ack <= '1'; if (In_EOF = '0') then - SequenceNumber_en1 <= '1'; - NextState <= ST_RECEIVE_ECHO_DATA; + SequenceNumber_en1 <= '1'; + NextState <= ST_RECEIVE_ECHO_DATA; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_ECHO_DATA => - Status <= NET_ICMPV4_RX_STATUS_RECEIVING; + Status <= NET_ICMPV4_RX_STATUS_RECEIVING; if (In_Valid = '1') then - In_Ack <= '1'; + In_Ack <= '1'; - MetaFIFO_put <= '1'; + MetaFIFO_put <= '1'; if (In_EOF = '1') then - MetaFIFO_Commit <= '1'; - NextState <= ST_RECEIVE_ECHO_COMPLETE; + MetaFIFO_Commit <= '1'; + NextState <= ST_RECEIVE_ECHO_COMPLETE; end if; end if; when ST_RECEIVE_ECHO_COMPLETE => if (Code_d = C_NET_ICMPV4_TYPE_ECHO_REPLY) then - Status <= NET_ICMPV4_RX_STATUS_RECEIVED_ECHO_REPLY; + Status <= NET_ICMPV4_RX_STATUS_RECEIVED_ECHO_REPLY; elsif (Code_d = C_NET_ICMPV4_TYPE_ECHO_REQUEST) then - Status <= NET_ICMPV4_RX_STATUS_RECEIVED_ECHO_REQUEST; + Status <= NET_ICMPV4_RX_STATUS_RECEIVED_ECHO_REQUEST; end if; - In_Meta_SrcMACAddress_nxt <= Out_Meta_SrcMACAddress_nxt; - In_Meta_DestMACAddress_nxt <= Out_Meta_DestMACAddress_nxt; - In_Meta_SrcIPv4Address_nxt <= Out_Meta_SrcIPv4Address_nxt; - In_Meta_DestIPv4Address_nxt <= Out_Meta_DestIPv4Address_nxt; + In_Meta_SrcMACAddress_nxt <= Out_Meta_SrcMACAddress_nxt; + In_Meta_DestMACAddress_nxt <= Out_Meta_DestMACAddress_nxt; + In_Meta_SrcIPv4Address_nxt <= Out_Meta_SrcIPv4Address_nxt; + In_Meta_DestIPv4Address_nxt <= Out_Meta_DestIPv4Address_nxt; - MetaFIFO_got <= Out_Meta_Payload_nxt; - MetaFIFO_Rollback <= Out_Meta_rst; + MetaFIFO_got <= Out_Meta_Payload_nxt; + MetaFIFO_Rollback <= Out_Meta_rst; if (Command = NET_ICMPV4_RX_CMD_CLEAR) then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; when ST_DISCARD_FRAME => - In_Ack <= '1'; + In_Ack <= '1'; if ((In_Valid and In_EOF) = '1') then - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; when ST_ERROR => - Status <= NET_ICMPV4_RX_STATUS_ERROR; - Error <= NET_ICMPV4_RX_ERROR_FSM; + Status <= NET_ICMPV4_RX_STATUS_ERROR; + Error <= NET_ICMPV4_RX_ERROR_FSM; - NextState <= ST_IDLE; + NextState <= ST_IDLE; end case; end process; @@ -355,38 +355,38 @@ begin begin if rising_edge(Clock) then if ((Reset or Register_rst) = '1') then - Type_d <= (others => '0'); - Code_d <= (others => '0'); - Checksum_d <= (others => '0'); - Identification_d <= (others => '0'); - SequenceNumber_d <= (others => '0'); + Type_d <= (others => '0'); + Code_d <= (others => '0'); + Checksum_d <= (others => '0'); + Identification_d <= (others => '0'); + SequenceNumber_d <= (others => '0'); else if (Type_en = '1') then - Type_d <= In_Data; + Type_d <= In_Data; end if; if (Code_en = '1') then - Code_d <= In_Data; + Code_d <= In_Data; end if; if (Checksum_en0 = '1') then - Checksum_d(7 downto 0) <= In_Data; + Checksum_d(7 downto 0) <= In_Data; end if; if (Checksum_en1 = '1') then - Checksum_d(15 downto 8) <= In_Data; + Checksum_d(15 downto 8) <= In_Data; end if; if (Identification_en0 = '1') then - Identification_d(7 downto 0) <= In_Data; + Identification_d(7 downto 0) <= In_Data; end if; if (Identification_en1 = '1') then - Identification_d(15 downto 8) <= In_Data; + Identification_d(15 downto 8) <= In_Data; end if; if (SequenceNumber_en1 = '1') then - SequenceNumber_d(7 downto 0) <= In_Data; + SequenceNumber_d(7 downto 0) <= In_Data; end if; if (SequenceNumber_en1 = '1') then - SequenceNumber_d(15 downto 8) <= In_Data; + SequenceNumber_d(15 downto 8) <= In_Data; end if; end if; end if; @@ -396,44 +396,44 @@ begin PayloadFIFO: entity work.fifo_cc_got_tempgot generic map ( - D_BITS => MetaFIFO_DataIn'length, -- Data Width - MIN_DEPTH => 64, -- Minimum FIFO Depth - DATA_REG => TRUE, -- Store Data Content in Registers - STATE_REG => FALSE, -- Registered Full/Empty Indicators - OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + DATA_BITS => MetaFIFO_DataIn'length, -- Data Width + MIN_DEPTH => 64, -- Minimum FIFO Depth + DATA_REG => TRUE, -- Store Data Content in Registers + STATE_REG => FALSE, -- Registered Full/Empty Indicators + OUTPUT_REG => FALSE, -- Registered FIFO Output + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) port map ( -- Global Reset and Clock - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Writing Interface - put => MetaFIFO_put, - din => MetaFIFO_DataIn, - full => MetaFIFO_Full, - estate_wr => open, + Put => MetaFIFO_put, + DataIn => MetaFIFO_DataIn, + Full => MetaFIFO_Full, + EmptyState => open, -- Reading Interface - got => MetaFIFO_got, - dout => MetaFIFO_DataOut, - valid => open, --MetaFIFO_Valid, - fstate_rd => open, + Got => MetaFIFO_got, + DataOut => MetaFIFO_DataOut, + Valid => open, --MetaFIFO_Valid, + FillState => open, - commit => MetaFIFO_Commit, - rollback => MetaFIFO_Rollback + Commit => MetaFIFO_Commit, + Rollback => MetaFIFO_Rollback ); - Out_Meta_SrcMACAddress_Data <= In_Meta_SrcMACAddress_Data; - Out_Meta_DestMACAddress_Data <= In_Meta_DestMACAddress_Data; - Out_Meta_SrcIPv4Address_Data <= In_Meta_SrcIPv4Address_Data; - Out_Meta_DestIPv4Address_Data <= In_Meta_DestIPv4Address_Data; - Out_Meta_Length <= In_Meta_Length; - Out_Meta_Type <= Type_d; - Out_Meta_Code <= Code_d; - Out_Meta_Identification <= Identification_d; - Out_Meta_SequenceNumber <= SequenceNumber_d; - Out_Meta_Payload_last <= MetaFIFO_DataOut(Out_Meta_Payload_Data'length); - Out_Meta_Payload_Data <= MetaFIFO_DataOut(Out_Meta_Payload_Data'range); + Out_Meta_SrcMACAddress_Data <= In_Meta_SrcMACAddress_Data; + Out_Meta_DestMACAddress_Data <= In_Meta_DestMACAddress_Data; + Out_Meta_SrcIPv4Address_Data <= In_Meta_SrcIPv4Address_Data; + Out_Meta_DestIPv4Address_Data <= In_Meta_DestIPv4Address_Data; + Out_Meta_Length <= In_Meta_Length; + Out_Meta_Type <= Type_d; + Out_Meta_Code <= Code_d; + Out_Meta_Identification <= Identification_d; + Out_Meta_SequenceNumber <= SequenceNumber_d; + Out_Meta_Payload_last <= MetaFIFO_DataOut(Out_Meta_Payload_Data'length); + Out_Meta_Payload_Data <= MetaFIFO_DataOut(Out_Meta_Payload_Data'range); end architecture; diff --git a/src/net/icmpv4/icmpv4_TX.vhdl b/src/net/icmpv4/icmpv4_TX.vhdl index c19bd253c..af9c598e8 100644 --- a/src/net/icmpv4/icmpv4_TX.vhdl +++ b/src/net/icmpv4/icmpv4_TX.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,47 +37,47 @@ use work.net.all; entity icmpv4_TX is generic ( - DEBUG : boolean := FALSE; - SOURCE_IPV4ADDRESS : T_NET_IPV4_ADDRESS := C_NET_IPV4_ADDRESS_EMPTY + DEBUG : boolean := FALSE; + SOURCE_IPV4ADDRESS : T_NET_IPV4_ADDRESS := C_NET_IPV4_ADDRESS_EMPTY ); port ( - Clock : in std_logic; -- - Reset : in std_logic; -- + Clock : in std_logic; -- + Reset : in std_logic; -- -- CSE interface - Command : in T_NET_ICMPV4_TX_COMMAND; - Status : out T_NET_ICMPV4_TX_STATUS; - Error : out T_NET_ICMPV4_TX_ERROR; + Command : in T_NET_ICMPV4_TX_COMMAND; + Status : out T_NET_ICMPV4_TX_STATUS; + Error : out T_NET_ICMPV4_TX_ERROR; -- OUT port - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic; - Out_Meta_rst : in std_logic; - Out_Meta_SrcIPv4Address_nxt : in std_logic; - Out_Meta_SrcIPv4Address_Data : out T_SLV_8; - Out_Meta_DestIPv4Address_nxt : in std_logic; - Out_Meta_DestIPv4Address_Data : out T_SLV_8; - Out_Meta_Length : out T_SLV_16; + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic; + Out_Meta_rst : in std_logic; + Out_Meta_SrcIPv4Address_nxt : in std_logic; + Out_Meta_SrcIPv4Address_Data : out T_SLV_8; + Out_Meta_DestIPv4Address_nxt : in std_logic; + Out_Meta_DestIPv4Address_Data : out T_SLV_8; + Out_Meta_Length : out T_SLV_16; -- IN port - In_Meta_rst : out std_logic; - In_Meta_IPv4Address_nxt : out std_logic; - In_Meta_IPv4Address_Data : in T_SLV_8; - In_Meta_Type : in T_SLV_8; - In_Meta_Code : in T_SLV_8; - In_Meta_Identification : in T_SLV_16; - In_Meta_SequenceNumber : in T_SLV_16; - In_Meta_Payload_nxt : out std_logic; - In_Meta_Payload_last : in std_logic; - In_Meta_Payload_Data : in T_SLV_8 + In_Meta_rst : out std_logic; + In_Meta_IPv4Address_nxt : out std_logic; + In_Meta_IPv4Address_Data : in T_SLV_8; + In_Meta_Type : in T_SLV_8; + In_Meta_Code : in T_SLV_8; + In_Meta_Identification : in T_SLV_16; + In_Meta_SequenceNumber : in T_SLV_16; + In_Meta_Payload_nxt : out std_logic; + In_Meta_Payload_last : in std_logic; + In_Meta_Payload_Data : in T_SLV_8 ); end entity; architecture rtl of icmpv4_TX is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; - type T_STATE is ( + type T_STATE is ( ST_IDLE, ST_SEND_ECHO_type, ST_SEND_ECHO_CODE, @@ -92,19 +92,19 @@ architecture rtl of icmpv4_TX is ST_COMPLETE ); - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); - signal Checksum : T_SLV_16; + signal Checksum : T_SLV_16; - constant PAYLOAD : std_logic_vector(255 downto 0) := x"00010203" & x"04050607" & x"08090A0B" & x"0C0D0E0F" & x"10111213" & x"14151617" & x"18191A1B" & x"1C1D1E1F"; - constant PAYLOAD_ROM : T_SLVV_8 := to_slvv_8(PAYLOAD); + constant PAYLOAD : std_logic_vector(255 downto 0) := x"00010203" & x"04050607" & x"08090A0B" & x"0C0D0E0F" & x"10111213" & x"14151617" & x"18191A1B" & x"1C1D1E1F"; + constant PAYLOAD_ROM : T_SLVV_8 := to_slvv_8(PAYLOAD); - signal PayloadROM_Reader_nxt : std_logic; - signal PayloadROM_Reader_ov : std_logic; - signal PayloadROM_Reader_us : unsigned(log2ceilnz(PAYLOAD_ROM'length) - 1 downto 0) := (others => '0'); - signal PayloadROM_Data : T_SLV_8; + signal PayloadROM_Reader_nxt : std_logic; + signal PayloadROM_Reader_ov : std_logic; + signal PayloadROM_Reader_us : unsigned(log2ceilnz(PAYLOAD_ROM'length) - 1 downto 0) := (others => '0'); + signal PayloadROM_Data : T_SLV_8; begin @@ -112,27 +112,27 @@ begin begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; process(State, Command, Out_Ack, PayloadROM_Reader_ov, PayloadROM_Data) begin - NextState <= State; + NextState <= State; - Status <= NET_ICMPV4_TX_STATUS_IDLE; - Error <= NET_ICMPV4_TX_ERROR_NONE; + Status <= NET_ICMPV4_TX_STATUS_IDLE; + Error <= NET_ICMPV4_TX_ERROR_NONE; - Out_Valid <= '0'; - Out_Data <= (others => '0'); - Out_SOF <= '0'; - Out_EOF <= '0'; - Out_Meta_Length <= (others => '0'); + Out_Valid <= '0'; + Out_Data <= (others => '0'); + Out_SOF <= '0'; + Out_EOF <= '0'; + Out_Meta_Length <= (others => '0'); - PayloadROM_Reader_nxt <= '0'; + PayloadROM_Reader_nxt <= '0'; case State is when ST_IDLE => @@ -142,169 +142,169 @@ begin when NET_ICMPV4_TX_CMD_ECHO_REQUEST => -- TODO: check if Type equal to Command - NextState <= ST_SEND_ECHO_type; + NextState <= ST_SEND_ECHO_type; when NET_ICMPV4_TX_CMD_ECHO_REPLY => -- TODO: check if Type equal to Command - NextState <= ST_SEND_ECHO_type; + NextState <= ST_SEND_ECHO_type; end case; when ST_SEND_ECHO_type => - Status <= NET_ICMPV4_TX_STATUS_SENDING; + Status <= NET_ICMPV4_TX_STATUS_SENDING; - Out_Valid <= '1'; - Out_Data <= In_Meta_Type; - Out_SOF <= '1'; + Out_Valid <= '1'; + Out_Data <= In_Meta_Type; + Out_SOF <= '1'; - if (Out_Ack = '1') then - NextState <= ST_SEND_ECHO_CODE; + if (Out_Ack = '1') then + NextState <= ST_SEND_ECHO_CODE; end if; when ST_SEND_ECHO_CODE => - Status <= NET_ICMPV4_TX_STATUS_SENDING; + Status <= NET_ICMPV4_TX_STATUS_SENDING; - Out_Valid <= '1'; - Out_Data <= In_Meta_Code; + Out_Valid <= '1'; + Out_Data <= In_Meta_Code; - if (Out_Ack = '1') then - NextState <= ST_SEND_ECHOREQUEST_CHECKSUM_0; + if (Out_Ack = '1') then + NextState <= ST_SEND_ECHOREQUEST_CHECKSUM_0; end if; when ST_SEND_ECHOREQUEST_CHECKSUM_0 => - Status <= NET_ICMPV4_TX_STATUS_SENDING; + Status <= NET_ICMPV4_TX_STATUS_SENDING; - Out_Valid <= '1'; - Out_Data <= Checksum(15 downto 8); + Out_Valid <= '1'; + Out_Data <= Checksum(15 downto 8); - if (Out_Ack = '1') then - NextState <= ST_SEND_ECHOREQUEST_CHECKSUM_1; + if (Out_Ack = '1') then + NextState <= ST_SEND_ECHOREQUEST_CHECKSUM_1; end if; when ST_SEND_ECHOREQUEST_CHECKSUM_1 => - Status <= NET_ICMPV4_TX_STATUS_SENDING; + Status <= NET_ICMPV4_TX_STATUS_SENDING; - Out_Valid <= '1'; - Out_Data <= Checksum(7 downto 0); + Out_Valid <= '1'; + Out_Data <= Checksum(7 downto 0); - if (Out_Ack = '1') then - NextState <= ST_SEND_ECHOREQUEST_IDENTIFIER_0; + if (Out_Ack = '1') then + NextState <= ST_SEND_ECHOREQUEST_IDENTIFIER_0; end if; when ST_SEND_ECHOREQUEST_IDENTIFIER_0 => - Status <= NET_ICMPV4_TX_STATUS_SENDING; + Status <= NET_ICMPV4_TX_STATUS_SENDING; - Out_Valid <= '1'; - Out_Data <= In_Meta_Identification(15 downto 8); + Out_Valid <= '1'; + Out_Data <= In_Meta_Identification(15 downto 8); - if (Out_Ack = '1') then - NextState <= ST_SEND_ECHOREQUEST_IDENTIFIER_1; + if (Out_Ack = '1') then + NextState <= ST_SEND_ECHOREQUEST_IDENTIFIER_1; end if; when ST_SEND_ECHOREQUEST_IDENTIFIER_1 => - Status <= NET_ICMPV4_TX_STATUS_SENDING; + Status <= NET_ICMPV4_TX_STATUS_SENDING; - Out_Valid <= '1'; - Out_Data <= In_Meta_Identification(7 downto 0); + Out_Valid <= '1'; + Out_Data <= In_Meta_Identification(7 downto 0); - if (Out_Ack = '1') then - NextState <= ST_SEND_ECHOREQUEST_SEQUENCENUMBER_0; + if (Out_Ack = '1') then + NextState <= ST_SEND_ECHOREQUEST_SEQUENCENUMBER_0; end if; when ST_SEND_ECHOREQUEST_SEQUENCENUMBER_0 => - Status <= NET_ICMPV4_TX_STATUS_SENDING; + Status <= NET_ICMPV4_TX_STATUS_SENDING; - Out_Valid <= '1'; - Out_Data <= In_Meta_SequenceNumber(15 downto 8); + Out_Valid <= '1'; + Out_Data <= In_Meta_SequenceNumber(15 downto 8); - if (Out_Ack = '1') then - NextState <= ST_SEND_ECHOREQUEST_SEQUENCENUMBER_1; + if (Out_Ack = '1') then + NextState <= ST_SEND_ECHOREQUEST_SEQUENCENUMBER_1; end if; when ST_SEND_ECHOREQUEST_SEQUENCENUMBER_1 => - Status <= NET_ICMPV4_TX_STATUS_SENDING; + Status <= NET_ICMPV4_TX_STATUS_SENDING; - Out_Valid <= '1'; - Out_Data <= In_Meta_SequenceNumber(7 downto 0); + Out_Valid <= '1'; + Out_Data <= In_Meta_SequenceNumber(7 downto 0); - if (Out_Ack = '1') then - NextState <= ST_SEND_ECHOREQUEST_DATA; + if (Out_Ack = '1') then + NextState <= ST_SEND_ECHOREQUEST_DATA; end if; when ST_SEND_ECHOREQUEST_DATA => - Status <= NET_ICMPV4_TX_STATUS_SENDING; + Status <= NET_ICMPV4_TX_STATUS_SENDING; - Out_Valid <= '1'; - Out_Data <= PayloadROM_Data; + Out_Valid <= '1'; + Out_Data <= PayloadROM_Data; - PayloadROM_Reader_nxt <= '1'; + PayloadROM_Reader_nxt <= '1'; - if (Out_Ack = '1') then + if (Out_Ack = '1') then if (PayloadROM_Reader_ov = '1') then - Out_EOF <= '1'; - NextState <= ST_COMPLETE; + Out_EOF <= '1'; + NextState <= ST_COMPLETE; end if; end if; when ST_SEND_ECHOREPLY_DATA => - Status <= NET_ICMPV4_TX_STATUS_SENDING; + Status <= NET_ICMPV4_TX_STATUS_SENDING; - Out_Valid <= '1'; - Out_Data <= In_Meta_Payload_Data; + Out_Valid <= '1'; + Out_Data <= In_Meta_Payload_Data; - In_Meta_Payload_nxt <= '1'; + In_Meta_Payload_nxt <= '1'; - if (Out_Ack = '1') then + if (Out_Ack = '1') then if (In_Meta_Payload_last = '1') then - Out_EOF <= '1'; + Out_EOF <= '1'; - NextState <= ST_COMPLETE; + NextState <= ST_COMPLETE; end if; end if; when ST_COMPLETE => - Status <= NET_ICMPV4_TX_STATUS_SEND_COMPLETE; + Status <= NET_ICMPV4_TX_STATUS_SEND_COMPLETE; - NextState <= ST_IDLE; + NextState <= ST_IDLE; end case; end process; - Checksum <= x"0000"; + Checksum <= x"0000"; SourceIPv4Seq: entity work.misc_Sequencer generic map ( - INPUT_BITS => 32, - OUTPUT_BITS => 8, - REGISTERED => FALSE + INPUT_BITS => 32, + OUTPUT_BITS => 8, + REGISTERED => FALSE ) port map ( - Clock => Clock, - Reset => Reset, - - Input => to_slv(SOURCE_IPV4ADDRESS), - rst => Out_Meta_rst, - rev => '1', - nxt => Out_Meta_SrcIPv4Address_nxt, - Output => Out_Meta_SrcIPv4Address_Data + Clock => Clock, + Reset => Reset, + + Input => to_slv(SOURCE_IPV4ADDRESS), + rst => Out_Meta_rst, + rev => '1', + nxt => Out_Meta_SrcIPv4Address_nxt, + Output => Out_Meta_SrcIPv4Address_Data ); process(Clock) begin if rising_edge(Clock) then if (PayloadROM_Reader_nxt = '0') then - PayloadROM_Reader_us <= (others => '0'); + PayloadROM_Reader_us <= (others => '0'); else - PayloadROM_Reader_us <= PayloadROM_Reader_us + 1; + PayloadROM_Reader_us <= PayloadROM_Reader_us + 1; end if; end if; end process; - PayloadROM_Reader_ov <= to_sl(PayloadROM_Reader_us = (PAYLOAD_ROM'length - 1)); - PayloadROM_Data <= PAYLOAD_ROM(to_integer(PayloadROM_Reader_us)); + PayloadROM_Reader_ov <= to_sl(PayloadROM_Reader_us = (PAYLOAD_ROM'length - 1)); + PayloadROM_Data <= PAYLOAD_ROM(to_integer(PayloadROM_Reader_us)); - In_Meta_IPv4Address_nxt <= Out_Meta_DestIPv4Address_nxt; - Out_Meta_DestIPv4Address_Data <= In_Meta_IPv4Address_Data; + In_Meta_IPv4Address_nxt <= Out_Meta_DestIPv4Address_nxt; + Out_Meta_DestIPv4Address_Data <= In_Meta_IPv4Address_Data; end architecture; diff --git a/src/net/icmpv4/icmpv4_Wrapper.vhdl b/src/net/icmpv4/icmpv4_Wrapper.vhdl index cb88e8a1d..646e1063d 100644 --- a/src/net/icmpv4/icmpv4_Wrapper.vhdl +++ b/src/net/icmpv4/icmpv4_Wrapper.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,60 +37,60 @@ use work.net.all; entity icmpv4_Wrapper is generic ( - DEBUG : boolean := FALSE; - SOURCE_IPV4ADDRESS : T_NET_IPV4_ADDRESS := C_NET_IPV4_ADDRESS_EMPTY + DEBUG : boolean := FALSE; + SOURCE_IPV4ADDRESS : T_NET_IPV4_ADDRESS := C_NET_IPV4_ADDRESS_EMPTY ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- CSE interface - Command : in T_NET_ICMPV4_COMMAND; - Status : out T_NET_ICMPV4_STATUS; - Error : out T_NET_ICMPV4_ERROR; + Command : in T_NET_ICMPV4_COMMAND; + Status : out T_NET_ICMPV4_STATUS; + Error : out T_NET_ICMPV4_ERROR; -- Echo-Request destination address - IPv4Address_rst : out std_logic; - IPv4Address_nxt : out std_logic; - IPv4Address_Data : in T_SLV_8; + IPv4Address_rst : out std_logic; + IPv4Address_nxt : out std_logic; + IPv4Address_Data : in T_SLV_8; -- to IPv4 layer - IP_TX_Valid : out std_logic; - IP_TX_Data : out T_SLV_8; - IP_TX_SOF : out std_logic; - IP_TX_EOF : out std_logic; - IP_TX_Ack : in std_logic; - IP_TX_Meta_rst : in std_logic; - IP_TX_Meta_SrcIPv4Address_nxt : in std_logic; - IP_TX_Meta_SrcIPv4Address_Data : out T_SLV_8; - IP_TX_Meta_DestIPv4Address_nxt : in std_logic; - IP_TX_Meta_DestIPv4Address_Data : out T_SLV_8; - IP_TX_Meta_Length : out T_SLV_16; + IP_TX_Valid : out std_logic; + IP_TX_Data : out T_SLV_8; + IP_TX_SOF : out std_logic; + IP_TX_EOF : out std_logic; + IP_TX_Ack : in std_logic; + IP_TX_Meta_rst : in std_logic; + IP_TX_Meta_SrcIPv4Address_nxt : in std_logic; + IP_TX_Meta_SrcIPv4Address_Data : out T_SLV_8; + IP_TX_Meta_DestIPv4Address_nxt : in std_logic; + IP_TX_Meta_DestIPv4Address_Data : out T_SLV_8; + IP_TX_Meta_Length : out T_SLV_16; -- from IPv4 layer - IP_RX_Valid : in std_logic; - IP_RX_Data : in T_SLV_8; - IP_RX_SOF : in std_logic; - IP_RX_EOF : in std_logic; - IP_RX_Ack : out std_logic; - IP_RX_Meta_rst : out std_logic; - IP_RX_Meta_SrcMACAddress_nxt : out std_logic; - IP_RX_Meta_SrcMACAddress_Data : in T_SLV_8; - IP_RX_Meta_DestMACAddress_nxt : out std_logic; - IP_RX_Meta_DestMACAddress_Data : in T_SLV_8; --- IP_RX_Meta_EthType : in T_SLV_16; - IP_RX_Meta_SrcIPv4Address_nxt : out std_logic; - IP_RX_Meta_SrcIPv4Address_Data : in T_SLV_8; - IP_RX_Meta_DestIPv4Address_nxt : out std_logic; - IP_RX_Meta_DestIPv4Address_Data : in T_SLV_8; --- IP_RX_Meta_TrafficClass : in T_SLV_8; --- IP_RX_Meta_FlowLabel : in T_SLV_24; - IP_RX_Meta_Length : in T_SLV_16 --- IP_RX_Meta_Protocol : in T_SLV_8 + IP_RX_Valid : in std_logic; + IP_RX_Data : in T_SLV_8; + IP_RX_SOF : in std_logic; + IP_RX_EOF : in std_logic; + IP_RX_Ack : out std_logic; + IP_RX_Meta_rst : out std_logic; + IP_RX_Meta_SrcMACAddress_nxt : out std_logic; + IP_RX_Meta_SrcMACAddress_Data : in T_SLV_8; + IP_RX_Meta_DestMACAddress_nxt : out std_logic; + IP_RX_Meta_DestMACAddress_Data : in T_SLV_8; +-- IP_RX_Meta_EthType : in T_SLV_16; + IP_RX_Meta_SrcIPv4Address_nxt : out std_logic; + IP_RX_Meta_SrcIPv4Address_Data : in T_SLV_8; + IP_RX_Meta_DestIPv4Address_nxt : out std_logic; + IP_RX_Meta_DestIPv4Address_Data : in T_SLV_8; +-- IP_RX_Meta_TrafficClass : in T_SLV_8; +-- IP_RX_Meta_FlowLabel : in T_SLV_24; + IP_RX_Meta_Length : in T_SLV_16 +-- IP_RX_Meta_Protocol : in T_SLV_8 ); end entity; architecture rtl of icmpv4_Wrapper is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; - type T_STATE is ( + type T_STATE is ( ST_IDLE, ST_SEND_ECHO_REQUEST, ST_SEND_ECHO_REQUEST_WAIT, @@ -102,47 +102,47 @@ architecture rtl of icmpv4_Wrapper is ST_ERROR ); - signal FSM_State : T_STATE := ST_IDLE; - signal FSM_NextState : T_STATE; - attribute FSM_ENCODING of FSM_State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); - - signal FSM_TX_Command : T_NET_ICMPV4_TX_COMMAND; - signal TX_Status : T_NET_ICMPV4_TX_STATUS; - signal TX_Error : T_NET_ICMPV4_TX_ERROR; - - signal FSM_RX_Command : T_NET_ICMPV4_RX_COMMAND; - signal RX_Status : T_NET_ICMPV4_RX_STATUS; - signal RX_Error : T_NET_ICMPV4_RX_ERROR; - - signal TX_Meta_rst : std_logic; - signal TX_Meta_IPv4Address_nxt : std_logic; - signal FSM_TX_Meta_IPv4Address_Data : T_SLV_8; - signal FSM_TX_Meta_Type : T_SLV_8; - signal FSM_TX_Meta_Code : T_SLV_8; - signal FSM_TX_Meta_Identification : T_SLV_16; - signal FSM_TX_Meta_SequenceNumber : T_SLV_16; - signal TX_Meta_Payload_nxt : std_logic; - signal FSM_TX_Meta_Payload_last : std_logic; - signal FSM_TX_Meta_Payload_Data : T_SLV_8; - - signal RX_Meta_rst : std_logic; - signal FSM_RX_Meta_rst : std_logic; - signal FSM_RX_Meta_SrcMACAddress_nxt : std_logic; - signal RX_Meta_SrcMACAddress_Data : T_SLV_8; - signal FSM_RX_Meta_DestMACAddress_nxt : std_logic; - signal RX_Meta_DestMACAddress_Data : T_SLV_8; - signal FSM_RX_Meta_SrcIPv4Address_nxt : std_logic; - signal RX_Meta_SrcIPv4Address_Data : T_SLV_8; - signal FSM_RX_Meta_DestIPv4Address_nxt : std_logic; - signal RX_Meta_DestIPv4Address_Data : T_SLV_8; - signal RX_Meta_Length : T_SLV_16; - signal RX_Meta_Type : T_SLV_8; - signal RX_Meta_Code : T_SLV_8; - signal RX_Meta_Identification : T_SLV_16; - signal RX_Meta_SequenceNumber : T_SLV_16; - signal FSM_RX_Meta_Payload_nxt : std_logic; - signal RX_Meta_Payload_last : std_logic; - signal RX_Meta_Payload_Data : T_SLV_8; + signal FSM_State : T_STATE := ST_IDLE; + signal FSM_NextState : T_STATE; + attribute FSM_ENCODING of FSM_State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); + + signal FSM_TX_Command : T_NET_ICMPV4_TX_COMMAND; + signal TX_Status : T_NET_ICMPV4_TX_STATUS; + signal TX_Error : T_NET_ICMPV4_TX_ERROR; + + signal FSM_RX_Command : T_NET_ICMPV4_RX_COMMAND; + signal RX_Status : T_NET_ICMPV4_RX_STATUS; + signal RX_Error : T_NET_ICMPV4_RX_ERROR; + + signal TX_Meta_rst : std_logic; + signal TX_Meta_IPv4Address_nxt : std_logic; + signal FSM_TX_Meta_IPv4Address_Data : T_SLV_8; + signal FSM_TX_Meta_Type : T_SLV_8; + signal FSM_TX_Meta_Code : T_SLV_8; + signal FSM_TX_Meta_Identification : T_SLV_16; + signal FSM_TX_Meta_SequenceNumber : T_SLV_16; + signal TX_Meta_Payload_nxt : std_logic; + signal FSM_TX_Meta_Payload_last : std_logic; + signal FSM_TX_Meta_Payload_Data : T_SLV_8; + + signal RX_Meta_rst : std_logic; + signal FSM_RX_Meta_rst : std_logic; + signal FSM_RX_Meta_SrcMACAddress_nxt : std_logic; + signal RX_Meta_SrcMACAddress_Data : T_SLV_8; + signal FSM_RX_Meta_DestMACAddress_nxt : std_logic; + signal RX_Meta_DestMACAddress_Data : T_SLV_8; + signal FSM_RX_Meta_SrcIPv4Address_nxt : std_logic; + signal RX_Meta_SrcIPv4Address_Data : T_SLV_8; + signal FSM_RX_Meta_DestIPv4Address_nxt : std_logic; + signal RX_Meta_DestIPv4Address_Data : T_SLV_8; + signal RX_Meta_Length : T_SLV_16; + signal RX_Meta_Type : T_SLV_8; + signal RX_Meta_Code : T_SLV_8; + signal RX_Meta_Identification : T_SLV_16; + signal RX_Meta_SequenceNumber : T_SLV_16; + signal FSM_RX_Meta_Payload_nxt : std_logic; + signal RX_Meta_Payload_last : std_logic; + signal RX_Meta_Payload_Data : T_SLV_8; begin -- ============================================================================= @@ -152,9 +152,9 @@ begin begin if rising_edge(Clock) then if (Reset = '1') then - FSM_State <= ST_IDLE; + FSM_State <= ST_IDLE; else - FSM_State <= FSM_NextState; + FSM_State <= FSM_NextState; end if; end if; end process; @@ -164,138 +164,138 @@ begin TX_Status, TX_Error, TX_Meta_Payload_nxt, RX_Status, RX_Error, RX_Meta_Identification, RX_Meta_SequenceNumber, RX_Meta_Payload_Data, RX_Meta_Payload_last) begin - FSM_NextState <= FSM_State; + FSM_NextState <= FSM_State; - Status <= NET_ICMPV4_STATUS_IDLE; - Error <= NET_ICMPV4_ERROR_NONE; + Status <= NET_ICMPV4_STATUS_IDLE; + Error <= NET_ICMPV4_ERROR_NONE; - FSM_TX_Command <= NET_ICMPV4_TX_CMD_NONE; - FSM_RX_Command <= NET_ICMPV4_RX_CMD_NONE; + FSM_TX_Command <= NET_ICMPV4_TX_CMD_NONE; + FSM_RX_Command <= NET_ICMPV4_RX_CMD_NONE; - FSM_TX_Meta_Type <= C_NET_ICMPV4_TYPE_EMPTY; - FSM_TX_Meta_Code <= C_NET_ICMPV4_CODE_EMPTY; - FSM_TX_Meta_Identification <= x"0000"; - FSM_TX_Meta_SequenceNumber <= x"0000"; - FSM_TX_Meta_Payload_last <= RX_Meta_Payload_last; - FSM_TX_Meta_Payload_Data <= RX_Meta_Payload_Data; + FSM_TX_Meta_Type <= C_NET_ICMPV4_TYPE_EMPTY; + FSM_TX_Meta_Code <= C_NET_ICMPV4_CODE_EMPTY; + FSM_TX_Meta_Identification <= x"0000"; + FSM_TX_Meta_SequenceNumber <= x"0000"; + FSM_TX_Meta_Payload_last <= RX_Meta_Payload_last; + FSM_TX_Meta_Payload_Data <= RX_Meta_Payload_Data; - FSM_RX_Meta_rst <= '0'; - FSM_RX_Meta_SrcMACAddress_nxt <= '0'; - FSM_RX_Meta_DestMACAddress_nxt <= '0'; - FSM_RX_Meta_SrcIPv4Address_nxt <= '0'; - FSM_RX_Meta_DestIPv4Address_nxt <= '0'; - FSM_RX_Meta_Payload_nxt <= '0'; + FSM_RX_Meta_rst <= '0'; + FSM_RX_Meta_SrcMACAddress_nxt <= '0'; + FSM_RX_Meta_DestMACAddress_nxt <= '0'; + FSM_RX_Meta_SrcIPv4Address_nxt <= '0'; + FSM_RX_Meta_DestIPv4Address_nxt <= '0'; + FSM_RX_Meta_Payload_nxt <= '0'; case FSM_State is when ST_IDLE => case Command is - when NET_ICMPV4_CMD_NONE => null; - when NET_ICMPV4_CMD_ECHO_REQUEST => FSM_NextState <= ST_SEND_ECHO_REQUEST; - when others => FSM_NextState <= ST_ERROR; + when NET_ICMPV4_CMD_NONE => null; + when NET_ICMPV4_CMD_ECHO_REQUEST => FSM_NextState <= ST_SEND_ECHO_REQUEST; + when others => FSM_NextState <= ST_ERROR; end case; case RX_Status is - when NET_ICMPV4_RX_STATUS_IDLE => null; - when NET_ICMPV4_RX_STATUS_RECEIVED_ECHO_REQUEST => FSM_NextState <= ST_SEND_ECHO_REPLY; - when others => FSM_NextState <= ST_ERROR; + when NET_ICMPV4_RX_STATUS_IDLE => null; + when NET_ICMPV4_RX_STATUS_RECEIVED_ECHO_REQUEST => FSM_NextState <= ST_SEND_ECHO_REPLY; + when others => FSM_NextState <= ST_ERROR; end case; -- ====================================================================== when ST_SEND_ECHO_REQUEST => - FSM_TX_Command <= NET_ICMPV4_TX_CMD_ECHO_REQUEST; + FSM_TX_Command <= NET_ICMPV4_TX_CMD_ECHO_REQUEST; - IPv4Address_rst <= TX_Meta_rst; - IPv4Address_nxt <= TX_Meta_IPv4Address_nxt; + IPv4Address_rst <= TX_Meta_rst; + IPv4Address_nxt <= TX_Meta_IPv4Address_nxt; - FSM_TX_Meta_IPv4Address_Data <= IPv4Address_Data; - FSM_TX_Meta_Type <= C_NET_ICMPV4_TYPE_ECHO_REQUEST; - FSM_TX_Meta_Code <= C_NET_ICMPV4_CODE_ECHO_REQUEST; - FSM_TX_Meta_Identification <= x"C0FE"; - FSM_TX_Meta_SequenceNumber <= x"BEAF"; + FSM_TX_Meta_IPv4Address_Data <= IPv4Address_Data; + FSM_TX_Meta_Type <= C_NET_ICMPV4_TYPE_ECHO_REQUEST; + FSM_TX_Meta_Code <= C_NET_ICMPV4_CODE_ECHO_REQUEST; + FSM_TX_Meta_Identification <= x"C0FE"; + FSM_TX_Meta_SequenceNumber <= x"BEAF"; - FSM_NextState <= ST_SEND_ECHO_REQUEST_WAIT; + FSM_NextState <= ST_SEND_ECHO_REQUEST_WAIT; when ST_SEND_ECHO_REQUEST_WAIT => - IPv4Address_rst <= TX_Meta_rst; - IPv4Address_nxt <= TX_Meta_IPv4Address_nxt; + IPv4Address_rst <= TX_Meta_rst; + IPv4Address_nxt <= TX_Meta_IPv4Address_nxt; - FSM_TX_Meta_IPv4Address_Data <= IPv4Address_Data; - FSM_TX_Meta_Type <= C_NET_ICMPV4_TYPE_ECHO_REQUEST; - FSM_TX_Meta_Code <= C_NET_ICMPV4_CODE_ECHO_REQUEST; - FSM_TX_Meta_Identification <= x"C0FE"; - FSM_TX_Meta_SequenceNumber <= x"BEAF"; + FSM_TX_Meta_IPv4Address_Data <= IPv4Address_Data; + FSM_TX_Meta_Type <= C_NET_ICMPV4_TYPE_ECHO_REQUEST; + FSM_TX_Meta_Code <= C_NET_ICMPV4_CODE_ECHO_REQUEST; + FSM_TX_Meta_Identification <= x"C0FE"; + FSM_TX_Meta_SequenceNumber <= x"BEAF"; case TX_Status is - when NET_ICMPV4_TX_STATUS_IDLE => null; - when NET_ICMPV4_TX_STATUS_SENDING => null; - when NET_ICMPV4_TX_STATUS_SEND_COMPLETE => FSM_NextState <= ST_WAIT_FOR_ECHO_REPLY; - when NET_ICMPV4_TX_STATUS_ERROR => FSM_NextState <= ST_ERROR; - when others => FSM_NextState <= ST_ERROR; + when NET_ICMPV4_TX_STATUS_IDLE => null; + when NET_ICMPV4_TX_STATUS_SENDING => null; + when NET_ICMPV4_TX_STATUS_SEND_COMPLETE => FSM_NextState <= ST_WAIT_FOR_ECHO_REPLY; + when NET_ICMPV4_TX_STATUS_ERROR => FSM_NextState <= ST_ERROR; + when others => FSM_NextState <= ST_ERROR; end case; when ST_WAIT_FOR_ECHO_REPLY => case RX_Status is - when NET_ICMPV4_RX_STATUS_IDLE => null; - when NET_ICMPV4_RX_STATUS_RECEIVING => null; - when NET_ICMPV4_RX_STATUS_RECEIVED_ECHO_REPLY => FSM_NextState <= ST_EVAL_ECHO_REPLY; - when NET_ICMPV4_RX_STATUS_ERROR => FSM_NextState <= ST_ERROR; - when others => FSM_NextState <= ST_ERROR; + when NET_ICMPV4_RX_STATUS_IDLE => null; + when NET_ICMPV4_RX_STATUS_RECEIVING => null; + when NET_ICMPV4_RX_STATUS_RECEIVED_ECHO_REPLY => FSM_NextState <= ST_EVAL_ECHO_REPLY; + when NET_ICMPV4_RX_STATUS_ERROR => FSM_NextState <= ST_ERROR; + when others => FSM_NextState <= ST_ERROR; end case; when ST_EVAL_ECHO_REPLY => if (TRUE) then - FSM_NextState <= ST_IDLE; + FSM_NextState <= ST_IDLE; else - FSM_NextState <= ST_ERROR; + FSM_NextState <= ST_ERROR; end if; -- ====================================================================== when ST_SEND_ECHO_REPLY => - FSM_TX_Command <= NET_ICMPV4_TX_CMD_ECHO_REPLY; + FSM_TX_Command <= NET_ICMPV4_TX_CMD_ECHO_REPLY; - FSM_RX_Meta_rst <= TX_Meta_rst; - FSM_RX_Meta_SrcIPv4Address_nxt <= TX_Meta_IPv4Address_nxt; + FSM_RX_Meta_rst <= TX_Meta_rst; + FSM_RX_Meta_SrcIPv4Address_nxt <= TX_Meta_IPv4Address_nxt; - FSM_TX_Meta_IPv4Address_Data <= RX_Meta_SrcIPv4Address_Data; - FSM_TX_Meta_Type <= C_NET_ICMPV4_TYPE_ECHO_REPLY; - FSM_TX_Meta_Code <= C_NET_ICMPV4_CODE_ECHO_REPLY; - FSM_TX_Meta_Identification <= RX_Meta_Identification; - FSM_TX_Meta_SequenceNumber <= RX_Meta_SequenceNumber; - FSM_RX_Meta_Payload_nxt <= TX_Meta_Payload_nxt; + FSM_TX_Meta_IPv4Address_Data <= RX_Meta_SrcIPv4Address_Data; + FSM_TX_Meta_Type <= C_NET_ICMPV4_TYPE_ECHO_REPLY; + FSM_TX_Meta_Code <= C_NET_ICMPV4_CODE_ECHO_REPLY; + FSM_TX_Meta_Identification <= RX_Meta_Identification; + FSM_TX_Meta_SequenceNumber <= RX_Meta_SequenceNumber; + FSM_RX_Meta_Payload_nxt <= TX_Meta_Payload_nxt; - FSM_NextState <= ST_SEND_ECHO_REPLY; + FSM_NextState <= ST_SEND_ECHO_REPLY; when ST_SEND_ECHO_REPLY_WAIT => - FSM_RX_Meta_rst <= TX_Meta_rst; - FSM_RX_Meta_SrcIPv4Address_nxt <= TX_Meta_IPv4Address_nxt; + FSM_RX_Meta_rst <= TX_Meta_rst; + FSM_RX_Meta_SrcIPv4Address_nxt <= TX_Meta_IPv4Address_nxt; - FSM_TX_Meta_IPv4Address_Data <= RX_Meta_SrcIPv4Address_Data; - FSM_TX_Meta_Type <= C_NET_ICMPV4_TYPE_ECHO_REPLY; - FSM_TX_Meta_Code <= C_NET_ICMPV4_CODE_ECHO_REPLY; - FSM_TX_Meta_Identification <= RX_Meta_Identification; - FSM_TX_Meta_SequenceNumber <= RX_Meta_SequenceNumber; + FSM_TX_Meta_IPv4Address_Data <= RX_Meta_SrcIPv4Address_Data; + FSM_TX_Meta_Type <= C_NET_ICMPV4_TYPE_ECHO_REPLY; + FSM_TX_Meta_Code <= C_NET_ICMPV4_CODE_ECHO_REPLY; + FSM_TX_Meta_Identification <= RX_Meta_Identification; + FSM_TX_Meta_SequenceNumber <= RX_Meta_SequenceNumber; case TX_Status is - when NET_ICMPV4_TX_STATUS_IDLE => null; - when NET_ICMPV4_TX_STATUS_SENDING => null; - when NET_ICMPV4_TX_STATUS_SEND_COMPLETE => FSM_NextState <= ST_SEND_ECHO_REPLY_FINISHED; - when NET_ICMPV4_TX_STATUS_ERROR => FSM_NextState <= ST_ERROR; - when others => FSM_NextState <= ST_ERROR; + when NET_ICMPV4_TX_STATUS_IDLE => null; + when NET_ICMPV4_TX_STATUS_SENDING => null; + when NET_ICMPV4_TX_STATUS_SEND_COMPLETE => FSM_NextState <= ST_SEND_ECHO_REPLY_FINISHED; + when NET_ICMPV4_TX_STATUS_ERROR => FSM_NextState <= ST_ERROR; + when others => FSM_NextState <= ST_ERROR; end case; when ST_SEND_ECHO_REPLY_FINISHED => - Status <= NET_ICMPV4_STATUS_IDLE; + Status <= NET_ICMPV4_STATUS_IDLE; - FSM_RX_Command <= NET_ICMPV4_RX_CMD_CLEAR; + FSM_RX_Command <= NET_ICMPV4_RX_CMD_CLEAR; - FSM_NextState <= ST_IDLE; + FSM_NextState <= ST_IDLE; -- ====================================================================== when ST_ERROR => - Status <= NET_ICMPV4_STATUS_ERROR; - Error <= NET_ICMPV4_ERROR_FSM; - FSM_NextState <= ST_IDLE; + Status <= NET_ICMPV4_STATUS_ERROR; + Error <= NET_ICMPV4_ERROR_FSM; + FSM_NextState <= ST_IDLE; end case; end process; @@ -305,88 +305,88 @@ begin -- ============================================================================= TX: entity work.icmpv4_TX generic map ( - DEBUG => DEBUG, - SOURCE_IPV4ADDRESS => SOURCE_IPV4ADDRESS + DEBUG => DEBUG, + SOURCE_IPV4ADDRESS => SOURCE_IPV4ADDRESS ) port map ( - Clock => Clock, - Reset => Reset, - - Command => FSM_TX_Command, - Status => TX_Status, - Error => TX_Error, - - Out_Valid => IP_TX_Valid, - Out_Data => IP_TX_Data, - Out_SOF => IP_TX_SOF, - Out_EOF => IP_TX_EOF, - Out_Ack => IP_TX_Ack, - Out_Meta_rst => IP_TX_Meta_rst, - Out_Meta_SrcIPv4Address_nxt => IP_TX_Meta_SrcIPv4Address_nxt, - Out_Meta_SrcIPv4Address_Data => IP_TX_Meta_SrcIPv4Address_Data, - Out_Meta_DestIPv4Address_nxt => IP_TX_Meta_DestIPv4Address_nxt, - Out_Meta_DestIPv4Address_Data => IP_TX_Meta_DestIPv4Address_Data, - Out_Meta_Length => IP_TX_Meta_Length, - - In_Meta_rst => TX_Meta_rst, - In_Meta_IPv4Address_nxt => TX_Meta_IPv4Address_nxt, - In_Meta_IPv4Address_Data => FSM_TX_Meta_IPv4Address_Data, - In_Meta_Type => FSM_TX_Meta_Type, - In_Meta_Code => FSM_TX_Meta_Code, - In_Meta_Identification => FSM_TX_Meta_Identification, - In_Meta_SequenceNumber => FSM_TX_Meta_SequenceNumber, - In_Meta_Payload_nxt => TX_Meta_Payload_nxt, - In_Meta_Payload_last => FSM_TX_Meta_Payload_last, - In_Meta_Payload_Data => FSM_TX_Meta_Payload_Data - ); + Clock => Clock, + Reset => Reset, + + Command => FSM_TX_Command, + Status => TX_Status, + Error => TX_Error, + + Out_Valid => IP_TX_Valid, + Out_Data => IP_TX_Data, + Out_SOF => IP_TX_SOF, + Out_EOF => IP_TX_EOF, + Out_Ack => IP_TX_Ack, + Out_Meta_rst => IP_TX_Meta_rst, + Out_Meta_SrcIPv4Address_nxt => IP_TX_Meta_SrcIPv4Address_nxt, + Out_Meta_SrcIPv4Address_Data => IP_TX_Meta_SrcIPv4Address_Data, + Out_Meta_DestIPv4Address_nxt => IP_TX_Meta_DestIPv4Address_nxt, + Out_Meta_DestIPv4Address_Data => IP_TX_Meta_DestIPv4Address_Data, + Out_Meta_Length => IP_TX_Meta_Length, + + In_Meta_rst => TX_Meta_rst, + In_Meta_IPv4Address_nxt => TX_Meta_IPv4Address_nxt, + In_Meta_IPv4Address_Data => FSM_TX_Meta_IPv4Address_Data, + In_Meta_Type => FSM_TX_Meta_Type, + In_Meta_Code => FSM_TX_Meta_Code, + In_Meta_Identification => FSM_TX_Meta_Identification, + In_Meta_SequenceNumber => FSM_TX_Meta_SequenceNumber, + In_Meta_Payload_nxt => TX_Meta_Payload_nxt, + In_Meta_Payload_last => FSM_TX_Meta_Payload_last, + In_Meta_Payload_Data => FSM_TX_Meta_Payload_Data + ); -- ============================================================================= -- RX Path -- ============================================================================= RX: entity work.icmpv4_RX generic map ( - DEBUG => DEBUG + DEBUG => DEBUG ) port map ( - Clock => Clock, - Reset => Reset, - - Command => FSM_RX_Command, - Status => RX_Status, - Error => RX_Error, - - In_Valid => IP_RX_Valid, - In_Data => IP_RX_Data, - In_SOF => IP_RX_SOF, - In_EOF => IP_RX_EOF, - In_Ack => IP_RX_Ack, - In_Meta_rst => IP_RX_Meta_rst, - In_Meta_SrcMACAddress_nxt => IP_RX_Meta_SrcMACAddress_nxt, - In_Meta_SrcMACAddress_Data => IP_RX_Meta_SrcMACAddress_Data, - In_Meta_DestMACAddress_nxt => IP_RX_Meta_DestMACAddress_nxt, - In_Meta_DestMACAddress_Data => IP_RX_Meta_DestMACAddress_Data, - In_Meta_SrcIPv4Address_nxt => IP_RX_Meta_SrcIPv4Address_nxt, - In_Meta_SrcIPv4Address_Data => IP_RX_Meta_SrcIPv4Address_Data, - In_Meta_DestIPv4Address_nxt => IP_RX_Meta_DestIPv4Address_nxt, - In_Meta_DestIPv4Address_Data => IP_RX_Meta_DestIPv4Address_Data, - In_Meta_Length => IP_RX_Meta_Length, - - Out_Meta_rst => FSM_RX_Meta_rst, - Out_Meta_SrcMACAddress_nxt => FSM_RX_Meta_SrcMACAddress_nxt, - Out_Meta_SrcMACAddress_Data => RX_Meta_SrcMACAddress_Data, - Out_Meta_DestMACAddress_nxt => FSM_RX_Meta_DestMACAddress_nxt, - Out_Meta_DestMACAddress_Data => RX_Meta_DestMACAddress_Data, - Out_Meta_SrcIPv4Address_nxt => FSM_RX_Meta_SrcIPv4Address_nxt, - Out_Meta_SrcIPv4Address_Data => RX_Meta_SrcIPv4Address_Data, - Out_Meta_DestIPv4Address_nxt => FSM_RX_Meta_DestIPv4Address_nxt, - Out_Meta_DestIPv4Address_Data => RX_Meta_DestIPv4Address_Data, - Out_Meta_Length => RX_Meta_Length, - Out_Meta_Type => RX_Meta_Type, - Out_Meta_Code => RX_Meta_Code, - Out_Meta_Identification => RX_Meta_Identification, - Out_Meta_SequenceNumber => RX_Meta_SequenceNumber, - Out_Meta_Payload_nxt => FSM_RX_Meta_Payload_nxt, - Out_Meta_Payload_last => RX_Meta_Payload_last, - Out_Meta_Payload_Data => RX_Meta_Payload_Data + Clock => Clock, + Reset => Reset, + + Command => FSM_RX_Command, + Status => RX_Status, + Error => RX_Error, + + In_Valid => IP_RX_Valid, + In_Data => IP_RX_Data, + In_SOF => IP_RX_SOF, + In_EOF => IP_RX_EOF, + In_Ack => IP_RX_Ack, + In_Meta_rst => IP_RX_Meta_rst, + In_Meta_SrcMACAddress_nxt => IP_RX_Meta_SrcMACAddress_nxt, + In_Meta_SrcMACAddress_Data => IP_RX_Meta_SrcMACAddress_Data, + In_Meta_DestMACAddress_nxt => IP_RX_Meta_DestMACAddress_nxt, + In_Meta_DestMACAddress_Data => IP_RX_Meta_DestMACAddress_Data, + In_Meta_SrcIPv4Address_nxt => IP_RX_Meta_SrcIPv4Address_nxt, + In_Meta_SrcIPv4Address_Data => IP_RX_Meta_SrcIPv4Address_Data, + In_Meta_DestIPv4Address_nxt => IP_RX_Meta_DestIPv4Address_nxt, + In_Meta_DestIPv4Address_Data => IP_RX_Meta_DestIPv4Address_Data, + In_Meta_Length => IP_RX_Meta_Length, + + Out_Meta_rst => FSM_RX_Meta_rst, + Out_Meta_SrcMACAddress_nxt => FSM_RX_Meta_SrcMACAddress_nxt, + Out_Meta_SrcMACAddress_Data => RX_Meta_SrcMACAddress_Data, + Out_Meta_DestMACAddress_nxt => FSM_RX_Meta_DestMACAddress_nxt, + Out_Meta_DestMACAddress_Data => RX_Meta_DestMACAddress_Data, + Out_Meta_SrcIPv4Address_nxt => FSM_RX_Meta_SrcIPv4Address_nxt, + Out_Meta_SrcIPv4Address_Data => RX_Meta_SrcIPv4Address_Data, + Out_Meta_DestIPv4Address_nxt => FSM_RX_Meta_DestIPv4Address_nxt, + Out_Meta_DestIPv4Address_Data => RX_Meta_DestIPv4Address_Data, + Out_Meta_Length => RX_Meta_Length, + Out_Meta_Type => RX_Meta_Type, + Out_Meta_Code => RX_Meta_Code, + Out_Meta_Identification => RX_Meta_Identification, + Out_Meta_SequenceNumber => RX_Meta_SequenceNumber, + Out_Meta_Payload_nxt => FSM_RX_Meta_Payload_nxt, + Out_Meta_Payload_last => RX_Meta_Payload_last, + Out_Meta_Payload_Data => RX_Meta_Payload_Data ); end architecture; diff --git a/src/net/ipv4/ipv4.pro b/src/net/ipv4/build.pro similarity index 100% rename from src/net/ipv4/ipv4.pro rename to src/net/ipv4/build.pro diff --git a/src/net/ipv4/ipv4_FrameLoopback.vhdl b/src/net/ipv4/ipv4_FrameLoopback.vhdl index 0a30280e2..8054f4963 100644 --- a/src/net/ipv4/ipv4_FrameLoopback.vhdl +++ b/src/net/ipv4/ipv4_FrameLoopback.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,108 +37,108 @@ use work.net.all; entity ipv4_FrameLoopback is generic ( - MAX_FRAMES : positive := 4 + MAX_FRAMES : positive := 4 ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- IN port - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - In_Meta_rst : out std_logic; - In_Meta_SrcIPv4Address_nxt : out std_logic; - In_Meta_SrcIPv4Address_Data : in T_SLV_8; - In_Meta_DestIPv4Address_nxt : out std_logic; - In_Meta_DestIPv4Address_Data : in T_SLV_8; - In_Meta_Length : in T_SLV_16; + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + In_Meta_rst : out std_logic; + In_Meta_SrcIPv4Address_nxt : out std_logic; + In_Meta_SrcIPv4Address_Data : in T_SLV_8; + In_Meta_DestIPv4Address_nxt : out std_logic; + In_Meta_DestIPv4Address_Data : in T_SLV_8; + In_Meta_Length : in T_SLV_16; -- OUT port - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic; - Out_Meta_rst : in std_logic; - Out_Meta_SrcIPv4Address_nxt : in std_logic; - Out_Meta_SrcIPv4Address_Data : out T_SLV_8; - Out_Meta_DestIPv4Address_nxt : in std_logic; - Out_Meta_DestIPv4Address_Data : out T_SLV_8; - Out_Meta_Length : out T_SLV_16 + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic; + Out_Meta_rst : in std_logic; + Out_Meta_SrcIPv4Address_nxt : in std_logic; + Out_Meta_SrcIPv4Address_Data : out T_SLV_8; + Out_Meta_DestIPv4Address_nxt : in std_logic; + Out_Meta_DestIPv4Address_Data : out T_SLV_8; + Out_Meta_Length : out T_SLV_16 ); end entity; architecture rtl of ipv4_FrameLoopback is - constant META_STREAMID_SRCADDR : natural := 0; - constant META_STREAMID_DESTADDR : natural := 1; - constant META_STREAMID_LENGTH : natural := 2; - - constant META_BITS : T_POSVEC := ( - META_STREAMID_SRCADDR => 8, - META_STREAMID_DESTADDR => 8, - META_STREAMID_LENGTH => 16 + constant META_STREAMID_SRCADDR : natural := 0; + constant META_STREAMID_DESTADDR : natural := 1; + constant META_STREAMID_LENGTH : natural := 2; + + constant META_BITS : positive_vector := ( + META_STREAMID_SRCADDR => 8, + META_STREAMID_DESTADDR => 8, + META_STREAMID_LENGTH => 16 ); - constant META_FIFO_DEPTHS : T_POSVEC := ( - META_STREAMID_SRCADDR => 4, - META_STREAMID_DESTADDR => 4, - META_STREAMID_LENGTH => 1 + constant META_FIFO_DEPTHS : positive_vector := ( + META_STREAMID_SRCADDR => 4, + META_STREAMID_DESTADDR => 4, + META_STREAMID_LENGTH => 1 ); - signal StmBuf_MetaIn_nxt : std_logic_vector(META_BITS'length - 1 downto 0); - signal StmBuf_MetaIn_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); - signal StmBuf_MetaOut_nxt : std_logic_vector(META_BITS'length - 1 downto 0); - signal StmBuf_MetaOut_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); + signal StmBuf_MetaIn_nxt : std_logic_vector(META_BITS'length - 1 downto 0); + signal StmBuf_MetaIn_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); + signal StmBuf_MetaOut_nxt : std_logic_vector(META_BITS'length - 1 downto 0); + signal StmBuf_MetaOut_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); begin - StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)) <= In_Meta_SrcIPv4Address_Data; - StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)) <= In_Meta_DestIPv4Address_Data; - StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_LENGTH) downto low(META_BITS, META_STREAMID_LENGTH)) <= In_Meta_Length; + StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)) <= In_Meta_SrcIPv4Address_Data; + StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)) <= In_Meta_DestIPv4Address_Data; + StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_LENGTH) downto low(META_BITS, META_STREAMID_LENGTH)) <= In_Meta_Length; - In_Meta_SrcIPv4Address_nxt <= StmBuf_MetaIn_nxt(META_STREAMID_SRCADDR); - In_Meta_DestIPv4Address_nxt <= StmBuf_MetaIn_nxt(META_STREAMID_DESTADDR); + In_Meta_SrcIPv4Address_nxt <= StmBuf_MetaIn_nxt(META_STREAMID_SRCADDR); + In_Meta_DestIPv4Address_nxt <= StmBuf_MetaIn_nxt(META_STREAMID_DESTADDR); StmBuf: entity work.stream_FIFO generic map ( - FRAMES => MAX_FRAMES, - DATA_BITS => 8, - DATA_FIFO_DEPTH => 1024, - META_BITS => META_BITS, - META_FIFO_DEPTH => META_FIFO_DEPTHS + FRAMES => MAX_FRAMES, + DATA_BITS => 8, + DATA_FIFO_DEPTH => 1024, + META_BITS => META_BITS, + META_FIFO_DEPTH => META_FIFO_DEPTHS ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => In_Valid, - In_Data => In_Data, - In_SOF => In_SOF, - In_EOF => In_EOF, - In_Ack => In_Ack, - In_Meta_rst => In_Meta_rst, - In_Meta_nxt => StmBuf_MetaIn_nxt, - In_Meta_Data => StmBuf_MetaIn_Data, - - Out_Valid => Out_Valid, - Out_Data => Out_Data, - Out_SOF => Out_SOF, - Out_EOF => Out_EOF, - Out_Ack => Out_Ack, - Out_Meta_rst => Out_Meta_rst, - Out_Meta_nxt => StmBuf_MetaOut_nxt, - Out_Meta_Data => StmBuf_MetaOut_Data + Clock => Clock, + Reset => Reset, + + In_Valid => In_Valid, + In_Data => In_Data, + In_SOF => In_SOF, + In_EOF => In_EOF, + In_Ack => In_Ack, + In_Meta_rst => In_Meta_rst, + In_Meta_nxt => StmBuf_MetaIn_nxt, + In_Meta_Data => StmBuf_MetaIn_Data, + + Out_Valid => Out_Valid, + Out_Data => Out_Data, + Out_SOF => Out_SOF, + Out_EOF => Out_EOF, + Out_Ack => Out_Ack, + Out_Meta_rst => Out_Meta_rst, + Out_Meta_nxt => StmBuf_MetaOut_nxt, + Out_Meta_Data => StmBuf_MetaOut_Data ); -- unpack StmBuf metadata to signals - Out_Meta_SrcIPv4Address_Data <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)); -- Crossover: Source <= Destination - Out_Meta_DestIPv4Address_Data <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)); -- Crossover: Destination <= Source - Out_Meta_Length <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_LENGTH) downto low(META_BITS, META_STREAMID_LENGTH)); + Out_Meta_SrcIPv4Address_Data <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)); -- Crossover: Source <= Destination + Out_Meta_DestIPv4Address_Data <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)); -- Crossover: Destination <= Source + Out_Meta_Length <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_LENGTH) downto low(META_BITS, META_STREAMID_LENGTH)); -- pack metadata nxt signals to StmBuf meta vector - StmBuf_MetaOut_nxt(META_STREAMID_DESTADDR) <= Out_Meta_SrcIPv4Address_nxt; - StmBuf_MetaOut_nxt(META_STREAMID_SRCADDR) <= Out_Meta_DestIPv4Address_nxt; - StmBuf_MetaOut_nxt(META_STREAMID_LENGTH) <= '0'; + StmBuf_MetaOut_nxt(META_STREAMID_DESTADDR) <= Out_Meta_SrcIPv4Address_nxt; + StmBuf_MetaOut_nxt(META_STREAMID_SRCADDR) <= Out_Meta_DestIPv4Address_nxt; + StmBuf_MetaOut_nxt(META_STREAMID_LENGTH) <= '0'; end architecture; diff --git a/src/net/ipv4/ipv4_RX.vhdl b/src/net/ipv4/ipv4_RX.vhdl index f7a7792a8..679efe872 100644 --- a/src/net/ipv4/ipv4_RX.vhdl +++ b/src/net/ipv4/ipv4_RX.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,394 +37,394 @@ use work.net.all; entity ipv4_RX is generic ( - DEBUG : boolean := FALSE + DEBUG : boolean := FALSE ); port ( - Clock : in std_logic; -- - Reset : in std_logic; -- + Clock : in std_logic; -- + Reset : in std_logic; -- -- STATUS port - Error : out std_logic; + Error : out std_logic; -- IN port - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - In_Meta_rst : out std_logic; - In_Meta_SrcMACAddress_nxt : out std_logic; - In_Meta_SrcMACAddress_Data : in T_SLV_8; - In_Meta_DestMACAddress_nxt : out std_logic; - In_Meta_DestMACAddress_Data : in T_SLV_8; - In_Meta_EthType : in T_SLV_16; + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + In_Meta_rst : out std_logic; + In_Meta_SrcMACAddress_nxt : out std_logic; + In_Meta_SrcMACAddress_Data : in T_SLV_8; + In_Meta_DestMACAddress_nxt : out std_logic; + In_Meta_DestMACAddress_Data : in T_SLV_8; + In_Meta_EthType : in T_SLV_16; -- OUT port - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic; - Out_Meta_rst : in std_logic; - Out_Meta_SrcMACAddress_nxt : in std_logic; - Out_Meta_SrcMACAddress_Data : out T_SLV_8; - Out_Meta_DestMACAddress_nxt : in std_logic; - Out_Meta_DestMACAddress_Data : out T_SLV_8; - Out_Meta_EthType : out T_SLV_16; - Out_Meta_SrcIPv4Address_nxt : in std_logic; - Out_Meta_SrcIPv4Address_Data : out T_SLV_8; - Out_Meta_DestIPv4Address_nxt : in std_logic; - Out_Meta_DestIPv4Address_Data : out T_SLV_8; - Out_Meta_Length : out T_SLV_16; - Out_Meta_Protocol : out T_SLV_8 + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic; + Out_Meta_rst : in std_logic; + Out_Meta_SrcMACAddress_nxt : in std_logic; + Out_Meta_SrcMACAddress_Data : out T_SLV_8; + Out_Meta_DestMACAddress_nxt : in std_logic; + Out_Meta_DestMACAddress_Data : out T_SLV_8; + Out_Meta_EthType : out T_SLV_16; + Out_Meta_SrcIPv4Address_nxt : in std_logic; + Out_Meta_SrcIPv4Address_Data : out T_SLV_8; + Out_Meta_DestIPv4Address_nxt : in std_logic; + Out_Meta_DestIPv4Address_Data : out T_SLV_8; + Out_Meta_Length : out T_SLV_16; + Out_Meta_Protocol : out T_SLV_8 ); end entity; architecture rtl of ipv4_RX is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; type T_STATE is ( ST_IDLE, - ST_RECEIVE_TYPE_OF_SERVICE, ST_RECEIVE_TOTAL_LENGTH_0, ST_RECEIVE_TOTAL_LENGTH_1, - ST_RECEIVE_IDENTIFICATION_0, ST_RECEIVE_IDENTIFICATION_1, ST_RECEIVE_FLAGS, ST_RECEIVE_FRAGMENT_OFFSET_1, - ST_RECEIVE_TIME_TO_LIVE, ST_RECEIVE_PROTOCOL, ST_RECEIVE_HEADER_CHECKSUM_0, ST_RECEIVE_HEADER_CHECKSUM_1, + ST_RECEIVE_TYPE_OF_SERVICE, ST_RECEIVE_TOTAL_LENGTH_0, ST_RECEIVE_TOTAL_LENGTH_1, + ST_RECEIVE_IDENTIFICATION_0, ST_RECEIVE_IDENTIFICATION_1, ST_RECEIVE_FLAGS, ST_RECEIVE_FRAGMENT_OFFSET_1, + ST_RECEIVE_TIME_TO_LIVE, ST_RECEIVE_PROTOCOL, ST_RECEIVE_HEADER_CHECKSUM_0, ST_RECEIVE_HEADER_CHECKSUM_1, ST_RECEIVE_SOURCE_ADDRESS, ST_RECEIVE_DESTINATION_ADDRESS, --- ST_RECEIVE_OPTIONS, - ST_RECEIVE_DATA_1, ST_RECEIVE_DATA_N, +-- ST_RECEIVE_OPTIONS, + ST_RECEIVE_DATA_1, ST_RECEIVE_DATA_N, ST_DISCARD_FRAME, ST_ERROR ); - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); - signal In_Ack_i : std_logic; - signal Is_DataFlow : std_logic; - signal Is_SOF : std_logic; - signal Is_EOF : std_logic; + signal In_Ack_i : std_logic; + signal Is_DataFlow : std_logic; + signal Is_SOF : std_logic; + signal Is_EOF : std_logic; - signal Out_Valid_i : std_logic; - signal Out_SOF_i : std_logic; - signal Out_EOF_i : std_logic; + signal Out_Valid_i : std_logic; + signal Out_SOF_i : std_logic; + signal Out_EOF_i : std_logic; - subtype T_IPV4_BYTEINDEX is natural range 0 to 3; - signal IP_ByteIndex : T_IPV4_BYTEINDEX; + subtype T_IPV4_BYTEINDEX is natural range 0 to 3; + signal IP_ByteIndex : T_IPV4_BYTEINDEX; - signal Register_rst : std_logic; + signal Register_rst : std_logic; -- IPv4 Basic Header - signal HeaderLength_en : std_logic; - signal TypeOfService_en : std_logic; - signal TotalLength_en0 : std_logic; - signal TotalLength_en1 : std_logic; --- signal Identification_en0 : STD_LOGIC; --- signal Identification_en1 : STD_LOGIC; - signal Flags_en : std_logic; --- signal FragmentOffset_en0 : STD_LOGIC; --- signal FragmentOffset_en1 : STD_LOGIC; - signal TimeToLive_en : std_logic; - signal Protocol_en : std_logic; - signal HeaderChecksum_en0 : std_logic; - signal HeaderChecksum_en1 : std_logic; - signal SourceIPv4Address_en : std_logic; - signal DestIPv4Address_en : std_logic; - - signal HeaderLength_d : T_SLV_4 := (others => '0'); - signal TypeOfService_d : T_SLV_8 := (others => '0'); - signal TotalLength_d : T_SLV_16 := (others => '0'); --- signal Identification_d : T_SLV_16 := (others => '0'); - signal Flag_DontFragment_d : std_logic := '0'; - signal Flag_MoreFragmenta_d : std_logic := '0'; --- signal FragmentOffset_d : STD_LOGIC_VECTOR(12 downto 0) := (others => '0'); - signal TimeToLive_d : T_SLV_8 := (others => '0'); - signal Protocol_d : T_SLV_8 := (others => '0'); - signal HeaderChecksum_d : T_SLV_16 := (others => '0'); - signal SourceIPv4Address_d : T_NET_IPV4_ADDRESS := (others => (others => '0')); - signal DestIPv4Address_d : T_NET_IPV4_ADDRESS := (others => (others => '0')); - - constant IPV4_ADDRESS_LENGTH : positive := 4; -- IPv4 -> 4 bytes - constant IPV4_ADDRESS_READER_BITS : positive := log2ceilnz(IPV4_ADDRESS_LENGTH); - - signal IPv4SeqCounter_rst : std_logic; - signal IPv4SeqCounter_en : std_logic; - signal IPv4SeqCounter_us : unsigned(IPV4_ADDRESS_READER_BITS - 1 downto 0) := to_unsigned(IPV4_ADDRESS_LENGTH - 1, IPV4_ADDRESS_READER_BITS); - - signal SrcIPv4Address_Reader_rst : std_logic; - signal SrcIPv4Address_Reader_en : std_logic; - signal SrcIPv4Address_Reader_us : unsigned(IPV4_ADDRESS_READER_BITS - 1 downto 0) := to_unsigned(IPV4_ADDRESS_LENGTH - 1, IPV4_ADDRESS_READER_BITS); - signal DestIPv4Address_Reader_rst : std_logic; - signal DestIPv4Address_Reader_en : std_logic; - signal DestIPv4Address_Reader_us : unsigned(IPV4_ADDRESS_READER_BITS - 1 downto 0) := to_unsigned(IPV4_ADDRESS_LENGTH - 1, IPV4_ADDRESS_READER_BITS); + signal HeaderLength_en : std_logic; + signal TypeOfService_en : std_logic; + signal TotalLength_en0 : std_logic; + signal TotalLength_en1 : std_logic; +-- signal Identification_en0 : STD_LOGIC; +-- signal Identification_en1 : STD_LOGIC; + signal Flags_en : std_logic; +-- signal FragmentOffset_en0 : STD_LOGIC; +-- signal FragmentOffset_en1 : STD_LOGIC; + signal TimeToLive_en : std_logic; + signal Protocol_en : std_logic; + signal HeaderChecksum_en0 : std_logic; + signal HeaderChecksum_en1 : std_logic; + signal SourceIPv4Address_en : std_logic; + signal DestIPv4Address_en : std_logic; + + signal HeaderLength_d : T_SLV_4 := (others => '0'); + signal TypeOfService_d : T_SLV_8 := (others => '0'); + signal TotalLength_d : T_SLV_16 := (others => '0'); +-- signal Identification_d : T_SLV_16 := (others => '0'); + signal Flag_DontFragment_d : std_logic := '0'; + signal Flag_MoreFragmenta_d : std_logic := '0'; +-- signal FragmentOffset_d : STD_LOGIC_VECTOR(12 downto 0) := (others => '0'); + signal TimeToLive_d : T_SLV_8 := (others => '0'); + signal Protocol_d : T_SLV_8 := (others => '0'); + signal HeaderChecksum_d : T_SLV_16 := (others => '0'); + signal SourceIPv4Address_d : T_NET_IPV4_ADDRESS := (others => (others => '0')); + signal DestIPv4Address_d : T_NET_IPV4_ADDRESS := (others => (others => '0')); + + constant IPV4_ADDRESS_LENGTH : positive := 4; -- IPv4 -> 4 bytes + constant IPV4_ADDRESS_READER_BITS : positive := log2ceilnz(IPV4_ADDRESS_LENGTH); + + signal IPv4SeqCounter_rst : std_logic; + signal IPv4SeqCounter_en : std_logic; + signal IPv4SeqCounter_us : unsigned(IPV4_ADDRESS_READER_BITS - 1 downto 0) := to_unsigned(IPV4_ADDRESS_LENGTH - 1, IPV4_ADDRESS_READER_BITS); + + signal SrcIPv4Address_Reader_rst : std_logic; + signal SrcIPv4Address_Reader_en : std_logic; + signal SrcIPv4Address_Reader_us : unsigned(IPV4_ADDRESS_READER_BITS - 1 downto 0) := to_unsigned(IPV4_ADDRESS_LENGTH - 1, IPV4_ADDRESS_READER_BITS); + signal DestIPv4Address_Reader_rst : std_logic; + signal DestIPv4Address_Reader_en : std_logic; + signal DestIPv4Address_Reader_us : unsigned(IPV4_ADDRESS_READER_BITS - 1 downto 0) := to_unsigned(IPV4_ADDRESS_LENGTH - 1, IPV4_ADDRESS_READER_BITS); begin - In_Ack <= In_Ack_i; - Is_DataFlow <= In_Valid and In_Ack_i; - Is_SOF <= In_Valid and In_SOF; - Is_EOF <= In_Valid and In_EOF; + In_Ack <= In_Ack_i; + Is_DataFlow <= In_Valid and In_Ack_i; + Is_SOF <= In_Valid and In_SOF; + Is_EOF <= In_Valid and In_EOF; process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; process(State, Is_DataFlow, Is_SOF, Is_EOF, In_Valid, In_Data, In_EOF, IPv4SeqCounter_us, Out_Ack) begin - NextState <= State; + NextState <= State; - Error <= '0'; + Error <= '0'; - In_Ack_i <= '0'; - Out_Valid_i <= '0'; - Out_SOF_i <= '0'; - Out_EOF_i <= In_EOF; + In_Ack_i <= '0'; + Out_Valid_i <= '0'; + Out_SOF_i <= '0'; + Out_EOF_i <= In_EOF; - IPv4SeqCounter_rst <= '0'; - IPv4SeqCounter_en <= '0'; + IPv4SeqCounter_rst <= '0'; + IPv4SeqCounter_en <= '0'; -- IPv4 Basic Header - Register_rst <= '0'; - HeaderLength_en <= '0'; - TypeOfService_en <= '0'; - TotalLength_en0 <= '0'; - TotalLength_en1 <= '0'; --- Identification_en0 <= '0'; --- Identification_en1 <= '0'; - Flags_en <= '0'; --- FragmentOffset_en0 <= '0'; --- FragmentOffset_en1 <= '0'; - TimeToLive_en <= '0'; - Protocol_en <= '0'; - HeaderChecksum_en0 <= '0'; - HeaderChecksum_en1 <= '0'; - SourceIPv4Address_en <= '0'; - DestIPv4Address_en <= '0'; + Register_rst <= '0'; + HeaderLength_en <= '0'; + TypeOfService_en <= '0'; + TotalLength_en0 <= '0'; + TotalLength_en1 <= '0'; +-- Identification_en0 <= '0'; +-- Identification_en1 <= '0'; + Flags_en <= '0'; +-- FragmentOffset_en0 <= '0'; +-- FragmentOffset_en1 <= '0'; + TimeToLive_en <= '0'; + Protocol_en <= '0'; + HeaderChecksum_en0 <= '0'; + HeaderChecksum_en1 <= '0'; + SourceIPv4Address_en <= '0'; + DestIPv4Address_en <= '0'; case State is when ST_IDLE => if (Is_SOF = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then if (In_Data(3 downto 0) = x"4") then - HeaderLength_en <= '1'; - NextState <= ST_RECEIVE_TYPE_OF_SERVICE; + HeaderLength_en <= '1'; + NextState <= ST_RECEIVE_TYPE_OF_SERVICE; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else -- EOF - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_TYPE_OF_SERVICE => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - TypeOfService_en <= '1'; - NextState <= ST_RECEIVE_TOTAL_LENGTH_0; + TypeOfService_en <= '1'; + NextState <= ST_RECEIVE_TOTAL_LENGTH_0; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_TOTAL_LENGTH_0 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - TotalLength_en0 <= '1'; - NextState <= ST_RECEIVE_TOTAL_LENGTH_1; + TotalLength_en0 <= '1'; + NextState <= ST_RECEIVE_TOTAL_LENGTH_1; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_TOTAL_LENGTH_1 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - TotalLength_en1 <= '1'; - NextState <= ST_RECEIVE_IDENTIFICATION_0; + TotalLength_en1 <= '1'; + NextState <= ST_RECEIVE_IDENTIFICATION_0; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_IDENTIFICATION_0 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then --- Identification_en0 <= '1'; - NextState <= ST_RECEIVE_IDENTIFICATION_1; +-- Identification_en0 <= '1'; + NextState <= ST_RECEIVE_IDENTIFICATION_1; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_IDENTIFICATION_1 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then --- Identification_en1 <= '1'; - NextState <= ST_RECEIVE_FLAGS; +-- Identification_en1 <= '1'; + NextState <= ST_RECEIVE_FLAGS; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_FLAGS => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - Flags_en <= '1'; --- FragmentOffset_en0 <= '1'; - NextState <= ST_RECEIVE_FRAGMENT_OFFSET_1; + Flags_en <= '1'; +-- FragmentOffset_en0 <= '1'; + NextState <= ST_RECEIVE_FRAGMENT_OFFSET_1; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_FRAGMENT_OFFSET_1 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then --- FragmentOffset_en1 <= '1'; - NextState <= ST_RECEIVE_TIME_TO_LIVE; +-- FragmentOffset_en1 <= '1'; + NextState <= ST_RECEIVE_TIME_TO_LIVE; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_TIME_TO_LIVE => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - TimeToLive_en <= '1'; - NextState <= ST_RECEIVE_PROTOCOL; + TimeToLive_en <= '1'; + NextState <= ST_RECEIVE_PROTOCOL; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_PROTOCOL => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - Protocol_en <= '1'; - NextState <= ST_RECEIVE_HEADER_CHECKSUM_0; + Protocol_en <= '1'; + NextState <= ST_RECEIVE_HEADER_CHECKSUM_0; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_HEADER_CHECKSUM_0 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - HeaderChecksum_en0 <= '1'; - NextState <= ST_RECEIVE_HEADER_CHECKSUM_1; + HeaderChecksum_en0 <= '1'; + NextState <= ST_RECEIVE_HEADER_CHECKSUM_1; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_HEADER_CHECKSUM_1 => - IPv4SeqCounter_rst <= '1'; + IPv4SeqCounter_rst <= '1'; if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - HeaderChecksum_en1 <= '1'; - NextState <= ST_RECEIVE_SOURCE_ADDRESS; + HeaderChecksum_en1 <= '1'; + NextState <= ST_RECEIVE_SOURCE_ADDRESS; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_SOURCE_ADDRESS => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; - SourceIPv4Address_en <= '1'; - IPv4SeqCounter_en <= '1'; + SourceIPv4Address_en <= '1'; + IPv4SeqCounter_en <= '1'; if (Is_EOF = '0') then if (IPv4SeqCounter_us = 0) then - IPv4SeqCounter_rst <= '1'; - NextState <= ST_RECEIVE_DESTINATION_ADDRESS; + IPv4SeqCounter_rst <= '1'; + NextState <= ST_RECEIVE_DESTINATION_ADDRESS; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_DESTINATION_ADDRESS => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; - DestIPv4Address_en <= '1'; - IPv4SeqCounter_en <= '1'; + DestIPv4Address_en <= '1'; + IPv4SeqCounter_en <= '1'; if (Is_EOF = '0') then if (IPv4SeqCounter_us = 0) then - IPv4SeqCounter_rst <= '1'; - NextState <= ST_RECEIVE_DATA_1; + IPv4SeqCounter_rst <= '1'; + NextState <= ST_RECEIVE_DATA_1; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_DATA_1 => - In_Ack_i <= Out_Ack; - Out_Valid_i <= In_Valid; - Out_SOF_i <= '1'; - Out_EOF_i <= In_EOF; + In_Ack_i <= Out_Ack; + Out_Valid_i <= In_Valid; + Out_SOF_i <= '1'; + Out_EOF_i <= In_EOF; if (Is_DataFlow = '1') then if (Is_EOF = '0') then - NextState <= ST_RECEIVE_DATA_N; + NextState <= ST_RECEIVE_DATA_N; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_RECEIVE_DATA_N => - In_Ack_i <= Out_Ack; - Out_Valid_i <= In_Valid; - Out_EOF_i <= In_EOF; + In_Ack_i <= Out_Ack; + Out_Valid_i <= In_Valid; + Out_EOF_i <= In_EOF; if (Is_EOF = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; when ST_DISCARD_FRAME => - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '1') then - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; when ST_ERROR => - Error <= '1'; - NextState <= ST_IDLE; + Error <= '1'; + NextState <= ST_IDLE; end case; end process; @@ -434,74 +434,74 @@ begin begin if rising_edge(Clock) then if ((Reset or Register_rst) = '1') then - HeaderLength_d <= (others => '0'); - TypeOfService_d <= (others => '0'); - TotalLength_d <= (others => '0'); --- Identification_d <= (others => '0'); - Flag_DontFragment_d <= '0'; - Flag_MoreFragmenta_d <= '0'; --- FragmentOffset_d <= (others => '0'); - TimeToLive_d <= (others => '0'); - Protocol_d <= (others => '0'); - HeaderChecksum_d <= (others => '0'); - SourceIPv4Address_d <= (others => (others => '0')); - DestIPv4Address_d <= (others => (others => '0')); + HeaderLength_d <= (others => '0'); + TypeOfService_d <= (others => '0'); + TotalLength_d <= (others => '0'); +-- Identification_d <= (others => '0'); + Flag_DontFragment_d <= '0'; + Flag_MoreFragmenta_d <= '0'; +-- FragmentOffset_d <= (others => '0'); + TimeToLive_d <= (others => '0'); + Protocol_d <= (others => '0'); + HeaderChecksum_d <= (others => '0'); + SourceIPv4Address_d <= (others => (others => '0')); + DestIPv4Address_d <= (others => (others => '0')); else if (HeaderLength_en = '1') then - HeaderLength_d <= In_Data(3 downto 0); + HeaderLength_d <= In_Data(3 downto 0); end if; if (TypeOfService_en = '1') then - TypeOfService_d <= In_Data; + TypeOfService_d <= In_Data; end if; if (TotalLength_en0 = '1') then - TotalLength_d(15 downto 8) <= In_Data; + TotalLength_d(15 downto 8) <= In_Data; end if; if (TotalLength_en1 = '1') then - TotalLength_d(7 downto 0) <= In_Data; + TotalLength_d(7 downto 0) <= In_Data; end if; --- if (Identification_en0 = '1') then --- Identification_d(15 downto 8) <= In_Data; --- end if; --- if (Identification_en1 = '1') then --- Identification_d(7 downto 0) <= In_Data; --- end if; +-- if (Identification_en0 = '1') then +-- Identification_d(15 downto 8) <= In_Data; +-- end if; +-- if (Identification_en1 = '1') then +-- Identification_d(7 downto 0) <= In_Data; +-- end if; if (Flags_en = '1') then - Flag_DontFragment_d <= In_Data(6); - Flag_MoreFragmenta_d <= In_Data(5); + Flag_DontFragment_d <= In_Data(6); + Flag_MoreFragmenta_d <= In_Data(5); end if; --- if (FragmentOffset_en0 = '1') then --- FragmentOffset_d(12 downto 8) <= In_Data(4 downto 0); --- end if; --- if (FragmentOffset_en1 = '1') then --- FragmentOffset_d(7 downto 0) <= In_Data; --- end if; +-- if (FragmentOffset_en0 = '1') then +-- FragmentOffset_d(12 downto 8) <= In_Data(4 downto 0); +-- end if; +-- if (FragmentOffset_en1 = '1') then +-- FragmentOffset_d(7 downto 0) <= In_Data; +-- end if; if (TimeToLive_en = '1') then - TimeToLive_d <= In_Data; + TimeToLive_d <= In_Data; end if; if (Protocol_en = '1') then - Protocol_d <= In_Data; + Protocol_d <= In_Data; end if; if (HeaderChecksum_en0 = '1') then - HeaderChecksum_d(15 downto 8) <= In_Data; + HeaderChecksum_d(15 downto 8) <= In_Data; end if; if (HeaderChecksum_en1 = '1') then - HeaderChecksum_d(7 downto 0) <= In_Data; + HeaderChecksum_d(7 downto 0) <= In_Data; end if; if (SourceIPv4Address_en = '1') then - SourceIPv4Address_d(to_integer(IPv4SeqCounter_us)) <= In_Data; + SourceIPv4Address_d(to_integer(IPv4SeqCounter_us)) <= In_Data; end if; if (DestIPv4Address_en = '1') then - DestIPv4Address_d(to_integer(IPv4SeqCounter_us)) <= In_Data; + DestIPv4Address_d(to_integer(IPv4SeqCounter_us)) <= In_Data; end if; end if; end if; @@ -511,25 +511,25 @@ begin begin if rising_edge(Clock) then if ((Reset or IPv4SeqCounter_rst) = '1') then - IPv4SeqCounter_us <= to_unsigned(IPV4_ADDRESS_LENGTH - 1, IPV4_ADDRESS_READER_BITS); + IPv4SeqCounter_us <= to_unsigned(IPV4_ADDRESS_LENGTH - 1, IPV4_ADDRESS_READER_BITS); elsif (IPv4SeqCounter_en = '1') then - IPv4SeqCounter_us <= IPv4SeqCounter_us - 1; + IPv4SeqCounter_us <= IPv4SeqCounter_us - 1; end if; end if; end process; - SrcIPv4Address_Reader_rst <= Out_Meta_rst; - SrcIPv4Address_Reader_en <= Out_Meta_SrcIPv4Address_nxt; - DestIPv4Address_Reader_rst <= Out_Meta_rst; - DestIPv4Address_Reader_en <= Out_Meta_DestIPv4Address_nxt; + SrcIPv4Address_Reader_rst <= Out_Meta_rst; + SrcIPv4Address_Reader_en <= Out_Meta_SrcIPv4Address_nxt; + DestIPv4Address_Reader_rst <= Out_Meta_rst; + DestIPv4Address_Reader_en <= Out_Meta_DestIPv4Address_nxt; process(Clock) begin if rising_edge(Clock) then if ((Reset or SrcIPv4Address_Reader_rst) = '1') then - SrcIPv4Address_Reader_us <= to_unsigned(IPV4_ADDRESS_LENGTH - 1, IPV4_ADDRESS_READER_BITS); + SrcIPv4Address_Reader_us <= to_unsigned(IPV4_ADDRESS_LENGTH - 1, IPV4_ADDRESS_READER_BITS); elsif (SrcIPv4Address_Reader_en = '1') then - SrcIPv4Address_Reader_us <= SrcIPv4Address_Reader_us - 1; + SrcIPv4Address_Reader_us <= SrcIPv4Address_Reader_us - 1; end if; end if; end process; @@ -538,27 +538,27 @@ begin begin if rising_edge(Clock) then if ((Reset or DestIPv4Address_Reader_rst) = '1') then - DestIPv4Address_Reader_us <= to_unsigned(IPV4_ADDRESS_LENGTH - 1, IPV4_ADDRESS_READER_BITS); + DestIPv4Address_Reader_us <= to_unsigned(IPV4_ADDRESS_LENGTH - 1, IPV4_ADDRESS_READER_BITS); elsif (DestIPv4Address_Reader_en = '1') then - DestIPv4Address_Reader_us <= DestIPv4Address_Reader_us - 1; + DestIPv4Address_Reader_us <= DestIPv4Address_Reader_us - 1; end if; end if; end process; - In_Meta_rst <= Out_Meta_rst; - In_Meta_SrcMACAddress_nxt <= Out_Meta_SrcMACAddress_nxt; - In_Meta_DestMACAddress_nxt <= Out_Meta_DestMACAddress_nxt; - - Out_Valid <= Out_Valid_i; - Out_Data <= In_Data; - Out_SOF <= Out_SOF_i; - Out_EOF <= Out_EOF_i; - Out_Meta_SrcMACAddress_Data <= In_Meta_SrcMACAddress_Data; - Out_Meta_DestMACAddress_Data <= In_Meta_DestMACAddress_Data; - Out_Meta_EthType <= In_Meta_EthType; - Out_Meta_SrcIPv4Address_Data <= SourceIPv4Address_d(to_integer(SrcIPv4Address_Reader_us)); - Out_Meta_DestIPv4Address_Data <= DestIPv4Address_d(to_integer(DestIPv4Address_Reader_us)); - Out_Meta_Length <= TotalLength_d; - Out_Meta_Protocol <= Protocol_d; + In_Meta_rst <= Out_Meta_rst; + In_Meta_SrcMACAddress_nxt <= Out_Meta_SrcMACAddress_nxt; + In_Meta_DestMACAddress_nxt <= Out_Meta_DestMACAddress_nxt; + + Out_Valid <= Out_Valid_i; + Out_Data <= In_Data; + Out_SOF <= Out_SOF_i; + Out_EOF <= Out_EOF_i; + Out_Meta_SrcMACAddress_Data <= In_Meta_SrcMACAddress_Data; + Out_Meta_DestMACAddress_Data <= In_Meta_DestMACAddress_Data; + Out_Meta_EthType <= In_Meta_EthType; + Out_Meta_SrcIPv4Address_Data <= SourceIPv4Address_d(to_integer(SrcIPv4Address_Reader_us)); + Out_Meta_DestIPv4Address_Data <= DestIPv4Address_d(to_integer(DestIPv4Address_Reader_us)); + Out_Meta_Length <= TotalLength_d; + Out_Meta_Protocol <= Protocol_d; end architecture; diff --git a/src/net/ipv4/ipv4_TX.vhdl b/src/net/ipv4/ipv4_TX.vhdl index a0d2b9714..ef5903e2d 100644 --- a/src/net/ipv4/ipv4_TX.vhdl +++ b/src/net/ipv4/ipv4_TX.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,133 +37,133 @@ use work.net.all; entity ipv4_TX is generic ( - DEBUG : boolean := FALSE + DEBUG : boolean := FALSE ); port ( - Clock : in std_logic; -- - Reset : in std_logic; -- + Clock : in std_logic; -- + Reset : in std_logic; -- -- IN port - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - In_Meta_rst : out std_logic; - In_Meta_SrcIPv4Address_nxt : out std_logic; - In_Meta_SrcIPv4Address_Data : in T_SLV_8; - In_Meta_DestIPv4Address_nxt : out std_logic; - In_Meta_DestIPv4Address_Data : in T_SLV_8; - In_Meta_Length : in T_SLV_16; - In_Meta_Protocol : in T_SLV_8; + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + In_Meta_rst : out std_logic; + In_Meta_SrcIPv4Address_nxt : out std_logic; + In_Meta_SrcIPv4Address_Data : in T_SLV_8; + In_Meta_DestIPv4Address_nxt : out std_logic; + In_Meta_DestIPv4Address_Data : in T_SLV_8; + In_Meta_Length : in T_SLV_16; + In_Meta_Protocol : in T_SLV_8; -- ARP port - ARP_IPCache_Query : out std_logic; - ARP_IPCache_IPv4Address_rst : in std_logic; - ARP_IPCache_IPv4Address_nxt : in std_logic; - ARP_IPCache_IPv4Address_Data : out T_SLV_8; - ARP_IPCache_Valid : in std_logic; - ARP_IPCache_MACAddress_rst : out std_logic; - ARP_IPCache_MACAddress_nxt : out std_logic; - ARP_IPCache_MACAddress_Data : in T_SLV_8; + ARP_IPCache_Query : out std_logic; + ARP_IPCache_IPv4Address_rst : in std_logic; + ARP_IPCache_IPv4Address_nxt : in std_logic; + ARP_IPCache_IPv4Address_Data : out T_SLV_8; + ARP_IPCache_Valid : in std_logic; + ARP_IPCache_MACAddress_rst : out std_logic; + ARP_IPCache_MACAddress_nxt : out std_logic; + ARP_IPCache_MACAddress_Data : in T_SLV_8; -- OUT port - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic; - Out_Meta_rst : in std_logic; - Out_Meta_DestMACAddress_nxt : in std_logic; - Out_Meta_DestMACAddress_Data : out T_SLV_8 + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic; + Out_Meta_rst : in std_logic; + Out_Meta_DestMACAddress_nxt : in std_logic; + Out_Meta_DestMACAddress_Data : out T_SLV_8 ); end entity; architecture rtl of ipv4_TX is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; type T_STATE is ( ST_IDLE, - ST_ARP_QUERY, ST_ARP_QUERY_WAIT, + ST_ARP_QUERY, ST_ARP_QUERY_WAIT, ST_CHECKSUM_IPV4_ADDRESSES, - ST_CHECKSUM_IPVERSION_LENGTH_0, ST_CHECKSUM_TYPE_OF_SERVICE_LENGTH_1, - ST_CHECKSUM_IDENTIFICAION_FRAGMENTOFFSET_0, ST_CHECKSUM_IDENTIFICAION_FRAGMENTOFFSET_1, - ST_CHECKSUM_TIME_TO_LIVE, ST_CHECKSUM_PROTOCOL, + ST_CHECKSUM_IPVERSION_LENGTH_0, ST_CHECKSUM_TYPE_OF_SERVICE_LENGTH_1, + ST_CHECKSUM_IDENTIFICAION_FRAGMENTOFFSET_0, ST_CHECKSUM_IDENTIFICAION_FRAGMENTOFFSET_1, + ST_CHECKSUM_TIME_TO_LIVE, ST_CHECKSUM_PROTOCOL, ST_CARRY_0, ST_CARRY_1, - ST_SEND_VERSION, ST_SEND_TYPE_OF_SERVICE, ST_SEND_TOTAL_LENGTH_0, ST_SEND_TOTAL_LENGTH_1, - ST_SEND_IDENTIFICATION_0, ST_SEND_IDENTIFICATION_1, ST_SEND_FLAGS, ST_SEND_FRAGMENT_OFFSET, - ST_SEND_TIME_TO_LIVE, ST_SEND_PROTOCOL, ST_SEND_HEADER_CHECKSUM_0, ST_SEND_HEADER_CHECKSUM_1, + ST_SEND_VERSION, ST_SEND_TYPE_OF_SERVICE, ST_SEND_TOTAL_LENGTH_0, ST_SEND_TOTAL_LENGTH_1, + ST_SEND_IDENTIFICATION_0, ST_SEND_IDENTIFICATION_1, ST_SEND_FLAGS, ST_SEND_FRAGMENT_OFFSET, + ST_SEND_TIME_TO_LIVE, ST_SEND_PROTOCOL, ST_SEND_HEADER_CHECKSUM_0, ST_SEND_HEADER_CHECKSUM_1, ST_SEND_SOURCE_ADDRESS, ST_SEND_DESTINATION_ADDRESS, --- ST_SEND_OPTIONS_0, ST_SEND_OPTIONS_1, ST_SEND_OPTIONS_2, ST_SEND_PADDING, +-- ST_SEND_OPTIONS_0, ST_SEND_OPTIONS_1, ST_SEND_OPTIONS_2, ST_SEND_PADDING, ST_SEND_DATA, ST_DISCARD_FRAME, ST_ERROR ); - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); - - signal In_Ack_i : std_logic; - - signal UpperLayerPacketLength : std_logic_vector(15 downto 0); - - signal InternetHeaderLength : T_SLV_4; - signal TypeOfService : T_NET_IPV4_TYPE_OF_SERVICE; - signal TotalLength : T_SLV_16; - signal Identification : T_SLV_16; - signal Flag_DontFragment : std_logic; - signal Flag_MoreFragments : std_logic; - signal FragmentOffset : std_logic_vector(12 downto 0); - signal TimeToLive : T_SLV_8; - signal Protocol : T_SLV_8; - signal HeaderChecksum : T_SLV_16; - - signal IPv4SeqCounter_rst : std_logic; - signal IPv4SeqCounter_en : std_logic; - signal IPv4SeqCounter_us : unsigned(1 downto 0) := (others => '0'); - - signal Checksum_rst : std_logic; - signal Checksum_en : std_logic; - signal Checksum_Addend0_us : unsigned(T_SLV_8'range); - signal Checksum_Addend1_us : unsigned(T_SLV_8'range); - signal Checksum0_nxt0_us : unsigned(T_SLV_8'high + 1 downto 0); - signal Checksum0_nxt1_us : unsigned(T_SLV_8'high + 1 downto 0); - signal Checksum0_d_us : unsigned(T_SLV_8'high downto 0) := (others => '0'); - signal Checksum0_cy : unsigned(T_SLV_2'range); - signal Checksum1_nxt_us : unsigned(T_SLV_8'range); - signal Checksum1_d_us : unsigned(T_SLV_8'range) := (others => '0'); - signal Checksum0_cy0 : std_logic; - signal Checksum0_cy0_d : std_logic := '0'; - signal Checksum0_cy1 : std_logic; - signal Checksum0_cy1_d : std_logic := '0'; - - signal Checksum_i : T_SLV_16; - signal Checksum : T_SLV_16; - signal Checksum_mux_rst : std_logic; - signal Checksum_mux_set : std_logic; - signal Checksum_mux_r : std_logic := '0'; + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); + + signal In_Ack_i : std_logic; + + signal UpperLayerPacketLength : std_logic_vector(15 downto 0); + + signal InternetHeaderLength : T_SLV_4; + signal TypeOfService : T_NET_IPV4_TYPE_OF_SERVICE; + signal TotalLength : T_SLV_16; + signal Identification : T_SLV_16; + signal Flag_DontFragment : std_logic; + signal Flag_MoreFragments : std_logic; + signal FragmentOffset : std_logic_vector(12 downto 0); + signal TimeToLive : T_SLV_8; + signal Protocol : T_SLV_8; + signal HeaderChecksum : T_SLV_16; + + signal IPv4SeqCounter_rst : std_logic; + signal IPv4SeqCounter_en : std_logic; + signal IPv4SeqCounter_us : unsigned(1 downto 0) := (others => '0'); + + signal Checksum_rst : std_logic; + signal Checksum_en : std_logic; + signal Checksum_Addend0_us : unsigned(T_SLV_8'range); + signal Checksum_Addend1_us : unsigned(T_SLV_8'range); + signal Checksum0_nxt0_us : unsigned(T_SLV_8'high + 1 downto 0); + signal Checksum0_nxt1_us : unsigned(T_SLV_8'high + 1 downto 0); + signal Checksum0_d_us : unsigned(T_SLV_8'high downto 0) := (others => '0'); + signal Checksum0_cy : unsigned(T_SLV_2'range); + signal Checksum1_nxt_us : unsigned(T_SLV_8'range); + signal Checksum1_d_us : unsigned(T_SLV_8'range) := (others => '0'); + signal Checksum0_cy0 : std_logic; + signal Checksum0_cy0_d : std_logic := '0'; + signal Checksum0_cy1 : std_logic; + signal Checksum0_cy1_d : std_logic := '0'; + + signal Checksum_i : T_SLV_16; + signal Checksum : T_SLV_16; + signal Checksum_mux_rst : std_logic; + signal Checksum_mux_set : std_logic; + signal Checksum_mux_r : std_logic := '0'; begin - UpperLayerPacketLength <= std_logic_vector(unsigned(In_Meta_Length) + 20); + UpperLayerPacketLength <= std_logic_vector(unsigned(In_Meta_Length) + 20); - InternetHeaderLength <= x"5"; -- standard IPv4 header length withou option fields (20 bytes -> 5 * 32-words) - TypeOfService <= C_NET_IPV4_TOS_DEFAULT; -- Type of Service: routine, normal delay, normal throughput, normal relibility - TotalLength <= UpperLayerPacketLength; - Identification <= x"0000"; - Flag_DontFragment <= '0'; - Flag_MoreFragments <= '0'; - FragmentOffset <= (others => '0'); - TimeToLive <= x"40"; -- TTL = 64; see RFC 791 - Protocol <= In_Meta_Protocol; + InternetHeaderLength <= x"5"; -- standard IPv4 header length withou option fields (20 bytes -> 5 * 32-words) + TypeOfService <= C_NET_IPV4_TOS_DEFAULT; -- Type of Service: routine, normal delay, normal throughput, normal relibility + TotalLength <= UpperLayerPacketLength; + Identification <= x"0000"; + Flag_DontFragment <= '0'; + Flag_MoreFragments <= '0'; + FragmentOffset <= (others => '0'); + TimeToLive <= x"40"; -- TTL = 64; see RFC 791 + Protocol <= In_Meta_Protocol; process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; @@ -177,311 +177,311 @@ begin Identification, FragmentOffset, TimeToLive, Protocol, IPv4SeqCounter_us, Checksum0_cy, Checksum) begin - NextState <= State; + NextState <= State; - In_Ack_i <= '0'; + In_Ack_i <= '0'; - Out_Valid <= '0'; - Out_Data <= (others => '0'); - Out_SOF <= '0'; - Out_EOF <= '0'; + Out_Valid <= '0'; + Out_Data <= (others => '0'); + Out_SOF <= '0'; + Out_EOF <= '0'; - In_Meta_rst <= '0'; + In_Meta_rst <= '0'; - ARP_IPCache_Query <= '0'; - In_Meta_SrcIPv4Address_nxt <= '0'; - In_Meta_DestIPv4Address_nxt <= '0'; - ARP_IPCache_IPv4Address_Data <= In_Meta_DestIPv4Address_Data; + ARP_IPCache_Query <= '0'; + In_Meta_SrcIPv4Address_nxt <= '0'; + In_Meta_DestIPv4Address_nxt <= '0'; + ARP_IPCache_IPv4Address_Data <= In_Meta_DestIPv4Address_Data; - ARP_IPCache_MACAddress_rst <= Out_Meta_rst; - ARP_IPCache_MACAddress_nxt <= Out_Meta_DestMACAddress_nxt; - Out_Meta_DestMACAddress_Data <= ARP_IPCache_MACAddress_Data; + ARP_IPCache_MACAddress_rst <= Out_Meta_rst; + ARP_IPCache_MACAddress_nxt <= Out_Meta_DestMACAddress_nxt; + Out_Meta_DestMACAddress_Data <= ARP_IPCache_MACAddress_Data; - IPv4SeqCounter_rst <= '0'; - IPv4SeqCounter_en <= '0'; + IPv4SeqCounter_rst <= '0'; + IPv4SeqCounter_en <= '0'; - Checksum_rst <= '0'; - Checksum_en <= '0'; - Checksum_Addend0_us <= (others => '0'); - Checksum_Addend1_us <= (others => '0'); - Checksum_mux_rst <= '0'; - Checksum_mux_set <= '0'; + Checksum_rst <= '0'; + Checksum_en <= '0'; + Checksum_Addend0_us <= (others => '0'); + Checksum_Addend1_us <= (others => '0'); + Checksum_mux_rst <= '0'; + Checksum_mux_set <= '0'; case State is when ST_IDLE => - In_Meta_rst <= ARP_IPCache_IPv4Address_rst; - In_Meta_DestIPv4Address_nxt <= ARP_IPCache_IPv4Address_nxt; + In_Meta_rst <= ARP_IPCache_IPv4Address_rst; + In_Meta_DestIPv4Address_nxt <= ARP_IPCache_IPv4Address_nxt; - IPv4SeqCounter_rst <= '1'; - Checksum_rst <= '1'; + IPv4SeqCounter_rst <= '1'; + Checksum_rst <= '1'; if ((In_Valid and In_SOF) = '1') then - NextState <= ST_ARP_QUERY; + NextState <= ST_ARP_QUERY; end if; when ST_ARP_QUERY => - Out_Data <= x"4" & InternetHeaderLength; - Out_SOF <= '1'; + Out_Data <= x"4" & InternetHeaderLength; + Out_SOF <= '1'; - In_Meta_rst <= ARP_IPCache_IPv4Address_rst; - In_Meta_DestIPv4Address_nxt <= ARP_IPCache_IPv4Address_nxt; + In_Meta_rst <= ARP_IPCache_IPv4Address_rst; + In_Meta_DestIPv4Address_nxt <= ARP_IPCache_IPv4Address_nxt; - ARP_IPCache_Query <= '1'; + ARP_IPCache_Query <= '1'; if (ARP_IPCache_Valid = '1') then - Out_Valid <= '1'; - In_Meta_rst <= '1'; -- reset metadata - --- if (Out_Ack = '1') then --- NextState <= ST_SEND_TYPE_OF_SERVICE; --- else --- NextState <= ST_SEND_VERSION; --- end if; - NextState <= ST_CHECKSUM_IPV4_ADDRESSES; + Out_Valid <= '1'; + In_Meta_rst <= '1'; -- reset metadata + +-- if (Out_Ack = '1') then +-- NextState <= ST_SEND_TYPE_OF_SERVICE; +-- else +-- NextState <= ST_SEND_VERSION; +-- end if; + NextState <= ST_CHECKSUM_IPV4_ADDRESSES; else - NextState <= ST_ARP_QUERY_WAIT; + NextState <= ST_ARP_QUERY_WAIT; end if; when ST_ARP_QUERY_WAIT => - Out_Valid <= '0'; - Out_Data <= x"4" & InternetHeaderLength; - Out_SOF <= '1'; + Out_Valid <= '0'; + Out_Data <= x"4" & InternetHeaderLength; + Out_SOF <= '1'; - In_Meta_rst <= ARP_IPCache_IPv4Address_rst; - In_Meta_DestIPv4Address_nxt <= ARP_IPCache_IPv4Address_nxt; + In_Meta_rst <= ARP_IPCache_IPv4Address_rst; + In_Meta_DestIPv4Address_nxt <= ARP_IPCache_IPv4Address_nxt; if (ARP_IPCache_Valid = '1') then - Out_Valid <= '1'; - In_Meta_rst <= '1'; -- reset metadata - --- if (Out_Ack = '1') then --- NextState <= ST_SEND_TYPE_OF_SERVICE; --- else --- NextState <= ST_SEND_VERSION; --- end if; - NextState <= ST_CHECKSUM_IPV4_ADDRESSES; + Out_Valid <= '1'; + In_Meta_rst <= '1'; -- reset metadata + +-- if (Out_Ack = '1') then +-- NextState <= ST_SEND_TYPE_OF_SERVICE; +-- else +-- NextState <= ST_SEND_VERSION; +-- end if; + NextState <= ST_CHECKSUM_IPV4_ADDRESSES; end if; -- calculate checksum for IPv4 header -- ---------------------------------------------------------------------- when ST_CHECKSUM_IPV4_ADDRESSES => - In_Meta_SrcIPv4Address_nxt <= '1'; - In_Meta_DestIPv4Address_nxt <= '1'; + In_Meta_SrcIPv4Address_nxt <= '1'; + In_Meta_DestIPv4Address_nxt <= '1'; - IPv4SeqCounter_en <= '1'; - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(In_Meta_SrcIPv4Address_Data); - Checksum_Addend1_us <= unsigned(In_Meta_DestIPv4Address_Data); + IPv4SeqCounter_en <= '1'; + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(In_Meta_SrcIPv4Address_Data); + Checksum_Addend1_us <= unsigned(In_Meta_DestIPv4Address_Data); if (IPv4SeqCounter_us = 3) then - NextState <= ST_CHECKSUM_IPVERSION_LENGTH_0; + NextState <= ST_CHECKSUM_IPVERSION_LENGTH_0; end if; when ST_CHECKSUM_IPVERSION_LENGTH_0 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(15 downto 8)); - Checksum_Addend1_us <= unsigned(std_logic_vector'(x"4" & InternetHeaderLength)); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(15 downto 8)); + Checksum_Addend1_us <= unsigned(std_logic_vector'(x"4" & InternetHeaderLength)); - NextState <= ST_CHECKSUM_TYPE_OF_SERVICE_LENGTH_1; + NextState <= ST_CHECKSUM_TYPE_OF_SERVICE_LENGTH_1; when ST_CHECKSUM_TYPE_OF_SERVICE_LENGTH_1 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(7 downto 0)); - Checksum_Addend1_us <= unsigned(to_slv(TypeOfService)); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(7 downto 0)); + Checksum_Addend1_us <= unsigned(to_slv(TypeOfService)); - NextState <= ST_CHECKSUM_IDENTIFICAION_FRAGMENTOFFSET_0; + NextState <= ST_CHECKSUM_IDENTIFICAION_FRAGMENTOFFSET_0; when ST_CHECKSUM_IDENTIFICAION_FRAGMENTOFFSET_0 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(Identification(15 downto 8)); - Checksum_Addend1_us <= unsigned(std_logic_vector'('0' & Flag_DontFragment & Flag_MoreFragments & FragmentOffset(12 downto 8))); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(Identification(15 downto 8)); + Checksum_Addend1_us <= unsigned(std_logic_vector'('0' & Flag_DontFragment & Flag_MoreFragments & FragmentOffset(12 downto 8))); - NextState <= ST_CHECKSUM_IDENTIFICAION_FRAGMENTOFFSET_1; + NextState <= ST_CHECKSUM_IDENTIFICAION_FRAGMENTOFFSET_1; when ST_CHECKSUM_IDENTIFICAION_FRAGMENTOFFSET_1 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(Identification(7 downto 0)); - Checksum_Addend1_us <= unsigned(FragmentOffset(7 downto 0)); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(Identification(7 downto 0)); + Checksum_Addend1_us <= unsigned(FragmentOffset(7 downto 0)); - NextState <= ST_CHECKSUM_TIME_TO_LIVE; + NextState <= ST_CHECKSUM_TIME_TO_LIVE; when ST_CHECKSUM_TIME_TO_LIVE => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(TimeToLive); - Checksum_Addend1_us <= (others => '0'); --unsigned(In_Meta_Checksum(15 downto 8)); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(TimeToLive); + Checksum_Addend1_us <= (others => '0'); --unsigned(In_Meta_Checksum(15 downto 8)); - NextState <= ST_CHECKSUM_PROTOCOL; + NextState <= ST_CHECKSUM_PROTOCOL; when ST_CHECKSUM_PROTOCOL => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(Protocol); - Checksum_Addend1_us <= (others => '0'); --unsigned(In_Meta_Checksum(7 downto 0)); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(Protocol); + Checksum_Addend1_us <= (others => '0'); --unsigned(In_Meta_Checksum(7 downto 0)); if (Checksum0_cy = "00") then - NextState <= ST_SEND_VERSION; + NextState <= ST_SEND_VERSION; else - NextState <= ST_CARRY_0; + NextState <= ST_CARRY_0; end if; -- circulate carry bit -- ---------------------------------------------------------------------- when ST_CARRY_0 => - In_Meta_rst <= Out_Meta_rst; + In_Meta_rst <= Out_Meta_rst; - Checksum_en <= '1'; - Checksum_mux_set <= '1'; + Checksum_en <= '1'; + Checksum_mux_set <= '1'; if (Checksum0_cy = "00") then - NextState <= ST_SEND_VERSION; + NextState <= ST_SEND_VERSION; else - NextState <= ST_CARRY_1; + NextState <= ST_CARRY_1; end if; when ST_CARRY_1 => - In_Meta_rst <= Out_Meta_rst; + In_Meta_rst <= Out_Meta_rst; - Checksum_en <= '1'; - Checksum_mux_rst <= '1'; + Checksum_en <= '1'; + Checksum_mux_rst <= '1'; - NextState <= ST_SEND_VERSION; + NextState <= ST_SEND_VERSION; -- assamble header -- ---------------------------------------------------------------------- when ST_SEND_VERSION => - Out_Valid <= '1'; - Out_Data <= x"4" & InternetHeaderLength; - Out_SOF <= '1'; + Out_Valid <= '1'; + Out_Data <= x"4" & InternetHeaderLength; + Out_SOF <= '1'; - if (Out_Ack = '1') then - NextState <= ST_SEND_TYPE_OF_SERVICE; + if (Out_Ack = '1') then + NextState <= ST_SEND_TYPE_OF_SERVICE; end if; when ST_SEND_TYPE_OF_SERVICE => - Out_Valid <= '1'; - Out_Data <= to_slv(TypeOfService); + Out_Valid <= '1'; + Out_Data <= to_slv(TypeOfService); - if (Out_Ack = '1') then - NextState <= ST_SEND_TOTAL_LENGTH_0; + if (Out_Ack = '1') then + NextState <= ST_SEND_TOTAL_LENGTH_0; end if; when ST_SEND_TOTAL_LENGTH_0 => - Out_Valid <= '1'; - Out_Data <= std_logic_vector(TotalLength(15 downto 8)); + Out_Valid <= '1'; + Out_Data <= std_logic_vector(TotalLength(15 downto 8)); - if (Out_Ack = '1') then - NextState <= ST_SEND_TOTAL_LENGTH_1; + if (Out_Ack = '1') then + NextState <= ST_SEND_TOTAL_LENGTH_1; end if; when ST_SEND_TOTAL_LENGTH_1 => - Out_Valid <= '1'; - Out_Data <= std_logic_vector(TotalLength(7 downto 0)); + Out_Valid <= '1'; + Out_Data <= std_logic_vector(TotalLength(7 downto 0)); - if (Out_Ack = '1') then - NextState <= ST_SEND_IDENTIFICATION_0; + if (Out_Ack = '1') then + NextState <= ST_SEND_IDENTIFICATION_0; end if; when ST_SEND_IDENTIFICATION_0 => - Out_Valid <= '1'; - Out_Data <= Identification(15 downto 8); + Out_Valid <= '1'; + Out_Data <= Identification(15 downto 8); - if (Out_Ack = '1') then - NextState <= ST_SEND_IDENTIFICATION_1; + if (Out_Ack = '1') then + NextState <= ST_SEND_IDENTIFICATION_1; end if; when ST_SEND_IDENTIFICATION_1 => - Out_Valid <= '1'; - Out_Data <= Identification(7 downto 0); + Out_Valid <= '1'; + Out_Data <= Identification(7 downto 0); - if (Out_Ack = '1') then - NextState <= ST_SEND_FLAGS; + if (Out_Ack = '1') then + NextState <= ST_SEND_FLAGS; end if; when ST_SEND_FLAGS => - Out_Valid <= '1'; - Out_Data(7) <= '0'; - Out_Data(6) <= Flag_DontFragment; - Out_Data(5) <= Flag_MoreFragments; - Out_Data(4 downto 0) <= FragmentOffset(12 downto 8); - - if (Out_Ack = '1') then - NextState <= ST_SEND_FRAGMENT_OFFSET; + Out_Valid <= '1'; + Out_Data(7) <= '0'; + Out_Data(6) <= Flag_DontFragment; + Out_Data(5) <= Flag_MoreFragments; + Out_Data(4 downto 0) <= FragmentOffset(12 downto 8); + + if (Out_Ack = '1') then + NextState <= ST_SEND_FRAGMENT_OFFSET; end if; when ST_SEND_FRAGMENT_OFFSET => - Out_Valid <= '1'; - Out_Data <= FragmentOffset(7 downto 0); + Out_Valid <= '1'; + Out_Data <= FragmentOffset(7 downto 0); - if (Out_Ack = '1') then - NextState <= ST_SEND_TIME_TO_LIVE; + if (Out_Ack = '1') then + NextState <= ST_SEND_TIME_TO_LIVE; end if; when ST_SEND_TIME_TO_LIVE => - Out_Valid <= '1'; - Out_Data <= TimeToLive; + Out_Valid <= '1'; + Out_Data <= TimeToLive; - if (Out_Ack = '1') then - NextState <= ST_SEND_PROTOCOL; + if (Out_Ack = '1') then + NextState <= ST_SEND_PROTOCOL; end if; when ST_SEND_PROTOCOL => - Out_Valid <= '1'; - Out_Data <= Protocol; + Out_Valid <= '1'; + Out_Data <= Protocol; - if (Out_Ack = '1') then - NextState <= ST_SEND_HEADER_CHECKSUM_0; + if (Out_Ack = '1') then + NextState <= ST_SEND_HEADER_CHECKSUM_0; end if; when ST_SEND_HEADER_CHECKSUM_0 => - Out_Valid <= '1'; - Out_Data <= Checksum(15 downto 8); + Out_Valid <= '1'; + Out_Data <= Checksum(15 downto 8); - if (Out_Ack = '1') then - NextState <= ST_SEND_HEADER_CHECKSUM_1; + if (Out_Ack = '1') then + NextState <= ST_SEND_HEADER_CHECKSUM_1; end if; when ST_SEND_HEADER_CHECKSUM_1 => - Out_Valid <= '1'; - Out_Data <= Checksum(7 downto 0); + Out_Valid <= '1'; + Out_Data <= Checksum(7 downto 0); - if (Out_Ack = '1') then - NextState <= ST_SEND_SOURCE_ADDRESS; + if (Out_Ack = '1') then + NextState <= ST_SEND_SOURCE_ADDRESS; end if; when ST_SEND_SOURCE_ADDRESS => - Out_Valid <= '1'; - Out_Data <= In_Meta_SrcIPv4Address_Data; + Out_Valid <= '1'; + Out_Data <= In_Meta_SrcIPv4Address_Data; - if (Out_Ack = '1') then - In_Meta_SrcIPv4Address_nxt <= '1'; - IPv4SeqCounter_en <= '1'; + if (Out_Ack = '1') then + In_Meta_SrcIPv4Address_nxt <= '1'; + IPv4SeqCounter_en <= '1'; if (IPv4SeqCounter_us = 3) then - NextState <= ST_SEND_DESTINATION_ADDRESS; + NextState <= ST_SEND_DESTINATION_ADDRESS; end if; end if; when ST_SEND_DESTINATION_ADDRESS => - Out_Valid <= '1'; - Out_Data <= In_Meta_DestIPv4Address_Data; + Out_Valid <= '1'; + Out_Data <= In_Meta_DestIPv4Address_Data; - if (Out_Ack = '1') then - In_Meta_DestIPv4Address_nxt <= '1'; - IPv4SeqCounter_en <= '1'; + if (Out_Ack = '1') then + In_Meta_DestIPv4Address_nxt <= '1'; + IPv4SeqCounter_en <= '1'; if (IPv4SeqCounter_us = 3) then - NextState <= ST_SEND_DATA; + NextState <= ST_SEND_DATA; end if; end if; when ST_SEND_DATA => - Out_Valid <= In_Valid; - Out_Data <= In_Data; - Out_EOF <= In_EOF; - In_Ack_i <= Out_Ack; + Out_Valid <= In_Valid; + Out_Data <= In_Data; + Out_EOF <= In_EOF; + In_Ack_i <= Out_Ack; if ((In_EOF and Out_Ack) = '1') then - In_Meta_rst <= '1'; - NextState <= ST_IDLE; + In_Meta_rst <= '1'; + NextState <= ST_IDLE; end if; when ST_DISCARD_FRAME => @@ -497,56 +497,56 @@ begin begin if rising_edge(Clock) then if ((Reset or IPv4SeqCounter_rst) = '1') then - IPv4SeqCounter_us <= (others => '0'); + IPv4SeqCounter_us <= (others => '0'); elsif (IPv4SeqCounter_en = '1') then - IPv4SeqCounter_us <= IPv4SeqCounter_us + 1; + IPv4SeqCounter_us <= IPv4SeqCounter_us + 1; end if; end if; end process; -Checksum0_nxt0_us <= ("0" & Checksum1_d_us) +Checksum0_nxt0_us <= ("0" & Checksum1_d_us) + ("0" & Checksum_Addend0_us) + ((Checksum_Addend0_us'range => '0') & Checksum0_cy0_d); - Checksum0_nxt1_us <= ("0" & Checksum0_nxt0_us(Checksum0_nxt0_us'high - 1 downto 0)) + Checksum0_nxt1_us <= ("0" & Checksum0_nxt0_us(Checksum0_nxt0_us'high - 1 downto 0)) + ("0" & Checksum_Addend1_us) + ((Checksum_Addend1_us'range => '0') & Checksum0_cy1_d); - Checksum1_nxt_us <= Checksum0_d_us(Checksum1_d_us'range); + Checksum1_nxt_us <= Checksum0_d_us(Checksum1_d_us'range); - Checksum0_cy0 <= Checksum0_nxt0_us(Checksum0_nxt0_us'high); - Checksum0_cy1 <= Checksum0_nxt1_us(Checksum0_nxt1_us'high); - Checksum0_cy <= Checksum0_cy1 & Checksum0_cy0; + Checksum0_cy0 <= Checksum0_nxt0_us(Checksum0_nxt0_us'high); + Checksum0_cy1 <= Checksum0_nxt1_us(Checksum0_nxt1_us'high); + Checksum0_cy <= Checksum0_cy1 & Checksum0_cy0; process(Clock) begin if rising_edge(Clock) then if (Checksum_rst = '1') then - Checksum0_d_us <= (others => '0'); - Checksum1_d_us <= (others => '0'); + Checksum0_d_us <= (others => '0'); + Checksum1_d_us <= (others => '0'); elsif (Checksum_en = '1') then - Checksum0_d_us <= Checksum0_nxt1_us(Checksum0_nxt1_us'high - 1 downto 0); - Checksum1_d_us <= Checksum1_nxt_us; + Checksum0_d_us <= Checksum0_nxt1_us(Checksum0_nxt1_us'high - 1 downto 0); + Checksum1_d_us <= Checksum1_nxt_us; - Checksum0_cy0_d <= Checksum0_cy0; - Checksum0_cy1_d <= Checksum0_cy1; + Checksum0_cy0_d <= Checksum0_cy0; + Checksum0_cy1_d <= Checksum0_cy1; end if; end if; end process; - Checksum_i <= not (std_logic_vector(Checksum0_nxt1_us(Checksum0_nxt1_us'high - 1 downto 0)) & std_logic_vector(Checksum1_nxt_us)); - Checksum <= ite((Checksum_mux_r = '0'), Checksum_i, swap(Checksum_i, 8)); + Checksum_i <= not (std_logic_vector(Checksum0_nxt1_us(Checksum0_nxt1_us'high - 1 downto 0)) & std_logic_vector(Checksum1_nxt_us)); + Checksum <= ite((Checksum_mux_r = '0'), Checksum_i, swap(Checksum_i, 8)); process(Clock) begin if rising_edge(Clock) then if ((Reset or Checksum_mux_rst) = '1') then - Checksum_mux_r <= '0'; + Checksum_mux_r <= '0'; elsif (Checksum_mux_set = '1') then - Checksum_mux_r <= '1'; + Checksum_mux_r <= '1'; end if; end if; end process; - In_Ack <= In_Ack_i; + In_Ack <= In_Ack_i; end architecture; diff --git a/src/net/ipv4/ipv4_Wrapper.vhdl b/src/net/ipv4/ipv4_Wrapper.vhdl index e09c7e451..8486271ac 100644 --- a/src/net/ipv4/ipv4_Wrapper.vhdl +++ b/src/net/ipv4/ipv4_Wrapper.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,351 +37,351 @@ use work.net.all; entity ipv4_Wrapper is generic ( - DEBUG : boolean := FALSE; - PACKET_TYPES : T_NET_IPV4_PROTOCOL_VECTOR := (0 => x"00") + DEBUG : boolean := FALSE; + PACKET_TYPES : T_NET_IPV4_PROTOCOL_VECTOR := (0 => x"00") ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- to MAC layer - MAC_TX_Valid : out std_logic; - MAC_TX_Data : out T_SLV_8; - MAC_TX_SOF : out std_logic; - MAC_TX_EOF : out std_logic; - MAC_TX_Ack : in std_logic; - MAC_TX_Meta_rst : in std_logic; - MAC_TX_Meta_DestMACAddress_nxt : in std_logic; - MAC_TX_Meta_DestMACAddress_Data : out T_SLV_8; + MAC_TX_Valid : out std_logic; + MAC_TX_Data : out T_SLV_8; + MAC_TX_SOF : out std_logic; + MAC_TX_EOF : out std_logic; + MAC_TX_Ack : in std_logic; + MAC_TX_Meta_rst : in std_logic; + MAC_TX_Meta_DestMACAddress_nxt : in std_logic; + MAC_TX_Meta_DestMACAddress_Data : out T_SLV_8; -- from MAC layer - MAC_RX_Valid : in std_logic; - MAC_RX_Data : in T_SLV_8; - MAC_RX_SOF : in std_logic; - MAC_RX_EOF : in std_logic; - MAC_RX_Ack : out std_logic; - MAC_RX_Meta_rst : out std_logic; - MAC_RX_Meta_SrcMACAddress_nxt : out std_logic; - MAC_RX_Meta_SrcMACAddress_Data : in T_SLV_8; - MAC_RX_Meta_DestMACAddress_nxt : out std_logic; - MAC_RX_Meta_DestMACAddress_Data : in T_SLV_8; - MAC_RX_Meta_EthType : in T_SLV_16; + MAC_RX_Valid : in std_logic; + MAC_RX_Data : in T_SLV_8; + MAC_RX_SOF : in std_logic; + MAC_RX_EOF : in std_logic; + MAC_RX_Ack : out std_logic; + MAC_RX_Meta_rst : out std_logic; + MAC_RX_Meta_SrcMACAddress_nxt : out std_logic; + MAC_RX_Meta_SrcMACAddress_Data : in T_SLV_8; + MAC_RX_Meta_DestMACAddress_nxt : out std_logic; + MAC_RX_Meta_DestMACAddress_Data : in T_SLV_8; + MAC_RX_Meta_EthType : in T_SLV_16; -- to ARP - ARP_IPCache_Query : out std_logic; - ARP_IPCache_IPv4Address_rst : in std_logic; - ARP_IPCache_IPv4Address_nxt : in std_logic; - ARP_IPCache_IPv4Address_Data : out T_SLV_8; + ARP_IPCache_Query : out std_logic; + ARP_IPCache_IPv4Address_rst : in std_logic; + ARP_IPCache_IPv4Address_nxt : in std_logic; + ARP_IPCache_IPv4Address_Data : out T_SLV_8; -- from ARP - ARP_IPCache_Valid : in std_logic; - ARP_IPCache_MACAddress_rst : out std_logic; - ARP_IPCache_MACAddress_nxt : out std_logic; - ARP_IPCache_MACAddress_Data : in T_SLV_8; + ARP_IPCache_Valid : in std_logic; + ARP_IPCache_MACAddress_rst : out std_logic; + ARP_IPCache_MACAddress_nxt : out std_logic; + ARP_IPCache_MACAddress_Data : in T_SLV_8; -- from upper layer - TX_Valid : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - TX_Data : in T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - TX_SOF : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - TX_EOF : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - TX_Ack : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); - TX_Meta_rst : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); - TX_Meta_SrcIPv4Address_nxt : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); - TX_Meta_SrcIPv4Address_Data : in T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - TX_Meta_DestIPv4Address_nxt : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); - TX_Meta_DestIPv4Address_Data : in T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - TX_Meta_Length : in T_SLVV_16(PACKET_TYPES'length - 1 downto 0); + TX_Valid : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + TX_Data : in T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + TX_SOF : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + TX_EOF : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + TX_Ack : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); + TX_Meta_rst : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); + TX_Meta_SrcIPv4Address_nxt : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); + TX_Meta_SrcIPv4Address_Data : in T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + TX_Meta_DestIPv4Address_nxt : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); + TX_Meta_DestIPv4Address_Data : in T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + TX_Meta_Length : in T_SLVV_16(PACKET_TYPES'length - 1 downto 0); -- to upper layer - RX_Valid : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - RX_SOF : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_EOF : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Ack : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Meta_rst : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Meta_SrcMACAddress_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Meta_SrcMACAddress_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - RX_Meta_DestMACAddress_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Meta_DestMACAddress_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - RX_Meta_EthType : out T_SLVV_16(PACKET_TYPES'length - 1 downto 0); - RX_Meta_SrcIPv4Address_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Meta_SrcIPv4Address_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - RX_Meta_DestIPv4Address_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Meta_DestIPv4Address_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - RX_Meta_Length : out T_SLVV_16(PACKET_TYPES'length - 1 downto 0); - RX_Meta_Protocol : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0) + RX_Valid : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + RX_SOF : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_EOF : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Ack : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Meta_rst : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Meta_SrcMACAddress_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Meta_SrcMACAddress_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + RX_Meta_DestMACAddress_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Meta_DestMACAddress_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + RX_Meta_EthType : out T_SLVV_16(PACKET_TYPES'length - 1 downto 0); + RX_Meta_SrcIPv4Address_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Meta_SrcIPv4Address_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + RX_Meta_DestIPv4Address_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Meta_DestIPv4Address_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + RX_Meta_Length : out T_SLVV_16(PACKET_TYPES'length - 1 downto 0); + RX_Meta_Protocol : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0) ); end entity; architecture rtl of ipv4_Wrapper is - constant IPV4_SWITCH_PORTS : positive := PACKET_TYPES'length; - - constant TXSTMMUX_META_STREAMID_SRCADR : natural := 0; - constant TXSTMMUX_META_STREAMID_DESTADR : natural := 1; - constant TXSTMMUX_META_STREAMID_LENGTH : natural := 2; - constant TXSTMMUX_META_STREAMID_PROTOCOL : natural := 3; - - constant TXSTMMUX_META_BITS : T_POSVEC := ( - TXSTMMUX_META_STREAMID_SRCADR => 8, - TXSTMMUX_META_STREAMID_DESTADR => 8, - TXSTMMUX_META_STREAMID_LENGTH => 16, - TXSTMMUX_META_STREAMID_PROTOCOL => 8 + constant IPV4_SWITCH_PORTS : positive := PACKET_TYPES'length; + + constant TXSTMMUX_META_STREAMID_SRCADR : natural := 0; + constant TXSTMMUX_META_STREAMID_DESTADR : natural := 1; + constant TXSTMMUX_META_STREAMID_LENGTH : natural := 2; + constant TXSTMMUX_META_STREAMID_PROTOCOL : natural := 3; + + constant TXSTMMUX_META_BITS : positive_vector := ( + TXSTMMUX_META_STREAMID_SRCADR => 8, + TXSTMMUX_META_STREAMID_DESTADR => 8, + TXSTMMUX_META_STREAMID_LENGTH => 16, + TXSTMMUX_META_STREAMID_PROTOCOL => 8 ); - constant TXSTMMUX_META_RST_BIT : natural := 0; - constant TXSTMMUX_META_SRC_NXT_BIT : natural := 1; - constant TXSTMMUX_META_DEST_NXT_BIT : natural := 2; - - constant TXSTMMUX_META_REV_BITS : natural := 3; - - signal StmMux_In_Valid : std_logic_vector(IPV4_SWITCH_PORTS - 1 downto 0); - signal StmMux_In_Data : T_SLM(IPV4_SWITCH_PORTS - 1 downto 0, T_SLV_8'range) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmMux_In_Meta : T_SLM(IPV4_SWITCH_PORTS - 1 downto 0, isum(TXSTMMUX_META_BITS) - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmMux_In_Meta_rev : T_SLM(IPV4_SWITCH_PORTS - 1 downto 0, TXSTMMUX_META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmMux_In_SOF : std_logic_vector(IPV4_SWITCH_PORTS - 1 downto 0); - signal StmMux_In_EOF : std_logic_vector(IPV4_SWITCH_PORTS - 1 downto 0); - signal StmMux_In_Ack : std_logic_vector(IPV4_SWITCH_PORTS - 1 downto 0); - - signal TX_StmMux_Valid : std_logic; - signal TX_StmMux_Data : T_SLV_8; - signal TX_StmMux_Meta : std_logic_vector(isum(TXSTMMUX_META_BITS) - 1 downto 0); - signal TX_StmMux_Meta_rev : std_logic_vector(TXSTMMUX_META_REV_BITS - 1 downto 0); - signal TX_StmMux_SOF : std_logic; - signal TX_StmMux_EOF : std_logic; - signal TX_StmMux_SrcIPv4Address_Data : T_SLV_8; - signal TX_StmMux_DestIPv4Address_Data : T_SLV_8; - signal TX_StmMux_Length : T_SLV_16; - signal TX_StmMux_Protocol : T_SLV_8; - - signal IPv4_TX_Ack : std_logic; - signal IPv4_TX_Meta_rst : std_logic; - signal IPv4_TX_Meta_SrcIPv4Address_nxt : std_logic; - signal IPv4_TX_Meta_DestIPv4Address_nxt : std_logic; - - signal IPv4_RX_Valid : std_logic; - signal IPv4_RX_Data : T_SLV_8; - signal IPv4_RX_SOF : std_logic; - signal IPv4_RX_EOF : std_logic; - - signal IPv4_RX_Meta_SrcMACAddress_Data : T_SLV_8; - signal IPv4_RX_Meta_DestMACAddress_Data : T_SLV_8; - signal IPv4_RX_Meta_EthType : T_SLV_16; - signal IPv4_RX_Meta_SrcIPv4Address_Data : T_SLV_8; - signal IPv4_RX_Meta_DestIPv4Address_Data : T_SLV_8; - signal IPv4_RX_Meta_Length : T_SLV_16; - signal IPv4_RX_Meta_Protocol : T_SLV_8; - - constant STMDEMUX_META_RST_BIT : natural := 0; - constant STMDEMUX_META_MACSRC_NXT_BIT : natural := 1; - constant STMDEMUX_META_MACDEST_NXT_BIT : natural := 2; - constant STMDEMUX_META_IPV4SRC_NXT_BIT : natural := 3; - constant STMDEMUX_META_IPV4DEST_NXT_BIT : natural := 4; - - constant STMDEMUX_META_STREAMID_SRCMAC : natural := 0; - constant STMDEMUX_META_STREAMID_DESTMAC : natural := 1; - constant STMDEMUX_META_STREAMID_ETHTYPE : natural := 2; - constant STMDEMUX_META_STREAMID_SRCIP : natural := 3; - constant STMDEMUX_META_STREAMID_DESTIP : natural := 4; - constant STMDEMUX_META_STREAMID_LENGTH : natural := 5; - constant STMDEMUX_META_STREAMID_PROTO : natural := 6; - - constant STMDEMUX_DATA_BITS : natural := 8; -- - constant STMDEMUX_META_BITS : T_POSVEC := ( - STMDEMUX_META_STREAMID_SRCMAC => 8, - STMDEMUX_META_STREAMID_DESTMAC => 8, - STMDEMUX_META_STREAMID_ETHTYPE => 16, - STMDEMUX_META_STREAMID_SRCIP => 8, - STMDEMUX_META_STREAMID_DESTIP => 8, - STMDEMUX_META_STREAMID_LENGTH => 16, - STMDEMUX_META_STREAMID_PROTO => 8 + constant TXSTMMUX_META_RST_BIT : natural := 0; + constant TXSTMMUX_META_SRC_NXT_BIT : natural := 1; + constant TXSTMMUX_META_DEST_NXT_BIT : natural := 2; + + constant TXSTMMUX_META_REV_BITS : natural := 3; + + signal StmMux_In_Valid : std_logic_vector(IPV4_SWITCH_PORTS - 1 downto 0); + signal StmMux_In_Data : T_SLM(IPV4_SWITCH_PORTS - 1 downto 0, T_SLV_8'range) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal StmMux_In_Meta : T_SLM(IPV4_SWITCH_PORTS - 1 downto 0, isum(TXSTMMUX_META_BITS) - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal StmMux_In_Meta_rev : T_SLM(IPV4_SWITCH_PORTS - 1 downto 0, TXSTMMUX_META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal StmMux_In_SOF : std_logic_vector(IPV4_SWITCH_PORTS - 1 downto 0); + signal StmMux_In_EOF : std_logic_vector(IPV4_SWITCH_PORTS - 1 downto 0); + signal StmMux_In_Ack : std_logic_vector(IPV4_SWITCH_PORTS - 1 downto 0); + + signal TX_StmMux_Valid : std_logic; + signal TX_StmMux_Data : T_SLV_8; + signal TX_StmMux_Meta : std_logic_vector(isum(TXSTMMUX_META_BITS) - 1 downto 0); + signal TX_StmMux_Meta_rev : std_logic_vector(TXSTMMUX_META_REV_BITS - 1 downto 0); + signal TX_StmMux_SOF : std_logic; + signal TX_StmMux_EOF : std_logic; + signal TX_StmMux_SrcIPv4Address_Data : T_SLV_8; + signal TX_StmMux_DestIPv4Address_Data : T_SLV_8; + signal TX_StmMux_Length : T_SLV_16; + signal TX_StmMux_Protocol : T_SLV_8; + + signal IPv4_TX_Ack : std_logic; + signal IPv4_TX_Meta_rst : std_logic; + signal IPv4_TX_Meta_SrcIPv4Address_nxt : std_logic; + signal IPv4_TX_Meta_DestIPv4Address_nxt : std_logic; + + signal IPv4_RX_Valid : std_logic; + signal IPv4_RX_Data : T_SLV_8; + signal IPv4_RX_SOF : std_logic; + signal IPv4_RX_EOF : std_logic; + + signal IPv4_RX_Meta_SrcMACAddress_Data : T_SLV_8; + signal IPv4_RX_Meta_DestMACAddress_Data : T_SLV_8; + signal IPv4_RX_Meta_EthType : T_SLV_16; + signal IPv4_RX_Meta_SrcIPv4Address_Data : T_SLV_8; + signal IPv4_RX_Meta_DestIPv4Address_Data : T_SLV_8; + signal IPv4_RX_Meta_Length : T_SLV_16; + signal IPv4_RX_Meta_Protocol : T_SLV_8; + + constant STMDEMUX_META_RST_BIT : natural := 0; + constant STMDEMUX_META_MACSRC_NXT_BIT : natural := 1; + constant STMDEMUX_META_MACDEST_NXT_BIT : natural := 2; + constant STMDEMUX_META_IPV4SRC_NXT_BIT : natural := 3; + constant STMDEMUX_META_IPV4DEST_NXT_BIT : natural := 4; + + constant STMDEMUX_META_STREAMID_SRCMAC : natural := 0; + constant STMDEMUX_META_STREAMID_DESTMAC : natural := 1; + constant STMDEMUX_META_STREAMID_ETHTYPE : natural := 2; + constant STMDEMUX_META_STREAMID_SRCIP : natural := 3; + constant STMDEMUX_META_STREAMID_DESTIP : natural := 4; + constant STMDEMUX_META_STREAMID_LENGTH : natural := 5; + constant STMDEMUX_META_STREAMID_PROTO : natural := 6; + + constant STMDEMUX_DATA_BITS : natural := 8; -- + constant STMDEMUX_META_BITS : positive_vector := ( + STMDEMUX_META_STREAMID_SRCMAC => 8, + STMDEMUX_META_STREAMID_DESTMAC => 8, + STMDEMUX_META_STREAMID_ETHTYPE => 16, + STMDEMUX_META_STREAMID_SRCIP => 8, + STMDEMUX_META_STREAMID_DESTIP => 8, + STMDEMUX_META_STREAMID_LENGTH => 16, + STMDEMUX_META_STREAMID_PROTO => 8 ); - constant STMDEMUX_META_REV_BITS : natural := 5; -- sum over all control bits (rst, nxt, nxt, nxt, nxt) + constant STMDEMUX_META_REV_BITS : natural := 5; -- sum over all control bits (rst, nxt, nxt, nxt, nxt) - signal RX_StmDeMux_Ack : std_logic; - signal RX_StmDeMux_Meta_rst : std_logic; - signal RX_StmDeMux_Meta_SrcMACAddress_nxt : std_logic; - signal RX_StmDeMux_Meta_DestMACAddress_nxt : std_logic; - signal RX_StmDeMux_Meta_SrcIPv4Address_nxt : std_logic; - signal RX_StmDeMux_Meta_DestIPv4Address_nxt : std_logic; + signal RX_StmDeMux_Ack : std_logic; + signal RX_StmDeMux_Meta_rst : std_logic; + signal RX_StmDeMux_Meta_SrcMACAddress_nxt : std_logic; + signal RX_StmDeMux_Meta_DestMACAddress_nxt : std_logic; + signal RX_StmDeMux_Meta_SrcIPv4Address_nxt : std_logic; + signal RX_StmDeMux_Meta_DestIPv4Address_nxt : std_logic; - signal RX_StmDeMux_MetaIn : std_logic_vector(isum(STMDEMUX_META_BITS) - 1 downto 0); - signal RX_StmDeMux_MetaIn_rev : std_logic_vector(STMDEMUX_META_REV_BITS - 1 downto 0); - signal RX_StmDeMux_Data : T_SLM(IPV4_SWITCH_PORTS - 1 downto 0, STMDEMUX_DATA_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal RX_StmDeMux_MetaOut : T_SLM(IPV4_SWITCH_PORTS - 1 downto 0, isum(STMDEMUX_META_BITS) - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal RX_StmDeMux_MetaOut_rev : T_SLM(IPV4_SWITCH_PORTS - 1 downto 0, STMDEMUX_META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal RX_StmDeMux_MetaIn : std_logic_vector(isum(STMDEMUX_META_BITS) - 1 downto 0); + signal RX_StmDeMux_MetaIn_rev : std_logic_vector(STMDEMUX_META_REV_BITS - 1 downto 0); + signal RX_StmDeMux_Data : T_SLM(IPV4_SWITCH_PORTS - 1 downto 0, STMDEMUX_DATA_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal RX_StmDeMux_MetaOut : T_SLM(IPV4_SWITCH_PORTS - 1 downto 0, isum(STMDEMUX_META_BITS) - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal RX_StmDeMux_MetaOut_rev : T_SLM(IPV4_SWITCH_PORTS - 1 downto 0, STMDEMUX_META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmDeMux_Control : std_logic_vector(IPV4_SWITCH_PORTS - 1 downto 0); + signal StmDeMux_Control : std_logic_vector(IPV4_SWITCH_PORTS - 1 downto 0); begin -- ============================================================================= -- TX Path -- ============================================================================= genTXStmBuf : for i in 0 to IPV4_SWITCH_PORTS - 1 generate - constant TXSTMBUF_META_STREAMID_SRCADR : natural := 0; - constant TXSTMBUF_META_STREAMID_DESTADR : natural := 1; - constant TXSTMBUF_META_STREAMID_LENGTH : natural := 2; - - constant TXSTMBUF_META_BITS : T_POSVEC := ( - TXSTMBUF_META_STREAMID_SRCADR => 8, - TXSTMBUF_META_STREAMID_DESTADR => 8, - TXSTMBUF_META_STREAMID_LENGTH => 16 + constant TXSTMBUF_META_STREAMID_SRCADR : natural := 0; + constant TXSTMBUF_META_STREAMID_DESTADR : natural := 1; + constant TXSTMBUF_META_STREAMID_LENGTH : natural := 2; + + constant TXSTMBUF_META_BITS : positive_vector := ( + TXSTMBUF_META_STREAMID_SRCADR => 8, + TXSTMBUF_META_STREAMID_DESTADR => 8, + TXSTMBUF_META_STREAMID_LENGTH => 16 ); - constant TXSTMBUF_META_FIFO_DEPTHS : T_POSVEC := ( - TXSTMBUF_META_STREAMID_SRCADR => 4, - TXSTMBUF_META_STREAMID_DESTADR => 4, - TXSTMBUF_META_STREAMID_LENGTH => 1 + constant TXSTMBUF_META_FIFO_DEPTHS : positive_vector := ( + TXSTMBUF_META_STREAMID_SRCADR => 4, + TXSTMBUF_META_STREAMID_DESTADR => 4, + TXSTMBUF_META_STREAMID_LENGTH => 1 ); - signal StmBuf_DataOut : T_SLV_8; --- signal Meta_rst : STD_LOGIC; - signal StmBuf_MetaIn_nxt : std_logic_vector(TXSTMBUF_META_BITS'length - 1 downto 0); - signal StmBuf_MetaIn_Data : std_logic_vector(isum(TXSTMBUF_META_BITS) - 1 downto 0); + signal StmBuf_DataOut : T_SLV_8; +-- signal Meta_rst : STD_LOGIC; + signal StmBuf_MetaIn_nxt : std_logic_vector(TXSTMBUF_META_BITS'length - 1 downto 0); + signal StmBuf_MetaIn_Data : std_logic_vector(isum(TXSTMBUF_META_BITS) - 1 downto 0); - signal StmBuf_Meta_rst : std_logic; - signal StmBuf_MetaOut_nxt : std_logic_vector(TXSTMBUF_META_BITS'length - 1 downto 0); - signal StmBuf_MetaOut_Data : std_logic_vector(isum(TXSTMBUF_META_BITS) - 1 downto 0); + signal StmBuf_Meta_rst : std_logic; + signal StmBuf_MetaOut_nxt : std_logic_vector(TXSTMBUF_META_BITS'length - 1 downto 0); + signal StmBuf_MetaOut_Data : std_logic_vector(isum(TXSTMBUF_META_BITS) - 1 downto 0); - signal StmBuf_Meta_SrcIPv4Address_Data : std_logic_vector(TX_StmMux_SrcIPv4Address_Data'range); - signal StmBuf_Meta_DestIPv4Address_Data : std_logic_vector(TX_StmMux_DestIPv4Address_Data'range); - signal StmBuf_Meta_Length : std_logic_vector(TX_StmMux_Length'range); - signal StmBuf_Meta_Protocol : std_logic_vector(TX_StmMux_Protocol'range); + signal StmBuf_Meta_SrcIPv4Address_Data : std_logic_vector(TX_StmMux_SrcIPv4Address_Data'range); + signal StmBuf_Meta_DestIPv4Address_Data : std_logic_vector(TX_StmMux_DestIPv4Address_Data'range); + signal StmBuf_Meta_Length : std_logic_vector(TX_StmMux_Length'range); + signal StmBuf_Meta_Protocol : std_logic_vector(TX_StmMux_Protocol'range); - signal StmMux_MetaIn_Data : std_logic_vector(isum(TXSTMMUX_META_BITS) - 1 downto 0); + signal StmMux_MetaIn_Data : std_logic_vector(isum(TXSTMMUX_META_BITS) - 1 downto 0); begin - StmBuf_MetaIn_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR)) <= TX_Meta_SrcIPv4Address_Data(i); - StmBuf_MetaIn_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR)) <= TX_Meta_DestIPv4Address_Data(i); - StmBuf_MetaIn_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH)) <= TX_Meta_Length(i); + StmBuf_MetaIn_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR)) <= TX_Meta_SrcIPv4Address_Data(i); + StmBuf_MetaIn_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR)) <= TX_Meta_DestIPv4Address_Data(i); + StmBuf_MetaIn_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH)) <= TX_Meta_Length(i); --- TX_Meta_rst(i) <= Meta_rst; - TX_Meta_SrcIPv4Address_nxt(i) <= StmBuf_MetaIn_nxt(TXSTMBUF_META_STREAMID_SRCADR); - TX_Meta_DestIPv4Address_nxt(i) <= StmBuf_MetaIn_nxt(TXSTMBUF_META_STREAMID_DESTADR); +-- TX_Meta_rst(i) <= Meta_rst; + TX_Meta_SrcIPv4Address_nxt(i) <= StmBuf_MetaIn_nxt(TXSTMBUF_META_STREAMID_SRCADR); + TX_Meta_DestIPv4Address_nxt(i) <= StmBuf_MetaIn_nxt(TXSTMBUF_META_STREAMID_DESTADR); TX_StmBuf: entity work.stream_FIFO generic map ( - FRAMES => 2, - DATA_BITS => 8, - DATA_FIFO_DEPTH => 16, - META_BITS => TXSTMBUF_META_BITS, - META_FIFO_DEPTH => TXSTMBUF_META_FIFO_DEPTHS + FRAMES => 2, + DATA_BITS => 8, + DATA_FIFO_DEPTH => 16, + META_BITS => TXSTMBUF_META_BITS, + META_FIFO_DEPTH => TXSTMBUF_META_FIFO_DEPTHS ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => TX_Valid(i), - In_Data => TX_Data(i), - In_SOF => TX_SOF(i), - In_EOF => TX_EOF(i), - In_Ack => TX_Ack (i), - In_Meta_rst => TX_Meta_rst(i), - In_Meta_nxt => StmBuf_MetaIn_nxt, - In_Meta_Data => StmBuf_MetaIn_Data, - - Out_Valid => StmMux_In_Valid(i), - Out_Data => StmBuf_DataOut, - Out_SOF => StmMux_In_SOF(i), - Out_EOF => StmMux_In_EOF(i), - Out_Ack => StmMux_In_Ack (i), - Out_Meta_rst => StmBuf_Meta_rst, - Out_Meta_nxt => StmBuf_MetaOut_nxt, - Out_Meta_Data => StmBuf_MetaOut_Data + Clock => Clock, + Reset => Reset, + + In_Valid => TX_Valid(i), + In_Data => TX_Data(i), + In_SOF => TX_SOF(i), + In_EOF => TX_EOF(i), + In_Ack => TX_Ack (i), + In_Meta_rst => TX_Meta_rst(i), + In_Meta_nxt => StmBuf_MetaIn_nxt, + In_Meta_Data => StmBuf_MetaIn_Data, + + Out_Valid => StmMux_In_Valid(i), + Out_Data => StmBuf_DataOut, + Out_SOF => StmMux_In_SOF(i), + Out_EOF => StmMux_In_EOF(i), + Out_Ack => StmMux_In_Ack (i), + Out_Meta_rst => StmBuf_Meta_rst, + Out_Meta_nxt => StmBuf_MetaOut_nxt, + Out_Meta_Data => StmBuf_MetaOut_Data ); -- unpack buffer metadata to signals - StmBuf_Meta_SrcIPv4Address_Data <= StmBuf_MetaOut_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR)); - StmBuf_Meta_DestIPv4Address_Data <= StmBuf_MetaOut_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR)); - StmBuf_Meta_Length <= StmBuf_MetaOut_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH)); + StmBuf_Meta_SrcIPv4Address_Data <= StmBuf_MetaOut_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR)); + StmBuf_Meta_DestIPv4Address_Data <= StmBuf_MetaOut_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR)); + StmBuf_Meta_Length <= StmBuf_MetaOut_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH)); - StmBuf_Meta_rst <= StmMux_In_Meta_rev(i, TXSTMMUX_META_RST_BIT); - StmBuf_MetaOut_nxt(TXSTMBUF_META_STREAMID_SRCADR) <= StmMux_In_Meta_rev(i, TXSTMMUX_META_SRC_NXT_BIT); - StmBuf_MetaOut_nxt(TXSTMBUF_META_STREAMID_DESTADR) <= StmMux_In_Meta_rev(i, TXSTMMUX_META_DEST_NXT_BIT); - StmBuf_MetaOut_nxt(TXSTMBUF_META_STREAMID_LENGTH) <= '0'; + StmBuf_Meta_rst <= StmMux_In_Meta_rev(i, TXSTMMUX_META_RST_BIT); + StmBuf_MetaOut_nxt(TXSTMBUF_META_STREAMID_SRCADR) <= StmMux_In_Meta_rev(i, TXSTMMUX_META_SRC_NXT_BIT); + StmBuf_MetaOut_nxt(TXSTMBUF_META_STREAMID_DESTADR) <= StmMux_In_Meta_rev(i, TXSTMMUX_META_DEST_NXT_BIT); + StmBuf_MetaOut_nxt(TXSTMBUF_META_STREAMID_LENGTH) <= '0'; -- repack metadata into 1 dim vector for mux - StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_SRCADR) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_SRCADR)) <= StmBuf_Meta_SrcIPv4Address_Data; - StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_DESTADR) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_DESTADR)) <= StmBuf_Meta_DestIPv4Address_Data; - StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_LENGTH) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_LENGTH)) <= StmBuf_Meta_Length; - StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_PROTOCOL) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_PROTOCOL)) <= PACKET_TYPES(i); + StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_SRCADR) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_SRCADR)) <= StmBuf_Meta_SrcIPv4Address_Data; + StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_DESTADR) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_DESTADR)) <= StmBuf_Meta_DestIPv4Address_Data; + StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_LENGTH) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_LENGTH)) <= StmBuf_Meta_Length; + StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_PROTOCOL) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_PROTOCOL)) <= PACKET_TYPES(i); -- assign vectors to matrix assign_row(StmMux_In_Data, StmBuf_DataOut, i); - assign_row(StmMux_In_Meta, StmMux_MetaIn_Data, i); + assign_row(StmMux_In_Meta, StmMux_MetaIn_Data, i); end generate; TX_StmMux: entity work.stream_Mux generic map ( - PORTS => IPV4_SWITCH_PORTS, - DATA_BITS => TX_StmMux_Data'length, - META_BITS => isum(TXSTMMUX_META_BITS), - META_REV_BITS => TXSTMMUX_META_REV_BITS + PORTS => IPV4_SWITCH_PORTS, + DATA_BITS => TX_StmMux_Data'length, + META_BITS => isum(TXSTMMUX_META_BITS), + META_REV_BITS => TXSTMMUX_META_REV_BITS ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => StmMux_In_Valid, - In_Data => StmMux_In_Data, - In_Meta => StmMux_In_Meta, - In_Meta_rev => StmMux_In_Meta_rev, - In_SOF => StmMux_In_SOF, - In_EOF => StmMux_In_EOF, - In_Ack => StmMux_In_Ack, - - Out_Valid => TX_StmMux_Valid, - Out_Data => TX_StmMux_Data, - Out_Meta => TX_StmMux_Meta, - Out_Meta_rev => TX_StmMux_Meta_rev, - Out_SOF => TX_StmMux_SOF, - Out_EOF => TX_StmMux_EOF, - Out_Ack => IPv4_TX_Ack + Clock => Clock, + Reset => Reset, + + In_Valid => StmMux_In_Valid, + In_Data => StmMux_In_Data, + In_Meta => StmMux_In_Meta, + In_Meta_rev => StmMux_In_Meta_rev, + In_SOF => StmMux_In_SOF, + In_EOF => StmMux_In_EOF, + In_Ack => StmMux_In_Ack, + + Out_Valid => TX_StmMux_Valid, + Out_Data => TX_StmMux_Data, + Out_Meta => TX_StmMux_Meta, + Out_Meta_rev => TX_StmMux_Meta_rev, + Out_SOF => TX_StmMux_SOF, + Out_EOF => TX_StmMux_EOF, + Out_Ack => IPv4_TX_Ack ); - TX_StmMux_SrcIPv4Address_Data <= TX_StmMux_Meta(TX_StmMux_SrcIPv4Address_Data'range); - TX_StmMux_DestIPv4Address_Data <= TX_StmMux_Meta(TX_StmMux_DestIPv4Address_Data'range); - TX_StmMux_Length <= TX_StmMux_Meta(TX_StmMux_Length'range); - TX_StmMux_Protocol <= TX_StmMux_Meta(TX_StmMux_Protocol'range); + TX_StmMux_SrcIPv4Address_Data <= TX_StmMux_Meta(TX_StmMux_SrcIPv4Address_Data'range); + TX_StmMux_DestIPv4Address_Data <= TX_StmMux_Meta(TX_StmMux_DestIPv4Address_Data'range); + TX_StmMux_Length <= TX_StmMux_Meta(TX_StmMux_Length'range); + TX_StmMux_Protocol <= TX_StmMux_Meta(TX_StmMux_Protocol'range); - TX_StmMux_Meta_rev(TXSTMMUX_META_RST_BIT) <= IPv4_TX_Meta_rst; - TX_StmMux_Meta_rev(TXSTMMUX_META_SRC_NXT_BIT) <= IPv4_TX_Meta_SrcIPv4Address_nxt; - TX_StmMux_Meta_rev(TXSTMMUX_META_DEST_NXT_BIT) <= IPv4_TX_Meta_DestIPv4Address_nxt; + TX_StmMux_Meta_rev(TXSTMMUX_META_RST_BIT) <= IPv4_TX_Meta_rst; + TX_StmMux_Meta_rev(TXSTMMUX_META_SRC_NXT_BIT) <= IPv4_TX_Meta_SrcIPv4Address_nxt; + TX_StmMux_Meta_rev(TXSTMMUX_META_DEST_NXT_BIT) <= IPv4_TX_Meta_DestIPv4Address_nxt; IPv4_TX: entity work.ipv4_TX generic map ( - DEBUG => DEBUG + DEBUG => DEBUG ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => TX_StmMux_Valid, - In_Data => TX_StmMux_Data, - In_SOF => TX_StmMux_SOF, - In_EOF => TX_StmMux_EOF, - In_Ack => IPv4_TX_Ack, - In_Meta_rst => IPv4_TX_Meta_rst, - In_Meta_SrcIPv4Address_nxt => IPv4_TX_Meta_SrcIPv4Address_nxt, - In_Meta_SrcIPv4Address_Data => TX_StmMux_SrcIPv4Address_Data, - In_Meta_DestIPv4Address_nxt => IPv4_TX_Meta_DestIPv4Address_nxt, - In_Meta_DestIPv4Address_Data => TX_StmMux_DestIPv4Address_Data, - In_Meta_Length => TX_StmMux_Length, - In_Meta_Protocol => TX_StmMux_Protocol, - - ARP_IPCache_Query => ARP_IPCache_Query, - ARP_IPCache_IPv4Address_rst => ARP_IPCache_IPv4Address_rst, - ARP_IPCache_IPv4Address_nxt => ARP_IPCache_IPv4Address_nxt, - ARP_IPCache_IPv4Address_Data => ARP_IPCache_IPv4Address_Data, - - ARP_IPCache_Valid => ARP_IPCache_Valid, - ARP_IPCache_MACAddress_rst => ARP_IPCache_MACAddress_rst, - ARP_IPCache_MACAddress_nxt => ARP_IPCache_MACAddress_nxt, - ARP_IPCache_MACAddress_Data => ARP_IPCache_MACAddress_Data, - - Out_Valid => MAC_TX_Valid, - Out_Data => MAC_TX_Data, - Out_SOF => MAC_TX_SOF, - Out_EOF => MAC_TX_EOF, - Out_Ack => MAC_TX_Ack, - Out_Meta_rst => MAC_TX_Meta_rst, - Out_Meta_DestMACAddress_nxt => MAC_TX_Meta_DestMACAddress_nxt, - Out_Meta_DestMACAddress_Data => MAC_TX_Meta_DestMACAddress_Data + Clock => Clock, + Reset => Reset, + + In_Valid => TX_StmMux_Valid, + In_Data => TX_StmMux_Data, + In_SOF => TX_StmMux_SOF, + In_EOF => TX_StmMux_EOF, + In_Ack => IPv4_TX_Ack, + In_Meta_rst => IPv4_TX_Meta_rst, + In_Meta_SrcIPv4Address_nxt => IPv4_TX_Meta_SrcIPv4Address_nxt, + In_Meta_SrcIPv4Address_Data => TX_StmMux_SrcIPv4Address_Data, + In_Meta_DestIPv4Address_nxt => IPv4_TX_Meta_DestIPv4Address_nxt, + In_Meta_DestIPv4Address_Data => TX_StmMux_DestIPv4Address_Data, + In_Meta_Length => TX_StmMux_Length, + In_Meta_Protocol => TX_StmMux_Protocol, + + ARP_IPCache_Query => ARP_IPCache_Query, + ARP_IPCache_IPv4Address_rst => ARP_IPCache_IPv4Address_rst, + ARP_IPCache_IPv4Address_nxt => ARP_IPCache_IPv4Address_nxt, + ARP_IPCache_IPv4Address_Data => ARP_IPCache_IPv4Address_Data, + + ARP_IPCache_Valid => ARP_IPCache_Valid, + ARP_IPCache_MACAddress_rst => ARP_IPCache_MACAddress_rst, + ARP_IPCache_MACAddress_nxt => ARP_IPCache_MACAddress_nxt, + ARP_IPCache_MACAddress_Data => ARP_IPCache_MACAddress_Data, + + Out_Valid => MAC_TX_Valid, + Out_Data => MAC_TX_Data, + Out_SOF => MAC_TX_SOF, + Out_EOF => MAC_TX_EOF, + Out_Ack => MAC_TX_Ack, + Out_Meta_rst => MAC_TX_Meta_rst, + Out_Meta_DestMACAddress_nxt => MAC_TX_Meta_DestMACAddress_nxt, + Out_Meta_DestMACAddress_Data => MAC_TX_Meta_DestMACAddress_Data ); -- ============================================================================= @@ -389,107 +389,107 @@ begin -- ============================================================================= IPv4_RX: entity work.ipv4_RX generic map ( - DEBUG => DEBUG + DEBUG => DEBUG ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => MAC_RX_Valid, - In_Data => MAC_RX_Data, - In_SOF => MAC_RX_SOF, - In_EOF => MAC_RX_EOF, - In_Ack => MAC_RX_Ack, - In_Meta_rst => MAC_RX_Meta_rst, - In_Meta_SrcMACAddress_nxt => MAC_RX_Meta_SrcMACAddress_nxt, - In_Meta_SrcMACAddress_Data => MAC_RX_Meta_SrcMACAddress_Data, - In_Meta_DestMACAddress_nxt => MAC_RX_Meta_DestMACAddress_nxt, - In_Meta_DestMACAddress_Data => MAC_RX_Meta_DestMACAddress_Data, - In_Meta_EthType => MAC_RX_Meta_EthType, - - Out_Valid => IPv4_RX_Valid, - Out_Data => IPv4_RX_Data, - Out_SOF => IPv4_RX_SOF, - Out_EOF => IPv4_RX_EOF, - Out_Ack => RX_StmDeMux_Ack, - Out_Meta_rst => RX_StmDeMux_Meta_rst, - Out_Meta_SrcMACAddress_nxt => RX_StmDeMux_Meta_SrcMACAddress_nxt, - Out_Meta_SrcMACAddress_Data => IPv4_RX_Meta_SrcMACAddress_Data, - Out_Meta_DestMACAddress_nxt => RX_StmDeMux_Meta_DestMACAddress_nxt, - Out_Meta_DestMACAddress_Data => IPv4_RX_Meta_DestMACAddress_Data, - Out_Meta_EthType => IPv4_RX_Meta_EthType, - Out_Meta_SrcIPv4Address_nxt => RX_StmDeMux_Meta_SrcIPv4Address_nxt, - Out_Meta_SrcIPv4Address_Data => IPv4_RX_Meta_SrcIPv4Address_Data, - Out_Meta_DestIPv4Address_nxt => RX_StmDeMux_Meta_DestIPv4Address_nxt, - Out_Meta_DestIPv4Address_Data => IPv4_RX_Meta_DestIPv4Address_Data, - Out_Meta_Length => IPv4_RX_Meta_Length, - Out_Meta_Protocol => IPv4_RX_Meta_Protocol + Clock => Clock, + Reset => Reset, + + In_Valid => MAC_RX_Valid, + In_Data => MAC_RX_Data, + In_SOF => MAC_RX_SOF, + In_EOF => MAC_RX_EOF, + In_Ack => MAC_RX_Ack, + In_Meta_rst => MAC_RX_Meta_rst, + In_Meta_SrcMACAddress_nxt => MAC_RX_Meta_SrcMACAddress_nxt, + In_Meta_SrcMACAddress_Data => MAC_RX_Meta_SrcMACAddress_Data, + In_Meta_DestMACAddress_nxt => MAC_RX_Meta_DestMACAddress_nxt, + In_Meta_DestMACAddress_Data => MAC_RX_Meta_DestMACAddress_Data, + In_Meta_EthType => MAC_RX_Meta_EthType, + + Out_Valid => IPv4_RX_Valid, + Out_Data => IPv4_RX_Data, + Out_SOF => IPv4_RX_SOF, + Out_EOF => IPv4_RX_EOF, + Out_Ack => RX_StmDeMux_Ack, + Out_Meta_rst => RX_StmDeMux_Meta_rst, + Out_Meta_SrcMACAddress_nxt => RX_StmDeMux_Meta_SrcMACAddress_nxt, + Out_Meta_SrcMACAddress_Data => IPv4_RX_Meta_SrcMACAddress_Data, + Out_Meta_DestMACAddress_nxt => RX_StmDeMux_Meta_DestMACAddress_nxt, + Out_Meta_DestMACAddress_Data => IPv4_RX_Meta_DestMACAddress_Data, + Out_Meta_EthType => IPv4_RX_Meta_EthType, + Out_Meta_SrcIPv4Address_nxt => RX_StmDeMux_Meta_SrcIPv4Address_nxt, + Out_Meta_SrcIPv4Address_Data => IPv4_RX_Meta_SrcIPv4Address_Data, + Out_Meta_DestIPv4Address_nxt => RX_StmDeMux_Meta_DestIPv4Address_nxt, + Out_Meta_DestIPv4Address_Data => IPv4_RX_Meta_DestIPv4Address_Data, + Out_Meta_Length => IPv4_RX_Meta_Length, + Out_Meta_Protocol => IPv4_RX_Meta_Protocol ); genStmDeMux_Control : for i in 0 to IPV4_SWITCH_PORTS - 1 generate - StmDeMux_Control(i) <= to_sl(IPv4_RX_Meta_Protocol = PACKET_TYPES(i)); + StmDeMux_Control(i) <= to_sl(IPv4_RX_Meta_Protocol = PACKET_TYPES(i)); end generate; -- decompress meta_rev vector to single bits - RX_StmDeMux_Meta_rst <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_RST_BIT); - RX_StmDeMux_Meta_SrcMACAddress_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_MACSRC_NXT_BIT); - RX_StmDeMux_Meta_DestMACAddress_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_MACDEST_NXT_BIT); - RX_StmDeMux_Meta_SrcIPv4Address_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_IPV4SRC_NXT_BIT); - RX_StmDeMux_Meta_DestIPv4Address_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_IPV4DEST_NXT_BIT); + RX_StmDeMux_Meta_rst <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_RST_BIT); + RX_StmDeMux_Meta_SrcMACAddress_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_MACSRC_NXT_BIT); + RX_StmDeMux_Meta_DestMACAddress_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_MACDEST_NXT_BIT); + RX_StmDeMux_Meta_SrcIPv4Address_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_IPV4SRC_NXT_BIT); + RX_StmDeMux_Meta_DestIPv4Address_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_IPV4DEST_NXT_BIT); -- compress meta data vectors to single meta data vector - RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC)) <= IPv4_RX_Meta_SrcMACAddress_Data; - RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC)) <= IPv4_RX_Meta_DestMACAddress_Data; - RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE)) <= IPv4_RX_Meta_EthType; - RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP)) <= IPv4_RX_Meta_SrcIPv4Address_Data; - RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP)) <= IPv4_RX_Meta_DestIPv4Address_Data; - RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH)) <= IPv4_RX_Meta_Length; - RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO)) <= IPv4_RX_Meta_Protocol; + RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC)) <= IPv4_RX_Meta_SrcMACAddress_Data; + RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC)) <= IPv4_RX_Meta_DestMACAddress_Data; + RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE)) <= IPv4_RX_Meta_EthType; + RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP)) <= IPv4_RX_Meta_SrcIPv4Address_Data; + RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP)) <= IPv4_RX_Meta_DestIPv4Address_Data; + RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH)) <= IPv4_RX_Meta_Length; + RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO)) <= IPv4_RX_Meta_Protocol; RX_LLDeMux: entity work.stream_DeMux generic map ( - PORTS => IPV4_SWITCH_PORTS, - DATA_BITS => STMDEMUX_DATA_BITS, - META_BITS => isum(STMDEMUX_META_BITS), - META_REV_BITS => STMDEMUX_META_REV_BITS + PORTS => IPV4_SWITCH_PORTS, + DATA_BITS => STMDEMUX_DATA_BITS, + META_BITS => isum(STMDEMUX_META_BITS), + META_REV_BITS => STMDEMUX_META_REV_BITS ) port map ( - Clock => Clock, - Reset => Reset, - - DeMuxControl => StmDeMux_Control, - - In_Valid => IPv4_RX_Valid, - In_Data => IPv4_RX_Data, - In_Meta => RX_StmDeMux_MetaIn, - In_Meta_rev => RX_StmDeMux_MetaIn_rev, - In_SOF => IPv4_RX_SOF, - In_EOF => IPv4_RX_EOF, - In_Ack => RX_StmDeMux_Ack, - - Out_Valid => RX_Valid, - Out_Data => RX_StmDeMux_Data, - Out_Meta => RX_StmDeMux_MetaOut, - Out_Meta_rev => RX_StmDeMux_MetaOut_rev, - Out_SOF => RX_SOF, - Out_EOF => RX_EOF, - Out_Ack => RX_Ack + Clock => Clock, + Reset => Reset, + + DeMuxControl => StmDeMux_Control, + + In_Valid => IPv4_RX_Valid, + In_Data => IPv4_RX_Data, + In_Meta => RX_StmDeMux_MetaIn, + In_Meta_rev => RX_StmDeMux_MetaIn_rev, + In_SOF => IPv4_RX_SOF, + In_EOF => IPv4_RX_EOF, + In_Ack => RX_StmDeMux_Ack, + + Out_Valid => RX_Valid, + Out_Data => RX_StmDeMux_Data, + Out_Meta => RX_StmDeMux_MetaOut, + Out_Meta_rev => RX_StmDeMux_MetaOut_rev, + Out_SOF => RX_SOF, + Out_EOF => RX_EOF, + Out_Ack => RX_Ack ); - assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_rst, STMDEMUX_META_RST_BIT); - assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_SrcMACAddress_nxt, STMDEMUX_META_MACSRC_NXT_BIT); - assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_DestMACAddress_nxt, STMDEMUX_META_MACDEST_NXT_BIT); - assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_SrcIPv4Address_nxt, STMDEMUX_META_IPV4SRC_NXT_BIT); - assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_DestIPv4Address_nxt, STMDEMUX_META_IPV4DEST_NXT_BIT); + assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_rst, STMDEMUX_META_RST_BIT); + assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_SrcMACAddress_nxt, STMDEMUX_META_MACSRC_NXT_BIT); + assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_DestMACAddress_nxt, STMDEMUX_META_MACDEST_NXT_BIT); + assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_SrcIPv4Address_nxt, STMDEMUX_META_IPV4SRC_NXT_BIT); + assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_DestIPv4Address_nxt, STMDEMUX_META_IPV4DEST_NXT_BIT); -- new slm_slice funtion to avoid generate statement for wiring => cut multiple columns over all rows and convert to slvv_* - RX_Data <= to_slvv_8(RX_StmDeMux_Data); - RX_Meta_SrcMACAddress_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC))); - RX_Meta_DestMACAddress_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC))); - RX_Meta_EthType <= to_slvv_16(slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE))); - RX_Meta_SrcIPv4Address_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP))); - RX_Meta_DestIPv4Address_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP))); - RX_Meta_Length <= to_slvv_16(slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH))); - RX_Meta_Protocol <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO))); + RX_Data <= to_slvv_8(RX_StmDeMux_Data); + RX_Meta_SrcMACAddress_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC))); + RX_Meta_DestMACAddress_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC))); + RX_Meta_EthType <= to_slvv_16(slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE))); + RX_Meta_SrcIPv4Address_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP))); + RX_Meta_DestIPv4Address_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP))); + RX_Meta_Length <= to_slvv_16(slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH))); + RX_Meta_Protocol <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO))); end architecture; diff --git a/src/net/ipv6/ipv6.pro b/src/net/ipv6/build.pro similarity index 100% rename from src/net/ipv6/ipv6.pro rename to src/net/ipv6/build.pro diff --git a/src/net/ipv6/ipv6_FrameLoopback.vhdl b/src/net/ipv6/ipv6_FrameLoopback.vhdl index c8a47c4c3..2686c208e 100644 --- a/src/net/ipv6/ipv6_FrameLoopback.vhdl +++ b/src/net/ipv6/ipv6_FrameLoopback.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,108 +37,108 @@ use work.net.all; entity ipv6_FrameLoopback is generic ( - MAX_FRAMES : positive := 4 + MAX_FRAMES : positive := 4 ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- IN port - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - In_Meta_rst : out std_logic; - In_Meta_SrcIPv6Address_nxt : out std_logic; - In_Meta_SrcIPv6Address_Data : in T_SLV_8; - In_Meta_DestIPv6Address_nxt : out std_logic; - In_Meta_DestIPv6Address_Data : in T_SLV_8; - In_Meta_Length : in T_SLV_16; + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + In_Meta_rst : out std_logic; + In_Meta_SrcIPv6Address_nxt : out std_logic; + In_Meta_SrcIPv6Address_Data : in T_SLV_8; + In_Meta_DestIPv6Address_nxt : out std_logic; + In_Meta_DestIPv6Address_Data : in T_SLV_8; + In_Meta_Length : in T_SLV_16; -- OUT port - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic; - Out_Meta_rst : in std_logic; - Out_Meta_SrcIPv6Address_nxt : in std_logic; - Out_Meta_SrcIPv6Address_Data : out T_SLV_8; - Out_Meta_DestIPv6Address_nxt : in std_logic; - Out_Meta_DestIPv6Address_Data : out T_SLV_8; - Out_Meta_Length : out T_SLV_16 + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic; + Out_Meta_rst : in std_logic; + Out_Meta_SrcIPv6Address_nxt : in std_logic; + Out_Meta_SrcIPv6Address_Data : out T_SLV_8; + Out_Meta_DestIPv6Address_nxt : in std_logic; + Out_Meta_DestIPv6Address_Data : out T_SLV_8; + Out_Meta_Length : out T_SLV_16 ); end entity; architecture rtl of ipv6_FrameLoopback is - constant META_STREAMID_SRCADDR : natural := 0; - constant META_STREAMID_DESTADDR : natural := 1; - constant META_STREAMID_LENGTH : natural := 2; - - constant META_BITS : T_POSVEC := ( - META_STREAMID_SRCADDR => 8, - META_STREAMID_DESTADDR => 8, - META_STREAMID_LENGTH => 16 + constant META_STREAMID_SRCADDR : natural := 0; + constant META_STREAMID_DESTADDR : natural := 1; + constant META_STREAMID_LENGTH : natural := 2; + + constant META_BITS : positive_vector := ( + META_STREAMID_SRCADDR => 8, + META_STREAMID_DESTADDR => 8, + META_STREAMID_LENGTH => 16 ); - constant META_FIFO_DEPTHS : T_POSVEC := ( - META_STREAMID_SRCADDR => 16, - META_STREAMID_DESTADDR => 16, - META_STREAMID_LENGTH => 1 + constant META_FIFO_DEPTHS : positive_vector := ( + META_STREAMID_SRCADDR => 16, + META_STREAMID_DESTADDR => 16, + META_STREAMID_LENGTH => 1 ); - signal StmBuf_MetaIn_nxt : std_logic_vector(META_BITS'length - 1 downto 0); - signal StmBuf_MetaIn_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); - signal StmBuf_MetaOut_nxt : std_logic_vector(META_BITS'length - 1 downto 0); - signal StmBuf_MetaOut_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); + signal StmBuf_MetaIn_nxt : std_logic_vector(META_BITS'length - 1 downto 0); + signal StmBuf_MetaIn_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); + signal StmBuf_MetaOut_nxt : std_logic_vector(META_BITS'length - 1 downto 0); + signal StmBuf_MetaOut_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); begin - StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)) <= In_Meta_SrcIPv6Address_Data; - StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)) <= In_Meta_DestIPv6Address_Data; - StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_LENGTH) downto low(META_BITS, META_STREAMID_LENGTH)) <= In_Meta_Length; + StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)) <= In_Meta_SrcIPv6Address_Data; + StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)) <= In_Meta_DestIPv6Address_Data; + StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_LENGTH) downto low(META_BITS, META_STREAMID_LENGTH)) <= In_Meta_Length; - In_Meta_SrcIPv6Address_nxt <= StmBuf_MetaIn_nxt(META_STREAMID_SRCADDR); - In_Meta_DestIPv6Address_nxt <= StmBuf_MetaIn_nxt(META_STREAMID_DESTADDR); + In_Meta_SrcIPv6Address_nxt <= StmBuf_MetaIn_nxt(META_STREAMID_SRCADDR); + In_Meta_DestIPv6Address_nxt <= StmBuf_MetaIn_nxt(META_STREAMID_DESTADDR); StmBuf: entity work.stream_FIFO generic map ( - FRAMES => MAX_FRAMES, - DATA_BITS => 8, - DATA_FIFO_DEPTH => 1024, - META_BITS => META_BITS, - META_FIFO_DEPTH => META_FIFO_DEPTHS + FRAMES => MAX_FRAMES, + DATA_BITS => 8, + DATA_FIFO_DEPTH => 1024, + META_BITS => META_BITS, + META_FIFO_DEPTH => META_FIFO_DEPTHS ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => In_Valid, - In_Data => In_Data, - In_SOF => In_SOF, - In_EOF => In_EOF, - In_Ack => In_Ack, - In_Meta_rst => In_Meta_rst, - In_Meta_nxt => StmBuf_MetaIn_nxt, - In_Meta_Data => StmBuf_MetaIn_Data, - - Out_Valid => Out_Valid, - Out_Data => Out_Data, - Out_SOF => Out_SOF, - Out_EOF => Out_EOF, - Out_Ack => Out_Ack, - Out_Meta_rst => Out_Meta_rst, - Out_Meta_nxt => StmBuf_MetaOut_nxt, - Out_Meta_Data => StmBuf_MetaOut_Data + Clock => Clock, + Reset => Reset, + + In_Valid => In_Valid, + In_Data => In_Data, + In_SOF => In_SOF, + In_EOF => In_EOF, + In_Ack => In_Ack, + In_Meta_rst => In_Meta_rst, + In_Meta_nxt => StmBuf_MetaIn_nxt, + In_Meta_Data => StmBuf_MetaIn_Data, + + Out_Valid => Out_Valid, + Out_Data => Out_Data, + Out_SOF => Out_SOF, + Out_EOF => Out_EOF, + Out_Ack => Out_Ack, + Out_Meta_rst => Out_Meta_rst, + Out_Meta_nxt => StmBuf_MetaOut_nxt, + Out_Meta_Data => StmBuf_MetaOut_Data ); -- unpack StmBuf metadata to signals - Out_Meta_SrcIPv6Address_Data <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)); -- Crossover: Source <= Destination - Out_Meta_DestIPv6Address_Data <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)); -- Crossover: Destination <= Source - Out_Meta_Length <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_LENGTH) downto low(META_BITS, META_STREAMID_LENGTH)); + Out_Meta_SrcIPv6Address_Data <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)); -- Crossover: Source <= Destination + Out_Meta_DestIPv6Address_Data <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)); -- Crossover: Destination <= Source + Out_Meta_Length <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_LENGTH) downto low(META_BITS, META_STREAMID_LENGTH)); -- pack metadata nxt signals to StmBuf meta vector - StmBuf_MetaOut_nxt(META_STREAMID_DESTADDR) <= Out_Meta_SrcIPv6Address_nxt; - StmBuf_MetaOut_nxt(META_STREAMID_SRCADDR) <= Out_Meta_DestIPv6Address_nxt; - StmBuf_MetaOut_nxt(META_STREAMID_LENGTH) <= '0'; + StmBuf_MetaOut_nxt(META_STREAMID_DESTADDR) <= Out_Meta_SrcIPv6Address_nxt; + StmBuf_MetaOut_nxt(META_STREAMID_SRCADDR) <= Out_Meta_DestIPv6Address_nxt; + StmBuf_MetaOut_nxt(META_STREAMID_LENGTH) <= '0'; end architecture; diff --git a/src/net/ipv6/ipv6_RX.vhdl b/src/net/ipv6/ipv6_RX.vhdl index 56006de44..9ff0dad0b 100644 --- a/src/net/ipv6/ipv6_RX.vhdl +++ b/src/net/ipv6/ipv6_RX.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,61 +37,61 @@ use work.net.all; entity ipv6_RX is generic ( - DEBUG : boolean := FALSE + DEBUG : boolean := FALSE ); port ( - Clock : in std_logic; -- - Reset : in std_logic; -- + Clock : in std_logic; -- + Reset : in std_logic; -- -- STATUS port - Error : out std_logic; + Error : out std_logic; -- IN port - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - In_Meta_rst : out std_logic; - In_Meta_SrcMACAddress_nxt : out std_logic; - In_Meta_SrcMACAddress_Data : in T_SLV_8; - In_Meta_DestMACAddress_nxt : out std_logic; - In_Meta_DestMACAddress_Data : in T_SLV_8; - In_Meta_EthType : in T_SLV_16; + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + In_Meta_rst : out std_logic; + In_Meta_SrcMACAddress_nxt : out std_logic; + In_Meta_SrcMACAddress_Data : in T_SLV_8; + In_Meta_DestMACAddress_nxt : out std_logic; + In_Meta_DestMACAddress_Data : in T_SLV_8; + In_Meta_EthType : in T_SLV_16; -- OUT port - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic; - Out_Meta_rst : in std_logic; - Out_Meta_SrcMACAddress_nxt : in std_logic; - Out_Meta_SrcMACAddress_Data : out T_SLV_8; - Out_Meta_DestMACAddress_nxt : in std_logic; - Out_Meta_DestMACAddress_Data : out T_SLV_8; - Out_Meta_EthType : out T_SLV_16; - Out_Meta_SrcIPv6Address_nxt : in std_logic; - Out_Meta_SrcIPv6Address_Data : out T_SLV_8; - Out_Meta_DestIPv6Address_nxt : in std_logic; - Out_Meta_DestIPv6Address_Data : out T_SLV_8; - Out_Meta_TrafficClass : out T_SLV_8; - Out_Meta_FlowLabel : out T_SLV_24; --STD_LOGIC_VECTOR(19 downto 0); - Out_Meta_Length : out T_SLV_16; - Out_Meta_NextHeader : out T_SLV_8 + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic; + Out_Meta_rst : in std_logic; + Out_Meta_SrcMACAddress_nxt : in std_logic; + Out_Meta_SrcMACAddress_Data : out T_SLV_8; + Out_Meta_DestMACAddress_nxt : in std_logic; + Out_Meta_DestMACAddress_Data : out T_SLV_8; + Out_Meta_EthType : out T_SLV_16; + Out_Meta_SrcIPv6Address_nxt : in std_logic; + Out_Meta_SrcIPv6Address_Data : out T_SLV_8; + Out_Meta_DestIPv6Address_nxt : in std_logic; + Out_Meta_DestIPv6Address_Data : out T_SLV_8; + Out_Meta_TrafficClass : out T_SLV_8; + Out_Meta_FlowLabel : out T_SLV_24; --STD_LOGIC_VECTOR(19 downto 0); + Out_Meta_Length : out T_SLV_16; + Out_Meta_NextHeader : out T_SLV_8 ); end entity; architecture rtl of ipv6_RX is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; - subtype T_BYTEINDEX is natural range 0 to 1; - subtype T_IPV6_BYTEINDEX is natural range 0 to 15; + subtype T_BYTEINDEX is natural range 0 to 1; + subtype T_IPV6_BYTEINDEX is natural range 0 to 15; type T_STATE is ( ST_IDLE, ST_RECEIVE_TRAFFIC_CLASS, - ST_RECEIVE_FLOW_LABEL_1, ST_RECEIVE_FLOW_LABEL_2, - ST_RECEIVE_LENGTH_0, ST_RECEIVE_LENGTH_1, - ST_RECEIVE_NEXT_HEADER, ST_RECEIVE_HOP_LIMIT, + ST_RECEIVE_FLOW_LABEL_1, ST_RECEIVE_FLOW_LABEL_2, + ST_RECEIVE_LENGTH_0, ST_RECEIVE_LENGTH_1, + ST_RECEIVE_NEXT_HEADER, ST_RECEIVE_HOP_LIMIT, ST_RECEIVE_SOURCE_ADDRESS, ST_RECEIVE_DESTINATION_ADDRESS, @@ -100,286 +100,286 @@ architecture rtl of ipv6_RX is ST_ERROR ); - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); - signal In_Ack_i : std_logic; - signal Is_DataFlow : std_logic; - signal Is_SOF : std_logic; - signal Is_EOF : std_logic; + signal In_Ack_i : std_logic; + signal Is_DataFlow : std_logic; + signal Is_SOF : std_logic; + signal Is_EOF : std_logic; - signal Out_Valid_i : std_logic; - signal Out_SOF_i : std_logic; - signal Out_EOF_i : std_logic; + signal Out_Valid_i : std_logic; + signal Out_SOF_i : std_logic; + signal Out_EOF_i : std_logic; - subtype T_IP_BYTEINDEX is natural range 0 to 15; - signal IP_ByteIndex : T_IP_BYTEINDEX; + subtype T_IP_BYTEINDEX is natural range 0 to 15; + signal IP_ByteIndex : T_IP_BYTEINDEX; - signal Register_rst : std_logic; + signal Register_rst : std_logic; -- IPv6 basic header fields - signal TrafficClass_en0 : std_logic; - signal TrafficClass_en1 : std_logic; - signal FlowLabel_en0 : std_logic; - signal FlowLabel_en1 : std_logic; - signal FlowLabel_en2 : std_logic; - signal Length_en0 : std_logic; - signal Length_en1 : std_logic; - signal NextHeader_en : std_logic; - signal HopLimit_en : std_logic; - signal SourceIPv6Address_en : std_logic; - signal DestIPv6Address_en : std_logic; - - signal TrafficClass_d : T_SLV_8 := (others => '0'); - signal FlowLabel_d : std_logic_vector(19 downto 0) := (others => '0'); - signal Length_d : T_SLV_16 := (others => '0'); - signal NextHeader_d : T_SLV_8 := (others => '0'); - signal HopLimit_d : T_SLV_8 := (others => '0'); - signal SourceIPv6Address_d : T_NET_IPV6_ADDRESS := (others => (others => '0')); - signal DestIPv6Address_d : T_NET_IPV6_ADDRESS := (others => (others => '0')); - - constant IPV6_ADDRESS_LENGTH : positive := 16; -- IPv6 -> 16 bytes - constant IPV6_ADDRESS_READER_BITS : positive := log2ceilnz(IPV6_ADDRESS_LENGTH); - - signal IPv6SeqCounter_rst : std_logic; - signal IPv6SeqCounter_en : std_logic; - signal IPv6SeqCounter_us : unsigned(IPV6_ADDRESS_READER_BITS - 1 downto 0) := to_unsigned(IPV6_ADDRESS_LENGTH - 1, IPV6_ADDRESS_READER_BITS); - - signal SrcIPv6Address_Reader_rst : std_logic; - signal SrcIPv6Address_Reader_en : std_logic; - signal SrcIPv6Address_Reader_us : unsigned(IPV6_ADDRESS_READER_BITS - 1 downto 0) := to_unsigned(IPV6_ADDRESS_LENGTH - 1, IPV6_ADDRESS_READER_BITS); - signal DestIPv6Address_Reader_rst : std_logic; - signal DestIPv6Address_Reader_en : std_logic; - signal DestIPv6Address_Reader_us : unsigned(IPV6_ADDRESS_READER_BITS - 1 downto 0) := to_unsigned(IPV6_ADDRESS_LENGTH - 1, IPV6_ADDRESS_READER_BITS); + signal TrafficClass_en0 : std_logic; + signal TrafficClass_en1 : std_logic; + signal FlowLabel_en0 : std_logic; + signal FlowLabel_en1 : std_logic; + signal FlowLabel_en2 : std_logic; + signal Length_en0 : std_logic; + signal Length_en1 : std_logic; + signal NextHeader_en : std_logic; + signal HopLimit_en : std_logic; + signal SourceIPv6Address_en : std_logic; + signal DestIPv6Address_en : std_logic; + + signal TrafficClass_d : T_SLV_8 := (others => '0'); + signal FlowLabel_d : std_logic_vector(19 downto 0) := (others => '0'); + signal Length_d : T_SLV_16 := (others => '0'); + signal NextHeader_d : T_SLV_8 := (others => '0'); + signal HopLimit_d : T_SLV_8 := (others => '0'); + signal SourceIPv6Address_d : T_NET_IPV6_ADDRESS := (others => (others => '0')); + signal DestIPv6Address_d : T_NET_IPV6_ADDRESS := (others => (others => '0')); + + constant IPV6_ADDRESS_LENGTH : positive := 16; -- IPv6 -> 16 bytes + constant IPV6_ADDRESS_READER_BITS : positive := log2ceilnz(IPV6_ADDRESS_LENGTH); + + signal IPv6SeqCounter_rst : std_logic; + signal IPv6SeqCounter_en : std_logic; + signal IPv6SeqCounter_us : unsigned(IPV6_ADDRESS_READER_BITS - 1 downto 0) := to_unsigned(IPV6_ADDRESS_LENGTH - 1, IPV6_ADDRESS_READER_BITS); + + signal SrcIPv6Address_Reader_rst : std_logic; + signal SrcIPv6Address_Reader_en : std_logic; + signal SrcIPv6Address_Reader_us : unsigned(IPV6_ADDRESS_READER_BITS - 1 downto 0) := to_unsigned(IPV6_ADDRESS_LENGTH - 1, IPV6_ADDRESS_READER_BITS); + signal DestIPv6Address_Reader_rst : std_logic; + signal DestIPv6Address_Reader_en : std_logic; + signal DestIPv6Address_Reader_us : unsigned(IPV6_ADDRESS_READER_BITS - 1 downto 0) := to_unsigned(IPV6_ADDRESS_LENGTH - 1, IPV6_ADDRESS_READER_BITS); -- ExtensionHeader: Fragmentation --- signal FragmentOffset_en0 : STD_LOGIC; --- signal FragmentOffset_en1 : STD_LOGIC; +-- signal FragmentOffset_en0 : STD_LOGIC; +-- signal FragmentOffset_en1 : STD_LOGIC; --- signal FragmentOffset_d : STD_LOGIC_VECTOR(12 downto 0) := (others => '0'); +-- signal FragmentOffset_d : STD_LOGIC_VECTOR(12 downto 0) := (others => '0'); begin - In_Ack <= In_Ack_i; - Is_DataFlow <= In_Valid and In_Ack_i; - Is_SOF <= In_Valid and In_SOF; - Is_EOF <= In_Valid and In_EOF; + In_Ack <= In_Ack_i; + Is_DataFlow <= In_Valid and In_Ack_i; + Is_SOF <= In_Valid and In_SOF; + Is_EOF <= In_Valid and In_EOF; process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; process(State, Is_DataFlow, Is_SOF, Is_EOF, In_Valid, In_Data, In_EOF, Out_Ack, IPv6SeqCounter_us) begin - NextState <= State; + NextState <= State; - Error <= '0'; + Error <= '0'; - In_Ack_i <= '0'; - Out_Valid_i <= '0'; - Out_SOF_i <= '0'; - Out_EOF_i <= '0'; + In_Ack_i <= '0'; + Out_Valid_i <= '0'; + Out_SOF_i <= '0'; + Out_EOF_i <= '0'; -- IPv6 basic header fields - Register_rst <= '0'; - TrafficClass_en0 <= '0'; - TrafficClass_en1 <= '0'; - FlowLabel_en0 <= '0'; - FlowLabel_en1 <= '0'; - FlowLabel_en2 <= '0'; - Length_en0 <= '0'; - Length_en1 <= '0'; - NextHeader_en <= '0'; - HopLimit_en <= '0'; - SourceIPv6Address_en <= '0'; - DestIPv6Address_en <= '0'; - - IPv6SeqCounter_rst <= '0'; - IPv6SeqCounter_en <= '0'; + Register_rst <= '0'; + TrafficClass_en0 <= '0'; + TrafficClass_en1 <= '0'; + FlowLabel_en0 <= '0'; + FlowLabel_en1 <= '0'; + FlowLabel_en2 <= '0'; + Length_en0 <= '0'; + Length_en1 <= '0'; + NextHeader_en <= '0'; + HopLimit_en <= '0'; + SourceIPv6Address_en <= '0'; + DestIPv6Address_en <= '0'; + + IPv6SeqCounter_rst <= '0'; + IPv6SeqCounter_en <= '0'; -- ExtensionHeader: Fragmentation --- FragmentOffset_en0 <= '0'; --- FragmentOffset_en1 <= '0'; +-- FragmentOffset_en0 <= '0'; +-- FragmentOffset_en1 <= '0'; case State is when ST_IDLE => if (Is_SOF = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then if (In_Data(3 downto 0) = x"6") then - TrafficClass_en0 <= '1'; - NextState <= ST_RECEIVE_TRAFFIC_CLASS; + TrafficClass_en0 <= '1'; + NextState <= ST_RECEIVE_TRAFFIC_CLASS; else - NextState <= ST_DISCARD_FRAME; + NextState <= ST_DISCARD_FRAME; end if; else -- EOF - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_TRAFFIC_CLASS => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - TrafficClass_en1 <= '1'; - FlowLabel_en0 <= '1'; - NextState <= ST_RECEIVE_FLOW_LABEL_1; + TrafficClass_en1 <= '1'; + FlowLabel_en0 <= '1'; + NextState <= ST_RECEIVE_FLOW_LABEL_1; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_FLOW_LABEL_1 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - FlowLabel_en1 <= '1'; - NextState <= ST_RECEIVE_FLOW_LABEL_2; + FlowLabel_en1 <= '1'; + NextState <= ST_RECEIVE_FLOW_LABEL_2; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_FLOW_LABEL_2 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - FlowLabel_en2 <= '1'; - NextState <= ST_RECEIVE_LENGTH_0; + FlowLabel_en2 <= '1'; + NextState <= ST_RECEIVE_LENGTH_0; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_LENGTH_0 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - Length_en0 <= '1'; - NextState <= ST_RECEIVE_LENGTH_1; + Length_en0 <= '1'; + NextState <= ST_RECEIVE_LENGTH_1; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_LENGTH_1 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - Length_en1 <= '1'; - NextState <= ST_RECEIVE_NEXT_HEADER; + Length_en1 <= '1'; + NextState <= ST_RECEIVE_NEXT_HEADER; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_NEXT_HEADER => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextHeader_en <= '1'; - NextState <= ST_RECEIVE_HOP_LIMIT; + NextHeader_en <= '1'; + NextState <= ST_RECEIVE_HOP_LIMIT; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_HOP_LIMIT => - IPv6SeqCounter_rst <= '1'; + IPv6SeqCounter_rst <= '1'; if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - HopLimit_en <= '1'; - NextState <= ST_RECEIVE_SOURCE_ADDRESS; + HopLimit_en <= '1'; + NextState <= ST_RECEIVE_SOURCE_ADDRESS; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_SOURCE_ADDRESS => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; - SourceIPv6Address_en <= '1'; - IPv6SeqCounter_en <= '1'; + SourceIPv6Address_en <= '1'; + IPv6SeqCounter_en <= '1'; if (Is_EOF = '0') then if (IPv6SeqCounter_us = 0) then - IPv6SeqCounter_rst <= '1'; - NextState <= ST_RECEIVE_DESTINATION_ADDRESS; + IPv6SeqCounter_rst <= '1'; + NextState <= ST_RECEIVE_DESTINATION_ADDRESS; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_DESTINATION_ADDRESS => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; - DestIPv6Address_en <= '1'; - IPv6SeqCounter_en <= '1'; + DestIPv6Address_en <= '1'; + IPv6SeqCounter_en <= '1'; if (Is_EOF = '0') then if (IPv6SeqCounter_us = 0) then - IPv6SeqCounter_rst <= '1'; - NextState <= ST_RECEIVE_DATA_1; + IPv6SeqCounter_rst <= '1'; + NextState <= ST_RECEIVE_DATA_1; end if; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_DATA_1 => - In_Ack_i <= Out_Ack; - Out_Valid_i <= In_Valid; - Out_SOF_i <= '1'; - Out_EOF_i <= In_EOF; + In_Ack_i <= Out_Ack; + Out_Valid_i <= In_Valid; + Out_SOF_i <= '1'; + Out_EOF_i <= In_EOF; if (Is_DataFlow = '1') then if (Is_EOF = '0') then - NextState <= ST_RECEIVE_DATA_N; + NextState <= ST_RECEIVE_DATA_N; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_RECEIVE_DATA_N => - In_Ack_i <= Out_Ack; - Out_Valid_i <= In_Valid; - Out_EOF_i <= In_EOF; + In_Ack_i <= Out_Ack; + Out_Valid_i <= In_Valid; + Out_EOF_i <= In_EOF; if (Is_EOF = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; when ST_DISCARD_FRAME => - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '1') then - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; when ST_ERROR => - Error <= '1'; - NextState <= ST_IDLE; + Error <= '1'; + NextState <= ST_IDLE; end case; end process; @@ -389,50 +389,50 @@ begin begin if rising_edge(Clock) then if ((Reset or Register_rst) = '1') then - TrafficClass_d <= (others => '0'); - FlowLabel_d <= (others => '0'); - Length_d <= (others => '0'); - NextHeader_d <= (others => '0'); - HopLimit_d <= (others => '0'); + TrafficClass_d <= (others => '0'); + FlowLabel_d <= (others => '0'); + Length_d <= (others => '0'); + NextHeader_d <= (others => '0'); + HopLimit_d <= (others => '0'); else if (TrafficClass_en0 = '1') then - TrafficClass_d(7 downto 4) <= In_Data(7 downto 4); + TrafficClass_d(7 downto 4) <= In_Data(7 downto 4); end if; if (TrafficClass_en1 = '1') then - TrafficClass_d(3 downto 0) <= In_Data(3 downto 0); + TrafficClass_d(3 downto 0) <= In_Data(3 downto 0); end if; if (FlowLabel_en0 = '1') then - FlowLabel_d(19 downto 16) <= In_Data(7 downto 4); + FlowLabel_d(19 downto 16) <= In_Data(7 downto 4); end if; if (FlowLabel_en1 = '1') then - FlowLabel_d(15 downto 8) <= In_Data; + FlowLabel_d(15 downto 8) <= In_Data; end if; if (FlowLabel_en2 = '1') then - FlowLabel_d(7 downto 0) <= In_Data; + FlowLabel_d(7 downto 0) <= In_Data; end if; if (Length_en0 = '1') then - Length_d(15 downto 8) <= In_Data; + Length_d(15 downto 8) <= In_Data; end if; if (Length_en1 = '1') then - Length_d(7 downto 0) <= In_Data; + Length_d(7 downto 0) <= In_Data; end if; if (NextHeader_en = '1') then - NextHeader_d <= In_Data; + NextHeader_d <= In_Data; end if; if (HopLimit_en = '1') then - HopLimit_d <= In_Data; + HopLimit_d <= In_Data; end if; if (SourceIPv6Address_en = '1') then - SourceIPv6Address_d(to_integer(IPv6SeqCounter_us)) <= In_Data; + SourceIPv6Address_d(to_integer(IPv6SeqCounter_us)) <= In_Data; end if; if (DestIPv6Address_en = '1') then - DestIPv6Address_d(to_integer(IPv6SeqCounter_us)) <= In_Data; + DestIPv6Address_d(to_integer(IPv6SeqCounter_us)) <= In_Data; end if; end if; end if; @@ -442,25 +442,25 @@ begin begin if rising_edge(Clock) then if ((Reset or IPv6SeqCounter_rst) = '1') then - IPv6SeqCounter_us <= to_unsigned(IPV6_ADDRESS_LENGTH - 1, IPV6_ADDRESS_READER_BITS); + IPv6SeqCounter_us <= to_unsigned(IPV6_ADDRESS_LENGTH - 1, IPV6_ADDRESS_READER_BITS); elsif (IPv6SeqCounter_en = '1') then - IPv6SeqCounter_us <= IPv6SeqCounter_us - 1; + IPv6SeqCounter_us <= IPv6SeqCounter_us - 1; end if; end if; end process; - SrcIPv6Address_Reader_rst <= Out_Meta_rst; - SrcIPv6Address_Reader_en <= Out_Meta_SrcIPv6Address_nxt; - DestIPv6Address_Reader_rst <= Out_Meta_rst; - DestIPv6Address_Reader_en <= Out_Meta_DestIPv6Address_nxt; + SrcIPv6Address_Reader_rst <= Out_Meta_rst; + SrcIPv6Address_Reader_en <= Out_Meta_SrcIPv6Address_nxt; + DestIPv6Address_Reader_rst <= Out_Meta_rst; + DestIPv6Address_Reader_en <= Out_Meta_DestIPv6Address_nxt; process(Clock) begin if rising_edge(Clock) then if ((Reset or SrcIPv6Address_Reader_rst) = '1') then - SrcIPv6Address_Reader_us <= to_unsigned(IPV6_ADDRESS_LENGTH - 1, IPV6_ADDRESS_READER_BITS); + SrcIPv6Address_Reader_us <= to_unsigned(IPV6_ADDRESS_LENGTH - 1, IPV6_ADDRESS_READER_BITS); elsif (SrcIPv6Address_Reader_en = '1') then - SrcIPv6Address_Reader_us <= SrcIPv6Address_Reader_us - 1; + SrcIPv6Address_Reader_us <= SrcIPv6Address_Reader_us - 1; end if; end if; end process; @@ -469,29 +469,29 @@ begin begin if rising_edge(Clock) then if ((Reset or DestIPv6Address_Reader_rst) = '1') then - DestIPv6Address_Reader_us <= to_unsigned(IPV6_ADDRESS_LENGTH - 1, IPV6_ADDRESS_READER_BITS); + DestIPv6Address_Reader_us <= to_unsigned(IPV6_ADDRESS_LENGTH - 1, IPV6_ADDRESS_READER_BITS); elsif (DestIPv6Address_Reader_en = '1') then - DestIPv6Address_Reader_us <= DestIPv6Address_Reader_us - 1; + DestIPv6Address_Reader_us <= DestIPv6Address_Reader_us - 1; end if; end if; end process; - In_Meta_rst <= 'X'; -- FIXME: - In_Meta_SrcMACAddress_nxt <= Out_Meta_SrcMACAddress_nxt; - In_Meta_DestMACAddress_nxt <= Out_Meta_DestMACAddress_nxt; - - Out_Valid <= Out_Valid_i; - Out_Data <= In_Data; - Out_SOF <= Out_SOF_i; - Out_EOF <= Out_EOF_i; - Out_Meta_SrcMACAddress_Data <= In_Meta_SrcMACAddress_Data; - Out_Meta_DestMACAddress_Data <= In_Meta_DestMACAddress_Data; - Out_Meta_EthType <= In_Meta_EthType; - Out_Meta_SrcIPv6Address_Data <= SourceIPv6Address_d(to_integer(SrcIPv6Address_Reader_us)); - Out_Meta_DestIPv6Address_Data <= DestIPv6Address_d(to_integer(DestIPv6Address_Reader_us)); - Out_Meta_TrafficClass <= TrafficClass_d; - Out_Meta_FlowLabel <= "----" & FlowLabel_d; - Out_Meta_Length <= Length_d; - Out_Meta_NextHeader <= NextHeader_d; + In_Meta_rst <= 'X'; -- FIXME: + In_Meta_SrcMACAddress_nxt <= Out_Meta_SrcMACAddress_nxt; + In_Meta_DestMACAddress_nxt <= Out_Meta_DestMACAddress_nxt; + + Out_Valid <= Out_Valid_i; + Out_Data <= In_Data; + Out_SOF <= Out_SOF_i; + Out_EOF <= Out_EOF_i; + Out_Meta_SrcMACAddress_Data <= In_Meta_SrcMACAddress_Data; + Out_Meta_DestMACAddress_Data <= In_Meta_DestMACAddress_Data; + Out_Meta_EthType <= In_Meta_EthType; + Out_Meta_SrcIPv6Address_Data <= SourceIPv6Address_d(to_integer(SrcIPv6Address_Reader_us)); + Out_Meta_DestIPv6Address_Data <= DestIPv6Address_d(to_integer(DestIPv6Address_Reader_us)); + Out_Meta_TrafficClass <= TrafficClass_d; + Out_Meta_FlowLabel <= "----" & FlowLabel_d; + Out_Meta_Length <= Length_d; + Out_Meta_NextHeader <= NextHeader_d; end architecture; diff --git a/src/net/ipv6/ipv6_TX.vhdl b/src/net/ipv6/ipv6_TX.vhdl index 40abadecd..49f0f4590 100644 --- a/src/net/ipv6/ipv6_TX.vhdl +++ b/src/net/ipv6/ipv6_TX.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,60 +37,60 @@ use work.net.all; entity ipv6_TX is generic ( - DEBUG : boolean := FALSE + DEBUG : boolean := FALSE ); port ( - Clock : in std_logic; -- - Reset : in std_logic; -- + Clock : in std_logic; -- + Reset : in std_logic; -- -- IN port - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - In_Meta_rst : out std_logic; - In_Meta_SrcIPv6Address_nxt : out std_logic; - In_Meta_SrcIPv6Address_Data : in T_SLV_8; - In_Meta_DestIPv6Address_nxt : out std_logic; - In_Meta_DestIPv6Address_Data : in T_SLV_8; - In_Meta_TrafficClass : in T_SLV_8; - In_Meta_FlowLabel : in T_SLV_24; --STD_LOGIC_VECTOR(19 downto 0); - In_Meta_Length : in T_SLV_16; - In_Meta_NextHeader : in T_SLV_8; + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + In_Meta_rst : out std_logic; + In_Meta_SrcIPv6Address_nxt : out std_logic; + In_Meta_SrcIPv6Address_Data : in T_SLV_8; + In_Meta_DestIPv6Address_nxt : out std_logic; + In_Meta_DestIPv6Address_Data : in T_SLV_8; + In_Meta_TrafficClass : in T_SLV_8; + In_Meta_FlowLabel : in T_SLV_24; --STD_LOGIC_VECTOR(19 downto 0); + In_Meta_Length : in T_SLV_16; + In_Meta_NextHeader : in T_SLV_8; -- to NDP layer - NDP_NextHop_Query : out std_logic; - NDP_NextHop_IPv6Address_rst : in std_logic; - NDP_NextHop_IPv6Address_nxt : in std_logic; - NDP_NextHop_IPv6Address_Data : out T_SLV_8; + NDP_NextHop_Query : out std_logic; + NDP_NextHop_IPv6Address_rst : in std_logic; + NDP_NextHop_IPv6Address_nxt : in std_logic; + NDP_NextHop_IPv6Address_Data : out T_SLV_8; -- from NDP layer - NDP_NextHop_Valid : in std_logic; - NDP_NextHop_MACAddress_rst : out std_logic; - NDP_NextHop_MACAddress_nxt : out std_logic; - NDP_NextHop_MACAddress_Data : in T_SLV_8; + NDP_NextHop_Valid : in std_logic; + NDP_NextHop_MACAddress_rst : out std_logic; + NDP_NextHop_MACAddress_nxt : out std_logic; + NDP_NextHop_MACAddress_Data : in T_SLV_8; -- OUT port - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic; - Out_Meta_rst : in std_logic; - Out_Meta_DestMACAddress_nxt : in std_logic; - Out_Meta_DestMACAddress_Data : out T_SLV_8 + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic; + Out_Meta_rst : in std_logic; + Out_Meta_DestMACAddress_nxt : in std_logic; + Out_Meta_DestMACAddress_Data : out T_SLV_8 ); end entity; architecture rtl of ipv6_TX is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; type T_STATE is ( ST_IDLE, - ST_NDP_QUERY, ST_NDP_QUERY_WAIT, + ST_NDP_QUERY, ST_NDP_QUERY_WAIT, ST_SEND_VERSION, ST_SEND_TRAFFIC_CLASS, - ST_SEND_FLOW_LABEL_1, ST_SEND_FLOW_LABEL_2, - ST_SEND_In_Meta_Length_0, ST_SEND_In_Meta_Length_1, - ST_SEND_NEXT_HEADER, ST_SEND_HOP_LIMIT, + ST_SEND_FLOW_LABEL_1, ST_SEND_FLOW_LABEL_2, + ST_SEND_In_Meta_Length_0, ST_SEND_In_Meta_Length_1, + ST_SEND_NEXT_HEADER, ST_SEND_HOP_LIMIT, ST_SEND_SOURCE_ADDRESS, ST_SEND_DESTINATION_ADDRESS, ST_SEND_DATA, @@ -98,15 +98,15 @@ architecture rtl of ipv6_TX is ST_ERROR ); - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); - signal In_Ack_i : std_logic; + signal In_Ack_i : std_logic; - signal IPv6SeqCounter_rst : std_logic; - signal IPv6SeqCounter_en : std_logic; - signal IPv6SeqCounter_us : unsigned(3 downto 0) := (others => '0'); + signal IPv6SeqCounter_rst : std_logic; + signal IPv6SeqCounter_en : std_logic; + signal IPv6SeqCounter_us : unsigned(3 downto 0) := (others => '0'); begin @@ -114,9 +114,9 @@ begin begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; @@ -128,179 +128,179 @@ begin In_Meta_DestIPv6Address_Data, In_Meta_SrcIPv6Address_Data, In_Meta_TrafficClass, In_Meta_FlowLabel, In_Meta_NextHeader, IPv6SeqCounter_us) begin - NextState <= State; + NextState <= State; - In_Ack_i <= '0'; + In_Ack_i <= '0'; - Out_Valid <= '0'; - Out_Data <= (others => '0'); - Out_SOF <= '0'; - Out_EOF <= '0'; + Out_Valid <= '0'; + Out_Data <= (others => '0'); + Out_SOF <= '0'; + Out_EOF <= '0'; - In_Meta_rst <= '0'; + In_Meta_rst <= '0'; - NDP_NextHop_Query <= '0'; - In_Meta_SrcIPv6Address_nxt <= '0'; - In_Meta_DestIPv6Address_nxt <= '0'; - NDP_NextHop_IPv6Address_Data <= In_Meta_DestIPv6Address_Data; + NDP_NextHop_Query <= '0'; + In_Meta_SrcIPv6Address_nxt <= '0'; + In_Meta_DestIPv6Address_nxt <= '0'; + NDP_NextHop_IPv6Address_Data <= In_Meta_DestIPv6Address_Data; - NDP_NextHop_MACAddress_rst <= Out_Meta_rst; - NDP_NextHop_MACAddress_nxt <= Out_Meta_DestMACAddress_nxt; - Out_Meta_DestMACAddress_Data <= NDP_NextHop_MACAddress_Data; + NDP_NextHop_MACAddress_rst <= Out_Meta_rst; + NDP_NextHop_MACAddress_nxt <= Out_Meta_DestMACAddress_nxt; + Out_Meta_DestMACAddress_Data <= NDP_NextHop_MACAddress_Data; - IPv6SeqCounter_rst <= '0'; - IPv6SeqCounter_en <= '0'; + IPv6SeqCounter_rst <= '0'; + IPv6SeqCounter_en <= '0'; case State is when ST_IDLE => - In_Meta_rst <= NDP_NextHop_IPv6Address_rst; - In_Meta_DestIPv6Address_nxt <= NDP_NextHop_IPv6Address_nxt; + In_Meta_rst <= NDP_NextHop_IPv6Address_rst; + In_Meta_DestIPv6Address_nxt <= NDP_NextHop_IPv6Address_nxt; if ((In_Valid and In_SOF) = '1') then - NextState <= ST_NDP_QUERY; + NextState <= ST_NDP_QUERY; end if; when ST_NDP_QUERY => - Out_Data <= x"6" & In_Meta_TrafficClass(7 downto 4); - Out_SOF <= '1'; + Out_Data <= x"6" & In_Meta_TrafficClass(7 downto 4); + Out_SOF <= '1'; - In_Meta_rst <= NDP_NextHop_IPv6Address_rst; - In_Meta_DestIPv6Address_nxt <= NDP_NextHop_IPv6Address_nxt; + In_Meta_rst <= NDP_NextHop_IPv6Address_rst; + In_Meta_DestIPv6Address_nxt <= NDP_NextHop_IPv6Address_nxt; - NDP_NextHop_Query <= '1'; + NDP_NextHop_Query <= '1'; if (NDP_NextHop_Valid = '1') then - Out_Valid <= '1'; - In_Meta_rst <= '1'; -- reset metadata + Out_Valid <= '1'; + In_Meta_rst <= '1'; -- reset metadata - if (Out_Ack = '1') then - NextState <= ST_SEND_TRAFFIC_CLASS; + if (Out_Ack = '1') then + NextState <= ST_SEND_TRAFFIC_CLASS; else - NextState <= ST_SEND_VERSION; + NextState <= ST_SEND_VERSION; end if; else - NextState <= ST_NDP_QUERY_WAIT; + NextState <= ST_NDP_QUERY_WAIT; end if; when ST_NDP_QUERY_WAIT => - Out_Valid <= '0'; - Out_Data <= x"6" & In_Meta_TrafficClass(7 downto 4); - Out_SOF <= '1'; + Out_Valid <= '0'; + Out_Data <= x"6" & In_Meta_TrafficClass(7 downto 4); + Out_SOF <= '1'; - In_Meta_rst <= NDP_NextHop_IPv6Address_rst; - In_Meta_DestIPv6Address_nxt <= NDP_NextHop_IPv6Address_nxt; + In_Meta_rst <= NDP_NextHop_IPv6Address_rst; + In_Meta_DestIPv6Address_nxt <= NDP_NextHop_IPv6Address_nxt; if (NDP_NextHop_Valid = '1') then - Out_Valid <= '1'; - In_Meta_rst <= '1'; -- reset metadata + Out_Valid <= '1'; + In_Meta_rst <= '1'; -- reset metadata - if (Out_Ack = '1') then - NextState <= ST_SEND_TRAFFIC_CLASS; + if (Out_Ack = '1') then + NextState <= ST_SEND_TRAFFIC_CLASS; else - NextState <= ST_SEND_VERSION; + NextState <= ST_SEND_VERSION; end if; end if; when ST_SEND_VERSION => - Out_Valid <= '1'; - Out_Data <= x"6" & In_Meta_TrafficClass(7 downto 4); - Out_SOF <= '1'; + Out_Valid <= '1'; + Out_Data <= x"6" & In_Meta_TrafficClass(7 downto 4); + Out_SOF <= '1'; - if (Out_Ack = '1') then - NextState <= ST_SEND_TRAFFIC_CLASS; + if (Out_Ack = '1') then + NextState <= ST_SEND_TRAFFIC_CLASS; end if; when ST_SEND_TRAFFIC_CLASS => - Out_Valid <= '1'; - Out_Data <= In_Meta_TrafficClass(3 downto 0) & In_Meta_FlowLabel(19 downto 16); + Out_Valid <= '1'; + Out_Data <= In_Meta_TrafficClass(3 downto 0) & In_Meta_FlowLabel(19 downto 16); - if (Out_Ack = '1') then - NextState <= ST_SEND_FLOW_LABEL_1; + if (Out_Ack = '1') then + NextState <= ST_SEND_FLOW_LABEL_1; end if; when ST_SEND_FLOW_LABEL_1 => - Out_Valid <= '1'; - Out_Data <= In_Meta_FlowLabel(15 downto 8); + Out_Valid <= '1'; + Out_Data <= In_Meta_FlowLabel(15 downto 8); - if (Out_Ack = '1') then - NextState <= ST_SEND_FLOW_LABEL_2; + if (Out_Ack = '1') then + NextState <= ST_SEND_FLOW_LABEL_2; end if; when ST_SEND_FLOW_LABEL_2 => - Out_Valid <= '1'; - Out_Data <= In_Meta_FlowLabel(7 downto 0); + Out_Valid <= '1'; + Out_Data <= In_Meta_FlowLabel(7 downto 0); - if (Out_Ack = '1') then - NextState <= ST_SEND_In_Meta_Length_0; + if (Out_Ack = '1') then + NextState <= ST_SEND_In_Meta_Length_0; end if; when ST_SEND_In_Meta_Length_0 => - Out_Valid <= '1'; - Out_Data <= In_Meta_Length(15 downto 8); + Out_Valid <= '1'; + Out_Data <= In_Meta_Length(15 downto 8); - if (Out_Ack = '1') then - NextState <= ST_SEND_In_Meta_Length_1; + if (Out_Ack = '1') then + NextState <= ST_SEND_In_Meta_Length_1; end if; when ST_SEND_In_Meta_Length_1 => - Out_Valid <= '1'; - Out_Data <= In_Meta_Length(7 downto 0); + Out_Valid <= '1'; + Out_Data <= In_Meta_Length(7 downto 0); - if (Out_Ack = '1') then - NextState <= ST_SEND_NEXT_HEADER; + if (Out_Ack = '1') then + NextState <= ST_SEND_NEXT_HEADER; end if; when ST_SEND_NEXT_HEADER => - Out_Valid <= '1'; - Out_Data <= In_Meta_NextHeader; + Out_Valid <= '1'; + Out_Data <= In_Meta_NextHeader; - if (Out_Ack = '1') then - NextState <= ST_SEND_HOP_LIMIT; + if (Out_Ack = '1') then + NextState <= ST_SEND_HOP_LIMIT; end if; when ST_SEND_HOP_LIMIT => - Out_Valid <= '1'; - Out_Data <= x"02"; -- TODO: read from cache / routing info + Out_Valid <= '1'; + Out_Data <= x"02"; -- TODO: read from cache / routing info - if (Out_Ack = '1') then - NextState <= ST_SEND_SOURCE_ADDRESS; + if (Out_Ack = '1') then + NextState <= ST_SEND_SOURCE_ADDRESS; end if; when ST_SEND_SOURCE_ADDRESS => - Out_Valid <= '1'; - Out_Data <= In_Meta_SrcIPv6Address_Data; + Out_Valid <= '1'; + Out_Data <= In_Meta_SrcIPv6Address_Data; - if (Out_Ack = '1') then - In_Meta_SrcIPv6Address_nxt <= '1'; - IPv6SeqCounter_en <= '1'; + if (Out_Ack = '1') then + In_Meta_SrcIPv6Address_nxt <= '1'; + IPv6SeqCounter_en <= '1'; if (IPv6SeqCounter_us = 15) then - NextState <= ST_SEND_DESTINATION_ADDRESS; + NextState <= ST_SEND_DESTINATION_ADDRESS; end if; end if; when ST_SEND_DESTINATION_ADDRESS => - Out_Valid <= '1'; - Out_Data <= In_Meta_DestIPv6Address_Data; + Out_Valid <= '1'; + Out_Data <= In_Meta_DestIPv6Address_Data; - if (Out_Ack = '1') then - In_Meta_DestIPv6Address_nxt <= '1'; - IPv6SeqCounter_en <= '1'; + if (Out_Ack = '1') then + In_Meta_DestIPv6Address_nxt <= '1'; + IPv6SeqCounter_en <= '1'; if (IPv6SeqCounter_us = 15) then - NextState <= ST_SEND_DATA; + NextState <= ST_SEND_DATA; end if; end if; when ST_SEND_DATA => - Out_Valid <= In_Valid; - Out_Data <= In_Data; - Out_EOF <= In_EOF; - In_Ack_i <= Out_Ack; + Out_Valid <= In_Valid; + Out_Data <= In_Data; + Out_EOF <= In_EOF; + In_Ack_i <= Out_Ack; if ((In_EOF and Out_Ack) = '1') then - In_Meta_rst <= '1'; - NextState <= ST_IDLE; + In_Meta_rst <= '1'; + NextState <= ST_IDLE; end if; when ST_DISCARD_FRAME => @@ -316,13 +316,13 @@ begin begin if rising_edge(Clock) then if ((Reset or IPv6SeqCounter_rst) = '1') then - IPv6SeqCounter_us <= (others => '0'); + IPv6SeqCounter_us <= (others => '0'); elsif (IPv6SeqCounter_en = '1') then - IPv6SeqCounter_us <= IPv6SeqCounter_us + 1; + IPv6SeqCounter_us <= IPv6SeqCounter_us + 1; end if; end if; end process; - In_Ack <= In_Ack_i; + In_Ack <= In_Ack_i; end architecture; diff --git a/src/net/ipv6/ipv6_Wrapper.vhdl b/src/net/ipv6/ipv6_Wrapper.vhdl index 4a10fb33a..806e7624f 100644 --- a/src/net/ipv6/ipv6_Wrapper.vhdl +++ b/src/net/ipv6/ipv6_Wrapper.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,357 +37,357 @@ use work.net.all; entity ipv6_Wrapper is generic ( - DEBUG : boolean := FALSE; - PACKET_TYPES : T_NET_IPV6_NEXT_HEADER_VECTOR := (0 => x"00") + DEBUG : boolean := FALSE; + PACKET_TYPES : T_NET_IPV6_NEXT_HEADER_VECTOR := (0 => x"00") ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- to MAC layer - MAC_TX_Valid : out std_logic; - MAC_TX_Data : out T_SLV_8; - MAC_TX_SOF : out std_logic; - MAC_TX_EOF : out std_logic; - MAC_TX_Ack : in std_logic; - MAC_TX_Meta_rst : in std_logic; - MAC_TX_Meta_DestMACAddress_nxt : in std_logic; - MAC_TX_Meta_DestMACAddress_Data : out T_SLV_8; + MAC_TX_Valid : out std_logic; + MAC_TX_Data : out T_SLV_8; + MAC_TX_SOF : out std_logic; + MAC_TX_EOF : out std_logic; + MAC_TX_Ack : in std_logic; + MAC_TX_Meta_rst : in std_logic; + MAC_TX_Meta_DestMACAddress_nxt : in std_logic; + MAC_TX_Meta_DestMACAddress_Data : out T_SLV_8; -- from MAC layer - MAC_RX_Valid : in std_logic; - MAC_RX_Data : in T_SLV_8; - MAC_RX_SOF : in std_logic; - MAC_RX_EOF : in std_logic; - MAC_RX_Ack : out std_logic; - MAC_RX_Meta_rst : out std_logic; - MAC_RX_Meta_SrcMACAddress_nxt : out std_logic; - MAC_RX_Meta_SrcMACAddress_Data : in T_SLV_8; - MAC_RX_Meta_DestMACAddress_nxt : out std_logic; - MAC_RX_Meta_DestMACAddress_Data : in T_SLV_8; - MAC_RX_Meta_EthType : in T_SLV_16; + MAC_RX_Valid : in std_logic; + MAC_RX_Data : in T_SLV_8; + MAC_RX_SOF : in std_logic; + MAC_RX_EOF : in std_logic; + MAC_RX_Ack : out std_logic; + MAC_RX_Meta_rst : out std_logic; + MAC_RX_Meta_SrcMACAddress_nxt : out std_logic; + MAC_RX_Meta_SrcMACAddress_Data : in T_SLV_8; + MAC_RX_Meta_DestMACAddress_nxt : out std_logic; + MAC_RX_Meta_DestMACAddress_Data : in T_SLV_8; + MAC_RX_Meta_EthType : in T_SLV_16; -- to NDP layer - NDP_NextHop_Query : out std_logic; - NDP_NextHop_IPv6Address_rst : in std_logic; - NDP_NextHop_IPv6Address_nxt : in std_logic; - NDP_NextHop_IPv6Address_Data : out T_SLV_8; + NDP_NextHop_Query : out std_logic; + NDP_NextHop_IPv6Address_rst : in std_logic; + NDP_NextHop_IPv6Address_nxt : in std_logic; + NDP_NextHop_IPv6Address_Data : out T_SLV_8; -- from NDP layer - NDP_NextHop_Valid : in std_logic; - NDP_NextHop_MACAddress_rst : out std_logic; - NDP_NextHop_MACAddress_nxt : out std_logic; - NDP_NextHop_MACAddress_Data : in T_SLV_8; + NDP_NextHop_Valid : in std_logic; + NDP_NextHop_MACAddress_rst : out std_logic; + NDP_NextHop_MACAddress_nxt : out std_logic; + NDP_NextHop_MACAddress_Data : in T_SLV_8; -- from upper layer - TX_Valid : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - TX_Data : in T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - TX_SOF : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - TX_EOF : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - TX_Ack : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); - TX_Meta_rst : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); - TX_Meta_SrcIPv6Address_nxt : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); - TX_Meta_SrcIPv6Address_Data : in T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - TX_Meta_DestIPv6Address_nxt : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); - TX_Meta_DestIPv6Address_Data : in T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - TX_Meta_TrafficClass : in T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - TX_Meta_FlowLabel : in T_SLVV_24(PACKET_TYPES'length - 1 downto 0); - TX_Meta_Length : in T_SLVV_16(PACKET_TYPES'length - 1 downto 0); + TX_Valid : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + TX_Data : in T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + TX_SOF : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + TX_EOF : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + TX_Ack : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); + TX_Meta_rst : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); + TX_Meta_SrcIPv6Address_nxt : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); + TX_Meta_SrcIPv6Address_Data : in T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + TX_Meta_DestIPv6Address_nxt : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); + TX_Meta_DestIPv6Address_Data : in T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + TX_Meta_TrafficClass : in T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + TX_Meta_FlowLabel : in T_SLVV_24(PACKET_TYPES'length - 1 downto 0); + TX_Meta_Length : in T_SLVV_16(PACKET_TYPES'length - 1 downto 0); -- to upper layer - RX_Valid : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - RX_SOF : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_EOF : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Ack : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Meta_rst : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Meta_SrcMACAddress_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Meta_SrcMACAddress_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - RX_Meta_DestMACAddress_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Meta_DestMACAddress_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - RX_Meta_EthType : out T_SLVV_16(PACKET_TYPES'length - 1 downto 0); - RX_Meta_SrcIPv6Address_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Meta_SrcIPv6Address_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - RX_Meta_DestIPv6Address_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); - RX_Meta_DestIPv6Address_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - RX_Meta_TrafficClass : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); - RX_Meta_FlowLabel : out T_SLVV_24(PACKET_TYPES'length - 1 downto 0); - RX_Meta_Length : out T_SLVV_16(PACKET_TYPES'length - 1 downto 0); - RX_Meta_NextHeader : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0) + RX_Valid : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + RX_SOF : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_EOF : out std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Ack : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Meta_rst : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Meta_SrcMACAddress_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Meta_SrcMACAddress_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + RX_Meta_DestMACAddress_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Meta_DestMACAddress_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + RX_Meta_EthType : out T_SLVV_16(PACKET_TYPES'length - 1 downto 0); + RX_Meta_SrcIPv6Address_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Meta_SrcIPv6Address_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + RX_Meta_DestIPv6Address_nxt : in std_logic_vector(PACKET_TYPES'length - 1 downto 0); + RX_Meta_DestIPv6Address_Data : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + RX_Meta_TrafficClass : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0); + RX_Meta_FlowLabel : out T_SLVV_24(PACKET_TYPES'length - 1 downto 0); + RX_Meta_Length : out T_SLVV_16(PACKET_TYPES'length - 1 downto 0); + RX_Meta_NextHeader : out T_SLVV_8(PACKET_TYPES'length - 1 downto 0) ); end entity; architecture rtl of ipv6_Wrapper is - constant IPV6_SWITCH_PORTS : positive := PACKET_TYPES'length; - - constant TXSTMMUX_META_STREAMID_SRCADR : natural := 0; - constant TXSTMMUX_META_STREAMID_DESTADR : natural := 1; - constant TXSTMMUX_META_STREAMID_LENGTH : natural := 2; - constant TXSTMMUX_META_STREAMID_HEADER : natural := 3; - - constant TXSTMMUX_META_BITS : T_POSVEC := ( - TXSTMMUX_META_STREAMID_SRCADR => 8, - TXSTMMUX_META_STREAMID_DESTADR => 8, - TXSTMMUX_META_STREAMID_LENGTH => 16, - TXSTMMUX_META_STREAMID_HEADER => 8 + constant IPV6_SWITCH_PORTS : positive := PACKET_TYPES'length; + + constant TXSTMMUX_META_STREAMID_SRCADR : natural := 0; + constant TXSTMMUX_META_STREAMID_DESTADR : natural := 1; + constant TXSTMMUX_META_STREAMID_LENGTH : natural := 2; + constant TXSTMMUX_META_STREAMID_HEADER : natural := 3; + + constant TXSTMMUX_META_BITS : positive_vector := ( + TXSTMMUX_META_STREAMID_SRCADR => 8, + TXSTMMUX_META_STREAMID_DESTADR => 8, + TXSTMMUX_META_STREAMID_LENGTH => 16, + TXSTMMUX_META_STREAMID_HEADER => 8 ); - constant TXSTMMUX_META_RST_BIT : natural := 0; - constant TXSTMMUX_META_SRC_NXT_BIT : natural := 1; - constant TXSTMMUX_META_DEST_NXT_BIT : natural := 2; - - constant TXSTMMUX_META_REV_BITS : natural := 3; - - signal StmMux_In_Valid : std_logic_vector(IPV6_SWITCH_PORTS - 1 downto 0); - signal StmMux_In_Data : T_SLM(IPV6_SWITCH_PORTS - 1 downto 0, T_SLV_8'range) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmMux_In_Meta : T_SLM(IPV6_SWITCH_PORTS - 1 downto 0, isum(TXSTMMUX_META_BITS) - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmMux_In_Meta_rev : T_SLM(IPV6_SWITCH_PORTS - 1 downto 0, TXSTMMUX_META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmMux_In_SOF : std_logic_vector(IPV6_SWITCH_PORTS - 1 downto 0); - signal StmMux_In_EOF : std_logic_vector(IPV6_SWITCH_PORTS - 1 downto 0); - signal StmMux_In_Ack : std_logic_vector(IPV6_SWITCH_PORTS - 1 downto 0); - - signal TX_StmMux_Valid : std_logic; - signal TX_StmMux_Data : T_SLV_8; - signal TX_StmMux_Meta : std_logic_vector(isum(TXSTMMUX_META_BITS) - 1 downto 0); - signal TX_StmMux_Meta_rev : std_logic_vector(TXSTMMUX_META_REV_BITS - 1 downto 0); - signal TX_StmMux_SOF : std_logic; - signal TX_StmMux_EOF : std_logic; - signal TX_StmMux_SrcIPv6Address_Data : T_SLV_8; - signal TX_StmMux_DestIPv6Address_Data : T_SLV_8; - signal TX_StmMux_Length : T_SLV_16; - signal TX_StmMux_NextHeader : T_SLV_8; - - signal IPv6_TX_Ack : std_logic; - signal IPv6_TX_Meta_rst : std_logic; - signal IPv6_TX_Meta_SrcIPv6Address_nxt : std_logic; - signal IPv6_TX_Meta_DestIPv6Address_nxt : std_logic; - - signal IPv6_RX_Valid : std_logic; - signal IPv6_RX_Data : T_SLV_8; - signal IPv6_RX_SOF : std_logic; - signal IPv6_RX_EOF : std_logic; - - signal IPv6_RX_Meta_SrcMACAddress_Data : T_SLV_8; - signal IPv6_RX_Meta_DestMACAddress_Data : T_SLV_8; - signal IPv6_RX_Meta_EthType : T_SLV_16; - signal IPv6_RX_Meta_SrcIPv6Address_Data : T_SLV_8; - signal IPv6_RX_Meta_DestIPv6Address_Data : T_SLV_8; - signal IPv6_RX_Meta_TrafficClass : T_SLV_8; - signal IPv6_RX_Meta_FlowLabel : T_SLV_24; - signal IPv6_RX_Meta_Length : T_SLV_16; - signal IPv6_RX_Meta_NextHeader : T_SLV_8; - - constant STMDEMUX_META_RST_BIT : natural := 0; - constant STMDEMUX_META_MACSRC_NXT_BIT : natural := 1; - constant STMDEMUX_META_MACDEST_NXT_BIT : natural := 2; - constant STMDEMUX_META_IPV6SRC_NXT_BIT : natural := 3; - constant STMDEMUX_META_IPV6DEST_NXT_BIT : natural := 4; - - constant STMDEMUX_META_STREAMID_SRCMAC : natural := 0; - constant STMDEMUX_META_STREAMID_DESTMAC : natural := 1; - constant STMDEMUX_META_STREAMID_ETHTYPE : natural := 2; - constant STMDEMUX_META_STREAMID_SRCIP : natural := 3; - constant STMDEMUX_META_STREAMID_DESTIP : natural := 4; - constant STMDEMUX_META_STREAMID_LENGTH : natural := 5; - constant STMDEMUX_META_STREAMID_HEADER : natural := 6; - - constant STMDEMUX_DATA_BITS : natural := 8; -- - constant STMDEMUX_META_BITS : T_POSVEC := ( - STMDEMUX_META_STREAMID_SRCMAC => 8, - STMDEMUX_META_STREAMID_DESTMAC => 8, - STMDEMUX_META_STREAMID_ETHTYPE => 16, - STMDEMUX_META_STREAMID_SRCIP => 8, - STMDEMUX_META_STREAMID_DESTIP => 8, - STMDEMUX_META_STREAMID_LENGTH => 16, - STMDEMUX_META_STREAMID_HEADER => 8 + constant TXSTMMUX_META_RST_BIT : natural := 0; + constant TXSTMMUX_META_SRC_NXT_BIT : natural := 1; + constant TXSTMMUX_META_DEST_NXT_BIT : natural := 2; + + constant TXSTMMUX_META_REV_BITS : natural := 3; + + signal StmMux_In_Valid : std_logic_vector(IPV6_SWITCH_PORTS - 1 downto 0); + signal StmMux_In_Data : T_SLM(IPV6_SWITCH_PORTS - 1 downto 0, T_SLV_8'range) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal StmMux_In_Meta : T_SLM(IPV6_SWITCH_PORTS - 1 downto 0, isum(TXSTMMUX_META_BITS) - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal StmMux_In_Meta_rev : T_SLM(IPV6_SWITCH_PORTS - 1 downto 0, TXSTMMUX_META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal StmMux_In_SOF : std_logic_vector(IPV6_SWITCH_PORTS - 1 downto 0); + signal StmMux_In_EOF : std_logic_vector(IPV6_SWITCH_PORTS - 1 downto 0); + signal StmMux_In_Ack : std_logic_vector(IPV6_SWITCH_PORTS - 1 downto 0); + + signal TX_StmMux_Valid : std_logic; + signal TX_StmMux_Data : T_SLV_8; + signal TX_StmMux_Meta : std_logic_vector(isum(TXSTMMUX_META_BITS) - 1 downto 0); + signal TX_StmMux_Meta_rev : std_logic_vector(TXSTMMUX_META_REV_BITS - 1 downto 0); + signal TX_StmMux_SOF : std_logic; + signal TX_StmMux_EOF : std_logic; + signal TX_StmMux_SrcIPv6Address_Data : T_SLV_8; + signal TX_StmMux_DestIPv6Address_Data : T_SLV_8; + signal TX_StmMux_Length : T_SLV_16; + signal TX_StmMux_NextHeader : T_SLV_8; + + signal IPv6_TX_Ack : std_logic; + signal IPv6_TX_Meta_rst : std_logic; + signal IPv6_TX_Meta_SrcIPv6Address_nxt : std_logic; + signal IPv6_TX_Meta_DestIPv6Address_nxt : std_logic; + + signal IPv6_RX_Valid : std_logic; + signal IPv6_RX_Data : T_SLV_8; + signal IPv6_RX_SOF : std_logic; + signal IPv6_RX_EOF : std_logic; + + signal IPv6_RX_Meta_SrcMACAddress_Data : T_SLV_8; + signal IPv6_RX_Meta_DestMACAddress_Data : T_SLV_8; + signal IPv6_RX_Meta_EthType : T_SLV_16; + signal IPv6_RX_Meta_SrcIPv6Address_Data : T_SLV_8; + signal IPv6_RX_Meta_DestIPv6Address_Data : T_SLV_8; + signal IPv6_RX_Meta_TrafficClass : T_SLV_8; + signal IPv6_RX_Meta_FlowLabel : T_SLV_24; + signal IPv6_RX_Meta_Length : T_SLV_16; + signal IPv6_RX_Meta_NextHeader : T_SLV_8; + + constant STMDEMUX_META_RST_BIT : natural := 0; + constant STMDEMUX_META_MACSRC_NXT_BIT : natural := 1; + constant STMDEMUX_META_MACDEST_NXT_BIT : natural := 2; + constant STMDEMUX_META_IPV6SRC_NXT_BIT : natural := 3; + constant STMDEMUX_META_IPV6DEST_NXT_BIT : natural := 4; + + constant STMDEMUX_META_STREAMID_SRCMAC : natural := 0; + constant STMDEMUX_META_STREAMID_DESTMAC : natural := 1; + constant STMDEMUX_META_STREAMID_ETHTYPE : natural := 2; + constant STMDEMUX_META_STREAMID_SRCIP : natural := 3; + constant STMDEMUX_META_STREAMID_DESTIP : natural := 4; + constant STMDEMUX_META_STREAMID_LENGTH : natural := 5; + constant STMDEMUX_META_STREAMID_HEADER : natural := 6; + + constant STMDEMUX_DATA_BITS : natural := 8; -- + constant STMDEMUX_META_BITS : positive_vector := ( + STMDEMUX_META_STREAMID_SRCMAC => 8, + STMDEMUX_META_STREAMID_DESTMAC => 8, + STMDEMUX_META_STREAMID_ETHTYPE => 16, + STMDEMUX_META_STREAMID_SRCIP => 8, + STMDEMUX_META_STREAMID_DESTIP => 8, + STMDEMUX_META_STREAMID_LENGTH => 16, + STMDEMUX_META_STREAMID_HEADER => 8 ); - constant STMDEMUX_META_REV_BITS : natural := 5; -- sum over all control bits (rst, nxt, nxt, nxt, nxt) + constant STMDEMUX_META_REV_BITS : natural := 5; -- sum over all control bits (rst, nxt, nxt, nxt, nxt) - signal RX_StmDeMux_Ack : std_logic; - signal RX_StmDeMux_Meta_rst : std_logic; - signal RX_StmDeMux_Meta_SrcMACAddress_nxt : std_logic; - signal RX_StmDeMux_Meta_DestMACAddress_nxt : std_logic; - signal RX_StmDeMux_Meta_SrcIPv6Address_nxt : std_logic; - signal RX_StmDeMux_Meta_DestIPv6Address_nxt : std_logic; + signal RX_StmDeMux_Ack : std_logic; + signal RX_StmDeMux_Meta_rst : std_logic; + signal RX_StmDeMux_Meta_SrcMACAddress_nxt : std_logic; + signal RX_StmDeMux_Meta_DestMACAddress_nxt : std_logic; + signal RX_StmDeMux_Meta_SrcIPv6Address_nxt : std_logic; + signal RX_StmDeMux_Meta_DestIPv6Address_nxt : std_logic; - signal RX_StmDeMux_MetaIn : std_logic_vector(isum(STMDEMUX_META_BITS) - 1 downto 0); - signal RX_StmDeMux_MetaIn_rev : std_logic_vector(STMDEMUX_META_REV_BITS - 1 downto 0); - signal RX_StmDeMux_Data : T_SLM(IPV6_SWITCH_PORTS - 1 downto 0, STMDEMUX_DATA_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal RX_StmDeMux_MetaOut : T_SLM(IPV6_SWITCH_PORTS - 1 downto 0, isum(STMDEMUX_META_BITS) - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal RX_StmDeMux_MetaOut_rev : T_SLM(IPV6_SWITCH_PORTS - 1 downto 0, STMDEMUX_META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal RX_StmDeMux_MetaIn : std_logic_vector(isum(STMDEMUX_META_BITS) - 1 downto 0); + signal RX_StmDeMux_MetaIn_rev : std_logic_vector(STMDEMUX_META_REV_BITS - 1 downto 0); + signal RX_StmDeMux_Data : T_SLM(IPV6_SWITCH_PORTS - 1 downto 0, STMDEMUX_DATA_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal RX_StmDeMux_MetaOut : T_SLM(IPV6_SWITCH_PORTS - 1 downto 0, isum(STMDEMUX_META_BITS) - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal RX_StmDeMux_MetaOut_rev : T_SLM(IPV6_SWITCH_PORTS - 1 downto 0, STMDEMUX_META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmDeMux_Control : std_logic_vector(IPV6_SWITCH_PORTS - 1 downto 0); + signal StmDeMux_Control : std_logic_vector(IPV6_SWITCH_PORTS - 1 downto 0); begin -- ============================================================================= -- TX Path -- ============================================================================= genTXStmBuf : for i in 0 to IPV6_SWITCH_PORTS - 1 generate - constant TXSTMBUF_META_STREAMID_SRCADR : natural := 0; - constant TXSTMBUF_META_STREAMID_DESTADR : natural := 1; - constant TXSTMBUF_META_STREAMID_LENGTH : natural := 2; - - constant TXSTMBUF_META_BITS : T_POSVEC := ( - TXSTMBUF_META_STREAMID_SRCADR => 8, - TXSTMBUF_META_STREAMID_DESTADR => 8, - TXSTMBUF_META_STREAMID_LENGTH => 16 + constant TXSTMBUF_META_STREAMID_SRCADR : natural := 0; + constant TXSTMBUF_META_STREAMID_DESTADR : natural := 1; + constant TXSTMBUF_META_STREAMID_LENGTH : natural := 2; + + constant TXSTMBUF_META_BITS : positive_vector := ( + TXSTMBUF_META_STREAMID_SRCADR => 8, + TXSTMBUF_META_STREAMID_DESTADR => 8, + TXSTMBUF_META_STREAMID_LENGTH => 16 ); - constant TXSTMBUF_META_FIFO_DEPTHS : T_POSVEC := ( - TXSTMBUF_META_STREAMID_SRCADR => 16, - TXSTMBUF_META_STREAMID_DESTADR => 16, - TXSTMBUF_META_STREAMID_LENGTH => 1 + constant TXSTMBUF_META_FIFO_DEPTHS : positive_vector := ( + TXSTMBUF_META_STREAMID_SRCADR => 16, + TXSTMBUF_META_STREAMID_DESTADR => 16, + TXSTMBUF_META_STREAMID_LENGTH => 1 ); - signal StmBuf_DataOut : T_SLV_8; --- signal Meta_rst : STD_LOGIC; - signal StmBuf_MetaIn_nxt : std_logic_vector(TXSTMBUF_META_BITS'length - 1 downto 0); - signal StmBuf_MetaIn_Data : std_logic_vector(isum(TXSTMBUF_META_BITS) - 1 downto 0); + signal StmBuf_DataOut : T_SLV_8; +-- signal Meta_rst : STD_LOGIC; + signal StmBuf_MetaIn_nxt : std_logic_vector(TXSTMBUF_META_BITS'length - 1 downto 0); + signal StmBuf_MetaIn_Data : std_logic_vector(isum(TXSTMBUF_META_BITS) - 1 downto 0); - signal StmBuf_Meta_rst : std_logic; - signal StmBuf_MetaOut_nxt : std_logic_vector(TXSTMBUF_META_BITS'length - 1 downto 0); - signal StmBuf_MetaOut_Data : std_logic_vector(isum(TXSTMBUF_META_BITS) - 1 downto 0); + signal StmBuf_Meta_rst : std_logic; + signal StmBuf_MetaOut_nxt : std_logic_vector(TXSTMBUF_META_BITS'length - 1 downto 0); + signal StmBuf_MetaOut_Data : std_logic_vector(isum(TXSTMBUF_META_BITS) - 1 downto 0); - signal StmBuf_Meta_SrcIPv6Address_Data : std_logic_vector(TX_StmMux_SrcIPv6Address_Data'range); - signal StmBuf_Meta_DestIPv6Address_Data : std_logic_vector(TX_StmMux_DestIPv6Address_Data'range); - signal StmBuf_Meta_Length : std_logic_vector(TX_StmMux_Length'range); - signal StmBuf_Meta_NextHeader : std_logic_vector(TX_StmMux_NextHeader'range); + signal StmBuf_Meta_SrcIPv6Address_Data : std_logic_vector(TX_StmMux_SrcIPv6Address_Data'range); + signal StmBuf_Meta_DestIPv6Address_Data : std_logic_vector(TX_StmMux_DestIPv6Address_Data'range); + signal StmBuf_Meta_Length : std_logic_vector(TX_StmMux_Length'range); + signal StmBuf_Meta_NextHeader : std_logic_vector(TX_StmMux_NextHeader'range); - signal StmMux_MetaIn_Data : std_logic_vector(isum(TXSTMMUX_META_BITS) - 1 downto 0); + signal StmMux_MetaIn_Data : std_logic_vector(isum(TXSTMMUX_META_BITS) - 1 downto 0); begin - StmBuf_MetaIn_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR)) <= TX_Meta_SrcIPv6Address_Data(i); - StmBuf_MetaIn_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR)) <= TX_Meta_DestIPv6Address_Data(i); - StmBuf_MetaIn_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH)) <= TX_Meta_Length(i); + StmBuf_MetaIn_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR)) <= TX_Meta_SrcIPv6Address_Data(i); + StmBuf_MetaIn_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR)) <= TX_Meta_DestIPv6Address_Data(i); + StmBuf_MetaIn_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH)) <= TX_Meta_Length(i); --- TX_Meta_rst(i) <= Meta_rst; - TX_Meta_SrcIPv6Address_nxt(i) <= StmBuf_MetaIn_nxt(TXSTMBUF_META_STREAMID_SRCADR); - TX_Meta_DestIPv6Address_nxt(i) <= StmBuf_MetaIn_nxt(TXSTMBUF_META_STREAMID_DESTADR); +-- TX_Meta_rst(i) <= Meta_rst; + TX_Meta_SrcIPv6Address_nxt(i) <= StmBuf_MetaIn_nxt(TXSTMBUF_META_STREAMID_SRCADR); + TX_Meta_DestIPv6Address_nxt(i) <= StmBuf_MetaIn_nxt(TXSTMBUF_META_STREAMID_DESTADR); TX_StmBuf: entity work.stream_FIFO generic map ( - FRAMES => 2, - DATA_BITS => 8, - DATA_FIFO_DEPTH => 16, - META_BITS => TXSTMBUF_META_BITS, - META_FIFO_DEPTH => TXSTMBUF_META_FIFO_DEPTHS + FRAMES => 2, + DATA_BITS => 8, + DATA_FIFO_DEPTH => 16, + META_BITS => TXSTMBUF_META_BITS, + META_FIFO_DEPTH => TXSTMBUF_META_FIFO_DEPTHS ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => TX_Valid(i), - In_Data => TX_Data(i), - In_SOF => TX_SOF(i), - In_EOF => TX_EOF(i), - In_Ack => TX_Ack (i), - In_Meta_rst => TX_Meta_rst(i), - In_Meta_nxt => StmBuf_MetaIn_nxt, - In_Meta_Data => StmBuf_MetaIn_Data, - - Out_Valid => StmMux_In_Valid(i), - Out_Data => StmBuf_DataOut, - Out_SOF => StmMux_In_SOF(i), - Out_EOF => StmMux_In_EOF(i), - Out_Ack => StmMux_In_Ack (i), - Out_Meta_rst => StmBuf_Meta_rst, - Out_Meta_nxt => StmBuf_MetaOut_nxt, - Out_Meta_Data => StmBuf_MetaOut_Data + Clock => Clock, + Reset => Reset, + + In_Valid => TX_Valid(i), + In_Data => TX_Data(i), + In_SOF => TX_SOF(i), + In_EOF => TX_EOF(i), + In_Ack => TX_Ack (i), + In_Meta_rst => TX_Meta_rst(i), + In_Meta_nxt => StmBuf_MetaIn_nxt, + In_Meta_Data => StmBuf_MetaIn_Data, + + Out_Valid => StmMux_In_Valid(i), + Out_Data => StmBuf_DataOut, + Out_SOF => StmMux_In_SOF(i), + Out_EOF => StmMux_In_EOF(i), + Out_Ack => StmMux_In_Ack (i), + Out_Meta_rst => StmBuf_Meta_rst, + Out_Meta_nxt => StmBuf_MetaOut_nxt, + Out_Meta_Data => StmBuf_MetaOut_Data ); -- unpack buffer metadata to signals - StmBuf_Meta_SrcIPv6Address_Data <= StmBuf_MetaOut_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR)); - StmBuf_Meta_DestIPv6Address_Data <= StmBuf_MetaOut_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR)); - StmBuf_Meta_Length <= StmBuf_MetaOut_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH)); + StmBuf_Meta_SrcIPv6Address_Data <= StmBuf_MetaOut_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_SRCADR)); + StmBuf_Meta_DestIPv6Address_Data <= StmBuf_MetaOut_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_DESTADR)); + StmBuf_Meta_Length <= StmBuf_MetaOut_Data(high(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH) downto low(TXSTMBUF_META_BITS, TXSTMBUF_META_STREAMID_LENGTH)); - StmBuf_Meta_rst <= StmMux_In_Meta_rev(i, TXSTMMUX_META_RST_BIT); - StmBuf_MetaOut_nxt(TXSTMBUF_META_STREAMID_SRCADR) <= StmMux_In_Meta_rev(i, TXSTMMUX_META_SRC_NXT_BIT); - StmBuf_MetaOut_nxt(TXSTMBUF_META_STREAMID_DESTADR) <= StmMux_In_Meta_rev(i, TXSTMMUX_META_DEST_NXT_BIT); - StmBuf_MetaOut_nxt(TXSTMBUF_META_STREAMID_LENGTH) <= '0'; + StmBuf_Meta_rst <= StmMux_In_Meta_rev(i, TXSTMMUX_META_RST_BIT); + StmBuf_MetaOut_nxt(TXSTMBUF_META_STREAMID_SRCADR) <= StmMux_In_Meta_rev(i, TXSTMMUX_META_SRC_NXT_BIT); + StmBuf_MetaOut_nxt(TXSTMBUF_META_STREAMID_DESTADR) <= StmMux_In_Meta_rev(i, TXSTMMUX_META_DEST_NXT_BIT); + StmBuf_MetaOut_nxt(TXSTMBUF_META_STREAMID_LENGTH) <= '0'; -- repack metadata into 1 dim vector for mux - StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_SRCADR) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_SRCADR)) <= StmBuf_Meta_SrcIPv6Address_Data; - StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_DESTADR) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_DESTADR)) <= StmBuf_Meta_DestIPv6Address_Data; - StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_LENGTH) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_LENGTH)) <= StmBuf_Meta_Length; - StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_HEADER) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_HEADER)) <= PACKET_TYPES(i); + StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_SRCADR) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_SRCADR)) <= StmBuf_Meta_SrcIPv6Address_Data; + StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_DESTADR) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_DESTADR)) <= StmBuf_Meta_DestIPv6Address_Data; + StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_LENGTH) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_LENGTH)) <= StmBuf_Meta_Length; + StmMux_MetaIn_Data(high(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_HEADER) downto low(TXSTMMUX_META_BITS, TXSTMMUX_META_STREAMID_HEADER)) <= PACKET_TYPES(i); -- assign vectors to matrix - assign_row(StmMux_In_Data, StmBuf_DataOut, i); - assign_row(StmMux_In_Meta, StmMux_MetaIn_Data, i); + assign_row(StmMux_In_Data, StmBuf_DataOut, i); + assign_row(StmMux_In_Meta, StmMux_MetaIn_Data, i); end generate; TX_StmMux: entity work.stream_Mux generic map ( - PORTS => IPV6_SWITCH_PORTS, - DATA_BITS => TX_StmMux_Data'length, - META_BITS => isum(TXSTMMUX_META_BITS), - META_REV_BITS => TXSTMMUX_META_REV_BITS + PORTS => IPV6_SWITCH_PORTS, + DATA_BITS => TX_StmMux_Data'length, + META_BITS => isum(TXSTMMUX_META_BITS), + META_REV_BITS => TXSTMMUX_META_REV_BITS ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => StmMux_In_Valid, - In_Data => StmMux_In_Data, - In_Meta => StmMux_In_Meta, - In_Meta_rev => StmMux_In_Meta_rev, - In_SOF => StmMux_In_SOF, - In_EOF => StmMux_In_EOF, - In_Ack => StmMux_In_Ack, - - Out_Valid => TX_StmMux_Valid, - Out_Data => TX_StmMux_Data, - Out_Meta => TX_StmMux_Meta, - Out_Meta_rev => TX_StmMux_Meta_rev, - Out_SOF => TX_StmMux_SOF, - Out_EOF => TX_StmMux_EOF, - Out_Ack => IPv6_TX_Ack + Clock => Clock, + Reset => Reset, + + In_Valid => StmMux_In_Valid, + In_Data => StmMux_In_Data, + In_Meta => StmMux_In_Meta, + In_Meta_rev => StmMux_In_Meta_rev, + In_SOF => StmMux_In_SOF, + In_EOF => StmMux_In_EOF, + In_Ack => StmMux_In_Ack, + + Out_Valid => TX_StmMux_Valid, + Out_Data => TX_StmMux_Data, + Out_Meta => TX_StmMux_Meta, + Out_Meta_rev => TX_StmMux_Meta_rev, + Out_SOF => TX_StmMux_SOF, + Out_EOF => TX_StmMux_EOF, + Out_Ack => IPv6_TX_Ack ); - TX_StmMux_SrcIPv6Address_Data <= TX_StmMux_Meta(TX_StmMux_SrcIPv6Address_Data'range); - TX_StmMux_DestIPv6Address_Data <= TX_StmMux_Meta(TX_StmMux_DestIPv6Address_Data'range); - TX_StmMux_Length <= TX_StmMux_Meta(TX_StmMux_Length'range); - TX_StmMux_NextHeader <= TX_StmMux_Meta(TX_StmMux_NextHeader'range); + TX_StmMux_SrcIPv6Address_Data <= TX_StmMux_Meta(TX_StmMux_SrcIPv6Address_Data'range); + TX_StmMux_DestIPv6Address_Data <= TX_StmMux_Meta(TX_StmMux_DestIPv6Address_Data'range); + TX_StmMux_Length <= TX_StmMux_Meta(TX_StmMux_Length'range); + TX_StmMux_NextHeader <= TX_StmMux_Meta(TX_StmMux_NextHeader'range); - TX_StmMux_Meta_rev(TXSTMMUX_META_RST_BIT) <= IPv6_TX_Meta_rst; - TX_StmMux_Meta_rev(TXSTMMUX_META_SRC_NXT_BIT) <= IPv6_TX_Meta_SrcIPv6Address_nxt; - TX_StmMux_Meta_rev(TXSTMMUX_META_DEST_NXT_BIT) <= IPv6_TX_Meta_DestIPv6Address_nxt; + TX_StmMux_Meta_rev(TXSTMMUX_META_RST_BIT) <= IPv6_TX_Meta_rst; + TX_StmMux_Meta_rev(TXSTMMUX_META_SRC_NXT_BIT) <= IPv6_TX_Meta_SrcIPv6Address_nxt; + TX_StmMux_Meta_rev(TXSTMMUX_META_DEST_NXT_BIT) <= IPv6_TX_Meta_DestIPv6Address_nxt; TX_IPv6: entity work.ipv6_TX generic map ( - DEBUG => DEBUG + DEBUG => DEBUG ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => TX_StmMux_Valid, - In_Data => TX_StmMux_Data, - In_SOF => TX_StmMux_SOF, - In_EOF => TX_StmMux_EOF, - In_Ack => IPv6_TX_Ack, - In_Meta_rst => IPv6_TX_Meta_rst, - In_Meta_SrcIPv6Address_nxt => IPv6_TX_Meta_SrcIPv6Address_nxt, - In_Meta_SrcIPv6Address_Data => TX_StmMux_SrcIPv6Address_Data, - In_Meta_DestIPv6Address_nxt => IPv6_TX_Meta_DestIPv6Address_nxt, - In_Meta_DestIPv6Address_Data => TX_StmMux_DestIPv6Address_Data, - In_Meta_TrafficClass => (others => '0'), -- not connected through StmMux and TX_StmBuf - In_Meta_FlowLabel => (others => '0'), -- not connected through StmMux and TX_StmBuf - In_Meta_Length => TX_StmMux_Length, - In_Meta_NextHeader => TX_StmMux_NextHeader, - - NDP_NextHop_Query => NDP_NextHop_Query, - NDP_NextHop_IPv6Address_rst => NDP_NextHop_IPv6Address_rst, - NDP_NextHop_IPv6Address_nxt => NDP_NextHop_IPv6Address_nxt, - NDP_NextHop_IPv6Address_Data => NDP_NextHop_IPv6Address_Data, - - NDP_NextHop_Valid => NDP_NextHop_Valid, - NDP_NextHop_MACAddress_rst => NDP_NextHop_MACAddress_rst, - NDP_NextHop_MACAddress_nxt => NDP_NextHop_MACAddress_nxt, - NDP_NextHop_MACAddress_Data => NDP_NextHop_MACAddress_Data, - - Out_Valid => MAC_TX_Valid, - Out_Data => MAC_TX_Data, - Out_SOF => MAC_TX_SOF, - Out_EOF => MAC_TX_EOF, - Out_Ack => MAC_TX_Ack, - Out_Meta_rst => MAC_TX_Meta_rst, - Out_Meta_DestMACAddress_nxt => MAC_TX_Meta_DestMACAddress_nxt, - Out_Meta_DestMACAddress_Data => MAC_TX_Meta_DestMACAddress_Data + Clock => Clock, + Reset => Reset, + + In_Valid => TX_StmMux_Valid, + In_Data => TX_StmMux_Data, + In_SOF => TX_StmMux_SOF, + In_EOF => TX_StmMux_EOF, + In_Ack => IPv6_TX_Ack, + In_Meta_rst => IPv6_TX_Meta_rst, + In_Meta_SrcIPv6Address_nxt => IPv6_TX_Meta_SrcIPv6Address_nxt, + In_Meta_SrcIPv6Address_Data => TX_StmMux_SrcIPv6Address_Data, + In_Meta_DestIPv6Address_nxt => IPv6_TX_Meta_DestIPv6Address_nxt, + In_Meta_DestIPv6Address_Data => TX_StmMux_DestIPv6Address_Data, + In_Meta_TrafficClass => (others => '0'), -- not connected through StmMux and TX_StmBuf + In_Meta_FlowLabel => (others => '0'), -- not connected through StmMux and TX_StmBuf + In_Meta_Length => TX_StmMux_Length, + In_Meta_NextHeader => TX_StmMux_NextHeader, + + NDP_NextHop_Query => NDP_NextHop_Query, + NDP_NextHop_IPv6Address_rst => NDP_NextHop_IPv6Address_rst, + NDP_NextHop_IPv6Address_nxt => NDP_NextHop_IPv6Address_nxt, + NDP_NextHop_IPv6Address_Data => NDP_NextHop_IPv6Address_Data, + + NDP_NextHop_Valid => NDP_NextHop_Valid, + NDP_NextHop_MACAddress_rst => NDP_NextHop_MACAddress_rst, + NDP_NextHop_MACAddress_nxt => NDP_NextHop_MACAddress_nxt, + NDP_NextHop_MACAddress_Data => NDP_NextHop_MACAddress_Data, + + Out_Valid => MAC_TX_Valid, + Out_Data => MAC_TX_Data, + Out_SOF => MAC_TX_SOF, + Out_EOF => MAC_TX_EOF, + Out_Ack => MAC_TX_Ack, + Out_Meta_rst => MAC_TX_Meta_rst, + Out_Meta_DestMACAddress_nxt => MAC_TX_Meta_DestMACAddress_nxt, + Out_Meta_DestMACAddress_Data => MAC_TX_Meta_DestMACAddress_Data ); -- ============================================================================= @@ -395,109 +395,109 @@ begin -- ============================================================================= RX_IPv6: entity work.ipv6_RX generic map ( - DEBUG => DEBUG + DEBUG => DEBUG ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => MAC_RX_Valid, - In_Data => MAC_RX_Data, - In_SOF => MAC_RX_SOF, - In_EOF => MAC_RX_EOF, - In_Ack => MAC_RX_Ack, - In_Meta_rst => MAC_RX_Meta_rst, - In_Meta_SrcMACAddress_nxt => MAC_RX_Meta_SrcMACAddress_nxt, - In_Meta_SrcMACAddress_Data => MAC_RX_Meta_SrcMACAddress_Data, - In_Meta_DestMACAddress_nxt => MAC_RX_Meta_DestMACAddress_nxt, - In_Meta_DestMACAddress_Data => MAC_RX_Meta_DestMACAddress_Data, - In_Meta_EthType => MAC_RX_Meta_EthType, - - Out_Valid => IPv6_RX_Valid, - Out_Data => IPv6_RX_Data, - Out_SOF => IPv6_RX_SOF, - Out_EOF => IPv6_RX_EOF, - Out_Ack => RX_StmDeMux_Ack, - Out_Meta_rst => RX_StmDeMux_Meta_rst, - Out_Meta_SrcMACAddress_nxt => RX_StmDeMux_Meta_SrcMACAddress_nxt, - Out_Meta_SrcMACAddress_Data => IPv6_RX_Meta_SrcMACAddress_Data, - Out_Meta_DestMACAddress_nxt => RX_StmDeMux_Meta_DestMACAddress_nxt, - Out_Meta_DestMACAddress_Data => IPv6_RX_Meta_DestMACAddress_Data, - Out_Meta_EthType => IPv6_RX_Meta_EthType, - Out_Meta_SrcIPv6Address_nxt => RX_StmDeMux_Meta_SrcIPv6Address_nxt, - Out_Meta_SrcIPv6Address_Data => IPv6_RX_Meta_SrcIPv6Address_Data, - Out_Meta_DestIPv6Address_nxt => RX_StmDeMux_Meta_DestIPv6Address_nxt, - Out_Meta_DestIPv6Address_Data => IPv6_RX_Meta_DestIPv6Address_Data, - Out_Meta_TrafficClass => IPv6_RX_Meta_TrafficClass, - Out_Meta_FlowLabel => IPv6_RX_Meta_FlowLabel, - Out_Meta_Length => IPv6_RX_Meta_Length, - Out_Meta_NextHeader => IPv6_RX_Meta_NextHeader + Clock => Clock, + Reset => Reset, + + In_Valid => MAC_RX_Valid, + In_Data => MAC_RX_Data, + In_SOF => MAC_RX_SOF, + In_EOF => MAC_RX_EOF, + In_Ack => MAC_RX_Ack, + In_Meta_rst => MAC_RX_Meta_rst, + In_Meta_SrcMACAddress_nxt => MAC_RX_Meta_SrcMACAddress_nxt, + In_Meta_SrcMACAddress_Data => MAC_RX_Meta_SrcMACAddress_Data, + In_Meta_DestMACAddress_nxt => MAC_RX_Meta_DestMACAddress_nxt, + In_Meta_DestMACAddress_Data => MAC_RX_Meta_DestMACAddress_Data, + In_Meta_EthType => MAC_RX_Meta_EthType, + + Out_Valid => IPv6_RX_Valid, + Out_Data => IPv6_RX_Data, + Out_SOF => IPv6_RX_SOF, + Out_EOF => IPv6_RX_EOF, + Out_Ack => RX_StmDeMux_Ack, + Out_Meta_rst => RX_StmDeMux_Meta_rst, + Out_Meta_SrcMACAddress_nxt => RX_StmDeMux_Meta_SrcMACAddress_nxt, + Out_Meta_SrcMACAddress_Data => IPv6_RX_Meta_SrcMACAddress_Data, + Out_Meta_DestMACAddress_nxt => RX_StmDeMux_Meta_DestMACAddress_nxt, + Out_Meta_DestMACAddress_Data => IPv6_RX_Meta_DestMACAddress_Data, + Out_Meta_EthType => IPv6_RX_Meta_EthType, + Out_Meta_SrcIPv6Address_nxt => RX_StmDeMux_Meta_SrcIPv6Address_nxt, + Out_Meta_SrcIPv6Address_Data => IPv6_RX_Meta_SrcIPv6Address_Data, + Out_Meta_DestIPv6Address_nxt => RX_StmDeMux_Meta_DestIPv6Address_nxt, + Out_Meta_DestIPv6Address_Data => IPv6_RX_Meta_DestIPv6Address_Data, + Out_Meta_TrafficClass => IPv6_RX_Meta_TrafficClass, + Out_Meta_FlowLabel => IPv6_RX_Meta_FlowLabel, + Out_Meta_Length => IPv6_RX_Meta_Length, + Out_Meta_NextHeader => IPv6_RX_Meta_NextHeader ); genStmDeMux_Control : for i in 0 to IPV6_SWITCH_PORTS - 1 generate - StmDeMux_Control(i) <= to_sl(IPv6_RX_Meta_NextHeader = PACKET_TYPES(i)); + StmDeMux_Control(i) <= to_sl(IPv6_RX_Meta_NextHeader = PACKET_TYPES(i)); end generate; -- decompress meta_rev vector to single bits - RX_StmDeMux_Meta_rst <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_RST_BIT); - RX_StmDeMux_Meta_SrcMACAddress_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_MACSRC_NXT_BIT); - RX_StmDeMux_Meta_DestMACAddress_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_MACDEST_NXT_BIT); - RX_StmDeMux_Meta_SrcIPv6Address_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_IPV6SRC_NXT_BIT); - RX_StmDeMux_Meta_DestIPv6Address_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_IPV6DEST_NXT_BIT); + RX_StmDeMux_Meta_rst <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_RST_BIT); + RX_StmDeMux_Meta_SrcMACAddress_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_MACSRC_NXT_BIT); + RX_StmDeMux_Meta_DestMACAddress_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_MACDEST_NXT_BIT); + RX_StmDeMux_Meta_SrcIPv6Address_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_IPV6SRC_NXT_BIT); + RX_StmDeMux_Meta_DestIPv6Address_nxt <= RX_StmDeMux_MetaIn_rev(STMDEMUX_META_IPV6DEST_NXT_BIT); -- compress meta data vectors to single meta data vector - RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC)) <= IPv6_RX_Meta_SrcMACAddress_Data; - RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC)) <= IPv6_RX_Meta_DestMACAddress_Data; - RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE)) <= IPv6_RX_Meta_EthType; - RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP)) <= IPv6_RX_Meta_SrcIPv6Address_Data; - RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP)) <= IPv6_RX_Meta_DestIPv6Address_Data; - RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH)) <= IPv6_RX_Meta_Length; - RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_HEADER) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_HEADER)) <= IPv6_RX_Meta_NextHeader; + RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC)) <= IPv6_RX_Meta_SrcMACAddress_Data; + RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC)) <= IPv6_RX_Meta_DestMACAddress_Data; + RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE)) <= IPv6_RX_Meta_EthType; + RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP)) <= IPv6_RX_Meta_SrcIPv6Address_Data; + RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP)) <= IPv6_RX_Meta_DestIPv6Address_Data; + RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH)) <= IPv6_RX_Meta_Length; + RX_StmDeMux_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_HEADER) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_HEADER)) <= IPv6_RX_Meta_NextHeader; RX_StmDeMux: entity work.stream_DeMux generic map ( - PORTS => IPV6_SWITCH_PORTS, - DATA_BITS => STMDEMUX_DATA_BITS, - META_BITS => isum(STMDEMUX_META_BITS), - META_REV_BITS => STMDEMUX_META_REV_BITS + PORTS => IPV6_SWITCH_PORTS, + DATA_BITS => STMDEMUX_DATA_BITS, + META_BITS => isum(STMDEMUX_META_BITS), + META_REV_BITS => STMDEMUX_META_REV_BITS ) port map ( - Clock => Clock, - Reset => Reset, - - DeMuxControl => StmDeMux_Control, - - In_Valid => IPv6_RX_Valid, - In_Data => IPv6_RX_Data, - In_Meta => RX_StmDeMux_MetaIn, - In_Meta_rev => RX_StmDeMux_MetaIn_rev, - In_SOF => IPv6_RX_SOF, - In_EOF => IPv6_RX_EOF, - In_Ack => RX_StmDeMux_Ack, - - Out_Valid => RX_Valid, - Out_Data => RX_StmDeMux_Data, - Out_Meta => RX_StmDeMux_MetaOut, - Out_Meta_rev => RX_StmDeMux_MetaOut_rev, - Out_SOF => RX_SOF, - Out_EOF => RX_EOF, - Out_Ack => RX_Ack + Clock => Clock, + Reset => Reset, + + DeMuxControl => StmDeMux_Control, + + In_Valid => IPv6_RX_Valid, + In_Data => IPv6_RX_Data, + In_Meta => RX_StmDeMux_MetaIn, + In_Meta_rev => RX_StmDeMux_MetaIn_rev, + In_SOF => IPv6_RX_SOF, + In_EOF => IPv6_RX_EOF, + In_Ack => RX_StmDeMux_Ack, + + Out_Valid => RX_Valid, + Out_Data => RX_StmDeMux_Data, + Out_Meta => RX_StmDeMux_MetaOut, + Out_Meta_rev => RX_StmDeMux_MetaOut_rev, + Out_SOF => RX_SOF, + Out_EOF => RX_EOF, + Out_Ack => RX_Ack ); - assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_rst, STMDEMUX_META_RST_BIT); - assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_SrcMACAddress_nxt, STMDEMUX_META_MACSRC_NXT_BIT); - assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_DestMACAddress_nxt, STMDEMUX_META_MACDEST_NXT_BIT); - assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_SrcIPv6Address_nxt, STMDEMUX_META_IPV6SRC_NXT_BIT); - assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_DestIPv6Address_nxt, STMDEMUX_META_IPV6DEST_NXT_BIT); + assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_rst, STMDEMUX_META_RST_BIT); + assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_SrcMACAddress_nxt, STMDEMUX_META_MACSRC_NXT_BIT); + assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_DestMACAddress_nxt, STMDEMUX_META_MACDEST_NXT_BIT); + assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_SrcIPv6Address_nxt, STMDEMUX_META_IPV6SRC_NXT_BIT); + assign_col(RX_StmDeMux_MetaOut_rev, RX_Meta_DestIPv6Address_nxt, STMDEMUX_META_IPV6DEST_NXT_BIT); -- new slm_slice funtion to avoid generate statement for wiring => cut multiple columns over all rows and convert to slvv_* - RX_Data <= to_slvv_8(RX_StmDeMux_Data); - RX_Meta_SrcMACAddress_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC))); - RX_Meta_DestMACAddress_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC))); - RX_Meta_EthType <= to_slvv_16(slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE))); - RX_Meta_SrcIPv6Address_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP))); - RX_Meta_DestIPv6Address_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP))); - RX_Meta_Length <= to_slvv_16(slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH))); - RX_Meta_NextHeader <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_HEADER), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_HEADER))); + RX_Data <= to_slvv_8(RX_StmDeMux_Data); + RX_Meta_SrcMACAddress_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC))); + RX_Meta_DestMACAddress_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC))); + RX_Meta_EthType <= to_slvv_16(slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE))); + RX_Meta_SrcIPv6Address_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP))); + RX_Meta_DestIPv6Address_Data <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP))); + RX_Meta_Length <= to_slvv_16(slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH))); + RX_Meta_NextHeader <= to_slvv_8( slm_slice_cols(RX_StmDeMux_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_HEADER), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_HEADER))); end architecture; diff --git a/src/net/mac/mac.pro b/src/net/mac/build.pro similarity index 100% rename from src/net/mac/mac.pro rename to src/net/mac/build.pro diff --git a/src/net/mac/mac_FrameLoopback.vhdl b/src/net/mac/mac_FrameLoopback.vhdl index 6bd2b2adb..69a594d06 100644 --- a/src/net/mac/mac_FrameLoopback.vhdl +++ b/src/net/mac/mac_FrameLoopback.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,100 +37,100 @@ use work.net.all; entity mac_FrameLoopback is generic ( - MAX_FRAMES : positive := 4 + MAX_FRAMES : positive := 4 ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- IN Port - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - In_Meta_rst : out std_logic; - In_Meta_SrcMACAddress_nxt : out std_logic; - In_Meta_SrcMACAddress_Data : in T_SLV_8; - In_Meta_DestMACAddress_nxt : out std_logic; - In_Meta_DestMACAddress_Data : in T_SLV_8; + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + In_Meta_rst : out std_logic; + In_Meta_SrcMACAddress_nxt : out std_logic; + In_Meta_SrcMACAddress_Data : in T_SLV_8; + In_Meta_DestMACAddress_nxt : out std_logic; + In_Meta_DestMACAddress_Data : in T_SLV_8; -- OUT Port - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic; - Out_Meta_rst : in std_logic; - Out_Meta_SrcMACAddress_nxt : in std_logic; - Out_Meta_SrcMACAddress_Data : out T_SLV_8; - Out_Meta_DestMACAddress_nxt : in std_logic; - Out_Meta_DestMACAddress_Data : out T_SLV_8 + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic; + Out_Meta_rst : in std_logic; + Out_Meta_SrcMACAddress_nxt : in std_logic; + Out_Meta_SrcMACAddress_Data : out T_SLV_8; + Out_Meta_DestMACAddress_nxt : in std_logic; + Out_Meta_DestMACAddress_Data : out T_SLV_8 ); end entity; architecture rtl of mac_FrameLoopback is - constant META_STREAMID_SRCADDR : natural := 0; - constant META_STREAMID_DESTADDR : natural := 1; + constant META_STREAMID_SRCADDR : natural := 0; + constant META_STREAMID_DESTADDR : natural := 1; - constant META_BITS : T_POSVEC := ( - META_STREAMID_SRCADDR => 8, - META_STREAMID_DESTADDR => 8 + constant META_BITS : positive_vector := ( + META_STREAMID_SRCADDR => 8, + META_STREAMID_DESTADDR => 8 ); - constant META_FIFO_DEPTHS : T_POSVEC := ( - META_STREAMID_SRCADDR => 6, - META_STREAMID_DESTADDR => 6 + constant META_FIFO_DEPTHS : positive_vector := ( + META_STREAMID_SRCADDR => 6, + META_STREAMID_DESTADDR => 6 ); - signal LLBuf_MetaIn_nxt : std_logic_vector(META_BITS'length - 1 downto 0); - signal LLBuf_MetaIn_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); - signal LLBuf_MetaOut_nxt : std_logic_vector(META_BITS'length - 1 downto 0); - signal LLBuf_MetaOut_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); + signal LLBuf_MetaIn_nxt : std_logic_vector(META_BITS'length - 1 downto 0); + signal LLBuf_MetaIn_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); + signal LLBuf_MetaOut_nxt : std_logic_vector(META_BITS'length - 1 downto 0); + signal LLBuf_MetaOut_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); begin - LLBuf_MetaIn_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)) <= In_Meta_SrcMACAddress_Data; - LLBuf_MetaIn_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)) <= In_Meta_DestMACAddress_Data; + LLBuf_MetaIn_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)) <= In_Meta_SrcMACAddress_Data; + LLBuf_MetaIn_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)) <= In_Meta_DestMACAddress_Data; - In_Meta_SrcMACAddress_nxt <= LLBuf_MetaIn_nxt(META_STREAMID_SRCADDR); - In_Meta_DestMACAddress_nxt <= LLBuf_MetaIn_nxt(META_STREAMID_DESTADDR); + In_Meta_SrcMACAddress_nxt <= LLBuf_MetaIn_nxt(META_STREAMID_SRCADDR); + In_Meta_DestMACAddress_nxt <= LLBuf_MetaIn_nxt(META_STREAMID_DESTADDR); LLBuf: entity work.stream_FIFO generic map ( - FRAMES => MAX_FRAMES, - DATA_BITS => 8, - DATA_FIFO_DEPTH => 1024, - META_BITS => META_BITS, - META_FIFO_DEPTH => META_FIFO_DEPTHS + FRAMES => MAX_FRAMES, + DATA_BITS => 8, + DATA_FIFO_DEPTH => 1024, + META_BITS => META_BITS, + META_FIFO_DEPTH => META_FIFO_DEPTHS ) port map( - Clock => Clock, - Reset => Reset, - - In_Valid => In_Valid, - In_Data => In_Data, - In_SOF => In_SOF, - In_EOF => In_EOF, - In_Ack => In_Ack, - In_Meta_rst => In_Meta_rst, - In_Meta_nxt => LLBuf_MetaIn_nxt, - In_Meta_Data => LLBuf_MetaIn_Data, - - Out_Valid => Out_Valid, - Out_Data => Out_Data, - Out_SOF => Out_SOF, - Out_EOF => Out_EOF, - Out_Ack => Out_Ack, - Out_Meta_rst => Out_Meta_rst, - Out_Meta_nxt => LLBuf_MetaOut_nxt, - Out_Meta_Data => LLBuf_MetaOut_Data + Clock => Clock, + Reset => Reset, + + In_Valid => In_Valid, + In_Data => In_Data, + In_SOF => In_SOF, + In_EOF => In_EOF, + In_Ack => In_Ack, + In_Meta_rst => In_Meta_rst, + In_Meta_nxt => LLBuf_MetaIn_nxt, + In_Meta_Data => LLBuf_MetaIn_Data, + + Out_Valid => Out_Valid, + Out_Data => Out_Data, + Out_SOF => Out_SOF, + Out_EOF => Out_EOF, + Out_Ack => Out_Ack, + Out_Meta_rst => Out_Meta_rst, + Out_Meta_nxt => LLBuf_MetaOut_nxt, + Out_Meta_Data => LLBuf_MetaOut_Data ); -- unpack LLBuf metadata to signals - Out_Meta_SrcMACAddress_Data <= LLBuf_MetaOut_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)); -- Crossover: Source <= Destination - Out_Meta_DestMACAddress_Data <= LLBuf_MetaOut_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)); -- Crossover: Destination <= Source + Out_Meta_SrcMACAddress_Data <= LLBuf_MetaOut_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)); -- Crossover: Source <= Destination + Out_Meta_DestMACAddress_Data <= LLBuf_MetaOut_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)); -- Crossover: Destination <= Source -- pack metadata nxt signals to LLBuf meta vector - LLBuf_MetaOut_nxt(META_STREAMID_SRCADDR) <= Out_Meta_DestMACAddress_nxt; - LLBuf_MetaOut_nxt(META_STREAMID_DESTADDR) <= Out_Meta_SrcMACAddress_nxt; + LLBuf_MetaOut_nxt(META_STREAMID_SRCADDR) <= Out_Meta_DestMACAddress_nxt; + LLBuf_MetaOut_nxt(META_STREAMID_DESTADDR) <= Out_Meta_SrcMACAddress_nxt; end architecture; diff --git a/src/net/mac/mac_RX_DestMAC_Switch.vhdl b/src/net/mac/mac_RX_DestMAC_Switch.vhdl index 9eace7812..486aca549 100644 --- a/src/net/mac/mac_RX_DestMAC_Switch.vhdl +++ b/src/net/mac/mac_RX_DestMAC_Switch.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,38 +37,38 @@ use work.net.all; entity mac_RX_DestMAC_Switch is generic ( - DEBUG : boolean := FALSE; - MAC_ADDRESSES : T_NET_MAC_ADDRESS_VECTOR := (0 => C_NET_MAC_ADDRESS_EMPTY); - MAC_ADDRESSE_MASKS : T_NET_MAC_ADDRESS_VECTOR := (0 => C_NET_MAC_MASK_DEFAULT) + DEBUG : boolean := FALSE; + MAC_ADDRESSES : T_NET_MAC_ADDRESS_VECTOR := (0 => C_NET_MAC_ADDRESS_EMPTY); + MAC_ADDRESSE_MASKS : T_NET_MAC_ADDRESS_VECTOR := (0 => C_NET_MAC_MASK_DEFAULT) ); port ( - Clock : in std_logic; - Reset : in std_logic; - - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - - Out_Valid : out std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); - Out_Data : out T_SLVV_8(MAC_ADDRESSES'length - 1 downto 0); - Out_SOF : out std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); - Out_EOF : out std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); - Out_Ack : in std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); - Out_Meta_DestMACAddress_rst : in std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); - Out_Meta_DestMACAddress_nxt : in std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); - Out_Meta_DestMACAddress_Data : out T_SLVV_8(MAC_ADDRESSES'length - 1 downto 0) + Clock : in std_logic; + Reset : in std_logic; + + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + + Out_Valid : out std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); + Out_Data : out T_SLVV_8(MAC_ADDRESSES'length - 1 downto 0); + Out_SOF : out std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); + Out_EOF : out std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); + Out_Ack : in std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); + Out_Meta_DestMACAddress_rst : in std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); + Out_Meta_DestMACAddress_nxt : in std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); + Out_Meta_DestMACAddress_Data : out T_SLVV_8(MAC_ADDRESSES'length - 1 downto 0) ); end entity; architecture rtl of mac_RX_DestMAC_Switch is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; - constant PORTS : positive := MAC_ADDRESSES'length; - constant MAC_ADDRESSES_I : T_NET_MAC_ADDRESS_VECTOR(0 to PORTS - 1) := MAC_ADDRESSES; - constant MAC_ADDRESSE_MASKS_I : T_NET_MAC_ADDRESS_VECTOR(0 to PORTS - 1) := MAC_ADDRESSE_MASKS; + constant PORTS : positive := MAC_ADDRESSES'length; + constant MAC_ADDRESSES_I : T_NET_MAC_ADDRESS_VECTOR(0 to PORTS - 1) := MAC_ADDRESSES; + constant MAC_ADDRESSE_MASKS_I : T_NET_MAC_ADDRESS_VECTOR(0 to PORTS - 1) := MAC_ADDRESSE_MASKS; type T_STATE is ( ST_IDLE, @@ -82,208 +82,208 @@ architecture rtl of mac_RX_DestMAC_Switch is ST_DISCARD_FRAME ); - subtype T_MAC_BYTEINDEX is natural range 0 to 5; + subtype T_MAC_BYTEINDEX is natural range 0 to 5; - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); - signal In_Ack_i : std_logic; - signal Is_DataFlow : std_logic; - signal Is_SOF : std_logic; - signal Is_EOF : std_logic; + signal In_Ack_i : std_logic; + signal Is_DataFlow : std_logic; + signal Is_SOF : std_logic; + signal Is_EOF : std_logic; - signal New_Valid_i : std_logic; - signal New_SOF_i : std_logic; - signal Out_Ack_i : std_logic; + signal New_Valid_i : std_logic; + signal New_SOF_i : std_logic; + signal Out_Ack_i : std_logic; - signal MAC_ByteIndex : T_MAC_BYTEINDEX; + signal MAC_ByteIndex : T_MAC_BYTEINDEX; - signal CompareRegister_rst : std_logic; - signal CompareRegister_init : std_logic; - signal CompareRegister_clear : std_logic; - signal CompareRegister_en : std_logic; - signal CompareRegister_d : std_logic_vector(PORTS - 1 downto 0) := (others => '1'); - signal NoHits : std_logic; + signal CompareRegister_rst : std_logic; + signal CompareRegister_init : std_logic; + signal CompareRegister_clear : std_logic; + signal CompareRegister_en : std_logic; + signal CompareRegister_d : std_logic_vector(PORTS - 1 downto 0) := (others => '1'); + signal NoHits : std_logic; - constant MAC_ADDRESS_LENGTH : positive := 6; -- MAC -> 6 bytes - constant READER_COUNTER_BITS : positive := log2ceilnz(MAC_ADDRESS_LENGTH); + constant MAC_ADDRESS_LENGTH : positive := 6; -- MAC -> 6 bytes + constant READER_COUNTER_BITS : positive := log2ceilnz(MAC_ADDRESS_LENGTH); - signal Reader_Counter_rst : std_logic; - signal Reader_Counter_en : std_logic; - signal Reader_Counter_us : unsigned(READER_COUNTER_BITS - 1 downto 0) := (others => '0'); + signal Reader_Counter_rst : std_logic; + signal Reader_Counter_en : std_logic; + signal Reader_Counter_us : unsigned(READER_COUNTER_BITS - 1 downto 0) := (others => '0'); - signal DestinationMAC_rst : std_logic; - signal DestinationMAC_en : std_logic; - signal DestinationMAC_sel : T_MAC_BYTEINDEX; - signal DestinationMAC_d : T_NET_MAC_ADDRESS := C_NET_MAC_ADDRESS_EMPTY; + signal DestinationMAC_rst : std_logic; + signal DestinationMAC_en : std_logic; + signal DestinationMAC_sel : T_MAC_BYTEINDEX; + signal DestinationMAC_d : T_NET_MAC_ADDRESS := C_NET_MAC_ADDRESS_EMPTY; - signal Out_Meta_DestMACAddress_rst_i : std_logic; - signal Out_Meta_DestMACAddress_nxt_i : std_logic; + signal Out_Meta_DestMACAddress_rst_i : std_logic; + signal Out_Meta_DestMACAddress_nxt_i : std_logic; begin - assert FALSE report "RX_DestMAC_Switch: ports=" & integer'image(PORTS) severity NOTE; + assert FALSE report "RX_DestMAC_Switch: ports=" & integer'image(PORTS) severity NOTE; - In_Ack <= In_Ack_i; - Is_DataFlow <= In_Valid and In_Ack_i; - Is_SOF <= In_Valid and In_SOF; - Is_EOF <= In_Valid and In_EOF; + In_Ack <= In_Ack_i; + Is_DataFlow <= In_Valid and In_Ack_i; + Is_SOF <= In_Valid and In_SOF; + Is_EOF <= In_Valid and In_EOF; process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; process(State, Is_DataFlow, Is_SOF, Is_EOF, In_Valid, NoHits, Out_Ack_i) begin - NextState <= State; + NextState <= State; - In_Ack_i <= '0'; + In_Ack_i <= '0'; - New_Valid_i <= '0'; - New_SOF_i <= '0'; + New_Valid_i <= '0'; + New_SOF_i <= '0'; - CompareRegister_en <= '0'; - CompareRegister_rst <= '0'; - CompareRegister_init <= Is_SOF; - CompareRegister_clear <= Is_EOF; + CompareRegister_en <= '0'; + CompareRegister_rst <= '0'; + CompareRegister_init <= Is_SOF; + CompareRegister_clear <= Is_EOF; - MAC_ByteIndex <= 0; + MAC_ByteIndex <= 0; - DestinationMAC_rst <= '0'; - DestinationMAC_en <= '0'; + DestinationMAC_rst <= '0'; + DestinationMAC_en <= '0'; case State is when ST_IDLE => - MAC_ByteIndex <= 5; - DestinationMAC_en <= In_Valid; + MAC_ByteIndex <= 5; + DestinationMAC_en <= In_Valid; if (Is_SOF = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_DEST_MAC_1; + NextState <= ST_DEST_MAC_1; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_DEST_MAC_1 => - MAC_ByteIndex <= 4; - CompareRegister_en <= In_Valid; - DestinationMAC_en <= In_Valid; + MAC_ByteIndex <= 4; + CompareRegister_en <= In_Valid; + DestinationMAC_en <= In_Valid; if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_DEST_MAC_2; + NextState <= ST_DEST_MAC_2; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_DEST_MAC_2 => - MAC_ByteIndex <= 3; - CompareRegister_en <= In_Valid; - DestinationMAC_en <= In_Valid; + MAC_ByteIndex <= 3; + CompareRegister_en <= In_Valid; + DestinationMAC_en <= In_Valid; if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_DEST_MAC_3; + NextState <= ST_DEST_MAC_3; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_DEST_MAC_3 => - MAC_ByteIndex <= 2; - CompareRegister_en <= In_Valid; - DestinationMAC_en <= In_Valid; + MAC_ByteIndex <= 2; + CompareRegister_en <= In_Valid; + DestinationMAC_en <= In_Valid; if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_DEST_MAC_4; + NextState <= ST_DEST_MAC_4; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_DEST_MAC_4 => - MAC_ByteIndex <= 1; - CompareRegister_en <= In_Valid; - DestinationMAC_en <= In_Valid; + MAC_ByteIndex <= 1; + CompareRegister_en <= In_Valid; + DestinationMAC_en <= In_Valid; if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_DEST_MAC_5; + NextState <= ST_DEST_MAC_5; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_DEST_MAC_5 => - MAC_ByteIndex <= 0; - CompareRegister_en <= In_Valid; - DestinationMAC_en <= In_Valid; + MAC_ByteIndex <= 0; + CompareRegister_en <= In_Valid; + DestinationMAC_en <= In_Valid; if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_PAYLOAD_1; + NextState <= ST_PAYLOAD_1; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_PAYLOAD_1 => if (NoHits = '1') then if (Is_EOF = '0') then - In_Ack_i <= '1'; - NextState <= ST_DISCARD_FRAME; + In_Ack_i <= '1'; + NextState <= ST_DISCARD_FRAME; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; else - In_Ack_i <= Out_Ack_i; - New_Valid_i <= In_Valid; - New_SOF_i <= '1'; + In_Ack_i <= Out_Ack_i; + New_Valid_i <= In_Valid; + New_SOF_i <= '1'; if (Is_DataFlow = '1') then if (Is_EOF = '0') then - NextState <= ST_PAYLOAD_N; + NextState <= ST_PAYLOAD_N; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; end if; when ST_PAYLOAD_N => - In_Ack_i <= Out_Ack_i; - New_Valid_i <= In_Valid; + In_Ack_i <= Out_Ack_i; + New_Valid_i <= In_Valid; if ((Is_DataFlow and Is_EOF) = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; when ST_DISCARD_FRAME => - In_Ack_i <= '1'; + In_Ack_i <= '1'; if ((Is_DataFlow and Is_EOF) = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end case; @@ -291,7 +291,7 @@ begin gen0 : for i in 0 to PORTS - 1 generate - signal Hit : std_logic; + signal Hit : std_logic; begin Hit <= to_sl((In_Data and MAC_ADDRESSE_MASKS_I(i)(MAC_ByteIndex)) = (MAC_ADDRESSES_I(i)(MAC_ByteIndex) and MAC_ADDRESSE_MASKS_I(i)(MAC_ByteIndex))); @@ -299,54 +299,54 @@ begin begin if rising_edge(Clock) then if ((Reset or CompareRegister_rst) = '1') then - CompareRegister_d(i) <= '0'; - elsif (CompareRegister_init = '1') then - CompareRegister_d(i) <= Hit; - elsif (CompareRegister_clear = '1') then - CompareRegister_d(i) <= '0'; + CompareRegister_d(i) <= '0'; + elsif (CompareRegister_init = '1') then + CompareRegister_d(i) <= Hit; + elsif (CompareRegister_clear = '1') then + CompareRegister_d(i) <= '0'; elsif (CompareRegister_en = '1') then - CompareRegister_d(i) <= CompareRegister_d(i) and Hit; + CompareRegister_d(i) <= CompareRegister_d(i) and Hit; end if; end if; end process; end generate; - NoHits <= slv_nor(CompareRegister_d); + NoHits <= slv_nor(CompareRegister_d); - DestinationMAC_sel <= MAC_ByteIndex; + DestinationMAC_sel <= MAC_ByteIndex; process(Clock) begin if rising_edge(Clock) then if ((Reset or DestinationMAC_rst) = '1') then - DestinationMAC_d <= C_NET_MAC_ADDRESS_EMPTY; + DestinationMAC_d <= C_NET_MAC_ADDRESS_EMPTY; elsif (DestinationMAC_en = '1') then - DestinationMAC_d(DestinationMAC_sel) <= In_Data; + DestinationMAC_d(DestinationMAC_sel) <= In_Data; end if; end if; end process; - Reader_Counter_rst <= Out_Meta_DestMACAddress_rst_i; - Reader_Counter_en <= Out_Meta_DestMACAddress_nxt_i; + Reader_Counter_rst <= Out_Meta_DestMACAddress_rst_i; + Reader_Counter_en <= Out_Meta_DestMACAddress_nxt_i; process(Clock) begin if rising_edge(Clock) then if ((Reset or Reader_Counter_rst) = '1') then - Reader_Counter_us <= to_unsigned(T_MAC_BYTEINDEX'high, Reader_Counter_us'length); + Reader_Counter_us <= to_unsigned(T_MAC_BYTEINDEX'high, Reader_Counter_us'length); elsif (Reader_Counter_en = '1') then - Reader_Counter_us <= Reader_Counter_us - 1; + Reader_Counter_us <= Reader_Counter_us - 1; end if; end if; end process; - Out_Valid <= (Out_Valid'range => New_Valid_i) and CompareRegister_d; - Out_Data <= (Out_Data'range => In_Data); - Out_SOF <= (Out_SOF'range => New_SOF_i); - Out_EOF <= (Out_EOF'range => In_EOF); - Out_Ack_i <= slv_or(Out_Ack and CompareRegister_d); - Out_Meta_DestMACAddress_rst_i <= slv_or(Out_Meta_DestMACAddress_rst and CompareRegister_d); - Out_Meta_DestMACAddress_nxt_i <= slv_or(Out_Meta_DestMACAddress_nxt and CompareRegister_d); - Out_Meta_DestMACAddress_Data <= (Out_Data'range => DestinationMAC_d(to_index(Reader_Counter_us, DestinationMAC_d'high))); + Out_Valid <= (Out_Valid'range => New_Valid_i) and CompareRegister_d; + Out_Data <= (Out_Data'range => In_Data); + Out_SOF <= (Out_SOF'range => New_SOF_i); + Out_EOF <= (Out_EOF'range => In_EOF); + Out_Ack_i <= slv_or(Out_Ack and CompareRegister_d); + Out_Meta_DestMACAddress_rst_i <= slv_or(Out_Meta_DestMACAddress_rst and CompareRegister_d); + Out_Meta_DestMACAddress_nxt_i <= slv_or(Out_Meta_DestMACAddress_nxt and CompareRegister_d); + Out_Meta_DestMACAddress_Data <= (Out_Data'range => DestinationMAC_d(to_index(Reader_Counter_us, DestinationMAC_d'high))); end architecture; diff --git a/src/net/mac/mac_RX_SrcMAC_Filter.vhdl b/src/net/mac/mac_RX_SrcMAC_Filter.vhdl index 46b8837f5..619c5e25b 100644 --- a/src/net/mac/mac_RX_SrcMAC_Filter.vhdl +++ b/src/net/mac/mac_RX_SrcMAC_Filter.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,43 +37,43 @@ use work.net.all; entity mac_RX_SrcMAC_Filter is generic ( - DEBUG : boolean := FALSE; - MAC_ADDRESSES : T_NET_MAC_ADDRESS_VECTOR := (0 => C_NET_MAC_ADDRESS_EMPTY); - MAC_ADDRESSE_MASKS : T_NET_MAC_ADDRESS_VECTOR := (0 => C_NET_MAC_MASK_DEFAULT) + DEBUG : boolean := FALSE; + MAC_ADDRESSES : T_NET_MAC_ADDRESS_VECTOR := (0 => C_NET_MAC_ADDRESS_EMPTY); + MAC_ADDRESSE_MASKS : T_NET_MAC_ADDRESS_VECTOR := (0 => C_NET_MAC_MASK_DEFAULT) ); port ( - Clock : in std_logic; - Reset : in std_logic; - - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - In_Meta_rst : out std_logic; - In_Meta_DestMACAddress_nxt : out std_logic; - In_Meta_DestMACAddress_Data : in T_SLV_8; - - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic; - Out_Meta_rst : in std_logic; - Out_Meta_DestMACAddress_nxt : in std_logic; - Out_Meta_DestMACAddress_Data : out T_SLV_8; - Out_Meta_SrcMACAddress_nxt : in std_logic; - Out_Meta_SrcMACAddress_Data : out T_SLV_8 + Clock : in std_logic; + Reset : in std_logic; + + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + In_Meta_rst : out std_logic; + In_Meta_DestMACAddress_nxt : out std_logic; + In_Meta_DestMACAddress_Data : in T_SLV_8; + + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic; + Out_Meta_rst : in std_logic; + Out_Meta_DestMACAddress_nxt : in std_logic; + Out_Meta_DestMACAddress_Data : out T_SLV_8; + Out_Meta_SrcMACAddress_nxt : in std_logic; + Out_Meta_SrcMACAddress_Data : out T_SLV_8 ); end entity; architecture rtl of mac_RX_SrcMAC_Filter is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; - constant PATTERN_COUNT : positive := MAC_ADDRESSES'length; - constant MAC_ADDRESSES_I : T_NET_MAC_ADDRESS_VECTOR(0 to PATTERN_COUNT - 1) := MAC_ADDRESSES; - constant MAC_ADDRESSE_MASKS_I : T_NET_MAC_ADDRESS_VECTOR(0 to PATTERN_COUNT - 1) := MAC_ADDRESSE_MASKS; + constant PATTERN_COUNT : positive := MAC_ADDRESSES'length; + constant MAC_ADDRESSES_I : T_NET_MAC_ADDRESS_VECTOR(0 to PATTERN_COUNT - 1) := MAC_ADDRESSES; + constant MAC_ADDRESSE_MASKS_I : T_NET_MAC_ADDRESS_VECTOR(0 to PATTERN_COUNT - 1) := MAC_ADDRESSE_MASKS; type T_STATE is ( ST_IDLE, @@ -87,208 +87,208 @@ architecture rtl of mac_RX_SrcMAC_Filter is ST_DISCARD_FRAME ); - subtype T_MAC_BYTEINDEX is natural range 0 to 5; + subtype T_MAC_BYTEINDEX is natural range 0 to 5; - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); - signal In_Ack_i : std_logic; - signal Is_DataFlow : std_logic; - signal Is_SOF : std_logic; - signal Is_EOF : std_logic; + signal In_Ack_i : std_logic; + signal Is_DataFlow : std_logic; + signal Is_SOF : std_logic; + signal Is_EOF : std_logic; - signal New_Valid_i : std_logic; - signal New_SOF_i : std_logic; - signal Out_Ack_i : std_logic; + signal New_Valid_i : std_logic; + signal New_SOF_i : std_logic; + signal Out_Ack_i : std_logic; - signal MAC_ByteIndex : T_MAC_BYTEINDEX; + signal MAC_ByteIndex : T_MAC_BYTEINDEX; - signal CompareRegister_rst : std_logic; - signal CompareRegister_init : std_logic; - signal CompareRegister_clear : std_logic; - signal CompareRegister_en : std_logic; - signal CompareRegister_d : std_logic_vector(PATTERN_COUNT - 1 downto 0) := (others => '1'); - signal NoHits : std_logic; + signal CompareRegister_rst : std_logic; + signal CompareRegister_init : std_logic; + signal CompareRegister_clear : std_logic; + signal CompareRegister_en : std_logic; + signal CompareRegister_d : std_logic_vector(PATTERN_COUNT - 1 downto 0) := (others => '1'); + signal NoHits : std_logic; - signal SourceMACAddress_rst : std_logic; - signal SourceMACAddress_en : std_logic; - signal SourceMACAddress_sel : T_MAC_BYTEINDEX; - signal SourceMACAddress_d : T_NET_MAC_ADDRESS := C_NET_MAC_ADDRESS_EMPTY; + signal SourceMACAddress_rst : std_logic; + signal SourceMACAddress_en : std_logic; + signal SourceMACAddress_sel : T_MAC_BYTEINDEX; + signal SourceMACAddress_d : T_NET_MAC_ADDRESS := C_NET_MAC_ADDRESS_EMPTY; - constant MAC_ADDRESS_LENGTH : positive := 6; -- MAC -> 6 bytes - constant READER_COUNTER_BITS : positive := log2ceilnz(MAC_ADDRESS_LENGTH); + constant MAC_ADDRESS_LENGTH : positive := 6; -- MAC -> 6 bytes + constant READER_COUNTER_BITS : positive := log2ceilnz(MAC_ADDRESS_LENGTH); - signal Reader_Counter_rst : std_logic; - signal Reader_Counter_en : std_logic; - signal Reader_Counter_us : unsigned(READER_COUNTER_BITS - 1 downto 0) := (others => '0'); + signal Reader_Counter_rst : std_logic; + signal Reader_Counter_en : std_logic; + signal Reader_Counter_us : unsigned(READER_COUNTER_BITS - 1 downto 0) := (others => '0'); - signal Out_Meta_rst_i : std_logic; - signal Out_Meta_SrcMACAddress_nxt_i : std_logic; + signal Out_Meta_rst_i : std_logic; + signal Out_Meta_SrcMACAddress_nxt_i : std_logic; begin - assert FALSE report "RX_SrcMAC_Filter: patterns=" & integer'image(PATTERN_COUNT) severity NOTE; + assert FALSE report "RX_SrcMAC_Filter: patterns=" & integer'image(PATTERN_COUNT) severity NOTE; - In_Ack <= In_Ack_i; - Is_DataFlow <= In_Valid and In_Ack_i; - Is_SOF <= In_Valid and In_SOF; - Is_EOF <= In_Valid and In_EOF; + In_Ack <= In_Ack_i; + Is_DataFlow <= In_Valid and In_Ack_i; + Is_SOF <= In_Valid and In_SOF; + Is_EOF <= In_Valid and In_EOF; process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; process(State, Is_DataFlow, Is_SOF, Is_EOF, In_Valid, NoHits, Out_Ack_i) begin - NextState <= State; + NextState <= State; - In_Ack_i <= '0'; + In_Ack_i <= '0'; - New_Valid_i <= '0'; - New_SOF_i <= '0'; + New_Valid_i <= '0'; + New_SOF_i <= '0'; - CompareRegister_en <= '0'; - CompareRegister_rst <= '0'; - CompareRegister_init <= Is_SOF; - CompareRegister_clear <= Is_EOF; + CompareRegister_en <= '0'; + CompareRegister_rst <= '0'; + CompareRegister_init <= Is_SOF; + CompareRegister_clear <= Is_EOF; - SourceMACAddress_rst <= Is_EOF; - SourceMACAddress_en <= Is_SOF; + SourceMACAddress_rst <= Is_EOF; + SourceMACAddress_en <= Is_SOF; - MAC_ByteIndex <= 0; + MAC_ByteIndex <= 0; case State is when ST_IDLE => - MAC_ByteIndex <= 5; + MAC_ByteIndex <= 5; if (Is_SOF = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_SRC_MAC_1; + NextState <= ST_SRC_MAC_1; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_SRC_MAC_1 => - MAC_ByteIndex <= 4; - CompareRegister_en <= In_Valid; - SourceMACAddress_en <= In_Valid; + MAC_ByteIndex <= 4; + CompareRegister_en <= In_Valid; + SourceMACAddress_en <= In_Valid; if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_SRC_MAC_2; + NextState <= ST_SRC_MAC_2; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_SRC_MAC_2 => - MAC_ByteIndex <= 3; - CompareRegister_en <= In_Valid; - SourceMACAddress_en <= In_Valid; + MAC_ByteIndex <= 3; + CompareRegister_en <= In_Valid; + SourceMACAddress_en <= In_Valid; if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_SRC_MAC_3; + NextState <= ST_SRC_MAC_3; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_SRC_MAC_3 => - MAC_ByteIndex <= 2; - CompareRegister_en <= In_Valid; - SourceMACAddress_en <= In_Valid; + MAC_ByteIndex <= 2; + CompareRegister_en <= In_Valid; + SourceMACAddress_en <= In_Valid; if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_SRC_MAC_4; + NextState <= ST_SRC_MAC_4; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_SRC_MAC_4 => - MAC_ByteIndex <= 1; - CompareRegister_en <= In_Valid; - SourceMACAddress_en <= In_Valid; + MAC_ByteIndex <= 1; + CompareRegister_en <= In_Valid; + SourceMACAddress_en <= In_Valid; if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_SRC_MAC_5; + NextState <= ST_SRC_MAC_5; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_SRC_MAC_5 => - MAC_ByteIndex <= 0; - CompareRegister_en <= In_Valid; - SourceMACAddress_en <= In_Valid; + MAC_ByteIndex <= 0; + CompareRegister_en <= In_Valid; + SourceMACAddress_en <= In_Valid; if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_PAYLOAD_1; + NextState <= ST_PAYLOAD_1; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_PAYLOAD_1 => if (NoHits = '1') then if (Is_EOF = '0') then - In_Ack_i <= '1'; - NextState <= ST_DISCARD_FRAME; + In_Ack_i <= '1'; + NextState <= ST_DISCARD_FRAME; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; else - In_Ack_i <= Out_Ack_i; - New_Valid_i <= In_Valid; - New_SOF_i <= '1'; + In_Ack_i <= Out_Ack_i; + New_Valid_i <= In_Valid; + New_SOF_i <= '1'; if (Is_DataFlow = '1') then if (Is_EOF = '0') then - NextState <= ST_PAYLOAD_N; + NextState <= ST_PAYLOAD_N; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; end if; when ST_PAYLOAD_N => - In_Ack_i <= Out_Ack_i; - New_Valid_i <= In_Valid; + In_Ack_i <= Out_Ack_i; + New_Valid_i <= In_Valid; if ((Is_DataFlow and Is_EOF) = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; when ST_DISCARD_FRAME => - In_Ack_i <= '1'; + In_Ack_i <= '1'; if ((Is_DataFlow and Is_EOF) = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end case; @@ -296,7 +296,7 @@ begin gen0 : for i in 0 to PATTERN_COUNT - 1 generate - signal Hit : std_logic; + signal Hit : std_logic; begin Hit <= to_sl((In_Data and MAC_ADDRESSE_MASKS_I(i)(MAC_ByteIndex)) = (MAC_ADDRESSES_I(i)(MAC_ByteIndex) and MAC_ADDRESSE_MASKS_I(i)(MAC_ByteIndex))); @@ -304,63 +304,63 @@ begin begin if rising_edge(Clock) then if ((Reset or CompareRegister_rst) = '1') then - CompareRegister_d(i) <= '0'; - elsif (CompareRegister_init = '1') then - CompareRegister_d(i) <= Hit; - elsif (CompareRegister_clear = '1') then - CompareRegister_d(i) <= '0'; + CompareRegister_d(i) <= '0'; + elsif (CompareRegister_init = '1') then + CompareRegister_d(i) <= Hit; + elsif (CompareRegister_clear = '1') then + CompareRegister_d(i) <= '0'; elsif (CompareRegister_en = '1') then - CompareRegister_d(i) <= CompareRegister_d(i) and Hit; + CompareRegister_d(i) <= CompareRegister_d(i) and Hit; end if; end if; end process; end generate; - NoHits <= slv_nor(CompareRegister_d); + NoHits <= slv_nor(CompareRegister_d); - SourceMACAddress_sel <= MAC_ByteIndex; + SourceMACAddress_sel <= MAC_ByteIndex; process(Clock) begin if rising_edge(Clock) then if ((Reset or SourceMACAddress_rst) = '1') then - SourceMACAddress_d <= C_NET_MAC_ADDRESS_EMPTY; + SourceMACAddress_d <= C_NET_MAC_ADDRESS_EMPTY; elsif (SourceMACAddress_en = '1') then - SourceMACAddress_d(SourceMACAddress_sel) <= In_Data; + SourceMACAddress_d(SourceMACAddress_sel) <= In_Data; end if; end if; end process; - Reader_Counter_rst <= Out_Meta_rst_i; - Reader_Counter_en <= Out_Meta_SrcMACAddress_nxt_i; + Reader_Counter_rst <= Out_Meta_rst_i; + Reader_Counter_en <= Out_Meta_SrcMACAddress_nxt_i; process(Clock) begin if rising_edge(Clock) then if ((Reset or Reader_Counter_rst) = '1') then - Reader_Counter_us <= to_unsigned(T_MAC_BYTEINDEX'high, Reader_Counter_us'length); + Reader_Counter_us <= to_unsigned(T_MAC_BYTEINDEX'high, Reader_Counter_us'length); elsif (Reader_Counter_en = '1') then - Reader_Counter_us <= Reader_Counter_us - 1; + Reader_Counter_us <= Reader_Counter_us - 1; end if; end if; end process; - Out_Valid <= New_Valid_i; - Out_Data <= In_Data; - Out_SOF <= New_SOF_i; - Out_EOF <= In_EOF; - Out_Ack_i <= Out_Ack; + Out_Valid <= New_Valid_i; + Out_Data <= In_Data; + Out_SOF <= New_SOF_i; + Out_EOF <= In_EOF; + Out_Ack_i <= Out_Ack; -- Meta: rst - Out_Meta_rst_i <= Out_Meta_rst; - In_Meta_rst <= Out_Meta_rst_i; + Out_Meta_rst_i <= Out_Meta_rst; + In_Meta_rst <= Out_Meta_rst_i; -- Meta: DestMACAddress - In_Meta_DestMACAddress_nxt <= Out_Meta_DestMACAddress_nxt; - Out_Meta_DestMACAddress_Data <= In_Meta_DestMACAddress_Data; + In_Meta_DestMACAddress_nxt <= Out_Meta_DestMACAddress_nxt; + Out_Meta_DestMACAddress_Data <= In_Meta_DestMACAddress_Data; -- Meta: SrcMACAddress - Out_Meta_SrcMACAddress_nxt_i <= Out_Meta_SrcMACAddress_nxt; - Out_Meta_SrcMACAddress_Data <= SourceMACAddress_d(to_index(Reader_Counter_us, SourceMACAddress_d'high)); + Out_Meta_SrcMACAddress_nxt_i <= Out_Meta_SrcMACAddress_nxt; + Out_Meta_SrcMACAddress_Data <= SourceMACAddress_d(to_index(Reader_Counter_us, SourceMACAddress_d'high)); end architecture; diff --git a/src/net/mac/mac_RX_Type_Switch.vhdl b/src/net/mac/mac_RX_Type_Switch.vhdl index 67cc490ac..e04b6e106 100644 --- a/src/net/mac/mac_RX_Type_Switch.vhdl +++ b/src/net/mac/mac_RX_Type_Switch.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,44 +37,44 @@ use work.net.all; entity mac_RX_Type_Switch is generic ( - DEBUG : boolean := FALSE; - ETHERNET_TYPES : T_NET_MAC_ETHERNETTYPE_VECTOR := (0 => C_NET_MAC_ETHERNETTYPE_EMPTY) + DEBUG : boolean := FALSE; + ETHERNET_TYPES : T_NET_MAC_ETHERNETTYPE_VECTOR := (0 => C_NET_MAC_ETHERNETTYPE_EMPTY) ); port ( - Clock : in std_logic; - Reset : in std_logic; - - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - In_Meta_rst : out std_logic; - In_Meta_SrcMACAddress_nxt : out std_logic; - In_Meta_SrcMACAddress_Data : in T_SLV_8; - In_Meta_DestMACAddress_nxt : out std_logic; - In_Meta_DestMACAddress_Data : in T_SLV_8; - - Out_Valid : out std_logic_vector(ETHERNET_TYPES'length - 1 downto 0); - Out_Data : out T_SLVV_8(ETHERNET_TYPES'length - 1 downto 0); - Out_SOF : out std_logic_vector(ETHERNET_TYPES'length - 1 downto 0); - Out_EOF : out std_logic_vector(ETHERNET_TYPES'length - 1 downto 0); - Out_Ack : in std_logic_vector(ETHERNET_TYPES'length - 1 downto 0); - Out_Meta_rst : in std_logic_vector(ETHERNET_TYPES'length - 1 downto 0); - Out_Meta_SrcMACAddress_nxt : in std_logic_vector(ETHERNET_TYPES'length - 1 downto 0); - Out_Meta_SrcMACAddress_Data : out T_SLVV_8(ETHERNET_TYPES'length - 1 downto 0); - Out_Meta_DestMACAddress_nxt : in std_logic_vector(ETHERNET_TYPES'length - 1 downto 0); - Out_Meta_DestMACAddress_Data : out T_SLVV_8(ETHERNET_TYPES'length - 1 downto 0); - Out_Meta_EthType : out T_NET_MAC_ETHERNETTYPE_VECTOR(ETHERNET_TYPES'length - 1 downto 0) + Clock : in std_logic; + Reset : in std_logic; + + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + In_Meta_rst : out std_logic; + In_Meta_SrcMACAddress_nxt : out std_logic; + In_Meta_SrcMACAddress_Data : in T_SLV_8; + In_Meta_DestMACAddress_nxt : out std_logic; + In_Meta_DestMACAddress_Data : in T_SLV_8; + + Out_Valid : out std_logic_vector(ETHERNET_TYPES'length - 1 downto 0); + Out_Data : out T_SLVV_8(ETHERNET_TYPES'length - 1 downto 0); + Out_SOF : out std_logic_vector(ETHERNET_TYPES'length - 1 downto 0); + Out_EOF : out std_logic_vector(ETHERNET_TYPES'length - 1 downto 0); + Out_Ack : in std_logic_vector(ETHERNET_TYPES'length - 1 downto 0); + Out_Meta_rst : in std_logic_vector(ETHERNET_TYPES'length - 1 downto 0); + Out_Meta_SrcMACAddress_nxt : in std_logic_vector(ETHERNET_TYPES'length - 1 downto 0); + Out_Meta_SrcMACAddress_Data : out T_SLVV_8(ETHERNET_TYPES'length - 1 downto 0); + Out_Meta_DestMACAddress_nxt : in std_logic_vector(ETHERNET_TYPES'length - 1 downto 0); + Out_Meta_DestMACAddress_Data : out T_SLVV_8(ETHERNET_TYPES'length - 1 downto 0); + Out_Meta_EthType : out T_NET_MAC_ETHERNETTYPE_VECTOR(ETHERNET_TYPES'length - 1 downto 0) ); end entity; architecture rtl of mac_RX_Type_Switch is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; - constant PORTS : positive := ETHERNET_TYPES'length; - constant ETHERNET_TYPES_I : T_NET_MAC_ETHERNETTYPE_VECTOR(0 to PORTS - 1) := ETHERNET_TYPES; + constant PORTS : positive := ETHERNET_TYPES'length; + constant ETHERNET_TYPES_I : T_NET_MAC_ETHERNETTYPE_VECTOR(0 to PORTS - 1) := ETHERNET_TYPES; type T_STATE is ( ST_IDLE, @@ -84,140 +84,140 @@ architecture rtl of mac_RX_Type_Switch is ST_DISCARD_FRAME ); - subtype T_ETHERNETTYPE_BYTEINDEX is natural range 0 to 1; + subtype T_ETHERNETTYPE_BYTEINDEX is natural range 0 to 1; - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); - signal In_Ack_i : std_logic; - signal Is_DataFlow : std_logic; - signal Is_SOF : std_logic; - signal Is_EOF : std_logic; + signal In_Ack_i : std_logic; + signal Is_DataFlow : std_logic; + signal Is_SOF : std_logic; + signal Is_EOF : std_logic; - signal New_Valid_i : std_logic; - signal New_SOF_i : std_logic; - signal Out_Ack_i : std_logic; + signal New_Valid_i : std_logic; + signal New_SOF_i : std_logic; + signal Out_Ack_i : std_logic; - signal EthernetType_CompareIndex : T_ETHERNETTYPE_BYTEINDEX; + signal EthernetType_CompareIndex : T_ETHERNETTYPE_BYTEINDEX; - signal CompareRegister_rst : std_logic; - signal CompareRegister_init : std_logic; - signal CompareRegister_clear : std_logic; - signal CompareRegister_en : std_logic; - signal CompareRegister_d : std_logic_vector(PORTS - 1 downto 0) := (others => '1'); - signal NoHits : std_logic; + signal CompareRegister_rst : std_logic; + signal CompareRegister_init : std_logic; + signal CompareRegister_clear : std_logic; + signal CompareRegister_en : std_logic; + signal CompareRegister_d : std_logic_vector(PORTS - 1 downto 0) := (others => '1'); + signal NoHits : std_logic; - signal EthernetType_rst : std_logic; - signal EthernetType_en : std_logic; - signal EthernetType_sel : T_ETHERNETTYPE_BYTEINDEX; - signal EthernetType_d : T_NET_MAC_ETHERNETTYPE := C_NET_MAC_ETHERNETTYPE_EMPTY; + signal EthernetType_rst : std_logic; + signal EthernetType_en : std_logic; + signal EthernetType_sel : T_ETHERNETTYPE_BYTEINDEX; + signal EthernetType_d : T_NET_MAC_ETHERNETTYPE := C_NET_MAC_ETHERNETTYPE_EMPTY; begin - In_Ack <= In_Ack_i; - Is_DataFlow <= In_Valid and In_Ack_i; - Is_SOF <= In_Valid and In_SOF; - Is_EOF <= In_Valid and In_EOF; + In_Ack <= In_Ack_i; + Is_DataFlow <= In_Valid and In_Ack_i; + Is_SOF <= In_Valid and In_SOF; + Is_EOF <= In_Valid and In_EOF; process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; process(State, Is_DataFlow, Is_SOF, Is_EOF, In_Valid, NoHits, Out_Ack_i) begin - NextState <= State; + NextState <= State; - In_Ack_i <= '0'; + In_Ack_i <= '0'; - New_Valid_i <= '0'; - New_SOF_i <= '0'; + New_Valid_i <= '0'; + New_SOF_i <= '0'; - CompareRegister_en <= '0'; - CompareRegister_rst <= '0'; - CompareRegister_init <= Is_SOF; - CompareRegister_clear <= Is_EOF; + CompareRegister_en <= '0'; + CompareRegister_rst <= '0'; + CompareRegister_init <= Is_SOF; + CompareRegister_clear <= Is_EOF; - EthernetType_CompareIndex <= 1; - EthernetType_rst <= '0'; - EthernetType_en <= '0'; - EthernetType_sel <= 1; + EthernetType_CompareIndex <= 1; + EthernetType_rst <= '0'; + EthernetType_en <= '0'; + EthernetType_sel <= 1; case State is when ST_IDLE => - EthernetType_rst <= '1'; - EthernetType_en <= '0'; + EthernetType_rst <= '1'; + EthernetType_en <= '0'; if (Is_SOF = '1') then - EthernetType_rst <= '0'; - EthernetType_en <= '1'; - In_Ack_i <= '1'; + EthernetType_rst <= '0'; + EthernetType_en <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_TYPE_1; + NextState <= ST_TYPE_1; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_TYPE_1 => - EthernetType_CompareIndex <= 0; - EthernetType_en <= In_Valid; - EthernetType_sel <= 0; - CompareRegister_en <= In_Valid; + EthernetType_CompareIndex <= 0; + EthernetType_en <= In_Valid; + EthernetType_sel <= 0; + CompareRegister_en <= In_Valid; if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_PAYLOAD_1; + NextState <= ST_PAYLOAD_1; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_PAYLOAD_1 => if (NoHits = '1') then if (Is_EOF = '0') then - In_Ack_i <= '1'; - NextState <= ST_DISCARD_FRAME; + In_Ack_i <= '1'; + NextState <= ST_DISCARD_FRAME; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; else - In_Ack_i <= Out_Ack_i; - New_Valid_i <= In_Valid; - New_SOF_i <= '1'; + In_Ack_i <= Out_Ack_i; + New_Valid_i <= In_Valid; + New_SOF_i <= '1'; if (Is_DataFlow = '1') then if (Is_EOF = '0') then - NextState <= ST_PAYLOAD_N; + NextState <= ST_PAYLOAD_N; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; end if; when ST_PAYLOAD_N => - In_Ack_i <= Out_Ack_i; - New_Valid_i <= In_Valid; + In_Ack_i <= Out_Ack_i; + New_Valid_i <= In_Valid; if ((Is_DataFlow and Is_EOF) = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; when ST_DISCARD_FRAME => - In_Ack_i <= '1'; + In_Ack_i <= '1'; if ((Is_DataFlow and Is_EOF) = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end case; @@ -225,7 +225,7 @@ begin gen0 : for i in 0 to PORTS - 1 generate - signal Hit : std_logic; + signal Hit : std_logic; begin Hit <= to_sl(In_Data = ETHERNET_TYPES_I(i)(EthernetType_CompareIndex)); @@ -233,51 +233,51 @@ begin begin if rising_edge(Clock) then if ((Reset or CompareRegister_rst) = '1') then - CompareRegister_d(i) <= '0'; - elsif (CompareRegister_init = '1') then - CompareRegister_d(i) <= Hit; - elsif (CompareRegister_clear = '1') then - CompareRegister_d(i) <= '0'; + CompareRegister_d(i) <= '0'; + elsif (CompareRegister_init = '1') then + CompareRegister_d(i) <= Hit; + elsif (CompareRegister_clear = '1') then + CompareRegister_d(i) <= '0'; elsif (CompareRegister_en = '1') then - CompareRegister_d(i) <= CompareRegister_d(i) and Hit; + CompareRegister_d(i) <= CompareRegister_d(i) and Hit; end if; end if; end process; end generate; - NoHits <= slv_nor(CompareRegister_d); - --- process(Clock) --- begin --- if rising_edge(Clock) then --- if ((Reset OR EthernetType_rst) = '1') then --- EthernetType_d <= C_NET_MAC_ETHERNETTYPE_EMPTY; --- elsif (EthernetType_en = '1') then --- EthernetType_d(EthernetType_sel) <= In_Data; --- end if; --- end if; --- end process; - - Out_Valid <= (Out_Valid'range => New_Valid_i) and CompareRegister_d; - Out_Data <= (Out_Data'range => In_Data); - Out_SOF <= (Out_SOF'range => New_SOF_i); - Out_EOF <= (Out_EOF'range => In_EOF); - Out_Ack_i <= slv_or(Out_Ack and CompareRegister_d); + NoHits <= slv_nor(CompareRegister_d); + +-- process(Clock) +-- begin +-- if rising_edge(Clock) then +-- if ((Reset OR EthernetType_rst) = '1') then +-- EthernetType_d <= C_NET_MAC_ETHERNETTYPE_EMPTY; +-- elsif (EthernetType_en = '1') then +-- EthernetType_d(EthernetType_sel) <= In_Data; +-- end if; +-- end if; +-- end process; + + Out_Valid <= (Out_Valid'range => New_Valid_i) and CompareRegister_d; + Out_Data <= (Out_Data'range => In_Data); + Out_SOF <= (Out_SOF'range => New_SOF_i); + Out_EOF <= (Out_EOF'range => In_EOF); + Out_Ack_i <= slv_or(Out_Ack and CompareRegister_d); -- Meta: rst - In_Meta_rst <= slv_or(Out_Meta_rst and CompareRegister_d); + In_Meta_rst <= slv_or(Out_Meta_rst and CompareRegister_d); -- Meta: DestMACAddress - In_Meta_DestMACAddress_nxt <= slv_or(Out_Meta_DestMACAddress_nxt and CompareRegister_d); - Out_Meta_DestMACAddress_Data <= (Out_Data'range => In_Meta_DestMACAddress_Data); + In_Meta_DestMACAddress_nxt <= slv_or(Out_Meta_DestMACAddress_nxt and CompareRegister_d); + Out_Meta_DestMACAddress_Data <= (Out_Data'range => In_Meta_DestMACAddress_Data); -- Meta: SrcMACAddress - In_Meta_SrcMACAddress_nxt <= slv_or(Out_Meta_SrcMACAddress_nxt and CompareRegister_d); - Out_Meta_SrcMACAddress_Data <= (Out_Data'range => In_Meta_SrcMACAddress_Data); + In_Meta_SrcMACAddress_nxt <= slv_or(Out_Meta_SrcMACAddress_nxt and CompareRegister_d); + Out_Meta_SrcMACAddress_Data <= (Out_Data'range => In_Meta_SrcMACAddress_Data); -- Meta: EthType genEthType : for i in ETHERNET_TYPES_I'range generate - Out_Meta_EthType(i) <= ETHERNET_TYPES_I(i); --(Out_Data'range => EthernetType_d); -- after exact match, the register value must be the same as in the array => use const arry values => better optimization + Out_Meta_EthType(i) <= ETHERNET_TYPES_I(i); --(Out_Data'range => EthernetType_d); -- after exact match, the register value must be the same as in the array => use const arry values => better optimization end generate; end architecture; diff --git a/src/net/mac/mac_TX_DestMAC_Prepender.vhdl b/src/net/mac/mac_TX_DestMAC_Prepender.vhdl index 77c8f9d13..351116737 100644 --- a/src/net/mac/mac_TX_DestMAC_Prepender.vhdl +++ b/src/net/mac/mac_TX_DestMAC_Prepender.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,32 +37,32 @@ use work.net.all; entity mac_TX_DestMAC_Prepender is generic ( - DEBUG : boolean := FALSE + DEBUG : boolean := FALSE ); port ( - Clock : in std_logic; - Reset : in std_logic; - - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - In_Meta_rst : out std_logic; - In_Meta_DestMACAddress_nxt : out std_logic; - In_Meta_DestMACAddress_Data : in T_SLV_8; - - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic + Clock : in std_logic; + Reset : in std_logic; + + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + In_Meta_rst : out std_logic; + In_Meta_DestMACAddress_nxt : out std_logic; + In_Meta_DestMACAddress_Data : in T_SLV_8; + + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic ); end entity; architecture rtl of mac_TX_DestMAC_Prepender is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; type T_STATE is ( ST_IDLE, @@ -74,120 +74,120 @@ architecture rtl of mac_TX_DestMAC_Prepender is ST_PAYLOAD ); - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); - signal Is_DataFlow : std_logic; - signal Is_SOF : std_logic; - signal Is_EOF : std_logic; + signal Is_DataFlow : std_logic; + signal Is_SOF : std_logic; + signal Is_EOF : std_logic; begin - Is_DataFlow <= In_Valid and Out_Ack; - Is_SOF <= In_Valid and In_SOF; - Is_EOF <= In_Valid and In_EOF; + Is_DataFlow <= In_Valid and Out_Ack; + Is_SOF <= In_Valid and In_SOF; + Is_EOF <= In_Valid and In_EOF; process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; process(State, In_Valid, In_Data, In_EOF, Is_DataFlow, Is_SOF, Is_EOF, Out_Ack, In_Meta_DestMACAddress_Data) begin - NextState <= State; + NextState <= State; - Out_Valid <= '0'; - Out_Data <= In_Data; - Out_SOF <= '0'; - Out_EOF <= '0'; + Out_Valid <= '0'; + Out_Data <= In_Data; + Out_SOF <= '0'; + Out_EOF <= '0'; - In_Ack <= '0'; - In_Meta_rst <= '0'; --- In_Meta_DestMACAddress_rev <= '1'; -- read destination MAC address in Big-Endian order - In_Meta_DestMACAddress_nxt <= '0'; + In_Ack <= '0'; + In_Meta_rst <= '0'; +-- In_Meta_DestMACAddress_rev <= '1'; -- read destination MAC address in Big-Endian order + In_Meta_DestMACAddress_nxt <= '0'; case State is when ST_IDLE => - In_Meta_rst <= '1'; - Out_Data <= In_Meta_DestMACAddress_Data; + In_Meta_rst <= '1'; + Out_Data <= In_Meta_DestMACAddress_Data; if (Is_SOF = '1') then - In_Meta_rst <= '0'; - In_Meta_DestMACAddress_nxt <= Out_Ack; + In_Meta_rst <= '0'; + In_Meta_DestMACAddress_nxt <= Out_Ack; - Out_Valid <= '1'; - Out_SOF <= '1'; + Out_Valid <= '1'; + Out_SOF <= '1'; - if (Out_Ack = '1') then - NextState <= ST_PREPEND_DEST_MAC_1; + if (Out_Ack = '1') then + NextState <= ST_PREPEND_DEST_MAC_1; end if; end if; when ST_PREPEND_DEST_MAC_1 => - In_Meta_DestMACAddress_nxt <= Out_Ack; + In_Meta_DestMACAddress_nxt <= Out_Ack; - Out_Valid <= '1'; - Out_Data <= In_Meta_DestMACAddress_Data; + Out_Valid <= '1'; + Out_Data <= In_Meta_DestMACAddress_Data; - if (Out_Ack = '1') then - NextState <= ST_PREPEND_DEST_MAC_2; + if (Out_Ack = '1') then + NextState <= ST_PREPEND_DEST_MAC_2; end if; when ST_PREPEND_DEST_MAC_2 => - In_Meta_DestMACAddress_nxt <= Out_Ack; + In_Meta_DestMACAddress_nxt <= Out_Ack; - Out_Valid <= '1'; - Out_Data <= In_Meta_DestMACAddress_Data; + Out_Valid <= '1'; + Out_Data <= In_Meta_DestMACAddress_Data; - if (Out_Ack = '1') then - NextState <= ST_PREPEND_DEST_MAC_3; + if (Out_Ack = '1') then + NextState <= ST_PREPEND_DEST_MAC_3; end if; when ST_PREPEND_DEST_MAC_3 => - In_Meta_DestMACAddress_nxt <= Out_Ack; + In_Meta_DestMACAddress_nxt <= Out_Ack; - Out_Valid <= '1'; - Out_Data <= In_Meta_DestMACAddress_Data; + Out_Valid <= '1'; + Out_Data <= In_Meta_DestMACAddress_Data; - if (Out_Ack = '1') then - NextState <= ST_PREPEND_DEST_MAC_4; + if (Out_Ack = '1') then + NextState <= ST_PREPEND_DEST_MAC_4; end if; when ST_PREPEND_DEST_MAC_4 => - In_Meta_DestMACAddress_nxt <= Out_Ack; + In_Meta_DestMACAddress_nxt <= Out_Ack; - Out_Valid <= '1'; - Out_Data <= In_Meta_DestMACAddress_Data; + Out_Valid <= '1'; + Out_Data <= In_Meta_DestMACAddress_Data; - if (Out_Ack = '1') then - NextState <= ST_PREPEND_DEST_MAC_5; + if (Out_Ack = '1') then + NextState <= ST_PREPEND_DEST_MAC_5; end if; when ST_PREPEND_DEST_MAC_5 => - In_Meta_DestMACAddress_nxt <= Out_Ack; + In_Meta_DestMACAddress_nxt <= Out_Ack; - Out_Valid <= '1'; - Out_Data <= In_Meta_DestMACAddress_Data; + Out_Valid <= '1'; + Out_Data <= In_Meta_DestMACAddress_Data; - if (Out_Ack = '1') then - NextState <= ST_PAYLOAD; + if (Out_Ack = '1') then + NextState <= ST_PAYLOAD; end if; when ST_PAYLOAD => - In_Ack <= Out_Ack; + In_Ack <= Out_Ack; - Out_Valid <= In_Valid; - Out_EOF <= In_EOF; + Out_Valid <= In_Valid; + Out_EOF <= In_EOF; if ((Is_DataFlow and Is_EOF) = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end case; diff --git a/src/net/mac/mac_TX_SrcMAC_Prepender.vhdl b/src/net/mac/mac_TX_SrcMAC_Prepender.vhdl index cf280b16c..2d006010d 100644 --- a/src/net/mac/mac_TX_SrcMAC_Prepender.vhdl +++ b/src/net/mac/mac_TX_SrcMAC_Prepender.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,44 +37,44 @@ use work.net.all; entity mac_TX_SrcMAC_Prepender is generic ( - DEBUG : boolean := FALSE; - MAC_ADDRESSES : T_NET_MAC_ADDRESS_VECTOR := (0 => C_NET_MAC_ADDRESS_EMPTY) + DEBUG : boolean := FALSE; + MAC_ADDRESSES : T_NET_MAC_ADDRESS_VECTOR := (0 => C_NET_MAC_ADDRESS_EMPTY) ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- IN Port - In_Valid : in std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); - In_Data : in T_SLVV_8(MAC_ADDRESSES'length - 1 downto 0); - In_SOF : in std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); - In_EOF : in std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); - In_Ack : out std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); - In_Meta_rst : out std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); - In_Meta_DestMACAddress_nxt : out std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); - In_Meta_DestMACAddress_Data : in T_SLVV_8(MAC_ADDRESSES'length - 1 downto 0); + In_Valid : in std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); + In_Data : in T_SLVV_8(MAC_ADDRESSES'length - 1 downto 0); + In_SOF : in std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); + In_EOF : in std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); + In_Ack : out std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); + In_Meta_rst : out std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); + In_Meta_DestMACAddress_nxt : out std_logic_vector(MAC_ADDRESSES'length - 1 downto 0); + In_Meta_DestMACAddress_Data : in T_SLVV_8(MAC_ADDRESSES'length - 1 downto 0); -- OUT Port - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic; - Out_Meta_rst : in std_logic; - Out_Meta_DestMACAddress_nxt : in std_logic; - Out_Meta_DestMACAddress_Data : out T_SLV_8 + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic; + Out_Meta_rst : in std_logic; + Out_Meta_DestMACAddress_nxt : in std_logic; + Out_Meta_DestMACAddress_Data : out T_SLV_8 ); end entity; architecture rtl of mac_TX_SrcMAC_Prepender is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; - constant PORTS : positive := MAC_ADDRESSES'length; + constant PORTS : positive := MAC_ADDRESSES'length; - constant META_RST_BIT : natural := 0; - constant META_DEST_NXT_BIT : natural := 1; + constant META_RST_BIT : natural := 0; + constant META_DEST_NXT_BIT : natural := 1; - constant META_BITS : positive := 56; - constant META_REV_BITS : positive := 2; + constant META_BITS : positive := 56; + constant META_REV_BITS : positive := 2; type T_STATE is ( ST_IDLE, @@ -86,168 +86,168 @@ architecture rtl of mac_TX_SrcMAC_Prepender is ST_PAYLOAD ); - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); - - signal LLMux_In_Valid : std_logic_vector(PORTS - 1 downto 0); - signal LLMux_In_Data : T_SLM(PORTS - 1 downto 0, T_SLV_8'range) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal LLMux_In_Meta : T_SLM(PORTS - 1 downto 0, META_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal LLMux_In_Meta_rev : T_SLM(PORTS - 1 downto 0, META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal LLMux_In_SOF : std_logic_vector(PORTS - 1 downto 0); - signal LLMux_In_EOF : std_logic_vector(PORTS - 1 downto 0); - signal LLMux_In_Ack : std_logic_vector(PORTS - 1 downto 0); - - signal LLMux_Out_Valid : std_logic; - signal LLMux_Out_Data : T_SLV_8; - signal LLMux_Out_Meta : std_logic_vector(META_BITS - 1 downto 0); - signal LLMux_Out_Meta_rev : std_logic_vector(META_REV_BITS - 1 downto 0); - signal LLMux_Out_SOF : std_logic; - signal LLMux_Out_EOF : std_logic; - signal LLMux_Out_Ack : std_logic; - - signal Is_DataFlow : std_logic; - signal Is_SOF : std_logic; - signal Is_EOF : std_logic; + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); + + signal LLMux_In_Valid : std_logic_vector(PORTS - 1 downto 0); + signal LLMux_In_Data : T_SLM(PORTS - 1 downto 0, T_SLV_8'range) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal LLMux_In_Meta : T_SLM(PORTS - 1 downto 0, META_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal LLMux_In_Meta_rev : T_SLM(PORTS - 1 downto 0, META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal LLMux_In_SOF : std_logic_vector(PORTS - 1 downto 0); + signal LLMux_In_EOF : std_logic_vector(PORTS - 1 downto 0); + signal LLMux_In_Ack : std_logic_vector(PORTS - 1 downto 0); + + signal LLMux_Out_Valid : std_logic; + signal LLMux_Out_Data : T_SLV_8; + signal LLMux_Out_Meta : std_logic_vector(META_BITS - 1 downto 0); + signal LLMux_Out_Meta_rev : std_logic_vector(META_REV_BITS - 1 downto 0); + signal LLMux_Out_SOF : std_logic; + signal LLMux_Out_EOF : std_logic; + signal LLMux_Out_Ack : std_logic; + + signal Is_DataFlow : std_logic; + signal Is_SOF : std_logic; + signal Is_EOF : std_logic; begin - LLMux_In_Valid <= In_Valid; - LLMux_In_Data <= to_slm(In_Data); - LLMux_In_SOF <= In_SOF; - LLMux_In_EOF <= In_EOF; - In_Ack <= LLMux_In_Ack; + LLMux_In_Valid <= In_Valid; + LLMux_In_Data <= to_slm(In_Data); + LLMux_In_SOF <= In_SOF; + LLMux_In_EOF <= In_EOF; + In_Ack <= LLMux_In_Ack; genLLMuxIn : for i in 0 to PORTS - 1 generate - signal Meta : std_logic_vector(META_BITS - 1 downto 0); + signal Meta : std_logic_vector(META_BITS - 1 downto 0); begin - Meta(55 downto 48) <= In_Meta_DestMACAddress_Data(i); - Meta(47 downto 0) <= to_slv(MAC_ADDRESSES(i)); + Meta(55 downto 48) <= In_Meta_DestMACAddress_Data(i); + Meta(47 downto 0) <= to_slv(MAC_ADDRESSES(i)); assign_row(LLMux_In_Meta, Meta, i); end generate; - In_Meta_rst <= get_col(LLMux_In_Meta_rev, META_RST_BIT); - In_Meta_DestMACAddress_nxt <= get_col(LLMux_In_Meta_rev, META_DEST_NXT_BIT); + In_Meta_rst <= get_col(LLMux_In_Meta_rev, META_RST_BIT); + In_Meta_DestMACAddress_nxt <= get_col(LLMux_In_Meta_rev, META_DEST_NXT_BIT); LLMux: entity work.stream_Mux generic map ( - PORTS => PORTS, - DATA_BITS => LLMux_Out_Data'length, - META_BITS => LLMux_Out_Meta'length, - META_REV_BITS => LLMux_Out_Meta_rev'length + PORTS => PORTS, + DATA_BITS => LLMux_Out_Data'length, + META_BITS => LLMux_Out_Meta'length, + META_REV_BITS => LLMux_Out_Meta_rev'length ) port map( - Clock => Clock, - Reset => Reset, - - In_Valid => LLMux_In_Valid, - In_Data => LLMux_In_Data, - In_Meta => LLMux_In_Meta, - In_Meta_rev => LLMux_In_Meta_rev, - In_SOF => LLMux_In_SOF, - In_EOF => LLMux_In_EOF, - In_Ack => LLMux_In_Ack, - - Out_Valid => LLMux_Out_Valid, - Out_Data => LLMux_Out_Data, - Out_Meta => LLMux_Out_Meta, - Out_Meta_rev => LLMux_Out_Meta_rev, - Out_SOF => LLMux_Out_SOF, - Out_EOF => LLMux_Out_EOF, - Out_Ack => LLMux_Out_Ack + Clock => Clock, + Reset => Reset, + + In_Valid => LLMux_In_Valid, + In_Data => LLMux_In_Data, + In_Meta => LLMux_In_Meta, + In_Meta_rev => LLMux_In_Meta_rev, + In_SOF => LLMux_In_SOF, + In_EOF => LLMux_In_EOF, + In_Ack => LLMux_In_Ack, + + Out_Valid => LLMux_Out_Valid, + Out_Data => LLMux_Out_Data, + Out_Meta => LLMux_Out_Meta, + Out_Meta_rev => LLMux_Out_Meta_rev, + Out_SOF => LLMux_Out_SOF, + Out_EOF => LLMux_Out_EOF, + Out_Ack => LLMux_Out_Ack ); - LLMux_Out_Meta_rev(META_RST_BIT) <= Out_Meta_rst; - LLMux_Out_Meta_rev(META_DEST_NXT_BIT) <= Out_Meta_DestMACAddress_nxt; + LLMux_Out_Meta_rev(META_RST_BIT) <= Out_Meta_rst; + LLMux_Out_Meta_rev(META_DEST_NXT_BIT) <= Out_Meta_DestMACAddress_nxt; - Out_Meta_DestMACAddress_Data <= LLMux_Out_Meta(55 downto 48); + Out_Meta_DestMACAddress_Data <= LLMux_Out_Meta(55 downto 48); - Is_DataFlow <= LLMux_Out_Valid and Out_Ack; - Is_SOF <= LLMux_Out_Valid and LLMux_Out_SOF; - Is_EOF <= LLMux_Out_Valid and LLMux_Out_EOF; + Is_DataFlow <= LLMux_Out_Valid and Out_Ack; + Is_SOF <= LLMux_Out_Valid and LLMux_Out_SOF; + Is_EOF <= LLMux_Out_Valid and LLMux_Out_EOF; process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; process(State, LLMux_Out_Valid, LLMux_Out_Data, LLMux_Out_Meta, LLMux_Out_EOF, Is_DataFlow, Is_SOF, Is_EOF, Out_Ack) begin - NextState <= State; + NextState <= State; - Out_Valid <= '0'; - Out_Data <= LLMux_Out_Data; - Out_SOF <= '0'; - Out_EOF <= '0'; + Out_Valid <= '0'; + Out_Data <= LLMux_Out_Data; + Out_SOF <= '0'; + Out_EOF <= '0'; - LLMux_Out_Ack <= '0'; + LLMux_Out_Ack <= '0'; case State is when ST_IDLE => if (Is_SOF = '1') then - Out_Valid <= '1'; - Out_SOF <= '1'; - Out_Data <= LLMux_Out_Meta((5 * 8) + 7 downto (5 * 8)); + Out_Valid <= '1'; + Out_SOF <= '1'; + Out_Data <= LLMux_Out_Meta((5 * 8) + 7 downto (5 * 8)); - if (Out_Ack = '1') then - NextState <= ST_PREPEND_SRC_MAC_1; + if (Out_Ack = '1') then + NextState <= ST_PREPEND_SRC_MAC_1; end if; end if; when ST_PREPEND_SRC_MAC_1 => - Out_Valid <= '1'; - Out_Data <= LLMux_Out_Meta((4 * 8) + 7 downto (4 * 8)); + Out_Valid <= '1'; + Out_Data <= LLMux_Out_Meta((4 * 8) + 7 downto (4 * 8)); - if (Out_Ack = '1') then - NextState <= ST_PREPEND_SRC_MAC_2; + if (Out_Ack = '1') then + NextState <= ST_PREPEND_SRC_MAC_2; end if; when ST_PREPEND_SRC_MAC_2 => - Out_Valid <= '1'; - Out_Data <= LLMux_Out_Meta((3 * 8) + 7 downto (3 * 8)); + Out_Valid <= '1'; + Out_Data <= LLMux_Out_Meta((3 * 8) + 7 downto (3 * 8)); - if (Out_Ack = '1') then - NextState <= ST_PREPEND_SRC_MAC_3; + if (Out_Ack = '1') then + NextState <= ST_PREPEND_SRC_MAC_3; end if; when ST_PREPEND_SRC_MAC_3 => - Out_Valid <= '1'; - Out_Data <= LLMux_Out_Meta((2 * 8) + 7 downto (2 * 8)); + Out_Valid <= '1'; + Out_Data <= LLMux_Out_Meta((2 * 8) + 7 downto (2 * 8)); - if (Out_Ack = '1') then - NextState <= ST_PREPEND_SRC_MAC_4; + if (Out_Ack = '1') then + NextState <= ST_PREPEND_SRC_MAC_4; end if; when ST_PREPEND_SRC_MAC_4 => - Out_Valid <= '1'; - Out_Data <= LLMux_Out_Meta((1 * 8) + 7 downto (1 * 8)); + Out_Valid <= '1'; + Out_Data <= LLMux_Out_Meta((1 * 8) + 7 downto (1 * 8)); - if (Out_Ack = '1') then - NextState <= ST_PREPEND_SRC_MAC_5; + if (Out_Ack = '1') then + NextState <= ST_PREPEND_SRC_MAC_5; end if; when ST_PREPEND_SRC_MAC_5 => - Out_Valid <= '1'; - Out_Data <= LLMux_Out_Meta((0 * 8) + 7 downto (0 * 8)); + Out_Valid <= '1'; + Out_Data <= LLMux_Out_Meta((0 * 8) + 7 downto (0 * 8)); - if (Out_Ack = '1') then - NextState <= ST_PAYLOAD; + if (Out_Ack = '1') then + NextState <= ST_PAYLOAD; end if; when ST_PAYLOAD => - Out_Valid <= LLMux_Out_Valid; - Out_EOF <= LLMux_Out_EOF; - LLMux_Out_Ack <= Out_Ack; + Out_Valid <= LLMux_Out_Valid; + Out_EOF <= LLMux_Out_EOF; + LLMux_Out_Ack <= Out_Ack; if ((Is_DataFlow and Is_EOF) = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end case; diff --git a/src/net/mac/mac_TX_Type_Prepender.vhdl b/src/net/mac/mac_TX_Type_Prepender.vhdl index 3f7f165b7..5632a0933 100644 --- a/src/net/mac/mac_TX_Type_Prepender.vhdl +++ b/src/net/mac/mac_TX_Type_Prepender.vhdl @@ -27,8 +27,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; diff --git a/src/net/mac/mac_Wrapper.vhdl b/src/net/mac/mac_Wrapper.vhdl index b0551745d..786a4bbad 100644 --- a/src/net/mac/mac_Wrapper.vhdl +++ b/src/net/mac/mac_Wrapper.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,45 +37,45 @@ use work.net.all; entity mac_Wrapper is generic ( - DEBUG : boolean := FALSE; - MAC_CONFIG : T_NET_MAC_CONFIGURATION_VECTOR + DEBUG : boolean := FALSE; + MAC_CONFIG : T_NET_MAC_CONFIGURATION_VECTOR ); port ( - Clock : in std_logic; - Reset : in std_logic; - - Eth_TX_Valid : out std_logic; - Eth_TX_Data : out T_SLV_8; - Eth_TX_SOF : out std_logic; - Eth_TX_EOF : out std_logic; - Eth_TX_Ack : in std_logic; - - Eth_RX_Valid : in std_logic; - Eth_RX_Data : in T_SLV_8; - Eth_RX_SOF : in std_logic; - Eth_RX_EOF : in std_logic; - Eth_RX_Ack : out std_logic; - - TX_Valid : in std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); - TX_Data : in T_SLVV_8(getPortCount(MAC_CONFIG) - 1 downto 0); - TX_SOF : in std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); - TX_EOF : in std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); - TX_Ack : out std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); - TX_Meta_rst : out std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); - TX_Meta_DestMACAddress_nxt : out std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); - TX_Meta_DestMACAddress_Data : in T_SLVV_8(getPortCount(MAC_CONFIG) - 1 downto 0); - - RX_Valid : out std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); - RX_Data : out T_SLVV_8(getPortCount(MAC_CONFIG) - 1 downto 0); - RX_SOF : out std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); - RX_EOF : out std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); - RX_Ack : in std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); - RX_Meta_rst : in std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); - RX_Meta_SrcMACAddress_nxt : in std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); - RX_Meta_SrcMACAddress_Data : out T_SLVV_8(getPortCount(MAC_CONFIG) - 1 downto 0); - RX_Meta_DestMACAddress_nxt : in std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); - RX_Meta_DestMACAddress_Data : out T_SLVV_8(getPortCount(MAC_CONFIG) - 1 downto 0); - RX_Meta_EthType : out T_NET_MAC_ETHERNETTYPE_VECTOR(getPortCount(MAC_CONFIG) - 1 downto 0) + Clock : in std_logic; + Reset : in std_logic; + + Eth_TX_Valid : out std_logic; + Eth_TX_Data : out T_SLV_8; + Eth_TX_SOF : out std_logic; + Eth_TX_EOF : out std_logic; + Eth_TX_Ack : in std_logic; + + Eth_RX_Valid : in std_logic; + Eth_RX_Data : in T_SLV_8; + Eth_RX_SOF : in std_logic; + Eth_RX_EOF : in std_logic; + Eth_RX_Ack : out std_logic; + + TX_Valid : in std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); + TX_Data : in T_SLVV_8(getPortCount(MAC_CONFIG) - 1 downto 0); + TX_SOF : in std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); + TX_EOF : in std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); + TX_Ack : out std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); + TX_Meta_rst : out std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); + TX_Meta_DestMACAddress_nxt : out std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); + TX_Meta_DestMACAddress_Data : in T_SLVV_8(getPortCount(MAC_CONFIG) - 1 downto 0); + + RX_Valid : out std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); + RX_Data : out T_SLVV_8(getPortCount(MAC_CONFIG) - 1 downto 0); + RX_SOF : out std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); + RX_EOF : out std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); + RX_Ack : in std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); + RX_Meta_rst : in std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); + RX_Meta_SrcMACAddress_nxt : in std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); + RX_Meta_SrcMACAddress_Data : out T_SLVV_8(getPortCount(MAC_CONFIG) - 1 downto 0); + RX_Meta_DestMACAddress_nxt : in std_logic_vector(getPortCount(MAC_CONFIG) - 1 downto 0); + RX_Meta_DestMACAddress_Data : out T_SLVV_8(getPortCount(MAC_CONFIG) - 1 downto 0); + RX_Meta_EthType : out T_NET_MAC_ETHERNETTYPE_VECTOR(getPortCount(MAC_CONFIG) - 1 downto 0) ); end entity; @@ -102,7 +102,7 @@ architecture rtl of mac_Wrapper is end function; function getSourceFilterCount(Interfaces : T_NET_MAC_INTERFACE_VECTOR) return natural is - variable count : natural := 0; + variable count : natural := 0; begin for i in Interfaces'range loop if ((Interfaces(i).Address /= C_NET_MAC_ADDRESS_EMPTY) or (Interfaces(i).Mask /= C_NET_MAC_MASK_EMPTY)) then @@ -134,7 +134,7 @@ architecture rtl of mac_Wrapper is end function; function getTypeSwitchCount(Types : T_NET_MAC_ETHERNETTYPE_VECTOR) return natural is - variable count : natural := 0; + variable count : natural := 0; begin for i in Types'range loop if (Types(i) /= C_NET_MAC_ETHERNETTYPE_EMPTY) then @@ -146,7 +146,7 @@ architecture rtl of mac_Wrapper is end function; function calcPortIndex(MAC_CONFIG : T_NET_MAC_CONFIGURATION_VECTOR; CurrentInterfaceID : natural) return natural is - variable count : natural := 0; + variable count : natural := 0; begin if (CurrentInterfaceID = 0) then return 0; @@ -160,240 +160,240 @@ architecture rtl of mac_Wrapper is end function; - constant PORTS : positive := getPortCount(MAC_CONFIG); - constant INTERFACE_COUNT : positive := MAC_CONFIG'length; - constant INTERFACE_ADDRESSES : T_NET_MAC_ADDRESS_VECTOR := getInterfaceAddresses(MAC_CONFIG); - constant INTERFACE_MASKS : T_NET_MAC_ADDRESS_VECTOR := getInterfaceMasks(MAC_CONFIG); - - signal DestEth_RX_Valid : std_logic_vector(INTERFACE_COUNT - 1 downto 0); - signal DestEth_RX_Data : T_SLVV_8(INTERFACE_COUNT - 1 downto 0); - signal DestEth_RX_SOF : std_logic_vector(INTERFACE_COUNT - 1 downto 0); - signal DestEth_RX_EOF : std_logic_vector(INTERFACE_COUNT - 1 downto 0); - signal DestEth_RX_Meta_DestMACAddress_Data : T_SLVV_8(INTERFACE_COUNT - 1 downto 0); - - signal SrcEth_RX_Ack : std_logic_vector(INTERFACE_COUNT - 1 downto 0); - signal SrcEth_RX_Meta_rst : std_logic_vector(INTERFACE_COUNT - 1 downto 0); - signal SrcEth_RX_Meta_DestMACAddress_nxt : std_logic_vector(INTERFACE_COUNT - 1 downto 0); - - signal EthType_TX_Valid : std_logic_vector(INTERFACE_COUNT - 1 downto 0); - signal EthType_TX_Data : T_SLVV_8(INTERFACE_COUNT - 1 downto 0); - signal EthType_TX_SOF : std_logic_vector(INTERFACE_COUNT - 1 downto 0); - signal EthType_TX_EOF : std_logic_vector(INTERFACE_COUNT - 1 downto 0); - signal EthType_TX_Meta_DestMACAddress_Data : T_SLVV_8(INTERFACE_COUNT - 1 downto 0); - - signal SrcEth_TX_Valid : std_logic; - signal SrcEth_TX_Data : T_SLV_8; - signal SrcEth_TX_SOF : std_logic; - signal SrcEth_TX_EOF : std_logic; - signal SrcEth_TX_Ack : std_logic_vector(INTERFACE_COUNT - 1 downto 0); - signal SrcEth_TX_Meta_rst : std_logic_vector(INTERFACE_COUNT - 1 downto 0); - signal SrcEth_TX_Meta_DestMACAddress_nxt : std_logic_vector(INTERFACE_COUNT - 1 downto 0); - signal SrcEth_TX_Meta_DestMACAddress_Data : T_SLV_8; - - signal DestEth_TX_Ack : std_logic; - signal DestEth_TX_Meta_rst : std_logic; - signal DestEth_TX_Meta_DestMACAddress_nxt : std_logic; + constant PORTS : positive := getPortCount(MAC_CONFIG); + constant INTERFACE_COUNT : positive := MAC_CONFIG'length; + constant INTERFACE_ADDRESSES : T_NET_MAC_ADDRESS_VECTOR := getInterfaceAddresses(MAC_CONFIG); + constant INTERFACE_MASKS : T_NET_MAC_ADDRESS_VECTOR := getInterfaceMasks(MAC_CONFIG); + + signal DestEth_RX_Valid : std_logic_vector(INTERFACE_COUNT - 1 downto 0); + signal DestEth_RX_Data : T_SLVV_8(INTERFACE_COUNT - 1 downto 0); + signal DestEth_RX_SOF : std_logic_vector(INTERFACE_COUNT - 1 downto 0); + signal DestEth_RX_EOF : std_logic_vector(INTERFACE_COUNT - 1 downto 0); + signal DestEth_RX_Meta_DestMACAddress_Data : T_SLVV_8(INTERFACE_COUNT - 1 downto 0); + + signal SrcEth_RX_Ack : std_logic_vector(INTERFACE_COUNT - 1 downto 0); + signal SrcEth_RX_Meta_rst : std_logic_vector(INTERFACE_COUNT - 1 downto 0); + signal SrcEth_RX_Meta_DestMACAddress_nxt : std_logic_vector(INTERFACE_COUNT - 1 downto 0); + + signal EthType_TX_Valid : std_logic_vector(INTERFACE_COUNT - 1 downto 0); + signal EthType_TX_Data : T_SLVV_8(INTERFACE_COUNT - 1 downto 0); + signal EthType_TX_SOF : std_logic_vector(INTERFACE_COUNT - 1 downto 0); + signal EthType_TX_EOF : std_logic_vector(INTERFACE_COUNT - 1 downto 0); + signal EthType_TX_Meta_DestMACAddress_Data : T_SLVV_8(INTERFACE_COUNT - 1 downto 0); + + signal SrcEth_TX_Valid : std_logic; + signal SrcEth_TX_Data : T_SLV_8; + signal SrcEth_TX_SOF : std_logic; + signal SrcEth_TX_EOF : std_logic; + signal SrcEth_TX_Ack : std_logic_vector(INTERFACE_COUNT - 1 downto 0); + signal SrcEth_TX_Meta_rst : std_logic_vector(INTERFACE_COUNT - 1 downto 0); + signal SrcEth_TX_Meta_DestMACAddress_nxt : std_logic_vector(INTERFACE_COUNT - 1 downto 0); + signal SrcEth_TX_Meta_DestMACAddress_Data : T_SLV_8; + + signal DestEth_TX_Ack : std_logic; + signal DestEth_TX_Meta_rst : std_logic; + signal DestEth_TX_Meta_DestMACAddress_nxt : std_logic; begin RX_DestMAC: entity work.mac_RX_DestMAC_Switch generic map ( - DEBUG => DEBUG, - MAC_ADDRESSES => INTERFACE_ADDRESSES, - MAC_ADDRESSE_MASKS => INTERFACE_MASKS + DEBUG => DEBUG, + MAC_ADDRESSES => INTERFACE_ADDRESSES, + MAC_ADDRESSE_MASKS => INTERFACE_MASKS ) port map( - Clock => Clock, - Reset => Reset, - - In_Valid => Eth_RX_Valid, - In_Data => Eth_RX_Data, - In_SOF => Eth_RX_SOF, - In_EOF => Eth_RX_EOF, - In_Ack => Eth_RX_Ack, - - Out_Valid => DestEth_RX_Valid, - Out_Data => DestEth_RX_Data, - Out_SOF => DestEth_RX_SOF, - Out_EOF => DestEth_RX_EOF, - Out_Ack => SrcEth_RX_Ack, - Out_Meta_DestMACAddress_rst => SrcEth_RX_Meta_rst, - Out_Meta_DestMACAddress_nxt => SrcEth_RX_Meta_DestMACAddress_nxt, - Out_Meta_DestMACAddress_Data => DestEth_RX_Meta_DestMACAddress_Data + Clock => Clock, + Reset => Reset, + + In_Valid => Eth_RX_Valid, + In_Data => Eth_RX_Data, + In_SOF => Eth_RX_SOF, + In_EOF => Eth_RX_EOF, + In_Ack => Eth_RX_Ack, + + Out_Valid => DestEth_RX_Valid, + Out_Data => DestEth_RX_Data, + Out_SOF => DestEth_RX_SOF, + Out_EOF => DestEth_RX_EOF, + Out_Ack => SrcEth_RX_Ack, + Out_Meta_DestMACAddress_rst => SrcEth_RX_Meta_rst, + Out_Meta_DestMACAddress_nxt => SrcEth_RX_Meta_DestMACAddress_nxt, + Out_Meta_DestMACAddress_Data => DestEth_RX_Meta_DestMACAddress_Data ); genInterface : for i in MAC_CONFIG'range generate - constant FILTER_COUNT : natural := getSourceFilterCount(MAC_CONFIG(i).SourceFilter); - constant FILTER_ADDRESSES : T_NET_MAC_ADDRESS_VECTOR := getSourceFilterAddresses(MAC_CONFIG(i).SourceFilter(0 to FILTER_COUNT - 1)); - constant FILTER_MASKS : T_NET_MAC_ADDRESS_VECTOR := getSourceFilterMasks(MAC_CONFIG(i).SourceFilter(0 to FILTER_COUNT - 1)); + constant FILTER_COUNT : natural := getSourceFilterCount(MAC_CONFIG(i).SourceFilter); + constant FILTER_ADDRESSES : T_NET_MAC_ADDRESS_VECTOR := getSourceFilterAddresses(MAC_CONFIG(i).SourceFilter(0 to FILTER_COUNT - 1)); + constant FILTER_MASKS : T_NET_MAC_ADDRESS_VECTOR := getSourceFilterMasks(MAC_CONFIG(i).SourceFilter(0 to FILTER_COUNT - 1)); - constant SWITCH_COUNT : natural := getTypeSwitchCount(MAC_CONFIG(i).TypeSwitch); - constant SWITCH_TYPES : T_NET_MAC_ETHERNETTYPE_VECTOR := MAC_CONFIG(i).TypeSwitch(0 to SWITCH_COUNT - 1); + constant SWITCH_COUNT : natural := getTypeSwitchCount(MAC_CONFIG(i).TypeSwitch); + constant SWITCH_TYPES : T_NET_MAC_ETHERNETTYPE_VECTOR := MAC_CONFIG(i).TypeSwitch(0 to SWITCH_COUNT - 1); - constant PORT_INDEX_FROM : natural := calcPortIndex(MAC_CONFIG, i); - constant PORT_INDEX_TO : natural := PORT_INDEX_FROM + SWITCH_COUNT - 1; + constant PORT_INDEX_FROM : natural := calcPortIndex(MAC_CONFIG, i); + constant PORT_INDEX_TO : natural := PORT_INDEX_FROM + SWITCH_COUNT - 1; - signal SrcEth_RX_Valid : std_logic; - signal SrcEth_RX_Data : T_SLV_8; - signal SrcEth_RX_SOF : std_logic; - signal SrcEth_RX_EOF : std_logic; + signal SrcEth_RX_Valid : std_logic; + signal SrcEth_RX_Data : T_SLV_8; + signal SrcEth_RX_SOF : std_logic; + signal SrcEth_RX_EOF : std_logic; --- signal SrcEth_RX_Meta_SrcMACAddress_rst : STD_LOGIC; --- signal SrcEth_RX_Meta_SrcMACAddress_nxt : STD_LOGIC; - signal SrcEth_RX_Meta_DestMACAddress_Data : T_SLV_8; - signal SrcEth_RX_Meta_SrcMACAddress_Data : T_SLV_8; +-- signal SrcEth_RX_Meta_SrcMACAddress_rst : STD_LOGIC; +-- signal SrcEth_RX_Meta_SrcMACAddress_nxt : STD_LOGIC; + signal SrcEth_RX_Meta_DestMACAddress_Data : T_SLV_8; + signal SrcEth_RX_Meta_SrcMACAddress_Data : T_SLV_8; - signal EthEth_RX_Ack : std_logic; - signal EthEth_RX_Meta_rst : std_logic; - signal EthEth_RX_Meta_DestMACAddress_nxt : std_logic; - signal EthEth_RX_Meta_SrcMACAddress_nxt : std_logic; + signal EthEth_RX_Ack : std_logic; + signal EthEth_RX_Meta_rst : std_logic; + signal EthEth_RX_Meta_DestMACAddress_nxt : std_logic; + signal EthEth_RX_Meta_SrcMACAddress_nxt : std_logic; begin --- assert FALSE report "Filter: Count=" & INTEGER'image(FILTER_COUNT) severity NOTE; --- assert FALSE report "PortIndex: From=" & INTEGER'image(PORT_INDEX_FROM) & " to=" & INTEGER'image(PORT_INDEX_TO) severity NOTE; +-- assert FALSE report "Filter: Count=" & INTEGER'image(FILTER_COUNT) severity NOTE; +-- assert FALSE report "PortIndex: From=" & INTEGER'image(PORT_INDEX_FROM) & " to=" & INTEGER'image(PORT_INDEX_TO) severity NOTE; RX_SrcMAC: entity work.mac_RX_SrcMAC_Filter generic map ( - DEBUG => DEBUG, - MAC_ADDRESSES => FILTER_ADDRESSES, - MAC_ADDRESSE_MASKS => FILTER_MASKS + DEBUG => DEBUG, + MAC_ADDRESSES => FILTER_ADDRESSES, + MAC_ADDRESSE_MASKS => FILTER_MASKS ) port map( - Clock => Clock, - Reset => Reset, - - In_Valid => DestEth_RX_Valid(i), - In_Data => DestEth_RX_Data(i), - In_SOF => DestEth_RX_SOF(i), - In_EOF => DestEth_RX_EOF(i), - In_Ack => SrcEth_RX_Ack (i), - In_Meta_rst => SrcEth_RX_Meta_rst(i), - In_Meta_DestMACAddress_nxt => SrcEth_RX_Meta_DestMACAddress_nxt(i), - In_Meta_DestMACAddress_Data => DestEth_RX_Meta_DestMACAddress_Data(i), - - Out_Valid => SrcEth_RX_Valid, - Out_Data => SrcEth_RX_Data, - Out_SOF => SrcEth_RX_SOF, - Out_EOF => SrcEth_RX_EOF, - Out_Ack => EthEth_RX_Ack, - Out_Meta_rst => EthEth_RX_Meta_rst, - Out_Meta_DestMACAddress_nxt => EthEth_RX_Meta_DestMACAddress_nxt, - Out_Meta_DestMACAddress_Data => SrcEth_RX_Meta_DestMACAddress_Data, - Out_Meta_SrcMACAddress_nxt => EthEth_RX_Meta_SrcMACAddress_nxt, - Out_Meta_SrcMACAddress_Data => SrcEth_RX_Meta_SrcMACAddress_Data + Clock => Clock, + Reset => Reset, + + In_Valid => DestEth_RX_Valid(i), + In_Data => DestEth_RX_Data(i), + In_SOF => DestEth_RX_SOF(i), + In_EOF => DestEth_RX_EOF(i), + In_Ack => SrcEth_RX_Ack (i), + In_Meta_rst => SrcEth_RX_Meta_rst(i), + In_Meta_DestMACAddress_nxt => SrcEth_RX_Meta_DestMACAddress_nxt(i), + In_Meta_DestMACAddress_Data => DestEth_RX_Meta_DestMACAddress_Data(i), + + Out_Valid => SrcEth_RX_Valid, + Out_Data => SrcEth_RX_Data, + Out_SOF => SrcEth_RX_SOF, + Out_EOF => SrcEth_RX_EOF, + Out_Ack => EthEth_RX_Ack, + Out_Meta_rst => EthEth_RX_Meta_rst, + Out_Meta_DestMACAddress_nxt => EthEth_RX_Meta_DestMACAddress_nxt, + Out_Meta_DestMACAddress_Data => SrcEth_RX_Meta_DestMACAddress_Data, + Out_Meta_SrcMACAddress_nxt => EthEth_RX_Meta_SrcMACAddress_nxt, + Out_Meta_SrcMACAddress_Data => SrcEth_RX_Meta_SrcMACAddress_Data ); RX_EthType: entity work.mac_RX_Type_Switch generic map ( - DEBUG => DEBUG, - ETHERNET_TYPES => SWITCH_TYPES + DEBUG => DEBUG, + ETHERNET_TYPES => SWITCH_TYPES ) port map( - Clock => Clock, - Reset => Reset, - - In_Valid => SrcEth_RX_Valid, - In_Data => SrcEth_RX_Data, - In_SOF => SrcEth_RX_SOF, - In_EOF => SrcEth_RX_EOF, - In_Ack => EthEth_RX_Ack, - In_Meta_rst => EthEth_RX_Meta_rst, - In_Meta_DestMACAddress_nxt => EthEth_RX_Meta_DestMACAddress_nxt, - In_Meta_DestMACAddress_Data => SrcEth_RX_Meta_DestMACAddress_Data, - In_Meta_SrcMACAddress_nxt => EthEth_RX_Meta_SrcMACAddress_nxt, - In_Meta_SrcMACAddress_Data => SrcEth_RX_Meta_SrcMACAddress_Data, - - Out_Valid => RX_Valid(PORT_INDEX_TO downto PORT_INDEX_FROM), - Out_Data => RX_Data(PORT_INDEX_TO downto PORT_INDEX_FROM), - Out_SOF => RX_SOF(PORT_INDEX_TO downto PORT_INDEX_FROM), - Out_EOF => RX_EOF(PORT_INDEX_TO downto PORT_INDEX_FROM), - Out_Ack => RX_Ack (PORT_INDEX_TO downto PORT_INDEX_FROM), - Out_Meta_rst => RX_Meta_rst(PORT_INDEX_TO downto PORT_INDEX_FROM), - Out_Meta_DestMACAddress_nxt => RX_Meta_DestMACAddress_nxt(PORT_INDEX_TO downto PORT_INDEX_FROM), - Out_Meta_DestMACAddress_Data => RX_Meta_DestMACAddress_Data(PORT_INDEX_TO downto PORT_INDEX_FROM), - Out_Meta_SrcMACAddress_nxt => RX_Meta_SrcMACAddress_nxt(PORT_INDEX_TO downto PORT_INDEX_FROM), - Out_Meta_SrcMACAddress_Data => RX_Meta_SrcMACAddress_Data(PORT_INDEX_TO downto PORT_INDEX_FROM), - Out_Meta_EthType => RX_Meta_EthType(PORT_INDEX_TO downto PORT_INDEX_FROM) + Clock => Clock, + Reset => Reset, + + In_Valid => SrcEth_RX_Valid, + In_Data => SrcEth_RX_Data, + In_SOF => SrcEth_RX_SOF, + In_EOF => SrcEth_RX_EOF, + In_Ack => EthEth_RX_Ack, + In_Meta_rst => EthEth_RX_Meta_rst, + In_Meta_DestMACAddress_nxt => EthEth_RX_Meta_DestMACAddress_nxt, + In_Meta_DestMACAddress_Data => SrcEth_RX_Meta_DestMACAddress_Data, + In_Meta_SrcMACAddress_nxt => EthEth_RX_Meta_SrcMACAddress_nxt, + In_Meta_SrcMACAddress_Data => SrcEth_RX_Meta_SrcMACAddress_Data, + + Out_Valid => RX_Valid(PORT_INDEX_TO downto PORT_INDEX_FROM), + Out_Data => RX_Data(PORT_INDEX_TO downto PORT_INDEX_FROM), + Out_SOF => RX_SOF(PORT_INDEX_TO downto PORT_INDEX_FROM), + Out_EOF => RX_EOF(PORT_INDEX_TO downto PORT_INDEX_FROM), + Out_Ack => RX_Ack (PORT_INDEX_TO downto PORT_INDEX_FROM), + Out_Meta_rst => RX_Meta_rst(PORT_INDEX_TO downto PORT_INDEX_FROM), + Out_Meta_DestMACAddress_nxt => RX_Meta_DestMACAddress_nxt(PORT_INDEX_TO downto PORT_INDEX_FROM), + Out_Meta_DestMACAddress_Data => RX_Meta_DestMACAddress_Data(PORT_INDEX_TO downto PORT_INDEX_FROM), + Out_Meta_SrcMACAddress_nxt => RX_Meta_SrcMACAddress_nxt(PORT_INDEX_TO downto PORT_INDEX_FROM), + Out_Meta_SrcMACAddress_Data => RX_Meta_SrcMACAddress_Data(PORT_INDEX_TO downto PORT_INDEX_FROM), + Out_Meta_EthType => RX_Meta_EthType(PORT_INDEX_TO downto PORT_INDEX_FROM) ); -- Ethernet Type prepender TX_EthType: entity work.mac_TX_Type_Prepender generic map ( - ETHERNET_TYPES => SWITCH_TYPES + ETHERNET_TYPES => SWITCH_TYPES ) port map( - Clock => Clock, - Reset => Reset, - - In_Valid => TX_Valid(PORT_INDEX_TO downto PORT_INDEX_FROM), - In_Data => TX_Data(PORT_INDEX_TO downto PORT_INDEX_FROM), - In_SOF => TX_SOF(PORT_INDEX_TO downto PORT_INDEX_FROM), - In_EOF => TX_EOF(PORT_INDEX_TO downto PORT_INDEX_FROM), - In_Ack => TX_Ack (PORT_INDEX_TO downto PORT_INDEX_FROM), - In_Meta_rst => TX_Meta_rst(PORT_INDEX_TO downto PORT_INDEX_FROM), - In_Meta_DestMACAddress_nxt => TX_Meta_DestMACAddress_nxt(PORT_INDEX_TO downto PORT_INDEX_FROM), - In_Meta_DestMACAddress_Data => TX_Meta_DestMACAddress_Data(PORT_INDEX_TO downto PORT_INDEX_FROM), - - Out_Valid => EthType_TX_Valid(i), - Out_Data => EthType_TX_Data(i), - Out_SOF => EthType_TX_SOF(i), - Out_EOF => EthType_TX_EOF(i), - Out_Ack => SrcEth_TX_Ack (i), - Out_Meta_rst => SrcEth_TX_Meta_rst(i), - Out_Meta_DestMACAddress_nxt => SrcEth_TX_Meta_DestMACAddress_nxt(i), - Out_Meta_DestMACAddress_Data => EthType_TX_Meta_DestMACAddress_Data(i) + Clock => Clock, + Reset => Reset, + + In_Valid => TX_Valid(PORT_INDEX_TO downto PORT_INDEX_FROM), + In_Data => TX_Data(PORT_INDEX_TO downto PORT_INDEX_FROM), + In_SOF => TX_SOF(PORT_INDEX_TO downto PORT_INDEX_FROM), + In_EOF => TX_EOF(PORT_INDEX_TO downto PORT_INDEX_FROM), + In_Ack => TX_Ack (PORT_INDEX_TO downto PORT_INDEX_FROM), + In_Meta_rst => TX_Meta_rst(PORT_INDEX_TO downto PORT_INDEX_FROM), + In_Meta_DestMACAddress_nxt => TX_Meta_DestMACAddress_nxt(PORT_INDEX_TO downto PORT_INDEX_FROM), + In_Meta_DestMACAddress_Data => TX_Meta_DestMACAddress_Data(PORT_INDEX_TO downto PORT_INDEX_FROM), + + Out_Valid => EthType_TX_Valid(i), + Out_Data => EthType_TX_Data(i), + Out_SOF => EthType_TX_SOF(i), + Out_EOF => EthType_TX_EOF(i), + Out_Ack => SrcEth_TX_Ack (i), + Out_Meta_rst => SrcEth_TX_Meta_rst(i), + Out_Meta_DestMACAddress_nxt => SrcEth_TX_Meta_DestMACAddress_nxt(i), + Out_Meta_DestMACAddress_Data => EthType_TX_Meta_DestMACAddress_Data(i) ); end generate; -- Ethernet SourceMAC prepender TX_SrcMAC: entity work.mac_TX_SrcMAC_Prepender generic map ( - MAC_ADDRESSES => INTERFACE_ADDRESSES + MAC_ADDRESSES => INTERFACE_ADDRESSES ) port map( - Clock => Clock, - Reset => Reset, - - In_Valid => EthType_TX_Valid, - In_Data => EthType_TX_Data, - In_SOF => EthType_TX_SOF, - In_EOF => EthType_TX_EOF, - In_Ack => SrcEth_TX_Ack, - In_Meta_rst => SrcEth_TX_Meta_rst, - In_Meta_DestMACAddress_nxt => SrcEth_TX_Meta_DestMACAddress_nxt, - In_Meta_DestMACAddress_Data => EthType_TX_Meta_DestMACAddress_Data, - - Out_Valid => SrcEth_TX_Valid, - Out_Data => SrcEth_TX_Data, - Out_SOF => SrcEth_TX_SOF, - Out_EOF => SrcEth_TX_EOF, - Out_Ack => DestEth_TX_Ack, - Out_Meta_rst => DestEth_TX_Meta_rst, - Out_Meta_DestMACAddress_nxt => DestEth_TX_Meta_DestMACAddress_nxt, - Out_Meta_DestMACAddress_Data => SrcEth_TX_Meta_DestMACAddress_Data + Clock => Clock, + Reset => Reset, + + In_Valid => EthType_TX_Valid, + In_Data => EthType_TX_Data, + In_SOF => EthType_TX_SOF, + In_EOF => EthType_TX_EOF, + In_Ack => SrcEth_TX_Ack, + In_Meta_rst => SrcEth_TX_Meta_rst, + In_Meta_DestMACAddress_nxt => SrcEth_TX_Meta_DestMACAddress_nxt, + In_Meta_DestMACAddress_Data => EthType_TX_Meta_DestMACAddress_Data, + + Out_Valid => SrcEth_TX_Valid, + Out_Data => SrcEth_TX_Data, + Out_SOF => SrcEth_TX_SOF, + Out_EOF => SrcEth_TX_EOF, + Out_Ack => DestEth_TX_Ack, + Out_Meta_rst => DestEth_TX_Meta_rst, + Out_Meta_DestMACAddress_nxt => DestEth_TX_Meta_DestMACAddress_nxt, + Out_Meta_DestMACAddress_Data => SrcEth_TX_Meta_DestMACAddress_Data ); -- Ethernet SourceMAC prepender TX_DestMAC: entity work.mac_TX_DestMAC_Prepender port map( - Clock => Clock, - Reset => Reset, - - In_Valid => SrcEth_TX_Valid, - In_Data => SrcEth_TX_Data, - In_SOF => SrcEth_TX_SOF, - In_EOF => SrcEth_TX_EOF, - In_Ack => DestEth_TX_Ack, - - In_Meta_rst => DestEth_TX_Meta_rst, - In_Meta_DestMACAddress_nxt => DestEth_TX_Meta_DestMACAddress_nxt, - In_Meta_DestMACAddress_Data => SrcEth_TX_Meta_DestMACAddress_Data, - - Out_Valid => Eth_TX_Valid, - Out_Data => Eth_TX_Data, - Out_SOF => Eth_TX_SOF, - Out_EOF => Eth_TX_EOF, - Out_Ack => Eth_TX_Ack + Clock => Clock, + Reset => Reset, + + In_Valid => SrcEth_TX_Valid, + In_Data => SrcEth_TX_Data, + In_SOF => SrcEth_TX_SOF, + In_EOF => SrcEth_TX_EOF, + In_Ack => DestEth_TX_Ack, + + In_Meta_rst => DestEth_TX_Meta_rst, + In_Meta_DestMACAddress_nxt => DestEth_TX_Meta_DestMACAddress_nxt, + In_Meta_DestMACAddress_Data => SrcEth_TX_Meta_DestMACAddress_Data, + + Out_Valid => Eth_TX_Valid, + Out_Data => Eth_TX_Data, + Out_SOF => Eth_TX_SOF, + Out_EOF => Eth_TX_EOF, + Out_Ack => Eth_TX_Ack ); end architecture; diff --git a/src/net/net.pkg.vhdl b/src/net/net.pkg.vhdl index 285f08e37..962c25006 100644 --- a/src/net/net.pkg.vhdl +++ b/src/net/net.pkg.vhdl @@ -28,8 +28,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; @@ -580,15 +580,15 @@ package net is Ingress : T_NET_UDP_PORT; -- incoming port number Egress : T_NET_UDP_PORT; -- outgoing port number end record; - type T_NET_UDP_PORTRANGE is record - Lower : T_NET_UDP_PORT; -- incoming port number - Upper : T_NET_UDP_PORT; -- outgoing port number + type T_NET_UDP_PORTRANGE is record + Lower : T_NET_UDP_PORT; -- incoming port number + Upper : T_NET_UDP_PORT; -- outgoing port number end record; type T_NET_UDP_PORTPAIR_VECTOR is array(natural range <>) of T_NET_UDP_PORTPAIR; - type T_NET_UDP_PORTRANGE_V is array(natural range <>) of T_NET_UDP_PORTRANGE; - type T_NET_UDP_PORTRANGE_M is array(natural range <>, natural range <>) of T_NET_UDP_PORTRANGE; + type T_NET_UDP_PORTRANGE_V is array(natural range <>) of T_NET_UDP_PORTRANGE; + type T_NET_UDP_PORTRANGE_M is array(natural range <>, natural range <>) of T_NET_UDP_PORTRANGE; function get_NET_UDP_Ingress_Ports (Portpair : T_NET_UDP_PORTPAIR_VECTOR) return T_NET_UDP_PORT_VECTOR; @@ -740,7 +740,7 @@ package net is -- ========================================================================================================================================================== -- MAC Control, Pause Frames, Ethernet Flow Control -- ========================================================================================================================================================== --- C_NET_MAC_ETHERNETTYPE_MACCONTROL --Ethernet type +-- C_NET_MAC_ETHERNETTYPE_MACCONTROL --Ethernet type constant C_NET_MAC_MAC_CONTROL : T_NET_MAC_ADDRESS ; constant C_NET_MAC_MAC_CONTROL_OPCODE_PAUSE_FRAME : T_SLV_16 := 16x"1"; constant C_NET_MAC_PAUSE_FRAME : std_logic_vector(16 * 8 -1 downto 0) ; @@ -758,7 +758,7 @@ package net is Open_Interface : T_Open_Interface; -- Describe if Interface should open a new underlying Port end record; - type T_Interface_Description is array(natural range <>) of T_Interface_Description_i; + type T_Interface_Description is array(natural range <>) of T_Interface_Description_i; end package; @@ -772,37 +772,37 @@ package body net is function init return T_NET_ETH_PHY_INTERFACE_GMII_F2P is begin return ( - TX_Clock => 'Z', - TX_Valid => 'Z', - TX_Data => (others => 'Z'), - TX_Error => 'Z' - ); + TX_Clock => 'Z', + TX_Valid => 'Z', + TX_Data => (others => 'Z'), + TX_Error => 'Z' + ); end function; function init return T_NET_ETH_PHY_INTERFACE_GMII_P2F is begin return ( - RX_RefClock => 'Z', - RX_Clock => 'Z', - RX_Valid => 'Z', - RX_Data => (others => 'Z'), - RX_Error => 'Z' - ); + RX_RefClock => 'Z', + RX_Clock => 'Z', + RX_Valid => 'Z', + RX_Data => (others => 'Z'), + RX_Error => 'Z' + ); end function; function init(Lanes : natural) return T_NET_ETH_PHY_INTERFACE_SGMII_F2P is variable temp : T_NET_ETH_PHY_INTERFACE_SGMII_F2P(TX_Lane(0 to Lanes -1)) := ( - DGB_AutoNeg_Restart => 'Z', - SGMII_TXRefClock_Out => 'Z', - SGMII_RXRefClock_Out => 'Z', - TX_Lane => (0 to Lanes -1 => C_IO_LVDS_INIT) + DGB_AutoNeg_Restart => 'Z', + SGMII_TXRefClock_Out => 'Z', + SGMII_RXRefClock_Out => 'Z', + TX_Lane => (0 to Lanes -1 => C_IO_LVDS_INIT) ); begin return temp; end function; function init(Lanes : natural) return T_NET_ETH_PHY_INTERFACE_SGMII_P2F is variable temp : T_NET_ETH_PHY_INTERFACE_SGMII_P2F(RX_Lane(0 to Lanes -1)) := ( - DGB_SystemClock_In => 'Z', - SGMII_RefClock_In => C_IO_LVDS_INIT, - RX_Lane => (0 to Lanes -1 => C_IO_LVDS_INIT) + DGB_SystemClock_In => 'Z', + SGMII_RefClock_In => C_IO_LVDS_INIT, + RX_Lane => (0 to Lanes -1 => C_IO_LVDS_INIT) ); begin return temp; @@ -810,32 +810,32 @@ package body net is function init return T_NET_ETH_PHY_INTERFACE_RGMII_F2P is begin return ( - RX_RefClock => 'Z', - TX_Clock => 'Z', - TX_Data => (others => 'Z'), - TX_Control => 'Z' - ); + RX_RefClock => 'Z', + TX_Clock => 'Z', + TX_Data => (others => 'Z'), + TX_Control => 'Z' + ); end function; function init return T_NET_ETH_PHY_INTERFACE_RGMII_P2F is begin return ( -- RX_RefClock => 'Z', - RX_Clock => 'Z', - RX_Data => (others => 'Z'), - RX_Control => 'Z' - ); + RX_Clock => 'Z', + RX_Data => (others => 'Z'), + RX_Control => 'Z' + ); end function; function to_net_eth_RSDataInterface(str : string) return T_NET_ETH_RS_DATA_INTERFACE is begin for i in T_NET_ETH_RS_DATA_INTERFACE loop - --report "Trimmed RS_DATA_INTERFACE: '" & T_NET_ETH_RS_DATA_INTERFACE'image(i)(27 to str_length(T_NET_ETH_RS_DATA_INTERFACE'image(i))) & "'" severity warning; --test - if str_imatch(str_toUpper(str), str_toUpper(T_NET_ETH_RS_DATA_INTERFACE'image(i))) + --report "Trimmed RS_DATA_INTERFACE: '" & T_NET_ETH_RS_DATA_INTERFACE'image(i)(27 to str_length(T_NET_ETH_RS_DATA_INTERFACE'image(i))) & "'" severity warning; --test + if str_imatch(str_toUpper(str), str_toUpper(T_NET_ETH_RS_DATA_INTERFACE'image(i))) or str_imatch(str_toUpper(str), str_toUpper(T_NET_ETH_RS_DATA_INTERFACE'image(i)(str_low(T_NET_ETH_RS_DATA_INTERFACE'image(i))+26 to str_low(T_NET_ETH_RS_DATA_INTERFACE'image(i))+str_length(T_NET_ETH_RS_DATA_INTERFACE'image(i))-1))) then --start from char 26 to get rid of prefix --report "RS_DATA_INTERFACE: '" & T_NET_ETH_RS_DATA_INTERFACE'image(i) & "'" severity warning; --test return i; - end if; + end if; end loop; report "Unknown RS_DATA_INTERFACE: '" & str & "'" severity failure; return NET_ETH_RS_DATA_INTERFACE_EMPTY; @@ -844,12 +844,12 @@ package body net is function to_net_eth_PHYDataInterface(str : string) return T_NET_ETH_PHY_DATA_INTERFACE is begin for i in T_NET_ETH_PHY_DATA_INTERFACE loop - --report "Trimmed PHY_DATA_INTERFACE: '" & T_NET_ETH_PHY_DATA_INTERFACE'image(i)(28 to str_length(T_NET_ETH_PHY_DATA_INTERFACE'image(i))) & "'" severity warning; --test - if str_imatch(str_toUpper(str), str_toUpper(T_NET_ETH_PHY_DATA_INTERFACE'image(i))) + --report "Trimmed PHY_DATA_INTERFACE: '" & T_NET_ETH_PHY_DATA_INTERFACE'image(i)(28 to str_length(T_NET_ETH_PHY_DATA_INTERFACE'image(i))) & "'" severity warning; --test + if str_imatch(str_toUpper(str), str_toUpper(T_NET_ETH_PHY_DATA_INTERFACE'image(i))) or str_imatch(str_toUpper(str), str_toUpper(T_NET_ETH_PHY_DATA_INTERFACE'image(i)(str_low(T_NET_ETH_PHY_DATA_INTERFACE'image(i))+27 to str_low(T_NET_ETH_PHY_DATA_INTERFACE'image(i))+str_length(T_NET_ETH_PHY_DATA_INTERFACE'image(i))-1))) then --start from char 27 to get rid of prefix --report "PHY_DATA_INTERFACE: '" & T_NET_ETH_PHY_DATA_INTERFACE'image(i) & "'" severity warning; --test return i; - end if; + end if; end loop; report "Unknown PHY_DATA_INTERFACE: '" & str & "'" severity failure; return NET_ETH_PHY_DATA_INTERFACE_EMPTY; @@ -858,12 +858,12 @@ package body net is function to_net_eth_PHYManagementInterface(str : string) return T_NET_ETH_PHY_MANAGEMENT_INTERFACE is begin for i in T_NET_ETH_PHY_MANAGEMENT_INTERFACE loop - --report "Trimmed PHY_MANAGEMENT_INTERFACE: '" & T_NET_ETH_PHY_MANAGEMENT_INTERFACE'image(i)(34 to str_length(T_NET_ETH_PHY_MANAGEMENT_INTERFACE'image(i))) & "'" severity warning; --test - if str_imatch(str_toUpper(str), str_toUpper(T_NET_ETH_PHY_MANAGEMENT_INTERFACE'image(i))) + --report "Trimmed PHY_MANAGEMENT_INTERFACE: '" & T_NET_ETH_PHY_MANAGEMENT_INTERFACE'image(i)(34 to str_length(T_NET_ETH_PHY_MANAGEMENT_INTERFACE'image(i))) & "'" severity warning; --test + if str_imatch(str_toUpper(str), str_toUpper(T_NET_ETH_PHY_MANAGEMENT_INTERFACE'image(i))) or str_imatch(str_toUpper(str), str_toUpper(T_NET_ETH_PHY_MANAGEMENT_INTERFACE'image(i)(str_low(T_NET_ETH_PHY_MANAGEMENT_INTERFACE'image(i))+33 to str_low(T_NET_ETH_PHY_MANAGEMENT_INTERFACE'image(i))+str_length(T_NET_ETH_PHY_MANAGEMENT_INTERFACE'image(i))-1))) then --start from char 33 to get rid of prefix --report "PHY_MANAGEMENT_INTERFACE: '" & T_NET_ETH_PHY_MANAGEMENT_INTERFACE'image(i) & "'" severity warning; --test return i; - end if; + end if; end loop; report "Unknown PHY_MANAGEMENT_INTERFACE: '" & str & "'" severity failure; return NET_ETH_PHY_MANAGEMENT_INTERFACE_EMPTY; @@ -872,12 +872,12 @@ package body net is function to_net_eth_PHYDevice(str : string) return T_NET_ETH_PHY_DEVICE is begin for i in T_NET_ETH_PHY_DEVICE loop - --report "Trimmed PHY_DEVICE: '" & T_NET_ETH_PHY_DEVICE'image(i)(20 to str_length(T_NET_ETH_PHY_DEVICE'image(i))) & "'" severity warning; --test - if str_imatch(str_toUpper(str), str_toUpper(T_NET_ETH_PHY_DEVICE'image(i))) + --report "Trimmed PHY_DEVICE: '" & T_NET_ETH_PHY_DEVICE'image(i)(20 to str_length(T_NET_ETH_PHY_DEVICE'image(i))) & "'" severity warning; --test + if str_imatch(str_toUpper(str), str_toUpper(T_NET_ETH_PHY_DEVICE'image(i))) or str_imatch(str_toUpper(str), str_toUpper(T_NET_ETH_PHY_DEVICE'image(i)(str_low(T_NET_ETH_PHY_DEVICE'image(i))+19 to str_low(T_NET_ETH_PHY_DEVICE'image(i))+str_length(T_NET_ETH_PHY_DEVICE'image(i))-1))) then --start from char 19 to get rid of prefix --report "PHY_DEVICE: '" & T_NET_ETH_PHY_DEVICE'image(i) & "'" severity warning; --test return i; - end if; + end if; end loop; report "Unknown PHY_DEVICE: '" & str & "'" severity failure; return NET_ETH_PHY_DEVICE_EMPTY; @@ -888,11 +888,11 @@ package body net is variable count : natural := 0; begin for i in MACConfiguration'range loop - for j in MACConfiguration(i).TypeSwitch'range loop + for j in MACConfiguration(i).TypeSwitch'range loop if (MACConfiguration(i).TypeSwitch(j) /= C_NET_MAC_ETHERNETTYPE_EMPTY) then - count := count + 1; + count := count + 1; end if; - end loop; + end loop; end loop; return count; @@ -905,7 +905,7 @@ package body net is variable mac : T_NET_MAC_ADDRESS; begin for i in 0 to 5 loop - mac(i) := slv(((i * 8) + 7) downto (i * 8)); + mac(i) := slv(((i * 8) + 7) downto (i * 8)); end loop; return mac; end function; @@ -915,7 +915,7 @@ package body net is begin if (slvv'length /= 6) then report "to_net_mac_address: vector-length mismatch - slvv'length=" & integer'image(slvv'length) severity error; end if; for i in slvv'range loop - mac(i) := slvv(i); + mac(i) := slvv(i); end loop; return mac; end function; @@ -932,16 +932,16 @@ package body net is -- report "mac_split of " & str severity NOTE; for i in str'reverse_range loop -- report " char=" & input(i) severity NOTE; - if (to_digit(input(i), 'h') /= -1) then + if (to_digit(input(i), 'h') /= -1) then Segments(SegmentPointer)(CharPointer) := input(i); -- report " copy to seg=" & INTEGER'image(SegmentPointer) & " pos=" & INTEGER'image(CharPointer) severity NOTE; CharPointer := CharPointer - 1; - elsif ((input(i) = ':') or (input(i) = '-')) then + elsif ((input(i) = ':') or (input(i) = '-')) then SegmentPointer := SegmentPointer + 1; CharPointer := 2; - else + else report "ERROR - unknown char [" & input(i) & "]" severity error; - end if; + end if; end loop; return Segments; @@ -954,7 +954,7 @@ package body net is variable MAC : T_NET_MAC_ADDRESS; begin for i in Segments'range loop - MAC(i) := to_slv(to_natural_hex(Segments(i)), 8); + MAC(i) := to_slv(to_natural_hex(Segments(i)), 8); end loop; return MAC; end function; @@ -963,7 +963,7 @@ package body net is variable EthType : T_NET_MAC_ETHERNETTYPE; begin for i in 0 to 1 loop - EthType(i) := slv(((i * 8) + 7) downto (i * 8)); + EthType(i) := slv(((i * 8) + 7) downto (i * 8)); end loop; return EthType; end function; @@ -972,7 +972,7 @@ package body net is variable slv : T_SLV_48; begin for i in 0 to 5 loop - slv(((i * 8) + 7) downto (i * 8)) := mac(i); + slv(((i * 8) + 7) downto (i * 8)) := mac(i); end loop; return slv; end function; @@ -981,7 +981,7 @@ package body net is variable slv : T_SLV_16; begin for i in 0 to 1 loop - slv(((i * 8) + 7) downto (i * 8)) := EthType(i); + slv(((i * 8) + 7) downto (i * 8)) := EthType(i); end loop; return slv; end function; @@ -1000,7 +1000,7 @@ package body net is variable slvv : T_SLVV_8(mac'range); begin for i in mac'range loop - slvv(i) := mac(i); + slvv(i) := mac(i); end loop; return slvv; end function; @@ -1009,7 +1009,7 @@ package body net is variable slvv : T_SLVV_8(EthType'range); begin for i in EthType'range loop - slvv(i) := EthType(i); + slvv(i) := EthType(i); end loop; return slvv; end function; @@ -1018,7 +1018,7 @@ package body net is variable str : string(1 to 18) := (others => ':'); begin for i in 0 to 5 loop - str((i * 3) + 1 to (i * 3) + 2) := to_string(mac(5 - i), 'h'); + str((i * 3) + 1 to (i * 3) + 2) := to_string(mac(5 - i), 'h'); end loop; return str(1 to 17); end function; @@ -1040,31 +1040,31 @@ package body net is function to_string(EthType : T_NET_MAC_ETHERNETTYPE) return string is begin if EthType = C_NET_MAC_ETHERNETTYPE_EMPTY then - return "Empty"; + return "Empty"; elsif EthType = C_NET_MAC_ETHERNETTYPE_ARP then - return "ARP"; + return "ARP"; elsif EthType = C_NET_MAC_ETHERNETTYPE_IPV4 then - return "IPv4"; + return "IPv4"; elsif EthType = C_NET_MAC_ETHERNETTYPE_IPV6 then - return "IPv6"; + return "IPv6"; elsif EthType = C_NET_MAC_ETHERNETTYPE_JUMBOFRAMES then - return "Jumbo"; + return "Jumbo"; elsif EthType = C_NET_MAC_ETHERNETTYPE_MACCONTROL then - return "MACControl"; + return "MACControl"; elsif EthType = C_NET_MAC_ETHERNETTYPE_QINQ then - return "QinQ"; + return "QinQ"; elsif EthType = C_NET_MAC_ETHERNETTYPE_SNMP then - return "SNMP"; + return "SNMP"; elsif EthType = C_NET_MAC_ETHERNETTYPE_VLAN then - return "VLAN"; + return "VLAN"; elsif EthType = C_NET_MAC_ETHERNETTYPE_WOL then - return "WOL"; + return "WOL"; elsif EthType = C_NET_MAC_ETHERNETTYPE_SWAP then - return "Swap"; + return "Swap"; elsif EthType = C_NET_MAC_ETHERNETTYPE_LOOPBACK then - return "LoopBack"; + return "LoopBack"; else - return "0x" & to_string(to_slv(EthType), 'h'); + return "0x" & to_string(to_slv(EthType), 'h'); end if; end function; @@ -1074,11 +1074,11 @@ package body net is function get_IP_Address_Bits(version : integer) return integer is begin if version = 4 then - return 32; + return 32; elsif version = 6 then - return 128; + return 128; else - return 0; + return 0; end if; end function; -- ========================================================================================================================================================== @@ -1088,7 +1088,7 @@ package body net is variable ip : T_NET_IPV4_ADDRESS; begin for i in 0 to 3 loop - ip(i) := slv(((i * 8) + 7) downto (i * 8)); + ip(i) := slv(((i * 8) + 7) downto (i * 8)); end loop; return ip; end function; @@ -1105,16 +1105,16 @@ package body net is -- report "ipv4_split of " & str severity NOTE; for i in str'reverse_range loop -- report " char=" & input(i) severity NOTE; - if (to_digit(input(i), 'd') /= -1) then + if (to_digit(input(i), 'd') /= -1) then Segments(SegmentPointer)(CharPointer) := input(i); -- report " copy to seg=" & INTEGER'image(SegmentPointer) & " pos=" & INTEGER'image(CharPointer) severity NOTE; CharPointer := CharPointer - 1; - elsif (input(i) = '.') then + elsif (input(i) = '.') then SegmentPointer := SegmentPointer + 1; CharPointer := 3; - else + else report "ERROR - unknown char" severity error; - end if; + end if; end loop; return Segments; @@ -1128,7 +1128,7 @@ package body net is variable IP : T_NET_IPV4_ADDRESS; begin for i in Segments'range loop - IP(i) := to_slv(to_natural_dec(Segments(i)), 8); + IP(i) := to_slv(to_natural_dec(Segments(i)), 8); end loop; return IP; end function; @@ -1147,7 +1147,7 @@ package body net is variable slv : T_SLV_32; begin for i in 0 to 3 loop - slv(((i * 8) + 7) downto (i * 8)) := ip(i); + slv(((i * 8) + 7) downto (i * 8)) := ip(i); end loop; return slv; end function; @@ -1179,7 +1179,7 @@ package body net is variable slvv : T_SLVV_8(ip'range); begin for i in ip'range loop - slvv(i) := ip(i); + slvv(i) := ip(i); end loop; return slvv; end function; @@ -1195,10 +1195,10 @@ package body net is for i in 3 downto 0 loop -- report " I=" & INTEGER'image(i) & " IP(i)=" & INTEGER'image(to_integer(unsigned(IP(i)))) & " CP=" & INTEGER'image(CharPointer) severity NOTE; - str := resize(integer'image(to_integer(unsigned(IP(i)))), str'length); - len := str_length(str); - temp(CharPointer to CharPointer + len - 1) := str(1 to len); - CharPointer := CharPointer + len + 1; + str := resize(integer'image(to_integer(unsigned(IP(i)))), str'length); + len := str_length(str); + temp(CharPointer to CharPointer + len - 1) := str(1 to len); + CharPointer := CharPointer + len + 1; end loop; return temp(1 to CharPointer - 2); @@ -1211,7 +1211,7 @@ package body net is variable ip : T_NET_IPV6_ADDRESS; begin for i in 0 to 15 loop - ip(i) := slv(((i * 8) + 7) downto (i * 8)); + ip(i) := slv(((i * 8) + 7) downto (i * 8)); end loop; return ip; @@ -1232,31 +1232,31 @@ package body net is for i in str'reverse_range loop -- report " char=" & input(i) severity NOTE; - if (to_digit(input(i), 'h') /= -1) then + if (to_digit(input(i), 'h') /= -1) then Segments(SegmentPointer)(CharPointer) := input(i); -- report " copy to seg=" & INTEGER'image(SegmentPointer) & " pos=" & INTEGER'image(CharPointer) severity NOTE; CharPointer := CharPointer - 1; DelimiterPointer := 0; - elsif (input(i) = ':') then + elsif (input(i) = ':') then if (DelimiterPointer = 0) then - SegmentPointer := SegmentPointer + 1; - CharPointer := 4; - DelimiterPointer := i; + SegmentPointer := SegmentPointer + 1; + CharPointer := 4; + DelimiterPointer := i; else - -- count remaining segments-delimiters - for j in i - 1 downto input'low loop + -- count remaining segments-delimiters + for j in i - 1 downto input'low loop if (input(j) = ':') then - RemainingDelimiters := RemainingDelimiters + 1; + RemainingDelimiters := RemainingDelimiters + 1; end if; - end loop; + end loop; -- report " lookahead rem-del=" & INTEGER'image(RemainingDelimiters) severity NOTE; - SegmentPointer := 7 - RemainingDelimiters; - CharPointer := 4; - DelimiterPointer := 0; + SegmentPointer := 7 - RemainingDelimiters; + CharPointer := 4; + DelimiterPointer := 0; end if; - else + else report " ERROR - unknown char" severity error; - end if; + end if; end loop; return Segments; @@ -1268,9 +1268,9 @@ package body net is variable IP : T_NET_IPV6_ADDRESS; begin for i in Segments'range loop - Segment := to_slv(to_natural_hex(Segments(i)), 16); - IP(i * 2) := Segment(7 downto 0); - IP((i * 2) + 1) := Segment(15 downto 8); + Segment := to_slv(to_natural_hex(Segments(i)), 16); + IP(i * 2) := Segment(7 downto 0); + IP((i * 2) + 1) := Segment(15 downto 8); end loop; return IP; end function; @@ -1282,10 +1282,10 @@ package body net is variable Len : natural; begin for i in str'reverse_range loop - if (str(i) = '/') then + if (str(i) = '/') then Pos := i; exit; - end if; + end if; end loop; if (Pos = str'high) then report "syntax error in IPv6 prefix: " & str severity error; end if; @@ -1305,7 +1305,7 @@ package body net is variable slv : T_SLV_128; begin for i in 0 to 15 loop - slv(((i * 8) + 7) downto (i * 8)) := ip(i); + slv(((i * 8) + 7) downto (i * 8)) := ip(i); end loop; return slv; end function; @@ -1314,7 +1314,7 @@ package body net is variable slvv : T_SLVV_8(ip'range); begin for i in ip'range loop - slvv(i) := ip(i); + slvv(i) := ip(i); end loop; return slvv; end function; @@ -1327,9 +1327,9 @@ package body net is variable copy : boolean := false; begin for i in 7 downto 0 loop - temp(CharPointer + 0 to CharPointer + 1) := to_string(IP((i * 2) + 1), 'h'); - temp(CharPointer + 2 to CharPointer + 3) := to_string(IP(i * 2), 'h'); - CharPointer := CharPointer + 5; + temp(CharPointer + 0 to CharPointer + 1) := to_string(IP((i * 2) + 1), 'h'); + temp(CharPointer + 2 to CharPointer + 3) := to_string(IP(i * 2), 'h'); + CharPointer := CharPointer + 5; end loop; -- compress string - remove leading zeros @@ -1338,21 +1338,21 @@ package body net is for i in temp'range loop -- report " I=" & INTEGER'image(i) & " char=" & temp(i) & " CP=" & INTEGER'image(CharPointer) & " copy=" & to_string(copy) severity NOTE; - if (copy = false) then + if (copy = false) then if ((temp(i) = '0') and (temp(i + 1) /= ':')) then - null; + null; else - temp(CharPointer) := temp(i); - CharPointer := CharPointer + 1; - copy := true; + temp(CharPointer) := temp(i); + CharPointer := CharPointer + 1; + copy := true; end if; - else + else if (temp(i) = ':') then - copy := false; + copy := false; end if; temp(CharPointer) := temp(i); CharPointer := CharPointer + 1; - end if; + end if; end loop; return temp(1 to CharPointer - 2); @@ -1370,7 +1370,7 @@ package body net is variable result : T_NET_UDP_PORT_VECTOR(Portpair'range); begin for i in Portpair'range loop - result(i) := Portpair(i).Ingress; + result(i) := Portpair(i).Ingress; end loop; return result; @@ -1380,7 +1380,7 @@ package body net is variable result : T_NET_UDP_PORT_VECTOR(Portpair'range); begin for i in Portpair'range loop - result(i) := Portpair(i).Egress; + result(i) := Portpair(i).Egress; end loop; return result; @@ -1408,20 +1408,20 @@ package body net is constant C_TEST_NET_MAC_CONFIGURATION : T_NET_MAC_CONFIGURATION_VECTOR := ( 0 => ( -----eth0-------------------------------------------------- - --MAC Address = AA:BB:CC:DD:EE:FF - Interface => (Address => (x"AA", x"BB", x"CC", x"DD", x"EE", x"FF"), + --MAC Address = AA:BB:CC:DD:EE:FF + Interface => (Address => (x"AA", x"BB", x"CC", x"DD", x"EE", x"FF"), Mask => C_NET_MAC_MASK_DEFAULT), - SourceFilter => ( + SourceFilter => ( 0 => (Address => (x"50", x"E5", x"49", x"52", x"F1", x"C8"), - Mask => C_NET_MAC_MASK_EMPTY), + Mask => C_NET_MAC_MASK_EMPTY), others => (Address => C_NET_MAC_ADDRESS_EMPTY, - Mask => C_NET_MAC_MASK_EMPTY)), - TypeSwitch => ( + Mask => C_NET_MAC_MASK_EMPTY)), + TypeSwitch => ( --0 => C_NET_MAC_ETHERNETTYPE_LOOPBACK, --1 => C_NET_MAC_ETHERNETTYPE_ARP, 0 => C_NET_MAC_ETHERNETTYPE_IPV4, others => C_NET_MAC_ETHERNETTYPE_EMPTY) - ) + ) ); diff --git a/src/net/net_FrameChecksum.vhdl b/src/net/net_FrameChecksum.vhdl index 2feccf1ee..bc66df4ad 100644 --- a/src/net/net_FrameChecksum.vhdl +++ b/src/net/net_FrameChecksum.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -36,91 +36,91 @@ use work.vectors.all; entity net_FrameChecksum is generic ( - MAX_FRAMES : positive := 8; - MAX_FRAME_LENGTH : positive := 2048; - META_BITS : T_POSVEC := (0 => 8); - META_FIFO_DEPTH : T_POSVEC := (0 => 16) + MAX_FRAMES : positive := 8; + MAX_FRAME_LENGTH : positive := 2048; + META_BITS : positive_vector := (0 => 8); + META_FIFO_DEPTH : positive_vector := (0 => 16) ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- IN port - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - In_Meta_rst : out std_logic; - In_Meta_nxt : out std_logic_vector(META_BITS'length - 1 downto 0); - In_Meta_Data : in std_logic_vector(isum(META_BITS) - 1 downto 0); + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + In_Meta_rst : out std_logic; + In_Meta_nxt : out std_logic_vector(META_BITS'length - 1 downto 0); + In_Meta_Data : in std_logic_vector(isum(META_BITS) - 1 downto 0); -- OUT port - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic; - Out_Meta_rst : in std_logic; - Out_Meta_nxt : in std_logic_vector(META_BITS'length - 1 downto 0); - Out_Meta_Data : out std_logic_vector(isum(META_BITS) - 1 downto 0); - Out_Meta_Length : out T_SLV_16; - Out_Meta_Checksum : out T_SLV_16 + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic; + Out_Meta_rst : in std_logic; + Out_Meta_nxt : in std_logic_vector(META_BITS'length - 1 downto 0); + Out_Meta_Data : out std_logic_vector(isum(META_BITS) - 1 downto 0); + Out_Meta_Length : out T_SLV_16; + Out_Meta_Checksum : out T_SLV_16 ); end entity; -- FIXME: review writer-FSM: check full signals => block incoming words/frames if datafifo or metafifo is full architecture rtl of net_FrameChecksum is - attribute FSM_ENCODING : string; - - type T_WRITER_STATE is (ST_IDLE, ST_FRAME, ST_CARRY_1, ST_CARRY_2); - type T_METAWRITER_STATE is (ST_IDLE, ST_METADATA); - type T_READER_STATE is (ST_IDLE, ST_FRAME); - - signal Writer_State : T_WRITER_STATE := ST_IDLE; - signal Writer_NextState : T_WRITER_STATE; - signal MetaWriter_State : T_METAWRITER_STATE := ST_IDLE; - signal MetaWriter_NextState : T_METAWRITER_STATE; - signal Reader_State : T_READER_STATE := ST_IDLE; - signal Reader_NextState : T_READER_STATE; - - signal Checksum_rst : std_logic; - signal Checksum_en : std_logic; - signal Checksum_Data_us : unsigned(In_Data'range); - signal Checksum0_nxt_us : unsigned(In_Data'length downto 0); - signal Checksum0_d_us : unsigned(In_Data'length downto 0) := (others => '0'); - signal Checksum0_nxt_cy : std_logic; - signal Checksum1_nxt_us : unsigned(In_Data'range); - signal Checksum1_d_us : unsigned(In_Data'range) := (others => '0'); - signal Checksum : T_SLV_16; - - constant WORDCOUNTER_BITS : positive := log2ceilnz(MAX_FRAME_LENGTH); - signal WordCounter_rst : std_logic; - signal WordCounter_en : std_logic; - signal WordCounter_us : unsigned(WORDCOUNTER_BITS - 1 downto 0) := to_unsigned(1, log2ceilnz(MAX_FRAME_LENGTH)); - signal WordCount : std_logic_vector(WORDCOUNTER_BITS + 15 downto 16); - - signal FrameCommit : std_logic; - - constant DATA_BITS : positive := 8; - constant EOF_BIT : natural := DATA_BITS; - - signal DataFIFO_put : std_logic; - signal DataFIFO_DataIn : std_logic_vector(DATA_BITS downto 0); - signal DataFIFO_Full : std_logic; - signal DataFIFO_got : std_logic; - signal DataFIFO_DataOut : std_logic_vector(DATA_BITS downto 0); - signal DataFIFO_Valid : std_logic; - - constant META_MISC_BITS : positive := Checksum'length + WordCount'length; - - signal MetaFIFO_Misc_put : std_logic; - signal MetaFIFO_Misc_DataIn : std_logic_vector(META_MISC_BITS - 1 downto 0); - signal MetaFIFO_Misc_Full : std_logic; - signal MetaFIFO_Misc_got : std_logic; - signal MetaFIFO_Misc_DataOut : std_logic_vector(META_MISC_BITS - 1 downto 0); - signal MetaFIFO_Misc_Valid : std_logic; - - signal Meta_rst : std_logic_vector(META_BITS'length - 1 downto 0); + attribute FSM_ENCODING : string; + + type T_WRITER_STATE is (ST_IDLE, ST_FRAME, ST_CARRY_1, ST_CARRY_2); + type T_METAWRITER_STATE is (ST_IDLE, ST_METADATA); + type T_READER_STATE is (ST_IDLE, ST_FRAME); + + signal Writer_State : T_WRITER_STATE := ST_IDLE; + signal Writer_NextState : T_WRITER_STATE; + signal MetaWriter_State : T_METAWRITER_STATE := ST_IDLE; + signal MetaWriter_NextState : T_METAWRITER_STATE; + signal Reader_State : T_READER_STATE := ST_IDLE; + signal Reader_NextState : T_READER_STATE; + + signal Checksum_rst : std_logic; + signal Checksum_en : std_logic; + signal Checksum_Data_us : unsigned(In_Data'range); + signal Checksum0_nxt_us : unsigned(In_Data'length downto 0); + signal Checksum0_d_us : unsigned(In_Data'length downto 0) := (others => '0'); + signal Checksum0_nxt_cy : std_logic; + signal Checksum1_nxt_us : unsigned(In_Data'range); + signal Checksum1_d_us : unsigned(In_Data'range) := (others => '0'); + signal Checksum : T_SLV_16; + + constant WORDCOUNTER_BITS : positive := log2ceilnz(MAX_FRAME_LENGTH); + signal WordCounter_rst : std_logic; + signal WordCounter_en : std_logic; + signal WordCounter_us : unsigned(WORDCOUNTER_BITS - 1 downto 0) := to_unsigned(1, log2ceilnz(MAX_FRAME_LENGTH)); + signal WordCount : std_logic_vector(WORDCOUNTER_BITS + 15 downto 16); + + signal FrameCommit : std_logic; + + constant DATA_BITS : positive := 8; + constant EOF_BIT : natural := DATA_BITS; + + signal DataFIFO_put : std_logic; + signal DataFIFO_DataIn : std_logic_vector(DATA_BITS downto 0); + signal DataFIFO_Full : std_logic; + signal DataFIFO_got : std_logic; + signal DataFIFO_DataOut : std_logic_vector(DATA_BITS downto 0); + signal DataFIFO_Valid : std_logic; + + constant META_MISC_BITS : positive := Checksum'length + WordCount'length; + + signal MetaFIFO_Misc_put : std_logic; + signal MetaFIFO_Misc_DataIn : std_logic_vector(META_MISC_BITS - 1 downto 0); + signal MetaFIFO_Misc_Full : std_logic; + signal MetaFIFO_Misc_got : std_logic; + signal MetaFIFO_Misc_DataOut : std_logic_vector(META_MISC_BITS - 1 downto 0); + signal MetaFIFO_Misc_Valid : std_logic; + + signal Meta_rst : std_logic_vector(META_BITS'length - 1 downto 0); begin @@ -128,11 +128,11 @@ begin begin if rising_edge(Clock) then if (Reset = '1') then - Writer_State <= ST_IDLE; - Reader_State <= ST_IDLE; + Writer_State <= ST_IDLE; + Reader_State <= ST_IDLE; else - Writer_State <= Writer_NextState; - Reader_State <= Reader_NextState; + Writer_State <= Writer_NextState; + Reader_State <= Reader_NextState; end if; end if; end process; @@ -142,87 +142,87 @@ begin WordCounter_us, Checksum0_nxt_cy, DataFIFO_Full, MetaFIFO_Misc_Full) begin - Writer_NextState <= Writer_State; + Writer_NextState <= Writer_State; - DataFIFO_put <= '0'; - MetaFIFO_Misc_put <= '0'; + DataFIFO_put <= '0'; + MetaFIFO_Misc_put <= '0'; - In_Ack <= not DataFIFO_Full; + In_Ack <= not DataFIFO_Full; - WordCounter_rst <= '0'; - WordCounter_en <= '0'; + WordCounter_rst <= '0'; + WordCounter_en <= '0'; - Checksum_rst <= '0'; - Checksum_en <= '0'; - Checksum_Data_us <= unsigned(In_Data); + Checksum_rst <= '0'; + Checksum_en <= '0'; + Checksum_Data_us <= unsigned(In_Data); case Writer_State is when ST_IDLE => if ((In_Valid and In_SOF and (not DataFIFO_Full)) = '1') then - WordCounter_en <= '1'; - Checksum_en <= '1'; - DataFIFO_put <= In_Valid; + WordCounter_en <= '1'; + Checksum_en <= '1'; + DataFIFO_put <= In_Valid; if (In_EOF = '1') then - MetaFIFO_Misc_put <= '1'; + MetaFIFO_Misc_put <= '1'; - Writer_NextState <= ST_IDLE; + Writer_NextState <= ST_IDLE; else - Writer_NextState <= ST_FRAME; + Writer_NextState <= ST_FRAME; end if; end if; when ST_FRAME => - DataFIFO_put <= In_Valid; + DataFIFO_put <= In_Valid; if ((In_Valid and (not DataFIFO_Full)) = '1') then - WordCounter_en <= '1'; - Checksum_en <= '1'; + WordCounter_en <= '1'; + Checksum_en <= '1'; if (In_EOF = '1') then - WordCounter_en <= '0'; + WordCounter_en <= '0'; if (Checksum0_nxt_cy = '0') then - WordCounter_rst <= '1'; - Checksum_rst <= '1'; + WordCounter_rst <= '1'; + Checksum_rst <= '1'; - MetaFIFO_Misc_put <= '1'; + MetaFIFO_Misc_put <= '1'; - Writer_NextState <= ST_IDLE; + Writer_NextState <= ST_IDLE; else - Writer_NextState <= ST_CARRY_1; + Writer_NextState <= ST_CARRY_1; end if; end if; end if; when ST_CARRY_1 => - In_Ack <= '0'; + In_Ack <= '0'; - Checksum_Data_us <= (others => '0'); + Checksum_Data_us <= (others => '0'); if (Checksum0_nxt_cy = '0') then - Checksum_rst <= '1'; - WordCounter_rst <= '1'; + Checksum_rst <= '1'; + WordCounter_rst <= '1'; - MetaFIFO_Misc_put <= '1'; + MetaFIFO_Misc_put <= '1'; - Writer_NextState <= ST_IDLE; + Writer_NextState <= ST_IDLE; else - Checksum_en <= '1'; + Checksum_en <= '1'; - Writer_NextState <= ST_CARRY_2; + Writer_NextState <= ST_CARRY_2; end if; when ST_CARRY_2 => - In_Ack <= '0'; + In_Ack <= '0'; - Checksum_Data_us <= (others => '0'); - Checksum_rst <= '1'; - WordCounter_rst <= '1'; + Checksum_Data_us <= (others => '0'); + Checksum_rst <= '1'; + WordCounter_rst <= '1'; - MetaFIFO_Misc_put <= '1'; + MetaFIFO_Misc_put <= '1'; - Writer_NextState <= ST_IDLE; + Writer_NextState <= ST_IDLE; end case; end process; @@ -233,41 +233,41 @@ begin DataFIFO_Valid, DataFIFO_DataOut, MetaFIFO_Misc_Valid, MetaFIFO_Misc_DataOut) begin - Reader_NextState <= Reader_State; + Reader_NextState <= Reader_State; - Out_Valid <= '0'; - Out_Data <= DataFIFO_DataOut(Out_Data'range); - Out_SOF <= '0'; - Out_EOF <= DataFIFO_DataOut(EOF_BIT); - Out_Meta_Checksum <= MetaFIFO_Misc_DataOut(Checksum'range); - Out_Meta_Length <= resize(MetaFIFO_Misc_DataOut(WordCount'range), Out_Meta_Length'length); + Out_Valid <= '0'; + Out_Data <= DataFIFO_DataOut(Out_Data'range); + Out_SOF <= '0'; + Out_EOF <= DataFIFO_DataOut(EOF_BIT); + Out_Meta_Checksum <= MetaFIFO_Misc_DataOut(Checksum'range); + Out_Meta_Length <= resize(MetaFIFO_Misc_DataOut(WordCount'range), Out_Meta_Length'length); - DataFIFO_got <= '0'; + DataFIFO_got <= '0'; case Reader_State is when ST_IDLE => - Out_SOF <= '1'; + Out_SOF <= '1'; if ((DataFIFO_Valid and MetaFIFO_Misc_Valid) = '1') then - Out_Valid <= '1'; + Out_Valid <= '1'; - if (Out_Ack = '1') then - DataFIFO_got <= '1'; + if (Out_Ack = '1') then + DataFIFO_got <= '1'; if (DataFIFO_DataOut(EOF_BIT) = '0') then - Reader_NextState <= ST_FRAME; + Reader_NextState <= ST_FRAME; end if; end if; end if; when ST_FRAME => - Out_Valid <= DataFIFO_Valid; + Out_Valid <= DataFIFO_Valid; - if (Out_Ack = '1') then - DataFIFO_got <= '1'; + if (Out_Ack = '1') then + DataFIFO_got <= '1'; if (DataFIFO_DataOut(EOF_BIT) = '1') then - Reader_NextState <= ST_IDLE; + Reader_NextState <= ST_IDLE; end if; end if; @@ -278,180 +278,180 @@ begin begin if rising_edge(Clock) then if (WordCounter_rst = '1') then - WordCounter_us <= to_unsigned(1, WordCounter_us'length); + WordCounter_us <= to_unsigned(1, WordCounter_us'length); elsif (WordCounter_en = '1') then - WordCounter_us <= WordCounter_us + 1; + WordCounter_us <= WordCounter_us + 1; end if; end if; end process; - Checksum0_nxt_cy <= Checksum0_nxt_us(Checksum0_nxt_us'high); - Checksum0_nxt_us <= ('0' & Checksum1_d_us) + ('0' & Checksum_Data_us) + ((Checksum1_d_us'range => '0') & Checksum0_d_us(Checksum0_d_us'high)); - Checksum1_nxt_us <= Checksum0_d_us(Checksum1_d_us'range); + Checksum0_nxt_cy <= Checksum0_nxt_us(Checksum0_nxt_us'high); + Checksum0_nxt_us <= ('0' & Checksum1_d_us) + ('0' & Checksum_Data_us) + ((Checksum1_d_us'range => '0') & Checksum0_d_us(Checksum0_d_us'high)); + Checksum1_nxt_us <= Checksum0_d_us(Checksum1_d_us'range); process(Clock) begin if rising_edge(Clock) then if (Checksum_rst = '1') then - Checksum0_d_us <= (others => '0'); - Checksum1_d_us <= (others => '0'); + Checksum0_d_us <= (others => '0'); + Checksum1_d_us <= (others => '0'); elsif (Checksum_en = '1') then - Checksum0_d_us <= Checksum0_nxt_us; - Checksum1_d_us <= Checksum1_nxt_us; + Checksum0_d_us <= Checksum0_nxt_us; + Checksum1_d_us <= Checksum1_nxt_us; end if; end if; end process; - Checksum <= std_logic_vector(Checksum0_nxt_us(Checksum1_nxt_us'range)) & std_logic_vector(Checksum1_nxt_us); - WordCount <= std_logic_vector(WordCounter_us); + Checksum <= std_logic_vector(Checksum0_nxt_us(Checksum1_nxt_us'range)) & std_logic_vector(Checksum1_nxt_us); + WordCount <= std_logic_vector(WordCounter_us); - DataFIFO_DataIn(In_Data'range) <= In_Data; - DataFIFO_DataIn(EOF_BIT) <= In_EOF; + DataFIFO_DataIn(In_Data'range) <= In_Data; + DataFIFO_DataIn(EOF_BIT) <= In_EOF; DataFIFO: entity work.fifo_cc_got generic map ( - D_BITS => DataFIFO_DataIn'length, -- Data Width - MIN_DEPTH => MAX_FRAME_LENGTH, -- Minimum FIFO Depth - DATA_REG => FALSE, -- Store Data Content in Registers - STATE_REG => TRUE, -- Registered Full/Empty Indicators - OUTPUT_REG => TRUE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + DATA_BITS => DataFIFO_DataIn'length, -- Data Width + MIN_DEPTH => MAX_FRAME_LENGTH, -- Minimum FIFO Depth + DATA_REG => FALSE, -- Store Data Content in Registers + STATE_REG => TRUE, -- Registered Full/Empty Indicators + OUTPUT_REG => TRUE, -- Registered FIFO Output + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) port map ( - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Write Interface - put => DataFIFO_put, - din => DataFIFO_DataIn, - full => DataFIFO_Full, - estate_wr => open, + Put => DataFIFO_put, + DataIn => DataFIFO_DataIn, + Full => DataFIFO_Full, + EmptyState => open, -- Read Interface - got => DataFIFO_got, - valid => DataFIFO_Valid, - dout => DataFIFO_DataOut, - fstate_rd => open + Got => DataFIFO_got, + Valid => DataFIFO_Valid, + DataOut => DataFIFO_DataOut, + FillState => open ); - MetaFIFO_Misc_DataIn(Checksum'range) <= ite((WordCounter_us(0) = to_sl(Writer_State /= ST_CARRY_1)), Checksum, swap(Checksum, 8)); - MetaFIFO_Misc_DataIn(WordCount'range) <= WordCount; + MetaFIFO_Misc_DataIn(Checksum'range) <= ite((WordCounter_us(0) = to_sl(Writer_State /= ST_CARRY_1)), Checksum, swap(Checksum, 8)); + MetaFIFO_Misc_DataIn(WordCount'range) <= WordCount; MetaFIFO_Misc: entity work.fifo_cc_got generic map ( - D_BITS => MetaFIFO_Misc_DataIn'length, -- Data Width - MIN_DEPTH => MAX_FRAMES, -- Minimum FIFO Depth - DATA_REG => TRUE, -- Store Data Content in Registers - STATE_REG => TRUE, -- Registered Full/Empty Indicators - OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + DATA_BITS => MetaFIFO_Misc_DataIn'length, -- Data Width + MIN_DEPTH => MAX_FRAMES, -- Minimum FIFO Depth + DATA_REG => TRUE, -- Store Data Content in Registers + STATE_REG => TRUE, -- Registered Full/Empty Indicators + OUTPUT_REG => FALSE, -- Registered FIFO Output + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) port map ( - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Write Interface - put => MetaFIFO_Misc_put, - din => MetaFIFO_Misc_DataIn, - full => MetaFIFO_Misc_Full, - estate_wr => open, + Put => MetaFIFO_Misc_put, + DataIn => MetaFIFO_Misc_DataIn, + Full => MetaFIFO_Misc_Full, + EmptyState => open, -- Read Interface - got => MetaFIFO_Misc_got, - valid => MetaFIFO_Misc_Valid, - dout => MetaFIFO_Misc_DataOut, - fstate_rd => open + Got => MetaFIFO_Misc_got, + Valid => MetaFIFO_Misc_Valid, + DataOut => MetaFIFO_Misc_DataOut, + FillState => open ); - Out_Meta_Length <= resize(MetaFIFO_Misc_DataOut(WordCount'range), Out_Meta_Length'length); - Out_Meta_Checksum <= MetaFIFO_Misc_DataOut(Checksum'range); + Out_Meta_Length <= resize(MetaFIFO_Misc_DataOut(WordCount'range), Out_Meta_Length'length); + Out_Meta_Checksum <= MetaFIFO_Misc_DataOut(Checksum'range); - FrameCommit <= DataFIFO_Valid and DataFIFO_DataOut(EOF_BIT) and Out_Ack; - MetaFIFO_Misc_got <= FrameCommit; + FrameCommit <= DataFIFO_Valid and DataFIFO_DataOut(EOF_BIT) and Out_Ack; + MetaFIFO_Misc_got <= FrameCommit; genMeta : for i in 0 to META_BITS'length - 1 generate - signal MetaFIFO_put : std_logic; - signal MetaFIFO_DataIn : std_logic_vector(META_BITS(i) - 1 downto 0); - signal MetaFIFO_Full : std_logic; - signal MetaFIFO_got : std_logic; - signal MetaFIFO_DataOut : std_logic_vector(META_BITS(i) - 1 downto 0); - signal MetaFIFO_Valid : std_logic; - signal MetaFIFO_Commit : std_logic; - signal MetaFIFO_Rollback : std_logic; - - signal Writer_CounterControl : std_logic := '0'; - - signal Writer_Counter_rst : std_logic; - signal Writer_Counter_en : std_logic; - signal Writer_Counter_us : unsigned(log2ceilnz(META_FIFO_DEPTH(i) * MAX_FRAMES) - 1 downto 0) := (others => '0'); + signal MetaFIFO_put : std_logic; + signal MetaFIFO_DataIn : std_logic_vector(META_BITS(i) - 1 downto 0); + signal MetaFIFO_Full : std_logic; + signal MetaFIFO_got : std_logic; + signal MetaFIFO_DataOut : std_logic_vector(META_BITS(i) - 1 downto 0); + signal MetaFIFO_Valid : std_logic; + signal MetaFIFO_Commit : std_logic; + signal MetaFIFO_Rollback : std_logic; + + signal Writer_CounterControl : std_logic := '0'; + + signal Writer_Counter_rst : std_logic; + signal Writer_Counter_en : std_logic; + signal Writer_Counter_us : unsigned(log2ceilnz(META_FIFO_DEPTH(i) * MAX_FRAMES) - 1 downto 0) := (others => '0'); begin - Writer_Counter_rst <= '0'; -- FIXME: is this correct? + Writer_Counter_rst <= '0'; -- FIXME: is this correct? process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - Writer_CounterControl <= '0'; + Writer_CounterControl <= '0'; elsif ((In_Valid and In_SOF) = '1') then - Writer_CounterControl <= '1'; + Writer_CounterControl <= '1'; elsif (Writer_Counter_us = (META_FIFO_DEPTH(i) - 1)) then - Writer_CounterControl <= '0'; + Writer_CounterControl <= '0'; end if; end if; end process; - Writer_Counter_en <= (In_Valid and In_SOF) or Writer_CounterControl; + Writer_Counter_en <= (In_Valid and In_SOF) or Writer_CounterControl; process(Clock) begin if rising_edge(Clock) then if ((Reset or Writer_Counter_rst) = '1') then - Writer_Counter_us <= (others => '0'); + Writer_Counter_us <= (others => '0'); elsif (Writer_Counter_en = '1') then - Writer_Counter_us <= Writer_Counter_us + 1; + Writer_Counter_us <= Writer_Counter_us + 1; end if; end if; end process; - Meta_rst(i) <= not Writer_Counter_en; - In_Meta_nxt(i) <= Writer_Counter_en; + Meta_rst(i) <= not Writer_Counter_en; + In_Meta_nxt(i) <= Writer_Counter_en; - MetaFIFO_put <= Writer_Counter_en; - MetaFIFO_DataIn <= In_Meta_Data(high(META_BITS, i) downto low(META_BITS, i)); + MetaFIFO_put <= Writer_Counter_en; + MetaFIFO_DataIn <= In_Meta_Data(high(META_BITS, i) downto low(META_BITS, i)); MetaFIFO: entity work.fifo_cc_got_tempgot generic map ( - D_BITS => MetaFIFO_DataIn'length, -- Data Width - MIN_DEPTH => (META_FIFO_DEPTH(i) * MAX_FRAMES), -- Minimum FIFO Depth - DATA_REG => TRUE, -- Store Data Content in Registers - STATE_REG => TRUE, -- Registered Full/Empty Indicators - OUTPUT_REG => FALSE, -- Registered FIFO Output - ESTATE_WR_BITS => 0, -- Empty State Bits - FSTATE_RD_BITS => 0 -- Full State Bits + DATA_BITS => MetaFIFO_DataIn'length, -- Data Width + MIN_DEPTH => (META_FIFO_DEPTH(i) * MAX_FRAMES), -- Minimum FIFO Depth + DATA_REG => TRUE, -- Store Data Content in Registers + STATE_REG => TRUE, -- Registered Full/Empty Indicators + OUTPUT_REG => FALSE, -- Registered FIFO Output + EMPTY_STATE_BITS => 0, -- Empty State Bits + FILL_STATE_BITS => 0 -- Full State Bits ) port map ( - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Write Interface - put => MetaFIFO_put, - din => MetaFIFO_DataIn, - full => MetaFIFO_Full, - estate_wr => open, + Put => MetaFIFO_put, + DataIn => MetaFIFO_DataIn, + Full => MetaFIFO_Full, + EmptyState => open, -- Read Interface - got => MetaFIFO_got, - valid => MetaFIFO_Valid, - dout => MetaFIFO_DataOut, - fstate_rd => open, + Got => MetaFIFO_got, + Valid => MetaFIFO_Valid, + DataOut => MetaFIFO_DataOut, + FillState => open, - commit => MetaFIFO_Commit, - rollback => MetaFIFO_Rollback + Commit => MetaFIFO_Commit, + Rollback => MetaFIFO_Rollback ); - MetaFIFO_got <= Out_Meta_nxt(i); - MetaFIFO_Commit <= FrameCommit; - MetaFIFO_Rollback <= Out_Meta_rst; + MetaFIFO_got <= Out_Meta_nxt(i); + MetaFIFO_Commit <= FrameCommit; + MetaFIFO_Rollback <= Out_Meta_rst; - Out_Meta_Data(high(META_BITS, i) downto low(META_BITS, i)) <= MetaFIFO_DataOut; + Out_Meta_Data(high(META_BITS, i) downto low(META_BITS, i)) <= MetaFIFO_DataOut; end generate; - In_Meta_rst <= slv_and(Meta_rst); + In_Meta_rst <= slv_and(Meta_rst); end architecture; diff --git a/src/net/udp/udp.pro b/src/net/udp/build.pro similarity index 100% rename from src/net/udp/udp.pro rename to src/net/udp/build.pro diff --git a/src/net/udp/udp_FrameLoopback.vhdl b/src/net/udp/udp_FrameLoopback.vhdl index 7f360c294..966f40908 100644 --- a/src/net/udp/udp_FrameLoopback.vhdl +++ b/src/net/udp/udp_FrameLoopback.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,119 +37,119 @@ use work.net.all; entity udp_FrameLoopback is generic ( - IP_VERSION : positive := 6; - MAX_FRAMES : positive := 4 + IP_VERSION : positive := 6; + MAX_FRAMES : positive := 4 ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- IN port - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - In_Meta_rst : out std_logic; - In_Meta_DestIPAddress_nxt : out std_logic; - In_Meta_DestIPAddress_Data : in T_SLV_8; - In_Meta_SrcIPAddress_nxt : out std_logic; - In_Meta_SrcIPAddress_Data : in T_SLV_8; - In_Meta_DestPort : in T_NET_UDP_PORT; - In_Meta_SrcPort : in T_NET_UDP_PORT; + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + In_Meta_rst : out std_logic; + In_Meta_DestIPAddress_nxt : out std_logic; + In_Meta_DestIPAddress_Data : in T_SLV_8; + In_Meta_SrcIPAddress_nxt : out std_logic; + In_Meta_SrcIPAddress_Data : in T_SLV_8; + In_Meta_DestPort : in T_NET_UDP_PORT; + In_Meta_SrcPort : in T_NET_UDP_PORT; -- OUT port - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic; - Out_Meta_rst : in std_logic; - Out_Meta_DestIPAddress_nxt : in std_logic; - Out_Meta_DestIPAddress_Data : out T_SLV_8; - Out_Meta_SrcIPAddress_nxt : in std_logic; - Out_Meta_SrcIPAddress_Data : out T_SLV_8; - Out_Meta_DestPort : out T_NET_UDP_PORT; - Out_Meta_SrcPort : out T_NET_UDP_PORT + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic; + Out_Meta_rst : in std_logic; + Out_Meta_DestIPAddress_nxt : in std_logic; + Out_Meta_DestIPAddress_Data : out T_SLV_8; + Out_Meta_SrcIPAddress_nxt : in std_logic; + Out_Meta_SrcIPAddress_Data : out T_SLV_8; + Out_Meta_DestPort : out T_NET_UDP_PORT; + Out_Meta_SrcPort : out T_NET_UDP_PORT ); end entity; architecture rtl of udp_FrameLoopback is - constant IPADDRESS_LENGTH : positive := ite((IP_VERSION = 4), 4, 16); - - constant META_STREAMID_SRCADDR : natural := 0; - constant META_STREAMID_DESTADDR : natural := 1; - constant META_STREAMID_SRCPORT : natural := 2; - constant META_STREAMID_DESTPORT : natural := 3; - - constant META_BITS : T_POSVEC := ( - META_STREAMID_SRCADDR => 8, - META_STREAMID_DESTADDR => 8, - META_STREAMID_SRCPORT => 16, - META_STREAMID_DESTPORT => 16 + constant IPADDRESS_LENGTH : positive := ite((IP_VERSION = 4), 4, 16); + + constant META_STREAMID_SRCADDR : natural := 0; + constant META_STREAMID_DESTADDR : natural := 1; + constant META_STREAMID_SRCPORT : natural := 2; + constant META_STREAMID_DESTPORT : natural := 3; + + constant META_BITS : positive_vector := ( + META_STREAMID_SRCADDR => 8, + META_STREAMID_DESTADDR => 8, + META_STREAMID_SRCPORT => 16, + META_STREAMID_DESTPORT => 16 ); - constant META_FIFO_DEPTHS : T_POSVEC := ( - META_STREAMID_SRCADDR => IPADDRESS_LENGTH, - META_STREAMID_DESTADDR => IPADDRESS_LENGTH, - META_STREAMID_SRCPORT => 1, - META_STREAMID_DESTPORT => 1 + constant META_FIFO_DEPTHS : positive_vector := ( + META_STREAMID_SRCADDR => IPADDRESS_LENGTH, + META_STREAMID_DESTADDR => IPADDRESS_LENGTH, + META_STREAMID_SRCPORT => 1, + META_STREAMID_DESTPORT => 1 ); - signal StmBuf_MetaIn_nxt : std_logic_vector(META_BITS'length - 1 downto 0); - signal StmBuf_MetaIn_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); - signal StmBuf_MetaOut_nxt : std_logic_vector(META_BITS'length - 1 downto 0); - signal StmBuf_MetaOut_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); + signal StmBuf_MetaIn_nxt : std_logic_vector(META_BITS'length - 1 downto 0); + signal StmBuf_MetaIn_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); + signal StmBuf_MetaOut_nxt : std_logic_vector(META_BITS'length - 1 downto 0); + signal StmBuf_MetaOut_Data : std_logic_vector(isum(META_BITS) - 1 downto 0); begin - StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)) <= In_Meta_SrcIPAddress_Data; - StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)) <= In_Meta_DestIPAddress_Data; - StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_SRCPORT) downto low(META_BITS, META_STREAMID_SRCPORT)) <= In_Meta_SrcPort; - StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_DESTPORT) downto low(META_BITS, META_STREAMID_DESTPORT)) <= In_Meta_DestPort; + StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)) <= In_Meta_SrcIPAddress_Data; + StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)) <= In_Meta_DestIPAddress_Data; + StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_SRCPORT) downto low(META_BITS, META_STREAMID_SRCPORT)) <= In_Meta_SrcPort; + StmBuf_MetaIn_Data(high(META_BITS, META_STREAMID_DESTPORT) downto low(META_BITS, META_STREAMID_DESTPORT)) <= In_Meta_DestPort; - In_Meta_SrcIPAddress_nxt <= StmBuf_MetaIn_nxt(META_STREAMID_SRCADDR); - In_Meta_DestIPAddress_nxt <= StmBuf_MetaIn_nxt(META_STREAMID_DESTADDR); + In_Meta_SrcIPAddress_nxt <= StmBuf_MetaIn_nxt(META_STREAMID_SRCADDR); + In_Meta_DestIPAddress_nxt <= StmBuf_MetaIn_nxt(META_STREAMID_DESTADDR); StmBuf: entity work.stream_FIFO generic map ( - FRAMES => MAX_FRAMES, - DATA_BITS => 8, - DATA_FIFO_DEPTH => 1024, - META_BITS => META_BITS, - META_FIFO_DEPTH => META_FIFO_DEPTHS + FRAMES => MAX_FRAMES, + DATA_BITS => 8, + DATA_FIFO_DEPTH => 1024, + META_BITS => META_BITS, + META_FIFO_DEPTH => META_FIFO_DEPTHS ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => In_Valid, - In_Data => In_Data, - In_SOF => In_SOF, - In_EOF => In_EOF, - In_Ack => In_Ack, - In_Meta_rst => In_Meta_rst, - In_Meta_nxt => StmBuf_MetaIn_nxt, - In_Meta_Data => StmBuf_MetaIn_Data, - - Out_Valid => Out_Valid, - Out_Data => Out_Data, - Out_SOF => Out_SOF, - Out_EOF => Out_EOF, - Out_Ack => Out_Ack, - Out_Meta_rst => Out_Meta_rst, - Out_Meta_nxt => StmBuf_MetaOut_nxt, - Out_Meta_Data => StmBuf_MetaOut_Data + Clock => Clock, + Reset => Reset, + + In_Valid => In_Valid, + In_Data => In_Data, + In_SOF => In_SOF, + In_EOF => In_EOF, + In_Ack => In_Ack, + In_Meta_rst => In_Meta_rst, + In_Meta_nxt => StmBuf_MetaIn_nxt, + In_Meta_Data => StmBuf_MetaIn_Data, + + Out_Valid => Out_Valid, + Out_Data => Out_Data, + Out_SOF => Out_SOF, + Out_EOF => Out_EOF, + Out_Ack => Out_Ack, + Out_Meta_rst => Out_Meta_rst, + Out_Meta_nxt => StmBuf_MetaOut_nxt, + Out_Meta_Data => StmBuf_MetaOut_Data ); -- unpack buffer metadata to signals - Out_Meta_SrcIPAddress_Data <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)); -- Crossover: Source <= Destination - Out_Meta_DestIPAddress_Data <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)); -- Crossover: Destination <= Source - Out_Meta_SrcPort <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_DESTPORT) downto low(META_BITS, META_STREAMID_DESTPORT)); -- Crossover: Source <= Destination - Out_Meta_DestPort <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_SRCPORT) downto low(META_BITS, META_STREAMID_SRCPORT)); -- Crossover: Destination <= Source + Out_Meta_SrcIPAddress_Data <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_DESTADDR) downto low(META_BITS, META_STREAMID_DESTADDR)); -- Crossover: Source <= Destination + Out_Meta_DestIPAddress_Data <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_SRCADDR) downto low(META_BITS, META_STREAMID_SRCADDR)); -- Crossover: Destination <= Source + Out_Meta_SrcPort <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_DESTPORT) downto low(META_BITS, META_STREAMID_DESTPORT)); -- Crossover: Source <= Destination + Out_Meta_DestPort <= StmBuf_MetaOut_Data(high(META_BITS, META_STREAMID_SRCPORT) downto low(META_BITS, META_STREAMID_SRCPORT)); -- Crossover: Destination <= Source -- pack metadata nxt signals to StmBuf meta vector - StmBuf_MetaOut_nxt(META_STREAMID_SRCADDR) <= Out_Meta_DestIPAddress_nxt; - StmBuf_MetaOut_nxt(META_STREAMID_DESTADDR) <= Out_Meta_SrcIPAddress_nxt; - StmBuf_MetaOut_nxt(META_STREAMID_SRCPORT) <= '0'; - StmBuf_MetaOut_nxt(META_STREAMID_DESTPORT) <= '0'; + StmBuf_MetaOut_nxt(META_STREAMID_SRCADDR) <= Out_Meta_DestIPAddress_nxt; + StmBuf_MetaOut_nxt(META_STREAMID_DESTADDR) <= Out_Meta_SrcIPAddress_nxt; + StmBuf_MetaOut_nxt(META_STREAMID_SRCPORT) <= '0'; + StmBuf_MetaOut_nxt(META_STREAMID_DESTPORT) <= '0'; end architecture; diff --git a/src/net/udp/udp_RX.vhdl b/src/net/udp/udp_RX.vhdl index be79cebc0..a15f53c6e 100644 --- a/src/net/udp/udp_RX.vhdl +++ b/src/net/udp/udp_RX.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,56 +37,56 @@ use work.net.all; entity udp_RX is generic ( - DEBUG : boolean := FALSE; - IP_VERSION : positive := 6 + DEBUG : boolean := FALSE; + IP_VERSION : positive := 6 ); port ( - Clock : in std_logic; -- - Reset : in std_logic; -- + Clock : in std_logic; -- + Reset : in std_logic; -- -- STATUS port - Error : out std_logic; + Error : out std_logic; -- IN port - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - In_Meta_rst : out std_logic; - In_Meta_SrcMACAddress_nxt : out std_logic; - In_Meta_SrcMACAddress_Data : in T_SLV_8; - In_Meta_DestMACAddress_nxt : out std_logic; - In_Meta_DestMACAddress_Data : in T_SLV_8; - In_Meta_EthType : in T_SLV_16; - In_Meta_SrcIPAddress_nxt : out std_logic; - In_Meta_SrcIPAddress_Data : in T_SLV_8; - In_Meta_DestIPAddress_nxt : out std_logic; - In_Meta_DestIPAddress_Data : in T_SLV_8; --- In_Meta_TrafficClass : in T_SLV_8; --- In_Meta_FlowLabel : in T_SLV_24; - In_Meta_Length : in T_SLV_16; - In_Meta_Protocol : in T_SLV_8; + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + In_Meta_rst : out std_logic; + In_Meta_SrcMACAddress_nxt : out std_logic; + In_Meta_SrcMACAddress_Data : in T_SLV_8; + In_Meta_DestMACAddress_nxt : out std_logic; + In_Meta_DestMACAddress_Data : in T_SLV_8; + In_Meta_EthType : in T_SLV_16; + In_Meta_SrcIPAddress_nxt : out std_logic; + In_Meta_SrcIPAddress_Data : in T_SLV_8; + In_Meta_DestIPAddress_nxt : out std_logic; + In_Meta_DestIPAddress_Data : in T_SLV_8; +-- In_Meta_TrafficClass : in T_SLV_8; +-- In_Meta_FlowLabel : in T_SLV_24; + In_Meta_Length : in T_SLV_16; + In_Meta_Protocol : in T_SLV_8; -- OUT port - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic; - Out_Meta_rst : in std_logic; - Out_Meta_SrcMACAddress_nxt : in std_logic; - Out_Meta_SrcMACAddress_Data : out T_SLV_8; - Out_Meta_DestMACAddress_nxt : in std_logic; - Out_Meta_DestMACAddress_Data : out T_SLV_8; - Out_Meta_EthType : out T_SLV_16; - Out_Meta_SrcIPAddress_nxt : in std_logic; - Out_Meta_SrcIPAddress_Data : out T_SLV_8; - Out_Meta_DestIPAddress_nxt : in std_logic; - Out_Meta_DestIPAddress_Data : out T_SLV_8; --- Out_Meta_TrafficClass : out T_SLV_8; --- Out_Meta_FlowLabel : out T_SLV_24; - Out_Meta_Length : out T_SLV_16; - Out_Meta_Protocol : out T_SLV_8; - Out_Meta_SrcPort : out T_SLV_16; - Out_Meta_DestPort : out T_SLV_16 + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic; + Out_Meta_rst : in std_logic; + Out_Meta_SrcMACAddress_nxt : in std_logic; + Out_Meta_SrcMACAddress_Data : out T_SLV_8; + Out_Meta_DestMACAddress_nxt : in std_logic; + Out_Meta_DestMACAddress_Data : out T_SLV_8; + Out_Meta_EthType : out T_SLV_16; + Out_Meta_SrcIPAddress_nxt : in std_logic; + Out_Meta_SrcIPAddress_Data : out T_SLV_8; + Out_Meta_DestIPAddress_nxt : in std_logic; + Out_Meta_DestIPAddress_Data : out T_SLV_8; +-- Out_Meta_TrafficClass : out T_SLV_8; +-- Out_Meta_FlowLabel : out T_SLV_24; + Out_Meta_Length : out T_SLV_16; + Out_Meta_Protocol : out T_SLV_8; + Out_Meta_SrcPort : out T_SLV_16; + Out_Meta_DestPort : out T_SLV_16 ); end entity; @@ -94,275 +94,275 @@ end entity; -- Endianess: big-endian -- Alignment: 1 byte -- --- Byte 0 Byte 1 Byte 2 Byte 3 --- +================================+================================+================================+================================+ --- | SourcePort | DestinationPort | --- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ --- | PayloadLength | Checksum | --- +================================+================================+================================+================================+ --- | Payload | --- ~ ~ ~ ~ ~ --- | | --- ~ ~ ~ ~ ~ --- | | --- ~ ~ ~ ~ ~ --- | | --- +================================+================================+================================+================================+ +-- Byte 0 Byte 1 Byte 2 Byte 3 +-- +================================+================================+================================+================================+ +-- | SourcePort | DestinationPort | +-- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ +-- | PayloadLength | Checksum | +-- +================================+================================+================================+================================+ +-- | Payload | +-- ~ ~ ~ ~ ~ +-- | | +-- ~ ~ ~ ~ ~ +-- | | +-- ~ ~ ~ ~ ~ +-- | | +-- +================================+================================+================================+================================+ -- UDP pseudo header for IPv4 -- --- Byte 0 Byte 1 Byte 2 Byte 3 --- +================================+================================+================================+================================+ --- | SourceAddress | --- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ --- | DestinationAddress | --- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ --- | 0x00 | Protocol | Length | --- +================================+================================+================================+================================+ --- | UDP header (see above) | --- ~ ~ ~ ~ ~ --- | | --- +================================+================================+================================+================================+ --- | Payload | --- ~ ~ ~ ~ ~ --- | | --- +================================+================================+================================+================================+ +-- Byte 0 Byte 1 Byte 2 Byte 3 +-- +================================+================================+================================+================================+ +-- | SourceAddress | +-- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ +-- | DestinationAddress | +-- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ +-- | 0x00 | Protocol | Length | +-- +================================+================================+================================+================================+ +-- | UDP header (see above) | +-- ~ ~ ~ ~ ~ +-- | | +-- +================================+================================+================================+================================+ +-- | Payload | +-- ~ ~ ~ ~ ~ +-- | | +-- +================================+================================+================================+================================+ -- UDP pseudo header for IPv6 -- --- Byte 0 Byte 1 Byte 2 Byte 3 --- +================================+================================+================================+================================+ --- | SourceAddress | --- ~ ~ ~ ~ ~ --- | | --- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ --- | DestinationAddress | --- ~ ~ ~ ~ ~ --- | | --- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ --- | Length | --- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ --- | 0x000000 | NextHeader | --- +================================+================================+================================+================================+ --- | UDP header (see above) | --- ~ ~ ~ ~ ~ --- | | --- +================================+================================+================================+================================+ --- | Payload | --- ~ ~ ~ ~ ~ --- | | --- +================================+================================+================================+================================+ +-- Byte 0 Byte 1 Byte 2 Byte 3 +-- +================================+================================+================================+================================+ +-- | SourceAddress | +-- ~ ~ ~ ~ ~ +-- | | +-- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ +-- | DestinationAddress | +-- ~ ~ ~ ~ ~ +-- | | +-- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ +-- | Length | +-- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ +-- | 0x000000 | NextHeader | +-- +================================+================================+================================+================================+ +-- | UDP header (see above) | +-- ~ ~ ~ ~ ~ +-- | | +-- +================================+================================+================================+================================+ +-- | Payload | +-- ~ ~ ~ ~ ~ +-- | | +-- +================================+================================+================================+================================+ architecture rtl of udp_RX is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; type T_STATE is ( ST_IDLE, ST_RECEIVE_SOURCE_PORT_1, - ST_RECEIVE_DEST_PORT_0, ST_RECEIVE_DEST_PORT_1, - ST_RECEIVE_LENGTH_0, ST_RECEIVE_LENGTH_1, - ST_RECEIVE_CHECKSUM_0, ST_RECEIVE_CHECKSUM_1, - ST_RECEIVE_DATA_1, ST_RECEIVE_DATA_N, + ST_RECEIVE_DEST_PORT_0, ST_RECEIVE_DEST_PORT_1, + ST_RECEIVE_LENGTH_0, ST_RECEIVE_LENGTH_1, + ST_RECEIVE_CHECKSUM_0, ST_RECEIVE_CHECKSUM_1, + ST_RECEIVE_DATA_1, ST_RECEIVE_DATA_N, ST_DISCARD_FRAME, ST_ERROR ); - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); - signal In_Ack_i : std_logic; - signal Is_DataFlow : std_logic; - signal Is_SOF : std_logic; - signal Is_EOF : std_logic; + signal In_Ack_i : std_logic; + signal Is_DataFlow : std_logic; + signal Is_SOF : std_logic; + signal Is_EOF : std_logic; - signal Out_Valid_i : std_logic; - signal Out_SOF_i : std_logic; - signal Out_EOF_i : std_logic; + signal Out_Valid_i : std_logic; + signal Out_SOF_i : std_logic; + signal Out_EOF_i : std_logic; - signal Register_rst : std_logic; + signal Register_rst : std_logic; -- UDP header fields - signal SourcePort_en0 : std_logic; - signal SourcePort_en1 : std_logic; - signal DestinationPort_en0 : std_logic; - signal DestinationPort_en1 : std_logic; - signal Length_en0 : std_logic; - signal Length_en1 : std_logic; + signal SourcePort_en0 : std_logic; + signal SourcePort_en1 : std_logic; + signal DestinationPort_en0 : std_logic; + signal DestinationPort_en1 : std_logic; + signal Length_en0 : std_logic; + signal Length_en1 : std_logic; - signal SourcePort_d : T_SLV_16 := (others => '0'); - signal DestinationPort_d : T_SLV_16 := (others => '0'); - signal Length_d : T_SLV_16 := (others => '0'); + signal SourcePort_d : T_SLV_16 := (others => '0'); + signal DestinationPort_d : T_SLV_16 := (others => '0'); + signal Length_d : T_SLV_16 := (others => '0'); begin - In_Ack <= In_Ack_i; - Is_DataFlow <= In_Valid and In_Ack_i; - Is_SOF <= In_Valid and In_SOF; - Is_EOF <= In_Valid and In_EOF; + In_Ack <= In_Ack_i; + Is_DataFlow <= In_Valid and In_Ack_i; + Is_SOF <= In_Valid and In_SOF; + Is_EOF <= In_Valid and In_EOF; process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; process(State, Is_DataFlow, Is_SOF, Is_EOF, In_Valid, In_Data, In_EOF, Out_Ack) begin - NextState <= State; - Error <= '0'; + NextState <= State; + Error <= '0'; - In_Ack_i <= '0'; - Out_Valid_i <= '0'; - Out_SOF_i <= '0'; - Out_EOF_i <= '0'; + In_Ack_i <= '0'; + Out_Valid_i <= '0'; + Out_SOF_i <= '0'; + Out_EOF_i <= '0'; -- UDP header fields - Register_rst <= '0'; - SourcePort_en0 <= '0'; - SourcePort_en1 <= '0'; - DestinationPort_en0 <= '0'; - DestinationPort_en1 <= '0'; - Length_en0 <= '0'; - Length_en1 <= '0'; + Register_rst <= '0'; + SourcePort_en0 <= '0'; + SourcePort_en1 <= '0'; + DestinationPort_en0 <= '0'; + DestinationPort_en1 <= '0'; + Length_en0 <= '0'; + Length_en1 <= '0'; case State is when ST_IDLE => if (Is_SOF = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - SourcePort_en0 <= '1'; - NextState <= ST_RECEIVE_SOURCE_PORT_1; + SourcePort_en0 <= '1'; + NextState <= ST_RECEIVE_SOURCE_PORT_1; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_SOURCE_PORT_1 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - SourcePort_en1 <= '1'; - NextState <= ST_RECEIVE_DEST_PORT_0; + SourcePort_en1 <= '1'; + NextState <= ST_RECEIVE_DEST_PORT_0; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_DEST_PORT_0 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - DestinationPort_en0 <= '1'; - NextState <= ST_RECEIVE_DEST_PORT_1; + DestinationPort_en0 <= '1'; + NextState <= ST_RECEIVE_DEST_PORT_1; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_DEST_PORT_1 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - DestinationPort_en1 <= '1'; - NextState <= ST_RECEIVE_LENGTH_0; + DestinationPort_en1 <= '1'; + NextState <= ST_RECEIVE_LENGTH_0; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_LENGTH_0 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - Length_en0 <= '1'; - NextState <= ST_RECEIVE_LENGTH_1; + Length_en0 <= '1'; + NextState <= ST_RECEIVE_LENGTH_1; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_LENGTH_1 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - Length_en1 <= '1'; - NextState <= ST_RECEIVE_CHECKSUM_0; + Length_en1 <= '1'; + NextState <= ST_RECEIVE_CHECKSUM_0; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_CHECKSUM_0 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_RECEIVE_CHECKSUM_1; + NextState <= ST_RECEIVE_CHECKSUM_1; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_CHECKSUM_1 => if (In_Valid = '1') then - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '0') then - NextState <= ST_RECEIVE_DATA_1; + NextState <= ST_RECEIVE_DATA_1; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; when ST_RECEIVE_DATA_1 => - In_Ack_i <= Out_Ack; - Out_Valid_i <= In_Valid; - Out_SOF_i <= '1'; - Out_EOF_i <= In_EOF; + In_Ack_i <= Out_Ack; + Out_Valid_i <= In_Valid; + Out_SOF_i <= '1'; + Out_EOF_i <= In_EOF; if (Is_DataFlow = '1') then if (Is_EOF = '0') then - NextState <= ST_RECEIVE_DATA_N; + NextState <= ST_RECEIVE_DATA_N; else - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; end if; when ST_RECEIVE_DATA_N => - In_Ack_i <= Out_Ack; - Out_Valid_i <= In_Valid; - Out_EOF_i <= In_EOF; + In_Ack_i <= Out_Ack; + Out_Valid_i <= In_Valid; + Out_EOF_i <= In_EOF; if (Is_EOF = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; -- TODO: if no checksum is set in IPv6 mode when ST_DISCARD_FRAME => - In_Ack_i <= '1'; + In_Ack_i <= '1'; if (Is_EOF = '1') then - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; when ST_ERROR => - Error <= '1'; - NextState <= ST_IDLE; + Error <= '1'; + NextState <= ST_IDLE; end case; end process; @@ -371,54 +371,54 @@ begin begin if rising_edge(Clock) then if ((Reset or Register_rst) = '1') then - SourcePort_d <= (others => '0'); - DestinationPort_d <= (others => '0'); - Length_d <= (others => '0'); + SourcePort_d <= (others => '0'); + DestinationPort_d <= (others => '0'); + Length_d <= (others => '0'); else if (SourcePort_en0 = '1') then - SourcePort_d(7 downto 0) <= In_Data; + SourcePort_d(7 downto 0) <= In_Data; end if; if (SourcePort_en1 = '1') then - SourcePort_d(15 downto 8) <= In_Data; + SourcePort_d(15 downto 8) <= In_Data; end if; if (DestinationPort_en0 = '1') then - DestinationPort_d(7 downto 0) <= In_Data; + DestinationPort_d(7 downto 0) <= In_Data; end if; if (DestinationPort_en1 = '1') then - DestinationPort_d(15 downto 8) <= In_Data; + DestinationPort_d(15 downto 8) <= In_Data; end if; if (Length_en0 = '1') then - Length_d(7 downto 0) <= In_Data; + Length_d(7 downto 0) <= In_Data; end if; if (Length_en1 = '1') then - Length_d(15 downto 8) <= In_Data; + Length_d(15 downto 8) <= In_Data; end if; end if; end if; end process; - In_Meta_rst <= Out_Meta_rst; - In_Meta_SrcMACAddress_nxt <= Out_Meta_SrcMACAddress_nxt; - In_Meta_DestMACAddress_nxt <= Out_Meta_DestMACAddress_nxt; - In_Meta_SrcIPAddress_nxt <= Out_Meta_SrcIPAddress_nxt; - In_Meta_DestIPAddress_nxt <= Out_Meta_DestIPAddress_nxt; - - Out_Valid <= Out_Valid_i; - Out_Data <= In_Data; - Out_SOF <= Out_SOF_i; - Out_EOF <= Out_EOF_i; - Out_Meta_SrcMACAddress_Data <= In_Meta_SrcMACAddress_Data; - Out_Meta_DestMACAddress_Data <= In_Meta_DestMACAddress_Data; - Out_Meta_EthType <= In_Meta_EthType; - Out_Meta_SrcIPAddress_Data <= In_Meta_SrcIPAddress_Data; - Out_Meta_DestIPAddress_Data <= In_Meta_DestIPAddress_Data; --- Out_Meta_TrafficClass <= In_Meta_TrafficClass; --- Out_Meta_FlowLabel <= In_Meta_FlowLabel; - Out_Meta_Length <= Length_d; - Out_Meta_Protocol <= In_Meta_Protocol; - Out_Meta_SrcPort <= SourcePort_d; - Out_Meta_DestPort <= DestinationPort_d; + In_Meta_rst <= Out_Meta_rst; + In_Meta_SrcMACAddress_nxt <= Out_Meta_SrcMACAddress_nxt; + In_Meta_DestMACAddress_nxt <= Out_Meta_DestMACAddress_nxt; + In_Meta_SrcIPAddress_nxt <= Out_Meta_SrcIPAddress_nxt; + In_Meta_DestIPAddress_nxt <= Out_Meta_DestIPAddress_nxt; + + Out_Valid <= Out_Valid_i; + Out_Data <= In_Data; + Out_SOF <= Out_SOF_i; + Out_EOF <= Out_EOF_i; + Out_Meta_SrcMACAddress_Data <= In_Meta_SrcMACAddress_Data; + Out_Meta_DestMACAddress_Data <= In_Meta_DestMACAddress_Data; + Out_Meta_EthType <= In_Meta_EthType; + Out_Meta_SrcIPAddress_Data <= In_Meta_SrcIPAddress_Data; + Out_Meta_DestIPAddress_Data <= In_Meta_DestIPAddress_Data; +-- Out_Meta_TrafficClass <= In_Meta_TrafficClass; +-- Out_Meta_FlowLabel <= In_Meta_FlowLabel; + Out_Meta_Length <= Length_d; + Out_Meta_Protocol <= In_Meta_Protocol; + Out_Meta_SrcPort <= SourcePort_d; + Out_Meta_DestPort <= DestinationPort_d; end architecture; diff --git a/src/net/udp/udp_TX.vhdl b/src/net/udp/udp_TX.vhdl index 776d9324a..a5d28a660 100644 --- a/src/net/udp/udp_TX.vhdl +++ b/src/net/udp/udp_TX.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,174 +37,174 @@ use work.net.all; entity udp_TX is generic ( - DEBUG : boolean := FALSE; - IP_VERSION : positive := 6 + DEBUG : boolean := FALSE; + IP_VERSION : positive := 6 ); port ( - Clock : in std_logic; -- - Reset : in std_logic; -- + Clock : in std_logic; -- + Reset : in std_logic; -- -- IN port - In_Valid : in std_logic; - In_Data : in T_SLV_8; - In_SOF : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - In_Meta_rst : out std_logic; - In_Meta_SrcIPAddress_nxt : out std_logic; - In_Meta_SrcIPAddress_Data : in T_SLV_8; - In_Meta_DestIPAddress_nxt : out std_logic; - In_Meta_DestIPAddress_Data : in T_SLV_8; - In_Meta_SrcPort : in T_SLV_16; - In_Meta_DestPort : in T_SLV_16; - In_Meta_Length : in T_SLV_16; - In_Meta_Checksum : in T_SLV_16; + In_Valid : in std_logic; + In_Data : in T_SLV_8; + In_SOF : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + In_Meta_rst : out std_logic; + In_Meta_SrcIPAddress_nxt : out std_logic; + In_Meta_SrcIPAddress_Data : in T_SLV_8; + In_Meta_DestIPAddress_nxt : out std_logic; + In_Meta_DestIPAddress_Data : in T_SLV_8; + In_Meta_SrcPort : in T_SLV_16; + In_Meta_DestPort : in T_SLV_16; + In_Meta_Length : in T_SLV_16; + In_Meta_Checksum : in T_SLV_16; -- OUT port - Out_Valid : out std_logic; - Out_Data : out T_SLV_8; - Out_SOF : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic; - Out_Meta_rst : in std_logic; - Out_Meta_SrcIPAddress_nxt : in std_logic; - Out_Meta_SrcIPAddress_Data : out T_SLV_8; - Out_Meta_DestIPAddress_nxt : in std_logic; - Out_Meta_DestIPAddress_Data : out T_SLV_8; - Out_Meta_Length : out T_SLV_16 + Out_Valid : out std_logic; + Out_Data : out T_SLV_8; + Out_SOF : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic; + Out_Meta_rst : in std_logic; + Out_Meta_SrcIPAddress_nxt : in std_logic; + Out_Meta_SrcIPAddress_Data : out T_SLV_8; + Out_Meta_DestIPAddress_nxt : in std_logic; + Out_Meta_DestIPAddress_Data : out T_SLV_8; + Out_Meta_Length : out T_SLV_16 ); end entity; -- Endianess: big-endian -- Alignment: 1 byte -- --- Byte 0 Byte 1 Byte 2 Byte 3 --- +================================+================================+================================+================================+ --- | SourcePort | DestinationPort | --- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ --- | PayloadLength | Checksum | --- +================================+================================+================================+================================+ --- | Payload | --- ~ ~ ~ ~ ~ --- | | --- ~ ~ ~ ~ ~ --- | | --- ~ ~ ~ ~ ~ --- | | --- +================================+================================+================================+================================+ +-- Byte 0 Byte 1 Byte 2 Byte 3 +-- +================================+================================+================================+================================+ +-- | SourcePort | DestinationPort | +-- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ +-- | PayloadLength | Checksum | +-- +================================+================================+================================+================================+ +-- | Payload | +-- ~ ~ ~ ~ ~ +-- | | +-- ~ ~ ~ ~ ~ +-- | | +-- ~ ~ ~ ~ ~ +-- | | +-- +================================+================================+================================+================================+ -- UDP pseudo header for IPv4 -- --- Byte 0 Byte 1 Byte 2 Byte 3 --- +================================+================================+================================+================================+ --- | SourceAddress | --- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ --- | DestinationAddress | --- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ --- | 0x00 | Protocol | Length | --- +================================+================================+================================+================================+ --- | UDP header (see above) | --- ~ ~ ~ ~ ~ --- | | --- +================================+================================+================================+================================+ --- | Payload | --- ~ ~ ~ ~ ~ --- | | --- +================================+================================+================================+================================+ +-- Byte 0 Byte 1 Byte 2 Byte 3 +-- +================================+================================+================================+================================+ +-- | SourceAddress | +-- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ +-- | DestinationAddress | +-- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ +-- | 0x00 | Protocol | Length | +-- +================================+================================+================================+================================+ +-- | UDP header (see above) | +-- ~ ~ ~ ~ ~ +-- | | +-- +================================+================================+================================+================================+ +-- | Payload | +-- ~ ~ ~ ~ ~ +-- | | +-- +================================+================================+================================+================================+ -- UDP pseudo header for IPv6 -- --- Byte 0 Byte 1 Byte 2 Byte 3 --- +================================+================================+================================+================================+ --- | SourceAddress | --- ~ ~ ~ ~ ~ --- | | --- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ --- | DestinationAddress | --- ~ ~ ~ ~ ~ --- | | --- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ --- | Length | --- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ --- | 0x000000 | NextHeader | --- +================================+================================+================================+================================+ --- | UDP header (see above) | --- ~ ~ ~ ~ ~ --- | | --- +================================+================================+================================+================================+ --- | Payload | --- ~ ~ ~ ~ ~ --- | | --- +================================+================================+================================+================================+ +-- Byte 0 Byte 1 Byte 2 Byte 3 +-- +================================+================================+================================+================================+ +-- | SourceAddress | +-- ~ ~ ~ ~ ~ +-- | | +-- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ +-- | DestinationAddress | +-- ~ ~ ~ ~ ~ +-- | | +-- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ +-- | Length | +-- +--------------------------------+--------------------------------+--------------------------------+--------------------------------+ +-- | 0x000000 | NextHeader | +-- +================================+================================+================================+================================+ +-- | UDP header (see above) | +-- ~ ~ ~ ~ ~ +-- | | +-- +================================+================================+================================+================================+ +-- | Payload | +-- ~ ~ ~ ~ ~ +-- | | +-- +================================+================================+================================+================================+ architecture rtl of udp_TX is - attribute FSM_ENCODING : string; + attribute FSM_ENCODING : string; type T_STATE is ( ST_IDLE, ST_CHECKSUMV4_IPV4_ADDRESSES, - ST_CHECKSUMV4_LENGTH_UDP_TYPE_0, ST_CHECKSUMV4_LENGTH_UDP_TYPE_1, - ST_CHECKSUMV4_PORT_NUMBER_0, ST_CHECKSUMV4_PORT_NUMBER_1, - ST_CHECKSUMV4_CHECKSUM_LENGTH_0, ST_CHECKSUMV4_CHECKSUM_LENGTH_1, + ST_CHECKSUMV4_LENGTH_UDP_TYPE_0, ST_CHECKSUMV4_LENGTH_UDP_TYPE_1, + ST_CHECKSUMV4_PORT_NUMBER_0, ST_CHECKSUMV4_PORT_NUMBER_1, + ST_CHECKSUMV4_CHECKSUM_LENGTH_0, ST_CHECKSUMV4_CHECKSUM_LENGTH_1, ST_CHECKSUMV6_IPV6_ADDRESSES, - ST_CHECKSUMV6_LENGTH_UDP_TYPE_0, ST_CHECKSUMV6_LENGTH_UDP_TYPE_1, - ST_CHECKSUMV6_PORT_NUMBER_0, ST_CHECKSUMV6_PORT_NUMBER_1, - ST_CHECKSUMV6_CHECKSUM_LENGTH_0, ST_CHECKSUMV6_CHECKSUM_LENGTH_1, + ST_CHECKSUMV6_LENGTH_UDP_TYPE_0, ST_CHECKSUMV6_LENGTH_UDP_TYPE_1, + ST_CHECKSUMV6_PORT_NUMBER_0, ST_CHECKSUMV6_PORT_NUMBER_1, + ST_CHECKSUMV6_CHECKSUM_LENGTH_0, ST_CHECKSUMV6_CHECKSUM_LENGTH_1, ST_CARRY_0, ST_CARRY_1, ST_SEND_SOURCE_PORT_0, ST_SEND_SOURCE_PORT_1, - ST_SEND_DEST_PORT_0, ST_SEND_DEST_PORT_1, - ST_SEND_LENGTH_0, ST_SEND_LENGTH_1, - ST_SEND_CHECKSUM_0, ST_SEND_CHECKSUM_1, + ST_SEND_DEST_PORT_0, ST_SEND_DEST_PORT_1, + ST_SEND_LENGTH_0, ST_SEND_LENGTH_1, + ST_SEND_CHECKSUM_0, ST_SEND_CHECKSUM_1, ST_SEND_DATA, ST_ERROR ); - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); - - signal In_Ack_i : std_logic; - - signal UpperLayerPacketLength : std_logic_vector(15 downto 0); - - signal IPSeqCounter_rst : std_logic; - signal IPSeqCounter_en : std_logic; - signal IPSeqCounter_us : unsigned(3 downto 0) := (others => '0'); - - signal Checksum_rst : std_logic; - signal Checksum_en : std_logic; - signal Checksum_Addend0_us : unsigned(T_SLV_8'range); - signal Checksum_Addend1_us : unsigned(T_SLV_8'range); - signal Checksum0_nxt0_us : unsigned(T_SLV_8'high + 1 downto 0); - signal Checksum0_nxt1_us : unsigned(T_SLV_8'high + 1 downto 0); - signal Checksum0_d_us : unsigned(T_SLV_8'high downto 0) := (others => '0'); - signal Checksum0_cy : unsigned(T_SLV_2'range); - signal Checksum1_nxt_us : unsigned(T_SLV_8'range); - signal Checksum1_d_us : unsigned(T_SLV_8'range) := (others => '0'); - signal Checksum0_cy0 : std_logic; - signal Checksum0_cy0_d : std_logic := '0'; - signal Checksum0_cy1 : std_logic; - signal Checksum0_cy1_d : std_logic := '0'; - - signal Checksum_i : T_SLV_16; - signal Checksum : T_SLV_16; - signal Checksum_mux_rst : std_logic; - signal Checksum_mux_set : std_logic; - signal Checksum_mux_r : std_logic := '0'; + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", ite((VENDOR = VENDOR_XILINX), "auto", "default")); + + signal In_Ack_i : std_logic; + + signal UpperLayerPacketLength : std_logic_vector(15 downto 0); + + signal IPSeqCounter_rst : std_logic; + signal IPSeqCounter_en : std_logic; + signal IPSeqCounter_us : unsigned(3 downto 0) := (others => '0'); + + signal Checksum_rst : std_logic; + signal Checksum_en : std_logic; + signal Checksum_Addend0_us : unsigned(T_SLV_8'range); + signal Checksum_Addend1_us : unsigned(T_SLV_8'range); + signal Checksum0_nxt0_us : unsigned(T_SLV_8'high + 1 downto 0); + signal Checksum0_nxt1_us : unsigned(T_SLV_8'high + 1 downto 0); + signal Checksum0_d_us : unsigned(T_SLV_8'high downto 0) := (others => '0'); + signal Checksum0_cy : unsigned(T_SLV_2'range); + signal Checksum1_nxt_us : unsigned(T_SLV_8'range); + signal Checksum1_d_us : unsigned(T_SLV_8'range) := (others => '0'); + signal Checksum0_cy0 : std_logic; + signal Checksum0_cy0_d : std_logic := '0'; + signal Checksum0_cy1 : std_logic; + signal Checksum0_cy1_d : std_logic := '0'; + + signal Checksum_i : T_SLV_16; + signal Checksum : T_SLV_16; + signal Checksum_mux_rst : std_logic; + signal Checksum_mux_set : std_logic; + signal Checksum_mux_r : std_logic := '0'; begin assert ((IP_VERSION = 6) or (IP_VERSION = 4)) report "Internet Protocol Version not supported." severity ERROR; - UpperLayerPacketLength <= std_logic_vector(unsigned(In_Meta_Length) + 8); + UpperLayerPacketLength <= std_logic_vector(unsigned(In_Meta_Length) + 8); process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; @@ -212,276 +212,276 @@ begin process(State, In_Valid, In_SOF, In_EOF, In_Data, Out_Ack, Out_Meta_rst, - Out_Meta_SrcIPAddress_nxt, In_Meta_SrcIPAddress_Data, + Out_Meta_SrcIPAddress_nxt, In_Meta_SrcIPAddress_Data, Out_Meta_DestIPAddress_nxt, In_Meta_DestIPAddress_Data, In_Meta_SrcPort, In_Meta_DestPort, In_Meta_Checksum, IPSeqCounter_us, Checksum0_cy, Checksum, UpperLayerPacketLength) begin - NextState <= State; + NextState <= State; - In_Ack_i <= '0'; + In_Ack_i <= '0'; - Out_Valid <= '0'; - Out_Data <= In_Data; - Out_SOF <= '0'; - Out_EOF <= '0'; + Out_Valid <= '0'; + Out_Data <= In_Data; + Out_SOF <= '0'; + Out_EOF <= '0'; - In_Meta_rst <= '0'; - In_Meta_SrcIPAddress_nxt <= Out_Meta_SrcIPAddress_nxt; - In_Meta_DestIPAddress_nxt <= Out_Meta_DestIPAddress_nxt; + In_Meta_rst <= '0'; + In_Meta_SrcIPAddress_nxt <= Out_Meta_SrcIPAddress_nxt; + In_Meta_DestIPAddress_nxt <= Out_Meta_DestIPAddress_nxt; - Out_Meta_SrcIPAddress_Data <= In_Meta_SrcIPAddress_Data; - Out_Meta_DestIPAddress_Data <= In_Meta_DestIPAddress_Data; + Out_Meta_SrcIPAddress_Data <= In_Meta_SrcIPAddress_Data; + Out_Meta_DestIPAddress_Data <= In_Meta_DestIPAddress_Data; - IPSeqCounter_rst <= '0'; - IPSeqCounter_en <= '0'; + IPSeqCounter_rst <= '0'; + IPSeqCounter_en <= '0'; - Checksum_rst <= '0'; - Checksum_en <= '0'; - Checksum_Addend0_us <= (others => '0'); - Checksum_Addend1_us <= (others => '0'); - Checksum_mux_rst <= '0'; - Checksum_mux_set <= '0'; + Checksum_rst <= '0'; + Checksum_en <= '0'; + Checksum_Addend0_us <= (others => '0'); + Checksum_Addend1_us <= (others => '0'); + Checksum_mux_rst <= '0'; + Checksum_mux_set <= '0'; case State is when ST_IDLE => - In_Meta_rst <= '1'; + In_Meta_rst <= '1'; - IPSeqCounter_rst <= '1'; - Checksum_rst <= '1'; + IPSeqCounter_rst <= '1'; + Checksum_rst <= '1'; if ((In_Valid and In_SOF) = '1') then if (IP_VERSION = 4) then - NextState <= ST_CHECKSUMV4_IPV4_ADDRESSES; + NextState <= ST_CHECKSUMV4_IPV4_ADDRESSES; elsif (IP_VERSION = 6) then - NextState <= ST_CHECKSUMV6_IPV6_ADDRESSES; + NextState <= ST_CHECKSUMV6_IPV6_ADDRESSES; else - NextState <= ST_ERROR; + NextState <= ST_ERROR; end if; end if; -- calculate checksum for IPv4 pseudo header -- ---------------------------------------------------------------------- when ST_CHECKSUMV4_IPV4_ADDRESSES => - In_Meta_SrcIPAddress_nxt <= '1'; - In_Meta_DestIPAddress_nxt <= '1'; + In_Meta_SrcIPAddress_nxt <= '1'; + In_Meta_DestIPAddress_nxt <= '1'; - IPSeqCounter_en <= '1'; - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(In_Meta_SrcIPAddress_Data); - Checksum_Addend1_us <= unsigned(In_Meta_DestIPAddress_Data); + IPSeqCounter_en <= '1'; + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(In_Meta_SrcIPAddress_Data); + Checksum_Addend1_us <= unsigned(In_Meta_DestIPAddress_Data); if (IPSeqCounter_us = 3) then - NextState <= ST_CHECKSUMV4_LENGTH_UDP_TYPE_0; + NextState <= ST_CHECKSUMV4_LENGTH_UDP_TYPE_0; end if; when ST_CHECKSUMV4_LENGTH_UDP_TYPE_0 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(15 downto 8)); - Checksum_Addend1_us <= (others => '0'); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(15 downto 8)); + Checksum_Addend1_us <= (others => '0'); - NextState <= ST_CHECKSUMV4_LENGTH_UDP_TYPE_1; + NextState <= ST_CHECKSUMV4_LENGTH_UDP_TYPE_1; when ST_CHECKSUMV4_LENGTH_UDP_TYPE_1 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(7 downto 0)); - Checksum_Addend1_us <= unsigned(C_NET_IP_PROTOCOL_UDP); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(7 downto 0)); + Checksum_Addend1_us <= unsigned(C_NET_IP_PROTOCOL_UDP); - NextState <= ST_CHECKSUMV4_PORT_NUMBER_0; + NextState <= ST_CHECKSUMV4_PORT_NUMBER_0; when ST_CHECKSUMV4_PORT_NUMBER_0 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(In_Meta_SrcPort(15 downto 8)); - Checksum_Addend1_us <= unsigned(In_Meta_DestPort(15 downto 8)); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(In_Meta_SrcPort(15 downto 8)); + Checksum_Addend1_us <= unsigned(In_Meta_DestPort(15 downto 8)); - NextState <= ST_CHECKSUMV4_PORT_NUMBER_1; + NextState <= ST_CHECKSUMV4_PORT_NUMBER_1; when ST_CHECKSUMV4_PORT_NUMBER_1 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(In_Meta_SrcPort(7 downto 0)); - Checksum_Addend1_us <= unsigned(In_Meta_DestPort(7 downto 0)); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(In_Meta_SrcPort(7 downto 0)); + Checksum_Addend1_us <= unsigned(In_Meta_DestPort(7 downto 0)); - NextState <= ST_CHECKSUMV4_CHECKSUM_LENGTH_0; + NextState <= ST_CHECKSUMV4_CHECKSUM_LENGTH_0; when ST_CHECKSUMV4_CHECKSUM_LENGTH_0 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(15 downto 8)); - Checksum_Addend1_us <= unsigned(In_Meta_Checksum(15 downto 8)); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(15 downto 8)); + Checksum_Addend1_us <= unsigned(In_Meta_Checksum(15 downto 8)); - NextState <= ST_CHECKSUMV4_CHECKSUM_LENGTH_1; + NextState <= ST_CHECKSUMV4_CHECKSUM_LENGTH_1; when ST_CHECKSUMV4_CHECKSUM_LENGTH_1 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(7 downto 0)); - Checksum_Addend1_us <= unsigned(In_Meta_Checksum(7 downto 0)); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(7 downto 0)); + Checksum_Addend1_us <= unsigned(In_Meta_Checksum(7 downto 0)); if (Checksum0_cy = "00") then - NextState <= ST_SEND_SOURCE_PORT_0; + NextState <= ST_SEND_SOURCE_PORT_0; else - NextState <= ST_CARRY_0; + NextState <= ST_CARRY_0; end if; -- calculate checksum for IPv6 pseudo header -- ---------------------------------------------------------------------- when ST_CHECKSUMV6_IPV6_ADDRESSES => - In_Meta_SrcIPAddress_nxt <= '1'; - In_Meta_DestIPAddress_nxt <= '1'; + In_Meta_SrcIPAddress_nxt <= '1'; + In_Meta_DestIPAddress_nxt <= '1'; - IPSeqCounter_en <= '1'; - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(In_Meta_SrcIPAddress_Data); - Checksum_Addend1_us <= unsigned(In_Meta_DestIPAddress_Data); + IPSeqCounter_en <= '1'; + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(In_Meta_SrcIPAddress_Data); + Checksum_Addend1_us <= unsigned(In_Meta_DestIPAddress_Data); if (IPSeqCounter_us = 15) then - NextState <= ST_CHECKSUMV6_LENGTH_UDP_TYPE_0; + NextState <= ST_CHECKSUMV6_LENGTH_UDP_TYPE_0; end if; when ST_CHECKSUMV6_LENGTH_UDP_TYPE_0 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(15 downto 8)); - Checksum_Addend1_us <= (others => '0'); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(15 downto 8)); + Checksum_Addend1_us <= (others => '0'); - NextState <= ST_CHECKSUMV6_LENGTH_UDP_TYPE_1; + NextState <= ST_CHECKSUMV6_LENGTH_UDP_TYPE_1; when ST_CHECKSUMV6_LENGTH_UDP_TYPE_1 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(7 downto 0)); - Checksum_Addend1_us <= unsigned(C_NET_IP_PROTOCOL_UDP); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(7 downto 0)); + Checksum_Addend1_us <= unsigned(C_NET_IP_PROTOCOL_UDP); - NextState <= ST_CHECKSUMV6_PORT_NUMBER_0; + NextState <= ST_CHECKSUMV6_PORT_NUMBER_0; when ST_CHECKSUMV6_PORT_NUMBER_0 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(In_Meta_SrcPort(15 downto 8)); - Checksum_Addend1_us <= unsigned(In_Meta_DestPort(15 downto 8)); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(In_Meta_SrcPort(15 downto 8)); + Checksum_Addend1_us <= unsigned(In_Meta_DestPort(15 downto 8)); - NextState <= ST_CHECKSUMV6_PORT_NUMBER_1; + NextState <= ST_CHECKSUMV6_PORT_NUMBER_1; when ST_CHECKSUMV6_PORT_NUMBER_1 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(In_Meta_SrcPort(7 downto 0)); - Checksum_Addend1_us <= unsigned(In_Meta_DestPort(7 downto 0)); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(In_Meta_SrcPort(7 downto 0)); + Checksum_Addend1_us <= unsigned(In_Meta_DestPort(7 downto 0)); - NextState <= ST_CHECKSUMV6_CHECKSUM_LENGTH_0; + NextState <= ST_CHECKSUMV6_CHECKSUM_LENGTH_0; when ST_CHECKSUMV6_CHECKSUM_LENGTH_0 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(15 downto 8)); - Checksum_Addend1_us <= unsigned(In_Meta_Checksum(15 downto 8)); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(15 downto 8)); + Checksum_Addend1_us <= unsigned(In_Meta_Checksum(15 downto 8)); - NextState <= ST_CHECKSUMV6_CHECKSUM_LENGTH_1; + NextState <= ST_CHECKSUMV6_CHECKSUM_LENGTH_1; when ST_CHECKSUMV6_CHECKSUM_LENGTH_1 => - Checksum_en <= '1'; - Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(7 downto 0)); - Checksum_Addend1_us <= unsigned(In_Meta_Checksum(7 downto 0)); + Checksum_en <= '1'; + Checksum_Addend0_us <= unsigned(UpperLayerPacketLength(7 downto 0)); + Checksum_Addend1_us <= unsigned(In_Meta_Checksum(7 downto 0)); if (Checksum0_cy = "00") then - NextState <= ST_SEND_SOURCE_PORT_0; + NextState <= ST_SEND_SOURCE_PORT_0; else - NextState <= ST_CARRY_0; + NextState <= ST_CARRY_0; end if; -- circulate carry bit -- ---------------------------------------------------------------------- when ST_CARRY_0 => - In_Meta_rst <= Out_Meta_rst; + In_Meta_rst <= Out_Meta_rst; - Checksum_en <= '1'; - Checksum_mux_set <= '1'; + Checksum_en <= '1'; + Checksum_mux_set <= '1'; if (Checksum0_cy = "00") then - NextState <= ST_SEND_SOURCE_PORT_0; + NextState <= ST_SEND_SOURCE_PORT_0; else - NextState <= ST_CARRY_1; + NextState <= ST_CARRY_1; end if; when ST_CARRY_1 => - In_Meta_rst <= Out_Meta_rst; + In_Meta_rst <= Out_Meta_rst; - Checksum_en <= '1'; - Checksum_mux_rst <= '1'; + Checksum_en <= '1'; + Checksum_mux_rst <= '1'; - NextState <= ST_SEND_SOURCE_PORT_0; + NextState <= ST_SEND_SOURCE_PORT_0; -- assamble header -- ---------------------------------------------------------------------- when ST_SEND_SOURCE_PORT_0 => - Out_Valid <= '1'; - Out_Data <= In_Meta_SrcPort(15 downto 8); - Out_SOF <= '1'; + Out_Valid <= '1'; + Out_Data <= In_Meta_SrcPort(15 downto 8); + Out_SOF <= '1'; - In_Meta_rst <= Out_Meta_rst; + In_Meta_rst <= Out_Meta_rst; - if (Out_Ack = '1') then - NextState <= ST_SEND_SOURCE_PORT_1; + if (Out_Ack = '1') then + NextState <= ST_SEND_SOURCE_PORT_1; end if; when ST_SEND_SOURCE_PORT_1 => - Out_Valid <= '1'; - Out_Data <= In_Meta_SrcPort(7 downto 0); + Out_Valid <= '1'; + Out_Data <= In_Meta_SrcPort(7 downto 0); - if (Out_Ack = '1') then - NextState <= ST_SEND_DEST_PORT_0; + if (Out_Ack = '1') then + NextState <= ST_SEND_DEST_PORT_0; end if; when ST_SEND_DEST_PORT_0 => - Out_Valid <= '1'; - Out_Data <= In_Meta_DestPort(15 downto 8); + Out_Valid <= '1'; + Out_Data <= In_Meta_DestPort(15 downto 8); - if (Out_Ack = '1') then - NextState <= ST_SEND_DEST_PORT_1; + if (Out_Ack = '1') then + NextState <= ST_SEND_DEST_PORT_1; end if; when ST_SEND_DEST_PORT_1 => - Out_Valid <= '1'; - Out_Data <= In_Meta_DestPort(7 downto 0); + Out_Valid <= '1'; + Out_Data <= In_Meta_DestPort(7 downto 0); - if (Out_Ack = '1') then - NextState <= ST_SEND_LENGTH_0; + if (Out_Ack = '1') then + NextState <= ST_SEND_LENGTH_0; end if; when ST_SEND_LENGTH_0 => - Out_Valid <= '1'; - Out_Data <= UpperLayerPacketLength(15 downto 8); + Out_Valid <= '1'; + Out_Data <= UpperLayerPacketLength(15 downto 8); - if (Out_Ack = '1') then - NextState <= ST_SEND_LENGTH_1; + if (Out_Ack = '1') then + NextState <= ST_SEND_LENGTH_1; end if; when ST_SEND_LENGTH_1 => - Out_Valid <= '1'; - Out_Data <= UpperLayerPacketLength(7 downto 0); + Out_Valid <= '1'; + Out_Data <= UpperLayerPacketLength(7 downto 0); - if (Out_Ack = '1') then - NextState <= ST_SEND_CHECKSUM_0; + if (Out_Ack = '1') then + NextState <= ST_SEND_CHECKSUM_0; end if; when ST_SEND_CHECKSUM_0 => - Out_Valid <= '1'; - Out_Data <= Checksum(15 downto 8); + Out_Valid <= '1'; + Out_Data <= Checksum(15 downto 8); - if (Out_Ack = '1') then - NextState <= ST_SEND_CHECKSUM_1; + if (Out_Ack = '1') then + NextState <= ST_SEND_CHECKSUM_1; end if; when ST_SEND_CHECKSUM_1 => - Out_Valid <= '1'; - Out_Data <= Checksum(7 downto 0); + Out_Valid <= '1'; + Out_Data <= Checksum(7 downto 0); - if (Out_Ack = '1') then - NextState <= ST_SEND_DATA; + if (Out_Ack = '1') then + NextState <= ST_SEND_DATA; end if; when ST_SEND_DATA => - Out_Valid <= In_Valid; - Out_Data <= In_Data; - Out_EOF <= In_EOF; - In_Ack_i <= Out_Ack; + Out_Valid <= In_Valid; + Out_Data <= In_Data; + Out_EOF <= In_EOF; + In_Ack_i <= Out_Ack; if ((In_EOF and Out_Ack) = '1') then - NextState <= ST_IDLE; + NextState <= ST_IDLE; end if; when ST_ERROR => @@ -495,57 +495,57 @@ begin begin if rising_edge(Clock) then if ((Reset or IPSeqCounter_rst) = '1') then - IPSeqCounter_us <= to_unsigned(0, IPSeqCounter_us'length); + IPSeqCounter_us <= to_unsigned(0, IPSeqCounter_us'length); elsif (IPSeqCounter_en = '1') then - IPSeqCounter_us <= IPSeqCounter_us + 1; + IPSeqCounter_us <= IPSeqCounter_us + 1; end if; end if; end process; - Checksum0_nxt0_us <= ("0" & Checksum1_d_us) + Checksum0_nxt0_us <= ("0" & Checksum1_d_us) + ("0" & Checksum_Addend0_us) + ((Checksum_Addend0_us'range => '0') & Checksum0_cy0_d); - Checksum0_nxt1_us <= ("0" & Checksum0_nxt0_us(Checksum0_nxt0_us'high - 1 downto 0)) + Checksum0_nxt1_us <= ("0" & Checksum0_nxt0_us(Checksum0_nxt0_us'high - 1 downto 0)) + ("0" & Checksum_Addend1_us) + ((Checksum_Addend1_us'range => '0') & Checksum0_cy1_d); - Checksum1_nxt_us <= Checksum0_d_us(Checksum1_d_us'range); + Checksum1_nxt_us <= Checksum0_d_us(Checksum1_d_us'range); - Checksum0_cy0 <= Checksum0_nxt0_us(Checksum0_nxt0_us'high); - Checksum0_cy1 <= Checksum0_nxt1_us(Checksum0_nxt1_us'high); - Checksum0_cy <= Checksum0_cy1 & Checksum0_cy0; + Checksum0_cy0 <= Checksum0_nxt0_us(Checksum0_nxt0_us'high); + Checksum0_cy1 <= Checksum0_nxt1_us(Checksum0_nxt1_us'high); + Checksum0_cy <= Checksum0_cy1 & Checksum0_cy0; process(Clock) begin if rising_edge(Clock) then if (Checksum_rst = '1') then - Checksum0_d_us <= (others => '0'); - Checksum1_d_us <= (others => '0'); + Checksum0_d_us <= (others => '0'); + Checksum1_d_us <= (others => '0'); elsif (Checksum_en = '1') then - Checksum0_d_us <= Checksum0_nxt1_us(Checksum0_nxt1_us'high - 1 downto 0); - Checksum1_d_us <= Checksum1_nxt_us; + Checksum0_d_us <= Checksum0_nxt1_us(Checksum0_nxt1_us'high - 1 downto 0); + Checksum1_d_us <= Checksum1_nxt_us; - Checksum0_cy0_d <= Checksum0_cy0; - Checksum0_cy1_d <= Checksum0_cy1; + Checksum0_cy0_d <= Checksum0_cy0; + Checksum0_cy1_d <= Checksum0_cy1; end if; end if; end process; - Checksum_i <= not (std_logic_vector(Checksum0_nxt1_us(Checksum0_nxt1_us'high - 1 downto 0)) & std_logic_vector(Checksum1_nxt_us)); - Checksum <= ite((Checksum_mux_r = '0'), Checksum_i, swap(Checksum_i, 8)); + Checksum_i <= not (std_logic_vector(Checksum0_nxt1_us(Checksum0_nxt1_us'high - 1 downto 0)) & std_logic_vector(Checksum1_nxt_us)); + Checksum <= ite((Checksum_mux_r = '0'), Checksum_i, swap(Checksum_i, 8)); process(Clock) begin if rising_edge(Clock) then if ((Reset or Checksum_mux_rst) = '1') then - Checksum_mux_r <= '0'; + Checksum_mux_r <= '0'; elsif (Checksum_mux_set = '1') then - Checksum_mux_r <= '1'; + Checksum_mux_r <= '1'; end if; end if; end process; - In_Ack <= In_Ack_i; - Out_Meta_Length <= UpperLayerPacketLength; + In_Ack <= In_Ack_i; + Out_Meta_Length <= UpperLayerPacketLength; end architecture; diff --git a/src/net/udp/udp_Wrapper.vhdl b/src/net/udp/udp_Wrapper.vhdl index c74681b43..1a528f6ab 100644 --- a/src/net/udp/udp_Wrapper.vhdl +++ b/src/net/udp/udp_Wrapper.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,370 +37,370 @@ use work.net.all; entity udp_Wrapper is generic ( - DEBUG : boolean := FALSE; - IP_VERSION : positive := 6; - PORTPAIRS : T_NET_UDP_PORTPAIR_VECTOR := (0 => (x"0000", x"0000")) + DEBUG : boolean := FALSE; + IP_VERSION : positive := 6; + PORTPAIRS : T_NET_UDP_PORTPAIR_VECTOR := (0 => (x"0000", x"0000")) ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; -- from IP layer - IP_TX_Valid : out std_logic; - IP_TX_Data : out T_SLV_8; - IP_TX_SOF : out std_logic; - IP_TX_EOF : out std_logic; - IP_TX_Ack : in std_logic; - IP_TX_Meta_rst : in std_logic; - IP_TX_Meta_SrcIPAddress_nxt : in std_logic; - IP_TX_Meta_SrcIPAddress_Data : out T_SLV_8; - IP_TX_Meta_DestIPAddress_nxt : in std_logic; - IP_TX_Meta_DestIPAddress_Data : out T_SLV_8; - IP_TX_Meta_Length : out T_SLV_16; + IP_TX_Valid : out std_logic; + IP_TX_Data : out T_SLV_8; + IP_TX_SOF : out std_logic; + IP_TX_EOF : out std_logic; + IP_TX_Ack : in std_logic; + IP_TX_Meta_rst : in std_logic; + IP_TX_Meta_SrcIPAddress_nxt : in std_logic; + IP_TX_Meta_SrcIPAddress_Data : out T_SLV_8; + IP_TX_Meta_DestIPAddress_nxt : in std_logic; + IP_TX_Meta_DestIPAddress_Data : out T_SLV_8; + IP_TX_Meta_Length : out T_SLV_16; -- to IP layer - IP_RX_Valid : in std_logic; - IP_RX_Data : in T_SLV_8; - IP_RX_SOF : in std_logic; - IP_RX_EOF : in std_logic; - IP_RX_Ack : out std_logic; - IP_RX_Meta_rst : out std_logic; - IP_RX_Meta_SrcMACAddress_nxt : out std_logic; - IP_RX_Meta_SrcMACAddress_Data : in T_SLV_8; - IP_RX_Meta_DestMACAddress_nxt : out std_logic; - IP_RX_Meta_DestMACAddress_Data : in T_SLV_8; - IP_RX_Meta_EthType : in T_SLV_16; - IP_RX_Meta_SrcIPAddress_nxt : out std_logic; - IP_RX_Meta_SrcIPAddress_Data : in T_SLV_8; - IP_RX_Meta_DestIPAddress_nxt : out std_logic; - IP_RX_Meta_DestIPAddress_Data : in T_SLV_8; --- IP_RX_Meta_TrafficClass : in T_SLV_8; --- IP_RX_Meta_FlowLabel : in T_SLV_24; - IP_RX_Meta_Length : in T_SLV_16; - IP_RX_Meta_Protocol : in T_SLV_8; + IP_RX_Valid : in std_logic; + IP_RX_Data : in T_SLV_8; + IP_RX_SOF : in std_logic; + IP_RX_EOF : in std_logic; + IP_RX_Ack : out std_logic; + IP_RX_Meta_rst : out std_logic; + IP_RX_Meta_SrcMACAddress_nxt : out std_logic; + IP_RX_Meta_SrcMACAddress_Data : in T_SLV_8; + IP_RX_Meta_DestMACAddress_nxt : out std_logic; + IP_RX_Meta_DestMACAddress_Data : in T_SLV_8; + IP_RX_Meta_EthType : in T_SLV_16; + IP_RX_Meta_SrcIPAddress_nxt : out std_logic; + IP_RX_Meta_SrcIPAddress_Data : in T_SLV_8; + IP_RX_Meta_DestIPAddress_nxt : out std_logic; + IP_RX_Meta_DestIPAddress_Data : in T_SLV_8; +-- IP_RX_Meta_TrafficClass : in T_SLV_8; +-- IP_RX_Meta_FlowLabel : in T_SLV_24; + IP_RX_Meta_Length : in T_SLV_16; + IP_RX_Meta_Protocol : in T_SLV_8; -- from upper layer - TX_Valid : in std_logic_vector(PORTPAIRS'length - 1 downto 0); - TX_Data : in T_SLVV_8(PORTPAIRS'length - 1 downto 0); - TX_SOF : in std_logic_vector(PORTPAIRS'length - 1 downto 0); - TX_EOF : in std_logic_vector(PORTPAIRS'length - 1 downto 0); - TX_Ack : out std_logic_vector(PORTPAIRS'length - 1 downto 0); - TX_Meta_rst : out std_logic_vector(PORTPAIRS'length - 1 downto 0); - TX_Meta_SrcIPAddress_nxt : out std_logic_vector(PORTPAIRS'length - 1 downto 0); - TX_Meta_SrcIPAddress_Data : in T_SLVV_8(PORTPAIRS'length - 1 downto 0); - TX_Meta_DestIPAddress_nxt : out std_logic_vector(PORTPAIRS'length - 1 downto 0); - TX_Meta_DestIPAddress_Data : in T_SLVV_8(PORTPAIRS'length - 1 downto 0); - TX_Meta_SrcPort : in T_SLVV_16(PORTPAIRS'length - 1 downto 0); - TX_Meta_DestPort : in T_SLVV_16(PORTPAIRS'length - 1 downto 0); - TX_Meta_Length : in T_SLVV_16(PORTPAIRS'length - 1 downto 0); + TX_Valid : in std_logic_vector(PORTPAIRS'length - 1 downto 0); + TX_Data : in T_SLVV_8(PORTPAIRS'length - 1 downto 0); + TX_SOF : in std_logic_vector(PORTPAIRS'length - 1 downto 0); + TX_EOF : in std_logic_vector(PORTPAIRS'length - 1 downto 0); + TX_Ack : out std_logic_vector(PORTPAIRS'length - 1 downto 0); + TX_Meta_rst : out std_logic_vector(PORTPAIRS'length - 1 downto 0); + TX_Meta_SrcIPAddress_nxt : out std_logic_vector(PORTPAIRS'length - 1 downto 0); + TX_Meta_SrcIPAddress_Data : in T_SLVV_8(PORTPAIRS'length - 1 downto 0); + TX_Meta_DestIPAddress_nxt : out std_logic_vector(PORTPAIRS'length - 1 downto 0); + TX_Meta_DestIPAddress_Data : in T_SLVV_8(PORTPAIRS'length - 1 downto 0); + TX_Meta_SrcPort : in T_SLVV_16(PORTPAIRS'length - 1 downto 0); + TX_Meta_DestPort : in T_SLVV_16(PORTPAIRS'length - 1 downto 0); + TX_Meta_Length : in T_SLVV_16(PORTPAIRS'length - 1 downto 0); -- to upper layer - RX_Valid : out std_logic_vector(PORTPAIRS'length - 1 downto 0); - RX_Data : out T_SLVV_8(PORTPAIRS'length - 1 downto 0); - RX_SOF : out std_logic_vector(PORTPAIRS'length - 1 downto 0); - RX_EOF : out std_logic_vector(PORTPAIRS'length - 1 downto 0); - RX_Ack : in std_logic_vector(PORTPAIRS'length - 1 downto 0); - RX_Meta_rst : in std_logic_vector(PORTPAIRS'length - 1 downto 0); - RX_Meta_SrcMACAddress_nxt : in std_logic_vector(PORTPAIRS'length - 1 downto 0); - RX_Meta_SrcMACAddress_Data : out T_SLVV_8(PORTPAIRS'length - 1 downto 0); - RX_Meta_DestMACAddress_nxt : in std_logic_vector(PORTPAIRS'length - 1 downto 0); - RX_Meta_DestMACAddress_Data : out T_SLVV_8(PORTPAIRS'length - 1 downto 0); - RX_Meta_EthType : out T_SLVV_16(PORTPAIRS'length - 1 downto 0); - RX_Meta_SrcIPAddress_nxt : in std_logic_vector(PORTPAIRS'length - 1 downto 0); - RX_Meta_SrcIPAddress_Data : out T_SLVV_8(PORTPAIRS'length - 1 downto 0); - RX_Meta_DestIPAddress_nxt : in std_logic_vector(PORTPAIRS'length - 1 downto 0); - RX_Meta_DestIPAddress_Data : out T_SLVV_8(PORTPAIRS'length - 1 downto 0); --- RX_Meta_TrafficClass : out T_SLVV_8(PORTPAIRS'length - 1 downto 0); --- RX_Meta_FlowLabel : out T_SLVV_24(PORTPAIRS'length - 1 downto 0); - RX_Meta_Length : out T_SLVV_16(PORTPAIRS'length - 1 downto 0); - RX_Meta_Protocol : out T_SLVV_8(PORTPAIRS'length - 1 downto 0); - RX_Meta_SrcPort : out T_SLVV_16(PORTPAIRS'length - 1 downto 0); - RX_Meta_DestPort : out T_SLVV_16(PORTPAIRS'length - 1 downto 0) + RX_Valid : out std_logic_vector(PORTPAIRS'length - 1 downto 0); + RX_Data : out T_SLVV_8(PORTPAIRS'length - 1 downto 0); + RX_SOF : out std_logic_vector(PORTPAIRS'length - 1 downto 0); + RX_EOF : out std_logic_vector(PORTPAIRS'length - 1 downto 0); + RX_Ack : in std_logic_vector(PORTPAIRS'length - 1 downto 0); + RX_Meta_rst : in std_logic_vector(PORTPAIRS'length - 1 downto 0); + RX_Meta_SrcMACAddress_nxt : in std_logic_vector(PORTPAIRS'length - 1 downto 0); + RX_Meta_SrcMACAddress_Data : out T_SLVV_8(PORTPAIRS'length - 1 downto 0); + RX_Meta_DestMACAddress_nxt : in std_logic_vector(PORTPAIRS'length - 1 downto 0); + RX_Meta_DestMACAddress_Data : out T_SLVV_8(PORTPAIRS'length - 1 downto 0); + RX_Meta_EthType : out T_SLVV_16(PORTPAIRS'length - 1 downto 0); + RX_Meta_SrcIPAddress_nxt : in std_logic_vector(PORTPAIRS'length - 1 downto 0); + RX_Meta_SrcIPAddress_Data : out T_SLVV_8(PORTPAIRS'length - 1 downto 0); + RX_Meta_DestIPAddress_nxt : in std_logic_vector(PORTPAIRS'length - 1 downto 0); + RX_Meta_DestIPAddress_Data : out T_SLVV_8(PORTPAIRS'length - 1 downto 0); +-- RX_Meta_TrafficClass : out T_SLVV_8(PORTPAIRS'length - 1 downto 0); +-- RX_Meta_FlowLabel : out T_SLVV_24(PORTPAIRS'length - 1 downto 0); + RX_Meta_Length : out T_SLVV_16(PORTPAIRS'length - 1 downto 0); + RX_Meta_Protocol : out T_SLVV_8(PORTPAIRS'length - 1 downto 0); + RX_Meta_SrcPort : out T_SLVV_16(PORTPAIRS'length - 1 downto 0); + RX_Meta_DestPort : out T_SLVV_16(PORTPAIRS'length - 1 downto 0) ); end entity; architecture rtl of udp_Wrapper is - constant UDP_SWITCH_PORTS : positive := PORTPAIRS'length; - - constant STMMUX_META_RST_BIT : natural := 0; - constant STMMUX_META_SRCIP_NXT_BIT : natural := 1; - constant STMMUX_META_DESTIP_NXT_BIT : natural := 2; - - constant STMMUX_META_REV_BITS : natural := 3; - - constant STMMUX_META_STREAMID_SRCIP : natural := 0; - constant STMMUX_META_STREAMID_DESTIP : natural := 1; - constant STMMUX_META_STREAMID_SRCPORT : natural := 2; - constant STMMUX_META_STREAMID_DESTPORT : natural := 3; - constant STMMUX_META_STREAMID_LENGTH : natural := 4; - - constant STMMUX_META_BITS : T_POSVEC := ( - STMMUX_META_STREAMID_SRCIP => 8, - STMMUX_META_STREAMID_DESTIP => 8, - STMMUX_META_STREAMID_SRCPORT => 16, - STMMUX_META_STREAMID_DESTPORT => 16, - STMMUX_META_STREAMID_LENGTH => 16 + constant UDP_SWITCH_PORTS : positive := PORTPAIRS'length; + + constant STMMUX_META_RST_BIT : natural := 0; + constant STMMUX_META_SRCIP_NXT_BIT : natural := 1; + constant STMMUX_META_DESTIP_NXT_BIT : natural := 2; + + constant STMMUX_META_REV_BITS : natural := 3; + + constant STMMUX_META_STREAMID_SRCIP : natural := 0; + constant STMMUX_META_STREAMID_DESTIP : natural := 1; + constant STMMUX_META_STREAMID_SRCPORT : natural := 2; + constant STMMUX_META_STREAMID_DESTPORT : natural := 3; + constant STMMUX_META_STREAMID_LENGTH : natural := 4; + + constant STMMUX_META_BITS : positive_vector := ( + STMMUX_META_STREAMID_SRCIP => 8, + STMMUX_META_STREAMID_DESTIP => 8, + STMMUX_META_STREAMID_SRCPORT => 16, + STMMUX_META_STREAMID_DESTPORT => 16, + STMMUX_META_STREAMID_LENGTH => 16 ); - signal StmMux_In_Valid : std_logic_vector(UDP_SWITCH_PORTS - 1 downto 0); - signal StmMux_In_Data : T_SLM(UDP_SWITCH_PORTS - 1 downto 0, T_SLV_8'range) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmMux_In_Meta : T_SLM(UDP_SWITCH_PORTS - 1 downto 0, isum(STMMUX_META_BITS) - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmMux_In_Meta_rev : T_SLM(UDP_SWITCH_PORTS - 1 downto 0, STMMUX_META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmMux_In_SOF : std_logic_vector(UDP_SWITCH_PORTS - 1 downto 0); - signal StmMux_In_EOF : std_logic_vector(UDP_SWITCH_PORTS - 1 downto 0); - signal StmMux_In_Ack : std_logic_vector(UDP_SWITCH_PORTS - 1 downto 0); - - signal StmMux_Out_Valid : std_logic; - signal StmMux_Out_Data : T_SLV_8; - signal StmMux_Out_Meta : std_logic_vector(isum(STMMUX_META_BITS) - 1 downto 0); - signal StmMux_Out_Meta_rev : std_logic_vector(STMMUX_META_REV_BITS - 1 downto 0); - signal StmMux_Out_SOF : std_logic; - signal StmMux_Out_EOF : std_logic; - signal StmMux_Out_SrcIPAddress_Data : T_SLV_8; - signal StmMux_Out_DestIPAddress_Data : T_SLV_8; - signal StmMux_Out_Length : T_SLV_16; - signal StmMux_Out_Protocol : T_SLV_8; - - constant TX_FCS_META_STREAMID_SRCIP : natural := 0; - constant TX_FCS_META_STREAMID_DESTIP : natural := 1; - constant TX_FCS_META_STREAMID_SRCPORT : natural := 2; - constant TX_FCS_META_STREAMID_DESTPORT : natural := 3; - constant TX_FCS_META_STREAMID_LEN : natural := 4; - - constant TX_FCS_META_BITS : T_POSVEC := ( - TX_FCS_META_STREAMID_SRCIP => 8, - TX_FCS_META_STREAMID_DESTIP => 8, - TX_FCS_META_STREAMID_SRCPORT => 16, - TX_FCS_META_STREAMID_DESTPORT => 16, - TX_FCS_META_STREAMID_LEN => 16 + signal StmMux_In_Valid : std_logic_vector(UDP_SWITCH_PORTS - 1 downto 0); + signal StmMux_In_Data : T_SLM(UDP_SWITCH_PORTS - 1 downto 0, T_SLV_8'range) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal StmMux_In_Meta : T_SLM(UDP_SWITCH_PORTS - 1 downto 0, isum(STMMUX_META_BITS) - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal StmMux_In_Meta_rev : T_SLM(UDP_SWITCH_PORTS - 1 downto 0, STMMUX_META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal StmMux_In_SOF : std_logic_vector(UDP_SWITCH_PORTS - 1 downto 0); + signal StmMux_In_EOF : std_logic_vector(UDP_SWITCH_PORTS - 1 downto 0); + signal StmMux_In_Ack : std_logic_vector(UDP_SWITCH_PORTS - 1 downto 0); + + signal StmMux_Out_Valid : std_logic; + signal StmMux_Out_Data : T_SLV_8; + signal StmMux_Out_Meta : std_logic_vector(isum(STMMUX_META_BITS) - 1 downto 0); + signal StmMux_Out_Meta_rev : std_logic_vector(STMMUX_META_REV_BITS - 1 downto 0); + signal StmMux_Out_SOF : std_logic; + signal StmMux_Out_EOF : std_logic; + signal StmMux_Out_SrcIPAddress_Data : T_SLV_8; + signal StmMux_Out_DestIPAddress_Data : T_SLV_8; + signal StmMux_Out_Length : T_SLV_16; + signal StmMux_Out_Protocol : T_SLV_8; + + constant TX_FCS_META_STREAMID_SRCIP : natural := 0; + constant TX_FCS_META_STREAMID_DESTIP : natural := 1; + constant TX_FCS_META_STREAMID_SRCPORT : natural := 2; + constant TX_FCS_META_STREAMID_DESTPORT : natural := 3; + constant TX_FCS_META_STREAMID_LEN : natural := 4; + + constant TX_FCS_META_BITS : positive_vector := ( + TX_FCS_META_STREAMID_SRCIP => 8, + TX_FCS_META_STREAMID_DESTIP => 8, + TX_FCS_META_STREAMID_SRCPORT => 16, + TX_FCS_META_STREAMID_DESTPORT => 16, + TX_FCS_META_STREAMID_LEN => 16 ); - constant TX_FCS_META_FIFO_DEPTHS : T_POSVEC := ( - TX_FCS_META_STREAMID_SRCIP => ite((IP_VERSION = 6), 16, 4), - TX_FCS_META_STREAMID_DESTIP => ite((IP_VERSION = 6), 16, 4), - TX_FCS_META_STREAMID_SRCPORT => 1, - TX_FCS_META_STREAMID_DESTPORT => 1, - TX_FCS_META_STREAMID_LEN => 1 + constant TX_FCS_META_FIFO_DEPTHS : positive_vector := ( + TX_FCS_META_STREAMID_SRCIP => ite((IP_VERSION = 6), 16, 4), + TX_FCS_META_STREAMID_DESTIP => ite((IP_VERSION = 6), 16, 4), + TX_FCS_META_STREAMID_SRCPORT => 1, + TX_FCS_META_STREAMID_DESTPORT => 1, + TX_FCS_META_STREAMID_LEN => 1 ); - signal TX_FCS_Valid : std_logic; - signal TX_FCS_Data : T_SLV_8; - signal TX_FCS_SOF : std_logic; - signal TX_FCS_EOF : std_logic; - signal TX_FCS_MetaOut_rst : std_logic; - signal TX_FCS_MetaOut_nxt : std_logic_vector(TX_FCS_META_BITS'length - 1 downto 0); - signal TX_FCS_MetaOut_Data : std_logic_vector(isum(TX_FCS_META_BITS) - 1 downto 0); - signal TX_FCS_Meta_SrcIPAddress_Data : T_SLV_8; - signal TX_FCS_Meta_DestIPAddress_Data : T_SLV_8; - signal TX_FCS_Meta_SrcPort : T_SLV_16; - signal TX_FCS_Meta_DestPort : T_SLV_16; - signal TX_FCS_Meta_Checksum : T_SLV_16; - signal TX_FCS_Meta_Length : T_SLV_16; - - signal TX_FCS_Ack : std_logic; - signal TX_FCS_MetaIn_rst : std_logic; - signal TX_FCS_MetaIn_nxt : std_logic_vector(TX_FCS_META_BITS'length - 1 downto 0); - signal TX_FCS_MetaIn_Data : std_logic_vector(isum(TX_FCS_META_BITS) - 1 downto 0); - - signal UDP_TX_Ack : std_logic; - signal UDP_TX_Meta_rst : std_logic; - signal UDP_TX_Meta_SrcIPAddress_nxt : std_logic; - signal UDP_TX_Meta_DestIPAddress_nxt : std_logic; - - signal UDP_RX_Valid : std_logic; - signal UDP_RX_Data : T_SLV_8; - signal UDP_RX_SOF : std_logic; - signal UDP_RX_EOF : std_logic; - - signal UDP_RX_Meta_SrcMACAddress_Data : T_SLV_8; - signal UDP_RX_Meta_DestMACAddress_Data : T_SLV_8; - signal UDP_RX_Meta_EthType : T_SLV_16; - signal UDP_RX_Meta_SrcIPAddress_Data : T_SLV_8; - signal UDP_RX_Meta_DestIPAddress_Data : T_SLV_8; - signal UDP_RX_Meta_Length : T_SLV_16; - signal UDP_RX_Meta_Protocol : T_SLV_8; - signal UDP_RX_Meta_SrcPort : T_SLV_16; - signal UDP_RX_Meta_DestPort : T_SLV_16; - - constant STMDEMUX_META_RST_BIT : natural := 0; - constant STMDEMUX_META_MACSRC_NXT_BIT : natural := 1; - constant STMDEMUX_META_MACDEST_NXT_BIT : natural := 2; - constant STMDEMUX_META_IPSRC_NXT_BIT : natural := 3; - constant STMDEMUX_META_IPDEST_NXT_BIT : natural := 4; - - constant STMDEMUX_META_STREAMID_SRCMAC : natural := 0; - constant STMDEMUX_META_STREAMID_DESTMAC : natural := 1; - constant STMDEMUX_META_STREAMID_ETHTYPE : natural := 2; - constant STMDEMUX_META_STREAMID_SRCIP : natural := 3; - constant STMDEMUX_META_STREAMID_DESTIP : natural := 4; - constant STMDEMUX_META_STREAMID_LENGTH : natural := 5; - constant STMDEMUX_META_STREAMID_PROTO : natural := 6; - constant STMDEMUX_META_STREAMID_SRCPORT : natural := 7; - constant STMDEMUX_META_STREAMID_DESTPORT : natural := 8; - - constant STMDEMUX_DATA_BITS : natural := 8; -- - constant STMDEMUX_META_BITS : T_POSVEC := ( - STMDEMUX_META_STREAMID_SRCMAC => 8, - STMDEMUX_META_STREAMID_DESTMAC => 8, - STMDEMUX_META_STREAMID_ETHTYPE => 16, - STMDEMUX_META_STREAMID_SRCIP => 8, - STMDEMUX_META_STREAMID_DESTIP => 8, - STMDEMUX_META_STREAMID_LENGTH => 16, - STMDEMUX_META_STREAMID_PROTO => 8, - STMDEMUX_META_STREAMID_SRCPORT => 16, - STMDEMUX_META_STREAMID_DESTPORT => 16 + signal TX_FCS_Valid : std_logic; + signal TX_FCS_Data : T_SLV_8; + signal TX_FCS_SOF : std_logic; + signal TX_FCS_EOF : std_logic; + signal TX_FCS_MetaOut_rst : std_logic; + signal TX_FCS_MetaOut_nxt : std_logic_vector(TX_FCS_META_BITS'length - 1 downto 0); + signal TX_FCS_MetaOut_Data : std_logic_vector(isum(TX_FCS_META_BITS) - 1 downto 0); + signal TX_FCS_Meta_SrcIPAddress_Data : T_SLV_8; + signal TX_FCS_Meta_DestIPAddress_Data : T_SLV_8; + signal TX_FCS_Meta_SrcPort : T_SLV_16; + signal TX_FCS_Meta_DestPort : T_SLV_16; + signal TX_FCS_Meta_Checksum : T_SLV_16; + signal TX_FCS_Meta_Length : T_SLV_16; + + signal TX_FCS_Ack : std_logic; + signal TX_FCS_MetaIn_rst : std_logic; + signal TX_FCS_MetaIn_nxt : std_logic_vector(TX_FCS_META_BITS'length - 1 downto 0); + signal TX_FCS_MetaIn_Data : std_logic_vector(isum(TX_FCS_META_BITS) - 1 downto 0); + + signal UDP_TX_Ack : std_logic; + signal UDP_TX_Meta_rst : std_logic; + signal UDP_TX_Meta_SrcIPAddress_nxt : std_logic; + signal UDP_TX_Meta_DestIPAddress_nxt : std_logic; + + signal UDP_RX_Valid : std_logic; + signal UDP_RX_Data : T_SLV_8; + signal UDP_RX_SOF : std_logic; + signal UDP_RX_EOF : std_logic; + + signal UDP_RX_Meta_SrcMACAddress_Data : T_SLV_8; + signal UDP_RX_Meta_DestMACAddress_Data : T_SLV_8; + signal UDP_RX_Meta_EthType : T_SLV_16; + signal UDP_RX_Meta_SrcIPAddress_Data : T_SLV_8; + signal UDP_RX_Meta_DestIPAddress_Data : T_SLV_8; + signal UDP_RX_Meta_Length : T_SLV_16; + signal UDP_RX_Meta_Protocol : T_SLV_8; + signal UDP_RX_Meta_SrcPort : T_SLV_16; + signal UDP_RX_Meta_DestPort : T_SLV_16; + + constant STMDEMUX_META_RST_BIT : natural := 0; + constant STMDEMUX_META_MACSRC_NXT_BIT : natural := 1; + constant STMDEMUX_META_MACDEST_NXT_BIT : natural := 2; + constant STMDEMUX_META_IPSRC_NXT_BIT : natural := 3; + constant STMDEMUX_META_IPDEST_NXT_BIT : natural := 4; + + constant STMDEMUX_META_STREAMID_SRCMAC : natural := 0; + constant STMDEMUX_META_STREAMID_DESTMAC : natural := 1; + constant STMDEMUX_META_STREAMID_ETHTYPE : natural := 2; + constant STMDEMUX_META_STREAMID_SRCIP : natural := 3; + constant STMDEMUX_META_STREAMID_DESTIP : natural := 4; + constant STMDEMUX_META_STREAMID_LENGTH : natural := 5; + constant STMDEMUX_META_STREAMID_PROTO : natural := 6; + constant STMDEMUX_META_STREAMID_SRCPORT : natural := 7; + constant STMDEMUX_META_STREAMID_DESTPORT : natural := 8; + + constant STMDEMUX_DATA_BITS : natural := 8; -- + constant STMDEMUX_META_BITS : positive_vector := ( + STMDEMUX_META_STREAMID_SRCMAC => 8, + STMDEMUX_META_STREAMID_DESTMAC => 8, + STMDEMUX_META_STREAMID_ETHTYPE => 16, + STMDEMUX_META_STREAMID_SRCIP => 8, + STMDEMUX_META_STREAMID_DESTIP => 8, + STMDEMUX_META_STREAMID_LENGTH => 16, + STMDEMUX_META_STREAMID_PROTO => 8, + STMDEMUX_META_STREAMID_SRCPORT => 16, + STMDEMUX_META_STREAMID_DESTPORT => 16 ); - constant STMDEMUX_META_REV_BITS : natural := 5; -- sum over all control bits (rst, nxt, nxt, nxt, nxt) + constant STMDEMUX_META_REV_BITS : natural := 5; -- sum over all control bits (rst, nxt, nxt, nxt, nxt) - signal StmDeMux_Out_Ack : std_logic; - signal StmDeMux_Out_Meta_rst : std_logic; - signal StmDeMux_Out_Meta_SrcMACAddress_nxt : std_logic; - signal StmDeMux_Out_Meta_DestMACAddress_nxt : std_logic; - signal StmDeMux_Out_Meta_SrcIPAddress_nxt : std_logic; - signal StmDeMux_Out_Meta_DestIPAddress_nxt : std_logic; + signal StmDeMux_Out_Ack : std_logic; + signal StmDeMux_Out_Meta_rst : std_logic; + signal StmDeMux_Out_Meta_SrcMACAddress_nxt : std_logic; + signal StmDeMux_Out_Meta_DestMACAddress_nxt : std_logic; + signal StmDeMux_Out_Meta_SrcIPAddress_nxt : std_logic; + signal StmDeMux_Out_Meta_DestIPAddress_nxt : std_logic; - signal StmDeMux_Out_MetaIn : std_logic_vector(isum(STMDEMUX_META_BITS) - 1 downto 0); - signal StmDeMux_Out_MetaIn_rev : std_logic_vector(STMDEMUX_META_REV_BITS - 1 downto 0); - signal StmDeMux_Out_Data : T_SLM(UDP_SWITCH_PORTS - 1 downto 0, STMDEMUX_DATA_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmDeMux_Out_MetaOut : T_SLM(UDP_SWITCH_PORTS - 1 downto 0, isum(STMDEMUX_META_BITS) - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmDeMux_Out_MetaOut_rev : T_SLM(UDP_SWITCH_PORTS - 1 downto 0, STMDEMUX_META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal StmDeMux_Out_MetaIn : std_logic_vector(isum(STMDEMUX_META_BITS) - 1 downto 0); + signal StmDeMux_Out_MetaIn_rev : std_logic_vector(STMDEMUX_META_REV_BITS - 1 downto 0); + signal StmDeMux_Out_Data : T_SLM(UDP_SWITCH_PORTS - 1 downto 0, STMDEMUX_DATA_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal StmDeMux_Out_MetaOut : T_SLM(UDP_SWITCH_PORTS - 1 downto 0, isum(STMDEMUX_META_BITS) - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) + signal StmDeMux_Out_MetaOut_rev : T_SLM(UDP_SWITCH_PORTS - 1 downto 0, STMDEMUX_META_REV_BITS - 1 downto 0) := (others => (others => 'Z')); -- necessary default assignment 'Z' to get correct simulation results (iSIM, vSIM, ghdl/gtkwave) - signal StmDeMux_Control : std_logic_vector(UDP_SWITCH_PORTS - 1 downto 0); + signal StmDeMux_Control : std_logic_vector(UDP_SWITCH_PORTS - 1 downto 0); begin - assert ((IP_VERSION = 4) or (IP_VERSION = 6)) report "Unsupported Internet Protocol (IP) version." severity ERROR; + assert ((IP_VERSION = 4) or (IP_VERSION = 6)) report "Unsupported Internet Protocol (IP) version." severity ERROR; -- ============================================================================= -- TX Path -- ============================================================================= - StmMux_In_Data <= to_slm(TX_Data); + StmMux_In_Data <= to_slm(TX_Data); genStmMuxIn : for i in 0 to UDP_SWITCH_PORTS - 1 generate - signal Meta : std_logic_vector(isum(STMMUX_META_BITS) - 1 downto 0); + signal Meta : std_logic_vector(isum(STMMUX_META_BITS) - 1 downto 0); begin - Meta(high(STMMUX_META_BITS, STMMUX_META_STREAMID_SRCIP) downto low(STMMUX_META_BITS, STMMUX_META_STREAMID_SRCIP)) <= TX_Meta_SrcIPAddress_Data(i); - Meta(high(STMMUX_META_BITS, STMMUX_META_STREAMID_DESTIP) downto low(STMMUX_META_BITS, STMMUX_META_STREAMID_DESTIP)) <= TX_Meta_DestIPAddress_Data(i); - Meta(high(STMMUX_META_BITS, STMMUX_META_STREAMID_SRCPORT) downto low(STMMUX_META_BITS, STMMUX_META_STREAMID_SRCPORT)) <= TX_Meta_SrcPort(i); - Meta(high(STMMUX_META_BITS, STMMUX_META_STREAMID_DESTPORT) downto low(STMMUX_META_BITS, STMMUX_META_STREAMID_DESTPORT)) <= TX_Meta_DestPort(i); - Meta(high(STMMUX_META_BITS, STMMUX_META_STREAMID_LENGTH) downto low(STMMUX_META_BITS, STMMUX_META_STREAMID_LENGTH)) <= TX_Meta_Length(i); + Meta(high(STMMUX_META_BITS, STMMUX_META_STREAMID_SRCIP) downto low(STMMUX_META_BITS, STMMUX_META_STREAMID_SRCIP)) <= TX_Meta_SrcIPAddress_Data(i); + Meta(high(STMMUX_META_BITS, STMMUX_META_STREAMID_DESTIP) downto low(STMMUX_META_BITS, STMMUX_META_STREAMID_DESTIP)) <= TX_Meta_DestIPAddress_Data(i); + Meta(high(STMMUX_META_BITS, STMMUX_META_STREAMID_SRCPORT) downto low(STMMUX_META_BITS, STMMUX_META_STREAMID_SRCPORT)) <= TX_Meta_SrcPort(i); + Meta(high(STMMUX_META_BITS, STMMUX_META_STREAMID_DESTPORT) downto low(STMMUX_META_BITS, STMMUX_META_STREAMID_DESTPORT)) <= TX_Meta_DestPort(i); + Meta(high(STMMUX_META_BITS, STMMUX_META_STREAMID_LENGTH) downto low(STMMUX_META_BITS, STMMUX_META_STREAMID_LENGTH)) <= TX_Meta_Length(i); - assign_row(StmMux_In_Meta, Meta, i); + assign_row(StmMux_In_Meta, Meta, i); end generate; - TX_Meta_rst <= get_col(StmMux_In_Meta_rev, STMMUX_META_RST_BIT); - TX_Meta_SrcIPAddress_nxt <= get_col(StmMux_In_Meta_rev, STMMUX_META_SRCIP_NXT_BIT); - TX_Meta_DestIPAddress_nxt <= get_col(StmMux_In_Meta_rev, STMMUX_META_DESTIP_NXT_BIT); + TX_Meta_rst <= get_col(StmMux_In_Meta_rev, STMMUX_META_RST_BIT); + TX_Meta_SrcIPAddress_nxt <= get_col(StmMux_In_Meta_rev, STMMUX_META_SRCIP_NXT_BIT); + TX_Meta_DestIPAddress_nxt <= get_col(StmMux_In_Meta_rev, STMMUX_META_DESTIP_NXT_BIT); TX_StmMux: entity work.stream_Mux generic map ( - PORTS => UDP_SWITCH_PORTS, - DATA_BITS => StmMux_Out_Data'length, - META_BITS => isum(STMMUX_META_BITS), - META_REV_BITS => STMMUX_META_REV_BITS + PORTS => UDP_SWITCH_PORTS, + DATA_BITS => StmMux_Out_Data'length, + META_BITS => isum(STMMUX_META_BITS), + META_REV_BITS => STMMUX_META_REV_BITS ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => TX_Valid, - In_Data => StmMux_In_Data, - In_Meta => StmMux_In_Meta, - In_Meta_rev => StmMux_In_Meta_rev, - In_SOF => TX_SOF, - In_EOF => TX_EOF, - In_Ack => TX_Ack, - - Out_Valid => StmMux_Out_Valid, - Out_Data => StmMux_Out_Data, - Out_Meta => StmMux_Out_Meta, - Out_Meta_rev => StmMux_Out_Meta_rev, - Out_SOF => StmMux_Out_SOF, - Out_EOF => StmMux_Out_EOF, - Out_Ack => TX_FCS_Ack + Clock => Clock, + Reset => Reset, + + In_Valid => TX_Valid, + In_Data => StmMux_In_Data, + In_Meta => StmMux_In_Meta, + In_Meta_rev => StmMux_In_Meta_rev, + In_SOF => TX_SOF, + In_EOF => TX_EOF, + In_Ack => TX_Ack, + + Out_Valid => StmMux_Out_Valid, + Out_Data => StmMux_Out_Data, + Out_Meta => StmMux_Out_Meta, + Out_Meta_rev => StmMux_Out_Meta_rev, + Out_SOF => StmMux_Out_SOF, + Out_EOF => StmMux_Out_EOF, + Out_Ack => TX_FCS_Ack ); - StmMux_Out_Meta_rev(STMMUX_META_RST_BIT) <= TX_FCS_MetaIn_rst; - StmMux_Out_Meta_rev(STMMUX_META_SRCIP_NXT_BIT) <= TX_FCS_MetaIn_nxt(TX_FCS_META_STREAMID_SRCIP); - StmMux_Out_Meta_rev(STMMUX_META_DESTIP_NXT_BIT) <= TX_FCS_MetaIn_nxt(TX_FCS_META_STREAMID_DESTIP); + StmMux_Out_Meta_rev(STMMUX_META_RST_BIT) <= TX_FCS_MetaIn_rst; + StmMux_Out_Meta_rev(STMMUX_META_SRCIP_NXT_BIT) <= TX_FCS_MetaIn_nxt(TX_FCS_META_STREAMID_SRCIP); + StmMux_Out_Meta_rev(STMMUX_META_DESTIP_NXT_BIT) <= TX_FCS_MetaIn_nxt(TX_FCS_META_STREAMID_DESTIP); - TX_FCS_MetaIn_Data <= StmMux_Out_Meta; + TX_FCS_MetaIn_Data <= StmMux_Out_Meta; TX_FCS: entity work.net_FrameChecksum generic map ( - MAX_FRAMES => 4, - MAX_FRAME_LENGTH => 2048, - META_BITS => TX_FCS_META_BITS, - META_FIFO_DEPTH => TX_FCS_META_FIFO_DEPTHS + MAX_FRAMES => 4, + MAX_FRAME_LENGTH => 2048, + META_BITS => TX_FCS_META_BITS, + META_FIFO_DEPTH => TX_FCS_META_FIFO_DEPTHS ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => StmMux_Out_Valid, - In_Data => StmMux_Out_Data, - In_SOF => StmMux_Out_SOF, - In_EOF => StmMux_Out_EOF, - In_Ack => TX_FCS_Ack, - In_Meta_rst => TX_FCS_MetaIn_rst, - In_Meta_nxt => TX_FCS_MetaIn_nxt, - In_Meta_Data => TX_FCS_MetaIn_Data, - - Out_Valid => TX_FCS_Valid, - Out_Data => TX_FCS_Data, - Out_SOF => TX_FCS_SOF, - Out_EOF => TX_FCS_EOF, - Out_Ack => UDP_TX_Ack, - Out_Meta_rst => TX_FCS_MetaOut_rst, - Out_Meta_nxt => TX_FCS_MetaOut_nxt, - Out_Meta_Data => TX_FCS_MetaOut_Data, - Out_Meta_Checksum => TX_FCS_Meta_Checksum, - Out_Meta_Length => TX_FCS_Meta_Length + Clock => Clock, + Reset => Reset, + + In_Valid => StmMux_Out_Valid, + In_Data => StmMux_Out_Data, + In_SOF => StmMux_Out_SOF, + In_EOF => StmMux_Out_EOF, + In_Ack => TX_FCS_Ack, + In_Meta_rst => TX_FCS_MetaIn_rst, + In_Meta_nxt => TX_FCS_MetaIn_nxt, + In_Meta_Data => TX_FCS_MetaIn_Data, + + Out_Valid => TX_FCS_Valid, + Out_Data => TX_FCS_Data, + Out_SOF => TX_FCS_SOF, + Out_EOF => TX_FCS_EOF, + Out_Ack => UDP_TX_Ack, + Out_Meta_rst => TX_FCS_MetaOut_rst, + Out_Meta_nxt => TX_FCS_MetaOut_nxt, + Out_Meta_Data => TX_FCS_MetaOut_Data, + Out_Meta_Checksum => TX_FCS_Meta_Checksum, + Out_Meta_Length => TX_FCS_Meta_Length ); - TX_FCS_MetaOut_rst <= UDP_TX_Meta_rst; - TX_FCS_MetaOut_nxt(TX_FCS_META_STREAMID_SRCIP) <= UDP_TX_Meta_SrcIPAddress_nxt; - TX_FCS_MetaOut_nxt(TX_FCS_META_STREAMID_DESTIP) <= UDP_TX_Meta_DestIPAddress_nxt; - TX_FCS_MetaOut_nxt(TX_FCS_META_STREAMID_SRCPORT) <= '0'; - TX_FCS_MetaOut_nxt(TX_FCS_META_STREAMID_DESTPORT) <= '0'; + TX_FCS_MetaOut_rst <= UDP_TX_Meta_rst; + TX_FCS_MetaOut_nxt(TX_FCS_META_STREAMID_SRCIP) <= UDP_TX_Meta_SrcIPAddress_nxt; + TX_FCS_MetaOut_nxt(TX_FCS_META_STREAMID_DESTIP) <= UDP_TX_Meta_DestIPAddress_nxt; + TX_FCS_MetaOut_nxt(TX_FCS_META_STREAMID_SRCPORT) <= '0'; + TX_FCS_MetaOut_nxt(TX_FCS_META_STREAMID_DESTPORT) <= '0'; - TX_FCS_Meta_SrcIPAddress_Data <= TX_FCS_MetaOut_Data(high(TX_FCS_META_BITS, TX_FCS_META_STREAMID_SRCIP) downto low(TX_FCS_META_BITS, TX_FCS_META_STREAMID_SRCIP)); - TX_FCS_Meta_DestIPAddress_Data <= TX_FCS_MetaOut_Data(high(TX_FCS_META_BITS, TX_FCS_META_STREAMID_DESTIP) downto low(TX_FCS_META_BITS, TX_FCS_META_STREAMID_DESTIP)); - TX_FCS_Meta_SrcPort <= TX_FCS_MetaOut_Data(high(TX_FCS_META_BITS, TX_FCS_META_STREAMID_SRCPORT) downto low(TX_FCS_META_BITS, TX_FCS_META_STREAMID_SRCPORT)); - TX_FCS_Meta_DestPort <= TX_FCS_MetaOut_Data(high(TX_FCS_META_BITS, TX_FCS_META_STREAMID_DESTPORT) downto low(TX_FCS_META_BITS, TX_FCS_META_STREAMID_DESTPORT)); --- TX_FCS_Meta_Length <= TX_FCS_MetaOut_Data(high(TX_FCS_META_BITS, TX_FCS_META_STREAMID_LEN) downto low(TX_FCS_META_BITS, TX_FCS_META_STREAMID_LEN)); + TX_FCS_Meta_SrcIPAddress_Data <= TX_FCS_MetaOut_Data(high(TX_FCS_META_BITS, TX_FCS_META_STREAMID_SRCIP) downto low(TX_FCS_META_BITS, TX_FCS_META_STREAMID_SRCIP)); + TX_FCS_Meta_DestIPAddress_Data <= TX_FCS_MetaOut_Data(high(TX_FCS_META_BITS, TX_FCS_META_STREAMID_DESTIP) downto low(TX_FCS_META_BITS, TX_FCS_META_STREAMID_DESTIP)); + TX_FCS_Meta_SrcPort <= TX_FCS_MetaOut_Data(high(TX_FCS_META_BITS, TX_FCS_META_STREAMID_SRCPORT) downto low(TX_FCS_META_BITS, TX_FCS_META_STREAMID_SRCPORT)); + TX_FCS_Meta_DestPort <= TX_FCS_MetaOut_Data(high(TX_FCS_META_BITS, TX_FCS_META_STREAMID_DESTPORT) downto low(TX_FCS_META_BITS, TX_FCS_META_STREAMID_DESTPORT)); +-- TX_FCS_Meta_Length <= TX_FCS_MetaOut_Data(high(TX_FCS_META_BITS, TX_FCS_META_STREAMID_LEN) downto low(TX_FCS_META_BITS, TX_FCS_META_STREAMID_LEN)); TX_UDP: entity work.udp_TX generic map ( - DEBUG => DEBUG, - IP_VERSION => IP_VERSION + DEBUG => DEBUG, + IP_VERSION => IP_VERSION ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => TX_FCS_Valid, - In_Data => TX_FCS_Data, - In_SOF => TX_FCS_SOF, - In_EOF => TX_FCS_EOF, - In_Ack => UDP_TX_Ack, - In_Meta_rst => UDP_TX_Meta_rst, - In_Meta_SrcIPAddress_nxt => UDP_TX_Meta_SrcIPAddress_nxt, - In_Meta_SrcIPAddress_Data => TX_FCS_Meta_SrcIPAddress_Data, - In_Meta_DestIPAddress_nxt => UDP_TX_Meta_DestIPAddress_nxt, - In_Meta_DestIPAddress_Data => TX_FCS_Meta_DestIPAddress_Data, - In_Meta_SrcPort => TX_FCS_Meta_SrcPort, - In_Meta_DestPort => TX_FCS_Meta_DestPort, - In_Meta_Length => TX_FCS_Meta_Length, - In_Meta_Checksum => TX_FCS_Meta_Checksum, - - Out_Valid => IP_TX_Valid, - Out_Data => IP_TX_Data, - Out_SOF => IP_TX_SOF, - Out_EOF => IP_TX_EOF, - Out_Ack => IP_TX_Ack, - Out_Meta_rst => IP_TX_Meta_rst, - Out_Meta_SrcIPAddress_nxt => IP_TX_Meta_SrcIPAddress_nxt, - Out_Meta_SrcIPAddress_Data => IP_TX_Meta_SrcIPAddress_Data, - Out_Meta_DestIPAddress_nxt => IP_TX_Meta_DestIPAddress_nxt, - Out_Meta_DestIPAddress_Data => IP_TX_Meta_DestIPAddress_Data, - Out_Meta_Length => IP_TX_Meta_Length + Clock => Clock, + Reset => Reset, + + In_Valid => TX_FCS_Valid, + In_Data => TX_FCS_Data, + In_SOF => TX_FCS_SOF, + In_EOF => TX_FCS_EOF, + In_Ack => UDP_TX_Ack, + In_Meta_rst => UDP_TX_Meta_rst, + In_Meta_SrcIPAddress_nxt => UDP_TX_Meta_SrcIPAddress_nxt, + In_Meta_SrcIPAddress_Data => TX_FCS_Meta_SrcIPAddress_Data, + In_Meta_DestIPAddress_nxt => UDP_TX_Meta_DestIPAddress_nxt, + In_Meta_DestIPAddress_Data => TX_FCS_Meta_DestIPAddress_Data, + In_Meta_SrcPort => TX_FCS_Meta_SrcPort, + In_Meta_DestPort => TX_FCS_Meta_DestPort, + In_Meta_Length => TX_FCS_Meta_Length, + In_Meta_Checksum => TX_FCS_Meta_Checksum, + + Out_Valid => IP_TX_Valid, + Out_Data => IP_TX_Data, + Out_SOF => IP_TX_SOF, + Out_EOF => IP_TX_EOF, + Out_Ack => IP_TX_Ack, + Out_Meta_rst => IP_TX_Meta_rst, + Out_Meta_SrcIPAddress_nxt => IP_TX_Meta_SrcIPAddress_nxt, + Out_Meta_SrcIPAddress_Data => IP_TX_Meta_SrcIPAddress_Data, + Out_Meta_DestIPAddress_nxt => IP_TX_Meta_DestIPAddress_nxt, + Out_Meta_DestIPAddress_Data => IP_TX_Meta_DestIPAddress_Data, + Out_Meta_Length => IP_TX_Meta_Length ); -- ============================================================================= @@ -408,120 +408,120 @@ begin -- ============================================================================= RX_UDP: entity work.udp_RX generic map ( - DEBUG => DEBUG, - IP_VERSION => IP_VERSION + DEBUG => DEBUG, + IP_VERSION => IP_VERSION ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => IP_RX_Valid, - In_Data => IP_RX_Data, - In_SOF => IP_RX_SOF, - In_EOF => IP_RX_EOF, - In_Ack => IP_RX_Ack, - In_Meta_rst => IP_RX_Meta_rst, - In_Meta_SrcMACAddress_nxt => IP_RX_Meta_SrcMACAddress_nxt, - In_Meta_SrcMACAddress_Data => IP_RX_Meta_SrcMACAddress_Data, - In_Meta_DestMACAddress_nxt => IP_RX_Meta_DestMACAddress_nxt, - In_Meta_DestMACAddress_Data => IP_RX_Meta_DestMACAddress_Data, - In_Meta_EthType => IP_RX_Meta_EthType, - In_Meta_SrcIPAddress_nxt => IP_RX_Meta_SrcIPAddress_nxt, - In_Meta_SrcIPAddress_Data => IP_RX_Meta_SrcIPAddress_Data, - In_Meta_DestIPAddress_nxt => IP_RX_Meta_DestIPAddress_nxt, - In_Meta_DestIPAddress_Data => IP_RX_Meta_DestIPAddress_Data, - In_Meta_Length => IP_RX_Meta_Length, - In_Meta_Protocol => IP_RX_Meta_Protocol, - - Out_Valid => UDP_RX_Valid, - Out_Data => UDP_RX_Data, - Out_SOF => UDP_RX_SOF, - Out_EOF => UDP_RX_EOF, - Out_Ack => StmDeMux_Out_Ack, - Out_Meta_rst => StmDeMux_Out_Meta_rst, - Out_Meta_SrcMACAddress_nxt => StmDeMux_Out_Meta_SrcMACAddress_nxt, - Out_Meta_SrcMACAddress_Data => UDP_RX_Meta_SrcMACAddress_Data, - Out_Meta_DestMACAddress_nxt => StmDeMux_Out_Meta_DestMACAddress_nxt, - Out_Meta_DestMACAddress_Data => UDP_RX_Meta_DestMACAddress_Data, - Out_Meta_EthType => UDP_RX_Meta_EthType, - Out_Meta_SrcIPAddress_nxt => StmDeMux_Out_Meta_SrcIPAddress_nxt, - Out_Meta_SrcIPAddress_Data => UDP_RX_Meta_SrcIPAddress_Data, - Out_Meta_DestIPAddress_nxt => StmDeMux_Out_Meta_DestIPAddress_nxt, - Out_Meta_DestIPAddress_Data => UDP_RX_Meta_DestIPAddress_Data, - Out_Meta_Length => UDP_RX_Meta_Length, - Out_Meta_Protocol => UDP_RX_Meta_Protocol, - Out_Meta_SrcPort => UDP_RX_Meta_SrcPort, - Out_Meta_DestPort => UDP_RX_Meta_DestPort + Clock => Clock, + Reset => Reset, + + In_Valid => IP_RX_Valid, + In_Data => IP_RX_Data, + In_SOF => IP_RX_SOF, + In_EOF => IP_RX_EOF, + In_Ack => IP_RX_Ack, + In_Meta_rst => IP_RX_Meta_rst, + In_Meta_SrcMACAddress_nxt => IP_RX_Meta_SrcMACAddress_nxt, + In_Meta_SrcMACAddress_Data => IP_RX_Meta_SrcMACAddress_Data, + In_Meta_DestMACAddress_nxt => IP_RX_Meta_DestMACAddress_nxt, + In_Meta_DestMACAddress_Data => IP_RX_Meta_DestMACAddress_Data, + In_Meta_EthType => IP_RX_Meta_EthType, + In_Meta_SrcIPAddress_nxt => IP_RX_Meta_SrcIPAddress_nxt, + In_Meta_SrcIPAddress_Data => IP_RX_Meta_SrcIPAddress_Data, + In_Meta_DestIPAddress_nxt => IP_RX_Meta_DestIPAddress_nxt, + In_Meta_DestIPAddress_Data => IP_RX_Meta_DestIPAddress_Data, + In_Meta_Length => IP_RX_Meta_Length, + In_Meta_Protocol => IP_RX_Meta_Protocol, + + Out_Valid => UDP_RX_Valid, + Out_Data => UDP_RX_Data, + Out_SOF => UDP_RX_SOF, + Out_EOF => UDP_RX_EOF, + Out_Ack => StmDeMux_Out_Ack, + Out_Meta_rst => StmDeMux_Out_Meta_rst, + Out_Meta_SrcMACAddress_nxt => StmDeMux_Out_Meta_SrcMACAddress_nxt, + Out_Meta_SrcMACAddress_Data => UDP_RX_Meta_SrcMACAddress_Data, + Out_Meta_DestMACAddress_nxt => StmDeMux_Out_Meta_DestMACAddress_nxt, + Out_Meta_DestMACAddress_Data => UDP_RX_Meta_DestMACAddress_Data, + Out_Meta_EthType => UDP_RX_Meta_EthType, + Out_Meta_SrcIPAddress_nxt => StmDeMux_Out_Meta_SrcIPAddress_nxt, + Out_Meta_SrcIPAddress_Data => UDP_RX_Meta_SrcIPAddress_Data, + Out_Meta_DestIPAddress_nxt => StmDeMux_Out_Meta_DestIPAddress_nxt, + Out_Meta_DestIPAddress_Data => UDP_RX_Meta_DestIPAddress_Data, + Out_Meta_Length => UDP_RX_Meta_Length, + Out_Meta_Protocol => UDP_RX_Meta_Protocol, + Out_Meta_SrcPort => UDP_RX_Meta_SrcPort, + Out_Meta_DestPort => UDP_RX_Meta_DestPort ); genStmDeMux_Control : for i in 0 to UDP_SWITCH_PORTS - 1 generate - StmDeMux_Control(i) <= to_sl(UDP_RX_Meta_DestPort = PORTPAIRS(i).Ingress); + StmDeMux_Control(i) <= to_sl(UDP_RX_Meta_DestPort = PORTPAIRS(i).Ingress); end generate; -- decompress meta_rev vector to single bits - StmDeMux_Out_Meta_rst <= StmDeMux_Out_MetaIn_rev(STMDEMUX_META_RST_BIT); - StmDeMux_Out_Meta_SrcMACAddress_nxt <= StmDeMux_Out_MetaIn_rev(STMDEMUX_META_MACSRC_NXT_BIT); - StmDeMux_Out_Meta_DestMACAddress_nxt <= StmDeMux_Out_MetaIn_rev(STMDEMUX_META_MACDEST_NXT_BIT); - StmDeMux_Out_Meta_SrcIPAddress_nxt <= StmDeMux_Out_MetaIn_rev(STMDEMUX_META_IPSRC_NXT_BIT); - StmDeMux_Out_Meta_DestIPAddress_nxt <= StmDeMux_Out_MetaIn_rev(STMDEMUX_META_IPDEST_NXT_BIT); + StmDeMux_Out_Meta_rst <= StmDeMux_Out_MetaIn_rev(STMDEMUX_META_RST_BIT); + StmDeMux_Out_Meta_SrcMACAddress_nxt <= StmDeMux_Out_MetaIn_rev(STMDEMUX_META_MACSRC_NXT_BIT); + StmDeMux_Out_Meta_DestMACAddress_nxt <= StmDeMux_Out_MetaIn_rev(STMDEMUX_META_MACDEST_NXT_BIT); + StmDeMux_Out_Meta_SrcIPAddress_nxt <= StmDeMux_Out_MetaIn_rev(STMDEMUX_META_IPSRC_NXT_BIT); + StmDeMux_Out_Meta_DestIPAddress_nxt <= StmDeMux_Out_MetaIn_rev(STMDEMUX_META_IPDEST_NXT_BIT); -- compress meta data vectors to single meta data vector - StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC)) <= UDP_RX_Meta_SrcMACAddress_Data; - StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC)) <= UDP_RX_Meta_DestMACAddress_Data; - StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE)) <= UDP_RX_Meta_EthType; - StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP)) <= UDP_RX_Meta_SrcIPAddress_Data; - StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP)) <= UDP_RX_Meta_DestIPAddress_Data; - StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH)) <= UDP_RX_Meta_Length; - StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO)) <= UDP_RX_Meta_Protocol; - StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCPORT) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCPORT)) <= UDP_RX_Meta_SrcPort; - StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTPORT) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTPORT)) <= UDP_RX_Meta_DestPort; + StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC)) <= UDP_RX_Meta_SrcMACAddress_Data; + StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC)) <= UDP_RX_Meta_DestMACAddress_Data; + StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE)) <= UDP_RX_Meta_EthType; + StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP)) <= UDP_RX_Meta_SrcIPAddress_Data; + StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP)) <= UDP_RX_Meta_DestIPAddress_Data; + StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH)) <= UDP_RX_Meta_Length; + StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO)) <= UDP_RX_Meta_Protocol; + StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCPORT) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCPORT)) <= UDP_RX_Meta_SrcPort; + StmDeMux_Out_MetaIn(high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTPORT) downto low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTPORT)) <= UDP_RX_Meta_DestPort; RX_StmDeMux: entity work.stream_DeMux generic map ( - PORTS => UDP_SWITCH_PORTS, - DATA_BITS => STMDEMUX_DATA_BITS, - META_BITS => isum(STMDEMUX_META_BITS), - META_REV_BITS => STMDEMUX_META_REV_BITS + PORTS => UDP_SWITCH_PORTS, + DATA_BITS => STMDEMUX_DATA_BITS, + META_BITS => isum(STMDEMUX_META_BITS), + META_REV_BITS => STMDEMUX_META_REV_BITS ) port map ( - Clock => Clock, - Reset => Reset, - - DeMuxControl => StmDeMux_Control, - - In_Valid => UDP_RX_Valid, - In_Data => UDP_RX_Data, - In_Meta => StmDeMux_Out_MetaIn, - In_Meta_rev => StmDeMux_Out_MetaIn_rev, - In_SOF => UDP_RX_SOF, - In_EOF => UDP_RX_EOF, - In_Ack => StmDeMux_Out_Ack, - - Out_Valid => RX_Valid, - Out_Data => StmDeMux_Out_Data, - Out_Meta => StmDeMux_Out_MetaOut, - Out_Meta_rev => StmDeMux_Out_MetaOut_rev, - Out_SOF => RX_SOF, - Out_EOF => RX_EOF, - Out_Ack => RX_Ack + Clock => Clock, + Reset => Reset, + + DeMuxControl => StmDeMux_Control, + + In_Valid => UDP_RX_Valid, + In_Data => UDP_RX_Data, + In_Meta => StmDeMux_Out_MetaIn, + In_Meta_rev => StmDeMux_Out_MetaIn_rev, + In_SOF => UDP_RX_SOF, + In_EOF => UDP_RX_EOF, + In_Ack => StmDeMux_Out_Ack, + + Out_Valid => RX_Valid, + Out_Data => StmDeMux_Out_Data, + Out_Meta => StmDeMux_Out_MetaOut, + Out_Meta_rev => StmDeMux_Out_MetaOut_rev, + Out_SOF => RX_SOF, + Out_EOF => RX_EOF, + Out_Ack => RX_Ack ); - assign_col(StmDeMux_Out_MetaOut_rev, RX_Meta_rst, STMDEMUX_META_RST_BIT); - assign_col(StmDeMux_Out_MetaOut_rev, RX_Meta_SrcMACAddress_nxt, STMDEMUX_META_MACSRC_NXT_BIT); - assign_col(StmDeMux_Out_MetaOut_rev, RX_Meta_DestMACAddress_nxt, STMDEMUX_META_MACDEST_NXT_BIT); - assign_col(StmDeMux_Out_MetaOut_rev, RX_Meta_SrcIPAddress_nxt, STMDEMUX_META_IPSRC_NXT_BIT); - assign_col(StmDeMux_Out_MetaOut_rev, RX_Meta_DestIPAddress_nxt, STMDEMUX_META_IPDEST_NXT_BIT); + assign_col(StmDeMux_Out_MetaOut_rev, RX_Meta_rst, STMDEMUX_META_RST_BIT); + assign_col(StmDeMux_Out_MetaOut_rev, RX_Meta_SrcMACAddress_nxt, STMDEMUX_META_MACSRC_NXT_BIT); + assign_col(StmDeMux_Out_MetaOut_rev, RX_Meta_DestMACAddress_nxt, STMDEMUX_META_MACDEST_NXT_BIT); + assign_col(StmDeMux_Out_MetaOut_rev, RX_Meta_SrcIPAddress_nxt, STMDEMUX_META_IPSRC_NXT_BIT); + assign_col(StmDeMux_Out_MetaOut_rev, RX_Meta_DestIPAddress_nxt, STMDEMUX_META_IPDEST_NXT_BIT); -- new slm_slice funtion to avoid generate statement for wiring => cut multiple columns over all rows and convert to slvv_* - RX_Data <= to_slvv_8(StmDeMux_Out_Data); - RX_Meta_SrcMACAddress_Data <= to_slvv_8( slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC))); - RX_Meta_DestMACAddress_Data <= to_slvv_8( slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC))); - RX_Meta_EthType <= to_slvv_16(slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE))); - RX_Meta_SrcIPAddress_Data <= to_slvv_8( slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP))); - RX_Meta_DestIPAddress_Data <= to_slvv_8( slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP))); - RX_Meta_Length <= to_slvv_16(slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH))); - RX_Meta_Protocol <= to_slvv_8( slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO))); - RX_Meta_SrcPort <= to_slvv_16(slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCPORT), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCPORT))); - RX_Meta_DestPort <= to_slvv_16(slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTPORT), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTPORT))); + RX_Data <= to_slvv_8(StmDeMux_Out_Data); + RX_Meta_SrcMACAddress_Data <= to_slvv_8( slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCMAC))); + RX_Meta_DestMACAddress_Data <= to_slvv_8( slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTMAC))); + RX_Meta_EthType <= to_slvv_16(slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_ETHTYPE))); + RX_Meta_SrcIPAddress_Data <= to_slvv_8( slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCIP))); + RX_Meta_DestIPAddress_Data <= to_slvv_8( slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTIP))); + RX_Meta_Length <= to_slvv_16(slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_LENGTH))); + RX_Meta_Protocol <= to_slvv_8( slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_PROTO))); + RX_Meta_SrcPort <= to_slvv_16(slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCPORT), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_SRCPORT))); + RX_Meta_DestPort <= to_slvv_16(slm_slice_cols(StmDeMux_Out_MetaOut, high(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTPORT), low(STMDEMUX_META_BITS, STMDEMUX_META_STREAMID_DESTPORT))); end architecture; diff --git a/src/sim/sim.pro b/src/sim/build.pro similarity index 100% rename from src/sim/sim.pro rename to src/sim/build.pro diff --git a/src/sim/sim_VCDParser.vhdl b/src/sim/sim_VCDParser.vhdl index 61bf0b8e3..783939ead 100644 --- a/src/sim/sim_VCDParser.vhdl +++ b/src/sim/sim_VCDParser.vhdl @@ -21,7 +21,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,9 +31,9 @@ -- ============================================================================= -- library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.STD_LOGIC_TEXTIO.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_textio.all; +use IEEE.numeric_std.all; use STD.TEXTIO.all; use work.utils.all; @@ -41,7 +41,7 @@ use work.strings.all; package sim_VCDParser is - subtype T_VCDLINE is string(1 to 80); + subtype T_VCDLINE is string(1 to 80); procedure VCD_ReadHeader(file VCDFile : TEXT; VCDLine : inout T_VCDLINE); procedure VCD_ReadLine(file VCDFile : TEXT; VCDLine : out string); @@ -62,9 +62,9 @@ package body sim_VCDParser is end procedure; procedure VCD_ReadLine(file VCDFile : TEXT; VCDLine : out string) is - variable vcdFileLine : LINE; - variable char : character; - variable isString : boolean; + variable vcdFileLine : LINE; + variable char : character; + variable isString : boolean; begin readline(VCDFile, vcdFileLine); @@ -75,29 +75,29 @@ package body sim_VCDParser is for i in VCDLine'range loop read(vcdFileLine, char, isString); exit when not isString; - VCDLine(I) := char; + VCDLine(I) := char; end loop; end procedure; procedure VCD_Read_StdLogic(VCDLine : string; signal sl : out std_logic; WaveName : string) is - constant length : natural := str_length(VCDLine); + constant length : natural := str_length(VCDLine); begin if (str_equal(VCDLine(2 to length), WaveName)) then - sl <= to_sl(VCDLine(1)); + sl <= to_sl(VCDLine(1)); end if; end procedure; procedure VCD_Read_StdLogicVector(VCDLine : string; signal slv : out std_logic_vector; WaveName : string; def : std_logic := '0') is - constant length : natural := str_length(VCDLine); - variable Result : std_logic_vector(slv'range); - variable k : natural; + constant length : natural := str_length(VCDLine); + variable Result : std_logic_vector(slv'range); + variable k : natural; begin - Result := (others => def); - k := 0; + Result := (others => def); + k := 0; for i in 2 to length loop if not is_sl(VCDLine(i)) then - k := i; + k := i; exit; else Result := Result(Result'high - 1 downto Result'low) & to_sl(VCDLine(i)); @@ -105,7 +105,7 @@ package body sim_VCDParser is end loop; if (str_equal(VCDLine(k + 1 to length), WaveName)) then - slv <= Result; + slv <= Result; end if; end procedure; end package body; diff --git a/src/sort/README.md b/src/sort/README.md index 09ccde42b..ba916a9d7 100644 --- a/src/sort/README.md +++ b/src/sort/README.md @@ -14,13 +14,13 @@ The package [`PoC.sort`][sort.pkg] holds all component declarations for this nam ## Entities - - [`sort_lru_cache`][sort_lru_cache] implements a list of least-recently-used (LRU) items. The implementation is optimized for the use in caches. - - [`sort_lru_list`][sort_lru_list] implements a list of least-recently-used (LRU) items. The implementation is generic. + - [`sort_LeastRecentlyUsed_Cache`][sort_LeastRecentlyUsed_Cache] implements a list of least-recently-used (LRU) items. The implementation is optimized for the use in caches. + - [`sort_LeastRecentlyUsed_List`][sort_LeastRecentlyUsed_List] implements a list of least-recently-used (LRU) items. The implementation is generic. [sort_sortnet]: sortnet [sort.pkg]: sort.pkg.vhdl - [sort_lru_cache]: sort_lru_cache.vhdl - [sort_lru_list]: sort_lru_list.vhdl + [sort_LeastRecentlyUsed_Cache]: sort_LeastRecentlyUsed_Cache.vhdl + [sort_LeastRecentlyUsed_List]: sort_LeastRecentlyUsed_List.vhdl diff --git a/src/sort/sort.pro b/src/sort/build.pro similarity index 89% rename from src/sort/sort.pro rename to src/sort/build.pro index 250a60794..014137854 100644 --- a/src/sort/sort.pro +++ b/src/sort/build.pro @@ -19,7 +19,7 @@ # limitations under the License. # ============================================================================= -analyze sort_lru_cache.vhdl -analyze sort_lru_list.vhdl +analyze sort_LeastRecentlyUsed_Cache.vhdl +analyze sort_LeastRecentlyUsed_List.vhdl -include ./sortnet/sortnet.pro +include ./sortnet diff --git a/src/sort/sort_lru_cache.vhdl b/src/sort/sort_LeastRecentlyUsed_Cache.vhdl similarity index 58% rename from src/sort/sort_lru_cache.vhdl rename to src/sort/sort_LeastRecentlyUsed_Cache.vhdl index e1a845f0e..25f63ddca 100644 --- a/src/sort/sort_lru_cache.vhdl +++ b/src/sort/sort_LeastRecentlyUsed_Cache.vhdl @@ -1,6 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; -- ============================================================================= -- Authors: Patrick Lehmann -- Martin Zabel @@ -9,12 +6,12 @@ -- -- Description: -- ------------------------------------- --- This is an optimized implementation of ``sort_lru_list`` to be used for caches. +-- This is an optimized implementation of ``sort_LeastRecentlyUsed_List`` to be used for caches. -- Only keys are stored within this list, and these keys are the index of the --- cache lines. The list initially contains all indizes from 0 to ELEMENTS-1. +-- cache lines. The list initially contains all indices from 0 to ELEMENTS-1. -- The least-recently used index ``KeyOut`` is always valid. -- --- The first outputed least-recently used index will be ELEMENTS-1. +-- The first outputted least-recently used index will be ELEMENTS-1. -- -- The inputs ``Insert``, ``Free``, ``KeyIn``, and ``Reset`` are synchronous to the -- rising-edge of the clock ``clock``. All control signals are high-active. @@ -28,13 +25,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -44,32 +41,32 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -use work.config.all; -use work.utils.all; -use work.vectors.all; -use work.components.all; +use work.config.all; +use work.utils.all; +use work.vectors.all; +use work.components.all; -entity sort_lru_cache is +entity sort_LeastRecentlyUsed_Cache is generic ( - ELEMENTS : positive := 32 + ELEMENTS : positive := 32 ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - Insert : in std_logic; - Free : in std_logic; - KeyIn : in std_logic_vector(log2ceilnz(ELEMENTS) - 1 downto 0); + Insert : in std_logic; + Free : in std_logic; + KeyIn : in std_logic_vector(log2ceilnz(ELEMENTS) - 1 downto 0); - KeyOut : out std_logic_vector(log2ceilnz(ELEMENTS) - 1 downto 0) + KeyOut : out std_logic_vector(log2ceilnz(ELEMENTS) - 1 downto 0) ); end entity; -architecture rtl of sort_lru_cache is +architecture rtl of sort_LeastRecentlyUsed_Cache is constant KEY_BITS : positive := log2ceilnz(ELEMENTS); subtype T_ELEMENT is std_logic_vector(KEY_BITS - 1 downto 0); @@ -77,31 +74,31 @@ architecture rtl of sort_lru_cache is signal NewElement : T_ELEMENT; - signal ElementsUp : T_ELEMENT_VECTOR(ELEMENTS downto 0); - signal ElementsDown : T_ELEMENT_VECTOR(ELEMENTS downto 0); + signal ElementsUp : T_ELEMENT_VECTOR(ELEMENTS downto 0); + signal ElementsDown : T_ELEMENT_VECTOR(ELEMENTS downto 0); signal MovesDown : std_logic_vector(ELEMENTS downto 0); - signal MovesUp : std_logic_vector(ELEMENTS downto 0); - signal UnEqual : std_logic_vector(ELEMENTS-1 downto 0); + signal MovesUp : std_logic_vector(ELEMENTS downto 0); + signal UnEqual : std_logic_vector(ELEMENTS-1 downto 0); - signal MovesUpCond : std_logic_vector(ELEMENTS downto 0); - signal MovesDownCond : std_logic_vector(ELEMENTS downto 0); - signal MovesDownCondRev : std_logic_vector(ELEMENTS downto 0); - signal MovesDownRev : std_logic_vector(ELEMENTS downto 0); + signal MovesUpCond : std_logic_vector(ELEMENTS downto 0); + signal MovesDownCond : std_logic_vector(ELEMENTS downto 0); + signal MovesDownCondRev : std_logic_vector(ELEMENTS downto 0); + signal MovesDownRev : std_logic_vector(ELEMENTS downto 0); begin -- next element (top) - ElementsDown(ELEMENTS) <= NewElement; + ElementsDown(ELEMENTS) <= NewElement; MovesDownCond(ELEMENTS) <= Insert; -- current element genElements : for I in ELEMENTS - 1 downto 0 generate constant INITIAL_ELEMENT : std_logic_vector(KEY_BITS - 1 downto 0) := std_logic_vector(to_unsigned(ELEMENTS-1 - i, KEY_BITS)); - signal Element_nxt : std_logic_vector(KEY_BITS - 1 downto 0); - signal Element_d : std_logic_vector(KEY_BITS - 1 downto 0) := INITIAL_ELEMENT; + signal Element_nxt : std_logic_vector(KEY_BITS - 1 downto 0); + signal Element_d : std_logic_vector(KEY_BITS - 1 downto 0) := INITIAL_ELEMENT; signal MoveDown : std_logic; - signal MoveUp : std_logic; + signal MoveUp : std_logic; begin -- local movements @@ -110,12 +107,12 @@ begin ElementsUp(I + 1) <= Element_d; -- multiplexer - Element_nxt <= mux(MovesDown(I+1), mux(MovesUp(i), Element_d, ElementsUp(I)), ElementsDown(I + 1)); + Element_nxt <= mux(MovesDown(I+1), mux(MovesUp(i), Element_d, ElementsUp(I)), ElementsDown(I + 1)); -- register - Element_d <= ffdre(q => Element_d, d => Element_nxt, rst => Reset, INIT => INITIAL_ELEMENT) when rising_edge(Clock); + Element_d <= ffdre(q => Element_d, d => Element_nxt, rst => Reset, INIT => INITIAL_ELEMENT) when rising_edge(Clock); - ElementsDown(I) <= Element_d; + ElementsDown(I) <= Element_d; end generate; -- MovesUp / MovesDown propagation @@ -124,17 +121,17 @@ begin MovesDownCondRev <= reverse(MovesDownCond); MovesDown <= reverse(MovesDownRev); - MovesUpProp: entity work.arith_prefix_and + MovesUpProp: entity work.arith_Prefix_And generic map ( - N => ELEMENTS+1) + BITS => ELEMENTS+1) port map ( -- Individual association of 'x' didn't work in QuestaSim x => MovesUpCond, y => MovesUp); - MovesDownProp: entity work.arith_prefix_and + MovesDownProp: entity work.arith_Prefix_And generic map ( - N => ELEMENTS+1) + BITS => ELEMENTS+1) port map ( -- Individual association of 'x' didn't work in QuestaSim x => MovesDownCondRev, @@ -142,8 +139,8 @@ begin -- previous element (bottom) NewElement <= KeyIn; - ElementsUp(0) <= KeyIn; - MovesUpCond(0) <= Free; + ElementsUp(0) <= KeyIn; + MovesUpCond(0) <= Free; KeyOut <= ElementsDown(0); diff --git a/src/sort/sort_LeastRecentlyUsed_List.vhdl b/src/sort/sort_LeastRecentlyUsed_List.vhdl new file mode 100644 index 000000000..cbd2cced2 --- /dev/null +++ b/src/sort/sort_LeastRecentlyUsed_List.vhdl @@ -0,0 +1,176 @@ +-- ============================================================================= +-- Authors: Patrick Lehmann +-- Martin Zabel +-- +-- Entity: List storing key-value pairs in recently-used order. +-- +-- Description: +-- ------------------------------------- +-- List storing ``(key, value)`` pairs. The least-recently inserted pair is +-- outputed on ``DataOut`` if ``Valid = '1'``. If ``Valid = '0'``, then the list +-- empty. +-- +-- The inputs ``Insert``, ``Remove``, ``DataIn``, and ``Reset`` are synchronous +-- to the rising-edge of the clock ``clock``. All control signals are high-active. +-- +-- Supported operations: +-- * **Insert:** Insert ``DataIn`` as recently used ``(key, value)`` pair. If +-- key is already within the list, then the corresponding value is updated and +-- the pair is moved to the recently used position. +-- * **Remove:** Remove ``(key, value)`` pair with the given key. The list is not +-- modified if key is not within the list. +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2015 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use work.config.all; +use work.utils.all; +use work.vectors.all; +use work.components.all; + + +entity sort_LeastRecentlyUsed_List is + generic ( + ELEMENTS : positive := 16; + KEY_BITS : positive := 4; + DATA_BITS : positive := 8; + INITIAL_ELEMENTS : T_SLM := (0 to 15 => (0 to 7 => '0')); + INITIAL_VALIDS : std_logic_vector := (0 to 15 => '0') + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + + Insert : in std_logic; + Remove : in std_logic; + DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); + + Valid : out std_logic; + DataOut : out std_logic_vector(DATA_BITS - 1 downto 0) + ); +end entity; + + +architecture rtl of sort_LeastRecentlyUsed_List is + subtype T_ELEMENT is std_logic_vector(DATA_BITS - 1 downto 0); + type T_ELEMENT_VECTOR is array (natural range <>) of T_ELEMENT; + + signal NewElementsUp : T_ELEMENT_VECTOR(ELEMENTS downto 0); + + signal ElementsUp : T_ELEMENT_VECTOR(ELEMENTS downto 0); + signal ElementsDown : T_ELEMENT_VECTOR(ELEMENTS downto 0); + signal ValidsUp : std_logic_vector(ELEMENTS downto 0); + signal ValidsDown : std_logic_vector(ELEMENTS downto 0); + + signal Unequal : std_logic_vector(ELEMENTS-1 downto 0); + + signal MovesDown : std_logic_vector(ELEMENTS downto 0); + signal MovesUp : std_logic_vector(ELEMENTS downto 0); + + signal DataOutDown : T_ELEMENT_VECTOR(ELEMENTS downto 0); + + signal MovesUpCond : std_logic_vector(ELEMENTS downto 0); + signal MovesDownCond : std_logic_vector(ELEMENTS downto 0); + signal MovesDownCondRev : std_logic_vector(ELEMENTS downto 0); + signal MovesDownRev : std_logic_vector(ELEMENTS downto 0); + +begin + -- next element (top) + ElementsDown(ELEMENTS) <= NewElementsUp(ELEMENTS); + ValidsDown(ELEMENTS) <= '1'; + + MovesDownCond(ELEMENTS) <= Insert; + + DataOutDown(ELEMENTS) <= (others => '-'); + + -- current element + genElements : for i in ELEMENTS - 1 downto 0 generate + constant INITIAL_ELEMENT : std_logic_vector(DATA_BITS - 1 downto 0) := get_row(INITIAL_ELEMENTS, I); + constant INITIAL_VALID : std_logic := INITIAL_VALIDS(I); + + signal Element_nxt : std_logic_vector(DATA_BITS - 1 downto 0); + signal Element_d : std_logic_vector(DATA_BITS - 1 downto 0) := INITIAL_ELEMENT; + signal Valid_nxt : std_logic; + signal Valid_d : std_logic := INITIAL_VALID; + + signal MoveDown : std_logic; + signal MoveUp : std_logic; + + begin + -- local movements + Unequal(I) <= not Valid_d or to_sl(Element_d(KEY_BITS - 1 downto 0) /= NewElementsUp(I)(KEY_BITS - 1 downto 0)); + + -- movements for the current element + MoveDown <= MovesDown(I + 1); + MoveUp <= MovesUp(I); + + -- passthrought all new + NewElementsUp(I + 1) <= NewElementsUp(I); + + ElementsUp(I + 1) <= Element_d; + ValidsUp(I + 1) <= Valid_d; + + -- multiplexer + Element_nxt <= mux(MoveDown, mux(MoveUp, Element_d, ElementsUp(I)), ElementsDown(I + 1)); + Valid_nxt <= mux(MoveDown, mux(MoveUp, Valid_d, ValidsUp(I) ), ValidsDown(I + 1) ); + + Element_d <= ffdre(q => Element_d, d => Element_nxt, rst => Reset, INIT => INITIAL_ELEMENT) when rising_edge(Clock); + Valid_d <= ffdre(q => Valid_d, d => Valid_nxt, rst => Reset, INIT => INITIAL_VALID) when rising_edge(Clock); + + ElementsDown(I) <= Element_d; + ValidsDown(I) <= Valid_d; + + -- not very efficient :-( + DataOutDown(I) <= Element_d when Valid_d = '1' else DataOutDown(I+1); + end generate; + + -- MovesUp / MovesDown propagation + MovesUpCond (ELEMENTS downto 1) <= UnEqual; + MovesDownCond(ELEMENTS-1 downto 0) <= UnEqual; + MovesDownCondRev <= reverse(MovesDownCond); + MovesDown <= reverse(MovesDownRev); + + MovesUpProp: entity work.arith_Prefix_And + generic map ( + BITS => ELEMENTS+1) + port map ( + -- Individual association of 'x' didn't work in QuestaSim + x => MovesUpCond, + y => MovesUp); + + MovesDownProp: entity work.arith_Prefix_And + generic map ( + BITS => ELEMENTS+1) + port map ( + -- Individual association of 'x' didn't work in QuestaSim + x => MovesDownCondRev, + y => MovesDownRev); + + -- previous element (buttom) + NewElementsUp(0) <= DataIn; + MovesUpCond(0) <= Remove and slv_nand(Unequal); + ElementsUp(0) <= DataIn; + ValidsUp(0) <= '0'; + + DataOut <= DataOutDown(0); + Valid <= slv_or(ValidsDown(ELEMENTS-1 downto 0)); +end architecture; diff --git a/src/sort/sort_lru_list.vhdl b/src/sort/sort_lru_list.vhdl deleted file mode 100644 index 9707976db..000000000 --- a/src/sort/sort_lru_list.vhdl +++ /dev/null @@ -1,176 +0,0 @@ --- ============================================================================= --- Authors: Patrick Lehmann --- Martin Zabel --- --- Entity: List storing key-value pairs in recently-used order. --- --- Description: --- ------------------------------------- --- List storing ``(key, value)`` pairs. The least-recently inserted pair is --- outputed on ``DataOut`` if ``Valid = '1'``. If ``Valid = '0'``, then the list --- empty. --- --- The inputs ``Insert``, ``Remove``, ``DataIn``, and ``Reset`` are synchronous --- to the rising-edge of the clock ``clock``. All control signals are high-active. --- --- Supported operations: --- * **Insert:** Insert ``DataIn`` as recently used ``(key, value)`` pair. If --- key is already within the list, then the corresponding value is updated and --- the pair is moved to the recently used position. --- * **Remove:** Remove ``(key, value)`` pair with the given key. The list is not --- modified if key is not within the list. --- --- License: --- ============================================================================= --- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; - -use work.config.all; -use work.utils.all; -use work.vectors.all; -use work.components.all; - - -entity sort_lru_list is - generic ( - ELEMENTS : positive := 16; - KEY_BITS : positive := 4; - DATA_BITS : positive := 8; - INITIAL_ELEMENTS : T_SLM := (0 to 15 => (0 to 7 => '0')); - INITIAL_VALIDS : std_logic_vector := (0 to 15 => '0') - ); - port ( - Clock : in std_logic; - Reset : in std_logic; - - Insert : in std_logic; - Remove : in std_logic; - DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); - - Valid : out std_logic; - DataOut : out std_logic_vector(DATA_BITS - 1 downto 0) - ); -end entity; - - -architecture rtl of sort_lru_list is - subtype T_ELEMENT is std_logic_vector(DATA_BITS - 1 downto 0); - type T_ELEMENT_VECTOR is array (natural range <>) of T_ELEMENT; - - signal NewElementsUp : T_ELEMENT_VECTOR(ELEMENTS downto 0); - - signal ElementsUp : T_ELEMENT_VECTOR(ELEMENTS downto 0); - signal ElementsDown : T_ELEMENT_VECTOR(ELEMENTS downto 0); - signal ValidsUp : std_logic_vector(ELEMENTS downto 0); - signal ValidsDown : std_logic_vector(ELEMENTS downto 0); - - signal Unequal : std_logic_vector(ELEMENTS-1 downto 0); - - signal MovesDown : std_logic_vector(ELEMENTS downto 0); - signal MovesUp : std_logic_vector(ELEMENTS downto 0); - - signal DataOutDown : T_ELEMENT_VECTOR(ELEMENTS downto 0); - - signal MovesUpCond : std_logic_vector(ELEMENTS downto 0); - signal MovesDownCond : std_logic_vector(ELEMENTS downto 0); - signal MovesDownCondRev : std_logic_vector(ELEMENTS downto 0); - signal MovesDownRev : std_logic_vector(ELEMENTS downto 0); - -begin - -- next element (top) - ElementsDown(ELEMENTS) <= NewElementsUp(ELEMENTS); - ValidsDown(ELEMENTS) <= '1'; - - MovesDownCond(ELEMENTS) <= Insert; - - DataOutDown(ELEMENTS) <= (others => '-'); - - -- current element - genElements : for i in ELEMENTS - 1 downto 0 generate - constant INITIAL_ELEMENT : std_logic_vector(DATA_BITS - 1 downto 0) := get_row(INITIAL_ELEMENTS, I); - constant INITIAL_VALID : std_logic := INITIAL_VALIDS(I); - - signal Element_nxt : std_logic_vector(DATA_BITS - 1 downto 0); - signal Element_d : std_logic_vector(DATA_BITS - 1 downto 0) := INITIAL_ELEMENT; - signal Valid_nxt : std_logic; - signal Valid_d : std_logic := INITIAL_VALID; - - signal MoveDown : std_logic; - signal MoveUp : std_logic; - - begin - -- local movements - Unequal(I) <= not Valid_d or to_sl(Element_d(KEY_BITS - 1 downto 0) /= NewElementsUp(I)(KEY_BITS - 1 downto 0)); - - -- movements for the current element - MoveDown <= MovesDown(I + 1); - MoveUp <= MovesUp(I); - - -- passthrought all new - NewElementsUp(I + 1) <= NewElementsUp(I); - - ElementsUp(I + 1) <= Element_d; - ValidsUp(I + 1) <= Valid_d; - - -- multiplexer - Element_nxt <= mux(MoveDown, mux(MoveUp, Element_d, ElementsUp(I)), ElementsDown(I + 1)); - Valid_nxt <= mux(MoveDown, mux(MoveUp, Valid_d, ValidsUp(I) ), ValidsDown(I + 1) ); - - Element_d <= ffdre(q => Element_d, d => Element_nxt, rst => Reset, INIT => INITIAL_ELEMENT) when rising_edge(Clock); - Valid_d <= ffdre(q => Valid_d, d => Valid_nxt, rst => Reset, INIT => INITIAL_VALID) when rising_edge(Clock); - - ElementsDown(I) <= Element_d; - ValidsDown(I) <= Valid_d; - - -- not very efficient :-( - DataOutDown(I) <= Element_d when Valid_d = '1' else DataOutDown(I+1); - end generate; - - -- MovesUp / MovesDown propagation - MovesUpCond (ELEMENTS downto 1) <= UnEqual; - MovesDownCond(ELEMENTS-1 downto 0) <= UnEqual; - MovesDownCondRev <= reverse(MovesDownCond); - MovesDown <= reverse(MovesDownRev); - - MovesUpProp: entity work.arith_prefix_and - generic map ( - N => ELEMENTS+1) - port map ( - -- Individual association of 'x' didn't work in QuestaSim - x => MovesUpCond, - y => MovesUp); - - MovesDownProp: entity work.arith_prefix_and - generic map ( - N => ELEMENTS+1) - port map ( - -- Individual association of 'x' didn't work in QuestaSim - x => MovesDownCondRev, - y => MovesDownRev); - - -- previous element (buttom) - NewElementsUp(0) <= DataIn; - MovesUpCond(0) <= Remove and slv_nand(Unequal); - ElementsUp(0) <= DataIn; - ValidsUp(0) <= '0'; - - DataOut <= DataOutDown(0); - Valid <= slv_or(ValidsDown(ELEMENTS-1 downto 0)); -end architecture; diff --git a/src/sort/sortnet/sortnet.pro b/src/sort/sortnet/build.pro similarity index 100% rename from src/sort/sortnet/sortnet.pro rename to src/sort/sortnet/build.pro diff --git a/src/sort/sortnet/sortnet.pkg.vhdl b/src/sort/sortnet/sortnet.pkg.vhdl index a93f4f565..e48e9860e 100644 --- a/src/sort/sortnet/sortnet.pkg.vhdl +++ b/src/sort/sortnet/sortnet.pkg.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: TODO +-- Entity: TODO -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -- use work.utils.all; -- use work.vectors.all; diff --git a/src/sort/sortnet/sortnet_BitonicSort.vhdl b/src/sort/sortnet/sortnet_BitonicSort.vhdl index 07138cf08..0a593d66a 100644 --- a/src/sort/sortnet/sortnet_BitonicSort.vhdl +++ b/src/sort/sortnet/sortnet_BitonicSort.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Sorting network: bitonic sort +-- Entity: Sorting network: bitonic sort -- -- Description: -- ------------------------------------- @@ -13,13 +13,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -41,83 +41,83 @@ use work.components.all; entity sortnet_BitonicSort is generic ( - INPUTS : positive := 32; -- input count - KEY_BITS : positive := 32; -- the first KEY_BITS of In_Data are used as a sorting critera (key) - DATA_BITS : positive := 64; -- inclusive KEY_BITS - META_BITS : natural := 2; -- additional bits, not sorted but delayed as long as In_Data - PIPELINE_STAGE_AFTER : natural := 2; -- add a pipline stage after n sorting stages - ADD_INPUT_REGISTERS : boolean := FALSE; -- - ADD_OUTPUT_REGISTERS : boolean := TRUE -- + INPUTS : positive := 32; -- input count + KEY_BITS : positive := 32; -- the first KEY_BITS of In_Data are used as a sorting critera (key) + DATA_BITS : positive := 64; -- inclusive KEY_BITS + META_BITS : natural := 2; -- additional bits, not sorted but delayed as long as In_Data + PIPELINE_STAGE_AFTER : natural := 2; -- add a pipline stage after n sorting stages + ADD_INPUT_REGISTERS : boolean := FALSE; -- + ADD_OUTPUT_REGISTERS : boolean := TRUE -- ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - Inverse : in std_logic := '0'; + Inverse : in std_logic := '0'; - In_Valid : in std_logic; - In_IsKey : in std_logic; - In_Data : in T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); - In_Meta : in std_logic_vector(META_BITS - 1 downto 0); + In_Valid : in std_logic; + In_IsKey : in std_logic; + In_Data : in T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); + In_Meta : in std_logic_vector(META_BITS - 1 downto 0); - Out_Valid : out std_logic; - Out_IsKey : out std_logic; - Out_Data : out T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); - Out_Meta : out std_logic_vector(META_BITS - 1 downto 0) + Out_Valid : out std_logic; + Out_IsKey : out std_logic; + Out_Data : out T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); + Out_Meta : out std_logic_vector(META_BITS - 1 downto 0) ); end entity; architecture rtl of sortnet_BitonicSort is - constant C_VERBOSE : boolean := POC_VERBOSE; + constant C_VERBOSE : boolean := POC_VERBOSE; - constant BLOCKS : positive := log2ceil(INPUTS); - constant STAGES : positive := triangularNumber(BLOCKS); - constant COMPARATORS : positive := STAGES * (INPUTS / 2); + constant BLOCKS : positive := log2ceil(INPUTS); + constant STAGES : positive := triangularNumber(BLOCKS); + constant COMPARATORS : positive := STAGES * (INPUTS / 2); - constant META_VALID_BIT : natural := 0; - constant META_ISKEY_BIT : natural := 1; - constant META_VECTOR_BITS : positive := META_BITS + 2; + constant META_VALID_BIT : natural := 0; + constant META_ISKEY_BIT : natural := 1; + constant META_VECTOR_BITS : positive := META_BITS + 2; - subtype T_META is std_logic_vector(META_VECTOR_BITS - 1 downto 0); - type T_META_VECTOR is array(natural range <>) of T_META; + subtype T_META is std_logic_vector(META_VECTOR_BITS - 1 downto 0); + type T_META_VECTOR is array(natural range <>) of T_META; - subtype T_DATA is std_logic_vector(DATA_BITS - 1 downto 0); - type T_DATA_VECTOR is array(natural range <>) of T_DATA; - type T_DATA_MATRIX is array(natural range <>) of T_DATA_VECTOR(INPUTS - 1 downto 0); + subtype T_DATA is std_logic_vector(DATA_BITS - 1 downto 0); + type T_DATA_VECTOR is array(natural range <>) of T_DATA; + type T_DATA_MATRIX is array(natural range <>) of T_DATA_VECTOR(INPUTS - 1 downto 0); function to_dv(slm : T_SLM) return T_DATA_VECTOR is - variable Result : T_DATA_VECTOR(slm'range(1)); + variable Result : T_DATA_VECTOR(slm'range(1)); begin for i in slm'range(1) loop for j in slm'high(2) downto slm'low(2) loop - Result(i)(j) := slm(i, j); + Result(i)(j) := slm(i, j); end loop; end loop; return Result; end function; function to_slm(dv : T_DATA_VECTOR) return T_SLM is - variable Result : T_SLM(dv'range, T_DATA'range); + variable Result : T_SLM(dv'range, T_DATA'range); begin for i in dv'range loop for j in T_DATA'range loop - Result(i, j) := dv(i)(j); + Result(i, j) := dv(i)(j); end loop; end loop; return Result; end function; - signal In_Valid_d : std_logic := '0'; - signal In_IsKey_d : std_logic := '0'; - signal In_Data_d : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0) := (others => (others => '0')); - signal In_Meta_d : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); + signal In_Valid_d : std_logic := '0'; + signal In_IsKey_d : std_logic := '0'; + signal In_Data_d : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0) := (others => (others => '0')); + signal In_Meta_d : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); - signal MetaVector : T_META_VECTOR(STAGES downto 0) := (others => (others => '0')); - signal DataMatrix : T_DATA_MATRIX(STAGES downto 0) := (others => (others => (others => '0'))); + signal MetaVector : T_META_VECTOR(STAGES downto 0) := (others => (others => '0')); + signal DataMatrix : T_DATA_MATRIX(STAGES downto 0) := (others => (others => (others => '0'))); - signal MetaOutputs_d : T_META := (others => '0'); - signal DataOutputs_d : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0) := (others => (others => '0')); + signal MetaOutputs_d : T_META := (others => '0'); + signal DataOutputs_d : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0) := (others => (others => '0')); begin assert (not C_VERBOSE) @@ -127,64 +127,64 @@ begin " META_BITS=" & integer'image(META_BITS) severity NOTE; - In_Valid_d <= In_Valid when registered(Clock, ADD_INPUT_REGISTERS); - In_IsKey_d <= In_IsKey when registered(Clock, ADD_INPUT_REGISTERS); - In_Data_d <= In_Data when registered(Clock, ADD_INPUT_REGISTERS); - In_Meta_d <= In_Meta when registered(Clock, ADD_INPUT_REGISTERS); + In_Valid_d <= In_Valid when registered(Clock, ADD_INPUT_REGISTERS); + In_IsKey_d <= In_IsKey when registered(Clock, ADD_INPUT_REGISTERS); + In_Data_d <= In_Data when registered(Clock, ADD_INPUT_REGISTERS); + In_Meta_d <= In_Meta when registered(Clock, ADD_INPUT_REGISTERS); - DataMatrix(0) <= to_dv(In_Data_d); - MetaVector(0)(META_VALID_BIT) <= In_Valid_d; - MetaVector(0)(META_ISKEY_BIT) <= In_IsKey_d; - MetaVector(0)(META_VECTOR_BITS - 1 downto META_VECTOR_BITS - META_BITS) <= In_Meta_d; + DataMatrix(0) <= to_dv(In_Data_d); + MetaVector(0)(META_VALID_BIT) <= In_Valid_d; + MetaVector(0)(META_ISKEY_BIT) <= In_IsKey_d; + MetaVector(0)(META_VECTOR_BITS - 1 downto META_VECTOR_BITS - META_BITS) <= In_Meta_d; genBlocks : for b in 0 to BLOCKS - 1 generate - constant START_DISTANCE : positive := 2**b; + constant START_DISTANCE : positive := 2**b; begin genStage : for s in 0 to b generate - constant STAGE_INDEX : natural := triangularNumber(b) + s; - constant DISTANCE : positive := 2**(b - s); - constant GROUPS : positive := INPUTS / (DISTANCE * 2); - constant INSERT_PIPELINE_REGISTER : boolean := (PIPELINE_STAGE_AFTER /= 0) and (STAGE_INDEX mod PIPELINE_STAGE_AFTER = 0); + constant STAGE_INDEX : natural := triangularNumber(b) + s; + constant DISTANCE : positive := 2**(b - s); + constant GROUPS : positive := INPUTS / (DISTANCE * 2); + constant INSERT_PIPELINE_REGISTER : boolean := (PIPELINE_STAGE_AFTER /= 0) and (STAGE_INDEX mod PIPELINE_STAGE_AFTER = 0); begin - MetaVector(STAGE_INDEX + 1) <= MetaVector(STAGE_INDEX) when registered(Clock, INSERT_PIPELINE_REGISTER); + MetaVector(STAGE_INDEX + 1) <= MetaVector(STAGE_INDEX) when registered(Clock, INSERT_PIPELINE_REGISTER); genGroups : for g in 0 to GROUPS - 1 generate - constant INV : std_logic := to_sl((g / (2 ** s) mod 2 = 1)); + constant INV : std_logic := to_sl((g / (2 ** s) mod 2 = 1)); begin genLoop : for l in 0 to DISTANCE - 1 generate - constant SRC0 : natural := g * (DISTANCE * 2) + l; - constant SRC1 : natural := SRC0 + DISTANCE; + constant SRC0 : natural := g * (DISTANCE * 2) + l; + constant SRC1 : natural := SRC0 + DISTANCE; - signal Greater : std_logic; - signal Switch_d : std_logic; - signal Switch_en : std_logic; - signal Switch_r : std_logic := '0'; - signal Switch : std_logic; - signal NewData0 : T_DATA; - signal NewData1 : T_DATA; + signal Greater : std_logic; + signal Switch_d : std_logic; + signal Switch_en : std_logic; + signal Switch_r : std_logic := '0'; + signal Switch : std_logic; + signal NewData0 : T_DATA; + signal NewData1 : T_DATA; begin - Greater <= to_sl(unsigned(DataMatrix(STAGE_INDEX)(SRC0)(KEY_BITS - 1 downto 0)) > unsigned(DataMatrix(STAGE_INDEX)(SRC1)(KEY_BITS - 1 downto 0))); - Switch_d <= Greater xor Inverse xor INV; - Switch_en <= MetaVector(STAGE_INDEX)(META_ISKEY_BIT) and MetaVector(STAGE_INDEX)(META_VALID_BIT); - Switch_r <= ffdre(q => Switch_r, d => Switch_d, en => Switch_en) when rising_edge(Clock); - Switch <= mux(Switch_en, Switch_r, Switch_d); + Greater <= to_sl(unsigned(DataMatrix(STAGE_INDEX)(SRC0)(KEY_BITS - 1 downto 0)) > unsigned(DataMatrix(STAGE_INDEX)(SRC1)(KEY_BITS - 1 downto 0))); + Switch_d <= Greater xor Inverse xor INV; + Switch_en <= MetaVector(STAGE_INDEX)(META_ISKEY_BIT) and MetaVector(STAGE_INDEX)(META_VALID_BIT); + Switch_r <= ffdre(q => Switch_r, d => Switch_d, en => Switch_en) when rising_edge(Clock); + Switch <= mux(Switch_en, Switch_r, Switch_d); - NewData0 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC0), DataMatrix(STAGE_INDEX)(SRC1)); - NewData1 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC1), DataMatrix(STAGE_INDEX)(SRC0)); + NewData0 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC0), DataMatrix(STAGE_INDEX)(SRC1)); + NewData1 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC1), DataMatrix(STAGE_INDEX)(SRC0)); - DataMatrix(STAGE_INDEX + 1)(SRC0) <= NewData0 when registered(Clock, INSERT_PIPELINE_REGISTER); - DataMatrix(STAGE_INDEX + 1)(SRC1) <= NewData1 when registered(Clock, INSERT_PIPELINE_REGISTER); + DataMatrix(STAGE_INDEX + 1)(SRC0) <= NewData0 when registered(Clock, INSERT_PIPELINE_REGISTER); + DataMatrix(STAGE_INDEX + 1)(SRC1) <= NewData1 when registered(Clock, INSERT_PIPELINE_REGISTER); end generate; end generate; end generate; end generate; - MetaOutputs_d <= MetaVector(STAGES) when registered(Clock, ADD_OUTPUT_REGISTERS); - DataOutputs_d <= to_slm(DataMatrix(STAGES)) when registered(Clock, ADD_OUTPUT_REGISTERS); + MetaOutputs_d <= MetaVector(STAGES) when registered(Clock, ADD_OUTPUT_REGISTERS); + DataOutputs_d <= to_slm(DataMatrix(STAGES)) when registered(Clock, ADD_OUTPUT_REGISTERS); - Out_Valid <= MetaOutputs_d(META_VALID_BIT); - Out_IsKey <= MetaOutputs_d(META_ISKEY_BIT); - Out_Data <= DataOutputs_d; - Out_Meta <= MetaOutputs_d(META_VECTOR_BITS - 1 downto META_VECTOR_BITS - META_BITS); + Out_Valid <= MetaOutputs_d(META_VALID_BIT); + Out_IsKey <= MetaOutputs_d(META_ISKEY_BIT); + Out_Data <= DataOutputs_d; + Out_Meta <= MetaOutputs_d(META_VECTOR_BITS - 1 downto META_VECTOR_BITS - META_BITS); end architecture; diff --git a/src/sort/sortnet/sortnet_MergeSort_Streamed.vhdl b/src/sort/sortnet/sortnet_MergeSort_Streamed.vhdl index 52f6ada5f..042b84f56 100644 --- a/src/sort/sortnet/sortnet_MergeSort_Streamed.vhdl +++ b/src/sort/sortnet/sortnet_MergeSort_Streamed.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Sorting Network: Streaming MergeSort +-- Entity: Sorting Network: Streaming MergeSort -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; @@ -36,248 +36,248 @@ use work.components.all; entity sortnet_MergeSort_Streamed is generic ( - FIFO_DEPTH : positive := 32; - KEY_BITS : positive := 32; - DATA_BITS : positive := 32 + FIFO_DEPTH : positive := 32; + KEY_BITS : positive := 32; + DATA_BITS : positive := 32 ); port ( - Clock : in std_logic; - Reset : in std_logic; - - Inverse : in std_logic := '0'; - - In_Valid : in std_logic; - In_Data : in std_logic_vector(DATA_BITS - 1 downto 0); - In_SOF : in std_logic; - In_IsKey : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - - Out_Sync : out std_logic; - Out_Valid : out std_logic; - Out_Data : out std_logic_vector(DATA_BITS - 1 downto 0); - Out_SOF : out std_logic; - Out_IsKey : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic + Clock : in std_logic; + Reset : in std_logic; + + Inverse : in std_logic := '0'; + + In_Valid : in std_logic; + In_Data : in std_logic_vector(DATA_BITS - 1 downto 0); + In_SOF : in std_logic; + In_IsKey : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + + Out_Sync : out std_logic; + Out_Valid : out std_logic; + Out_Data : out std_logic_vector(DATA_BITS - 1 downto 0); + Out_SOF : out std_logic; + Out_IsKey : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic ); end entity; architecture rtl of sortnet_MergeSort_Streamed is - constant DATA_SOF_BIT : natural := DATA_BITS + 0; - constant DATA_ISKEY_BIT : natural := DATA_BITS + 1; - constant DATA_EOF_BIT : natural := DATA_BITS + 2; - constant FIFO_BITS : positive := DATA_BITS + 3; + constant DATA_SOF_BIT : natural := DATA_BITS + 0; + constant DATA_ISKEY_BIT : natural := DATA_BITS + 1; + constant DATA_EOF_BIT : natural := DATA_BITS + 2; + constant FIFO_BITS : positive := DATA_BITS + 3; - subtype T_FIFO_DATA is std_logic_vector(FIFO_BITS - 1 downto 0); + subtype T_FIFO_DATA is std_logic_vector(FIFO_BITS - 1 downto 0); - signal FIFO_sel_r : std_logic := '0'; + signal FIFO_sel_r : std_logic := '0'; - signal FIFO_0_put : std_logic; - signal FIFO_0_DataIn : T_FIFO_DATA; - signal FIFO_0_Full : std_logic; - signal FIFO_0_got : std_logic; - signal FIFO_0_DataOut : T_FIFO_DATA; - signal FIFO_0_Valid : std_logic; + signal FIFO_0_put : std_logic; + signal FIFO_0_DataIn : T_FIFO_DATA; + signal FIFO_0_Full : std_logic; + signal FIFO_0_got : std_logic; + signal FIFO_0_DataOut : T_FIFO_DATA; + signal FIFO_0_Valid : std_logic; - signal FIFO_1_put : std_logic; - signal FIFO_1_DataIn : T_FIFO_DATA; - signal FIFO_1_Full : std_logic; - signal FIFO_1_got : std_logic; - signal FIFO_1_DataOut : T_FIFO_DATA; - signal FIFO_1_Valid : std_logic; + signal FIFO_1_put : std_logic; + signal FIFO_1_DataIn : T_FIFO_DATA; + signal FIFO_1_Full : std_logic; + signal FIFO_1_got : std_logic; + signal FIFO_1_DataOut : T_FIFO_DATA; + signal FIFO_1_Valid : std_logic; - signal Greater : std_logic; - signal Switch_d : std_logic; - signal Switch_en : std_logic; - signal Switch_r : std_logic := '0'; - signal Switch : std_logic; + signal Greater : std_logic; + signal Switch_d : std_logic; + signal Switch_en : std_logic; + signal Switch_r : std_logic := '0'; + signal Switch : std_logic; type T_STATE is (ST_IDLE, ST_MERGE, ST_EMPTY_FIFO_0, ST_EMPTY_FIFO_1); - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; begin - FIFO_sel_r <= fftre(q => FIFO_sel_r, t => In_EOF, en => In_Valid, rst => Reset) when rising_edge(Clock); + FIFO_sel_r <= fftre(q => FIFO_sel_r, t => In_EOF, en => In_Valid, rst => Reset) when rising_edge(Clock); - FIFO_0_put <= In_Valid and not FIFO_sel_r; - FIFO_0_DataIn(In_Data'range) <= In_Data; - FIFO_0_DataIn(DATA_SOF_BIT) <= In_SOF; - FIFO_0_DataIn(DATA_ISKEY_BIT) <= In_IsKey; - FIFO_0_DataIn(DATA_EOF_BIT) <= In_EOF; + FIFO_0_put <= In_Valid and not FIFO_sel_r; + FIFO_0_DataIn(In_Data'range) <= In_Data; + FIFO_0_DataIn(DATA_SOF_BIT) <= In_SOF; + FIFO_0_DataIn(DATA_ISKEY_BIT) <= In_IsKey; + FIFO_0_DataIn(DATA_EOF_BIT) <= In_EOF; - FIFO_1_put <= In_Valid and FIFO_sel_r; - FIFO_1_DataIn(In_Data'range) <= In_Data; - FIFO_1_DataIn(DATA_SOF_BIT) <= In_SOF; - FIFO_1_DataIn(DATA_ISKEY_BIT) <= In_IsKey; - FIFO_1_DataIn(DATA_EOF_BIT) <= In_EOF; + FIFO_1_put <= In_Valid and FIFO_sel_r; + FIFO_1_DataIn(In_Data'range) <= In_Data; + FIFO_1_DataIn(DATA_SOF_BIT) <= In_SOF; + FIFO_1_DataIn(DATA_ISKEY_BIT) <= In_IsKey; + FIFO_1_DataIn(DATA_EOF_BIT) <= In_EOF; - In_Ack <= not mux(FIFO_sel_r, FIFO_0_Full, FIFO_1_Full); + In_Ack <= not mux(FIFO_sel_r, FIFO_0_Full, FIFO_1_Full); FIFO_0: entity work.fifo_cc_got generic map ( - D_BITS => FIFO_BITS, -- Data Width - MIN_DEPTH => FIFO_DEPTH, -- Minimum FIFO Depth - DATA_REG => FALSE, -- Store Data Content in Registers - STATE_REG => FALSE, -- Registered Full/Empty Indicators - OUTPUT_REG => FALSE -- Registered FIFO Output + DATA_BITS => FIFO_BITS, -- Data Width + MIN_DEPTH => FIFO_DEPTH, -- Minimum FIFO Depth + DATA_REG => FALSE, -- Store Data Content in Registers + STATE_REG => FALSE, -- Registered Full/Empty Indicators + OUTPUT_REG => FALSE -- Registered FIFO Output ) port map ( -- Global Reset and Clock - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Writing Interface - put => FIFO_0_put, - din => FIFO_0_DataIn, - full => FIFO_0_Full, + Put => FIFO_0_put, + DataIn => FIFO_0_DataIn, + Full => FIFO_0_Full, -- Reading Interface - got => FIFO_0_got, - dout => FIFO_0_DataOut, - valid => FIFO_0_Valid + Got => FIFO_0_got, + DataOut => FIFO_0_DataOut, + Valid => FIFO_0_Valid ); FIFO_1: entity work.fifo_cc_got generic map ( - D_BITS => FIFO_BITS, -- Data Width - MIN_DEPTH => FIFO_DEPTH, -- Minimum FIFO Depth - DATA_REG => FALSE, -- Store Data Content in Registers - STATE_REG => FALSE, -- Registered Full/Empty Indicators - OUTPUT_REG => FALSE -- Registered FIFO Output + DATA_BITS => FIFO_BITS, -- Data Width + MIN_DEPTH => FIFO_DEPTH, -- Minimum FIFO Depth + DATA_REG => FALSE, -- Store Data Content in Registers + STATE_REG => FALSE, -- Registered Full/Empty Indicators + OUTPUT_REG => FALSE -- Registered FIFO Output ) port map ( -- Global Reset and Clock - clk => Clock, - rst => Reset, + Clock => Clock, + Reset => Reset, -- Writing Interface - put => FIFO_1_put, - din => FIFO_1_DataIn, - full => FIFO_1_Full, + Put => FIFO_1_put, + DataIn => FIFO_1_DataIn, + Full => FIFO_1_Full, -- Reading Interface - got => FIFO_1_got, - dout => FIFO_1_DataOut, - valid => FIFO_1_Valid + Got => FIFO_1_got, + DataOut => FIFO_1_DataOut, + Valid => FIFO_1_Valid ); -- assert (((FIFO_0_DataOut(DATA_ISKEY_BIT) /= FIFO_1_DataOut(DATA_ISKEY_BIT)) and (FIFO_0_Valid = '1') and (FIFO_1_Valid = '1')) = FALSE) report "Both FIFOs must have a IsKey mark at the same position." severity ERROR; - Greater <= to_sl(unsigned(FIFO_0_DataOut(KEY_BITS - 1 downto 0)) > unsigned(FIFO_1_DataOut(KEY_BITS - 1 downto 0))); - Switch_d <= Greater xor Inverse; - Switch_r <= ffdre(q => Switch_r, d => Switch_d, en => Switch_en) when rising_edge(Clock); - Switch <= mux(Switch_en, Switch_r, Switch_d); + Greater <= to_sl(unsigned(FIFO_0_DataOut(KEY_BITS - 1 downto 0)) > unsigned(FIFO_1_DataOut(KEY_BITS - 1 downto 0))); + Switch_d <= Greater xor Inverse; + Switch_r <= ffdre(q => Switch_r, d => Switch_d, en => Switch_en) when rising_edge(Clock); + Switch <= mux(Switch_en, Switch_r, Switch_d); process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; process(State, FIFO_0_Valid, FIFO_0_DataOut, FIFO_1_Valid, FIFO_1_DataOut, Switch, Out_Ack) - variable IsKey : std_logic; - variable FIFO_0_SOF : std_logic; - variable FIFO_0_EOF : std_logic; - variable FIFO_1_SOF : std_logic; - variable FIFO_1_EOF : std_logic; + variable IsKey : std_logic; + variable FIFO_0_SOF : std_logic; + variable FIFO_0_EOF : std_logic; + variable FIFO_1_SOF : std_logic; + variable FIFO_1_EOF : std_logic; begin - IsKey := FIFO_0_DataOut(DATA_ISKEY_BIT); - FIFO_0_SOF := FIFO_0_DataOut(DATA_SOF_BIT); - FIFO_0_EOF := FIFO_0_DataOut(DATA_EOF_BIT); - FIFO_1_SOF := FIFO_1_DataOut(DATA_SOF_BIT); - FIFO_1_EOF := FIFO_1_DataOut(DATA_EOF_BIT); + IsKey := FIFO_0_DataOut(DATA_ISKEY_BIT); + FIFO_0_SOF := FIFO_0_DataOut(DATA_SOF_BIT); + FIFO_0_EOF := FIFO_0_DataOut(DATA_EOF_BIT); + FIFO_1_SOF := FIFO_1_DataOut(DATA_SOF_BIT); + FIFO_1_EOF := FIFO_1_DataOut(DATA_EOF_BIT); - NextState <= State; + NextState <= State; - FIFO_0_got <= '0'; - FIFO_1_got <= '0'; + FIFO_0_got <= '0'; + FIFO_1_got <= '0'; - Switch_en <= '0'; + Switch_en <= '0'; - Out_Valid <= '0'; - Out_IsKey <= IsKey; - Out_Data <= FIFO_0_DataOut(DATA_BITS - 1 downto 0); - Out_SOF <= '0'; - Out_EOF <= '0'; + Out_Valid <= '0'; + Out_IsKey <= IsKey; + Out_Data <= FIFO_0_DataOut(DATA_BITS - 1 downto 0); + Out_SOF <= '0'; + Out_EOF <= '0'; case State is when ST_IDLE => if ((FIFO_0_Valid and FIFO_1_Valid) = '1') then if ((FIFO_0_SOF and FIFO_1_SOF) = '1') then - Switch_en <= IsKey; - Out_Valid <= '1'; - Out_SOF <= '1'; + Switch_en <= IsKey; + Out_Valid <= '1'; + Out_SOF <= '1'; if (Switch = '0') then - FIFO_0_got <= Out_Ack; - Out_Data <= FIFO_0_DataOut(DATA_BITS - 1 downto 0); + FIFO_0_got <= Out_Ack; + Out_Data <= FIFO_0_DataOut(DATA_BITS - 1 downto 0); else - FIFO_1_got <= Out_Ack; - Out_Data <= FIFO_1_DataOut(DATA_BITS - 1 downto 0); + FIFO_1_got <= Out_Ack; + Out_Data <= FIFO_1_DataOut(DATA_BITS - 1 downto 0); end if; - NextState <= ST_MERGE; + NextState <= ST_MERGE; else - FIFO_0_got <= not FIFO_0_SOF; - FIFO_1_got <= not FIFO_1_SOF; + FIFO_0_got <= not FIFO_0_SOF; + FIFO_1_got <= not FIFO_1_SOF; end if; elsif (FIFO_0_Valid = '1') then - FIFO_0_got <= not FIFO_0_SOF; + FIFO_0_got <= not FIFO_0_SOF; elsif (FIFO_1_Valid = '1') then - FIFO_1_got <= not FIFO_1_SOF; + FIFO_1_got <= not FIFO_1_SOF; end if; when ST_MERGE => if ((FIFO_0_Valid and FIFO_1_Valid) = '1') then - Switch_en <= IsKey; + Switch_en <= IsKey; - Out_Valid <= '1'; + Out_Valid <= '1'; if (Switch = '0') then - FIFO_0_got <= Out_Ack; - Out_Data <= FIFO_0_DataOut(DATA_BITS - 1 downto 0); + FIFO_0_got <= Out_Ack; + Out_Data <= FIFO_0_DataOut(DATA_BITS - 1 downto 0); else - FIFO_1_got <= Out_Ack; - Out_Data <= FIFO_1_DataOut(DATA_BITS - 1 downto 0); + FIFO_1_got <= Out_Ack; + Out_Data <= FIFO_1_DataOut(DATA_BITS - 1 downto 0); end if; if (FIFO_0_EOF = '1') then - NextState <= ST_EMPTY_FIFO_1; + NextState <= ST_EMPTY_FIFO_1; elsif (FIFO_1_EOF = '1') then - NextState <= ST_EMPTY_FIFO_0; + NextState <= ST_EMPTY_FIFO_0; end if; end if; when ST_EMPTY_FIFO_0 => if (FIFO_0_Valid = '1') then - FIFO_0_got <= Out_Ack; - Switch_en <= IsKey; + FIFO_0_got <= Out_Ack; + Switch_en <= IsKey; - Out_Valid <= '1'; - Out_Data <= FIFO_0_DataOut(DATA_BITS - 1 downto 0); + Out_Valid <= '1'; + Out_Data <= FIFO_0_DataOut(DATA_BITS - 1 downto 0); if (FIFO_0_EOF = '1') then - Out_EOF <= '1'; - NextState <= ST_IDLE; + Out_EOF <= '1'; + NextState <= ST_IDLE; end if; end if; when ST_EMPTY_FIFO_1 => if (FIFO_1_Valid = '1') then - FIFO_1_got <= Out_Ack; - Switch_en <= IsKey; + FIFO_1_got <= Out_Ack; + Switch_en <= IsKey; - Out_Valid <= '1'; - Out_Data <= FIFO_1_DataOut(DATA_BITS - 1 downto 0); + Out_Valid <= '1'; + Out_Data <= FIFO_1_DataOut(DATA_BITS - 1 downto 0); if (FIFO_1_EOF = '1') then - Out_EOF <= '1'; - NextState <= ST_IDLE; + Out_EOF <= '1'; + NextState <= ST_IDLE; end if; end if; diff --git a/src/sort/sortnet/sortnet_OddEvenMergeSort.vhdl b/src/sort/sortnet/sortnet_OddEvenMergeSort.vhdl index 8b73a0a5f..6416269d1 100644 --- a/src/sort/sortnet/sortnet_OddEvenMergeSort.vhdl +++ b/src/sort/sortnet/sortnet_OddEvenMergeSort.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Sorting Network: Odd-Even-Merge-Sort +-- Entity: Sorting Network: Odd-Even-Merge-Sort -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.math.all; use work.config.all; @@ -38,82 +38,82 @@ use work.components.all; entity sortnet_OddEvenMergeSort is generic ( - INPUTS : positive := 128; -- input count - KEY_BITS : positive := 32; -- the first KEY_BITS of In_Data are used as a sorting critera (key) - DATA_BITS : positive := 32; -- inclusive KEY_BITS - META_BITS : natural := 2; -- additional bits, not sorted but delayed as long as In_Data - PIPELINE_STAGE_AFTER : natural := 2; -- add a pipline stage after n sorting stages - ADD_INPUT_REGISTERS : boolean := FALSE; -- - ADD_OUTPUT_REGISTERS : boolean := TRUE -- + INPUTS : positive := 128; -- input count + KEY_BITS : positive := 32; -- the first KEY_BITS of In_Data are used as a sorting critera (key) + DATA_BITS : positive := 32; -- inclusive KEY_BITS + META_BITS : natural := 2; -- additional bits, not sorted but delayed as long as In_Data + PIPELINE_STAGE_AFTER : natural := 2; -- add a pipline stage after n sorting stages + ADD_INPUT_REGISTERS : boolean := FALSE; -- + ADD_OUTPUT_REGISTERS : boolean := TRUE -- ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - Inverse : in std_logic := '0'; + Inverse : in std_logic := '0'; - In_Valid : in std_logic; - In_IsKey : in std_logic; - In_Data : in T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); - In_Meta : in std_logic_vector(META_BITS - 1 downto 0); + In_Valid : in std_logic; + In_IsKey : in std_logic; + In_Data : in T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); + In_Meta : in std_logic_vector(META_BITS - 1 downto 0); - Out_Valid : out std_logic; - Out_IsKey : out std_logic; - Out_Data : out T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); - Out_Meta : out std_logic_vector(META_BITS - 1 downto 0) + Out_Valid : out std_logic; + Out_IsKey : out std_logic; + Out_Data : out T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); + Out_Meta : out std_logic_vector(META_BITS - 1 downto 0) ); end entity; architecture rtl of sortnet_OddEvenMergeSort is - constant C_VERBOSE : boolean := POC_VERBOSE; + constant C_VERBOSE : boolean := POC_VERBOSE; - constant BLOCKS : positive := log2ceil(INPUTS); - constant STAGES : positive := triangularNumber(BLOCKS); + constant BLOCKS : positive := log2ceil(INPUTS); + constant STAGES : positive := triangularNumber(BLOCKS); - constant META_VALID_BIT : natural := 0; - constant META_ISKEY_BIT : natural := 1; - constant META_VECTOR_BITS : positive := META_BITS + 2; + constant META_VALID_BIT : natural := 0; + constant META_ISKEY_BIT : natural := 1; + constant META_VECTOR_BITS : positive := META_BITS + 2; - subtype T_META is std_logic_vector(META_VECTOR_BITS - 1 downto 0); - type T_META_VECTOR is array(natural range <>) of T_META; + subtype T_META is std_logic_vector(META_VECTOR_BITS - 1 downto 0); + type T_META_VECTOR is array(natural range <>) of T_META; - subtype T_DATA is std_logic_vector(DATA_BITS - 1 downto 0); - type T_DATA_VECTOR is array(natural range <>) of T_DATA; - type T_DATA_MATRIX is array(natural range <>) of T_DATA_VECTOR(INPUTS - 1 downto 0); + subtype T_DATA is std_logic_vector(DATA_BITS - 1 downto 0); + type T_DATA_VECTOR is array(natural range <>) of T_DATA; + type T_DATA_MATRIX is array(natural range <>) of T_DATA_VECTOR(INPUTS - 1 downto 0); function to_dv(slm : T_SLM) return T_DATA_VECTOR is - variable Result : T_DATA_VECTOR(slm'range(1)); + variable Result : T_DATA_VECTOR(slm'range(1)); begin for i in slm'range(1) loop for j in slm'high(2) downto slm'low(2) loop - Result(i)(j) := slm(i, j); + Result(i)(j) := slm(i, j); end loop; end loop; return Result; end function; function to_slm(dv : T_DATA_VECTOR) return T_SLM is - variable Result : T_SLM(dv'range, T_DATA'range); + variable Result : T_SLM(dv'range, T_DATA'range); begin for i in dv'range loop for j in T_DATA'range loop - Result(i, j) := dv(i)(j); + Result(i, j) := dv(i)(j); end loop; end loop; return Result; end function; - signal In_Valid_d : std_logic := '0'; - signal In_IsKey_d : std_logic := '0'; - signal In_Data_d : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0) := (others => (others => '0')); - signal In_Meta_d : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); + signal In_Valid_d : std_logic := '0'; + signal In_IsKey_d : std_logic := '0'; + signal In_Data_d : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0) := (others => (others => '0')); + signal In_Meta_d : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); - signal MetaVector : T_META_VECTOR(STAGES downto 0) := (others => (others => '0')); - signal DataMatrix : T_DATA_MATRIX(STAGES downto 0) := (others => (others => (others => '0'))); + signal MetaVector : T_META_VECTOR(STAGES downto 0) := (others => (others => '0')); + signal DataMatrix : T_DATA_MATRIX(STAGES downto 0) := (others => (others => (others => '0'))); - signal MetaOutputs_d : T_META := (others => '0'); - signal DataOutputs_d : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0) := (others => (others => '0')); + signal MetaOutputs_d : T_META := (others => '0'); + signal DataOutputs_d : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0) := (others => (others => '0')); begin assert (not C_VERBOSE) @@ -123,79 +123,79 @@ begin " META_BITS=" & integer'image(META_BITS) severity NOTE; - In_Valid_d <= In_Valid when registered(Clock, ADD_INPUT_REGISTERS); - In_IsKey_d <= In_IsKey when registered(Clock, ADD_INPUT_REGISTERS); - In_Data_d <= In_Data when registered(Clock, ADD_INPUT_REGISTERS); - In_Meta_d <= In_Meta when registered(Clock, ADD_INPUT_REGISTERS); + In_Valid_d <= In_Valid when registered(Clock, ADD_INPUT_REGISTERS); + In_IsKey_d <= In_IsKey when registered(Clock, ADD_INPUT_REGISTERS); + In_Data_d <= In_Data when registered(Clock, ADD_INPUT_REGISTERS); + In_Meta_d <= In_Meta when registered(Clock, ADD_INPUT_REGISTERS); - DataMatrix(0) <= to_dv(In_Data_d); - MetaVector(0)(META_VALID_BIT) <= In_Valid_d; - MetaVector(0)(META_ISKEY_BIT) <= In_IsKey_d; - MetaVector(0)(META_VECTOR_BITS - 1 downto META_VECTOR_BITS - META_BITS) <= In_Meta_d; + DataMatrix(0) <= to_dv(In_Data_d); + MetaVector(0)(META_VALID_BIT) <= In_Valid_d; + MetaVector(0)(META_ISKEY_BIT) <= In_IsKey_d; + MetaVector(0)(META_VECTOR_BITS - 1 downto META_VECTOR_BITS - META_BITS) <= In_Meta_d; - genBlocks : for b in 0 to BLOCKS - 1 generate - constant GROUPS : positive := 2 ** (BLOCKS - b - 1); + genBlocks : for b in 0 to BLOCKS - 1 generate + constant GROUPS : positive := 2 ** (BLOCKS - b - 1); begin genGroups : for g in 0 to GROUPS - 1 generate genStages : for s in 0 to b generate - constant DISTANCE : positive := 2 ** (b-s); - constant STAGE_INDEX : natural := triangularNumber(b) + s; - constant INSERT_PIPELINE_REGISTER : boolean := (PIPELINE_STAGE_AFTER /= 0) and (STAGE_INDEX mod PIPELINE_STAGE_AFTER = 0); - constant START_INDEX : natural := ite((s = 0), 0, DISTANCE); - constant END_INDEX : natural := ((2**(b+1))-DISTANCE-START_INDEX-1) / (2 * DISTANCE); - constant SRC : natural := g * (INPUTS / GROUPS); + constant DISTANCE : positive := 2 ** (b-s); + constant STAGE_INDEX : natural := triangularNumber(b) + s; + constant INSERT_PIPELINE_REGISTER : boolean := (PIPELINE_STAGE_AFTER /= 0) and (STAGE_INDEX mod PIPELINE_STAGE_AFTER = 0); + constant START_INDEX : natural := ite((s = 0), 0, DISTANCE); + constant END_INDEX : natural := ((2**(b+1))-DISTANCE-START_INDEX-1) / (2 * DISTANCE); + constant SRC : natural := g * (INPUTS / GROUPS); begin genMeta : if g = 0 generate - MetaVector(STAGE_INDEX + 1) <= MetaVector(STAGE_INDEX) when registered(Clock, INSERT_PIPELINE_REGISTER); + MetaVector(STAGE_INDEX + 1) <= MetaVector(STAGE_INDEX) when registered(Clock, INSERT_PIPELINE_REGISTER); end generate; genJ0 : for j in 0 to START_INDEX - 1 generate assert (not C_VERBOSE) report integer'image(STAGE_INDEX) & " passthrough: " & INTEGER'image(SRC + j) severity NOTE; - DataMatrix(STAGE_INDEX + 1)(SRC + j) <= DataMatrix(STAGE_INDEX)(SRC + j) when registered(Clock, INSERT_PIPELINE_REGISTER); + DataMatrix(STAGE_INDEX + 1)(SRC + j) <= DataMatrix(STAGE_INDEX)(SRC + j) when registered(Clock, INSERT_PIPELINE_REGISTER); end generate; genJ1 : for j in 0 to END_INDEX generate - constant K : natural := (j * 2 * DISTANCE) + START_INDEX; + constant K : natural := (j * 2 * DISTANCE) + START_INDEX; begin genLoop : for i in 0 to DISTANCE - 1 generate - constant SRC0 : natural := SRC + K + i; - constant SRC1 : natural := SRC0 + DISTANCE; - - signal Greater : std_logic; - signal Switch_d : std_logic; - signal Switch_en : std_logic; - signal Switch_r : std_logic := '0'; - signal Switch : std_logic; - signal NewData0 : T_DATA; - signal NewData1 : T_DATA; + constant SRC0 : natural := SRC + K + i; + constant SRC1 : natural := SRC0 + DISTANCE; + + signal Greater : std_logic; + signal Switch_d : std_logic; + signal Switch_en : std_logic; + signal Switch_r : std_logic := '0'; + signal Switch : std_logic; + signal NewData0 : T_DATA; + signal NewData1 : T_DATA; begin assert (not C_VERBOSE) report integer'image(STAGE_INDEX) & " compare: " & INTEGER'image(SRC0) & " <-> " & integer'image(SRC1) severity NOTE; - Greater <= to_sl(unsigned(DataMatrix(STAGE_INDEX)(SRC0)(KEY_BITS - 1 downto 0)) > unsigned(DataMatrix(STAGE_INDEX)(SRC1)(KEY_BITS - 1 downto 0))); - Switch_d <= Greater xor Inverse; - Switch_en <= MetaVector(STAGE_INDEX)(META_ISKEY_BIT) and MetaVector(STAGE_INDEX)(META_VALID_BIT); - Switch_r <= ffdre(q => Switch_r, d => Switch_d, en => Switch_en) when rising_edge(Clock); - Switch <= mux(Switch_en, Switch_r, Switch_d); + Greater <= to_sl(unsigned(DataMatrix(STAGE_INDEX)(SRC0)(KEY_BITS - 1 downto 0)) > unsigned(DataMatrix(STAGE_INDEX)(SRC1)(KEY_BITS - 1 downto 0))); + Switch_d <= Greater xor Inverse; + Switch_en <= MetaVector(STAGE_INDEX)(META_ISKEY_BIT) and MetaVector(STAGE_INDEX)(META_VALID_BIT); + Switch_r <= ffdre(q => Switch_r, d => Switch_d, en => Switch_en) when rising_edge(Clock); + Switch <= mux(Switch_en, Switch_r, Switch_d); - NewData0 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC0), DataMatrix(STAGE_INDEX)(SRC1)); - NewData1 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC1), DataMatrix(STAGE_INDEX)(SRC0)); + NewData0 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC0), DataMatrix(STAGE_INDEX)(SRC1)); + NewData1 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC1), DataMatrix(STAGE_INDEX)(SRC0)); - DataMatrix(STAGE_INDEX + 1)(SRC0) <= NewData0 when registered(Clock, INSERT_PIPELINE_REGISTER); - DataMatrix(STAGE_INDEX + 1)(SRC1) <= NewData1 when registered(Clock, INSERT_PIPELINE_REGISTER); + DataMatrix(STAGE_INDEX + 1)(SRC0) <= NewData0 when registered(Clock, INSERT_PIPELINE_REGISTER); + DataMatrix(STAGE_INDEX + 1)(SRC1) <= NewData1 when registered(Clock, INSERT_PIPELINE_REGISTER); end generate; end generate; genJ2 : for j in (((END_INDEX * 2 * DISTANCE) + START_INDEX) + 2*DISTANCE) to (INPUTS / GROUPS) - 1 generate assert (not C_VERBOSE) report integer'image(STAGE_INDEX) & " passthrough: " & INTEGER'image(SRC + j) severity NOTE; - DataMatrix(STAGE_INDEX + 1)(SRC + j) <= DataMatrix(STAGE_INDEX)(SRC + j) when registered(Clock, INSERT_PIPELINE_REGISTER); + DataMatrix(STAGE_INDEX + 1)(SRC + j) <= DataMatrix(STAGE_INDEX)(SRC + j) when registered(Clock, INSERT_PIPELINE_REGISTER); end generate; end generate; end generate; end generate; - MetaOutputs_d <= MetaVector(STAGES) when registered(Clock, ADD_OUTPUT_REGISTERS); - DataOutputs_d <= to_slm(DataMatrix(STAGES)) when registered(Clock, ADD_OUTPUT_REGISTERS); + MetaOutputs_d <= MetaVector(STAGES) when registered(Clock, ADD_OUTPUT_REGISTERS); + DataOutputs_d <= to_slm(DataMatrix(STAGES)) when registered(Clock, ADD_OUTPUT_REGISTERS); - Out_Valid <= MetaOutputs_d(META_VALID_BIT); - Out_IsKey <= MetaOutputs_d(META_ISKEY_BIT); - Out_Data <= DataOutputs_d; - Out_Meta <= MetaOutputs_d(META_VECTOR_BITS - 1 downto META_VECTOR_BITS - META_BITS); + Out_Valid <= MetaOutputs_d(META_VALID_BIT); + Out_IsKey <= MetaOutputs_d(META_ISKEY_BIT); + Out_Data <= DataOutputs_d; + Out_Meta <= MetaOutputs_d(META_VECTOR_BITS - 1 downto META_VECTOR_BITS - META_BITS); end architecture; diff --git a/src/sort/sortnet/sortnet_OddEvenSort.vhdl b/src/sort/sortnet/sortnet_OddEvenSort.vhdl index 660514d2e..9fb342cf2 100644 --- a/src/sort/sortnet/sortnet_OddEvenSort.vhdl +++ b/src/sort/sortnet/sortnet_OddEvenSort.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Sorting Network: Odd-Even-Sort (Transposition) +-- Entity: Sorting Network: Odd-Even-Sort (Transposition) -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -37,82 +37,82 @@ use work.components.all; entity sortnet_OddEvenSort is generic ( - INPUTS : positive := 8; -- input count - KEY_BITS : positive := 32; -- the first KEY_BITS of In_Data are used as a sorting critera (key) - DATA_BITS : positive := 32; -- inclusive KEY_BITS - META_BITS : natural := 2; -- additional bits, not sorted but delayed as long as In_Data - PIPELINE_STAGE_AFTER : natural := 2; -- add a pipline stage after n sorting stages - ADD_INPUT_REGISTERS : boolean := FALSE; -- - ADD_OUTPUT_REGISTERS : boolean := TRUE -- + INPUTS : positive := 8; -- input count + KEY_BITS : positive := 32; -- the first KEY_BITS of In_Data are used as a sorting critera (key) + DATA_BITS : positive := 32; -- inclusive KEY_BITS + META_BITS : natural := 2; -- additional bits, not sorted but delayed as long as In_Data + PIPELINE_STAGE_AFTER : natural := 2; -- add a pipline stage after n sorting stages + ADD_INPUT_REGISTERS : boolean := FALSE; -- + ADD_OUTPUT_REGISTERS : boolean := TRUE -- ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; - Inverse : in std_logic := '0'; + Inverse : in std_logic := '0'; - In_Valid : in std_logic; - In_IsKey : in std_logic; - In_Data : in T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); - In_Meta : in std_logic_vector(META_BITS - 1 downto 0); + In_Valid : in std_logic; + In_IsKey : in std_logic; + In_Data : in T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); + In_Meta : in std_logic_vector(META_BITS - 1 downto 0); - Out_Valid : out std_logic; - Out_IsKey : out std_logic; - Out_Data : out T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); - Out_Meta : out std_logic_vector(META_BITS - 1 downto 0) + Out_Valid : out std_logic; + Out_IsKey : out std_logic; + Out_Data : out T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); + Out_Meta : out std_logic_vector(META_BITS - 1 downto 0) ); end entity; architecture rtl of sortnet_OddEvenSort is - constant C_VERBOSE : boolean := POC_VERBOSE; + constant C_VERBOSE : boolean := POC_VERBOSE; - constant STAGES : positive := INPUTS; - constant DELAY : positive := (STAGES / PIPELINE_STAGE_AFTER) + ite(ADD_INPUT_REGISTERS, 1, 0) + ite(ADD_OUTPUT_REGISTERS, 1, 0); + constant STAGES : positive := INPUTS; + constant DELAY : positive := (STAGES / PIPELINE_STAGE_AFTER) + ite(ADD_INPUT_REGISTERS, 1, 0) + ite(ADD_OUTPUT_REGISTERS, 1, 0); - constant META_VALID_BIT : natural := 0; - constant META_ISKEY_BIT : natural := 1; - constant META_VECTOR_BITS : positive := META_BITS + 2; + constant META_VALID_BIT : natural := 0; + constant META_ISKEY_BIT : natural := 1; + constant META_VECTOR_BITS : positive := META_BITS + 2; - subtype T_META is std_logic_vector(META_VECTOR_BITS - 1 downto 0); - type T_META_VECTOR is array(natural range <>) of T_META; + subtype T_META is std_logic_vector(META_VECTOR_BITS - 1 downto 0); + type T_META_VECTOR is array(natural range <>) of T_META; - subtype T_DATA is std_logic_vector(DATA_BITS - 1 downto 0); - type T_DATA_VECTOR is array(natural range <>) of T_DATA; - type T_DATA_MATRIX is array(natural range <>) of T_DATA_VECTOR(INPUTS - 1 downto 0); + subtype T_DATA is std_logic_vector(DATA_BITS - 1 downto 0); + type T_DATA_VECTOR is array(natural range <>) of T_DATA; + type T_DATA_MATRIX is array(natural range <>) of T_DATA_VECTOR(INPUTS - 1 downto 0); function to_dv(slm : T_SLM) return T_DATA_VECTOR is - variable Result : T_DATA_VECTOR(slm'range(1)); + variable Result : T_DATA_VECTOR(slm'range(1)); begin for i in slm'range(1) loop for j in slm'high(2) downto slm'low(2) loop - Result(i)(j) := slm(i, j); + Result(i)(j) := slm(i, j); end loop; end loop; return Result; end function; function to_slm(dv : T_DATA_VECTOR) return T_SLM is - variable Result : T_SLM(dv'range, T_DATA'range); + variable Result : T_SLM(dv'range, T_DATA'range); begin for i in dv'range loop for j in T_DATA'range loop - Result(i, j) := dv(i)(j); + Result(i, j) := dv(i)(j); end loop; end loop; return Result; end function; - signal In_Valid_d : std_logic := '0'; - signal In_IsKey_d : std_logic := '0'; - signal In_Data_d : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0) := (others => (others => '0')); - signal In_Meta_d : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); + signal In_Valid_d : std_logic := '0'; + signal In_IsKey_d : std_logic := '0'; + signal In_Data_d : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0) := (others => (others => '0')); + signal In_Meta_d : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); - signal MetaVector : T_META_VECTOR(STAGES downto 0) := (others => (others => '0')); - signal DataMatrix : T_DATA_MATRIX(STAGES downto 0) := (others => (others => (others => '0'))); + signal MetaVector : T_META_VECTOR(STAGES downto 0) := (others => (others => '0')); + signal DataMatrix : T_DATA_MATRIX(STAGES downto 0) := (others => (others => (others => '0'))); - signal MetaOutputs_d : T_META := (others => '0'); - signal DataOutputs_d : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0) := (others => (others => '0')); + signal MetaOutputs_d : T_META := (others => '0'); + signal DataOutputs_d : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0) := (others => (others => '0')); begin assert (not C_VERBOSE) @@ -122,90 +122,90 @@ begin " META_BITS=" & integer'image(META_BITS) severity NOTE; - In_Valid_d <= In_Valid when registered(Clock, ADD_INPUT_REGISTERS); - In_IsKey_d <= In_IsKey when registered(Clock, ADD_INPUT_REGISTERS); - In_Data_d <= In_Data when registered(Clock, ADD_INPUT_REGISTERS); - In_Meta_d <= In_Meta when registered(Clock, ADD_INPUT_REGISTERS); + In_Valid_d <= In_Valid when registered(Clock, ADD_INPUT_REGISTERS); + In_IsKey_d <= In_IsKey when registered(Clock, ADD_INPUT_REGISTERS); + In_Data_d <= In_Data when registered(Clock, ADD_INPUT_REGISTERS); + In_Meta_d <= In_Meta when registered(Clock, ADD_INPUT_REGISTERS); - DataMatrix(0) <= to_dv(In_Data_d); - MetaVector(0)(META_VALID_BIT) <= In_Valid_d; - MetaVector(0)(META_ISKEY_BIT) <= In_IsKey_d; - MetaVector(0)(META_VECTOR_BITS - 1 downto META_VECTOR_BITS - META_BITS) <= In_Meta_d; + DataMatrix(0) <= to_dv(In_Data_d); + MetaVector(0)(META_VALID_BIT) <= In_Valid_d; + MetaVector(0)(META_ISKEY_BIT) <= In_IsKey_d; + MetaVector(0)(META_VECTOR_BITS - 1 downto META_VECTOR_BITS - META_BITS) <= In_Meta_d; genStages : for stage in 0 to STAGES - 1 generate - constant STAGE_INDEX : natural := stage; - constant INSERT_PIPELINE_REGISTER : boolean := ((PIPELINE_STAGE_AFTER > 0) and (STAGE_INDEX mod PIPELINE_STAGE_AFTER = 0)); + constant STAGE_INDEX : natural := stage; + constant INSERT_PIPELINE_REGISTER : boolean := ((PIPELINE_STAGE_AFTER > 0) and (STAGE_INDEX mod PIPELINE_STAGE_AFTER = 0)); begin assert (not C_VERBOSE) report "STAGE_INDEX: " & integer'image(STAGE_INDEX) & " reg=" & BOOLEAN'image(INSERT_PIPELINE_REGISTER) severity NOTE; - MetaVector(STAGE_INDEX + 1) <= MetaVector(STAGE_INDEX) when registered(Clock, INSERT_PIPELINE_REGISTER); + MetaVector(STAGE_INDEX + 1) <= MetaVector(STAGE_INDEX) when registered(Clock, INSERT_PIPELINE_REGISTER); genEven : if (STAGE_INDEX mod 2 = 0) generate genEvenSwitch : for i in 0 to (INPUTS / 2) - 1 generate - constant SRC0 : natural := 2 * i; - constant SRC1 : natural := SRC0 + 1; - - signal Greater : std_logic; - signal Switch_d : std_logic; - signal Switch_en : std_logic; - signal Switch_r : std_logic := '0'; - signal Switch : std_logic; - signal NewData0 : T_DATA; - signal NewData1 : T_DATA; + constant SRC0 : natural := 2 * i; + constant SRC1 : natural := SRC0 + 1; + + signal Greater : std_logic; + signal Switch_d : std_logic; + signal Switch_en : std_logic; + signal Switch_r : std_logic := '0'; + signal Switch : std_logic; + signal NewData0 : T_DATA; + signal NewData1 : T_DATA; begin assert (not C_VERBOSE) report integer'image(STAGE_INDEX) & ": " & INTEGER'image(SRC0) & " <-> " & integer'image(SRC1) severity NOTE; - Greater <= to_sl(unsigned(DataMatrix(STAGE_INDEX)(SRC0)(KEY_BITS - 1 downto 0)) > unsigned(DataMatrix(STAGE_INDEX)(SRC1)(KEY_BITS - 1 downto 0))); - Switch_d <= Greater xor Inverse; - Switch_en <= MetaVector(STAGE_INDEX)(META_ISKEY_BIT) and MetaVector(STAGE_INDEX)(META_VALID_BIT); - Switch_r <= ffdre(q => Switch_r, d => Switch_d, en => Switch_en) when rising_edge(Clock); - Switch <= mux(Switch_en, Switch_r, Switch_d); + Greater <= to_sl(unsigned(DataMatrix(STAGE_INDEX)(SRC0)(KEY_BITS - 1 downto 0)) > unsigned(DataMatrix(STAGE_INDEX)(SRC1)(KEY_BITS - 1 downto 0))); + Switch_d <= Greater xor Inverse; + Switch_en <= MetaVector(STAGE_INDEX)(META_ISKEY_BIT) and MetaVector(STAGE_INDEX)(META_VALID_BIT); + Switch_r <= ffdre(q => Switch_r, d => Switch_d, en => Switch_en) when rising_edge(Clock); + Switch <= mux(Switch_en, Switch_r, Switch_d); - NewData0 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC0), DataMatrix(STAGE_INDEX)(SRC1)); - NewData1 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC1), DataMatrix(STAGE_INDEX)(SRC0)); + NewData0 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC0), DataMatrix(STAGE_INDEX)(SRC1)); + NewData1 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC1), DataMatrix(STAGE_INDEX)(SRC0)); - DataMatrix(STAGE_INDEX + 1)(SRC0) <= NewData0 when registered(Clock, INSERT_PIPELINE_REGISTER); - DataMatrix(STAGE_INDEX + 1)(SRC1) <= NewData1 when registered(Clock, INSERT_PIPELINE_REGISTER); + DataMatrix(STAGE_INDEX + 1)(SRC0) <= NewData0 when registered(Clock, INSERT_PIPELINE_REGISTER); + DataMatrix(STAGE_INDEX + 1)(SRC1) <= NewData1 when registered(Clock, INSERT_PIPELINE_REGISTER); end generate; end generate; genOdd : if (STAGE_INDEX mod 2 = 1) generate - DataMatrix(STAGE_INDEX + 1)(0) <= DataMatrix(STAGE_INDEX)(0) when registered(Clock, INSERT_PIPELINE_REGISTER); - DataMatrix(STAGE_INDEX + 1)(INPUTS - 1) <= DataMatrix(STAGE_INDEX)(INPUTS - 1) when registered(Clock, INSERT_PIPELINE_REGISTER); + DataMatrix(STAGE_INDEX + 1)(0) <= DataMatrix(STAGE_INDEX)(0) when registered(Clock, INSERT_PIPELINE_REGISTER); + DataMatrix(STAGE_INDEX + 1)(INPUTS - 1) <= DataMatrix(STAGE_INDEX)(INPUTS - 1) when registered(Clock, INSERT_PIPELINE_REGISTER); genOddSwitch : for i in 0 to ((INPUTS - 1) / 2) - 1 generate - constant SRC0 : natural := 2 * i + 1; - constant SRC1 : natural := SRC0 + 1; - - signal Greater : std_logic; - signal Switch_d : std_logic; - signal Switch_en : std_logic; - signal Switch_r : std_logic := '0'; - signal Switch : std_logic; - signal NewData0 : T_DATA; - signal NewData1 : T_DATA; + constant SRC0 : natural := 2 * i + 1; + constant SRC1 : natural := SRC0 + 1; + + signal Greater : std_logic; + signal Switch_d : std_logic; + signal Switch_en : std_logic; + signal Switch_r : std_logic := '0'; + signal Switch : std_logic; + signal NewData0 : T_DATA; + signal NewData1 : T_DATA; begin assert (not C_VERBOSE) report integer'image(STAGE_INDEX) & ": " & INTEGER'image(SRC0) & " <-> " & integer'image(SRC1) severity NOTE; - Greater <= to_sl(unsigned(DataMatrix(STAGE_INDEX)(SRC0)(KEY_BITS - 1 downto 0)) > unsigned(DataMatrix(STAGE_INDEX)(SRC1)(KEY_BITS - 1 downto 0))); - Switch_d <= Greater xor Inverse; - Switch_en <= MetaVector(STAGE_INDEX)(META_ISKEY_BIT) and MetaVector(STAGE_INDEX)(META_VALID_BIT); - Switch_r <= ffdre(q => Switch_r, d => Switch_d, en => Switch_en) when rising_edge(Clock); - Switch <= mux(Switch_en, Switch_r, Switch_d); + Greater <= to_sl(unsigned(DataMatrix(STAGE_INDEX)(SRC0)(KEY_BITS - 1 downto 0)) > unsigned(DataMatrix(STAGE_INDEX)(SRC1)(KEY_BITS - 1 downto 0))); + Switch_d <= Greater xor Inverse; + Switch_en <= MetaVector(STAGE_INDEX)(META_ISKEY_BIT) and MetaVector(STAGE_INDEX)(META_VALID_BIT); + Switch_r <= ffdre(q => Switch_r, d => Switch_d, en => Switch_en) when rising_edge(Clock); + Switch <= mux(Switch_en, Switch_r, Switch_d); - NewData0 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC0), DataMatrix(STAGE_INDEX)(SRC1)); - NewData1 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC1), DataMatrix(STAGE_INDEX)(SRC0)); + NewData0 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC0), DataMatrix(STAGE_INDEX)(SRC1)); + NewData1 <= mux(Switch, DataMatrix(STAGE_INDEX)(SRC1), DataMatrix(STAGE_INDEX)(SRC0)); - DataMatrix(STAGE_INDEX + 1)(SRC0) <= NewData0 when registered(Clock, INSERT_PIPELINE_REGISTER); - DataMatrix(STAGE_INDEX + 1)(SRC1) <= NewData1 when registered(Clock, INSERT_PIPELINE_REGISTER); + DataMatrix(STAGE_INDEX + 1)(SRC0) <= NewData0 when registered(Clock, INSERT_PIPELINE_REGISTER); + DataMatrix(STAGE_INDEX + 1)(SRC1) <= NewData1 when registered(Clock, INSERT_PIPELINE_REGISTER); end generate; end generate; end generate; - MetaOutputs_d <= MetaVector(STAGES) when registered(Clock, ADD_OUTPUT_REGISTERS); - DataOutputs_d <= to_slm(DataMatrix(STAGES)) when registered(Clock, ADD_OUTPUT_REGISTERS); + MetaOutputs_d <= MetaVector(STAGES) when registered(Clock, ADD_OUTPUT_REGISTERS); + DataOutputs_d <= to_slm(DataMatrix(STAGES)) when registered(Clock, ADD_OUTPUT_REGISTERS); - Out_Valid <= MetaOutputs_d(META_VALID_BIT); - Out_IsKey <= MetaOutputs_d(META_ISKEY_BIT); - Out_Data <= DataOutputs_d; - Out_Meta <= MetaOutputs_d(META_VECTOR_BITS - 1 downto META_VECTOR_BITS - META_BITS); + Out_Valid <= MetaOutputs_d(META_VALID_BIT); + Out_IsKey <= MetaOutputs_d(META_ISKEY_BIT); + Out_Data <= DataOutputs_d; + Out_Meta <= MetaOutputs_d(META_VECTOR_BITS - 1 downto META_VECTOR_BITS - META_BITS); end architecture; diff --git a/src/sort/sortnet/sortnet_Stream_Adapter.vhdl b/src/sort/sortnet/sortnet_Stream_Adapter.vhdl index 7f542c40a..c39a21690 100644 --- a/src/sort/sortnet/sortnet_Stream_Adapter.vhdl +++ b/src/sort/sortnet/sortnet_Stream_Adapter.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Sorting Network: Stream to sortnet adapter +-- Entity: Sorting Network: Stream to sortnet adapter -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; @@ -37,207 +37,207 @@ use work.sortnet.all; entity sortnet_Stream_Adapter is generic ( - STREAM_DATA_BITS : positive := 32; - STREAM_META_BITS : positive := 2; - SORTNET_IMPL : T_SORTNET_IMPL := SORT_SORTNET_IMPL_ODDEVEN_MERGESORT; - SORTNET_SIZE : positive := 32; - SORTNET_KEY_BITS : positive := 32; - SORTNET_DATA_BITS : natural := 32; - INVERSE : boolean := FALSE + STREAM_DATA_BITS : positive := 32; + STREAM_META_BITS : positive := 2; + SORTNET_IMPL : T_SORTNET_IMPL := SORT_SORTNET_IMPL_ODDEVEN_MERGESORT; + SORTNET_SIZE : positive := 32; + SORTNET_KEY_BITS : positive := 32; + SORTNET_DATA_BITS : natural := 32; + INVERSE : boolean := FALSE ); port ( - Clock : in std_logic; - Reset : in std_logic; - - In_Valid : in std_logic; - In_IsKey : in std_logic; - In_Data : in std_logic_vector(STREAM_DATA_BITS - 1 downto 0); - In_Meta : in std_logic_vector(STREAM_META_BITS - 1 downto 0); - In_Ack : out std_logic; - - Out_Valid : out std_logic; - Out_IsKey : out std_logic; - Out_Data : out std_logic_vector(STREAM_DATA_BITS - 1 downto 0); - Out_Meta : out std_logic_vector(STREAM_META_BITS - 1 downto 0); - Out_Ack : in std_logic + Clock : in std_logic; + Reset : in std_logic; + + In_Valid : in std_logic; + In_IsKey : in std_logic; + In_Data : in std_logic_vector(STREAM_DATA_BITS - 1 downto 0); + In_Meta : in std_logic_vector(STREAM_META_BITS - 1 downto 0); + In_Ack : out std_logic; + + Out_Valid : out std_logic; + Out_IsKey : out std_logic; + Out_Data : out std_logic_vector(STREAM_DATA_BITS - 1 downto 0); + Out_Meta : out std_logic_vector(STREAM_META_BITS - 1 downto 0); + Out_Ack : in std_logic ); end entity; architecture rtl of sortnet_Stream_Adapter is - constant C_VERBOSE : boolean := FALSE; + constant C_VERBOSE : boolean := FALSE; - constant GEARBOX_BITS : positive := SORTNET_SIZE * SORTNET_DATA_BITS; - constant PIPELINE_STAGE_AFTER : natural := 2; + constant GEARBOX_BITS : positive := SORTNET_SIZE * SORTNET_DATA_BITS; + constant PIPELINE_STAGE_AFTER : natural := 2; - constant META_ISKEY_BIT : natural := 0; - constant META_BITS : positive := STREAM_META_BITS + 1; + constant META_ISKEY_BIT : natural := 0; + constant META_BITS : positive := STREAM_META_BITS + 1; - signal MetaIn : std_logic_vector(META_BITS - 1 downto 0); + signal MetaIn : std_logic_vector(META_BITS - 1 downto 0); - signal gearup_Valid : std_logic; - signal gearup_Data : std_logic_vector(GEARBOX_BITS - 1 downto 0); - signal gearup_Meta : std_logic_vector(META_BITS - 1 downto 0); + signal gearup_Valid : std_logic; + signal gearup_Data : std_logic_vector(GEARBOX_BITS - 1 downto 0); + signal gearup_Meta : std_logic_vector(META_BITS - 1 downto 0); - signal sort_Valid : std_logic; - signal sort_IsKey : std_logic; - signal sort_Data : std_logic_vector(GEARBOX_BITS - 1 downto 0); - signal sort_Meta : std_logic_vector(STREAM_META_BITS - 1 downto 0); + signal sort_Valid : std_logic; + signal sort_IsKey : std_logic; + signal sort_Data : std_logic_vector(GEARBOX_BITS - 1 downto 0); + signal sort_Meta : std_logic_vector(STREAM_META_BITS - 1 downto 0); - signal geardown_nxt : std_logic; + signal geardown_nxt : std_logic; begin - In_Ack <= '1'; + In_Ack <= '1'; - MetaIn(META_ISKEY_BIT) <= In_IsKey; - MetaIn(META_BITS - 1 downto META_BITS - STREAM_META_BITS) <= In_Meta; + MetaIn(META_ISKEY_BIT) <= In_IsKey; + MetaIn(META_BITS - 1 downto META_BITS - STREAM_META_BITS) <= In_Meta; - gearup: entity work.gearbox_up_cc + gearup: entity work.gearbox_Up_cc generic map ( - INPUT_BITS => STREAM_DATA_BITS, - OUTPUT_BITS => GEARBOX_BITS, - META_BITS => META_BITS, - ADD_INPUT_REGISTERS => FALSE, - ADD_OUTPUT_REGISTERS => FALSE + INPUT_BITS => STREAM_DATA_BITS, + OUTPUT_BITS => GEARBOX_BITS, + META_BITS => META_BITS, + ADD_INPUT_REGISTERS => FALSE, + ADD_OUTPUT_REGISTERS => FALSE ) port map ( - Clock => Clock, - - In_Sync => '0', - In_Data => In_Data, - In_Meta => MetaIn, - In_Valid => In_Valid, - Out_Sync => open, - Out_Data => gearup_Data, - Out_Meta => gearup_Meta, - Out_Valid => gearup_Valid + Clock => Clock, + + In_Sync => '0', + In_Data => In_Data, + In_Meta => MetaIn, + In_Valid => In_Valid, + Out_Sync => open, + Out_Data => gearup_Data, + Out_Meta => gearup_Meta, + Out_Valid => gearup_Valid ); genOES : if SORTNET_IMPL = SORT_SORTNET_IMPL_ODDEVEN_SORT generate - signal DataInputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); - signal DataOutputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); + signal DataInputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); + signal DataOutputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); begin - DataInputMatrix <= to_slm(gearup_Data, SORTNET_SIZE, SORTNET_DATA_BITS); + DataInputMatrix <= to_slm(gearup_Data, SORTNET_SIZE, SORTNET_DATA_BITS); -- mux(gearup_Valid, (SORTNET_SIZE * SORTNET_DATA_BITS downto 1 => 'U'), gearup_Data) sort: entity work.sortnet_OddEvenSort generic map ( - INPUTS => SORTNET_SIZE, - KEY_BITS => SORTNET_KEY_BITS, - DATA_BITS => SORTNET_DATA_BITS, - META_BITS => STREAM_META_BITS, - PIPELINE_STAGE_AFTER => PIPELINE_STAGE_AFTER, - ADD_OUTPUT_REGISTERS => FALSE + INPUTS => SORTNET_SIZE, + KEY_BITS => SORTNET_KEY_BITS, + DATA_BITS => SORTNET_DATA_BITS, + META_BITS => STREAM_META_BITS, + PIPELINE_STAGE_AFTER => PIPELINE_STAGE_AFTER, + ADD_OUTPUT_REGISTERS => FALSE ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => gearup_Valid, - In_IsKey => gearup_Meta(META_ISKEY_BIT), - In_Data => DataInputMatrix, - In_Meta => gearup_Meta(META_BITS - 1 downto META_BITS - STREAM_META_BITS), - - Out_Valid => sort_Valid, - Out_IsKey => open, - Out_Data => DataOutputMatrix, - Out_Meta => sort_Meta + Clock => Clock, + Reset => Reset, + + In_Valid => gearup_Valid, + In_IsKey => gearup_Meta(META_ISKEY_BIT), + In_Data => DataInputMatrix, + In_Meta => gearup_Meta(META_BITS - 1 downto META_BITS - STREAM_META_BITS), + + Out_Valid => sort_Valid, + Out_IsKey => open, + Out_Data => DataOutputMatrix, + Out_Meta => sort_Meta ); - sort_Data <= to_slv(DataOutputMatrix); + sort_Data <= to_slv(DataOutputMatrix); end generate; genOEMS : if SORTNET_IMPL = SORT_SORTNET_IMPL_ODDEVEN_MERGESORT generate - signal DataInputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); - signal DataOutputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); + signal DataInputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); + signal DataOutputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); begin - DataInputMatrix <= to_slm(gearup_Data, SORTNET_SIZE, SORTNET_DATA_BITS); + DataInputMatrix <= to_slm(gearup_Data, SORTNET_SIZE, SORTNET_DATA_BITS); sort: entity work.sortnet_OddEvenMergeSort generic map ( - INPUTS => SORTNET_SIZE, - KEY_BITS => SORTNET_KEY_BITS, - DATA_BITS => SORTNET_DATA_BITS, - META_BITS => STREAM_META_BITS, - PIPELINE_STAGE_AFTER => PIPELINE_STAGE_AFTER, - ADD_OUTPUT_REGISTERS => FALSE + INPUTS => SORTNET_SIZE, + KEY_BITS => SORTNET_KEY_BITS, + DATA_BITS => SORTNET_DATA_BITS, + META_BITS => STREAM_META_BITS, + PIPELINE_STAGE_AFTER => PIPELINE_STAGE_AFTER, + ADD_OUTPUT_REGISTERS => FALSE ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => gearup_Valid, - In_IsKey => gearup_Meta(META_ISKEY_BIT), - In_Data => DataInputMatrix, - In_Meta => gearup_Meta(META_BITS - 1 downto META_BITS - STREAM_META_BITS), - - Out_Valid => sort_Valid, - Out_IsKey => open, - Out_Data => DataOutputMatrix, - Out_Meta => sort_Meta + Clock => Clock, + Reset => Reset, + + In_Valid => gearup_Valid, + In_IsKey => gearup_Meta(META_ISKEY_BIT), + In_Data => DataInputMatrix, + In_Meta => gearup_Meta(META_BITS - 1 downto META_BITS - STREAM_META_BITS), + + Out_Valid => sort_Valid, + Out_IsKey => open, + Out_Data => DataOutputMatrix, + Out_Meta => sort_Meta ); - sort_Data <= to_slv(DataOutputMatrix); + sort_Data <= to_slv(DataOutputMatrix); end generate; genBS : if SORTNET_IMPL = SORT_SORTNET_IMPL_BITONIC_SORT generate - signal DataInputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); - signal DataOutputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); + signal DataInputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); + signal DataOutputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); begin - DataInputMatrix <= to_slm(gearup_Data, SORTNET_SIZE, SORTNET_DATA_BITS); + DataInputMatrix <= to_slm(gearup_Data, SORTNET_SIZE, SORTNET_DATA_BITS); sort: entity work.sortnet_BitonicSort generic map ( - INPUTS => SORTNET_SIZE, - KEY_BITS => SORTNET_KEY_BITS, - DATA_BITS => SORTNET_DATA_BITS, - META_BITS => STREAM_META_BITS, - PIPELINE_STAGE_AFTER => PIPELINE_STAGE_AFTER, - ADD_OUTPUT_REGISTERS => FALSE + INPUTS => SORTNET_SIZE, + KEY_BITS => SORTNET_KEY_BITS, + DATA_BITS => SORTNET_DATA_BITS, + META_BITS => STREAM_META_BITS, + PIPELINE_STAGE_AFTER => PIPELINE_STAGE_AFTER, + ADD_OUTPUT_REGISTERS => FALSE ) port map ( - Clock => Clock, - Reset => Reset, - - In_Valid => gearup_Valid, - In_IsKey => gearup_Meta(META_ISKEY_BIT), - In_Data => DataInputMatrix, - In_Meta => gearup_Meta(META_BITS - 1 downto META_BITS - STREAM_META_BITS), - - Out_Valid => sort_Valid, - Out_IsKey => sort_IsKey, - Out_Data => DataOutputMatrix, - Out_Meta => sort_Meta + Clock => Clock, + Reset => Reset, + + In_Valid => gearup_Valid, + In_IsKey => gearup_Meta(META_ISKEY_BIT), + In_Data => DataInputMatrix, + In_Meta => gearup_Meta(META_BITS - 1 downto META_BITS - STREAM_META_BITS), + + Out_Valid => sort_Valid, + Out_IsKey => sort_IsKey, + Out_Data => DataOutputMatrix, + Out_Meta => sort_Meta ); - sort_Data <= to_slv(DataOutputMatrix); + sort_Data <= to_slv(DataOutputMatrix); end generate; - geardown: entity work.gearbox_down_cc + geardown: entity work.gearbox_Down_cc generic map ( - INPUT_BITS => GEARBOX_BITS, - OUTPUT_BITS => STREAM_DATA_BITS, - META_BITS => STREAM_META_BITS, - ADD_INPUT_REGISTERS => TRUE, - ADD_OUTPUT_REGISTERS => FALSE + INPUT_BITS => GEARBOX_BITS, + OUTPUT_BITS => STREAM_DATA_BITS, + META_BITS => STREAM_META_BITS, + ADD_INPUT_REGISTERS => TRUE, + ADD_OUTPUT_REGISTERS => FALSE ) port map ( - Clock => Clock, - - In_Sync => sort_Valid, - In_Valid => sort_Valid, - In_Data => sort_Data, - In_Meta => sort_Meta, - In_Next => geardown_nxt, - Out_Sync => open, - Out_Valid => Out_Valid, - Out_Data => Out_Data, - Out_Meta => Out_Meta + Clock => Clock, + + In_Sync => sort_Valid, + In_Valid => sort_Valid, + In_Data => sort_Data, + In_Meta => sort_Meta, + In_Next => geardown_nxt, + Out_Sync => open, + Out_Valid => Out_Valid, + Out_Data => Out_Data, + Out_Meta => Out_Meta ); end architecture; diff --git a/src/sort/sortnet/sortnet_Stream_Adapter2.vhdl b/src/sort/sortnet/sortnet_Stream_Adapter2.vhdl index 117da0ec9..8633cc11f 100644 --- a/src/sort/sortnet/sortnet_Stream_Adapter2.vhdl +++ b/src/sort/sortnet/sortnet_Stream_Adapter2.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Sorting Network: Stream to sortnet adapter +-- Entity: Sorting Network: Stream to sortnet adapter -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; @@ -37,345 +37,345 @@ use work.sortnet.all; entity sortnet_Stream_Adapter2 is generic ( - STREAM_DATA_BITS : positive := 32; - STREAM_META_BITS : positive := 2; - DATA_COLUMNS : positive := 2; - SORTNET_IMPL : T_SORTNET_IMPL := SORT_SORTNET_IMPL_ODDEVEN_MERGESORT; - SORTNET_SIZE : positive := 32; - SORTNET_KEY_BITS : positive := 32; - SORTNET_DATA_BITS : natural := 32; - SORTNET_REG_AFTER : natural := 2; - MERGENET_STAGES : positive := 2 + STREAM_DATA_BITS : positive := 32; + STREAM_META_BITS : positive := 2; + DATA_COLUMNS : positive := 2; + SORTNET_IMPL : T_SORTNET_IMPL := SORT_SORTNET_IMPL_ODDEVEN_MERGESORT; + SORTNET_SIZE : positive := 32; + SORTNET_KEY_BITS : positive := 32; + SORTNET_DATA_BITS : natural := 32; + SORTNET_REG_AFTER : natural := 2; + MERGENET_STAGES : positive := 2 ); port ( - Clock : in std_logic; - Reset : in std_logic; - - Inverse : in std_logic := '0'; - - In_Valid : in std_logic; - In_Data : in std_logic_vector(STREAM_DATA_BITS - 1 downto 0); - In_Meta : in std_logic_vector(STREAM_META_BITS - 1 downto 0); - In_SOF : in std_logic; - In_IsKey : in std_logic; - In_EOF : in std_logic; - In_Ack : out std_logic; - - Out_Valid : out std_logic; - Out_Data : out std_logic_vector(STREAM_DATA_BITS - 1 downto 0); - Out_Meta : out std_logic_vector(STREAM_META_BITS - 1 downto 0); - Out_SOF : out std_logic; - Out_IsKey : out std_logic; - Out_EOF : out std_logic; - Out_Ack : in std_logic + Clock : in std_logic; + Reset : in std_logic; + + Inverse : in std_logic := '0'; + + In_Valid : in std_logic; + In_Data : in std_logic_vector(STREAM_DATA_BITS - 1 downto 0); + In_Meta : in std_logic_vector(STREAM_META_BITS - 1 downto 0); + In_SOF : in std_logic; + In_IsKey : in std_logic; + In_EOF : in std_logic; + In_Ack : out std_logic; + + Out_Valid : out std_logic; + Out_Data : out std_logic_vector(STREAM_DATA_BITS - 1 downto 0); + Out_Meta : out std_logic_vector(STREAM_META_BITS - 1 downto 0); + Out_SOF : out std_logic; + Out_IsKey : out std_logic; + Out_EOF : out std_logic; + Out_Ack : in std_logic ); end entity; architecture rtl of sortnet_Stream_Adapter2 is - constant C_VERBOSE : boolean := FALSE; - - constant GEARBOX_BITS : positive := SORTNET_SIZE * SORTNET_DATA_BITS; - constant TRANSFORM_BITS : positive := DATA_COLUMNS * SORTNET_DATA_BITS; - constant MERGE_BITS : positive := TRANSFORM_BITS; - - constant META_ISKEY_BIT : natural := 0; - constant META_BITS : positive := STREAM_META_BITS + 1; - - signal Synchronized_r : std_logic := '0'; - - signal SyncIn : std_logic; - signal MetaIn : std_logic_vector(META_BITS - 1 downto 0); - - signal gearup_Sync : std_logic; - signal gearup_Valid : std_logic; - signal gearup_Data : std_logic_vector(GEARBOX_BITS - 1 downto 0); - signal gearup_Meta : std_logic_vector(META_BITS - 1 downto 0); - signal gearup_First : std_logic; - signal gearup_Last : std_logic; - - signal sort_Valid : std_logic; - signal sort_IsKey : std_logic; - signal sort_Data : std_logic_vector(GEARBOX_BITS - 1 downto 0); - signal sort_Meta : std_logic_vector(STREAM_META_BITS - 1 downto 0); - - signal transform_Valid : std_logic; - signal transform_Data : std_logic_vector(TRANSFORM_BITS - 1 downto 0); - signal transform_Meta : std_logic_vector(STREAM_META_BITS - 1 downto 0); - signal transform_SOF : std_logic; - signal transform_EOF : std_logic; - - signal merge_Sync : std_logic; - signal merge_Valid : std_logic; - signal merge_Data : std_logic_vector(MERGE_BITS - 1 downto 0); - signal merge_Meta : std_logic_vector(STREAM_META_BITS - 1 downto 0); - signal merge_SOF : std_logic; - signal merge_EOF : std_logic; - signal merge_Ack : std_logic; - - signal geardown_nxt : std_logic; - signal geardown_Meta : std_logic_vector(STREAM_META_BITS - 1 downto 0); - signal geardown_First : std_logic; - signal geardown_Last : std_logic; + constant C_VERBOSE : boolean := FALSE; + + constant GEARBOX_BITS : positive := SORTNET_SIZE * SORTNET_DATA_BITS; + constant TRANSFORM_BITS : positive := DATA_COLUMNS * SORTNET_DATA_BITS; + constant MERGE_BITS : positive := TRANSFORM_BITS; + + constant META_ISKEY_BIT : natural := 0; + constant META_BITS : positive := STREAM_META_BITS + 1; + + signal Synchronized_r : std_logic := '0'; + + signal SyncIn : std_logic; + signal MetaIn : std_logic_vector(META_BITS - 1 downto 0); + + signal gearup_Sync : std_logic; + signal gearup_Valid : std_logic; + signal gearup_Data : std_logic_vector(GEARBOX_BITS - 1 downto 0); + signal gearup_Meta : std_logic_vector(META_BITS - 1 downto 0); + signal gearup_First : std_logic; + signal gearup_Last : std_logic; + + signal sort_Valid : std_logic; + signal sort_IsKey : std_logic; + signal sort_Data : std_logic_vector(GEARBOX_BITS - 1 downto 0); + signal sort_Meta : std_logic_vector(STREAM_META_BITS - 1 downto 0); + + signal transform_Valid : std_logic; + signal transform_Data : std_logic_vector(TRANSFORM_BITS - 1 downto 0); + signal transform_Meta : std_logic_vector(STREAM_META_BITS - 1 downto 0); + signal transform_SOF : std_logic; + signal transform_EOF : std_logic; + + signal merge_Sync : std_logic; + signal merge_Valid : std_logic; + signal merge_Data : std_logic_vector(MERGE_BITS - 1 downto 0); + signal merge_Meta : std_logic_vector(STREAM_META_BITS - 1 downto 0); + signal merge_SOF : std_logic; + signal merge_EOF : std_logic; + signal merge_Ack : std_logic; + + signal geardown_nxt : std_logic; + signal geardown_Meta : std_logic_vector(STREAM_META_BITS - 1 downto 0); + signal geardown_First : std_logic; + signal geardown_Last : std_logic; begin - In_Ack <= '1'; + In_Ack <= '1'; - Synchronized_r <= ffrs(q => Synchronized_r, set => (In_SOF and In_Valid), rst => Reset) when rising_edge(Clock); + Synchronized_r <= ffrs(q => Synchronized_r, set => (In_SOF and In_Valid), rst => Reset) when rising_edge(Clock); - SyncIn <= (In_SOF and In_Valid) and not Synchronized_r; - MetaIn(META_ISKEY_BIT) <= In_IsKey; - MetaIn(META_BITS - 1 downto META_BITS - STREAM_META_BITS) <= In_Meta; + SyncIn <= (In_SOF and In_Valid) and not Synchronized_r; + MetaIn(META_ISKEY_BIT) <= In_IsKey; + MetaIn(META_BITS - 1 downto META_BITS - STREAM_META_BITS) <= In_Meta; - gearup: entity work.gearbox_up_cc + gearup: entity work.gearbox_Up_cc generic map ( - INPUT_BITS => STREAM_DATA_BITS, - OUTPUT_BITS => GEARBOX_BITS, - META_BITS => META_BITS, - ADD_INPUT_REGISTERS => TRUE, - ADD_OUTPUT_REGISTERS => FALSE + INPUT_BITS => STREAM_DATA_BITS, + OUTPUT_BITS => GEARBOX_BITS, + META_BITS => META_BITS, + ADD_INPUT_REGISTERS => TRUE, + ADD_OUTPUT_REGISTERS => FALSE ) port map ( - Clock => Clock, - - In_Sync => SyncIn, - In_Data => In_Data, - In_Meta => MetaIn, - In_Valid => In_Valid, - Out_Sync => gearup_Sync, - Out_Valid => gearup_Valid, - Out_Data => gearup_Data, - Out_Meta => gearup_Meta, - Out_First => gearup_First, - Out_Last => gearup_Last + Clock => Clock, + + In_Sync => SyncIn, + In_Data => In_Data, + In_Meta => MetaIn, + In_Valid => In_Valid, + Out_Sync => gearup_Sync, + Out_Valid => gearup_Valid, + Out_Data => gearup_Data, + Out_Meta => gearup_Meta, + Out_First => gearup_First, + Out_Last => gearup_Last ); genOES : if SORTNET_IMPL = SORT_SORTNET_IMPL_ODDEVEN_SORT generate - signal DataInputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); - signal DataOutputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); + signal DataInputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); + signal DataOutputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); begin - DataInputMatrix <= to_slm(gearup_Data, SORTNET_SIZE, SORTNET_DATA_BITS); - -- MetaInputMatric <= + DataInputMatrix <= to_slm(gearup_Data, SORTNET_SIZE, SORTNET_DATA_BITS); + -- MetaInputMatric <= -- mux(gearup_Valid, (SORTNET_SIZE * SORTNET_DATA_BITS downto 1 => 'U'), gearup_Data) sort: entity work.sortnet_OddEvenSort generic map ( - INPUTS => SORTNET_SIZE, - KEY_BITS => SORTNET_KEY_BITS, - DATA_BITS => SORTNET_DATA_BITS, - META_BITS => STREAM_META_BITS, - PIPELINE_STAGE_AFTER => SORTNET_REG_AFTER, - ADD_OUTPUT_REGISTERS => FALSE + INPUTS => SORTNET_SIZE, + KEY_BITS => SORTNET_KEY_BITS, + DATA_BITS => SORTNET_DATA_BITS, + META_BITS => STREAM_META_BITS, + PIPELINE_STAGE_AFTER => SORTNET_REG_AFTER, + ADD_OUTPUT_REGISTERS => FALSE ) port map ( - Clock => Clock, - Reset => Reset, + Clock => Clock, + Reset => Reset, - Inverse => Inverse, + Inverse => Inverse, - In_Valid => gearup_Valid, - In_IsKey => gearup_Meta(META_ISKEY_BIT), - In_Data => DataInputMatrix, - In_Meta => gearup_Meta(META_BITS - 1 downto META_BITS - STREAM_META_BITS), + In_Valid => gearup_Valid, + In_IsKey => gearup_Meta(META_ISKEY_BIT), + In_Data => DataInputMatrix, + In_Meta => gearup_Meta(META_BITS - 1 downto META_BITS - STREAM_META_BITS), - Out_Valid => sort_Valid, - Out_IsKey => sort_IsKey, - Out_Data => DataOutputMatrix, - Out_Meta => sort_Meta + Out_Valid => sort_Valid, + Out_IsKey => sort_IsKey, + Out_Data => DataOutputMatrix, + Out_Meta => sort_Meta ); - sort_Data <= to_slv(DataOutputMatrix); + sort_Data <= to_slv(DataOutputMatrix); end generate; genOEMS : if SORTNET_IMPL = SORT_SORTNET_IMPL_ODDEVEN_MERGESORT generate - signal DataInputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); - signal DataOutputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); + signal DataInputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); + signal DataOutputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); begin - DataInputMatrix <= to_slm(gearup_Data, SORTNET_SIZE, SORTNET_DATA_BITS); + DataInputMatrix <= to_slm(gearup_Data, SORTNET_SIZE, SORTNET_DATA_BITS); sort: entity work.sortnet_OddEvenMergeSort generic map ( - INPUTS => SORTNET_SIZE, - KEY_BITS => SORTNET_KEY_BITS, - DATA_BITS => SORTNET_DATA_BITS, - META_BITS => STREAM_META_BITS, - PIPELINE_STAGE_AFTER => SORTNET_REG_AFTER, - ADD_OUTPUT_REGISTERS => FALSE + INPUTS => SORTNET_SIZE, + KEY_BITS => SORTNET_KEY_BITS, + DATA_BITS => SORTNET_DATA_BITS, + META_BITS => STREAM_META_BITS, + PIPELINE_STAGE_AFTER => SORTNET_REG_AFTER, + ADD_OUTPUT_REGISTERS => FALSE ) port map ( - Clock => Clock, - Reset => Reset, + Clock => Clock, + Reset => Reset, - Inverse => Inverse, + Inverse => Inverse, - In_Valid => gearup_Valid, - In_IsKey => gearup_Meta(META_ISKEY_BIT), - In_Data => DataInputMatrix, - In_Meta => gearup_Meta(META_BITS - 1 downto META_BITS - STREAM_META_BITS), + In_Valid => gearup_Valid, + In_IsKey => gearup_Meta(META_ISKEY_BIT), + In_Data => DataInputMatrix, + In_Meta => gearup_Meta(META_BITS - 1 downto META_BITS - STREAM_META_BITS), - Out_Valid => sort_Valid, - Out_IsKey => sort_IsKey, - Out_Data => DataOutputMatrix, - Out_Meta => sort_Meta + Out_Valid => sort_Valid, + Out_IsKey => sort_IsKey, + Out_Data => DataOutputMatrix, + Out_Meta => sort_Meta ); - sort_Data <= to_slv(DataOutputMatrix); + sort_Data <= to_slv(DataOutputMatrix); end generate; genBS : if SORTNET_IMPL = SORT_SORTNET_IMPL_BITONIC_SORT generate - signal DataInputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); - signal DataOutputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); + signal DataInputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); + signal DataOutputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); begin - DataInputMatrix <= to_slm(gearup_Data, SORTNET_SIZE, SORTNET_DATA_BITS); + DataInputMatrix <= to_slm(gearup_Data, SORTNET_SIZE, SORTNET_DATA_BITS); sort: entity work.sortnet_BitonicSort generic map ( - INPUTS => SORTNET_SIZE, - KEY_BITS => SORTNET_KEY_BITS, - DATA_BITS => SORTNET_DATA_BITS, - META_BITS => STREAM_META_BITS, - PIPELINE_STAGE_AFTER => SORTNET_REG_AFTER, - ADD_OUTPUT_REGISTERS => FALSE + INPUTS => SORTNET_SIZE, + KEY_BITS => SORTNET_KEY_BITS, + DATA_BITS => SORTNET_DATA_BITS, + META_BITS => STREAM_META_BITS, + PIPELINE_STAGE_AFTER => SORTNET_REG_AFTER, + ADD_OUTPUT_REGISTERS => FALSE ) port map ( - Clock => Clock, - Reset => Reset, + Clock => Clock, + Reset => Reset, - Inverse => Inverse, + Inverse => Inverse, - In_Valid => gearup_Valid, - In_IsKey => gearup_Meta(META_ISKEY_BIT), - In_Data => DataInputMatrix, - In_Meta => gearup_Meta(META_BITS - 1 downto META_BITS - STREAM_META_BITS), + In_Valid => gearup_Valid, + In_IsKey => gearup_Meta(META_ISKEY_BIT), + In_Data => DataInputMatrix, + In_Meta => gearup_Meta(META_BITS - 1 downto META_BITS - STREAM_META_BITS), - Out_Valid => sort_Valid, - Out_IsKey => sort_IsKey, - Out_Data => DataOutputMatrix, - Out_Meta => sort_Meta + Out_Valid => sort_Valid, + Out_IsKey => sort_IsKey, + Out_Data => DataOutputMatrix, + Out_Meta => sort_Meta ); - sort_Data <= to_slv(DataOutputMatrix); + sort_Data <= to_slv(DataOutputMatrix); end generate; blkTransform : block - signal DataInputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); - signal DataOutputMatrix : T_SLM(DATA_COLUMNS - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); + signal DataInputMatrix : T_SLM(SORTNET_SIZE - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); + signal DataOutputMatrix : T_SLM(DATA_COLUMNS - 1 downto 0, SORTNET_DATA_BITS - 1 downto 0); begin - DataInputMatrix <= to_slm(sort_Data, SORTNET_SIZE, SORTNET_DATA_BITS); + DataInputMatrix <= to_slm(sort_Data, SORTNET_SIZE, SORTNET_DATA_BITS); transform: entity work.sortnet_Transform generic map ( - ROWS => SORTNET_SIZE, - COLUMNS => DATA_COLUMNS, - DATA_BITS => SORTNET_DATA_BITS + ROWS => SORTNET_SIZE, + COLUMNS => DATA_COLUMNS, + DATA_BITS => SORTNET_DATA_BITS ) port map ( - Clock => Clock, - Reset => Reset, - - -- In_Sync => '0', - In_Valid => sort_Valid, - In_Data => DataInputMatrix, - In_SOF => sort_IsKey, - In_EOF => '0', - - Out_Valid => transform_Valid, - Out_Data => DataOutputMatrix, - Out_SOF => transform_SOF, - Out_EOF => transform_EOF + Clock => Clock, + Reset => Reset, + + -- In_Sync => '0', + In_Valid => sort_Valid, + In_Data => DataInputMatrix, + In_SOF => sort_IsKey, + In_EOF => '0', + + Out_Valid => transform_Valid, + Out_Data => DataOutputMatrix, + Out_SOF => transform_SOF, + Out_EOF => transform_EOF ); transform_Data <= to_slv(DataOutputMatrix); end block; blkMergeSort : block - subtype T_MERGE_DATA is std_logic_vector(TRANSFORM_BITS - 1 downto 0); - type T_MERGE_DATA_VECTOR is array(natural range <>) of T_MERGE_DATA; - - signal MergeSortMatrix_Valid : std_logic_vector(MERGENET_STAGES downto 0); - signal MergeSortMatrix_Data : T_MERGE_DATA_VECTOR(MERGENET_STAGES downto 0); - signal MergeSortMatrix_SOF : std_logic_vector(MERGENET_STAGES downto 0); - signal MergeSortMatrix_EOF : std_logic_vector(MERGENET_STAGES downto 0); - signal MergeSortMatrix_Ack : std_logic_vector(MERGENET_STAGES downto 0); + subtype T_MERGE_DATA is std_logic_vector(TRANSFORM_BITS - 1 downto 0); + type T_MERGE_DATA_VECTOR is array(natural range <>) of T_MERGE_DATA; + + signal MergeSortMatrix_Valid : std_logic_vector(MERGENET_STAGES downto 0); + signal MergeSortMatrix_Data : T_MERGE_DATA_VECTOR(MERGENET_STAGES downto 0); + signal MergeSortMatrix_SOF : std_logic_vector(MERGENET_STAGES downto 0); + signal MergeSortMatrix_EOF : std_logic_vector(MERGENET_STAGES downto 0); + signal MergeSortMatrix_Ack : std_logic_vector(MERGENET_STAGES downto 0); begin - MergeSortMatrix_Valid(0) <= transform_Valid; - MergeSortMatrix_Data(0) <= transform_Data; - MergeSortMatrix_SOF(0) <= transform_SOF; - MergeSortMatrix_EOF(0) <= transform_EOF; - merge_Ack <= MergeSortMatrix_Ack(0); + MergeSortMatrix_Valid(0) <= transform_Valid; + MergeSortMatrix_Data(0) <= transform_Data; + MergeSortMatrix_SOF(0) <= transform_SOF; + MergeSortMatrix_EOF(0) <= transform_EOF; + merge_Ack <= MergeSortMatrix_Ack(0); genMerge : for i in 0 to MERGENET_STAGES - 1 generate - constant FIFO_DEPTH : positive := 2**i * SORTNET_SIZE; + constant FIFO_DEPTH : positive := 2**i * SORTNET_SIZE; begin merge: entity work.sortnet_MergeSort_Streamed generic map ( - FIFO_DEPTH => FIFO_DEPTH, - KEY_BITS => SORTNET_KEY_BITS, - DATA_BITS => MERGE_BITS + FIFO_DEPTH => FIFO_DEPTH, + KEY_BITS => SORTNET_KEY_BITS, + DATA_BITS => MERGE_BITS ) port map ( - Clock => Clock, - Reset => Reset, - - Inverse => Inverse, - - In_Valid => MergeSortMatrix_Valid(i), - In_Data => MergeSortMatrix_Data(i), - In_SOF => MergeSortMatrix_SOF(i), - In_IsKey => '1', - In_EOF => MergeSortMatrix_EOF(i), - In_Ack => MergeSortMatrix_Ack(i), - - Out_Valid => MergeSortMatrix_Valid(i + 1), - Out_Data => MergeSortMatrix_Data(i + 1), - Out_SOF => MergeSortMatrix_SOF(i + 1), - Out_IsKey => open, - Out_EOF => MergeSortMatrix_EOF(i + 1), - Out_Ack => MergeSortMatrix_Ack(i + 1) + Clock => Clock, + Reset => Reset, + + Inverse => Inverse, + + In_Valid => MergeSortMatrix_Valid(i), + In_Data => MergeSortMatrix_Data(i), + In_SOF => MergeSortMatrix_SOF(i), + In_IsKey => '1', + In_EOF => MergeSortMatrix_EOF(i), + In_Ack => MergeSortMatrix_Ack(i), + + Out_Valid => MergeSortMatrix_Valid(i + 1), + Out_Data => MergeSortMatrix_Data(i + 1), + Out_SOF => MergeSortMatrix_SOF(i + 1), + Out_IsKey => open, + Out_EOF => MergeSortMatrix_EOF(i + 1), + Out_Ack => MergeSortMatrix_Ack(i + 1) ); end generate; - merge_Valid <= MergeSortMatrix_Valid(MERGENET_STAGES); - merge_Data <= MergeSortMatrix_Data(MERGENET_STAGES); - merge_Meta <= (others => 'U'); - merge_SOF <= MergeSortMatrix_SOF(MERGENET_STAGES); - merge_EOF <= MergeSortMatrix_EOF(MERGENET_STAGES); - MergeSortMatrix_Ack(MERGENET_STAGES) <= geardown_nxt; + merge_Valid <= MergeSortMatrix_Valid(MERGENET_STAGES); + merge_Data <= MergeSortMatrix_Data(MERGENET_STAGES); + merge_Meta <= (others => 'U'); + merge_SOF <= MergeSortMatrix_SOF(MERGENET_STAGES); + merge_EOF <= MergeSortMatrix_EOF(MERGENET_STAGES); + MergeSortMatrix_Ack(MERGENET_STAGES) <= geardown_nxt; end block; - merge_Sync <= merge_SOF and merge_Valid; + merge_Sync <= merge_SOF and merge_Valid; - geardown: entity work.gearbox_down_cc + geardown: entity work.gearbox_Down_cc generic map ( - INPUT_BITS => MERGE_BITS, - OUTPUT_BITS => STREAM_DATA_BITS, - META_BITS => STREAM_META_BITS, - ADD_INPUT_REGISTERS => TRUE, - ADD_OUTPUT_REGISTERS => FALSE + INPUT_BITS => MERGE_BITS, + OUTPUT_BITS => STREAM_DATA_BITS, + META_BITS => STREAM_META_BITS, + ADD_INPUT_REGISTERS => TRUE, + ADD_OUTPUT_REGISTERS => FALSE ) port map ( - Clock => Clock, - - In_Sync => merge_Sync, - In_Valid => merge_Valid, - In_Next => geardown_nxt, - In_Data => merge_Data, - In_Meta => merge_Meta, - Out_Sync => open, - Out_Valid => Out_Valid, - Out_Data => Out_Data, - Out_Meta => geardown_Meta, - Out_First => geardown_First, - Out_Last => geardown_Last + Clock => Clock, + + In_Sync => merge_Sync, + In_Valid => merge_Valid, + In_Next => geardown_nxt, + In_Data => merge_Data, + In_Meta => merge_Meta, + Out_Sync => open, + Out_Valid => Out_Valid, + Out_Data => Out_Data, + Out_Meta => geardown_Meta, + Out_First => geardown_First, + Out_Last => geardown_Last ); - Out_Meta <= geardown_Meta; - Out_SOF <= geardown_First and 'U'; - Out_EOF <= geardown_Last and 'U'; + Out_Meta <= geardown_Meta; + Out_SOF <= geardown_First and 'U'; + Out_EOF <= geardown_Last and 'U'; end architecture; diff --git a/src/sort/sortnet/sortnet_Transform.vhdl b/src/sort/sortnet/sortnet_Transform.vhdl index a6dde01cb..487b34154 100644 --- a/src/sort/sortnet/sortnet_Transform.vhdl +++ b/src/sort/sortnet/sortnet_Transform.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Sorting Network: Data structure transformation +-- Entity: Sorting Network: Data structure transformation -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,8 +26,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.vectors.all; @@ -36,95 +36,95 @@ use work.components.all; entity sortnet_Transform is generic ( - ROWS : positive := 16; - COLUMNS : positive := 4; - DATA_BITS : positive := 8 + ROWS : positive := 16; + COLUMNS : positive := 4; + DATA_BITS : positive := 8 ); port ( - Clock : in std_logic; - Reset : in std_logic; - - In_Valid : in std_logic; - In_Data : in T_SLM(ROWS - 1 downto 0, DATA_BITS - 1 downto 0); - In_SOF : in std_logic; - In_EOF : in std_logic; - - Out_Valid : out std_logic; - Out_Data : out T_SLM(COLUMNS - 1 downto 0, DATA_BITS - 1 downto 0); - Out_SOF : out std_logic; - Out_EOF : out std_logic + Clock : in std_logic; + Reset : in std_logic; + + In_Valid : in std_logic; + In_Data : in T_SLM(ROWS - 1 downto 0, DATA_BITS - 1 downto 0); + In_SOF : in std_logic; + In_EOF : in std_logic; + + Out_Valid : out std_logic; + Out_Data : out T_SLM(COLUMNS - 1 downto 0, DATA_BITS - 1 downto 0); + Out_SOF : out std_logic; + Out_EOF : out std_logic ); end entity; architecture rtl of sortnet_Transform is - subtype T_DATA is std_logic_vector(DATA_BITS - 1 downto 0); - type T_DATA_VECTOR is array(natural range <>) of T_DATA; - type T_DATA_MATRIX is array(natural range <>) of T_DATA_VECTOR(ROWS - 1 downto 0); + subtype T_DATA is std_logic_vector(DATA_BITS - 1 downto 0); + type T_DATA_VECTOR is array(natural range <>) of T_DATA; + type T_DATA_MATRIX is array(natural range <>) of T_DATA_VECTOR(ROWS - 1 downto 0); function to_dv(slm : T_SLM) return T_DATA_VECTOR is - variable Result : T_DATA_VECTOR(slm'range(1)); + variable Result : T_DATA_VECTOR(slm'range(1)); begin for i in slm'range(1) loop for j in slm'high(2) downto slm'low(2) loop - Result(i)(j) := slm(i, j); + Result(i)(j) := slm(i, j); end loop; end loop; return Result; end function; - signal DataIn : T_DATA_VECTOR(ROWS - 1 downto 0); + signal DataIn : T_DATA_VECTOR(ROWS - 1 downto 0); - signal ColumnWriter_rst : std_logic; - signal ColumnWriter_us : unsigned(log2ceilnz(COLUMNS) - 1 downto 0) := (others => '0'); - signal ColumnWriter_ov : std_logic; + signal ColumnWriter_rst : std_logic; + signal ColumnWriter_us : unsigned(log2ceilnz(COLUMNS) - 1 downto 0) := (others => '0'); + signal ColumnWriter_ov : std_logic; - signal InputBuffer : T_DATA_MATRIX(COLUMNS - 1 downto 0) := (others => (others => (others => '0'))); + signal InputBuffer : T_DATA_MATRIX(COLUMNS - 1 downto 0) := (others => (others => (others => '0'))); - signal RowReader_en_r : std_logic := '0'; + signal RowReader_en_r : std_logic := '0'; - signal RowReader_rst : std_logic; - signal RowReader_en : std_logic; - signal RowReader_us : unsigned(log2ceilnz(ROWS) - 1 downto 0) := (others => '0'); - signal RowReader_ov : std_logic; + signal RowReader_rst : std_logic; + signal RowReader_en : std_logic; + signal RowReader_us : unsigned(log2ceilnz(ROWS) - 1 downto 0) := (others => '0'); + signal RowReader_ov : std_logic; begin - DataIn <= to_dv(In_Data); + DataIn <= to_dv(In_Data); - ColumnWriter_rst <= ColumnWriter_ov and In_Valid; -- or In_Sync; - ColumnWriter_us <= upcounter_next(cnt => ColumnWriter_us, rst => ColumnWriter_rst, en => In_Valid) when rising_edge(Clock); - ColumnWriter_ov <= upcounter_equal(cnt => ColumnWriter_us, value => COLUMNS - 1); + ColumnWriter_rst <= ColumnWriter_ov and In_Valid; -- or In_Sync; + ColumnWriter_us <= upcounter_next(cnt => ColumnWriter_us, rst => ColumnWriter_rst, en => In_Valid) when rising_edge(Clock); + ColumnWriter_ov <= upcounter_equal(cnt => ColumnWriter_us, value => COLUMNS - 1); process(Clock) begin if rising_edge(Clock) then if (In_Valid = '1') then for i in 0 to ROWS - 1 loop - InputBuffer(to_index(ColumnWriter_us, COLUMNS - 1))(i) <= DataIn(i); + InputBuffer(to_index(ColumnWriter_us, COLUMNS - 1))(i) <= DataIn(i); end loop; end if; end if; end process; - RowReader_en_r <= ffrs(q => RowReader_en_r, set => (ColumnWriter_ov and In_Valid), rst => RowReader_ov) when rising_edge(Clock); + RowReader_en_r <= ffrs(q => RowReader_en_r, set => (ColumnWriter_ov and In_Valid), rst => RowReader_ov) when rising_edge(Clock); - RowReader_rst <= ColumnWriter_ov and RowReader_ov; -- or In_Sync; - RowReader_en <= RowReader_en_r; - RowReader_us <= upcounter_next(cnt => RowReader_us, rst => RowReader_rst, en => RowReader_en) when rising_edge(Clock); - RowReader_ov <= upcounter_equal(cnt => RowReader_us, value => ROWS - 1); + RowReader_rst <= ColumnWriter_ov and RowReader_ov; -- or In_Sync; + RowReader_en <= RowReader_en_r; + RowReader_us <= upcounter_next(cnt => RowReader_us, rst => RowReader_rst, en => RowReader_en) when rising_edge(Clock); + RowReader_ov <= upcounter_equal(cnt => RowReader_us, value => ROWS - 1); process(InputBuffer, RowReader_us) begin for i in 0 to COLUMNS - 1 loop for j in 0 to DATA_BITS - 1 loop - Out_Data(i, j) <= InputBuffer(i)(to_index(RowReader_us, ROWS - 1))(j); + Out_Data(i, j) <= InputBuffer(i)(to_index(RowReader_us, ROWS - 1))(j); end loop; end loop; end process; - Out_Valid <= RowReader_en; - Out_SOF <= to_sl(RowReader_us = 0); - Out_EOF <= RowReader_ov; + Out_Valid <= RowReader_en; + Out_SOF <= to_sl(RowReader_us = 0); + Out_EOF <= RowReader_ov; end architecture; diff --git a/src/sync/README.md b/src/sync/README.md index f127fae74..7d175ff41 100644 --- a/src/sync/README.md +++ b/src/sync/README.md @@ -1,6 +1,6 @@ # Namespace `PoC.misc.sync` -The namespace `PoC.misc.sync` offers different clock-domain-crossing (CDC) synchronizer circuits. All synchronizers are based on the basic 2 flip-flop synchonizer called [`sync_Bits`][sync_Bits]. PoC has a generic and two platform specific implementations for Altera and Xilinx, which are choosen, if the appropriate `MY_DEVICE` is configured in [`my_config.vhdl`][my_config]. +The namespace `PoC.misc.sync` offers different clock-domain-crossing (CDC) synchronizer circuits. All synchronizers are based on the basic 2 flip-flop synchonizer called [`sync_Bits`][sync_Bits]. PoC has a generic and two platform specific implementations for Altera and Xilinx, which are choosen, if the appropriate `MY_DEVICE` is configured in [`project_configuration.vhdl`][project_configuration]. ## Package(s) @@ -32,7 +32,7 @@ These synchronizers also need to be constrained, so static timing analysis will See [`PoC.fifo.ic_got`][fifo] for a cross-clock capable FIFO. - [my_config]: ../../common/my_config.vhdl.template + [project_configuration]: ../../common/project_configuration.vhdl.template [sync.pkg]: sync.pkg.vhdl [sync_Bits]: sync_Bits.vhdl [sync_Bits_Altera]: sync_Bits_Altera.vhdl diff --git a/src/sync/sync.pro b/src/sync/build.pro similarity index 98% rename from src/sync/sync.pro rename to src/sync/build.pro index 819153544..3ff161acf 100644 --- a/src/sync/sync.pro +++ b/src/sync/build.pro @@ -42,3 +42,5 @@ analyze ./sync_Pulse.vhdl analyze ./sync_Strobe.vhdl analyze ./sync_Vector.vhdl analyze ./sync_Command.vhdl + +disabled ./sync_Resets.vhdl diff --git a/src/sync/sync.pkg.vhdl b/src/sync/sync.pkg.vhdl index 4d230fb7c..26f7bc978 100644 --- a/src/sync/sync.pkg.vhdl +++ b/src/sync/sync.pkg.vhdl @@ -29,8 +29,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; package sync is @@ -63,7 +63,7 @@ package sync is port ( Clock : in std_logic; -- Clock to be synchronized to Input : in std_logic_vector(BITS - 1 downto 0); -- Data to be synchronized - Output : out std_logic_vector(BITS - 1 downto 0) -- synchronized data + Output : out std_logic_vector(BITS - 1 downto 0) -- synchronized data ); end component; @@ -78,7 +78,7 @@ package sync is port ( Clock : in std_logic; -- Clock to be synchronized to Input : in std_logic_vector(BITS - 1 downto 0); -- Data to be synchronized - Output : out std_logic_vector(BITS - 1 downto 0) -- synchronized data + Output : out std_logic_vector(BITS - 1 downto 0) -- synchronized data ); end component; @@ -150,7 +150,7 @@ package sync is port ( Clock : in std_logic; -- Clock to be synchronized to Input : in std_logic_vector(BITS - 1 downto 0); -- Data to be synchronized - Output : out std_logic_vector(BITS - 1 downto 0) -- synchronised data + Output : out std_logic_vector(BITS - 1 downto 0) -- synchronised data ); end component; end package; diff --git a/src/sync/sync_Bits.vhdl b/src/sync/sync_Bits.vhdl index 5734309bd..4eb4e3bb8 100644 --- a/src/sync/sync_Bits.vhdl +++ b/src/sync/sync_Bits.vhdl @@ -55,7 +55,7 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; +use IEEE.std_logic_1164.all; use work.config.all; use work.utils.all; diff --git a/src/sync/sync_Bits_Altera.vhdl b/src/sync/sync_Bits_Altera.vhdl index 8637cd8d3..315b2dfd8 100644 --- a/src/sync/sync_Bits_Altera.vhdl +++ b/src/sync/sync_Bits_Altera.vhdl @@ -35,7 +35,7 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; +use IEEE.std_logic_1164.all; use work.sync.all; diff --git a/src/sync/sync_Command.vhdl b/src/sync/sync_Command.vhdl index a3aeb503c..1d93d3f75 100644 --- a/src/sync/sync_Command.vhdl +++ b/src/sync/sync_Command.vhdl @@ -38,8 +38,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.sync.all; diff --git a/src/sync/sync_Pulse.vhdl b/src/sync/sync_Pulse.vhdl index f44fab903..9f0f97282 100644 --- a/src/sync/sync_Pulse.vhdl +++ b/src/sync/sync_Pulse.vhdl @@ -54,7 +54,7 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; +use IEEE.std_logic_1164.all; use work.config.all; use work.utils.all; diff --git a/src/sync/sync_Pulse_Altera.vhdl b/src/sync/sync_Pulse_Altera.vhdl index 1aac60964..b56768d7c 100644 --- a/src/sync/sync_Pulse_Altera.vhdl +++ b/src/sync/sync_Pulse_Altera.vhdl @@ -38,7 +38,7 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; +use IEEE.std_logic_1164.all; use work.utils.all; use work.sync.all; diff --git a/src/sync/sync_Pulse_Xilinx.vhdl b/src/sync/sync_Pulse_Xilinx.vhdl index 4c66ab938..f90dc05a1 100644 --- a/src/sync/sync_Pulse_Xilinx.vhdl +++ b/src/sync/sync_Pulse_Xilinx.vhdl @@ -57,7 +57,7 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; +use IEEE.std_logic_1164.all; use work.utils.all; use work.sync.all; @@ -67,51 +67,51 @@ use UniSim.VComponents.all; entity sync_Pulse_Xilinx is - generic ( - BITS : positive := 1; -- number of bit to be synchronized - SYNC_DEPTH : T_MISC_SYNC_DEPTH := 2 -- generate SYNC_DEPTH many stages, at least 2 - ); - port ( - Clock : in std_logic; -- Clock to be synchronized to - Input : in std_logic_vector(BITS - 1 downto 0); -- Data to be synchronized - Output : out std_logic_vector(BITS - 1 downto 0) -- synchronised data - ); + generic ( + BITS : positive := 1; -- number of bit to be synchronized + SYNC_DEPTH : T_MISC_SYNC_DEPTH := 2 -- generate SYNC_DEPTH many stages, at least 2 + ); + port ( + Clock : in std_logic; -- Clock to be synchronized to + Input : in std_logic_vector(BITS - 1 downto 0); -- Data to be synchronized + Output : out std_logic_vector(BITS - 1 downto 0) -- synchronised data + ); end entity; architecture rtl of sync_Pulse_Xilinx is - signal Captured_async : std_logic_vector(BITS - 1 downto 0); - signal Input_sync : std_logic_vector(BITS - 1 downto 0); + signal Captured_async : std_logic_vector(BITS - 1 downto 0); + signal Input_sync : std_logic_vector(BITS - 1 downto 0); begin - gen : for i in 0 to BITS - 1 generate - signal Clear : std_logic; - begin - capture : FDCE - generic map ( - INIT => '0' - ) - port map ( - C => Input(i), - CE => '1', - CLR => Clear, - D => '1', - Q => Captured_async(i) - ); + gen : for i in 0 to BITS - 1 generate + signal Clear : std_logic; + begin + capture : FDCE + generic map ( + INIT => '0' + ) + port map ( + C => Input(i), + CE => '1', + CLR => Clear, + D => '1', + Q => Captured_async(i) + ); - Clear <= not Input(i) and Input_sync(i); - end generate; + Clear <= not Input(i) and Input_sync(i); + end generate; - Sync: entity work.sync_Bits_Xilinx - generic map ( - BITS => BITS, - SYNC_DEPTH => SYNC_DEPTH - ) - port map ( - Clock => Clock, - Input => Captured_async, - Output => Input_sync - ); + Sync: entity work.sync_Bits_Xilinx + generic map ( + BITS => BITS, + SYNC_DEPTH => SYNC_DEPTH + ) + port map ( + Clock => Clock, + Input => Captured_async, + Output => Input_sync + ); - Output <= Input_sync; + Output <= Input_sync; end architecture; diff --git a/src/sync/sync_Reset.vhdl b/src/sync/sync_Reset.vhdl index 66468da79..222c20044 100644 --- a/src/sync/sync_Reset.vhdl +++ b/src/sync/sync_Reset.vhdl @@ -48,7 +48,7 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; +use IEEE.std_logic_1164.all; use work.config.all; use work.utils.all; diff --git a/src/sync/sync_Reset_Altera.vhdl b/src/sync/sync_Reset_Altera.vhdl index 508d1ef44..e2e00aa65 100644 --- a/src/sync/sync_Reset_Altera.vhdl +++ b/src/sync/sync_Reset_Altera.vhdl @@ -29,7 +29,7 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; +use IEEE.std_logic_1164.all; use work.sync.all; diff --git a/src/sync/sync_Reset_Xilinx.vhdl b/src/sync/sync_Reset_Xilinx.vhdl index d224a707b..ba8839234 100644 --- a/src/sync/sync_Reset_Xilinx.vhdl +++ b/src/sync/sync_Reset_Xilinx.vhdl @@ -41,7 +41,7 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; +use IEEE.std_logic_1164.all; library UniSim; use UniSim.VComponents.all; diff --git a/src/sync/sync_Strobe.vhdl b/src/sync/sync_Strobe.vhdl index 121c7dcaa..ac68a35a0 100644 --- a/src/sync/sync_Strobe.vhdl +++ b/src/sync/sync_Strobe.vhdl @@ -43,8 +43,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.sync.all; @@ -59,7 +59,7 @@ entity sync_Strobe is Clock2 : in std_logic; -- output clock domain Input : in std_logic_vector(BITS - 1 downto 0); -- @Clock1: input bits Output : out std_logic_vector(BITS - 1 downto 0); -- @Clock2: output bits - Busy : out std_logic_vector(BITS - 1 downto 0) -- @Clock1: busy bits + Busy : out std_logic_vector(BITS - 1 downto 0) -- @Clock1: busy bits ); end entity; diff --git a/src/sync/sync_Vector.vhdl b/src/sync/sync_Vector.vhdl index 24bcd4b15..c177828b4 100644 --- a/src/sync/sync_Vector.vhdl +++ b/src/sync/sync_Vector.vhdl @@ -37,8 +37,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.utils.all; use work.sync.all; @@ -59,7 +59,7 @@ entity sync_Vector is Strobe : in std_logic := '0'; -- @Clock1: Transfer Strobe, only if MASTER_BITS=0 Output : out std_logic_vector((SLAVE_BITS + MASTER_BITS) - 1 downto 0); -- @Clock2: output vector - Changed : out std_logic -- @Clock2: changed bit + Changed : out std_logic -- @Clock2: changed bit ); end entity; diff --git a/src/xil/xil.pro b/src/xil/build.pro similarity index 75% rename from src/xil/xil.pro rename to src/xil/build.pro index 0ed607f17..e166db298 100644 --- a/src/xil/xil.pro +++ b/src/xil/build.pro @@ -22,13 +22,21 @@ analyze ./xil.pkg.vhdl if { $::poc::vendorName eq "Xilinx" } { + disabled ./xil_ClockBuffer.vhdl + disabled ./xil_Trans_config.vhdl analyze ./xil_DNAPort.vhdl analyze ./xil_ICAP.vhdl analyze ./xil_BSCAN.vhdl analyze ./xil_Reconfigurator.vhdl - analyze ./xil_SystemMonitor.vhdl - analyze ./reconfig/reconfig_icap_fsm.vhdl - analyze ./reconfig/reconfig_icap_wrapper.vhdl + + if {$::osvvm::ToolName eq "GHDL" || $::osvvm::ToolName eq "NVC"} { + # todo: fix error: length of value 8 does not match length of target 16 for signal ALM (line 124, 359) + disabled ./xil_SystemMonitor.vhdl + } else { + analyze ./xil_SystemMonitor.vhdl + } + analyze ./reconfig/reconfig_ICAP_FSM.vhdl + analyze ./reconfig/reconfig_ICAP_Wrapper.vhdl } elseif { $::poc::vendorName eq "Altera" } { puts "No Altera files in this namespace." diff --git a/src/xil/reconfig/reconfig_icap_fsm.vhdl b/src/xil/reconfig/reconfig_ICAP_FSM.vhdl similarity index 57% rename from src/xil/reconfig/reconfig_icap_fsm.vhdl rename to src/xil/reconfig/reconfig_ICAP_FSM.vhdl index 06053e925..1865bb3fc 100644 --- a/src/xil/reconfig/reconfig_icap_fsm.vhdl +++ b/src/xil/reconfig/reconfig_ICAP_FSM.vhdl @@ -1,10 +1,7 @@ --- EMACS settings: -*- tab-width: 4; indent-tabs-mode: t -*- --- vim: tabstop=4:shiftwidth=4:noexpandtab --- kate: tab-width 4; replace-tabs off; indent-width 4; -- ============================================================================= --- Authors: Paul Genssler +-- Authors: Paul Genssler -- --- Entity: ICAP FSM +-- Entity: ICAP FSM -- -- Description: -- ------------------------------------- @@ -17,13 +14,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,37 +28,37 @@ -- See the License for the specific language governing permissions and -- limitations under the License. -- ============================================================================= -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -use work.utils.all; -use work.vectors.all; +use work.utils.all; +use work.vectors.all; -entity reconfig_icap_fsm is +entity reconfig_ICAP_FSM is port ( - clk : in std_logic; - reset : in std_logic; -- high-active reset + Clock : in std_logic; + Reset : in std_logic; -- high-active reset -- interface to connect to the icap - icap_in : out std_logic_vector(31 downto 0); -- data that will go into the icap - icap_out : in std_logic_vector(31 downto 0); -- data from the icap - icap_csb : out std_logic; - icap_rw : out std_logic; + icap_in : out std_logic_vector(31 downto 0); -- data that will go into the icap + icap_out : in std_logic_vector(31 downto 0); -- data from the icap + icap_csb : out std_logic; + icap_rw : out std_logic; -- data interface, no internal fifos - in_data : in std_logic_vector(31 downto 0); -- new configuration data - in_data_valid : in std_logic; -- input data is valid - in_data_rden : out std_logic; -- possible to send data - out_data : out std_logic_vector(31 downto 0); -- data read from the fifo - out_data_valid : out std_logic; -- data from icap is valid - out_data_full : in std_logic; -- receiving buffer is full, halt icap + in_data : in std_logic_vector(31 downto 0); -- new configuration data + in_data_valid : in std_logic; -- input data is valid + in_data_rden : out std_logic; -- possible to send data + out_data : out std_logic_vector(31 downto 0); -- data read from the fifo + out_data_valid : out std_logic; -- data from icap is valid + out_data_full : in std_logic; -- receiving buffer is full, halt icap -- control structures - status : out std_logic_vector(31 downto 0) -- status vector + status : out std_logic_vector(31 downto 0) -- status vector ); -end reconfig_icap_fsm; +end entity; -architecture arch of reconfig_icap_fsm is +architecture arch of reconfig_ICAP_FSM is type t_state is (ready, abort0, abort1, abort2, abort3, write, writing, pre_reg_read0, pre_reg_read1, pre_stream_read0, read, reading, post_read); signal cur_state : t_state := ready; @@ -73,83 +70,83 @@ architecture arch of reconfig_icap_fsm is -- flag will be (re)set in the clocking process for the main fsm signal sync_state_flag : boolean; - constant sync_s_dummy : std_logic_vector(31 downto 0) := x"FFFFFFFF"; - constant sync_s_bus_p_0 : std_logic_vector(31 downto 0) := x"000000BB"; - constant sync_s_bus_p_1 : std_logic_vector(31 downto 0) := x"11220044"; - constant sync_s_sync : std_logic_vector(31 downto 0) := x"AA995566"; - constant sync_s_regW : std_logic_vector(31 downto 0) := x"30008001"; - constant sync_s_dsync : std_logic_vector(31 downto 0) := x"0000000D"; + constant sync_s_dummy : std_logic_vector(31 downto 0) := x"FFFFFFFF"; + constant sync_s_bus_p_0 : std_logic_vector(31 downto 0) := x"000000BB"; + constant sync_s_bus_p_1 : std_logic_vector(31 downto 0) := x"11220044"; + constant sync_s_sync : std_logic_vector(31 downto 0) := x"AA995566"; + constant sync_s_regW : std_logic_vector(31 downto 0) := x"30008001"; + constant sync_s_dsync : std_logic_vector(31 downto 0) := x"0000000D"; - constant cmd_nop : std_logic_vector(31 downto 0) := x"20000000"; + constant cmd_nop : std_logic_vector(31 downto 0) := x"20000000"; -- commands for icap's cmd register - constant cmd_reg_wcfg : std_logic_vector(4 downto 0) := "00001"; -- write cfg data prior to write - constant reg_fdro : std_logic_vector(4 downto 0) := "00011"; -- read cfg data register + constant cmd_reg_wcfg : std_logic_vector(4 downto 0) := "00001"; -- write cfg data prior to write + constant reg_fdro : std_logic_vector(4 downto 0) := "00011"; -- read cfg data register - signal icap_enable : boolean := false; - signal icap_read : boolean := false; - signal icap_in_r : std_logic_vector(31 downto 0); + signal icap_enable : boolean := false; + signal icap_read : boolean := false; + signal icap_in_r : std_logic_vector(31 downto 0); -- icap bit switching - signal in_data_swap : std_logic_vector(31 downto 0); - signal icap_out_swap : std_logic_vector(31 downto 0); + signal in_data_swap : std_logic_vector(31 downto 0); + signal icap_out_swap : std_logic_vector(31 downto 0); -- icap status word signals - signal icap_error : std_logic := '0'; - signal icap_sync : std_logic := '0'; - signal icap_abort : std_logic := '0'; - signal icap_status_valid : std_logic := '0'; + signal icap_error : std_logic := '0'; + signal icap_sync : std_logic := '0'; + signal icap_abort : std_logic := '0'; + signal icap_status_valid : std_logic := '0'; - signal readback_cnt : unsigned(26 downto 0) := (others=>'0'); - signal readback_cnt_en : boolean; - signal readback_cnt_rst : boolean := true; + signal readback_cnt : unsigned(26 downto 0) := (others=>'0'); + signal readback_cnt_en : boolean; + signal readback_cnt_rst : boolean := true; -- delayed signals - signal in_data_valid_d : std_logic; - signal in_data_valid_re : std_logic; -- rising edge on in_data_valid signal + signal in_data_valid_d : std_logic; + signal in_data_valid_re : std_logic; -- rising edge on in_data_valid signal -- status word signals - signal pr_reset : boolean := false; - signal status_error : boolean := false; + signal pr_reset : boolean := false; + signal status_error : boolean := false; begin -- map icap_enable to the low-active csb - icap_csb <= to_sl(not icap_enable) when rising_edge(clk); - icap_rw <= to_sl(icap_read) when rising_edge(clk); + icap_csb <= to_sl(not icap_enable) when rising_edge(Clock); + icap_rw <= to_sl(icap_read) when rising_edge(Clock); -- drive icap data - icap_in <= icap_in_r when rising_edge(clk); - icap_in_r <= in_data_swap when in_data_valid = '1' else x"00000000"; + icap_in <= icap_in_r when rising_edge(Clock); + icap_in_r <= in_data_swap when in_data_valid = '1' else x"00000000"; - out_data <= icap_out_swap when rising_edge(clk); + out_data <= icap_out_swap when rising_edge(Clock); -- TODO detect errors status_error <= false; -- construct status word - status(0) <= to_sl(pr_reset) when rising_edge(clk); - status(1) <= to_sl(not readback_cnt_rst) when rising_edge(clk); -- readback in progress - status(2) <= to_sl(status_error) when rising_edge(clk); - status(3) <= to_sl(cur_state = ready) when rising_edge(clk); + status(0) <= to_sl(pr_reset) when rising_edge(Clock); + status(1) <= to_sl(not readback_cnt_rst) when rising_edge(Clock); -- readback in progress + status(2) <= to_sl(status_error) when rising_edge(Clock); + status(3) <= to_sl(cur_state = ready) when rising_edge(Clock); status(31 downto 4) <= (others => '0'); -- edge detection - in_data_valid_d <= in_data_valid when rising_edge(clk); - in_data_valid_re <= not in_data_valid_d and in_data_valid; + in_data_valid_d <= in_data_valid when rising_edge(Clock); + in_data_valid_re <= not in_data_valid_d and in_data_valid; -- combinatorial state machine - cur_state <= nxt_state when rising_edge(clk); + cur_state <= nxt_state when rising_edge(Clock); - combi : process (reset, nxt_state, cur_state, in_data, in_data_valid, in_data_valid_re, + combi : process (Reset, nxt_state, cur_state, in_data, in_data_valid, in_data_valid_re, sync_state, sync_state_flag, out_data_full, readback_cnt, pr_reset) begin -- default assignments - nxt_state <= cur_state; + nxt_state <= cur_state; icap_enable <= false; - icap_read <= false; + icap_read <= false; out_data_valid <= '0'; in_data_rden <= '0'; readback_cnt_rst <= true; readback_cnt_en <= false; -- TODO abort when error or reset - case cur_state is + case cur_state is when ready => in_data_rden <= '1'; if in_data_valid_re = '1' then @@ -172,7 +169,7 @@ begin icap_enable <= true; -- a type 1 package with a read op, after sync, but before pr_reset if in_data(31 downto 27) = "00101" and sync_state = synced and pr_reset = false then - if in_data(17 downto 13) = reg_fdro then -- FDRO read cfg register + if in_data(17 downto 13) = reg_fdro then -- FDRO read cfg register nxt_state <= pre_stream_read0; else nxt_state <= pre_reg_read0; @@ -183,7 +180,7 @@ begin in_data_rden <= '1'; readback_cnt_rst <= false; icap_enable <= true; - if in_data /= cmd_nop then -- after the nops are done, there should be 00000000 an the stream + if in_data /= cmd_nop then -- after the nops are done, there should be 00000000 an the stream nxt_state <= pre_reg_read1; in_data_rden <= '0'; end if; @@ -195,7 +192,7 @@ begin else nxt_state <= read; end if; - when pre_stream_read0 => -- delay for one cycle to get the correct readback counter value + when pre_stream_read0 => -- delay for one cycle to get the correct readback counter value in_data_rden <= '1'; icap_enable <= true; nxt_state <= pre_reg_read0; @@ -226,14 +223,14 @@ begin end process combi; -- readback counter process - readback_cnt_p : process(clk) + readback_cnt_p : process(Clock) begin - if rising_edge(clk) then - if readback_cnt_rst then -- load coutner with length from data word - if in_data(31 downto 29) = "001" then -- type 1 package - readback_cnt(10 downto 0) <= unsigned(in_data(10 downto 0)); -- only 11 bit for count + if rising_edge(Clock) then + if readback_cnt_rst then -- load coutner with length from data word + if in_data(31 downto 29) = "001" then -- type 1 package + readback_cnt(10 downto 0) <= unsigned(in_data(10 downto 0)); -- only 11 bit for count readback_cnt(26 downto 11) <= (others=>'0'); - else -- type 2 package, 27 bit for count + else -- type 2 package, 27 bit for count readback_cnt <= unsigned(in_data(26 downto 0)); end if; elsif readback_cnt_en then @@ -244,16 +241,16 @@ begin -- update sync status - sync_p : process(clk) + sync_p : process(Clock) begin - if rising_edge(clk) then + if rising_edge(Clock) then -- TODO consider status word's dsync bit if in_data_valid = '1' then case sync_state is when none => pr_reset <= false; if cur_state = ready then - sync_state_flag <= false; -- reset flag after all data was passed to the icap + sync_state_flag <= false; -- reset flag after all data was passed to the icap end if; if in_data = sync_s_dummy then sync_state <= dummy0; @@ -287,7 +284,7 @@ begin sync_state <= cmdWrite; end if; when cmdWrite => - if in_data(4 downto 0) = cmd_reg_wcfg then -- wcfg command, reconfig imminent + if in_data(4 downto 0) = cmd_reg_wcfg then -- wcfg command, reconfig imminent pr_reset <= true; end if; if in_data = sync_s_dsync then @@ -298,7 +295,7 @@ begin when dsynced => pr_reset <= false; sync_state <= none; - sync_state_flag <= true; -- set flag + sync_state_flag <= true; -- set flag end case; end if; end if; diff --git a/src/xil/reconfig/reconfig_ICAP_Wrapper.vhdl b/src/xil/reconfig/reconfig_ICAP_Wrapper.vhdl new file mode 100644 index 000000000..1146e6986 --- /dev/null +++ b/src/xil/reconfig/reconfig_ICAP_Wrapper.vhdl @@ -0,0 +1,242 @@ +-- ============================================================================= +-- Authors: Paul Genssler +-- +-- Entity: Simple ICAP wrapper with a fifo interface and a few status signals +-- +-- Description: +-- ------------------------------------- +-- This module was designed to connect the Xilinx "Internal Configuration Access Port" (ICAP) +-- to a PCIe endpoint on a Dini board. Tested on: +-- +-- tbd +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany, +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library UNISIM; +use UNISIM.vcomponents.all; + +use work.utils.all; + +entity reconfig_ICAP_Wrapper is + generic ( + MIN_DEPTH_OUT : positive := 256; + MIN_DEPTH_IN : positive := 256 + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + ICAP_Clock : in std_logic; -- clock signal for ICAP, max 100 MHz (double check with manual) + + icap_busy : out std_logic; -- the ICAP is processing the data + icap_readback : out std_logic; -- high during a readback + icap_partial_res: out std_logic; -- high during reconfiguration + + -- data in + write_put : in std_logic; + write_full : out std_logic; + write_data : in std_logic_vector(31 downto 0); + write_done : in std_logic; -- high pulse/edge after all data was written + + -- data out + read_got : in std_logic; + read_valid : out std_logic; + read_data : out std_logic_vector(31 downto 0) + ); +end entity; + +architecture Behavioral of reconfig_ICAP_Wrapper is + signal reset_icap : std_logic; + + signal write_done_d : std_logic; + signal write_done_edge : std_logic; + signal write_done_icapclk : std_logic; + + signal in_data_valid : std_logic; + constant STATE_BITS : positive := 2; + constant state_almost_full : std_logic_vector(STATE_BITS -1 downto 0) := (0 => '0', others => '1'); + signal in_data_fill_state : std_logic_vector(STATE_BITS -1 downto 0); + signal in_data_rden : std_logic; + signal in_data_start : std_logic; -- high after enough data was written into the pci->icap fifo + -- or write done (status register) + signal icap_rden : std_logic; -- icap wants some yummy data + signal in_data : std_logic_vector(31 downto 0); + + signal out_data_full : std_logic; + signal out_data_put : std_logic; + signal out_data : std_logic_vector(31 downto 0); + + signal icap_data_config : std_logic_vector(31 downto 0); + signal icap_data_readback : std_logic_vector(31 downto 0); + signal icap_csb : std_logic; + signal icap_rw : std_logic; + + signal icap_data_config_r : std_logic_vector(31 downto 0); + signal icap_data_readback_r : std_logic_vector(31 downto 0); + signal icap_csb_r : std_logic; + signal icap_rw_r : std_logic; + + signal fsm_status : std_logic_vector(31 downto 0); + signal fsm_status_clk : std_logic_vector(31 downto 0); + signal fsm_ready : std_logic; + signal fsm_ready_d : std_logic; +begin + write_done_d <= write_done when rising_edge(Clock); + write_done_edge <= to_sl(write_done = '1' and write_done_d = '0'); + + icap_busy <= not fsm_status_clk(3); + icap_readback <= fsm_status_clk(1); + icap_partial_res <= fsm_status_clk(0); + + fsm_ready <= fsm_status(3); + fsm_ready_d <= fsm_ready when rising_edge(ICAP_Clock); + + -- buffer some data before starting the icap, icap needs to be sync'ed before it can be paused + in_data_buffer_p : process (ICAP_Clock) begin + if rising_edge(ICAP_Clock) then + if (reset_icap = '1') then + in_data_start <= '0'; + else + if fsm_ready = '1' and fsm_ready_d = '0' then -- reset after icap is done + in_data_start <= '0'; + elsif in_data_fill_state = state_almost_full or write_done_icapclk = '1' then -- set when fifo almost full or write already done + in_data_start <= '1'; + end if; + end if; + end if; + end process in_data_buffer_p; + + in_data_rden <= icap_rden and in_data_start and in_data_valid; + + -- sync the written pci data into the user clk + -- writer: pci + -- reader: core + fifo_in: entity work.fifo_ic_got + generic map( + DATA_BITS => 32, + MIN_DEPTH => MIN_DEPTH_IN, + OUTPUT_REG => false, + FILL_STATE_BITS => STATE_BITS + ) + port map( + clk_wr => Clock, + rst_wr => Reset, + put => write_put, + din => write_data, + full => write_full, + estate_wr => open, + + clk_rd => ICAP_Clock, + rst_rd => reset_icap, + got => in_data_rden, + valid => in_data_valid, + dout => in_data, + fstate_rd => in_data_fill_state + ); + + -- sync data from this core to the pci bus + -- writer: core + -- reader: pci + fifo_out: entity work.fifo_ic_got + generic map( + DATA_BITS => 32, + MIN_DEPTH => MIN_DEPTH_OUT, + OUTPUT_REG => false + ) + port map( + clk_wr => ICAP_Clock, + rst_wr => reset_icap, + put => out_data_put, + din => out_data, + full => out_data_full, + + clk_rd => Clock, + rst_rd => Reset, + got => read_got, + valid => read_valid, + dout => read_data + ); + + FSM: entity work.reconfig_ICAP_FSM + port map( + Clock => ICAP_Clock, + Reset => reset_icap, + icap_in => icap_data_config_r, + icap_out => icap_data_readback_r, + icap_csb => icap_csb_r, + icap_rw => icap_rw_r, + in_data => in_data, + in_data_valid => in_data_rden, -- TODO start one clock cycle later + in_data_rden => icap_rden, + out_data => out_data, + out_data_valid => out_data_put, + out_data_full => out_data_full, + status => fsm_status + ); + + -- icap + icap_reg_p : process (ICAP_Clock) begin + if rising_edge(ICAP_Clock) then + icap_data_readback_r <= icap_data_readback; + icap_csb <= icap_csb_r; + icap_rw <= icap_rw_r; + icap_data_config <= icap_data_config_r; + end if; + end process icap_reg_p; + + ICAP: entity work.xil_ICAP + port map ( + Clock => ICAP_Clock, + Disable => icap_csb, + Busy => open, + DataIn => icap_data_config, + DataOut => icap_data_readback, + ReadWrite => icap_rw + ); + + strobe_sync: entity work.sync_Strobe + port map ( + clock1 => Clock, + clock2 => ICAP_Clock, + input(0) => write_done_edge, + output(0) => write_done_icapclk, + busy => open + ); + + reset_sync: entity work.sync_Bits + port map ( + clock => ICAP_Clock, + input(0) => Reset, + output(0) => reset_icap + ); + + fsm_status_sync: entity work.sync_vector + generic map ( + master_bits => 32 + ) port map ( + clock1 => ICAP_Clock, + clock2 => Clock, + input => fsm_status, + output => fsm_status_clk, + busy => open, + changed => open + ); +end architecture; diff --git a/src/xil/reconfig/reconfig_icap_wrapper.vhdl b/src/xil/reconfig/reconfig_icap_wrapper.vhdl deleted file mode 100644 index 585ab2b3c..000000000 --- a/src/xil/reconfig/reconfig_icap_wrapper.vhdl +++ /dev/null @@ -1,244 +0,0 @@ --- EMACS settings: -*- tab-width: 4; indent-tabs-mode: t -*- --- vim: tabstop=4:shiftwidth=4:noexpandtab --- kate: tab-width 4; replace-tabs off; indent-width 4; --- ============================================================================= --- Authors: Paul Genssler --- --- Entity: Simple ICAP wrapper with a fifo interface and a few status signals --- --- Description: --- ------------------------------------- --- This module was designed to connect the Xilinx "Internal Configuration Access Port" (ICAP) --- to a PCIe endpoint on a Dini board. Tested on: --- --- tbd --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= -library IEEE; -use IEEE.STD_LOGIC_1164.all; -use ieee.numeric_std.all; - -library UNISIM; -use UNISIM.vcomponents.all; - -use work.utils.all; - -entity reconfig_icap_wrapper is - generic ( - MIN_DEPTH_OUT : positive := 256; - MIN_DEPTH_IN : positive := 256 - ); - port ( - clk : in std_logic; - reset : in std_logic; - clk_icap : in std_logic; -- clock signal for ICAP, max 100 MHz (double check with manual) - - icap_busy : out std_logic; -- the ICAP is processing the data - icap_readback : out std_logic; -- high during a readback - icap_partial_res: out std_logic; -- high during reconfiguration - - -- data in - write_put : in std_logic; - write_full : out std_logic; - write_data : in std_logic_vector(31 downto 0); - write_done : in std_logic; -- high pulse/edge after all data was written - - -- data out - read_got : in std_logic; - read_valid : out std_logic; - read_data : out std_logic_vector(31 downto 0) - ); -end reconfig_icap_wrapper; - -architecture Behavioral of reconfig_icap_wrapper is - signal reset_icap : std_logic; - - signal write_done_d : std_logic; - signal write_done_edge : std_logic; - signal write_done_icapclk : std_logic; - - signal in_data_valid : std_logic; - constant STATE_BITS : positive := 2; - constant state_almost_full : std_logic_vector(STATE_BITS -1 downto 0) := (0 => '0', others => '1'); - signal in_data_fill_state : std_logic_vector(STATE_BITS -1 downto 0); - signal in_data_rden : std_logic; - signal in_data_start : std_logic; -- high after enough data was written into the pci->icap fifo - -- or write done (status register) - signal icap_rden : std_logic; -- icap wants some yummy data - signal in_data : std_logic_vector(31 downto 0); - - signal out_data_full : std_logic; - signal out_data_put : std_logic; - signal out_data : std_logic_vector(31 downto 0); - - signal icap_data_config : std_logic_vector(31 downto 0); - signal icap_data_readback : std_logic_vector(31 downto 0); - signal icap_csb : std_logic; - signal icap_rw : std_logic; - - signal icap_data_config_r : std_logic_vector(31 downto 0); - signal icap_data_readback_r : std_logic_vector(31 downto 0); - signal icap_csb_r : std_logic; - signal icap_rw_r : std_logic; - - signal fsm_status : std_logic_vector(31 downto 0); - signal fsm_status_clk : std_logic_vector(31 downto 0); - signal fsm_ready : std_logic; - signal fsm_ready_d : std_logic; -begin - write_done_d <= write_done when rising_edge(clk); - write_done_edge <= to_sl(write_done = '1' and write_done_d = '0'); - - icap_busy <= not fsm_status_clk(3); - icap_readback <= fsm_status_clk(1); - icap_partial_res <= fsm_status_clk(0); - - fsm_ready <= fsm_status(3); - fsm_ready_d <= fsm_ready when rising_edge(clk_icap); - - -- buffer some data before starting the icap, icap needs to be sync'ed before it can be paused - in_data_buffer_p : process (clk_icap) begin - if rising_edge(clk_icap) then - if (reset_icap = '1') then - in_data_start <= '0'; - else - if fsm_ready = '1' and fsm_ready_d = '0' then -- reset after icap is done - in_data_start <= '0'; - elsif in_data_fill_state = state_almost_full or write_done_icapclk = '1' then -- set when fifo almost full or write already done - in_data_start <= '1'; - end if; - end if; - end if; - end process in_data_buffer_p; - - in_data_rden <= icap_rden and in_data_start and in_data_valid; - - -- sync the written pci data into the user clk - -- writer: pci - -- reader: core - fifo_in: entity work.fifo_ic_got - generic map( - D_BITS => 32, - MIN_DEPTH => MIN_DEPTH_IN, - OUTPUT_REG => false, - FSTATE_RD_BITS => STATE_BITS - ) - port map( - clk_wr => clk, - rst_wr => reset, - put => write_put, - din => write_data, - full => write_full, - estate_wr => open, - - clk_rd => clk_icap, - rst_rd => reset_icap, - got => in_data_rden, - valid => in_data_valid, - dout => in_data, - fstate_rd => in_data_fill_state - ); - - -- sync data from this core to the pci bus - -- writer: core - -- reader: pci - fifo_out: entity work.fifo_ic_got - generic map( - D_BITS => 32, - MIN_DEPTH => MIN_DEPTH_OUT, - OUTPUT_REG => false - ) - port map( - clk_wr => clk_icap, - rst_wr => reset_icap, - put => out_data_put, - din => out_data, - full => out_data_full, - - clk_rd => clk, - rst_rd => reset, - got => read_got, - valid => read_valid, - dout => read_data - ); - - icap_fsm_inst: entity work.reconfig_icap_fsm port map( - clk => clk_icap, - reset => reset_icap, - icap_in => icap_data_config_r, - icap_out => icap_data_readback_r, - icap_csb => icap_csb_r, - icap_rw => icap_rw_r, - in_data => in_data, - in_data_valid => in_data_rden, -- TODO start one clock cycle later - in_data_rden => icap_rden, - out_data => out_data, - out_data_valid => out_data_put, - out_data_full => out_data_full, - status => fsm_status - ); - - -- icap - icap_reg_p : process (clk_icap) begin - if rising_edge(clk_icap) then - icap_data_readback_r <= icap_data_readback; - icap_csb <= icap_csb_r; - icap_rw <= icap_rw_r; - icap_data_config <= icap_data_config_r; - end if; - end process icap_reg_p; - - icap_inst: entity work.xil_ICAP - port map ( - clk => clk_icap, - disable => icap_csb, - busy => open, - data_in => icap_data_config, - data_out => icap_data_readback, - rd_wr => icap_rw - ); - - strobe_sync: entity work.sync_Strobe - port map ( - clock1 => clk, - clock2 => clk_icap, - input(0) => write_done_edge, - output(0) => write_done_icapclk, - busy => open - ); - - reset_sync: entity work.sync_Bits - port map ( - clock => clk_icap, - input(0) => reset, - output(0) => reset_icap - ); - - fsm_status_sync: entity work.sync_vector - generic map ( - master_bits => 32 - ) port map ( - clock1 => clk_icap, - clock2 => clk, - input => fsm_status, - output => fsm_status_clk, - busy => open, - changed => open - ); -end architecture; diff --git a/src/xil/xil.pkg.vhdl b/src/xil/xil.pkg.vhdl index 49e716e7d..671a5d1b3 100644 --- a/src/xil/xil.pkg.vhdl +++ b/src/xil/xil.pkg.vhdl @@ -32,8 +32,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -71,12 +71,12 @@ package xil is ); type T_XIL_DRP_BUS_OUT is record - Data : T_XIL_DRP_DATA; - Ack : std_logic; + Data : T_XIL_DRP_DATA; + Ack : std_logic; end record; constant C_XIL_DRP_BUS_OUT_EMPTY : T_XIL_DRP_BUS_OUT := ( - Ack => '0', + Ack => '0', Data => (others => '0') ); @@ -117,9 +117,9 @@ package xil is port ( Reset : in std_logic; -- Reset signal for the System Monitor control logic - Alarm_UserTemp : out std_logic; -- Temperature-sensor alarm output - Alarm_OverTemp : out std_logic; -- Over-Temperature alarm output - Alarm : out std_logic; -- OR'ed output of all the alarms + Alarm_UserTemp : out std_logic; -- Temperature-sensor alarm output + Alarm_OverTemp : out std_logic; -- Over-Temperature alarm output + Alarm : out std_logic; -- OR'ed output of all the alarms VP : in std_logic; -- Dedicated analog input pair VN : in std_logic ); diff --git a/src/xil/xil_BSCAN.vhdl b/src/xil/xil_BSCAN.vhdl index 265fe73bd..54204a1ae 100644 --- a/src/xil/xil_BSCAN.vhdl +++ b/src/xil/xil_BSCAN.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: JTAG / Boundary Scan wrapper +-- Entity: JTAG / Boundary Scan wrapper -- -- Description: -- ------------------------------------- @@ -15,13 +15,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,8 +31,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library UniSim; use UniSim.vComponents.all; @@ -42,50 +42,50 @@ use work.config.all; entity xil_BSCAN is generic ( - JTAG_CHAIN : natural; - DISABLE_JTAG : boolean := FALSE + JTAG_CHAIN : natural; + DISABLE_JTAG : boolean := FALSE ); port ( - Reset : out std_logic; - RunTest : out std_logic; - Sel : out std_logic; - Capture : out std_logic; - drck : out std_logic; - Shift : out std_logic; - Test_Clock : out std_logic; - Test_DataIn : out std_logic; - Test_DataOut : in std_logic; - Test_ModeSelect : out std_logic; - Update : out std_logic + Reset : out std_logic; + RunTest : out std_logic; + Sel : out std_logic; + Capture : out std_logic; + drck : out std_logic; + Shift : out std_logic; + Test_Clock : out std_logic; + Test_DataIn : out std_logic; + Test_DataOut : in std_logic; + Test_ModeSelect : out std_logic; + Update : out std_logic ); end entity; architecture rtl of xil_BSCAN is - constant DEV_INFO : T_DEVICE_INFO := DEVICE_INFO; + constant DEV_INFO : T_DEVICE_INFO := DEVICE_INFO; begin genSpartan3 : if (DEV_INFO.Device = DEVICE_SPARTAN3) generate - signal drck_i : std_logic_vector(1 downto 0); - signal sel_i : std_logic_vector(1 downto 0); - signal tdo_i : std_logic_vector(1 downto 0); + signal drck_i : std_logic_vector(1 downto 0); + signal sel_i : std_logic_vector(1 downto 0); + signal tdo_i : std_logic_vector(1 downto 0); begin - drck <= drck_i(JTAG_CHAIN - 1); - Sel <= sel_i(JTAG_CHAIN - 1); - tdo_i <= (others => Test_DataOut); + drck <= drck_i(JTAG_CHAIN - 1); + Sel <= sel_i(JTAG_CHAIN - 1); + tdo_i <= (others => Test_DataOut); bscan : BSCAN_SPARTAN3 port map ( - CAPTURE => Capture, -- CAPTURE output from TAP controller - DRCK1 => drck_i(0), -- Data register output for USER1 functions - DRCK2 => drck_i(1), -- Data register output for USER2 functions - RESET => Reset, -- Reset output from TAP controller - SEL1 => sel_i(0), -- USER1 active output - SEL2 => sel_i(1), -- USER2 active output - SHIFT => Shift, -- SHIFT output from TAP controller - TDI => Test_DataIn, -- TDI output from TAP controller - UPDATE => Update, -- UPDATE output from TAP controller - TDO1 => tdo_i(0), -- Data input for USER1 function - TDO2 => tdo_i(1) -- Data input for USER2 function + CAPTURE => Capture, -- CAPTURE output from TAP controller + DRCK1 => drck_i(0), -- Data register output for USER1 functions + DRCK2 => drck_i(1), -- Data register output for USER2 functions + RESET => Reset, -- Reset output from TAP controller + SEL1 => sel_i(0), -- USER1 active output + SEL2 => sel_i(1), -- USER2 active output + SHIFT => Shift, -- SHIFT output from TAP controller + TDI => Test_DataIn, -- TDI output from TAP controller + UPDATE => Update, -- UPDATE output from TAP controller + TDO1 => tdo_i(0), -- Data input for USER1 function + TDO2 => tdo_i(1) -- Data input for USER2 function ); end generate; @@ -93,20 +93,20 @@ begin begin bscan : BSCAN_SPARTAN6 generic map ( - JTAG_CHAIN => JTAG_CHAIN + JTAG_CHAIN => JTAG_CHAIN ) port map ( - CAPTURE => Capture, - DRCK => drck, - RESET => Reset, - RUNTEST => RunTest, - SEL => Sel, - SHIFT => Shift, - TCK => Test_Clock, - TDI => Test_DataIn, - TMS => Test_ModeSelect, - UPDATE => Update, - TDO => Test_DataOut + CAPTURE => Capture, + DRCK => drck, + RESET => Reset, + RUNTEST => RunTest, + SEL => Sel, + SHIFT => Shift, + TCK => Test_Clock, + TDI => Test_DataIn, + TMS => Test_ModeSelect, + UPDATE => Update, + TDO => Test_DataOut ); end generate; @@ -114,17 +114,17 @@ begin begin bscan : BSCAN_VIRTEX5 generic map ( - JTAG_CHAIN => JTAG_CHAIN -- value for USER command; possible values: 1..4 + JTAG_CHAIN => JTAG_CHAIN -- value for USER command; possible values: 1..4 ) port map ( - CAPTURE => Capture, -- CAPTURE output from TAP controller - DRCK => drck, -- Data register output for USER functions - RESET => Reset, -- Reset output from TAP controller - SEL => Sel, -- USER active output - SHIFT => Shift, -- SHIFT output from TAP controller - TDI => Test_DataIn, -- TDI output from TAP controller - UPDATE => Update, -- UPDATE output from TAP controller - TDO => Test_DataOut -- Data input for USER function + CAPTURE => Capture, -- CAPTURE output from TAP controller + DRCK => drck, -- Data register output for USER functions + RESET => Reset, -- Reset output from TAP controller + SEL => Sel, -- USER active output + SHIFT => Shift, -- SHIFT output from TAP controller + TDI => Test_DataIn, -- TDI output from TAP controller + UPDATE => Update, -- UPDATE output from TAP controller + TDO => Test_DataOut -- Data input for USER function ); end generate; @@ -132,21 +132,21 @@ begin begin bscan : BSCAN_VIRTEX6 generic map ( - JTAG_CHAIN => JTAG_CHAIN, - DISABLE_JTAG => DISABLE_JTAG + JTAG_CHAIN => JTAG_CHAIN, + DISABLE_JTAG => DISABLE_JTAG ) port map ( - CAPTURE => Capture, - DRCK => drck, - RESET => Reset, - RUNTEST => RunTest, - SEL => Sel, - SHIFT => Shift, - TCK => Test_Clock, - TDI => Test_DataIn, - TMS => Test_ModeSelect, - UPDATE => Update, - TDO => Test_DataOut + CAPTURE => Capture, + DRCK => drck, + RESET => Reset, + RUNTEST => RunTest, + SEL => Sel, + SHIFT => Shift, + TCK => Test_Clock, + TDI => Test_DataIn, + TMS => Test_ModeSelect, + UPDATE => Update, + TDO => Test_DataOut ); end generate; @@ -154,21 +154,21 @@ begin begin bscan : BSCANE2 generic map ( - JTAG_CHAIN => JTAG_CHAIN, - DISABLE_JTAG => boolean'image(DISABLE_JTAG) + JTAG_CHAIN => JTAG_CHAIN, + DISABLE_JTAG => boolean'image(DISABLE_JTAG) ) port map ( - CAPTURE => Capture, - DRCK => drck, - RESET => Reset, - RUNTEST => RunTest, - SEL => Sel, - SHIFT => Shift, - TCK => Test_Clock, - TDI => Test_DataIn, - TMS => Test_ModeSelect, - UPDATE => Update, - TDO => Test_DataOut + CAPTURE => Capture, + DRCK => drck, + RESET => Reset, + RUNTEST => RunTest, + SEL => Sel, + SHIFT => Shift, + TCK => Test_Clock, + TDI => Test_DataIn, + TMS => Test_ModeSelect, + UPDATE => Update, + TDO => Test_DataOut ); end generate; end architecture; diff --git a/src/xil/xil_DNAPort.vhdl b/src/xil/xil_DNAPort.vhdl index 0cbda1690..80b82356f 100644 --- a/src/xil/xil_DNAPort.vhdl +++ b/src/xil/xil_DNAPort.vhdl @@ -41,69 +41,69 @@ use work.components.all; entity xil_DNAPort is - generic ( - SIM_DNA_VALUE : bit_vector := resize("0", get_DNABITS) -- DNA value for simulation - ); - port ( - Clock : in std_logic; - Reset : in std_logic; - Valid : out std_logic; - DataOut : out std_logic_vector(get_DNABITS -1 downto 0) - ); + generic ( + SIM_DNA_VALUE : bit_vector := resize("0", get_DNABITS) -- DNA value for simulation + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + Valid : out std_logic; + DataOut : out std_logic_vector(get_DNABITS -1 downto 0) + ); end entity; architecture rtl of xil_DNAPort is - alias DNA_VALUE : bit_vector(SIM_DNA_VALUE'length - 1 downto 0) is SIM_DNA_VALUE; - constant COUNTER_MAX : natural := DataOut'length +2; + alias DNA_VALUE : bit_vector(SIM_DNA_VALUE'length - 1 downto 0) is SIM_DNA_VALUE; + constant COUNTER_MAX : natural := DataOut'length +2; - signal DataOut_i : DataOut'subtype := (others => '0'); - signal Shift : std_logic; - signal Read : std_logic; - signal DataOut_Shift : std_logic; + signal DataOut_i : DataOut'subtype := (others => '0'); + signal Shift : std_logic; + signal Read : std_logic; + signal DataOut_Shift : std_logic; - signal counter_us : unsigned(log2ceilnz(COUNTER_MAX +1) -1 downto 0) := (others => '0'); - signal is_counter_high : std_logic; - signal is_counter_high_1 : std_logic; + signal counter_us : unsigned(log2ceilnz(COUNTER_MAX +1) -1 downto 0) := (others => '0'); + signal is_counter_high : std_logic; + signal is_counter_high_1 : std_logic; begin - counter_us <= upcounter_next(cnt => counter_us, rst => Reset, en => not is_counter_high) when rising_edge(Clock); - is_counter_high <= upcounter_equal(counter_us, COUNTER_MAX); - is_counter_high_1 <= upcounter_equal(counter_us, COUNTER_MAX -1); + counter_us <= upcounter_next(cnt => counter_us, rst => Reset, en => not is_counter_high) when rising_edge(Clock); + is_counter_high <= upcounter_equal(counter_us, COUNTER_MAX); + is_counter_high_1 <= upcounter_equal(counter_us, COUNTER_MAX -1); - Read <= '1' when counter_us = 1 else '0'; - Shift <= '1' when counter_us > 1 and is_counter_high_1 = '0' else '0'; - Valid <= is_counter_high; - DataOut <= DataOut_i; + Read <= '1' when counter_us = 1 else '0'; + Shift <= '1' when counter_us > 1 and is_counter_high_1 = '0' else '0'; + Valid <= is_counter_high; + DataOut <= DataOut_i; - genSeries: if THIS_DEVICE.DevSeries = DEVICE_SERIES_7_SERIES generate - DataOut_i <= DataOut_i(DataOut_i'high -1 downto 0) & DataOut_Shift when rising_edge(Clock) and (counter_us > 1 and is_counter_high = '0'); + genSeries: if THIS_DEVICE.DevSeries = DEVICE_SERIES_7_SERIES generate + DataOut_i <= DataOut_i(DataOut_i'high -1 downto 0) & DataOut_Shift when rising_edge(Clock) and (counter_us > 1 and is_counter_high = '0'); - DNA : component DNA_PORT - generic map ( - SIM_DNA_VALUE => DNA_VALUE - ) - port map ( - CLK => Clock, - READ => Read, - SHIFT => Shift, - DIN => '0', - DOUT => DataOut_Shift - ); - elsif (THIS_DEVICE.DevSeries = DEVICE_SERIES_ULTRASCALE_PLUS) or (DEVICE_SERIES = DEVICE_SERIES_ULTRASCALE) generate - DataOut_i <= DataOut_Shift & DataOut_i(DataOut_i'high downto 1) when rising_edge(Clock) and (counter_us > 1 and is_counter_high = '0'); + DNA : component DNA_PORT + generic map ( + SIM_DNA_VALUE => DNA_VALUE + ) + port map ( + CLK => Clock, + READ => Read, + SHIFT => Shift, + DIN => '0', + DOUT => DataOut_Shift + ); + elsif (THIS_DEVICE.DevSeries = DEVICE_SERIES_ULTRASCALE_PLUS) or (DEVICE_SERIES = DEVICE_SERIES_ULTRASCALE) generate + DataOut_i <= DataOut_Shift & DataOut_i(DataOut_i'high downto 1) when rising_edge(Clock) and (counter_us > 1 and is_counter_high = '0'); - DNA : component DNA_PORTE2 - generic map ( - SIM_DNA_VALUE => to_slv(DNA_VALUE) - ) - port map ( - CLK => Clock, - READ => Read, - SHIFT => Shift, - DIN => '0', - DOUT => DataOut_Shift - ); - else generate - assert false report "xil_DNAPort:: DEVICE_SERIES not supported!" severity failure; - end generate; + DNA : component DNA_PORTE2 + generic map ( + SIM_DNA_VALUE => to_slv(DNA_VALUE) + ) + port map ( + CLK => Clock, + READ => Read, + SHIFT => Shift, + DIN => '0', + DOUT => DataOut_Shift + ); + else generate + assert false report "xil_DNAPort:: DEVICE_SERIES not supported!" severity failure; + end generate; end architecture; diff --git a/src/xil/xil_ICAP.vhdl b/src/xil/xil_ICAP.vhdl index 9d90801fd..4e594adc9 100644 --- a/src/xil/xil_ICAP.vhdl +++ b/src/xil/xil_ICAP.vhdl @@ -1,10 +1,7 @@ --- EMACS settings: -*- tab-width: 4; indent-tabs-mode: t -*- --- vim: tabstop=4:shiftwidth=4:noexpandtab --- kate: tab-width 4; replace-tabs off; indent-width 4; -- ============================================================================= --- Authors: Paul Genssler +-- Authors: Paul Genssler -- --- Entity: ICAP Wrapper +-- Entity: ICAP Wrapper -- -- Description: -- ------------------------------------- @@ -18,13 +15,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,8 +31,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library UniSim; use UniSim.vComponents.all; @@ -45,114 +42,114 @@ use work.config.all; entity xil_ICAP is generic ( - ICAP_WIDTH : string := "X32"; -- Specifies the input and output data width to be used + ICAP_WIDTH : string := "X32"; -- Specifies the input and output data width to be used -- Spartan 6: fixed to 16 bit -- Virtex 4: X8 or X32 -- Rest: X8, X16, X32 - DEVICE_ID : bit_vector := X"1234567"; -- pre-programmed Device ID value for simulation + DEVICE_ID : bit_vector := X"1234567"; -- pre-programmed Device ID value for simulation -- supported by Spartan 6, Virtex 6 and above - SIM_CFG_FILE_NAME : string := "NONE" -- Raw Bitstream (RBT) file to be parsed by the simulation model + SIM_CFG_FILE_NAME : string := "NONE" -- Raw Bitstream (RBT) file to be parsed by the simulation model -- supported by Spartan 6, Virtex 6 and above ); port ( - clk : in std_logic; -- up to 100 MHz (Virtex-6 and above, Virtex-5??) - disable : in std_logic; -- low active enable -> high active disable - rd_wr : in std_logic; -- 0 - write, 1 - read - busy : out std_logic; -- on Series-7 devices always '0' - data_in : in std_logic_vector(31 downto 0); -- on Spartan-6 only 15 downto 0 - data_out : out std_logic_vector(31 downto 0) -- on Spartan-6 only 15 downto 0 + Clock : in std_logic; -- up to 100 MHz (Virtex-6 and above, Virtex-5??) + Disable : in std_logic; -- low active enable -> high active disable + ReadWrite : in std_logic; -- 0 - write, 1 - read + Busy : out std_logic; -- on Series-7 devices always '0' + DataIn : in std_logic_vector(31 downto 0); -- on Spartan-6 only 15 downto 0 + DataOut : out std_logic_vector(31 downto 0) -- on Spartan-6 only 15 downto 0 ); end entity; architecture rtl of xil_ICAP is - constant DEV_INFO : T_DEVICE_INFO := DEVICE_INFO; + constant DEV_INFO : T_DEVICE_INFO := DEVICE_INFO; begin genSpartan6 : if (DEV_INFO.Device = DEVICE_SPARTAN6) generate begin - icap : ICAP_SPARTAN6 - generic map ( - DEVICE_ID => DEVICE_ID, - SIM_CFG_FILE_NAME => SIM_CFG_FILE_NAME - ) - port map ( - BUSY => busy, -- 1-bit output: Busy/Ready output - O => data_out(15 downto 0), -- 16-bit output: Configuartion data output bus - CE => disable, -- 1-bit input: Active-Low ICAP Enable input - CLK => clk, -- 1-bit input: Clock input - I => data_in(15 downto 0), -- 16-bit input: Configuration data input bus - WRITE => rd_wr -- 1-bit input: Read/Write control input - ); + icap : ICAP_SPARTAN6 + generic map ( + DEVICE_ID => DEVICE_ID, + SIM_CFG_FILE_NAME => SIM_CFG_FILE_NAME + ) + port map ( + BUSY => Busy, -- 1-bit output: Busy/Ready output + O => DataOut(15 downto 0), -- 16-bit output: Configuartion data output bus + CE => Disable, -- 1-bit input: Active-Low ICAP Enable input + CLK => Clock, -- 1-bit input: Clock input + I => DataIn(15 downto 0), -- 16-bit input: Configuration data input bus + WRITE => ReadWrite -- 1-bit input: Read/Write control input + ); end generate; genVirtex4 : if (DEV_INFO.Device = DEVICE_VIRTEX4) generate signal ce : std_logic; begin - ce <= not disable; - icap : ICAP_VIRTEX4 - generic map ( - ICAP_WIDTH => ICAP_WIDTH) -- "X8" or "X32" - port map ( - BUSY => busy, -- Busy output - O => data_out, -- 32-bit data output - CE => ce, -- Clock enable input - CLK => clk, -- Clock input - I => data_in, -- 32-bit data input - WRITE => rd_wr -- Write input - ); + ce <= not Disable; + icap : ICAP_VIRTEX4 + generic map ( + ICAP_WIDTH => ICAP_WIDTH) -- "X8" or "X32" + port map ( + BUSY => Busy, -- Busy output + O => DataOut, -- 32-bit data output + CE => ce, -- Clock enable input + CLK => Clock, -- Clock input + I => DataIn, -- 32-bit data input + WRITE => ReadWrite -- Write input + ); end generate; genVirtex5 : if (DEV_INFO.Device = DEVICE_VIRTEX5) generate signal ce : std_logic; begin - ce <= not disable; - icap : ICAP_VIRTEX5 - generic map ( - ICAP_WIDTH => ICAP_WIDTH) - port map ( - BUSY => busy, -- Busy output - O => data_out, -- 32-bit data output - CE => ce, -- Clock enable input - CLK => clk, -- Clock input - I => data_in, -- 32-bit data input - WRITE => rd_wr -- Write input - ); + ce <= not Disable; + icap : ICAP_VIRTEX5 + generic map ( + ICAP_WIDTH => ICAP_WIDTH) + port map ( + BUSY => Busy, -- Busy output + O => DataOut, -- 32-bit data output + CE => ce, -- Clock enable input + CLK => Clock, -- Clock input + I => DataIn, -- 32-bit data input + WRITE => ReadWrite -- Write input + ); end generate; genVirtex6 : if (DEV_INFO.Device = DEVICE_VIRTEX6) generate begin - icap : ICAP_VIRTEX6 - generic map ( - DEVICE_ID => DEVICE_ID, - ICAP_WIDTH => ICAP_WIDTH, - SIM_CFG_FILE_NAME => SIM_CFG_FILE_NAME - ) - port map ( - BUSY => busy, -- 1-bit output: Busy/Ready output - O => data_out, -- 32-bit output: Configuration data output bus - CLK => clk, -- 1-bit input: Clock Input - CSB => disable, -- 1-bit input: Active-Low ICAP input Enable - I => data_in, -- 32-bit input: Configuration data input bus - RDWRB => rd_wr -- 1-bit input: Read/Write Select input - ); + icap : ICAP_VIRTEX6 + generic map ( + DEVICE_ID => DEVICE_ID, + ICAP_WIDTH => ICAP_WIDTH, + SIM_CFG_FILE_NAME => SIM_CFG_FILE_NAME + ) + port map ( + BUSY => Busy, -- 1-bit output: Busy/Ready output + O => DataOut, -- 32-bit output: Configuration data output bus + CLK => Clock, -- 1-bit input: Clock Input + CSB => Disable, -- 1-bit input: Active-Low ICAP input Enable + I => DataIn, -- 32-bit input: Configuration data input bus + RDWRB => ReadWrite -- 1-bit input: Read/Write Select input + ); end generate; genSeries7 : if (DEV_INFO.DevSeries = DEVICE_SERIES_7_SERIES) generate begin - icap : ICAPE2 - generic map ( - DEVICE_ID => X"0" & DEVICE_ID, - ICAP_WIDTH => ICAP_WIDTH, - SIM_CFG_FILE_NAME => SIM_CFG_FILE_NAME - ) - port map ( - O => data_out, -- 32-bit output: Configuration data output bus - CLK => clk, -- 1-bit input: Clock Input - CSIB => disable, -- 1-bit input: Active-Low ICAP Enable - I => data_in, -- 32-bit input: Configuration data input bus - RDWRB => rd_wr -- 1-bit input: Read/Write Select input - ); - busy <= '0'; + icap : ICAPE2 + generic map ( + DEVICE_ID => X"0" & DEVICE_ID, + ICAP_WIDTH => ICAP_WIDTH, + SIM_CFG_FILE_NAME => SIM_CFG_FILE_NAME + ) + port map ( + O => DataOut, -- 32-bit output: Configuration data output bus + CLK => Clock, -- 1-bit input: Clock Input + CSIB => Disable, -- 1-bit input: Active-Low ICAP Enable + I => DataIn, -- 32-bit input: Configuration data input bus + RDWRB => ReadWrite -- 1-bit input: Read/Write Select input + ); + Busy <= '0'; end generate; end architecture; diff --git a/src/xil/xil_Reconfigurator.vhdl b/src/xil/xil_Reconfigurator.vhdl index 0af76604f..e6e158af8 100644 --- a/src/xil/xil_Reconfigurator.vhdl +++ b/src/xil/xil_Reconfigurator.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: Reconfiguration engine for DRP enabled Xilinx primtives +-- Entity: Reconfiguration engine for DRP enabled Xilinx primtives -- -- Description: -- ------------------------------------- @@ -18,13 +18,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,8 +34,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; use work.config.all; use work.utils.all; @@ -46,73 +46,73 @@ use work.xil.all; entity xil_Reconfigurator is generic ( - DEBUG : boolean := FALSE; -- - CLOCK_FREQ : FREQ := 100 MHz; -- - CONFIG_ROM : in T_XIL_DRP_CONFIG_ROM := (0 downto 0 => C_XIL_DRP_CONFIG_SET_EMPTY) -- + DEBUG : boolean := FALSE; -- + CLOCK_FREQ : FREQ := 100 MHz; -- + CONFIG_ROM : in T_XIL_DRP_CONFIG_ROM := (0 downto 0 => C_XIL_DRP_CONFIG_SET_EMPTY) -- ); port ( - Clock : in std_logic; - Reset : in std_logic; - - Reconfig : in std_logic; -- - ReconfigDone : out std_logic; -- - ConfigSelect : in std_logic_vector(log2ceilnz(CONFIG_ROM'length) - 1 downto 0); -- - - DRP_en : out std_logic; -- - DRP_Address : out T_XIL_DRP_ADDRESS; -- - DRP_we : out std_logic; -- - DRP_DataIn : in T_XIL_DRP_DATA; -- - DRP_DataOut : out T_XIL_DRP_DATA; -- - DRP_Ack : in std_logic -- + Clock : in std_logic; + Reset : in std_logic; + + Reconfig : in std_logic; -- + ReconfigDone : out std_logic; -- + ConfigSelect : in std_logic_vector(log2ceilnz(CONFIG_ROM'length) - 1 downto 0); -- + + DRP_Enable : out std_logic; -- + DRP_Address : out T_XIL_DRP_ADDRESS; -- + DRP_WriteEnable : out std_logic; -- + DRP_DataIn : in T_XIL_DRP_DATA; -- + DRP_DataOut : out T_XIL_DRP_DATA; -- + DRP_Ack : in std_logic -- ); end entity; architecture rtl of xil_Reconfigurator is - attribute KEEP : boolean; - attribute FSM_ENCODING : string; - attribute signal_ENCODING : string; + attribute KEEP : boolean; + attribute FSM_ENCODING : string; + attribute signal_ENCODING : string; type T_STATE is ( ST_IDLE, - ST_READ_BEGIN, ST_READ_WAIT, - ST_WRITE_BEGIN, ST_WRITE_WAIT, + ST_READ_BEGIN, ST_READ_WAIT, + ST_WRITE_BEGIN, ST_WRITE_WAIT, ST_DONE ); -- DualConfiguration - Statemachine - signal State : T_STATE := ST_IDLE; - signal NextState : T_STATE; - attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", "speed1"); + signal State : T_STATE := ST_IDLE; + signal NextState : T_STATE; + attribute FSM_ENCODING of State : signal is ite(DEBUG, "gray", "speed1"); - signal DataBuffer_en : std_logic; - signal DataBuffer_d : T_XIL_DRP_DATA := (others => '0'); + signal DataBuffer_en : std_logic; + signal DataBuffer_d : T_XIL_DRP_DATA := (others => '0'); - signal ROM_Entry : T_XIL_DRP_CONFIG; - signal ROM_LastConfigWord : std_logic; + signal ROM_Entry : T_XIL_DRP_CONFIG; + signal ROM_LastConfigWord : std_logic; - signal ConfigSelect_d : std_logic_vector(ConfigSelect'range); + signal ConfigSelect_d : std_logic_vector(ConfigSelect'range); - constant CONFIGINDEX_BITS : positive := log2ceilnz(CONFIG_ROM'length); - signal ConfigIndex_rst : std_logic; - signal ConfigIndex_en : std_logic; - signal ConfigIndex_us : unsigned(CONFIGINDEX_BITS - 1 downto 0); + constant CONFIGINDEX_BITS : positive := log2ceilnz(CONFIG_ROM'length); + signal ConfigIndex_rst : std_logic; + signal ConfigIndex_en : std_logic; + signal ConfigIndex_us : unsigned(CONFIGINDEX_BITS - 1 downto 0); - attribute KEEP of ROM_LastConfigWord : signal is DEBUG; + attribute KEEP of ROM_LastConfigWord : signal is DEBUG; begin -- configuration ROM blkCONFIG_ROM : block - signal SetIndex : integer range 0 to CONFIG_ROM'high; - signal RowIndex : T_XIL_DRP_CONFIG_INDEX; + signal SetIndex : integer range 0 to CONFIG_ROM'high; + signal RowIndex : T_XIL_DRP_CONFIG_INDEX; - attribute KEEP of SetIndex : signal is DEBUG; - attribute KEEP of RowIndex : signal is DEBUG; + attribute KEEP of SetIndex : signal is DEBUG; + attribute KEEP of RowIndex : signal is DEBUG; begin - SetIndex <= to_index(ConfigSelect_d, CONFIG_ROM'high); - RowIndex <= to_index(ConfigIndex_us, T_XIL_DRP_CONFIG_INDEX'high); - ROM_Entry <= CONFIG_ROM(SetIndex).Configs(RowIndex); - ROM_LastConfigWord <= to_sl(RowIndex = CONFIG_ROM(SetIndex).LastIndex); + SetIndex <= to_index(ConfigSelect_d, CONFIG_ROM'high); + RowIndex <= to_index(ConfigIndex_us, T_XIL_DRP_CONFIG_INDEX'high); + ROM_Entry <= CONFIG_ROM(SetIndex).Configs(RowIndex); + ROM_LastConfigWord <= to_sl(RowIndex = CONFIG_ROM(SetIndex).LastIndex); end block; -- configuration index counter @@ -120,10 +120,10 @@ begin begin if rising_edge(Clock) then if (ConfigIndex_rst = '1') then - ConfigIndex_us <= (others => '0'); - ConfigSelect_d <= ConfigSelect; + ConfigIndex_us <= (others => '0'); + ConfigSelect_d <= ConfigSelect; elsif (ConfigIndex_en = '1') then - ConfigIndex_us <= ConfigIndex_us + 1; + ConfigIndex_us <= ConfigIndex_us + 1; end if; end if; end process; @@ -133,81 +133,81 @@ begin begin if rising_edge(Clock) then if (Reset = '1') then - DataBuffer_d <= (others => '0'); + DataBuffer_d <= (others => '0'); elsif (DataBuffer_en = '1') then - DataBuffer_d <= ((DRP_DataIn and not ROM_Entry.Mask) or - (ROM_Entry.Data and ROM_Entry.Mask)); + DataBuffer_d <= ((DRP_DataIn and not ROM_Entry.Mask) or + (ROM_Entry.Data and ROM_Entry.Mask)); end if; end if; end process; -- assign DRP signals - DRP_Address <= ROM_Entry.Address; - DRP_DataOut <= DataBuffer_d; + DRP_Address <= ROM_Entry.Address; + DRP_DataOut <= DataBuffer_d; -- DRP read-modify-write statemachine process(Clock) begin if rising_edge(Clock) then if (Reset = '1') then - State <= ST_IDLE; + State <= ST_IDLE; else - State <= NextState; + State <= NextState; end if; end if; end process; - process(State, Reconfig, ROM_LastConfigWord, DRP_Ack ) + process(State, Reconfig, ROM_LastConfigWord, DRP_Ack ) begin - NextState <= State; + NextState <= State; - ReconfigDone <= '0'; + ReconfigDone <= '0'; -- Dynamic Reconfiguration Port - DRP_en <= '0'; - DRP_we <= '0'; + DRP_Enable <= '0'; + DRP_WriteEnable <= '0'; -- internal modules - ConfigIndex_rst <= '0'; - ConfigIndex_en <= '0'; - DataBuffer_en <= '0'; + ConfigIndex_rst <= '0'; + ConfigIndex_en <= '0'; + DataBuffer_en <= '0'; case State is when ST_IDLE => if (Reconfig = '1') then - ConfigIndex_rst <= '1'; - NextState <= ST_READ_BEGIN; + ConfigIndex_rst <= '1'; + NextState <= ST_READ_BEGIN; end if; when ST_READ_BEGIN => - DRP_en <= '1'; - DRP_we <= '0'; - NextState <= ST_READ_WAIT; + DRP_Enable <= '1'; + DRP_WriteEnable <= '0'; + NextState <= ST_READ_WAIT; when ST_READ_WAIT => if (DRP_Ack = '1') then - DataBuffer_en <= '1'; - NextState <= ST_WRITE_BEGIN; + DataBuffer_en <= '1'; + NextState <= ST_WRITE_BEGIN; end if; when ST_WRITE_BEGIN => - DRP_en <= '1'; - DRP_we <= '1'; - NextState <= ST_WRITE_WAIT; + DRP_Enable <= '1'; + DRP_WriteEnable <= '1'; + NextState <= ST_WRITE_WAIT; when ST_WRITE_WAIT => if (DRP_Ack = '1') then if (ROM_LastConfigWord = '1') then - NextState <= ST_DONE; + NextState <= ST_DONE; else - ConfigIndex_en <= '1'; - NextState <= ST_READ_BEGIN; + ConfigIndex_en <= '1'; + NextState <= ST_READ_BEGIN; end if; end if; when ST_DONE => - ReconfigDone <= '1'; - NextState <= ST_IDLE; + ReconfigDone <= '1'; + NextState <= ST_IDLE; end case; end process; diff --git a/src/xil/xil_SystemMonitor.vhdl b/src/xil/xil_SystemMonitor.vhdl index 0e0b64c3a..781e2f9bf 100644 --- a/src/xil/xil_SystemMonitor.vhdl +++ b/src/xil/xil_SystemMonitor.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Entity: SysMon wrapper for temperature supervision applications +-- Entity: SysMon wrapper for temperature supervision applications -- -- Description: -- ------------------------------------- @@ -27,13 +27,13 @@ -- License: -- ============================================================================= -- Copyright 2007-2015 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -43,10 +43,10 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -library UniSim; +library UniSim; use UniSim.vComponents.all; use work.config.all; @@ -54,20 +54,20 @@ use work.config.all; entity xil_SystemMonitor is port ( - Reset : in std_logic; -- Reset signal for the System Monitor control logic + Reset : in std_logic; -- Reset signal for the System Monitor control logic - Alarm_UserTemp : out std_logic; -- Temperature-sensor alarm output - Alarm_OverTemp : out std_logic; -- Over-Temperature alarm output - Alarm : out std_logic; -- OR'ed output of all the Alarms - VP : in std_logic; -- Dedicated Analog Input Pair - VN : in std_logic + Alarm_UserTemp : out std_logic; -- Temperature-sensor alarm output + Alarm_OverTemp : out std_logic; -- Over-Temperature alarm output + Alarm : out std_logic; -- OR'ed output of all the Alarms + VP : in std_logic; -- Dedicated Analog Input Pair + VN : in std_logic ); end entity; architecture xilinx of xil_SystemMonitor is - signal aux_channel_p : std_logic_vector(15 downto 0); - signal aux_channel_n : std_logic_vector(15 downto 0); + signal aux_channel_p : std_logic_vector(15 downto 0); + signal aux_channel_n : std_logic_vector(15 downto 0); begin aux_channel_p <= (others => '0'); @@ -79,128 +79,128 @@ begin begin SysMonitor : SYSMON generic map ( - INIT_40 => x"0000", -- config reg 0 - INIT_41 => x"300c", -- config reg 1 - INIT_42 => x"0a00", -- config reg 2 - INIT_48 => x"0100", -- Sequencer channel selection - INIT_49 => x"0000", -- Sequencer channel selection - INIT_4A => x"0000", -- Sequencer Average selection - INIT_4B => x"0000", -- Sequencer Average selection - INIT_4C => x"0000", -- Sequencer Bipolar selection - INIT_4D => x"0000", -- Sequencer Bipolar selection - INIT_4E => x"0000", -- Sequencer Acq time selection - INIT_4F => x"0000", -- Sequencer Acq time selection - INIT_50 => x"a418", -- Temp alarm trigger - INIT_51 => x"5999", -- Vccint upper alarm limit - INIT_52 => x"e000", -- Vccaux upper alarm limit - INIT_53 => x"b363", -- Temp alarm OT upper - INIT_54 => x"9c87", -- Temp alarm reset - INIT_55 => x"5111", -- Vccint lower alarm limit - INIT_56 => x"caaa", -- Vccaux lower alarm limit - INIT_57 => x"a425", -- Temp alarm OT reset - SIM_DEVICE => "VIRTEX6", - SIM_MONITOR_FILE => "SystemMonitor_sim.txt" + INIT_40 => x"0000", -- config reg 0 + INIT_41 => x"300c", -- config reg 1 + INIT_42 => x"0a00", -- config reg 2 + INIT_48 => x"0100", -- Sequencer channel selection + INIT_49 => x"0000", -- Sequencer channel selection + INIT_4A => x"0000", -- Sequencer Average selection + INIT_4B => x"0000", -- Sequencer Average selection + INIT_4C => x"0000", -- Sequencer Bipolar selection + INIT_4D => x"0000", -- Sequencer Bipolar selection + INIT_4E => x"0000", -- Sequencer Acq time selection + INIT_4F => x"0000", -- Sequencer Acq time selection + INIT_50 => x"a418", -- Temp alarm trigger + INIT_51 => x"5999", -- Vccint upper alarm limit + INIT_52 => x"e000", -- Vccaux upper alarm limit + INIT_53 => x"b363", -- Temp alarm OT upper + INIT_54 => x"9c87", -- Temp alarm reset + INIT_55 => x"5111", -- Vccint lower alarm limit + INIT_56 => x"caaa", -- Vccaux lower alarm limit + INIT_57 => x"a425", -- Temp alarm OT reset + SIM_DEVICE => "VIRTEX6", + SIM_MONITOR_FILE => "SystemMonitor_sim.txt" ) port map ( -- Control and Clock - RESET => Reset, - CONVSTCLK => '0', - CONVST => '0', + RESET => Reset, + CONVSTCLK => '0', + CONVST => '0', -- DRP port - DCLK => '0', - DEN => '0', - DADDR => "0000000", - DWE => '0', - DI => x"0000", - DO => open, - DRDY => open, + DCLK => '0', + DEN => '0', + DADDR => "0000000", + DWE => '0', + DI => x"0000", + DO => open, + DRDY => open, -- External analog inputs - VAUXN => aux_channel_n, - VAUXP => aux_channel_p, - VN => VN, - VP => VP, + VAUXN => aux_channel_n, + VAUXP => aux_channel_p, + VN => VN, + VP => VP, -- Alarms - OT => SysMon_OverTemp, - ALM => SysMon_Alarm, + OT => SysMon_OverTemp, + ALM => SysMon_Alarm, -- Status - CHANNEL => open, - BUSY => open, - EOC => open, - EOS => open, + CHANNEL => open, + BUSY => open, + EOC => open, + EOS => open, - JTAGBUSY => open, - JTAGLOCKED => open, - JTAGMODIFIED => open + JTAGBUSY => open, + JTAGLOCKED => open, + JTAGMODIFIED => open ); - Alarm_UserTemp <= SysMon_Alarm(0); - Alarm_OverTemp <= SysMon_OverTemp; - Alarm <= SysMon_Alarm(0) or SysMon_OverTemp; + Alarm_UserTemp <= SysMon_Alarm(0); + Alarm_OverTemp <= SysMon_OverTemp; + Alarm <= SysMon_Alarm(0) or SysMon_OverTemp; end generate; genSeries7: if (DEVICE_SERIES = DEVICE_SERIES_7_SERIES) generate signal XADC_Alarm : std_logic_vector(7 downto 0); begin SysMonitor : XADC generic map ( - INIT_40 => x"8000", -- config reg 0 - INIT_41 => x"8f0c", -- config reg 1 - INIT_42 => x"0400", -- config reg 2 - INIT_48 => x"0000", -- Sequencer channel selection - INIT_49 => x"0000", -- Sequencer channel selection - INIT_4A => x"0000", -- Sequencer Average selection - INIT_4B => x"0000", -- Sequencer Average selection - INIT_4C => x"0000", -- Sequencer Bipolar selection - INIT_4D => x"0000", -- Sequencer Bipolar selection - INIT_4E => x"0000", -- Sequencer Acq time selection - INIT_4F => x"0000", -- Sequencer Acq time selection - INIT_50 => x"9c87", -- Temp alarm trigger - INIT_51 => x"57e4", -- Vccint upper alarm limit - INIT_52 => x"a147", -- Vccaux upper alarm limit - INIT_53 => x"b363", -- Temp alarm OT upper - INIT_54 => x"99fd", -- Temp alarm reset - INIT_55 => x"52c6", -- Vccint lower alarm limit - INIT_56 => x"9555", -- Vccaux lower alarm limit - INIT_57 => x"a93a", -- Temp alarm OT reset - INIT_58 => x"5999", -- Vbram upper alarm limit - INIT_5C => x"5111", -- Vbram lower alarm limit - SIM_DEVICE => "7SERIES", - SIM_MONITOR_FILE => "design.txt" + INIT_40 => x"8000", -- config reg 0 + INIT_41 => x"8f0c", -- config reg 1 + INIT_42 => x"0400", -- config reg 2 + INIT_48 => x"0000", -- Sequencer channel selection + INIT_49 => x"0000", -- Sequencer channel selection + INIT_4A => x"0000", -- Sequencer Average selection + INIT_4B => x"0000", -- Sequencer Average selection + INIT_4C => x"0000", -- Sequencer Bipolar selection + INIT_4D => x"0000", -- Sequencer Bipolar selection + INIT_4E => x"0000", -- Sequencer Acq time selection + INIT_4F => x"0000", -- Sequencer Acq time selection + INIT_50 => x"9c87", -- Temp alarm trigger + INIT_51 => x"57e4", -- Vccint upper alarm limit + INIT_52 => x"a147", -- Vccaux upper alarm limit + INIT_53 => x"b363", -- Temp alarm OT upper + INIT_54 => x"99fd", -- Temp alarm reset + INIT_55 => x"52c6", -- Vccint lower alarm limit + INIT_56 => x"9555", -- Vccaux lower alarm limit + INIT_57 => x"a93a", -- Temp alarm OT reset + INIT_58 => x"5999", -- Vbram upper alarm limit + INIT_5C => x"5111", -- Vbram lower alarm limit + SIM_DEVICE => "7SERIES", + SIM_MONITOR_FILE => "design.txt" ) port map ( -- Control and Clock - RESET => Reset, - CONVSTCLK => '0', - CONVST => '0', + RESET => Reset, + CONVSTCLK => '0', + CONVST => '0', -- DRP port - DCLK => '0', - DEN => '0', - DADDR => "0000000", - DWE => '0', - DI => x"0000", - DO => open, - DRDY => open, + DCLK => '0', + DEN => '0', + DADDR => "0000000", + DWE => '0', + DI => x"0000", + DO => open, + DRDY => open, -- External analog inputs - VAUXN => aux_channel_n, - VAUXP => aux_channel_p, - VN => VN, - VP => VP, + VAUXN => aux_channel_n, + VAUXP => aux_channel_p, + VN => VN, + VP => VP, -- Alarms - OT => Alarm_OverTemp, - ALM => XADC_Alarm, + OT => Alarm_OverTemp, + ALM => XADC_Alarm, -- Status - MUXADDR => open, - CHANNEL => open, - BUSY => open, - EOC => open, - EOS => open, + MUXADDR => open, + CHANNEL => open, + BUSY => open, + EOC => open, + EOS => open, - JTAGBUSY => open, - JTAGLOCKED => open, - JTAGMODIFIED => open + JTAGBUSY => open, + JTAGLOCKED => open, + JTAGMODIFIED => open ); - Alarm <= XADC_Alarm(7); - Alarm_UserTemp <= XADC_Alarm(0); + Alarm <= XADC_Alarm(7); + Alarm_UserTemp <= XADC_Alarm(0); end generate; genUltraScale: if (DEVICE_SERIES = DEVICE_SERIES_ULTRASCALE) generate signal SysMon_Alarm : std_logic_vector(15 downto 0); @@ -286,8 +286,8 @@ begin VP => VP ); - Alarm <= SysMon_Alarm(7); - Alarm_UserTemp <= SysMon_Alarm(0); + Alarm <= SysMon_Alarm(7); + Alarm_UserTemp <= SysMon_Alarm(0); end generate; genUltraScalePlus: if (DEVICE_SERIES = DEVICE_SERIES_ULTRASCALE_PLUS) generate signal SysMon_Alarm : std_logic_vector(7 downto 0); @@ -383,7 +383,7 @@ begin VP => vp ); - Alarm <= SysMon_Alarm(7); - Alarm_UserTemp <= SysMon_Alarm(0); + Alarm <= SysMon_Alarm(7); + Alarm_UserTemp <= SysMon_Alarm(0); end generate; end architecture; diff --git a/tb/README.md b/tb/README.md index a2bec0a71..94a1a8f53 100644 --- a/tb/README.md +++ b/tb/README.md @@ -47,7 +47,7 @@ Table of Content: ## Quick Example The following quick example uses the Xilinx ISE Simulator to compile a testbench for the module -`arith_prng.vhdl` (Pseudo Random Number Generator - PRNG). The VHDL file is located at +`arith_PRNG.vhdl` (Pseudo Random Number Generator - PRNG). The VHDL file is located at `/src/arith/` and virtually a member in the `PoC.arith` namespace. So the module can be identified by an unique name: `PoC.arith.prng`, which is passed to the testbench script. @@ -62,10 +62,10 @@ The CLI option switch `isim` chooses *ISE Simulator* (iSim) as the simulator and to the tool. All required source file are gathered and "fused" to an executable. Afterwards this executable is launched in CLI mode and it's outputs are displayed in console: -[![PowerShell console output for PoC.arith.prng][arith_prng_tb]][arith_prng_tb] +[![PowerShell console output for PoC.arith.prng][arith_PRNG_tb]][arith_PRNG_tb] (click to enlarge) - [arith_prng_tb]: https://github.com/VLSI-EDA/PoC/wiki/images/arith_prng_tb.png + [arith_PRNG_tb]: https://github.com/VHDL/PoC/wiki/images/arith_PRNG_tb.png ##### Example 2: @@ -79,10 +79,10 @@ cd See the red frame in the lower left corner: If everything was ok: `SIMULATION RESULT = PASSED` is printed onto the simulator console. -[![iSim GUI for PoC.arith.prng][arith_prng_tb_isim]][arith_prng_tb_isim] +[![iSim GUI for PoC.arith.prng][arith_PRNG_tb_isim]][arith_PRNG_tb_isim] (click to enlarge) - [arith_prng_tb_isim]: https://github.com/VLSI-EDA/PoC/wiki/images/arith_prng_tb_isim.png + [arith_PRNG_tb_isim]: https://github.com/VHDL/PoC/wiki/images/arith_PRNG_tb_isim.png ## Running a Testbench @@ -215,5 +215,5 @@ cd ``` - [wiki_Requirements]: https://github.com/VLSI-EDA/PoC/wiki/Requirements - [wiki_Configuration]: https://github.com/VLSI-EDA/PoC/wiki/Configuration + [wiki_Requirements]: https://github.com/VHDL/PoC/wiki/Requirements + [wiki_Configuration]: https://github.com/VHDL/PoC/wiki/Configuration diff --git a/tb/RunAllTests.pro b/tb/RunAllTests.pro index f8c45b5cf..8a9b764c2 100644 --- a/tb/RunAllTests.pro +++ b/tb/RunAllTests.pro @@ -23,12 +23,13 @@ library tb_common include ./arith/RunAllTests.pro include ./bus/RunAllTests.pro -#include ./cache/RunAllTests.pro -#include ./common/RunAllTests.pro -disabled ./dstruct/RunAllTests.pro -#include ./fifo/RunAllTests.pro -disabled ./io/RunAllTests.pro -#include ./mem/RunAllTests.pro +# include ./cache/RunAllTests.pro # Not a OSVVM TB, needs coco TB +include ./common/RunAllTests.pro +include ./dstruct/RunAllTests.pro +# include ./fifo/RunAllTests.pro # Not a OSVVM TB +# include ./io/RunAllTests.pro # Not a OSVVM TB +# include ./mem/RunAllTests.pro # Not a OSVVM TB include ./misc/RunAllTests.pro -#include ./sim/RunAllTests.pro -#include ./sort/RunAllTests.pro +# include ./sim/RunAllTests.pro # Not a OSVVM TB +# include ./sort/RunAllTests.pro # Not a OSVVM TB +include ./sync/RunAllTests.pro diff --git a/tb/arith/Adder_Wide/RunAllTests.pro b/tb/arith/Adder_Wide/RunAllTests.pro new file mode 100644 index 000000000..25ca857e3 --- /dev/null +++ b/tb/arith/Adder_Wide/RunAllTests.pro @@ -0,0 +1,31 @@ +# ============================================================================= +# Authors: +# Gustavo Martin +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +TestSuite PoC.arith.Adder_Wide + +library tb_arith_Adder_Wide + +analyze arith_Adder_Wide_TestController_pkg.vhdl +analyze arith_Adder_Wide_TestController.vhdl +analyze arith_Adder_Wide_TestHarness.vhdl + +# Test Cases +RunTest arith_Adder_Wide_Simple.vhdl diff --git a/tb/arith/Adder_Wide/arith_Adder_Wide_Simple.vhdl b/tb/arith/Adder_Wide/arith_Adder_Wide_Simple.vhdl new file mode 100644 index 000000000..575539652 --- /dev/null +++ b/tb/arith/Adder_Wide/arith_Adder_Wide_Simple.vhdl @@ -0,0 +1,143 @@ +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Gustavo Martin +-- +-- Entity: arith_Adder_Wide_Simple +-- +-- Description: +-- ------------------------------------- +-- Simple OSVVM test for arith_Adder_Wide +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; + +library PoC; +use PoC.strings.all; +use PoC.physical.all; +use PoC.arith.all; + +use work.arith_Adder_Wide_TestController_pkg.all; + +architecture Simple of arith_Adder_Wide_TestController is + signal TestDone : integer_barrier := 1; + constant TCID : AlertLogIDType := NewID("Adder_WideTest"); + constant TPERIOD_CLOCK : time := 10 ns; + +begin + + ControlProc: process + constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); + constant TIMEOUT : time := 10 ms; + begin + SetTestName("arith_Adder_Wide_Simple"); + + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, FALSE); + SetLogEnable(DEBUG, FALSE); + wait for 0 ns; wait for 0 ns; + + TranscriptOpen; + SetTranscriptMirror(TRUE); + + wait until Reset = '0'; + ClearAlerts; + + WaitForBarrier(TestDone, TIMEOUT); + AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); + AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); + + EndOfTestReports(ReportAll => TRUE); + std.env.stop; + end process; + + CheckerProc: process + constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); + variable ai, bi : integer; + variable expected : natural; + variable actual_sum : unsigned(9 downto 0); + begin + wait until Reset = '0'; + WaitForClock(Clock); + + for i in 0 to 2**9-1 loop + a <= std_logic_vector(to_unsigned(i, 9)); + for j in 0 to 2**9-1 loop + b <= std_logic_vector(to_unsigned(j, 9)); + cin <= '0'; + WaitForClock(Clock); + for arch in T_Adder_Architecture loop + for skip in T_Adder_CarrySkipScheme loop + -- Test with P_INCLUSIVE = false + expected := (i + j) mod 2**10; + actual_sum := unsigned(cout(arch, skip, false) & s(arch, skip, false)); + AffirmIf(ProcID, expected = to_integer(actual_sum), + "Output Error: " & integer'image(i) & "+" & integer'image(j) & + " arch=" & T_Adder_Architecture'image(arch) & " skip=" & T_Adder_CarrySkipScheme'image(skip) & " incl=false" + ); + + -- Test with P_INCLUSIVE = true + actual_sum := unsigned(cout(arch, skip, true) & s(arch, skip, true)); + AffirmIf(ProcID, expected = to_integer(actual_sum), + "Output Error: " & integer'image(i) & "+" & integer'image(j) & + " arch=" & T_Adder_Architecture'image(arch) & " skip=" & T_Adder_CarrySkipScheme'image(skip) & " incl=true" + ); + end loop; + end loop; + + cin <= '1'; + WaitForClock(Clock); + for arch in T_Adder_Architecture loop + for skip in T_Adder_CarrySkipScheme loop + -- Test with P_INCLUSIVE = false + expected := (i + j + 1) mod 2**10; + actual_sum := unsigned(cout(arch, skip, false) & s(arch, skip, false)); + AffirmIf(ProcID, expected = to_integer(actual_sum), + "Output Error with carry: " & integer'image(i) & "+" & integer'image(j) & "+1" & + " arch=" & T_Adder_Architecture'image(arch) & " skip=" & T_Adder_CarrySkipScheme'image(skip) & " incl=false" + ); + + -- Test with P_INCLUSIVE = true + actual_sum := unsigned(cout(arch, skip, true) & s(arch, skip, true)); + AffirmIf(ProcID, expected = to_integer(actual_sum), + "Output Error with carry: " & integer'image(i) & "+" & integer'image(j) & "+1" & + " arch=" & T_Adder_Architecture'image(arch) & " skip=" & T_Adder_CarrySkipScheme'image(skip) & " incl=true" + ); + end loop; + end loop; + + end loop; + end loop; + + WaitForBarrier(TestDone); + wait; + end process; +end architecture; + +configuration arith_Adder_Wide_Simple of arith_Adder_Wide_TestHarness is + for TestHarness + for TestCtrl: arith_Adder_Wide_TestController + use entity work.arith_Adder_Wide_TestController(Simple); + end for; + end for; +end configuration; diff --git a/tb/arith/addw/arith_addw_TestController.vhdl b/tb/arith/Adder_Wide/arith_Adder_Wide_TestController.vhdl similarity index 67% rename from tb/arith/addw/arith_addw_TestController.vhdl rename to tb/arith/Adder_Wide/arith_Adder_Wide_TestController.vhdl index 25ecff82c..d159b0e06 100644 --- a/tb/arith/addw/arith_addw_TestController.vhdl +++ b/tb/arith/Adder_Wide/arith_Adder_Wide_TestController.vhdl @@ -1,12 +1,12 @@ -- ============================================================================= --- Authors: Thomas B. Preusser +-- Authors: Thomas B. Preusser -- Gustavo Martin -- --- Entity: arith_addw_TestController +-- Entity: arith_Adder_Wide_TestController -- -- Description: -- ------------------------------------- --- Test controller for arith_addw +-- Test controller for arith_Adder_Wide -- -- License: -- ============================================================================= @@ -16,7 +16,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,18 +34,18 @@ context osvvm.OsvvmContext; library PoC; use PoC.arith.all; -use work.arith_addw_TestController_pkg.all; +use work.arith_Adder_Wide_TestController_pkg.all; -entity arith_addw_TestController is - port ( - Clock : in std_logic; - Reset : in std_logic; - - -- DUT ports (arrays for all variants) - a : out word; - b : out word; - cin : out std_logic; - s : in word_vector; - cout : in carry_vector - ); +entity arith_Adder_Wide_TestController is + port ( + Clock : in std_logic; + Reset : in std_logic; + + -- DUT ports (arrays for all variants) + a : out word; + b : out word; + cin : out std_logic; + s : in word_vector; + cout : in carry_vector + ); end entity; diff --git a/tb/arith/addw/arith_addw_TestController_pkg.vhdl b/tb/arith/Adder_Wide/arith_Adder_Wide_TestController_pkg.vhdl similarity index 64% rename from tb/arith/addw/arith_addw_TestController_pkg.vhdl rename to tb/arith/Adder_Wide/arith_Adder_Wide_TestController_pkg.vhdl index 2eae3ccd2..f24d2cf21 100644 --- a/tb/arith/addw/arith_addw_TestController_pkg.vhdl +++ b/tb/arith/Adder_Wide/arith_Adder_Wide_TestController_pkg.vhdl @@ -1,12 +1,12 @@ -- ============================================================================= --- Authors: Thomas B. Preusser +-- Authors: Thomas B. Preusser -- Gustavo Martin -- --- Entity: arith_addw_TestController_pkg +-- Entity: arith_Adder_Wide_TestController_pkg -- -- Description: -- ------------------------------------- --- Test controller package for arith_addw +-- Test controller package for arith_Adder_Wide -- -- License: -- ============================================================================= @@ -16,7 +16,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,16 +34,16 @@ context osvvm.OsvvmContext; library PoC; use PoC.arith.all; -package arith_addw_TestController_pkg is +package arith_Adder_Wide_TestController_pkg is - constant N : positive := 9; - constant K : positive := 2; + constant N : positive := 9; + constant K : positive := 2; - subtype tArch_test is tArch; - subtype tSkip_test is tSkipping; + subtype tArch_test is T_Adder_Architecture; + subtype tSkip_test is T_Adder_CarrySkipScheme; - subtype word is std_logic_vector(N-1 downto 0); - type word_vector is array(tArch_test, tSkip_test, boolean) of word; - type carry_vector is array(tArch_test, tSkip_test, boolean) of std_logic; + subtype word is std_logic_vector(N-1 downto 0); + type word_vector is array(tArch_test, tSkip_test, boolean) of word; + type carry_vector is array(tArch_test, tSkip_test, boolean) of std_logic; end package; diff --git a/tb/arith/Adder_Wide/arith_Adder_Wide_TestHarness.vhdl b/tb/arith/Adder_Wide/arith_Adder_Wide_TestHarness.vhdl new file mode 100644 index 000000000..abd590057 --- /dev/null +++ b/tb/arith/Adder_Wide/arith_Adder_Wide_TestHarness.vhdl @@ -0,0 +1,132 @@ +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Gustavo Martin +-- +-- Entity: arith_Adder_Wide_TestHarness +-- +-- Description: +-- ------------------------------------- +-- Test harness for arith_Adder_Wide +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; + +library PoC; +use PoC.strings.all; +use PoC.physical.all; +use PoC.arith.all; + +use work.arith_Adder_Wide_TestController_pkg.all; + +entity arith_Adder_Wide_TestHarness is +end entity; + +architecture TestHarness of arith_Adder_Wide_TestHarness is + constant TPERIOD_CLOCK : time := 10 ns; + + signal Clock : std_logic := '1'; + signal Reset : std_logic := '1'; + signal a, b : word := (others => '0'); + signal cin : std_logic := '0'; + signal s : word_vector; + signal cout : carry_vector; + + component arith_Adder_Wide_TestController is + port ( + Clock : in std_logic; + Reset : in std_logic; + a : out word; + b : out word; + cin : out std_logic; + s : in word_vector; + cout : in carry_vector + ); + end component; + +begin + Osvvm.ClockResetPkg.CreateClock( + Clk => Clock, + Period => TPERIOD_CLOCK + ); + + Osvvm.ClockResetPkg.CreateReset( + Reset => Reset, + ResetActive => '1', + Clk => Clock, + Period => 5*TPERIOD_CLOCK, + tpd => 0 ns + ); + + genArchs: for i in tArch_test generate + genSkips: for j in tSkip_test generate + genIncl_false: if true generate + DUT_false : entity PoC.arith_Adder_Wide + generic map ( + BITS => N, + BLOCKS => K, + ARCH => i, + SKIPPING => j, + P_INCLUSIVE => false + ) + port map ( + A => a, + B => b, + CarryIn => cin, + Sum => s(i, j, false), + CarryOut => cout(i, j, false) + ); + end generate; + + genIncl_true: if true generate + DUT_true : entity PoC.arith_Adder_Wide + generic map ( + BITS => N, + BLOCKS => K, + ARCH => i, + SKIPPING => j, + P_INCLUSIVE => true + ) + port map ( + A => a, + B => b, + CarryIn => cin, + Sum => s(i, j, true), + CarryOut => cout(i, j, true) + ); + end generate; + end generate; + end generate; + + TestCtrl: component arith_Adder_Wide_TestController + port map ( + Clock => Clock, + Reset => Reset, + a => a, + b => b, + cin => cin, + s => s, + cout => cout + ); + +end architecture; diff --git a/tb/arith/carrychain_inc/RunAllTests.pro b/tb/arith/CarryChain_inc/RunAllTests.pro similarity index 81% rename from tb/arith/carrychain_inc/RunAllTests.pro rename to tb/arith/CarryChain_inc/RunAllTests.pro index 0bda856bd..7200c1596 100644 --- a/tb/arith/carrychain_inc/RunAllTests.pro +++ b/tb/arith/CarryChain_inc/RunAllTests.pro @@ -19,12 +19,12 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.arith.carrychain_inc +TestSuite PoC.arith.CarryChain_inc -library tb_arith_carrychain_inc +library tb_arith_CarryChain_inc -analyze arith_carrychain_inc_TestController.vhdl -analyze arith_carrychain_inc_TestHarness.vhdl +analyze arith_CarryChain_inc_TestController.vhdl +analyze arith_CarryChain_inc_TestHarness.vhdl # Test Cases -RunTest arith_carrychain_inc_Simple.vhdl +RunTest arith_CarryChain_inc_Simple.vhdl diff --git a/tb/arith/carrychain_inc/arith_carrychain_inc_Simple.vhdl b/tb/arith/CarryChain_inc/arith_CarryChain_inc_Simple.vhdl similarity index 87% rename from tb/arith/carrychain_inc/arith_carrychain_inc_Simple.vhdl rename to tb/arith/CarryChain_inc/arith_CarryChain_inc_Simple.vhdl index 4d1789434..1015ee399 100644 --- a/tb/arith/carrychain_inc/arith_carrychain_inc_Simple.vhdl +++ b/tb/arith/CarryChain_inc/arith_CarryChain_inc_Simple.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_carrychain_inc_TestController +-- Entity: arith_CarryChain_inc_TestController -- -- Description: -- ------------------------------------- --- Simple test for arith_carrychain_inc component +-- Simple test for arith_CarryChain_inc component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,7 +34,7 @@ context osvvm.OsvvmContext; library PoC; use PoC.utils.all; -architecture Simple of arith_carrychain_inc_TestController is +architecture Simple of arith_CarryChain_inc_TestController is signal TestDone : integer_barrier := 1; constant TCID : AlertLogIDType := NewID("TestCtrl"); @@ -44,7 +44,7 @@ begin constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); constant TIMEOUT : time := 10 ms; begin - SetTestName("arith_carrychain_inc_Simple"); + SetTestName("arith_CarryChain_inc_Simple"); SetLogEnable(PASSED, FALSE); SetLogEnable(INFO, FALSE); @@ -124,10 +124,10 @@ begin end process; end architecture; -configuration arith_carrychain_inc_Simple of arith_carrychain_inc_TestHarness is +configuration arith_CarryChain_inc_Simple of arith_CarryChain_inc_TestHarness is for TestHarness - for TestCtrl: arith_carrychain_inc_TestController - use entity work.arith_carrychain_inc_TestController(Simple); + for TestCtrl: arith_CarryChain_inc_TestController + use entity work.arith_CarryChain_inc_TestController(Simple); end for; end for; end configuration; diff --git a/tb/arith/carrychain_inc/arith_carrychain_inc_TestController.vhdl b/tb/arith/CarryChain_inc/arith_CarryChain_inc_TestController.vhdl similarity index 82% rename from tb/arith/carrychain_inc/arith_carrychain_inc_TestController.vhdl rename to tb/arith/CarryChain_inc/arith_CarryChain_inc_TestController.vhdl index 9d54ca4e8..8a5e9e2f7 100644 --- a/tb/arith/carrychain_inc/arith_carrychain_inc_TestController.vhdl +++ b/tb/arith/CarryChain_inc/arith_CarryChain_inc_TestController.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_carrychain_inc_TestController +-- Entity: arith_CarryChain_inc_TestController -- -- Description: -- ------------------------------------- --- Test controller for arith_carrychain_inc component +-- Test controller for arith_CarryChain_inc component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,7 +31,7 @@ library osvvm; context osvvm.OsvvmContext; -entity arith_carrychain_inc_TestController is +entity arith_CarryChain_inc_TestController is port ( Clock : in std_logic; Reset : in std_logic; diff --git a/tb/arith/carrychain_inc/arith_carrychain_inc_TestHarness.vhdl b/tb/arith/CarryChain_inc/arith_CarryChain_inc_TestHarness.vhdl similarity index 81% rename from tb/arith/carrychain_inc/arith_carrychain_inc_TestHarness.vhdl rename to tb/arith/CarryChain_inc/arith_CarryChain_inc_TestHarness.vhdl index b21688609..2877192c9 100644 --- a/tb/arith/carrychain_inc/arith_carrychain_inc_TestHarness.vhdl +++ b/tb/arith/CarryChain_inc/arith_CarryChain_inc_TestHarness.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= -- Authors: Gustavo Martin -- --- Entity: arith_carrychain_inc_TestHarness +-- Entity: arith_CarryChain_inc_TestHarness -- -- Description: -- ------------------------------------- --- Test harness for arith_carrychain_inc component +-- Test harness for arith_CarryChain_inc component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,11 +34,11 @@ context osvvm.OsvvmContext; library PoC; -entity arith_carrychain_inc_TestHarness is +entity arith_CarryChain_inc_TestHarness is end entity; -architecture TestHarness of arith_carrychain_inc_TestHarness is +architecture TestHarness of arith_CarryChain_inc_TestHarness is constant TPERIOD_CLOCK : time := 10 ns; constant BITS : positive := 8; @@ -51,7 +51,7 @@ architecture TestHarness of arith_carrychain_inc_TestHarness is signal Y : std_logic_vector(BITS - 1 downto 0); - component arith_carrychain_inc_TestController is + component arith_CarryChain_inc_TestController is port ( Clock : in std_logic; Reset : in std_logic; @@ -75,17 +75,17 @@ begin tpd => 0 ns ); - DUT : entity PoC.arith_carrychain_inc + DUT : entity PoC.arith_CarryChain_inc generic map ( BITS => BITS ) port map ( - X => X, - CIn => CIn, - Y => Y + A => X, + CarryIn => CIn, + Sum => Y ); - TestCtrl: component arith_carrychain_inc_TestController + TestCtrl: component arith_CarryChain_inc_TestController port map ( Clock => Clock, Reset => Reset, diff --git a/tb/arith/convert_bin2bcd/RunAllTests.pro b/tb/arith/Convert_Binary2BCD/RunAllTests.pro similarity index 79% rename from tb/arith/convert_bin2bcd/RunAllTests.pro rename to tb/arith/Convert_Binary2BCD/RunAllTests.pro index c4be59566..fca49fb92 100644 --- a/tb/arith/convert_bin2bcd/RunAllTests.pro +++ b/tb/arith/Convert_Binary2BCD/RunAllTests.pro @@ -18,12 +18,12 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.arith.convert_bin2bcd +TestSuite PoC.arith.Convert_Binary2BCD -library tb_arith_convert_bin2bcd +library tb_arith_Convert_Binary2BCD -analyze arith_convert_bin2bcd_TestController.vhdl -analyze arith_convert_bin2bcd_TestHarness.vhdl +analyze arith_Convert_Binary2BCD_TestController.vhdl +analyze arith_Convert_Binary2BCD_TestHarness.vhdl # Test Cases -RunTest arith_convert_bin2bcd_Simple.vhdl +RunTest arith_Convert_Binary2BCD_Simple.vhdl diff --git a/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_Simple.vhdl b/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_Simple.vhdl new file mode 100644 index 000000000..00c5a4e04 --- /dev/null +++ b/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_Simple.vhdl @@ -0,0 +1,166 @@ +-- ============================================================================= +-- Authors: Patrick Lehmann +-- Gustavo Martin +-- +-- Entity: arith_Convert_Binary2BCD_Simple +-- +-- Description: +-- ------------------------------------- +-- Simple OSVVM test for arith_Convert_Binary2BCD +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; + +library PoC; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.strings.all; +use PoC.physical.all; + +architecture Simple of arith_Convert_Binary2BCD_TestController is + constant TCID : AlertLogIDType := NewID("ConvBin2BCDTest"); + signal TestDone : integer_barrier := 1; + + constant INPUT_1 : integer := 38442113; + constant INPUT_2 : integer := 78734531; + constant INPUT_3 : integer := 14902385; + + function Check_Conv2(INPUT : integer; BITS : positive; DIGITS : positive; BCDDigits : T_BCD_VECTOR; Sign : std_logic) return boolean is + variable nat : natural; + begin + if INPUT >= 2**(BITS-1) then + nat := (-INPUT) mod 2**(BITS-1); + if Sign /= '1' then + return false; + end if; + else + nat := INPUT; + if Sign /= '0' then + return false; + end if; + end if; + + return to_BCD_Vector(nat, DIGITS) = BCDDigits; + end function; + +begin + + ControlProc: process + constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); + constant TIMEOUT : time := 10 ms; + begin + SetTestName("arith_Convert_Binary2BCD_Simple"); + + SetLogEnable(PASSED, TRUE); + SetLogEnable(INFO, TRUE); + SetLogEnable(DEBUG, FALSE); + wait for 0 ns; wait for 0 ns; + + TranscriptOpen; + SetTranscriptMirror(TRUE); + + wait until Reset = '0'; + ClearAlerts; + + WaitForBarrier(TestDone, TIMEOUT); + AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); + -- AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); + + EndOfTestReports(ReportAll => TRUE); + std.env.stop; + end process; + + TestProc: process + constant ProcID : AlertLogIDType := NewID("TestProc", TCID); + begin + Start <= '0'; + Conv1_Binary <= (others => '0'); + Conv2_Binary <= (others => '0'); + + wait until Reset = '0'; + WaitForClock(Clock, 4); + + -- Test Case 1 + Start <= '1'; + Conv1_Binary <= to_slv(INPUT_1, CONV1_BITS); + Conv2_Binary <= to_slv(INPUT_1, CONV2_BITS); + WaitForClock(Clock); + + Start <= '0'; + WaitForClock(Clock); + + for i in 0 to (CONV1_BITS - 1) loop + WaitForClock(Clock); + end loop; + + AffirmIf(ProcID, to_BCD_Vector(INPUT_1, CONV1_DIGITS) = Conv1_BCDDigits, "Conv1_BCDDigits is wrong for INPUT_1."); + AffirmIf(ProcID, Check_Conv2(INPUT_1, CONV2_BITS, CONV2_DIGITS, Conv2_BCDDigits, Conv2_Sign), "Conv2_BCDDigits is wrong for INPUT_1."); + + -- Test Case 2 + Start <= '1'; + Conv1_Binary <= to_slv(INPUT_2, CONV1_BITS); + Conv2_Binary <= to_slv(INPUT_2, CONV2_BITS); + WaitForClock(Clock); + + Start <= '0'; + WaitForClock(Clock); + + for i in 0 to (CONV1_BITS - 1) loop + WaitForClock(Clock); + end loop; + + AffirmIf(ProcID, to_BCD_Vector(INPUT_2, CONV1_DIGITS) = Conv1_BCDDigits, "Conv1_BCDDigits is wrong for INPUT_2."); + AffirmIf(ProcID, Check_Conv2(INPUT_2, CONV2_BITS, CONV2_DIGITS, Conv2_BCDDigits, Conv2_Sign), "Conv2_BCDDigits is wrong for INPUT_2."); + + -- Test Case 3 + Start <= '1'; + Conv1_Binary <= to_slv(INPUT_3, CONV1_BITS); + Conv2_Binary <= to_slv(INPUT_3, CONV2_BITS); + WaitForClock(Clock); + + Start <= '0'; + WaitForClock(Clock); + + for i in 0 to (CONV1_BITS - 1) loop + WaitForClock(Clock); + end loop; + + AffirmIf(ProcID, to_BCD_Vector(INPUT_3, CONV1_DIGITS) = Conv1_BCDDigits, "Conv1_BCDDigits is wrong for INPUT_3."); + AffirmIf(ProcID, Check_Conv2(INPUT_3, CONV2_BITS, CONV2_DIGITS, Conv2_BCDDigits, Conv2_Sign), "Conv2_BCDDigits is wrong for INPUT_3."); + + WaitForBarrier(TestDone); + wait; + end process; + +end architecture; + +configuration arith_Convert_Binary2BCD_Simple of arith_Convert_Binary2BCD_TestHarness is + for TestHarness + for TestCtrl: arith_Convert_Binary2BCD_TestController + use entity work.arith_Convert_Binary2BCD_TestController(Simple); + end for; + end for; +end configuration; diff --git a/tb/arith/convert_bin2bcd/arith_convert_bin2bcd_TestController.vhdl b/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_TestController.vhdl similarity index 56% rename from tb/arith/convert_bin2bcd/arith_convert_bin2bcd_TestController.vhdl rename to tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_TestController.vhdl index 29b00f8c3..b4541c8cc 100644 --- a/tb/arith/convert_bin2bcd/arith_convert_bin2bcd_TestController.vhdl +++ b/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_TestController.vhdl @@ -2,23 +2,23 @@ -- Authors: Patrick Lehmann -- Gustavo Martin -- --- Entity: arith_convert_bin2bcd_TestController +-- Entity: arith_Convert_Binary2BCD_TestController -- -- Description: -- ------------------------------------- --- Test controller for arith_convert_bin2bcd +-- Test controller for arith_Convert_Binary2BCD -- -- License: -- ============================================================================= -- Copyright 2025-2026 The PoC-Library Authors -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,28 +34,28 @@ library osvvm; context osvvm.OsvvmContext; library PoC; -use PoC.utils.all; +use PoC.utils.all; -entity arith_convert_bin2bcd_TestController is - generic ( - CONV1_BITS : positive; - CONV1_DIGITS : positive; - CONV2_BITS : positive; - CONV2_DIGITS : positive - ); - port ( - Clock : in std_logic; - Reset : in std_logic; - - -- DUT signals - Start : out std_logic; - - Conv1_Binary : out std_logic_vector(CONV1_BITS - 1 downto 0); - Conv1_BCDDigits : in T_BCD_VECTOR(CONV1_DIGITS - 1 downto 0); - Conv1_Sign : in std_logic; - - Conv2_Binary : out std_logic_vector(CONV2_BITS - 1 downto 0); - Conv2_BCDDigits : in T_BCD_VECTOR(CONV2_DIGITS - 1 downto 0); - Conv2_Sign : in std_logic - ); +entity arith_Convert_Binary2BCD_TestController is + generic ( + CONV1_BITS : positive; + CONV1_DIGITS : positive; + CONV2_BITS : positive; + CONV2_DIGITS : positive + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + + -- DUT signals + Start : out std_logic; + + Conv1_Binary : out std_logic_vector(CONV1_BITS - 1 downto 0); + Conv1_BCDDigits : in T_BCD_VECTOR(CONV1_DIGITS - 1 downto 0); + Conv1_Sign : in std_logic; + + Conv2_Binary : out std_logic_vector(CONV2_BITS - 1 downto 0); + Conv2_BCDDigits : in T_BCD_VECTOR(CONV2_DIGITS - 1 downto 0); + Conv2_Sign : in std_logic + ); end entity; diff --git a/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_TestHarness.vhdl b/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_TestHarness.vhdl new file mode 100644 index 000000000..a92ae2444 --- /dev/null +++ b/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_TestHarness.vhdl @@ -0,0 +1,157 @@ +-- ============================================================================= +-- Authors: Patrick Lehmann +-- Gustavo Martin +-- +-- Entity: arith_Convert_Binary2BCD_TestHarness +-- +-- Description: +-- ------------------------------------- +-- Test harness for arith_Convert_Binary2BCD +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; + +library PoC; +use PoC.utils.all; +use PoC.strings.all; +use PoC.physical.all; + +entity arith_Convert_Binary2BCD_TestHarness is +end entity; + +architecture TestHarness of arith_Convert_Binary2BCD_TestHarness is + constant TPERIOD_CLOCK : time := 10 ns; -- 100 MHz + + constant CONV1_BITS : positive := 30; + constant CONV1_DIGITS : positive := 8; + constant CONV2_BITS : positive := 27; + constant CONV2_DIGITS : positive := 8; + + signal Clock : std_logic := '1'; + signal Reset : std_logic := '1'; + + signal Start : std_logic; + + signal Conv1_Binary : std_logic_vector(CONV1_BITS - 1 downto 0); + signal Conv1_BCDDigits : T_BCD_VECTOR(CONV1_DIGITS - 1 downto 0); + signal Conv1_Sign : std_logic; + + signal Conv2_Binary : std_logic_vector(CONV2_BITS - 1 downto 0); + signal Conv2_BCDDigits : T_BCD_VECTOR(CONV2_DIGITS - 1 downto 0); + signal Conv2_Sign : std_logic; + + component arith_Convert_Binary2BCD_TestController is + generic ( + CONV1_BITS : positive; + CONV1_DIGITS : positive; + CONV2_BITS : positive; + CONV2_DIGITS : positive + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + + Start : out std_logic; + + Conv1_Binary : out std_logic_vector(CONV1_BITS - 1 downto 0); + Conv1_BCDDigits : in T_BCD_VECTOR(CONV1_DIGITS - 1 downto 0); + Conv1_Sign : in std_logic; + + Conv2_Binary : out std_logic_vector(CONV2_BITS - 1 downto 0); + Conv2_BCDDigits : in T_BCD_VECTOR(CONV2_DIGITS - 1 downto 0); + Conv2_Sign : in std_logic + ); + end component; + +begin + + Osvvm.ClockResetPkg.CreateClock( + Clk => Clock, + Period => TPERIOD_CLOCK + ); + + Osvvm.ClockResetPkg.CreateReset( + Reset => Reset, + ResetActive => '1', + Clk => Clock, + Period => 5 * TPERIOD_CLOCK, + tpd => 0 ns + ); + + conv1 : entity PoC.arith_Convert_Binary2BCD + generic map ( + BITS => CONV1_BITS, + DIGITS => CONV1_DIGITS, + RADIX => 8 + ) + port map ( + Clock => Clock, + Reset => Reset, + Start => Start, + Busy => open, + Binary => Conv1_Binary, + IsSigned => '0', + BCDDigits => Conv1_BCDDigits, + Sign => Conv1_Sign + ); + + conv2 : entity PoC.arith_Convert_Binary2BCD + generic map ( + BITS => CONV2_BITS, + DIGITS => CONV2_DIGITS, + RADIX => 2 + ) + port map ( + Clock => Clock, + Reset => Reset, + Start => Start, + Busy => open, + Binary => Conv2_Binary, + IsSigned => '1', + BCDDigits => Conv2_BCDDigits, + Sign => Conv2_Sign + ); + + TestCtrl: component arith_Convert_Binary2BCD_TestController + generic map ( + CONV1_BITS => CONV1_BITS, + CONV1_DIGITS => CONV1_DIGITS, + CONV2_BITS => CONV2_BITS, + CONV2_DIGITS => CONV2_DIGITS + ) + port map ( + Clock => Clock, + Reset => Reset, + Start => Start, + Conv1_Binary => Conv1_Binary, + Conv1_BCDDigits => Conv1_BCDDigits, + Conv1_Sign => Conv1_Sign, + Conv2_Binary => Conv2_Binary, + Conv2_BCDDigits => Conv2_BCDDigits, + Conv2_Sign => Conv2_Sign + ); + +end architecture; diff --git a/tb/arith/counter_bcd/RunAllTests.pro b/tb/arith/Counter_BCD/RunAllTests.pro similarity index 82% rename from tb/arith/counter_bcd/RunAllTests.pro rename to tb/arith/Counter_BCD/RunAllTests.pro index 9d74acfce..9cebe4a09 100644 --- a/tb/arith/counter_bcd/RunAllTests.pro +++ b/tb/arith/Counter_BCD/RunAllTests.pro @@ -18,12 +18,12 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.arith.counter_bcd +TestSuite PoC.arith.Counter_BCD -library tb_arith_counter_bcd +library tb_arith_Counter_BCD -analyze arith_counter_bcd_TestController.vhdl -analyze arith_counter_bcd_TestHarness.vhdl +analyze arith_Counter_BCD_TestController.vhdl +analyze arith_Counter_BCD_TestHarness.vhdl # Test Cases -RunTest arith_counter_bcd_Simple.vhdl +RunTest arith_Counter_BCD_Simple.vhdl diff --git a/tb/arith/Counter_BCD/arith_Counter_BCD_Simple.vhdl b/tb/arith/Counter_BCD/arith_Counter_BCD_Simple.vhdl new file mode 100644 index 000000000..090f84167 --- /dev/null +++ b/tb/arith/Counter_BCD/arith_Counter_BCD_Simple.vhdl @@ -0,0 +1,137 @@ +-- ============================================================================= +-- Authors: Martin Zabel +-- Thomas B. Preusser +-- Gustavo Martin +-- +-- Entity: arith_Counter_BCD_Simple +-- +-- Description: +-- ------------------------------------- +-- Simple OSVVM test for arith_Counter_BCD +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; + +library PoC; +use PoC.utils.all; +use PoC.strings.all; +use PoC.physical.all; + +architecture Simple of arith_Counter_BCD_TestController is + constant TCID : AlertLogIDType := NewID("CntBCDTest"); + signal TestDone : integer_barrier := 1; + + signal Expected : T_BCD_VECTOR(DIGITS - 1 downto 0); +begin + + ControlProc: process + constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); + constant TIMEOUT : time := 10 ms; + begin + SetTestName("arith_Counter_BCD_Simple"); + + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, FALSE); + SetLogEnable(DEBUG, FALSE); + wait for 0 ns; wait for 0 ns; + + TranscriptOpen; + SetTranscriptMirror(TRUE); + + wait until Reset = '0'; + ClearAlerts; + + WaitForBarrier(TestDone, TIMEOUT); + AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); + AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); + + EndOfTestReports(ReportAll => TRUE); + std.env.stop; + end process; + + CheckerProc: process + constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); + variable Expected : T_BCD_VECTOR(DIGITS - 1 downto 0); + begin + Reset_aux <= '0'; + inc <= '0'; + wait until Reset = '0'; + + WaitForClock(Clock); + Expected := to_BCD_Vector(0, DIGITS); + AffirmIf(ProcID, (Value = Expected), "Wrong initial state. Value=" & to_string(Value)); + + Reset_aux <= '1'; + inc <= '0'; + WaitForClock(Clock); + AffirmIf(ProcID, (Value = Expected), "Wrong initial state. Value=" & to_string(Value)); + + Reset_aux <= '1'; + inc <= '1'; + WaitForClock(Clock); + AffirmIf(ProcID, (Value = Expected), "Wrong initial state. Value=" & to_string(Value)); + Reset_aux <= '0'; + inc <= '0'; + + WaitForClock(Clock); + for i in 1 to 10**DIGITS - 1 loop + Expected := to_BCD_Vector(i, DIGITS); + wait until falling_edge(Clock); + inc <= '1'; + WaitForClock(Clock); + wait until falling_edge(Clock); + inc <= '0'; + WaitForClock(Clock); + AffirmIf(ProcID, (Value = Expected), "Should be incremented to state " & to_string(Expected) & " Value=" & to_string(Value)); + wait until falling_edge(Clock); + inc <= '0'; + WaitForClock(Clock); + AffirmIf(ProcID, (Value = Expected), "Should keep the state " & to_string(Expected) & " Value=" & to_string(Value)); + end loop; + wait until falling_edge(Clock); + inc <= '1'; + WaitForClock(Clock, 2); + AffirmIf(ProcID, Value = (DIGITS - 1 downto 0 => x"0"), "Should be wrapped to 0000." & " Value=" & to_string(Value)); + + inc <= '1'; + WaitForClock(Clock, 5); + + Reset_aux <= '1'; + inc <= '0'; + WaitForClock(Clock, 2); + AffirmIf(ProcID, Value = (DIGITS - 1 downto 0 => x"0"), "Should be resetted again."); + + -- Finalize + WaitForBarrier(TestDone); + wait; + end process; +end architecture; + +configuration arith_Counter_BCD_Simple of arith_Counter_BCD_TestHarness is + for TestHarness + for TestCtrl: arith_Counter_BCD_TestController + use entity work.arith_Counter_BCD_TestController(Simple); + end for; + end for; +end configuration; diff --git a/tb/arith/counter_bcd/arith_counter_bcd_TestController.vhdl b/tb/arith/Counter_BCD/arith_Counter_BCD_TestController.vhdl similarity index 68% rename from tb/arith/counter_bcd/arith_counter_bcd_TestController.vhdl rename to tb/arith/Counter_BCD/arith_Counter_BCD_TestController.vhdl index 184f57ec8..8a46b6e68 100644 --- a/tb/arith/counter_bcd/arith_counter_bcd_TestController.vhdl +++ b/tb/arith/Counter_BCD/arith_Counter_BCD_TestController.vhdl @@ -1,13 +1,13 @@ -- ============================================================================= --- Authors: Martin Zabel +-- Authors: Martin Zabel -- Thomas B. Preusser -- Gustavo Martin -- --- Entity: arith_counter_bcd_TestController +-- Entity: arith_Counter_BCD_TestController -- -- Description: -- ------------------------------------- --- Test controller for arith_counter_bcd +-- Test controller for arith_Counter_BCD -- -- License: -- ============================================================================= @@ -17,7 +17,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -33,19 +33,19 @@ library osvvm; context osvvm.OsvvmContext; library PoC; -use PoC.utils.all; +use PoC.utils.all; -entity arith_counter_bcd_TestController is - generic ( - DIGITS : positive := 3 - ); - port ( - Clock : in std_logic; - Reset : in std_logic; - Reset_aux : out std_logic; - - -- DUT signals arith_counter_bcd - inc : out std_logic; - Value : in T_BCD_VECTOR(DIGITS - 1 downto 0) - ); +entity arith_Counter_BCD_TestController is + generic ( + DIGITS : positive := 3 + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + Reset_aux : out std_logic; + + -- DUT signals arith_Counter_BCD + inc : out std_logic; + Value : in T_BCD_VECTOR(DIGITS - 1 downto 0) + ); end entity; diff --git a/tb/arith/Counter_BCD/arith_Counter_BCD_TestHarness.vhdl b/tb/arith/Counter_BCD/arith_Counter_BCD_TestHarness.vhdl new file mode 100644 index 000000000..0bd25d320 --- /dev/null +++ b/tb/arith/Counter_BCD/arith_Counter_BCD_TestHarness.vhdl @@ -0,0 +1,105 @@ +-- ============================================================================= +-- Authors: Martin Zabel +-- Thomas B. Preusser +-- Gustavo Martin +-- +-- Entity: arith_Counter_BCD_TestHarness +-- +-- Description: +-- ------------------------------------- +-- Test harness for arith_Counter_BCD +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; + +library PoC; +use PoC.utils.all; +use PoC.strings.all; +use PoC.physical.all; + +entity arith_Counter_BCD_TestHarness is +end entity; + +architecture TestHarness of arith_Counter_BCD_TestHarness is + constant TPERIOD_CLOCK : time := 10 ns; + constant CLOCK_FREQ : FREQ := 100 MHz; + constant DIGITS : positive := 3; + + signal Clock : std_logic := '1'; + signal Reset : std_logic := '1'; + signal Reset_aux : std_logic := '0'; + signal inc : std_logic := '0'; + signal Value : T_BCD_VECTOR(DIGITS - 1 downto 0); + + component arith_Counter_BCD_TestController is + generic ( + DIGITS : positive := 3 + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + Reset_aux : out std_logic; + inc : out std_logic; + Value : in T_BCD_VECTOR(DIGITS - 1 downto 0) + ); + end component; + +begin + + Osvvm.ClockResetPkg.CreateClock( + Clk => Clock, + Period => TPERIOD_CLOCK + ); + + Osvvm.ClockResetPkg.CreateReset( + Reset => Reset, + ResetActive => '1', + Clk => Clock, + Period => 5 * TPERIOD_CLOCK, + tpd => 0 ns + ); + + UUT: entity PoC.arith_Counter_BCD + generic map ( + DIGITS => DIGITS + ) + port map ( + Clock => Clock, + Reset => Reset or Reset_aux, + Increment => inc, + Value => Value + ); + + TestCtrl: component arith_Counter_BCD_TestController + generic map ( + DIGITS => DIGITS + ) + port map ( + Clock => Clock, + Reset => Reset, + Reset_aux => Reset_aux, + inc => inc, + Value => Value + ); +end architecture; diff --git a/tb/arith/counter_ring/RunAllTests.pro b/tb/arith/Counter_Free/RunAllTests.pro similarity index 82% rename from tb/arith/counter_ring/RunAllTests.pro rename to tb/arith/Counter_Free/RunAllTests.pro index 53c6a7148..455dc0aca 100644 --- a/tb/arith/counter_ring/RunAllTests.pro +++ b/tb/arith/Counter_Free/RunAllTests.pro @@ -19,12 +19,12 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.arith.counter_ring +TestSuite PoC.arith.Counter_Free -library tb_arith_counter_ring +library tb_arith_Counter_Free -analyze arith_counter_ring_TestController.vhdl -analyze arith_counter_ring_TestHarness.vhdl +analyze arith_Counter_Free_TestController.vhdl +analyze arith_Counter_Free_TestHarness.vhdl # Test Cases -RunTest arith_counter_ring_Simple.vhdl +RunTest arith_Counter_Free_Simple.vhdl diff --git a/tb/arith/counter_free/arith_counter_free_Simple.vhdl b/tb/arith/Counter_Free/arith_Counter_Free_Simple.vhdl similarity index 87% rename from tb/arith/counter_free/arith_counter_free_Simple.vhdl rename to tb/arith/Counter_Free/arith_Counter_Free_Simple.vhdl index c97a35632..398471492 100644 --- a/tb/arith/counter_free/arith_counter_free_Simple.vhdl +++ b/tb/arith/Counter_Free/arith_Counter_Free_Simple.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_counter_free_TestController +-- Entity: arith_Counter_Free_TestController -- -- Description: -- ------------------------------------- --- Simple test for arith_counter_free component +-- Simple test for arith_Counter_Free component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,7 +34,7 @@ context osvvm.OsvvmContext; library PoC; use PoC.utils.all; -architecture Simple of arith_counter_free_TestController is +architecture Simple of arith_Counter_Free_TestController is signal TestDone : integer_barrier := 1; constant TCID : AlertLogIDType := NewID("TestCtrl"); @@ -44,7 +44,7 @@ begin constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); constant TIMEOUT : time := 10 ms; begin - SetTestName("arith_counter_free_Simple"); + SetTestName("arith_Counter_Free_Simple"); SetLogEnable(PASSED, FALSE); SetLogEnable(INFO, FALSE); @@ -117,10 +117,10 @@ begin end process; end architecture; -configuration arith_counter_free_Simple of arith_counter_free_TestHarness is +configuration arith_Counter_Free_Simple of arith_Counter_Free_TestHarness is for TestHarness - for TestCtrl: arith_counter_free_TestController - use entity work.arith_counter_free_TestController(Simple); + for TestCtrl: arith_Counter_Free_TestController + use entity work.arith_Counter_Free_TestController(Simple); end for; end for; end configuration; diff --git a/tb/arith/counter_free/arith_counter_free_TestController.vhdl b/tb/arith/Counter_Free/arith_Counter_Free_TestController.vhdl similarity index 82% rename from tb/arith/counter_free/arith_counter_free_TestController.vhdl rename to tb/arith/Counter_Free/arith_Counter_Free_TestController.vhdl index 7f9c4291b..571afca52 100644 --- a/tb/arith/counter_free/arith_counter_free_TestController.vhdl +++ b/tb/arith/Counter_Free/arith_Counter_Free_TestController.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_counter_free_TestController +-- Entity: arith_Counter_Free_TestController -- -- Description: -- ------------------------------------- --- Test controller for arith_counter_free component +-- Test controller for arith_Counter_Free component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,7 +31,7 @@ library osvvm; context osvvm.OsvvmContext; -entity arith_counter_free_TestController is +entity arith_Counter_Free_TestController is port ( Clock : in std_logic; Reset : in std_logic; diff --git a/tb/arith/counter_free/arith_counter_free_TestHarness.vhdl b/tb/arith/Counter_Free/arith_Counter_Free_TestHarness.vhdl similarity index 79% rename from tb/arith/counter_free/arith_counter_free_TestHarness.vhdl rename to tb/arith/Counter_Free/arith_Counter_Free_TestHarness.vhdl index 318532d21..39a6085d8 100644 --- a/tb/arith/counter_free/arith_counter_free_TestHarness.vhdl +++ b/tb/arith/Counter_Free/arith_Counter_Free_TestHarness.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= -- Authors: Gustavo Martin -- --- Entity: arith_counter_free_TestHarness +-- Entity: arith_Counter_Free_TestHarness -- -- Description: -- ------------------------------------- --- Test harness for arith_counter_free component +-- Test harness for arith_Counter_Free component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,11 +34,11 @@ context osvvm.OsvvmContext; library PoC; -entity arith_counter_free_TestHarness is +entity arith_Counter_Free_TestHarness is end entity; -architecture TestHarness of arith_counter_free_TestHarness is +architecture TestHarness of arith_Counter_Free_TestHarness is constant TPERIOD_CLOCK : time := 10 ns; constant DIVIDER : positive := 5; @@ -50,7 +50,7 @@ architecture TestHarness of arith_counter_free_TestHarness is signal stb : std_logic; - component arith_counter_free_TestController is + component arith_Counter_Free_TestController is port ( Clock : in std_logic; Reset : in std_logic; @@ -73,18 +73,18 @@ begin tpd => 0 ns ); - DUT : entity PoC.arith_counter_free + DUT : entity PoC.arith_Counter_Free generic map ( DIVIDER => DIVIDER ) port map ( - clk => Clock, - rst => Reset, - inc => inc, - stb => stb + Clock => Clock, + Reset => Reset, + Increment => inc, + Strobe => stb ); - TestCtrl: component arith_counter_free_TestController + TestCtrl: component arith_Counter_Free_TestController port map ( Clock => Clock, Reset => Reset, diff --git a/tb/arith/counter_gray/RunAllTests.pro b/tb/arith/Counter_Gray/RunAllTests.pro similarity index 82% rename from tb/arith/counter_gray/RunAllTests.pro rename to tb/arith/Counter_Gray/RunAllTests.pro index 1313f1ffd..453515c83 100644 --- a/tb/arith/counter_gray/RunAllTests.pro +++ b/tb/arith/Counter_Gray/RunAllTests.pro @@ -19,12 +19,12 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.arith.counter_gray +TestSuite PoC.arith.Counter_Gray -library tb_arith_counter_gray +library tb_arith_Counter_Gray -analyze arith_counter_gray_TestController.vhdl -analyze arith_counter_gray_TestHarness.vhdl +analyze arith_Counter_Gray_TestController.vhdl +analyze arith_Counter_Gray_TestHarness.vhdl # Test Cases -RunTest arith_counter_gray_Simple.vhdl +RunTest arith_Counter_Gray_Simple.vhdl diff --git a/tb/arith/counter_gray/arith_counter_gray_Simple.vhdl b/tb/arith/Counter_Gray/arith_Counter_Gray_Simple.vhdl similarity index 89% rename from tb/arith/counter_gray/arith_counter_gray_Simple.vhdl rename to tb/arith/Counter_Gray/arith_Counter_Gray_Simple.vhdl index 3cad0d3c9..ab03557e4 100644 --- a/tb/arith/counter_gray/arith_counter_gray_Simple.vhdl +++ b/tb/arith/Counter_Gray/arith_Counter_Gray_Simple.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_counter_gray_TestController +-- Entity: arith_Counter_Gray_TestController -- -- Description: -- ------------------------------------- --- Simple test for arith_counter_gray component +-- Simple test for arith_Counter_Gray component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,7 +34,7 @@ context osvvm.OsvvmContext; library PoC; use PoC.utils.all; -architecture Simple of arith_counter_gray_TestController is +architecture Simple of arith_Counter_Gray_TestController is signal TestDone : integer_barrier := 1; constant TCID : AlertLogIDType := NewID("TestCtrl"); @@ -44,7 +44,7 @@ begin constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); constant TIMEOUT : time := 10 ms; begin - SetTestName("arith_counter_gray_Simple"); + SetTestName("arith_Counter_Gray_Simple"); SetLogEnable(PASSED, FALSE); SetLogEnable(INFO, FALSE); @@ -133,10 +133,10 @@ begin end process; end architecture; -configuration arith_counter_gray_Simple of arith_counter_gray_TestHarness is +configuration arith_Counter_Gray_Simple of arith_Counter_Gray_TestHarness is for TestHarness - for TestCtrl: arith_counter_gray_TestController - use entity work.arith_counter_gray_TestController(Simple); + for TestCtrl: arith_Counter_Gray_TestController + use entity work.arith_Counter_Gray_TestController(Simple); end for; end for; end configuration; diff --git a/tb/arith/counter_gray/arith_counter_gray_TestController.vhdl b/tb/arith/Counter_Gray/arith_Counter_Gray_TestController.vhdl similarity index 83% rename from tb/arith/counter_gray/arith_counter_gray_TestController.vhdl rename to tb/arith/Counter_Gray/arith_Counter_Gray_TestController.vhdl index 599199d1f..74843109b 100644 --- a/tb/arith/counter_gray/arith_counter_gray_TestController.vhdl +++ b/tb/arith/Counter_Gray/arith_Counter_Gray_TestController.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_counter_gray_TestController +-- Entity: arith_Counter_Gray_TestController -- -- Description: -- ------------------------------------- --- Test controller for arith_counter_gray component +-- Test controller for arith_Counter_Gray component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,7 +31,7 @@ library osvvm; context osvvm.OsvvmContext; -entity arith_counter_gray_TestController is +entity arith_Counter_Gray_TestController is port ( Clock : in std_logic; Reset : in std_logic; diff --git a/tb/arith/counter_gray/arith_counter_gray_TestHarness.vhdl b/tb/arith/Counter_Gray/arith_Counter_Gray_TestHarness.vhdl similarity index 80% rename from tb/arith/counter_gray/arith_counter_gray_TestHarness.vhdl rename to tb/arith/Counter_Gray/arith_Counter_Gray_TestHarness.vhdl index 6cfd22a96..11c61b622 100644 --- a/tb/arith/counter_gray/arith_counter_gray_TestHarness.vhdl +++ b/tb/arith/Counter_Gray/arith_Counter_Gray_TestHarness.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= -- Authors: Gustavo Martin -- --- Entity: arith_counter_gray_TestHarness +-- Entity: arith_Counter_Gray_TestHarness -- -- Description: -- ------------------------------------- --- Test harness for arith_counter_gray component +-- Test harness for arith_Counter_Gray component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,11 +34,11 @@ context osvvm.OsvvmContext; library PoC; -entity arith_counter_gray_TestHarness is +entity arith_Counter_Gray_TestHarness is end entity; -architecture TestHarness of arith_counter_gray_TestHarness is +architecture TestHarness of arith_Counter_Gray_TestHarness is constant TPERIOD_CLOCK : time := 10 ns; constant BITS : positive := 4; @@ -53,7 +53,7 @@ architecture TestHarness of arith_counter_gray_TestHarness is signal cry : std_logic; - component arith_counter_gray_TestController is + component arith_Counter_Gray_TestController is port ( Clock : in std_logic; Reset : in std_logic; @@ -78,21 +78,21 @@ begin tpd => 0 ns ); - DUT : entity PoC.arith_counter_gray + DUT : entity PoC.arith_Counter_Gray generic map ( BITS => BITS, INIT => INIT ) port map ( - clk => Clock, - rst => Reset, - inc => inc, - dec => dec, - val => val, - cry => cry + Clock => Clock, + Reset => Reset, + Increment => inc, + Decrement => dec, + Value => val, + CarryOut => cry ); - TestCtrl: component arith_counter_gray_TestController + TestCtrl: component arith_Counter_Gray_TestController port map ( Clock => Clock, Reset => Reset, diff --git a/tb/arith/counter_free/RunAllTests.pro b/tb/arith/Counter_Ring/RunAllTests.pro similarity index 82% rename from tb/arith/counter_free/RunAllTests.pro rename to tb/arith/Counter_Ring/RunAllTests.pro index fa6447fa4..8e5a122ca 100644 --- a/tb/arith/counter_free/RunAllTests.pro +++ b/tb/arith/Counter_Ring/RunAllTests.pro @@ -19,12 +19,12 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.arith.counter_free +TestSuite PoC.arith.Counter_Ring -library tb_arith_counter_free +library tb_arith_Counter_Ring -analyze arith_counter_free_TestController.vhdl -analyze arith_counter_free_TestHarness.vhdl +analyze arith_Counter_Ring_TestController.vhdl +analyze arith_Counter_Ring_TestHarness.vhdl # Test Cases -RunTest arith_counter_free_Simple.vhdl +RunTest arith_Counter_Ring_Simple.vhdl diff --git a/tb/arith/counter_ring/arith_counter_ring_Simple.vhdl b/tb/arith/Counter_Ring/arith_Counter_Ring_Simple.vhdl similarity index 90% rename from tb/arith/counter_ring/arith_counter_ring_Simple.vhdl rename to tb/arith/Counter_Ring/arith_Counter_Ring_Simple.vhdl index 667b0715d..7bde92fea 100644 --- a/tb/arith/counter_ring/arith_counter_ring_Simple.vhdl +++ b/tb/arith/Counter_Ring/arith_Counter_Ring_Simple.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_counter_ring_TestController +-- Entity: arith_Counter_Ring_TestController -- -- Description: -- ------------------------------------- --- Simple test for arith_counter_ring component +-- Simple test for arith_Counter_Ring component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,7 +34,7 @@ context osvvm.OsvvmContext; library PoC; use PoC.utils.all; -architecture Simple of arith_counter_ring_TestController is +architecture Simple of arith_Counter_Ring_TestController is signal TestDone : integer_barrier := 1; constant TCID : AlertLogIDType := NewID("TestCtrl"); @@ -44,7 +44,7 @@ begin constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); constant TIMEOUT : time := 10 ms; begin - SetTestName("arith_counter_ring_Simple"); + SetTestName("arith_Counter_Ring_Simple"); SetLogEnable(PASSED, FALSE); SetLogEnable(INFO, FALSE); @@ -171,10 +171,10 @@ begin end process; end architecture; -configuration arith_counter_ring_Simple of arith_counter_ring_TestHarness is +configuration arith_Counter_Ring_Simple of arith_Counter_Ring_TestHarness is for TestHarness - for TestCtrl: arith_counter_ring_TestController - use entity work.arith_counter_ring_TestController(Simple); + for TestCtrl: arith_Counter_Ring_TestController + use entity work.arith_Counter_Ring_TestController(Simple); end for; end for; end configuration; diff --git a/tb/arith/counter_ring/arith_counter_ring_TestController.vhdl b/tb/arith/Counter_Ring/arith_Counter_Ring_TestController.vhdl similarity index 82% rename from tb/arith/counter_ring/arith_counter_ring_TestController.vhdl rename to tb/arith/Counter_Ring/arith_Counter_Ring_TestController.vhdl index 7a854a043..8ce1a802b 100644 --- a/tb/arith/counter_ring/arith_counter_ring_TestController.vhdl +++ b/tb/arith/Counter_Ring/arith_Counter_Ring_TestController.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_counter_ring_TestController +-- Entity: arith_Counter_Ring_TestController -- -- Description: -- ------------------------------------- --- Test controller for arith_counter_ring component +-- Test controller for arith_Counter_Ring component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,7 +31,7 @@ library osvvm; context osvvm.OsvvmContext; -entity arith_counter_ring_TestController is +entity arith_Counter_Ring_TestController is port ( Clock : in std_logic; Reset : in std_logic; diff --git a/tb/arith/counter_ring/arith_counter_ring_TestHarness.vhdl b/tb/arith/Counter_Ring/arith_Counter_Ring_TestHarness.vhdl similarity index 81% rename from tb/arith/counter_ring/arith_counter_ring_TestHarness.vhdl rename to tb/arith/Counter_Ring/arith_Counter_Ring_TestHarness.vhdl index 0b0a130b6..88b13d273 100644 --- a/tb/arith/counter_ring/arith_counter_ring_TestHarness.vhdl +++ b/tb/arith/Counter_Ring/arith_Counter_Ring_TestHarness.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= -- Authors: Gustavo Martin -- --- Entity: arith_counter_ring_TestHarness +-- Entity: arith_Counter_Ring_TestHarness -- -- Description: -- ------------------------------------- --- Test harness for arith_counter_ring component +-- Test harness for arith_Counter_Ring component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,11 +34,11 @@ context osvvm.OsvvmContext; library PoC; -entity arith_counter_ring_TestHarness is +entity arith_Counter_Ring_TestHarness is end entity; -architecture TestHarness of arith_counter_ring_TestHarness is +architecture TestHarness of arith_Counter_Ring_TestHarness is constant TPERIOD_CLOCK : time := 10 ns; constant BITS : positive := 8; @@ -52,7 +52,7 @@ architecture TestHarness of arith_counter_ring_TestHarness is signal value : std_logic_vector(BITS - 1 downto 0); - component arith_counter_ring_TestController is + component arith_Counter_Ring_TestController is port ( Clock : in std_logic; Reset : in std_logic; @@ -76,7 +76,7 @@ begin tpd => 0 ns ); - DUT : entity PoC.arith_counter_ring + DUT : entity PoC.arith_Counter_Ring generic map ( BITS => BITS, INVERT_FEEDBACK => FALSE @@ -84,13 +84,13 @@ begin port map ( Clock => Clock, Reset => Reset, - seed => SEED, - inc => inc, - dec => dec, - value => value + Seed => SEED, + Increment => inc, + Decrement => dec, + Value => value ); - TestCtrl: component arith_counter_ring_TestController + TestCtrl: component arith_Counter_Ring_TestController port map ( Clock => Clock, Reset => Reset, diff --git a/tb/arith/div/RunAllTests.pro b/tb/arith/Divider/RunAllTests.pro similarity index 84% rename from tb/arith/div/RunAllTests.pro rename to tb/arith/Divider/RunAllTests.pro index ae56ee92d..5c1d9e374 100644 --- a/tb/arith/div/RunAllTests.pro +++ b/tb/arith/Divider/RunAllTests.pro @@ -18,12 +18,12 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.arith.div +TestSuite PoC.arith.Divider -library tb_arith_div +library tb_arith_Divider -analyze arith_div_TestController.vhdl -analyze arith_div_TestHarness.vhdl +analyze arith_Divider_TestController.vhdl +analyze arith_Divider_TestHarness.vhdl # Test Cases -RunTest arith_div_Simple.vhdl +RunTest arith_Divider_Simple.vhdl diff --git a/tb/arith/Divider/arith_Divider_Simple.vhdl b/tb/arith/Divider/arith_Divider_Simple.vhdl new file mode 100644 index 000000000..f0e5f96d8 --- /dev/null +++ b/tb/arith/Divider/arith_Divider_Simple.vhdl @@ -0,0 +1,172 @@ +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Gustavo Martin +-- +-- Entity: arith_Divider_Simple +-- +-- Description: +-- ------------------------------------- +-- Simple test for arith_Divider +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.strings.all; + +library osvvm; +context osvvm.OsvvmContext; + +architecture Simple of arith_Divider_TestController is + signal TestDone : integer_barrier := 1; + constant TCID : AlertLogIDType := NewID("DividerTest"); + constant TPERIOD_CLOCK : time := 10 ns; +begin + + ------------------------------------------------------------ + -- ControlProc + -- Set up AlertLog and wait for end of test + ------------------------------------------------------------ + ControlProc : process + constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); + constant TIMEOUT : time := 10 ms; + begin + -- Initialization of AlertLog + SetTestName("arith_Divider_Simple"); + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, FALSE); + SetLogEnable(DEBUG, FALSE); + + TranscriptOpen; + SetTranscriptMirror(TRUE); + + wait until Reset = '0'; + ClearAlerts; + + WaitForBarrier(TestDone, TIMEOUT); + AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); + AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); + + EndOfTestReports(ReportAll => TRUE); + std.env.stop; + end process; + + ------------------------------------------------------------ + -- TestProc + -- Generate stimuli and check results + ------------------------------------------------------------ + TestProc : process + variable Random : RandomPType; + + procedure test(aval, dval : in integer) is + variable QQ : T_SLVV(Z'range)(A'range); + variable RR : T_SLVV(Z'range)(D'range); + variable ZZ : std_logic_vector(Z'range); + + type boolean_vector is array(positive range<>) of boolean; + variable done : boolean_vector(Ready'range); + variable all_done : boolean; + begin + -- Start + WaitForClock(Clock, 5); + Start <= '1'; + A <= std_logic_vector(to_unsigned(aval, A'length)); + D <= std_logic_vector(to_unsigned(dval, D'length)); + WaitForClock(Clock); + wait for 1 ns; + Start <= '0'; + A <= (others => '-'); + D <= (others => '-'); + done := (others => false); + + loop + all_done := true; + for i in done'range loop + if Ready(i) = '1' and not done(i) then + QQ(i) := Q(i); + RR(i) := R(i); + ZZ(i) := Z(i); + done(i) := true; + end if; + if not done(i) then + all_done := false; + end if; + end loop; + exit when all_done; + WaitForClock(Clock); + wait for 1 ns; + end loop; + + for i in done'range loop + if dval = 0 then + AffirmIf(ZZ(i) = '1', "INST=" & integer'image(i) & " Divider by zero check failed: " & integer'image(aval) & "/" & integer'image(dval)); + else + AffirmIf(ZZ(i) = '0', "INST=" & integer'image(i) & " Zero flag check failed: " & integer'image(aval) & "/" & integer'image(dval)); + AffirmIf(to_integer(unsigned(QQ(i)))*dval + to_integer(unsigned(RR(i))) = aval, + "INST=" & integer'image(i) & " Result check failed: " & integer'image(aval) & "/" & integer'image(dval) & + " /= " & integer'image(to_integer(unsigned(QQ(i)))) & " R " & integer'image(to_integer(unsigned(RR(i))))); + end if; + end loop; + end procedure; + + begin + Start <= '0'; + A <= (others => '-'); + D <= (others => '-'); + + -- Initialize Random + Random.InitSeed(Random'instance_name); + + -- Reset + wait until Reset = '0'; + + -- Boundary Conditions + test(0, 0); + test(0, 2**D'length - 1); + test(0, 1); + test(1, 0); + test(2, 0); + test(2**A'length - 1, 0); + test(2**A'length - 1, 2**D'length - 1); + + -- Run Random Tests + for i in 0 to 1023 loop + test(Random.Uniform(0, 2**A'length - 1), Random.Uniform(0, 2**D'length - 1)); + end loop; + + -- End of Test + WaitForBarrier(TestDone); + wait; + end process; + +end architecture; + +configuration arith_Divider_Simple of arith_Divider_TestHarness is + for tb + for TestCtrl: arith_Divider_TestController + use entity work.arith_Divider_TestController(Simple); + end for; + end for; +end configuration; diff --git a/tb/arith/div/arith_div_TestController.vhdl b/tb/arith/Divider/arith_Divider_TestController.vhdl similarity index 71% rename from tb/arith/div/arith_div_TestController.vhdl rename to tb/arith/Divider/arith_Divider_TestController.vhdl index 209a92014..023604742 100644 --- a/tb/arith/div/arith_div_TestController.vhdl +++ b/tb/arith/Divider/arith_Divider_TestController.vhdl @@ -2,23 +2,23 @@ -- Authors: Thomas B. Preusser -- Gustavo Martin -- --- Entity: arith_div_TestController +-- Entity: arith_Divider_TestController -- -- Description: -- ------------------------------------- --- Test controller for arith_div +-- Test controller for arith_Divider -- -- License: -- ============================================================================= -- Copyright 2025-2026 The PoC-Library Authors -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -40,17 +40,17 @@ library osvvm; context osvvm.OsvvmContext; -entity arith_div_TestController is - port ( - Clock : in std_logic; - Reset : in std_logic; +entity arith_Divider_TestController is + port ( + Clock : in std_logic; + Reset : in std_logic; - Start : out std_logic; - Ready : in std_logic_vector; - A : out std_logic_vector; - D : out std_logic_vector; - Q : in T_SLVV; - R : in T_SLVV; - Z : in std_logic_vector - ); + Start : out std_logic; + Ready : in std_logic_vector; + A : out std_logic_vector; + D : out std_logic_vector; + Q : in T_SLVV; + R : in T_SLVV; + Z : in std_logic_vector + ); end entity; diff --git a/tb/arith/Divider/arith_Divider_TestHarness.vhdl b/tb/arith/Divider/arith_Divider_TestHarness.vhdl new file mode 100644 index 000000000..150b82bf7 --- /dev/null +++ b/tb/arith/Divider/arith_Divider_TestHarness.vhdl @@ -0,0 +1,149 @@ +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Gustavo Martin +-- +-- Entity: arith_Divider_TestHarness +-- +-- Description: +-- ------------------------------------- +-- Test harness for arith_Divider +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.strings.all; +use PoC.physical.all; + +library osvvm; +context osvvm.OsvvmContext; + +entity arith_Divider_TestHarness is +end entity; + +architecture tb of arith_Divider_TestHarness is + constant CLOCK_PERIOD : time := 10 ns; + + constant A_BITS : positive := 13; + constant D_BITS : positive := 4; + constant MAX_POW : positive := 3; + + signal Clock : std_logic; + signal Reset : std_logic; + + signal Start : std_logic; + signal Ready : std_logic_vector(1 to 2*MAX_POW); + signal A : std_logic_vector(A_BITS-1 downto 0); + signal D : std_logic_vector(D_BITS-1 downto 0); + signal Q : T_SLVV(1 to 2*MAX_POW)(A_BITS-1 downto 0); + signal R : T_SLVV(1 to 2*MAX_POW)(D_BITS-1 downto 0); + signal Z : std_logic_vector(1 to 2*MAX_POW); + + component arith_Divider_TestController is + port ( + Clock : in std_logic; + Reset : in std_logic; + Start : out std_logic; + Ready : in std_logic_vector; + A : out std_logic_vector; + D : out std_logic_vector; + Q : in T_SLVV; + R : in T_SLVV; + Z : in std_logic_vector + ); + end component; + +begin + + -- Clock Generation + Osvvm.ClockResetPkg.CreateClock( + Clk => Clock, + Period => CLOCK_PERIOD + ); + + -- Reset Generation + Osvvm.ClockResetPkg.CreateReset( + Reset => Reset, + ResetActive => '1', + Clk => Clock, + Period => 10 * CLOCK_PERIOD, + tpd => 0 ns + ); + + -- Test Controller + TestCtrl : arith_Divider_TestController + port map ( + Clock => Clock, + Reset => Reset, + Start => Start, + Ready => Ready, + A => A, + D => D, + Q => Q, + R => R, + Z => Z + ); + + -- DUTs + genDUTs : for i in 1 to MAX_POW generate + DUT_SEQU : entity PoC.arith_Divider + generic map ( + DIVIDEND_BITS => A_BITS, + DIVISOR_BITS => D_BITS, + RADIX_EXPONENT => i + ) + port map ( + Clock => Clock, + Reset => Reset, + Start => Start, + Ready => Ready(i), + Dividend => A, + Divisor => D, + Quotient => Q(i), + Remainder => R(i), + DivisionByZero => Z(i) + ); + + DUT_PIPE : entity PoC.arith_Divider + generic map ( + DIVIDEND_BITS => A_BITS, + DIVISOR_BITS => D_BITS, + RADIX_EXPONENT => i, + PIPELINED => true + ) + port map ( + Clock => Clock, + Reset => Reset, + Start => Start, + Ready => Ready(MAX_POW+i), + Dividend => A, + Divisor => D, + Quotient => Q(MAX_POW+i), + Remainder => R(MAX_POW+i), + DivisionByZero => Z(MAX_POW+i) + ); + end generate; + +end architecture; diff --git a/tb/arith/firstone/RunAllTests.pro b/tb/arith/FirstOne/RunAllTests.pro similarity index 83% rename from tb/arith/firstone/RunAllTests.pro rename to tb/arith/FirstOne/RunAllTests.pro index 39f27a649..9216fce43 100644 --- a/tb/arith/firstone/RunAllTests.pro +++ b/tb/arith/FirstOne/RunAllTests.pro @@ -18,12 +18,12 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.arith.firstone +TestSuite PoC.arith.FirstOne -library tb_arith_firstone +library tb_arith_FirstOne -analyze arith_firstone_TestController.vhdl -analyze arith_firstone_TestHarness.vhdl +analyze arith_FirstOne_TestController.vhdl +analyze arith_FirstOne_TestHarness.vhdl # Test Cases -RunTest arith_firstone_Simple.vhdl +RunTest arith_FirstOne_Simple.vhdl diff --git a/tb/arith/FirstOne/arith_FirstOne_Simple.vhdl b/tb/arith/FirstOne/arith_FirstOne_Simple.vhdl new file mode 100644 index 000000000..c8f9ee86e --- /dev/null +++ b/tb/arith/FirstOne/arith_FirstOne_Simple.vhdl @@ -0,0 +1,152 @@ +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Gustavo Martin +-- +-- Entity: arith_FirstOne_Simple +-- +-- Description: +-- ------------------------------------- +-- Simple OSVVM test for arith_FirstOne +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; + +library PoC; +use PoC.utils.all; + +architecture Simple of arith_FirstOne_TestController is + constant TCID : AlertLogIDType := NewID("FirstOneTest"); + signal TestDone : integer_barrier := 1; +begin + + ControlProc: process + constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); + constant TIMEOUT : time := 10 ms; + begin + SetTestName("arith_FirstOne_Simple"); + + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, FALSE); + SetLogEnable(DEBUG, FALSE); + wait for 0 ns; wait for 0 ns; + + TranscriptOpen; + SetTranscriptMirror(TRUE); + + wait until Reset = '0'; + ClearAlerts; + + WaitForBarrier(TestDone, TIMEOUT); + AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); + AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); + + EndOfTestReports(ReportAll => TRUE); + std.env.stop; + end process; + + CheckerProc: process + constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); + begin + tin <= '0'; + rqst <= (others => '0'); + wait until Reset = '0'; + + -- Exhaustive Testing for all possible request patterns + for i in natural range 0 to 2**N-1 loop + rqst <= std_logic_vector(to_unsigned(i, N)); + + -- Test with tin = '0': no token input, should have no grants + tin <= '0'; + WaitForClock(Clock); + AffirmIf(ProcID, + grnt = (grnt'range => '0') and tout = '0', + "Unexpected token output with tin='0' in testcase #" & integer'image(i)); + + -- Test with tin = '1': token input, check grant pattern + tin <= '1'; + wait until falling_edge(Clock); + + -- Check each bit of grant output + for j in 0 to N-1 loop + -- Grant(j) should be '1' if and only if: + -- - rqst(j) = '1' (bit j is requesting) + -- - AND all lower bits rqst(j-1 downto 0) are '0' (no lower priority request) + if j = 0 then + -- For bit 0, only check if rqst(0) is '1' + AffirmIf(ProcID, + (grnt(j) = '1') = (rqst(j) = '1'), + "Wrong grant for bit " & integer'image(j) & + " in testcase #" & integer'image(i) & + " (rqst=" & to_hxstring(rqst) & + ", grnt=" & to_hxstring(grnt) & ")"); + else + -- For higher bits, check if this is the first '1' from the right + AffirmIf(ProcID, + (grnt(j) = '1') = ((rqst(j) = '1') and (rqst(j-1 downto 0) = (j-1 downto 0 => '0'))), + "Wrong grant for bit " & integer'image(j) & + " in testcase #" & integer'image(i) & + " (rqst=" & to_hxstring(rqst) & + ", grnt=" & to_hxstring(grnt) & ")"); + end if; + end loop; + + -- Verify that tout is '1' only if rqst is all zeros + AffirmIf(ProcID, + (tout = '1') = (rqst = (N-1 downto 0 => '0')), + "Wrong tout in testcase #" & integer'image(i) & + " (rqst=" & to_hxstring(rqst) & + ", tout=" & std_logic'image(tout) & ")"); + + -- Verify binary output bin points to the granted bit + if rqst /= (N-1 downto 0 => '0') then + for k in 0 to N-1 loop + if grnt(k) = '1' then + AffirmIf(ProcID, + to_integer(unsigned(bin)) = k, + "Wrong bin output in testcase #" & integer'image(i) & + " (expected=" & integer'image(k) & + ", got=" & integer'image(to_integer(unsigned(bin))) & ")"); + end if; + end loop; + end if; + + end loop; + + Log(ProcID, "Exhaustively tested all " & integer'image(2**N) & " request patterns", INFO); + + -- Finalize + WaitForBarrier(TestDone); + wait; + end process; +end architecture; + +configuration arith_FirstOne_Simple of arith_FirstOne_TestHarness is + for TestHarness + for TestCtrl: arith_FirstOne_TestController + use entity work.arith_FirstOne_TestController(Simple); + end for; + end for; +end configuration; diff --git a/tb/arith/firstone/arith_firstone_TestController.vhdl b/tb/arith/FirstOne/arith_FirstOne_TestController.vhdl similarity index 66% rename from tb/arith/firstone/arith_firstone_TestController.vhdl rename to tb/arith/FirstOne/arith_FirstOne_TestController.vhdl index ea648576f..054b7707d 100644 --- a/tb/arith/firstone/arith_firstone_TestController.vhdl +++ b/tb/arith/FirstOne/arith_FirstOne_TestController.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= -- Authors: Gustavo Martin -- --- Entity: arith_firstone_TestController +-- Entity: arith_FirstOne_TestController -- -- Description: -- ------------------------------------- --- Test controller for arith_firstone +-- Test controller for arith_FirstOne -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -32,21 +32,21 @@ library osvvm; context osvvm.OsvvmContext; library PoC; -use PoC.utils.all; +use PoC.utils.all; -entity arith_firstone_TestController is - generic ( - N : positive := 8 - ); - port ( - Clock : in std_logic; - Reset : in std_logic; - - -- DUT signals arith_firstone - tin : out std_logic; - rqst : out std_logic_vector(N-1 downto 0); - grnt : in std_logic_vector(N-1 downto 0); - tout : in std_logic; - bin : in std_logic_vector(log2ceil(N)-1 downto 0) - ); +entity arith_FirstOne_TestController is + generic ( + N : positive := 8 + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + + -- DUT signals arith_FirstOne + tin : out std_logic; + rqst : out std_logic_vector(N-1 downto 0); + grnt : in std_logic_vector(N-1 downto 0); + tout : in std_logic; + bin : in std_logic_vector(log2ceil(N)-1 downto 0) + ); end entity; diff --git a/tb/arith/FirstOne/arith_FirstOne_TestHarness.vhdl b/tb/arith/FirstOne/arith_FirstOne_TestHarness.vhdl new file mode 100644 index 000000000..aa2bfd49d --- /dev/null +++ b/tb/arith/FirstOne/arith_FirstOne_TestHarness.vhdl @@ -0,0 +1,109 @@ +-- ============================================================================= +-- Authors: Gustavo Martin +-- +-- Entity: arith_FirstOne_TestHarness +-- +-- Description: +-- ------------------------------------- +-- Test harness for arith_FirstOne +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; + +library PoC; +use PoC.utils.all; +use PoC.physical.all; + +entity arith_FirstOne_TestHarness is +end entity; + +architecture TestHarness of arith_FirstOne_TestHarness is + constant TPERIOD_CLOCK : time := 10 ns; + constant N : positive := 8; + + signal Clock : std_logic := '1'; + signal Reset : std_logic := '1'; + + signal tin : std_logic := '1'; + signal rqst : std_logic_vector(N-1 downto 0) := (others => '0'); + signal grnt : std_logic_vector(N-1 downto 0); + signal tout : std_logic; + signal bin : std_logic_vector(log2ceil(N)-1 downto 0); + + component arith_FirstOne_TestController is + generic ( + N : positive := 8 + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + tin : out std_logic; + rqst : out std_logic_vector(N-1 downto 0); + grnt : in std_logic_vector(N-1 downto 0); + tout : in std_logic; + bin : in std_logic_vector(log2ceil(N)-1 downto 0) + ); + end component; + +begin + + Osvvm.ClockResetPkg.CreateClock( + Clk => Clock, + Period => TPERIOD_CLOCK + ); + + Osvvm.ClockResetPkg.CreateReset( + Reset => Reset, + ResetActive => '1', + Clk => Clock, + Period => 10 * TPERIOD_CLOCK, + tpd => 0 ns + ); + + UUT: entity PoC.arith_FirstOne + generic map ( + BITS => N + ) + port map ( + TokenIn => tin, + Request => rqst, + Grant => grnt, + TokenOut => tout, + Index => bin + ); + + TestCtrl: component arith_FirstOne_TestController + generic map ( + N => N + ) + port map ( + Clock => Clock, + Reset => Reset, + tin => tin, + rqst => rqst, + grnt => grnt, + tout => tout, + bin => bin + ); +end architecture; diff --git a/tb/arith/prng/RunAllTests.pro b/tb/arith/PRNG/RunAllTests.pro similarity index 57% rename from tb/arith/prng/RunAllTests.pro rename to tb/arith/PRNG/RunAllTests.pro index 25aebdb38..fd569bd00 100644 --- a/tb/arith/prng/RunAllTests.pro +++ b/tb/arith/PRNG/RunAllTests.pro @@ -3,12 +3,12 @@ # Jonas Schreiner # ============================================================================= -TestSuite PoC.arith.prng +TestSuite PoC.arith.PRNG -library tb_arith_prng +library tb_arith_PRNG -analyze arith_prng_TestController.vhdl -analyze arith_prng_TestHarness.vhdl +analyze arith_PRNG_TestController.vhdl +analyze arith_PRNG_TestHarness.vhdl # Test Cases -RunTest arith_prng_Simple.vhdl +RunTest arith_PRNG_Simple.vhdl diff --git a/tb/arith/prng/arith_prng_Simple.vhdl b/tb/arith/PRNG/arith_PRNG_Simple.vhdl similarity index 89% rename from tb/arith/prng/arith_prng_Simple.vhdl rename to tb/arith/PRNG/arith_PRNG_Simple.vhdl index 868f6fb1e..76d5e6173 100644 --- a/tb/arith/prng/arith_prng_Simple.vhdl +++ b/tb/arith/PRNG/arith_PRNG_Simple.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Jonas Schreiner +-- Authors: Jonas Schreiner -- --- Entity: arith_prng_TestController +-- Entity: arith_PRNG_TestController -- -- Description: -- ------------------------------------- @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -36,7 +36,7 @@ use PoC.utils.all; use PoC.vectors.all; use PoC.strings.all; -architecture Simple of arith_prng_TestController is +architecture Simple of arith_PRNG_TestController is signal TestDone : integer_barrier := 1; constant TCID : AlertLogIDType := NewID("TestCtrl"); @@ -46,7 +46,7 @@ begin constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); constant TIMEOUT : time := 10 ms; begin - SetTestName("arith_prng_Simple"); + SetTestName("arith_PRNG_Simple"); SetLogEnable(PASSED, FALSE); SetLogEnable(INFO, FALSE); @@ -70,7 +70,7 @@ begin CheckerProc: process constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); - constant COMPARE_LIST_8_BITS : T_SLVV_8 := ( + constant COMPARE_LIST_8_BITS : T_SLVV_8 := ( x"12", x"24", x"48", x"90", x"21", x"42", x"85", x"0A", x"14", x"28", x"51", x"A2", x"45", x"8B", x"17", x"2E", x"5D", x"BB", x"77", x"EF", x"DE", x"BC", x"79", x"F2", x"E4", x"C9", x"93", x"27", x"4E", x"9C", x"38", x"70", x"E1", x"C3", x"86", x"0C", x"18", x"31", x"63", x"C6", x"8C", x"19", x"33", x"67", x"CE", x"9D", x"3A", x"74", @@ -93,17 +93,17 @@ begin WaitForClock(Clock); for i in COMPARE_LIST_8_BITS'range loop - Got <= '1'; + Got <= '1'; WaitForClock(Clock); AffirmIf(ProcID, Value = COMPARE_LIST_8_BITS(i), - "Index = " & str_ralign(PoC.strings.to_string(i), log10ceil(COMPARE_LIST_8_BITS'high)) & ": Value = 0x" & to_hstring(Value), + "Index = " & str_ralign(PoC.strings.to_string(i), log10ceil(COMPARE_LIST_8_BITS'high)) & ": Value = 0x" & to_hstring(Value), " Expected = 0x" & to_hstring(COMPARE_LIST_8_BITS(i)) ); end loop; - Got <= '0'; + Got <= '0'; WaitForClock(Clock); WaitForBarrier(TestDone); @@ -111,10 +111,10 @@ begin end process; end architecture; -configuration arith_prng_Simple of arith_prng_TestHarness is +configuration arith_PRNG_Simple of arith_PRNG_TestHarness is for TestHarness - for TestCtrl: arith_prng_TestController - use entity work.arith_prng_TestController(Simple); + for TestCtrl: arith_PRNG_TestController + use entity work.arith_PRNG_TestController(Simple); end for; end for; end configuration; diff --git a/tb/arith/prng/arith_prng_TestController.vhdl b/tb/arith/PRNG/arith_PRNG_TestController.vhdl similarity index 87% rename from tb/arith/prng/arith_prng_TestController.vhdl rename to tb/arith/PRNG/arith_PRNG_TestController.vhdl index 2e122eac1..5683a507e 100644 --- a/tb/arith/prng/arith_prng_TestController.vhdl +++ b/tb/arith/PRNG/arith_PRNG_TestController.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Jonas Schreiner +-- Authors: Jonas Schreiner -- --- Entity: arith_prng_TestController +-- Entity: arith_PRNG_TestController -- -- Description: -- ------------------------------------- @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,7 +31,7 @@ library osvvm; context osvvm.OsvvmContext; -entity arith_prng_TestController is +entity arith_PRNG_TestController is port ( Clock : in std_logic; Reset : in std_logic; diff --git a/tb/arith/prng/arith_prng_TestHarness.vhdl b/tb/arith/PRNG/arith_PRNG_TestHarness.vhdl similarity index 85% rename from tb/arith/prng/arith_prng_TestHarness.vhdl rename to tb/arith/PRNG/arith_PRNG_TestHarness.vhdl index 48d346210..4352c884e 100644 --- a/tb/arith/prng/arith_prng_TestHarness.vhdl +++ b/tb/arith/PRNG/arith_PRNG_TestHarness.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= -- Authors: Jonas Schreiner -- --- Entity: arith_prng_TestHarness +-- Entity: arith_PRNG_TestHarness -- -- Description: -- ------------------------------------- @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,11 +34,11 @@ context osvvm.OsvvmContext; library PoC; -entity arith_prng_TestHarness is +entity arith_PRNG_TestHarness is end entity; -architecture TestHarness of arith_prng_TestHarness is +architecture TestHarness of arith_PRNG_TestHarness is constant TPERIOD_CLOCK : time := 10 ns; constant BITS : positive := 8; @@ -51,7 +51,7 @@ architecture TestHarness of arith_prng_TestHarness is signal Value : std_logic_vector(BITS - 1 downto 0); - component arith_prng_TestController is + component arith_PRNG_TestController is port ( Clock : in std_logic; Reset : in std_logic; @@ -74,10 +74,10 @@ begin tpd => 0 ns ); - DUT : entity PoC.arith_prng + DUT : entity PoC.arith_PRNG generic map ( - BITS => BITS, - SEED => SEED + BITS => BITS, + SEED => SEED ) port map ( Clock => Clock_100, @@ -88,7 +88,7 @@ begin Value => Value ); - TestCtrl: component arith_prng_TestController + TestCtrl: component arith_PRNG_TestController port map ( Clock => Clock_100, Reset => Reset_100, diff --git a/tb/arith/prefix_and/RunAllTests.pro b/tb/arith/Prefix_And/RunAllTests.pro similarity index 80% rename from tb/arith/prefix_and/RunAllTests.pro rename to tb/arith/Prefix_And/RunAllTests.pro index 6e076b2a5..107e1b799 100644 --- a/tb/arith/prefix_and/RunAllTests.pro +++ b/tb/arith/Prefix_And/RunAllTests.pro @@ -19,13 +19,13 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.arith.prefix_and +TestSuite PoC.arith.Prefix_And -library tb_arith_prefix_and +library tb_arith_Prefix_And -analyze arith_prefix_and_TestController.vhdl -analyze arith_prefix_and_TestHarness.vhdl +analyze arith_Prefix_And_TestController.vhdl +analyze arith_Prefix_And_TestHarness.vhdl # Test Cases -RunTest arith_prefix_and_Simple.vhdl -RunTest arith_prefix_and_Exhaustive.vhdl +RunTest arith_Prefix_And_Simple.vhdl +RunTest arith_Prefix_And_Exhaustive.vhdl diff --git a/tb/arith/Prefix_And/arith_Prefix_And_Exhaustive.vhdl b/tb/arith/Prefix_And/arith_Prefix_And_Exhaustive.vhdl new file mode 100644 index 000000000..ec5cfe76e --- /dev/null +++ b/tb/arith/Prefix_And/arith_Prefix_And_Exhaustive.vhdl @@ -0,0 +1,120 @@ +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Patrick Lehmann +-- Gustavo Martin +-- +-- Entity: arith_Prefix_And_TestController +-- +-- Description: +-- ------------------------------------- +-- Exhaustive test for arith_Prefix_And using OSVVM. +-- Tests all possible input patterns (2**N combinations). +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; + +library PoC; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.strings.all; + +architecture Exhaustive of arith_Prefix_And_TestController is + signal TestDone : integer_barrier := 1; + + constant TCID : AlertLogIDType := NewID("TestCtrl"); + +begin + ControlProc: process + constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); + constant TIMEOUT : time := 100 ms; + begin + SetTestName("arith_Prefix_And_Exhaustive"); + + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, FALSE); + SetLogEnable(DEBUG, FALSE); + wait for 0 ns; wait for 0 ns; + + TranscriptOpen; + SetTranscriptMirror(TRUE); + + wait until Reset = '0'; + ClearAlerts; + + WaitForBarrier(TestDone, TIMEOUT); + AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); + AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); + + EndOfTestReports(ReportAll => TRUE); + std.env.stop; + end process; + + CheckerProc: process + constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); + variable test_pattern : unsigned(x'range); + variable test_pattern_slv : std_logic_vector(x'range); + + begin + wait until Reset = '0'; + WaitForClock(Clock); + + x(x'range) <= (others => '0'); + WaitForClock(Clock); + + -- Exhaustive Testing: test all possible input patterns + for i in 0 to (2**x'length) - 1 loop + test_pattern := to_unsigned(i, x'length); + test_pattern_slv := std_logic_vector(test_pattern); + x <= test_pattern_slv; + WaitForClock(Clock); + + -- Check each bit position j + for j in 0 to x'length - 1 loop + -- y(j) should be '1' if and only if x(j downto 0) are all '1' + -- This is equivalent to: x(j downto 0) = (j downto 0 => '1') + AffirmIf(ProcID, + (y(j) = '1') = (test_pattern_slv(j downto 0) = (j downto 0 => '1')), + "Pattern " & PoC.strings.to_string(i) & " / bit " & PoC.strings.to_string(j) & + ": x = 0x" & to_hstring(test_pattern_slv) & + ", y = 0x" & to_hstring(y) & + ", y(" & PoC.strings.to_string(j) & ") = " & to_string(y(j)) + ); + end loop; + end loop; + + x(x'range) <= (others => '0'); + WaitForClock(Clock); + + WaitForBarrier(TestDone); + wait; + end process; +end architecture; + +configuration arith_Prefix_And_Exhaustive of arith_Prefix_And_TestHarness is + for TestHarness + for TestCtrl: arith_Prefix_And_TestController + use entity work.arith_Prefix_And_TestController(Exhaustive); + end for; + end for; +end configuration; diff --git a/tb/arith/Prefix_And/arith_Prefix_And_Simple.vhdl b/tb/arith/Prefix_And/arith_Prefix_And_Simple.vhdl new file mode 100644 index 000000000..6a4729cae --- /dev/null +++ b/tb/arith/Prefix_And/arith_Prefix_And_Simple.vhdl @@ -0,0 +1,234 @@ +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Patrick Lehmann +-- Gustavo Martin +-- +-- Entity: arith_Prefix_And_TestController +-- +-- Description: +-- ------------------------------------- +-- .. TODO:: No documentation available. +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; + +library PoC; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.strings.all; + +architecture Simple of arith_Prefix_And_TestController is + signal TestDone : integer_barrier := 1; + + constant TCID : AlertLogIDType := NewID("TestCtrl"); + +begin + ControlProc: process + constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); + constant TIMEOUT : time := 10 ms; + begin + SetTestName("arith_Prefix_And_Simple"); + + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, FALSE); + SetLogEnable(DEBUG, FALSE); + wait for 0 ns; wait for 0 ns; + + TranscriptOpen; + SetTranscriptMirror(TRUE); + + wait until Reset = '0'; + ClearAlerts; + + WaitForBarrier(TestDone, TIMEOUT); + AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); + AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); + + EndOfTestReports(ReportAll => TRUE); + std.env.stop; + end process; + + CheckerProc: process + constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); + + -- Helper function to compute expected prefix AND + function compute_prefix_and(x : std_logic_vector) return std_logic_vector is + variable result : std_logic_vector(x'range); + variable all_ones : boolean; + begin + for i in x'range loop + all_ones := true; + for j in x'low to i loop + if x(j) /= '1' then + all_ones := false; + exit; + end if; + end loop; + if all_ones then + result(i) := '1'; + else + result(i) := '0'; + end if; + end loop; + return result; + end function; + + variable expected : std_logic_vector(y'range); + variable test_input : std_logic_vector(y'range); + + begin + wait until Reset = '0'; + WaitForClock(Clock); + + x(x'range) <= (others => '0'); + WaitForClock(Clock); + + -- Test Case 1: All zeros + test_input := (others => '0'); + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_and(test_input); + AffirmIf(ProcID, + y = expected, + "Test all zeros: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + + -- Test Case 2: All ones + test_input := (others => '1'); + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_and(test_input); + AffirmIf(ProcID, + y = expected, + "Test all ones: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + + -- Test Case 3: Alternating pattern 0101... + for i in test_input'range loop + if (i mod 2) = 0 then + test_input(i) := '1'; + else + test_input(i) := '0'; + end if; + end loop; + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_and(test_input); + AffirmIf(ProcID, + y = expected, + "Test alternating 0101: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + + -- Test Case 4: Consecutive ones from LSB + for len in 0 to test_input'length loop + test_input := (others => '0'); + for i in 0 to len-1 loop + test_input(i) := '1'; + end loop; + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_and(test_input); + AffirmIf(ProcID, + y = expected, + "Test " & PoC.strings.to_string(len) & " ones from LSB: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + end loop; + + -- Test Case 5: Single bit set at each position + for pos in test_input'range loop + test_input := (others => '0'); + test_input(pos) := '1'; + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_and(test_input); + AffirmIf(ProcID, + y = expected, + "Test bit " & PoC.strings.to_string(pos) & " set: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + end loop; + + -- Test Case 6: Random patterns (if using 8-bit width) + if y'length = 8 then + -- Test some specific 8-bit patterns + test_input := "10101010"; + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_and(test_input); + AffirmIf(ProcID, + y = expected, + "Test pattern 10101010: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + + test_input := "11110000"; + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_and(test_input); + AffirmIf(ProcID, + y = expected, + "Test pattern 11110000: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + + test_input := "00001111"; + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_and(test_input); + AffirmIf(ProcID, + y = expected, + "Test pattern 00001111: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + + test_input := "11111110"; + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_and(test_input); + AffirmIf(ProcID, + y = expected, + "Test pattern 11111110: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + end if; + + x(x'range) <= (others => '0'); + WaitForClock(Clock); + + WaitForBarrier(TestDone); + wait; + end process; +end architecture; + +configuration arith_Prefix_And_Simple of arith_Prefix_And_TestHarness is + for TestHarness + for TestCtrl: arith_Prefix_And_TestController + use entity work.arith_Prefix_And_TestController(Simple); + end for; + end for; +end configuration; diff --git a/tb/arith/prefix_and/arith_prefix_and_TestController.vhdl b/tb/arith/Prefix_And/arith_Prefix_And_TestController.vhdl similarity index 75% rename from tb/arith/prefix_and/arith_prefix_and_TestController.vhdl rename to tb/arith/Prefix_And/arith_Prefix_And_TestController.vhdl index 5004574e7..170013832 100644 --- a/tb/arith/prefix_and/arith_prefix_and_TestController.vhdl +++ b/tb/arith/Prefix_And/arith_Prefix_And_TestController.vhdl @@ -1,9 +1,9 @@ -- ============================================================================= --- Authors: Thomas B. Preusser --- Patrick Lehmann +-- Authors: Thomas B. Preusser +-- Patrick Lehmann -- Gustavo Martin -- --- Entity: arith_prefix_and_TestController +-- Entity: arith_Prefix_And_TestController -- -- Description: -- ------------------------------------- @@ -17,7 +17,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -33,11 +33,11 @@ library osvvm; context osvvm.OsvvmContext; -entity arith_prefix_and_TestController is - port ( - Clock : in std_logic; - Reset : in std_logic; - x : out std_logic_vector; - y : in std_logic_vector - ); +entity arith_Prefix_And_TestController is + port ( + Clock : in std_logic; + Reset : in std_logic; + x : out std_logic_vector; + y : in std_logic_vector + ); end entity; diff --git a/tb/arith/Prefix_And/arith_Prefix_And_TestHarness.vhdl b/tb/arith/Prefix_And/arith_Prefix_And_TestHarness.vhdl new file mode 100644 index 000000000..60202bd3b --- /dev/null +++ b/tb/arith/Prefix_And/arith_Prefix_And_TestHarness.vhdl @@ -0,0 +1,94 @@ +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Patrick Lehmann +-- Gustavo Martin +-- +-- Entity: arith_Prefix_And_TestHarness +-- +-- Description: +-- ------------------------------------- +-- .. TODO:: No documentation available. +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; + +library PoC; + + +entity arith_Prefix_And_TestHarness is +end entity; + + +architecture TestHarness of arith_Prefix_And_TestHarness is + constant TPERIOD_CLOCK : time := 10 ns; + + constant N : positive := 8; + + signal Clock_100 : std_logic := '1'; + signal Reset_100 : std_logic := '1'; + + signal x : std_logic_vector(N - 1 downto 0); + signal y : std_logic_vector(N - 1 downto 0); + + + component arith_Prefix_And_TestController is + port ( + Clock : in std_logic; + Reset : in std_logic; + x : out std_logic_vector; + y : in std_logic_vector + ); + end component; + +begin + Osvvm.ClockResetPkg.CreateClock( + Clk => Clock_100, + Period => TPERIOD_CLOCK + ); + + Osvvm.ClockResetPkg.CreateReset( + Reset => Reset_100, + ResetActive => '1', + Clk => Clock_100, + Period => 5 * TPERIOD_CLOCK, + tpd => 0 ns + ); + + DUT : entity PoC.arith_Prefix_And + generic map ( + BITS => N + ) + port map ( + x => x, + y => y + ); + + TestCtrl: component arith_Prefix_And_TestController + port map ( + Clock => Clock_100, + Reset => Reset_100, + x => x, + y => y + ); +end architecture; diff --git a/tb/arith/prefix_or/RunAllTests.pro b/tb/arith/Prefix_Or/RunAllTests.pro similarity index 80% rename from tb/arith/prefix_or/RunAllTests.pro rename to tb/arith/Prefix_Or/RunAllTests.pro index f8d70be02..920bae17c 100644 --- a/tb/arith/prefix_or/RunAllTests.pro +++ b/tb/arith/Prefix_Or/RunAllTests.pro @@ -19,13 +19,13 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.arith.prefix_or +TestSuite PoC.arith.Prefix_Or -library tb_arith_prefix_or +library tb_arith_Prefix_Or -analyze arith_prefix_or_TestController.vhdl -analyze arith_prefix_or_TestHarness.vhdl +analyze arith_Prefix_Or_TestController.vhdl +analyze arith_Prefix_Or_TestHarness.vhdl # Test Cases -RunTest arith_prefix_or_Simple.vhdl -RunTest arith_prefix_or_Exhaustive.vhdl +RunTest arith_Prefix_Or_Simple.vhdl +RunTest arith_Prefix_Or_Exhaustive.vhdl diff --git a/tb/arith/prefix_or/arith_prefix_or_Exhaustive.vhdl b/tb/arith/Prefix_Or/arith_Prefix_Or_Exhaustive.vhdl similarity index 87% rename from tb/arith/prefix_or/arith_prefix_or_Exhaustive.vhdl rename to tb/arith/Prefix_Or/arith_Prefix_Or_Exhaustive.vhdl index f92aa20d2..5cb2bf059 100644 --- a/tb/arith/prefix_or/arith_prefix_or_Exhaustive.vhdl +++ b/tb/arith/Prefix_Or/arith_Prefix_Or_Exhaustive.vhdl @@ -1,12 +1,12 @@ -- ============================================================================= --- Authors: Thomas B. Preusser +-- Authors: Thomas B. Preusser -- Gustavo Martin -- --- Entity: arith_prefix_or_TestController +-- Entity: arith_Prefix_Or_TestController -- -- Description: -- ------------------------------------- --- Exhaustive test for arith_prefix_or using OSVVM. +-- Exhaustive test for arith_Prefix_Or using OSVVM. -- Tests all possible input patterns (2**N combinations). -- -- License: @@ -17,7 +17,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -38,7 +38,7 @@ use PoC.utils.all; use PoC.vectors.all; use PoC.strings.all; -architecture Exhaustive of arith_prefix_or_TestController is +architecture Exhaustive of arith_Prefix_Or_TestController is signal TestDone : integer_barrier := 1; constant TCID : AlertLogIDType := NewID("TestCtrl"); @@ -48,7 +48,7 @@ begin constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); constant TIMEOUT : time := 100 ms; begin - SetTestName("arith_prefix_or_Exhaustive"); + SetTestName("arith_Prefix_Or_Exhaustive"); SetLogEnable(PASSED, FALSE); SetLogEnable(INFO, FALSE); @@ -114,10 +114,10 @@ begin end process; end architecture; -configuration arith_prefix_or_Exhaustive of arith_prefix_or_TestHarness is +configuration arith_Prefix_Or_Exhaustive of arith_Prefix_Or_TestHarness is for TestHarness - for TestCtrl: arith_prefix_or_TestController - use entity work.arith_prefix_or_TestController(Exhaustive); + for TestCtrl: arith_Prefix_Or_TestController + use entity work.arith_Prefix_Or_TestController(Exhaustive); end for; end for; end configuration; diff --git a/tb/arith/Prefix_Or/arith_Prefix_Or_Simple.vhdl b/tb/arith/Prefix_Or/arith_Prefix_Or_Simple.vhdl new file mode 100644 index 000000000..388c835ff --- /dev/null +++ b/tb/arith/Prefix_Or/arith_Prefix_Or_Simple.vhdl @@ -0,0 +1,236 @@ +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Gustavo Martin +-- +-- Entity: arith_Prefix_Or_TestController +-- +-- Description: +-- ------------------------------------- +-- .. TODO:: No documentation available. +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; + +library PoC; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.strings.all; + +architecture Simple of arith_Prefix_Or_TestController is + signal TestDone : integer_barrier := 1; + + constant TCID : AlertLogIDType := NewID("TestCtrl"); + +begin + ControlProc: process + constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); + constant TIMEOUT : time := 10 ms; + begin + SetTestName("arith_Prefix_Or_Simple"); + + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, FALSE); + SetLogEnable(DEBUG, FALSE); + wait for 0 ns; wait for 0 ns; + + TranscriptOpen; + SetTranscriptMirror(TRUE); + + wait until Reset = '0'; + ClearAlerts; + + WaitForBarrier(TestDone, TIMEOUT); + AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); + AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); + + EndOfTestReports(ReportAll => TRUE); + std.env.stop; + end process; + + CheckerProc: process + constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); + + -- Helper function to compute expected prefix OR + -- y(i) <= '0' when x(i downto 0) = (i downto 0 => '0') else '1' + function compute_prefix_or(x : std_logic_vector) return std_logic_vector is + variable result : std_logic_vector(x'range); + variable all_zeros : boolean; + begin + for i in x'range loop + all_zeros := true; + for j in x'low to i loop + if x(j) /= '0' then + all_zeros := false; + exit; + end if; + end loop; + if all_zeros then + result(i) := '0'; + else + result(i) := '1'; + end if; + end loop; + return result; + end function; + + variable expected : std_logic_vector(y'range); + variable test_input : std_logic_vector(y'range); + + begin + wait until Reset = '0'; + WaitForClock(Clock); + + test_input := (others => '0'); + x <= test_input; + WaitForClock(Clock); + + -- Test Case 1: All zeros + test_input := (others => '0'); + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_or(test_input); + AffirmIf(ProcID, + y = expected, + "Test all zeros: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + + -- Test Case 2: All ones + test_input := (others => '1'); + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_or(test_input); + AffirmIf(ProcID, + y = expected, + "Test all ones: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + + -- Test Case 3: Alternating pattern 0101... + for i in test_input'range loop + if (i mod 2) = 0 then + test_input(i) := '1'; + else + test_input(i) := '0'; + end if; + end loop; + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_or(test_input); + AffirmIf(ProcID, + y = expected, + "Test alternating 0101: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + + -- Test Case 4: Consecutive ones from LSB + for len in 0 to test_input'length loop + test_input := (others => '0'); + for i in 0 to len-1 loop + test_input(i) := '1'; + end loop; + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_or(test_input); + AffirmIf(ProcID, + y = expected, + "Test " & PoC.strings.to_string(len) & " ones from LSB: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + end loop; + + -- Test Case 5: Single bit set at each position + for pos in test_input'range loop + test_input := (others => '0'); + test_input(pos) := '1'; + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_or(test_input); + AffirmIf(ProcID, + y = expected, + "Test bit " & PoC.strings.to_string(pos) & " set: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + end loop; + + -- Test Case 6: Specific patterns (if using 8-bit width) + if y'length = 8 then + -- Test some specific 8-bit patterns + test_input := "10101010"; + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_or(test_input); + AffirmIf(ProcID, + y = expected, + "Test pattern 10101010: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + + test_input := "11110000"; + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_or(test_input); + AffirmIf(ProcID, + y = expected, + "Test pattern 11110000: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + + test_input := "00001111"; + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_or(test_input); + AffirmIf(ProcID, + y = expected, + "Test pattern 00001111: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + + test_input := "00000001"; + x <= test_input; + WaitForClock(Clock); + expected := compute_prefix_or(test_input); + AffirmIf(ProcID, + y = expected, + "Test pattern 00000001: y = 0x" & to_hstring(y), + " Expected = 0x" & to_hstring(expected) + ); + end if; + + test_input := (others => '0'); + x <= test_input; + WaitForClock(Clock); + + WaitForBarrier(TestDone); + wait; + end process; +end architecture; + +configuration arith_Prefix_Or_Simple of arith_Prefix_Or_TestHarness is + for TestHarness + for TestCtrl: arith_Prefix_Or_TestController + use entity work.arith_Prefix_Or_TestController(Simple); + end for; + end for; +end configuration; diff --git a/tb/arith/prefix_or/arith_prefix_or_TestController.vhdl b/tb/arith/Prefix_Or/arith_Prefix_Or_TestController.vhdl similarity index 87% rename from tb/arith/prefix_or/arith_prefix_or_TestController.vhdl rename to tb/arith/Prefix_Or/arith_Prefix_Or_TestController.vhdl index c945ffe27..c04b7ceb3 100644 --- a/tb/arith/prefix_or/arith_prefix_or_TestController.vhdl +++ b/tb/arith/Prefix_Or/arith_Prefix_Or_TestController.vhdl @@ -1,8 +1,8 @@ -- ============================================================================= --- Authors: Thomas B. Preusser +-- Authors: Thomas B. Preusser -- Gustavo Martin -- --- Entity: arith_prefix_or_TestController +-- Entity: arith_Prefix_Or_TestController -- -- Description: -- ------------------------------------- @@ -16,7 +16,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -32,7 +32,7 @@ library osvvm; context osvvm.OsvvmContext; -entity arith_prefix_or_TestController is +entity arith_Prefix_Or_TestController is port ( Clock : in std_logic; Reset : in std_logic; diff --git a/tb/arith/prefix_or/arith_prefix_or_TestHarness.vhdl b/tb/arith/Prefix_Or/arith_Prefix_Or_TestHarness.vhdl similarity index 83% rename from tb/arith/prefix_or/arith_prefix_or_TestHarness.vhdl rename to tb/arith/Prefix_Or/arith_Prefix_Or_TestHarness.vhdl index 27d0bfeed..f56e152ce 100644 --- a/tb/arith/prefix_or/arith_prefix_or_TestHarness.vhdl +++ b/tb/arith/Prefix_Or/arith_Prefix_Or_TestHarness.vhdl @@ -1,8 +1,8 @@ -- ============================================================================= --- Authors: Thomas B. Preusser +-- Authors: Thomas B. Preusser -- Gustavo Martin -- --- Entity: arith_prefix_or_TestHarness +-- Entity: arith_Prefix_Or_TestHarness -- -- Description: -- ------------------------------------- @@ -16,7 +16,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -35,11 +35,11 @@ context osvvm.OsvvmContext; library PoC; -entity arith_prefix_or_TestHarness is +entity arith_Prefix_Or_TestHarness is end entity; -architecture TestHarness of arith_prefix_or_TestHarness is +architecture TestHarness of arith_Prefix_Or_TestHarness is constant TPERIOD_CLOCK : time := 10 ns; constant N : positive := 8; @@ -51,7 +51,7 @@ architecture TestHarness of arith_prefix_or_TestHarness is signal y : std_logic_vector(N - 1 downto 0); - component arith_prefix_or_TestController is + component arith_Prefix_Or_TestController is port ( Clock : in std_logic; Reset : in std_logic; @@ -74,16 +74,16 @@ begin tpd => 0 ns ); - DUT : entity PoC.arith_prefix_or + DUT : entity PoC.arith_Prefix_Or generic map ( - N => N + BITS => N ) port map ( x => x, y => y ); - TestCtrl: component arith_prefix_or_TestController + TestCtrl: component arith_Prefix_Or_TestController port map ( Clock => Clock_100, Reset => Reset_100, diff --git a/tb/arith/RunAllTests.pro b/tb/arith/RunAllTests.pro index b668dca0d..a67dea4ea 100644 --- a/tb/arith/RunAllTests.pro +++ b/tb/arith/RunAllTests.pro @@ -24,21 +24,21 @@ library tb_arith -include ./prng/RunAllTests.pro -include ./prefix_and/RunAllTests.pro -include ./prefix_or/RunAllTests.pro -include ./addw/RunAllTests.pro -include ./counter_bcd/RunAllTests.pro -include ./convert_bin2bcd/RunAllTests.pro -include ./div/RunAllTests.pro -include ./firstone/RunAllTests.pro -include ./scaler/RunAllTests.pro -include ./same/RunAllTests.pro -include ./counter_ring/RunAllTests.pro -include ./counter_gray/RunAllTests.pro -include ./counter_free/RunAllTests.pro -include ./carrychain_inc/RunAllTests.pro +include ./PRNG/RunAllTests.pro +include ./Prefix_And/RunAllTests.pro +include ./Prefix_Or/RunAllTests.pro +include ./Adder_Wide/RunAllTests.pro +include ./Counter_BCD/RunAllTests.pro +include ./Convert_Binary2BCD/RunAllTests.pro +include ./Divider/RunAllTests.pro +include ./FirstOne/RunAllTests.pro +include ./Scaler/RunAllTests.pro +include ./Same/RunAllTests.pro +include ./Counter_Ring/RunAllTests.pro +include ./Counter_Gray/RunAllTests.pro +include ./Counter_Free/RunAllTests.pro +include ./CarryChain_inc/RunAllTests.pro include ./cca/RunAllTests.pro -include ./shifter_barrel/RunAllTests.pro -include ./sqrt/RunAllTests.pro -include ./trng/RunAllTests.pro +include ./Shifter_Barrel/RunAllTests.pro +include ./SquareRoot/RunAllTests.pro +include ./TRNG/RunAllTests.pro diff --git a/tb/arith/same/RunAllTests.pro b/tb/arith/Same/RunAllTests.pro similarity index 85% rename from tb/arith/same/RunAllTests.pro rename to tb/arith/Same/RunAllTests.pro index eedf2f969..30ee352f5 100644 --- a/tb/arith/same/RunAllTests.pro +++ b/tb/arith/Same/RunAllTests.pro @@ -19,12 +19,12 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.arith.same +TestSuite PoC.arith.Same -library tb_arith_same +library tb_arith_Same -analyze arith_same_TestController.vhdl -analyze arith_same_TestHarness.vhdl +analyze arith_Same_TestController.vhdl +analyze arith_Same_TestHarness.vhdl # Test Cases -RunTest arith_same_Simple.vhdl +RunTest arith_Same_Simple.vhdl diff --git a/tb/arith/same/arith_same_Simple.vhdl b/tb/arith/Same/arith_Same_Simple.vhdl similarity index 88% rename from tb/arith/same/arith_same_Simple.vhdl rename to tb/arith/Same/arith_Same_Simple.vhdl index b61afd5aa..518b48769 100644 --- a/tb/arith/same/arith_same_Simple.vhdl +++ b/tb/arith/Same/arith_Same_Simple.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_same_TestController +-- Entity: arith_Same_TestController -- -- Description: -- ------------------------------------- --- Simple test for arith_same component +-- Simple test for arith_Same component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,7 +34,7 @@ context osvvm.OsvvmContext; library PoC; use PoC.utils.all; -architecture Simple of arith_same_TestController is +architecture Simple of arith_Same_TestController is signal TestDone : integer_barrier := 1; constant TCID : AlertLogIDType := NewID("TestCtrl"); @@ -44,7 +44,7 @@ begin constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); constant TIMEOUT : time := 10 ms; begin - SetTestName("arith_same_Simple"); + SetTestName("arith_Same_Simple"); SetLogEnable(PASSED, FALSE); SetLogEnable(INFO, FALSE); @@ -117,10 +117,10 @@ begin end process; end architecture; -configuration arith_same_Simple of arith_same_TestHarness is +configuration arith_Same_Simple of arith_Same_TestHarness is for TestHarness - for TestCtrl: arith_same_TestController - use entity work.arith_same_TestController(Simple); + for TestCtrl: arith_Same_TestController + use entity work.arith_Same_TestController(Simple); end for; end for; end configuration; diff --git a/tb/arith/same/arith_same_TestController.vhdl b/tb/arith/Same/arith_Same_TestController.vhdl similarity index 84% rename from tb/arith/same/arith_same_TestController.vhdl rename to tb/arith/Same/arith_Same_TestController.vhdl index 7aaaf0fd8..8d2c10d4c 100644 --- a/tb/arith/same/arith_same_TestController.vhdl +++ b/tb/arith/Same/arith_Same_TestController.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_same_TestController +-- Entity: arith_Same_TestController -- -- Description: -- ------------------------------------- --- Test controller for arith_same component +-- Test controller for arith_Same component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,7 +31,7 @@ library osvvm; context osvvm.OsvvmContext; -entity arith_same_TestController is +entity arith_Same_TestController is port ( Clock : in std_logic; Reset : in std_logic; diff --git a/tb/arith/same/arith_same_TestHarness.vhdl b/tb/arith/Same/arith_Same_TestHarness.vhdl similarity index 84% rename from tb/arith/same/arith_same_TestHarness.vhdl rename to tb/arith/Same/arith_Same_TestHarness.vhdl index e0381ab0d..5029a792f 100644 --- a/tb/arith/same/arith_same_TestHarness.vhdl +++ b/tb/arith/Same/arith_Same_TestHarness.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= -- Authors: Gustavo Martin -- --- Entity: arith_same_TestHarness +-- Entity: arith_Same_TestHarness -- -- Description: -- ------------------------------------- --- Test harness for arith_same component +-- Test harness for arith_Same component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,11 +34,11 @@ context osvvm.OsvvmContext; library PoC; -entity arith_same_TestHarness is +entity arith_Same_TestHarness is end entity; -architecture TestHarness of arith_same_TestHarness is +architecture TestHarness of arith_Same_TestHarness is constant TPERIOD_CLOCK : time := 10 ns; constant BITS : positive := 8; @@ -51,7 +51,7 @@ architecture TestHarness of arith_same_TestHarness is signal y : std_logic; - component arith_same_TestController is + component arith_Same_TestController is port ( Clock : in std_logic; Reset : in std_logic; @@ -75,9 +75,9 @@ begin tpd => 0 ns ); - DUT : entity PoC.arith_same + DUT : entity PoC.arith_Same generic map ( - N => BITS + BITS => BITS ) port map ( g => g, @@ -85,7 +85,7 @@ begin y => y ); - TestCtrl: component arith_same_TestController + TestCtrl: component arith_Same_TestController port map ( Clock => Clock, Reset => Reset, diff --git a/tb/arith/scaler/RunAllTests.pro b/tb/arith/Scaler/RunAllTests.pro similarity index 84% rename from tb/arith/scaler/RunAllTests.pro rename to tb/arith/Scaler/RunAllTests.pro index 18c34dc3e..6b86dfd9b 100644 --- a/tb/arith/scaler/RunAllTests.pro +++ b/tb/arith/Scaler/RunAllTests.pro @@ -18,12 +18,12 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.arith.scaler +TestSuite PoC.arith.Scaler -library tb_arith_scaler +library tb_arith_Scaler -analyze arith_scaler_TestController.vhdl -analyze arith_scaler_TestHarness.vhdl +analyze arith_Scaler_TestController.vhdl +analyze arith_Scaler_TestHarness.vhdl # Test Cases -RunTest arith_scaler_Simple.vhdl +RunTest arith_Scaler_Simple.vhdl diff --git a/tb/arith/Scaler/arith_Scaler_Simple.vhdl b/tb/arith/Scaler/arith_Scaler_Simple.vhdl new file mode 100644 index 000000000..f118e2176 --- /dev/null +++ b/tb/arith/Scaler/arith_Scaler_Simple.vhdl @@ -0,0 +1,138 @@ +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Gustavo Martin +-- +-- Entity: arith_Scaler_Simple +-- +-- Description: +-- ------------------------------------- +-- Simple OSVVM test for arith_Scaler +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- Copyright 2007-2016 Technische Universität Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; + +library PoC; +use PoC.utils.all; + +architecture Simple of arith_Scaler_TestController is + constant TCID : AlertLogIDType := NewID("ScalerTest"); + signal TestDone : integer_barrier := 1; + + -- Test argument values + constant ARGS : natural_vector := (0, 1, 2, 3, 4, 31, 32, 33, 63, 64, 65, 95, 96, 97, 127, 128, 129, 196, 254, 255); +begin + + ControlProc: process + constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); + constant TIMEOUT : time := 100 ms; + begin + SetTestName("arith_Scaler_Simple"); + + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, FALSE); + SetLogEnable(DEBUG, FALSE); + wait for 0 ns; wait for 0 ns; + + TranscriptOpen; + SetTranscriptMirror(TRUE); + + wait until Reset = '0'; + ClearAlerts; + + WaitForBarrier(TestDone, TIMEOUT); + AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); + AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); + + EndOfTestReports(ReportAll => TRUE); + std.env.stop; + end process; + + CheckerProc: process + constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); + variable expected : natural; + variable test_count : natural := 0; + begin + start <= '0'; + arg <= (others => '0'); + msel <= (others => '0'); + dsel <= (others => '0'); + wait until Reset = '0'; + + WaitForClock(Clock, 5); + + -- Exhaustive testing: all combinations of multipliers, divisors, and arguments + for i in MULS'range loop + for j in DIVS'range loop + for k in ARGS'range loop + WaitForClock(Clock); + -- Set up inputs + arg <= std_logic_vector(to_unsigned(ARGS(k), arg'length)); + msel <= std_logic_vector(to_unsigned(i, msel'length)); + dsel <= std_logic_vector(to_unsigned(j, dsel'length)); + start <= '1'; + WaitForClock(Clock); + + -- Release start and set inputs to don't-care + arg <= (others => '-'); + msel <= (others => '-'); + dsel <= (others => '-'); + start <= '0'; + WaitForClock(Clock); + + -- Wait for completion + wait until rising_edge(Clock) and done = '1'; + + + -- Calculate expected result: (arg * mul + div/2) / div, modulo 2^width + expected := ((ARGS(k) * MULS(i) + DIVS(j)/2) / DIVS(j)) mod 2**res'length; + + AffirmIf(ProcID, + res = std_logic_vector(to_unsigned(expected, res'length)), + "Computation error: " & + integer'image(ARGS(k)) & "*" & integer'image(MULS(i)) & "/" & integer'image(DIVS(j)) & + " -> expected " & integer'image(expected) & + ", got " & integer'image(to_integer(unsigned(res)))); + + test_count := test_count + 1; + end loop; + end loop; + end loop; + + Log(ProcID, "Completed " & integer'image(test_count) & " Scaler computations", INFO); + + -- Finalize + WaitForBarrier(TestDone); + wait; + end process; +end architecture; + +configuration arith_Scaler_Simple of arith_Scaler_TestHarness is + for TestHarness + for TestCtrl: arith_Scaler_TestController + use entity work.arith_Scaler_TestController(Simple); + end for; + end for; +end configuration; diff --git a/tb/arith/scaler/arith_scaler_TestController.vhdl b/tb/arith/Scaler/arith_Scaler_TestController.vhdl similarity index 60% rename from tb/arith/scaler/arith_scaler_TestController.vhdl rename to tb/arith/Scaler/arith_Scaler_TestController.vhdl index dd5e0872b..bec777d02 100644 --- a/tb/arith/scaler/arith_scaler_TestController.vhdl +++ b/tb/arith/Scaler/arith_Scaler_TestController.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= -- Authors: Gustavo Martin -- --- Entity: arith_scaler_TestController +-- Entity: arith_Scaler_TestController -- -- Description: -- ------------------------------------- --- Test controller for arith_scaler +-- Test controller for arith_Scaler -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -32,24 +32,24 @@ library osvvm; context osvvm.OsvvmContext; library PoC; -use PoC.utils.all; +use PoC.utils.all; -entity arith_scaler_TestController is - generic ( - MULS : T_POSVEC; - DIVS : T_POSVEC; - ARG_WIDTH : positive - ); - port ( - Clock : in std_logic; - Reset : in std_logic; - - -- DUT signals arith_scaler - start : out std_logic; - arg : out std_logic_vector(ARG_WIDTH-1 downto 0); - msel : out std_logic_vector(log2ceil(MULS'length)-1 downto 0); - dsel : out std_logic_vector(log2ceil(DIVS'length)-1 downto 0); - done : in std_logic; - res : in std_logic_vector(ARG_WIDTH-1 downto 0) - ); +entity arith_Scaler_TestController is + generic ( + MULS : positive_vector; + DIVS : positive_vector; + ARG_WIDTH : positive + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + + -- DUT signals arith_Scaler + start : out std_logic; + arg : out std_logic_vector(ARG_WIDTH-1 downto 0); + msel : out std_logic_vector(log2ceil(MULS'length)-1 downto 0); + dsel : out std_logic_vector(log2ceil(DIVS'length)-1 downto 0); + done : in std_logic; + res : in std_logic_vector(ARG_WIDTH-1 downto 0) + ); end entity; diff --git a/tb/arith/Scaler/arith_Scaler_TestHarness.vhdl b/tb/arith/Scaler/arith_Scaler_TestHarness.vhdl new file mode 100644 index 000000000..e4d452fc1 --- /dev/null +++ b/tb/arith/Scaler/arith_Scaler_TestHarness.vhdl @@ -0,0 +1,125 @@ +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Gustavo Martin +-- +-- Entity: arith_Scaler_TestHarness +-- +-- Description: +-- ------------------------------------- +-- Test harness for arith_Scaler +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- Copyright 2007-2016 Technische Universität Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; + +library PoC; +use PoC.utils.all; +use PoC.physical.all; + +entity arith_Scaler_TestHarness is +end entity; + +architecture TestHarness of arith_Scaler_TestHarness is + constant TPERIOD_CLOCK : time := 10 ns; + constant MULS : positive_vector := (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); + constant DIVS : positive_vector := (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); + constant ARG_WIDTH : positive := 8; + + signal Clock : std_logic := '1'; + signal Reset : std_logic := '1'; + + signal start : std_logic := '0'; + signal arg : std_logic_vector(ARG_WIDTH-1 downto 0) := (others => '0'); + signal msel : std_logic_vector(log2ceil(MULS'length)-1 downto 0) := (others => '0'); + signal dsel : std_logic_vector(log2ceil(DIVS'length)-1 downto 0) := (others => '0'); + signal done : std_logic; + signal res : std_logic_vector(ARG_WIDTH-1 downto 0); + + component arith_Scaler_TestController is + generic ( + MULS : positive_vector; + DIVS : positive_vector; + ARG_WIDTH : positive + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + start : out std_logic; + arg : out std_logic_vector(ARG_WIDTH-1 downto 0); + msel : out std_logic_vector(log2ceil(MULS'length)-1 downto 0); + dsel : out std_logic_vector(log2ceil(DIVS'length)-1 downto 0); + done : in std_logic; + res : in std_logic_vector(ARG_WIDTH-1 downto 0) + ); + end component; + +begin + + Osvvm.ClockResetPkg.CreateClock( + Clk => Clock, + Period => TPERIOD_CLOCK + ); + + Osvvm.ClockResetPkg.CreateReset( + Reset => Reset, + ResetActive => '1', + Clk => Clock, + Period => 5 * TPERIOD_CLOCK, + tpd => 0 ns + ); + + UUT: entity PoC.arith_Scaler + generic map ( + MULTIPLIERS => MULS, + DIVISORS => DIVS + ) + port map ( + Clock => Clock, + Reset => Reset, + Start => start, + Operand => arg, + MultiplierSelect => msel, + DivisorSelect => dsel, + Done => done, + Result => res + ); + + TestCtrl: component arith_Scaler_TestController + generic map ( + MULS => MULS, + DIVS => DIVS, + ARG_WIDTH => ARG_WIDTH + ) + port map ( + Clock => Clock, + Reset => Reset, + start => start, + arg => arg, + msel => msel, + dsel => dsel, + done => done, + res => res + ); +end architecture; diff --git a/tb/arith/addw/RunAllTests.pro b/tb/arith/Shifter_Barrel/RunAllTests.pro similarity index 81% rename from tb/arith/addw/RunAllTests.pro rename to tb/arith/Shifter_Barrel/RunAllTests.pro index 27a0c1138..6e46f9ab6 100644 --- a/tb/arith/addw/RunAllTests.pro +++ b/tb/arith/Shifter_Barrel/RunAllTests.pro @@ -19,13 +19,12 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.arith.addw +TestSuite PoC.arith.Shifter_Barrel -library tb_arith_addw +library tb_arith_Shifter_Barrel -analyze arith_addw_TestController_pkg.vhdl -analyze arith_addw_TestController.vhdl -analyze arith_addw_TestHarness.vhdl +analyze arith_Shifter_Barrel_TestController.vhdl +analyze arith_Shifter_Barrel_TestHarness.vhdl # Test Cases -RunTest arith_addw_Simple.vhdl +RunTest arith_Shifter_Barrel_Simple.vhdl diff --git a/tb/arith/shifter_barrel/arith_shifter_barrel_Simple.vhdl b/tb/arith/Shifter_Barrel/arith_Shifter_Barrel_Simple.vhdl similarity index 90% rename from tb/arith/shifter_barrel/arith_shifter_barrel_Simple.vhdl rename to tb/arith/Shifter_Barrel/arith_Shifter_Barrel_Simple.vhdl index 76e4ad16e..311edd58b 100644 --- a/tb/arith/shifter_barrel/arith_shifter_barrel_Simple.vhdl +++ b/tb/arith/Shifter_Barrel/arith_Shifter_Barrel_Simple.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_shifter_barrel_TestController +-- Entity: arith_Shifter_Barrel_TestController -- -- Description: -- ------------------------------------- --- Simple test for arith_shifter_barrel component +-- Simple test for arith_Shifter_Barrel component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,7 +34,7 @@ context osvvm.OsvvmContext; library PoC; use PoC.utils.all; -architecture Simple of arith_shifter_barrel_TestController is +architecture Simple of arith_Shifter_Barrel_TestController is signal TestDone : integer_barrier := 1; constant TCID : AlertLogIDType := NewID("TestCtrl"); @@ -44,7 +44,7 @@ begin constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); constant TIMEOUT : time := 10 ms; begin - SetTestName("arith_shifter_barrel_Simple"); + SetTestName("arith_Shifter_Barrel_Simple"); SetLogEnable(PASSED, FALSE); SetLogEnable(INFO, FALSE); @@ -161,10 +161,10 @@ begin end process; end architecture; -configuration arith_shifter_barrel_Simple of arith_shifter_barrel_TestHarness is +configuration arith_Shifter_Barrel_Simple of arith_Shifter_Barrel_TestHarness is for TestHarness - for TestCtrl: arith_shifter_barrel_TestController - use entity work.arith_shifter_barrel_TestController(Simple); + for TestCtrl: arith_Shifter_Barrel_TestController + use entity work.arith_Shifter_Barrel_TestController(Simple); end for; end for; end configuration; diff --git a/tb/arith/shifter_barrel/arith_shifter_barrel_TestController.vhdl b/tb/arith/Shifter_Barrel/arith_Shifter_Barrel_TestController.vhdl similarity index 84% rename from tb/arith/shifter_barrel/arith_shifter_barrel_TestController.vhdl rename to tb/arith/Shifter_Barrel/arith_Shifter_Barrel_TestController.vhdl index cc0e72f80..645308bc8 100644 --- a/tb/arith/shifter_barrel/arith_shifter_barrel_TestController.vhdl +++ b/tb/arith/Shifter_Barrel/arith_Shifter_Barrel_TestController.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_shifter_barrel_TestController +-- Entity: arith_Shifter_Barrel_TestController -- -- Description: -- ------------------------------------- --- Test controller for arith_shifter_barrel component +-- Test controller for arith_Shifter_Barrel component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,7 +31,7 @@ library osvvm; context osvvm.OsvvmContext; -entity arith_shifter_barrel_TestController is +entity arith_Shifter_Barrel_TestController is port ( Clock : in std_logic; Reset : in std_logic; diff --git a/tb/arith/shifter_barrel/arith_shifter_barrel_TestHarness.vhdl b/tb/arith/Shifter_Barrel/arith_Shifter_Barrel_TestHarness.vhdl similarity index 86% rename from tb/arith/shifter_barrel/arith_shifter_barrel_TestHarness.vhdl rename to tb/arith/Shifter_Barrel/arith_Shifter_Barrel_TestHarness.vhdl index 0bfbb87b2..1726ea454 100644 --- a/tb/arith/shifter_barrel/arith_shifter_barrel_TestHarness.vhdl +++ b/tb/arith/Shifter_Barrel/arith_Shifter_Barrel_TestHarness.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= -- Authors: Gustavo Martin -- --- Entity: arith_shifter_barrel_TestHarness +-- Entity: arith_Shifter_Barrel_TestHarness -- -- Description: -- ------------------------------------- --- Test harness for arith_shifter_barrel component +-- Test harness for arith_Shifter_Barrel component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -35,11 +35,11 @@ library PoC; use PoC.utils.all; -entity arith_shifter_barrel_TestHarness is +entity arith_Shifter_Barrel_TestHarness is end entity; -architecture TestHarness of arith_shifter_barrel_TestHarness is +architecture TestHarness of arith_Shifter_Barrel_TestHarness is constant TPERIOD_CLOCK : time := 10 ns; constant BITS : positive := 8; @@ -55,7 +55,7 @@ architecture TestHarness of arith_shifter_barrel_TestHarness is signal Output : std_logic_vector(BITS - 1 downto 0); - component arith_shifter_barrel_TestController is + component arith_Shifter_Barrel_TestController is port ( Clock : in std_logic; Reset : in std_logic; @@ -82,7 +82,7 @@ begin tpd => 0 ns ); - DUT : entity PoC.arith_shifter_barrel + DUT : entity PoC.arith_Shifter_Barrel generic map ( BITS => BITS ) @@ -95,7 +95,7 @@ begin Output => Output ); - TestCtrl: component arith_shifter_barrel_TestController + TestCtrl: component arith_Shifter_Barrel_TestController port map ( Clock => Clock, Reset => Reset, diff --git a/tb/arith/sqrt/RunAllTests.pro b/tb/arith/SquareRoot/RunAllTests.pro similarity index 82% rename from tb/arith/sqrt/RunAllTests.pro rename to tb/arith/SquareRoot/RunAllTests.pro index ee6091a66..9179e8564 100644 --- a/tb/arith/sqrt/RunAllTests.pro +++ b/tb/arith/SquareRoot/RunAllTests.pro @@ -19,12 +19,12 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.arith.sqrt +TestSuite PoC.arith.SquareRoot -library tb_arith_sqrt +library tb_arith_SquareRoot -analyze arith_sqrt_TestController.vhdl -analyze arith_sqrt_TestHarness.vhdl +analyze arith_SquareRoot_TestController.vhdl +analyze arith_SquareRoot_TestHarness.vhdl # Test Cases -RunTest arith_sqrt_Simple.vhdl +RunTest arith_SquareRoot_Simple.vhdl diff --git a/tb/arith/sqrt/arith_sqrt_Simple.vhdl b/tb/arith/SquareRoot/arith_SquareRoot_Simple.vhdl similarity index 87% rename from tb/arith/sqrt/arith_sqrt_Simple.vhdl rename to tb/arith/SquareRoot/arith_SquareRoot_Simple.vhdl index 770c49599..b10e86d69 100644 --- a/tb/arith/sqrt/arith_sqrt_Simple.vhdl +++ b/tb/arith/SquareRoot/arith_SquareRoot_Simple.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_sqrt_TestController +-- Entity: arith_SquareRoot_TestController -- -- Description: -- ------------------------------------- --- Simple test for arith_sqrt component (Iterative Square Root) +-- Simple test for arith_SquareRoot component (Iterative Square Root) -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,7 +34,7 @@ context osvvm.OsvvmContext; library PoC; use PoC.utils.all; -architecture Simple of arith_sqrt_TestController is +architecture Simple of arith_SquareRoot_TestController is signal TestDone : integer_barrier := 1; constant TCID : AlertLogIDType := NewID("TestCtrl"); @@ -44,7 +44,7 @@ begin constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); constant TIMEOUT : time := 10 ms; begin - SetTestName("arith_sqrt_Simple"); + SetTestName("arith_SquareRoot_Simple"); SetLogEnable(PASSED, FALSE); SetLogEnable(INFO, FALSE); @@ -127,10 +127,10 @@ begin end process; end architecture; -configuration arith_sqrt_Simple of arith_sqrt_TestHarness is +configuration arith_SquareRoot_Simple of arith_SquareRoot_TestHarness is for TestHarness - for TestCtrl: arith_sqrt_TestController - use entity work.arith_sqrt_TestController(Simple); + for TestCtrl: arith_SquareRoot_TestController + use entity work.arith_SquareRoot_TestController(Simple); end for; end for; end configuration; diff --git a/tb/arith/sqrt/arith_sqrt_TestController.vhdl b/tb/arith/SquareRoot/arith_SquareRoot_TestController.vhdl similarity index 83% rename from tb/arith/sqrt/arith_sqrt_TestController.vhdl rename to tb/arith/SquareRoot/arith_SquareRoot_TestController.vhdl index e6ce4d86d..a9c12cea6 100644 --- a/tb/arith/sqrt/arith_sqrt_TestController.vhdl +++ b/tb/arith/SquareRoot/arith_SquareRoot_TestController.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_sqrt_TestController +-- Entity: arith_SquareRoot_TestController -- -- Description: -- ------------------------------------- --- Test controller for arith_sqrt component +-- Test controller for arith_SquareRoot component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,7 +31,7 @@ library osvvm; context osvvm.OsvvmContext; -entity arith_sqrt_TestController is +entity arith_SquareRoot_TestController is port ( Clock : in std_logic; Reset : in std_logic; diff --git a/tb/arith/sqrt/arith_sqrt_TestHarness.vhdl b/tb/arith/SquareRoot/arith_SquareRoot_TestHarness.vhdl similarity index 79% rename from tb/arith/sqrt/arith_sqrt_TestHarness.vhdl rename to tb/arith/SquareRoot/arith_SquareRoot_TestHarness.vhdl index 7c945a465..159a024cb 100644 --- a/tb/arith/sqrt/arith_sqrt_TestHarness.vhdl +++ b/tb/arith/SquareRoot/arith_SquareRoot_TestHarness.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= -- Authors: Gustavo Martin -- --- Entity: arith_sqrt_TestHarness +-- Entity: arith_SquareRoot_TestHarness -- -- Description: -- ------------------------------------- --- Test harness for arith_sqrt component +-- Test harness for arith_SquareRoot component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,11 +34,11 @@ context osvvm.OsvvmContext; library PoC; -entity arith_sqrt_TestHarness is +entity arith_SquareRoot_TestHarness is end entity; -architecture TestHarness of arith_sqrt_TestHarness is +architecture TestHarness of arith_SquareRoot_TestHarness is constant TPERIOD_CLOCK : time := 10 ns; constant N : positive := 8; @@ -52,7 +52,7 @@ architecture TestHarness of arith_sqrt_TestHarness is signal rdy : std_logic; - component arith_sqrt_TestController is + component arith_SquareRoot_TestController is port ( Clock : in std_logic; Reset : in std_logic; @@ -77,20 +77,20 @@ begin tpd => 0 ns ); - DUT : entity PoC.arith_sqrt + DUT : entity PoC.arith_SquareRoot generic map ( - N => N + BITS => N ) port map ( - rst => Reset, - clk => Clock, - arg => arg, - start => start, - sqrt => sqrt, - rdy => rdy + Reset => Reset, + Clock => Clock, + Operand => arg, + Start => start, + Result => sqrt, + Ready => rdy ); - TestCtrl: component arith_sqrt_TestController + TestCtrl: component arith_SquareRoot_TestController port map ( Clock => Clock, Reset => Reset, diff --git a/tb/arith/trng/RunAllTests.pro b/tb/arith/TRNG/RunAllTests.pro similarity index 85% rename from tb/arith/trng/RunAllTests.pro rename to tb/arith/TRNG/RunAllTests.pro index b545ca21d..2d0e0b065 100644 --- a/tb/arith/trng/RunAllTests.pro +++ b/tb/arith/TRNG/RunAllTests.pro @@ -19,12 +19,12 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.arith.trng +TestSuite PoC.arith.TRNG -library tb_arith_trng +library tb_arith_TRNG -analyze arith_trng_TestController.vhdl -analyze arith_trng_TestHarness.vhdl +analyze arith_TRNG_TestController.vhdl +analyze arith_TRNG_TestHarness.vhdl # Test Cases -RunTest arith_trng_Simple.vhdl +RunTest arith_TRNG_Simple.vhdl diff --git a/tb/arith/trng/arith_trng_Simple.vhdl b/tb/arith/TRNG/arith_TRNG_Simple.vhdl similarity index 89% rename from tb/arith/trng/arith_trng_Simple.vhdl rename to tb/arith/TRNG/arith_TRNG_Simple.vhdl index fcefa03af..ae741f3f3 100644 --- a/tb/arith/trng/arith_trng_Simple.vhdl +++ b/tb/arith/TRNG/arith_TRNG_Simple.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_trng_TestController +-- Entity: arith_TRNG_TestController -- -- Description: -- ------------------------------------- --- Simple test for arith_trng component (True Random Number Generator) +-- Simple test for arith_TRNG component (True Random Number Generator) -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,7 +34,7 @@ context osvvm.OsvvmContext; library PoC; use PoC.utils.all; -architecture Simple of arith_trng_TestController is +architecture Simple of arith_TRNG_TestController is signal TestDone : integer_barrier := 1; constant TCID : AlertLogIDType := NewID("TestCtrl"); @@ -44,7 +44,7 @@ begin constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); constant TIMEOUT : time := 10 ms; begin - SetTestName("arith_trng_Simple"); + SetTestName("arith_TRNG_Simple"); SetLogEnable(PASSED, FALSE); SetLogEnable(INFO, FALSE); @@ -127,10 +127,10 @@ begin end process; end architecture; -configuration arith_trng_Simple of arith_trng_TestHarness is +configuration arith_TRNG_Simple of arith_TRNG_TestHarness is for TestHarness - for TestCtrl: arith_trng_TestController - use entity work.arith_trng_TestController(Simple); + for TestCtrl: arith_TRNG_TestController + use entity work.arith_TRNG_TestController(Simple); end for; end for; end configuration; diff --git a/tb/arith/trng/arith_trng_TestController.vhdl b/tb/arith/TRNG/arith_TRNG_TestController.vhdl similarity index 83% rename from tb/arith/trng/arith_trng_TestController.vhdl rename to tb/arith/TRNG/arith_TRNG_TestController.vhdl index a6752ee16..abef3d967 100644 --- a/tb/arith/trng/arith_trng_TestController.vhdl +++ b/tb/arith/TRNG/arith_TRNG_TestController.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_trng_TestController +-- Entity: arith_TRNG_TestController -- -- Description: -- ------------------------------------- --- Test controller for arith_trng component +-- Test controller for arith_TRNG component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,7 +31,7 @@ library osvvm; context osvvm.OsvvmContext; -entity arith_trng_TestController is +entity arith_TRNG_TestController is port ( Clock : in std_logic; Reset : in std_logic; diff --git a/tb/arith/trng/arith_trng_TestHarness.vhdl b/tb/arith/TRNG/arith_TRNG_TestHarness.vhdl similarity index 82% rename from tb/arith/trng/arith_trng_TestHarness.vhdl rename to tb/arith/TRNG/arith_TRNG_TestHarness.vhdl index 5085d77ad..3592baced 100644 --- a/tb/arith/trng/arith_trng_TestHarness.vhdl +++ b/tb/arith/TRNG/arith_TRNG_TestHarness.vhdl @@ -1,11 +1,11 @@ -- ============================================================================= -- Authors: Gustavo Martin -- --- Entity: arith_trng_TestHarness +-- Entity: arith_TRNG_TestHarness -- -- Description: -- ------------------------------------- --- Test harness for arith_trng component +-- Test harness for arith_TRNG component -- -- License: -- ============================================================================= @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -34,11 +34,11 @@ context osvvm.OsvvmContext; library PoC; -entity arith_trng_TestHarness is +entity arith_TRNG_TestHarness is end entity; -architecture TestHarness of arith_trng_TestHarness is +architecture TestHarness of arith_TRNG_TestHarness is constant TPERIOD_CLOCK : time := 10 ns; constant BITS : positive := 8; @@ -49,7 +49,7 @@ architecture TestHarness of arith_trng_TestHarness is signal rnd : std_logic_vector(BITS - 1 downto 0); - component arith_trng_TestController is + component arith_TRNG_TestController is port ( Clock : in std_logic; Reset : in std_logic; @@ -71,16 +71,16 @@ begin tpd => 0 ns ); - DUT : entity PoC.arith_trng + DUT : entity PoC.arith_TRNG generic map ( BITS => BITS ) port map ( - clk => Clock, - rnd => rnd + Clock => Clock, + Value => rnd ); - TestCtrl: component arith_trng_TestController + TestCtrl: component arith_TRNG_TestController port map ( Clock => Clock, Reset => Reset, diff --git a/tb/arith/addw/arith_addw_Simple.vhdl b/tb/arith/addw/arith_addw_Simple.vhdl deleted file mode 100644 index f03a6b482..000000000 --- a/tb/arith/addw/arith_addw_Simple.vhdl +++ /dev/null @@ -1,143 +0,0 @@ --- ============================================================================= --- Authors: Thomas B. Preusser --- Gustavo Martin --- --- Entity: arith_addw_Simple --- --- Description: --- ------------------------------------- --- Simple OSVVM test for arith_addw --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library osvvm; -context osvvm.OsvvmContext; - -library PoC; -use PoC.strings.all; -use PoC.physical.all; -use PoC.arith.all; - -use work.arith_addw_TestController_pkg.all; - -architecture Simple of arith_addw_TestController is - signal TestDone : integer_barrier := 1; - constant TCID : AlertLogIDType := NewID("AddWTest"); - constant TPERIOD_CLOCK : time := 10 ns; - -begin - - ControlProc: process - constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); - constant TIMEOUT : time := 10 ms; - begin - SetTestName("arith_addw_Simple"); - - SetLogEnable(PASSED, FALSE); - SetLogEnable(INFO, FALSE); - SetLogEnable(DEBUG, FALSE); - wait for 0 ns; wait for 0 ns; - - TranscriptOpen; - SetTranscriptMirror(TRUE); - - wait until Reset = '0'; - ClearAlerts; - - WaitForBarrier(TestDone, TIMEOUT); - AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); - AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); - - EndOfTestReports(ReportAll => TRUE); - std.env.stop; - end process; - - CheckerProc: process - constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); - variable ai, bi : integer; - variable expected : natural; - variable actual_sum : unsigned(9 downto 0); - begin - wait until Reset = '0'; - WaitForClock(Clock); - - for i in 0 to 2**9-1 loop - a <= std_logic_vector(to_unsigned(i, 9)); - for j in 0 to 2**9-1 loop - b <= std_logic_vector(to_unsigned(j, 9)); - cin <= '0'; - WaitForClock(Clock); - for arch in tArch loop - for skip in tSkipping loop - -- Test with P_INCLUSIVE = false - expected := (i + j) mod 2**10; - actual_sum := unsigned(cout(arch, skip, false) & s(arch, skip, false)); - AffirmIf(ProcID, expected = to_integer(actual_sum), - "Output Error: " & integer'image(i) & "+" & integer'image(j) & - " arch=" & tArch'image(arch) & " skip=" & tSkipping'image(skip) & " incl=false" - ); - - -- Test with P_INCLUSIVE = true - actual_sum := unsigned(cout(arch, skip, true) & s(arch, skip, true)); - AffirmIf(ProcID, expected = to_integer(actual_sum), - "Output Error: " & integer'image(i) & "+" & integer'image(j) & - " arch=" & tArch'image(arch) & " skip=" & tSkipping'image(skip) & " incl=true" - ); - end loop; - end loop; - - cin <= '1'; - WaitForClock(Clock); - for arch in tArch loop - for skip in tSkipping loop - -- Test with P_INCLUSIVE = false - expected := (i + j + 1) mod 2**10; - actual_sum := unsigned(cout(arch, skip, false) & s(arch, skip, false)); - AffirmIf(ProcID, expected = to_integer(actual_sum), - "Output Error with carry: " & integer'image(i) & "+" & integer'image(j) & "+1" & - " arch=" & tArch'image(arch) & " skip=" & tSkipping'image(skip) & " incl=false" - ); - - -- Test with P_INCLUSIVE = true - actual_sum := unsigned(cout(arch, skip, true) & s(arch, skip, true)); - AffirmIf(ProcID, expected = to_integer(actual_sum), - "Output Error with carry: " & integer'image(i) & "+" & integer'image(j) & "+1" & - " arch=" & tArch'image(arch) & " skip=" & tSkipping'image(skip) & " incl=true" - ); - end loop; - end loop; - - end loop; - end loop; - - WaitForBarrier(TestDone); - wait; - end process; -end architecture; - -configuration arith_addw_Simple of arith_addw_TestHarness is - for TestHarness - for TestCtrl: arith_addw_TestController - use entity work.arith_addw_TestController(Simple); - end for; - end for; -end configuration; diff --git a/tb/arith/addw/arith_addw_TestHarness.vhdl b/tb/arith/addw/arith_addw_TestHarness.vhdl deleted file mode 100644 index 26c4fdd61..000000000 --- a/tb/arith/addw/arith_addw_TestHarness.vhdl +++ /dev/null @@ -1,132 +0,0 @@ --- ============================================================================= --- Authors: Thomas B. Preusser --- Gustavo Martin --- --- Entity: arith_addw_TestHarness --- --- Description: --- ------------------------------------- --- Test harness for arith_addw --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library osvvm; -context osvvm.OsvvmContext; - -library PoC; -use PoC.strings.all; -use PoC.physical.all; -use PoC.arith.all; - -use work.arith_addw_TestController_pkg.all; - -entity arith_addw_TestHarness is -end entity; - -architecture TestHarness of arith_addw_TestHarness is - constant TPERIOD_CLOCK : time := 10 ns; - - signal Clock : std_logic := '1'; - signal Reset : std_logic := '1'; - signal a, b : word := (others => '0'); - signal cin : std_logic := '0'; - signal s : word_vector; - signal cout : carry_vector; - - component arith_addw_TestController is - port ( - Clock : in std_logic; - Reset : in std_logic; - a : out word; - b : out word; - cin : out std_logic; - s : in word_vector; - cout : in carry_vector - ); - end component; - -begin - Osvvm.ClockResetPkg.CreateClock( - Clk => Clock, - Period => TPERIOD_CLOCK - ); - - Osvvm.ClockResetPkg.CreateReset( - Reset => Reset, - ResetActive => '1', - Clk => Clock, - Period => 5*TPERIOD_CLOCK, - tpd => 0 ns - ); - - genArchs: for i in tArch_test generate - genSkips: for j in tSkip_test generate - genIncl_false: if true generate - DUT_false : entity PoC.arith_addw - generic map ( - N => N, - K => K, - ARCH => i, - SKIPPING => j, - P_INCLUSIVE => false - ) - port map ( - a => a, - b => b, - cin => cin, - s => s(i, j, false), - cout => cout(i, j, false) - ); - end generate; - - genIncl_true: if true generate - DUT_true : entity PoC.arith_addw - generic map ( - N => N, - K => K, - ARCH => i, - SKIPPING => j, - P_INCLUSIVE => true - ) - port map ( - a => a, - b => b, - cin => cin, - s => s(i, j, true), - cout => cout(i, j, true) - ); - end generate; - end generate; - end generate; - - TestCtrl: component arith_addw_TestController - port map ( - Clock => Clock, - Reset => Reset, - a => a, - b => b, - cin => cin, - s => s, - cout => cout - ); - -end architecture; diff --git a/tb/arith/cca/arith_cca_Simple.vhdl b/tb/arith/cca/arith_cca_Simple.vhdl index fe332f227..3b12502ec 100644 --- a/tb/arith/cca/arith_cca_Simple.vhdl +++ b/tb/arith/cca/arith_cca_Simple.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_cca_TestController +-- Entity: arith_cca_TestController -- -- Description: -- ------------------------------------- @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/arith/cca/arith_cca_TestController.vhdl b/tb/arith/cca/arith_cca_TestController.vhdl index 701df5b53..7ede65e56 100644 --- a/tb/arith/cca/arith_cca_TestController.vhdl +++ b/tb/arith/cca/arith_cca_TestController.vhdl @@ -1,7 +1,7 @@ -- ============================================================================= --- Authors: Gustavo Martin +-- Authors: Gustavo Martin -- --- Entity: arith_cca_TestController +-- Entity: arith_cca_TestController -- -- Description: -- ------------------------------------- @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/arith/cca/arith_cca_TestHarness.vhdl b/tb/arith/cca/arith_cca_TestHarness.vhdl index 29858c9f2..c11c3b6e5 100644 --- a/tb/arith/cca/arith_cca_TestHarness.vhdl +++ b/tb/arith/cca/arith_cca_TestHarness.vhdl @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -80,7 +80,7 @@ begin DUT : entity PoC.arith_cca generic map ( - N => N, + BITS => N, L => L, X => 0 ) diff --git a/tb/arith/convert_bin2bcd/arith_convert_bin2bcd_Simple.vhdl b/tb/arith/convert_bin2bcd/arith_convert_bin2bcd_Simple.vhdl deleted file mode 100644 index 04cb0ed94..000000000 --- a/tb/arith/convert_bin2bcd/arith_convert_bin2bcd_Simple.vhdl +++ /dev/null @@ -1,166 +0,0 @@ --- ============================================================================= --- Authors: Patrick Lehmann --- Gustavo Martin --- --- Entity: arith_convert_bin2bcd_Simple --- --- Description: --- ------------------------------------- --- Simple OSVVM test for arith_convert_bin2bcd --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library osvvm; -context osvvm.OsvvmContext; - -library PoC; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.strings.all; -use PoC.physical.all; - -architecture Simple of arith_convert_bin2bcd_TestController is - constant TCID : AlertLogIDType := NewID("ConvBin2BCDTest"); - signal TestDone : integer_barrier := 1; - - constant INPUT_1 : integer := 38442113; - constant INPUT_2 : integer := 78734531; - constant INPUT_3 : integer := 14902385; - - function Check_Conv2(INPUT : integer; BITS : positive; DIGITS : positive; BCDDigits : T_BCD_VECTOR; Sign : std_logic) return boolean is - variable nat : natural; - begin - if INPUT >= 2**(BITS-1) then - nat := (-INPUT) mod 2**(BITS-1); - if Sign /= '1' then - return false; - end if; - else - nat := INPUT; - if Sign /= '0' then - return false; - end if; - end if; - - return to_BCD_Vector(nat, DIGITS) = BCDDigits; - end function; - -begin - - ControlProc: process - constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); - constant TIMEOUT : time := 10 ms; - begin - SetTestName("arith_convert_bin2bcd_Simple"); - - SetLogEnable(PASSED, TRUE); - SetLogEnable(INFO, TRUE); - SetLogEnable(DEBUG, FALSE); - wait for 0 ns; wait for 0 ns; - - TranscriptOpen; - SetTranscriptMirror(TRUE); - - wait until Reset = '0'; - ClearAlerts; - - WaitForBarrier(TestDone, TIMEOUT); - AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); - -- AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); - - EndOfTestReports(ReportAll => TRUE); - std.env.stop; - end process; - - TestProc: process - constant ProcID : AlertLogIDType := NewID("TestProc", TCID); - begin - Start <= '0'; - Conv1_Binary <= (others => '0'); - Conv2_Binary <= (others => '0'); - - wait until Reset = '0'; - WaitForClock(Clock, 4); - - -- Test Case 1 - Start <= '1'; - Conv1_Binary <= to_slv(INPUT_1, CONV1_BITS); - Conv2_Binary <= to_slv(INPUT_1, CONV2_BITS); - WaitForClock(Clock); - - Start <= '0'; - WaitForClock(Clock); - - for i in 0 to (CONV1_BITS - 1) loop - WaitForClock(Clock); - end loop; - - AffirmIf(ProcID, to_BCD_Vector(INPUT_1, CONV1_DIGITS) = Conv1_BCDDigits, "Conv1_BCDDigits is wrong for INPUT_1."); - AffirmIf(ProcID, Check_Conv2(INPUT_1, CONV2_BITS, CONV2_DIGITS, Conv2_BCDDigits, Conv2_Sign), "Conv2_BCDDigits is wrong for INPUT_1."); - - -- Test Case 2 - Start <= '1'; - Conv1_Binary <= to_slv(INPUT_2, CONV1_BITS); - Conv2_Binary <= to_slv(INPUT_2, CONV2_BITS); - WaitForClock(Clock); - - Start <= '0'; - WaitForClock(Clock); - - for i in 0 to (CONV1_BITS - 1) loop - WaitForClock(Clock); - end loop; - - AffirmIf(ProcID, to_BCD_Vector(INPUT_2, CONV1_DIGITS) = Conv1_BCDDigits, "Conv1_BCDDigits is wrong for INPUT_2."); - AffirmIf(ProcID, Check_Conv2(INPUT_2, CONV2_BITS, CONV2_DIGITS, Conv2_BCDDigits, Conv2_Sign), "Conv2_BCDDigits is wrong for INPUT_2."); - - -- Test Case 3 - Start <= '1'; - Conv1_Binary <= to_slv(INPUT_3, CONV1_BITS); - Conv2_Binary <= to_slv(INPUT_3, CONV2_BITS); - WaitForClock(Clock); - - Start <= '0'; - WaitForClock(Clock); - - for i in 0 to (CONV1_BITS - 1) loop - WaitForClock(Clock); - end loop; - - AffirmIf(ProcID, to_BCD_Vector(INPUT_3, CONV1_DIGITS) = Conv1_BCDDigits, "Conv1_BCDDigits is wrong for INPUT_3."); - AffirmIf(ProcID, Check_Conv2(INPUT_3, CONV2_BITS, CONV2_DIGITS, Conv2_BCDDigits, Conv2_Sign), "Conv2_BCDDigits is wrong for INPUT_3."); - - WaitForBarrier(TestDone); - wait; - end process; - -end architecture; - -configuration arith_convert_bin2bcd_Simple of arith_convert_bin2bcd_TestHarness is - for TestHarness - for TestCtrl: arith_convert_bin2bcd_TestController - use entity work.arith_convert_bin2bcd_TestController(Simple); - end for; - end for; -end configuration; diff --git a/tb/arith/convert_bin2bcd/arith_convert_bin2bcd_TestHarness.vhdl b/tb/arith/convert_bin2bcd/arith_convert_bin2bcd_TestHarness.vhdl deleted file mode 100644 index 883ee3924..000000000 --- a/tb/arith/convert_bin2bcd/arith_convert_bin2bcd_TestHarness.vhdl +++ /dev/null @@ -1,157 +0,0 @@ --- ============================================================================= --- Authors: Patrick Lehmann --- Gustavo Martin --- --- Entity: arith_convert_bin2bcd_TestHarness --- --- Description: --- ------------------------------------- --- Test harness for arith_convert_bin2bcd --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library osvvm; -context osvvm.OsvvmContext; - -library PoC; -use PoC.utils.all; -use PoC.strings.all; -use PoC.physical.all; - -entity arith_convert_bin2bcd_TestHarness is -end entity; - -architecture TestHarness of arith_convert_bin2bcd_TestHarness is - constant TPERIOD_CLOCK : time := 10 ns; -- 100 MHz - - constant CONV1_BITS : positive := 30; - constant CONV1_DIGITS : positive := 8; - constant CONV2_BITS : positive := 27; - constant CONV2_DIGITS : positive := 8; - - signal Clock : std_logic := '1'; - signal Reset : std_logic := '1'; - - signal Start : std_logic; - - signal Conv1_Binary : std_logic_vector(CONV1_BITS - 1 downto 0); - signal Conv1_BCDDigits : T_BCD_VECTOR(CONV1_DIGITS - 1 downto 0); - signal Conv1_Sign : std_logic; - - signal Conv2_Binary : std_logic_vector(CONV2_BITS - 1 downto 0); - signal Conv2_BCDDigits : T_BCD_VECTOR(CONV2_DIGITS - 1 downto 0); - signal Conv2_Sign : std_logic; - - component arith_convert_bin2bcd_TestController is - generic ( - CONV1_BITS : positive; - CONV1_DIGITS : positive; - CONV2_BITS : positive; - CONV2_DIGITS : positive - ); - port ( - Clock : in std_logic; - Reset : in std_logic; - - Start : out std_logic; - - Conv1_Binary : out std_logic_vector(CONV1_BITS - 1 downto 0); - Conv1_BCDDigits : in T_BCD_VECTOR(CONV1_DIGITS - 1 downto 0); - Conv1_Sign : in std_logic; - - Conv2_Binary : out std_logic_vector(CONV2_BITS - 1 downto 0); - Conv2_BCDDigits : in T_BCD_VECTOR(CONV2_DIGITS - 1 downto 0); - Conv2_Sign : in std_logic - ); - end component; - -begin - - Osvvm.ClockResetPkg.CreateClock( - Clk => Clock, - Period => TPERIOD_CLOCK - ); - - Osvvm.ClockResetPkg.CreateReset( - Reset => Reset, - ResetActive => '1', - Clk => Clock, - Period => 5 * TPERIOD_CLOCK, - tpd => 0 ns - ); - - conv1 : entity PoC.arith_convert_bin2bcd - generic map ( - BITS => CONV1_BITS, - DIGITS => CONV1_DIGITS, - RADIX => 8 - ) - port map ( - Clock => Clock, - Reset => Reset, - Start => Start, - Busy => open, - Binary => Conv1_Binary, - IsSigned => '0', - BCDDigits => Conv1_BCDDigits, - Sign => Conv1_Sign - ); - - conv2 : entity PoC.arith_convert_bin2bcd - generic map ( - BITS => CONV2_BITS, - DIGITS => CONV2_DIGITS, - RADIX => 2 - ) - port map ( - Clock => Clock, - Reset => Reset, - Start => Start, - Busy => open, - Binary => Conv2_Binary, - IsSigned => '1', - BCDDigits => Conv2_BCDDigits, - Sign => Conv2_Sign - ); - - TestCtrl: component arith_convert_bin2bcd_TestController - generic map ( - CONV1_BITS => CONV1_BITS, - CONV1_DIGITS => CONV1_DIGITS, - CONV2_BITS => CONV2_BITS, - CONV2_DIGITS => CONV2_DIGITS - ) - port map ( - Clock => Clock, - Reset => Reset, - Start => Start, - Conv1_Binary => Conv1_Binary, - Conv1_BCDDigits => Conv1_BCDDigits, - Conv1_Sign => Conv1_Sign, - Conv2_Binary => Conv2_Binary, - Conv2_BCDDigits => Conv2_BCDDigits, - Conv2_Sign => Conv2_Sign - ); - -end architecture; diff --git a/tb/arith/counter_bcd/arith_counter_bcd_Simple.vhdl b/tb/arith/counter_bcd/arith_counter_bcd_Simple.vhdl deleted file mode 100644 index 91cfe01a2..000000000 --- a/tb/arith/counter_bcd/arith_counter_bcd_Simple.vhdl +++ /dev/null @@ -1,137 +0,0 @@ --- ============================================================================= --- Authors: Martin Zabel --- Thomas B. Preusser --- Gustavo Martin --- --- Entity: arith_counter_bcd_Simple --- --- Description: --- ------------------------------------- --- Simple OSVVM test for arith_counter_bcd --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library osvvm; -context osvvm.OsvvmContext; - -library PoC; -use PoC.utils.all; -use PoC.strings.all; -use PoC.physical.all; - -architecture Simple of arith_counter_bcd_TestController is - constant TCID : AlertLogIDType := NewID("CntBCDTest"); - signal TestDone : integer_barrier := 1; - - signal Expected : T_BCD_VECTOR(DIGITS - 1 downto 0); -begin - - ControlProc: process - constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); - constant TIMEOUT : time := 10 ms; - begin - SetTestName("arith_counter_bcd_Simple"); - - SetLogEnable(PASSED, FALSE); - SetLogEnable(INFO, FALSE); - SetLogEnable(DEBUG, FALSE); - wait for 0 ns; wait for 0 ns; - - TranscriptOpen; - SetTranscriptMirror(TRUE); - - wait until Reset = '0'; - ClearAlerts; - - WaitForBarrier(TestDone, TIMEOUT); - AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); - AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); - - EndOfTestReports(ReportAll => TRUE); - std.env.stop; - end process; - - CheckerProc: process - constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); - variable Expected : T_BCD_VECTOR(DIGITS - 1 downto 0); - begin - Reset_aux <= '0'; - inc <= '0'; - wait until Reset = '0'; - - WaitForClock(Clock); - Expected := to_BCD_Vector(0, DIGITS); - AffirmIf(ProcID, (Value = Expected), "Wrong initial state. Value=" & to_string(Value)); - - Reset_aux <= '1'; - inc <= '0'; - WaitForClock(Clock); - AffirmIf(ProcID, (Value = Expected), "Wrong initial state. Value=" & to_string(Value)); - - Reset_aux <= '1'; - inc <= '1'; - WaitForClock(Clock); - AffirmIf(ProcID, (Value = Expected), "Wrong initial state. Value=" & to_string(Value)); - Reset_aux <= '0'; - inc <= '0'; - - WaitForClock(Clock); - for i in 1 to 10**DIGITS - 1 loop - Expected := to_BCD_Vector(i, DIGITS); - wait until falling_edge(Clock); - inc <= '1'; - WaitForClock(Clock); - wait until falling_edge(Clock); - inc <= '0'; - WaitForClock(Clock); - AffirmIf(ProcID, (Value = Expected), "Should be incremented to state " & to_string(Expected) & " Value=" & to_string(Value)); - wait until falling_edge(Clock); - inc <= '0'; - WaitForClock(Clock); - AffirmIf(ProcID, (Value = Expected), "Should keep the state " & to_string(Expected) & " Value=" & to_string(Value)); - end loop; - wait until falling_edge(Clock); - inc <= '1'; - WaitForClock(Clock, 2); - AffirmIf(ProcID, Value = (DIGITS - 1 downto 0 => x"0"), "Should be wrapped to 0000." & " Value=" & to_string(Value)); - - inc <= '1'; - WaitForClock(Clock, 5); - - Reset_aux <= '1'; - inc <= '0'; - WaitForClock(Clock, 2); - AffirmIf(ProcID, Value = (DIGITS - 1 downto 0 => x"0"), "Should be resetted again."); - - -- Finalize - WaitForBarrier(TestDone); - wait; - end process; -end architecture; - -configuration arith_counter_bcd_Simple of arith_counter_bcd_TestHarness is - for TestHarness - for TestCtrl: arith_counter_bcd_TestController - use entity work.arith_counter_bcd_TestController(Simple); - end for; - end for; -end configuration; diff --git a/tb/arith/counter_bcd/arith_counter_bcd_TestHarness.vhdl b/tb/arith/counter_bcd/arith_counter_bcd_TestHarness.vhdl deleted file mode 100644 index 254b0f0a7..000000000 --- a/tb/arith/counter_bcd/arith_counter_bcd_TestHarness.vhdl +++ /dev/null @@ -1,105 +0,0 @@ --- ============================================================================= --- Authors: Martin Zabel --- Thomas B. Preusser --- Gustavo Martin --- --- Entity: arith_counter_bcd_TestHarness --- --- Description: --- ------------------------------------- --- Test harness for arith_counter_bcd --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library osvvm; -context osvvm.OsvvmContext; - -library PoC; -use PoC.utils.all; -use PoC.strings.all; -use PoC.physical.all; - -entity arith_counter_bcd_TestHarness is -end entity; - -architecture TestHarness of arith_counter_bcd_TestHarness is - constant TPERIOD_CLOCK : time := 10 ns; - constant CLOCK_FREQ : FREQ := 100 MHz; - constant DIGITS : positive := 3; - - signal Clock : std_logic := '1'; - signal Reset : std_logic := '1'; - signal Reset_aux : std_logic := '0'; - signal inc : std_logic := '0'; - signal Value : T_BCD_VECTOR(DIGITS - 1 downto 0); - - component arith_counter_bcd_TestController is - generic ( - DIGITS : positive := 3 - ); - port ( - Clock : in std_logic; - Reset : in std_logic; - Reset_aux : out std_logic; - inc : out std_logic; - Value : in T_BCD_VECTOR(DIGITS - 1 downto 0) - ); - end component; - -begin - - Osvvm.ClockResetPkg.CreateClock( - Clk => Clock, - Period => TPERIOD_CLOCK - ); - - Osvvm.ClockResetPkg.CreateReset( - Reset => Reset, - ResetActive => '1', - Clk => Clock, - Period => 5 * TPERIOD_CLOCK, - tpd => 0 ns - ); - - UUT: entity PoC.arith_counter_bcd - generic map ( - DIGITS => DIGITS - ) - port map ( - clk => Clock, - rst => Reset or Reset_aux, - inc => inc, - val => Value - ); - - TestCtrl: component arith_counter_bcd_TestController - generic map ( - DIGITS => DIGITS - ) - port map ( - Clock => Clock, - Reset => Reset, - Reset_aux => Reset_aux, - inc => inc, - Value => Value - ); -end architecture; diff --git a/tb/arith/div/arith_div_Simple.vhdl b/tb/arith/div/arith_div_Simple.vhdl deleted file mode 100644 index bf17a1471..000000000 --- a/tb/arith/div/arith_div_Simple.vhdl +++ /dev/null @@ -1,172 +0,0 @@ --- ============================================================================= --- Authors: Thomas B. Preusser --- Gustavo Martin --- --- Entity: arith_div_Simple --- --- Description: --- ------------------------------------- --- Simple test for arith_div --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library PoC; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.strings.all; - -library osvvm; -context osvvm.OsvvmContext; - -architecture Simple of arith_div_TestController is - signal TestDone : integer_barrier := 1; - constant TCID : AlertLogIDType := NewID("AddWTest"); - constant TPERIOD_CLOCK : time := 10 ns; -begin - - ------------------------------------------------------------ - -- ControlProc - -- Set up AlertLog and wait for end of test - ------------------------------------------------------------ - ControlProc : process - constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); - constant TIMEOUT : time := 10 ms; - begin - -- Initialization of AlertLog - SetTestName("arith_div_Simple"); - SetLogEnable(PASSED, FALSE); - SetLogEnable(INFO, FALSE); - SetLogEnable(DEBUG, FALSE); - - TranscriptOpen; - SetTranscriptMirror(TRUE); - - wait until Reset = '0'; - ClearAlerts; - - WaitForBarrier(TestDone, TIMEOUT); - AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); - AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); - - EndOfTestReports(ReportAll => TRUE); - std.env.stop; - end process; - - ------------------------------------------------------------ - -- TestProc - -- Generate stimuli and check results - ------------------------------------------------------------ - TestProc : process - variable Random : RandomPType; - - procedure test(aval, dval : in integer) is - variable QQ : T_SLVV(Z'range)(A'range); - variable RR : T_SLVV(Z'range)(D'range); - variable ZZ : std_logic_vector(Z'range); - - type boolean_vector is array(positive range<>) of boolean; - variable done : boolean_vector(Ready'range); - variable all_done : boolean; - begin - -- Start - WaitForClock(Clock, 5); - Start <= '1'; - A <= std_logic_vector(to_unsigned(aval, A'length)); - D <= std_logic_vector(to_unsigned(dval, D'length)); - WaitForClock(Clock); - wait for 1 ns; - Start <= '0'; - A <= (others => '-'); - D <= (others => '-'); - done := (others => false); - - loop - all_done := true; - for i in done'range loop - if Ready(i) = '1' and not done(i) then - QQ(i) := Q(i); - RR(i) := R(i); - ZZ(i) := Z(i); - done(i) := true; - end if; - if not done(i) then - all_done := false; - end if; - end loop; - exit when all_done; - WaitForClock(Clock); - wait for 1 ns; - end loop; - - for i in done'range loop - if dval = 0 then - AffirmIf(ZZ(i) = '1', "INST=" & integer'image(i) & " Div by zero check failed: " & integer'image(aval) & "/" & integer'image(dval)); - else - AffirmIf(ZZ(i) = '0', "INST=" & integer'image(i) & " Zero flag check failed: " & integer'image(aval) & "/" & integer'image(dval)); - AffirmIf(to_integer(unsigned(QQ(i)))*dval + to_integer(unsigned(RR(i))) = aval, - "INST=" & integer'image(i) & " Result check failed: " & integer'image(aval) & "/" & integer'image(dval) & - " /= " & integer'image(to_integer(unsigned(QQ(i)))) & " R " & integer'image(to_integer(unsigned(RR(i))))); - end if; - end loop; - end procedure; - - begin - Start <= '0'; - A <= (others => '-'); - D <= (others => '-'); - - -- Initialize Random - Random.InitSeed(Random'instance_name); - - -- Reset - wait until Reset = '0'; - - -- Boundary Conditions - test(0, 0); - test(0, 2**D'length - 1); - test(0, 1); - test(1, 0); - test(2, 0); - test(2**A'length - 1, 0); - test(2**A'length - 1, 2**D'length - 1); - - -- Run Random Tests - for i in 0 to 1023 loop - test(Random.Uniform(0, 2**A'length - 1), Random.Uniform(0, 2**D'length - 1)); - end loop; - - -- End of Test - WaitForBarrier(TestDone); - wait; - end process; - -end architecture; - -configuration arith_div_Simple of arith_div_TestHarness is - for tb - for TestCtrl: arith_div_TestController - use entity work.arith_div_TestController(Simple); - end for; - end for; -end configuration; diff --git a/tb/arith/div/arith_div_TestHarness.vhdl b/tb/arith/div/arith_div_TestHarness.vhdl deleted file mode 100644 index 54c05da62..000000000 --- a/tb/arith/div/arith_div_TestHarness.vhdl +++ /dev/null @@ -1,149 +0,0 @@ --- ============================================================================= --- Authors: Thomas B. Preusser --- Gustavo Martin --- --- Entity: arith_div_TestHarness --- --- Description: --- ------------------------------------- --- Test harness for arith_div --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library PoC; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.strings.all; -use PoC.physical.all; - -library osvvm; -context osvvm.OsvvmContext; - -entity arith_div_TestHarness is -end entity; - -architecture tb of arith_div_TestHarness is - constant CLOCK_PERIOD : time := 10 ns; - - constant A_BITS : positive := 13; - constant D_BITS : positive := 4; - constant MAX_POW : positive := 3; - - signal Clock : std_logic; - signal Reset : std_logic; - - signal Start : std_logic; - signal Ready : std_logic_vector(1 to 2*MAX_POW); - signal A : std_logic_vector(A_BITS-1 downto 0); - signal D : std_logic_vector(D_BITS-1 downto 0); - signal Q : T_SLVV(1 to 2*MAX_POW)(A_BITS-1 downto 0); - signal R : T_SLVV(1 to 2*MAX_POW)(D_BITS-1 downto 0); - signal Z : std_logic_vector(1 to 2*MAX_POW); - - component arith_div_TestController is - port ( - Clock : in std_logic; - Reset : in std_logic; - Start : out std_logic; - Ready : in std_logic_vector; - A : out std_logic_vector; - D : out std_logic_vector; - Q : in T_SLVV; - R : in T_SLVV; - Z : in std_logic_vector - ); - end component; - -begin - - -- Clock Generation - Osvvm.ClockResetPkg.CreateClock( - Clk => Clock, - Period => CLOCK_PERIOD - ); - - -- Reset Generation - Osvvm.ClockResetPkg.CreateReset( - Reset => Reset, - ResetActive => '1', - Clk => Clock, - Period => 10 * CLOCK_PERIOD, - tpd => 0 ns - ); - - -- Test Controller - TestCtrl : arith_div_TestController - port map ( - Clock => Clock, - Reset => Reset, - Start => Start, - Ready => Ready, - A => A, - D => D, - Q => Q, - R => R, - Z => Z - ); - - -- DUTs - genDUTs : for i in 1 to MAX_POW generate - DUT_SEQU : entity PoC.arith_div - generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, - RAPOW => i - ) - port map ( - clk => Clock, - rst => Reset, - start => Start, - ready => Ready(i), - A => A, - D => D, - Q => Q(i), - R => R(i), - Z => Z(i) - ); - - DUT_PIPE : entity PoC.arith_div - generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, - RAPOW => i, - PIPELINED => true - ) - port map ( - clk => Clock, - rst => Reset, - start => Start, - ready => Ready(MAX_POW+i), - A => A, - D => D, - Q => Q(MAX_POW+i), - R => R(MAX_POW+i), - Z => Z(MAX_POW+i) - ); - end generate; - -end architecture; diff --git a/tb/arith/firstone/arith_firstone_Simple.vhdl b/tb/arith/firstone/arith_firstone_Simple.vhdl deleted file mode 100644 index 46de6e78c..000000000 --- a/tb/arith/firstone/arith_firstone_Simple.vhdl +++ /dev/null @@ -1,152 +0,0 @@ --- ============================================================================= --- Authors: Thomas B. Preusser --- Gustavo Martin --- --- Entity: arith_firstone_Simple --- --- Description: --- ------------------------------------- --- Simple OSVVM test for arith_firstone --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library osvvm; -context osvvm.OsvvmContext; - -library PoC; -use PoC.utils.all; - -architecture Simple of arith_firstone_TestController is - constant TCID : AlertLogIDType := NewID("FirstOneTest"); - signal TestDone : integer_barrier := 1; -begin - - ControlProc: process - constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); - constant TIMEOUT : time := 10 ms; - begin - SetTestName("arith_firstone_Simple"); - - SetLogEnable(PASSED, FALSE); - SetLogEnable(INFO, FALSE); - SetLogEnable(DEBUG, FALSE); - wait for 0 ns; wait for 0 ns; - - TranscriptOpen; - SetTranscriptMirror(TRUE); - - wait until Reset = '0'; - ClearAlerts; - - WaitForBarrier(TestDone, TIMEOUT); - AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); - AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); - - EndOfTestReports(ReportAll => TRUE); - std.env.stop; - end process; - - CheckerProc: process - constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); - begin - tin <= '0'; - rqst <= (others => '0'); - wait until Reset = '0'; - - -- Exhaustive Testing for all possible request patterns - for i in natural range 0 to 2**N-1 loop - rqst <= std_logic_vector(to_unsigned(i, N)); - - -- Test with tin = '0': no token input, should have no grants - tin <= '0'; - WaitForClock(Clock); - AffirmIf(ProcID, - grnt = (grnt'range => '0') and tout = '0', - "Unexpected token output with tin='0' in testcase #" & integer'image(i)); - - -- Test with tin = '1': token input, check grant pattern - tin <= '1'; - wait until falling_edge(Clock); - - -- Check each bit of grant output - for j in 0 to N-1 loop - -- Grant(j) should be '1' if and only if: - -- - rqst(j) = '1' (bit j is requesting) - -- - AND all lower bits rqst(j-1 downto 0) are '0' (no lower priority request) - if j = 0 then - -- For bit 0, only check if rqst(0) is '1' - AffirmIf(ProcID, - (grnt(j) = '1') = (rqst(j) = '1'), - "Wrong grant for bit " & integer'image(j) & - " in testcase #" & integer'image(i) & - " (rqst=" & to_hxstring(rqst) & - ", grnt=" & to_hxstring(grnt) & ")"); - else - -- For higher bits, check if this is the first '1' from the right - AffirmIf(ProcID, - (grnt(j) = '1') = ((rqst(j) = '1') and (rqst(j-1 downto 0) = (j-1 downto 0 => '0'))), - "Wrong grant for bit " & integer'image(j) & - " in testcase #" & integer'image(i) & - " (rqst=" & to_hxstring(rqst) & - ", grnt=" & to_hxstring(grnt) & ")"); - end if; - end loop; - - -- Verify that tout is '1' only if rqst is all zeros - AffirmIf(ProcID, - (tout = '1') = (rqst = (N-1 downto 0 => '0')), - "Wrong tout in testcase #" & integer'image(i) & - " (rqst=" & to_hxstring(rqst) & - ", tout=" & std_logic'image(tout) & ")"); - - -- Verify binary output bin points to the granted bit - if rqst /= (N-1 downto 0 => '0') then - for k in 0 to N-1 loop - if grnt(k) = '1' then - AffirmIf(ProcID, - to_integer(unsigned(bin)) = k, - "Wrong bin output in testcase #" & integer'image(i) & - " (expected=" & integer'image(k) & - ", got=" & integer'image(to_integer(unsigned(bin))) & ")"); - end if; - end loop; - end if; - - end loop; - - Log(ProcID, "Exhaustively tested all " & integer'image(2**N) & " request patterns", INFO); - - -- Finalize - WaitForBarrier(TestDone); - wait; - end process; -end architecture; - -configuration arith_firstone_Simple of arith_firstone_TestHarness is - for TestHarness - for TestCtrl: arith_firstone_TestController - use entity work.arith_firstone_TestController(Simple); - end for; - end for; -end configuration; diff --git a/tb/arith/firstone/arith_firstone_TestHarness.vhdl b/tb/arith/firstone/arith_firstone_TestHarness.vhdl deleted file mode 100644 index 8b1806a8e..000000000 --- a/tb/arith/firstone/arith_firstone_TestHarness.vhdl +++ /dev/null @@ -1,109 +0,0 @@ --- ============================================================================= --- Authors: Gustavo Martin --- --- Entity: arith_firstone_TestHarness --- --- Description: --- ------------------------------------- --- Test harness for arith_firstone --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library osvvm; -context osvvm.OsvvmContext; - -library PoC; -use PoC.utils.all; -use PoC.physical.all; - -entity arith_firstone_TestHarness is -end entity; - -architecture TestHarness of arith_firstone_TestHarness is - constant TPERIOD_CLOCK : time := 10 ns; - constant N : positive := 8; - - signal Clock : std_logic := '1'; - signal Reset : std_logic := '1'; - - signal tin : std_logic := '1'; - signal rqst : std_logic_vector(N-1 downto 0) := (others => '0'); - signal grnt : std_logic_vector(N-1 downto 0); - signal tout : std_logic; - signal bin : std_logic_vector(log2ceil(N)-1 downto 0); - - component arith_firstone_TestController is - generic ( - N : positive := 8 - ); - port ( - Clock : in std_logic; - Reset : in std_logic; - tin : out std_logic; - rqst : out std_logic_vector(N-1 downto 0); - grnt : in std_logic_vector(N-1 downto 0); - tout : in std_logic; - bin : in std_logic_vector(log2ceil(N)-1 downto 0) - ); - end component; - -begin - - Osvvm.ClockResetPkg.CreateClock( - Clk => Clock, - Period => TPERIOD_CLOCK - ); - - Osvvm.ClockResetPkg.CreateReset( - Reset => Reset, - ResetActive => '1', - Clk => Clock, - Period => 10 * TPERIOD_CLOCK, - tpd => 0 ns - ); - - UUT: entity PoC.arith_firstone - generic map ( - N => N - ) - port map ( - tin => tin, - rqst => rqst, - grnt => grnt, - tout => tout, - bin => bin - ); - - TestCtrl: component arith_firstone_TestController - generic map ( - N => N - ) - port map ( - Clock => Clock, - Reset => Reset, - tin => tin, - rqst => rqst, - grnt => grnt, - tout => tout, - bin => bin - ); -end architecture; diff --git a/tb/arith/prefix_and/arith_prefix_and_Exhaustive.vhdl b/tb/arith/prefix_and/arith_prefix_and_Exhaustive.vhdl deleted file mode 100644 index db7499c04..000000000 --- a/tb/arith/prefix_and/arith_prefix_and_Exhaustive.vhdl +++ /dev/null @@ -1,120 +0,0 @@ --- ============================================================================= --- Authors: Thomas B. Preusser --- Patrick Lehmann --- Gustavo Martin --- --- Entity: arith_prefix_and_TestController --- --- Description: --- ------------------------------------- --- Exhaustive test for arith_prefix_and using OSVVM. --- Tests all possible input patterns (2**N combinations). --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library osvvm; -context osvvm.OsvvmContext; - -library PoC; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.strings.all; - -architecture Exhaustive of arith_prefix_and_TestController is - signal TestDone : integer_barrier := 1; - - constant TCID : AlertLogIDType := NewID("TestCtrl"); - -begin - ControlProc: process - constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); - constant TIMEOUT : time := 100 ms; - begin - SetTestName("arith_prefix_and_Exhaustive"); - - SetLogEnable(PASSED, FALSE); - SetLogEnable(INFO, FALSE); - SetLogEnable(DEBUG, FALSE); - wait for 0 ns; wait for 0 ns; - - TranscriptOpen; - SetTranscriptMirror(TRUE); - - wait until Reset = '0'; - ClearAlerts; - - WaitForBarrier(TestDone, TIMEOUT); - AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); - AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); - - EndOfTestReports(ReportAll => TRUE); - std.env.stop; - end process; - - CheckerProc: process - constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); - variable test_pattern : unsigned(x'range); - variable test_pattern_slv : std_logic_vector(x'range); - - begin - wait until Reset = '0'; - WaitForClock(Clock); - - x(x'range) <= (others => '0'); - WaitForClock(Clock); - - -- Exhaustive Testing: test all possible input patterns - for i in 0 to (2**x'length) - 1 loop - test_pattern := to_unsigned(i, x'length); - test_pattern_slv := std_logic_vector(test_pattern); - x <= test_pattern_slv; - WaitForClock(Clock); - - -- Check each bit position j - for j in 0 to x'length - 1 loop - -- y(j) should be '1' if and only if x(j downto 0) are all '1' - -- This is equivalent to: x(j downto 0) = (j downto 0 => '1') - AffirmIf(ProcID, - (y(j) = '1') = (test_pattern_slv(j downto 0) = (j downto 0 => '1')), - "Pattern " & PoC.strings.to_string(i) & " / bit " & PoC.strings.to_string(j) & - ": x = 0x" & to_hstring(test_pattern_slv) & - ", y = 0x" & to_hstring(y) & - ", y(" & PoC.strings.to_string(j) & ") = " & to_string(y(j)) - ); - end loop; - end loop; - - x(x'range) <= (others => '0'); - WaitForClock(Clock); - - WaitForBarrier(TestDone); - wait; - end process; -end architecture; - -configuration arith_prefix_and_Exhaustive of arith_prefix_and_TestHarness is - for TestHarness - for TestCtrl: arith_prefix_and_TestController - use entity work.arith_prefix_and_TestController(Exhaustive); - end for; - end for; -end configuration; diff --git a/tb/arith/prefix_and/arith_prefix_and_Simple.vhdl b/tb/arith/prefix_and/arith_prefix_and_Simple.vhdl deleted file mode 100644 index a71a66be5..000000000 --- a/tb/arith/prefix_and/arith_prefix_and_Simple.vhdl +++ /dev/null @@ -1,234 +0,0 @@ --- ============================================================================= --- Authors: Thomas B. Preusser --- Patrick Lehmann --- Gustavo Martin --- --- Entity: arith_prefix_and_TestController --- --- Description: --- ------------------------------------- --- .. TODO:: No documentation available. --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library osvvm; -context osvvm.OsvvmContext; - -library PoC; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.strings.all; - -architecture Simple of arith_prefix_and_TestController is - signal TestDone : integer_barrier := 1; - - constant TCID : AlertLogIDType := NewID("TestCtrl"); - -begin - ControlProc: process - constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); - constant TIMEOUT : time := 10 ms; - begin - SetTestName("arith_prefix_and_Simple"); - - SetLogEnable(PASSED, FALSE); - SetLogEnable(INFO, FALSE); - SetLogEnable(DEBUG, FALSE); - wait for 0 ns; wait for 0 ns; - - TranscriptOpen; - SetTranscriptMirror(TRUE); - - wait until Reset = '0'; - ClearAlerts; - - WaitForBarrier(TestDone, TIMEOUT); - AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); - AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); - - EndOfTestReports(ReportAll => TRUE); - std.env.stop; - end process; - - CheckerProc: process - constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); - - -- Helper function to compute expected prefix AND - function compute_prefix_and(x : std_logic_vector) return std_logic_vector is - variable result : std_logic_vector(x'range); - variable all_ones : boolean; - begin - for i in x'range loop - all_ones := true; - for j in x'low to i loop - if x(j) /= '1' then - all_ones := false; - exit; - end if; - end loop; - if all_ones then - result(i) := '1'; - else - result(i) := '0'; - end if; - end loop; - return result; - end function; - - variable expected : std_logic_vector(y'range); - variable test_input : std_logic_vector(y'range); - - begin - wait until Reset = '0'; - WaitForClock(Clock); - - x(x'range) <= (others => '0'); - WaitForClock(Clock); - - -- Test Case 1: All zeros - test_input := (others => '0'); - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_and(test_input); - AffirmIf(ProcID, - y = expected, - "Test all zeros: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - - -- Test Case 2: All ones - test_input := (others => '1'); - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_and(test_input); - AffirmIf(ProcID, - y = expected, - "Test all ones: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - - -- Test Case 3: Alternating pattern 0101... - for i in test_input'range loop - if (i mod 2) = 0 then - test_input(i) := '1'; - else - test_input(i) := '0'; - end if; - end loop; - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_and(test_input); - AffirmIf(ProcID, - y = expected, - "Test alternating 0101: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - - -- Test Case 4: Consecutive ones from LSB - for len in 0 to test_input'length loop - test_input := (others => '0'); - for i in 0 to len-1 loop - test_input(i) := '1'; - end loop; - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_and(test_input); - AffirmIf(ProcID, - y = expected, - "Test " & PoC.strings.to_string(len) & " ones from LSB: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - end loop; - - -- Test Case 5: Single bit set at each position - for pos in test_input'range loop - test_input := (others => '0'); - test_input(pos) := '1'; - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_and(test_input); - AffirmIf(ProcID, - y = expected, - "Test bit " & PoC.strings.to_string(pos) & " set: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - end loop; - - -- Test Case 6: Random patterns (if using 8-bit width) - if y'length = 8 then - -- Test some specific 8-bit patterns - test_input := "10101010"; - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_and(test_input); - AffirmIf(ProcID, - y = expected, - "Test pattern 10101010: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - - test_input := "11110000"; - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_and(test_input); - AffirmIf(ProcID, - y = expected, - "Test pattern 11110000: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - - test_input := "00001111"; - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_and(test_input); - AffirmIf(ProcID, - y = expected, - "Test pattern 00001111: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - - test_input := "11111110"; - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_and(test_input); - AffirmIf(ProcID, - y = expected, - "Test pattern 11111110: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - end if; - - x(x'range) <= (others => '0'); - WaitForClock(Clock); - - WaitForBarrier(TestDone); - wait; - end process; -end architecture; - -configuration arith_prefix_and_Simple of arith_prefix_and_TestHarness is - for TestHarness - for TestCtrl: arith_prefix_and_TestController - use entity work.arith_prefix_and_TestController(Simple); - end for; - end for; -end configuration; diff --git a/tb/arith/prefix_and/arith_prefix_and_TestHarness.vhdl b/tb/arith/prefix_and/arith_prefix_and_TestHarness.vhdl deleted file mode 100644 index 389971f2d..000000000 --- a/tb/arith/prefix_and/arith_prefix_and_TestHarness.vhdl +++ /dev/null @@ -1,94 +0,0 @@ --- ============================================================================= --- Authors: Thomas B. Preusser --- Patrick Lehmann --- Gustavo Martin --- --- Entity: arith_prefix_and_TestHarness --- --- Description: --- ------------------------------------- --- .. TODO:: No documentation available. --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library osvvm; -context osvvm.OsvvmContext; - -library PoC; - - -entity arith_prefix_and_TestHarness is -end entity; - - -architecture TestHarness of arith_prefix_and_TestHarness is - constant TPERIOD_CLOCK : time := 10 ns; - - constant N : positive := 8; - - signal Clock_100 : std_logic := '1'; - signal Reset_100 : std_logic := '1'; - - signal x : std_logic_vector(N - 1 downto 0); - signal y : std_logic_vector(N - 1 downto 0); - - - component arith_prefix_and_TestController is - port ( - Clock : in std_logic; - Reset : in std_logic; - x : out std_logic_vector; - y : in std_logic_vector - ); - end component; - -begin - Osvvm.ClockResetPkg.CreateClock( - Clk => Clock_100, - Period => TPERIOD_CLOCK - ); - - Osvvm.ClockResetPkg.CreateReset( - Reset => Reset_100, - ResetActive => '1', - Clk => Clock_100, - Period => 5 * TPERIOD_CLOCK, - tpd => 0 ns - ); - - DUT : entity PoC.arith_prefix_and - generic map ( - N => N - ) - port map ( - x => x, - y => y - ); - - TestCtrl: component arith_prefix_and_TestController - port map ( - Clock => Clock_100, - Reset => Reset_100, - x => x, - y => y - ); -end architecture; diff --git a/tb/arith/prefix_or/arith_prefix_or_Simple.vhdl b/tb/arith/prefix_or/arith_prefix_or_Simple.vhdl deleted file mode 100644 index 54b022cb7..000000000 --- a/tb/arith/prefix_or/arith_prefix_or_Simple.vhdl +++ /dev/null @@ -1,236 +0,0 @@ --- ============================================================================= --- Authors: Thomas B. Preusser --- Gustavo Martin --- --- Entity: arith_prefix_or_TestController --- --- Description: --- ------------------------------------- --- .. TODO:: No documentation available. --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library osvvm; -context osvvm.OsvvmContext; - -library PoC; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.strings.all; - -architecture Simple of arith_prefix_or_TestController is - signal TestDone : integer_barrier := 1; - - constant TCID : AlertLogIDType := NewID("TestCtrl"); - -begin - ControlProc: process - constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); - constant TIMEOUT : time := 10 ms; - begin - SetTestName("arith_prefix_or_Simple"); - - SetLogEnable(PASSED, FALSE); - SetLogEnable(INFO, FALSE); - SetLogEnable(DEBUG, FALSE); - wait for 0 ns; wait for 0 ns; - - TranscriptOpen; - SetTranscriptMirror(TRUE); - - wait until Reset = '0'; - ClearAlerts; - - WaitForBarrier(TestDone, TIMEOUT); - AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); - AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); - - EndOfTestReports(ReportAll => TRUE); - std.env.stop; - end process; - - CheckerProc: process - constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); - - -- Helper function to compute expected prefix OR - -- y(i) <= '0' when x(i downto 0) = (i downto 0 => '0') else '1' - function compute_prefix_or(x : std_logic_vector) return std_logic_vector is - variable result : std_logic_vector(x'range); - variable all_zeros : boolean; - begin - for i in x'range loop - all_zeros := true; - for j in x'low to i loop - if x(j) /= '0' then - all_zeros := false; - exit; - end if; - end loop; - if all_zeros then - result(i) := '0'; - else - result(i) := '1'; - end if; - end loop; - return result; - end function; - - variable expected : std_logic_vector(y'range); - variable test_input : std_logic_vector(y'range); - - begin - wait until Reset = '0'; - WaitForClock(Clock); - - test_input := (others => '0'); - x <= test_input; - WaitForClock(Clock); - - -- Test Case 1: All zeros - test_input := (others => '0'); - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_or(test_input); - AffirmIf(ProcID, - y = expected, - "Test all zeros: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - - -- Test Case 2: All ones - test_input := (others => '1'); - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_or(test_input); - AffirmIf(ProcID, - y = expected, - "Test all ones: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - - -- Test Case 3: Alternating pattern 0101... - for i in test_input'range loop - if (i mod 2) = 0 then - test_input(i) := '1'; - else - test_input(i) := '0'; - end if; - end loop; - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_or(test_input); - AffirmIf(ProcID, - y = expected, - "Test alternating 0101: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - - -- Test Case 4: Consecutive ones from LSB - for len in 0 to test_input'length loop - test_input := (others => '0'); - for i in 0 to len-1 loop - test_input(i) := '1'; - end loop; - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_or(test_input); - AffirmIf(ProcID, - y = expected, - "Test " & PoC.strings.to_string(len) & " ones from LSB: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - end loop; - - -- Test Case 5: Single bit set at each position - for pos in test_input'range loop - test_input := (others => '0'); - test_input(pos) := '1'; - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_or(test_input); - AffirmIf(ProcID, - y = expected, - "Test bit " & PoC.strings.to_string(pos) & " set: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - end loop; - - -- Test Case 6: Specific patterns (if using 8-bit width) - if y'length = 8 then - -- Test some specific 8-bit patterns - test_input := "10101010"; - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_or(test_input); - AffirmIf(ProcID, - y = expected, - "Test pattern 10101010: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - - test_input := "11110000"; - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_or(test_input); - AffirmIf(ProcID, - y = expected, - "Test pattern 11110000: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - - test_input := "00001111"; - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_or(test_input); - AffirmIf(ProcID, - y = expected, - "Test pattern 00001111: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - - test_input := "00000001"; - x <= test_input; - WaitForClock(Clock); - expected := compute_prefix_or(test_input); - AffirmIf(ProcID, - y = expected, - "Test pattern 00000001: y = 0x" & to_hstring(y), - " Expected = 0x" & to_hstring(expected) - ); - end if; - - test_input := (others => '0'); - x <= test_input; - WaitForClock(Clock); - - WaitForBarrier(TestDone); - wait; - end process; -end architecture; - -configuration arith_prefix_or_Simple of arith_prefix_or_TestHarness is - for TestHarness - for TestCtrl: arith_prefix_or_TestController - use entity work.arith_prefix_or_TestController(Simple); - end for; - end for; -end configuration; diff --git a/tb/arith/scaler/arith_scaler_Simple.vhdl b/tb/arith/scaler/arith_scaler_Simple.vhdl deleted file mode 100644 index 2b7a4d9e7..000000000 --- a/tb/arith/scaler/arith_scaler_Simple.vhdl +++ /dev/null @@ -1,138 +0,0 @@ --- ============================================================================= --- Authors: Thomas B. Preusser --- Gustavo Martin --- --- Entity: arith_scaler_Simple --- --- Description: --- ------------------------------------- --- Simple OSVVM test for arith_scaler --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- Copyright 2007-2016 Technische Universität Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library osvvm; -context osvvm.OsvvmContext; - -library PoC; -use PoC.utils.all; - -architecture Simple of arith_scaler_TestController is - constant TCID : AlertLogIDType := NewID("ScalerTest"); - signal TestDone : integer_barrier := 1; - - -- Test argument values - constant ARGS : T_NATVEC := (0, 1, 2, 3, 4, 31, 32, 33, 63, 64, 65, 95, 96, 97, 127, 128, 129, 196, 254, 255); -begin - - ControlProc: process - constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); - constant TIMEOUT : time := 100 ms; - begin - SetTestName("arith_scaler_Simple"); - - SetLogEnable(PASSED, FALSE); - SetLogEnable(INFO, FALSE); - SetLogEnable(DEBUG, FALSE); - wait for 0 ns; wait for 0 ns; - - TranscriptOpen; - SetTranscriptMirror(TRUE); - - wait until Reset = '0'; - ClearAlerts; - - WaitForBarrier(TestDone, TIMEOUT); - AlertIf(ProcID, now >= TIMEOUT, "Test finished due to timeout"); - AlertIf(ProcID, GetAffirmCount < 1, "Test is not Self-Checking"); - - EndOfTestReports(ReportAll => TRUE); - std.env.stop; - end process; - - CheckerProc: process - constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); - variable expected : natural; - variable test_count : natural := 0; - begin - start <= '0'; - arg <= (others => '0'); - msel <= (others => '0'); - dsel <= (others => '0'); - wait until Reset = '0'; - - WaitForClock(Clock, 5); - - -- Exhaustive testing: all combinations of multipliers, divisors, and arguments - for i in MULS'range loop - for j in DIVS'range loop - for k in ARGS'range loop - WaitForClock(Clock); - -- Set up inputs - arg <= std_logic_vector(to_unsigned(ARGS(k), arg'length)); - msel <= std_logic_vector(to_unsigned(i, msel'length)); - dsel <= std_logic_vector(to_unsigned(j, dsel'length)); - start <= '1'; - WaitForClock(Clock); - - -- Release start and set inputs to don't-care - arg <= (others => '-'); - msel <= (others => '-'); - dsel <= (others => '-'); - start <= '0'; - WaitForClock(Clock); - - -- Wait for completion - wait until rising_edge(Clock) and done = '1'; - - - -- Calculate expected result: (arg * mul + div/2) / div, modulo 2^width - expected := ((ARGS(k) * MULS(i) + DIVS(j)/2) / DIVS(j)) mod 2**res'length; - - AffirmIf(ProcID, - res = std_logic_vector(to_unsigned(expected, res'length)), - "Computation error: " & - integer'image(ARGS(k)) & "*" & integer'image(MULS(i)) & "/" & integer'image(DIVS(j)) & - " -> expected " & integer'image(expected) & - ", got " & integer'image(to_integer(unsigned(res)))); - - test_count := test_count + 1; - end loop; - end loop; - end loop; - - Log(ProcID, "Completed " & integer'image(test_count) & " scaler computations", INFO); - - -- Finalize - WaitForBarrier(TestDone); - wait; - end process; -end architecture; - -configuration arith_scaler_Simple of arith_scaler_TestHarness is - for TestHarness - for TestCtrl: arith_scaler_TestController - use entity work.arith_scaler_TestController(Simple); - end for; - end for; -end configuration; diff --git a/tb/arith/scaler/arith_scaler_TestHarness.vhdl b/tb/arith/scaler/arith_scaler_TestHarness.vhdl deleted file mode 100644 index b99a343c1..000000000 --- a/tb/arith/scaler/arith_scaler_TestHarness.vhdl +++ /dev/null @@ -1,125 +0,0 @@ --- ============================================================================= --- Authors: Thomas B. Preusser --- Gustavo Martin --- --- Entity: arith_scaler_TestHarness --- --- Description: --- ------------------------------------- --- Test harness for arith_scaler --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- Copyright 2007-2016 Technische Universität Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; - -library osvvm; -context osvvm.OsvvmContext; - -library PoC; -use PoC.utils.all; -use PoC.physical.all; - -entity arith_scaler_TestHarness is -end entity; - -architecture TestHarness of arith_scaler_TestHarness is - constant TPERIOD_CLOCK : time := 10 ns; - constant MULS : T_POSVEC := (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); - constant DIVS : T_POSVEC := (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); - constant ARG_WIDTH : positive := 8; - - signal Clock : std_logic := '1'; - signal Reset : std_logic := '1'; - - signal start : std_logic := '0'; - signal arg : std_logic_vector(ARG_WIDTH-1 downto 0) := (others => '0'); - signal msel : std_logic_vector(log2ceil(MULS'length)-1 downto 0) := (others => '0'); - signal dsel : std_logic_vector(log2ceil(DIVS'length)-1 downto 0) := (others => '0'); - signal done : std_logic; - signal res : std_logic_vector(ARG_WIDTH-1 downto 0); - - component arith_scaler_TestController is - generic ( - MULS : T_POSVEC; - DIVS : T_POSVEC; - ARG_WIDTH : positive - ); - port ( - Clock : in std_logic; - Reset : in std_logic; - start : out std_logic; - arg : out std_logic_vector(ARG_WIDTH-1 downto 0); - msel : out std_logic_vector(log2ceil(MULS'length)-1 downto 0); - dsel : out std_logic_vector(log2ceil(DIVS'length)-1 downto 0); - done : in std_logic; - res : in std_logic_vector(ARG_WIDTH-1 downto 0) - ); - end component; - -begin - - Osvvm.ClockResetPkg.CreateClock( - Clk => Clock, - Period => TPERIOD_CLOCK - ); - - Osvvm.ClockResetPkg.CreateReset( - Reset => Reset, - ResetActive => '1', - Clk => Clock, - Period => 5 * TPERIOD_CLOCK, - tpd => 0 ns - ); - - UUT: entity PoC.arith_scaler - generic map ( - MULS => MULS, - DIVS => DIVS - ) - port map ( - clk => Clock, - rst => Reset, - start => start, - arg => arg, - msel => msel, - dsel => dsel, - done => done, - res => res - ); - - TestCtrl: component arith_scaler_TestController - generic map ( - MULS => MULS, - DIVS => DIVS, - ARG_WIDTH => ARG_WIDTH - ) - port map ( - Clock => Clock, - Reset => Reset, - start => start, - arg => arg, - msel => msel, - dsel => dsel, - done => done, - res => res - ); -end architecture; diff --git a/tb/arith/shifter_barrel/RunAllTests.pro b/tb/arith/shifter_barrel/RunAllTests.pro deleted file mode 100644 index fac51600b..000000000 --- a/tb/arith/shifter_barrel/RunAllTests.pro +++ /dev/null @@ -1,30 +0,0 @@ -# ============================================================================= -# Authors: -# Gustavo Martin -# -# License: -# ============================================================================= -# Copyright 2025-2026 The PoC-Library Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================= - -TestSuite PoC.arith.shifter_barrel - -library tb_arith_shifter_barrel - -analyze arith_shifter_barrel_TestController.vhdl -analyze arith_shifter_barrel_TestHarness.vhdl - -# Test Cases -RunTest arith_shifter_barrel_Simple.vhdl diff --git a/tb/bus/RunAllTests.pro b/tb/bus/RunAllTests.pro index 9a22bc232..63a0cc435 100644 --- a/tb/bus/RunAllTests.pro +++ b/tb/bus/RunAllTests.pro @@ -26,4 +26,6 @@ library tb_bus include ./axi4/RunAllTests.pro +include ./axi4stream/RunAllTests.pro +include ./axi4lite/RunAllTests.pro disabled ./stream/RunAllTests.pro diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/AXI4Lite_OCRAM_Adapter_TestController.vhdl b/tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/AXI4Lite_OCRAM_Adapter_TestController.vhdl deleted file mode 100644 index 6e32d907e..000000000 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/AXI4Lite_OCRAM_Adapter_TestController.vhdl +++ /dev/null @@ -1,51 +0,0 @@ --- ============================================================================= --- Authors: --- Iqbal Asif (PLC2 Design GmbH) --- Patrick Lehmann (PLC2 Design GmbH) --- --- License: --- ============================================================================= --- Copyright 2025-2026 The PoC-Library Authors --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library ieee ; - use ieee.std_logic_1164.all ; - use ieee.numeric_std.all ; - use ieee.numeric_std_unsigned.all ; - -library OSVVM ; - context OSVVM.OsvvmContext ; - ---library osvvm_Axi4; --- context osvvm_Axi4.Axi4Context ; - -library osvvm_Axi4; - context osvvm_Axi4.Axi4LiteContext ; - -entity AXI4Lite_OCRAM_Adapter_TestController is - port ( - -- Global Signal Interface - Clock : in std_logic ; - Reset : in std_logic ; - -- Transaction Interfaces - MasterRec : inout AddressBusRecType - ) ; - constant AXI_ADDR_WIDTH : integer := MasterRec.Address'length ; - constant AXI_DATA_WIDTH : integer := MasterRec.DataToModel'length ; - --- Not currently used in the Axi4Lite model - future use for Axi4Lite Burst Emulation modes --- alias WriteBurstFifo is <> ; --- alias ReadBurstFifo is <> ; -end entity; diff --git a/tb/bus/axi4/AXI4Lite/RunAllTests.pro b/tb/bus/axi4/AXI4Lite/RunAllTests.pro deleted file mode 100644 index 1c25ba8f7..000000000 --- a/tb/bus/axi4/AXI4Lite/RunAllTests.pro +++ /dev/null @@ -1,32 +0,0 @@ -# ============================================================================= -# Authors: Iqbal Asif (PLC2 Design GmbH) -# Patrick Lehmann (PLC2 Design GmbH) -# -# License: -# ============================================================================= -# Copyright 2025-2026 The PoC-Library Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================= - -# TestSuite PoC.bus.axi4.axi4Lite -# Deactivated to avoid failure on non-existing testcases - -library tb_axi4Lite - -disabled ./AXI4Lite_Demux/RunAllTests.pro -include ./AXI4Lite_Register/RunAllTests.pro -include ./AXI4Lite_OCRAM_Adapter/RunAllTests.pro -# include ./AXI4Lite_InterruptController/RunAllTests.pro # Currently not working -include ./AXI4Lite_UART/RunAllTests.pro -# include ./AXI4Lite_HighResolutionClock/RunAllTests.pro # Currently not working diff --git a/tb/bus/axi4/DeMux/RunAllTests.pro b/tb/bus/axi4/DeMux/RunAllTests.pro new file mode 100644 index 000000000..dc5c76d38 --- /dev/null +++ b/tb/bus/axi4/DeMux/RunAllTests.pro @@ -0,0 +1,32 @@ +# ============================================================================= +# Authors: +# Iqbal Asif (PLC2 Design GmbH) +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +TestSuite PoC.bus.axi4.DeMux + +library tb_axi4_DeMux + +analyze axi4_DeMux_TestController.vhdl +analyze axi4_DeMux_TestHarness.vhdl + +RunTest TC_SimpleReadWrite.vhdl [generic NUM_TRANSACTIONS 1] +RunTest TC_SimpleReadWrite_delay.vhdl [generic NUM_TRANSACTIONS 1] +RunTest TC_SimpleReadWrite_multiID.vhdl +SkipTest TC_SimpleReadWrite_multiID_randDelay.vhdl diff --git a/tb/bus/axi4/DeMux/TC_SimpleReadWrite.tcl b/tb/bus/axi4/DeMux/TC_SimpleReadWrite.tcl new file mode 100644 index 000000000..cf5c513b7 --- /dev/null +++ b/tb/bus/axi4/DeMux/TC_SimpleReadWrite.tcl @@ -0,0 +1,23 @@ +onerror { resume } +set curr_transcript [transcript] +transcript off + +add wave /axi4_DeMux_TestHarness/DUT/Clock +add wave /axi4_DeMux_TestHarness/DUT/Reset +add wave /axi4_DeMux_TestHarness/DUT/In_M2S +add wave /axi4_DeMux_TestHarness/DUT/In_S2M +add wave /axi4_DeMux_TestHarness/DUT/Out_M2S +add wave /axi4_DeMux_TestHarness/DUT/Out_S2M +add wave /axi4_DeMux_TestHarness/DUT/In_M2S_g +add wave /axi4_DeMux_TestHarness/DUT/In_S2M_g +add wave /axi4_DeMux_TestHarness/DUT/Out_M2S_g +add wave /axi4_DeMux_TestHarness/DUT/Out_S2M_g +add wave -divider write_blk +add wave /axi4_DeMux_TestHarness/DUT/write_blk/* +add wave -divider read_blk +add wave /axi4_DeMux_TestHarness/DUT/read_blk/* +wv.cursors.add -time 245ns+0 -name {Default cursor} +wv.cursors.setactive -name {Default cursor} +wv.zoom.range -from 0fs -to 514500ps +wv.time.unit.auto.set +transcript $curr_transcript diff --git a/tb/bus/axi4/DeMux/TC_SimpleReadWrite.vhdl b/tb/bus/axi4/DeMux/TC_SimpleReadWrite.vhdl new file mode 100644 index 000000000..59ab05b97 --- /dev/null +++ b/tb/bus/axi4/DeMux/TC_SimpleReadWrite.vhdl @@ -0,0 +1,199 @@ +-- ============================================================================= +-- Authors: +-- Iqbal Asif (PLC2 Design GmbH) +-- Patrick Lehmann (PLC2 Design GmbH) +-- Stefan Unrein (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library PoC; +use PoC.utils.all; +use PoC.vectors.all; + +architecture SimpleReadWrite of axi4_DeMux_TestController is + signal TestDone : integer_barrier := 1; + +begin + + ------------------------------------------------------------ + -- ControlProc + -- Set up AlertLog and wait for end of test + ------------------------------------------------------------ + ControlProc : process + constant TestName : string := "TC_SimpleReadWrite"; + begin + -- Initialization of test + SetTestName(TestName); + TranscriptOpen; + SetTranscriptMirror(TRUE); + + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs + + -- Wait for testbench initialization + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts; + + -- Wait for test to finish + WaitForBarrier(TestDone, 10 ms); + AlertIf(now >= 10 ms, "Test finished due to timeout"); + AlertIf(GetAffirmCount < 100, "Test is not Self-Checking"); + + wait for 1 us; + + EndOfTestReports(ReportAll => TRUE); + TranscriptClose; + std.env.stop; + wait; + end process ControlProc; + + ManagerProc : process + variable Address : unsigned(AXI_ADDR_WIDTH - 1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable StartTime : time; + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0'; + SetModelOptions(ManagerRec, WRITE_RESPONSE_VALID_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, READ_DATA_VALID_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, WRITE_ADDRESS_READY_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, WRITE_DATA_READY_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, WRITE_RESPONSE_READY_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, READ_ADDRESS_READY_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, READ_DATA_READY_TIME_OUT, 5000) ; + WaitForClock(ManagerRec, 2); + + StartTime := NOW; + for i in 1 to CHANNELS loop + Address := resize(32x"10000" * i, 32); + for j in 1 to 64 loop + WriteAsync(ManagerRec, to_slv(Address + 16 * j), to_slv(X"0000_0000" + j)); + end loop; + end loop; + WaitForTransaction(ManagerRec); + Log("Write transaction took " & to_string(NOW - StartTime, 1 ns) & " for number=" & integer'image(CHANNELS * 64)); + + wait for 1 us; + StartTime := NOW; + for i in 1 to CHANNELS loop + Address := resize(32x"10000" * i, 32); + + for j in 1 to 64 loop + ReadAddressAsync(ManagerRec, to_slv(Address + 16 * j)); + end loop; + for j in 1 to 64 loop + ReadCheckData(ManagerRec, to_slv(X"0000_0000" + j)); + end loop; + + WaitForClock(ManagerRec); + end loop; + Log("Read transaction took " & to_string(NOW - StartTime, 1 ns) & " for number=" & integer'image(CHANNELS * 64)); + + wait for 1 us; + StartTime := NOW; + -- Transfer write and read at the same time + for i in 1 to CHANNELS loop + Address := resize(32x"10000" * i, 32); + for j in 1 to 64 loop + WriteAsync(ManagerRec, to_slv(Address + 16 * j), to_slv(X"0000_0000" + j)); + end loop; + + WaitForTransaction(ManagerRec); + + for j in 1 to 64 loop + ReadAddressAsync(ManagerRec, to_slv(Address + 16 * j)); + end loop; + for j in 1 to 64 loop + ReadCheckData(ManagerRec, to_slv(X"0000_0000" + j)); + end loop; + + WaitForTransaction(ManagerRec); + WaitForClock(ManagerRec, 2); + end loop; + WaitForTransaction(ManagerRec); + Log("Write and Read transaction took " & to_string(NOW - StartTime, 1 ns) & " for number=" & integer'image(2* CHANNELS * 64)); + + -- Wait for outputs to propagate and signal TestDone + WaitForClock(ManagerRec, 2); + WaitForBarrier(TestDone); + wait; + end process; + + Responder_gen : for i in 0 to CHANNELS - 1 generate + begin + ResponderProc : process + constant BaseAddress : unsigned(AXI_ADDR_WIDTH - 1 downto 0) := resize(32x"10000" * (i + 1), 32); + variable Address : std_logic_vector(AXI_ADDR_WIDTH - 1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable Available : boolean; + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0'; + SetModelOptions(SubordinateRec(i), WRITE_RESPONSE_VALID_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), READ_DATA_VALID_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), WRITE_ADDRESS_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), WRITE_DATA_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), WRITE_RESPONSE_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), READ_ADDRESS_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), READ_DATA_READY_TIME_OUT, 500) ; + WaitForClock(SubordinateRec(i), 2); + + -- Check Single transactions + for j in 1 to 64 loop + GetWrite(SubordinateRec(i), Address, Data); + AffirmIfEqual(Address, to_slv(BaseAddress + 16 * j), "Subordinate Write Addr: "); + AffirmIfEqual(Data, to_slv(X"0000_0000" + j), "Subordinate Write Data: "); + end loop; + + for j in 1 to 64 loop + SendRead(SubordinateRec(i), Address, to_slv(X"0000_0000" + j)); + AffirmIfEqual(Address, to_slv(BaseAddress + 16 * j), "Subordinate Read Addr: "); + end loop; + + for j in 1 to 64 loop + GetWrite(SubordinateRec(i), Address, Data); + AffirmIfEqual(Address, to_slv(BaseAddress + 16 * j), "Subordinate Write Addr: "); + AffirmIfEqual(Data, to_slv(X"0000_0000" + j), "Subordinate Write Data: "); + end loop; + + for j in 1 to 64 loop + SendRead(SubordinateRec(i), Address, to_slv(X"0000_0000" + j)); + AffirmIfEqual(Address, to_slv(BaseAddress + 16 * j), "Subordinate Read Addr: "); + end loop; + + wait; + end process; + end generate; + +end architecture; + +configuration TC_SimpleReadWrite of axi4_DeMux_TestHarness is + for Harness + for TestCtrl : axi4_DeMux_TestController + use entity work.axi4_DeMux_TestController(SimpleReadWrite); + end for; + end for; +end configuration; diff --git a/tb/bus/axi4/DeMux/TC_SimpleReadWrite_delay.tcl b/tb/bus/axi4/DeMux/TC_SimpleReadWrite_delay.tcl new file mode 100644 index 000000000..a9361400f --- /dev/null +++ b/tb/bus/axi4/DeMux/TC_SimpleReadWrite_delay.tcl @@ -0,0 +1,51 @@ +onerror { resume } +set curr_transcript [transcript] +transcript off + +add wave /axi4_DeMux_TestHarness/DUT/Clock +add wave /axi4_DeMux_TestHarness/DUT/Reset +add wave /axi4_DeMux_TestHarness/DUT/In_M2S +add wave /axi4_DeMux_TestHarness/DUT/In_S2M +add wave /axi4_DeMux_TestHarness/DUT/Out_M2S +add wave /axi4_DeMux_TestHarness/DUT/Out_S2M +add wave /axi4_DeMux_TestHarness/DUT/In_M2S_g +add wave /axi4_DeMux_TestHarness/DUT/In_S2M_g +add wave /axi4_DeMux_TestHarness/DUT/Out_M2S_g +add wave /axi4_DeMux_TestHarness/DUT/Out_S2M_g +add wave -divider write_blk +add wave /axi4_DeMux_TestHarness/DUT/write_blk/Address_hit +add wave /axi4_DeMux_TestHarness/DUT/write_blk/Mux_In_M2S +add wave /axi4_DeMux_TestHarness/DUT/write_blk/Mux_In_S2M +add wave /axi4_DeMux_TestHarness/DUT/write_blk/Mux_Out_M2S +add wave /axi4_DeMux_TestHarness/DUT/write_blk/Mux_Out_S2M +add wave /axi4_DeMux_TestHarness/DUT/write_blk/Response_fifo_put +add wave /axi4_DeMux_TestHarness/DUT/write_blk/Response_fifo_ful +add wave /axi4_DeMux_TestHarness/DUT/write_blk/Response_fifo_got +add wave /axi4_DeMux_TestHarness/DUT/write_blk/Response_fifo_dout +add wave /axi4_DeMux_TestHarness/DUT/write_blk/Response_fifo_vld +add wave /axi4_DeMux_TestHarness/DUT/write_blk/State +add wave /axi4_DeMux_TestHarness/DUT/write_blk/NextState +add wave /axi4_DeMux_TestHarness/DUT/write_blk/Put +add wave /axi4_DeMux_TestHarness/DUT/write_blk/Full +add wave /axi4_DeMux_TestHarness/DUT/write_blk/IndexOut +add wave /axi4_DeMux_TestHarness/DUT/write_blk/Write_Response_Error +add wave -divider read_blk +add wave /axi4_DeMux_TestHarness/DUT/read_blk/Address_hit +add wave /axi4_DeMux_TestHarness/DUT/read_blk/DeMux_In_M2S +add wave /axi4_DeMux_TestHarness/DUT/read_blk/DeMux_In_S2M +add wave /axi4_DeMux_TestHarness/DUT/read_blk/DeMux_Out_M2S +add wave /axi4_DeMux_TestHarness/DUT/read_blk/DeMux_Out_S2M +add wave /axi4_DeMux_TestHarness/DUT/read_blk/Mux_In_M2S +add wave /axi4_DeMux_TestHarness/DUT/read_blk/Mux_In_S2M +add wave /axi4_DeMux_TestHarness/DUT/read_blk/Mux_Out_M2S +add wave /axi4_DeMux_TestHarness/DUT/read_blk/Mux_Out_S2M +add wave /axi4_DeMux_TestHarness/DUT/read_blk/Response_fifo_put +add wave /axi4_DeMux_TestHarness/DUT/read_blk/Response_fifo_ful +add wave /axi4_DeMux_TestHarness/DUT/read_blk/Response_fifo_got +add wave /axi4_DeMux_TestHarness/DUT/read_blk/Response_fifo_dout +add wave /axi4_DeMux_TestHarness/DUT/read_blk/Response_fifo_vld +wv.cursors.add -time 255ns+0 -name {Default cursor} +wv.cursors.setactive -name {Default cursor} +wv.zoom.range -from 0fs -to 514500ps +wv.time.unit.auto.set +transcript $curr_transcript diff --git a/tb/bus/axi4/DeMux/TC_SimpleReadWrite_delay.vhdl b/tb/bus/axi4/DeMux/TC_SimpleReadWrite_delay.vhdl new file mode 100644 index 000000000..0194636f6 --- /dev/null +++ b/tb/bus/axi4/DeMux/TC_SimpleReadWrite_delay.vhdl @@ -0,0 +1,213 @@ +-- ============================================================================= +-- Authors: +-- Iqbal Asif (PLC2 Design GmbH) +-- Patrick Lehmann (PLC2 Design GmbH) +-- Stefan Unrein (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library PoC; +use PoC.utils.all; +use PoC.vectors.all; + +library osvvm; +use osvvm.ScoreBoardPkg_slv.all; + +library osvvm_Axi4 ; +context osvvm_Axi4.Axi4LiteContext ; + +architecture SimpleReadWrite_delay of axi4_DeMux_TestController is + signal TestDone : integer_barrier := 1; + signal WriteAddr_SB : ScoreboardIDArrayType(1 to CHANNELS); + signal WriteData_SB : ScoreboardIDArrayType(1 to CHANNELS); + signal ReadAddr_SB : ScoreboardIDArrayType(1 to CHANNELS); + signal ReadData_SB : ScoreboardIDArrayType(1 to CHANNELS); +begin + + ------------------------------------------------------------ + -- ControlProc + -- Set up AlertLog and wait for end of test + ------------------------------------------------------------ + ControlProc : process + constant TestName : string := "TC_SimpleReadWrite_delay"; + begin + -- Initialization of test + SetTestName(TestName); + TranscriptOpen; + SetTranscriptMirror(TRUE); + WriteAddr_SB <= NewID("WriteAddr_SB", CHANNELS); + WriteData_SB <= NewID("WriteData_SB", CHANNELS); + ReadAddr_SB <= NewID("ReadAddr_SB", CHANNELS); + ReadData_SB <= NewID("ReadData_SB", CHANNELS); + + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs + + -- Wait for testbench initialization + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts; + + -- Wait for test to finish + WaitForBarrier(TestDone, 10 ms); + AlertIf(now >= 10 ms, "Test finished due to timeout"); + AlertIf(GetAffirmCount < 100, "Test is not Self-Checking"); + + wait for 1 us; + + EndOfTestReports(ReportAll => TRUE); + TranscriptClose; + std.env.stop; + wait; + end process ControlProc; + + ManagerProc : process + variable Address : unsigned(AXI_ADDR_WIDTH - 1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable Available : boolean; + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0'; + + SetUseRandomDelays(ManagerRec); + + SetModelOptions(ManagerRec, WRITE_RESPONSE_VALID_TIME_OUT, 500) ; + SetModelOptions(ManagerRec, READ_DATA_VALID_TIME_OUT, 500) ; + SetModelOptions(ManagerRec, WRITE_ADDRESS_READY_TIME_OUT, 500) ; + SetModelOptions(ManagerRec, WRITE_DATA_READY_TIME_OUT, 500) ; + SetModelOptions(ManagerRec, WRITE_RESPONSE_READY_TIME_OUT, 500) ; + SetModelOptions(ManagerRec, READ_ADDRESS_READY_TIME_OUT, 500) ; + SetModelOptions(ManagerRec, READ_DATA_READY_TIME_OUT, 500) ; + + WaitForClock(ManagerRec, 2); + + for i in 1 to CHANNELS loop + Address := resize(32x"10000" * i, 32); + for j in 1 to 64 loop + Push(WriteAddr_SB(i), to_slv(Address + 16 * j)); + Push(WriteData_SB(i), to_slv(X"0000_0000" + j)); + WriteAsync(ManagerRec, to_slv(Address + 16 * j), to_slv(X"0000_0000" + j)); + -- SetAxi4Options(ManagerRec, AWID, j); + end loop; + WaitForClock(ManagerRec, 1); + -- WaitForTransaction(ManagerRec); + + for j in 1 to 64 loop + Push(ReadAddr_SB(i), to_slv(Address + 16 * j)); + ReadAddressAsync(ManagerRec, to_slv(Address + 16 * j)); + end loop; + WaitForClock(ManagerRec, 1); + + + TryReadData(ManagerRec, Data, Available); + + -- WaitForTransaction(ManagerRec); + -- WaitForClock(ManagerRec, 2); + end loop; + + for i in 1 to CHANNELS loop + for j in 1 to 64 loop + ReadData(ManagerRec, Data); + end loop; + end loop; + + -- Wait for outputs to propagate and signal TestDone + WaitForClock(ManagerRec, 2); + WaitForBarrier(TestDone); + wait; + end process; + + Responder_gen : for i in 0 to CHANNELS - 1 generate + begin + ResponderProc : process + constant BaseAddress : unsigned(AXI_ADDR_WIDTH - 1 downto 0) := resize(32x"10000" * (i + 1), 32); + variable Address : std_logic_vector(AXI_ADDR_WIDTH - 1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable Available : boolean; + variable receivedAW : natural := 0; + variable receivedW : natural := 0; + variable receivedAR : natural := 0; + variable receivedR : natural := 0; + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0'; + + SetUseRandomDelays(SubordinateRec(i)); + SetModelOptions(SubordinateRec(i), WRITE_RESPONSE_VALID_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), READ_DATA_VALID_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), WRITE_ADDRESS_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), WRITE_DATA_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), WRITE_RESPONSE_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), READ_ADDRESS_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), READ_DATA_READY_TIME_OUT, 500) ; + WaitForClock(SubordinateRec(i), 2); + + -- SetAxi4Options(SubordinateRec(i), BID, ID_value) ; -- write response BID + -- SetAxi4Options(SubordinateRec(i), RID, ID_value) ; -- read data RID + + -- Check Single transactions + loop + TryGetWriteAddress(SubordinateRec(i), Address, Available); + if Available then + Log("Got Write Address"); + Check(WriteAddr_SB(i +1), Address); + receivedAW := receivedAW +1; + end if; + + TryGetWriteData(SubordinateRec(i), Data, Available); + if Available then + Log("Got Write Data"); + Check(WriteData_SB(i +1), Data); + receivedW := receivedW +1; + end if; + + TryGetReadAddress(SubordinateRec(i), Address, Available); + if Available then + Log("Got Read Address"); + Check(ReadAddr_SB(i +1), Address); + SendReadData(SubordinateRec(i), to_slv(X"0000_0000" + receivedAR)); + receivedAR := receivedAR +1; + end if; + WaitForClock(SubordinateRec(i), 1); + + exit when receivedAW >= 64 and receivedW >= 64 and receivedAR >= 64; + end loop; + + AlertIf(receivedAW > 64, "Received more than the expected 64 transactions"); + AlertIf(receivedW > 64, "Received more than the expected 64 transactions"); + AlertIf(receivedAR > 64, "Received more than the expected 64 transactions"); + WaitForBarrier(TestDone); + wait; + end process; + end generate; + +end architecture; + +configuration TC_SimpleReadWrite_delay of axi4_DeMux_TestHarness is + for Harness + for TestCtrl : axi4_DeMux_TestController + use entity work.axi4_DeMux_TestController(SimpleReadWrite_delay); + end for; + end for; +end configuration; diff --git a/tb/bus/axi4/DeMux/TC_SimpleReadWrite_multiID.vhdl b/tb/bus/axi4/DeMux/TC_SimpleReadWrite_multiID.vhdl new file mode 100644 index 000000000..4218294e4 --- /dev/null +++ b/tb/bus/axi4/DeMux/TC_SimpleReadWrite_multiID.vhdl @@ -0,0 +1,207 @@ +-- ============================================================================= +-- Authors: +-- Stefan Unrein (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library PoC; +use PoC.utils.all; +use PoC.vectors.all; + +architecture SimpleReadWrite_multiID of axi4_DeMux_TestController is + signal TestDone : integer_barrier := 1; + +begin + + ------------------------------------------------------------ + -- ControlProc + -- Set up AlertLog and wait for end of test + ------------------------------------------------------------ + ControlProc : process + constant TestName : string := "TC_SimpleReadWrite_multiID"; + begin + -- Initialization of test + SetTestName(TestName); + TranscriptOpen; + SetTranscriptMirror(TRUE); + + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs + + -- Wait for testbench initialization + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts; + + -- Wait for test to finish + WaitForBarrier(TestDone, 10 ms); + AlertIf(now >= 10 ms, "Test finished due to timeout"); + AlertIf(GetAffirmCount < 100, "Test is not Self-Checking"); + + wait for 1 us; + + EndOfTestReports(ReportAll => TRUE); + TranscriptClose; + std.env.stop; + wait; + end process ControlProc; + + ManagerProc : process + variable Address : unsigned(AXI_ADDR_WIDTH - 1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable StartTime : time; + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0'; + SetModelOptions(ManagerRec, WRITE_RESPONSE_VALID_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, READ_DATA_VALID_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, WRITE_ADDRESS_READY_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, WRITE_DATA_READY_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, WRITE_RESPONSE_READY_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, READ_ADDRESS_READY_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, READ_DATA_READY_TIME_OUT, 5000) ; + WaitForClock(ManagerRec, 2); + + StartTime := NOW; + for i in 1 to CHANNELS loop + Address := resize(32x"10000" * i, 32); + for j in 1 to 64 loop + WriteAsync(ManagerRec, to_slv(Address + 16 * j), to_slv(X"0000_0000" + j)); + end loop; + end loop; + WaitForTransaction(ManagerRec); + Log("Write transaction took " & to_string(NOW - StartTime, 1 ns) & " for number=" & integer'image(CHANNELS * 64)); + + wait for 1 us; + StartTime := NOW; + for i in 1 to CHANNELS loop + Address := resize(32x"10000" * i, 32); + + for j in 1 to 64 loop + ReadAddressAsync(ManagerRec, to_slv(Address + 16 * j)); + end loop; + for j in 1 to 64 loop + ReadCheckData(ManagerRec, to_slv(X"0000_0000" + j)); + end loop; + + WaitForClock(ManagerRec); + end loop; + Log("Read transaction took " & to_string(NOW - StartTime, 1 ns) & " for number=" & integer'image(CHANNELS * 64)); + + -- wait for 1 us; + -- StartTime := NOW; + -- -- Transfer write and read at the same time + -- for i in 1 to CHANNELS loop + -- Address := resize(32x"10000" * i, 32); + -- for j in 1 to 64 loop + -- WriteAsync(ManagerRec, to_slv(Address + 16 * j), to_slv(X"0000_0000" + j)); + -- end loop; + + -- WaitForTransaction(ManagerRec); + + -- for j in 1 to 64 loop + -- ReadAddressAsync(ManagerRec, to_slv(Address + 16 * j)); + -- end loop; + -- for j in 1 to 64 loop + -- ReadCheckData(ManagerRec, to_slv(X"0000_0000" + j)); + -- end loop; + + -- WaitForTransaction(ManagerRec); + -- WaitForClock(ManagerRec, 2); + -- end loop; + -- WaitForTransaction(ManagerRec); + -- Log("Write and Read transaction took " & to_string(NOW - StartTime, 1 ns) & " for number=" & integer'image(2* CHANNELS * 64)); + + -- Wait for outputs to propagate and signal TestDone + WaitForClock(ManagerRec, 2); + WaitForBarrier(TestDone); + wait; + end process; + + Responder_gen : for i in 0 to CHANNELS - 1 generate + begin + ResponderProc : process + constant BaseAddress : unsigned(AXI_ADDR_WIDTH - 1 downto 0) := resize(32x"10000" * (i + 1), 32); + variable Address : std_logic_vector(AXI_ADDR_WIDTH - 1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable Available : boolean; + variable ID : natural; + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0'; + SetModelOptions(SubordinateRec(i), WRITE_RESPONSE_VALID_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), READ_DATA_VALID_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), WRITE_ADDRESS_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), WRITE_DATA_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), WRITE_RESPONSE_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), READ_ADDRESS_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), READ_DATA_READY_TIME_OUT, 500) ; + WaitForClock(SubordinateRec(i), 2); + + -- Check Single transactions + for j in 1 to 64 loop + GetWriteAddress(SubordinateRec(i), Address); + GetAxi4Options(SubordinateRec(i), AWID, ID); + SetAXI4Options(SubordinateRec(i), BID, ID); + GetWriteData(SubordinateRec(i), Data); + + -- AffirmIfEqual(Address, to_slv(BaseAddress + 16 * j), "Subordinate Write Addr: "); + -- AffirmIfEqual(Data, to_slv(X"0000_0000" + j), "Subordinate Write Data: "); + end loop; + + for j in 1 to 64 loop + GetReadAddress(SubordinateRec(i), Address); + GetAxi4Options(SubordinateRec(i), ARID, ID); + SetAXI4Options(SubordinateRec(i), RID, ID); + SendReadData(SubordinateRec(i), to_slv(X"0000_0000" + j)); + + -- SendRead(SubordinateRec(i), Address, to_slv(X"0000_0000" + j)); + -- AffirmIfEqual(Address, to_slv(BaseAddress + 16 * j), "Subordinate Read Addr: "); + end loop; + + -- for j in 1 to 64 loop + -- GetWrite(SubordinateRec(i), Address, Data); + -- AffirmIfEqual(Address, to_slv(BaseAddress + 16 * j), "Subordinate Write Addr: "); + -- AffirmIfEqual(Data, to_slv(X"0000_0000" + j), "Subordinate Write Data: "); + -- end loop; + + -- for j in 1 to 64 loop + -- SendRead(SubordinateRec(i), Address, to_slv(X"0000_0000" + j)); + -- AffirmIfEqual(Address, to_slv(BaseAddress + 16 * j), "Subordinate Read Addr: "); + -- end loop; + + wait; + end process; + end generate; + +end architecture; + +configuration TC_SimpleReadWrite_multiID of axi4_DeMux_TestHarness is + for Harness + for TestCtrl : axi4_DeMux_TestController + use entity work.axi4_DeMux_TestController(SimpleReadWrite_multiID); + end for; + end for; +end configuration; diff --git a/tb/bus/axi4/DeMux/TC_SimpleReadWrite_multiID_randDelay.vhdl b/tb/bus/axi4/DeMux/TC_SimpleReadWrite_multiID_randDelay.vhdl new file mode 100644 index 000000000..8da8c996d --- /dev/null +++ b/tb/bus/axi4/DeMux/TC_SimpleReadWrite_multiID_randDelay.vhdl @@ -0,0 +1,181 @@ +-- ============================================================================= +-- Authors: +-- Stefan Unrein (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library PoC; +use PoC.utils.all; +use PoC.vectors.all; + +architecture SimpleReadWrite_multiID_randDelay of axi4_DeMux_TestController is + signal TestDone : integer_barrier := 1; + +begin + + ------------------------------------------------------------ + -- ControlProc + -- Set up AlertLog and wait for end of test + ------------------------------------------------------------ + ControlProc : process + constant TestName : string := "TC_SimpleReadWrite_multiID_randDelay"; + begin + -- Initialization of test + SetTestName(TestName); + TranscriptOpen; + SetTranscriptMirror(TRUE); + + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs + + -- Wait for testbench initialization + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts; + + -- Wait for test to finish + WaitForBarrier(TestDone, 10 ms); + AlertIf(now >= 10 ms, "Test finished due to timeout"); + AlertIf(GetAffirmCount < 100, "Test is not Self-Checking"); + + wait for 1 us; + + EndOfTestReports(ReportAll => TRUE); + TranscriptClose; + std.env.stop; + wait; + end process ControlProc; + + ManagerProc : process + variable Address : unsigned(AXI_ADDR_WIDTH - 1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable StartTime : time; + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0'; + SetUseRandomDelays(ManagerRec); + SetModelOptions(ManagerRec, WRITE_RESPONSE_VALID_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, READ_DATA_VALID_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, WRITE_ADDRESS_READY_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, WRITE_DATA_READY_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, WRITE_RESPONSE_READY_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, READ_ADDRESS_READY_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, READ_DATA_READY_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, WRITE_RESPONSE_VALID_TIME_OUT, 5000) ; + SetModelOptions(ManagerRec, READ_DATA_VALID_TIME_OUT, 5000) ; + WaitForClock(ManagerRec, 2); + + for i in 0 to CHANNELS - 1 loop + for j in 1 to 64 loop + WriteAsync(ManagerRec, to_slv(to_unsigned(1024 * i + 64 * j +0, 32)), to_slv(to_unsigned(1024 * i + 64 * j +0, 32))); + WriteAsync(ManagerRec, to_slv(to_unsigned(1024 * i + 64 * j +16, 32)), to_slv(to_unsigned(1024 * i + 64 * j +16, 32))); + end loop; + + for j in 1 to 64 loop + ReadAddressAsync(ManagerRec, to_slv(to_unsigned(1024 * i + 64 * j +0, 32))); + ReadAddressAsync(ManagerRec, to_slv(to_unsigned(1024 * i + 64 * j +16, 32))); + end loop; + end loop; + + for i in 0 to CHANNELS - 1 loop + for j in 1 to 64 loop + ReadCheckData(ManagerRec, to_slv(to_unsigned(1024 * i + 64 * j +0, 32))); + ReadCheckData(ManagerRec, to_slv(to_unsigned(1024 * i + 64 * j +16, 32))); + end loop; + end loop; + + -- Wait for outputs to propagate and signal TestDone + WaitForTransaction(ManagerRec); + WaitForClock(ManagerRec, 10); + WaitForBarrier(TestDone); + wait; + end process; + + Responder_gen : for i in 0 to CHANNELS - 1 generate + begin + ResponderProc : process + variable WriteAddress : std_logic_vector(AXI_ADDR_WIDTH - 1 downto 0); + variable ReadAddress : std_logic_vector(AXI_ADDR_WIDTH - 1 downto 0); + variable WriteData : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable WriteAddressV : natural := 0; + variable WriteDataV : natural := 0; + variable Available : boolean; + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0'; + SetUseRandomDelays(SubordinateRec(i)); + SetModelOptions(SubordinateRec(i), WRITE_RESPONSE_VALID_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), READ_DATA_VALID_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), WRITE_ADDRESS_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), WRITE_DATA_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), WRITE_RESPONSE_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), READ_ADDRESS_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), READ_DATA_READY_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), WRITE_RESPONSE_VALID_TIME_OUT, 500) ; + SetModelOptions(SubordinateRec(i), READ_DATA_VALID_TIME_OUT, 500) ; + WaitForClock(SubordinateRec(i), 2); + + loop + TryGetWriteAddress(SubordinateRec(i), WriteAddress, Available); + if Available then + WriteAddressV := WriteAddressV +1; + Log("Received Write Address: " & to_hxstring(WriteAddress)); + end if; + + if WriteAddressV > 0 then + TryGetWriteData(SubordinateRec(i), WriteData, Available); + if Available then + WriteDataV := WriteDataV +1; + Log("Received Write Data: " & to_hxstring(WriteData)); + end if; + end if; + if WriteDataV > 0 and WriteAddressV > 0 then + WriteAddressV := WriteAddressV -1; + WriteDataV := WriteDataV -1; + AffirmIfEqual(WriteAddress, WriteData, "Write Address Data check"); + end if; + + + TryGetReadAddress(SubordinateRec(i), ReadAddress, Available); + if Available then + -- GetAxi4Options(SubordinateRec(i), ARID, ID); + Log("Received Read Address: " & to_hxstring(ReadAddress)); + -- SetAxi4Options(SubordinateRec(i), RID, ID); + SendReadDataAsync(SubordinateRec(i), ReadAddress); + end if; + WaitForClock(SubordinateRec(i)); + end loop; + wait; + end process; + end generate; + +end architecture; + +configuration TC_SimpleReadWrite_multiID_randDelay of axi4_DeMux_TestHarness is + for Harness + for TestCtrl : axi4_DeMux_TestController + use entity work.axi4_DeMux_TestController(SimpleReadWrite_multiID_randDelay); + end for; + end for; +end configuration; diff --git a/tb/bus/axi4/DeMux/axi4_DeMux_TestController.vhdl b/tb/bus/axi4/DeMux/axi4_DeMux_TestController.vhdl new file mode 100644 index 000000000..eb9e5337c --- /dev/null +++ b/tb/bus/axi4/DeMux/axi4_DeMux_TestController.vhdl @@ -0,0 +1,47 @@ +-- ============================================================================= +-- Authors: +-- Iqbal Asif (PLC2 Design GmbH) +-- Patrick Lehmann (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library OSVVM; +context OSVVM.OsvvmContext; + +library osvvm_Axi4; +context osvvm_Axi4.Axi4LiteContext; + +entity axi4_DeMux_TestController is + port ( + -- Global Signal Interface + Clock : in std_logic; + Reset : in std_logic; + + -- Transaction Interfaces + ManagerRec : inout AddressBusRecType; + SubordinateRec : inout AddressBusRecArrayType + ); + constant AXI_ADDR_WIDTH : integer := ManagerRec.Address'length; + constant AXI_DATA_WIDTH : integer := ManagerRec.DataToModel'length; + constant CHANNELS : positive := SubordinateRec'length; + +end entity; diff --git a/tb/bus/axi4/DeMux/axi4_DeMux_TestHarness.vhdl b/tb/bus/axi4/DeMux/axi4_DeMux_TestHarness.vhdl new file mode 100644 index 000000000..4a8b3ca3b --- /dev/null +++ b/tb/bus/axi4/DeMux/axi4_DeMux_TestHarness.vhdl @@ -0,0 +1,218 @@ +-- ============================================================================= +-- Authors: +-- Iqbal Asif (PLC2 Design GmbH) +-- Patrick Lehmann (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.AXI4_Full.all; +use PoC.axi4_OSVVM.all; + +library osvvm; +context osvvm.OsvvmContext; + +library osvvm_axi4; +context osvvm_axi4.AXI4Context; + +entity axi4_DeMux_TestHarness is + generic( + NUM_TRANSACTIONS : natural := 0 + ); +end axi4_DeMux_TestHarness; + +architecture Harness of axi4_DeMux_TestHarness is + constant DEMUX_CHANNELS : positive := 5; + + constant AXI_ADDR_WIDTH : integer := 32; + constant AXI_DATA_WIDTH : integer := 32; + constant AXI_STRB_WIDTH : integer := AXI_DATA_WIDTH/8; + constant AXI_ID_WIDTH : integer := 4; + + constant tperiod_Clk : time := 10 ns; + constant tpd : time := 2 ns; + + constant BASE_ADDRESS : T_SLUV(0 to DEMUX_CHANNELS -1) := (0 => 32x"10000", 1 => 32x"20000", 2 => 32x"30000", 3 => 32x"40000", 4 => 32x"50000"); + constant BASE_ADDRESS_MASK : T_SLUV(0 to DEMUX_CHANNELS -1) := (0 to DEMUX_CHANNELS -1 => 32x"0FFFF"); + constant PIPELINE_OUT : natural_vector(BASE_ADDRESS'range) := (others => 0); + + signal Clock : std_logic := '0'; + signal Reset : std_logic := '1'; + + -- Testbench Transaction Interface + subtype ManagerRec is AddressBusRecType( + Address((AXI_ADDR_WIDTH) - 1 downto 0), + DataToModel((AXI_DATA_WIDTH) - 1 downto 0), + DataFromModel((AXI_DATA_WIDTH) - 1 downto 0) + ); + + signal AxiManagerTransRec : ManagerRec; + + signal SubordinateRec : AddressBusRecArrayType(DEMUX_CHANNELS - 1 downto 0)( + Address(AXI_ADDR_WIDTH - 1 downto 0), + DataToModel(AXI_DATA_WIDTH - 1 downto 0), + DataFromModel(AXI_DATA_WIDTH - 1 downto 0) + ); + + -- AXI Master Functional Interface + signal AxiBus : AXI4RecType( + WriteAddress(Addr(AXI_ADDR_WIDTH - 1 downto 0), ID(AXI_ID_WIDTH -1 downto 0), User(0 downto 0)), + WriteData(Data(AXI_DATA_WIDTH - 1 downto 0), Strb(AXI_STRB_WIDTH - 1 downto 0), ID(AXI_ID_WIDTH -1 downto 0), User(0 downto 0)), + ReadAddress(Addr(AXI_ADDR_WIDTH - 1 downto 0), ID(AXI_ID_WIDTH -1 downto 0), User(0 downto 0)), + ReadData(Data(AXI_DATA_WIDTH - 1 downto 0), ID(AXI_ID_WIDTH -1 downto 0), User(0 downto 0)), + WriteResponse(ID(AXI_ID_WIDTH -1 downto 0), User(0 downto 0)) + ); + + signal Out_M2S : T_AXI4_Bus_M2S_VECTOR(DEMUX_CHANNELS - 1 downto 0)( + AWAddr(AXI_ADDR_WIDTH - 1 downto 0), WData(AXI_DATA_WIDTH - 1 downto 0), + WStrb((AXI_DATA_WIDTH /8) - 1 downto 0), ARAddr(AXI_ADDR_WIDTH - 1 downto 0), + AWID(AXI_ID_WIDTH -1 downto 0), ARID(AXI_ID_WIDTH -1 downto 0), AWUser(0 downto 0), + WUser(0 downto 0), ARUser(0 downto 0) + ); + signal Out_S2M : T_AXI4_Bus_S2M_VECTOR(DEMUX_CHANNELS - 1 downto 0)( + RData(AXI_DATA_WIDTH - 1 downto 0), BID(AXI_ID_WIDTH -1 downto 0), BUser(0 downto 0), RID(AXI_ID_WIDTH -1 downto 0), RUser(0 downto 0) + ); + + signal In_M2S : Out_M2S'element; + signal In_S2M : Out_S2M'element; + + component axi4_DeMux_TestController is + port ( + -- Global Signal Interface + Clock : in std_logic; + Reset : in std_logic; + -- Transaction Interfaces + ManagerRec : inout AddressBusRecType; + SubordinateRec : inout AddressBusRecArrayType + ); + end component; + +begin + + -- create Clock for TB and 100 Mhz + Osvvm.ClockResetPkg.CreateClock ( + Clk => Clock, + Period => Tperiod_Clk + ); + + -- create nReset + Osvvm.ClockResetPkg.CreateReset ( + Reset => Reset, + ResetActive => '1', + Clk => Clock, + Period => 7 * tperiod_Clk, + tpd => tpd + ); + + ------------------------------------------------ + -- osvvm axi4 manager interface + ------------------------------------------------ + AXI4_Config : entity OSVVM_AXI4.AXI4Manager + generic map( + tperiod_Clk => 5 ns, + tpd_Clk_AWValid => 0 ns, + tpd_Clk_AWProt => 0 ns, + tpd_Clk_AWAddr => 0 ns, + tpd_Clk_WValid => 0 ns, + tpd_Clk_WData => 0 ns, + tpd_Clk_WStrb => 0 ns, + tpd_Clk_BReady => 0 ns, + tpd_Clk_ARValid => 0 ns, + tpd_Clk_ARProt => 0 ns, + tpd_Clk_ARAddr => 0 ns, + tpd_Clk_RReady => 0 ns + ) + port map + ( + Clk => Clock, + nReset => not Reset, + + TransRec => AxiManagerTransRec, -- Testbench Transaction Interface + AxiBus => AxiBus -- AXI Master Functional Interface + ); + + to_PoC_AXI4_Bus_Master(In_M2S, In_S2M, AxiBus); + + --------------------------------------------------------- + -- osvvm axi4 subordinate interface + --------------------------------------------------------- + genSubordinate : for i in 0 to DEMUX_CHANNELS - 1 generate + signal AxiBus : AXI4RecType( + WriteAddress(Addr(AXI_ADDR_WIDTH - 1 downto 0), ID(AXI_ID_WIDTH -1 downto 0), User(0 downto 0)), + WriteData(Data(AXI_DATA_WIDTH - 1 downto 0), Strb(AXI_STRB_WIDTH - 1 downto 0), ID(AXI_ID_WIDTH -1 downto 0), User(0 downto 0)), + ReadAddress(Addr(AXI_ADDR_WIDTH - 1 downto 0), ID(AXI_ID_WIDTH -1 downto 0), User(0 downto 0)), + ReadData(Data(AXI_DATA_WIDTH - 1 downto 0), ID(AXI_ID_WIDTH -1 downto 0), User(0 downto 0)), + WriteResponse(ID(AXI_ID_WIDTH -1 downto 0), User(0 downto 0)) + ); + begin + Subordinate : entity OSVVM_AXI4.AXI4Subordinate + generic map( + tperiod_Clk => 5 ns, + DEFAULT_DELAY => 0 ns + ) + port map + ( + Clk => Clock, + nReset => not Reset, + + AxiBus => AxiBus, + TransRec => SubordinateRec(i) + ); + + to_PoC_AXI4_Bus_Slave(Out_M2S(i), Out_S2M(i), AxiBus); + end generate; + + TestCtrl : axi4_DeMux_TestController + port map + ( + Clock => Clock, + Reset => Reset, + + ManagerRec => AxiManagerTransRec, + SubordinateRec => SubordinateRec + ); + + + DUT : entity PoC.axi4_DeMux + generic map( + BASE_ADDRESS => BASE_ADDRESS, + BASE_ADDRESS_MASK => BASE_ADDRESS_MASK, + -- PIPELINE_OUT => PIPELINE_OUT + NUM_OUTSTANDING_READS => NUM_TRANSACTIONS, + NUM_OUTSTANDING_WRITES => NUM_TRANSACTIONS + ) + port map + ( + -- AXI4 slave interface + Clock => Clock, + Reset => Reset, + + In_M2S => In_M2S, + In_S2M => In_S2M, + + Out_M2S => Out_M2S, + Out_S2M => Out_S2M + ); + +end architecture; diff --git a/tb/bus/axi4/Mux/RunAllTests.pro b/tb/bus/axi4/Mux/RunAllTests.pro new file mode 100644 index 000000000..4a0b2bf49 --- /dev/null +++ b/tb/bus/axi4/Mux/RunAllTests.pro @@ -0,0 +1,32 @@ +# ============================================================================= +# Authors: +# Adrian Weiland, Jonas Schreiner +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +TestSuite PoC.bus.axi4.Mux + +library tb_axi4_Mux + +analyze axi4_Mux_TestController.vhdl +analyze axi4_Mux_TestHarness.vhdl + +# Test cases +RunTest TC_SimpleReadWrite.vhdl [generic TRANSACTIONS 1] +RunTest TC_SimpleReadWrite_multiID.vhdl +RunTest TC_SimpleReadWrite_multiID_randDelay.vhdl diff --git a/tb/bus/axi4/Mux/TC_SimpleReadWrite.tcl b/tb/bus/axi4/Mux/TC_SimpleReadWrite.tcl new file mode 100644 index 000000000..71eb87746 --- /dev/null +++ b/tb/bus/axi4/Mux/TC_SimpleReadWrite.tcl @@ -0,0 +1,19 @@ +onerror { resume } +set curr_transcript [transcript] +transcript off + +add wave /axi4_Mux_TestHarness/DUT/Clock +add wave /axi4_Mux_TestHarness/DUT/Reset +add wave /axi4_Mux_TestHarness/DUT/In_M2S +add wave /axi4_Mux_TestHarness/DUT/In_S2M +add wave /axi4_Mux_TestHarness/DUT/Out_M2S +add wave /axi4_Mux_TestHarness/DUT/Out_S2M +add wave -divider write_blk +add wave /axi4_Mux_TestHarness/DUT/write_blk/* +add wave -divider read_blk +add wave /axi4_Mux_TestHarness/DUT/read_blk/* +wv.cursors.add -time 490ns+0 -name {Default cursor} +wv.cursors.setactive -name {Default cursor} +wv.zoom.range -from 0fs -to 514500ps +wv.time.unit.auto.set +transcript $curr_transcript diff --git a/tb/bus/axi4/Mux/TC_SimpleReadWrite.vhdl b/tb/bus/axi4/Mux/TC_SimpleReadWrite.vhdl new file mode 100644 index 000000000..f5022557f --- /dev/null +++ b/tb/bus/axi4/Mux/TC_SimpleReadWrite.vhdl @@ -0,0 +1,134 @@ +-- ============================================================================= +-- Authors: +-- Iqbal Asif (PLC2 Design GmbH) +-- Patrick Lehmann (PLC2 Design GmbH) +-- Stefan Unrein (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library OSVVM; +context OSVVM.OsvvmContext; + +library OSVVM_AXI4; +context OSVVM_AXI4.Axi4Context; + +library PoC; +use PoC.utils.all; + +architecture SimpleReadWrite of TestControl is + signal TestDone : integer_barrier := 1; + +begin + + ------------------------------------------------------------ + -- ControlProc + -- Set up AlertLog and wait for end of test + ------------------------------------------------------------ + ControlProc : process + constant TestName : string := "TC_SimpleReadWrite"; + begin + -- Initialization of test + SetTestName(TestName); + TranscriptOpen; + SetTranscriptMirror(TRUE); + + SetLogEnable(PASSED, TRUE); -- Enable PASSED logs + SetLogEnable(INFO, TRUE); -- Enable INFO logs + + -- Wait for testbench initialization + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts; + + -- Wait for test to finish + WaitForBarrier(TestDone); + AlertIf(now >= 10 ms, "Test finished due to timeout"); + -- AlertIf(GetAffirmCount < 100, "Test is not Self-Checking"); + + wait for 1 us; + + EndOfTestReports(ReportAll => TRUE); + TranscriptClose; + std.env.stop; + wait; + end process ControlProc; + + Manager_gen : for i in AXI4_Manager_Transaction'range generate + begin + ManagerProc : process + variable Address : std_logic_vector(AXI_ADDR_WIDTH - 1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + + begin + wait until Reset = '0'; + WaitForClock(AXI4_Manager_Transaction(i), 2); + + for j in 0 to 10 loop + Write(AXI4_Manager_Transaction(i), 32x"1000", to_slv(to_unsigned(j, 16) & 16x"1234")); + Write(AXI4_Manager_Transaction(i), 32x"2000", to_slv(to_unsigned(j, 16) & 16x"5678")); + + Read(AXI4_Manager_Transaction(i), 32x"3000", Data); + Read(AXI4_Manager_Transaction(i), 32x"4000", Data); + end loop; + WaitForClock(AXI4_Manager_Transaction(i), 2); + + wait for 100 ns; + WaitForBarrier(TestDone); + wait; + end process; + end generate; + + ResponderProc : process + variable Address : std_logic_vector(AXI_ADDR_WIDTH - 1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable Available : boolean; + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0'; + WaitForClock(AXI4_Subordinate_Transaction, 2); + + loop + TryGetWriteAddress(AXI4_Subordinate_Transaction, Address, Available); + if Available then + GetWriteData(AXI4_Subordinate_Transaction, Data); + end if; + + + TryGetReadAddress(AXI4_Subordinate_Transaction, Address, Available); + if Available then + SendReadData(AXI4_Subordinate_Transaction, X"1111_1111"); + end if; + WaitForClock(AXI4_Subordinate_Transaction); + end loop; + wait; + end process; + +end architecture; + +configuration TC_SimpleReadWrite of axi4_Mux_TestHarness is + for Harness + for TestControl_inst : TestControl + use entity work.TestControl(SimpleReadWrite); + end for; + end for; +end configuration; diff --git a/tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID.vhdl b/tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID.vhdl new file mode 100644 index 000000000..c9bf11452 --- /dev/null +++ b/tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID.vhdl @@ -0,0 +1,157 @@ +-- ============================================================================= +-- Authors: +-- Stefan Unrein (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library OSVVM; +context OSVVM.OsvvmContext; + +library OSVVM_AXI4; +context OSVVM_AXI4.Axi4Context; + +library PoC; +use PoC.utils.all; + +architecture SimpleReadWrite_multiID of TestControl is + signal TestDone : integer_barrier := 1; + +begin + + ------------------------------------------------------------ + -- ControlProc + -- Set up AlertLog and wait for end of test + ------------------------------------------------------------ + ControlProc : process + constant TestName : string := "TC_SimpleReadWrite_multiID"; + begin + -- Initialization of test + SetTestName(TestName); + TranscriptOpen; + SetTranscriptMirror(TRUE); + + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs + + -- Wait for testbench initialization + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts; + + -- Wait for test to finish + WaitForBarrier(TestDone); + AlertIf(now >= 10 ms, "Test finished due to timeout"); + AlertIf(GetAffirmCount < 64 * 8, "Test is not Self-Checking"); + + wait for 1 us; + + EndOfTestReports(ReportAll => TRUE); + TranscriptClose; + std.env.stop; + wait; + end process ControlProc; + + Manager_gen : for i in AXI4_Manager_Transaction'range generate + begin + ManagerProc : process + variable Address : std_logic_vector(AXI_ADDR_WIDTH - 1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + begin + wait until Reset = '0'; + SetModelOptions(AXI4_Manager_Transaction(i), WRITE_RESPONSE_VALID_TIME_OUT, 5000) ; + SetModelOptions(AXI4_Manager_Transaction(i), READ_DATA_VALID_TIME_OUT, 5000) ; + SetModelOptions(AXI4_Manager_Transaction(i), WRITE_ADDRESS_READY_TIME_OUT, 5000) ; + SetModelOptions(AXI4_Manager_Transaction(i), WRITE_DATA_READY_TIME_OUT, 5000) ; + SetModelOptions(AXI4_Manager_Transaction(i), WRITE_RESPONSE_READY_TIME_OUT, 5000) ; + SetModelOptions(AXI4_Manager_Transaction(i), READ_ADDRESS_READY_TIME_OUT, 5000) ; + SetModelOptions(AXI4_Manager_Transaction(i), READ_DATA_READY_TIME_OUT, 5000) ; + WaitForClock(AXI4_Manager_Transaction(i), 2); + + for j in 1 to 64 loop + WriteAsync(AXI4_Manager_Transaction(i), to_slv(to_unsigned(1024 * i + 64 * j +0, 32)), to_slv(to_unsigned(1024 * i + 64 * j +0, 32))); + WriteAsync(AXI4_Manager_Transaction(i), to_slv(to_unsigned(1024 * i + 64 * j +16, 32)), to_slv(to_unsigned(1024 * i + 64 * j +16, 32))); + end loop; + + for j in 1 to 64 loop + ReadAddressAsync(AXI4_Manager_Transaction(i), to_slv(to_unsigned(1024 * i + 64 * j +0, 32))); + ReadAddressAsync(AXI4_Manager_Transaction(i), to_slv(to_unsigned(1024 * i + 64 * j +16, 32))); + end loop; + + for j in 1 to 64 loop + ReadCheckData(AXI4_Manager_Transaction(i), to_slv(to_unsigned(1024 * i + 64 * j +0, 32))); + ReadCheckData(AXI4_Manager_Transaction(i), to_slv(to_unsigned(1024 * i + 64 * j +16, 32))); + end loop; + + wait for 100 ns; + WaitForBarrier(TestDone); + wait; + end process; + end generate; + + ResponderProc : process + variable Address : std_logic_vector(AXI_ADDR_WIDTH - 1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable Available : boolean; + variable ID : natural; + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0'; + SetModelOptions(AXI4_Subordinate_Transaction, WRITE_RESPONSE_VALID_TIME_OUT, 500) ; + SetModelOptions(AXI4_Subordinate_Transaction, READ_DATA_VALID_TIME_OUT, 500) ; + SetModelOptions(AXI4_Subordinate_Transaction, WRITE_ADDRESS_READY_TIME_OUT, 500) ; + SetModelOptions(AXI4_Subordinate_Transaction, WRITE_DATA_READY_TIME_OUT, 500) ; + SetModelOptions(AXI4_Subordinate_Transaction, WRITE_RESPONSE_READY_TIME_OUT, 500) ; + SetModelOptions(AXI4_Subordinate_Transaction, READ_ADDRESS_READY_TIME_OUT, 500) ; + SetModelOptions(AXI4_Subordinate_Transaction, READ_DATA_READY_TIME_OUT, 500) ; + WaitForClock(AXI4_Subordinate_Transaction, 2); + + loop + TryGetWriteAddress(AXI4_Subordinate_Transaction, Address, Available); + if Available then + GetAxi4Options(AXI4_Subordinate_Transaction, AWID, ID); + SetAxi4Options(AXI4_Subordinate_Transaction, BID, ID); + GetWriteData(AXI4_Subordinate_Transaction, Data); + AffirmIfEqual(Address, Data, "Write Address Data check"); + end if; + + + TryGetReadAddress(AXI4_Subordinate_Transaction, Address, Available); + if Available then + GetAxi4Options(AXI4_Subordinate_Transaction, ARID, ID); + SetAxi4Options(AXI4_Subordinate_Transaction, RID, ID); + SendReadData(AXI4_Subordinate_Transaction, Address); + end if; + WaitForClock(AXI4_Subordinate_Transaction); + end loop; + wait; + end process; + +end architecture; + +configuration TC_SimpleReadWrite_multiID of axi4_Mux_TestHarness is + for Harness + for TestControl_inst : TestControl + use entity work.TestControl(SimpleReadWrite_multiID); + end for; + end for; +end configuration; diff --git a/tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID_randDelay.tcl b/tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID_randDelay.tcl new file mode 100644 index 000000000..ac0550819 --- /dev/null +++ b/tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID_randDelay.tcl @@ -0,0 +1,64 @@ +onerror { resume } +set curr_transcript [transcript] +transcript off + +add wave /axi4_Mux_TestHarness/AXI4_Manager_Transaction +add wave /axi4_Mux_TestHarness/AXI4_Subordinate_Transaction +add wave /axi4_Mux_TestHarness/DUT/Clock +add wave /axi4_Mux_TestHarness/DUT/Reset +add wave -expand /axi4_Mux_TestHarness/DUT/In_M2S +add wave -expand /axi4_Mux_TestHarness/DUT/In_S2M +add wave /axi4_Mux_TestHarness/DUT/Out_M2S +add wave /axi4_Mux_TestHarness/DUT/Out_S2M +add wave /axi4_Mux_TestHarness/DUT/In_M2S_g +add wave /axi4_Mux_TestHarness/DUT/In_S2M_g +add wave /axi4_Mux_TestHarness/DUT/Out_M2S_g +add wave /axi4_Mux_TestHarness/DUT/Out_S2M_g +add wave -divider write_blk +add wave /axi4_Mux_TestHarness/DUT/write_blk/State +add wave /axi4_Mux_TestHarness/DUT/write_blk/NextState +add wave /axi4_Mux_TestHarness/DUT/write_blk/Put +add wave /axi4_Mux_TestHarness/DUT/write_blk/Full +add wave /axi4_Mux_TestHarness/DUT/write_blk/DataIn +add wave /axi4_Mux_TestHarness/DUT/write_blk/IndexOut +add wave /axi4_Mux_TestHarness/DUT/write_blk/Got +add wave /axi4_Mux_TestHarness/DUT/write_blk/Valid +add wave /axi4_Mux_TestHarness/DUT/write_blk/DataOut +add wave /axi4_Mux_TestHarness/DUT/write_blk/Arbitrate +add wave /axi4_Mux_TestHarness/DUT/write_blk/RequestVector +add wave /axi4_Mux_TestHarness/DUT/write_blk/Arbitrated +add wave /axi4_Mux_TestHarness/DUT/write_blk/GrantVector +add wave /axi4_Mux_TestHarness/DUT/write_blk/GrantIndex +add wave /axi4_Mux_TestHarness/DUT/write_blk/RequestWithSelf +add wave /axi4_Mux_TestHarness/DUT/write_blk/RequestWithoutSelf +add wave /axi4_Mux_TestHarness/DUT/write_blk/Write_Response_Error +add wave /axi4_Mux_TestHarness/DUT/write_blk/~ANONYMOUS~0 +add wave -divider read_blk +add wave /axi4_Mux_TestHarness/DUT/read_blk/Mux_In_M2S +add wave /axi4_Mux_TestHarness/DUT/read_blk/Mux_In_S2M +add wave /axi4_Mux_TestHarness/DUT/read_blk/Mux_Out_M2S +add wave /axi4_Mux_TestHarness/DUT/read_blk/Mux_Out_S2M +add wave /axi4_Mux_TestHarness/DUT/read_blk/Put +add wave /axi4_Mux_TestHarness/DUT/read_blk/Full +add wave /axi4_Mux_TestHarness/DUT/read_blk/DataIn +add wave /axi4_Mux_TestHarness/DUT/read_blk/IndexOut +add wave /axi4_Mux_TestHarness/DUT/read_blk/Got +add wave /axi4_Mux_TestHarness/DUT/read_blk/Valid +add wave /axi4_Mux_TestHarness/DUT/read_blk/Read_idx/IndexIn +add wave /axi4_Mux_TestHarness/DUT/read_blk/DataOut +add wave -varray DataOut.index \ + /axi4_Mux_TestHarness/DUT/read_blk/DataOut(5) \ + /axi4_Mux_TestHarness/DUT/read_blk/DataOut(4) \ + /axi4_Mux_TestHarness/DUT/read_blk/DataOut(3) +add wave -varray DataOut.return-ID \ + /axi4_Mux_TestHarness/DUT/read_blk/DataOut(2) \ + /axi4_Mux_TestHarness/DUT/read_blk/DataOut(1) \ + /axi4_Mux_TestHarness/DUT/read_blk/DataOut(0) +add wave /axi4_Mux_TestHarness/DUT/read_blk/~ANONYMOUS~2 +wv.cursors.add -time 0fs+0 -name {Default cursor} +wv.cursors.setactive -name {Default cursor} +wv.cursors.subcursor.add -time 10ns -name {Cursor 1} +wv.cursors.setactive -name {Default cursor} +wv.zoom.range -from 0fs -to 514500ps +wv.time.unit.auto.set +transcript $curr_transcript diff --git a/tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID_randDelay.vhdl b/tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID_randDelay.vhdl new file mode 100644 index 000000000..dc5404b28 --- /dev/null +++ b/tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID_randDelay.vhdl @@ -0,0 +1,178 @@ +-- ============================================================================= +-- Authors: +-- Stefan Unrein (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library OSVVM; +context OSVVM.OsvvmContext; + +library OSVVM_AXI4; +context OSVVM_AXI4.Axi4Context; + +library PoC; +use PoC.utils.all; + +architecture SimpleReadWrite_multiID_randDelay of TestControl is + signal TestDone : integer_barrier := 1; + +begin + + ------------------------------------------------------------ + -- ControlProc + -- Set up AlertLog and wait for end of test + ------------------------------------------------------------ + ControlProc : process + constant TestName : string := "TC_SimpleReadWrite_multiID_randDelay"; + begin + -- Initialization of test + SetTestName(TestName); + TranscriptOpen; + SetTranscriptMirror(TRUE); + + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, TRUE); -- Enable INFO logs + + -- Wait for testbench initialization + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts; + + -- Wait for test to finish + WaitForBarrier(TestDone); + AlertIf(now >= 10 ms, "Test finished due to timeout"); + AlertIf(GetAffirmCount < 64 * 8, "Test is not Self-Checking"); + + wait for 1 us; + + EndOfTestReports(ReportAll => TRUE); + TranscriptClose; + std.env.stop; + wait; + end process ControlProc; + + Manager_gen : for i in AXI4_Manager_Transaction'range generate + begin + ManagerProc : process + variable Address : std_logic_vector(AXI_ADDR_WIDTH - 1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + begin + wait until Reset = '0'; + SetUseRandomDelays(AXI4_Manager_Transaction(i)); + SetModelOptions(AXI4_Manager_Transaction(i), WRITE_RESPONSE_VALID_TIME_OUT, 5000) ; + SetModelOptions(AXI4_Manager_Transaction(i), READ_DATA_VALID_TIME_OUT, 5000) ; + SetModelOptions(AXI4_Manager_Transaction(i), WRITE_ADDRESS_READY_TIME_OUT, 5000) ; + SetModelOptions(AXI4_Manager_Transaction(i), WRITE_DATA_READY_TIME_OUT, 5000) ; + SetModelOptions(AXI4_Manager_Transaction(i), WRITE_RESPONSE_READY_TIME_OUT, 5000) ; + SetModelOptions(AXI4_Manager_Transaction(i), READ_ADDRESS_READY_TIME_OUT, 5000) ; + SetModelOptions(AXI4_Manager_Transaction(i), READ_DATA_READY_TIME_OUT, 5000) ; + SetModelOptions(AXI4_Manager_Transaction(i), WRITE_RESPONSE_VALID_TIME_OUT, 5000) ; + SetModelOptions(AXI4_Manager_Transaction(i), READ_DATA_VALID_TIME_OUT, 5000) ; + WaitForClock(AXI4_Manager_Transaction(i), 2); + + for j in 1 to 64 loop + WriteAsync(AXI4_Manager_Transaction(i), to_slv(to_unsigned(1024 * i + 64 * j +0, 32)), to_slv(to_unsigned(1024 * i + 64 * j +0, 32))); + WriteAsync(AXI4_Manager_Transaction(i), to_slv(to_unsigned(1024 * i + 64 * j +16, 32)), to_slv(to_unsigned(1024 * i + 64 * j +16, 32))); + end loop; + + for j in 1 to 64 loop + ReadAddressAsync(AXI4_Manager_Transaction(i), to_slv(to_unsigned(1024 * i + 64 * j +0, 32))); + ReadAddressAsync(AXI4_Manager_Transaction(i), to_slv(to_unsigned(1024 * i + 64 * j +16, 32))); + end loop; + + for j in 1 to 64 loop + ReadCheckData(AXI4_Manager_Transaction(i), to_slv(to_unsigned(1024 * i + 64 * j +0, 32))); + ReadCheckData(AXI4_Manager_Transaction(i), to_slv(to_unsigned(1024 * i + 64 * j +16, 32))); + end loop; + + WaitForTransaction(AXI4_Manager_Transaction(i)); + wait for 100 ns; + WaitForBarrier(TestDone); + wait; + end process; + end generate; + + ResponderProc : process + variable WriteAddress : std_logic_vector(AXI_ADDR_WIDTH - 1 downto 0); + variable ReadAddress : std_logic_vector(AXI_ADDR_WIDTH - 1 downto 0); + variable WriteData : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable WriteAddressV : natural := 0; + variable WriteDataV : natural := 0; + variable Available : boolean; + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0'; + SetUseRandomDelays(AXI4_Subordinate_Transaction); + SetModelOptions(AXI4_Subordinate_Transaction, WRITE_RESPONSE_VALID_TIME_OUT, 500) ; + SetModelOptions(AXI4_Subordinate_Transaction, READ_DATA_VALID_TIME_OUT, 500) ; + SetModelOptions(AXI4_Subordinate_Transaction, WRITE_ADDRESS_READY_TIME_OUT, 500) ; + SetModelOptions(AXI4_Subordinate_Transaction, WRITE_DATA_READY_TIME_OUT, 500) ; + SetModelOptions(AXI4_Subordinate_Transaction, WRITE_RESPONSE_READY_TIME_OUT, 500) ; + SetModelOptions(AXI4_Subordinate_Transaction, READ_ADDRESS_READY_TIME_OUT, 500) ; + SetModelOptions(AXI4_Subordinate_Transaction, READ_DATA_READY_TIME_OUT, 500) ; + SetModelOptions(AXI4_Subordinate_Transaction, WRITE_RESPONSE_VALID_TIME_OUT, 5000) ; + SetModelOptions(AXI4_Subordinate_Transaction, READ_DATA_VALID_TIME_OUT, 5000) ; + WaitForClock(AXI4_Subordinate_Transaction, 2); + + loop + if WriteAddressV = 0 then + TryGetWriteAddress(AXI4_Subordinate_Transaction, WriteAddress, Available); + if Available then + WriteAddressV := WriteAddressV +1; + Log("Received Write Address: " & to_hxstring(WriteAddress)); + end if; + + else + TryGetWriteData(AXI4_Subordinate_Transaction, WriteData, Available); + if Available then + WriteDataV := WriteDataV +1; + Log("Received Write Data: " & to_hxstring(WriteData)); + end if; + end if; + if WriteDataV > 0 and WriteAddressV > 0 then + WriteAddressV := WriteAddressV -1; + WriteDataV := WriteDataV -1; + AffirmIfEqual(WriteAddress, WriteData, "Write Address Data check"); + end if; + + + TryGetReadAddress(AXI4_Subordinate_Transaction, ReadAddress, Available); + if Available then + -- GetAxi4Options(AXI4_Subordinate_Transaction, ARID, ID); + Log("Received Read Address: " & to_hxstring(ReadAddress)); + -- SetAxi4Options(AXI4_Subordinate_Transaction, RID, ID); + SendReadDataAsync(AXI4_Subordinate_Transaction, ReadAddress); + end if; + WaitForClock(AXI4_Subordinate_Transaction); + end loop; + wait; + end process; + +end architecture; + +configuration TC_SimpleReadWrite_multiID_randDelay of axi4_Mux_TestHarness is + for Harness + for TestControl_inst : TestControl + use entity work.TestControl(SimpleReadWrite_multiID_randDelay); + end for; + end for; +end configuration; diff --git a/tb/bus/axi4/Mux/axi4_Mux_TestController.vhdl b/tb/bus/axi4/Mux/axi4_Mux_TestController.vhdl new file mode 100644 index 000000000..307df70fe --- /dev/null +++ b/tb/bus/axi4/Mux/axi4_Mux_TestController.vhdl @@ -0,0 +1,41 @@ +-- ============================================================================= +-- Authors: +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.ALL; +use IEEE.numeric_std.ALL; + +library OSVVM_AXI4 ; +context OSVVM_AXI4.Axi4Context; + +entity TestControl is + generic ( + AXI_ADDR_WIDTH : natural; + AXI_DATA_WIDTH : natural + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + + AXI4_Manager_Transaction : inout AddressBusRecArrayType; + AXI4_Subordinate_Transaction : inout AddressBusRecType + ); +end entity; diff --git a/tb/bus/axi4/Mux/axi4_Mux_TestHarness.vhdl b/tb/bus/axi4/Mux/axi4_Mux_TestHarness.vhdl new file mode 100644 index 000000000..1c657e42c --- /dev/null +++ b/tb/bus/axi4/Mux/axi4_Mux_TestHarness.vhdl @@ -0,0 +1,254 @@ +-- ============================================================================= +-- Authors: +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +use PoC.utils.all; +-- use PoC.strings.all; +use PoC.physical.all; +use PoC.axi4_Full.all; +use PoC.axi4_OSVVM.all; + +library osvvm; +context osvvm.OsvvmContext; + +library osvvm_axi4; +context osvvm_axi4.Axi4Context; + +entity axi4_Mux_TestHarness is + generic( + TRANSACTIONS : natural := 0 + ); +end entity; + +architecture Harness of axi4_Mux_TestHarness is + constant CLOCK_FREQ : FREQ := 100 MHz; + + constant AXI_ADDR_WIDTH : natural := 32; + constant AXI_DATA_WIDTH : natural := 32; + constant AXI_STRB_WIDTH : natural := AXI_DATA_WIDTH / 8; + + constant PORTS : positive := 5; + + component TestControl is + generic ( + AXI_ADDR_WIDTH : natural; + AXI_DATA_WIDTH : natural + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + + AXI4_Manager_Transaction : inout AddressBusRecArrayType; + AXI4_Subordinate_Transaction : inout AddressBusRecType + ); + end component; + + package AXI4_Package_Sized_In is + new PoC.AXI4Full_Sized + generic map( + ADDRESS_BITS => AXI_ADDR_WIDTH, + DATA_BITS => AXI_DATA_WIDTH, + USER_BITS => 1, + ID_BITS => 3 + ); + package AXI4_Package_Sized_Out is + new PoC.AXI4Full_Sized + generic map( + ADDRESS_BITS => AXI_ADDR_WIDTH, + DATA_BITS => AXI_DATA_WIDTH, + USER_BITS => 1, + ID_BITS => 4 + ); + + signal AXI4_Manager_Transaction : AddressBusRecArrayType(0 to PORTS - 1)( + Address(AXI_ADDR_WIDTH - 1 downto 0), + DataToModel(AXI_DATA_WIDTH - 1 downto 0), + DataFromModel(AXI_DATA_WIDTH - 1 downto 0) + ); + signal AXI4_Subordinate_Transaction : AddressBusRecType ( + Address(30 - 1 downto 0), + DataToModel(AXI_DATA_WIDTH - 1 downto 0), + DataFromModel(AXI_DATA_WIDTH - 1 downto 0) + ); + + signal Clock : std_logic := '1'; + signal Reset : std_logic := '1'; + + signal In_M2S : AXI4_Package_Sized_In.Sized_M2S_VECTOR(0 to PORTS - 1); + signal In_S2M : AXI4_Package_Sized_In.Sized_S2M_VECTOR(0 to PORTS - 1); + signal Out_M2S : AXI4_Package_Sized_Out.Sized_M2S; + signal Out_S2M : AXI4_Package_Sized_Out.Sized_S2M; +begin + + Reset_Clock_blk : block + begin + Osvvm.ClockResetPkg.CreateClock ( + Clk => Clock, + Period => to_time(CLOCK_FREQ) + ); + + Osvvm.ClockResetPkg.CreateReset ( + Reset => Reset, + ResetActive => '1', + Clk => Clock, + Period => 200 ns, + tpd => 1 ns + ); + end block; + + Manager_gen : for i in 0 to PORTS - 1 generate + signal AxiBus : Axi4RecType( + WriteAddress( + Addr(AXI_ADDR_WIDTH - 1 downto 0), + ID(2 downto 0), + User(0 downto 0) + ), + WriteData ( + Data(AXI_DATA_WIDTH - 1 downto 0), + Strb(AXI_STRB_WIDTH - 1 downto 0), + User(0 downto 0), + ID(2 downto 0) + ), + WriteResponse( + ID(2 downto 0), + User(0 downto 0) + ), + ReadAddress ( + Addr(AXI_ADDR_WIDTH - 1 downto 0), + ID(2 downto 0), + User(0 downto 0) + ), + ReadData ( + Data(AXI_DATA_WIDTH - 1 downto 0), + ID(2 downto 0), + User(0 downto 0) + ) + ); + begin + Manager : Axi4Manager + generic map( + MODEL_ID_NAME => "Manager_" & to_string(i), + tperiod_Clk => to_time(CLOCK_FREQ), + DEFAULT_DELAY => 1 ns + ) + port map + ( + -- Globals + Clk => Clock, + nReset => not Reset, + + -- AXI Manager Functional Interface + AxiBus => AxiBus, + + -- Testbench Transaction Interface + TransRec => AXI4_Manager_Transaction(i) + ); + + to_PoC_AXI4_Bus_Master(In_M2S(i), In_S2M(i), AxiBus); + + end generate; + + TestControl_inst : TestControl + generic map( + AXI_ADDR_WIDTH => AXI_ADDR_WIDTH, + AXI_DATA_WIDTH => AXI_DATA_WIDTH + ) + port map + ( + Clock => Clock, + Reset => Reset, + + AXI4_Manager_Transaction => AXI4_Manager_Transaction, + AXI4_Subordinate_Transaction => AXI4_Subordinate_Transaction + ); + + Subordinate_blk : block + + signal AxiBus : Axi4RecType( + WriteAddress( + Addr(AXI_ADDR_WIDTH - 1 downto 0), + ID(3 downto 0), + User(0 downto 0) + ), + WriteData ( + Data(AXI_DATA_WIDTH - 1 downto 0), + Strb(AXI_STRB_WIDTH - 1 downto 0), + User(0 downto 0), + ID(3 downto 0) + ), + WriteResponse( + ID(3 downto 0), + User(0 downto 0) + ), + ReadAddress ( + Addr(AXI_ADDR_WIDTH - 1 downto 0), + ID(3 downto 0), + User(0 downto 0) + ), + ReadData ( + Data(AXI_DATA_WIDTH - 1 downto 0), + ID(3 downto 0), + User(0 downto 0) + ) + ); + begin + Subordinate : Axi4Subordinate + generic map( + tperiod_Clk => to_time(CLOCK_FREQ), + DEFAULT_DELAY => 1 ns + ) + port map + ( + -- Globals + Clk => Clock, + nReset => not Reset, + AxiBus => AxiBus, + TransRec => AXI4_Subordinate_Transaction + ); + + to_PoC_AXI4_Bus_Slave(Out_M2S, Out_S2M, AxiBus); + end block; + + + DUT : entity PoC.axi4_Mux + generic map( + PIPELINE_IN => (In_M2S'range => 0), + PIPELINE_OUT => 0, + NUM_OUTSTANDING_READS => TRANSACTIONS, + NUM_OUTSTANDING_WRITES => TRANSACTIONS + ) + port map + ( + Clock => Clock, + Reset => Reset, + In_M2S => In_M2S, + In_S2M => In_S2M, + Out_M2S => Out_M2S, + Out_S2M => Out_S2M + ); + + + +end architecture; diff --git a/tb/bus/axi4/RunAllTests.pro b/tb/bus/axi4/RunAllTests.pro index 9acadf52a..edfb539df 100644 --- a/tb/bus/axi4/RunAllTests.pro +++ b/tb/bus/axi4/RunAllTests.pro @@ -22,17 +22,5 @@ # limitations under the License. # ============================================================================= -# TestSuite PoC.bus.axi4 -# Deactivated to avoid failure on non-existing testcases - -library tb_axi4 - -include ./AXI4Lite/RunAllTests.pro - -#include ./AXI4Stream/Buffer/RunAllTests.pro -#include ./AXI4Stream/Buffer_CDC/RunAllTests.pro -#include ./AXI4Stream/DeMux/RunAllTests.pro -#include ./AXI4Stream/Delay/RunAllTests.pro -#include ./AXI4Stream/Splitter/RunAllTests.pro -#include ./AXI4Stream/DestHandler/RunAllTests.pro -#include ./AXI4Stream/Realign/RunAllTests.pro +include ./DeMux/RunAllTests.pro +include ./Mux/RunAllTests.pro diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/RunAllTests.pro b/tb/bus/axi4lite/Demux/RunAllTests.pro similarity index 74% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/RunAllTests.pro rename to tb/bus/axi4lite/Demux/RunAllTests.pro index a28a9dc47..b5650deda 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/RunAllTests.pro +++ b/tb/bus/axi4lite/Demux/RunAllTests.pro @@ -1,7 +1,6 @@ # ============================================================================= # Authors: # Iqbal Asif (PLC2 Design GmbH) -# Patrick Lehmann (PLC2 Design GmbH) # # License: # ============================================================================= @@ -11,7 +10,7 @@ # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, @@ -20,12 +19,12 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.bus.axi4.axi4lite.OCRAM_Adapter +TestSuite PoC.bus.axi4lite.DeMux -library tb_axi4lite_OCRAMAdapter +library tb_axi4lite_DeMux -analyze AXI4Lite_OCRAM_Adapter_TestController.vhdl -analyze AXI4Lite_OCRAM_Adapter_TestHarness.vhdl +analyze axi4lite_Demux_TestController.vhdl +analyze axi4lite_Demux_TestHarness.vhdl -RunTest TC_AsyncReadWrite.vhdl RunTest TC_SimpleReadWrite.vhdl +RunTest TC_SimpleReadWrite_02.vhdl diff --git a/tb/bus/axi4lite/Demux/TC_SimpleReadWrite.tcl b/tb/bus/axi4lite/Demux/TC_SimpleReadWrite.tcl new file mode 100644 index 000000000..42ed781cb --- /dev/null +++ b/tb/bus/axi4lite/Demux/TC_SimpleReadWrite.tcl @@ -0,0 +1,2 @@ + +log /axi4lite_Demux_TestHarness/DUT_blk/axi4lite_Demux_Int_DUT/* diff --git a/tb/bus/axi4lite/Demux/TC_SimpleReadWrite.vhdl b/tb/bus/axi4lite/Demux/TC_SimpleReadWrite.vhdl new file mode 100644 index 000000000..b4ba7e8ac --- /dev/null +++ b/tb/bus/axi4lite/Demux/TC_SimpleReadWrite.vhdl @@ -0,0 +1,154 @@ +-- ============================================================================= +-- Authors: +-- Iqbal Asif (PLC2 Design GmbH) +-- Patrick Lehmann (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +architecture SimpleReadWrite of axi4lite_Demux_TestController is + signal TestDone : integer_barrier := 1; + +begin + + ------------------------------------------------------------ + -- ControlProc + -- Set up AlertLog and wait for end of test + ------------------------------------------------------------ + ControlProc : process + constant TestName : string := "TC_SimpleReadWrite"; + begin + -- Initialization of test + SetTestName(TestName); + TranscriptOpen; + SetTranscriptMirror(TRUE); + + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, TRUE); -- Enable INFO logs + + -- Wait for testbench initialization + + -- Wait for Design Reset + wait until Reset = '0' ; + ClearAlerts ; + + -- Wait for test to finish + WaitForBarrier(TestDone) ; + AlertIf(now >= 10 ms, "Test finished due to timeout") ; +-- AlertIf(GetAffirmCount < 100, "Test is not Self-Checking"); + + wait for 1 us; + + EndOfTestReports(ReportAll => TRUE); + TranscriptClose; + std.env.stop; + wait; + end process ControlProc ; + + ------------------------------------------------------------ + -- ManagerProc + -- Generate transactions for AxiMaster + ------------------------------------------------------------ + ManagerProc : process + variable Address : std_logic_vector(AXI_ADDR_WIDTH-1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); + + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0' ; + WaitForClock(ManagerRec, 2); + + for i in 0 to 10 loop + log("Write ManagerRec First AXI4Lite") ; + Write(ManagerRec, 32x"0000", 32x"F" ); + + log("Write ManagerRec Second AXI4Lite") ; + Write(ManagerRec, 32x"4000", 32x"F" ); + Read(ManagerRec, 32x"0000", Data) ; + Read(ManagerRec, 32x"4000", Data) ; + end loop; + WaitForClock(ManagerRec, 2); + + wait for 100 ns; + WaitForBarrier(TestDone) ; + wait; + end process ManagerProc ; + + ------------------------------------------------------------ + -- ResponderProc_01 + -- Generate transactions for AxiMaster + ------------------------------------------------------------ + ResponderProc_01 : process + variable Address : std_logic_vector(AXI_ADDR_WIDTH-1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); + + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0' ; + WaitForClock(SubordinateRec(0), 2) ; + + for i in 0 to 10 loop + GetWrite(SubordinateRec(0), Address, Data) ; + SendRead(SubordinateRec(0), Address, X"1111_1111") ; + end loop; + + wait for 100 ns; + WaitForBarrier(TestDone) ; + wait; + end process ResponderProc_01 ; + + ------------------------------------------------------------ + -- ResponderProc_02 + -- Generate transactions for AxiMaster + ------------------------------------------------------------ + ResponderProc_02 : process + variable Address : std_logic_vector(AXI_ADDR_WIDTH-1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); + + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0' ; + WaitForClock(SubordinateRec(1), 2) ; + + for i in 0 to 10 loop + GetWrite(SubordinateRec(1), Address, Data) ; + SendRead(SubordinateRec(1), Address, X"2222_2222") ; + end loop; + + wait for 100 ns; + WaitForBarrier(TestDone) ; + wait; + end process ResponderProc_02 ; + +end architecture ; + +configuration TC_SimpleReadWrite of axi4lite_Demux_TestHarness is + for sim + for TestCtrl : axi4lite_Demux_TestController + use entity work.axi4lite_Demux_TestController(SimpleReadWrite) ; + end for ; + end for ; +end configuration ; diff --git a/tb/bus/axi4lite/Demux/TC_SimpleReadWrite_02.tcl b/tb/bus/axi4lite/Demux/TC_SimpleReadWrite_02.tcl new file mode 100644 index 000000000..42ed781cb --- /dev/null +++ b/tb/bus/axi4lite/Demux/TC_SimpleReadWrite_02.tcl @@ -0,0 +1,2 @@ + +log /axi4lite_Demux_TestHarness/DUT_blk/axi4lite_Demux_Int_DUT/* diff --git a/tb/bus/axi4lite/Demux/TC_SimpleReadWrite_02.vhdl b/tb/bus/axi4lite/Demux/TC_SimpleReadWrite_02.vhdl new file mode 100644 index 000000000..ef74d92d2 --- /dev/null +++ b/tb/bus/axi4lite/Demux/TC_SimpleReadWrite_02.vhdl @@ -0,0 +1,155 @@ +-- ============================================================================= +-- Authors: +-- Iqbal Asif (PLC2 Design GmbH) +-- Patrick Lehmann (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library PoC; +use PoC.config.all; +use PoC.vectors.all; +use PoC.strings.all; +use PoC.utils.all; + + +architecture SimpleReadWrite_02 of axi4lite_Demux_TestController is + signal TestDone : integer_barrier := 1; + +begin + + ------------------------------------------------------------ + -- ControlProc + -- Set up AlertLog and wait for end of test + ------------------------------------------------------------ + ControlProc : process + constant TestName : string := "TC_SimpleReadWrite_02"; + begin + -- Initialization of test + SetTestName(TestName); + TranscriptOpen; + SetTranscriptMirror(TRUE); + + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, TRUE); -- Enable INFO logs + + -- Wait for testbench initialization + + -- Wait for Design Reset + wait until Reset = '0' ; + ClearAlerts ; + + -- Wait for test to finish + WaitForBarrier(TestDone) ; + AlertIf(now >= 10 ms, "Test finished due to timeout") ; +-- AlertIf(GetAffirmCount < 100, "Test is not Self-Checking"); + + wait for 1 us; + + EndOfTestReports(ReportAll => TRUE); + TranscriptClose; + std.env.stop; + wait; + end process ControlProc ; + + ------------------------------------------------------------ + -- ManagerProc + -- Generate transactions for AxiMaster + ------------------------------------------------------------ + ManagerProc : process + variable Address : std_logic_vector(AXI_ADDR_WIDTH-1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); + + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0' ; + WaitForClock(ManagerRec, 2); + + Write(ManagerRec, 32x"0000", 64x"F" ); + WaitForClock(ManagerRec, 2); + + for i in 0 to 63 loop + Address(31 downto 0) := to_slv(to_unsigned(i + 64, 24)) & 8X"10"; + Data := to_slv(to_unsigned(2048,AXI_DATA_WIDTH)); + Write(ManagerRec, Address, Data); + end loop; + + wait for 100 ns; + WaitForBarrier(TestDone) ; + wait; + end process ManagerProc ; + + ------------------------------------------------------------ + -- ResponderProc_01 + -- Generate transactions for AxiMaster + ------------------------------------------------------------ + ResponderProc_01 : process + variable Address : std_logic_vector(AXI_ADDR_WIDTH-1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); + + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0' ; + WaitForClock(SubordinateRec(0), 2); + GetWrite(SubordinateRec(0), Address, Data) ; + + wait for 100 ns; + WaitForBarrier(TestDone) ; + wait; + end process ResponderProc_01 ; + + ------------------------------------------------------------ + -- ResponderProc_02 + -- Generate transactions for AxiMaster + ------------------------------------------------------------ + ResponderProc_02 : process + variable Address : std_logic_vector(AXI_ADDR_WIDTH-1 downto 0); + variable Data : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); + + begin + ------------------------------------- + -- Normal Rread and Wirte + ------------------------------------- + wait until Reset = '0' ; + + for i in 0 to 63 loop + WaitForClock(SubordinateRec(1), 2); + -- Write and Read with ByteAddr = 0, 4 Bytes + GetWrite(SubordinateRec(1), Address, Data) ; + end loop; + + wait for 100 ns; + WaitForBarrier(TestDone) ; + wait; + end process ResponderProc_02 ; + +end architecture ; + +configuration TC_SimpleReadWrite_02 of axi4lite_Demux_TestHarness is + for sim + for TestCtrl : axi4lite_Demux_TestController + use entity work.axi4lite_Demux_TestController(SimpleReadWrite_02) ; + end for ; + end for ; +end configuration ; diff --git a/tb/bus/axi4lite/Demux/axi4lite_Demux_TestController.vhdl b/tb/bus/axi4lite/Demux/axi4lite_Demux_TestController.vhdl new file mode 100644 index 000000000..3881f0ee9 --- /dev/null +++ b/tb/bus/axi4lite/Demux/axi4lite_Demux_TestController.vhdl @@ -0,0 +1,47 @@ +-- ============================================================================= +-- Authors: +-- Iqbal Asif (PLC2 Design GmbH) +-- Patrick Lehmann (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE ; +use IEEE.std_logic_1164.all ; +use IEEE.numeric_std.all ; +use IEEE.numeric_std_unsigned.all ; + +library OSVVM ; +context OSVVM.OsvvmContext ; + +library osvvm_Axi4; +context osvvm_Axi4.Axi4LiteContext ; + +entity axi4lite_Demux_TestController is + port ( + -- Global Signal Interface + Clock : in std_logic ; + Reset : in std_logic ; + -- Transaction Interfaces + ManagerRec : inout AddressBusRecType; + SubordinateRec : inout AddressBusRecArrayType + ) ; + constant AXI_ADDR_WIDTH : integer := ManagerRec.Address'length ; + constant AXI_DATA_WIDTH : integer := ManagerRec.DataToModel'length ; + constant CHANNELS : positive := SubordinateRec'length; + +end entity; diff --git a/tb/bus/axi4lite/Demux/axi4lite_Demux_TestHarness.vhdl b/tb/bus/axi4lite/Demux/axi4lite_Demux_TestHarness.vhdl new file mode 100644 index 000000000..fbde09dc2 --- /dev/null +++ b/tb/bus/axi4lite/Demux/axi4lite_Demux_TestHarness.vhdl @@ -0,0 +1,204 @@ +-- ============================================================================= +-- Authors: +-- Iqbal Asif (PLC2 Design GmbH) +-- Patrick Lehmann (PLC2 Design GmbH) +-- Stefan Unrein (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.ALL; +use IEEE.numeric_std.ALL; + +library PoC; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.axi4lite.all; +use PoC.axi4lite_OSVVM.all; + +library osvvm; +context osvvm.OsvvmContext ; + +library OSVVM_AXI4; +context OSVVM_AXI4.Axi4LiteContext ; + +entity axi4lite_Demux_TestHarness is +end axi4lite_Demux_TestHarness; + +architecture sim of axi4lite_Demux_TestHarness is + constant DEMUX_CHANNELS : positive := 2; + + constant AXI_ADDR_WIDTH : integer := 32; + constant AXI_DATA_WIDTH : integer := 64; + constant AXI_STRB_WIDTH : integer := AXI_DATA_WIDTH/8 ; + + constant tperiod_Clock : time := 10 ns ; + constant tpd : time := 2 ns ; + + constant BASE_ADDRESS : T_SLUV(0 to 1) := (0 => 32x"0000", 1 => 32x"4000"); + constant BASE_ADDRESS_MASK : T_SLUV(0 to 1) := (0 to 1 => 32x"03FFF"); + constant PIPELINE_OUT : natural_vector(BASE_ADDRESS'range) := (others => 0); + + signal Clock : std_logic := '0'; + signal Reset : std_logic := '1'; + + -- Testbench Transaction Interface + subtype ManagerRec is AddressBusTransactionRecType( + Address((AXI_ADDR_WIDTH)-1 downto 0), + DataToModel((AXI_DATA_WIDTH)-1 downto 0), + DataFromModel((AXI_DATA_WIDTH)-1 downto 0) + ) ; + + signal AxiManagerTransRec : ManagerRec ; + + signal SubordinateRec : AddressBusRecArrayType(0 to DEMUX_CHANNELS -1)( + Address(AXI_ADDR_WIDTH-1 downto 0), + DataToModel(AXI_DATA_WIDTH-1 downto 0), + DataFromModel(AXI_DATA_WIDTH-1 downto 0) + ); + + -- AXI Master Functional Interface + signal In_AxiBus : Axi4LiteRecType( + WriteAddress( Addr(AXI_ADDR_WIDTH-1 downto 0) ), + WriteData ( Data (AXI_DATA_WIDTH-1 downto 0), Strb(AXI_STRB_WIDTH-1 downto 0) ), + ReadAddress ( Addr(AXI_ADDR_WIDTH-1 downto 0) ), + ReadData ( Data (AXI_DATA_WIDTH-1 downto 0) ) + ); + + signal Out_AXI4Lite_M2S : T_AXI4Lite_Bus_M2S_VECTOR(0 to DEMUX_CHANNELS -1)( + AWAddr(AXI_ADDR_WIDTH -1 downto 0), WData(AXI_DATA_WIDTH -1 downto 0), + WStrb((AXI_DATA_WIDTH /8) -1 downto 0), ARAddr(AXI_ADDR_WIDTH -1 downto 0)); + signal Out_AXI4Lite_S2M : T_AXI4Lite_Bus_S2M_VECTOR(0 to DEMUX_CHANNELS -1)(RData(AXI_DATA_WIDTH -1 downto 0)); + + signal In_AXI4Lite_M2S : Out_AXI4Lite_M2S'element; + signal In_AXI4Lite_S2M : Out_AXI4Lite_S2M'element; + + component axi4lite_Demux_TestController is + port ( + -- Global Signal Interface + Clock : in std_logic ; + Reset : in std_logic ; + -- Transaction Interfaces + ManagerRec : inout AddressBusRecType; + SubordinateRec : inout AddressBusRecArrayType + ) ; + end component; + +begin + + -- create Clock for TB and 100 Mhz + Osvvm.ClockResetPkg.CreateClock ( + Clk => Clock, + Period => Tperiod_Clock + ) ; + + -- create Reset + Osvvm.ClockResetPkg.CreateReset ( + Reset => Reset, + ResetActive => '1', + Clk => Clock, + Period => 7 * tperiod_Clock, + tpd => tpd + ) ; + + ------------------------------------------------ + -- osvvm axi4 manager interface + ------------------------------------------------ + AXI4_Config : entity OSVVM_AXI4.axi4liteManager + generic map ( + tperiod_Clk => 5 ns, + tpd_Clk_AWValid => 0 ns, + tpd_Clk_AWProt => 0 ns, + tpd_Clk_AWAddr => 0 ns, + tpd_Clk_WValid => 0 ns, + tpd_Clk_WData => 0 ns, + tpd_Clk_WStrb => 0 ns, + tpd_Clk_BReady => 0 ns, + tpd_Clk_ARValid => 0 ns, + tpd_Clk_ARProt => 0 ns, + tpd_Clk_ARAddr => 0 ns, + tpd_Clk_RReady => 0 ns + ) + port map ( + Clk => Clock, + nReset => not Reset, + + TransRec => AxiManagerTransRec, -- Testbench Transaction Interface + AxiBus => In_AxiBus -- AXI Master Functional Interface + ); + to_PoC_AXI4Lite_Bus_Master(In_AXI4Lite_M2S, In_AXI4Lite_S2M, In_AxiBus); + + + --------------------------------------------------------- + -- osvvm axi4 subordinate interface + --------------------------------------------------------- + genSubordinate: for i in 0 to DEMUX_CHANNELS - 1 generate + + signal Out_AxiBus : Axi4LiteRecType( + WriteAddress( Addr(AXI_ADDR_WIDTH-1 downto 0) ), + WriteData ( Data (AXI_DATA_WIDTH-1 downto 0), Strb(AXI_STRB_WIDTH-1 downto 0) ), + ReadAddress ( Addr(AXI_ADDR_WIDTH-1 downto 0) ), + ReadData ( Data (AXI_DATA_WIDTH-1 downto 0) ) + ); + begin + Subordinate : entity OSVVM_AXI4.Axi4LiteSubordinate + generic map ( + tperiod_Clk => 5 ns, + DEFAULT_DELAY => 0 ns + ) + port map ( + Clk => Clock, + nReset => not Reset, + + AxiBus => Out_AxiBus, + TransRec => SubordinateRec(i) + ) ; + to_PoC_AXI4Lite_Bus_Slave(Out_AXI4Lite_M2S(i), Out_AXI4Lite_S2M(i), Out_AxiBus); + end generate; + + TestCtrl : axi4lite_Demux_TestController + port map( + Clock => Clock, + Reset => Reset, + + ManagerRec => AxiManagerTransRec, + SubordinateRec => SubordinateRec + ); + + --------------------------------------------------------- + -- axi4 demux interface + --------------------------------------------------------- + axi4lite_Demux_Int_DUT : entity PoC.axi4lite_DeMux + generic map ( + BASE_ADDRESS => BASE_ADDRESS, + BASE_ADDRESS_MASK => BASE_ADDRESS_MASK, + PIPELINE_OUT => PIPELINE_OUT + ) + port map ( + -- AXI4lite slave interface + Clock => Clock, + Reset => Reset, + + In_M2S => In_AXI4Lite_M2S, + In_S2M => In_AXI4Lite_S2M, + + Out_M2S => Out_AXI4Lite_M2S, + Out_S2M => Out_AXI4Lite_S2M + ); + +end architecture; diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/RunAllTests.pro b/tb/bus/axi4lite/HighResolutionClock/RunAllTests.pro similarity index 95% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/RunAllTests.pro rename to tb/bus/axi4lite/HighResolutionClock/RunAllTests.pro index f38b4003a..734a10f64 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/RunAllTests.pro +++ b/tb/bus/axi4lite/HighResolutionClock/RunAllTests.pro @@ -19,7 +19,7 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.bus.axi4.axi4lite.HighResolutionClock +TestSuite PoC.bus.axi4lite.HighResolutionClock library tb_axi4lite_HighResolutionClock diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_correction.tcl b/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_correction.tcl similarity index 100% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_correction.tcl rename to tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_correction.tcl diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_correction.vhdl b/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_correction.vhdl similarity index 97% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_correction.vhdl rename to tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_correction.vhdl index 6f65ef6b7..3c8bd880b 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_correction.vhdl +++ b/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_correction.vhdl @@ -12,7 +12,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -67,7 +67,7 @@ begin procedure CheckCorrection ( signal manager : inout AddressBusRecType; - constant config : in std_logic_vector(1 downto 0); + constant config : in std_logic_vector(1 downto 0); constant correction_threshold : natural; constant correction_time : time ) is diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_load_times.tcl b/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_load_times.tcl similarity index 100% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_load_times.tcl rename to tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_load_times.tcl diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_load_times.vhdl b/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_load_times.vhdl similarity index 87% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_load_times.vhdl rename to tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_load_times.vhdl index 80ae29928..0dbb7a5e9 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_load_times.vhdl +++ b/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_load_times.vhdl @@ -12,7 +12,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -53,7 +53,7 @@ begin -- Generate transaction for AXI manager ManagerProc : process - variable ReadData : AXIDataType; + variable ReadData : AXIDataType := (others => '0'); variable comp_time : time := 200 ns; variable comp_time_val : natural := 200; @@ -65,22 +65,22 @@ begin -- each Write need 8 CC until the value is available in the register. Therefore the updated value will be: -- Nanoseconds_updated_min + 4 * 8 but it can differ depending on other operations in the network (in a real scenario with more op.) variable Datetime_to_load : T_CLOCK_DATETIME := ( - secondsResolution => to_unsigned(0, 32), - seconds => to_unsigned(42, 6), - minutes => to_unsigned(7, 6), - hours => to_unsigned(16, 5), - day => to_unsigned(13, 5), - month => to_unsigned(1, 4), + secondsResolution => to_unsigned(0, 32), + seconds => to_unsigned(42, 6), + minutes => to_unsigned(7, 6), + hours => to_unsigned(16, 5), + day => to_unsigned(13, 5), + month => to_unsigned(1, 4), year => to_unsigned(2025, 13) ); variable Datetime_to_load_slv : std_logic_vector(63 downto 0) := datetime_to_slv(Datetime_to_load); - + procedure LoadNanoseconds ( signal manager : inout AddressBusRecType; constant Nanoseconds_to_load : natural; constant waitTime : time - ) is - variable ReadData : AXIDataType; + ) is + variable ReadData : AXIDataType := (others => '0'); variable ns_value_slv : std_logic_vector(63 downto 0) := to_slv(Nanoseconds_to_load, 64); variable time_now_a : time; variable time_now_b : time; @@ -111,7 +111,7 @@ begin AffirmIfEqual(time_ns_delta, time_ns_b_l); ReadCheck(AXI_Manager, Reg_Nanoseconds_upper, std_logic_vector(ns_value_slv(63 downto 32))); -- value should not have changed end procedure; - + procedure LoadDatetime ( signal manager : inout AddressBusRecType; constant s : natural; -- second @@ -122,14 +122,14 @@ begin constant y : natural; -- year constant waitTime : time ) is - variable ReadData : AXIDataType; + variable ReadData : AXIDataType := (others => '0'); variable Datetime_to_load : T_CLOCK_DATETIME := ( secondsResolution => to_unsigned(0, 32), -- gets written to different register - seconds => to_unsigned(s, 6), - minutes => to_unsigned(m, 6), - hours => to_unsigned(h, 5), - day => to_unsigned(d, 5), - month => to_unsigned(mo, 4), + seconds => to_unsigned(s, 6), + minutes => to_unsigned(m, 6), + hours => to_unsigned(h, 5), + day => to_unsigned(d, 5), + month => to_unsigned(mo, 4), year => to_unsigned(y, 13) ); variable Datetime_to_load_slv : std_logic_vector(63 downto 0) := datetime_to_slv(Datetime_to_load); diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_tb_pkg.vhdl b/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_tb_pkg.vhdl similarity index 97% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_tb_pkg.vhdl rename to tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_tb_pkg.vhdl index 6ab45c95f..915a8d337 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_tb_pkg.vhdl +++ b/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_tb_pkg.vhdl @@ -12,7 +12,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_tc.vhdl b/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_tc.vhdl similarity index 88% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_tc.vhdl rename to tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_tc.vhdl index d95290f3a..0a8fc528c 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_tc.vhdl +++ b/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_tc.vhdl @@ -12,7 +12,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,7 +26,7 @@ use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; library PoC; -use PoC.AXI4Lite_OSVVM.all; +use PoC.axi4lite_OSVVM.all; use PoC.utils.all; use PoC.physical.all; use PoC.vectors.all; @@ -35,13 +35,13 @@ use PoC.uart.all; use PoC.math.all; use PoC.clock.all; -library OSVVM; +library OSVVM; context OSVVM.OsvvmContext; - + library osvvm_Axi4; context osvvm_Axi4.Axi4LiteContext; -use work.axi4Lite_HighResolutionClock_tb_pkg.all; +use work.axi4lite_HighResolutionClock_tb_pkg.all; entity axi4lite_HighResolutionClock_tc is @@ -50,7 +50,7 @@ entity axi4lite_HighResolutionClock_tc is INCREMENT_FULL : natural ); port ( - Reset : in std_logic; + Reset : in std_logic; AXI_Manager : inout AddressBusRecType ); end entity; diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_th.vhdl b/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_th.vhdl similarity index 95% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_th.vhdl rename to tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_th.vhdl index 648ac690b..13f9ae895 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_HighResolutionClock/axi4lite_HighResolutionClock_th.vhdl +++ b/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_th.vhdl @@ -12,7 +12,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,7 +26,7 @@ use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; library PoC; -use PoC.AXI4Lite_OSVVM.all; +use PoC.axi4lite_OSVVM.all; use PoC.utils.all; use PoC.physical.all; use PoC.vectors.all; @@ -93,14 +93,14 @@ architecture TestHarness of axi4lite_HighResolutionClock_th is ReadAddress (Addr(AXI_ADDR_WIDTH - 1 downto 0)), ReadData (Data(AXI_DATA_WIDTH - 1 downto 0)) ); - + component axi4Lite_HighResolutionClock_tc generic ( CLOCK_FREQ : FREQ; INCREMENT_FULL : natural ); port ( - Reset : in std_logic; + Reset : in std_logic; AXI_Manager : inout AddressBusRecType ); end component; @@ -137,7 +137,7 @@ begin -- AXI manager physical interface AxiBus => AxiLiteBus ); - + -- mapping between PoC and OSVVM AXI bus types to_PoC_AXI4Lite_Bus_Master(AXI_m2s, AXI_s2m, AxiLiteBus); @@ -155,16 +155,16 @@ begin Clock => Clock, Reset => Reset, - AXI_clock => AXI_clock, - AXI_reset => AXI_reset, + AXI4Lite_Clock => AXI_clock, + AXI4Lite_Reset => AXI_reset, - AXI_m2s => AXI_m2s, - AXI_s2m => AXI_s2m, + AXI4Lite_m2s => AXI_m2s, + AXI4Lite_s2m => AXI_s2m, Nanoseconds => Nanoseconds, Datetime => Datetime ); - + TestCtrl: component axi4lite_HighResolutionClock_tc generic map ( CLOCK_FREQ => CLOCK_FREQ, @@ -174,5 +174,5 @@ begin Reset => Reset, AXI_Manager => AXI_Manager ); - + end architecture; diff --git a/tb/bus/axi4lite/OCRAM_Adapter/RunAllTests.pro b/tb/bus/axi4lite/OCRAM_Adapter/RunAllTests.pro new file mode 100644 index 000000000..c84d78c03 --- /dev/null +++ b/tb/bus/axi4lite/OCRAM_Adapter/RunAllTests.pro @@ -0,0 +1,38 @@ +# ============================================================================= +# Authors: +# Iqbal Asif (PLC2 Design GmbH) +# Patrick Lehmann (PLC2 Design GmbH) +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +TestSuite PoC.bus.axi4lite.OCRAM_Adapter + +library tb_axi4lite_OCRAMAdapter + +analyze axi4lite_OCRAM_Adapter_TestController.vhdl +analyze axi4lite_OCRAM_Adapter_TestHarness.vhdl + +if {$::osvvm::ToolName in {GHDL}} { + SkipTest TC_InitMemory.vhdl "Skip GHDL because llvm backend does not support external name required for this test." + SkipTest TC_AsyncReadWrite.vhdl "Skip GHDL because llvm backend does not support external name required for this test." + SkipTest TC_SimpleReadWrite.vhdl "Skip GHDL because llvm backend does not support external name required for this test." +} else { + RunTest TC_InitMemory.vhdl [generic USE_INIT_FILE TRUE] + RunTest TC_AsyncReadWrite.vhdl + RunTest TC_SimpleReadWrite.vhdl +} diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/TC_AsyncReadWrite.vhdl b/tb/bus/axi4lite/OCRAM_Adapter/TC_AsyncReadWrite.vhdl similarity index 79% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/TC_AsyncReadWrite.vhdl rename to tb/bus/axi4lite/OCRAM_Adapter/TC_AsyncReadWrite.vhdl index fd3a827ed..01d7520f3 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/TC_AsyncReadWrite.vhdl +++ b/tb/bus/axi4lite/OCRAM_Adapter/TC_AsyncReadWrite.vhdl @@ -11,7 +11,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -20,9 +20,7 @@ -- limitations under the License. -- ============================================================================= -architecture AsyncReadWrite of AXI4Lite_OCRAM_Adapter_TestController is - signal TestDone : integer_barrier := 1; - +architecture AsyncReadWrite of axi4lite_OCRAM_Adapter_TestController is begin ------------------------------------------------------------ @@ -30,11 +28,10 @@ begin -- Set up AlertLog and wait for end of test ------------------------------------------------------------ ControlProc : process - constant TestName : string := "TC_AsyncReadWrite"; - constant TIMEOUT : time := 30 ms; + constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); begin -- Initialization of test - SetAlertLogName(TestName) ; + SetAlertLogName("TC_AsyncReadWrite") ; -- SetLogEnable(PASSED, TRUE) ; -- Enable PASSED logs -- SetLogEnable(INFO, TRUE) ; -- Enable INFO logs @@ -50,36 +47,23 @@ begin EndOfTestReports(ReportAll => TRUE, Timeout => now >= TIMEOUT); std.env.finish; wait; - end process ControlProc ; + end process; ------------------------------------------------------------ -- MasterProc -- Generate transactions for AxiMaster ------------------------------------------------------------ - MasterProc : process - variable Address : std_logic_vector(AXI_ADDR_WIDTH-1 downto 0); - variable Data : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); - variable ReadData : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); - + MasterProc : process + constant ProcID : AlertLogIDType := NewID("MasterProc", TCID); begin - ------------------------------------- - -- Normal Read and Write ------------------------------------- wait until Reset = '0' ; - WaitForClock(MasterRec, 2); - Write(MasterRec, 32x"04", 32x"F" ); WaitForClock(MasterRec, 2); Write(MasterRec, 32x"08", 32x"FF" ); WaitForClock(MasterRec, 2); - Write(MasterRec, 32x"14", 32x"AFAF" ); - WaitForClock(MasterRec, 2); - - Read(MasterRec, 32x"14", ReadData ); - WaitForClock(MasterRec, 2) ; - ------------------------------------- -- Async. Write ------------------------------------- @@ -138,14 +122,14 @@ begin wait for 200 ns; WaitForBarrier(TestDone) ; wait; - end process MasterProc ; + end process; end architecture; -configuration TC_AsyncReadWrite of AXI4Lite_Ocram_Adapter_TestHarness is +configuration TC_AsyncReadWrite of axi4lite_Ocram_Adapter_TestHarness is for sim - for TestCtrl : AXI4Lite_Ocram_Adapter_TestController - use entity work.AXI4Lite_Ocram_Adapter_TestController(AsyncReadWrite) ; + for TestCtrl : axi4lite_Ocram_Adapter_TestController + use entity work.axi4lite_Ocram_Adapter_TestController(AsyncReadWrite) ; end for ; end for ; end configuration ; diff --git a/tb/bus/axi4lite/OCRAM_Adapter/TC_InitMemory.vhdl b/tb/bus/axi4lite/OCRAM_Adapter/TC_InitMemory.vhdl new file mode 100644 index 000000000..1322a76cb --- /dev/null +++ b/tb/bus/axi4lite/OCRAM_Adapter/TC_InitMemory.vhdl @@ -0,0 +1,112 @@ +-- ============================================================================= +-- Authors: +-- Adrian Weiland (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +architecture InitMemory of axi4lite_OCRAM_Adapter_TestController is +begin + ControlProc : process + constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); + begin + -- Initialization of test + SetAlertLogName("TC_InitMemory") ; + SetLogEnable(PASSED, TRUE); + SetLogEnable(INFO, TRUE); + SetLogEnable(DEBUG, TRUE); + + -- Wait for testbench initialization + wait for 0 ns ; + SetTranscriptMirror(TRUE) ; + + -- Wait for Design Reset + wait until Reset = '0' ; + ClearAlerts ; + + WaitForBarrier(TestDone, TIMEOUT); + EndOfTestReports(ReportAll => TRUE, Timeout => now >= TIMEOUT); + std.env.finish; + wait; + end process; + + MasterProc : process + constant ProcID : AlertLogIDType := NewID("MasterProc", TCID); + + constant NUM_ITERATIONS : positive := 1000; + + constant MEMORY_SIZE : positive := 2**OCRAM_ADDRESS_BITS; + constant NUM_INCREMENT_LINES : positive := 16; + constant NUM_DEADBEEF_LINES : positive := 4; + + variable CheckPattern : std_logic_vector(OCRAM_DATA_BITS - 1 downto 0); + variable ReadData : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); + variable addr_mem_i : natural; + variable addr : unsigned(31 downto 0); + variable data : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0); + variable RV : RandomPType; + begin + wait until Reset = '0' ; + WaitForClock(MasterRec, 2); + + -- Read from preloaded memory through transaction record and external name + addr := (others => '0'); + for i in 0 to MEMORY_SIZE - 1 loop + if i < NUM_INCREMENT_LINES then -- Incremental lines + CheckPattern := std_logic_vector(resize(to_unsigned(i, OCRAM_DATA_BITS) * x"01010101", OCRAM_DATA_BITS)); + elsif i < NUM_INCREMENT_LINES + NUM_DEADBEEF_LINES then -- DEADBEEF lines + CheckPattern := 32x"DEADBEEF"; + else + CheckPattern := 32x"0"; -- Zero lines + end if; + + AffirmIfEqual(ProcID, ram(i), CheckPattern); -- external name + ReadCheck(MasterRec, std_logic_vector(addr), CheckPattern); -- transaction record + addr := addr + 4; + end loop; + + -- Write through record, read via ext. name + for i in 0 to NUM_ITERATIONS - 1 loop + addr_mem_i := RV.RandInt(0, MEMORY_SIZE - 1); + addr := to_unsigned(addr_mem_i * 4, addr'length); + data := RV.RandSlv(AXI_DATA_WIDTH); + Write(MasterRec, std_logic_vector(addr), data); + AffirmIfEqual(ProcID, ram(addr_mem_i), data); + end loop; + + -- Write through ext. name, read via record + for i in 0 to NUM_ITERATIONS - 1 loop + addr_mem_i := RV.RandInt(0, MEMORY_SIZE - 1); + addr := to_unsigned(addr_mem_i * 4, addr'length); + data := RV.RandSlv(AXI_DATA_WIDTH); + ram(addr_mem_i) <= force data; -- forced to avoid 'X' because of multiple drivers + ReadCheck(MasterRec, std_logic_vector(addr), data); + end loop; + + wait for 100 ns; + WaitForBarrier(TestDone) ; + wait; + end process; +end architecture; + +configuration TC_InitMemory of axi4lite_Ocram_Adapter_TestHarness is + for sim + for TestCtrl : axi4lite_Ocram_Adapter_TestController + use entity work.axi4lite_Ocram_Adapter_TestController(InitMemory); + end for; + end for; +end configuration; diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/TC_SimpleReadWrite.vhdl b/tb/bus/axi4lite/OCRAM_Adapter/TC_SimpleReadWrite.vhdl similarity index 74% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/TC_SimpleReadWrite.vhdl rename to tb/bus/axi4lite/OCRAM_Adapter/TC_SimpleReadWrite.vhdl index 95a68529d..eac130af6 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/TC_SimpleReadWrite.vhdl +++ b/tb/bus/axi4lite/OCRAM_Adapter/TC_SimpleReadWrite.vhdl @@ -11,7 +11,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -20,9 +20,7 @@ -- limitations under the License. -- ============================================================================= -architecture SimpleReadWrite of AXI4Lite_OCRAM_Adapter_TestController is - signal TestDone : integer_barrier := 1; - +architecture SimpleReadWrite of axi4lite_OCRAM_Adapter_TestController is begin ------------------------------------------------------------ @@ -30,11 +28,10 @@ begin -- Set up AlertLog and wait for end of test ------------------------------------------------------------ ControlProc : process - constant TestName : string := "TC_SimpleReadWrite"; - constant TIMEOUT : time := 30 ms; + constant ProcID : AlertLogIDType := NewID("ControlProc", TCID); begin -- Initialization of test - SetAlertLogName(TestName) ; + SetAlertLogName("TC_SimpleReadWrite") ; -- SetLogEnable(PASSED, TRUE) ; -- Enable PASSED logs -- SetLogEnable(INFO, TRUE) ; -- Enable INFO logs @@ -50,20 +47,17 @@ begin EndOfTestReports(ReportAll => TRUE, Timeout => now >= TIMEOUT); std.env.finish; wait; - end process ControlProc ; + end process; ------------------------------------------------------------ -- MasterProc -- Generate transactions for AxiMaster ------------------------------------------------------------ - MasterProc : process - variable Address : std_logic_vector(AXI_ADDR_WIDTH-1 downto 0); - variable Data : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); - variable ReadData : std_logic_vector(AXI_DATA_WIDTH-1 downto 0); - + MasterProc : process + constant ProcID : AlertLogIDType := NewID("MasterProc", TCID); begin ------------------------------------- - -- Normal Rread and Wirte + -- Normal Read and Write ------------------------------------- wait until Reset = '0' ; WaitForClock(MasterRec, 2); @@ -77,7 +71,7 @@ begin Write(MasterRec, 32x"14", 32x"AFAF" ); WaitForClock(MasterRec, 2); - Read(MasterRec, 32x"14", ReadData ); + ReadCheck(MasterRec, 32x"14", 32x"AFAF"); WaitForClock(MasterRec, 2) ; wait for 100 ns; @@ -86,10 +80,10 @@ begin end process MasterProc ; end architecture ; -configuration TC_SimpleReadWrite of AXI4Lite_Ocram_Adapter_TestHarness is +configuration TC_SimpleReadWrite of axi4lite_Ocram_Adapter_TestHarness is for sim - for TestCtrl : AXI4Lite_Ocram_Adapter_TestController - use entity work.AXI4Lite_Ocram_Adapter_TestController(SimpleReadWrite) ; + for TestCtrl : axi4lite_Ocram_Adapter_TestController + use entity work.axi4lite_Ocram_Adapter_TestController(SimpleReadWrite) ; end for ; end for ; end configuration ; diff --git a/tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter.hex b/tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter.hex new file mode 100644 index 000000000..bdf12c0d0 --- /dev/null +++ b/tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter.hex @@ -0,0 +1,260 @@ +00000000 +01010101 +02020202 +03030303 +04040404 +05050505 +06060606 +07070707 +08080808 +09090909 +0A0A0A0A +0B0B0B0B +0C0C0C0C +0D0D0D0D +0E0E0E0E +0F0F0F0F +DEADBEEF +DEADBEEF +DEADBEEF +DEADBEEF +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +DEADBEEF +DEADBEEF +DEADBEEF +DEADBEEF diff --git a/tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter_TestController.vhdl b/tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter_TestController.vhdl new file mode 100644 index 000000000..219341120 --- /dev/null +++ b/tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter_TestController.vhdl @@ -0,0 +1,69 @@ +-- ============================================================================= +-- Authors: +-- Iqbal Asif (PLC2 Design GmbH) +-- Patrick Lehmann (PLC2 Design GmbH) +-- Adrian Weiland (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE ; +use IEEE.std_logic_1164.all ; +use IEEE.numeric_std.all ; +use IEEE.numeric_std_unsigned.all ; + +library OSVVM ; +context OSVVM.OsvvmContext ; + +--library osvvm_Axi4; +-- context osvvm_Axi4.Axi4Context ; + +library osvvm_Axi4; +context osvvm_Axi4.Axi4LiteContext ; + +library PoC; +use PoC.vectors.all; + +entity axi4lite_OCRAM_Adapter_TestController is + generic ( + constant OCRAM_ADDRESS_BITS : positive := 8; + constant OCRAM_DATA_BITS : positive := 32 + ); + port ( + -- Global Signal Interface + Clock : in std_logic ; + Reset : in std_logic ; + -- Transaction Interfaces + MasterRec : inout AddressBusRecType + ); + + constant AXI_ADDR_WIDTH : integer := MasterRec.Address'length ; + constant AXI_DATA_WIDTH : integer := MasterRec.DataToModel'length ; + + constant TCID : AlertLogIDType := NewID("TestCtrl"); + constant TIMEOUT : time := 30 ms; + signal TestDone : integer_barrier := 1; + + -- access RAM through external name + --alias DATA_BITS is <>; -- WORKAROUND: NVC 1.20.1 - Size of unconstrained datatype not propagated through ext. name + --alias DEPTH is <>; -- WORKAROUND: NVC 1.20.1 - Size of unconstrained datatype not propagated through ext. name + alias ram is <>; --(0 to DEPTH - 1)(DATA_BITS - 1 downto 0)>>; + +-- Not currently used in the Axi4Lite model - future use for Axi4Lite Burst Emulation modes +-- alias WriteBurstFifo is <> ; +-- alias ReadBurstFifo is <> ; +end entity; diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/AXI4Lite_OCRAM_Adapter_TestHarness.vhdl b/tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter_TestHarness.vhdl similarity index 59% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/AXI4Lite_OCRAM_Adapter_TestHarness.vhdl rename to tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter_TestHarness.vhdl index eda069cc0..50a751379 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_OCRAM_Adapter/AXI4Lite_OCRAM_Adapter_TestHarness.vhdl +++ b/tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter_TestHarness.vhdl @@ -2,6 +2,7 @@ -- Authors: -- Iqbal Asif (PLC2 Design GmbH) -- Patrick Lehmann (PLC2 Design GmbH) +-- Adrian Weiland (PLC2 Design GmbH) -- -- License: -- ============================================================================= @@ -11,7 +12,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -20,14 +21,17 @@ -- limitations under the License. -- ============================================================================= +-- TODO: Create testcase with r/w outside defined address space and check for according error (see https://gitlab.plc2.de/GitHub/PLC2/PoC/-/work_items/59) library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.NUMERIC_STD.ALL; +use IEEE.std_logic_1164.ALL; +use IEEE.numeric_std.ALL; library PoC; +use PoC.local_configuration.all; use PoC.utils.all; -use PoC.axi4.all; use PoC.vectors.all; +use PoC.axi4lite.all; +use PoC.axi4lite_OSVVM.all; library osvvm; context osvvm.OsvvmContext ; @@ -35,14 +39,18 @@ context osvvm.OsvvmContext ; library OSVVM_AXI4; context OSVVM_AXI4.Axi4LiteContext ; -entity AXI4Lite_OCRAM_Adapter_TestHarness is +entity axi4lite_OCRAM_Adapter_TestHarness is + generic ( + constant USE_INIT_FILE : boolean := False; + constant AXI_DATA_BITS : positive := 32 + ); end entity; -architecture sim of AXI4Lite_OCRAM_Adapter_TestHarness is +architecture sim of axi4lite_OCRAM_Adapter_TestHarness is - constant AXI_ADDR_WIDTH : integer := 32 ; - constant AXI_DATA_WIDTH : integer := 32 ; - constant AXI_STRB_WIDTH : integer := AXI_DATA_WIDTH/8 ; + constant AXI_ADDR_WIDTH : integer := 32 ; + constant AXI_DATA_WIDTH : integer := AXI_DATA_BITS ; + constant AXI_STRB_WIDTH : integer := AXI_DATA_WIDTH/8 ; constant OCRAM_ADDRESS_BITS : positive := 8; constant OCRAM_DATA_BITS : positive := 32; constant PREFFERED_READ_ACCESS : boolean := TRUE; @@ -72,25 +80,41 @@ architecture sim of AXI4Lite_OCRAM_Adapter_TestHarness is signal AxiMasterTransRec : MasterTransactionRecType ; -- AXI Master Functional Interface - signal AxiBus : Axi4LiteRecType( - WriteAddress( Addr(AXI_ADDR_WIDTH-1 downto 0) ), - WriteData ( Data (AXI_DATA_WIDTH-1 downto 0), Strb(AXI_STRB_WIDTH-1 downto 0) ), - ReadAddress ( Addr(AXI_ADDR_WIDTH-1 downto 0) ), - ReadData ( Data (AXI_DATA_WIDTH-1 downto 0) ) - ) ; - - component AXI4Lite_OCRAM_Adapter_TestController is + signal AxiBus : Axi4LiteRecType( + WriteAddress( Addr(AXI_ADDR_WIDTH-1 downto 0) ), + WriteData ( Data (AXI_DATA_WIDTH-1 downto 0), Strb(AXI_STRB_WIDTH-1 downto 0) ), + ReadAddress ( Addr(AXI_ADDR_WIDTH-1 downto 0) ), + ReadData ( Data (AXI_DATA_WIDTH-1 downto 0) ) + ) ; + + signal AXI_m2s : T_AXI4Lite_BUS_M2S( + AWAddr(AXI_ADDR_WIDTH - 1 downto 0), + WData(AXI_DATA_WIDTH - 1 downto 0), + WStrb(AXI_STRB_WIDTH-1 downto 0), + ARAddr(AXI_ADDR_WIDTH - 1 downto 0) + ); + signal AXI_s2m : T_AXI4Lite_BUS_S2M( + RData(AXI_DATA_WIDTH - 1 downto 0) + ); + + component axi4lite_OCRAM_Adapter_TestController is + generic ( + constant OCRAM_ADDRESS_BITS : positive := 8; + constant OCRAM_DATA_BITS : positive := 32 + ); port ( -- Global Signal Interface - Clock : in std_logic ; - Reset : in std_logic ; + Clock : in std_logic ; + Reset : in std_logic ; MasterRec : inout AddressBusRecType - ) ; + ); end component; begin + assert AXI_DATA_BITS = 32 or AXI_DATA_BITS = 64 report "Invalid number of AXI_DATA_BITS (" & to_string(AXI_DATA_BITS) & "), expected: 32 or 64" severity failure; + -- create Clock for TB and 100 Mhz Osvvm.ClockResetPkg.CreateClock ( Clk => Clock, @@ -128,11 +152,12 @@ begin TransRec => AxiMasterTransRec, -- Testbench Transaction Interface AxiBus => AxiBus -- AXI Master Functional Interface ) ; + to_PoC_AXI4Lite_Bus_Master(AXI_m2s, AXI_s2m, AxiBus); --------------------------------------------------------------------------- -- axi4_slave_rb_interface --------------------------------------------------------------------------- - AXI4Lite_OCRAM_Adaptar : entity PoC.AXI4Lite_OCRAM_Adapter + axi4lite_OCRAM_Adapter : entity PoC.axi4lite_OCRAM_Adapter generic map ( OCRAM_ADDRESS_BITS => OCRAM_ADDRESS_BITS, OCRAM_DATA_BITS => OCRAM_DATA_BITS, @@ -143,28 +168,8 @@ begin Clock => Clock, Reset => Reset, - AXI4Lite_m2s.AWValid => AxiBus.WriteAddress.Valid, - AXI4Lite_m2s.AWAddr => AxiBus.WriteAddress.Addr, - AXI4Lite_m2s.AWCache => (others => '0'), - AXI4Lite_m2s.AWProt => AxiBus.WriteAddress.Prot, - AXI4Lite_m2s.WValid => AxiBus.WriteData.Valid, - AXI4Lite_m2s.WData => AxiBus.WriteData.Data, - AXI4Lite_m2s.WStrb => AxiBus.WriteData.Strb, - AXI4Lite_m2s.BReady => AxiBus.WriteResponse.Ready, - AXI4Lite_m2s.ARValid => AxiBus.ReadAddress.Valid, - AXI4Lite_m2s.ARAddr => AxiBus.ReadAddress.Addr, - AXI4Lite_m2s.ARCache => (others => '0'), - AXI4Lite_m2s.ARProt => AxiBus.ReadAddress.Prot, - AXI4Lite_m2s.RReady => AxiBus.ReadData.Ready, - - AXI4Lite_s2m.WReady => AxiBus.WriteData.Ready, - AXI4Lite_s2m.BValid => AxiBus.WriteResponse.Valid, - AXI4Lite_s2m.BResp => AxiBus.WriteResponse.Resp, - AXI4Lite_s2m.ARReady => AxiBus.ReadAddress.Ready, - AXI4Lite_s2m.AWReady => AxiBus.WriteAddress.Ready, - AXI4Lite_s2m.RValid => AxiBus.ReadData.Valid, - AXI4Lite_s2m.RData => AxiBus.ReadData.Data, - AXI4Lite_s2m.RResp => AxiBus.ReadData.Resp, + AXI4Lite_m2s => AXI_m2s, + AXI4Lite_s2m => AXI_s2m, OCRAM_Address => address, OCRAM_WriteEnable => write_en, @@ -173,27 +178,32 @@ begin OCRAM_DataOut => data_out ) ; - OCRAM : entity PoC.OCRAM_tdp - generic map ( - A_BITS => OCRAM_ADDRESS_BITS, - D_BITS => OCRAM_DATA_BITS - ) - port map ( - clk1 => Clock, - clk2 => Clock, - ce1 => '1', - ce2 => '1', - we1 => write_en, - we2 => '0', - a1 => address, - a2 => PortB_address, - d1 => data_out, - d2 => (others => '0'), - q1 => data_in, - q2 => PortB_data - ) ; - - TestCtrl : AXI4Lite_OCRAM_Adapter_TestController + OCRAM : entity PoC.ocram_TrueDualPort + generic map ( + ADDRESS_BITS => OCRAM_ADDRESS_BITS, + DATA_BITS => OCRAM_DATA_BITS, + FILENAME => ite(USE_INIT_FILE, LOCAL_PROJECT_DIR & "/tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter.hex", "") + ) + port map ( + PortA_Clock => Clock, + PortB_Clock => Clock, + PortA_ClockEnable => '1', + PortB_ClockEnable => '1', + PortA_WriteEnable => write_en, + PortB_WriteEnable => '0', + PortA_Address => address, + PortB_Address => PortB_address, + PortA_DataIn => data_out, + PortB_DataIn => (others => '0'), + PortA_DataOut => data_in, + PortB_DataOut => PortB_data + ); + + TestCtrl : axi4lite_OCRAM_Adapter_TestController + generic map ( + OCRAM_ADDRESS_BITS => OCRAM_ADDRESS_BITS, + OCRAM_DATA_BITS => OCRAM_DATA_BITS + ) port map( Clock => Clock, Reset => Reset, diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_Register/RunAllTests.pro b/tb/bus/axi4lite/Register/RunAllTests.pro similarity index 79% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_Register/RunAllTests.pro rename to tb/bus/axi4lite/Register/RunAllTests.pro index 5d0472431..f4892f744 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_Register/RunAllTests.pro +++ b/tb/bus/axi4lite/Register/RunAllTests.pro @@ -19,13 +19,14 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.bus.axi4.axi4Lite.Register +TestSuite PoC.bus.axi4lite.Register + library tb_axi4lite_Register -analyze AXI4Lite_Register_pkg.vhdl -analyze AXI4Lite_Register_TestController.vhdl -analyze AXI4Lite_Register_TestHarness.vhdl +analyze axi4lite_Register_pkg.vhdl +analyze axi4lite_Register_TestController.vhdl +analyze axi4lite_Register_TestHarness.vhdl # Test cases -RunTest AXI4Lite_Register_Initial.vhdl -RunTest AXI4Lite_Register_ReadWrite.vhdl +RunTest axi4lite_Register_Initial.vhdl +RunTest axi4lite_Register_ReadWrite.vhdl diff --git a/tb/bus/axi4lite/Register/TC_RandomReadWrite.vhdl b/tb/bus/axi4lite/Register/TC_RandomReadWrite.vhdl new file mode 100644 index 000000000..c2e1f4710 --- /dev/null +++ b/tb/bus/axi4lite/Register/TC_RandomReadWrite.vhdl @@ -0,0 +1,139 @@ +-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- +-- vim: tabstop=2:shiftwidth=2:noexpandtab +-- kate: tab-width 2; replace-tabs off; indent-width 2; +-- ============================================================================= +-- Authors: +-- Iqbal Asif (PLC2 Design GmbH) +-- Patrick Lehmann (PLC2 Design GmbH) +-- Stefan Unrein (PLC2 Design GmbH) +-- +-- Entity: TC_RandomReadWrite +-- +-- Description: +-- ------------------------------------- +-- Test-Case Random-Read-Write +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2025 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS of ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +architecture RandomReadWrite of axi4lite_Register_TestController is + constant Timeout : time := 100 ms; + + constant number : positive := 7; + + signal TestDone : integer_barrier := 1; + signal ConfigDone : integer_barrier := 1; + + signal IndexValue : integer := 0; + shared variable SB : osvvm.ScoreboardPkg_slv.ScoreboardPType; + +begin + + ------------------------------------------------------------ + -- ControlProc + -- Set up AlertLog and wait for end of test + ------------------------------------------------------------ + ControlProc : process + begin + -- Initialization of test + SetAlertLogName("TC_RandomReadWrite"); + SetLogEnable(PASSED, False); -- Enable PASSED logs + SetLogEnable(INFO, False); -- Enable INFO logs + + -- Wait for testbench initialization + wait for 0 ns; + SetTranscriptMirror(TRUE); + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts; + + -- Wait for test to finish + WaitForBarrier(TestDone, Timeout); + AlertIf(now >= Timeout, "Test finished due to timeout"); + -- AlertIf(GetAffirmCount < 100, "Test is not Self-Checking"); + + EndOfTestReports(ReportAll => TRUE); + std.env.stop; + wait; + end process ControlProc; + + ReadWriteProc : process + variable RV : RandomPType; + variable value : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0) := 32x"001"; + + begin + RV.InitSeed(RV'instance_name); + wait until Reset = '0'; + + wait for 100 ns; + + for I in 0 to number - 1 loop + IndexValue <= RV.RandInt(0, 0); + value := RV.RandSlv(0, 255, 32); + wait until rising_edge (Clock); + SB.Push("IRQ(" & integer'image(IndexValue) & ")", value); + WritePort (get_index("IRQ(" & integer'image(IndexValue) & ")", config)) <= value; + wait until rising_edge (Clock); + WritePort (get_index("IRQ(" & integer'image(IndexValue) & ")", config)) <= (others => '0'); + end loop; + + -- WaitForBarrier(ConfigDone) ; + + WaitForBarrier(TestDone); + end process; + ------------------------------------------------------------ + -- AxiTransmitterProc + -- Generate transactions for AxiTransmitter + ------------------------------------------------------------ + AxiMasterProc : process + variable Data : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0) := (others => '0'); + variable Addr : std_logic_vector(AXI_DATA_WIDTH - 1 downto 0) := (others => '0'); + + begin + wait until Reset = '0'; + wait for 20 ns; + + Write(AxiMasterTransRec, x"0000_0864", x"FFFF_FFFF"); + + wait until Irq = '1'; + + -- WaitForBarrier(ConfigDone) ; + + wait until rising_edge (Clock); + Write(AxiMasterTransRec, x"0000_0010", x"FFFF_FFFF"); + + Read(AxiMasterTransRec, x"0000_0868", data); + Addr := std_logic_vector((get_Address("IRQ(" & integer'image(IndexValue) & ")", config))); + Read(AxiMasterTransRec, Addr, data); + SB.Check("IRQ(" & integer'image(IndexValue) & ")", data); + + wait for 10 ns; + + WaitForBarrier(TestDone); + wait; + end process AxiMasterProc; + +end architecture; + +configuration TC_RandomReadWrite of axi4lite_Register_TestHarness is + for sim + for TestCtrl : axi4lite_Register_TestController + use entity work.axi4lite_Register_TestController(RandomReadWrite); + end for; + end for; +end configuration; diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_Initial.vhdl b/tb/bus/axi4lite/Register/axi4lite_Register_Initial.vhdl similarity index 94% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_Initial.vhdl rename to tb/bus/axi4lite/Register/axi4lite_Register_Initial.vhdl index bc814c799..fd14e479b 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_Initial.vhdl +++ b/tb/bus/axi4lite/Register/axi4lite_Register_Initial.vhdl @@ -25,7 +25,7 @@ -- limitations under the License. -- ============================================================================= -architecture Initial of AXI4Lite_Register_TestController is +architecture Initial of axi4lite_Register_TestController is signal TestDone : integer_barrier := 1; signal ConfigDone : integer_barrier := 1; @@ -43,7 +43,7 @@ begin constant TIMEOUT : time := 10 ms; begin -- Initialization of test - SetAlertLogName("AXI4Lite_Register_Initial"); + SetAlertLogName("axi4lite_Register_Initial"); SetLogEnable(PASSED, FALSE); SetLogEnable(INFO, FALSE); SetLogEnable(osvvm.AlertLogPkg.DEBUG, FALSE); @@ -144,10 +144,10 @@ begin end architecture; -configuration AXI4Lite_Register_Initial of AXI4Lite_Register_TestHarness is +configuration axi4lite_Register_Initial of axi4lite_Register_TestHarness is for sim - for TestCtrl : AXI4Lite_Register_TestController - use entity work.AXI4Lite_Register_TestController(Initial); + for TestCtrl : axi4lite_Register_TestController + use entity work.axi4lite_Register_TestController(Initial); end for; end for; end configuration; diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_ReadWrite.vhdl b/tb/bus/axi4lite/Register/axi4lite_Register_ReadWrite.vhdl similarity index 90% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_ReadWrite.vhdl rename to tb/bus/axi4lite/Register/axi4lite_Register_ReadWrite.vhdl index ab4b814f3..710edef70 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_ReadWrite.vhdl +++ b/tb/bus/axi4lite/Register/axi4lite_Register_ReadWrite.vhdl @@ -21,7 +21,7 @@ -- limitations under the License. -- ============================================================================= -architecture ReadWrite of AXI4Lite_Register_TestController is +architecture ReadWrite of axi4lite_Register_TestController is signal TestDone : integer_barrier := 1; signal ConfigDone : integer_barrier := 1; @@ -40,7 +40,7 @@ begin constant TIMEOUT : time := 10 ms; begin -- Initialization of test - SetAlertLogName("AXI4Lite_Register_ReadWrite"); + SetAlertLogName("axi4lite_Register_ReadWrite"); SetLogEnable(PASSED, FALSE); SetLogEnable(INFO, FALSE); SetLogEnable(osvvm.AlertLogPkg.DEBUG, FALSE); @@ -95,10 +95,10 @@ begin end architecture; -configuration AXI4Lite_Register_ReadWrite of AXI4Lite_Register_TestHarness is +configuration axi4lite_Register_ReadWrite of axi4lite_Register_TestHarness is for sim - for TestCtrl : AXI4Lite_Register_TestController - use entity work.AXI4Lite_Register_TestController(ReadWrite); + for TestCtrl : axi4lite_Register_TestController + use entity work.axi4lite_Register_TestController(ReadWrite); end for; end for; end configuration; diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_TestController.vhdl b/tb/bus/axi4lite/Register/axi4lite_Register_TestController.vhdl similarity index 82% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_TestController.vhdl rename to tb/bus/axi4lite/Register/axi4lite_Register_TestController.vhdl index 865929bdd..f7e69e11e 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_TestController.vhdl +++ b/tb/bus/axi4lite/Register/axi4lite_Register_TestController.vhdl @@ -4,11 +4,11 @@ -- Patrick Lehmann (PLC2 Design GmbH) -- Adrian Weiland (PLC2 Design GmbH) -- --- Entity: AXI4Lite_Register_TestController +-- Entity: axi4lite_Register_TestController -- -- Description: -- ------------------------------------- --- Testhcontroller of OSVVM Testbench of entity AXI4Lite_Register +-- Testhcontroller of OSVVM Testbench of entity axi4lite_Register -- -- License: -- ============================================================================= @@ -46,22 +46,22 @@ context osvvm_common.OsvvmCommonContext; library OSVVM_AXI4; context OSVVM_AXI4.Axi4LiteContext; -use work.AXI4Lite_Register_pkg.all; +use work.axi4lite_Register_pkg.all; -entity AXI4Lite_Register_TestController is +entity axi4lite_Register_TestController is generic ( CONFIG : T_AXI4_Register_Vector ); port ( -- Global Signal Interface - Clock : in std_logic; - Reset : out std_logic; + Clock : in std_logic; + Reset : out std_logic; - Irq : in std_logic; + Irq : in std_logic; - ReadPort : in T_SLVV(0 to CONFIG'Length - 1)(DATA_BITS - 1 downto 0); - WritePort : out T_SLVV(0 to CONFIG'Length - 1)(DATA_BITS - 1 downto 0):= (others => (others => '0')); + ReadPort : in T_SLVV(0 to CONFIG'Length - 1)(DATA_BITS - 1 downto 0); + WritePort : out T_SLVV(0 to CONFIG'Length - 1)(DATA_BITS - 1 downto 0):= (others => (others => '0')); -- Transaction Interfaces AxiMasterTransRec : inout Axi4LiteMasterTransactionRecType diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_TestHarness.vhdl b/tb/bus/axi4lite/Register/axi4lite_Register_TestHarness.vhdl similarity index 92% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_TestHarness.vhdl rename to tb/bus/axi4lite/Register/axi4lite_Register_TestHarness.vhdl index 3fe477e9b..19a8d2824 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_TestHarness.vhdl +++ b/tb/bus/axi4lite/Register/axi4lite_Register_TestHarness.vhdl @@ -4,11 +4,11 @@ -- Patrick Lehmann (PLC2 Design GmbH) -- Adrian Weiland (PLC2 Design GmbH) -- --- Entity: AXI4Lite_Register_TestHarness +-- Entity: axi4lite_Register_TestHarness -- -- Description: -- ------------------------------------- --- Testharness of OSVVM Testbench of entity AXI4Lite_Register +-- Testharness of OSVVM Testbench of entity axi4lite_Register -- -- License: -- ============================================================================= @@ -28,8 +28,8 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.ALL; -use IEEE.NUMERIC_STD.ALL; +use IEEE.std_logic_1164.ALL; +use IEEE.numeric_std.ALL; library PoC; use PoC.vectors.all; @@ -44,13 +44,13 @@ context osvvm_common.OsvvmCommonContext; library OSVVM_AXI4; context OSVVM_AXI4.Axi4LiteContext; -use work.AXI4Lite_Register_pkg.all; +use work.axi4lite_Register_pkg.all; -entity AXI4Lite_Register_TestHarness is -end AXI4Lite_Register_TestHarness; +entity axi4lite_Register_TestHarness is +end axi4lite_Register_TestHarness; -architecture sim of AXI4Lite_Register_TestHarness is +architecture sim of axi4lite_Register_TestHarness is constant tperiod_Clk : time := 10 ns; @@ -75,19 +75,19 @@ architecture sim of AXI4Lite_Register_TestHarness is ReadData(Data(AXI_DATA_WIDTH - 1 downto 0)) ); - component AXI4Lite_Register_TestController is + component axi4lite_Register_TestController is generic ( CONFIG : T_AXI4_Register_Vector ); port ( -- Global Signal Interface - Clock : in std_logic; - Reset : out std_logic; + Clock : in std_logic; + Reset : out std_logic; - Irq : in std_logic; + Irq : in std_logic; - ReadPort : in T_SLVV(0 to CONFIG'Length - 1)(DATA_BITS - 1 downto 0); - WritePort : out T_SLVV(0 to CONFIG'Length - 1)(DATA_BITS - 1 downto 0):= (others => (others => '0')); + ReadPort : in T_SLVV(0 to CONFIG'Length - 1)(DATA_BITS - 1 downto 0); + WritePort : out T_SLVV(0 to CONFIG'Length - 1)(DATA_BITS - 1 downto 0):= (others => (others => '0')); -- Transaction Interfaces AxiMasterTransRec : inout Axi4LiteMasterTransactionRecType @@ -170,7 +170,7 @@ begin AxiBus => AxiLiteBus -- AXI Master Functional Interface ); - DUT : entity PoC.AXI4Lite_Register + DUT : entity PoC.axi4lite_Register generic map ( CONFIG => CONFIG, -- VERBOSE => False, @@ -205,7 +205,7 @@ begin AXI4Lite_s2m.RData => AxiLiteBus.ReadData.Data, AXI4Lite_s2m.RResp => AxiLiteBus.ReadData.Resp, - AXI4Lite_IRQ => Main_Interrupt, + AXI4Lite_irq => Main_Interrupt, RegisterFile_ReadPort => Reg_ReadPort, RegisterFile_ReadPort_hit => Reg_ReadPort_hit, @@ -214,7 +214,7 @@ begin RegisterFile_WritePort_strobe => Reg_WritePort_strobe ); - TestCtrl : AXI4Lite_Register_TestController + TestCtrl : axi4lite_Register_TestController generic map ( CONFIG => CONFIG ) diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_pkg.vhdl b/tb/bus/axi4lite/Register/axi4lite_Register_pkg.vhdl similarity index 97% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_pkg.vhdl rename to tb/bus/axi4lite/Register/axi4lite_Register_pkg.vhdl index beb18fec9..2124f65b3 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_Register/AXI4Lite_Register_pkg.vhdl +++ b/tb/bus/axi4lite/Register/axi4lite_Register_pkg.vhdl @@ -2,7 +2,7 @@ -- Authors: -- Adrian Weiland (PLC2 Design GmbH) -- --- Package: AXI4Lite Register package of OSVVM Testbench +-- Package: axi4lite Register package of OSVVM Testbench -- -- License: -- ============================================================================= @@ -41,7 +41,7 @@ use PoC.vectors.all; use PoC.axi4lite.all; -package AXI4Lite_Register_pkg is +package axi4lite_Register_pkg is constant AXI_ADDR_WIDTH : integer := 32; constant AXI_DATA_WIDTH : integer := 32; @@ -80,7 +80,7 @@ package AXI4Lite_Register_pkg is end package; -package body AXI4Lite_Register_pkg is +package body axi4lite_Register_pkg is procedure ReadInit ( signal AxiMasterTransRec : inout Axi4LiteMasterTransactionRecType; diff --git a/tb/bus/axi4lite/RunAllTests.pro b/tb/bus/axi4lite/RunAllTests.pro new file mode 100644 index 000000000..fa58a5080 --- /dev/null +++ b/tb/bus/axi4lite/RunAllTests.pro @@ -0,0 +1,28 @@ +# ============================================================================= +# Authors: Iqbal Asif (PLC2 Design GmbH) +# Patrick Lehmann (PLC2 Design GmbH) +# Stefan Unrein (PLC2 Design GmbH) +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +include ./Demux/RunAllTests.pro +include ./HighResolutionClock/RunAllTests.pro +include ./OCRAM_Adapter/RunAllTests.pro +include ./Register/RunAllTests.pro +disabled ./SimpleInterface/RunAllTests.pro +include ./UART/RunAllTests.pro diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_UART/RunAllTests.pro b/tb/bus/axi4lite/UART/RunAllTests.pro similarity index 96% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_UART/RunAllTests.pro rename to tb/bus/axi4lite/UART/RunAllTests.pro index 0ba79b56e..4e6f098d6 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_UART/RunAllTests.pro +++ b/tb/bus/axi4lite/UART/RunAllTests.pro @@ -19,7 +19,7 @@ # limitations under the License. # ============================================================================= -TestSuite PoC.bus.axi4.axi4Lite.UART +TestSuite PoC.bus.axi4lite.UART library tb_axi4lite_UART diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_SWFC.vhdl b/tb/bus/axi4lite/UART/axi4lite_UART_SWFC.vhdl similarity index 81% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_SWFC.vhdl rename to tb/bus/axi4lite/UART/axi4lite_UART_SWFC.vhdl index 3113eed6b..426e26325 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_SWFC.vhdl +++ b/tb/bus/axi4lite/UART/axi4lite_UART_SWFC.vhdl @@ -9,11 +9,11 @@ architecture Software_flowcontrol of axi4lite_UART_tc is constant TestCtrlID : AlertLogIDType := NewID("TestController"); constant TestData : UARTSequenceType := (x"5A", -- 1B - x"CA",x"FE",x"AF",x"FE", -- 4B - x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF", -- 8B - x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"10", -- 16B - x"DA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE", x"BA", -- 17B - x"EA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE", x"BA",x"CA"); -- 18B + x"CA",x"FE",x"AF",x"FE", -- 4B + x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF", -- 8B + x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"10", -- 16B + x"DA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE", x"BA", -- 17B + x"EA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE", x"BA",x"CA"); -- 18B type SequenceDescriptionType is record TransmitLength : positive; @@ -59,8 +59,8 @@ architecture Software_flowcontrol of axi4lite_UART_tc is signal latch_xon : std_logic:= '0'; signal check_FC_Char : std_logic:= '0'; - constant XON : std_logic_vector(7 downto 0) := x"11"; -- ^Q - constant XOFF : std_logic_vector(7 downto 0) := x"13"; -- ^S + constant XON : std_logic_vector(7 downto 0) := x"11"; -- ^Q + constant XOFF : std_logic_vector(7 downto 0) := x"13"; -- ^S begin -- Testbench control process ControlProc : process @@ -71,7 +71,7 @@ begin SetLogEnable(PASSED, FALSE); --Enable PASSED Logs SetLogEnable(INFO, FALSE); --Enable INFO Logs UART_receive_SB <= OSVVM.ScoreBoardPkg_slv.NewID("UART_receive_SB"); - UART_transmit_SB <= OSVVM.ScoreBoardPkg_slv.NewID("UART_transmit_SB"); + UART_transmit_SB <= OSVVM.ScoreBoardPkg_slv.NewID("UART_transmit_SB"); -- Wait for testbench Initialization wait for 0 ns; @@ -105,7 +105,7 @@ begin -- status reg for rx, bit 5 checks for the Status_RX_Overrun procedure CheckIsEmpty_RX( signal manager : inout AddressBusRecType; - constant expected : in boolean + constant expected : in boolean ) is variable Data : AXIDataType; variable isEmpty : boolean; @@ -117,7 +117,7 @@ begin procedure CheckIsFull_RX( signal manager : inout AddressBusRecType; - constant expected : in boolean + constant expected : in boolean ) is variable Data : AXIDataType; variable isFull : boolean; @@ -129,7 +129,7 @@ begin procedure CheckIsOverrun_RX( signal manager : inout AddressBusRecType; - constant expected : in boolean + constant expected : in boolean ) is variable Data : AXIDataType; variable isOverrun : boolean; @@ -163,7 +163,7 @@ begin Read(AXI_Manager, RX_REG, ReceivedData); OSVVM.ScoreBoardPkg_slv.Check(UART_receive_SB, ReceivedData(7 downto 0)); end loop; - toggle(latch_xon); + toggle(latch_xon); CheckIsEmpty_RX(AXI_Manager, TRUE); CheckIsFull_RX(AXI_Manager, FALSE); CheckIsOverrun_RX(AXI_Manager, FALSE); @@ -181,7 +181,7 @@ begin procedure UARTSendBurst( signal uartRec : inout UartRecType; - constant data_array : in UARTSequenceType + constant data_array : in UARTSequenceType ) is begin for i in data_array'range loop @@ -219,26 +219,26 @@ begin begin wait until Reset = '0'; for i in sequences'range loop - if check_FC_Char = '1' then + if check_FC_Char = '1' then - WaitForToggle(SWFC_TRigger); + WaitForToggle(SWFC_TRigger); - Get(UartRxRec, ReceivedData); - OSVVM.ScoreBoardPkg_slv.Check(UART_transmit_SB, ReceivedData); - log(ProcLogID, "received XOFF character"); + Get(UartRxRec, ReceivedData); + OSVVM.ScoreBoardPkg_slv.Check(UART_transmit_SB, ReceivedData); + log(ProcLogID, "received XOFF character"); - toggle(Read_Enable); + toggle(Read_Enable); - WaitForToggle(latch_xon); + WaitForToggle(latch_xon); - Get(UartRxRec, ReceivedData); - OSVVM.ScoreBoardPkg_slv.Check(UART_transmit_SB, ReceivedData); + Get(UartRxRec, ReceivedData); + OSVVM.ScoreBoardPkg_slv.Check(UART_transmit_SB, ReceivedData); - log(ProcLogID, "received XON character"); - else - WaitForToggle(SWFC_TRigger); - toggle(Read_Enable); - end if; + log(ProcLogID, "received XON character"); + else + WaitForToggle(SWFC_TRigger); + toggle(Read_Enable); + end if; end loop; WaitForBarrier(TestDone); diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_receive.vhdl b/tb/bus/axi4lite/UART/axi4lite_UART_receive.vhdl similarity index 100% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_receive.vhdl rename to tb/bus/axi4lite/UART/axi4lite_UART_receive.vhdl diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_receive_burst.vhdl b/tb/bus/axi4lite/UART/axi4lite_UART_receive_burst.vhdl similarity index 85% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_receive_burst.vhdl rename to tb/bus/axi4lite/UART/axi4lite_UART_receive_burst.vhdl index e7451f258..c32477bb6 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_receive_burst.vhdl +++ b/tb/bus/axi4lite/UART/axi4lite_UART_receive_burst.vhdl @@ -1,18 +1,18 @@ architecture receive_burst of axi4lite_UART_tc is - subtype UARTDataType is std_logic_vector(7 downto 0); + subtype UARTDataType is std_logic_vector(7 downto 0); alias UARTSequenceType is T_SLVV_8; - alias SB_IDType is OSVVM.ScoreBoardPkg_slv.ScoreboardIdType; + alias SB_IDType is OSVVM.ScoreBoardPkg_slv.ScoreboardIdType; signal UART_receive_SB : SB_IDType; constant TestCtrlID : AlertLogIDType := NewID("TestController"); constant TestData : UARTSequenceType := (x"5A", -- 1B - x"CA",x"FE",x"AF",x"FE", -- 4B - x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF", -- 8B - x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE", -- 16B - x"DA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE", x"BA", -- 17B - x"EA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE", x"BA",x"CA"); -- 18B + x"CA",x"FE",x"AF",x"FE", -- 4B + x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF", -- 8B + x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE", -- 16B + x"DA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE", x"BA", -- 17B + x"EA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE",x"CA",x"FE",x"AF",x"FE", x"BA",x"CA"); -- 18B type SequenceDescriptionType is record TransmitLength : positive; @@ -62,7 +62,7 @@ begin SetTestName("axi4lite_UART_receive_burst"); SetLogEnable(PASSED, TRUE); --Enable PASSED Logs SetLogEnable(INFO, TRUE); --Enable INFO Logs - UART_receive_SB <= OSVVM.ScoreBoardPkg_slv.NewID("UART_receive_SB"); + UART_receive_SB <= OSVVM.ScoreBoardPkg_slv.NewID("UART_receive_SB"); -- Wait for testbench Initialization wait for 0 ns; @@ -81,7 +81,7 @@ begin end process ControlProc; -- Generate transaction for AXI manager - ManagerProc : process + ManagerProc : process constant ProcLogID : AlertLogIDType := NewID("ManagerProc", TestCtrlID); variable AxiManagerLogID : AlertLogIDType; @@ -97,7 +97,7 @@ begin -- status reg for rx, bit 5 checks for the Status_RX_Overrun procedure CheckIsEmpty_RX( signal manager : inout AddressBusRecType; - constant expected : in boolean + constant expected : in boolean ) is variable Data : AXIDataType; variable isEmpty : boolean; @@ -109,7 +109,7 @@ begin procedure CheckIsFull_RX( signal manager : inout AddressBusRecType; - constant expected : in boolean + constant expected : in boolean ) is variable Data : AXIDataType; variable isFull : boolean; @@ -121,7 +121,7 @@ begin procedure CheckIsOverrun_RX( signal manager : inout AddressBusRecType; - constant expected : in boolean + constant expected : in boolean ) is variable Data : AXIDataType; variable isOverrun : boolean; @@ -133,7 +133,7 @@ begin procedure CheckIsParity_flag( signal manager : inout AddressBusRecType; - constant expected : in boolean + constant expected : in boolean ) is variable Data : AXIDataType; variable parity_error : boolean; @@ -144,7 +144,7 @@ begin end procedure; begin - wait until Reset = '0'; + wait until Reset = '0'; GetAlertLogID(AXI_Manager, AxiManagerLogID); SetLogEnable(AxiManagerLogID, INFO, False); @@ -179,15 +179,15 @@ begin procedure UARTSendBurst( signal uartRec : inout UartRecType; - constant data_array : in UARTSequenceType + constant data_array : in UARTSequenceType ) is begin - for i in data_array'range loop - OSVVM.ScoreBoardPkg_slv.Push(UART_receive_SB, data_array(i)); + for i in data_array'range loop + OSVVM.ScoreBoardPkg_slv.Push(UART_receive_SB, data_array(i)); log(ProcLogID, "Sending data of " & to_string(i) & "th byte to AXI RX register"); Send(uartRec, data_array(i)); end loop; - end procedure; + end procedure; begin wait until Reset = '0'; WaitForClock(UartTxRec, 1); diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_receive_parity.vhdl b/tb/bus/axi4lite/UART/axi4lite_UART_receive_parity.vhdl similarity index 91% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_receive_parity.vhdl rename to tb/bus/axi4lite/UART/axi4lite_UART_receive_parity.vhdl index 1e259d58c..82e056772 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_receive_parity.vhdl +++ b/tb/bus/axi4lite/UART/axi4lite_UART_receive_parity.vhdl @@ -1,8 +1,8 @@ architecture receive_parity of axi4lite_UART_tc is subtype UARTDataType is std_logic_vector(7 downto 0); alias UARTSequenceType is T_SLVV_8; - constant TestData : UARTSequenceType := (x"5A", x"CA", x"FE", x"AF", x"FE", x"5A", x"CA", x"FE", x"AF", x"FE"); -- to PASSTHROUGH_ERROR_BYTE - constant TestData_replacebyte : UARTSequenceType := (x"5A", x"15", x"FE", x"15", x"FE", x"5A", x"15", x"FE", x"15", x"FE"); --to REPLACE_ERROR_BYTE + constant TestData : UARTSequenceType := (x"5A", x"CA", x"FE", x"AF", x"FE", x"5A", x"CA", x"FE", x"AF", x"FE"); -- to PASSTHROUGH_ERROR_BYTE + constant TestData_replacebyte : UARTSequenceType := (x"5A", x"15", x"FE", x"15", x"FE", x"5A", x"15", x"FE", x"15", x"FE"); --to REPLACE_ERROR_BYTE constant parityerror : boolean_vector := (FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE); --constant TestData : UARTDataType := x"27"; @@ -50,7 +50,7 @@ begin procedure CheckIsParity_flag( signal manager : inout AddressBusRecType; - constant expected : in boolean + constant expected : in boolean ) is variable Data : AXIDataType; variable parity_error : boolean; @@ -87,10 +87,10 @@ begin WaitForClock(UartTxRec, 1); for i in TestData'range loop if parityerror(i) then - Send(UartTxRec, TestData(i),UARTTB_PARITY_ERROR); + Send(UartTxRec, TestData(i),UARTTB_PARITY_ERROR); else - Send(UartTxRec, TestData(i)); - end if; + Send(UartTxRec, TestData(i)); + end if; Toggle(ReadByteTrigger); end loop; WaitForBarrier(TestDone); diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_tc.vhdl b/tb/bus/axi4lite/UART/axi4lite_UART_tc.vhdl similarity index 94% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_tc.vhdl rename to tb/bus/axi4lite/UART/axi4lite_UART_tc.vhdl index a383b7593..0f2e837c0 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_tc.vhdl +++ b/tb/bus/axi4lite/UART/axi4lite_UART_tc.vhdl @@ -10,7 +10,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -46,8 +46,8 @@ context osvvm_Axi4.Axi4LiteContext ; entity axi4lite_UART_tc is port ( --Global signal Interface - -- Clock : in std_logic; - Reset : in std_logic; + -- Clock : in std_logic; + Reset : in std_logic; -- AXI transaction record AXI_Manager : inout AddressBusRecType ; diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_th.vhdl b/tb/bus/axi4lite/UART/axi4lite_UART_th.vhdl similarity index 95% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_th.vhdl rename to tb/bus/axi4lite/UART/axi4lite_UART_th.vhdl index eb757a4f8..d4d4e193a 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_th.vhdl +++ b/tb/bus/axi4lite/UART/axi4lite_UART_th.vhdl @@ -10,7 +10,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -24,7 +24,7 @@ use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; library PoC; -use PoC.AXI4Lite_OSVVM.all; +use PoC.axi4lite_OSVVM.all; use PoC.physical.all; use PoC.vectors.all; use PoC.utils.all; @@ -115,7 +115,7 @@ begin Clk => Clock, Period => 7 * tperiod_Clk, tpd => tpd - ); + ); -- AXI4Lite configuration manager manager: entity OSVVM_AXI4.Axi4LiteManager @@ -136,7 +136,7 @@ begin -- mapping between PoC and OSVVM AXI bus types to_PoC_AXI4Lite_Bus_Master(UART_AXI4Lite_m2s, UART_AXI4Lite_s2m, AXIBus); - dut: entity PoC.AXI4Lite_Uart + dut: entity PoC.axi4lite_UART generic map ( CLOCK_FREQ => CLOCK_FREQ, BAUDRATE => BAUDRATE, @@ -144,14 +144,14 @@ begin ) port map ( Clock => Clock, - Reset => Reset, + Reset => Reset, AXI4Lite_m2s => UART_AXI4Lite_m2s, AXI4Lite_s2m => UART_AXI4Lite_s2m, AXI4Lite_irq => open, - UART_TX => UART_TX, - UART_RX => UART_RX, + UART_TX => UART_TX, + UART_RX => UART_RX, UART_RTS => open, UART_CTS => 'U' ); @@ -169,7 +169,7 @@ begin tx: entity OSVVM_UART.UartTx generic map ( DEFAULT_BAUD => UART_BAUD_PERIOD_115200, - DEFAULT_PARITY_MODE => UARTTB_PARITY_NONE + DEFAULT_PARITY_MODE => UARTTB_PARITY_NONE ) port map ( TransRec => UartTxRec, diff --git a/tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_transmit_burst.vhdl b/tb/bus/axi4lite/UART/axi4lite_UART_transmit_burst.vhdl similarity index 86% rename from tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_transmit_burst.vhdl rename to tb/bus/axi4lite/UART/axi4lite_UART_transmit_burst.vhdl index 0aafeb912..b66676569 100644 --- a/tb/bus/axi4/AXI4Lite/AXI4Lite_UART/axi4lite_UART_transmit_burst.vhdl +++ b/tb/bus/axi4lite/UART/axi4lite_UART_transmit_burst.vhdl @@ -11,12 +11,12 @@ architecture transmit_burst of axi4lite_UART_tc is signal UART_transmit_SB : SB_IDType; constant TestData : UARTSequenceType := (x"5A", -- 1B - x"CA",x"FE",x"AF",x"FE", -- 4B - x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF", -- 8B - x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD", -- 16B - x"CA",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD", -- 17B - x"DA",x"CA",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD"); -- 18B - constant SequenceLengths : T_POSVEC := (1, 4, 8, 16); + x"CA",x"FE",x"AF",x"FE", -- 4B + x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF", -- 8B + x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD", -- 16B + x"CA",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD", -- 17B + x"DA",x"CA",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF",x"DE",x"AD"); -- 18B + constant SequenceLengths : positive_vector := (1, 4, 8, 16); signal TestDone : integer_barrier := 1; signal WriteDone : bit := '0'; -- barrier for triggering uart rx process diff --git a/tb/bus/axi4stream/DeMux/DeMux_Harness.vhdl b/tb/bus/axi4stream/DeMux/DeMux_Harness.vhdl new file mode 100644 index 000000000..d33891369 --- /dev/null +++ b/tb/bus/axi4stream/DeMux/DeMux_Harness.vhdl @@ -0,0 +1,258 @@ +-- ============================================================================= +-- Authors: +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.ALL; +use IEEE.numeric_std.ALL; + +library PoC; +use PoC.config.all; +use PoC.utils.all; +use PoC.strings.all; +use PoC.vectors.all; +use PoC.physical.all; +use PoC.axi4stream.all; + +library osvvm; +context osvvm.OsvvmContext; + +library osvvm_AXI4 ; +context osvvm_AXI4.AxiStreamContext ; + +entity DeMux_Harness is + +end entity; + +architecture Harness of DeMux_Harness is + constant IS_SIM : boolean := true; + + --clocks + constant CLOCK_FREQ_sys : FREQ := 200000 kHz; + + constant AXI_DATA_WIDTH : natural := 64; + constant AXI_STRB_WIDTH : natural := AXI_DATA_WIDTH / 8; + constant DATA_BITS : natural := 64; + constant STREAM_BITS : natural := DATA_BITS + DATA_BITS / 8; + constant NUMBER_PORTS : positive := 4; + + component TestControl is + generic ( + MIN_PACKET_SIZE : positive := 1; + MAX_PACKET_SIZE : positive := 500; + NUM_PACKETS : positive := 15; + MIN_WAIT_CYCLE : natural := 1; + MAX_WAIT_CYCLE : natural := 1000; + MIN_BACKPRESS_CYCLE: natural := 1; + MAX_BACKPRESS_CYCLE: natural := 500 + ); + port ( + -- Global Signal Interface + Clock : In std_logic ; + Reset : In std_logic ; + + Stream_RX_Pause : out std_logic_vector; + Hit_Vector : out std_logic_vector; + + Stream_TX_Transaction : inout StreamRecType; + Stream_RX_Transaction : inout StreamRecArrayType + ); + end component; + + component axi4stream_DeMux is + generic ( + ADD_MIRROR_MODE : boolean := false; + OUTPUT_STAGES : natural := 0; + ENABLE_REVERSE_USER : boolean := false + ); + port ( + Clock : in std_logic; + Reset : in std_logic; + -- Control interface + DeMuxControl : in std_logic_vector; + -- IN Port + In_M2S : in T_AXI4STREAM_M2S; + In_S2M : out T_AXI4STREAM_S2M; + -- OUT Ports + Out_M2S : out T_AXI4STREAM_M2S_VECTOR; + Out_S2M : in T_AXI4STREAM_S2M_VECTOR + ); + end component; + + package axi4stream_D64 is + new PoC.axi4stream_Sized + generic map( + DATA_BITS => DATA_BITS + ); + + signal Stream_TX_m2s : AXI4Stream_D64.Sized_M2S; + signal Stream_TX_s2m : AXI4Stream_D64.Sized_S2M; + signal Stream_RX_m2s : AXI4Stream_D64.Sized_M2S_Vector(0 to NUMBER_PORTS -1); + signal Stream_RX_s2m : AXI4Stream_D64.Sized_S2M_Vector(0 to NUMBER_PORTS -1); + + signal Hit_Vector : std_logic_vector(NUMBER_PORTS -1 downto 0); + + signal Stream_Pause : std_logic_vector(0 to NUMBER_PORTS -1); + + + signal Clock : std_logic :='0'; + signal Reset : std_logic :='1'; + + + signal Stream_RX_Transaction : StreamRecArrayType(0 to NUMBER_PORTS -1)( + DataToModel (STREAM_BITS-1 downto 0), + ParamToModel (4-1 downto 0), + DataFromModel (STREAM_BITS-1 downto 0), + ParamFromModel(4-1 downto 0) + ); + signal Stream_TX_Transaction : StreamRecType( + DataToModel (STREAM_BITS-1 downto 0), + ParamToModel (4-1 downto 0), + DataFromModel (STREAM_BITS-1 downto 0), + ParamFromModel(4-1 downto 0) + ); + +begin + + Reset_Clock_blk : block + begin + Osvvm.ClockResetPkg.CreateClock ( + Clk => Clock, + Period => to_time(CLOCK_FREQ_sys) + ); + + Osvvm.ClockResetPkg.CreateReset ( + Reset => Reset, + ResetActive => '1', + Clk => Clock, + Period => 200 ns, + tpd => 1 ns + ) ; + end block; + + TestControl_inst : TestControl + port map( + -- Global Signal Interface + Clock => Clock, + Reset => Reset, + + Stream_TX_Transaction => Stream_TX_Transaction, + Stream_RX_Transaction => Stream_RX_Transaction, + Stream_RX_Pause => Stream_Pause, + Hit_Vector => Hit_Vector + ); + + Components_blk : block + signal signal_open : std_logic_vector(0 downto 0); + + signal Stream_TX_Data : std_logic_vector(STREAM_BITS -1 downto 0); + begin + Stream_Transmitter : entity OSVVM_AXI4.AxiStreamTransmitter + generic map( + tperiod_Clk => to_time(CLOCK_FREQ_sys) + ) + port map( + -- Globals + Clk => Clock, + nReset => not Reset, + + -- AXI Master Functional Interface + TValid => Stream_TX_m2s.Valid, + TReady => Stream_TX_s2m.Ready, + TID => signal_open, + TDest => signal_open, + TUser => Stream_TX_m2s.User, + TData => Stream_TX_Data, + TStrb => signal_open, + TKeep => signal_open, + TLast => Stream_TX_m2s.Last, + + -- Testbench Transaction Interface + TransRec => Stream_TX_Transaction + ); + Stream_TX_m2s.Keep <= Stream_TX_Data(Stream_TX_Data'high downto DATA_BITS); + Stream_TX_m2s.data <= Stream_TX_Data(DATA_BITS -1 downto 0); + + + Port_gen : for i in 0 to NUMBER_PORTS -1 generate + signal Stream_RX_Data : std_logic_vector(STREAM_BITS -1 downto 0); + + signal Stream_RX_m2s_i : Stream_RX_m2s(i)'subtype; + signal Stream_RX_s2m_i : Stream_RX_s2m(i)'subtype; + begin + Stream_Receiver : entity OSVVM_AXI4.AxiStreamReceiver + generic map( + tperiod_Clk => to_time(CLOCK_FREQ_sys) , + tpd_Clk_TReady => 0.5 ns + ) + port map( + -- Globals + Clk => Clock, + nReset => not Reset, + + -- AXI Master Functional Interface + TValid => Stream_RX_m2s_i.Valid, + TReady => Stream_RX_s2m_i.Ready, + TID => "0", + TDest => "0", + TUser => Stream_RX_m2s_i.User, + TData => Stream_RX_Data, + TStrb => "1", + TKeep => "1", + TLast => Stream_RX_m2s_i.Last, + + -- Testbench Transaction Interface + TransRec => Stream_RX_Transaction(i) + ); + Stream_RX_Data <= Stream_RX_m2s_i.Keep & Stream_RX_m2s_i.data; + + pause : entity PoC.axi4stream_Pause + port map( + Pause => Stream_Pause(i), + -- IN Port + In_M2S => Stream_RX_m2s(i), + In_S2M => Stream_RX_s2m(i), + -- OUT Ports + Out_M2S => Stream_RX_m2s_i, + Out_S2M => Stream_RX_s2m_i + ); + end generate; + + end block; + + DUT : axi4stream_DeMux + generic map( + ADD_MIRROR_MODE => true, + OUTPUT_STAGES => 1, + ENABLE_REVERSE_USER => false + ) + port map( + Clock => Clock, + Reset => Reset, + -- Control interface + DeMuxControl => Hit_Vector, + -- IN Port + In_M2S => Stream_TX_m2s, + In_S2M => Stream_TX_s2m, + -- OUT Ports + Out_M2S => Stream_RX_m2s, + Out_S2M => Stream_RX_s2m + ); +end architecture; diff --git a/tb/bus/axi4stream/DeMux/RunAllTests.pro b/tb/bus/axi4stream/DeMux/RunAllTests.pro new file mode 100644 index 000000000..977ae04f9 --- /dev/null +++ b/tb/bus/axi4stream/DeMux/RunAllTests.pro @@ -0,0 +1,33 @@ +# ============================================================================= +# Authors: +# Adrian Weiland +# Stefan Unrein +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +TestSuite PoC.bus.axi4stream.DeMux + +library tb_axi4stream_DeMux + +analyze TC_DeMux_e.vhdl +analyze DeMux_Harness.vhdl + +RunTest TC_DeMux_random.vhdl +RunTest TC_DeMux_random_withGlue.vhdl +RunTest TC_DeMux_random_mirror.vhdl +RunTest TC_DeMux_random_mirror_multiDest.vhdl diff --git a/tb/bus/axi4stream/DeMux/TC_DeMux_e.vhdl b/tb/bus/axi4stream/DeMux/TC_DeMux_e.vhdl new file mode 100644 index 000000000..6571d915b --- /dev/null +++ b/tb/bus/axi4stream/DeMux/TC_DeMux_e.vhdl @@ -0,0 +1,58 @@ +-- ============================================================================= +-- Authors: +-- Stefan Unrein (PLC2 Design GmbH) +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE ; +use IEEE.std_logic_1164.all ; +use IEEE.numeric_std.all ; + +library PoC; +use PoC.stream.all; + +library OSVVM ; +context OSVVM.OsvvmContext ; +use OSVVM.ScoreBoardPkg_slv.all; + +library OSVVM_AXI4; +context OSVVM_AXI4.AxiStreamContext; + + +entity TestControl is + generic ( + MIN_PACKET_SIZE : positive := 1; + MAX_PACKET_SIZE : positive := 500; + NUM_PACKETS : positive := 15; + MIN_WAIT_CYCLE : natural := 1; + MAX_WAIT_CYCLE : natural := 1000; + MIN_BACKPRESS_CYCLE: natural := 1; + MAX_BACKPRESS_CYCLE: natural := 500 + ); + port ( + -- Global Signal Interface + Clock : In std_logic ; + Reset : In std_logic ; + + Stream_RX_Pause : out std_logic_vector; + Hit_Vector : out std_logic_vector; + + Stream_TX_Transaction : inout StreamRecType; + Stream_RX_Transaction : inout StreamRecArrayType + ); +end entity; diff --git a/tb/bus/axi4stream/DeMux/TC_DeMux_random.vhdl b/tb/bus/axi4stream/DeMux/TC_DeMux_random.vhdl new file mode 100644 index 000000000..b96a6ba27 --- /dev/null +++ b/tb/bus/axi4stream/DeMux/TC_DeMux_random.vhdl @@ -0,0 +1,220 @@ +-- ============================================================================= +-- Authors: +-- Stefan Unrein (PLC2 Design GmbH) +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE ; +use IEEE.std_logic_1164.all ; +use IEEE.numeric_std.all ; + +library PoC; +use PoC.config.all; +use PoC.stream.all; +use PoC.vectors.all; +use PoC.strings.all; +use PoC.utils.all; + +library OSVVM ; +context OSVVM.OsvvmContext ; +use OSVVM.ScoreBoardPkg_slv.all; + +library OSVVM_AXI4; +context OSVVM_AXI4.AxiStreamContext; + +architecture TC_random of TestControl is + constant NUMBER_PORTS : positive := Stream_RX_Transaction'length; + + signal TestDone : integer_barrier := 1 ; + + signal GenTX0_tgl : std_logic := '0'; + signal GenTX0_done_tgl : std_logic := '0'; + signal GenTX1_tgl : std_logic := '0'; + signal GenTX1_done_tgl : std_logic := '0'; + + signal AXI4Stream_SB : ScoreboardIDArrayType(1 to NUMBER_PORTS); + + function mask_data(slv : std_logic_vector; be : std_logic_vector) return std_logic_vector is + variable temp : std_logic_vector(slv'length -1 downto 0); + begin + assert slv'length / 8 = be'length report "mask_data-size dosnt match!" severity failure; + for i in 0 to be'length -1 loop + if be(i + be'low) = '1' then + temp(i * 8 +7 downto i*8) := slv(i * 8 +7 + slv'low downto i*8 + slv'low); + else + temp(i * 8 +7 downto i*8) := (others => 'X'); + end if; + end loop; + return temp; + end function; + +begin + + ControlProc : process + begin + -- Initialization of test + SetAlertLogName("TC_DeMux_random") ; + TranscriptOpen; + SetTranscriptMirror(TRUE); + AXI4Stream_SB <= NewID("AXI4Stream_SB", NUMBER_PORTS); + LOG("PoC.Bus/AXI/AXI4Stream/DeMux Testbench."); + LOG("Start of Test 1: Random transfer, ADD_MIRROR_MODE => false, ADD_OUTPUT_GLUE => false, ENABLE_REVERSE_USER => false"); + + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs + + -- Wait for testbench initialization + wait for 0 ns ; + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts ; + LOG("Start of Transactions"); + + wait for 1 us; + + -- Wait for test to finish + WaitForBarrier(TestDone, 10 ms); + + wait for 1 us; + + AlertIf(NOW >= 10 ms, "Simulation finished due to timeout!"); + AlertIf(GetAffirmCount < 50, "Test is not Self-Checking"); + + print("") ; + EndOfTestReports;--(ReportAll => true); + print("") ; + TranscriptClose; + std.env.stop; + wait ; + end process; + + Axi4Stream_TX : process + variable OpRV : RandomPType ; + variable NoOpRV : RandomPType ; + variable BytesRV : RandomPType ; + variable GapRV : RandomPType ; + variable Bytes : natural; + variable SB : natural; + + variable Data : std_logic_vector(63 downto 0) ; + variable SData : std_logic_vector(71 downto 0) ; + variable Keep : std_logic_vector(7 downto 0) ; + begin + + OpRV.InitSeed(OpRv'instance_name); + NoOpRV.InitSeed(NoOpRV'instance_name); + BytesRV.InitSeed(BytesRV'instance_name); + GapRV.InitSeed(GapRV'instance_name); + + wait until Reset = '0' ; + wait for 50 ns; + + for index in 0 to NUM_PACKETS -1 loop + Bytes := BytesRV.RandInt(MIN_PACKET_SIZE, MAX_PACKET_SIZE); + SB := BytesRV.RandInt(0, NUMBER_PORTS); + Hit_Vector <= (others => '0'); + if SB /= 0 then + Hit_Vector(SB -1) <= '1'; + end if; + + for i in 0 to (Bytes +7) / 8 -2 loop + Data := OpRV.RandSlv(size => 64); + Keep := x"FF"; + SData := Keep & Data; + if SB /= 0 then --Data will be discarded if SB is 0 + Push(AXI4Stream_SB(SB), '0' & mask_data(Data, Keep)); + end if; + Send(Stream_TX_Transaction, SData); + end loop; + Data := OpRV.RandSlv(size => 64); + Keep := genmask_low(ite((Bytes mod 8) = 0, 8, (Bytes mod 8)), 8); + SData := Keep & Data; + + if SB /= 0 then + Push(AXI4Stream_SB(SB), '1' & mask_data(Data, Keep)); + end if; + Send(Stream_TX_Transaction, SData, "1"); + wait for NoOpRV.RandInt(MIN_WAIT_CYCLE, MAX_WAIT_CYCLE) * ns; + end loop; + + wait for 1 us; + + WaitForBarrier(TestDone); + wait; + end process; + + RX_gen : for index in 1 to NUMBER_PORTS generate + AXI4Stream_RX : process + variable OpRV : RandomPType ; + variable NoOpRV : RandomPType ; + + variable SData : std_logic_vector(71 downto 0) ; + variable Data : std_logic_vector(63 downto 0) ; + variable Keep : std_logic_vector(7 downto 0) ; + variable Last : std_logic_vector(3 downto 0); + begin + OpRV.InitSeed(OpRv'instance_name); + NoOpRV.InitSeed(NoOpRV'instance_name); + Stream_RX_Pause(index -1) <= '0'; + + wait until Reset = '0' ; + while true loop + for i in 0 to OpRV.RandInt(1, 5) loop + Get(Stream_RX_Transaction(index -1), SData, Last); + Data := SData(63 downto 0); + Keep := SData(71 downto 64); + Check(AXI4Stream_SB(index), Last(0) & mask_data(Data, Keep)); + end loop; + + Stream_RX_Pause(index -1) <= '1'; + wait for NoOpRV.RandInt(MIN_BACKPRESS_CYCLE, MAX_BACKPRESS_CYCLE) * 1 ns; + Stream_RX_Pause(index -1) <= '0'; + end loop; + end process; + end generate; + +end architecture; + + +Configuration TC_DeMux_random of DeMux_Harness is + for Harness + for TestControl_inst : TestControl + use entity work.TestControl(TC_random) + generic map( + MIN_PACKET_SIZE => 1, + MAX_PACKET_SIZE => 500, + NUM_PACKETS => 1500, + MIN_WAIT_CYCLE => 0, + MAX_WAIT_CYCLE => 4, + MIN_BACKPRESS_CYCLE => 1, + MAX_BACKPRESS_CYCLE => 5 + ); + end for; + for DUT : axi4stream_DeMux + use entity PoC.axi4stream_DeMux + generic map( + ADD_MIRROR_MODE => false, + OUTPUT_STAGES => 0, + ENABLE_REVERSE_USER => false + ); + end for; + end for; +end Configuration; + diff --git a/tb/bus/axi4stream/DeMux/TC_DeMux_random_mirror.vhdl b/tb/bus/axi4stream/DeMux/TC_DeMux_random_mirror.vhdl new file mode 100644 index 000000000..067db5e7f --- /dev/null +++ b/tb/bus/axi4stream/DeMux/TC_DeMux_random_mirror.vhdl @@ -0,0 +1,220 @@ +-- ============================================================================= +-- Authors: +-- Stefan Unrein (PLC2 Design GmbH) +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE ; +use IEEE.std_logic_1164.all ; +use IEEE.numeric_std.all ; + +library PoC; +use PoC.config.all; +use PoC.stream.all; +use PoC.vectors.all; +use PoC.strings.all; +use PoC.utils.all; + +library OSVVM ; +context OSVVM.OsvvmContext ; +use OSVVM.ScoreBoardPkg_slv.all; + +library OSVVM_AXI4; +context OSVVM_AXI4.AxiStreamContext; + +architecture TC_random_mirror of TestControl is + constant NUMBER_PORTS : positive := Stream_RX_Transaction'length; + + signal TestDone : integer_barrier := 1 ; + + signal GenTX0_tgl : std_logic := '0'; + signal GenTX0_done_tgl : std_logic := '0'; + signal GenTX1_tgl : std_logic := '0'; + signal GenTX1_done_tgl : std_logic := '0'; + + signal AXI4Stream_SB : ScoreboardIDArrayType(1 to NUMBER_PORTS); + + function mask_data(slv : std_logic_vector; be : std_logic_vector) return std_logic_vector is + variable temp : std_logic_vector(slv'length -1 downto 0); + begin + assert slv'length / 8 = be'length report "mask_data-size dosnt match!" severity failure; + for i in 0 to be'length -1 loop + if be(i + be'low) = '1' then + temp(i * 8 +7 downto i*8) := slv(i * 8 +7 + slv'low downto i*8 + slv'low); + else + temp(i * 8 +7 downto i*8) := (others => 'X'); + end if; + end loop; + return temp; + end function; + +begin + + ControlProc : process + begin + -- Initialization of test + SetAlertLogName("TC_DeMux_random_mirror") ; + TranscriptOpen; + SetTranscriptMirror(TRUE); + AXI4Stream_SB <= NewID("AXI4Stream_SB", NUMBER_PORTS); + LOG("PoC.Bus/AXI/AXI4Stream/DeMux Testbench."); + LOG("Start of Test 3: Random transfer, ADD_MIRROR_MODE => true, ADD_OUTPUT_GLUE => true, ENABLE_REVERSE_USER => false"); + + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs + + -- Wait for testbench initialization + wait for 0 ns ; + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts ; + LOG("Start of Transactions"); + + wait for 1 us; + + -- Wait for test to finish + WaitForBarrier(TestDone, 10 ms); + + wait for 1 us; + + AlertIf(NOW >= 10 ms, "Simulation finished due to timeout!"); + AlertIf(GetAffirmCount < 50, "Test is not Self-Checking"); + + print("") ; + EndOfTestReports;--(ReportAll => true); + print("") ; + TranscriptClose; + std.env.stop; + wait ; + end process; + + Axi4Stream_TX : process + variable OpRV : RandomPType ; + variable NoOpRV : RandomPType ; + variable BytesRV : RandomPType ; + variable GapRV : RandomPType ; + variable Bytes : natural; + variable SB : natural; + + variable Data : std_logic_vector(63 downto 0) ; + variable SData : std_logic_vector(71 downto 0) ; + variable Keep : std_logic_vector(7 downto 0) ; + begin + + OpRV.InitSeed(OpRv'instance_name); + NoOpRV.InitSeed(NoOpRV'instance_name); + BytesRV.InitSeed(BytesRV'instance_name); + GapRV.InitSeed(GapRV'instance_name); + + wait until Reset = '0' ; + wait for 50 ns; + + for index in 0 to NUM_PACKETS -1 loop + Bytes := BytesRV.RandInt(MIN_PACKET_SIZE, MAX_PACKET_SIZE); + SB := BytesRV.RandInt(0, NUMBER_PORTS); + Hit_Vector <= (others => '0'); + if SB /= 0 then + Hit_Vector(SB -1) <= '1'; + end if; + + for i in 0 to (Bytes +7) / 8 -2 loop + Data := OpRV.RandSlv(size => 64); + Keep := x"FF"; + SData := Keep & Data; + if SB /= 0 then --Data will be discarded if SB is 0 + Push(AXI4Stream_SB(SB), '0' & mask_data(Data, Keep)); + end if; + Send(Stream_TX_Transaction, SData); + end loop; + Data := OpRV.RandSlv(size => 64); + Keep := genmask_low(ite((Bytes mod 8) = 0, 8, (Bytes mod 8)), 8); + SData := Keep & Data; + + if SB /= 0 then + Push(AXI4Stream_SB(SB), '1' & mask_data(Data, Keep)); + end if; + Send(Stream_TX_Transaction, SData, "1"); + wait for NoOpRV.RandInt(MIN_WAIT_CYCLE, MAX_WAIT_CYCLE) * ns; + end loop; + + wait for 1 us; + + WaitForBarrier(TestDone); + wait; + end process; + + RX_gen : for index in 1 to NUMBER_PORTS generate + AXI4Stream_RX : process + variable OpRV : RandomPType ; + variable NoOpRV : RandomPType ; + + variable SData : std_logic_vector(71 downto 0) ; + variable Data : std_logic_vector(63 downto 0) ; + variable Keep : std_logic_vector(7 downto 0) ; + variable Last : std_logic_vector(3 downto 0); + begin + OpRV.InitSeed(OpRv'instance_name); + NoOpRV.InitSeed(NoOpRV'instance_name); + Stream_RX_Pause(index -1) <= '0'; + + wait until Reset = '0' ; + while true loop + for i in 0 to OpRV.RandInt(1, 5) loop + Get(Stream_RX_Transaction(index -1), SData, Last); + Data := SData(63 downto 0); + Keep := SData(71 downto 64); + Check(AXI4Stream_SB(index), Last(0) & mask_data(Data, Keep)); + end loop; + + Stream_RX_Pause(index -1) <= '1'; + wait for NoOpRV.RandInt(MIN_BACKPRESS_CYCLE, MAX_BACKPRESS_CYCLE) * 1 ns; + Stream_RX_Pause(index -1) <= '0'; + end loop; + end process; + end generate; + +end architecture; + + +Configuration TC_DeMux_random_mirror of DeMux_Harness is + for Harness + for TestControl_inst : TestControl + use entity work.TestControl(TC_random_mirror) + generic map( + MIN_PACKET_SIZE => 1, + MAX_PACKET_SIZE => 500, + NUM_PACKETS => 1500, + MIN_WAIT_CYCLE => 0, + MAX_WAIT_CYCLE => 4, + MIN_BACKPRESS_CYCLE => 1, + MAX_BACKPRESS_CYCLE => 5 + ); + end for; + for DUT : axi4stream_DeMux + use entity PoC.axi4stream_DeMux + generic map( + ADD_MIRROR_MODE => true, + OUTPUT_STAGES => 1, + ENABLE_REVERSE_USER => false + ); + end for; + end for; +end Configuration; + diff --git a/tb/bus/axi4stream/DeMux/TC_DeMux_random_mirror_multiDest.vhdl b/tb/bus/axi4stream/DeMux/TC_DeMux_random_mirror_multiDest.vhdl new file mode 100644 index 000000000..7bb1d6d6d --- /dev/null +++ b/tb/bus/axi4stream/DeMux/TC_DeMux_random_mirror_multiDest.vhdl @@ -0,0 +1,223 @@ +-- ============================================================================= +-- Authors: +-- Stefan Unrein (PLC2 Design GmbH) +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE ; +use IEEE.std_logic_1164.all ; +use IEEE.numeric_std.all ; + +library PoC; +use PoC.config.all; +use PoC.stream.all; +use PoC.vectors.all; +use PoC.strings.all; +use PoC.utils.all; + +library OSVVM ; +context OSVVM.OsvvmContext ; +use OSVVM.ScoreBoardPkg_slv.all; + +library OSVVM_AXI4; +context OSVVM_AXI4.AxiStreamContext; + +architecture TC_random_mirror_multiDest of TestControl is + constant NUMBER_PORTS : positive := Stream_RX_Transaction'length; + + signal TestDone : integer_barrier := 1 ; + + signal GenTX0_tgl : std_logic := '0'; + signal GenTX0_done_tgl : std_logic := '0'; + signal GenTX1_tgl : std_logic := '0'; + signal GenTX1_done_tgl : std_logic := '0'; + + signal AXI4Stream_SB : ScoreboardIDArrayType(1 to NUMBER_PORTS); + + function mask_data(slv : std_logic_vector; be : std_logic_vector) return std_logic_vector is + variable temp : std_logic_vector(slv'length -1 downto 0); + begin + assert slv'length / 8 = be'length report "mask_data-size dosnt match!" severity failure; + for i in 0 to be'length -1 loop + if be(i + be'low) = '1' then + temp(i * 8 +7 downto i*8) := slv(i * 8 +7 + slv'low downto i*8 + slv'low); + else + temp(i * 8 +7 downto i*8) := (others => 'X'); + end if; + end loop; + return temp; + end function; + +begin + + ControlProc : process + begin + -- Initialization of test + SetAlertLogName("TC_DeMux_random_mirror_multiDest") ; + TranscriptOpen; + SetTranscriptMirror(TRUE); + AXI4Stream_SB <= NewID("AXI4Stream_SB", NUMBER_PORTS); + LOG("PoC.Bus/AXI/AXI4Stream/DeMux Testbench."); + LOG("Start of Test 4: Random transfer multi Dest, ADD_MIRROR_MODE => true, ADD_OUTPUT_GLUE => true, ENABLE_REVERSE_USER => false"); + + SetLogEnable(PASSED, false); -- Enable PASSED logs + SetLogEnable(INFO, false); -- Enable INFO logs + + -- Wait for testbench initialization + wait for 0 ns ; + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts ; + LOG("Start of Transactions"); + + wait for 1 us; + + -- Wait for test to finish + WaitForBarrier(TestDone, 10 ms); + + wait for 1 us; + + AlertIf(NOW >= 10 ms, "Simulation finished due to timeout!"); + AlertIf(GetAffirmCount < 50, "Test is not Self-Checking"); + + print("") ; + EndOfTestReports;--(ReportAll => true); + print("") ; + TranscriptClose; + std.env.stop; + wait ; + end process; + + Axi4Stream_TX : process + variable OpRV : RandomPType ; + variable NoOpRV : RandomPType ; + variable BytesRV : RandomPType ; + variable GapRV : RandomPType ; + variable Bytes : natural; + + variable Data : std_logic_vector(63 downto 0) ; + variable SData : std_logic_vector(71 downto 0) ; + variable Keep : std_logic_vector(7 downto 0) ; + begin + + OpRV.InitSeed(OpRv'instance_name); + NoOpRV.InitSeed(NoOpRV'instance_name); + BytesRV.InitSeed(BytesRV'instance_name); + GapRV.InitSeed(GapRV'instance_name); + Hit_Vector <= (others => '0'); + + wait until Reset = '0' ; + wait for 50 ns; + + for index in 0 to NUM_PACKETS -1 loop + Bytes := BytesRV.RandInt(MIN_PACKET_SIZE, MAX_PACKET_SIZE); + Hit_Vector <= BytesRV.RandSlv(size => NUMBER_PORTS); + wait for 0 ns; + + for i in 0 to (Bytes +7) / 8 -2 loop + Data := OpRV.RandSlv(size => 64); + Keep := x"FF"; + SData := Keep & Data; + for j in Hit_Vector'range loop + if Hit_Vector(j) = '1' then + Push(AXI4Stream_SB(j +1), '0' & mask_data(Data, Keep)); + wait for 0 ns; + end if; + end loop; + Send(Stream_TX_Transaction, SData); + wait for 0 ns; + end loop; + Data := OpRV.RandSlv(size => 64); + Keep := genmask_low(ite((Bytes mod 8) = 0, 8, (Bytes mod 8)), 8); + SData := Keep & Data; + + for j in Hit_Vector'range loop + if Hit_Vector(j) = '1' then + Push(AXI4Stream_SB(j +1), '1' & mask_data(Data, Keep)); + end if; + end loop; + Send(Stream_TX_Transaction, SData, "1"); + wait for NoOpRV.RandInt(MIN_WAIT_CYCLE, MAX_WAIT_CYCLE) * ns; + end loop; + + wait for 1 us; + + WaitForBarrier(TestDone); + wait; + end process; + + RX_gen : for index in 1 to NUMBER_PORTS generate + AXI4Stream_RX : process + variable OpRV : RandomPType ; + variable NoOpRV : RandomPType ; + + variable SData : std_logic_vector(71 downto 0) ; + variable Data : std_logic_vector(63 downto 0) ; + variable Keep : std_logic_vector(7 downto 0) ; + variable Last : std_logic_vector(3 downto 0); + begin + OpRV.InitSeed(OpRv'instance_name); + NoOpRV.InitSeed(NoOpRV'instance_name); + Stream_RX_Pause(index -1) <= '0'; + + wait until Reset = '0' ; + while true loop + for i in 0 to OpRV.RandInt(1, 5) loop + Get(Stream_RX_Transaction(index -1), SData, Last); + Data := SData(63 downto 0); + Keep := SData(71 downto 64); + Check(AXI4Stream_SB(index), Last(0) & mask_data(Data, Keep)); + end loop; + + Stream_RX_Pause(index -1) <= '1'; + wait for NoOpRV.RandInt(MIN_BACKPRESS_CYCLE, MAX_BACKPRESS_CYCLE) * 1 ns; + Stream_RX_Pause(index -1) <= '0'; + end loop; + end process; + end generate; + +end architecture; + + +Configuration TC_DeMux_random_mirror_multiDest of DeMux_Harness is + for Harness + for TestControl_inst : TestControl + use entity work.TestControl(TC_random_mirror_multiDest) + generic map( + MIN_PACKET_SIZE => 1, + MAX_PACKET_SIZE => 500, + NUM_PACKETS => 1500, + MIN_WAIT_CYCLE => 0, + MAX_WAIT_CYCLE => 4, + MIN_BACKPRESS_CYCLE => 1, + MAX_BACKPRESS_CYCLE => 5 + ); + end for; + for DUT : axi4stream_DeMux + use entity PoC.axi4stream_DeMux + generic map( + ADD_MIRROR_MODE => true, + OUTPUT_STAGES => 1, + ENABLE_REVERSE_USER => false + ); + end for; + end for; +end Configuration; + diff --git a/tb/bus/axi4stream/DeMux/TC_DeMux_random_withGlue.vhdl b/tb/bus/axi4stream/DeMux/TC_DeMux_random_withGlue.vhdl new file mode 100644 index 000000000..a03489082 --- /dev/null +++ b/tb/bus/axi4stream/DeMux/TC_DeMux_random_withGlue.vhdl @@ -0,0 +1,220 @@ +-- ============================================================================= +-- Authors: +-- Stefan Unrein (PLC2 Design GmbH) +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE ; +use IEEE.std_logic_1164.all ; +use IEEE.numeric_std.all ; + +library PoC; +use PoC.config.all; +use PoC.stream.all; +use PoC.vectors.all; +use PoC.strings.all; +use PoC.utils.all; + +library OSVVM ; +context OSVVM.OsvvmContext ; +use OSVVM.ScoreBoardPkg_slv.all; + +library OSVVM_AXI4; +context OSVVM_AXI4.AxiStreamContext; + +architecture TC_random_withGlue of TestControl is + constant NUMBER_PORTS : positive := Stream_RX_Transaction'length; + + signal TestDone : integer_barrier := 1 ; + + signal GenTX0_tgl : std_logic := '0'; + signal GenTX0_done_tgl : std_logic := '0'; + signal GenTX1_tgl : std_logic := '0'; + signal GenTX1_done_tgl : std_logic := '0'; + + signal AXI4Stream_SB : ScoreboardIDArrayType(1 to NUMBER_PORTS); + + function mask_data(slv : std_logic_vector; be : std_logic_vector) return std_logic_vector is + variable temp : std_logic_vector(slv'length -1 downto 0); + begin + assert slv'length / 8 = be'length report "mask_data-size dosnt match!" severity failure; + for i in 0 to be'length -1 loop + if be(i + be'low) = '1' then + temp(i * 8 +7 downto i*8) := slv(i * 8 +7 + slv'low downto i*8 + slv'low); + else + temp(i * 8 +7 downto i*8) := (others => 'X'); + end if; + end loop; + return temp; + end function; + +begin + + ControlProc : process + begin + -- Initialization of test + SetAlertLogName("TC_DeMux_random_withGlue") ; + TranscriptOpen; + SetTranscriptMirror(TRUE); + AXI4Stream_SB <= NewID("AXI4Stream_SB", NUMBER_PORTS); + LOG("PoC.Bus/AXI/AXI4Stream/DeMux Testbench."); + LOG("Start of Test 2: Random transfer, ADD_MIRROR_MODE => false, ADD_OUTPUT_GLUE => true, ENABLE_REVERSE_USER => false"); + + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs + + -- Wait for testbench initialization + wait for 0 ns ; + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts ; + LOG("Start of Transactions"); + + wait for 1 us; + + -- Wait for test to finish + WaitForBarrier(TestDone, 10 ms); + + wait for 1 us; + + AlertIf(NOW >= 10 ms, "Simulation finished due to timeout!"); + AlertIf(GetAffirmCount < 50, "Test is not Self-Checking"); + + print("") ; + EndOfTestReports;--(ReportAll => true); + print("") ; + TranscriptClose; + std.env.stop; + wait ; + end process; + + Axi4Stream_TX : process + variable OpRV : RandomPType ; + variable NoOpRV : RandomPType ; + variable BytesRV : RandomPType ; + variable GapRV : RandomPType ; + variable Bytes : natural; + variable SB : natural; + + variable Data : std_logic_vector(63 downto 0) ; + variable SData : std_logic_vector(71 downto 0) ; + variable Keep : std_logic_vector(7 downto 0) ; + begin + + OpRV.InitSeed(OpRv'instance_name); + NoOpRV.InitSeed(NoOpRV'instance_name); + BytesRV.InitSeed(BytesRV'instance_name); + GapRV.InitSeed(GapRV'instance_name); + + wait until Reset = '0' ; + wait for 50 ns; + + for index in 0 to NUM_PACKETS -1 loop + Bytes := BytesRV.RandInt(MIN_PACKET_SIZE, MAX_PACKET_SIZE); + SB := BytesRV.RandInt(0, NUMBER_PORTS); + Hit_Vector <= (others => '0'); + if SB /= 0 then + Hit_Vector(SB -1) <= '1'; + end if; + + for i in 0 to (Bytes +7) / 8 -2 loop + Data := OpRV.RandSlv(size => 64); + Keep := x"FF"; + SData := Keep & Data; + if SB /= 0 then --Data will be discarded if SB is 0 + Push(AXI4Stream_SB(SB), '0' & mask_data(Data, Keep)); + end if; + Send(Stream_TX_Transaction, SData); + end loop; + Data := OpRV.RandSlv(size => 64); + Keep := genmask_low(ite((Bytes mod 8) = 0, 8, (Bytes mod 8)), 8); + SData := Keep & Data; + + if SB /= 0 then + Push(AXI4Stream_SB(SB), '1' & mask_data(Data, Keep)); + end if; + Send(Stream_TX_Transaction, SData, "1"); + wait for NoOpRV.RandInt(MIN_WAIT_CYCLE, MAX_WAIT_CYCLE) * ns; + end loop; + + wait for 1 us; + + WaitForBarrier(TestDone); + wait; + end process; + + RX_gen : for index in 1 to NUMBER_PORTS generate + AXI4Stream_RX : process + variable OpRV : RandomPType ; + variable NoOpRV : RandomPType ; + + variable SData : std_logic_vector(71 downto 0) ; + variable Data : std_logic_vector(63 downto 0) ; + variable Keep : std_logic_vector(7 downto 0) ; + variable Last : std_logic_vector(3 downto 0); + begin + OpRV.InitSeed(OpRv'instance_name); + NoOpRV.InitSeed(NoOpRV'instance_name); + Stream_RX_Pause(index -1) <= '0'; + + wait until Reset = '0' ; + while true loop + for i in 0 to OpRV.RandInt(1, 5) loop + Get(Stream_RX_Transaction(index -1), SData, Last); + Data := SData(63 downto 0); + Keep := SData(71 downto 64); + Check(AXI4Stream_SB(index), Last(0) & mask_data(Data, Keep)); + end loop; + + Stream_RX_Pause(index -1) <= '1'; + wait for NoOpRV.RandInt(MIN_BACKPRESS_CYCLE, MAX_BACKPRESS_CYCLE) * 1 ns; + Stream_RX_Pause(index -1) <= '0'; + end loop; + end process; + end generate; + +end architecture; + + +Configuration TC_DeMux_random_withGlue of DeMux_Harness is + for Harness + for TestControl_inst : TestControl + use entity work.TestControl(TC_random_withGlue) + generic map( + MIN_PACKET_SIZE => 1, + MAX_PACKET_SIZE => 500, + NUM_PACKETS => 1500, + MIN_WAIT_CYCLE => 0, + MAX_WAIT_CYCLE => 4, + MIN_BACKPRESS_CYCLE => 1, + MAX_BACKPRESS_CYCLE => 5 + ); + end for; + for DUT : axi4stream_DeMux + use entity PoC.axi4stream_DeMux + generic map( + ADD_MIRROR_MODE => false, + OUTPUT_STAGES => 1, + ENABLE_REVERSE_USER => false + ); + end for; + end for; +end Configuration; + diff --git a/tb/bus/axi4stream/FIFO/FIFO_TestController.vhdl b/tb/bus/axi4stream/FIFO/FIFO_TestController.vhdl new file mode 100644 index 000000000..b7720e4dc --- /dev/null +++ b/tb/bus/axi4stream/FIFO/FIFO_TestController.vhdl @@ -0,0 +1,50 @@ +-- ============================================================================= +-- Authors: +-- Adrian Weiland +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; +use osvvm.ScoreboardPkg_slv.all; + +library osvvm_AXI4; +context osvvm_AXI4.AxiStreamContext; + +entity FIFO_TestController is + port ( + Clock : in std_logic; + Reset : in std_logic; + + AXIStreamTransmitter : inout StreamRecType; + AXIStreamReceiver : inout StreamRecType; + + Receiver_Pause : out std_logic; + Buffer_Full : in std_logic; + Buffer_Empty : in std_logic + ); + + -- Simplifying access to Burst FIFOs using aliases + alias TxBurstFifo : ScoreboardIdType is AXIStreamTransmitter.BurstFifo ; + alias RxBurstFifo : ScoreboardIdType is AXIStreamReceiver.BurstFifo ; + alias FIFO_WIDTH is << constant .FIFO_TestHarness.AXISTREAM_DATA_WIDTH : positive >>; +end entity; diff --git a/tb/bus/axi4stream/FIFO/FIFO_TestHarness.vhdl b/tb/bus/axi4stream/FIFO/FIFO_TestHarness.vhdl new file mode 100644 index 000000000..696b45732 --- /dev/null +++ b/tb/bus/axi4stream/FIFO/FIFO_TestHarness.vhdl @@ -0,0 +1,189 @@ +-- ============================================================================= +-- Authors: +-- Adrian Weiland +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +use PoC.axi4stream.all; + +-- library tb_common; + +context PoC.common; + +library osvvm; +context osvvm.OsvvmContext; + +library osvvm_axi4; +context osvvm_axi4.Axi4Context; +context osvvm_axi4.AxiStreamContext; + + +entity FIFO_TestHarness is +end entity; + +architecture sim of FIFO_TestHarness is + constant TPERIOD_CLOCK : time := 10 ns; + + constant AXISTREAM_DATA_WIDTH : positive := 64; + constant AXISTREAM_BYTE_WIDTH : positive := AXISTREAM_DATA_WIDTH / 8; + constant AXISTREAM_USER_WIDTH : natural := 1; + constant AXISTREAM_PARAM_WIDTH : positive := AXISTREAM_USER_WIDTH + 3; + + constant FRAMES : positive := 8; + constant MAX_PACKET_DEPTH : positive := 8; + --constant RAM_TYPE : T_RAM_TYPE := ??; -- todo: import lib + constant METADATA_IS_DYNAMIC : boolean := true; + + signal Clock_100 : std_logic := '1'; + signal Reset_100 : std_logic := '1'; + + signal In_M2S : T_AXI4Stream_M2S(Data(AXISTREAM_DATA_WIDTH -1 downto 0), User(0 downto 0), Dest(0 downto 0), ID(0 downto 0), Keep(AXISTREAM_BYTE_WIDTH -1 downto 0)); + signal In_S2M : T_AXI4Stream_S2M(User(-1 downto 0)); + signal Out_M2S : In_M2S'subtype; + signal Out_S2M : In_S2M'subtype; + + subtype StreamRecType_constr is StreamRecType( + DataToModel (AXISTREAM_DATA_WIDTH - 1 downto 0), + DataFromModel (AXISTREAM_DATA_WIDTH - 1 downto 0), + ParamToModel (AXISTREAM_PARAM_WIDTH - 1 downto 0), + ParamFromModel(AXISTREAM_PARAM_WIDTH - 1 downto 0) + ); + signal AXIStreamTransmitter : StreamRecType_constr; + signal AXIStreamReceiver : StreamRecType_constr; + + signal Receiver_Pause : std_logic := '0'; + signal Buffer_Full : std_logic := '0'; + signal Buffer_Empty : std_logic := '0'; + + component FIFO_TestController is + port ( + Clock : in std_logic; + Reset : in std_logic; + AXIStreamTransmitter : inout StreamRecType; + AXIStreamReceiver : inout StreamRecType; + Receiver_Pause : out std_logic; + Buffer_Full : in std_logic; + Buffer_Empty : in std_logic + ); + end component; +begin + Osvvm.ClockResetPkg.CreateClock( + Clk => Clock_100, + Period => TPERIOD_CLOCK + ); + + Osvvm.ClockResetPkg.CreateReset( + Reset => Reset_100, + ResetActive => '1', + Clk => Clock_100, + Period => 5 * TPERIOD_CLOCK, + tpd => 0 ns + ); + + DUT : entity PoC.axi4stream_FIFO + generic map ( + FRAMES => FRAMES, + MAX_PACKET_DEPTH => MAX_PACKET_DEPTH, + --RAM_TYPE => RAM_TYPE, + METADATA_IS_DYNAMIC => METADATA_IS_DYNAMIC + ) + port map ( + Clock => Clock_100, + Reset => Reset_100, + In_m2s => In_M2S, + In_s2m => In_S2M, + Out_m2s => Out_M2S, + Out_s2m.Ready => Out_S2M.Ready and not Receiver_Pause, + Out_s2m.User => Out_S2M.User + ); + + Buffer_Full <= not In_S2M.Ready; + Buffer_Empty <= not Out_M2S.Valid; + + blkTX: block + signal Dummy_ID : std_logic_vector(0 downto 0); + signal Dummy_Destination : std_logic_vector(0 downto 0); + signal Dummy_Strb : std_logic_vector(0 downto 0); + begin + Transmitter: entity osvvm_axi4.AxiStreamTransmitter + generic map ( + INIT_USER => "", + + tperiod_Clk => TPERIOD_CLOCK, + DEFAULT_DELAY => 0 ns + ) + port map ( + -- Testbench Transaction Interface + TransRec => AXIStreamTransmitter, + -- Globals + Clk => Clock_100, + nReset => not Reset_100, + -- AXI Stream Interface + TValid => In_M2S.Valid, + TReady => In_S2M.Ready, + TID => Dummy_ID, + TDest => Dummy_Destination, + TUser => In_M2S.User, + TData => In_M2S.Data, + TStrb => Dummy_Strb, + TKeep => In_M2S.Keep, + TLast => In_M2S.Last + ); + end block; + + Receiver: entity osvvm_axi4.AxiStreamReceiver + generic map ( + tperiod_Clk => TPERIOD_CLOCK, + tpd_Clk_TReady => 0 ns + ) + port map ( + -- Testbench Transaction Interface + TransRec => AXIStreamReceiver, + -- Globals + Clk => Clock_100, + nReset => not Reset_100, + -- AXI Master Functional Interface + TValid => Out_M2S.Valid and not Receiver_Pause, + TReady => Out_S2M.Ready, + TID => "", + TDest => "", + TUser => Out_M2S.User, + TData => Out_M2S.Data, + TStrb => "1", + TKeep => Out_M2S.Keep, + TLast => Out_M2S.Last + ); + + + TestCtrl: component FIFO_TestController + port map ( + Clock => Clock_100, + Reset => Reset_100, + AXIStreamTransmitter => AXIStreamTransmitter, + AXIStreamReceiver => AXIStreamReceiver, + Receiver_Pause => Receiver_Pause, + Buffer_Full => Buffer_Full, + Buffer_Empty => Buffer_Empty + ); + +end architecture; diff --git a/tb/bus/axi4stream/FIFO/RunAllTests.pro b/tb/bus/axi4stream/FIFO/RunAllTests.pro new file mode 100644 index 000000000..fc3a2c9f8 --- /dev/null +++ b/tb/bus/axi4stream/FIFO/RunAllTests.pro @@ -0,0 +1,29 @@ +# ============================================================================= +# Authors: +# Adrian Weiland +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +TestSuite PoC.bus.axi4stream.FIFO + +library tb_axi4stream_FIFO + +analyze FIFO_TestController.vhdl +analyze FIFO_TestHarness.vhdl + +RunTest TC_Randomized.vhdl diff --git a/tb/bus/axi4stream/FIFO/TC_Randomized.vhdl b/tb/bus/axi4stream/FIFO/TC_Randomized.vhdl new file mode 100644 index 000000000..4f60f8392 --- /dev/null +++ b/tb/bus/axi4stream/FIFO/TC_Randomized.vhdl @@ -0,0 +1,238 @@ +-- ============================================================================= +-- Authors: +-- Adrian Weiland +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +context PoC.common; + +library osvvm; +context osvvm.OsvvmContext; + +architecture Randomized of FIFO_TestController is + signal TestDone : integer_barrier := 1; + shared variable AXI4Stream_SB0 : ScoreboardPType; + + signal Transmitter_Send : bit := '0'; + signal Transmitter_Done : bit := '0'; + signal Transmitter_Bytes_to_Send : natural; + + signal Transmitter_OP_Lower : integer; + signal Transmitter_OP_Upper : integer; + signal Transmitter_NoOP_Lower : integer; + signal Transmitter_NoOP_Upper : integer; + signal Transmitter_Gap_Lower : integer; + signal Transmitter_Gap_Upper : integer; + + signal BackPressure_Op_Lower : integer; + signal BackPressure_Op_Upper : integer; + signal BackPressure_NoOp_Lower : integer; + signal BackPressure_NoOp_Upper : integer; + +begin + ControlProc: process + begin + -- Initialization of test + SetAlertLogName("TC_Randomized"); + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs + + -- Wait for testbench initialization + wait for 0 ns; wait for 0 ns; + TranscriptOpen; + SetTranscriptMirror(TRUE); + + AXI4Stream_SB0.SetAlertLogId("AXI4Stream_0"); + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts; + + -- Wait for test to finish + WaitForBarrier(TestDone, 10 ms); + AlertIf(now >= 10 ms, "Test finished due to timeout"); + AlertIf(GetAffirmCount < 1, "Test is not Self-Checking"); + + EndOfTestReports(ReportAll => TRUE); + TranscriptClose; + std.env.stop; + wait; + end process; + + DispatchProc : process + variable BytesRV : RandomPType ; + + variable fifo_size : natural := 0; + begin + + -- Buffer_Full + -- Buffer_Empty + + Transmitter_OP_Lower <= 1; + Transmitter_OP_Upper <= 8; + Transmitter_NoOP_Lower <= 0; + Transmitter_NoOP_Upper <= 3; + Transmitter_Gap_Lower <= 0; + Transmitter_Gap_Upper <= 3; + + BackPressure_Op_Lower <= 0; + BackPressure_Op_Upper <= 0; + BackPressure_NoOp_Lower <= 1; + BackPressure_NoOp_Upper <= 1; + + Transmitter_Bytes_to_Send <= 8; + + while Buffer_Full = '0' loop + fifo_size := fifo_size + 8; + Toggle(Transmitter_Send); + wait until Transmitter_Done = '1'; + end loop; + -- AffirmIf(fifo_size <= 8*8*8, "Fifo-size is " & integer'image(fifo_size -8), ", expected 512B."); + + + BackPressure_Op_Lower <= 0; + BackPressure_Op_Upper <= 3; + BackPressure_NoOp_Lower <= 0; + BackPressure_NoOp_Upper <= 2; + + while Buffer_Empty = '0' loop + wait for 10 ns; + end loop; + + for i in 0 to 511 loop + Transmitter_Bytes_to_Send <= BytesRV.RandInt(1, 256); + + Toggle(Transmitter_Send); + wait until Transmitter_Done = '1'; + + end loop; + + wait for 50 ns; + WaitForBarrier(TestDone); + wait; + end process; + + + AxiTransmitterProc : process + variable DataRV : RandomPType ; + variable OpRV : RandomPType ; + variable NoOpRV : RandomPType ; + variable GapRV : RandomPType ; + variable Bytes : natural; + variable i : natural; + variable Data : std_logic_vector(63 downto 0); + begin + + DataRV.InitSeed(DataRV'instance_name); + OpRV.InitSeed(OpRv'instance_name); + NoOpRV.InitSeed(NoOpRV'instance_name); + GapRV.InitSeed(GapRV'instance_name); + + Transmitter_Done <= '0'; + + wait until Reset = '0'; + WaitForClock(AXIStreamTransmitter, 2); + + loop + Transmitter_Done <= '1'; + WaitForToggle(Transmitter_Send); + + Transmitter_Done <= '0'; + + Bytes := Transmitter_Bytes_to_Send; + i := 0; + + Byte_loop : while i < Bytes loop + for j in 0 to OpRV.RandInt(Transmitter_OP_Lower, Transmitter_OP_Upper) loop + Data := DataRV.RandSlv(size => 64); + + if (i + 8) >= Bytes then + + if (Bytes mod 8) > 0 then + Data(Data'high downto 8 * (Bytes mod 8)) := (others => 'U'); + end if; + AXI4Stream_SB0.Push("1" & Data); + Send(AXIStreamTransmitter, Data, "1"); + + exit Byte_loop; + else + AXI4Stream_SB0.Push("0" & Data); + Send(AXIStreamTransmitter, Data); + i := i +8; + end if; + end loop; + + WaitForClock(AXIStreamTransmitter, NoOpRV.RandInt(Transmitter_NoOP_Lower, Transmitter_NoOP_Upper)); + + end loop; + + WaitForClock(AXIStreamTransmitter, GapRV.RandInt(Transmitter_Gap_Lower, Transmitter_Gap_Upper)); + end loop; + + end process AxiTransmitterProc; + + + AxiReceiverProc : process + variable Data : std_logic_vector(63 downto 0) ; + variable Last : std_logic_vector(3 downto 0); + begin + + wait until Reset = '0'; + + loop + Get(AXIStreamReceiver, Data, Last); + AXI4Stream_SB0.Check(Last(0) & Data); + end loop; + end process AxiReceiverProc; + + Receiver_Pause_Proc : process + variable OpRV : RandomPType ; + variable NoOpRV : RandomPType ; + begin + OpRV.InitSeed(OpRv'instance_name); + NoOpRV.InitSeed(NoOpRV'instance_name); + + Receiver_Pause <= '0'; + + wait until Reset = '0'; + + loop + Receiver_Pause <= '0'; + WaitForClock(Clock, OpRV.RandInt(BackPressure_Op_Lower, BackPressure_Op_Upper)); + + Receiver_Pause <= '1'; + WaitForClock(Clock, NoOpRV.RandInt(BackPressure_NoOp_Lower, BackPressure_NoOp_Upper)); + end loop; + + end process; + +end architecture; + + +configuration TC_Randomized of FIFO_TestHarness is + for sim + for TestCtrl: FIFO_TestController + use entity work.FIFO_TestController(Randomized); + end for; + end for; +end configuration; diff --git a/tb/bus/axi4stream/FIFO_CDC/FIFO_CDC_TestController.vhdl b/tb/bus/axi4stream/FIFO_CDC/FIFO_CDC_TestController.vhdl new file mode 100644 index 000000000..1b1e4d8b3 --- /dev/null +++ b/tb/bus/axi4stream/FIFO_CDC/FIFO_CDC_TestController.vhdl @@ -0,0 +1,54 @@ +-- ============================================================================= +-- Authors: +-- Adrian Weiland +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library osvvm; +context osvvm.OsvvmContext; +use osvvm.ScoreboardPkg_slv.all; + +library osvvm_AXI4; +context osvvm_AXI4.AxiStreamContext; + +entity FIFO_CDC_TestController is + generic( + Test_index : natural + ); + port ( + TestDone : inout integer_barrier; + Clock : in std_logic; + Reset : in std_logic; + + AXIStreamTransmitter : inout StreamRecType; + AXIStreamReceiver : inout StreamRecType; + + Receiver_Pause : out std_logic; + Buffer_Full : in std_logic; + Buffer_Empty : in std_logic + ); + + -- Simplifying access to Burst FIFOs using aliases + alias TxBurstFifo : ScoreboardIdType is AXIStreamTransmitter.BurstFifo ; + alias RxBurstFifo : ScoreboardIdType is AXIStreamReceiver.BurstFifo ; + alias FIFO_WIDTH is << constant .FIFO_CDC_TestHarness.AXISTREAM_DATA_WIDTH : positive >>; +end entity; diff --git a/tb/bus/axi4stream/FIFO_CDC/FIFO_CDC_TestHarness.vhdl b/tb/bus/axi4stream/FIFO_CDC/FIFO_CDC_TestHarness.vhdl new file mode 100644 index 000000000..2c0718eeb --- /dev/null +++ b/tb/bus/axi4stream/FIFO_CDC/FIFO_CDC_TestHarness.vhdl @@ -0,0 +1,230 @@ +-- ============================================================================= +-- Authors: +-- Adrian Weiland +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +use PoC.axi4stream.all; + +-- library tb_common; + +context PoC.common; + +library osvvm; +context osvvm.OsvvmContext; + +library osvvm_axi4; +context osvvm_axi4.Axi4Context; +context osvvm_axi4.AxiStreamContext; + + +entity FIFO_CDC_TestHarness is +end entity; + +architecture sim of FIFO_CDC_TestHarness is + type Test_rec is record + In_Clock_Freq : time; + Out_Clock_Freq : time; + end record; + type Test_v is array(NATURAL range <>) of Test_rec; + + constant FIFO_CDC_Test_vector : Test_v := ( + 0 => (In_Clock_Freq => 10 ns, Out_Clock_Freq => 10 ns), -- Same freq + 1 => (In_Clock_Freq => 20 ns, Out_Clock_Freq => 10 ns), --double input + 2 => (In_Clock_Freq => 20 ns, Out_Clock_Freq => 5 ns), --quadruple input + 3 => (In_Clock_Freq => 50 ns, Out_Clock_Freq => 5 ns), --ten times input + 4 => (In_Clock_Freq => 10 ns, Out_Clock_Freq => 20 ns), --double output + 5 => (In_Clock_Freq => 5 ns, Out_Clock_Freq => 20 ns), --quadruple output + 6 => (In_Clock_Freq => 5 ns, Out_Clock_Freq => 50 ns) --ten times output + ); + + + constant AXISTREAM_DATA_WIDTH : positive := 64; + constant AXISTREAM_BYTE_WIDTH : positive := AXISTREAM_DATA_WIDTH / 8; + constant AXISTREAM_PARAM_WIDTH : positive := 8 + 8 + 8 +1; + + constant FRAMES : positive := 8; + constant MAX_PACKET_DEPTH : positive := 8; + --constant RAM_TYPE : T_RAM_TYPE := ??; -- todo: import lib + constant USER_IS_DYNAMIC : boolean := true; + + component FIFO_CDC_TestController is + generic( + Test_index : natural + ); + port ( + TestDone : inout integer_barrier; + Clock : in std_logic; + Reset : in std_logic; + AXIStreamTransmitter : inout StreamRecType; + AXIStreamReceiver : inout StreamRecType; + Receiver_Pause : out std_logic; + Buffer_Full : in std_logic; + Buffer_Empty : in std_logic + ); + end component; + + signal TestDone : integer_barrier := 1; +begin + Test_Vector_gen : for i in FIFO_CDC_Test_vector'range generate + signal In_Clock : std_logic := '1'; + signal In_Reset : std_logic := '1'; + signal Out_Clock : std_logic := '1'; + signal Out_Reset : std_logic := '1'; + + signal In_M2S : T_AXI4Stream_M2S(Data(AXISTREAM_DATA_WIDTH -1 downto 0), User(7 downto 0), Dest(7 downto 0), ID(7 downto 0), Keep(AXISTREAM_BYTE_WIDTH -1 downto 0)); + signal In_S2M : T_AXI4Stream_S2M(User(-1 downto 0)); + signal Out_M2S : In_M2S'subtype; + signal Out_S2M : In_S2M'subtype; + + + subtype StreamRecType_constr is StreamRecType( + DataToModel (AXISTREAM_DATA_WIDTH - 1 downto 0), + DataFromModel (AXISTREAM_DATA_WIDTH - 1 downto 0), + ParamToModel (AXISTREAM_PARAM_WIDTH - 1 downto 0), + ParamFromModel(AXISTREAM_PARAM_WIDTH - 1 downto 0) + ); + signal AXIStreamTransmitter : StreamRecType_constr; + signal AXIStreamReceiver : StreamRecType_constr; + + signal Receiver_Pause : std_logic := '0'; + signal Buffer_Full : std_logic := '0'; + signal Buffer_Empty : std_logic := '0'; + + begin + Osvvm.ClockResetPkg.CreateClock( + Clk => In_Clock, + Period => FIFO_CDC_Test_vector(i).In_Clock_Freq + ); + Osvvm.ClockResetPkg.CreateClock( + Clk => Out_Clock, + Period => FIFO_CDC_Test_vector(i).Out_Clock_Freq + ); + + Osvvm.ClockResetPkg.CreateReset( + Reset => In_Reset, + ResetActive => '1', + Clk => In_Clock, + Period => 100 ns, + tpd => 0 ns + ); + Osvvm.ClockResetPkg.CreateReset( + Reset => Out_Reset, + ResetActive => '1', + Clk => Out_Clock, + Period => 100 ns, + tpd => 0 ns + ); + + DUT : entity PoC.axi4stream_FIFO_CDC + generic map ( + FRAMES => FRAMES, + MAX_PACKET_DEPTH => MAX_PACKET_DEPTH, + --RAM_TYPE => RAM_TYPE, + USER_IS_DYNAMIC => USER_IS_DYNAMIC + ) + port map ( + In_Clock => In_Clock, + In_Reset => In_Reset, + In_M2S => In_M2S, + In_S2M => In_S2M, + + Out_Clock => Out_Clock, + Out_Reset => Out_Reset, + Out_M2S => Out_M2S, + Out_S2M.Ready => Out_S2M.Ready and not Receiver_Pause, + Out_S2M.User => Out_S2M.User + ); + + Buffer_Full <= not In_S2M.Ready; + Buffer_Empty <= not Out_M2S.Valid; + + blkTX: block + signal Dummy_Strb : std_logic_vector(-1 downto 0); + begin + Transmitter: entity osvvm_axi4.AxiStreamTransmitter + generic map ( + INIT_USER => "", + + tperiod_Clk => FIFO_CDC_Test_vector(i).In_Clock_Freq, + DEFAULT_DELAY => 0 ns + ) + port map ( + -- Testbench Transaction Interface + TransRec => AXIStreamTransmitter, + -- Globals + Clk => In_Clock, + nReset => not In_Reset, + -- AXI Stream Interface + TValid => In_M2S.Valid, + TReady => In_S2M.Ready, + TID => In_M2S.ID, + TDest => In_M2S.Dest, + TUser => In_M2S.User, + TData => In_M2S.Data, + TStrb => Dummy_Strb, + TKeep => In_M2S.Keep, + TLast => In_M2S.Last + ); + end block; + + Receiver: entity osvvm_axi4.AxiStreamReceiver + generic map ( + tperiod_Clk => FIFO_CDC_Test_vector(i).Out_Clock_Freq, + tpd_Clk_TReady => 0 ns + ) + port map ( + -- Testbench Transaction Interface + TransRec => AXIStreamReceiver, + -- Globals + Clk => Out_Clock, + nReset => not Out_Reset, + -- AXI Master Functional Interface + TValid => Out_M2S.Valid and not Receiver_Pause, + TReady => Out_S2M.Ready, + TID => Out_M2S.ID, + TDest => Out_M2S.Dest, + TUser => Out_M2S.User, + TData => Out_M2S.Data, + TStrb => "1", + TKeep => Out_M2S.Keep, + TLast => Out_M2S.Last + ); + + + TestCtrl: component FIFO_CDC_TestController + generic map( + Test_index => i + ) + port map ( + TestDone => TestDone, + Clock => Out_Clock, + Reset => Out_Reset, + AXIStreamTransmitter => AXIStreamTransmitter, + AXIStreamReceiver => AXIStreamReceiver, + Receiver_Pause => Receiver_Pause, + Buffer_Full => Buffer_Full, + Buffer_Empty => Buffer_Empty + ); + end generate; +end architecture; diff --git a/tb/bus/axi4stream/FIFO_CDC/RunAllTests.pro b/tb/bus/axi4stream/FIFO_CDC/RunAllTests.pro new file mode 100644 index 000000000..df39de3ee --- /dev/null +++ b/tb/bus/axi4stream/FIFO_CDC/RunAllTests.pro @@ -0,0 +1,30 @@ +# ============================================================================= +# Authors: +# Adrian Weiland +# Stefan Unrein +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +TestSuite PoC.bus.axi4stream.FIFO_CDC + +library tb_axi4stream_FIFO_CDC + +analyze FIFO_CDC_TestController.vhdl +analyze FIFO_CDC_TestHarness.vhdl + +RunTest TC_Randomized.vhdl diff --git a/tb/bus/axi4stream/FIFO_CDC/TC_Randomized.vhdl b/tb/bus/axi4stream/FIFO_CDC/TC_Randomized.vhdl new file mode 100644 index 000000000..03287f966 --- /dev/null +++ b/tb/bus/axi4stream/FIFO_CDC/TC_Randomized.vhdl @@ -0,0 +1,272 @@ +-- ============================================================================= +-- Authors: +-- Adrian Weiland +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +context PoC.common; + +library osvvm; +context osvvm.OsvvmContext; + +architecture Randomized of FIFO_CDC_TestController is + + shared variable AXI4Stream_SB0 : ScoreboardPType; + + signal Transmitter_Send : bit := '0'; + signal Transmitter_Done : bit := '0'; + signal Transmitter_Bytes_to_Send : natural; + + signal Transmitter_OP_Lower : integer; + signal Transmitter_OP_Upper : integer; + signal Transmitter_NoOP_Lower : integer; + signal Transmitter_NoOP_Upper : integer; + signal Transmitter_Gap_Lower : integer; + signal Transmitter_Gap_Upper : integer; + + signal BackPressure_Op_Lower : integer; + signal BackPressure_Op_Upper : integer; + signal BackPressure_NoOp_Lower : integer; + signal BackPressure_NoOp_Upper : integer; + +begin + ControlProc: process + begin + -- Initialization of test + if Test_index = 0 then + SetTestName("TC_Randomized"); + end if; + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs + + -- Wait for testbench initialization + wait for 0 ns; wait for 0 ns; + TranscriptOpen; + SetTranscriptMirror(TRUE); + + AXI4Stream_SB0.SetAlertLogId("AXI4Stream_" & integer'image(Test_index)); + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts; + + -- Wait for test to finish + WaitForBarrier(TestDone, 10 ms); + AlertIf(now >= 10 ms, "Test finished due to timeout"); + AlertIf(GetAffirmCount < 100, "Test is not Self-Checking"); + + EndOfTestReports(ReportAll => TRUE); + TranscriptClose; + std.env.stop; + wait; + end process; + + DispatchProc : process + variable BytesRV : RandomPType ; + + variable fifo_size : natural := 0; + begin + + Transmitter_OP_Lower <= 1; + Transmitter_OP_Upper <= 8; + Transmitter_NoOP_Lower <= 0; + Transmitter_NoOP_Upper <= 3; + Transmitter_Gap_Lower <= 0; + Transmitter_Gap_Upper <= 3; + + BackPressure_Op_Lower <= 0; + BackPressure_Op_Upper <= 0; + BackPressure_NoOp_Lower <= 1; + BackPressure_NoOp_Upper <= 1; + + Transmitter_Bytes_to_Send <= 8; + + while Buffer_Full = '0' loop + fifo_size := fifo_size + 8; + Toggle(Transmitter_Send); + wait until Transmitter_Done = '1'; + end loop; + -- AffirmIf(fifo_size <= 8*8*8, "Fifo-size is " & integer'image(fifo_size -8), ", expected 512B."); + + + BackPressure_Op_Lower <= 0; + BackPressure_Op_Upper <= 3; + BackPressure_NoOp_Lower <= 0; + BackPressure_NoOp_Upper <= 2; + + while Buffer_Empty = '0' loop + wait for 10 ns; + end loop; + + for i in 0 to 511 loop --Big Packets + Transmitter_Bytes_to_Send <= BytesRV.RandInt(1, 256); + + Toggle(Transmitter_Send); + wait until Transmitter_Done = '1'; + end loop; + while Buffer_Empty = '0' loop + wait for 10 ns; + end loop; + + for i in 0 to 511 loop --Medium Packets + Transmitter_Bytes_to_Send <= BytesRV.RandInt(1, 128); + + Toggle(Transmitter_Send); + wait until Transmitter_Done = '1'; + end loop; + while Buffer_Empty = '0' loop + wait for 10 ns; + end loop; + + for i in 0 to 511 loop --Small Packets + Transmitter_Bytes_to_Send <= BytesRV.RandInt(1, 20); + + Toggle(Transmitter_Send); + wait until Transmitter_Done = '1'; + end loop; + while Buffer_Empty = '0' loop + wait for 10 ns; + end loop; + + wait on Clock until (Buffer_Empty = '1') or AXI4Stream_SB0.Empty; + + wait for 1 us; + AffirmIf(Buffer_Full = '0', "Buffer full check.", "Buffer is Full!"); + AffirmIf(Buffer_Empty = '1', "Buffer empty check.", "Buffer should be empty."); + AffirmIf(AXI4Stream_SB0.Empty, "SC empty check.", "SC should be empty."); + WaitForBarrier(TestDone); + wait; + end process; + + + AxiTransmitterProc : process + variable DataRV : RandomPType ; + variable OpRV : RandomPType ; + variable NoOpRV : RandomPType ; + variable GapRV : RandomPType ; + variable Bytes : natural; + variable i : natural; + variable Data : std_logic_vector(63 downto 0); + variable Dest : std_logic_vector(7 downto 0); + variable ID : std_logic_vector(7 downto 0); + variable User : std_logic_vector(7 downto 0); + begin + + DataRV.InitSeed(DataRV'instance_name); + OpRV.InitSeed(OpRv'instance_name); + NoOpRV.InitSeed(NoOpRV'instance_name); + GapRV.InitSeed(GapRV'instance_name); + + Transmitter_Done <= '0'; + + wait until Reset = '0'; + WaitForClock(AXIStreamTransmitter, 2); + + loop + Transmitter_Done <= '1'; + WaitForToggle(Transmitter_Send); + + Transmitter_Done <= '0'; + + Bytes := Transmitter_Bytes_to_Send; + i := 0; + Dest := DataRV.RandSlv(size => 8); + ID := DataRV.RandSlv(size => 8); + + Byte_loop : while i < Bytes loop + for j in 0 to OpRV.RandInt(Transmitter_OP_Lower, Transmitter_OP_Upper) loop + User := DataRV.RandSlv(size => 8); + Data := DataRV.RandSlv(size => 64); + + if (i + 8) >= Bytes then + + if (Bytes mod 8) > 0 then + Data(Data'high downto 8 * (Bytes mod 8)) := (others => 'U'); + end if; + AXI4Stream_SB0.Push(ID & Dest & User & "1" & Data); + Send(AXIStreamTransmitter, Data, ID & Dest & User & "1"); + + exit Byte_loop; + else + AXI4Stream_SB0.Push(ID & Dest & User & "0" & Data); + Send(AXIStreamTransmitter, Data, ID & Dest & User & "0"); + i := i +8; + end if; + end loop; + + WaitForClock(AXIStreamTransmitter, NoOpRV.RandInt(Transmitter_NoOP_Lower, Transmitter_NoOP_Upper)); + + end loop; + + WaitForClock(AXIStreamTransmitter, GapRV.RandInt(Transmitter_Gap_Lower, Transmitter_Gap_Upper)); + end loop; + + end process AxiTransmitterProc; + + + AxiReceiverProc : process + variable Data : std_logic_vector(63 downto 0) ; + variable Param : std_logic_vector(24 downto 0); + begin + + wait until Reset = '0'; + + loop + Get(AXIStreamReceiver, Data, Param); + AXI4Stream_SB0.Check(Param & Data); + end loop; + end process AxiReceiverProc; + + Receiver_Pause_Proc : process + variable OpRV : RandomPType ; + variable NoOpRV : RandomPType ; + begin + OpRV.InitSeed(OpRv'instance_name); + NoOpRV.InitSeed(NoOpRV'instance_name); + + Receiver_Pause <= '0'; + + wait until Reset = '0'; + + loop + Receiver_Pause <= '0'; + WaitForClock(Clock, OpRV.RandInt(BackPressure_Op_Lower, BackPressure_Op_Upper)); + + Receiver_Pause <= '1'; + WaitForClock(Clock, NoOpRV.RandInt(BackPressure_NoOp_Lower, BackPressure_NoOp_Upper)); + end loop; + + end process; + +end architecture; + + +configuration TC_Randomized of FIFO_CDC_TestHarness is + for sim + for Test_Vector_gen + for TestCtrl: FIFO_CDC_TestController + use entity work.FIFO_CDC_TestController(Randomized); + end for; + end for; + end for; +end configuration; diff --git a/tb/bus/axi4stream/Mux/RunAllTests.pro b/tb/bus/axi4stream/Mux/RunAllTests.pro new file mode 100644 index 000000000..1c90acb45 --- /dev/null +++ b/tb/bus/axi4stream/Mux/RunAllTests.pro @@ -0,0 +1,31 @@ +# ============================================================================= +# Authors: +# Adrian Weiland +# Stefan Unrein +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +TestSuite PoC.bus.axi4stream.Mux + +library tb_axi4stream_Mux + +analyze TestController_e.vhdl +analyze tb_axi4stream_mux.vhdl + +RunTest TC_RandomTransfer.vhdl +RunTest TC_RandomTransfer_delay.vhdl diff --git a/tb/bus/axi4stream/Mux/TC_RandomTransfer.tcl b/tb/bus/axi4stream/Mux/TC_RandomTransfer.tcl new file mode 100644 index 000000000..be2245b9b --- /dev/null +++ b/tb/bus/axi4stream/Mux/TC_RandomTransfer.tcl @@ -0,0 +1,32 @@ +onerror { resume } +set curr_transcript [transcript] +transcript off + +add wave /tb_axi4stream_mux/DUT/Clock +add wave /tb_axi4stream_mux/DUT/Reset +add wave /tb_axi4stream_mux/DUT/MuxControl +add wave /tb_axi4stream_mux/DUT/In_M2S +add wave /tb_axi4stream_mux/DUT/In_S2M +add wave /tb_axi4stream_mux/DUT/Out_M2S +add wave /tb_axi4stream_mux/DUT/Out_S2M +add wave /tb_axi4stream_mux/DUT/State +add wave /tb_axi4stream_mux/DUT/NextState +add wave /tb_axi4stream_mux/DUT/FSM_Dataflow_en +add wave /tb_axi4stream_mux/DUT/RequestVector +add wave /tb_axi4stream_mux/DUT/RequestWithSelf +add wave /tb_axi4stream_mux/DUT/RequestWithoutSelf +add wave /tb_axi4stream_mux/DUT/RequestLeft +add wave /tb_axi4stream_mux/DUT/SelectLeft +add wave /tb_axi4stream_mux/DUT/SelectRight +add wave /tb_axi4stream_mux/DUT/ChannelPointer_en +add wave /tb_axi4stream_mux/DUT/ChannelPointer +add wave /tb_axi4stream_mux/DUT/ChannelPointer_d +add wave /tb_axi4stream_mux/DUT/ChannelPointer_nxt +add wave /tb_axi4stream_mux/DUT/ChannelPointer_bin +add wave /tb_axi4stream_mux/DUT/idx +add wave /tb_axi4stream_mux/DUT/Out_Last_i +wv.cursors.add -time 1090ns+4 -name {Default cursor} +wv.cursors.setactive -name {Default cursor} +wv.zoom.range -from 0fs -to 300ns +wv.time.unit.auto.set +transcript $curr_transcript diff --git a/tb/bus/axi4stream/Mux/TC_RandomTransfer.vhdl b/tb/bus/axi4stream/Mux/TC_RandomTransfer.vhdl new file mode 100644 index 000000000..f982d3817 --- /dev/null +++ b/tb/bus/axi4stream/Mux/TC_RandomTransfer.vhdl @@ -0,0 +1,192 @@ +-- ============================================================================= +-- Authors: Stefan Unrein +-- +-- Entity: Testcases for AXI4 stream Multiplexer. +-- +-- Description: +-- ------------------------------------- +-- .. TODO:: No documentation available. +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +use PoC.config.all; +use PoC.stream.all; +use PoC.vectors.all; +use PoC.strings.all; +use PoC.utils.all; + +library OSVVM; +context OSVVM.OsvvmContext; +use OSVVM.ScoreBoardPkg_slv.all; + +library OSVVM_AXI4; +context OSVVM_AXI4.AxiStreamContext; + + +architecture RandomTransfer of TestController is + constant MIN_PACKET_SIZE : positive := 1; + constant MAX_PACKET_SIZE : positive := 20 * DATA_BYTES; + constant NUM_PACKETS : positive := 100; + + constant TestName : string := "TC_RandomTransfer"; + signal TestDone : integer_barrier := 1; + signal Sync : integer_barrier := 1; + + signal AXI4StreamData_SB : ScoreboardIDArrayType(0 to DEST_PORTS - 1); + signal AXI4StreamParam_SB : ScoreboardIDArrayType(0 to DEST_PORTS - 1); +begin + + ------------------------------------------------------------ + -- ControlProc + -- Set up AlertLog and wait for end of test + ------------------------------------------------------------ + ControlProc : process + begin + -- Initialization of test + SetTestName(TestName); + TranscriptOpen; + SetTranscriptMirror(TRUE); + AXI4StreamData_SB <= NewID("AXI4StreamData_SB", DEST_PORTS); + AXI4StreamParam_SB <= NewID("AXI4StreamParam_SB", DEST_PORTS); + + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs + + -- Wait for testbench initialization + wait for 0 ns; + wait for 0 ns; + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts; + LOG("Start of Transactions"); + + -- Wait for test to finish + WaitForBarrier(TestDone, 10 ms); + + AlertIf(now >= 10 ms, "Test finished due to timeout"); + AlertIf(GetAffirmCount < 100, "Test is not Self-Checking"); + + wait for 1 ns; + + EndOfTestReports(ReportAll => TRUE); + TranscriptClose; + std.env.stop; + wait; + end process; + + ------------------------------------------------------------ + -- AxiTransmitterProc + -- Generate transactions for AxiTransmitter + ------------------------------------------------------------ + Transmitter_gen : for i in 0 to DEST_PORTS - 1 generate + AxiTransmitterProc : process + variable OpRV : RandomPType; + variable BytesRV : RandomPType; + variable Bytes : natural; + variable Data : integer_vector(1 to MAX_PACKET_SIZE); + + variable ID : std_logic_vector(ID_LEN - 1 downto 0); + variable Dest : std_logic_vector(DEST_LEN - 1 downto 0); + variable User : std_logic_vector(USER_LEN - 1 downto 0); + variable Param : std_logic_vector(ID_LEN + DEST_LEN + USER_LEN downto 0); + variable ExpParam : std_logic_vector(ID_LEN + DEST_LEN +2 + USER_LEN downto 0); + begin + OpRV.InitSeed(OpRv'instance_name); + BytesRV.InitSeed(BytesRV'instance_name); + + wait until Reset = '0'; + SetBurstMode(StreamTxRec(i), STREAM_BURST_BYTE_MODE); -- Put Burst FIFO in Byte Mode + WaitForClock(StreamTxRec(i), 2); + + for packet in 1 to NUM_PACKETS loop + Bytes := BytesRV.RandInt(MIN_PACKET_SIZE, MAX_PACKET_SIZE); + Data(1 to Bytes) := BytesRV.RandIntV(0, 255, Bytes); -- Generate a packetBytes + + ID := to_slv(to_unsigned(i, ID_LEN)); + Dest := BytesRV.RandSlv(DEST_LEN); + User := BytesRV.RandSlv(USER_LEN); + Param := ID & Dest & User & '1'; + ExpParam := ID & ID(2 downto 0) & Dest & User; + + Log("IF " & integer'image(i) & ": Sending Packet " & integer'image(packet) & " of length " & integer'image(Bytes) & " with param=" & PoC.strings.to_string(Param(Param'high downto 1), 'h'), INFO); + + wait for 1 ns; + PushBurstVector(AXI4StreamData_SB(i), Data(1 to Bytes), 8); + Push( AXI4StreamParam_SB(i), ExpParam); + wait for 1 ns; + SendBurstVector(StreamTxRec(i), Data(1 to Bytes), Param, 8); + end loop; + + -- Wait for outputs to propagate and signal TestDone + WaitForClock(StreamTxRec(i), 2); + WaitForBarrier(TestDone); + wait; + end process; + end generate; + + ------------------------------------------------------------ + -- AxiReceiverProc + -- Generate transactions for AxiReceiver + ------------------------------------------------------------ + AxiReceiverProc : process + variable ExpData, RxData : std_logic_vector(DATA_WIDTH - 1 downto 0); + variable OffSet : integer; + variable TryCount : integer; + variable Available : boolean; + + variable ID : std_logic_vector(ID_LEN - 1 downto 0); + variable Dest : std_logic_vector(DEST_LEN + 2 downto 0); + variable User : std_logic_vector(USER_LEN - 1 downto 0); + variable Last : std_logic; + variable RxParam : std_logic_vector(ID_LEN + DEST_LEN +3 + USER_LEN downto 0); + variable Data : integer_vector(1 to MAX_PACKET_SIZE); + variable PacketLength : natural; + variable index : natural; + begin + wait until Reset = '0'; + SetBurstMode(StreamRxRec, STREAM_BURST_BYTE_MODE); -- Put Burst FIFO in Byte Mode + WaitForClock(StreamRxRec); + + for i in 0 to DEST_PORTS * NUM_PACKETS - 1 loop + GetBurst(StreamRxRec, PacketLength, RxParam); + (ID, Dest, User, Last) := RxParam; + index := to_integer(unsigned(ID)); + + Log("Received Packet of length " & integer'image(PacketLength) & " with ID=" & PoC.strings.to_string(ID, 'h') & " with Dest=" & PoC.strings.to_string(Dest, 'h') & " with User=" & PoC.strings.to_string(User, 'h'), INFO); + + Check(AXI4StreamParam_SB(index), ID & Dest & User); + CheckBurstFifo(AXI4StreamData_SB(index), StreamRxRec.BurstFifo, PacketLength); + end loop; + wait; + end process; + +end architecture; + +configuration TC_RandomTransfer of tb_axi4stream_mux is + for TestHarness + for TestCtrl : TestController + use entity work.TestController(RandomTransfer); + end for; + end for; +end configuration; diff --git a/tb/bus/axi4stream/Mux/TC_RandomTransfer_delay.tcl b/tb/bus/axi4stream/Mux/TC_RandomTransfer_delay.tcl new file mode 100644 index 000000000..15ce795f2 --- /dev/null +++ b/tb/bus/axi4stream/Mux/TC_RandomTransfer_delay.tcl @@ -0,0 +1,32 @@ +onerror { resume } +set curr_transcript [transcript] +transcript off + +add wave /tb_axi4stream_mux/DUT/Clock +add wave /tb_axi4stream_mux/DUT/Reset +add wave /tb_axi4stream_mux/DUT/MuxControl +add wave /tb_axi4stream_mux/DUT/In_M2S +add wave /tb_axi4stream_mux/DUT/In_S2M +add wave /tb_axi4stream_mux/DUT/Out_M2S +add wave /tb_axi4stream_mux/DUT/Out_S2M +add wave /tb_axi4stream_mux/DUT/State +add wave /tb_axi4stream_mux/DUT/NextState +add wave /tb_axi4stream_mux/DUT/FSM_Dataflow_en +add wave /tb_axi4stream_mux/DUT/RequestVector +add wave /tb_axi4stream_mux/DUT/RequestWithSelf +add wave /tb_axi4stream_mux/DUT/RequestWithoutSelf +add wave /tb_axi4stream_mux/DUT/RequestLeft +add wave /tb_axi4stream_mux/DUT/SelectLeft +add wave /tb_axi4stream_mux/DUT/SelectRight +add wave /tb_axi4stream_mux/DUT/ChannelPointer_en +add wave /tb_axi4stream_mux/DUT/ChannelPointer +add wave /tb_axi4stream_mux/DUT/ChannelPointer_d +add wave /tb_axi4stream_mux/DUT/ChannelPointer_nxt +add wave /tb_axi4stream_mux/DUT/ChannelPointer_bin +add wave /tb_axi4stream_mux/DUT/idx +add wave /tb_axi4stream_mux/DUT/Out_Last_i +wv.cursors.add -time 9140ns -name {Default cursor} +wv.cursors.setactive -name {Default cursor} +wv.zoom.range -from 0fs -to 9944437ps +wv.time.unit.auto.set +transcript $curr_transcript diff --git a/tb/bus/axi4stream/Mux/TC_RandomTransfer_delay.vhdl b/tb/bus/axi4stream/Mux/TC_RandomTransfer_delay.vhdl new file mode 100644 index 000000000..c10998c69 --- /dev/null +++ b/tb/bus/axi4stream/Mux/TC_RandomTransfer_delay.vhdl @@ -0,0 +1,194 @@ +-- ============================================================================= +-- Authors: Stefan Unrein +-- +-- Entity: Testcases for AXI4 stream Multiplexer. +-- +-- Description: +-- ------------------------------------- +-- .. TODO:: No documentation available. +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +use PoC.config.all; +use PoC.stream.all; +use PoC.vectors.all; +use PoC.strings.all; +use PoC.utils.all; + +library OSVVM; +context OSVVM.OsvvmContext; +use OSVVM.ScoreBoardPkg_slv.all; + +library OSVVM_AXI4; +context OSVVM_AXI4.AxiStreamContext; + + +architecture RandomTransfer_delay of TestController is + constant MIN_PACKET_SIZE : positive := 1; + constant MAX_PACKET_SIZE : positive := 5 * DATA_BYTES; + constant NUM_PACKETS : positive := 20000; + + constant TestName : string := "TC_RandomTransfer_delay"; + signal TestDone : integer_barrier := 1; + signal Sync : integer_barrier := 1; + + signal AXI4StreamData_SB : ScoreboardIDArrayType(0 to DEST_PORTS - 1); + signal AXI4StreamParam_SB : ScoreboardIDArrayType(0 to DEST_PORTS - 1); +begin + + ------------------------------------------------------------ + -- ControlProc + -- Set up AlertLog and wait for end of test + ------------------------------------------------------------ + ControlProc : process + begin + -- Initialization of test + SetTestName(TestName); + TranscriptOpen; + SetTranscriptMirror(TRUE); + AXI4StreamData_SB <= NewID("AXI4StreamData_SB", DEST_PORTS); + AXI4StreamParam_SB <= NewID("AXI4StreamParam_SB", DEST_PORTS); + + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs + + -- Wait for testbench initialization + wait for 0 ns; + wait for 0 ns; + + -- Wait for Design Reset + wait until Reset = '0'; + ClearAlerts; + LOG("Start of Transactions"); + + -- Wait for test to finish + WaitForBarrier(TestDone, 10 ms); + + AlertIf(now >= 10 ms, "Test finished due to timeout"); + AlertIf(GetAffirmCount < NUM_PACKETS, "Test is not Self-Checking"); + + wait for 1 ns; + + EndOfTestReports(ReportAll => TRUE); + TranscriptClose; + std.env.stop; + wait; + end process; + + ------------------------------------------------------------ + -- AxiTransmitterProc + -- Generate transactions for AxiTransmitter + ------------------------------------------------------------ + Transmitter_gen : for i in 0 to DEST_PORTS - 1 generate + AxiTransmitterProc : process + variable OpRV : RandomPType; + variable BytesRV : RandomPType; + variable Bytes : natural; + variable Data : integer_vector(1 to MAX_PACKET_SIZE); + + variable ID : std_logic_vector(ID_LEN - 1 downto 0); + variable Dest : std_logic_vector(DEST_LEN - 1 downto 0); + variable User : std_logic_vector(USER_LEN - 1 downto 0); + variable Param : std_logic_vector(ID_LEN + DEST_LEN + USER_LEN downto 0); + variable ExpParam : std_logic_vector(ID_LEN + DEST_LEN +2 + USER_LEN downto 0); + begin + OpRV.InitSeed(OpRv'instance_name); + BytesRV.InitSeed(BytesRV'instance_name); + + wait until Reset = '0'; + SetBurstMode(StreamTxRec(i), STREAM_BURST_BYTE_MODE); -- Put Burst FIFO in Byte Mode + SetUseRandomDelays(StreamTxRec(i)); + WaitForClock(StreamTxRec(i), 2); + + for packet in 1 to NUM_PACKETS loop + Bytes := BytesRV.RandInt(MIN_PACKET_SIZE, MAX_PACKET_SIZE); + Data(1 to Bytes) := BytesRV.RandIntV(0, 255, Bytes); -- Generate a packetBytes + + ID := to_slv(to_unsigned(i, ID_LEN)); + Dest := BytesRV.RandSlv(DEST_LEN); + User := BytesRV.RandSlv(USER_LEN); + Param := ID & Dest & User & '1'; + ExpParam := ID & ID(2 downto 0) & Dest & User; + + Log("IF " & integer'image(i) & ": Sending Packet " & integer'image(packet) & " of length " & integer'image(Bytes) & " with param=" & PoC.strings.to_string(Param(Param'high downto 1), 'h'), INFO); + + wait for 1 ns; + PushBurstVector(AXI4StreamData_SB(i), Data(1 to Bytes), 8); + Push( AXI4StreamParam_SB(i), ExpParam); + wait for 1 ns; + SendBurstVector(StreamTxRec(i), Data(1 to Bytes), Param, 8); + end loop; + + -- Wait for outputs to propagate and signal TestDone + WaitForClock(StreamTxRec(i), 2); + WaitForBarrier(TestDone); + wait; + end process; + end generate; + + ------------------------------------------------------------ + -- AxiReceiverProc + -- Generate transactions for AxiReceiver + ------------------------------------------------------------ + AxiReceiverProc : process + variable ExpData, RxData : std_logic_vector(DATA_WIDTH - 1 downto 0); + variable OffSet : integer; + variable TryCount : integer; + variable Available : boolean; + + variable ID : std_logic_vector(ID_LEN - 1 downto 0); + variable Dest : std_logic_vector(DEST_LEN + 2 downto 0); + variable User : std_logic_vector(USER_LEN - 1 downto 0); + variable Last : std_logic; + variable RxParam : std_logic_vector(ID_LEN + DEST_LEN +3 + USER_LEN downto 0); + variable Data : integer_vector(1 to MAX_PACKET_SIZE); + variable PacketLength : natural; + variable index : natural; + begin + wait until Reset = '0'; + SetBurstMode(StreamRxRec, STREAM_BURST_BYTE_MODE); -- Put Burst FIFO in Byte Mode + SetUseRandomDelays(StreamRxRec); + WaitForClock(StreamRxRec); + + for i in 0 to DEST_PORTS * NUM_PACKETS - 1 loop + GetBurst(StreamRxRec, PacketLength, RxParam); + (ID, Dest, User, Last) := RxParam; + index := to_integer(unsigned(ID)); + + Log("Received Packet of length " & integer'image(PacketLength) & " with ID=" & PoC.strings.to_string(ID, 'h') & " with Dest=" & PoC.strings.to_string(Dest, 'h') & " with User=" & PoC.strings.to_string(User, 'h'), INFO); + + Check(AXI4StreamParam_SB(index), ID & Dest & User); + CheckBurstFifo(AXI4StreamData_SB(index), StreamRxRec.BurstFifo, PacketLength); + end loop; + wait; + end process; + +end architecture; + +configuration TC_RandomTransfer_delay of tb_axi4stream_mux is + for TestHarness + for TestCtrl : TestController + use entity work.TestController(RandomTransfer_delay); + end for; + end for; +end configuration; diff --git a/tb/bus/axi4stream/Mux/TestController_e.vhdl b/tb/bus/axi4stream/Mux/TestController_e.vhdl new file mode 100644 index 000000000..b95772000 --- /dev/null +++ b/tb/bus/axi4stream/Mux/TestController_e.vhdl @@ -0,0 +1,59 @@ +-- ============================================================================= +-- Authors: Iqbal Asif +-- +-- +-- Entity: TestController for a AXI4 stream multiplexer. +-- +-- Description: +-- ------------------------------------- +-- .. TODO:: No documentation available. +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use IEEE.math_real.all; + +library OSVVM; +context OSVVM.OsvvmContext; +use osvvm.ScoreboardPkg_slv.all; + +library OSVVM_AXI4; +context OSVVM_AXI4.Axi4Context; + +entity TestController is + generic ( + ID_LEN : natural; + DEST_LEN : natural; + USER_LEN : natural + ); + port ( + -- Global Signal Interface + Reset : in std_logic; + + -- Transaction Interfaces + StreamTxRec : inout StreamRecArrayType; + StreamRxRec : inout StreamRecType + ); + + constant DEST_PORTS : positive := StreamTxRec'length; + constant DATA_WIDTH : positive := StreamTxRec(0).DataToModel'length; + constant DATA_BYTES : positive := DATA_WIDTH/8; + +end entity TestController; diff --git a/tb/bus/axi4stream/Mux/tb_axi4stream_mux.vhdl b/tb/bus/axi4stream/Mux/tb_axi4stream_mux.vhdl new file mode 100644 index 000000000..b03147f95 --- /dev/null +++ b/tb/bus/axi4stream/Mux/tb_axi4stream_mux.vhdl @@ -0,0 +1,261 @@ +-- ============================================================================= +-- Authors: Iqbal Asif +-- +-- Entity: Testbench for AXI4 stream multiplexer. +-- +-- Description: +-- ------------------------------------- +-- .. TODO:: No documentation available. +-- +-- License: +-- ============================================================================= +-- Copyright 2025-2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use IEEE.numeric_std_unsigned.all ; + +library PoC; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.axi4stream.all; + +library osvvm; +context osvvm.OsvvmContext; + +library osvvm_AXI4; +context osvvm_AXI4.AxiStreamContext; + + +entity tb_axi4stream_mux is +end entity tb_axi4stream_mux; + +architecture TestHarness of tb_axi4stream_mux is + + constant DEST_PORTS : positive := 5; + + constant AXI_DATA_WIDTH : integer := 32; + + constant TID_MAX_WIDTH : integer := 8; + constant TDEST_TX_MAX_WIDTH : integer := 4; + constant TDEST_RX_MAX_WIDTH : integer := 4 + log2ceilnz(DEST_PORTS); + constant TUSER_MAX_WIDTH : integer := 4; + + constant INIT_TX_ID : std_logic_vector(TID_MAX_WIDTH - 1 downto 0) := (others => '0'); + constant INIT_TX_DEST : std_logic_vector(TDEST_TX_MAX_WIDTH - 1 downto 0) := (others => '0'); + constant INIT_TX_USER : std_logic_vector(TUSER_MAX_WIDTH - 1 downto 0) := (others => '0'); + + constant INIT_RX_ID : std_logic_vector(TID_MAX_WIDTH - 1 downto 0) := (others => '0'); + constant INIT_RX_DEST : std_logic_vector(TDEST_RX_MAX_WIDTH - 1 downto 0) := (others => '0'); + constant INIT_RX_USER : std_logic_vector(TUSER_MAX_WIDTH - 1 downto 0) := (others => '0'); + + constant AXI_TX_PARAM_WIDTH : integer := TID_MAX_WIDTH + TDEST_TX_MAX_WIDTH + TUSER_MAX_WIDTH + 1; + constant AXI_RX_PARAM_WIDTH : integer := TID_MAX_WIDTH + TDEST_RX_MAX_WIDTH + TUSER_MAX_WIDTH + 1; + + constant tpd : time := 2 ns; + constant tperiod_Clk : time := 10 ns; + constant tpd_stream : time := 0 ns; + + signal Clock : std_logic := '0'; + signal Reset : std_logic := '1'; + + signal RxTStrb : std_logic_vector(AXI_DATA_WIDTH/8 - 1 downto 0); + + signal MuxControl : std_logic_vector(DEST_PORTS - 1 downto 0) := (others => '1'); + + signal StreamTxRec : StreamRecArrayType(0 to DEST_PORTS - 1)( + DataToModel (AXI_DATA_WIDTH - 1 downto 0), + DataFromModel (AXI_DATA_WIDTH - 1 downto 0), + ParamToModel (AXI_TX_PARAM_WIDTH - 1 downto 0), + ParamFromModel(AXI_TX_PARAM_WIDTH - 1 downto 0) + ); + + signal StreamRxRec : StreamRecType( + DataToModel (AXI_DATA_WIDTH - 1 downto 0), + DataFromModel (AXI_DATA_WIDTH - 1 downto 0), + ParamToModel (AXI_RX_PARAM_WIDTH - 1 downto 0), + ParamFromModel(AXI_RX_PARAM_WIDTH - 1 downto 0) + ); + + signal StreamIn_m2s : T_AXI4Stream_M2S_VECTOR(DEST_PORTS - 1 downto 0)( + Data (AXI_DATA_WIDTH - 1 downto 0), + User (TUSER_MAX_WIDTH - 1 downto 0), + Dest (TDEST_TX_MAX_WIDTH - 1 downto 0), + ID (TID_MAX_WIDTH - 1 downto 0), + Keep ((AXI_DATA_WIDTH/8) - 1 downto 0) + ); + + signal StreamIn_s2m : T_AXI4Stream_S2M_VECTOR(DEST_PORTS - 1 downto 0)( + User(0 downto 0) + ); + + signal StreamOut_m2s : T_AXI4Stream_M2S( + Data (AXI_DATA_WIDTH - 1 downto 0), + User (TUSER_MAX_WIDTH - 1 downto 0), + Dest (TDEST_RX_MAX_WIDTH - 1 downto 0), + ID (TID_MAX_WIDTH - 1 downto 0), + Keep ((AXI_DATA_WIDTH/8) - 1 downto 0) + ); + signal StreamOut_s2m : T_AXI4Stream_S2M( + User(0 downto 0) + ); + + component TestController is + generic ( + ID_LEN : natural; + DEST_LEN : natural; + USER_LEN : natural + ); + port ( + -- Global Signal Interface + Reset : in std_logic; + + -- Transaction Interfaces + StreamTxRec : inout StreamRecArrayType; + StreamRxRec : inout StreamRecType + ); + end component; + +begin + + -- create Clock for TB and 100 Mhz + Osvvm.ClockResetPkg.CreateClock ( + Clk => Clock, + Period => Tperiod_Clk + ); + + -- create nReset + Osvvm.ClockResetPkg.CreateReset ( + Reset => Reset, + ResetActive => '1', + Clk => Clock, + Period => 7 * tperiod_Clk, + tpd => tpd + ); + + TestCtrl : component TestController + generic map( + ID_LEN => StreamIn_m2s(0).ID'length, + DEST_LEN => StreamIn_m2s(0).Dest'length, + USER_LEN => StreamIn_m2s(0).User'length + ) + port map( + Reset => Reset, + + StreamTxRec => StreamTxRec, + StreamRxRec => StreamRxRec + ); + + Transmitter_gen : for i in 0 to DEST_PORTS - 1 generate + signal TxTStrb : std_logic_vector(AXI_DATA_WIDTH/8 - 1 downto 0); + begin + + AXI4Stream_Transmitter : entity OSVVM_AXI4.AxiStreamTransmitter + generic map ( + INIT_ID => INIT_TX_ID, + INIT_DEST => INIT_TX_DEST, + INIT_USER => INIT_TX_USER, + INIT_LAST => 0, + + tperiod_Clk => tperiod_Clk, + + tpd_Clk_TValid => tpd_stream, + tpd_Clk_TID => tpd_stream, + tpd_Clk_TDest => tpd_stream, + tpd_Clk_TUser => tpd_stream, + tpd_Clk_TData => tpd_stream, + tpd_Clk_TStrb => tpd_stream, + tpd_Clk_TKeep => tpd_stream, + tpd_Clk_TLast => tpd_stream + ) + port map ( + -- Globals + Clk => Clock, + nReset => not Reset, + + -- AXI Stream Interface + TValid => StreamIn_m2s(i).Valid, + TReady => StreamIn_s2m(i).Ready, + TID => StreamIn_m2s(i).ID, + TDest => StreamIn_m2s(i).Dest, + TUser => StreamIn_m2s(i).User, + TData => StreamIn_m2s(i).Data, + TStrb => TxTStrb, + TKeep => StreamIn_m2s(i).Keep, + TLast => StreamIn_m2s(i).Last, + + -- Testbench Transaction Interface + TransRec => StreamTxRec(i) + ); + end generate; + + AXI4Stream_Receiver : entity OSVVM_AXI4.AxiStreamReceiver + generic map( + tperiod_Clk => tperiod_Clk, + INIT_ID => INIT_RX_ID, + INIT_DEST => INIT_RX_DEST, + INIT_USER => INIT_RX_USER, + INIT_LAST => 0, + + tpd_Clk_TReady => tpd_stream + ) + port map + ( + -- Globals + Clk => Clock, + nReset => not Reset, + + -- AXI Stream Interface + -- From TB Receiver to DUT Transmitter + TValid => StreamOut_m2s.Valid, + TReady => StreamOut_s2m.Ready, + TID => StreamOut_m2s.ID, + TDest => StreamOut_m2s.Dest, + TUser => StreamOut_m2s.User, + TData => StreamOut_m2s.Data, + TStrb => RxTStrb, + TKeep => StreamOut_m2s.Keep, + TLast => StreamOut_m2s.Last, + + -- Testbench Transaction Interface + TransRec => StreamRxRec + ); + + DUT : entity PoC.AXI4Stream_Mux + generic map( + USE_CONTROL_VECTOR => FALSE, + APPEND_DEST_BITS => TRUE, + PORTS => DEST_PORTS + ) + port map + ( + Clock => Clock, + Reset => Reset, + + -- Control interface + MuxControl => MuxControl, + + -- IN AXIS Port + In_M2S => StreamIn_m2s, + In_S2M => StreamIn_s2m, + + -- OUT AXIS Port + Out_M2S => StreamOut_m2s, + Out_S2M => StreamOut_s2m + ); + +end architecture TestHarness; diff --git a/tb/bus/axi4stream/RunAllTests.pro b/tb/bus/axi4stream/RunAllTests.pro new file mode 100644 index 000000000..e3948372a --- /dev/null +++ b/tb/bus/axi4stream/RunAllTests.pro @@ -0,0 +1,28 @@ +# ============================================================================= +# Authors: Iqbal Asif (PLC2 Design GmbH) +# Patrick Lehmann (PLC2 Design GmbH) +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +include ./FIFO/RunAllTests.pro +include ./FIFO_CDC/RunAllTests.pro +include ./DeMux/RunAllTests.pro +include ./Mux/RunAllTests.pro +disabled ./Delay/RunAllTests.pro +disabled ./Splitter/RunAllTests.pro +disabled ./Realign/RunAllTests.pro diff --git a/tb/cache/cache_cpu_tb.vhdl b/tb/cache/cache_CPU_tb.vhdl similarity index 81% rename from tb/cache/cache_cpu_tb.vhdl rename to tb/cache/cache_CPU_tb.vhdl index 22beed54f..099c5ea40 100644 --- a/tb/cache/cache_cpu_tb.vhdl +++ b/tb/cache/cache_CPU_tb.vhdl @@ -5,11 +5,11 @@ -- ============================================================================ -- Authors: Martin Zabel -- --- Testbench: Testbench for cache_cpu. +-- Testbench: Testbench for cache_CPU. -- -- Description: -- ------------------------------------ --- Test cache_cpu using two memories. One connected behind the cache, and one +-- Test cache_CPU using two memories. One connected behind the cache, and one -- directly attached to the CPU. The CPU compares the result of read requests -- issued to the cache with the result from the direct attached memory. -- @@ -20,13 +20,13 @@ -- License: -- ============================================================================ -- Copyright 2016-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -35,33 +35,33 @@ -- limitations under the License. -- ============================================================================ -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; -use ieee.math_real.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use IEEE.math_real.all; library poc; -use poc.utils.all; -use poc.physical.all; +use poc.utils.all; +use poc.physical.all; -- simulation only packages -use poc.sim_types.all; -use poc.simulation.all; -use poc.waveform.all; +use poc.sim_types.all; +use poc.simulation.all; +use poc.waveform.all; -entity cache_cpu_tb is -end entity cache_cpu_tb; +entity cache_CPU_tb is +end entity cache_CPU_tb; -architecture sim of cache_cpu_tb is +architecture sim of cache_CPU_tb is constant CLOCK_FREQ : FREQ := 100 MHz; -- Cache configuration - constant REPLACEMENT_POLICY : string := "LRU"; - constant CACHE_LINES : positive := 32; - constant ASSOCIATIVITY : positive := 4; + constant REPLACEMENT_POLICY : string := "LRU"; + constant CACHE_LINES : positive := 32; + constant ASSOCIATIVITY : positive := 4; -- Memory configuration - constant MEM_ADDR_BITS : positive := 6; - constant MEM_DATA_BITS : positive := 128; + constant MEM_ADDR_BITS : positive := 6; + constant MEM_DATA_BITS : positive := 128; -- NOTE: -- Memory accesses are always aligned to a word boundary. Each memory word @@ -72,8 +72,8 @@ architecture sim of cache_cpu_tb is -- * memory address 1 selects the bits 128..256 in memory, and so on. -- CPU configuration - constant CPU_DATA_BITS : positive := 32; - constant CPU_ADDR_BITS : positive := log2ceil(MEM_DATA_BITS/CPU_DATA_BITS)+MEM_ADDR_BITS; + constant CPU_DATA_BITS : positive := 32; + constant CPU_ADDR_BITS : positive := log2ceil(MEM_DATA_BITS/CPU_DATA_BITS)+MEM_ADDR_BITS; constant MEMORY_WORDS : positive := 2**CPU_ADDR_BITS; constant BYTES_PER_WORD : positive := CPU_DATA_BITS/8; @@ -89,39 +89,39 @@ architecture sim of cache_cpu_tb is -- * CPU address 5 selects the bits 32.. 63 in memory word 1, and so on. -- Global signals - signal clk : std_logic := '1'; - signal rst : std_logic; + signal clk : std_logic := '1'; + signal rst : std_logic; -- Request from CPU - signal cpu_req : std_logic; - signal cpu_write : std_logic; - signal cpu_addr : unsigned(CPU_ADDR_BITS-1 downto 0); - signal cpu_wdata : std_logic_vector(CPU_DATA_BITS-1 downto 0); - signal cpu_wmask : std_logic_vector(CPU_DATA_BITS/8-1 downto 0); + signal cpu_req : std_logic; + signal cpu_write : std_logic; + signal cpu_addr : unsigned(CPU_ADDR_BITS-1 downto 0); + signal cpu_wdata : std_logic_vector(CPU_DATA_BITS-1 downto 0); + signal cpu_wmask : std_logic_vector(CPU_DATA_BITS/8-1 downto 0); signal cpu_got : std_logic; -- Bus between CPU and Cache -- write / addr / wdata are directly connected to the CPU - signal cache_req : std_logic; - signal cache_rstb : std_logic; - signal cache_rdata : std_logic_vector(CPU_DATA_BITS-1 downto 0); + signal cache_req : std_logic; + signal cache_rstb : std_logic; + signal cache_rdata : std_logic_vector(CPU_DATA_BITS-1 downto 0); -- Bus between Cache and 1st Memory - signal mem1_req : std_logic; - signal mem1_write : std_logic; - signal mem1_addr : unsigned(MEM_ADDR_BITS-1 downto 0); - signal mem1_wdata : std_logic_vector(MEM_DATA_BITS-1 downto 0); - signal mem1_wmask : std_logic_vector(MEM_DATA_BITS/8-1 downto 0); - signal mem1_rdy : std_logic; - signal mem1_rstb : std_logic; - signal mem1_rdata : std_logic_vector(MEM_DATA_BITS-1 downto 0); + signal mem1_req : std_logic; + signal mem1_write : std_logic; + signal mem1_addr : unsigned(MEM_ADDR_BITS-1 downto 0); + signal mem1_wdata : std_logic_vector(MEM_DATA_BITS-1 downto 0); + signal mem1_wmask : std_logic_vector(MEM_DATA_BITS/8-1 downto 0); + signal mem1_rdy : std_logic; + signal mem1_rstb : std_logic; + signal mem1_rdata : std_logic_vector(MEM_DATA_BITS-1 downto 0); -- Bus between CPU and 2nd Memory -- write / addr / wdata are directly connected to the CPU - signal mem2_req : std_logic; - signal mem2_rdy : std_logic; - signal mem2_rstb : std_logic; - signal mem2_rdata : std_logic_vector(CPU_DATA_BITS-1 downto 0); + signal mem2_req : std_logic; + signal mem2_rdy : std_logic; + signal mem2_rstb : std_logic; + signal mem2_rdata : std_logic_vector(CPU_DATA_BITS-1 downto 0); -- Write-Data Generator signal wdata_got : std_logic; @@ -137,7 +137,7 @@ begin simGenerateClock(clk, CLOCK_FREQ); -- The Cache - UUT: entity poc.cache_cpu + UUT: entity poc.cache_CPU generic map ( REPLACEMENT_POLICY => REPLACEMENT_POLICY, CACHE_LINES => CACHE_LINES, @@ -173,8 +173,8 @@ begin -- The 1st Memory memory1: entity work.mem_model generic map ( - A_BITS => MEM_ADDR_BITS, - D_BITS => MEM_DATA_BITS) + A_BITS => MEM_ADDR_BITS, + D_BITS => MEM_DATA_BITS) port map ( clk => clk, rst => rst, @@ -190,8 +190,8 @@ begin -- The 2nd Memory memory2: entity work.mem_model generic map ( - A_BITS => CPU_ADDR_BITS, - D_BITS => CPU_DATA_BITS) + A_BITS => CPU_ADDR_BITS, + D_BITS => CPU_DATA_BITS) port map ( clk => clk, rst => rst, @@ -208,20 +208,20 @@ begin mem2_req <= cpu_got; -- The Write-Data Generator of the CPU - wdata_prng: entity poc.arith_prng - generic map (BITS => CPU_DATA_BITS) - port map ( - clk => clk, - rst => rst, - got => wdata_got, - val => wdata_val); + wdata_prng: entity poc.arith_PRNG + generic map (BITS => CPU_DATA_BITS) + port map ( + clk => clk, + rst => rst, + got => wdata_got, + val => wdata_val); cpu_wdata <= wdata_val when cpu_write = '1' else (others => '-'); wdata_got <= cpu_write and cpu_got and mem2_rdy; -- The Request Generator of the CPU - CPU_RequestGen: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("CPU RequestGen"); + CPU_RequestGen: process + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("CPU RequestGen"); -- no operation procedure nop is @@ -236,8 +236,8 @@ begin -- Write random data at given word address. -- Waits until cache and 2nd memory are ready. procedure write( - addr : in natural; - wmask : in std_logic_vector(BYTES_PER_WORD-1 downto 0) := (others => '0') + addr : in natural; + wmask : in std_logic_vector(BYTES_PER_WORD-1 downto 0) := (others => '0') ) is begin -- apply request (will be ignored if not ready) @@ -254,8 +254,8 @@ begin -- Write single byte of random data at given word address. -- Waits until cache and 2nd memory are ready. procedure write_byte( - word_addr : in natural; - byte_addr : in natural range 0 to BYTES_PER_WORD-1 + word_addr : in natural; + byte_addr : in natural range 0 to BYTES_PER_WORD-1 ) is variable mask : std_logic_vector(BYTES_PER_WORD-1 downto 0); begin @@ -266,7 +266,7 @@ begin -- Read at given word address. -- Waits until cache and 2nd memory are ready. - procedure read(addr : in natural) is + procedure read(addr : in natural) is begin -- apply request (will be ignored if not ready) cpu_req <= '1'; @@ -286,11 +286,11 @@ begin variable temp_r : real; variable temp_r2: real; - begin + begin -- Reset is mandatory - rst <= '1'; - wait until rising_edge(clk); - rst <= '0'; + rst <= '1'; + wait until rising_edge(clk); + rst <= '0'; -- Check No Operation -- -------------------------------------------- @@ -412,12 +412,12 @@ begin nop; finished <= true; simDeactivateProcess(simProcessID); - wait; - end process CPU_RequestGen; + wait; + end process CPU_RequestGen; -- The Checker of the CPU CPU_Checker: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("CPU Checker"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("CPU Checker"); variable saved_rdata : std_logic_vector(CPU_DATA_BITS-1 downto 0); begin -- wait until reset completes diff --git a/tb/cache/cache_mem_tb.vhdl b/tb/cache/cache_Memory_tb.vhdl similarity index 71% rename from tb/cache/cache_mem_tb.vhdl rename to tb/cache/cache_Memory_tb.vhdl index 55b7a48d1..48db0f822 100644 --- a/tb/cache/cache_mem_tb.vhdl +++ b/tb/cache/cache_Memory_tb.vhdl @@ -5,11 +5,11 @@ -- ============================================================================ -- Authors: Martin Zabel -- --- Testbench: Testbench for cache_mem. +-- Testbench: Testbench for cache_Memory. -- -- Description: -- ------------------------------------ --- Test cache_mem using two memories. One connected behind the cache, and one +-- Test cache_Memory using two memories. One connected behind the cache, and one -- directly attached to the CPU. The CPU compares the result of read requests -- issued to the cache with the result from the direct attached memory. -- @@ -20,13 +20,13 @@ -- License: -- ============================================================================ -- Copyright 2016-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -35,33 +35,33 @@ -- limitations under the License. -- ============================================================================ -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; -use ieee.math_real.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use IEEE.math_real.all; library poc; -use poc.utils.all; -use poc.physical.all; +use poc.utils.all; +use poc.physical.all; -- simulation only packages -use poc.sim_types.all; -use poc.simulation.all; -use poc.waveform.all; +use poc.sim_types.all; +use poc.simulation.all; +use poc.waveform.all; -entity cache_mem_tb is -end entity cache_mem_tb; +entity cache_Memory_tb is +end entity cache_Memory_tb; -architecture sim of cache_mem_tb is +architecture sim of cache_Memory_tb is constant CLOCK_FREQ : FREQ := 100 MHz; -- Cache configuration - constant REPLACEMENT_POLICY : string := "LRU"; - constant CACHE_LINES : positive := 32; - constant ASSOCIATIVITY : positive := 4; + constant REPLACEMENT_POLICY : string := "LRU"; + constant CACHE_LINES : positive := 32; + constant ASSOCIATIVITY : positive := 4; -- Memory configuration - constant MEM_ADDR_BITS : positive := 6; - constant MEM_DATA_BITS : positive := 128; + constant MEM_ADDR_BITS : positive := 6; + constant MEM_DATA_BITS : positive := 128; -- NOTE: -- Memory accesses are always aligned to a word boundary. Each memory word @@ -72,8 +72,8 @@ architecture sim of cache_mem_tb is -- * memory address 1 selects the bits 128..256 in memory, and so on. -- CPU configuration - constant CPU_DATA_BITS : positive := 32; - constant CPU_ADDR_BITS : positive := log2ceil(MEM_DATA_BITS/CPU_DATA_BITS)+MEM_ADDR_BITS; + constant CPU_DATA_BITS : positive := 32; + constant CPU_ADDR_BITS : positive := log2ceil(MEM_DATA_BITS/CPU_DATA_BITS)+MEM_ADDR_BITS; constant MEMORY_WORDS : positive := 2**CPU_ADDR_BITS; constant BYTES_PER_WORD : positive := CPU_DATA_BITS/8; constant OUTSTANDING_REQ : positive := 2; @@ -90,42 +90,42 @@ architecture sim of cache_mem_tb is -- * CPU address 5 selects the bits 32.. 63 in memory word 1, and so on. -- Global signals - signal clk : std_logic := '1'; - signal rst : std_logic; + signal clk : std_logic := '1'; + signal rst : std_logic; -- Request from CPU - signal cpu_req : std_logic; - signal cpu_write : std_logic; - signal cpu_addr : unsigned(CPU_ADDR_BITS-1 downto 0); - signal cpu_wdata : std_logic_vector(CPU_DATA_BITS-1 downto 0); - signal cpu_wmask : std_logic_vector(CPU_DATA_BITS/8-1 downto 0); + signal cpu_req : std_logic; + signal cpu_write : std_logic; + signal cpu_addr : unsigned(CPU_ADDR_BITS-1 downto 0); + signal cpu_wdata : std_logic_vector(CPU_DATA_BITS-1 downto 0); + signal cpu_wmask : std_logic_vector(CPU_DATA_BITS/8-1 downto 0); -- Bus between CPU and Cache -- write / addr / wdata are directly connected to the CPU - signal cache_req : std_logic; - signal cache_rdy : std_logic; - signal cache_rstb : std_logic; - signal cache_rdata : std_logic_vector(CPU_DATA_BITS-1 downto 0); + signal cache_req : std_logic; + signal cache_rdy : std_logic; + signal cache_rstb : std_logic; + signal cache_rdata : std_logic_vector(CPU_DATA_BITS-1 downto 0); -- Bus between Cache and 1st Memory - signal mem1_req : std_logic; - signal mem1_write : std_logic; - signal mem1_addr : unsigned(MEM_ADDR_BITS-1 downto 0); - signal mem1_wdata : std_logic_vector(MEM_DATA_BITS-1 downto 0); - signal mem1_wmask : std_logic_vector(MEM_DATA_BITS/8-1 downto 0); - signal mem1_rdy : std_logic; - signal mem1_rstb : std_logic; - signal mem1_rdata : std_logic_vector(MEM_DATA_BITS-1 downto 0); + signal mem1_req : std_logic; + signal mem1_write : std_logic; + signal mem1_addr : unsigned(MEM_ADDR_BITS-1 downto 0); + signal mem1_wdata : std_logic_vector(MEM_DATA_BITS-1 downto 0); + signal mem1_wmask : std_logic_vector(MEM_DATA_BITS/8-1 downto 0); + signal mem1_rdy : std_logic; + signal mem1_rstb : std_logic; + signal mem1_rdata : std_logic_vector(MEM_DATA_BITS-1 downto 0); -- Bus between CPU and 2nd Memory -- write / addr / wdata are directly connected to the CPU - signal mem2_req : std_logic; - signal mem2_rdy : std_logic; - signal mem2_rstb : std_logic; - signal mem2_rdata : std_logic_vector(CPU_DATA_BITS-1 downto 0); + signal mem2_req : std_logic; + signal mem2_rdy : std_logic; + signal mem2_rstb : std_logic; + signal mem2_rdata : std_logic_vector(CPU_DATA_BITS-1 downto 0); - signal rply2_valid : std_logic; - signal rply2_rdata : std_logic_vector(CPU_DATA_BITS-1 downto 0); + signal rply2_valid : std_logic; + signal rply2_rdata : std_logic_vector(CPU_DATA_BITS-1 downto 0); -- Write-Data Generator signal wdata_got : std_logic; @@ -141,34 +141,34 @@ begin simGenerateClock(clk, CLOCK_FREQ); -- The Cache - UUT: entity poc.cache_mem - generic map ( - REPLACEMENT_POLICY => REPLACEMENT_POLICY, - CACHE_LINES => CACHE_LINES, - ASSOCIATIVITY => ASSOCIATIVITY, - CPU_DATA_BITS => CPU_DATA_BITS, - MEM_ADDR_BITS => MEM_ADDR_BITS, - MEM_DATA_BITS => MEM_DATA_BITS, + UUT: entity poc.cache_Memory + generic map ( + REPLACEMENT_POLICY => REPLACEMENT_POLICY, + CACHE_LINES => CACHE_LINES, + ASSOCIATIVITY => ASSOCIATIVITY, + CPU_DATA_BITS => CPU_DATA_BITS, + MEM_ADDR_BITS => MEM_ADDR_BITS, + MEM_DATA_BITS => MEM_DATA_BITS, OUTSTANDING_REQ => OUTSTANDING_REQ) - port map ( - clk => clk, - rst => rst, - cpu_req => cache_req, - cpu_write => cpu_write, - cpu_addr => cpu_addr, - cpu_wdata => cpu_wdata, - cpu_wmask => cpu_wmask, - cpu_rdy => cache_rdy, - cpu_rstb => cache_rstb, - cpu_rdata => cache_rdata, - mem_req => mem1_req, - mem_write => mem1_write, - mem_addr => mem1_addr, - mem_wdata => mem1_wdata, - mem_wmask => mem1_wmask, - mem_rdy => mem1_rdy, - mem_rstb => mem1_rstb, - mem_rdata => mem1_rdata); + port map ( + clk => clk, + rst => rst, + cpu_req => cache_req, + cpu_write => cpu_write, + cpu_addr => cpu_addr, + cpu_wdata => cpu_wdata, + cpu_wmask => cpu_wmask, + cpu_rdy => cache_rdy, + cpu_rstb => cache_rstb, + cpu_rdata => cache_rdata, + mem_req => mem1_req, + mem_write => mem1_write, + mem_addr => mem1_addr, + mem_wdata => mem1_wdata, + mem_wmask => mem1_wmask, + mem_rdy => mem1_rdy, + mem_rstb => mem1_rstb, + mem_rdata => mem1_rdata); -- request only if also 2nd memory is ready cache_req <= cpu_req and mem2_rdy; @@ -176,8 +176,8 @@ begin -- The 1st Memory memory1: entity work.mem_model generic map ( - A_BITS => MEM_ADDR_BITS, - D_BITS => MEM_DATA_BITS) + A_BITS => MEM_ADDR_BITS, + D_BITS => MEM_DATA_BITS) port map ( clk => clk, rst => rst, @@ -193,8 +193,8 @@ begin -- The 2nd Memory memory2: entity work.mem_model generic map ( - A_BITS => CPU_ADDR_BITS, - D_BITS => CPU_DATA_BITS) + A_BITS => CPU_ADDR_BITS, + D_BITS => CPU_DATA_BITS) port map ( clk => clk, rst => rst, @@ -212,38 +212,38 @@ begin -- Buffer the replies from 2nd memory for later comparison rply2_fifo: entity poc.fifo_cc_got - generic map ( - D_BITS => CPU_DATA_BITS, - MIN_DEPTH => imax(OUTSTANDING_REQ, 2), - DATA_REG => OUTSTANDING_REQ <= 2, -- matches cache_mem implementation - OUTPUT_REG => OUTSTANDING_REQ > 2) -- matches cache_mem implementation - port map ( - rst => rst, - clk => clk, - put => mem2_rstb, - din => mem2_rdata, - full => open, -- should not overflow - estate_wr => open, - got => cache_rstb, - dout => rply2_rdata, - valid => rply2_valid, - fstate_rd => open); + generic map ( + D_BITS => CPU_DATA_BITS, + MIN_DEPTH => imax(OUTSTANDING_REQ, 2), + DATA_REG => OUTSTANDING_REQ <= 2, -- matches cache_Memory implementation + OUTPUT_REG => OUTSTANDING_REQ > 2) -- matches cache_Memory implementation + port map ( + rst => rst, + clk => clk, + put => mem2_rstb, + din => mem2_rdata, + full => open, -- should not overflow + estate_wr => open, + got => cache_rstb, + dout => rply2_rdata, + valid => rply2_valid, + fstate_rd => open); -- The Write-Data Generator of the CPU - wdata_prng: entity poc.arith_prng - generic map (BITS => CPU_DATA_BITS) - port map ( - clk => clk, - rst => rst, - got => wdata_got, - val => wdata_val); + wdata_prng: entity poc.arith_PRNG + generic map (BITS => CPU_DATA_BITS) + port map ( + clk => clk, + rst => rst, + got => wdata_got, + val => wdata_val); cpu_wdata <= wdata_val when cpu_write = '1' else (others => '-'); wdata_got <= cpu_write and cache_rdy and mem2_rdy; -- The Request Generator of the CPU - CPU_RequestGen: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("CPU RequestGen"); + CPU_RequestGen: process + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("CPU RequestGen"); -- no operation procedure nop is @@ -258,8 +258,8 @@ begin -- Write random data at given word address. -- Waits until cache and 2nd memory are ready. procedure write( - addr : in natural; - wmask : in std_logic_vector(BYTES_PER_WORD-1 downto 0) := (others => '0') + addr : in natural; + wmask : in std_logic_vector(BYTES_PER_WORD-1 downto 0) := (others => '0') ) is begin -- apply request (will be ignored if not ready) @@ -276,8 +276,8 @@ begin -- Write single byte of random data at given word address. -- Waits until cache and 2nd memory are ready. procedure write_byte( - word_addr : in natural; - byte_addr : in natural range 0 to BYTES_PER_WORD-1 + word_addr : in natural; + byte_addr : in natural range 0 to BYTES_PER_WORD-1 ) is variable mask : std_logic_vector(BYTES_PER_WORD-1 downto 0); begin @@ -288,7 +288,7 @@ begin -- Read at given word address. -- Waits until cache and 2nd memory are ready. - procedure read(addr : in natural) is + procedure read(addr : in natural) is begin -- apply request (will be ignored if not ready) cpu_req <= '1'; @@ -308,11 +308,11 @@ begin variable temp_r : real; variable temp_r2: real; - begin + begin -- Reset is mandatory - rst <= '1'; - wait until rising_edge(clk); - rst <= '0'; + rst <= '1'; + wait until rising_edge(clk); + rst <= '0'; -- Check No Operation -- -------------------------------------------- @@ -434,12 +434,12 @@ begin nop; finished <= true; simDeactivateProcess(simProcessID); - wait; - end process CPU_RequestGen; + wait; + end process CPU_RequestGen; -- The Checker of the CPU CPU_Checker: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("CPU Checker"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("CPU Checker"); begin -- wait until reset completes wait until rising_edge(clk) and rst = '0'; diff --git a/tb/cache/cache_par2_cocotb.py b/tb/cache/cache_Parallel2_cocotb.py similarity index 99% rename from tb/cache/cache_par2_cocotb.py rename to tb/cache/cache_Parallel2_cocotb.py index 7b67b0059..397031aa5 100644 --- a/tb/cache/cache_par2_cocotb.py +++ b/tb/cache/cache_Parallel2_cocotb.py @@ -9,7 +9,7 @@ # # Description: # ------------------------------------ -# Automated testbench for PoC.cache_par2 +# Automated testbench for PoC.cache_Parallel2 # # Supported configuration: # * REPLACEMENT_POLICY = "LRU" diff --git a/tb/cache/cache_par_cocotb.py b/tb/cache/cache_Parallel_cocotb.py similarity index 99% rename from tb/cache/cache_par_cocotb.py rename to tb/cache/cache_Parallel_cocotb.py index 8ba98e1bf..38a99e107 100644 --- a/tb/cache/cache_par_cocotb.py +++ b/tb/cache/cache_Parallel_cocotb.py @@ -9,7 +9,7 @@ # # Description: # ------------------------------------ -# Automated testbench for PoC.cache_par +# Automated testbench for PoC.cache_Parallel # # Supported configuration: # * REPLACEMENT_POLICY = "LRU" diff --git a/tb/common/RunAllTests.pro b/tb/common/RunAllTests.pro new file mode 100644 index 000000000..c99393e7b --- /dev/null +++ b/tb/common/RunAllTests.pro @@ -0,0 +1,24 @@ +# ============================================================================= +# Authors: +# Stefan Unrein +# +# License: +# ============================================================================= +# Copyright 2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +library tb_common + +include ./utils-pkg/RunAllTests.pro diff --git a/tb/common/config_tb.vhdl b/tb/common/config_tb.vhdl index 1b9ab0f82..9f222d1d5 100644 --- a/tb/common/config_tb.vhdl +++ b/tb/common/config_tb.vhdl @@ -3,25 +3,25 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Thomas B. Preusser --- Patrick Lehmann +-- Authors: Thomas B. Preusser +-- Patrick Lehmann -- --- Testbench: Tests global constants, functions and settings +-- Testbench: Tests global constants, functions and settings -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,12 +30,12 @@ -- limitations under the License. -- ============================================================================= -library PoC; -use PoC.config.all; -use PoC.utils.all; +library PoC; +use PoC.config.all; +use PoC.utils.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; +use PoC.sim_types.all; +use PoC.simulation.all; entity config_tb is @@ -43,36 +43,36 @@ end config_tb; architecture tb of config_tb is - signal SimQuiet : boolean := true; + signal SimQuiet : boolean := true; begin procChecker : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); begin if not SimQuiet then - report "is simulation?: " & boolean'image(SIMULATION) severity note; - report "Vendor: " & T_VENDOR'image(VENDOR) severity note; - report "Device: " & T_DEVICE'image(DEVICE) severity note; - report "Device Family: " & T_DEVICE_FAMILY'image(DEVICE_FAMILY) severity note; - report "Device Subtype: " & T_DEVICE_SUBTYPE'image(DEVICE_SUBTYPE) severity note; - report "Device Series: " & T_DEVICE_SERIES'image(DEVICE_SERIES) severity note; - report "Device Generation: " & integer'image(DEVICE_GENERATION) severity note; - report "Device Number: " & integer'image(DEVICE_NUMBER) severity note; - report "--------------------------------------------------" severity note; - report "LUT fan-in: " & integer'image(LUT_FANIN) severity note; - report "Transceiver: " & T_TRANSCEIVER'image(TRANSCEIVER_TYPE) severity note; + report "is simulation?: " & boolean'image(SIMULATION) severity note; + report "Vendor: " & T_VENDOR'image(VENDOR) severity note; + report "Device: " & T_DEVICE'image(DEVICE) severity note; + report "Device Family: " & T_DEVICE_FAMILY'image(DEVICE_FAMILY) severity note; + report "Device Subtype: " & T_DEVICE_SUBTYPE'image(DEVICE_SUBTYPE) severity note; + report "Device Series: " & T_DEVICE_SERIES'image(DEVICE_SERIES) severity note; + report "Device Generation: " & integer'image(DEVICE_GENERATION) severity note; + report "Device Number: " & integer'image(DEVICE_NUMBER) severity note; + report "--------------------------------------------------" severity note; + report "LUT fan-in: " & integer'image(LUT_FANIN) severity note; + report "Transceiver: " & T_TRANSCEIVER'image(TRANSCEIVER_TYPE) severity note; end if; - simAssertion((SIMULATION = TRUE), "SIMULATION=" & boolean'image(SIMULATION) & " Expected=TRUE"); - simAssertion((VENDOR = VENDOR_GENERIC), "VENDOR= " & T_VENDOR'image(VENDOR) & " Expected=VENDOR_XILINX"); - simAssertion((DEVICE = DEVICE_GENERIC), "DEVICE=" & T_DEVICE'image(DEVICE) & " Expected=DEVICE_KINTEX7"); - simAssertion((DEVICE_FAMILY = DEVICE_FAMILY_GENERIC), "DEVICE_FAMILY=" & T_DEVICE_FAMILY'image(DEVICE_FAMILY) & " Expected=DEVICE_FAMILY_KINTEX"); - simAssertion((DEVICE_NUMBER = 0), "DEVICE_NUMBER=" & integer'image(DEVICE_NUMBER) & " Expected=325"); - simAssertion((DEVICE_SUBTYPE = DEVICE_SUBTYPE_GENERIC), "DEVICE_SUBTYPE=" & T_DEVICE_SUBTYPE'image(DEVICE_SUBTYPE) & " Expected=DEVICE_SUBTYPE_T"); - simAssertion((DEVICE_GENERATION = 0), "DEVICE_GENERATION=" & integer'image(DEVICE_GENERATION) & " Expected=7"); - simAssertion((DEVICE_SERIES = DEVICE_SERIES_GENERIC), "DEVICE_SERIES=" & T_DEVICE_SERIES'image(DEVICE_SERIES) & " Expected=DEVICE_SERIES_7_SERIES"); - simAssertion((LUT_FANIN = 6), "LUT_FANIN=" & integer'image(LUT_FANIN) & " Expected=6"); - simAssertion((TRANSCEIVER_TYPE = TRANSCEIVER_GENERIC), "TRANSCEIVER_TYPE=" & T_TRANSCEIVER'image(TRANSCEIVER_TYPE) & " Expected=TRANSCEIVER_GTXE2"); + simAssertion((SIMULATION = TRUE), "SIMULATION=" & boolean'image(SIMULATION) & " Expected=TRUE"); + simAssertion((VENDOR = VENDOR_GENERIC), "VENDOR= " & T_VENDOR'image(VENDOR) & " Expected=VENDOR_XILINX"); + simAssertion((DEVICE = DEVICE_GENERIC), "DEVICE=" & T_DEVICE'image(DEVICE) & " Expected=DEVICE_KINTEX7"); + simAssertion((DEVICE_FAMILY = DEVICE_FAMILY_GENERIC), "DEVICE_FAMILY=" & T_DEVICE_FAMILY'image(DEVICE_FAMILY) & " Expected=DEVICE_FAMILY_KINTEX"); + simAssertion((DEVICE_NUMBER = 0), "DEVICE_NUMBER=" & integer'image(DEVICE_NUMBER) & " Expected=325"); + simAssertion((DEVICE_SUBTYPE = DEVICE_SUBTYPE_GENERIC), "DEVICE_SUBTYPE=" & T_DEVICE_SUBTYPE'image(DEVICE_SUBTYPE) & " Expected=DEVICE_SUBTYPE_T"); + simAssertion((DEVICE_GENERATION = 0), "DEVICE_GENERATION=" & integer'image(DEVICE_GENERATION) & " Expected=7"); + simAssertion((DEVICE_SERIES = DEVICE_SERIES_GENERIC), "DEVICE_SERIES=" & T_DEVICE_SERIES'image(DEVICE_SERIES) & " Expected=DEVICE_SERIES_7_SERIES"); + simAssertion((LUT_FANIN = 6), "LUT_FANIN=" & integer'image(LUT_FANIN) & " Expected=6"); + simAssertion((TRANSCEIVER_TYPE = TRANSCEIVER_GENERIC), "TRANSCEIVER_TYPE=" & T_TRANSCEIVER'image(TRANSCEIVER_TYPE) & " Expected=TRANSCEIVER_GTXE2"); -- This process is finished simDeactivateProcess(simProcessID); diff --git a/tb/common/my_config_DE0.vhdl b/tb/common/my_config_DE0.vhdl deleted file mode 100644 index 03bbbaaaf..000000000 --- a/tb/common/my_config_DE0.vhdl +++ /dev/null @@ -1,43 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. --- --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "DE0"; -- Altera DE0 Board (Cyclone III) - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD - - -- For internal use only - constant MY_VERBOSE : boolean := FALSE; -end package; diff --git a/tb/common/my_config_DE4.vhdl b/tb/common/my_config_DE4.vhdl deleted file mode 100644 index ddcc658d4..000000000 --- a/tb/common/my_config_DE4.vhdl +++ /dev/null @@ -1,43 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. --- --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "DE4"; -- Stratix II GX Audio Video Development Kit - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD - - -- For internal use only - constant MY_VERBOSE : boolean := FALSE; -end package; diff --git a/tb/common/my_config_DE5.vhdl b/tb/common/my_config_DE5.vhdl deleted file mode 100644 index d6c1d88b8..000000000 --- a/tb/common/my_config_DE5.vhdl +++ /dev/null @@ -1,43 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. --- --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "DE5"; -- Stratix II GX Audio Video Development Kit - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD - - -- For internal use only - constant MY_VERBOSE : boolean := FALSE; -end package; diff --git a/tb/common/my_config_ECP5Versa.vhdl b/tb/common/my_config_ECP5Versa.vhdl deleted file mode 100644 index 198333659..000000000 --- a/tb/common/my_config_ECP5Versa.vhdl +++ /dev/null @@ -1,43 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. --- --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "ECP5 Versa"; -- Lattice ECP5 Versa - LFE5UM-45F-6BG381C - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD - - -- For internal use only - constant MY_VERBOSE : boolean := TRUE; -end package; diff --git a/tb/common/my_config_KC705.vhdl b/tb/common/my_config_KC705.vhdl deleted file mode 100644 index 9308f68f1..000000000 --- a/tb/common/my_config_KC705.vhdl +++ /dev/null @@ -1,43 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. --- --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "KC705"; -- KC705 - Xilinx Kintex 7 reference design board: XC7K325T - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD - - -- For internal use only - constant MY_VERBOSE : boolean := FALSE; -end package; diff --git a/tb/common/my_config_ML505.vhdl b/tb/common/my_config_ML505.vhdl deleted file mode 100644 index aa235b0ad..000000000 --- a/tb/common/my_config_ML505.vhdl +++ /dev/null @@ -1,43 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. --- --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "ML505"; -- ML505 - Xilinx Virtex 5 reference design board: XC5VLX50T - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD - - -- For internal use only - constant MY_VERBOSE : boolean := FALSE; -end package; diff --git a/tb/common/my_config_ML506.vhdl b/tb/common/my_config_ML506.vhdl deleted file mode 100644 index eea8a8162..000000000 --- a/tb/common/my_config_ML506.vhdl +++ /dev/null @@ -1,48 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- =========================================================================== --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------ --- This file was created from the template file: --- --- /src/common/my_config.template.vhdl --- --- and customized for: --- --- ML506 --- --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- =========================================================================== - - -package my_config is - constant MY_BOARD : string := "ML506"; - constant MY_DEVICE : string := "None"; - - -- For internal use only - constant MY_VERBOSE : boolean := false; -end package; diff --git a/tb/common/my_config_ML605.vhdl b/tb/common/my_config_ML605.vhdl deleted file mode 100644 index 04700114e..000000000 --- a/tb/common/my_config_ML605.vhdl +++ /dev/null @@ -1,43 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. --- --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "ML605"; -- ML605 - Xilinx Virtex 6 reference design board: XC6VLX240T - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD - - -- For internal use only - constant MY_VERBOSE : boolean := FALSE; -end package; diff --git a/tb/common/my_config_S2GXAV.vhdl b/tb/common/my_config_S2GXAV.vhdl deleted file mode 100644 index 527b7d35b..000000000 --- a/tb/common/my_config_S2GXAV.vhdl +++ /dev/null @@ -1,43 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. --- --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "S2GXAV"; -- Stratix II GX Audio Video Development Kit - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD - - -- For internal use only - constant MY_VERBOSE : boolean := FALSE; -end package; diff --git a/tb/common/my_config_S3ESK500.vhdl b/tb/common/my_config_S3ESK500.vhdl deleted file mode 100644 index d497bbaa4..000000000 --- a/tb/common/my_config_S3ESK500.vhdl +++ /dev/null @@ -1,51 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Package: Project specific configuration. --- --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------ --- This file was created from the template file: --- --- /src/common/my_config.template.vhdl --- --- and customized for: --- --- Spartan-3E Starter Kit with a XC3S500E FPGA --- --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "S3ESK500"; -- Spartan-3E Starter Kit - constant MY_DEVICE : string := "None"; - - -- For internal use only - constant MY_VERBOSE : boolean := true; -end package; diff --git a/tb/common/my_config_S3SK1000.vhdl b/tb/common/my_config_S3SK1000.vhdl deleted file mode 100644 index 807cb62dc..000000000 --- a/tb/common/my_config_S3SK1000.vhdl +++ /dev/null @@ -1,51 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Package: Project specific configuration. --- --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------ --- This file was created from the template file: --- --- /src/common/my_config.template.vhdl --- --- and customized for: --- --- Spartan-3 Starter Kit with a XC3S1000 FPGA --- --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "S3SK1000"; -- Spartan-3 Starter Kit - constant MY_DEVICE : string := "None"; - - -- For internal use only - constant MY_VERBOSE : boolean := true; -end package; diff --git a/tb/common/my_config_VC707.vhdl b/tb/common/my_config_VC707.vhdl deleted file mode 100644 index 7fa35c8d4..000000000 --- a/tb/common/my_config_VC707.vhdl +++ /dev/null @@ -1,43 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. --- --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "VC707"; -- VC707 - Xilinx Virtex 7 reference design board: XC7V485T - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD - - -- For internal use only - constant MY_VERBOSE : boolean := FALSE; -end package; diff --git a/tb/common/my_config_VC709.vhdl b/tb/common/my_config_VC709.vhdl deleted file mode 100644 index 479572b83..000000000 --- a/tb/common/my_config_VC709.vhdl +++ /dev/null @@ -1,43 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. --- --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "VC709"; -- VC709 - Xilinx Virtex 7 reference design board: XC7VX690T - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD - - -- For internal use only - constant MY_VERBOSE : boolean := FALSE; -end package; diff --git a/tb/common/my_config_XUPV5.vhdl b/tb/common/my_config_XUPV5.vhdl deleted file mode 100644 index da9a799c5..000000000 --- a/tb/common/my_config_XUPV5.vhdl +++ /dev/null @@ -1,48 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- =========================================================================== --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------ --- This file was created from the template file: --- --- /src/common/my_config.template.vhdl --- --- and customized for: --- --- XUPV5 --- --- --- License: --- =========================================================================== --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - constant MY_BOARD : string := "XUPV5"; - constant MY_DEVICE : string := "None"; - - -- For internal use only - constant MY_VERBOSE : boolean := false; -end package; diff --git a/tb/common/my_config_ZC706.vhdl b/tb/common/my_config_ZC706.vhdl deleted file mode 100644 index d28154ecb..000000000 --- a/tb/common/my_config_ZC706.vhdl +++ /dev/null @@ -1,43 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. --- --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "ZC706"; -- ZC706 - Xilinx Zynq-7000 reference design board: XC7Z045 - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD - - -- For internal use only - constant MY_VERBOSE : boolean := FALSE; -end package; diff --git a/tb/common/my_config_ZedBoard.vhdl b/tb/common/my_config_ZedBoard.vhdl deleted file mode 100644 index c4bf20598..000000000 --- a/tb/common/my_config_ZedBoard.vhdl +++ /dev/null @@ -1,43 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Thomas B. Preusser --- Martin Zabel --- Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. --- --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - - -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "ZedBoard"; -- ZedBoard - Digilent Zynq-7000 board: XC7Z020 - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD - - -- For internal use only - constant MY_VERBOSE : boolean := FALSE; -end package; diff --git a/tb/common/physical_tb.vhdl b/tb/common/physical_tb.vhdl index 38fac959c..33dd8f92c 100644 --- a/tb/common/physical_tb.vhdl +++ b/tb/common/physical_tb.vhdl @@ -3,25 +3,25 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Testbench: Testing the physical package. +-- Testbench: Testing the physical package. -- --- Authors: Thomas B. Preusser --- Patrick Lehmann +-- Authors: Thomas B. Preusser +-- Patrick Lehmann -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,15 +31,15 @@ -- ============================================================================= entity physical_tb is -end; +end entity; -library PoC; -use PoC.physical.all; +library PoC; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; +use PoC.sim_types.all; +use PoC.simulation.all; architecture tb of physical_tb is constant simTestID : T_SIM_TEST_ID := simCreateTest("Physical types test."); @@ -64,4 +64,4 @@ begin wait; --forever end process; -end; +end architecture; diff --git a/tb/common/my_config_Arty.vhdl b/tb/common/project_configuration_AC701.vhdl similarity index 70% rename from tb/common/my_config_Arty.vhdl rename to tb/common/project_configuration_AC701.vhdl index 359e189f5..86b5e2c44 100644 --- a/tb/common/my_config_Arty.vhdl +++ b/tb/common/project_configuration_AC701.vhdl @@ -7,17 +7,17 @@ -- Martin Zabel -- Patrick Lehmann -- --- Package: Project specific configuration. +-- Package: Project specific configuration. -- -- Description: -- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. +-- This file was created from template /src/common/project_configuration.template.vhdl. -- -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. @@ -33,11 +33,11 @@ -- ============================================================================= -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "Arty"; -- Arty - Xilinx Artix-35T reference design board: XC7A35TICSG324-1L - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD +package project_configuration is + -- Change these lines to setup configuration. + constant MY_BOARD : string := "AC701"; -- AC701 - Xilinx Artix-7 reference design board: XC7A200T + constant MY_DEVICE : string := "None"; -- infer from MY_BOARD -- For internal use only - constant MY_VERBOSE : boolean := FALSE; + constant MY_VERBOSE : boolean := FALSE; end package; diff --git a/tb/common/project_configuration_Arty.vhdl b/tb/common/project_configuration_Arty.vhdl new file mode 100644 index 000000000..40ec32243 --- /dev/null +++ b/tb/common/project_configuration_Arty.vhdl @@ -0,0 +1,43 @@ +-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- +-- vim: tabstop=2:shiftwidth=2:noexpandtab +-- kate: tab-width 2; replace-tabs off; indent-width 2; +-- +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Martin Zabel +-- Patrick Lehmann +-- +-- Package: Project specific configuration. +-- +-- Description: +-- ------------------------------------ +-- This file was created from template /src/common/project_configuration.template.vhdl. +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany, +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + + +package project_configuration is + -- Change these lines to setup configuration. + constant MY_BOARD : string := "Arty"; -- Arty - Xilinx Artix-35T reference design board: XC7A35TICSG324-1L + constant MY_DEVICE : string := "None"; -- infer from MY_BOARD + + -- For internal use only + constant MY_VERBOSE : boolean := FALSE; +end package; diff --git a/tb/common/project_configuration_ArtyS7.vhdl b/tb/common/project_configuration_ArtyS7.vhdl new file mode 100644 index 000000000..edee602e5 --- /dev/null +++ b/tb/common/project_configuration_ArtyS7.vhdl @@ -0,0 +1,43 @@ +-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- +-- vim: tabstop=2:shiftwidth=2:noexpandtab +-- kate: tab-width 2; replace-tabs off; indent-width 2; +-- +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Martin Zabel +-- Patrick Lehmann +-- +-- Package: Project specific configuration. +-- +-- Description: +-- ------------------------------------ +-- This file was created from template /src/common/project_configuration.template.vhdl. +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany, +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + + +package project_configuration is + -- Change these lines to setup configuration. + constant MY_BOARD : string := "ArtyS7"; -- ArtyS7 - Xilinx Spartan 7 reference design board: XC7S25-1CSGA324C + constant MY_DEVICE : string := "None"; -- infer from MY_BOARD + + -- For internal use only + constant MY_VERBOSE : boolean := FALSE; +end package; diff --git a/tb/common/my_config_ArtyS7.vhdl b/tb/common/project_configuration_ECP5Versa.vhdl similarity index 70% rename from tb/common/my_config_ArtyS7.vhdl rename to tb/common/project_configuration_ECP5Versa.vhdl index 368afba9f..cbf4a3f0d 100644 --- a/tb/common/my_config_ArtyS7.vhdl +++ b/tb/common/project_configuration_ECP5Versa.vhdl @@ -7,17 +7,17 @@ -- Martin Zabel -- Patrick Lehmann -- --- Package: Project specific configuration. +-- Package: Project specific configuration. -- -- Description: -- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. +-- This file was created from template /src/common/project_configuration.template.vhdl. -- -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. @@ -33,11 +33,11 @@ -- ============================================================================= -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "ArtyS7"; -- ArtyS7 - Xilinx Spartan 7 reference design board: XC7S25-1CSGA324C - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD +package project_configuration is + -- Change these lines to setup configuration. + constant MY_BOARD : string := "ECP5 Versa"; -- Lattice ECP5 Versa - LFE5UM-45F-6BG381C + constant MY_DEVICE : string := "None"; -- infer from MY_BOARD -- For internal use only - constant MY_VERBOSE : boolean := FALSE; + constant MY_VERBOSE : boolean := TRUE; end package; diff --git a/tb/common/my_config_GENERIC.vhdl b/tb/common/project_configuration_GENERIC.vhdl similarity index 70% rename from tb/common/my_config_GENERIC.vhdl rename to tb/common/project_configuration_GENERIC.vhdl index 1acc3a288..a3fc84150 100644 --- a/tb/common/my_config_GENERIC.vhdl +++ b/tb/common/project_configuration_GENERIC.vhdl @@ -5,17 +5,17 @@ -- ============================================================================= -- Authors: Patrick Lehmann -- --- Package: Project specific configuration. +-- Package: Project specific configuration. -- -- Description: -- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. +-- This file was created from template /src/common/project_configuration.template.vhdl. -- -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. @@ -31,11 +31,11 @@ -- ============================================================================= -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "GENERIC"; -- a generic board - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD +package project_configuration is + -- Change these lines to setup configuration. + constant MY_BOARD : string := "GENERIC"; -- a generic board + constant MY_DEVICE : string := "None"; -- infer from MY_BOARD -- For internal use only - constant MY_VERBOSE : boolean := FALSE; + constant MY_VERBOSE : boolean := FALSE; end package; diff --git a/tb/common/project_configuration_KC705.vhdl b/tb/common/project_configuration_KC705.vhdl new file mode 100644 index 000000000..ae97bfe3e --- /dev/null +++ b/tb/common/project_configuration_KC705.vhdl @@ -0,0 +1,43 @@ +-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- +-- vim: tabstop=2:shiftwidth=2:noexpandtab +-- kate: tab-width 2; replace-tabs off; indent-width 2; +-- +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Martin Zabel +-- Patrick Lehmann +-- +-- Package: Project specific configuration. +-- +-- Description: +-- ------------------------------------ +-- This file was created from template /src/common/project_configuration.template.vhdl. +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany, +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + + +package project_configuration is + -- Change these lines to setup configuration. + constant MY_BOARD : string := "KC705"; -- KC705 - Xilinx Kintex 7 reference design board: XC7K325T + constant MY_DEVICE : string := "None"; -- infer from MY_BOARD + + -- For internal use only + constant MY_VERBOSE : boolean := FALSE; +end package; diff --git a/tb/common/my_config_Nexys4.vhdl b/tb/common/project_configuration_Nexys4.vhdl similarity index 76% rename from tb/common/my_config_Nexys4.vhdl rename to tb/common/project_configuration_Nexys4.vhdl index 5f3937940..140ece777 100644 --- a/tb/common/my_config_Nexys4.vhdl +++ b/tb/common/project_configuration_Nexys4.vhdl @@ -9,7 +9,7 @@ -- -- Description: -- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. +-- This file was created from template /src/common/project_configuration.template.vhdl. -- -- -- License: @@ -31,11 +31,11 @@ -- ============================================================================= -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "Nexys4"; -- Nexys 4 - Xilinx Artix-7: XC7A100T - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD +package project_configuration is + -- Change these lines to setup configuration. + constant MY_BOARD : string := "Nexys4"; -- Nexys 4 - Xilinx Artix-7: XC7A100T + constant MY_DEVICE : string := "None"; -- infer from MY_BOARD - -- For internal use only - constant MY_VERBOSE : boolean := FALSE; + -- For internal use only + constant MY_VERBOSE : boolean := FALSE; end package; diff --git a/tb/common/my_config_Nexys4DDR.vhdl b/tb/common/project_configuration_Nexys4DDR.vhdl similarity index 75% rename from tb/common/my_config_Nexys4DDR.vhdl rename to tb/common/project_configuration_Nexys4DDR.vhdl index e47bc910d..7ca66a79b 100644 --- a/tb/common/my_config_Nexys4DDR.vhdl +++ b/tb/common/project_configuration_Nexys4DDR.vhdl @@ -9,7 +9,7 @@ -- -- Description: -- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. +-- This file was created from template /src/common/project_configuration.template.vhdl. -- -- -- License: @@ -31,11 +31,11 @@ -- ============================================================================= -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "Nexys4DDR"; -- Nexys 4 DDR - Xilinx Artix-7: XC7A100T - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD +package project_configuration is + -- Change these lines to setup configuration. + constant MY_BOARD : string := "Nexys4DDR"; -- Nexys 4 DDR - Xilinx Artix-7: XC7A100T + constant MY_DEVICE : string := "None"; -- infer from MY_BOARD - -- For internal use only - constant MY_VERBOSE : boolean := FALSE; + -- For internal use only + constant MY_VERBOSE : boolean := FALSE; end package; diff --git a/tb/common/my_config_Atlys.vhdl b/tb/common/project_configuration_VC707.vhdl similarity index 70% rename from tb/common/my_config_Atlys.vhdl rename to tb/common/project_configuration_VC707.vhdl index 6b04525fc..0aa72b866 100644 --- a/tb/common/my_config_Atlys.vhdl +++ b/tb/common/project_configuration_VC707.vhdl @@ -7,17 +7,17 @@ -- Martin Zabel -- Patrick Lehmann -- --- Package: Project specific configuration. +-- Package: Project specific configuration. -- -- Description: -- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. +-- This file was created from template /src/common/project_configuration.template.vhdl. -- -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. @@ -33,11 +33,11 @@ -- ============================================================================= -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "Atlys"; -- Digilent Atlys - Xilinx Spartan-6: XC6SLX45 - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD +package project_configuration is + -- Change these lines to setup configuration. + constant MY_BOARD : string := "VC707"; -- VC707 - Xilinx Virtex 7 reference design board: XC7V485T + constant MY_DEVICE : string := "None"; -- infer from MY_BOARD -- For internal use only - constant MY_VERBOSE : boolean := FALSE; + constant MY_VERBOSE : boolean := FALSE; end package; diff --git a/tb/common/project_configuration_VC709.vhdl b/tb/common/project_configuration_VC709.vhdl new file mode 100644 index 000000000..450b337c5 --- /dev/null +++ b/tb/common/project_configuration_VC709.vhdl @@ -0,0 +1,43 @@ +-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- +-- vim: tabstop=2:shiftwidth=2:noexpandtab +-- kate: tab-width 2; replace-tabs off; indent-width 2; +-- +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Martin Zabel +-- Patrick Lehmann +-- +-- Package: Project specific configuration. +-- +-- Description: +-- ------------------------------------ +-- This file was created from template /src/common/project_configuration.template.vhdl. +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany, +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + + +package project_configuration is + -- Change these lines to setup configuration. + constant MY_BOARD : string := "VC709"; -- VC709 - Xilinx Virtex 7 reference design board: XC7VX690T + constant MY_DEVICE : string := "None"; -- infer from MY_BOARD + + -- For internal use only + constant MY_VERBOSE : boolean := FALSE; +end package; diff --git a/tb/common/project_configuration_ZC706.vhdl b/tb/common/project_configuration_ZC706.vhdl new file mode 100644 index 000000000..c285a3c25 --- /dev/null +++ b/tb/common/project_configuration_ZC706.vhdl @@ -0,0 +1,43 @@ +-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- +-- vim: tabstop=2:shiftwidth=2:noexpandtab +-- kate: tab-width 2; replace-tabs off; indent-width 2; +-- +-- ============================================================================= +-- Authors: Thomas B. Preusser +-- Martin Zabel +-- Patrick Lehmann +-- +-- Package: Project specific configuration. +-- +-- Description: +-- ------------------------------------ +-- This file was created from template /src/common/project_configuration.template.vhdl. +-- +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany, +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + + +package project_configuration is + -- Change these lines to setup configuration. + constant MY_BOARD : string := "ZC706"; -- ZC706 - Xilinx Zynq-7000 reference design board: XC7Z045 + constant MY_DEVICE : string := "None"; -- infer from MY_BOARD + + -- For internal use only + constant MY_VERBOSE : boolean := FALSE; +end package; diff --git a/tb/common/my_config_AC701.vhdl b/tb/common/project_configuration_ZedBoard.vhdl similarity index 70% rename from tb/common/my_config_AC701.vhdl rename to tb/common/project_configuration_ZedBoard.vhdl index a9f2e3485..3f6be2a54 100644 --- a/tb/common/my_config_AC701.vhdl +++ b/tb/common/project_configuration_ZedBoard.vhdl @@ -7,17 +7,17 @@ -- Martin Zabel -- Patrick Lehmann -- --- Package: Project specific configuration. +-- Package: Project specific configuration. -- -- Description: -- ------------------------------------ --- This file was created from template /src/common/my_config.template.vhdl. +-- This file was created from template /src/common/project_configuration.template.vhdl. -- -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. @@ -33,11 +33,11 @@ -- ============================================================================= -package my_config is - -- Change these lines to setup configuration. - constant MY_BOARD : string := "AC701"; -- AC701 - Xilinx Artix-7 reference design board: XC7A200T - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD +package project_configuration is + -- Change these lines to setup configuration. + constant MY_BOARD : string := "ZedBoard"; -- ZedBoard - Digilent Zynq-7000 board: XC7Z020 + constant MY_DEVICE : string := "None"; -- infer from MY_BOARD -- For internal use only - constant MY_VERBOSE : boolean := FALSE; + constant MY_VERBOSE : boolean := FALSE; end package; diff --git a/tb/common/strings_tb.vhdl b/tb/common/strings_tb.vhdl index bcc51fb4c..ba24453b2 100644 --- a/tb/common/strings_tb.vhdl +++ b/tb/common/strings_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Testbench: Tests global constants, functions and settings +-- Testbench: Tests global constants, functions and settings -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,16 +30,16 @@ -- ============================================================================= library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -library PoC; -use PoC.config.all; -use PoC.utils.all; -use PoC.strings.all; +library PoC; +use PoC.config.all; +use PoC.utils.all; +use PoC.strings.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; +use PoC.sim_types.all; +use PoC.simulation.all; entity strings_tb is @@ -48,65 +48,65 @@ end entity; architecture tb of strings_tb is - constant raw_format_slv_dec_result0 : string := raw_format_slv_dec(std_logic_vector'(x"12")); - constant raw_format_slv_dec_result1 : string := raw_format_slv_dec(x"3456"); - constant raw_format_slv_dec_result2 : string := raw_format_slv_dec(x"12345678"); - constant raw_format_slv_dec_result3 : string := raw_format_slv_dec(x"A1B2C3D4E5F607A8"); - - constant str_length_result0 : integer := str_length(""); - constant str_length_result1 : integer := str_length((1 to 3 => C_POC_NUL)); - constant str_length_result2 : integer := str_length("Hello"); - constant str_length_result3 : integer := str_length("Hello" & (1 to 3 => C_POC_NUL)); - - constant str_match_result0 : boolean := str_match("", ""); - constant str_match_result1 : boolean := str_match("", (1 to 3 => C_POC_NUL)); - constant str_match_result2 : boolean := str_match("Hello", "hello"); - constant str_match_result3 : boolean := str_match("Hello", "Hello"); - constant str_match_result4 : boolean := str_match("Hello World", "Hello"); - constant str_match_result5 : boolean := str_match("Hello", "Hello World"); - constant str_match_result6 : boolean := str_match("Hello", "Hello" & (1 to 3 => C_POC_NUL)); - - constant str_imatch_result0 : boolean := str_imatch("", ""); - constant str_imatch_result1 : boolean := str_imatch("", (1 to 3 => C_POC_NUL)); - constant str_imatch_result2 : boolean := str_imatch("Hello", "hello"); - constant str_imatch_result3 : boolean := str_imatch("Hello", "Hello"); - constant str_imatch_result4 : boolean := str_imatch("Hello World", "Hello"); - constant str_imatch_result5 : boolean := str_imatch("Hello", "Hello World"); - constant str_imatch_result6 : boolean := str_imatch("Hello", "Hello" & (1 to 3 => C_POC_NUL)); + constant raw_format_slv_dec_result0 : string := raw_format_slv_dec(std_logic_vector'(x"12")); + constant raw_format_slv_dec_result1 : string := raw_format_slv_dec(x"3456"); + constant raw_format_slv_dec_result2 : string := raw_format_slv_dec(x"12345678"); + constant raw_format_slv_dec_result3 : string := raw_format_slv_dec(x"A1B2C3D4E5F607A8"); + + constant str_length_result0 : integer := str_length(""); + constant str_length_result1 : integer := str_length((1 to 3 => C_POC_NUL)); + constant str_length_result2 : integer := str_length("Hello"); + constant str_length_result3 : integer := str_length("Hello" & (1 to 3 => C_POC_NUL)); + + constant str_match_result0 : boolean := str_match("", ""); + constant str_match_result1 : boolean := str_match("", (1 to 3 => C_POC_NUL)); + constant str_match_result2 : boolean := str_match("Hello", "hello"); + constant str_match_result3 : boolean := str_match("Hello", "Hello"); + constant str_match_result4 : boolean := str_match("Hello World", "Hello"); + constant str_match_result5 : boolean := str_match("Hello", "Hello World"); + constant str_match_result6 : boolean := str_match("Hello", "Hello" & (1 to 3 => C_POC_NUL)); + + constant str_imatch_result0 : boolean := str_imatch("", ""); + constant str_imatch_result1 : boolean := str_imatch("", (1 to 3 => C_POC_NUL)); + constant str_imatch_result2 : boolean := str_imatch("Hello", "hello"); + constant str_imatch_result3 : boolean := str_imatch("Hello", "Hello"); + constant str_imatch_result4 : boolean := str_imatch("Hello World", "Hello"); + constant str_imatch_result5 : boolean := str_imatch("Hello", "Hello World"); + constant str_imatch_result6 : boolean := str_imatch("Hello", "Hello" & (1 to 3 => C_POC_NUL)); begin procChecker : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); begin -- raw_format_slv_dec tests - simAssertion((raw_format_slv_dec_result0 = "18"), "raw_format_slv_dec(0x12)=" & raw_format_slv_dec_result0 & " Expected='18'"); - simAssertion((raw_format_slv_dec_result1 = "13398"), "raw_format_slv_dec(0x3456)=" & raw_format_slv_dec_result1 & " Expected='13398'"); - simAssertion((raw_format_slv_dec_result2 = "305419896"), "raw_format_slv_dec(0x12345678)=" & raw_format_slv_dec_result2 & " Expected='305419896'"); - simAssertion((raw_format_slv_dec_result3 = "11651590505119483816"), "raw_format_slv_dec(0xA1b2c3d4e5f607a8)=" & raw_format_slv_dec_result3 & " Expected='11651590505119483816'"); + simAssertion((raw_format_slv_dec_result0 = "18"), "raw_format_slv_dec(0x12)=" & raw_format_slv_dec_result0 & " Expected='18'"); + simAssertion((raw_format_slv_dec_result1 = "13398"), "raw_format_slv_dec(0x3456)=" & raw_format_slv_dec_result1 & " Expected='13398'"); + simAssertion((raw_format_slv_dec_result2 = "305419896"), "raw_format_slv_dec(0x12345678)=" & raw_format_slv_dec_result2 & " Expected='305419896'"); + simAssertion((raw_format_slv_dec_result3 = "11651590505119483816"), "raw_format_slv_dec(0xA1b2c3d4e5f607a8)=" & raw_format_slv_dec_result3 & " Expected='11651590505119483816'"); -- str_length tests - simAssertion((str_length_result0 = 0), "str_length('')=" & integer'image(str_length_result0) & " Expected=0"); - simAssertion((str_length_result1 = 0), "str_length('\0\0\0')=" & integer'image(str_length_result1) & " Expected=0"); - simAssertion((str_length_result2 = 5), "str_length('Hello')=" & integer'image(str_length_result2) & " Expected=5"); - simAssertion((str_length_result3 = 5), "str_length('Hello\0\0\0')=" & integer'image(str_length_result3) & " Expected=5"); + simAssertion((str_length_result0 = 0), "str_length('')=" & integer'image(str_length_result0) & " Expected=0"); + simAssertion((str_length_result1 = 0), "str_length('\0\0\0')=" & integer'image(str_length_result1) & " Expected=0"); + simAssertion((str_length_result2 = 5), "str_length('Hello')=" & integer'image(str_length_result2) & " Expected=5"); + simAssertion((str_length_result3 = 5), "str_length('Hello\0\0\0')=" & integer'image(str_length_result3) & " Expected=5"); -- str_match tests - simAssertion((str_match_result0 = TRUE), "str_match('', '')=" & boolean'image(str_match_result0) & " Expected=TRUE"); - simAssertion((str_match_result1 = TRUE), "str_match('', '\0\0\0')=" & boolean'image(str_match_result1) & " Expected=TRUE"); - simAssertion((str_match_result2 = FALSE), "str_match('Hello', 'hello')=" & boolean'image(str_match_result2) & " Expected=FALSE"); - simAssertion((str_match_result3 = TRUE), "str_match('Hello', 'Hello')=" & boolean'image(str_match_result3) & " Expected=TRUE"); - simAssertion((str_match_result4 = FALSE), "str_match('Hello World', 'Hello')=" & boolean'image(str_match_result4) & " Expected=FALSE"); - simAssertion((str_match_result5 = FALSE), "str_match('Hello', 'Hello World')=" & boolean'image(str_match_result5) & " Expected=FALSE"); - simAssertion((str_match_result6 = TRUE), "str_match('Hello', 'Hello\0\0\0')=" & boolean'image(str_match_result6) & " Expected=TRUE"); + simAssertion((str_match_result0 = TRUE), "str_match('', '')=" & boolean'image(str_match_result0) & " Expected=TRUE"); + simAssertion((str_match_result1 = TRUE), "str_match('', '\0\0\0')=" & boolean'image(str_match_result1) & " Expected=TRUE"); + simAssertion((str_match_result2 = FALSE), "str_match('Hello', 'hello')=" & boolean'image(str_match_result2) & " Expected=FALSE"); + simAssertion((str_match_result3 = TRUE), "str_match('Hello', 'Hello')=" & boolean'image(str_match_result3) & " Expected=TRUE"); + simAssertion((str_match_result4 = FALSE), "str_match('Hello World', 'Hello')=" & boolean'image(str_match_result4) & " Expected=FALSE"); + simAssertion((str_match_result5 = FALSE), "str_match('Hello', 'Hello World')=" & boolean'image(str_match_result5) & " Expected=FALSE"); + simAssertion((str_match_result6 = TRUE), "str_match('Hello', 'Hello\0\0\0')=" & boolean'image(str_match_result6) & " Expected=TRUE"); -- str_imatch tests - simAssertion((str_imatch_result0 = TRUE), "str_imatch('', '')=" & boolean'image(str_imatch_result0) & " Expected=TRUE"); - simAssertion((str_imatch_result1 = TRUE), "str_imatch('', '\0\0\0')=" & boolean'image(str_imatch_result1) & " Expected=TRUE"); - simAssertion((str_imatch_result2 = TRUE), "str_imatch('Hello', 'hello')=" & boolean'image(str_imatch_result2) & " Expected=TRUE"); - simAssertion((str_imatch_result3 = TRUE), "str_imatch('Hello', 'Hello')=" & boolean'image(str_imatch_result3) & " Expected=TRUE"); - simAssertion((str_imatch_result4 = FALSE), "str_imatch('Hello World', 'Hello')=" & boolean'image(str_imatch_result4) & " Expected=FALSE"); - simAssertion((str_imatch_result5 = FALSE), "str_imatch('Hello', 'Hello World')=" & boolean'image(str_imatch_result5) & " Expected=FALSE"); - simAssertion((str_imatch_result6 = TRUE), "str_imatch('Hello', 'Hello\0\0\0')=" & boolean'image(str_imatch_result6) & " Expected=TRUE"); + simAssertion((str_imatch_result0 = TRUE), "str_imatch('', '')=" & boolean'image(str_imatch_result0) & " Expected=TRUE"); + simAssertion((str_imatch_result1 = TRUE), "str_imatch('', '\0\0\0')=" & boolean'image(str_imatch_result1) & " Expected=TRUE"); + simAssertion((str_imatch_result2 = TRUE), "str_imatch('Hello', 'hello')=" & boolean'image(str_imatch_result2) & " Expected=TRUE"); + simAssertion((str_imatch_result3 = TRUE), "str_imatch('Hello', 'Hello')=" & boolean'image(str_imatch_result3) & " Expected=TRUE"); + simAssertion((str_imatch_result4 = FALSE), "str_imatch('Hello World', 'Hello')=" & boolean'image(str_imatch_result4) & " Expected=FALSE"); + simAssertion((str_imatch_result5 = FALSE), "str_imatch('Hello', 'Hello World')=" & boolean'image(str_imatch_result5) & " Expected=FALSE"); + simAssertion((str_imatch_result6 = TRUE), "str_imatch('Hello', 'Hello\0\0\0')=" & boolean'image(str_imatch_result6) & " Expected=TRUE"); -- str_pos tests -- str_ipos tests diff --git a/tb/common/utils-pkg/RunAllTests.pro b/tb/common/utils-pkg/RunAllTests.pro new file mode 100644 index 000000000..a077a0ff9 --- /dev/null +++ b/tb/common/utils-pkg/RunAllTests.pro @@ -0,0 +1,26 @@ +# ============================================================================= +# Authors: +# Stefan Unrein +# +# License: +# ============================================================================= +# Copyright 2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +TestSuite PoC.common.utils + +library tb_common_utils + +RunTest Tb_common_utils_log2ceil.vhdl diff --git a/tb/common/utils-pkg/Tb_common_utils_log2ceil.vhdl b/tb/common/utils-pkg/Tb_common_utils_log2ceil.vhdl new file mode 100644 index 000000000..ed8ccef50 --- /dev/null +++ b/tb/common/utils-pkg/Tb_common_utils_log2ceil.vhdl @@ -0,0 +1,88 @@ +-- ============================================================================= +-- Authors: Stefan Unrein +-- Markus Leiter +-- +-- Entity: utils.log2ceil test bench +-- +-- Description: +-- ------------------------------------- +-- TBD +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library ieee; +use ieee.std_logic_1164.all; + +library PoC; +use PoC.utils.all; + +library osvvm; +context osvvm.OsvvmContext; + +entity Tb_common_utils_log2ceil is +end entity; + +architecture tb of Tb_common_utils_log2ceil is + constant TestName : string := "Tb_common_utils_log2ceil"; +begin + + ------------------------------------------------------------ + -- ControlProc + -- Set up AlertLog and wait for end of test + ------------------------------------------------------------ + ControlProc : process + begin + -- Initialization of test + SetTestName(TestName); + TranscriptOpen; + SetTranscriptMirror(TRUE); + + Log("Test utils.log2ceil"); + Log("INTEGER_BITS = " & to_string(INTEGER_BITS)); + + Log("2 ** 0"); + AffirmIfEqual(log2ceil(1), 0); + AffirmIfEqual(log2ceil(2), 1); + AffirmIfEqual(log2ceil(3), 2); + + for i in 16 to INTEGER_BITS -2 loop + Log("2 ** " & to_string(i)); + AffirmIfEqual(log2ceil(2 ** i - 2), i); + AffirmIfEqual(log2ceil(2 ** i - 1), i); + AffirmIfEqual(log2ceil(2 ** i ), i); + AffirmIfEqual(log2ceil(2 ** i + 1), i +1); + end loop; + + Log("2 ** " & to_string(INTEGER_BITS -1)); + AffirmIfEqual(log2ceil(integer'high -1), INTEGER_BITS -1); + AffirmIfEqual(log2ceil(integer'high), INTEGER_BITS -1); + + Log("Test utils.log2ceilnz"); + Log("INTEGER_BITS = " & to_string(INTEGER_BITS)); + + Log("2 ** 0"); + AffirmIfEqual(log2ceilnz(1), 1); + AffirmIfEqual(log2ceilnz(2), 1); + AffirmIfEqual(log2ceilnz(3), 2); + + + EndOfTestReports; + std.env.finish; + wait; + end process; +end architecture; diff --git a/tb/dstruct/OutOfOrderBuffer/RunAllTests.pro b/tb/dstruct/OutOfOrderBuffer/RunAllTests.pro new file mode 100644 index 000000000..78c7d4cca --- /dev/null +++ b/tb/dstruct/OutOfOrderBuffer/RunAllTests.pro @@ -0,0 +1,39 @@ +# ============================================================================= +# Authors: +# Adrian Weiland (PLC2 Design GmbH) +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +TestSuite PoC.dstruct.OutOfOrderBuffer + +library tb_struct_OutOfOrderBuffer + +analyze dstruct_OutOfOrderBuffer_TestController.vhdl +analyze tb_OutOfOrderBuffer.vhdl + +# Enable code coverage collection in simulations +# if {$::osvvm::ToolVendor eq "Aldec"} { +# SetCoverageSimulateEnable true +# } + +RunTest TbOutOfOrderBuffer_WriteRead.vhdl + +# Disable code coverage collection in simulations +# if {$::osvvm::ToolVendor eq "Aldec"} { +# SetCoverageSimulateEnable false +# } diff --git a/tb/dstruct/OutOfOrderBuffer/TbOutOfOrderBuffer_WriteRead.tcl b/tb/dstruct/OutOfOrderBuffer/TbOutOfOrderBuffer_WriteRead.tcl new file mode 100644 index 000000000..fe84f27bb --- /dev/null +++ b/tb/dstruct/OutOfOrderBuffer/TbOutOfOrderBuffer_WriteRead.tcl @@ -0,0 +1,3 @@ +log /tb_OutOfOrderBuffer/* +log /tb_OutOfOrderBuffer/DUT/* +log /tb_OutOfOrderBuffer/TestCtrl/* diff --git a/tb/dstruct/OutOfOrderBuffer/TbOutOfOrderBuffer_WriteRead.vhdl b/tb/dstruct/OutOfOrderBuffer/TbOutOfOrderBuffer_WriteRead.vhdl new file mode 100644 index 000000000..40e4354cd --- /dev/null +++ b/tb/dstruct/OutOfOrderBuffer/TbOutOfOrderBuffer_WriteRead.vhdl @@ -0,0 +1,196 @@ +-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- +-- vim: tabstop=2:shiftwidth=2:noexpandtab +-- kate: tab-width 2; replace-tabs off; indent-width 2; +-- ============================================================================= +-- Authors: Iqbal Asif +-- +-- Entity: Testcases for AXI4 stream delay. +-- +-- Description: +-- ------------------------------------- +-- .. TODO:: No documentation available. +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +architecture WriteRead of dstruct_OutOfOrderBuffer_TestController is + + constant NUM_TRANSACTIONS : positive := 100000; + constant TestName : string := "TbOutOfOrderBuffer_WriteRead"; + signal TestDone : integer_barrier := 1 ; + signal TransmissionDone : integer_barrier := 1 ; + signal SB : osvvm.ScoreboardPkg_slv.ScoreboardIdArrayType(0 to NUM_INDEX - 1); + +begin + + ------------------------------------------------------------ + -- ControlProc + -- Set up AlertLog and wait for end of test + ------------------------------------------------------------ + ControlProc : process + constant TIMEOUT : time := 3 ms; + begin + -- Initialization of test + SetTestName(TestName); + TranscriptOpen; + SetTranscriptMirror(TRUE); + + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs + SetLogEnable(DEBUG, FALSE); -- Enable INFO logs + SB <= NewID("Read_WRITE", NUM_INDEX) ; + -- Wait for testbench initialization + wait for 0 ns ; wait for 0 ns; + + -- wait for design reset + wait until nReset = '1'; + ClearAlerts; + + WaitForBarrier(TestDone, TIMEOUT); + EndOfTestReports(ReportAll => TRUE, Timeout => now >= TIMEOUT); + std.env.finish; + wait; + end process ControlProc; + + TransmitterProc : process + variable RV : RandomPType; + variable DataSlv : std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); + variable wasFull : std_logic; + begin + RV.InitSeed(RV'instance_name); + wait until nReset = '1' ; + put <= '0'; + + WaitForClock(Clock, 10); + + for i in 0 to NUM_TRANSACTIONS-1 loop + wait for 0.1 ns; + + if i = 1000 then -- Let the OOO buffer run empty + wait for 1 us; + WaitForClock(Clock); + end if; + + put <= '1'; + DataSlv := RV.RandSlv(DATA_BITS); + DataIn <= DataSlv; + + wasFull := full; + + WaitForClock(Clock); + + if wasFull = '0' then + Push(SB(to_integer(IndexOut)), DataSlv); + log("SB: Push, Index: " & to_hstring(IndexOut) & ", Data: " & to_hstring(DataSlv), DEBUG); + end if; + + put <= '0'; + if RV.RandInt(0, 100) > 70 then --Create gap with 70% chance + WaitForClock(Clock, RV.RandInt(1, 10)); + end if; + end loop; + WaitForBarrier(TransmissionDone); + WaitForBarrier(TestDone); + wait ; + end process TransmitterProc ; + + ReceiverProc : process + variable RV : RandomPType; + variable Data : std_logic_vector(DATA_BITS-1 downto 0) := (others => '0'); + variable TestIndex : natural; + begin + IndexIn <= (others => '0'); + RV.InitSeed(RV'instance_name); + Got <= '0'; + wait until nReset = '1' ; + + WaitForClock(Clock, 15); + + for i in 0 to NUM_TRANSACTIONS-1 loop + TestIndex := RV.RandInt(0, NUM_INDEX -1); + + IndexIn <= to_unsigned(TestIndex, IndexIn'length); + + wait for 0.1 ns; + + if Empty(SB(TestIndex)) then + AffirmIf(Valid = '0', "Expected Valid = 0 for empty SB " & to_string(TestIndex)); + + if RV.RandInt(0, 100) > 50 then -- Try to remove empty slot with 50% chance + Got <= '1'; + end if; + else + Got <= '1'; + AffirmIf(Valid = '1', "Expected Valid = 1 for SB " & to_string(TestIndex)); + + if RV.RandInt(0, 100) > 20 then -- Peek with 20% chance + Got <= '0'; + Peek(SB(TestIndex), Data); + log("SB: Peek, Index: " & to_string(TestIndex) & ", Data: " & to_hstring(Data), DEBUG); + AffirmIf(Data = DataOut, "Got Data=0x" & to_hstring(DataOut) & ", expected Data=0x" & to_hstring(Data) & " for SB " & to_string(TestIndex)); + else + Check(SB(TestIndex), DataOut); + log("SB: Check, Index: " & to_string(TestIndex) & ", Data: " & to_hstring(DataOut), DEBUG); + end if; + end if; + + WaitForClock(Clock); + + Got <= '0'; + if RV.RandInt(0, 100) > 70 then --Create gap with 70% chance + WaitForClock(Clock, RV.RandInt(1, 10)); + end if; + end loop; + + WaitForClock(Clock); + WaitForBarrier(TransmissionDone); + + WaitForClock(Clock, 3); + -- clear SB + for j in 0 to NUM_INDEX - 1 loop + TestIndex := j; + IndexIn <= to_unsigned(TestIndex, IndexIn'length); + + wait for 0.1 ns; + + if Empty(SB(TestIndex)) then + AffirmIf(Valid = '0', "Expected Valid = 0 for empty SB " & to_string(TestIndex)); + else + Got <= '1'; + AffirmIf(Valid = '1', "Expected Valid = 1 for SB " & to_string(TestIndex)); + Check(SB(TestIndex), DataOut); + log("SB: Check, Index: " & to_string(TestIndex) & ", Data: " & to_hstring(DataOut), DEBUG); + end if; + + WaitForClock(Clock); + + Got <= '0'; + end loop; + + WaitForBarrier(TestDone); + wait ; + end process; + +end architecture; + +configuration TbOutOfOrderBuffer_WriteRead of tb_OutOfOrderBuffer is + for TestHarness + for TestCtrl : dstruct_OutOfOrderBuffer_TestController + use entity work.dstruct_OutOfOrderBuffer_TestController(WriteRead); + end for; + end for; +end configuration; diff --git a/tb/dstruct/OutOfOrderBuffer/dstruct_OutOfOrderBuffer_TestController.vhdl b/tb/dstruct/OutOfOrderBuffer/dstruct_OutOfOrderBuffer_TestController.vhdl new file mode 100644 index 000000000..79ec21988 --- /dev/null +++ b/tb/dstruct/OutOfOrderBuffer/dstruct_OutOfOrderBuffer_TestController.vhdl @@ -0,0 +1,69 @@ +-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- +-- vim: tabstop=2:shiftwidth=2:noexpandtab +-- kate: tab-width 2; replace-tabs off; indent-width 2; +-- ============================================================================= +-- Authors: Iqbal Asif +-- +-- Entity: TestController for a dstruct_OutOfOrderBuffer +-- +-- Description: +-- ------------------------------------- +-- .. TODO:: No documentation available. +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE ; +use IEEE.std_logic_1164.all ; +use IEEE.numeric_std.all ; +use IEEE.numeric_std_unsigned.all ; +use IEEE.math_real.all ; + +library PoC; +use PoC.utils.all; +use PoC.vectors.all; + +library OSVVM ; +context OSVVM.OsvvmContext ; +use OSVVM.ScoreboardPkg_slv.all ; + + +entity dstruct_OutOfOrderBuffer_TestController is + generic( + NUM_INDEX : positive; + DATA_BITS : positive + ); + port ( + -- Global Signal Interface + Clock : in std_logic; + nReset : in std_logic ; + + -- Put Port + Put : out std_logic; + Full : in std_logic; + DataIn : out std_logic_vector(DATA_BITS-1 downto 0); + IndexOut : in unsigned(log2ceilnz(NUM_INDEX) -1 downto 0); + + -- Get Port + Got : out std_logic; + Valid : in std_logic; + IndexIn : out unsigned(log2ceilnz(NUM_INDEX) -1 downto 0); + DataOut : in std_logic_vector(DATA_BITS-1 downto 0) + ); + +end entity; + diff --git a/tb/dstruct/OutOfOrderBuffer/tb_OutOfOrderBuffer.vhdl b/tb/dstruct/OutOfOrderBuffer/tb_OutOfOrderBuffer.vhdl new file mode 100644 index 000000000..e14087de0 --- /dev/null +++ b/tb/dstruct/OutOfOrderBuffer/tb_OutOfOrderBuffer.vhdl @@ -0,0 +1,152 @@ +-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- +-- vim: tabstop=2:shiftwidth=2:noexpandtab +-- kate: tab-width 2; replace-tabs off; indent-width 2; +-- ============================================================================= +-- Authors: Iqbal Asif +-- +-- +-- Entity: Testbench for a dstruct_OutOfOrderBuffer +-- +-- Description: +-- ------------------------------------- +-- .. TODO:: No documentation available. +-- +-- License: +-- ============================================================================= +-- Copyright 2026 The PoC-Library Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +use PoC.utils.all; + +library OSVVM; +context OSVVM.OsvvmContext; + + +entity tb_OutOfOrderBuffer is +end entity; + +architecture TestHarness of tb_OutOfOrderBuffer is + constant NUM_INDEX : positive := 13; + constant DATA_BITS : integer := 32; + + constant tpd : time := 2 ns; + constant tperiod_Clk : time := 10 ns; + + signal Clk : std_logic :='0'; + signal nReset : std_logic :='0'; + + signal Put : std_logic; + signal Full : std_logic; + signal DataIn : std_logic_vector(DATA_BITS-1 downto 0); + signal IndexOut : unsigned(log2ceilnz(NUM_INDEX) -1 downto 0); + + signal Got : std_logic; + signal Valid : std_logic; + signal IndexIn : unsigned(log2ceilnz(NUM_INDEX) -1 downto 0); + signal DataOut : std_logic_vector(DATA_BITS-1 downto 0); + + component dstruct_OutOfOrderBuffer_TestController + generic( + NUM_INDEX : positive; + DATA_BITS : positive + ); + port ( + -- Global Signal Interface + Clock : in std_logic; + nReset : in std_logic ; + + -- Put Port + Put : out std_logic; + Full : in std_logic; + DataIn : out std_logic_vector(DATA_BITS-1 downto 0); + IndexOut : in unsigned(log2ceilnz(NUM_INDEX) -1 downto 0); + + -- Get Port + Got : out std_logic; + Valid : in std_logic; + IndexIn : out unsigned(log2ceilnz(NUM_INDEX) -1 downto 0); + DataOut : in std_logic_vector(DATA_BITS-1 downto 0) + ); + end component; + +begin + + -- create Clock for TB and 100 Mhz + Osvvm.ClockResetPkg.CreateClock ( + Clk => Clk, + Period => Tperiod_Clk + ); + + -- create nReset + Osvvm.ClockResetPkg.CreateReset ( + Reset => nReset, + ResetActive => '0', + Clk => Clk, + Period => 7 * tperiod_Clk, + tpd => tpd + ); + + TestCtrl : component dstruct_OutOfOrderBuffer_TestController + generic map ( + NUM_INDEX => NUM_INDEX, + DATA_BITS => DATA_BITS + ) + port map( + -- Global Signal Interface + Clock => Clk, + nReset => nReset, + + -- Put Port + Put => Put, + Full => Full, + DataIn => DataIn, + IndexOut => IndexOut, + + -- Get Port + Got => Got, + Valid => Valid, + IndexIn => IndexIn, + DataOut => DataOut + ); + + DUT : entity PoC.dstruct_OutOfOrderBuffer + generic map ( + DATA_BITS => DATA_BITS, + NUM_INDEX => NUM_INDEX + ) + port map ( + -- Global signals + Clock => Clk, + Reset => not nReset, + + -- Put Port + Put => Put, + Full => Full, + DataIn => DataIn, + IndexOut => IndexOut, + + -- Get Port + Got => Got, + Valid => Valid, + IndexIn => IndexIn, + DataOut => DataOut + ); + +end architecture; diff --git a/tb/dstruct/RunAllTests.pro b/tb/dstruct/RunAllTests.pro new file mode 100644 index 000000000..d21a997df --- /dev/null +++ b/tb/dstruct/RunAllTests.pro @@ -0,0 +1,25 @@ +# ============================================================================= +# Authors: +# Adrian Weiland (PLC2 Design GmbH) +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +# TestSuite PoC.dstruct +# Deactivated to avoid failure on non-existing testcases + +include ./OutOfOrderBuffer/RunAllTests.pro diff --git a/tb/dstruct/dstruct_deque_tb.vhdl b/tb/dstruct/dstruct_DoubleEndedQueue_tb.vhdl similarity index 98% rename from tb/dstruct/dstruct_deque_tb.vhdl rename to tb/dstruct/dstruct_DoubleEndedQueue_tb.vhdl index 4ab0c1637..df03c0ca1 100644 --- a/tb/dstruct/dstruct_deque_tb.vhdl +++ b/tb/dstruct/dstruct_DoubleEndedQueue_tb.vhdl @@ -2,13 +2,13 @@ -- vim: tabstop=2:shiftwidth=2:noexpandtab -- kate: tab-width 2; replace-tabs off; indent-width 2; -- ============================================================================ --- Authors: Jens Voss +-- Authors: Jens Voss -- --- Testbench: dstruct_deque_tb +-- Testbench: dstruct_DoubleEndedQueue_tb -- -- Description: -- ------------ --- Testbench for dstruct_deque. +-- Testbench for dstruct_DoubleEndedQueue. -- -- License: -- ============================================================================ @@ -28,50 +28,50 @@ -- limitations under the License. -- ============================================================================ -entity dstruct_deque_tb is +entity dstruct_DoubleEndedQueue_tb is end entity; library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library PoC; -use PoC.physical.all; -use PoC.dstruct.all; +use PoC.physical.all; +use PoC.dstruct.all; -- simulation only packages use PoC.sim_types.all; use PoC.simulation.all; use PoC.waveform.all; -architecture tb of dstruct_deque_tb is +architecture tb of dstruct_DoubleEndedQueue_tb is - -- component generics - constant MIN_DEPTH : positive := 128; - constant D_BITS : positive := 16; + -- component generics + constant MIN_DEPTH : positive := 128; + constant D_BITS : positive := 16; - -- Clock Control + -- Clock Control constant CLK_FREQ : FREQ := 50 MHz; - signal clk : std_logic; - signal rst : std_logic; + signal clk : std_logic; + signal rst : std_logic; - -- local Signals + -- local Signals -- PortA - signal dinA : std_logic_vector(D_BITS-1 downto 0); - signal putA : std_logic; - signal gotA : std_logic; - signal doutA : std_logic_vector(D_BITS-1 downto 0); - signal fullA : std_logic; + signal dinA : std_logic_vector(D_BITS-1 downto 0); + signal putA : std_logic; + signal gotA : std_logic; + signal doutA : std_logic_vector(D_BITS-1 downto 0); + signal fullA : std_logic; signal validA : std_logic; -- Port B - signal dinB : std_logic_vector(D_BITS-1 downto 0); - signal putB : std_logic; - signal gotB : std_logic; - signal doutB : std_logic_vector(D_BITS-1 downto 0); + signal dinB : std_logic_vector(D_BITS-1 downto 0); + signal putB : std_logic; + signal gotB : std_logic; + signal doutB : std_logic_vector(D_BITS-1 downto 0); signal validB : std_logic; - signal fullB : std_logic; + signal fullB : std_logic; begin @@ -79,30 +79,30 @@ begin simInitialize; simGenerateClock(clk, CLK_FREQ); - -- DUT - DUT : dstruct_deque - generic map( - D_BITS => D_BITS, - MIN_DEPTH => MIN_DEPTH - ) - port map( - clk => clk, - rst => rst, - --PORT A - dinA => dinA, - putA => putA, - gotA => gotA, - doutA => doutA, - validA => validA, - fullA => fullA, - --PORT B - dinB => dinB, - putB => putB, - gotB => gotB, - doutB => doutB, - validB => validB, - fullB => fullB - ); + -- DUT + DUT : dstruct_DoubleEndedQueue + generic map( + D_BITS => D_BITS, + MIN_DEPTH => MIN_DEPTH + ) + port map( + clk => clk, + rst => rst, + --PORT A + dinA => dinA, + putA => putA, + gotA => gotA, + doutA => doutA, + validA => validA, + fullA => fullA, + --PORT B + dinB => dinB, + putB => putB, + gotB => gotB, + doutB => doutB, + validB => validB, + fullB => fullB + ); -- Stimuli process @@ -111,15 +111,15 @@ begin for i in 1 to n loop wait until rising_edge(clk); end loop; - end; + end procedure; - constant PID : T_SIM_PROCESS_ID := simRegisterProcess("main"); + constant PID : T_SIM_PROCESS_ID := simRegisterProcess("main"); variable i, j, k : integer; begin rst <= '1'; cycle; - rst <= '0'; + rst <= '0'; putA <= '0'; gotA <= '0'; putB <= '0'; diff --git a/tb/dstruct/dstruct_stack_tb.vhdl b/tb/dstruct/dstruct_Stack_tb.vhdl similarity index 66% rename from tb/dstruct/dstruct_stack_tb.vhdl rename to tb/dstruct/dstruct_Stack_tb.vhdl index a4e22d98f..a8102ac46 100644 --- a/tb/dstruct/dstruct_stack_tb.vhdl +++ b/tb/dstruct/dstruct_Stack_tb.vhdl @@ -4,11 +4,11 @@ -- ============================================================================ -- Authors: Jens Voss -- --- Entity: dstruct_stack_tb +-- Entity: dstruct_Stack_tb -- -- Description: -- ------------ --- Testbench for dstruct_stack. +-- Testbench for dstruct_Stack. -- -- License: -- ============================================================================ @@ -28,45 +28,45 @@ -- limitations under the License. -- ============================================================================ -entity dstruct_stack_tb is +entity dstruct_Stack_tb is end entity; library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library PoC; -use PoC.physical.all; -use PoC.dstruct.all; +use PoC.physical.all; +use PoC.dstruct.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; -architecture tb of dstruct_stack_tb is +architecture tb of dstruct_Stack_tb is - -- component generics - constant MIN_DEPTH : positive := 8; - constant D_BITS : positive := 16; + -- component generics + constant MIN_DEPTH : positive := 8; + constant D_BITS : positive := 16; - -- Clock Control + -- Clock Control constant CLK_FREQ : FREQ := 50 MHz; signal clk : std_logic; - signal rst : std_logic; + signal rst : std_logic; -- DUT Connectivity - -- inputs - signal din : std_logic_vector(D_BITS-1 downto 0); - signal put : std_logic; - signal got : std_logic; + -- inputs + signal din : std_logic_vector(D_BITS-1 downto 0); + signal put : std_logic; + signal got : std_logic; - -- outputs - signal dout : std_logic_vector(D_BITS-1 downto 0); - signal full : std_logic; - signal valid : std_logic; - signal empty : std_logic; + -- outputs + signal dout : std_logic_vector(D_BITS-1 downto 0); + signal full : std_logic; + signal valid : std_logic; + signal empty : std_logic; begin @@ -74,35 +74,35 @@ begin simInitialize; simGenerateClock(clk, CLK_FREQ); - -- DUT - DUT : dstruct_stack - generic map ( - D_BITS => D_BITS, - MIN_DEPTH => MIN_DEPTH - ) - port map( - clk => clk, - rst => rst, - din => din, - put => put, - full => full, - got => got, - dout => dout, - valid => valid - ); - - -- Stimuli - process - procedure checkTOS(constant EXPECT : in integer) is + -- DUT + DUT : dstruct_Stack + generic map ( + D_BITS => D_BITS, + MIN_DEPTH => MIN_DEPTH + ) + port map( + clk => clk, + rst => rst, + din => din, + put => put, + full => full, + got => got, + dout => dout, + valid => valid + ); + + -- Stimuli + process + procedure checkTOS(constant EXPECT : in integer) is begin simAssertion(to_integer(unsigned(dout)) = EXPECT, "Wrong top of stack: "& integer'image(to_integer(unsigned(dout)))& " instead of "&integer'image(EXPECT)); end procedure checkTOS; - constant PID : T_SIM_PROCESS_ID := simRegisterProcess("main"); - variable high : integer; - begin + constant PID : T_SIM_PROCESS_ID := simRegisterProcess("main"); + variable high : integer; + begin -- Reset Sequence rst <= '1'; @@ -126,25 +126,25 @@ begin -- One more, which should not be accepted! din <= (others => 'X'); - wait until falling_edge(clk); + wait until falling_edge(clk); put <= '0'; - simAssertion(valid = '1', "valid != 1!"); - simAssertion(full = '1', "full != 1!"); + simAssertion(valid = '1', "valid != 1!"); + simAssertion(full = '1', "full != 1!"); -- Idle - wait until falling_edge(clk); + wait until falling_edge(clk); checkTOS(high); -- Pop two (2) elements got <= '1'; - wait until falling_edge(clk); + wait until falling_edge(clk); high := high - 1; simAssertion(full = '0', "full != 0"); simAssertion(valid = '1', "valid != 1"); checkTOS(high); - wait until falling_edge(clk); + wait until falling_edge(clk); high := high - 1; simAssertion(full = '0', "full != 0"); simAssertion(valid = '1', "valid != 1"); @@ -155,30 +155,30 @@ begin -- Push two (2) zeroes din <= (others => '0'); put <= '1'; - wait until falling_edge(clk); + wait until falling_edge(clk); simAssertion(full = '0', "full != 0"); simAssertion(valid = '1', "valid != 1"); - wait until falling_edge(clk); + wait until falling_edge(clk); simAssertion(full = '1', "full != 1"); simAssertion(valid = '1', "valid != 1"); -- One more, which should not be accepted! din <= (others => 'X'); - wait until falling_edge(clk); + wait until falling_edge(clk); put <= '0'; -- Pop two (2) zeroes got <= '1'; - simAssertion(valid = '1', "valid != 1!"); - simAssertion(full = '1', "full != 1!"); + simAssertion(valid = '1', "valid != 1!"); + simAssertion(full = '1', "full != 1!"); checkTOS(0); - wait until falling_edge(clk); + wait until falling_edge(clk); simAssertion(valid = '1', "valid != 1"); simAssertion(full = '0', "full != 0"); checkTOS(0); - wait until falling_edge(clk); + wait until falling_edge(clk); -- Drain whole stack while valid = '1' loop @@ -191,7 +191,7 @@ begin got <= '0'; simDeactivateProcess(PID); - wait; -- forever + wait; -- forever end process; end tb; diff --git a/tb/fifo/fifo_cc_got_tb.vhdl b/tb/fifo/fifo_cc_got_tb.vhdl index f14c7da2e..e99426b0a 100644 --- a/tb/fifo/fifo_cc_got_tb.vhdl +++ b/tb/fifo/fifo_cc_got_tb.vhdl @@ -3,25 +3,25 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================ --- Authors: Thomas B. Preusser +-- Authors: Thomas B. Preusser -- --- Testbench: Testbench for a FIFO with Common Clock (cc) and Pipelined Interface +-- Testbench: Testbench for a FIFO with Common Clock (cc) and Pipelined Interface -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- -- License: -- ============================================================================ -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,17 +30,17 @@ -- limitations under the License. -- ============================================================================ -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -library PoC; -use PoC.utils.all; -use PoC.physical.all; +library PoC; +use PoC.utils.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; entity fifo_cc_got_tb is @@ -48,116 +48,116 @@ end entity; architecture tb of fifo_cc_got_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; + constant CLOCK_FREQ : FREQ := 100 MHz; - -- component generics - constant D_BITS : positive := 8; - constant MIN_DEPTH : positive := 30; - constant ESTATE_WR_BITS : natural := 2; - constant FSTATE_RD_BITS : natural := 2; + -- component generics + constant D_BITS : positive := 8; + constant MIN_DEPTH : positive := 30; + constant ESTATE_WR_BITS : natural := 2; + constant FSTATE_RD_BITS : natural := 2; - -- Clock Control - signal rst : std_logic; - signal clk : std_logic; + -- Clock Control + signal rst : std_logic; + signal clk : std_logic; begin -- initialize global simulation status simInitialize; -- generate global testbench clock - simGenerateClock(clk, CLOCK_FREQ); - simGenerateWaveform(rst, simGenerateWaveform_Reset(Pause => 10 ns, ResetPulse => 10 ns)); + simGenerateClock(clk, CLOCK_FREQ); + simGenerateWaveform(rst, simGenerateWaveform_Reset(Pause => 10 ns, ResetPulse => 10 ns)); - genDUTs: for c in 0 to 7 generate + genDUTs: for c in 0 to 7 generate constant DATA_REG : boolean := c mod 2 > 0; constant STATE_REG : boolean := c mod 4 > 1; constant OUTPUT_REG : boolean := c mod 8 > 3; - constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for DATA_REG=" & boolean'image(DATA_REG) & " STATE_REG=" & BOOLEAN'image(STATE_REG) & " OUTPUT_REG=" & boolean'image(OUTPUT_REG)); - - -- Local Component Ports - signal put : std_logic; - signal din : std_logic_vector(D_BITS-1 downto 0); - signal full : std_logic; - signal estate_wr : std_logic_vector(ESTATE_WR_BITS - 1 downto 0); - signal got : std_logic; - signal dout : std_logic_vector(D_BITS-1 downto 0); - signal valid : std_logic; - signal fstate_rd : std_logic_vector(FSTATE_RD_BITS - 1 downto 0); - - begin - - DUT : entity PoC.fifo_cc_got - generic map ( - D_BITS => D_BITS, - MIN_DEPTH => MIN_DEPTH, - STATE_REG => STATE_REG, - DATA_REG => DATA_REG, - OUTPUT_REG => OUTPUT_REG, - ESTATE_WR_BITS => ESTATE_WR_BITS, - FSTATE_RD_BITS => FSTATE_RD_BITS - ) - port map ( - rst => rst, - clk => clk, - put => put, - din => din, - full => full, - estate_wr => estate_wr, - got => got, - dout => dout, - valid => valid, - fstate_rd => fstate_rd - ); - - -- Writer - procWriter : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Writer for DATA_REG=" & boolean'image(DATA_REG) & " STATE_REG=" & BOOLEAN'image(STATE_REG) & " OUTPUT_REG=" & boolean'image(OUTPUT_REG)); - begin - din <= (others => '-'); - put <= '0'; - wait until rising_edge(clk) and rst = '0'; - - for i in 0 to 2**(D_BITS-1)-1 loop - din <= std_logic_vector(to_unsigned(i, D_BITS)); - put <= '1'; - wait until rising_edge(clk) and full = '0'; - end loop; - - for i in 2**(D_BITS-1) to 2**D_BITS-1 loop - din <= (others => '-'); - put <= '0'; - wait until rising_edge(clk) and valid = '0'; - din <= std_logic_vector(to_unsigned(i, D_BITS)); - put <= '1'; - wait until rising_edge(clk); - end loop; - - din <= (others => '-'); - put <= '0'; - - -- This process is finished + constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for DATA_REG=" & boolean'image(DATA_REG) & " STATE_REG=" & BOOLEAN'image(STATE_REG) & " OUTPUT_REG=" & boolean'image(OUTPUT_REG)); + + -- Local Component Ports + signal put : std_logic; + signal din : std_logic_vector(D_BITS-1 downto 0); + signal full : std_logic; + signal estate_wr : std_logic_vector(ESTATE_WR_BITS - 1 downto 0); + signal got : std_logic; + signal dout : std_logic_vector(D_BITS-1 downto 0); + signal valid : std_logic; + signal fstate_rd : std_logic_vector(FSTATE_RD_BITS - 1 downto 0); + + begin + + DUT : entity PoC.fifo_cc_got + generic map ( + D_BITS => D_BITS, + MIN_DEPTH => MIN_DEPTH, + STATE_REG => STATE_REG, + DATA_REG => DATA_REG, + OUTPUT_REG => OUTPUT_REG, + ESTATE_WR_BITS => ESTATE_WR_BITS, + FSTATE_RD_BITS => FSTATE_RD_BITS + ) + port map ( + rst => rst, + clk => clk, + put => put, + din => din, + full => full, + estate_wr => estate_wr, + got => got, + dout => dout, + valid => valid, + fstate_rd => fstate_rd + ); + + -- Writer + procWriter : process + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Writer for DATA_REG=" & boolean'image(DATA_REG) & " STATE_REG=" & BOOLEAN'image(STATE_REG) & " OUTPUT_REG=" & boolean'image(OUTPUT_REG)); + begin + din <= (others => '-'); + put <= '0'; + wait until rising_edge(clk) and rst = '0'; + + for i in 0 to 2**(D_BITS-1)-1 loop + din <= std_logic_vector(to_unsigned(i, D_BITS)); + put <= '1'; + wait until rising_edge(clk) and full = '0'; + end loop; + + for i in 2**(D_BITS-1) to 2**D_BITS-1 loop + din <= (others => '-'); + put <= '0'; + wait until rising_edge(clk) and valid = '0'; + din <= std_logic_vector(to_unsigned(i, D_BITS)); + put <= '1'; + wait until rising_edge(clk); + end loop; + + din <= (others => '-'); + put <= '0'; + + -- This process is finished simDeactivateProcess(simProcessID); wait; -- forever - end process; + end process; - -- Reader + -- Reader procReader : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Reader for DATA_REG=" & boolean'image(DATA_REG) & " STATE_REG=" & BOOLEAN'image(STATE_REG) & " OUTPUT_REG=" & boolean'image(OUTPUT_REG)); - begin - got <= '0'; - for i in 0 to 2**D_BITS-1 loop - wait until rising_edge(clk) and valid = '1'; + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Reader for DATA_REG=" & boolean'image(DATA_REG) & " STATE_REG=" & BOOLEAN'image(STATE_REG) & " OUTPUT_REG=" & boolean'image(OUTPUT_REG)); + begin + got <= '0'; + for i in 0 to 2**D_BITS-1 loop + wait until rising_edge(clk) and valid = '1'; simAssertion((dout = std_logic_vector(to_unsigned(i, D_BITS))), "Output failure in configuration " & integer'image(c) & " @ Pos " & INTEGER'image(i)); - got <= '1'; - wait until rising_edge(clk); - got <= '0'; - wait until rising_edge(clk); - end loop; + got <= '1'; + wait until rising_edge(clk); + got <= '0'; + wait until rising_edge(clk); + end loop; - -- This process is finished + -- This process is finished simDeactivateProcess(simProcessID); simFinalizeTest(simTestID); wait; -- forever - end process; - end generate genDUTs; + end process; + end generate genDUTs; end architecture; diff --git a/tb/fifo/fifo_cc_got_tempput_tb.vhdl b/tb/fifo/fifo_cc_got_tempput_tb.vhdl index 94f6b36a8..1417908db 100644 --- a/tb/fifo/fifo_cc_got_tempput_tb.vhdl +++ b/tb/fifo/fifo_cc_got_tempput_tb.vhdl @@ -3,25 +3,25 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================ --- Authors: Thomas B. Preusser +-- Authors: Thomas B. Preusser -- --- Testbench: Testbench for a FIFO with Common Clock (cc) and Pipelined Interface +-- Testbench: Testbench for a FIFO with Common Clock (cc) and Pipelined Interface -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- -- License: -- ============================================================================ -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,16 +30,16 @@ -- limitations under the License. -- ============================================================================ -library IEEE; -use IEEE.std_logic_1164.all; +library IEEE; +use IEEE.std_logic_1164.all; -library PoC; -use PoC.utils.all; -use PoC.physical.all; +library PoC; +use PoC.utils.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; entity fifo_cc_got_tempput_tb is @@ -47,187 +47,187 @@ end entity; architecture tb of fifo_cc_got_tempput_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; + constant CLOCK_FREQ : FREQ := 100 MHz; - -- component generics - constant D_BITS : positive := 8; - constant MIN_DEPTH : positive := 8; - constant ESTATE_WR_BITS : natural := 2; - constant FSTATE_RD_BITS : natural := 2; + -- component generics + constant D_BITS : positive := 8; + constant MIN_DEPTH : positive := 8; + constant ESTATE_WR_BITS : natural := 2; + constant FSTATE_RD_BITS : natural := 2; - constant ISPEC : string := "C C Cccccpppp pppp c ccc pp Cppppp ppp rp RpC"; - constant OSPEC : string := "ggg gggggggg ggg G G"; + constant ISPEC : string := "C C Cccccpppp pppp c ccc pp Cppppp ppp rp RpC"; + constant OSPEC : string := "ggg gggggggg ggg G G"; - -- Sequence Generator - constant GEN : bit_vector := "100110001"; - constant ORG : std_logic_vector := "00000001"; + -- Sequence Generator + constant GEN : bit_vector := "100110001"; + constant ORG : std_logic_vector := "00000001"; - -- Clock Control - signal rst : std_logic; - signal clk : std_logic; + -- Clock Control + signal rst : std_logic; + signal clk : std_logic; begin -- initialize global simulation status simInitialize; -- generate global testbench clock simGenerateClock(clk, CLOCK_FREQ); - simGenerateWaveform(rst, simGenerateWaveform_Reset(Pause => 10 ns, ResetPulse => 10 ns)); + simGenerateWaveform(rst, simGenerateWaveform_Reset(Pause => 10 ns, ResetPulse => 10 ns)); - genTests: for c in 0 to 7 generate + genTests: for c in 0 to 7 generate constant DATA_REG : boolean := c mod 2 > 0; constant STATE_REG : boolean := c mod 4 > 1; constant OUTPUT_REG : boolean := c mod 8 > 3; - constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for DATA_REG=" & boolean'image(DATA_REG) & " STATE_REG=" & BOOLEAN'image(STATE_REG) & " OUTPUT_REG=" & boolean'image(OUTPUT_REG)); - - signal put : std_logic; - signal putx : std_logic; - signal di : std_logic_vector(D_BITS-1 downto 0); - signal ful : std_logic; - - signal commit : std_logic; - signal rollback : std_logic; - - signal got : std_logic; - signal gotx : std_logic; - signal do : std_logic_vector(D_BITS-1 downto 0); - signal dox : std_logic_vector(D_BITS-1 downto 0); - signal vld : std_logic; - - begin - - putx <= put and not ful; - geni : entity PoC.comm_scramble - generic map ( - GEN => GEN, - BITS => D_BITS - ) - port map ( - clk => clk, - set => rst, - din => ORG, - step => putx, - mask => di - ); + constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for DATA_REG=" & boolean'image(DATA_REG) & " STATE_REG=" & BOOLEAN'image(STATE_REG) & " OUTPUT_REG=" & boolean'image(OUTPUT_REG)); + + signal put : std_logic; + signal putx : std_logic; + signal di : std_logic_vector(D_BITS-1 downto 0); + signal ful : std_logic; + + signal commit : std_logic; + signal rollback : std_logic; + + signal got : std_logic; + signal gotx : std_logic; + signal do : std_logic_vector(D_BITS-1 downto 0); + signal dox : std_logic_vector(D_BITS-1 downto 0); + signal vld : std_logic; + + begin + + putx <= put and not ful; + geni : entity PoC.comm_Scramble + generic map ( + GEN => GEN, + BITS => D_BITS + ) + port map ( + clk => clk, + set => rst, + din => ORG, + step => putx, + mask => di + ); -- Writer - procWriter : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Writer for DATA_REG=" & boolean'image(DATA_REG) & " STATE_REG=" & BOOLEAN'image(STATE_REG) & " OUTPUT_REG=" & boolean'image(OUTPUT_REG)); - begin - wait until rising_edge(clk); - - for i in ISPEC'range loop - put <= '0'; - commit <= '0'; - rollback <= '0'; - case ISPEC(i) is - when ' ' => - wait until rising_edge(clk); - - when 'p' => - put <= '1'; - wait until rising_edge(clk) and ful = '0'; - - when 'c' => - commit <= '1'; - wait until rising_edge(clk); - - when 'C' => - put <= '1'; - commit <= '1'; - wait until rising_edge(clk) and ful = '0'; - - when 'r' => - rollback <= '1'; - wait until rising_edge(clk); - - when 'R' => - put <= '1'; - rollback <= '1'; - wait until rising_edge(clk) and ful = '0'; - - when others => - report "Illegal ISPEC." severity failure; - end case; - end loop; - put <= '0'; - commit <= '0'; - - -- This process is finished + procWriter : process + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Writer for DATA_REG=" & boolean'image(DATA_REG) & " STATE_REG=" & BOOLEAN'image(STATE_REG) & " OUTPUT_REG=" & boolean'image(OUTPUT_REG)); + begin + wait until rising_edge(clk); + + for i in ISPEC'range loop + put <= '0'; + commit <= '0'; + rollback <= '0'; + case ISPEC(i) is + when ' ' => + wait until rising_edge(clk); + + when 'p' => + put <= '1'; + wait until rising_edge(clk) and ful = '0'; + + when 'c' => + commit <= '1'; + wait until rising_edge(clk); + + when 'C' => + put <= '1'; + commit <= '1'; + wait until rising_edge(clk) and ful = '0'; + + when 'r' => + rollback <= '1'; + wait until rising_edge(clk); + + when 'R' => + put <= '1'; + rollback <= '1'; + wait until rising_edge(clk) and ful = '0'; + + when others => + report "Illegal ISPEC." severity failure; + end case; + end loop; + put <= '0'; + commit <= '0'; + + -- This process is finished simDeactivateProcess(simProcessID); wait; -- forever - end process; - - DUT : entity PoC.fifo_cc_got_tempput - generic map ( - D_BITS => D_BITS, - MIN_DEPTH => MIN_DEPTH, - DATA_REG => DATA_REG, - STATE_REG => STATE_REG, - OUTPUT_REG => OUTPUT_REG, - ESTATE_WR_BITS => ESTATE_WR_BITS, - FSTATE_RD_BITS => FSTATE_RD_BITS - ) - port map ( - rst => rst, - clk => clk, - - put => put, - din => di, - full => ful, - estate_wr => open, - commit => commit, - rollback => rollback, - - got => got, - dout => do, - valid => vld, - fstate_rd => open - ); + end process; + + DUT : entity PoC.fifo_cc_got_tempput + generic map ( + D_BITS => D_BITS, + MIN_DEPTH => MIN_DEPTH, + DATA_REG => DATA_REG, + STATE_REG => STATE_REG, + OUTPUT_REG => OUTPUT_REG, + ESTATE_WR_BITS => ESTATE_WR_BITS, + FSTATE_RD_BITS => FSTATE_RD_BITS + ) + port map ( + rst => rst, + clk => clk, + + put => put, + din => di, + full => ful, + estate_wr => open, + commit => commit, + rollback => rollback, + + got => got, + dout => do, + valid => vld, + fstate_rd => open + ); -- Reader procReader : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Reader for DATA_REG=" & boolean'image(DATA_REG) & " STATE_REG=" & BOOLEAN'image(STATE_REG) & " OUTPUT_REG=" & boolean'image(OUTPUT_REG)); - begin - for i in OSPEC'range loop - case OSPEC(i) is - when ' ' => - got <= '0'; - wait until rising_edge(clk); - - when 'g' => - got <= '1'; - wait until rising_edge(clk) and vld = '1'; + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Reader for DATA_REG=" & boolean'image(DATA_REG) & " STATE_REG=" & BOOLEAN'image(STATE_REG) & " OUTPUT_REG=" & boolean'image(OUTPUT_REG)); + begin + for i in OSPEC'range loop + case OSPEC(i) is + when ' ' => + got <= '0'; + wait until rising_edge(clk); + + when 'g' => + got <= '1'; + wait until rising_edge(clk) and vld = '1'; simAssertion((do = dox), "Test #" & integer'image(c) & ": Output Mismatch."); - when 'G' => - got <= '1'; - wait until rising_edge(clk) and vld = '1'; + when 'G' => + got <= '1'; + wait until rising_edge(clk) and vld = '1'; simAssertion((do /= dox), "Output Mismatch."); - when others => - report "Illegal ISPEC." severity failure; - end case; - end loop; + when others => + report "Illegal ISPEC." severity failure; + end case; + end loop; - -- This process is finished + -- This process is finished simDeactivateProcess(simProcessID); wait; -- forever - end process; - - gotx <= got and vld; - geno : entity PoC.comm_scramble - generic map ( - GEN => GEN, - BITS => D_BITS - ) - port map ( - clk => clk, - set => rst, - din => ORG, - step => gotx, - mask => dox - ); - - end generate; + end process; + + gotx <= got and vld; + geno : entity PoC.comm_Scramble + generic map ( + GEN => GEN, + BITS => D_BITS + ) + port map ( + clk => clk, + set => rst, + din => ORG, + step => gotx, + mask => dox + ); + + end generate; end architecture; diff --git a/tb/fifo/fifo_ic_assembly_tb.vhdl b/tb/fifo/fifo_ic_assembly_tb.vhdl index 6c319e9e5..4d1de5c75 100644 --- a/tb/fifo/fifo_ic_assembly_tb.vhdl +++ b/tb/fifo/fifo_ic_assembly_tb.vhdl @@ -5,18 +5,18 @@ -- ============================================================================= -- Authors: Thomas B. Preusser -- --- Testbench: Testbench FIFO stream assembly: module fifo_ic_assembly. +-- Testbench: Testbench FIFO stream assembly: module fifo_ic_assembly. -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,75 +30,75 @@ end entity fifo_ic_assembly_tb; library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library PoC; -use PoC.utils.all; -use PoC.physical.all; +use PoC.utils.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; architecture tb of fifo_ic_assembly_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; + constant CLOCK_FREQ : FREQ := 100 MHz; - -- component generics - constant D_BITS : positive := 8; - constant A_BITS : positive := 8; - constant G_BITS : positive := 2; + -- component generics + constant D_BITS : positive := 8; + constant A_BITS : positive := 8; + constant G_BITS : positive := 2; - constant SEQ : t_intvec := (1, 0, 2, 3, 5, 4, 7, 6, 8, 10, 9, 12, 11, 13, 15, 14); + constant SEQ : t_intvec := (1, 0, 2, 3, 5, 4, 7, 6, 8, 10, 9, 12, 11, 13, 15, 14); - -- component ports - signal clk : std_logic; - signal rst : std_logic; + -- component ports + signal clk : std_logic; + signal rst : std_logic; - signal base : std_logic_vector(A_BITS-1 downto 0); - signal addr : std_logic_vector(A_BITS-1 downto 0); - signal din : std_logic_vector(D_BITS-1 downto 0); - signal put : std_logic; + signal base : std_logic_vector(A_BITS-1 downto 0); + signal addr : std_logic_vector(A_BITS-1 downto 0); + signal din : std_logic_vector(D_BITS-1 downto 0); + signal put : std_logic; - signal dout : std_logic_vector(D_BITS-1 downto 0); - signal vld : std_logic; - signal got : std_logic; + signal dout : std_logic_vector(D_BITS-1 downto 0); + signal vld : std_logic; + signal got : std_logic; begin - simInitialize; - simGenerateClock(clk, CLOCK_FREQ); - rst <= '0'; - - DUT: entity PoC.fifo_ic_assembly - generic map ( - D_BITS => D_BITS, - A_BITS => A_BITS, - G_BITS => G_BITS - ) - port map ( - clk_wr => clk, - rst_wr => rst, - base => base, - addr => addr, - din => din, - put => put, - - clk_rd => clk, - rst_rd => rst, - dout => dout, - vld => vld, - got => got - ); + simInitialize; + simGenerateClock(clk, CLOCK_FREQ); + rst <= '0'; + + DUT: entity PoC.fifo_ic_assembly + generic map ( + D_BITS => D_BITS, + A_BITS => A_BITS, + G_BITS => G_BITS + ) + port map ( + clk_wr => clk, + rst_wr => rst, + base => base, + addr => addr, + din => din, + put => put, + + clk_rd => clk, + rst_rd => rst, + dout => dout, + vld => vld, + got => got + ); -- Writer procWriter : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Writer"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Writer"); - variable t : integer; - begin - put <= '0'; - wait until base = (base'range => '0'); + variable t : integer; + begin + put <= '0'; + wait until base = (base'range => '0'); for k in 0 to 2 loop for i in SEQ'range loop @@ -123,14 +123,14 @@ begin -- This process is finished simDeactivateProcess(simProcessID); wait; -- forever - end process; + end process; - -- Reading Checker + -- Reading Checker procReader : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Reader", IsLowPriority => true); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Reader", IsLowPriority => true); variable i : integer := 0; - begin - got <= '1'; + begin + got <= '1'; wait until rising_edge(clk) and vld = '1'; simAssertion(unsigned(not dout) = i mod 2**dout'length, "Unexpected output: "&integer'image(to_integer(unsigned(dout)))& @@ -140,6 +140,6 @@ begin wait until rising_edge(clk); end loop; i := i + 1; - end process; + end process; end tb; diff --git a/tb/fifo/fifo_ic_got_tb.vhdl b/tb/fifo/fifo_ic_got_tb.vhdl index d2900d898..e09f359d4 100644 --- a/tb/fifo/fifo_ic_got_tb.vhdl +++ b/tb/fifo/fifo_ic_got_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Thomas B. Preusser +-- Authors: Thomas B. Preusser -- --- Testbench: Testbench for a FIFO with independent clocks +-- Testbench: Testbench for a FIFO with independent clocks -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,16 +29,16 @@ -- limitations under the License. -- ============================================================================= -library IEEE; -use IEEE.std_logic_1164.all; +library IEEE; +use IEEE.std_logic_1164.all; -library PoC; -use PoC.utils.all; -use PoC.physical.all; +library PoC; +use PoC.utils.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; entity fifo_ic_got_tb is @@ -46,45 +46,45 @@ end entity; architecture tb of fifo_ic_got_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; - - -- FIFO Parameters - constant D_BITS : positive := 9; - constant MIN_DEPTH : positive := 8; - constant OUTPUT_REG : boolean := true; - constant ESTATE_WR_BITS : natural := 2; - constant FSTATE_RD_BITS : natural := 2; - - -- Sequence Generator - constant GEN : bit_vector := "100110001"; - constant ORG : std_logic_vector := "00000001"; - - -- Clock Generation and Reset - signal rst : std_logic; - signal clk0 : std_logic; - signal clk1 : std_logic; - signal clk2 : std_logic; - signal done : std_logic := '0'; - - -- clk0 -> clk1 Transfer - signal di0 : std_logic_vector(D_BITS-1 downto 0); - signal put0 : std_logic; - signal ful0 : std_logic; - - signal do1 : std_logic_vector(D_BITS-1 downto 0); - signal vld1 : std_logic; - signal got1 : std_logic; - - -- clk1 -> clk2 Transfer - signal di1 : std_logic_vector(D_BITS-1 downto 0); - signal put1 : std_logic; - signal ful1 : std_logic; - - signal do2 : std_logic_vector(D_BITS-1 downto 0); - signal vld2 : std_logic; - signal got2 : std_logic; - - signal dat2 : std_logic_vector(D_BITS-1 downto 0); + constant CLOCK_FREQ : FREQ := 100 MHz; + + -- FIFO Parameters + constant D_BITS : positive := 9; + constant MIN_DEPTH : positive := 8; + constant OUTPUT_REG : boolean := true; + constant ESTATE_WR_BITS : natural := 2; + constant FSTATE_RD_BITS : natural := 2; + + -- Sequence Generator + constant GEN : bit_vector := "100110001"; + constant ORG : std_logic_vector := "00000001"; + + -- Clock Generation and Reset + signal rst : std_logic; + signal clk0 : std_logic; + signal clk1 : std_logic; + signal clk2 : std_logic; + signal done : std_logic := '0'; + + -- clk0 -> clk1 Transfer + signal di0 : std_logic_vector(D_BITS-1 downto 0); + signal put0 : std_logic; + signal ful0 : std_logic; + + signal do1 : std_logic_vector(D_BITS-1 downto 0); + signal vld1 : std_logic; + signal got1 : std_logic; + + -- clk1 -> clk2 Transfer + signal di1 : std_logic_vector(D_BITS-1 downto 0); + signal put1 : std_logic; + signal ful1 : std_logic; + + signal do2 : std_logic_vector(D_BITS-1 downto 0); + signal vld2 : std_logic; + signal got2 : std_logic; + + signal dat2 : std_logic_vector(D_BITS-1 downto 0); begin -- initialize global simulation status @@ -93,111 +93,111 @@ begin simGenerateClock(clk0, 14 ns); simGenerateClock(clk1, 24 ns); simGenerateClock(clk2, 10 ns); - simGenerateWaveform(rst, simGenerateWaveform_Reset(Pause => 0 ns, ResetPulse => 30 ns)); - - ----------------------------------------------------------------------------- - -- Initial Generator - gen0 : entity PoC.comm_scramble - generic map ( - GEN => GEN, - BITS => D_BITS - ) - port map ( - clk => clk0, - set => rst, - din => ORG, - step => put0, - mask => di0 - ); - - -- Writer + simGenerateWaveform(rst, simGenerateWaveform_Reset(Pause => 0 ns, ResetPulse => 30 ns)); + + ----------------------------------------------------------------------------- + -- Initial Generator + gen0 : entity PoC.comm_Scramble + generic map ( + GEN => GEN, + BITS => D_BITS + ) + port map ( + clk => clk0, + set => rst, + din => ORG, + step => put0, + mask => di0 + ); + + -- Writer procWriter : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Writer"); - - variable cnt : natural := 0; - begin - put0 <= '0'; - wait until rst = '0' and rising_edge(clk0); - - -- Slow Input Phase - while cnt < 2*MIN_DEPTH loop - wait until falling_edge(clk0); - if ful0 = '0' and vld1 = '0' then - put0 <= '1'; - cnt := cnt + 1; - else - put0 <= '0'; - end if; - end loop; - - -- Fast Input Phase - while cnt < 4*MIN_DEPTH loop - wait until falling_edge(clk0); - if ful0 = '0' then - put0 <= '1'; - cnt := cnt + 1; - else - put0 <= '0'; - end if; - end loop; - - -- Let it drain - wait until falling_edge(clk0); - put0 <= '0'; - - -- This process is finished + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Writer"); + + variable cnt : natural := 0; + begin + put0 <= '0'; + wait until rst = '0' and rising_edge(clk0); + + -- Slow Input Phase + while cnt < 2*MIN_DEPTH loop + wait until falling_edge(clk0); + if ful0 = '0' and vld1 = '0' then + put0 <= '1'; + cnt := cnt + 1; + else + put0 <= '0'; + end if; + end loop; + + -- Fast Input Phase + while cnt < 4*MIN_DEPTH loop + wait until falling_edge(clk0); + if ful0 = '0' then + put0 <= '1'; + cnt := cnt + 1; + else + put0 <= '0'; + end if; + end loop; + + -- Let it drain + wait until falling_edge(clk0); + put0 <= '0'; + + -- This process is finished simDeactivateProcess(simProcessID); wait; -- forever - end process; - - fifo0_1 : entity PoC.fifo_ic_got - generic map ( - D_BITS => D_BITS, - MIN_DEPTH => MIN_DEPTH, - OUTPUT_REG => OUTPUT_REG, - ESTATE_WR_BITS => ESTATE_WR_BITS, - FSTATE_RD_BITS => FSTATE_RD_BITS - ) - port map ( - clk_wr => clk0, - rst_wr => rst, - put => put0, - din => di0, - full => ful0, - estate_wr => open, - - clk_rd => clk1, - rst_rd => rst, - got => got1, - valid => vld1, - dout => do1, - fstate_rd => open - ); - - ----------------------------------------------------------------------------- - -- Intermediate Checker - gen1 : entity PoC.comm_scramble - generic map ( - GEN => GEN, - BITS => D_BITS - ) - port map ( - clk => clk1, - set => rst, - din => ORG, - step => put1, - mask => di1 - ); - got1 <= vld1 and not ful1; - put1 <= got1; + end process; + + fifo0_1 : entity PoC.fifo_ic_got + generic map ( + D_BITS => D_BITS, + MIN_DEPTH => MIN_DEPTH, + OUTPUT_REG => OUTPUT_REG, + ESTATE_WR_BITS => ESTATE_WR_BITS, + FSTATE_RD_BITS => FSTATE_RD_BITS + ) + port map ( + clk_wr => clk0, + rst_wr => rst, + put => put0, + din => di0, + full => ful0, + estate_wr => open, + + clk_rd => clk1, + rst_rd => rst, + got => got1, + valid => vld1, + dout => do1, + fstate_rd => open + ); + + ----------------------------------------------------------------------------- + -- Intermediate Checker + gen1 : entity PoC.comm_Scramble + generic map ( + GEN => GEN, + BITS => D_BITS + ) + port map ( + clk => clk1, + set => rst, + din => ORG, + step => put1, + mask => di1 + ); + got1 <= vld1 and not ful1; + put1 <= got1; -- Pass-thru checker procChecker : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Pass-thru checker"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Pass-thru checker"); - variable cnt : natural := 0; - begin - -- Pass-thru Checking + variable cnt : natural := 0; + begin + -- Pass-thru Checking while cnt < 4*MIN_DEPTH loop wait until rising_edge(clk1); simAssertion(((rst = '1') or (put1 = '0') or (do1 = di1)), "Mismatch in clk1."); @@ -206,58 +206,58 @@ begin end if; end loop; - -- This process is finished + -- This process is finished simDeactivateProcess(simProcessID); wait; - end process; - - fifo1_2 : entity PoC.fifo_ic_got - generic map ( - DATA_REG => true, - D_BITS => D_BITS, - MIN_DEPTH => MIN_DEPTH, - ESTATE_WR_BITS => ESTATE_WR_BITS, - FSTATE_RD_BITS => FSTATE_RD_BITS - ) - port map ( - clk_wr => clk1, - rst_wr => rst, - put => put1, - din => di1, - full => ful1, - estate_wr => open, - - clk_rd => clk2, - rst_rd => rst, - got => got2, - valid => vld2, - dout => do2, - fstate_rd => open - ); - - ----------------------------------------------------------------------------- - -- Final Checker - gen2 : entity PoC.comm_scramble - generic map ( - GEN => GEN, - BITS => D_BITS - ) - port map ( - clk => clk2, - set => rst, - din => ORG, - step => got2, - mask => dat2 - ); + end process; + + fifo1_2 : entity PoC.fifo_ic_got + generic map ( + DATA_REG => true, + D_BITS => D_BITS, + MIN_DEPTH => MIN_DEPTH, + ESTATE_WR_BITS => ESTATE_WR_BITS, + FSTATE_RD_BITS => FSTATE_RD_BITS + ) + port map ( + clk_wr => clk1, + rst_wr => rst, + put => put1, + din => di1, + full => ful1, + estate_wr => open, + + clk_rd => clk2, + rst_rd => rst, + got => got2, + valid => vld2, + dout => do2, + fstate_rd => open + ); + + ----------------------------------------------------------------------------- + -- Final Checker + gen2 : entity PoC.comm_Scramble + generic map ( + GEN => GEN, + BITS => D_BITS + ) + port map ( + clk => clk2, + set => rst, + din => ORG, + step => got2, + mask => dat2 + ); -- Reader procReader : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Reader"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Reader"); - variable cnt : natural := 0; - variable del : natural := 0; - begin - -- Final Checking + variable cnt : natural := 0; + variable del : natural := 0; + begin + -- Final Checking while cnt < 4*MIN_DEPTH loop wait until rising_edge(clk2); got2 <= '0'; @@ -275,6 +275,6 @@ begin -- This process is finished simDeactivateProcess(simProcessID); wait; -- forever - end process; + end process; end architecture; diff --git a/tb/io/ddrio/ddrio_inout_tb.vhdl b/tb/io/ddrio/ddrio_InOut_tb.vhdl similarity index 57% rename from tb/io/ddrio/ddrio_inout_tb.vhdl rename to tb/io/ddrio/ddrio_InOut_tb.vhdl index 57b6c9426..38aaf4d3a 100644 --- a/tb/io/ddrio/ddrio_inout_tb.vhdl +++ b/tb/io/ddrio/ddrio_InOut_tb.vhdl @@ -3,9 +3,9 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================ --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Testbench: for component ddrio_inout +-- Testbench: for component ddrio_InOut -- -- Description: -- ------------------------------------ @@ -14,13 +14,13 @@ -- License: -- ============================================================================ -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,36 +29,36 @@ -- limitations under the License. -- ============================================================================ -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library poc; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; -entity ddrio_inout_tb is +entity ddrio_InOut_tb is end entity; -architecture sim of ddrio_inout_tb is - -- component generics - constant BITS : positive := 2; +architecture sim of ddrio_InOut_tb is + -- component generics + constant BITS : positive := 2; -- component ports - signal ClockOut : std_logic := '1'; + signal ClockOut : std_logic := '1'; signal ClockOutEnable : std_logic := '0'; - signal OutputEnable : std_logic; - signal DataOut_high : std_logic_vector(BITS - 1 downto 0); - signal DataOut_low : std_logic_vector(BITS - 1 downto 0); - signal ClockIn : std_logic := '1'; - signal ClockInEnable : std_logic := '0'; - signal DataIn_high : std_logic_vector(BITS - 1 downto 0); - signal DataIn_low : std_logic_vector(BITS - 1 downto 0); - signal Pad : std_logic_vector(BITS - 1 downto 0); + signal OutputEnable : std_logic; + signal DataOut_high : std_logic_vector(BITS - 1 downto 0); + signal DataOut_low : std_logic_vector(BITS - 1 downto 0); + signal ClockIn : std_logic := '1'; + signal ClockInEnable : std_logic := '0'; + signal DataIn_high : std_logic_vector(BITS - 1 downto 0); + signal DataIn_low : std_logic_vector(BITS - 1 downto 0); + signal Pad : std_logic_vector(BITS - 1 downto 0); -- period of signal "ClockIn" constant CLOCK_IN_PERIOD : time := 12 ns; @@ -78,50 +78,50 @@ begin -- initialize global simulation status simInitialize; -- generate global testbench clock - simGenerateClock(ClockIn, CLOCK_IN_PERIOD); - simGenerateClock(ClockOut, CLOCK_OUT_PERIOD); - - -- component instantiation - DUT: entity poc.ddrio_inout - generic map ( - BITS => BITS) - port map ( - ClockOut => ClockOut, - ClockOutEnable => ClockOutEnable, - OutputEnable => OutputEnable, - DataOut_high => DataOut_high, - DataOut_low => DataOut_low, - ClockIn => ClockIn, - ClockInEnable => ClockInEnable, - DataIn_high => DataIn_high, - DataIn_low => DataIn_low, - Pad => Pad); + simGenerateClock(ClockIn, CLOCK_IN_PERIOD); + simGenerateClock(ClockOut, CLOCK_OUT_PERIOD); + + -- component instantiation + DUT: entity poc.ddrio_InOut + generic map ( + BITS => BITS) + port map ( + ClockOut => ClockOut, + ClockOutEnable => ClockOutEnable, + OutputEnable => OutputEnable, + DataOut_high => DataOut_high, + DataOut_low => DataOut_low, + ClockIn => ClockIn, + ClockInEnable => ClockInEnable, + DataIn_high => DataIn_high, + DataIn_low => DataIn_low, + Pad => Pad); -- waveform generation WaveGen_Proc: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); variable ii : std_logic_vector(3 downto 0); begin -- disabled outputs on FPGA and other side OutputEnable <= '0'; - Pad <= (others => 'Z'); + Pad <= (others => 'Z'); - -- simulate waiting for clock enable + -- simulate waiting for clock enable wait for 42 ns; - -- clock out ready, synchronous to ClockIn - wait until rising_edge(ClockOut); - ClockOutEnable <= '1'; + -- clock out ready, synchronous to ClockIn + wait until rising_edge(ClockOut); + ClockOutEnable <= '1'; - -- clock in ready, synchronous to ClockIn - wait until rising_edge(ClockIn); - ClockInEnable <= '1'; + -- clock in ready, synchronous to ClockIn + wait until rising_edge(ClockIn); + ClockInEnable <= '1'; -- input data into FPGA for i in 0 to 15 loop -- precondition: simulation is at a rising_edge(ClockIn) - ii := std_logic_vector(to_unsigned(i, 4)); + ii := std_logic_vector(to_unsigned(i, 4)); -- input LSB first Pad <= ii(1 downto 0); -- bit 0 and 1 with falling edge @@ -136,37 +136,37 @@ begin wait for 24 ns; -- output data from FPGA - wait until rising_edge(ClockOut); - OutputEnable <= '1'; - for i in 0 to 15 loop + wait until rising_edge(ClockOut); + OutputEnable <= '1'; + for i in 0 to 15 loop -- precondition: simulation is at a rising_edge(ClockOut) - ii := std_logic_vector(to_unsigned(i, 4)); - -- output LSB first - DataOut_high <= ii(1 downto 0); -- bit 0 and 1 with rising edge - DataOut_low <= ii(3 downto 2); -- bit 2 and 3 with falling edge - wait until rising_edge(ClockOut); - end loop; + ii := std_logic_vector(to_unsigned(i, 4)); + -- output LSB first + DataOut_high <= ii(1 downto 0); -- bit 0 and 1 with rising edge + DataOut_low <= ii(3 downto 2); -- bit 2 and 3 with falling edge + wait until rising_edge(ClockOut); + end loop; - -- disable output again - OutputEnable <= '0'; - wait until rising_edge(ClockOut); + -- disable output again + OutputEnable <= '0'; + wait until rising_edge(ClockOut); -- This process is finished simDeactivateProcess(simProcessID); wait; -- forever - end process WaveGen_Proc; + end process WaveGen_Proc; -- checkout output while reading from PAD WaveCheck_Proc: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); - variable ii : std_logic_vector(3 downto 0); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); + variable ii : std_logic_vector(3 downto 0); begin -- wait until ClockIn is enabled from process above wait until rising_edge(ClockIn) and ClockInEnable = '1'; for i in 0 to 15 loop -- precondition: simulation is at a rising_edge(ClockIn) - ii := std_logic_vector(to_unsigned(i, 4)); + ii := std_logic_vector(to_unsigned(i, 4)); wait for OUTPUT_IN_DELAY; simAssertion((DataIn_high = ii(3 downto 2)), "Wrong DataIn_high"); simAssertion((DataIn_low = ii(1 downto 0)), "Wrong DataIn_low"); @@ -178,10 +178,10 @@ begin for i in 0 to 15 loop -- precondition: simulation is at a rising_edge(ClockIn) - ii := std_logic_vector(to_unsigned(i, 4)); + ii := std_logic_vector(to_unsigned(i, 4)); wait for OUTPUT_OUT_DELAY; simAssertion((Pad = ii(1 downto 0)), "Wrong Pad during clock high"); - wait until falling_edge(ClockOut); + wait until falling_edge(ClockOut); wait for OUTPUT_OUT_DELAY; simAssertion((Pad = ii(3 downto 2)), "Wrong Pad during clock low"); wait until rising_edge(ClockOut); diff --git a/tb/io/ddrio/ddrio_in_tb.vhdl b/tb/io/ddrio/ddrio_In_tb.vhdl similarity index 59% rename from tb/io/ddrio/ddrio_in_tb.vhdl rename to tb/io/ddrio/ddrio_In_tb.vhdl index 624a4951e..f80862c25 100644 --- a/tb/io/ddrio/ddrio_in_tb.vhdl +++ b/tb/io/ddrio/ddrio_In_tb.vhdl @@ -3,9 +3,9 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================ --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Testbench: for component ddrio_in +-- Testbench: for component ddrio_In -- -- Description: -- ------------------------------------ @@ -14,13 +14,13 @@ -- License: -- ============================================================================ -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,35 +29,35 @@ -- limitations under the License. -- ============================================================================ -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library PoC; -use PoC.physical.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; -entity ddrio_in_tb is +entity ddrio_In_tb is end entity; -architecture sim of ddrio_in_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; +architecture sim of ddrio_In_tb is + constant CLOCK_FREQ : FREQ := 100 MHz; - -- component generics - constant BITS : positive := 2; - constant INIT_VALUE : bit_vector(1 downto 0) := "10"; + -- component generics + constant BITS : positive := 2; + constant INIT_VALUE : bit_vector(1 downto 0) := "10"; - -- component ports - signal Clock : std_logic := '1'; - signal ClockEnable : std_logic := '0'; - signal DataIn_high : std_logic_vector(BITS - 1 downto 0); - signal DataIn_low : std_logic_vector(BITS - 1 downto 0); - signal Pad : std_logic_vector(BITS - 1 downto 0); + -- component ports + signal Clock : std_logic := '1'; + signal ClockEnable : std_logic := '0'; + signal DataIn_high : std_logic_vector(BITS - 1 downto 0); + signal DataIn_low : std_logic_vector(BITS - 1 downto 0); + signal Pad : std_logic_vector(BITS - 1 downto 0); -- delay from "Clock" input to outputs of DUT -- must be less than CLOCK_PERIOD @@ -69,31 +69,31 @@ begin -- generate global testbench clock simGenerateClock(Clock, CLOCK_FREQ); - -- component instantiation - DUT: entity poc.ddrio_in - generic map ( - BITS => BITS, - INIT_VALUE => INIT_VALUE) - port map ( - Clock => Clock, - ClockEnable => ClockEnable, - DataIn_high => DataIn_high, - DataIn_low => DataIn_low, - Pad => Pad); - - -- waveform generation - WaveGen_Proc: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); - variable ii : std_logic_vector(3 downto 0); - begin - -- simulate waiting for clock enable - wait until rising_edge(Clock); - wait until rising_edge(Clock); - - -- clock ready - ClockEnable <= '1'; + -- component instantiation + DUT: entity poc.ddrio_In + generic map ( + BITS => BITS, + INIT_VALUE => INIT_VALUE) + port map ( + Clock => Clock, + ClockEnable => ClockEnable, + DataIn_high => DataIn_high, + DataIn_low => DataIn_low, + Pad => Pad); + + -- waveform generation + WaveGen_Proc: process + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); + variable ii : std_logic_vector(3 downto 0); + begin + -- simulate waiting for clock enable + wait until rising_edge(Clock); + wait until rising_edge(Clock); + + -- clock ready + ClockEnable <= '1'; for i in 0 to 15 loop - ii := std_logic_vector(to_unsigned(i, 4)); + ii := std_logic_vector(to_unsigned(i, 4)); -- input LSB first Pad <= ii(1 downto 0); -- bit 0 and 1 with falling edge wait until falling_edge(Clock); @@ -105,12 +105,12 @@ begin -- This process is finished simDeactivateProcess(simProcessID); wait; -- forever - end process WaveGen_Proc; + end process WaveGen_Proc; -- checkout output while reading from PAD WaveCheck_Proc: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); - variable ii : std_logic_vector(3 downto 0); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); + variable ii : std_logic_vector(3 downto 0); begin wait for OUTPUT_DELAY; simAssertion((DataIn_high = to_stdlogicvector(INIT_VALUE)), "Wrong initial DataIn_high"); @@ -121,7 +121,7 @@ begin for i in 0 to 15 loop -- precondition: simulation is at a rising_edge(Clock) - ii := std_logic_vector(to_unsigned(i, 4)); + ii := std_logic_vector(to_unsigned(i, 4)); wait for OUTPUT_DELAY; simAssertion((DataIn_high = ii(3 downto 2)), "Wrong DataIn_high"); simAssertion((DataIn_low = ii(1 downto 0)), "Wrong DataIn_low"); diff --git a/tb/io/ddrio/ddrio_out_tb.vhdl b/tb/io/ddrio/ddrio_Out_tb.vhdl similarity index 54% rename from tb/io/ddrio/ddrio_out_tb.vhdl rename to tb/io/ddrio/ddrio_Out_tb.vhdl index 78d7bacfa..7ba99de8d 100644 --- a/tb/io/ddrio/ddrio_out_tb.vhdl +++ b/tb/io/ddrio/ddrio_Out_tb.vhdl @@ -3,9 +3,9 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================ --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Testbench: for component ddrio_out +-- Testbench: for component ddrio_Out -- -- Description: -- ------------------------------------ @@ -14,13 +14,13 @@ -- License: -- ============================================================================ -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,36 +29,36 @@ -- limitations under the License. -- ============================================================================ -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library poc; -use PoC.physical.all; -use poc.utils.all; +use PoC.physical.all; +use poc.utils.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; -entity ddrio_out_tb is +entity ddrio_Out_tb is end entity; -architecture sim of ddrio_out_tb is - -- component generics - constant NO_OUTPUT_ENABLE : boolean := false; - constant BITS : positive := 2; - constant INIT_VALUE : bit_vector(1 downto 0) := "10"; +architecture sim of ddrio_Out_tb is + -- component generics + constant NO_OUTPUT_ENABLE : boolean := false; + constant BITS : positive := 2; + constant INIT_VALUE : bit_vector(1 downto 0) := "10"; - -- component ports - signal Clock : std_logic := '1'; - signal ClockEnable : std_logic := '0'; - signal OutputEnable : std_logic := '0'; - signal DataOut_high : std_logic_vector(BITS - 1 downto 0); - signal DataOut_low : std_logic_vector(BITS - 1 downto 0); - signal Pad : std_logic_vector(BITS - 1 downto 0); + -- component ports + signal Clock : std_logic := '1'; + signal ClockEnable : std_logic := '0'; + signal OutputEnable : std_logic := '0'; + signal DataOut_high : std_logic_vector(BITS - 1 downto 0); + signal DataOut_low : std_logic_vector(BITS - 1 downto 0); + signal Pad : std_logic_vector(BITS - 1 downto 0); -- period of signal "Clock" constant CLOCK_PERIOD : time := 10 ns; @@ -73,64 +73,64 @@ begin -- generate global testbench clock simGenerateClock(Clock, CLOCK_PERIOD); - -- component instantiation - DUT: entity poc.ddrio_out - generic map ( - NO_OUTPUT_ENABLE => NO_OUTPUT_ENABLE, - BITS => BITS, - INIT_VALUE => INIT_VALUE + -- component instantiation + DUT: entity poc.ddrio_Out + generic map ( + NO_OUTPUT_ENABLE => NO_OUTPUT_ENABLE, + BITS => BITS, + INIT_VALUE => INIT_VALUE ) - port map ( - Clock => Clock, - ClockEnable => ClockEnable, - OutputEnable => OutputEnable, - DataOut_high => DataOut_high, - DataOut_low => DataOut_low, - Pad => Pad + port map ( + Clock => Clock, + ClockEnable => ClockEnable, + OutputEnable => OutputEnable, + DataOut_high => DataOut_high, + DataOut_low => DataOut_low, + Pad => Pad ); - -- waveform generation - WaveGen_Proc: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); - variable ii : std_logic_vector(3 downto 0); - begin - -- simulate waiting for clock enable - wait until rising_edge(Clock); - wait until rising_edge(Clock); + -- waveform generation + WaveGen_Proc: process + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); + variable ii : std_logic_vector(3 downto 0); + begin + -- simulate waiting for clock enable + wait until rising_edge(Clock); + wait until rising_edge(Clock); - -- clock ready, no output yet - ClockEnable <= '1'; + -- clock ready, no output yet + ClockEnable <= '1'; if NO_OUTPUT_ENABLE then - DataOut_high <= to_stdlogicvector(not INIT_VALUE); - DataOut_low <= to_stdlogicvector(not INIT_VALUE); + DataOut_high <= to_stdlogicvector(not INIT_VALUE); + DataOut_low <= to_stdlogicvector(not INIT_VALUE); end if; - wait until rising_edge(Clock); - wait until rising_edge(Clock); - - -- output some data - OutputEnable <= '1'; - for i in 0 to 15 loop - ii := std_logic_vector(to_unsigned(i, 4)); - -- output LSB first - DataOut_high <= ii(1 downto 0); -- bit 0 and 1 with rising edge - DataOut_low <= ii(3 downto 2); -- bit 2 and 3 with falling edge - wait until rising_edge(Clock); - end loop; - - -- disable output again - OutputEnable <= '0'; - wait until rising_edge(Clock); - - -- This process is finished + wait until rising_edge(Clock); + wait until rising_edge(Clock); + + -- output some data + OutputEnable <= '1'; + for i in 0 to 15 loop + ii := std_logic_vector(to_unsigned(i, 4)); + -- output LSB first + DataOut_high <= ii(1 downto 0); -- bit 0 and 1 with rising edge + DataOut_low <= ii(3 downto 2); -- bit 2 and 3 with falling edge + wait until rising_edge(Clock); + end loop; + + -- disable output again + OutputEnable <= '0'; + wait until rising_edge(Clock); + + -- This process is finished simDeactivateProcess(simProcessID); wait; -- forever - end process WaveGen_Proc; + end process WaveGen_Proc; -- checkout output while reading from PAD WaveCheck_Proc: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); - variable ii : std_logic_vector(3 downto 0); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); + variable ii : std_logic_vector(3 downto 0); begin -- check output of initial value after startup wait for OUTPUT_DELAY; @@ -156,10 +156,10 @@ begin for i in 0 to 15 loop -- precondition: simulation is at a rising_edge(ClockIn) - ii := std_logic_vector(to_unsigned(i, 4)); + ii := std_logic_vector(to_unsigned(i, 4)); wait for OUTPUT_DELAY; simAssertion((Pad = ii(1 downto 0)), "Wrong Pad during clock high"); - wait until falling_edge(Clock); + wait until falling_edge(Clock); wait for OUTPUT_DELAY; simAssertion((Pad = ii(3 downto 2)), "Wrong Pad during clock low"); wait until rising_edge(Clock); diff --git a/tb/io/io_Debounce_tb.vhdl b/tb/io/io_Debounce_tb.vhdl index f44d49a2e..d37aaf18c 100644 --- a/tb/io/io_Debounce_tb.vhdl +++ b/tb/io/io_Debounce_tb.vhdl @@ -3,25 +3,25 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Testbench: Debouncer. +-- Testbench: Debouncer. -- -- Description: -- ------------------------------------ --- Automated testbench for 'PoC.io_Debounce'. --- TODO +-- Automated testbench for 'PoC.io_Debounce'. +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -31,18 +31,18 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library PoC; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.strings.all; -use PoC.physical.all; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.strings.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; entity io_Debounce_tb is @@ -50,19 +50,19 @@ end entity; architecture tb of io_Debounce_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; + constant CLOCK_FREQ : FREQ := 100 MHz; -- simulation signals - signal SimStop : std_logic := '0'; - signal Clock : std_logic := '1'; + signal SimStop : std_logic := '0'; + signal Clock : std_logic := '1'; - signal EventCounter : natural := 0; + signal EventCounter : natural := 0; -- unit Under Test (UUT) configuration - constant BOUNCE_TIME : T_TIME := 50.0e-9; + constant BOUNCE_TIME : T_TIME := 50.0e-9; - signal RawInput : std_logic := '0'; - signal deb_out : std_logic; + signal RawInput : std_logic := '0'; + signal deb_out : std_logic; begin -- initialize global simulation status @@ -72,42 +72,42 @@ begin procGenerator : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); begin wait for 5 ns; - RawInput <= '0'; + RawInput <= '0'; wait for 200 ns; - RawInput <= '1'; + RawInput <= '1'; wait for 200 ns; - RawInput <= '0'; + RawInput <= '0'; wait for 20 ns; - RawInput <= '1'; + RawInput <= '1'; wait for 20 ns; - RawInput <= '0'; + RawInput <= '0'; wait for 200 ns; - RawInput <= '1'; + RawInput <= '1'; wait for 20 ns; - RawInput <= '0'; + RawInput <= '0'; wait for 200 ns; - RawInput <= '1'; + RawInput <= '1'; wait for 100 ns; - RawInput <= '0'; + RawInput <= '0'; wait for 235 ns; -- shut down simulation - RawInput <= '0'; + RawInput <= '0'; -- final assertion - simAssertion((EventCounter = 6), "Events counted=" & integer'image(EventCounter) & " Expected=6"); + simAssertion((EventCounter = 6), "Events counted=" & integer'image(EventCounter) & " Expected=6"); -- This process is finished simDeactivateProcess(simProcessID); @@ -124,16 +124,16 @@ begin UUT : entity PoC.io_Debounce generic map ( - CLOCK_FREQ => CLOCK_FREQ, - BOUNCE_TIME => BOUNCE_TIME, - BITS => 1, - ADD_INPUT_SYNCHRONIZERS => TRUE, - COMMON_LOCK => FALSE + CLOCK_FREQ => CLOCK_FREQ, + BOUNCE_TIME => BOUNCE_TIME, + BITS => 1, + ADD_INPUT_SYNCHRONIZERS => TRUE, + COMMON_LOCK => FALSE ) port map ( - Clock => Clock, - Reset => '0', - Input(0) => RawInput, - Output(0) => deb_out + Clock => Clock, + Reset => '0', + Input(0) => RawInput, + Output(0) => deb_out ); end architecture; diff --git a/tb/io/uart/uart_rx_tb.vhdl b/tb/io/uart/uart_RX_tb.vhdl similarity index 57% rename from tb/io/uart/uart_rx_tb.vhdl rename to tb/io/uart/uart_RX_tb.vhdl index d934554a5..944133881 100644 --- a/tb/io/uart/uart_rx_tb.vhdl +++ b/tb/io/uart/uart_RX_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================ --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Testbench: For PoC.io.uart.rx +-- Testbench: For PoC.io.uart.rx -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================ -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,48 +29,48 @@ -- limitations under the License. -- ============================================================================ -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library PoC; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.strings.all; -use PoC.physical.all; -use PoC.uart.all; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.strings.all; +use PoC.physical.all; +use PoC.uart.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; -entity uart_rx_tb is +entity uart_RX_tb is end entity; -architecture tb of uart_rx_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; - constant BAUDRATE : BAUD := 2.1 MBd; +architecture tb of uart_RX_tb is + constant CLOCK_FREQ : FREQ := 100 MHz; + constant BAUDRATE : BAUD := 2.1 MBd; - signal Clock : std_logic; - signal Reset : std_logic; + signal Clock : std_logic; + signal Reset : std_logic; - signal BitClock : std_logic; - signal BitClock_x8 : std_logic; + signal BitClock : std_logic; + signal BitClock_x8 : std_logic; - signal UART_RX : std_logic; + signal UART_RX : std_logic; - signal RX_Strobe : std_logic; - signal RX_Data : T_SLV_8; + signal RX_Strobe : std_logic; + signal RX_Data : T_SLV_8; function simGenerateWaveform_UART_Word(Data : T_SLV_8; Baudrate : BAUD := 115.200 kBd) return T_SIM_WAVEFORM_SL is - constant BIT_TIME : time := to_time(to_freq(Baudrate)); - variable Result : T_SIM_WAVEFORM_SL(0 to 9) := (others => (Delay => BIT_TIME, Value => '-')); + constant BIT_TIME : time := to_time(to_freq(Baudrate)); + variable Result : T_SIM_WAVEFORM_SL(0 to 9) := (others => (Delay => BIT_TIME, Value => '-')); begin Result(0).Value := '0'; for i in Data'range loop - Result(i + 1).Value := Data(i); + Result(i + 1).Value := Data(i); end loop; Result(9).Value := '1'; return Result; @@ -80,42 +80,42 @@ architecture tb of uart_rx_tb is variable Result : T_SIM_WAVEFORM_SL(0 to (Data'length * 10) - 1); begin for i in Data'range loop - Result(i * 10 to ((i + 1) * 10) - 1) := simGenerateWaveform_UART_Word(Data(i), Baudrate); + Result(i * 10 to ((i + 1) * 10) - 1) := simGenerateWaveform_UART_Word(Data(i), Baudrate); end loop; return Result; end function; - constant DATA_STREAM : T_SLVV_8 := (x"12", x"45", x"FE", x"C4", x"02"); + constant DATA_STREAM : T_SLVV_8 := (x"12", x"45", x"FE", x"C4", x"02"); begin simGenerateClock(Clock, CLOCK_FREQ); simGenerateWaveform(Reset, simGenerateWaveform_Reset(Pause => 50 ns)); simGenerateWaveform(UART_RX, simGenerateWaveform_UART_Stream(DATA_STREAM, BAUDRATE), '1'); - bclk : entity PoC.uart_bclk + bclk : entity PoC.uart_BitClock generic map ( - CLOCK_FREQ => CLOCK_FREQ, - BAUDRATE => BAUDRATE + CLOCK_FREQ => CLOCK_FREQ, + BAUDRATE => BAUDRATE ) port map ( - clk => Clock, - rst => Reset, - bclk => BitClock, - bclk_x8 => BitClock_x8 + clk => Clock, + rst => Reset, + bclk => BitClock, + bclk_x8 => BitClock_x8 ); - RX : entity PoC.uart_rx + RX : entity PoC.uart_RX port map ( - clk => Clock, - rst => Reset, - bclk_x8 => BitClock_x8, - rx => UART_RX, - do => RX_Data, - stb => RX_Strobe + clk => Clock, + rst => Reset, + bclk_x8 => BitClock_x8, + rx => UART_RX, + do => RX_Data, + stb => RX_Strobe ); procChecker : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); begin for i in DATA_STREAM'range loop wait until rising_edge(Clock) and (RX_Strobe = '1'); diff --git a/tb/mem/lut/lut_Sine_tb.vhdl b/tb/mem/lut/lut_Sine_tb.vhdl index bec2dc68b..4f3f6837b 100644 --- a/tb/mem/lut/lut_Sine_tb.vhdl +++ b/tb/mem/lut/lut_Sine_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Testbench: testbench for sine wave LUT +-- Testbench: testbench for sine wave LUT -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,17 +30,17 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library PoC; -use PoC.utils.all; -use PoC.strings.all; -use PoC.physical.all; +use PoC.utils.all; +use PoC.strings.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; entity lut_Sine_tb is @@ -48,20 +48,20 @@ end entity; architecture test of lut_Sine_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; + constant CLOCK_FREQ : FREQ := 100 MHz; - signal Clock : std_logic := '1'; - signal sim_Stop : std_logic := '0'; + signal Clock : std_logic := '1'; + signal sim_Stop : std_logic := '0'; - signal lut_in : std_logic_vector(7 downto 0) := (others => '0'); - signal lut_Q1_in : std_logic_vector(7 downto 0); - signal lut_Q1_out : std_logic_vector(7 downto 0); - signal lut_Q2_in : std_logic_vector(7 downto 0); - signal lut_Q2_out : std_logic_vector(7 downto 0); - signal lut_Q3_in : std_logic_vector(7 downto 0); - signal lut_Q3_out : std_logic_vector(7 downto 0); - signal lut_Q4_in : std_logic_vector(7 downto 0); - signal lut_Q4_out : std_logic_vector(7 downto 0); + signal lut_in : std_logic_vector(7 downto 0) := (others => '0'); + signal lut_Q1_in : std_logic_vector(7 downto 0); + signal lut_Q1_out : std_logic_vector(7 downto 0); + signal lut_Q2_in : std_logic_vector(7 downto 0); + signal lut_Q2_out : std_logic_vector(7 downto 0); + signal lut_Q3_in : std_logic_vector(7 downto 0); + signal lut_Q3_out : std_logic_vector(7 downto 0); + signal lut_Q4_in : std_logic_vector(7 downto 0); + signal lut_Q4_out : std_logic_vector(7 downto 0); begin -- initialize global simulation status @@ -71,12 +71,12 @@ begin procGenerator : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); begin simWaitUntilRisingEdge(Clock, 4); for i in 0 to 1023 loop - lut_in <= to_slv(i mod 2**lut_in'length, lut_in'length); + lut_in <= to_slv(i mod 2**lut_in'length, lut_in'length); wait until rising_edge(Clock); end loop; @@ -87,64 +87,64 @@ begin wait; -- forever end process; - lut_Q1_in <= lut_in; - lut_Q2_in <= lut_in; - lut_Q3_in <= lut_in; - lut_Q4_in <= lut_in; + lut_Q1_in <= lut_in; + lut_Q2_in <= lut_in; + lut_Q3_in <= lut_in; + lut_Q4_in <= lut_in; lutQ1 : entity PoC.lut_Sine generic map ( - REG_OUTPUT => TRUE, - MAX_AMPLITUDE => 127, - POINTS => 256, - OFFSET_DEG => 0.0, - QUARTERS => 1 + REG_OUTPUT => TRUE, + MAX_AMPLITUDE => 127, + POINTS => 256, + OFFSET_DEG => 0.0, + QUARTERS => 1 ) port map ( - Clock => Clock, -- - Input => lut_Q1_in, -- - Output => lut_Q1_out -- + Clock => Clock, -- + Input => lut_Q1_in, -- + Output => lut_Q1_out -- ); lutQ2 : entity PoC.lut_Sine generic map ( - REG_OUTPUT => TRUE, - MAX_AMPLITUDE => 127, - POINTS => 256, - OFFSET_DEG => 0.0, - QUARTERS => 2 + REG_OUTPUT => TRUE, + MAX_AMPLITUDE => 127, + POINTS => 256, + OFFSET_DEG => 0.0, + QUARTERS => 2 ) port map ( - Clock => Clock, -- - Input => lut_Q2_in, -- - Output => lut_Q2_out -- + Clock => Clock, -- + Input => lut_Q2_in, -- + Output => lut_Q2_out -- ); lutQ3 : entity PoC.lut_Sine generic map ( - REG_OUTPUT => TRUE, - MAX_AMPLITUDE => 127, - POINTS => 256, - OFFSET_DEG => 0.0, - QUARTERS => 4 + REG_OUTPUT => TRUE, + MAX_AMPLITUDE => 127, + POINTS => 256, + OFFSET_DEG => 0.0, + QUARTERS => 4 ) port map ( - Clock => Clock, -- - Input => lut_Q3_in, -- - Output => lut_Q3_out -- + Clock => Clock, -- + Input => lut_Q3_in, -- + Output => lut_Q3_out -- ); lutQ4 : entity PoC.lut_Sine generic map ( - REG_OUTPUT => TRUE, - MAX_AMPLITUDE => 127, - POINTS => 256, - OFFSET_DEG => 45.0, - QUARTERS => 4 + REG_OUTPUT => TRUE, + MAX_AMPLITUDE => 127, + POINTS => 256, + OFFSET_DEG => 45.0, + QUARTERS => 4 ) port map ( - Clock => Clock, -- - Input => lut_Q4_in, -- - Output => lut_Q4_out -- + Clock => Clock, -- + Input => lut_Q4_in, -- + Output => lut_Q4_out -- ); end architecture; diff --git a/tb/mem/mem_model.vhdl b/tb/mem/mem_model.vhdl index 2e2ea489c..e4588451f 100644 --- a/tb/mem/mem_model.vhdl +++ b/tb/mem/mem_model.vhdl @@ -3,9 +3,9 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================ --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Module: Model of pipelined memory with PoC.Mem interface. +-- Module: Model of pipelined memory with PoC.Mem interface. -- -- Description: -- ------------------------------------ @@ -24,13 +24,13 @@ -- License: -- ============================================================================ -- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair for VLSI-Design, Diagnostics and Architecture +-- Chair for VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -60,30 +60,30 @@ -- tristate internal signal "*_z" ------------------------------------------------------------------------------- -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; entity mem_model is - generic ( - A_BITS : positive; - D_BITS : positive; + generic ( + A_BITS : positive; + D_BITS : positive; LATENCY : positive := 1 - ); + ); - port ( - clk : in std_logic; - rst : in std_logic; + port ( + clk : in std_logic; + rst : in std_logic; - mem_req : in std_logic; - mem_write : in std_logic; - mem_addr : in unsigned(A_BITS-1 downto 0); - mem_wdata : in std_logic_vector(D_BITS-1 downto 0); - mem_wmask : in std_logic_vector(D_BITS/8-1 downto 0) := (others => '0'); - mem_rdy : out std_logic; - mem_rstb : out std_logic; - mem_rdata : out std_logic_vector(D_BITS-1 downto 0)); + mem_req : in std_logic; + mem_write : in std_logic; + mem_addr : in unsigned(A_BITS-1 downto 0); + mem_wdata : in std_logic_vector(D_BITS-1 downto 0); + mem_wmask : in std_logic_vector(D_BITS/8-1 downto 0) := (others => '0'); + mem_rdy : out std_logic; + mem_rstb : out std_logic; + mem_rdata : out std_logic_vector(D_BITS-1 downto 0)); end entity mem_model; @@ -187,7 +187,7 @@ begin -- architecture sim -- reset only read strobe case to_x01(rst) is - when '1' => rstb_p <= (others => '0'); + when '1' => rstb_p <= (others => '0'); when '0' => null; when 'X' => rstb_p <= (others => 'X'); end case; @@ -201,6 +201,6 @@ begin -- architecture sim '0' when others; mem_rdata <= rdata_p(LATENCY); - mem_rstb <= rstb_p (LATENCY); + mem_rstb <= rstb_p (LATENCY); end architecture sim; diff --git a/tb/mem/ocram/ocram_esdp_tb.vhdl b/tb/mem/ocram/ocram_EnhancedSimpleDualPort_tb.vhdl similarity index 74% rename from tb/mem/ocram/ocram_esdp_tb.vhdl rename to tb/mem/ocram/ocram_EnhancedSimpleDualPort_tb.vhdl index 04f6cbe69..0fc79ce49 100644 --- a/tb/mem/ocram/ocram_esdp_tb.vhdl +++ b/tb/mem/ocram/ocram_EnhancedSimpleDualPort_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Testbench: On-Chip-RAM: Enhanced Simple-Dual-Port (ESDP). +-- Testbench: On-Chip-RAM: Enhanced Simple-Dual-Port (ESDP). -- -- Description: -- ------------------------------------ --- Automated testbench for PoC.mem.ocram.esdp +-- Automated testbench for PoC.mem.ocram.esdp -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,35 +29,35 @@ -- limitations under the License. -- ============================================================================= -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library PoC; -use PoC.utils.all; -use PoC.physical.all; +use PoC.utils.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; -entity ocram_esdp_tb is +entity ocram_EnhancedSimpleDualPort_tb is end entity; -architecture tb of ocram_esdp_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; +architecture tb of ocram_EnhancedSimpleDualPort_tb is + constant CLOCK_FREQ : FREQ := 100 MHz; - -- component generics - -- Set to values used for synthesis when simulating a netlist. - constant A_BITS : positive := 8; - constant D_BITS : positive := 16; + -- component generics + -- Set to values used for synthesis when simulating a netlist. + constant A_BITS : positive := 8; + constant D_BITS : positive := 16; -- test configurations - type T_TEST_CONFIG is record - phase1 : T_PHASE; -- phase of clk1 - phase2 : T_PHASE; -- phase of clk2 - end record; + type T_TEST_CONFIG is record + phase1 : T_PHASE; -- phase of clk1 + phase2 : T_PHASE; -- phase of clk2 + end record; type T_TEST_CONFIG_VEC is array (natural range<>) of T_TEST_CONFIG; @@ -79,16 +79,16 @@ begin " Phase2="&integer'image(CLOCK2_PHASE / 1 deg)); -- component ports - signal clk1 : std_logic; - signal clk2 : std_logic; - signal ce1 : std_logic; - signal ce2 : std_logic; - signal we1 : std_logic; - signal a1 : unsigned(A_BITS-1 downto 0); - signal a2 : unsigned(A_BITS-1 downto 0); - signal d1 : std_logic_vector(D_BITS-1 downto 0); - signal q1 : std_logic_vector(D_BITS-1 downto 0); - signal q2 : std_logic_vector(D_BITS-1 downto 0); + signal clk1 : std_logic; + signal clk2 : std_logic; + signal ce1 : std_logic; + signal ce2 : std_logic; + signal we1 : std_logic; + signal a1 : unsigned(A_BITS-1 downto 0); + signal a2 : unsigned(A_BITS-1 downto 0); + signal d1 : std_logic_vector(D_BITS-1 downto 0); + signal q1 : std_logic_vector(D_BITS-1 downto 0); + signal q2 : std_logic_vector(D_BITS-1 downto 0); -- Expected read data, assign together with read command -- Set to '-'es when result doesn't care. @@ -110,22 +110,22 @@ begin simGenerateClock(simTestID, clk2, CLOCK_FREQ, CLOCK2_PHASE); -- component instantiation - UUT: entity poc.ocram_esdp + UUT: entity poc.ocram_EnhancedSimpleDualPort generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, + A_BITS => A_BITS, + D_BITS => D_BITS, FILENAME => "") port map ( clk1 => clk1, clk2 => clk2, - ce1 => ce1, - ce2 => ce2, - we1 => we1, - a1 => a1, - a2 => a2, - d1 => d1, - q1 => q1, - q2 => q2); + ce1 => ce1, + ce2 => ce2, + we1 => we1, + a1 => a1, + a2 => a2, + d1 => d1, + q1 => q1, + q2 => q2); -- Input stimuli for Port 1 -- =========================================================================== @@ -144,18 +144,18 @@ begin ------------------------------------------------------------------------- for i in 0 to 7 loop simWaitUntilRisingEdge(clk1, 1); - ce1 <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce1 <= '1'; + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; simWaitUntilRisingEdge(clk1, 1); -- last read on port 2 here - ce1 <= '0'; - we1 <= '0'; - a1 <= (others => '-'); + ce1 <= '0'; + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); @@ -163,18 +163,18 @@ begin ------------------------------------------------------------------------- for i in 8 to 15 loop simWaitUntilRisingEdge(clk1, 1); - ce1 <= not ce1; -- write @ even addresses - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce1 <= not ce1; -- write @ even addresses + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; simWaitUntilRisingEdge(clk1, 1); -- last read on port 2 here - ce1 <= '0'; - we1 <= '0'; - a1 <= (others => '-'); + ce1 <= '0'; + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); @@ -183,27 +183,27 @@ begin ------------------------------------------------------------------------- simWaitUntilRisingEdge(clk1, 1); -- first read on port 2 here - ce1 <= '0'; - we1 <= '0'; - a1 <= (others => '-'); + ce1 <= '0'; + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); for i in 56 to 63 loop simWaitUntilRisingEdge(clk1, 1); - ce1 <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce1 <= '1'; + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; ------------------------------------------------------------------------- -- Finish simWaitUntilRisingEdge(clk1, 1); - ce1 <= '0'; + ce1 <= '0'; we1 <= '-'; - a1 <= (others => '-'); + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); @@ -228,14 +228,14 @@ begin ------------------------------------------------------------------------- simWaitUntilRisingEdge(clk2, 1); -- first write on port 1 here - ce2 <= '0'; - a2 <= (others => '-'); + ce2 <= '0'; + a2 <= (others => '-'); rd_d2 <= (others => '-'); for i in 0 to 7 loop simWaitUntilRisingEdge(clk2, 1); - ce2 <= '1'; - a2 <= to_unsigned(i, A_BITS); + ce2 <= '1'; + a2 <= to_unsigned(i, A_BITS); if CLOCK2_PHASE >= CLOCK1_PHASE then -- read succeeds either if clocks are in phase or read clock is -- behind write clock @@ -250,14 +250,14 @@ begin ------------------------------------------------------------------------- simWaitUntilRisingEdge(clk2, 1); -- first write on port 1 here - ce2 <= '0'; - a2 <= (others => '-'); + ce2 <= '0'; + a2 <= (others => '-'); rd_d2 <= (others => '-'); for i in 8 to 15 loop simWaitUntilRisingEdge(clk2, 1); - ce2 <= not ce2; - a2 <= to_unsigned(i, A_BITS); + ce2 <= not ce2; + a2 <= to_unsigned(i, A_BITS); if CLOCK2_PHASE >= CLOCK1_PHASE then -- read succeeds either if clocks are in phase or read clock is -- behind write clock @@ -273,8 +273,8 @@ begin ------------------------------------------------------------------------- for i in 56 to 63 loop simWaitUntilRisingEdge(clk2, 1); - ce2 <= '1'; - a2 <= to_unsigned(i, A_BITS); + ce2 <= '1'; + a2 <= to_unsigned(i, A_BITS); if CLOCK2_PHASE <= CLOCK1_PHASE then -- read succeeds if clocks are in phase or if read clock is before -- write clock @@ -287,15 +287,15 @@ begin simWaitUntilRisingEdge(clk2, 1); -- last write on port 1 here - ce2 <= '0'; - a2 <= (others => '-'); + ce2 <= '0'; + a2 <= (others => '-'); rd_d2 <= (others => '-'); ------------------------------------------------------------------------- -- Finish simWaitUntilRisingEdge(clk2, 1); - ce2 <= '0'; - a2 <= (others => '-'); + ce2 <= '0'; + a2 <= (others => '-'); rd_d2 <= (others => '-'); -- This process is finished @@ -314,7 +314,7 @@ begin exp_q2 <= rd_d2 when rising_edge(clk2) and ce2 = '1'; Checker1: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "TestID "&integer'image(simTestID)&", Checker1"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "TestID "&integer'image(simTestID)&", Checker1"); variable i : integer; begin while not finished1 loop @@ -329,7 +329,7 @@ begin end process Checker1; Checker2: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "TestID "&integer'image(simTestID)&", Checker2"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "TestID "&integer'image(simTestID)&", Checker2"); variable i : integer; begin while not finished2 loop diff --git a/tb/mem/ocram/ocram_sdp_tb.vhdl b/tb/mem/ocram/ocram_SimpleDualPort_tb.vhdl similarity index 74% rename from tb/mem/ocram/ocram_sdp_tb.vhdl rename to tb/mem/ocram/ocram_SimpleDualPort_tb.vhdl index 5203bdf20..6aa11c6fa 100644 --- a/tb/mem/ocram/ocram_sdp_tb.vhdl +++ b/tb/mem/ocram/ocram_SimpleDualPort_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Testbench: On-Chip-RAM: Simple-Dual-Port (SDP). +-- Testbench: On-Chip-RAM: Simple-Dual-Port (SDP). -- -- Description: -- ------------------------------------ --- Automated testbench for PoC.mem.ocram.sdp +-- Automated testbench for PoC.mem.ocram.sdp -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,35 +29,35 @@ -- limitations under the License. -- ============================================================================= -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library PoC; -use PoC.utils.all; -use PoC.physical.all; +use PoC.utils.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; -entity ocram_sdp_tb is +entity ocram_SimpleDualPort_tb is end entity; -architecture tb of ocram_sdp_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; +architecture tb of ocram_SimpleDualPort_tb is + constant CLOCK_FREQ : FREQ := 100 MHz; - -- component generics - -- Set to values used for synthesis when simulating a netlist. - constant A_BITS : positive := 8; - constant D_BITS : positive := 16; + -- component generics + -- Set to values used for synthesis when simulating a netlist. + constant A_BITS : positive := 8; + constant D_BITS : positive := 16; -- test configurations - type T_TEST_CONFIG is record - phase1 : T_PHASE; -- phase of clk1 - phase2 : T_PHASE; -- phase of clk2 - end record; + type T_TEST_CONFIG is record + phase1 : T_PHASE; -- phase of clk1 + phase2 : T_PHASE; -- phase of clk2 + end record; type T_TEST_CONFIG_VEC is array (natural range<>) of T_TEST_CONFIG; @@ -79,15 +79,15 @@ begin " Phase2="&integer'image(CLOCK2_PHASE / 1 deg)); -- component ports - signal clk1 : std_logic; - signal clk2 : std_logic; - signal ce1 : std_logic; - signal ce2 : std_logic; - signal we1 : std_logic; - signal a1 : unsigned(A_BITS-1 downto 0); - signal a2 : unsigned(A_BITS-1 downto 0); - signal d1 : std_logic_vector(D_BITS-1 downto 0); - signal q2 : std_logic_vector(D_BITS-1 downto 0); + signal clk1 : std_logic; + signal clk2 : std_logic; + signal ce1 : std_logic; + signal ce2 : std_logic; + signal we1 : std_logic; + signal a1 : unsigned(A_BITS-1 downto 0); + signal a2 : unsigned(A_BITS-1 downto 0); + signal d1 : std_logic_vector(D_BITS-1 downto 0); + signal q2 : std_logic_vector(D_BITS-1 downto 0); -- Expected read data, assign together with read command -- Set to '-'es when result doesn't care. @@ -107,21 +107,21 @@ begin simGenerateClock(simTestID, clk2, CLOCK_FREQ, CLOCK2_PHASE); -- component instantiation - UUT: entity poc.ocram_sdp + UUT: entity poc.ocram_SimpleDualPort generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, + A_BITS => A_BITS, + D_BITS => D_BITS, FILENAME => "") port map ( wclk => clk1, rclk => clk2, - wce => ce1, - rce => ce2, - we => we1, - wa => a1, - ra => a2, - d => d1, - q => q2); + wce => ce1, + rce => ce2, + we => we1, + wa => a1, + ra => a2, + d => d1, + q => q2); -- Input stimuli for Port 1 (Write) -- =========================================================================== @@ -139,34 +139,34 @@ begin ------------------------------------------------------------------------- for i in 0 to 7 loop simWaitUntilRisingEdge(clk1, 1); - ce1 <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce1 <= '1'; + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; simWaitUntilRisingEdge(clk1, 1); -- last read on port 2 here - ce1 <= '0'; - we1 <= '0'; - a1 <= (others => '-'); + ce1 <= '0'; + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); -- Alternating write on port 1 / read on port 2 ------------------------------------------------------------------------- for i in 8 to 15 loop simWaitUntilRisingEdge(clk1, 1); - ce1 <= not ce1; -- write @ even addresses - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce1 <= not ce1; -- write @ even addresses + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; simWaitUntilRisingEdge(clk1, 1); -- last read on port 2 here - ce1 <= '0'; - we1 <= '0'; - a1 <= (others => '-'); + ce1 <= '0'; + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); -- Read in 8 consecutive clock cycles on port 2, write one cycle later on @@ -174,25 +174,25 @@ begin ------------------------------------------------------------------------- simWaitUntilRisingEdge(clk1, 1); -- first read on port 2 here - ce1 <= '0'; - we1 <= '0'; - a1 <= (others => '-'); + ce1 <= '0'; + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); for i in 56 to 63 loop simWaitUntilRisingEdge(clk1, 1); - ce1 <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce1 <= '1'; + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; ------------------------------------------------------------------------- -- Finish simWaitUntilRisingEdge(clk1, 1); - ce1 <= '0'; + ce1 <= '0'; we1 <= '-'; - a1 <= (others => '-'); + a1 <= (others => '-'); d1 <= (others => '-'); -- This process is finished @@ -216,14 +216,14 @@ begin ------------------------------------------------------------------------- simWaitUntilRisingEdge(clk2, 1); -- first write on port 1 here - ce2 <= '0'; - a2 <= (others => '-'); + ce2 <= '0'; + a2 <= (others => '-'); rd_d2 <= (others => '-'); for i in 0 to 7 loop simWaitUntilRisingEdge(clk2, 1); - ce2 <= '1'; - a2 <= to_unsigned(i, A_BITS); + ce2 <= '1'; + a2 <= to_unsigned(i, A_BITS); if CLOCK2_PHASE >= CLOCK1_PHASE then -- read succeeds either if clocks are in phase or read clock is -- behind write clock @@ -238,14 +238,14 @@ begin ------------------------------------------------------------------------- simWaitUntilRisingEdge(clk2, 1); -- first write on port 1 here - ce2 <= '0'; - a2 <= (others => '-'); + ce2 <= '0'; + a2 <= (others => '-'); rd_d2 <= (others => '-'); for i in 8 to 15 loop simWaitUntilRisingEdge(clk2, 1); - ce2 <= not ce2; - a2 <= to_unsigned(i, A_BITS); + ce2 <= not ce2; + a2 <= to_unsigned(i, A_BITS); if CLOCK2_PHASE >= CLOCK1_PHASE then -- read succeeds either if clocks are in phase or read clock is -- behind write clock @@ -261,8 +261,8 @@ begin ------------------------------------------------------------------------- for i in 56 to 63 loop simWaitUntilRisingEdge(clk2, 1); - ce2 <= '1'; - a2 <= to_unsigned(i, A_BITS); + ce2 <= '1'; + a2 <= to_unsigned(i, A_BITS); if CLOCK2_PHASE <= CLOCK1_PHASE then -- read succeeds if clocks are in phase or if read clock is before -- write clock @@ -275,15 +275,15 @@ begin simWaitUntilRisingEdge(clk2, 1); -- last write on port 1 here - ce2 <= '0'; - a2 <= (others => '-'); + ce2 <= '0'; + a2 <= (others => '-'); rd_d2 <= (others => '-'); ------------------------------------------------------------------------- -- Finish simWaitUntilRisingEdge(clk2, 1); - ce2 <= '0'; - a2 <= (others => '-'); + ce2 <= '0'; + a2 <= (others => '-'); rd_d2 <= (others => '-'); -- This process is finished @@ -299,7 +299,7 @@ begin exp_q2 <= rd_d2 when rising_edge(clk2) and ce2 = '1'; Checker2: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "TestID "&integer'image(simTestID)&", Checker2"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "TestID "&integer'image(simTestID)&", Checker2"); variable i : integer; begin while not finished2 loop diff --git a/tb/mem/ocram/ocram_sdp_wf_tb.vhdl b/tb/mem/ocram/ocram_SimpleDualPort_wf_tb.vhdl similarity index 78% rename from tb/mem/ocram/ocram_sdp_wf_tb.vhdl rename to tb/mem/ocram/ocram_SimpleDualPort_wf_tb.vhdl index 4744c3c1e..e7ca4535e 100644 --- a/tb/mem/ocram/ocram_sdp_wf_tb.vhdl +++ b/tb/mem/ocram/ocram_SimpleDualPort_wf_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Testbench: On-Chip-RAM: Simple-Dual-Port (SDP) with write-first. +-- Testbench: On-Chip-RAM: Simple-Dual-Port (SDP) with write-first. -- -- Description: -- ------------------------------------ --- Automated testbench for PoC.mem.ocram.sdp_wf +-- Automated testbench for PoC.mem.ocram.sdp_wf -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair for VLSI-Design, Diagnostics and Architecture +-- Chair for VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,29 +29,29 @@ -- limitations under the License. -- ============================================================================= -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library PoC; -use PoC.utils.all; -use PoC.physical.all; +use PoC.utils.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; -entity ocram_sdp_wf_tb is +entity ocram_SimpleDualPort_wf_tb is end entity; -architecture tb of ocram_sdp_wf_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; +architecture tb of ocram_SimpleDualPort_wf_tb is + constant CLOCK_FREQ : FREQ := 100 MHz; - -- component generics - -- Set to values used for synthesis when simulating a netlist. - constant A_BITS : positive := 8; - constant D_BITS : positive := 16; + -- component generics + -- Set to values used for synthesis when simulating a netlist. + constant A_BITS : positive := 8; + constant D_BITS : positive := 16; -- component ports signal clk : std_logic; @@ -81,10 +81,10 @@ begin simGenerateClock(clk, CLOCK_FREQ); -- component instantiation - UUT: entity poc.ocram_sdp_wf + UUT: entity poc.ocram_SimpleDualPort_wf generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, + A_BITS => A_BITS, + D_BITS => D_BITS, FILENAME => "") port map ( clk => clk, @@ -115,16 +115,16 @@ begin for i in 0 to 7 loop simWaitUntilRisingEdge(clk, 1); ce <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; simWaitUntilRisingEdge(clk, 1); -- last read on port 2 here ce <= '1'; - we1 <= '0'; - a1 <= (others => '-'); + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); -- Alternating write on port 1 / read on port 2 @@ -132,16 +132,16 @@ begin for i in 8 to 15 loop simWaitUntilRisingEdge(clk, 1); ce <= '1'; - we1 <= not we1; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + we1 <= not we1; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; simWaitUntilRisingEdge(clk, 1); -- last read on port 2 here ce <= '1'; - we1 <= '0'; - a1 <= (others => '-'); + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); -- Read in 8 consecutive clock cycles on port 2, write one cycle later on @@ -150,16 +150,16 @@ begin simWaitUntilRisingEdge(clk, 1); -- first read on port 2 here ce <= '1'; - we1 <= '0'; - a1 <= (others => '-'); + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); for i in 16 to 23 loop simWaitUntilRisingEdge(clk, 1); ce <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; -- Read and write in 8 consecutive clock cycles at the same address @@ -167,9 +167,9 @@ begin for i in 64 to 71 loop simWaitUntilRisingEdge(clk, 1); ce <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; -- Read and write 8 times at the same address every second clock cycle @@ -177,9 +177,9 @@ begin for i in 72 to 87 loop simWaitUntilRisingEdge(clk, 1); ce <= not ce; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; ------------------------------------------------------------------------- @@ -187,7 +187,7 @@ begin simWaitUntilRisingEdge(clk, 1); ce <= '0'; we1 <= '-'; - a1 <= (others => '-'); + a1 <= (others => '-'); d1 <= (others => '-'); -- This process is finished @@ -211,12 +211,12 @@ begin ------------------------------------------------------------------------- simWaitUntilRisingEdge(clk, 1); -- first write on port 1 here - a2 <= (others => '-'); + a2 <= (others => '-'); rd_d2 <= (others => '-'); for i in 0 to 7 loop simWaitUntilRisingEdge(clk, 1); - a2 <= to_unsigned(i, A_BITS); + a2 <= to_unsigned(i, A_BITS); rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; @@ -225,13 +225,13 @@ begin simWaitUntilRisingEdge(clk, 1); -- first write on port 1 here re2 := false; - a2 <= (others => '-'); + a2 <= (others => '-'); rd_d2 <= (others => '-'); for i in 8 to 15 loop simWaitUntilRisingEdge(clk, 1); re2 := not re2; -- only compare read result every second cycle - a2 <= to_unsigned(i, A_BITS); + a2 <= to_unsigned(i, A_BITS); if re2 then rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); else @@ -244,35 +244,35 @@ begin ------------------------------------------------------------------------- for i in 16 to 23 loop simWaitUntilRisingEdge(clk, 1); - a2 <= to_unsigned(i, A_BITS); + a2 <= to_unsigned(i, A_BITS); rd_d2 <= (others => 'U'); -- memory not yet initialized end loop; simWaitUntilRisingEdge(clk, 1); -- last write on port 1 here - a2 <= (others => '-'); + a2 <= (others => '-'); rd_d2 <= (others => '-'); -- Read and write in 8 consecutive clock cycles at the same address ------------------------------------------------------------------------- for i in 64 to 71 loop simWaitUntilRisingEdge(clk, 1); - a2 <= to_unsigned(i, A_BITS); - rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + a2 <= to_unsigned(i, A_BITS); + rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; -- Read and write 8 times at the same address every second clock cycle ------------------------------------------------------------------------- for i in 72 to 87 loop simWaitUntilRisingEdge(clk, 1); - a2 <= to_unsigned(i, A_BITS); - rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + a2 <= to_unsigned(i, A_BITS); + rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; ------------------------------------------------------------------------- -- Finish simWaitUntilRisingEdge(clk, 1); - a2 <= (others => '-'); + a2 <= (others => '-'); rd_d2 <= (others => '-'); -- This process is finished @@ -288,7 +288,7 @@ begin exp_q2 <= rd_d2 when rising_edge(clk) and ce = '1'; Checker2: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker2"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker2"); variable i : integer; begin while not finished2 loop diff --git a/tb/mem/ocram/ocram_sp_tb.vhdl b/tb/mem/ocram/ocram_SinglePort_tb.vhdl similarity index 80% rename from tb/mem/ocram/ocram_sp_tb.vhdl rename to tb/mem/ocram/ocram_SinglePort_tb.vhdl index c96b768b2..ca9395b20 100644 --- a/tb/mem/ocram/ocram_sp_tb.vhdl +++ b/tb/mem/ocram/ocram_SinglePort_tb.vhdl @@ -1,8 +1,8 @@ -- ============================================================================= --- Authors: Martin Zabel --- Patrick Lehmann +-- Authors: Martin Zabel +-- Patrick Lehmann -- --- Testbench: Testbench for ocram_sp. +-- Testbench: Testbench for ocram_SinglePort. -- -- Description: -- ------------------------------------- @@ -10,13 +10,13 @@ -- License: -- ============================================================================= -- Copyright 2016-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -25,45 +25,45 @@ -- limitations under the License. -- ============================================================================= -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library PoC; -use PoC.physical.all; +use PoC.physical.all; -- simulation specific packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; -entity ocram_sp_tb is -end entity ocram_sp_tb; +entity ocram_SinglePort_tb is +end entity ocram_SinglePort_tb; -architecture sim of ocram_sp_tb is +architecture sim of ocram_SinglePort_tb is constant A_BITS : positive := 8; constant D_BITS : positive := A_BITS; -- for test pattern signal clk : std_logic := '1'; - signal ce : std_logic; - signal we : std_logic; - signal a : unsigned(A_BITS-1 downto 0); - signal d : std_logic_vector(D_BITS-1 downto 0); - signal q : std_logic_vector(D_BITS-1 downto 0); + signal ce : std_logic; + signal we : std_logic; + signal a : unsigned(A_BITS-1 downto 0); + signal d : std_logic_vector(D_BITS-1 downto 0); + signal q : std_logic_vector(D_BITS-1 downto 0); begin -- architecture sim - uut: entity PoC.ocram_sp + uut: entity PoC.ocram_SinglePort generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, + A_BITS => A_BITS, + D_BITS => D_BITS, FILENAME => "") port map ( clk => clk, - ce => ce, - we => we, - a => a, - d => d, - q => q); + ce => ce, + we => we, + a => a, + d => d, + q => q); -- initialize global simulation status simInitialize; @@ -71,7 +71,7 @@ begin -- architecture sim simGenerateClock(clk, 100 MHz); Stimuli: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Stimuli process"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Stimuli process"); begin -- 1) Fill memory and check read-during-write behavior -- =================================================== diff --git a/tb/mem/ocram/ocram_tdp_tb.vhdl b/tb/mem/ocram/ocram_TrueDualPort_tb.vhdl similarity index 74% rename from tb/mem/ocram/ocram_tdp_tb.vhdl rename to tb/mem/ocram/ocram_TrueDualPort_tb.vhdl index 9125b08a6..af64cc23d 100644 --- a/tb/mem/ocram/ocram_tdp_tb.vhdl +++ b/tb/mem/ocram/ocram_TrueDualPort_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Testbench: On-Chip-RAM: True Dual-Port (TDP). +-- Testbench: On-Chip-RAM: True Dual-Port (TDP). -- -- Description: -- ------------------------------------ --- Automated testbench for PoC.mem.ocram.tdp +-- Automated testbench for PoC.mem.ocram.tdp -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,35 +29,35 @@ -- limitations under the License. -- ============================================================================= -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library PoC; -use PoC.utils.all; -use PoC.physical.all; +use PoC.utils.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; -entity ocram_tdp_tb is +entity ocram_TrueDualPort_tb is end entity; -architecture tb of ocram_tdp_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; +architecture tb of ocram_TrueDualPort_tb is + constant CLOCK_FREQ : FREQ := 100 MHz; - -- component generics - -- Set to values used for synthesis when simulating a netlist. - constant A_BITS : positive := 8; - constant D_BITS : positive := 16; + -- component generics + -- Set to values used for synthesis when simulating a netlist. + constant A_BITS : positive := 8; + constant D_BITS : positive := 16; -- test configurations - type T_TEST_CONFIG is record - phase1 : T_PHASE; -- phase of clk1 - phase2 : T_PHASE; -- phase of clk2 - end record; + type T_TEST_CONFIG is record + phase1 : T_PHASE; -- phase of clk1 + phase2 : T_PHASE; -- phase of clk2 + end record; type T_TEST_CONFIG_VEC is array (natural range<>) of T_TEST_CONFIG; @@ -79,18 +79,18 @@ begin " Phase2="&integer'image(CLOCK2_PHASE / 1 deg)); -- component ports - signal clk1 : std_logic; - signal clk2 : std_logic; - signal ce1 : std_logic; - signal ce2 : std_logic; - signal we1 : std_logic; - signal we2 : std_logic; - signal a1 : unsigned(A_BITS-1 downto 0); - signal a2 : unsigned(A_BITS-1 downto 0); - signal d1 : std_logic_vector(D_BITS-1 downto 0); - signal d2 : std_logic_vector(D_BITS-1 downto 0); - signal q1 : std_logic_vector(D_BITS-1 downto 0); - signal q2 : std_logic_vector(D_BITS-1 downto 0); + signal clk1 : std_logic; + signal clk2 : std_logic; + signal ce1 : std_logic; + signal ce2 : std_logic; + signal we1 : std_logic; + signal we2 : std_logic; + signal a1 : unsigned(A_BITS-1 downto 0); + signal a2 : unsigned(A_BITS-1 downto 0); + signal d1 : std_logic_vector(D_BITS-1 downto 0); + signal d2 : std_logic_vector(D_BITS-1 downto 0); + signal q1 : std_logic_vector(D_BITS-1 downto 0); + signal q2 : std_logic_vector(D_BITS-1 downto 0); -- Expected read data, assign together with read command -- Set to '-'es when result doesn't care. @@ -112,24 +112,24 @@ begin simGenerateClock(simTestID, clk2, CLOCK_FREQ, CLOCK2_PHASE); -- component instantiation - UUT: entity poc.ocram_tdp + UUT: entity poc.ocram_TrueDualPort generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, + A_BITS => A_BITS, + D_BITS => D_BITS, FILENAME => "") port map ( clk1 => clk1, clk2 => clk2, - ce1 => ce1, - ce2 => ce2, - we1 => we1, - we2 => we2, - a1 => a1, - a2 => a2, - d1 => d1, - d2 => d2, - q1 => q1, - q2 => q2); + ce1 => ce1, + ce2 => ce2, + we1 => we1, + we2 => we2, + a1 => a1, + a2 => a2, + d1 => d1, + d2 => d2, + q1 => q1, + q2 => q2); -- Input stimuli for Port 1 -- =========================================================================== @@ -148,18 +148,18 @@ begin ------------------------------------------------------------------------- for i in 0 to 7 loop simWaitUntilRisingEdge(clk1, 1); - ce1 <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce1 <= '1'; + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; simWaitUntilRisingEdge(clk1, 1); -- last read on port 2 here - ce1 <= '0'; - we1 <= '0'; - a1 <= (others => '-'); + ce1 <= '0'; + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); @@ -167,18 +167,18 @@ begin ------------------------------------------------------------------------- for i in 8 to 15 loop simWaitUntilRisingEdge(clk1, 1); - ce1 <= not ce1; -- write @ even addresses - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce1 <= not ce1; -- write @ even addresses + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; simWaitUntilRisingEdge(clk1, 1); -- last read on port 2 here - ce1 <= '0'; - we1 <= '0'; - a1 <= (others => '-'); + ce1 <= '0'; + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); @@ -187,17 +187,17 @@ begin ------------------------------------------------------------------------- simWaitUntilRisingEdge(clk1, 1); -- first write on port 2 here - ce1 <= '0'; + ce1 <= '0'; we1 <= '-'; - a1 <= (others => '-'); + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); for i in 16 to 23 loop simWaitUntilRisingEdge(clk1, 1); - ce1 <= '1'; + ce1 <= '1'; we1 <= '0'; - a1 <= to_unsigned(i, A_BITS); + a1 <= to_unsigned(i, A_BITS); d1 <= (others => '-'); if CLOCK1_PHASE >= CLOCK2_PHASE then -- read succeeds either if clocks are in phase or read clock is @@ -213,17 +213,17 @@ begin ------------------------------------------------------------------------- simWaitUntilRisingEdge(clk1, 1); -- first write on port 2 here - ce1 <= '0'; + ce1 <= '0'; we1 <= '-'; - a1 <= (others => '-'); + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); for i in 24 to 31 loop simWaitUntilRisingEdge(clk1, 1); - ce1 <= not ce1; + ce1 <= not ce1; we1 <= '0'; - a1 <= to_unsigned(i, A_BITS); + a1 <= to_unsigned(i, A_BITS); d1 <= (others => '-'); if CLOCK1_PHASE >= CLOCK2_PHASE then -- read succeeds either if clocks are in phase or read clock is @@ -240,27 +240,27 @@ begin -- address. Data is read again from memory after all writes. for i in 32 to 39 loop simWaitUntilRisingEdge(clk1, 1); - ce1 <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce1 <= '1'; + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); simWaitUntilRisingEdge(clk1, 1); -- write on port 2 - ce1 <= '0'; + ce1 <= '0'; we1 <= '-'; - a1 <= (others => '-'); + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); end loop; for i in 32 to 39 loop simWaitUntilRisingEdge(clk1, 1); - ce1 <= '1'; - we1 <= '0'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce1 <= '1'; + we1 <= '0'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); if CLOCK2_PHASE >= CLOCK1_PHASE then -- write succeeds either if clocks are in phase or if clock of second -- write is behind clock of first write @@ -277,26 +277,26 @@ begin for i in 40 to 47 loop simWaitUntilRisingEdge(clk1, 1); -- write on port 2 - ce1 <= '0'; + ce1 <= '0'; we1 <= '-'; - a1 <= (others => '-'); + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); simWaitUntilRisingEdge(clk1, 1); - ce1 <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce1 <= '1'; + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; for i in 40 to 47 loop simWaitUntilRisingEdge(clk1, 1); - ce1 <= '1'; - we1 <= '0'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce1 <= '1'; + we1 <= '0'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); if CLOCK1_PHASE >= CLOCK2_PHASE then -- write succeeds either if clocks are in phase or if clock of second -- write is behind clock of first write @@ -312,10 +312,10 @@ begin ------------------------------------------------------------------------- for i in 48 to 55 loop simWaitUntilRisingEdge(clk1, 1); - ce1 <= '1'; - we1 <= '0'; - a1 <= to_unsigned(i, A_BITS); - d1 <= (others => '-'); + ce1 <= '1'; + we1 <= '0'; + a1 <= to_unsigned(i, A_BITS); + d1 <= (others => '-'); if CLOCK1_PHASE <= CLOCK2_PHASE then -- read succeeds if clocks are in phase or if read clock is before -- write clock @@ -328,9 +328,9 @@ begin simWaitUntilRisingEdge(clk1, 1); -- last write on port 2 here - ce1 <= '0'; - we1 <= '0'; - a1 <= (others => '-'); + ce1 <= '0'; + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); @@ -339,27 +339,27 @@ begin ------------------------------------------------------------------------- simWaitUntilRisingEdge(clk1, 1); -- first read on port 2 here - ce1 <= '0'; - we1 <= '0'; - a1 <= (others => '-'); + ce1 <= '0'; + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); for i in 56 to 63 loop simWaitUntilRisingEdge(clk1, 1); - ce1 <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce1 <= '1'; + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; ------------------------------------------------------------------------- -- Finish simWaitUntilRisingEdge(clk1, 1); - ce1 <= '0'; + ce1 <= '0'; we1 <= '-'; - a1 <= (others => '-'); + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); @@ -386,17 +386,17 @@ begin ------------------------------------------------------------------------- simWaitUntilRisingEdge(clk2, 1); -- first write on port 1 here - ce2 <= '0'; + ce2 <= '0'; we2 <= '-'; - a2 <= (others => '-'); + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); for i in 0 to 7 loop simWaitUntilRisingEdge(clk2, 1); - ce2 <= '1'; + ce2 <= '1'; we2 <= '0'; - a2 <= to_unsigned(i, A_BITS); + a2 <= to_unsigned(i, A_BITS); d2 <= (others => '-'); if CLOCK2_PHASE >= CLOCK1_PHASE then -- read succeeds either if clocks are in phase or read clock is @@ -412,17 +412,17 @@ begin ------------------------------------------------------------------------- simWaitUntilRisingEdge(clk2, 1); -- first write on port 1 here - ce2 <= '0'; + ce2 <= '0'; we2 <= '-'; - a2 <= (others => '-'); + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); for i in 8 to 15 loop simWaitUntilRisingEdge(clk2, 1); - ce2 <= not ce2; + ce2 <= not ce2; we2 <= '0'; - a2 <= to_unsigned(i, A_BITS); + a2 <= to_unsigned(i, A_BITS); d2 <= (others => '-'); if CLOCK2_PHASE >= CLOCK1_PHASE then -- read succeeds either if clocks are in phase or read clock is @@ -439,18 +439,18 @@ begin ------------------------------------------------------------------------- for i in 16 to 23 loop simWaitUntilRisingEdge(clk2, 1); - ce2 <= '1'; - we2 <= '1'; - a2 <= to_unsigned(i, A_BITS); - d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce2 <= '1'; + we2 <= '1'; + a2 <= to_unsigned(i, A_BITS); + d2 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; simWaitUntilRisingEdge(clk2, 1); -- last read on port 1 here - ce2 <= '0'; - we2 <= '0'; - a2 <= (others => '-'); + ce2 <= '0'; + we2 <= '0'; + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); @@ -458,18 +458,18 @@ begin -- Alternating write on port 2 / read on port 1 for i in 24 to 31 loop simWaitUntilRisingEdge(clk2, 1); - ce2 <= not ce2; -- write @ even addresses - we2 <= '1'; - a2 <= to_unsigned(i, A_BITS); - d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce2 <= not ce2; -- write @ even addresses + we2 <= '1'; + a2 <= to_unsigned(i, A_BITS); + d2 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; simWaitUntilRisingEdge(clk2, 1); -- last read on port 1 here - ce2 <= '0'; - we2 <= '0'; - a2 <= (others => '-'); + ce2 <= '0'; + we2 <= '0'; + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); @@ -479,26 +479,26 @@ begin for i in 32 to 39 loop simWaitUntilRisingEdge(clk2, 1); -- write on port 1 - ce2 <= '0'; + ce2 <= '0'; we2 <= '-'; - a2 <= (others => '-'); + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); simWaitUntilRisingEdge(clk2, 1); - ce2 <= '1'; - we2 <= '1'; - a2 <= to_unsigned(i, A_BITS); - d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce2 <= '1'; + we2 <= '1'; + a2 <= to_unsigned(i, A_BITS); + d2 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; for i in 32 to 39 loop simWaitUntilRisingEdge(clk2, 1); - ce2 <= '1'; - we2 <= '0'; - a2 <= to_unsigned(i, A_BITS); - d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce2 <= '1'; + we2 <= '0'; + a2 <= to_unsigned(i, A_BITS); + d2 <= std_logic_vector(to_unsigned(i, D_BITS)); if CLOCK2_PHASE >= CLOCK1_PHASE then -- write succeeds either if clocks are in phase or if clock of second -- write is behind clock of first write @@ -514,27 +514,27 @@ begin -- address. Data is read again from memory after all writes. for i in 40 to 47 loop simWaitUntilRisingEdge(clk2, 1); - ce2 <= '1'; - we2 <= '1'; - a2 <= to_unsigned(i, A_BITS); - d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce2 <= '1'; + we2 <= '1'; + a2 <= to_unsigned(i, A_BITS); + d2 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); simWaitUntilRisingEdge(clk2, 1); -- write on port 1 - ce2 <= '0'; + ce2 <= '0'; we2 <= '-'; - a2 <= (others => '-'); + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); end loop; for i in 40 to 47 loop simWaitUntilRisingEdge(clk2, 1); - ce2 <= '1'; - we2 <= '0'; - a2 <= to_unsigned(i, A_BITS); - d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce2 <= '1'; + we2 <= '0'; + a2 <= to_unsigned(i, A_BITS); + d2 <= std_logic_vector(to_unsigned(i, D_BITS)); if CLOCK1_PHASE >= CLOCK2_PHASE then -- write succeeds either if clocks are in phase or if clock of second -- write is behind clock of first write @@ -550,18 +550,18 @@ begin ------------------------------------------------------------------------- simWaitUntilRisingEdge(clk2, 1); -- first read on port 1 here - ce2 <= '0'; - we2 <= '0'; - a2 <= (others => '-'); + ce2 <= '0'; + we2 <= '0'; + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); for i in 48 to 55 loop simWaitUntilRisingEdge(clk2, 1); - ce2 <= '1'; - we2 <= '1'; - a2 <= to_unsigned(i, A_BITS); - d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + ce2 <= '1'; + we2 <= '1'; + a2 <= to_unsigned(i, A_BITS); + d2 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; @@ -570,10 +570,10 @@ begin ------------------------------------------------------------------------- for i in 56 to 63 loop simWaitUntilRisingEdge(clk2, 1); - ce2 <= '1'; - we2 <= '0'; - a2 <= to_unsigned(i, A_BITS); - d2 <= (others => '-'); + ce2 <= '1'; + we2 <= '0'; + a2 <= to_unsigned(i, A_BITS); + d2 <= (others => '-'); if CLOCK2_PHASE <= CLOCK1_PHASE then -- read succeeds if clocks are in phase or if read clock is before -- write clock @@ -586,18 +586,18 @@ begin simWaitUntilRisingEdge(clk2, 1); -- last write on port 1 here - ce2 <= '0'; - we2 <= '0'; - a2 <= (others => '-'); + ce2 <= '0'; + we2 <= '0'; + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); ------------------------------------------------------------------------- -- Finish simWaitUntilRisingEdge(clk2, 1); - ce2 <= '0'; - we2 <= '-'; - a2 <= (others => '-'); + ce2 <= '0'; + we2 <= '-'; + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); @@ -617,7 +617,7 @@ begin exp_q2 <= rd_d2 when rising_edge(clk2) and ce2 = '1'; Checker1: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "TestID "&integer'image(simTestID)&", Checker1"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "TestID "&integer'image(simTestID)&", Checker1"); variable i : integer; begin while not finished1 loop @@ -632,7 +632,7 @@ begin end process Checker1; Checker2: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "TestID "&integer'image(simTestID)&", Checker2"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "TestID "&integer'image(simTestID)&", Checker2"); variable i : integer; begin while not finished2 loop diff --git a/tb/mem/ocram/ocram_tdp_wf_tb.vhdl b/tb/mem/ocram/ocram_TrueDualPort_wf_tb.vhdl similarity index 76% rename from tb/mem/ocram/ocram_tdp_wf_tb.vhdl rename to tb/mem/ocram/ocram_TrueDualPort_wf_tb.vhdl index d93786940..8ab908f35 100644 --- a/tb/mem/ocram/ocram_tdp_wf_tb.vhdl +++ b/tb/mem/ocram/ocram_TrueDualPort_wf_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Martin Zabel +-- Authors: Martin Zabel -- --- Testbench: On-Chip-RAM: True-Dual-Port (TDP) with write-first. +-- Testbench: On-Chip-RAM: True-Dual-Port (TDP) with write-first. -- -- Description: -- ------------------------------------ --- Automated testbench for PoC.mem.ocram.tdp_wf +-- Automated testbench for PoC.mem.ocram.tdp_wf -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair for VLSI-Design, Diagnostics and Architecture +-- Chair for VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,29 +29,29 @@ -- limitations under the License. -- ============================================================================= -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library PoC; -use PoC.utils.all; -use PoC.physical.all; +use PoC.utils.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; -entity ocram_tdp_wf_tb is +entity ocram_TrueDualPort_wf_tb is end entity; -architecture tb of ocram_tdp_wf_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; +architecture tb of ocram_TrueDualPort_wf_tb is + constant CLOCK_FREQ : FREQ := 100 MHz; - -- component generics - -- Set to values used for synthesis when simulating a netlist. - constant A_BITS : positive := 8; - constant D_BITS : positive := 16; + -- component generics + -- Set to values used for synthesis when simulating a netlist. + constant A_BITS : positive := 8; + constant D_BITS : positive := 16; -- component ports signal clk : std_logic; @@ -88,10 +88,10 @@ begin simGenerateClock(clk, CLOCK_FREQ); -- component instantiation - UUT: entity poc.ocram_tdp_wf + UUT: entity poc.ocram_TrueDualPort_wf generic map ( - A_BITS => A_BITS, - D_BITS => D_BITS, + A_BITS => A_BITS, + D_BITS => D_BITS, FILENAME => "") port map ( clk => clk, @@ -127,17 +127,17 @@ begin for i in 0 to 7 loop simWaitUntilRisingEdge(clk, 1); ce <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); - rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; simWaitUntilRisingEdge(clk, 1); -- last read on port 2 here ce <= '1'; - we1 <= '0'; - a1 <= (others => '-'); + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); @@ -146,11 +146,11 @@ begin for i in 8 to 15 loop simWaitUntilRisingEdge(clk, 1); ce <= '1'; - we1 <= not we1; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + we1 <= not we1; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); if we1 = '0' then -- next is write - rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); else rd_d1 <= (others => '-'); end if; @@ -159,8 +159,8 @@ begin simWaitUntilRisingEdge(clk, 1); -- last read on port 2 here ce <= '1'; - we1 <= '0'; - a1 <= (others => '-'); + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); @@ -170,18 +170,18 @@ begin simWaitUntilRisingEdge(clk, 1); -- first read on port 2 here ce <= '1'; - we1 <= '0'; - a1 <= (others => '-'); + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); for i in 16 to 23 loop simWaitUntilRisingEdge(clk, 1); ce <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); - rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; -- Alternating write on port 2 / read on port 1 @@ -191,7 +191,7 @@ begin ce <= '1'; re1 := false; we1 <= '0'; - a1 <= (others => '-'); + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); @@ -200,7 +200,7 @@ begin ce <= '1'; re1 := not re1; -- only compare result every second clock cycle we1 <= '0'; - a1 <= to_unsigned(i, A_BITS); + a1 <= to_unsigned(i, A_BITS); d1 <= (others => '-'); if re1 then rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); @@ -215,16 +215,16 @@ begin for i in 32 to 39 loop simWaitUntilRisingEdge(clk, 1); ce <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); simWaitUntilRisingEdge(clk, 1); -- write on port 2 ce <= '1'; we1 <= '0'; - a1 <= (others => '-'); + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); end loop; @@ -232,9 +232,9 @@ begin for i in 32 to 39 loop simWaitUntilRisingEdge(clk, 1); ce <= '1'; - we1 <= '0'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + we1 <= '0'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; @@ -246,24 +246,24 @@ begin -- write on port 2 ce <= '1'; we1 <= '0'; - a1 <= (others => '-'); + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); simWaitUntilRisingEdge(clk, 1); ce <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; for i in 40 to 47 loop simWaitUntilRisingEdge(clk, 1); ce <= '1'; - we1 <= '0'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + we1 <= '0'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; @@ -273,17 +273,17 @@ begin for i in 48 to 55 loop simWaitUntilRisingEdge(clk, 1); ce <= '1'; - we1 <= '0'; - a1 <= to_unsigned(i, A_BITS); - d1 <= (others => '-'); + we1 <= '0'; + a1 <= to_unsigned(i, A_BITS); + d1 <= (others => '-'); rd_d1 <= (others => 'U'); -- memory not yet initialized end loop; simWaitUntilRisingEdge(clk, 1); -- last write on port 2 here ce <= '1'; - we1 <= '0'; - a1 <= (others => '-'); + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); @@ -293,17 +293,17 @@ begin simWaitUntilRisingEdge(clk, 1); -- first read on port 2 here ce <= '1'; - we1 <= '0'; - a1 <= (others => '-'); + we1 <= '0'; + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); for i in 56 to 63 loop simWaitUntilRisingEdge(clk, 1); ce <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; @@ -313,10 +313,10 @@ begin for i in 64 to 71 loop simWaitUntilRisingEdge(clk, 1); ce <= '1'; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); - rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; -- Read (port 2) and write (port 1) 8 times at the same address every second @@ -325,10 +325,10 @@ begin for i in 72 to 87 loop simWaitUntilRisingEdge(clk, 1); ce <= not ce; - we1 <= '1'; - a1 <= to_unsigned(i, A_BITS); - d1 <= std_logic_vector(to_unsigned(i, D_BITS)); - rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + we1 <= '1'; + a1 <= to_unsigned(i, A_BITS); + d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; -- Read (port 1) and write (port 2) in 8 consecutive clock cycles at the @@ -338,9 +338,9 @@ begin simWaitUntilRisingEdge(clk, 1); ce <= '1'; we1 <= '0'; - a1 <= to_unsigned(i, A_BITS); + a1 <= to_unsigned(i, A_BITS); d1 <= (others => '-'); - rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; -- Read (port 1) and write (port 2) 8 times at the same address every second @@ -350,9 +350,9 @@ begin simWaitUntilRisingEdge(clk, 1); ce <= not ce; we1 <= '0'; - a1 <= to_unsigned(i, A_BITS); + a1 <= to_unsigned(i, A_BITS); d1 <= (others => '-'); - rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); + rd_d1 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; ------------------------------------------------------------------------- @@ -360,7 +360,7 @@ begin simWaitUntilRisingEdge(clk, 1); ce <= '0'; we1 <= '-'; - a1 <= (others => '-'); + a1 <= (others => '-'); d1 <= (others => '-'); rd_d1 <= (others => '-'); @@ -388,12 +388,12 @@ begin simWaitUntilRisingEdge(clk, 1); -- first write on port 1 here we2 <= '0'; - a2 <= (others => '-'); + a2 <= (others => '-'); rd_d2 <= (others => '-'); for i in 0 to 7 loop simWaitUntilRisingEdge(clk, 1); - a2 <= to_unsigned(i, A_BITS); + a2 <= to_unsigned(i, A_BITS); rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; @@ -403,14 +403,14 @@ begin -- first write on port 1 here re2 := false; we2 <= '0'; - a2 <= (others => '-'); + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); for i in 8 to 15 loop simWaitUntilRisingEdge(clk, 1); re2 := not re2; -- only compare read result every second cycle - a2 <= to_unsigned(i, A_BITS); + a2 <= to_unsigned(i, A_BITS); d2 <= (others => '-'); if re2 then rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); @@ -425,7 +425,7 @@ begin for i in 16 to 23 loop simWaitUntilRisingEdge(clk, 1); we2 <= '0'; - a2 <= to_unsigned(i, A_BITS); + a2 <= to_unsigned(i, A_BITS); d2 <= (others => '-'); rd_d2 <= (others => 'U'); -- memory not yet initialized end loop; @@ -433,7 +433,7 @@ begin simWaitUntilRisingEdge(clk, 1); -- last write on port 1 here we2 <= '0'; - a2 <= (others => '-'); + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); @@ -441,11 +441,11 @@ begin -- Alternating write on port 2 / read on port 1 for i in 24 to 31 loop simWaitUntilRisingEdge(clk, 1); - we2 <= not we2; - a2 <= to_unsigned(i, A_BITS); - d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + we2 <= not we2; + a2 <= to_unsigned(i, A_BITS); + d2 <= std_logic_vector(to_unsigned(i, D_BITS)); if we2 = '0' then -- next is write - rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); else rd_d2 <= (others => '-'); end if; @@ -453,8 +453,8 @@ begin simWaitUntilRisingEdge(clk, 1); -- last read on port 1 here - we2 <= '0'; - a2 <= (others => '-'); + we2 <= '0'; + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); @@ -465,22 +465,22 @@ begin simWaitUntilRisingEdge(clk, 1); -- write on port 1 we2 <= '0'; - a2 <= (others => '-'); + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); simWaitUntilRisingEdge(clk, 1); - we2 <= '1'; - a2 <= to_unsigned(i, A_BITS); - d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + we2 <= '1'; + a2 <= to_unsigned(i, A_BITS); + d2 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; for i in 32 to 39 loop simWaitUntilRisingEdge(clk, 1); - we2 <= '0'; - a2 <= to_unsigned(i, A_BITS); - d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + we2 <= '0'; + a2 <= to_unsigned(i, A_BITS); + d2 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; @@ -489,24 +489,24 @@ begin -- address. Data is read again from memory after all writes. for i in 40 to 47 loop simWaitUntilRisingEdge(clk, 1); - we2 <= '1'; - a2 <= to_unsigned(i, A_BITS); - d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + we2 <= '1'; + a2 <= to_unsigned(i, A_BITS); + d2 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); simWaitUntilRisingEdge(clk, 1); -- write on port 1 we2 <= '0'; - a2 <= (others => '-'); + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); end loop; for i in 40 to 47 loop simWaitUntilRisingEdge(clk, 1); - we2 <= '0'; - a2 <= to_unsigned(i, A_BITS); - d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + we2 <= '0'; + a2 <= to_unsigned(i, A_BITS); + d2 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; @@ -515,16 +515,16 @@ begin ------------------------------------------------------------------------- simWaitUntilRisingEdge(clk, 1); -- first read on port 1 here - we2 <= '0'; - a2 <= (others => '-'); + we2 <= '0'; + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); for i in 48 to 55 loop simWaitUntilRisingEdge(clk, 1); - we2 <= '1'; - a2 <= to_unsigned(i, A_BITS); - d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + we2 <= '1'; + a2 <= to_unsigned(i, A_BITS); + d2 <= std_logic_vector(to_unsigned(i, D_BITS)); rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; @@ -533,16 +533,16 @@ begin ------------------------------------------------------------------------- for i in 56 to 63 loop simWaitUntilRisingEdge(clk, 1); - we2 <= '0'; - a2 <= to_unsigned(i, A_BITS); - d2 <= (others => '-'); + we2 <= '0'; + a2 <= to_unsigned(i, A_BITS); + d2 <= (others => '-'); rd_d2 <= (others => 'U'); -- memory not yet initialized end loop; simWaitUntilRisingEdge(clk, 1); -- last write on port 1 here - we2 <= '0'; - a2 <= (others => '-'); + we2 <= '0'; + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); @@ -552,9 +552,9 @@ begin for i in 64 to 71 loop simWaitUntilRisingEdge(clk, 1); we2 <= '0'; - a2 <= to_unsigned(i, A_BITS); + a2 <= to_unsigned(i, A_BITS); d2 <= (others => '-'); - rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; -- Read (port 2) and write (port 1) 8 times at the same address every second @@ -563,9 +563,9 @@ begin for i in 72 to 87 loop simWaitUntilRisingEdge(clk, 1); we2 <= '0'; - a2 <= to_unsigned(i, A_BITS); + a2 <= to_unsigned(i, A_BITS); d2 <= (others => '-'); - rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; -- Read (port 2) and write (port 1) in 8 consecutive clock cycles at the @@ -573,10 +573,10 @@ begin ------------------------------------------------------------------------- for i in 88 to 95 loop simWaitUntilRisingEdge(clk, 1); - we2 <= '1'; - a2 <= to_unsigned(i, A_BITS); - d2 <= std_logic_vector(to_unsigned(i, D_BITS)); - rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + we2 <= '1'; + a2 <= to_unsigned(i, A_BITS); + d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; -- Read (port 2) and write (port 1) 8 times at the same address every second @@ -584,17 +584,17 @@ begin ------------------------------------------------------------------------- for i in 96 to 111 loop simWaitUntilRisingEdge(clk, 1); - we2 <= '1'; - a2 <= to_unsigned(i, A_BITS); - d2 <= std_logic_vector(to_unsigned(i, D_BITS)); - rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + we2 <= '1'; + a2 <= to_unsigned(i, A_BITS); + d2 <= std_logic_vector(to_unsigned(i, D_BITS)); + rd_d2 <= std_logic_vector(to_unsigned(i, D_BITS)); end loop; ------------------------------------------------------------------------- -- Finish simWaitUntilRisingEdge(clk, 1); we2 <= '-'; - a2 <= (others => '-'); + a2 <= (others => '-'); d2 <= (others => '-'); rd_d2 <= (others => '-'); @@ -612,7 +612,7 @@ begin exp_q2 <= rd_d2 when rising_edge(clk) and ce = '1'; Checker1: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker1"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker1"); variable i : integer; begin while not finished1 loop @@ -627,7 +627,7 @@ begin end process Checker1; Checker2: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker2"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker2"); variable i : integer; begin while not finished2 loop diff --git a/tb/misc/clock/clock_HighResolution_load.vhdl b/tb/misc/clock/clock_HighResolution_load.vhdl index a0da9bfb9..716cfbb37 100644 --- a/tb/misc/clock/clock_HighResolution_load.vhdl +++ b/tb/misc/clock/clock_HighResolution_load.vhdl @@ -12,7 +12,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -59,12 +59,12 @@ begin -- Generate transaction for AXI manager ManagerProc : process - + procedure LoadNanoseconds ( signal manager : inout AddressBusRecType; constant ns_load_value : natural; constant waitTime : time - ) is + ) is variable ns_value_slv : std_logic_vector(63 downto 0) := to_slv(ns_load_value, 64); variable time_now_a : time; variable time_now_b : time; @@ -86,7 +86,7 @@ begin time_elapsed_nat := time_elapsed / 1 ns; AffirmIfEqual(ns_elapsed, time_elapsed_nat); end procedure; - + procedure LoadDatetime ( signal manager : inout AddressBusRecType; constant s : natural; -- second @@ -99,11 +99,11 @@ begin ) is variable Datetime_to_load_i : T_CLOCK_DATETIME := ( secondsResolution => to_unsigned(0, 32), - seconds => to_unsigned(s, 6), - minutes => to_unsigned(m, 6), - hours => to_unsigned(h, 5), - day => to_unsigned(d, 5), - month => to_unsigned(mo, 4), + seconds => to_unsigned(s, 6), + minutes => to_unsigned(m, 6), + hours => to_unsigned(h, 5), + day => to_unsigned(d, 5), + month => to_unsigned(mo, 4), year => to_unsigned(y, 13) ); variable Datetime_read : T_CLOCK_DATETIME := (others => (others => '0')); @@ -135,7 +135,7 @@ begin variable randTime : time := 0 ns; type T_RandTimes is record randNs : positive; - randT : positive; + -- randT : positive; randSec : positive; randMin : positive; randHour : positive; @@ -152,24 +152,25 @@ begin Load_datetime <= '0'; wait until Reset = '0'; WaitForClock(AXI_Manager, 2); - + log("Checking nanosecond load"); for i in 0 to 5 loop randTime := RV.RandTime(1 ns, 500 ns); -- in ns RandTimes.randNs := RV.RandInt(1, 999); LoadNanoseconds(AXI_Manager, RandTimes.randNs, randTime); - RandTimes.randT := RV.RandInt(1, 1000); - RandTimes.randSec := RV.RandInt(1, 59); - RandTimes.randMin := RV.RandInt(1, 59); - RandTimes.randHour := RV.RandInt(1, 24); - RandTimes.randDay := RV.RandInt(1, 12); + -- RandTimes.randT := RV.RandInt(0, 1000); + RandTimes.randSec := RV.RandInt(0, 59); + RandTimes.randMin := RV.RandInt(0, 59); + RandTimes.randHour := RV.RandInt(0, 23); + RandTimes.randDay := RV.RandInt(1, 31); RandTimes.randMonth := RV.RandInt(1, 12); RandTimes.randYear := RV.RandInt(2000, 4000); - LoadDatetime(AXI_Manager, RandTimes.randT, RandTimes.randSec, RandTimes.randMin, RandTimes.randHour, RandTimes.randDay, RandTimes.randYear, randTime); + + LoadDatetime(AXI_Manager, RandTimes.randSec, RandTimes.randMin, RandTimes.randHour, RandTimes.randDay, RandTimes.randMonth, RandTimes.randYear, randTime); end loop; -- todo: check for changes in datetime - + wait for 1 ms; WaitForClock(AXI_Manager); WaitForBarrier(TestDone); diff --git a/tb/misc/clock/clock_HighResolution_tc.vhdl b/tb/misc/clock/clock_HighResolution_tc.vhdl index c9fec0d7a..b559ee9b4 100644 --- a/tb/misc/clock/clock_HighResolution_tc.vhdl +++ b/tb/misc/clock/clock_HighResolution_tc.vhdl @@ -12,7 +12,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -43,8 +43,8 @@ entity clock_HighResolution_tc is CLOCK_FREQ : FREQ ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; AXI_Manager : inout AddressBusRecType; Load_nanoseconds : out std_logic; @@ -52,7 +52,7 @@ entity clock_HighResolution_tc is Nanoseconds_to_load : out unsigned(63 downto 0); Datetime_to_load : out T_CLOCK_Datetime; - Nanoseconds : in unsigned(63 downto 0); - Datetime : in T_CLOCK_Datetime + Nanoseconds : in unsigned(63 downto 0); + Datetime : in T_CLOCK_Datetime ); end entity; diff --git a/tb/misc/clock/clock_HighResolution_th.vhdl b/tb/misc/clock/clock_HighResolution_th.vhdl index eaad1b7da..aee8fdc21 100644 --- a/tb/misc/clock/clock_HighResolution_th.vhdl +++ b/tb/misc/clock/clock_HighResolution_th.vhdl @@ -12,7 +12,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,7 +26,7 @@ use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; library PoC; -use PoC.AXI4Lite_OSVVM.all; +use PoC.axi4lite_OSVVM.all; use PoC.physical.all; use PoC.vectors.all; use PoC.axi4lite.all; @@ -96,23 +96,23 @@ architecture TestHarness of clock_HighResolution_th is ReadAddress (Addr(AXI_ADDR_WIDTH - 1 downto 0)), ReadData (Data(AXI_DATA_WIDTH - 1 downto 0)) ); - + component clock_HighResolution_tc generic ( CLOCK_FREQ : FREQ ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; AXI_Manager : inout AddressBusRecType; Load_nanoseconds : out std_logic; Load_datetime : out std_logic; Nanoseconds_to_load : out unsigned(63 downto 0); Datetime_to_load : out T_CLOCK_Datetime; - - Nanoseconds : in unsigned(63 downto 0); - Datetime : in T_CLOCK_Datetime + + Nanoseconds : in unsigned(63 downto 0); + Datetime : in T_CLOCK_Datetime ); end component; @@ -148,7 +148,7 @@ begin -- AXI manager physical interface AxiBus => AxiBus ); - + dut: entity PoC.clock_HighResolution generic map ( SECOND_RESOLUTION => SECOND_RESOLUTION, @@ -170,7 +170,7 @@ begin ); Nanoseconds <= Nanoseconds_i when rising_edge(Clock); - Datetime <= Datetime_i when rising_edge(Clock); + Datetime <= Datetime_i when rising_edge(Clock); TestCtrl: component clock_HighResolution_tc generic map ( @@ -180,7 +180,7 @@ begin Clock => Clock, Reset => Reset, AXI_Manager => AXI_Manager, - + Load_nanoseconds => Load_nanoseconds, Load_datetime => Load_datetime, Nanoseconds_to_load => Nanoseconds_to_load, diff --git a/tb/misc/gearbox/gearbox_Down_cc_tb.vhdl b/tb/misc/gearbox/gearbox_Down_cc_tb.vhdl new file mode 100644 index 000000000..3bff0b72a --- /dev/null +++ b/tb/misc/gearbox/gearbox_Down_cc_tb.vhdl @@ -0,0 +1,227 @@ +-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- +-- vim: tabstop=2:shiftwidth=2:noexpandtab +-- kate: tab-width 2; replace-tabs off; indent-width 2; +-- +-- ============================================================================= +-- Authors: Patrick Lehmann +-- +-- Testbench: TODO +-- +-- Description: +-- ------------------------------------ +-- TODO +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +use PoC.math.all; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.physical.all; +-- simulation only packages +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; + +library OSVVM; +use OSVVM.RandomPkg.all; + + +entity gearbox_Down_cc_tb is +end entity; + + +architecture tb of gearbox_Down_cc_tb is + type T_TUPLE is record + InputBits : positive; + OutputBits : positive; + end record; + + type T_TUPLE_VECTOR is array(natural range <>) of T_TUPLE; + + constant TB_GENERATOR_LIST : T_TUPLE_VECTOR := ((32, 8), (20, 8), (36, 8), (66, 64), (128, 12)); + + constant CLOCK_FREQ : FREQ := 100 MHz; + signal Clock : std_logic := '1'; + +begin + -- initialize global simulation status + simInitialize; + + simGenerateClock(Clock, CLOCK_FREQ); + + + genInstances : for i in TB_GENERATOR_LIST'range generate + constant INPUT_BITS : positive := TB_GENERATOR_LIST(i).InputBits; + constant OUTPUT_BITS : positive := TB_GENERATOR_LIST(i).OutputBits; + constant OUTPUT_ORDER : T_BIT_ORDER := MSB_FIRST; + constant ADD_INPUT_REGISTERS : boolean := TRUE; + constant ADD_OUTPUT_REGISTERS : boolean := FALSE; + + constant BITS_PER_CHUNK : positive := greatestCommonDivisor(INPUT_BITS, OUTPUT_BITS); + constant INPUT_CHUNKS : positive := INPUT_BITS / BITS_PER_CHUNK; + constant OUTPUT_CHUNKS : positive := OUTPUT_BITS / BITS_PER_CHUNK; + + subtype T_CHUNK is std_logic_vector(BITS_PER_CHUNK - 1 downto 0); + type T_CHUNK_VECTOR is array(natural range <>) of T_CHUNK; + + function to_slv(slvv : T_CHUNK_VECTOR) return std_logic_vector is + variable slv : std_logic_vector((slvv'length * BITS_PER_CHUNK) - 1 downto 0); + begin + for i in slvv'range loop + slv(((i + 1) * BITS_PER_CHUNK) - 1 downto (i * BITS_PER_CHUNK)) := slvv(i); + end loop; + return slv; + end function; + + constant LOOP_COUNT : positive := 64; + constant DELAY : positive := 16; + + signal SyncIn : std_logic; + signal ValidIn : std_logic; + signal DataIn : std_logic_vector(INPUT_BITS - 1 downto 0); + + signal SyncOut : std_logic; + signal ValidOut : std_logic; + signal DataOut : std_logic_vector(OUTPUT_BITS - 1 downto 0); + signal FirstOut : std_logic; + signal LastOut : std_logic; + + constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for " & integer'image(INPUT_BITS) & "->" & INTEGER'image(OUTPUT_BITS)); + + begin + procGenerator : process + -- from Simulation + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); --, "aaa/bbb/ccc"); --globalSimulationStatus'instance_name); + -- protected type from RandomPkg + variable RandomVar : RandomPType; + + impure function genChunkedRandomValue return std_logic_vector is + variable Temp : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); + begin + for j in 0 to INPUT_CHUNKS - 1 loop + Temp(j) := to_slv(RandomVar.RandInt(0, 2**BITS_PER_CHUNK - 1), BITS_PER_CHUNK); + end loop; + return to_slv(Temp); + end function; + + begin + RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds + + SyncIn <= '0'; + DataIn <= (others => 'U'); + ValidIn <= '0'; + for i in 0 to 7 loop + wait until falling_edge(Clock); + end loop; + + SyncIn <= '1'; + ValidIn <= '1'; + DataIn <= genChunkedRandomValue; + wait until falling_edge(Clock); + + SyncIn <= '0'; + for i in 0 to LOOP_COUNT - 1 loop + DataIn <= genChunkedRandomValue; + ValidIn <= '1'; + wait until falling_edge(Clock); + end loop; + + SyncIn <= '1'; + ValidIn <= '1'; + DataIn <= genChunkedRandomValue; + wait until falling_edge(Clock); + + SyncIn <= '0'; + for i in 0 to LOOP_COUNT - 1 loop + if (i mod 2 = 1) then + DataIn <= genChunkedRandomValue; + ValidIn <= '1'; + else + ValidIn <= '0'; + end if; + wait until falling_edge(Clock); + end loop; + + DataIn <= (others => '0'); + ValidIn <= '0'; + + -- This process is finished + simDeactivateProcess(simProcessID); + wait; -- forever + end process; + + gear : entity PoC.gearbox_Down_cc + generic map ( + INPUT_BITS => INPUT_BITS, + OUTPUT_BITS => OUTPUT_BITS, + META_BITS => 0, --META_BITS, + -- OUTPUT_ORDER => OUTPUT_ORDER, + ADD_INPUT_REGISTERS => ADD_INPUT_REGISTERS, + ADD_OUTPUT_REGISTERS => ADD_OUTPUT_REGISTERS + ) + port map ( + Clock => Clock, + + In_Sync => SyncIn, + In_Valid => ValidIn, + In_Data => DataIn, + In_Meta => (others => '0'), --MetaIn, + + Out_Sync => SyncOut, + Out_Valid => ValidOut, + Out_Data => DataOut, + Out_Meta => open, --MetaOut + Out_First => FirstOut, + Out_Last => LastOut + ); + + procChecker : process + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Checker " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); + variable Check : boolean; + begin + Check := TRUE; + + wait until rising_edge(Clock) and (FirstOut = '1'); + + for i in 0 to LOOP_COUNT - 1 loop + wait until rising_edge(Clock); + -- simAssertion(Check, "TODO: "); + end loop; + + for i in 0 to LOOP_COUNT - 1 loop + wait until rising_edge(Clock); + -- simAssertion(Check, "TODO: "); + end loop; + + for i in 0 to DELAY - 1 loop + wait until rising_edge(Clock); + end loop; + + -- This process is finished + simDeactivateProcess(simProcessID); + simFinalizeTest(simTestID); + wait; -- forever + end process; + end generate; +end architecture; diff --git a/tb/misc/gearbox/gearbox_Down_dc_tb.vhdl b/tb/misc/gearbox/gearbox_Down_dc_tb.vhdl new file mode 100644 index 000000000..7d80ba017 --- /dev/null +++ b/tb/misc/gearbox/gearbox_Down_dc_tb.vhdl @@ -0,0 +1,169 @@ +-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- +-- vim: tabstop=2:shiftwidth=2:noexpandtab +-- kate: tab-width 2; replace-tabs off; indent-width 2; +-- +-- ============================================================================= +-- Authors: Patrick Lehmann +-- +-- Testbench: TODO +-- +-- Description: +-- ------------------------------------ +-- TODO +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +use PoC.math.all; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.physical.all; +-- simulation only packages +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; + +library OSVVM; +use OSVVM.RandomPkg.all; + + +entity gearbox_Down_dc_tb is +end entity; + + +architecture tb of gearbox_Down_dc_tb is + type T_TUPLE is record + InputBits : positive; + OutputBits : positive; + end record; + type T_TUPLE_VECTOR is array(natural range <>) of T_TUPLE; + + constant TB_GENERATOR_LIST : T_TUPLE_VECTOR := ((32, 8), (128, 8)); + +begin + -- initialize global simulation status + simInitialize; + + genInstances : for i in TB_GENERATOR_LIST'range generate + constant INPUT_BITS : positive := TB_GENERATOR_LIST(i).InputBits; + constant OUTPUT_BITS : positive := TB_GENERATOR_LIST(i).OutputBits; + constant OUTPUT_ORDER : T_BIT_ORDER := MSB_FIRST; + constant ADD_INPUT_REGISTERS : boolean := TRUE; + constant ADD_OUTPUT_REGISTERS : boolean := TRUE; + + constant RATIO : positive := INPUT_BITS / OUTPUT_BITS; + + constant BITS_PER_CHUNK : positive := greatestCommonDivisor(INPUT_BITS, OUTPUT_BITS); + constant INPUT_CHUNKS : positive := INPUT_BITS / BITS_PER_CHUNK; + constant OUTPUT_CHUNKS : positive := OUTPUT_BITS / BITS_PER_CHUNK; + + subtype T_CHUNK is std_logic_vector(BITS_PER_CHUNK - 1 downto 0); + type T_CHUNK_VECTOR is array(natural range <>) of T_CHUNK; + + function to_slv(slvv : T_CHUNK_VECTOR) return std_logic_vector is + variable slv : std_logic_vector((slvv'length * BITS_PER_CHUNK) - 1 downto 0); + begin + for i in slvv'range loop + slv(((i + 1) * BITS_PER_CHUNK) - 1 downto (i * BITS_PER_CHUNK)) := slvv(i); + end loop; + return slv; + end function; + + constant LOOP_COUNT : positive := 8; + constant DELAY : positive := 5; + + constant CLOCK2_PERIOD : time := 10 ns; + constant CLOCK1_PERIOD : time := CLOCK2_PERIOD * RATIO; + signal Clock1 : std_logic := '1'; + signal Clock2 : std_logic := '1'; + + signal DataIn : std_logic_vector(INPUT_BITS - 1 downto 0); + signal DataOut : std_logic_vector(OUTPUT_BITS - 1 downto 0); + + constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for " & integer'image(INPUT_BITS) & "->" & INTEGER'image(OUTPUT_BITS)); + + begin + -- generate global testbench clock + simGenerateClock(simTestID, Clock1, CLOCK1_PERIOD); + simGenerateClock(simTestID, Clock2, CLOCK2_PERIOD); + + procGenerator : process + -- from Simulation + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); --, "aaa/bbb/ccc"); --globalSimulationStatus'instance_name); + -- protected type from RandomPkg + variable RandomVar : RandomPType; + + impure function genChunkedRandomValue return std_logic_vector is + variable Temp : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); + begin + for j in 0 to INPUT_CHUNKS - 1 loop + Temp(j) := to_slv(RandomVar.RandInt(0, 2**BITS_PER_CHUNK - 1), BITS_PER_CHUNK); + end loop; + return to_slv(Temp); + end function; + begin + RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds + + DataIn <= (others => 'U'); + for i in 0 to LOOP_COUNT - 1 loop + wait until rising_edge(Clock1); + DataIn <= genChunkedRandomValue; + end loop; + + -- This process is finished + simDeactivateProcess(simProcessID); + wait; -- forever + end process; + + gear : entity PoC.gearbox_Down_dc + generic map ( + INPUT_BITS => INPUT_BITS, + OUTPUT_BITS => OUTPUT_BITS, + OUTPUT_ORDER => OUTPUT_ORDER, + ADD_INPUT_REGISTERS => ADD_INPUT_REGISTERS, + ADD_OUTPUT_REGISTERS => ADD_OUTPUT_REGISTERS + ) + port map ( + Clock1 => Clock1, + Clock2 => Clock2, + + In_Data => DataIn, + Out_Data => DataOut + ); + + procChecker : process + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Checker " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); --, "aaa/bbb/ccc"); --globalSimulationStatus'instance_name); + begin + for i in 0 to (LOOP_COUNT * RATIO) - 1 loop + wait until rising_edge(Clock2); + end loop; + + simWaitUntilRisingEdge(simTestID, Clock2, 4); + + -- This process is finished + simDeactivateProcess(simProcessID); + simFinalizeTest(simTestID); + wait; -- forever + end process; + end generate; +end architecture; diff --git a/tb/misc/gearbox/gearbox_Up_cc_tb.vhdl b/tb/misc/gearbox/gearbox_Up_cc_tb.vhdl new file mode 100644 index 000000000..86ec727ec --- /dev/null +++ b/tb/misc/gearbox/gearbox_Up_cc_tb.vhdl @@ -0,0 +1,225 @@ +-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- +-- vim: tabstop=2:shiftwidth=2:noexpandtab +-- kate: tab-width 2; replace-tabs off; indent-width 2; +-- +-- ============================================================================= +-- Authors: Patrick Lehmann +-- +-- Testbench: TODO +-- +-- Description: +-- ------------------------------------ +-- TODO +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +use PoC.math.all; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.physical.all; +-- simulation only packages +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; + +library OSVVM; +use OSVVM.RandomPkg.all; + + +entity gearbox_Up_cc_tb is +end entity; + + +architecture tb of gearbox_Up_cc_tb is + type T_TUPLE is record + InputBits : positive; + OutputBits : positive; + end record; + type T_TUPLE_VECTOR is array(natural range <>) of T_TUPLE; + + constant TB_GENERATOR_LIST : T_TUPLE_VECTOR := ((8, 32), (8, 20), (8, 36), (64, 66), (12, 128)); + + constant CLOCK_FREQ : FREQ := 100 MHz; + signal Clock : std_logic := '1'; + +begin + -- initialize global simulation status + simInitialize; + + simGenerateClock(Clock, CLOCK_FREQ); + + + genInstances : for i in TB_GENERATOR_LIST'range generate + constant INPUT_BITS : positive := TB_GENERATOR_LIST(i).InputBits; + constant OUTPUT_BITS : positive := TB_GENERATOR_LIST(i).OutputBits; + constant OUTPUT_ORDER : T_BIT_ORDER := MSB_FIRST; + constant ADD_INPUT_REGISTERS : boolean := TRUE; + constant ADD_OUTPUT_REGISTERS : boolean := FALSE; + + constant BITS_PER_CHUNK : positive := greatestCommonDivisor(INPUT_BITS, OUTPUT_BITS); + constant INPUT_CHUNKS : positive := INPUT_BITS / BITS_PER_CHUNK; + constant OUTPUT_CHUNKS : positive := OUTPUT_BITS / BITS_PER_CHUNK; + + subtype T_CHUNK is std_logic_vector(BITS_PER_CHUNK - 1 downto 0); + type T_CHUNK_VECTOR is array(natural range <>) of T_CHUNK; + + function to_slv(slvv : T_CHUNK_VECTOR) return std_logic_vector is + variable slv : std_logic_vector((slvv'length * BITS_PER_CHUNK) - 1 downto 0); + begin + for i in slvv'range loop + slv(((i + 1) * BITS_PER_CHUNK) - 1 downto (i * BITS_PER_CHUNK)) := slvv(i); + end loop; + return slv; + end function; + + constant LOOP_COUNT : positive := 64; + constant DELAY : positive := 16; + + signal SyncIn : std_logic; + signal ValidIn : std_logic; + signal DataIn : std_logic_vector(INPUT_BITS - 1 downto 0); + + signal SyncOut : std_logic; + signal ValidOut : std_logic; + signal DataOut : std_logic_vector(OUTPUT_BITS - 1 downto 0); + signal FirstOut : std_logic; + signal LastOut : std_logic; + + constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for " & integer'image(INPUT_BITS) & "->" & INTEGER'image(OUTPUT_BITS)); + + begin + procGenerator : process + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); --, "aaa/bbb/ccc"); --globalSimulationStatus'instance_name); + -- protected type from RandomPkg + variable RandomVar : RandomPType; + + impure function genChunkedRandomValue return std_logic_vector is + variable Temp : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); + begin + for j in 0 to INPUT_CHUNKS - 1 loop + Temp(j) := to_slv(RandomVar.RandInt(0, 2**BITS_PER_CHUNK - 1), BITS_PER_CHUNK); + end loop; + return to_slv(Temp); + end function; + + begin + RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds + + SyncIn <= '0'; + DataIn <= (others => 'U'); + ValidIn <= '0'; + for i in 0 to 7 loop + wait until falling_edge(Clock); + end loop; + + SyncIn <= '1'; + ValidIn <= '1'; + DataIn <= genChunkedRandomValue; + wait until falling_edge(Clock); + + SyncIn <= '0'; + for i in 0 to LOOP_COUNT - 1 loop + DataIn <= genChunkedRandomValue; + ValidIn <= '1'; + wait until falling_edge(Clock); + end loop; + + SyncIn <= '1'; + ValidIn <= '1'; + DataIn <= genChunkedRandomValue; + wait until falling_edge(Clock); + + SyncIn <= '0'; + for i in 0 to LOOP_COUNT - 1 loop + if (i mod 2 = 1) then + DataIn <= genChunkedRandomValue; + ValidIn <= '1'; + else + ValidIn <= '0'; + end if; + wait until falling_edge(Clock); + end loop; + + DataIn <= (others => '0'); + ValidIn <= '0'; + + -- This process is finished + simDeactivateProcess(simProcessID); + wait; -- forever + end process; + + gear : entity PoC.gearbox_Up_cc + generic map ( + INPUT_BITS => INPUT_BITS, + OUTPUT_BITS => OUTPUT_BITS, + META_BITS => 0, --META_BITS, + -- OUTPUT_ORDER => OUTPUT_ORDER, + ADD_INPUT_REGISTERS => ADD_INPUT_REGISTERS, + ADD_OUTPUT_REGISTERS => ADD_OUTPUT_REGISTERS + ) + port map ( + Clock => Clock, + + In_Sync => SyncIn, + In_Valid => ValidIn, + In_Data => DataIn, + In_Meta => (others => '0'), --MetaIn, + + Out_Sync => SyncOut, + Out_Valid => ValidOut, + Out_Data => DataOut, + Out_Meta => open, --MetaOut + Out_First => FirstOut, + Out_Last => LastOut + ); + + procChecker : process + variable simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Checker " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); + variable Check : boolean; + begin + Check := TRUE; + + wait until rising_edge(Clock) and (FirstOut = '1'); + + for i in 0 to LOOP_COUNT - 1 loop + wait until rising_edge(Clock); + -- simAssertion(Check, "TODO: "); + end loop; + + for i in 0 to LOOP_COUNT - 1 loop + wait until rising_edge(Clock); + -- simAssertion(Check, "TODO: "); + end loop; + + for i in 0 to DELAY - 1 loop + wait until rising_edge(Clock); + end loop; + + -- This process is finished + simDeactivateProcess(simProcessID); + simFinalizeTest(simTestID); + wait; -- forever + end process; + end generate; +end architecture; diff --git a/tb/misc/gearbox/gearbox_Up_dc_tb.vhdl b/tb/misc/gearbox/gearbox_Up_dc_tb.vhdl new file mode 100644 index 000000000..d717669d9 --- /dev/null +++ b/tb/misc/gearbox/gearbox_Up_dc_tb.vhdl @@ -0,0 +1,182 @@ +-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- +-- vim: tabstop=2:shiftwidth=2:noexpandtab +-- kate: tab-width 2; replace-tabs off; indent-width 2; +-- +-- ============================================================================= +-- Authors: Patrick Lehmann +-- +-- Testbench: TODO +-- +-- Description: +-- ------------------------------------ +-- TODO +-- +-- License: +-- ============================================================================= +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================= + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +use PoC.math.all; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.physical.all; +-- simulation only packages +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; + +library OSVVM; +use OSVVM.RandomPkg.all; + + +entity gearbox_Up_dc_tb is +end entity; + + +architecture tb of gearbox_Up_dc_tb is + type T_TUPLE is record + InputBits : positive; + OutputBits : positive; + end record; + type T_TUPLE_VECTOR is array(natural range <>) of T_TUPLE; + + constant TB_GENERATOR_LIST : T_TUPLE_VECTOR := ((8, 32), (8, 128)); + +begin + -- initialize global simulation status + simInitialize; + + + genInstances : for i in TB_GENERATOR_LIST'range generate + constant INPUT_BITS : positive := TB_GENERATOR_LIST(i).InputBits; + constant OUTPUT_BITS : positive := TB_GENERATOR_LIST(i).OutputBits; + constant INPUT_ORDER : T_BIT_ORDER := MSB_FIRST; + constant ADD_INPUT_REGISTERS : boolean := TRUE; + constant ADD_OUTPUT_REGISTERS : boolean := FALSE; + + constant RATIO : positive := OUTPUT_BITS / INPUT_BITS; + + constant BITS_PER_CHUNK : positive := greatestCommonDivisor(INPUT_BITS, OUTPUT_BITS); + constant INPUT_CHUNKS : positive := INPUT_BITS / BITS_PER_CHUNK; + constant OUTPUT_CHUNKS : positive := OUTPUT_BITS / BITS_PER_CHUNK; + + subtype T_CHUNK is std_logic_vector(BITS_PER_CHUNK - 1 downto 0); + type T_CHUNK_VECTOR is array(natural range <>) of T_CHUNK; + + function to_slv(slvv : T_CHUNK_VECTOR) return std_logic_vector is + variable slv : std_logic_vector((slvv'length * BITS_PER_CHUNK) - 1 downto 0); + begin + for i in slvv'range loop + slv(((i + 1) * BITS_PER_CHUNK) - 1 downto (i * BITS_PER_CHUNK)) := slvv(i); + end loop; + return slv; + end function; + + constant LOOP_COUNT : positive := 64; + constant DELAY : positive := 16; + + constant CLOCK1_PERIOD : time := 10 ns; + constant CLOCK2_PERIOD : time := CLOCK1_PERIOD * RATIO; + signal Clock1 : std_logic := '1'; + signal Clock2 : std_logic := '1'; + + signal Align : std_logic := '0'; + signal DataIn : std_logic_vector(INPUT_BITS - 1 downto 0); + signal DataOut : std_logic_vector(OUTPUT_BITS - 1 downto 0); + signal Valid : std_logic; + + constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for " & integer'image(INPUT_BITS) & "->" & INTEGER'image(OUTPUT_BITS)); + + begin + -- generate global testbench clock + simGenerateClock(simTestID, Clock1, CLOCK1_PERIOD); + simGenerateClock(simTestID, Clock2, CLOCK2_PERIOD); + + procGenerator : process + -- from Simulation + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); --, "aaa/bbb/ccc"); --globalSimulationStatus'instance_name); + -- protected type from RandomPkg + variable RandomVar : RandomPType; + + impure function genChunkedRandomValue return std_logic_vector is + variable Temp : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); + begin + for j in 0 to INPUT_CHUNKS - 1 loop + Temp(j) := to_slv(RandomVar.RandInt(0, 2**BITS_PER_CHUNK - 1), BITS_PER_CHUNK); + end loop; + return to_slv(Temp); + end function; + begin + RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds + + DataIn <= (others => 'U'); + for i in 0 to (LOOP_COUNT * RATIO) - 1 loop + wait until rising_edge(Clock1); + Align <= to_sl(i = 0); + DataIn <= genChunkedRandomValue; + end loop; + + -- This process is finished + simDeactivateProcess(simProcessID); + wait; -- forever + end process; + + gear : entity PoC.gearbox_Up_dc + generic map ( + INPUT_BITS => INPUT_BITS, + INPUT_ORDER => INPUT_ORDER, + OUTPUT_BITS => OUTPUT_BITS, + ADD_INPUT_REGISTERS => ADD_INPUT_REGISTERS + ) + port map ( + Clock1 => Clock1, + Clock2 => Clock2, + + In_Align => Align, + In_Data => DataIn, + Out_Data => DataOut, + Out_Valid => Valid + ); + + procChecker : process + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Checker " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); --, "aaa/bbb/ccc"); --globalSimulationStatus'instance_name); + + variable Check : boolean; + begin + -- Check := FALSE; + + wait until rising_edge(Clock2) and (Valid = '1'); + + for i in 0 to LOOP_COUNT - 1 loop + wait until rising_edge(Clock2); + -- Check := Check or (Valid = '1'); + end loop; + -- simAssertion(Check, "Valid not asserted."); + + simWaitUntilRisingEdge(simTestID, Clock2, 4); + + -- This process is finished + simDeactivateProcess(simProcessID); + simFinalizeTest(simTestID); + wait; -- forever + end process; + end generate; +end architecture; diff --git a/tb/misc/gearbox/gearbox_down_cc_tb.vhdl b/tb/misc/gearbox/gearbox_down_cc_tb.vhdl deleted file mode 100644 index ed15ec6a9..000000000 --- a/tb/misc/gearbox/gearbox_down_cc_tb.vhdl +++ /dev/null @@ -1,227 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Patrick Lehmann --- --- Testbench: TODO --- --- Description: --- ------------------------------------ --- TODO --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; - -library PoC; -use PoC.math.all; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.physical.all; --- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; - -library OSVVM; -use OSVVM.RandomPkg.all; - - -entity gearbox_down_cc_tb is -end entity; - - -architecture tb of gearbox_down_cc_tb is - type T_TUPLE is record - InputBits : positive; - OutputBits : positive; - end record; - - type T_TUPLE_VECTOR is array(natural range <>) of T_TUPLE; - - constant TB_GENERATOR_LIST : T_TUPLE_VECTOR := ((32, 8), (20, 8), (36, 8), (66, 64), (128, 12)); - - constant CLOCK_FREQ : FREQ := 100 MHz; - signal Clock : std_logic := '1'; - -begin - -- initialize global simulation status - simInitialize; - - simGenerateClock(Clock, CLOCK_FREQ); - - - genInstances : for i in TB_GENERATOR_LIST'range generate - constant INPUT_BITS : positive := TB_GENERATOR_LIST(i).InputBits; - constant OUTPUT_BITS : positive := TB_GENERATOR_LIST(i).OutputBits; - constant OUTPUT_ORDER : T_BIT_ORDER := MSB_FIRST; - constant ADD_INPUT_REGISTERS : boolean := TRUE; - constant ADD_OUTPUT_REGISTERS : boolean := FALSE; - - constant BITS_PER_CHUNK : positive := greatestCommonDivisor(INPUT_BITS, OUTPUT_BITS); - constant INPUT_CHUNKS : positive := INPUT_BITS / BITS_PER_CHUNK; - constant OUTPUT_CHUNKS : positive := OUTPUT_BITS / BITS_PER_CHUNK; - - subtype T_CHUNK is std_logic_vector(BITS_PER_CHUNK - 1 downto 0); - type T_CHUNK_VECTOR is array(natural range <>) of T_CHUNK; - - function to_slv(slvv : T_CHUNK_VECTOR) return std_logic_vector is - variable slv : std_logic_vector((slvv'length * BITS_PER_CHUNK) - 1 downto 0); - begin - for i in slvv'range loop - slv(((i + 1) * BITS_PER_CHUNK) - 1 downto (i * BITS_PER_CHUNK)) := slvv(i); - end loop; - return slv; - end function; - - constant LOOP_COUNT : positive := 64; - constant DELAY : positive := 16; - - signal SyncIn : std_logic; - signal ValidIn : std_logic; - signal DataIn : std_logic_vector(INPUT_BITS - 1 downto 0); - - signal SyncOut : std_logic; - signal ValidOut : std_logic; - signal DataOut : std_logic_vector(OUTPUT_BITS - 1 downto 0); - signal FirstOut : std_logic; - signal LastOut : std_logic; - - constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for " & integer'image(INPUT_BITS) & "->" & INTEGER'image(OUTPUT_BITS)); - - begin - procGenerator : process - -- from Simulation - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); --, "aaa/bbb/ccc"); --globalSimulationStatus'instance_name); - -- protected type from RandomPkg - variable RandomVar : RandomPType; - - impure function genChunkedRandomValue return std_logic_vector is - variable Temp : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); - begin - for j in 0 to INPUT_CHUNKS - 1 loop - Temp(j) := to_slv(RandomVar.RandInt(0, 2**BITS_PER_CHUNK - 1), BITS_PER_CHUNK); - end loop; - return to_slv(Temp); - end function; - - begin - RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds - - SyncIn <= '0'; - DataIn <= (others => 'U'); - ValidIn <= '0'; - for i in 0 to 7 loop - wait until falling_edge(Clock); - end loop; - - SyncIn <= '1'; - ValidIn <= '1'; - DataIn <= genChunkedRandomValue; - wait until falling_edge(Clock); - - SyncIn <= '0'; - for i in 0 to LOOP_COUNT - 1 loop - DataIn <= genChunkedRandomValue; - ValidIn <= '1'; - wait until falling_edge(Clock); - end loop; - - SyncIn <= '1'; - ValidIn <= '1'; - DataIn <= genChunkedRandomValue; - wait until falling_edge(Clock); - - SyncIn <= '0'; - for i in 0 to LOOP_COUNT - 1 loop - if (i mod 2 = 1) then - DataIn <= genChunkedRandomValue; - ValidIn <= '1'; - else - ValidIn <= '0'; - end if; - wait until falling_edge(Clock); - end loop; - - DataIn <= (others => '0'); - ValidIn <= '0'; - - -- This process is finished - simDeactivateProcess(simProcessID); - wait; -- forever - end process; - - gear : entity PoC.gearbox_down_cc - generic map ( - INPUT_BITS => INPUT_BITS, - OUTPUT_BITS => OUTPUT_BITS, - META_BITS => 0, --META_BITS, - -- OUTPUT_ORDER => OUTPUT_ORDER, - ADD_INPUT_REGISTERS => ADD_INPUT_REGISTERS, - ADD_OUTPUT_REGISTERS => ADD_OUTPUT_REGISTERS - ) - port map ( - Clock => Clock, - - In_Sync => SyncIn, - In_Valid => ValidIn, - In_Data => DataIn, - In_Meta => (others => '0'), --MetaIn, - - Out_Sync => SyncOut, - Out_Valid => ValidOut, - Out_Data => DataOut, - Out_Meta => open, --MetaOut - Out_First => FirstOut, - Out_Last => LastOut - ); - - procChecker : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Checker " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); - variable Check : boolean; - begin - Check := TRUE; - - wait until rising_edge(Clock) and (FirstOut = '1'); - - for i in 0 to LOOP_COUNT - 1 loop - wait until rising_edge(Clock); - -- simAssertion(Check, "TODO: "); - end loop; - - for i in 0 to LOOP_COUNT - 1 loop - wait until rising_edge(Clock); - -- simAssertion(Check, "TODO: "); - end loop; - - for i in 0 to DELAY - 1 loop - wait until rising_edge(Clock); - end loop; - - -- This process is finished - simDeactivateProcess(simProcessID); - simFinalizeTest(simTestID); - wait; -- forever - end process; - end generate; -end architecture; diff --git a/tb/misc/gearbox/gearbox_down_dc_tb.vhdl b/tb/misc/gearbox/gearbox_down_dc_tb.vhdl deleted file mode 100644 index 8fe725bee..000000000 --- a/tb/misc/gearbox/gearbox_down_dc_tb.vhdl +++ /dev/null @@ -1,169 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Patrick Lehmann --- --- Testbench: TODO --- --- Description: --- ------------------------------------ --- TODO --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; - -library PoC; -use PoC.math.all; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.physical.all; --- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; - -library OSVVM; -use OSVVM.RandomPkg.all; - - -entity gearbox_down_dc_tb is -end entity; - - -architecture tb of gearbox_down_dc_tb is - type T_TUPLE is record - InputBits : positive; - OutputBits : positive; - end record; - type T_TUPLE_VECTOR is array(natural range <>) of T_TUPLE; - - constant TB_GENERATOR_LIST : T_TUPLE_VECTOR := ((32, 8), (128, 8)); - -begin - -- initialize global simulation status - simInitialize; - - genInstances : for i in TB_GENERATOR_LIST'range generate - constant INPUT_BITS : positive := TB_GENERATOR_LIST(i).InputBits; - constant OUTPUT_BITS : positive := TB_GENERATOR_LIST(i).OutputBits; - constant OUTPUT_ORDER : T_BIT_ORDER := MSB_FIRST; - constant ADD_INPUT_REGISTERS : boolean := TRUE; - constant ADD_OUTPUT_REGISTERS : boolean := TRUE; - - constant RATIO : positive := INPUT_BITS / OUTPUT_BITS; - - constant BITS_PER_CHUNK : positive := greatestCommonDivisor(INPUT_BITS, OUTPUT_BITS); - constant INPUT_CHUNKS : positive := INPUT_BITS / BITS_PER_CHUNK; - constant OUTPUT_CHUNKS : positive := OUTPUT_BITS / BITS_PER_CHUNK; - - subtype T_CHUNK is std_logic_vector(BITS_PER_CHUNK - 1 downto 0); - type T_CHUNK_VECTOR is array(natural range <>) of T_CHUNK; - - function to_slv(slvv : T_CHUNK_VECTOR) return std_logic_vector is - variable slv : std_logic_vector((slvv'length * BITS_PER_CHUNK) - 1 downto 0); - begin - for i in slvv'range loop - slv(((i + 1) * BITS_PER_CHUNK) - 1 downto (i * BITS_PER_CHUNK)) := slvv(i); - end loop; - return slv; - end function; - - constant LOOP_COUNT : positive := 8; - constant DELAY : positive := 5; - - constant CLOCK2_PERIOD : time := 10 ns; - constant CLOCK1_PERIOD : time := CLOCK2_PERIOD * RATIO; - signal Clock1 : std_logic := '1'; - signal Clock2 : std_logic := '1'; - - signal DataIn : std_logic_vector(INPUT_BITS - 1 downto 0); - signal DataOut : std_logic_vector(OUTPUT_BITS - 1 downto 0); - - constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for " & integer'image(INPUT_BITS) & "->" & INTEGER'image(OUTPUT_BITS)); - - begin - -- generate global testbench clock - simGenerateClock(simTestID, Clock1, CLOCK1_PERIOD); - simGenerateClock(simTestID, Clock2, CLOCK2_PERIOD); - - procGenerator : process - -- from Simulation - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); --, "aaa/bbb/ccc"); --globalSimulationStatus'instance_name); - -- protected type from RandomPkg - variable RandomVar : RandomPType; - - impure function genChunkedRandomValue return std_logic_vector is - variable Temp : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); - begin - for j in 0 to INPUT_CHUNKS - 1 loop - Temp(j) := to_slv(RandomVar.RandInt(0, 2**BITS_PER_CHUNK - 1), BITS_PER_CHUNK); - end loop; - return to_slv(Temp); - end function; - begin - RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds - - DataIn <= (others => 'U'); - for i in 0 to LOOP_COUNT - 1 loop - wait until rising_edge(Clock1); - DataIn <= genChunkedRandomValue; - end loop; - - -- This process is finished - simDeactivateProcess(simProcessID); - wait; -- forever - end process; - - gear : entity PoC.gearbox_down_dc - generic map ( - INPUT_BITS => INPUT_BITS, - OUTPUT_BITS => OUTPUT_BITS, - OUTPUT_ORDER => OUTPUT_ORDER, - ADD_INPUT_REGISTERS => ADD_INPUT_REGISTERS, - ADD_OUTPUT_REGISTERS => ADD_OUTPUT_REGISTERS - ) - port map ( - Clock1 => Clock1, - Clock2 => Clock2, - - In_Data => DataIn, - Out_Data => DataOut - ); - - procChecker : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Checker " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); --, "aaa/bbb/ccc"); --globalSimulationStatus'instance_name); - begin - for i in 0 to (LOOP_COUNT * RATIO) - 1 loop - wait until rising_edge(Clock2); - end loop; - - simWaitUntilRisingEdge(simTestID, Clock2, 4); - - -- This process is finished - simDeactivateProcess(simProcessID); - simFinalizeTest(simTestID); - wait; -- forever - end process; - end generate; -end architecture; diff --git a/tb/misc/gearbox/gearbox_up_cc_tb.vhdl b/tb/misc/gearbox/gearbox_up_cc_tb.vhdl deleted file mode 100644 index 19ec53803..000000000 --- a/tb/misc/gearbox/gearbox_up_cc_tb.vhdl +++ /dev/null @@ -1,225 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Patrick Lehmann --- --- Testbench: TODO --- --- Description: --- ------------------------------------ --- TODO --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; - -library PoC; -use PoC.math.all; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.physical.all; --- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; - -library OSVVM; -use OSVVM.RandomPkg.all; - - -entity gearbox_up_cc_tb is -end entity; - - -architecture tb of gearbox_up_cc_tb is - type T_TUPLE is record - InputBits : positive; - OutputBits : positive; - end record; - type T_TUPLE_VECTOR is array(natural range <>) of T_TUPLE; - - constant TB_GENERATOR_LIST : T_TUPLE_VECTOR := ((8, 32), (8, 20), (8, 36), (64, 66), (12, 128)); - - constant CLOCK_FREQ : FREQ := 100 MHz; - signal Clock : std_logic := '1'; - -begin - -- initialize global simulation status - simInitialize; - - simGenerateClock(Clock, CLOCK_FREQ); - - - genInstances : for i in TB_GENERATOR_LIST'range generate - constant INPUT_BITS : positive := TB_GENERATOR_LIST(i).InputBits; - constant OUTPUT_BITS : positive := TB_GENERATOR_LIST(i).OutputBits; - constant OUTPUT_ORDER : T_BIT_ORDER := MSB_FIRST; - constant ADD_INPUT_REGISTERS : boolean := TRUE; - constant ADD_OUTPUT_REGISTERS : boolean := FALSE; - - constant BITS_PER_CHUNK : positive := greatestCommonDivisor(INPUT_BITS, OUTPUT_BITS); - constant INPUT_CHUNKS : positive := INPUT_BITS / BITS_PER_CHUNK; - constant OUTPUT_CHUNKS : positive := OUTPUT_BITS / BITS_PER_CHUNK; - - subtype T_CHUNK is std_logic_vector(BITS_PER_CHUNK - 1 downto 0); - type T_CHUNK_VECTOR is array(natural range <>) of T_CHUNK; - - function to_slv(slvv : T_CHUNK_VECTOR) return std_logic_vector is - variable slv : std_logic_vector((slvv'length * BITS_PER_CHUNK) - 1 downto 0); - begin - for i in slvv'range loop - slv(((i + 1) * BITS_PER_CHUNK) - 1 downto (i * BITS_PER_CHUNK)) := slvv(i); - end loop; - return slv; - end function; - - constant LOOP_COUNT : positive := 64; - constant DELAY : positive := 16; - - signal SyncIn : std_logic; - signal ValidIn : std_logic; - signal DataIn : std_logic_vector(INPUT_BITS - 1 downto 0); - - signal SyncOut : std_logic; - signal ValidOut : std_logic; - signal DataOut : std_logic_vector(OUTPUT_BITS - 1 downto 0); - signal FirstOut : std_logic; - signal LastOut : std_logic; - - constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for " & integer'image(INPUT_BITS) & "->" & INTEGER'image(OUTPUT_BITS)); - - begin - procGenerator : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); --, "aaa/bbb/ccc"); --globalSimulationStatus'instance_name); - -- protected type from RandomPkg - variable RandomVar : RandomPType; - - impure function genChunkedRandomValue return std_logic_vector is - variable Temp : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); - begin - for j in 0 to INPUT_CHUNKS - 1 loop - Temp(j) := to_slv(RandomVar.RandInt(0, 2**BITS_PER_CHUNK - 1), BITS_PER_CHUNK); - end loop; - return to_slv(Temp); - end function; - - begin - RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds - - SyncIn <= '0'; - DataIn <= (others => 'U'); - ValidIn <= '0'; - for i in 0 to 7 loop - wait until falling_edge(Clock); - end loop; - - SyncIn <= '1'; - ValidIn <= '1'; - DataIn <= genChunkedRandomValue; - wait until falling_edge(Clock); - - SyncIn <= '0'; - for i in 0 to LOOP_COUNT - 1 loop - DataIn <= genChunkedRandomValue; - ValidIn <= '1'; - wait until falling_edge(Clock); - end loop; - - SyncIn <= '1'; - ValidIn <= '1'; - DataIn <= genChunkedRandomValue; - wait until falling_edge(Clock); - - SyncIn <= '0'; - for i in 0 to LOOP_COUNT - 1 loop - if (i mod 2 = 1) then - DataIn <= genChunkedRandomValue; - ValidIn <= '1'; - else - ValidIn <= '0'; - end if; - wait until falling_edge(Clock); - end loop; - - DataIn <= (others => '0'); - ValidIn <= '0'; - - -- This process is finished - simDeactivateProcess(simProcessID); - wait; -- forever - end process; - - gear : entity PoC.gearbox_up_cc - generic map ( - INPUT_BITS => INPUT_BITS, - OUTPUT_BITS => OUTPUT_BITS, - META_BITS => 0, --META_BITS, - -- OUTPUT_ORDER => OUTPUT_ORDER, - ADD_INPUT_REGISTERS => ADD_INPUT_REGISTERS, - ADD_OUTPUT_REGISTERS => ADD_OUTPUT_REGISTERS - ) - port map ( - Clock => Clock, - - In_Sync => SyncIn, - In_Valid => ValidIn, - In_Data => DataIn, - In_Meta => (others => '0'), --MetaIn, - - Out_Sync => SyncOut, - Out_Valid => ValidOut, - Out_Data => DataOut, - Out_Meta => open, --MetaOut - Out_First => FirstOut, - Out_Last => LastOut - ); - - procChecker : process - variable simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Checker " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); - variable Check : boolean; - begin - Check := TRUE; - - wait until rising_edge(Clock) and (FirstOut = '1'); - - for i in 0 to LOOP_COUNT - 1 loop - wait until rising_edge(Clock); - -- simAssertion(Check, "TODO: "); - end loop; - - for i in 0 to LOOP_COUNT - 1 loop - wait until rising_edge(Clock); - -- simAssertion(Check, "TODO: "); - end loop; - - for i in 0 to DELAY - 1 loop - wait until rising_edge(Clock); - end loop; - - -- This process is finished - simDeactivateProcess(simProcessID); - simFinalizeTest(simTestID); - wait; -- forever - end process; - end generate; -end architecture; diff --git a/tb/misc/gearbox/gearbox_up_dc_tb.vhdl b/tb/misc/gearbox/gearbox_up_dc_tb.vhdl deleted file mode 100644 index d378782db..000000000 --- a/tb/misc/gearbox/gearbox_up_dc_tb.vhdl +++ /dev/null @@ -1,182 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Patrick Lehmann --- --- Testbench: TODO --- --- Description: --- ------------------------------------ --- TODO --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; - -library PoC; -use PoC.math.all; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.physical.all; --- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; - -library OSVVM; -use OSVVM.RandomPkg.all; - - -entity gearbox_up_dc_tb is -end entity; - - -architecture tb of gearbox_up_dc_tb is - type T_TUPLE is record - InputBits : positive; - OutputBits : positive; - end record; - type T_TUPLE_VECTOR is array(natural range <>) of T_TUPLE; - - constant TB_GENERATOR_LIST : T_TUPLE_VECTOR := ((8, 32), (8, 128)); - -begin - -- initialize global simulation status - simInitialize; - - - genInstances : for i in TB_GENERATOR_LIST'range generate - constant INPUT_BITS : positive := TB_GENERATOR_LIST(i).InputBits; - constant OUTPUT_BITS : positive := TB_GENERATOR_LIST(i).OutputBits; - constant INPUT_ORDER : T_BIT_ORDER := MSB_FIRST; - constant ADD_INPUT_REGISTERS : boolean := TRUE; - constant ADD_OUTPUT_REGISTERS : boolean := FALSE; - - constant RATIO : positive := OUTPUT_BITS / INPUT_BITS; - - constant BITS_PER_CHUNK : positive := greatestCommonDivisor(INPUT_BITS, OUTPUT_BITS); - constant INPUT_CHUNKS : positive := INPUT_BITS / BITS_PER_CHUNK; - constant OUTPUT_CHUNKS : positive := OUTPUT_BITS / BITS_PER_CHUNK; - - subtype T_CHUNK is std_logic_vector(BITS_PER_CHUNK - 1 downto 0); - type T_CHUNK_VECTOR is array(natural range <>) of T_CHUNK; - - function to_slv(slvv : T_CHUNK_VECTOR) return std_logic_vector is - variable slv : std_logic_vector((slvv'length * BITS_PER_CHUNK) - 1 downto 0); - begin - for i in slvv'range loop - slv(((i + 1) * BITS_PER_CHUNK) - 1 downto (i * BITS_PER_CHUNK)) := slvv(i); - end loop; - return slv; - end function; - - constant LOOP_COUNT : positive := 64; - constant DELAY : positive := 16; - - constant CLOCK1_PERIOD : time := 10 ns; - constant CLOCK2_PERIOD : time := CLOCK1_PERIOD * RATIO; - signal Clock1 : std_logic := '1'; - signal Clock2 : std_logic := '1'; - - signal Align : std_logic := '0'; - signal DataIn : std_logic_vector(INPUT_BITS - 1 downto 0); - signal DataOut : std_logic_vector(OUTPUT_BITS - 1 downto 0); - signal Valid : std_logic; - - constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for " & integer'image(INPUT_BITS) & "->" & INTEGER'image(OUTPUT_BITS)); - - begin - -- generate global testbench clock - simGenerateClock(simTestID, Clock1, CLOCK1_PERIOD); - simGenerateClock(simTestID, Clock2, CLOCK2_PERIOD); - - procGenerator : process - -- from Simulation - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); --, "aaa/bbb/ccc"); --globalSimulationStatus'instance_name); - -- protected type from RandomPkg - variable RandomVar : RandomPType; - - impure function genChunkedRandomValue return std_logic_vector is - variable Temp : T_CHUNK_VECTOR(INPUT_CHUNKS - 1 downto 0); - begin - for j in 0 to INPUT_CHUNKS - 1 loop - Temp(j) := to_slv(RandomVar.RandInt(0, 2**BITS_PER_CHUNK - 1), BITS_PER_CHUNK); - end loop; - return to_slv(Temp); - end function; - begin - RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds - - DataIn <= (others => 'U'); - for i in 0 to (LOOP_COUNT * RATIO) - 1 loop - wait until rising_edge(Clock1); - Align <= to_sl(i = 0); - DataIn <= genChunkedRandomValue; - end loop; - - -- This process is finished - simDeactivateProcess(simProcessID); - wait; -- forever - end process; - - gear : entity PoC.gearbox_up_dc - generic map ( - INPUT_BITS => INPUT_BITS, - INPUT_ORDER => INPUT_ORDER, - OUTPUT_BITS => OUTPUT_BITS, - ADD_INPUT_REGISTERS => ADD_INPUT_REGISTERS - ) - port map ( - Clock1 => Clock1, - Clock2 => Clock2, - - In_Align => Align, - In_Data => DataIn, - Out_Data => DataOut, - Out_Valid => Valid - ); - - procChecker : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Checker " & integer'image(i) & " for " & INTEGER'image(INPUT_BITS) & "->" & integer'image(OUTPUT_BITS)); --, "aaa/bbb/ccc"); --globalSimulationStatus'instance_name); - - variable Check : boolean; - begin - -- Check := FALSE; - - wait until rising_edge(Clock2) and (Valid = '1'); - - for i in 0 to LOOP_COUNT - 1 loop - wait until rising_edge(Clock2); - -- Check := Check or (Valid = '1'); - end loop; - -- simAssertion(Check, "Valid not asserted."); - - simWaitUntilRisingEdge(simTestID, Clock2, 4); - - -- This process is finished - simDeactivateProcess(simProcessID); - simFinalizeTest(simTestID); - wait; -- forever - end process; - end generate; -end architecture; diff --git a/tb/misc/misc_bit_lz_tb.vhdl b/tb/misc/misc_bit_lz_tb.vhdl index 50b3cf8ae..3cf281730 100644 --- a/tb/misc/misc_bit_lz_tb.vhdl +++ b/tb/misc/misc_bit_lz_tb.vhdl @@ -33,134 +33,134 @@ entity misc_bit_lz_tb is end entity; -use std.textio.all; +use std.textio.all; library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; architecture tb of misc_bit_lz_tb is - constant COUNT_BITS : positive := 7; - constant OFFSET_BITS : positive := 8; - - constant DATA : std_logic_vector := x"72B6C9B5_25D92DCA_DB26DFFF"; - - component misc_bit_lz is - generic( - COUNT_BITS : positive; - OFFSET_BITS : positive - ); - port( - -- Global Control - clk : in std_logic; - rst : in std_logic; - - -- Data Input - din : in std_logic; - put : in std_logic; - flush : in std_logic; - - -- Data Output - odat : out std_logic_vector(COUNT_BITS+OFFSET_BITS downto 0); - ostb : out std_logic - ); - end component; - - signal clk : std_logic; - signal rst : std_logic; - - signal din : std_logic; - signal put : std_logic; - signal flush : std_logic; - - signal odat : std_logic_vector(COUNT_BITS+OFFSET_BITS downto 0); - signal ostb : std_logic; + constant COUNT_BITS : positive := 7; + constant OFFSET_BITS : positive := 8; + + constant DATA : std_logic_vector := x"72B6C9B5_25D92DCA_DB26DFFF"; + + component misc_bit_lz is + generic( + COUNT_BITS : positive; + OFFSET_BITS : positive + ); + port( + -- Global Control + clk : in std_logic; + rst : in std_logic; + + -- Data Input + din : in std_logic; + put : in std_logic; + flush : in std_logic; + + -- Data Output + odat : out std_logic_vector(COUNT_BITS+OFFSET_BITS downto 0); + ostb : out std_logic + ); + end component; + + signal clk : std_logic; + signal rst : std_logic; + + signal din : std_logic; + signal put : std_logic; + signal flush : std_logic; + + signal odat : std_logic_vector(COUNT_BITS+OFFSET_BITS downto 0); + signal ostb : std_logic; begin - DUT: misc_bit_lz - generic map ( - COUNT_BITS => COUNT_BITS, - OFFSET_BITS => OFFSET_BITS - ) - port map ( - clk => clk, - rst => rst, - din => din, - put => put, - flush => flush, - odat => odat, - ostb => ostb - ); - - -- Stimuli - process - procedure cycle is - begin - clk <= '0'; - wait for 5 ns; - clk <= '1'; - wait for 5 ns; - end procedure cycle; - begin - rst <= '1'; - cycle; - rst <= '0'; - put <= '0'; - flush <= '0'; - cycle; - - put <= '1'; - for i in DATA'range loop - din <= DATA(i); - cycle; - end loop; - - put <= '0'; - flush <= '1'; - cycle; - - flush <= '0'; - cycle; - cycle; - - wait; -- forever - end process; - - -- Output Parsing - process - variable l : line; - begin - wait until rising_edge(clk); - assert rst = '1' or not Is_X(ostb) - report "Unknown ostb output." - severity error; - - if ostb = '1' then - if odat(odat'left) = '1' then - -- Literal - write(l, string'("L: ")); - for i in odat'left-1 downto 0 loop - write(l, to_bit(odat(i))); - end loop; - elsif odat(odat'left-1 downto OFFSET_BITS) /= (1 to COUNT_BITS => '1') then - -- Repetition - write(l, string'("R: ")); - write(l, to_integer(unsigned(odat(odat'left-1 downto OFFSET_BITS)))+COUNT_BITS+OFFSET_BITS); - write(l, string'(" @")); - write(l, to_integer(unsigned(odat(OFFSET_BITS-1 downto 0)))); - else - -- End Marker - write(l, string'("E: ")); - if odat(OFFSET_BITS-1) = '0' then - write(l, std_logic'image(odat(0))); - else - write(l, '<'); - write(l, to_integer(unsigned(not odat(OFFSET_BITS-1 downto 0)))); - end if; - end if; - writeline(output, l); - end if; - end process; + DUT: misc_bit_lz + generic map ( + COUNT_BITS => COUNT_BITS, + OFFSET_BITS => OFFSET_BITS + ) + port map ( + clk => clk, + rst => rst, + din => din, + put => put, + flush => flush, + odat => odat, + ostb => ostb + ); + + -- Stimuli + process + procedure cycle is + begin + clk <= '0'; + wait for 5 ns; + clk <= '1'; + wait for 5 ns; + end procedure cycle; + begin + rst <= '1'; + cycle; + rst <= '0'; + put <= '0'; + flush <= '0'; + cycle; + + put <= '1'; + for i in DATA'range loop + din <= DATA(i); + cycle; + end loop; + + put <= '0'; + flush <= '1'; + cycle; + + flush <= '0'; + cycle; + cycle; + + wait; -- forever + end process; + + -- Output Parsing + process + variable l : line; + begin + wait until rising_edge(clk); + assert rst = '1' or not Is_X(ostb) + report "Unknown ostb output." + severity error; + + if ostb = '1' then + if odat(odat'left) = '1' then + -- Literal + write(l, string'("L: ")); + for i in odat'left-1 downto 0 loop + write(l, to_bit(odat(i))); + end loop; + elsif odat(odat'left-1 downto OFFSET_BITS) /= (1 to COUNT_BITS => '1') then + -- Repetition + write(l, string'("R: ")); + write(l, to_integer(unsigned(odat(odat'left-1 downto OFFSET_BITS)))+COUNT_BITS+OFFSET_BITS); + write(l, string'(" @")); + write(l, to_integer(unsigned(odat(OFFSET_BITS-1 downto 0)))); + else + -- End Marker + write(l, string'("E: ")); + if odat(OFFSET_BITS-1) = '0' then + write(l, std_logic'image(odat(0))); + else + write(l, '<'); + write(l, to_integer(unsigned(not odat(OFFSET_BITS-1 downto 0)))); + end if; + end if; + writeline(output, l); + end if; + end process; end architecture tb; diff --git a/tb/misc/stat/stat_Average_tb.vhdl b/tb/misc/stat/stat_Average_tb.vhdl index 5d7be6b4c..d4a7d54fd 100644 --- a/tb/misc/stat/stat_Average_tb.vhdl +++ b/tb/misc/stat/stat_Average_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Testbench: for PoC.misc.stat.Average +-- Testbench: for PoC.misc.stat.Average -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,18 +29,18 @@ -- limitations under the License. -- ============================================================================= -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -library PoC; -use poC.utils.all; -use poC.vectors.all; -use poC.physical.all; +library PoC; +use poC.utils.all; +use poC.vectors.all; +use poC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; entity stat_Average_tb is @@ -48,10 +48,10 @@ end entity; architecture tb of stat_Average_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; + constant CLOCK_FREQ : FREQ := 100 MHz; - -- component generics - constant VALUES : T_NATVEC := ( + -- component generics + constant VALUES : T_NATVEC := ( 113, 106, 126, 239, 146, 72, 51, 210, 44, 56, 10, 126, 7, 7, 22, 18, 128, 217, 106, 210, 58, 71, 213, 206, 169, 213, 90, 27, 166, 159, 83, 116, 246, 208, 105, 64, 112, 12, 110, 10, 5, 100, 12, 231, 191, 235, 27, 143, @@ -87,67 +87,67 @@ architecture tb of stat_Average_tb is ); type T_RESULT is record - Minimum : natural; - Count : positive; + Minimum : natural; + Count : positive; end record; - type T_RESULT_VECTOR is array(natural range <>) of T_RESULT; + type T_RESULT_VECTOR is array(natural range <>) of T_RESULT; - constant DATA_BITS : positive := 8; - constant COUNTER_BITS : positive := 16; - constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for DATA_BITS=" & integer'image(DATA_BITS) & " COUNTER_BITS=" & INTEGER'image(COUNTER_BITS)); + constant DATA_BITS : positive := 8; + constant COUNTER_BITS : positive := 16; + constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for DATA_BITS=" & integer'image(DATA_BITS) & " COUNTER_BITS=" & INTEGER'image(COUNTER_BITS)); - -- component ports - signal Clock : std_logic; - signal Reset : std_logic; + -- component ports + signal Clock : std_logic; + signal Reset : std_logic; - signal Enable : std_logic := '0'; - signal DataIn : std_logic_vector(DATA_BITS - 1 downto 0); + signal Enable : std_logic := '0'; + signal DataIn : std_logic_vector(DATA_BITS - 1 downto 0); - signal Count : std_logic_vector(COUNTER_BITS - 1 downto 0); - signal Sum : std_logic_vector(COUNTER_BITS - 1 downto 0); - signal Average : std_logic_vector(COUNTER_BITS - 1 downto 0); - signal Valid : std_logic; + signal Count : std_logic_vector(COUNTER_BITS - 1 downto 0); + signal Sum : std_logic_vector(COUNTER_BITS - 1 downto 0); + signal Average : std_logic_vector(COUNTER_BITS - 1 downto 0); + signal Valid : std_logic; begin -- initialize global simulation status simInitialize; -- generate global testbench clock - simGenerateClock(simTestID, Clock, CLOCK_FREQ); - simGenerateWaveform(simTestID, Reset, simGenerateWaveform_Reset(Pause => 5 ns, ResetPulse => 10 ns)); - simGenerateWaveform(simTestID, Enable, simGenerateWaveform_Reset(Pause => 25 ns, ResetPulse => (VALUES'length * 10 ns))); - - -- component instantiation - UUT: entity PoC.stat_Average - generic map ( - DATA_BITS => DATA_BITS, - COUNTER_BITS => COUNTER_BITS - ) - port map ( - Clock => Clock, - Reset => Reset, - - Enable => Enable, - DataIn => DataIn, - - Count => Count, - Sum => Sum, - Average => Average, - Valid => Valid - ); + simGenerateClock(simTestID, Clock, CLOCK_FREQ); + simGenerateWaveform(simTestID, Reset, simGenerateWaveform_Reset(Pause => 5 ns, ResetPulse => 10 ns)); + simGenerateWaveform(simTestID, Enable, simGenerateWaveform_Reset(Pause => 25 ns, ResetPulse => (VALUES'length * 10 ns))); + + -- component instantiation + UUT: entity PoC.stat_Average + generic map ( + DATA_BITS => DATA_BITS, + COUNTER_BITS => COUNTER_BITS + ) + port map ( + Clock => Clock, + Reset => Reset, + + Enable => Enable, + DataIn => DataIn, + + Count => Count, + Sum => Sum, + Average => Average, + Valid => Valid + ); procStimuli : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator and Checker"); - variable ExpectedCnt : natural; - variable ExpectedSum : natural; - variable ExpectedAvg : natural; + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator and Checker"); + variable ExpectedCnt : natural; + variable ExpectedSum : natural; + variable ExpectedAvg : natural; begin - DataIn <= (others => '0'); + DataIn <= (others => '0'); wait until (Enable = '1') and falling_edge(Clock); for i in VALUES'range loop - --Enable <= to_sl(VALUES(i) /= 35); - DataIn <= to_slv(VALUES(i), DataIn'length); + --Enable <= to_sl(VALUES(i) /= 35); + DataIn <= to_slv(VALUES(i), DataIn'length); wait until falling_edge(Clock); end loop; diff --git a/tb/misc/stat/stat_Histogram_tb.vhdl b/tb/misc/stat/stat_Histogram_tb.vhdl index c95c0fed6..9cd16adf8 100644 --- a/tb/misc/stat/stat_Histogram_tb.vhdl +++ b/tb/misc/stat/stat_Histogram_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Testbench: for PoC.misc.stat.Histogram +-- Testbench: for PoC.misc.stat.Histogram -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,92 +29,92 @@ -- limitations under the License. -- ============================================================================= -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; -use IEEE.math_real.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use IEEE.math_real.all; -library PoC; -use poC.utils.all; -use poC.strings.all; -use poC.vectors.all; -use poC.physical.all; +library PoC; +use poC.utils.all; +use poC.strings.all; +use poC.vectors.all; +use poC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.sim_random.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.sim_random.all; +use PoC.simulation.all; +use PoC.waveform.all; -use PoC.sim_global.all; -use PoC.FileIO.all; +use PoC.sim_global.all; +use PoC.FileIO.all; entity stat_Histogram_tb is end entity; architecture tb of stat_Histogram_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; + constant CLOCK_FREQ : FREQ := 100 MHz; - constant GNUPLOT_DATA_FILE : string := "stat_Histogram.dat"; + constant GNUPLOT_DATA_FILE : string := "stat_Histogram.dat"; - -- component generics - constant DATA_BITS : positive := 8; - constant COUNTER_BITS : positive := 8; - constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for DATA_BITS=" & integer'image(DATA_BITS)); + -- component generics + constant DATA_BITS : positive := 8; + constant COUNTER_BITS : positive := 8; + constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for DATA_BITS=" & integer'image(DATA_BITS)); - constant RESULT : T_INTVEC := (0 to (2**DATA_BITS - 1) => 3); - constant SIM_COUNT : positive := 10; + constant RESULT : T_INTVEC := (0 to (2**DATA_BITS - 1) => 3); + constant SIM_COUNT : positive := 10; - -- component ports - signal Clock : std_logic; - signal Reset : std_logic; + -- component ports + signal Clock : std_logic; + signal Reset : std_logic; - signal Enable : std_logic; - signal DataIn : std_logic_vector(DATA_BITS - 1 downto 0); + signal Enable : std_logic; + signal DataIn : std_logic_vector(DATA_BITS - 1 downto 0); - signal Histogram : T_SLM(2**DATA_BITS - 1 downto 0, COUNTER_BITS - 1 downto 0); - signal Histogram_slvv : T_SLVV_8(2**DATA_BITS - 1 downto 0); + signal Histogram : T_SLM(2**DATA_BITS - 1 downto 0, COUNTER_BITS - 1 downto 0); + signal Histogram_slvv : T_SLVV_8(2**DATA_BITS - 1 downto 0); begin -- initialize global simulation status simInitialize; -- generate global testbench clock - simGenerateClock(simTestID, Clock, CLOCK_FREQ); - simGenerateWaveform(simTestID, Reset, simGenerateWaveform_Reset(Pause => 5 ns, ResetPulse => 10 ns)); - simGenerateWaveform(simTestID, Enable, simGenerateWaveform_Reset(Pause => 25 ns, ResetPulse => ((1024 * SIM_COUNT) * 10 ns))); -- (VALUES'length * 10 ns))); + simGenerateClock(simTestID, Clock, CLOCK_FREQ); + simGenerateWaveform(simTestID, Reset, simGenerateWaveform_Reset(Pause => 5 ns, ResetPulse => 10 ns)); + simGenerateWaveform(simTestID, Enable, simGenerateWaveform_Reset(Pause => 25 ns, ResetPulse => ((1024 * SIM_COUNT) * 10 ns))); -- (VALUES'length * 10 ns))); - -- component instantiation - UUT: entity PoC.stat_Histogram - generic map ( - DATA_BITS => DATA_BITS, - COUNTER_BITS => COUNTER_BITS - ) - port map ( - Clock => Clock, - Reset => Reset, + -- component instantiation + UUT: entity PoC.stat_Histogram + generic map ( + DATA_BITS => DATA_BITS, + COUNTER_BITS => COUNTER_BITS + ) + port map ( + Clock => Clock, + Reset => Reset, - Enable => Enable, - DataIn => DataIn, + Enable => Enable, + DataIn => DataIn, - Histogram => Histogram - ); + Histogram => Histogram + ); - Histogram_slvv <= to_slvv_8(Histogram); + Histogram_slvv <= to_slvv_8(Histogram); procStimuli : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator and Checker"); - variable RandomValue_real : REAL; - variable RandomValue_int : integer; - variable good : boolean; - - constant StandardDeviation : REAL := 0.8; - constant Mean : REAL := 0.0; - constant Span : REAL := 5.0; - constant LowerBound : REAL := -(Span / 2.0) + Mean; - constant UpperBound : REAL := +(Span / 2.0) + Mean; - constant Scaler : REAL := (2.0 ** DATA_BITS) / Span; - constant Move : REAL := 2.0 ** (DATA_BITS - 1); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator and Checker"); + variable RandomValue_real : REAL; + variable RandomValue_int : integer; + variable good : boolean; + + constant StandardDeviation : REAL := 0.8; + constant Mean : REAL := 0.0; + constant Span : REAL := 5.0; + constant LowerBound : REAL := -(Span / 2.0) + Mean; + constant UpperBound : REAL := +(Span / 2.0) + Mean; + constant Scaler : REAL := (2.0 ** DATA_BITS) / Span; + constant Move : REAL := 2.0 ** (DATA_BITS - 1); variable random : T_RANDOM; variable logfile : T_LOGFILE; @@ -122,7 +122,7 @@ begin random.setSeed; logfile.OpenFile(GNUPLOT_DATA_FILE); - DataIn <= (others => '0'); + DataIn <= (others => '0'); wait until (Enable = '1') and falling_edge(Clock); for i in 0 to SIM_COUNT-1 loop @@ -132,8 +132,8 @@ begin for j in 0 to 1023 loop -- uniform distribution - RandomValue_int := random.getUniformDistributedValue(0, 2**DATA_BITS - 1); - DataIn <= to_slv(RandomValue_int, DATA_BITS); + RandomValue_int := random.getUniformDistributedValue(0, 2**DATA_BITS - 1); + DataIn <= to_slv(RandomValue_int, DATA_BITS); wait until falling_edge(Clock); end loop; diff --git a/tb/misc/stat/stat_Maximum_tb.vhdl b/tb/misc/stat/stat_Maximum_tb.vhdl index d26ce000b..d41cac9d4 100644 --- a/tb/misc/stat/stat_Maximum_tb.vhdl +++ b/tb/misc/stat/stat_Maximum_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Testbench: for PoC.misc.stat.Maximum +-- Testbench: for PoC.misc.stat.Maximum -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,18 +29,18 @@ -- limitations under the License. -- ============================================================================= -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -library PoC; -use poC.utils.all; -use poC.vectors.all; -use poC.physical.all; +library PoC; +use poC.utils.all; +use poC.vectors.all; +use poC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; entity stat_Maximum_tb is @@ -48,10 +48,10 @@ end entity; architecture tb of stat_Maximum_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; + constant CLOCK_FREQ : FREQ := 100 MHz; - -- component generics - constant VALUES : T_NATVEC := ( + -- component generics + constant VALUES : T_NATVEC := ( 113, 106, 126, 239, 146, 72, 51, 210, 44, 56, 10, 126, 7, 7, 22, 18, 128, 217, 106, 210, 58, 71, 213, 206, 169, 213, 90, 27, 166, 159, 83, 116, 246, 208, 105, 64, 112, 12, 110, 10, 5, 100, 12, 231, 191, 235, 27, 143, @@ -87,82 +87,82 @@ architecture tb of stat_Maximum_tb is ); type T_RESULT is record - Maximum : natural; - Count : positive; + Maximum : natural; + Count : positive; end record; - type T_RESULT_VECTOR is array(natural range <>) of T_RESULT; - - constant RESULT : T_RESULT_VECTOR := ( - (Maximum => 249, Count => 2), - (Maximum => 248, Count => 1), - (Maximum => 247, Count => 2), - (Maximum => 246, Count => 1), - (Maximum => 244, Count => 2), - (Maximum => 243, Count => 3), - (Maximum => 242, Count => 3), - (Maximum => 240, Count => 2) + type T_RESULT_VECTOR is array(natural range <>) of T_RESULT; + + constant RESULT : T_RESULT_VECTOR := ( + (Maximum => 249, Count => 2), + (Maximum => 248, Count => 1), + (Maximum => 247, Count => 2), + (Maximum => 246, Count => 1), + (Maximum => 244, Count => 2), + (Maximum => 243, Count => 3), + (Maximum => 242, Count => 3), + (Maximum => 240, Count => 2) ); - constant DEPTH : positive := RESULT'length; - constant DATA_BITS : positive := 8; - constant COUNTER_BITS : positive := 4; - constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for DEPTH=" & integer'image(DEPTH)); + constant DEPTH : positive := RESULT'length; + constant DATA_BITS : positive := 8; + constant COUNTER_BITS : positive := 4; + constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for DEPTH=" & integer'image(DEPTH)); - -- component ports - signal Clock : std_logic; - signal Reset : std_logic; + -- component ports + signal Clock : std_logic; + signal Reset : std_logic; - signal Enable : std_logic := '0'; - signal DataIn : std_logic_vector(DATA_BITS - 1 downto 0); + signal Enable : std_logic := '0'; + signal DataIn : std_logic_vector(DATA_BITS - 1 downto 0); - signal Valids : std_logic_vector(DEPTH - 1 downto 0); - signal Maximums : T_SLM(DEPTH - 1 downto 0, DATA_BITS - 1 downto 0); - signal Counts : T_SLM(DEPTH - 1 downto 0, COUNTER_BITS - 1 downto 0); + signal Valids : std_logic_vector(DEPTH - 1 downto 0); + signal Maximums : T_SLM(DEPTH - 1 downto 0, DATA_BITS - 1 downto 0); + signal Counts : T_SLM(DEPTH - 1 downto 0, COUNTER_BITS - 1 downto 0); - signal Maximums_slvv : T_SLVV_8(DEPTH - 1 downto 0); - signal Counts_slvv : T_SLVV_4(DEPTH - 1 downto 0); + signal Maximums_slvv : T_SLVV_8(DEPTH - 1 downto 0); + signal Counts_slvv : T_SLVV_4(DEPTH - 1 downto 0); begin -- initialize global simulation status simInitialize; -- generate global testbench clock - simGenerateClock(simTestID, Clock, CLOCK_FREQ); - simGenerateWaveform(simTestID, Reset, simGenerateWaveform_Reset(Pause => 5 ns, ResetPulse => 10 ns)); - simGenerateWaveform(simTestID, Enable, simGenerateWaveform_Reset(Pause => 25 ns, ResetPulse => (VALUES'length * 10 ns))); - - -- component instantiation - UUT: entity PoC.stat_Maximum - generic map ( - DEPTH => DEPTH, - DATA_BITS => DATA_BITS, - COUNTER_BITS => COUNTER_BITS - ) - port map ( - Clock => Clock, - Reset => Reset, - - Enable => Enable, - DataIn => DataIn, - - Valids => Valids, - Maximums => Maximums, - Counts => Counts - ); - - Maximums_slvv <= to_slvv_8(Maximums); - Counts_slvv <= to_slvv_4(Counts); + simGenerateClock(simTestID, Clock, CLOCK_FREQ); + simGenerateWaveform(simTestID, Reset, simGenerateWaveform_Reset(Pause => 5 ns, ResetPulse => 10 ns)); + simGenerateWaveform(simTestID, Enable, simGenerateWaveform_Reset(Pause => 25 ns, ResetPulse => (VALUES'length * 10 ns))); + + -- component instantiation + UUT: entity PoC.stat_Maximum + generic map ( + DEPTH => DEPTH, + DATA_BITS => DATA_BITS, + COUNTER_BITS => COUNTER_BITS + ) + port map ( + Clock => Clock, + Reset => Reset, + + Enable => Enable, + DataIn => DataIn, + + Valids => Valids, + Maximums => Maximums, + Counts => Counts + ); + + Maximums_slvv <= to_slvv_8(Maximums); + Counts_slvv <= to_slvv_4(Counts); procStimuli : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator and Checker"); - variable good : boolean; + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator and Checker"); + variable good : boolean; begin - DataIn <= (others => '0'); + DataIn <= (others => '0'); wait until (Enable = '1') and falling_edge(Clock); for i in VALUES'range loop - --Enable <= to_sl(VALUES(i) /= 35); - DataIn <= to_slv(VALUES(i), DataIn'length); + --Enable <= to_sl(VALUES(i) /= 35); + DataIn <= to_slv(VALUES(i), DataIn'length); wait until falling_edge(Clock); end loop; @@ -171,7 +171,7 @@ begin -- test result after all cycles good := (slv_and(Valids) = '1'); for i in RESULT'range loop - good := good and (RESULT(i).Maximum = unsigned(Maximums_slvv(i))) and (RESULT(i).Count = unsigned(Counts_slvv(i))); + good := good and (RESULT(i).Maximum = unsigned(Maximums_slvv(i))) and (RESULT(i).Count = unsigned(Counts_slvv(i))); end loop; simAssertion(good, "Test failed."); diff --git a/tb/misc/stat/stat_Minimum_tb.vhdl b/tb/misc/stat/stat_Minimum_tb.vhdl index e71ff99d7..510783a6d 100644 --- a/tb/misc/stat/stat_Minimum_tb.vhdl +++ b/tb/misc/stat/stat_Minimum_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Testbench: for PoC.misc.stat.Minimum +-- Testbench: for PoC.misc.stat.Minimum -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -29,18 +29,18 @@ -- limitations under the License. -- ============================================================================= -library IEEE; -use IEEE.std_logic_1164.all; -use IEEE.numeric_std.all; +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; -library PoC; -use poC.utils.all; -use poC.vectors.all; -use poC.physical.all; +library PoC; +use poC.utils.all; +use poC.vectors.all; +use poC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; entity stat_Minimum_tb is @@ -48,10 +48,10 @@ end entity; architecture tb of stat_Minimum_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; + constant CLOCK_FREQ : FREQ := 100 MHz; - -- component generics - constant VALUES : T_NATVEC := ( + -- component generics + constant VALUES : T_NATVEC := ( 113, 106, 126, 239, 146, 72, 51, 210, 44, 56, 10, 126, 7, 7, 22, 18, 128, 217, 106, 210, 58, 71, 213, 206, 169, 213, 90, 27, 166, 159, 83, 116, 246, 208, 105, 64, 112, 12, 110, 10, 5, 100, 12, 231, 191, 235, 27, 143, @@ -87,82 +87,82 @@ architecture tb of stat_Minimum_tb is ); type T_RESULT is record - Minimum : natural; - Count : positive; + Minimum : natural; + Count : positive; end record; - type T_RESULT_VECTOR is array(natural range <>) of T_RESULT; - - constant RESULT : T_RESULT_VECTOR := ( - (Minimum => 3, Count => 1), - (Minimum => 5, Count => 3), - (Minimum => 7, Count => 6), - (Minimum => 9, Count => 1), - (Minimum => 10, Count => 4), - (Minimum => 11, Count => 2), - (Minimum => 12, Count => 7), - (Minimum => 13, Count => 3) + type T_RESULT_VECTOR is array(natural range <>) of T_RESULT; + + constant RESULT : T_RESULT_VECTOR := ( + (Minimum => 3, Count => 1), + (Minimum => 5, Count => 3), + (Minimum => 7, Count => 6), + (Minimum => 9, Count => 1), + (Minimum => 10, Count => 4), + (Minimum => 11, Count => 2), + (Minimum => 12, Count => 7), + (Minimum => 13, Count => 3) ); - constant DEPTH : positive := RESULT'length; - constant DATA_BITS : positive := 8; - constant COUNTER_BITS : positive := 4; - constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for DEPTH=" & integer'image(DEPTH)); + constant DEPTH : positive := RESULT'length; + constant DATA_BITS : positive := 8; + constant COUNTER_BITS : positive := 4; + constant simTestID : T_SIM_TEST_ID := simCreateTest("Test setup for DEPTH=" & integer'image(DEPTH)); - -- component ports - signal Clock : std_logic; - signal Reset : std_logic; + -- component ports + signal Clock : std_logic; + signal Reset : std_logic; - signal Enable : std_logic := '0'; - signal DataIn : std_logic_vector(DATA_BITS - 1 downto 0); + signal Enable : std_logic := '0'; + signal DataIn : std_logic_vector(DATA_BITS - 1 downto 0); - signal Valids : std_logic_vector(DEPTH - 1 downto 0); - signal Minimums : T_SLM(DEPTH - 1 downto 0, DATA_BITS - 1 downto 0); - signal Counts : T_SLM(DEPTH - 1 downto 0, COUNTER_BITS - 1 downto 0); + signal Valids : std_logic_vector(DEPTH - 1 downto 0); + signal Minimums : T_SLM(DEPTH - 1 downto 0, DATA_BITS - 1 downto 0); + signal Counts : T_SLM(DEPTH - 1 downto 0, COUNTER_BITS - 1 downto 0); - signal Minimums_slvv : T_SLVV_8(DEPTH - 1 downto 0); - signal Counts_slvv : T_SLVV_4(DEPTH - 1 downto 0); + signal Minimums_slvv : T_SLVV_8(DEPTH - 1 downto 0); + signal Counts_slvv : T_SLVV_4(DEPTH - 1 downto 0); begin -- initialize global simulation status simInitialize; -- generate global testbench clock - simGenerateClock(simTestID, Clock, CLOCK_FREQ); - simGenerateWaveform(simTestID, Reset, simGenerateWaveform_Reset(Pause => 5 ns, ResetPulse => 10 ns)); - simGenerateWaveform(simTestID, Enable, simGenerateWaveform_Reset(Pause => 25 ns, ResetPulse => (VALUES'length * 10 ns))); - - -- component instantiation - UUT: entity PoC.stat_Minimum - generic map ( - DEPTH => DEPTH, - DATA_BITS => DATA_BITS, - COUNTER_BITS => COUNTER_BITS - ) - port map ( - Clock => Clock, - Reset => Reset, - - Enable => Enable, - DataIn => DataIn, - - Valids => Valids, - Minimums => Minimums, - Counts => Counts - ); - - Minimums_slvv <= to_slvv_8(Minimums); - Counts_slvv <= to_slvv_4(Counts); + simGenerateClock(simTestID, Clock, CLOCK_FREQ); + simGenerateWaveform(simTestID, Reset, simGenerateWaveform_Reset(Pause => 5 ns, ResetPulse => 10 ns)); + simGenerateWaveform(simTestID, Enable, simGenerateWaveform_Reset(Pause => 25 ns, ResetPulse => (VALUES'length * 10 ns))); + + -- component instantiation + UUT: entity PoC.stat_Minimum + generic map ( + DEPTH => DEPTH, + DATA_BITS => DATA_BITS, + COUNTER_BITS => COUNTER_BITS + ) + port map ( + Clock => Clock, + Reset => Reset, + + Enable => Enable, + DataIn => DataIn, + + Valids => Valids, + Minimums => Minimums, + Counts => Counts + ); + + Minimums_slvv <= to_slvv_8(Minimums); + Counts_slvv <= to_slvv_4(Counts); procStimuli : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator and Checker"); - variable good : boolean; + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "Generator and Checker"); + variable good : boolean; begin - DataIn <= (others => '0'); + DataIn <= (others => '0'); wait until (Enable = '1') and falling_edge(Clock); for i in VALUES'range loop - --Enable <= to_sl(VALUES(i) /= 35); - DataIn <= to_slv(VALUES(i), DataIn'length); + --Enable <= to_sl(VALUES(i) /= 35); + DataIn <= to_slv(VALUES(i), DataIn'length); wait until falling_edge(Clock); end loop; @@ -171,7 +171,7 @@ begin -- test result after all cycles good := (slv_and(Valids) = '1'); for i in RESULT'range loop - good := good and (RESULT(i).Minimum = unsigned(Minimums_slvv(i))) and (RESULT(i).Count = unsigned(Counts_slvv(i))); + good := good and (RESULT(i).Minimum = unsigned(Minimums_slvv(i))) and (RESULT(i).Count = unsigned(Counts_slvv(i))); end loop; simAssertion(good, "Test failed."); diff --git a/tb/sim/sim_ClockGenerator_tb.vhdl b/tb/sim/sim_ClockGenerator_tb.vhdl deleted file mode 100644 index ee9487877..000000000 --- a/tb/sim/sim_ClockGenerator_tb.vhdl +++ /dev/null @@ -1,337 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Patrick Lehmann --- --- Testbench: for clock generation in testbenches. --- --- Description: --- ------------------------------------ --- TODO --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; - -library OSVVM; -use OSVVM.CoveragePkg.all; -use OSVVM.TranscriptPkg.all; - -library PoC; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.strings.all; -use PoC.physical.all; -use PoC.components.all; --- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; - - -entity sim_ClockGenerator_tb is -end entity; - - -architecture tb of sim_ClockGenerator_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; - constant NO_CLOCK_PHASE : T_PHASE := 0 deg; - - constant simTestID : T_SIM_TEST_ID := simCreateTest("Test clock generation"); - - signal Clock : std_logic; - signal ClockIsActive : std_logic := '1'; - - signal Clock_01 : std_logic; - signal Clock_02 : std_logic; - signal Clock_03 : std_logic; - signal Clock_04 : std_logic; - signal Clock_05 : std_logic; - signal Clock_06 : std_logic; - - signal Clock_10 : std_logic; - signal Clock_11 : std_logic; - signal Clock_12 : std_logic; - signal Clock_13 : std_logic; - signal Clock_14 : std_logic; - signal Clock_15 : std_logic; - signal Clock_16 : std_logic; - signal Clock_17 : std_logic; - signal Clock_18 : std_logic; - signal Clock_19 : std_logic; - - signal Clock_21 : std_logic; - signal Clock_22 : std_logic; - signal Clock_23 : std_logic; - signal Clock_24 : std_logic; - signal Clock_25 : std_logic; - - signal Clock_31 : std_logic; - signal Clock_32 : std_logic; - signal Clock_33 : std_logic; - signal Clock_34 : std_logic; - signal Clock_35 : std_logic; - - signal Clock_40 : std_logic; - signal Clock_41 : std_logic; - signal Clock_42 : std_logic; - signal Clock_43 : std_logic; - signal Counter_Clock_40_us : unsigned(15 downto 0) := (others => '0'); - signal Counter_Clock_41_us : unsigned(15 downto 0) := (others => '0'); - signal Counter_Clock_42_us : unsigned(15 downto 0) := (others => '0'); - signal Counter_Clock_43_us : unsigned(15 downto 0) := (others => '0'); - signal Counter_41_cmp : unsigned(1 downto 0); - signal Counter_42_cmp : unsigned(1 downto 0); - signal Counter_43_cmp : unsigned(1 downto 0); - signal Drift_Clock_41 : signed(15 downto 0); - signal Drift_Clock_42 : signed(15 downto 0); - signal Drift_Clock_43 : signed(15 downto 0); - - signal Clock_50 : std_logic; - signal Clock_51 : std_logic; - signal Counter_Clock_50_us : unsigned(15 downto 0) := (others => '0'); - signal Counter_Clock_51_us : unsigned(15 downto 0) := (others => '0'); - signal Mean_Clock_51 : signed(15 downto 0); - signal Drift_Clock_51 : signed(15 downto 0); - signal Drift_Clock_52 : signed(15 downto 0); - signal Debug_Jitter : REAL; - signal Debug2 : signed(15 downto 0); - - - signal Reset_1 : std_logic; - signal Reset_2 : std_logic; - -begin - -- initialize OSVVM transcript file - TranscriptOpen("sim_ClockGenerator_tb.csv"); - -- SetTranscriptMirror; - - -- initialize global simulation status - simInitialize; - - -- simple clock - simGenerateClock(Clock, CLOCK_FREQ / 2); - ClockIsActive <= not to_sl(simIsStopped) when rising_edge(Clock); - - -- generate global testbench clock - simGenerateClock(Clock_01, CLOCK_FREQ, Phase => 0 deg); - simGenerateClock(Clock_02, CLOCK_FREQ, Phase => 90 deg); - simGenerateClock(Clock_03, CLOCK_FREQ, Phase => 180 deg); - simGenerateClock(Clock_04, CLOCK_FREQ, Phase => 270 deg); - simGenerateClock(Clock_05, CLOCK_FREQ, Phase => 360 deg); - simGenerateClock(Clock_06, CLOCK_FREQ, Phase => -90 deg); - - simGenerateClock(Clock_10, CLOCK_FREQ, DutyCycle => 0 percent); - simGenerateClock(Clock_11, CLOCK_FREQ, DutyCycle => 10 percent); - simGenerateClock(Clock_12, CLOCK_FREQ, DutyCycle => 20 percent); - simGenerateClock(Clock_13, CLOCK_FREQ, DutyCycle => 30 percent); - simGenerateClock(Clock_14, CLOCK_FREQ, DutyCycle => 40 percent); - simGenerateClock(Clock_15, CLOCK_FREQ, DutyCycle => 50 percent); - simGenerateClock(Clock_16, CLOCK_FREQ, DutyCycle => 60 percent); - simGenerateClock(Clock_17, CLOCK_FREQ, DutyCycle => 70 percent); - simGenerateClock(Clock_18, CLOCK_FREQ, DutyCycle => 80 percent); - simGenerateClock(Clock_19, CLOCK_FREQ, DutyCycle => 90 percent); - - simGenerateClock(Clock_21, CLOCK_FREQ, Phase => 0 deg, DutyCycle => 25 percent); - simGenerateClock(Clock_22, CLOCK_FREQ, Phase => 90 deg, DutyCycle => 25 percent); - simGenerateClock(Clock_23, CLOCK_FREQ, Phase => 180 deg, DutyCycle => 25 percent); - simGenerateClock(Clock_24, CLOCK_FREQ, Phase => 270 deg, DutyCycle => 25 percent); - simGenerateClock(Clock_25, CLOCK_FREQ, Phase => 360 deg, DutyCycle => 25 percent); - - simGenerateClock(Clock_31, CLOCK_FREQ, Phase => 0 deg, DutyCycle => 75 percent); - simGenerateClock(Clock_32, CLOCK_FREQ, Phase => 90 deg, DutyCycle => 75 percent); - simGenerateClock(Clock_33, CLOCK_FREQ, Phase => 180 deg, DutyCycle => 75 percent); - simGenerateClock(Clock_34, CLOCK_FREQ, Phase => 270 deg, DutyCycle => 75 percent); - simGenerateClock(Clock_35, CLOCK_FREQ, Phase => 360 deg, DutyCycle => 75 percent); - - simGenerateClock(Clock_40, CLOCK_FREQ, Wander => 0 permil); - simGenerateClock(Clock_41, CLOCK_FREQ, Wander => 5 permil); -- clock drift of 0.5% ( 5 permil) => shift by 1 UI every 200 cycles - simGenerateClock(Clock_42, CLOCK_FREQ, Wander => 10 permil); -- clock drift of 1.0% ( 10 permil) => shift by 1 UI every 100 cycles - simGenerateClock(Clock_43, CLOCK_FREQ, Wander => -10 permil); -- clock drift of -1.0% (-10 permil) => shift by 1 UI every 100 cycles - - Counter_Clock_40_us <= upcounter_next(cnt => Counter_Clock_40_us) when rising_edge(Clock_40); - Counter_Clock_41_us <= upcounter_next(cnt => Counter_Clock_41_us) when rising_edge(Clock_41); - Counter_Clock_42_us <= upcounter_next(cnt => Counter_Clock_42_us) when rising_edge(Clock_42); - Counter_Clock_43_us <= upcounter_next(cnt => Counter_Clock_43_us) when rising_edge(Clock_43); - Counter_41_cmp <= comp(Counter_Clock_40_us, Counter_Clock_41_us); - Counter_42_cmp <= comp(Counter_Clock_40_us, Counter_Clock_42_us); - Counter_43_cmp <= comp(Counter_Clock_40_us, Counter_Clock_43_us); - - procDrift_41 : process - -- constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Drift_43"); - begin - Drift_Clock_41 <= (others => '0'); - wait until rising_edge(Clock_40); - wait until rising_edge(Clock_41); - while not simIsStopped loop - wait until rising_edge(Clock_41); - Drift_Clock_41 <= to_signed((Clock_40'last_event - Clock_41'last_event) / 10 ps, Drift_Clock_41'length); - end loop; - - -- This process is finished - -- simDeactivateProcess(simProcessID); - -- simFinalize; - wait; -- forever - end process; - - procDrift_42 : process - -- constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Drift_43"); - begin - Drift_Clock_42 <= (others => '0'); - wait until rising_edge(Clock_40); - wait until rising_edge(Clock_42); - while not simIsStopped loop - wait until rising_edge(Clock_42); - Drift_Clock_42 <= to_signed((Clock_40'last_event - Clock_42'last_event) / 10 ps, Drift_Clock_42'length); - end loop; - - -- This process is finished - -- simDeactivateProcess(simProcessID); - -- simFinalize; - wait; -- forever - end process; - - procDrift_43 : process - -- constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Drift_43"); - begin - Drift_Clock_43 <= (others => '0'); - wait until rising_edge(Clock_40); - wait until rising_edge(Clock_43); - while not simIsStopped loop - wait until rising_edge(Clock_43); - Drift_Clock_43 <= to_signed((Clock_40'last_event - Clock_43'last_event) / 10 ps, Drift_Clock_43'length); - end loop; - - -- This process is finished - -- simDeactivateProcess(simProcessID); - -- simFinalize; - wait; -- forever - end process; - - - simGenerateClock(Clock_50, CLOCK_FREQ); - simGenerateClock2(-1, Clock_51, Debug_Jitter, to_time(CLOCK_FREQ)); - - Counter_Clock_50_us <= upcounter_next(cnt => Counter_Clock_50_us) when rising_edge(Clock_50); - Counter_Clock_51_us <= upcounter_next(cnt => Counter_Clock_51_us) when rising_edge(Clock_51); - - procHistogram : process - -- constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Histogram"); - - variable Sum : integer; - variable Count : natural; - variable Rand : integer; - variable RandPointer : natural; - variable RandBuffer : T_INTVEC(0 to 15); - - constant BIN_SIZE : positive := 1000; - constant BIN_SIZE_2 : REAL := real(BIN_SIZE) / 2.0; - variable CovBin1 : CovPType; - begin - CovBin1.AddBins(GenBin(0, BIN_SIZE)); - - Sum := 0; - Count := 0; - Debug2 <= (others => '0'); - Mean_Clock_51 <= (others => '0'); - RandPointer := 0; - RandBuffer := (others => (BIN_SIZE / 2)); - - wait until rising_edge(Clock_51); - while not simIsStopped loop - wait until rising_edge(Clock_51); - -- subtract old random value from mean aggregator - Sum := Sum - RandBuffer(RandPointer); - -- convert new random value to integer - Rand := integer(Debug_Jitter * BIN_SIZE_2 + BIN_SIZE_2); -- scale and move into positive range - -- store random value in buffer - RandBuffer(RandPointer) := Rand; - RandPointer := (RandPointer + 1) mod RandBuffer'length; - -- log random value - CovBin1.ICover(Rand); - Debug2 <= to_signed(Rand, Debug2'length); - - Sum := Sum + Rand; - Count := Count + 1; - Mean_Clock_51 <= to_signed((Sum / imin(RandBuffer'length, Count + 1)), Mean_Clock_51'length); - - end loop; - - CovBin1.WriteBin;-- This process is finished - -- simDeactivateProcess(simProcessID); - wait; -- forever - end process; - - procDrift_51 : process - -- constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Drift_51"); - begin - Drift_Clock_51 <= (others => '0'); - Drift_Clock_52 <= (others => '0'); - - wait until rising_edge(Clock_50); - wait until rising_edge(Clock_51); - - while not simIsStopped loop - wait until rising_edge(Clock_50); - Drift_Clock_51 <= to_signed((Clock_50'last_event - Clock_51'last_event) / 100 fs, Drift_Clock_51'length); - -- Drift_Clock_52 <= to_signed((Clock_51'last_event - Clock_50'last_event) / 100 fs, Drift_Clock_52'length); - - end loop; - - -- This process is finished - -- simDeactivateProcess(simProcessID); - -- simFinalize; - wait; -- forever - end process; - - - - - simGenerateWaveform(Reset_1, simGenerateWaveform_Reset(Pause => 10 ns, ResetPulse => 10 ns)); - - -- procChecker_1 : process - -- constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker_1"); - -- begin - - -- simWaitUntilRisingEdge(Clock_01, 99); - -- simWaitUntilFallingEdge(Clock_01, 99); - - -- -- This process is finished - -- simDeactivateProcess(simProcessID); - -- simFinalize; - -- wait; -- forever - -- end process; - - procChecker_2 : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker_2"); - begin - - simWaitUntilRisingEdge(Clock, 5000); - simWaitUntilFallingEdge(Clock, 5000); - - -- This process is finished - simDeactivateProcess(simProcessID); - simFinalize; - wait; -- forever - end process; -end architecture; diff --git a/tb/sim/sim_VCDParser_tb.vhdl b/tb/sim/sim_VCDParser_tb.vhdl index ac4e18e35..ea82b7e4a 100644 --- a/tb/sim/sim_VCDParser_tb.vhdl +++ b/tb/sim/sim_VCDParser_tb.vhdl @@ -16,7 +16,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -26,20 +26,20 @@ -- ============================================================================= -- library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.STD_LOGIC_TEXTIO.all; -use IEEE.NUMERIC_STD.all; -use STD.TEXTIO.all; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_textio.all; +use IEEE.numeric_std.all; +use STD.TEXTIO.all; library PoC; -use PoC.my_project.all; -use PoC.strings.all; -use PoC.physical.all; +use PoC.local_configuration.all; +use PoC.strings.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; -use PoC.sim_VCDParser.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; +use PoC.sim_VCDParser.all; entity sim_VCDParser_tb is @@ -47,51 +47,51 @@ end entity; architecture tb of sim_VCDParser_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; + constant CLOCK_FREQ : FREQ := 100 MHz; - constant simTestID : T_SIM_TEST_ID := simCreateTest("Testing the VCD parser."); + constant simTestID : T_SIM_TEST_ID := simCreateTest("Testing the VCD parser."); - signal Clock : std_logic := '1'; - signal Reset : std_logic := '0'; + signal Clock : std_logic := '1'; + signal Reset : std_logic := '0'; - signal valid : std_logic; - signal sof : std_logic; - signal eof : std_logic; - signal data : std_logic_vector(7 downto 0); - signal ack : std_logic; + signal valid : std_logic; + signal sof : std_logic; + signal eof : std_logic; + signal data : std_logic_vector(7 downto 0); + signal ack : std_logic; begin -- initialize global simulation status simInitialize; -- generate global testbench clock and reset - simGenerateClock(simTestID, Clock, CLOCK_FREQ); + simGenerateClock(simTestID, Clock, CLOCK_FREQ); VCDProcess: process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "VCD reader process"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess(simTestID, "VCD reader process"); - file VCDFile : TEXT; - variable VCDLine : T_VCDLINE; + file VCDFile : TEXT; + variable VCDLine : T_VCDLINE; - variable VCDTime : integer; - variable VCDTime_nx : integer; + variable VCDTime : integer; + variable VCDTime_nx : integer; begin - Reset <= '0'; + Reset <= '0'; simWaitUntilRisingEdge(Clock, 2); - Reset <= '1'; + Reset <= '1'; simWaitUntilRisingEdge(Clock, 1); - Reset <= '0'; + Reset <= '0'; simWaitUntilRisingEdge(Clock, 2); -- open *.vcd file and read header - file_open(VCDFile, MY_PROJECT_DIR & "tb/sim/sim_VCDParser_tb.vcd", READ_MODE); + file_open(VCDFile, LOCAL_PROJECT_DIR & "tb/sim/sim_VCDParser_tb.vcd", READ_MODE); VCD_ReadHeader(VCDFile, VCDLine); -- read initial stimuli values -- ============================================================== - VCDTime := to_natural_dec(VCDLine(2 to str_length(VCDLine))); + VCDTime := to_natural_dec(VCDLine(2 to str_length(VCDLine))); if (VCDTime = -1) then assert (FALSE) report "no positive after #-symbol!" & VCDLine severity FAILURE; elsif (VCDTime /= 0) then @@ -112,17 +112,17 @@ begin VCD_Read_StdLogicVector(VCDLine, data, "n3", '0'); else -- add single bit signals here - VCD_Read_StdLogic(VCDLine, valid, "n4"); - VCD_Read_StdLogic(VCDLine, sof, "n1"); - VCD_Read_StdLogic(VCDLine, eof, "n2"); - VCD_Read_StdLogic(VCDLine, ack, "n0"); + VCD_Read_StdLogic(VCDLine, valid, "n4"); + VCD_Read_StdLogic(VCDLine, sof, "n1"); + VCD_Read_StdLogic(VCDLine, eof, "n2"); + VCD_Read_StdLogic(VCDLine, ack, "n0"); end if; end loop; - VCDTime_nx := to_natural_dec(VCDLine(2 to str_length(VCDLine))); + VCDTime_nx := to_natural_dec(VCDLine(2 to str_length(VCDLine))); simWaitUntilRisingEdge(Clock, (VCDTime_nx - VCDTime)); - VCDTime := VCDTime_nx; - end loop; -- WHILE TRUE + VCDTime := VCDTime_nx; + end loop; -- WHILE TRUE -- ============================================================== -- close *.vcd-file diff --git a/tb/sim/sim_Waveform_tb.vhdl b/tb/sim/sim_Waveform_tb.vhdl deleted file mode 100644 index 56a6cf12f..000000000 --- a/tb/sim/sim_Waveform_tb.vhdl +++ /dev/null @@ -1,132 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Patrick Lehmann --- --- Testbench: for waveform generation and arithmetic --- --- Description: --- ------------------------------------ --- TODO --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= - -library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; - -library PoC; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.strings.all; -use PoC.physical.all; -use PoC.components.all; --- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; - - -entity sim_Waveform_tb is -end entity; - - -architecture tb of sim_Waveform_tb is - constant CLOCK_FREQ : FREQ := 100 MHz; - - constant simTestID : T_SIM_TEST_ID := simCreateTest("Test waveform generation"); - - signal Clock : std_logic; - - signal Reset_1 : std_logic; - signal Reset_2 : std_logic; - signal Reset_3 : std_logic; - - signal Impulse_01 : std_logic; - signal Impulse_02 : std_logic; - signal Impulse_03 : std_logic; - - signal Wave_01 : std_logic; - signal Wave_02 : std_logic; - signal Wave_03 : std_logic; - signal Wave_04 : std_logic; - signal Wave_05 : std_logic; - signal Wave_06 : std_logic; - - signal Wave_11 : std_logic; - - signal Bus_01 : T_SLV_8; - signal Bus_02 : T_SLV_8; - - - - - constant IMPULSE_1 : T_TIMEVEC := simGenerateWaveform_Reset(Pause => 10 ns); - constant WAVE_1 : T_TIMEVEC := (20 ns, 5 ns, 5 ns, 5 ns, 5 ns, 10 ns, 5 ns, 5 ns, 10 ns, 20 ns); - constant BUS_1 : T_SIM_WAVEFORM_SLV_8 := ( - (Delay => 20 ns, Value => x"00"), - (Delay => 10 ns, Value => x"01"), - (Delay => 10 ns, Value => x"02"), - (Delay => 10 ns, Value => x"03") - ); - - constant BUS_2 : T_SLVV_8 := (x"10", x"11", x"12", x"13", x"14", x"15", x"16", x"17"); - -begin - -- initialize global simulation status - simInitialize; - - -- simple clock - simGenerateClock(simTestID, Clock, CLOCK_FREQ); - - -- simple reset waveforms - simGenerateWaveform(simTestID, Reset_1, simGenerateWaveform_Reset(Pause => 10 ns)); - simGenerateWaveform(simTestID, Reset_2, simGenerateWaveform_Reset(ResetPulse => 10 ns)); - simGenerateWaveform(simTestID, Reset_3, simGenerateWaveform_Reset(Pause => 20 ns, ResetPulse => 30 ns)); - - simGenerateWaveform(simTestID, Impulse_01, IMPULSE_1); - simGenerateWaveform(simTestID, Impulse_02, IMPULSE_1 * 5); - simGenerateWaveform(simTestID, Impulse_03, IMPULSE_1 * 20); - - simGenerateWaveform(simTestID, Wave_01, IMPULSE_1 & WAVE_1 * 3); - simGenerateWaveform(simTestID, Wave_02, (IMPULSE_1 & WAVE_1 * 3) < 5 ns); - simGenerateWaveform(simTestID, Wave_03, (IMPULSE_1 & WAVE_1 * 3) < 10 ns); - simGenerateWaveform(simTestID, Wave_04, (IMPULSE_1 & WAVE_1 * 3) < 15 ns); - simGenerateWaveform(simTestID, Wave_05, (IMPULSE_1 & WAVE_1 * 3) < 20 ns); - simGenerateWaveform(simTestID, Wave_06, (IMPULSE_1 & WAVE_1 * 3) < 30 ns); - - simGenerateWaveform(simTestID, Wave_11, (IMPULSE_1 & WAVE_1 * 3) > 100 ns); - - simGenerateWaveform(simTestID, Bus_01, BUS_1 * 2); - simGenerateWaveform(simTestID, Bus_02, to_waveform(BUS_2, 10 ns) > 40 ns); - - - procChecker_2 : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker_2"); - begin - simWaitUntilRisingEdge(Clock, 100); - - -- This process is finished - simDeactivateProcess(simProcessID); - simFinalize; - wait; -- forever - end process; -end architecture; diff --git a/tb/sort/sort_lru_cache_cocotb.py b/tb/sort/sort_LeastRecentlyUsed_Cache_cocotb.py similarity index 100% rename from tb/sort/sort_lru_cache_cocotb.py rename to tb/sort/sort_LeastRecentlyUsed_Cache_cocotb.py diff --git a/tb/sort/sort_LeastRecentlyUsed_Cache_tb.vhdl b/tb/sort/sort_LeastRecentlyUsed_Cache_tb.vhdl new file mode 100644 index 000000000..fe1a6da8b --- /dev/null +++ b/tb/sort/sort_LeastRecentlyUsed_Cache_tb.vhdl @@ -0,0 +1,130 @@ +-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- +-- vim: tabstop=2:shiftwidth=2:noexpandtab +-- kate: tab-width 2; replace-tabs off; indent-width 2; +-- +-- ============================================================================ +-- Authors: Patrick Lehmann +-- Martin Zabel +-- +-- Module: Testbench for `sort_LeastRecentlyUsed_Cache` +-- +-- Description: +-- ------------------------------------ +-- TODO +-- +-- License: +-- ============================================================================ +-- Copyright 2007-2016 Technische Universitaet Dresden - Germany +-- Chair of VLSI-Design, Diagnostics and Architecture +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============================================================================ + + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library PoC; +use PoC.math.all; +use PoC.utils.all; +use PoC.vectors.all; +-- simulation only packages +use PoC.sim_global.all; +use PoC.sim_types.all; +use PoC.simulation.all; + +library OSVVM; +use OSVVM.RandomPkg.all; + + +entity sort_LeastRecentlyUsed_Cache_tb is +end entity; + + +architecture tb of sort_LeastRecentlyUsed_Cache_tb is + constant ELEMENTS : positive := 8; + constant KEY_BITS : positive := log2ceilnz(ELEMENTS); + + constant LOOP_COUNT : positive := 32; + + constant CLOCK_PERIOD : time := 10 ns; + signal Clock : std_logic := '1'; + + signal Insert : std_logic; + signal Free : std_logic; + signal KeyIn : std_logic_vector(KEY_BITS - 1 downto 0); + + signal KeyOut : std_logic_vector(KEY_BITS - 1 downto 0); + + signal StopSimulation : std_logic := '0'; +begin + + simInitialize; + + Clock <= Clock xnor StopSimulation after CLOCK_PERIOD; + + process + variable RandomVar : RandomPType; -- protected type from RandomPkg + variable Command : integer range 0 to 1;--2; + begin + RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds + + Insert <= '0'; + Free <= '0'; + KeyIn <= (others => '0'); + wait until falling_edge(Clock); + + for i in 0 to LOOP_COUNT - 1 loop + + Insert <= '0'; + Free <= '0'; + Command := RandomVar.RandInt(0, 1); + case Command is + when 0 => -- NOP + when 1 => -- Insert + Insert <= '1'; + KeyIn <= to_slv(RandomVar.RandInt(0, (2**KEY_BITS - 1)), KEY_BITS); + -- when 2 => -- Free + -- Free <= '1'; + -- KeyIn <= to_slv(RandomVar.RandInt(0, (2**KEY_BITS - 1)), KEY_BITS); + end case; + wait until falling_edge(Clock); + end loop; + + for i in 0 to 3 loop + wait until falling_edge(Clock); + end loop; + + StopSimulation <= '1'; + -- Report overall result + simFinalize; + wait; + end process; + + sort : entity PoC.sort_LeastRecentlyUsed_Cache + generic map ( + ELEMENTS => ELEMENTS + ) + port map ( + Clock => Clock, + Reset => '0', + + Insert => Insert, + Free => Free, + KeyIn => KeyIn, + + KeyOut => KeyOut + ); + +end architecture; diff --git a/tb/sort/sort_lru_list_cocotb.py b/tb/sort/sort_LeastRecentlyUsed_List_cocotb.py similarity index 100% rename from tb/sort/sort_lru_list_cocotb.py rename to tb/sort/sort_LeastRecentlyUsed_List_cocotb.py diff --git a/tb/sort/sort_lru_cache_tb.vhdl b/tb/sort/sort_lru_cache_tb.vhdl deleted file mode 100644 index ecb8e4928..000000000 --- a/tb/sort/sort_lru_cache_tb.vhdl +++ /dev/null @@ -1,130 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================ --- Authors: Patrick Lehmann --- Martin Zabel --- --- Module: Testbench for `sort_lru_cache` --- --- Description: --- ------------------------------------ --- TODO --- --- License: --- ============================================================================ --- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================ - - -library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; - -library PoC; -use PoC.math.all; -use PoC.utils.all; -use PoC.vectors.all; --- simulation only packages -use PoC.sim_global.all; -use PoC.sim_types.all; -use PoC.simulation.all; - -library OSVVM; -use OSVVM.RandomPkg.all; - - -entity sort_lru_cache_tb is -end entity; - - -architecture tb of sort_lru_cache_tb is - constant ELEMENTS : positive := 8; - constant KEY_BITS : positive := log2ceilnz(ELEMENTS); - - constant LOOP_COUNT : positive := 32; - - constant CLOCK_PERIOD : time := 10 ns; - signal Clock : std_logic := '1'; - - signal Insert : std_logic; - signal Free : std_logic; - signal KeyIn : std_logic_vector(KEY_BITS - 1 downto 0); - - signal KeyOut : std_logic_vector(KEY_BITS - 1 downto 0); - - signal StopSimulation : std_logic := '0'; -begin - - simInitialize; - - Clock <= Clock xnor StopSimulation after CLOCK_PERIOD; - - process - variable RandomVar : RandomPType; -- protected type from RandomPkg - variable Command : integer range 0 to 1;--2; - begin - RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds - - Insert <= '0'; - Free <= '0'; - KeyIn <= (others => '0'); - wait until falling_edge(Clock); - - for i in 0 to LOOP_COUNT - 1 loop - - Insert <= '0'; - Free <= '0'; - Command := RandomVar.RandInt(0, 1); - case Command is - when 0 => -- NOP - when 1 => -- Insert - Insert <= '1'; - KeyIn <= to_slv(RandomVar.RandInt(0, (2**KEY_BITS - 1)), KEY_BITS); - -- when 2 => -- Free - -- Free <= '1'; - -- KeyIn <= to_slv(RandomVar.RandInt(0, (2**KEY_BITS - 1)), KEY_BITS); - end case; - wait until falling_edge(Clock); - end loop; - - for i in 0 to 3 loop - wait until falling_edge(Clock); - end loop; - - StopSimulation <= '1'; - -- Report overall result - simFinalize; - wait; - end process; - - sort : entity PoC.sort_lru_cache - generic map ( - ELEMENTS => ELEMENTS - ) - port map ( - Clock => Clock, - Reset => '0', - - Insert => Insert, - Free => Free, - KeyIn => KeyIn, - - KeyOut => KeyOut - ); - -end architecture; diff --git a/tb/sort/sortnet/sortnet_BitonicSort_tb.vhdl b/tb/sort/sortnet/sortnet_BitonicSort_tb.vhdl index de8d80139..8182bae50 100644 --- a/tb/sort/sortnet/sortnet_BitonicSort_tb.vhdl +++ b/tb/sort/sortnet/sortnet_BitonicSort_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Module: TODO +-- Module: TODO -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,22 +30,22 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library OSVVM; -use OSVVM.RandomPkg.all; +use OSVVM.RandomPkg.all; library PoC; -use PoC.math.all; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.strings.all; -use PoC.physical.all; +use PoC.math.all; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.strings.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; library Test; @@ -55,46 +55,46 @@ end entity; architecture tb of sortnet_BitonicSort_tb is - constant TAG_BITS : positive := 4; + constant TAG_BITS : positive := 4; - constant INPUTS : positive := 64; - constant DATA_COLUMNS : positive := 2; + constant INPUTS : positive := 64; + constant DATA_COLUMNS : positive := 2; - constant KEY_BITS : positive := 32; - constant DATA_BITS : positive := 64; - constant META_BITS : positive := TAG_BITS; - constant PIPELINE_STAGE_AFTER : natural := 2; + constant KEY_BITS : positive := 32; + constant DATA_BITS : positive := 64; + constant META_BITS : positive := TAG_BITS; + constant PIPELINE_STAGE_AFTER : natural := 2; - constant LOOP_COUNT : positive := 1024; + constant LOOP_COUNT : positive := 1024; - constant STAGES : positive := triangularNumber(log2ceil(INPUTS)); - constant DELAY : natural := STAGES / PIPELINE_STAGE_AFTER; + constant STAGES : positive := triangularNumber(log2ceil(INPUTS)); + constant DELAY : natural := STAGES / PIPELINE_STAGE_AFTER; package P_SORTNET_TB is new Test.sortnet_tb generic map ( - META_BITS => META_BITS, - DATA_BITS => DATA_BITS, - INPUTS => INPUTS + META_BITS => META_BITS, + DATA_BITS => DATA_BITS, + INPUTS => INPUTS ); - use P_SORTNET_TB.all; + use P_SORTNET_TB.all; - constant CLOCK_FREQ : FREQ := 100 MHz; - signal Clock : std_logic := '1'; + constant CLOCK_FREQ : FREQ := 100 MHz; + signal Clock : std_logic := '1'; - signal Generator_Valid : std_logic := '0'; - signal Generator_IsKey : std_logic := '0'; - signal Generator_Data : T_DATA_VECTOR(INPUTS - 1 downto 0) := (others => (others => '0')); - signal Generator_Meta : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); + signal Generator_Valid : std_logic := '0'; + signal Generator_IsKey : std_logic := '0'; + signal Generator_Data : T_DATA_VECTOR(INPUTS - 1 downto 0) := (others => (others => '0')); + signal Generator_Meta : std_logic_vector(META_BITS - 1 downto 0) := (others => '0'); - signal Sort_Valid : std_logic; - signal Sort_IsKey : std_logic; - signal Sort_Data : T_DATA_VECTOR(INPUTS - 1 downto 0); - signal Sort_Meta : std_logic_vector(META_BITS - 1 downto 0); + signal Sort_Valid : std_logic; + signal Sort_IsKey : std_logic; + signal Sort_Data : T_DATA_VECTOR(INPUTS - 1 downto 0); + signal Sort_Meta : std_logic_vector(META_BITS - 1 downto 0); - signal DataInputMatrix : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); - signal DataOutputMatrix : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); + signal DataInputMatrix : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); + signal DataOutputMatrix : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); - shared variable ScoreBoard : PT_SCOREBOARD; + shared variable ScoreBoard : PT_SCOREBOARD; begin -- initialize global simulation status @@ -109,13 +109,13 @@ begin simGenerateClock(Clock, CLOCK_FREQ); procGenerator : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); - variable RandomVar : RandomPType; -- protected type from RandomPkg + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); + variable RandomVar : RandomPType; -- protected type from RandomPkg - variable KeyInput : std_logic_vector(KEY_BITS - 1 downto 0); - variable DataInput : std_logic_vector(DATA_BITS - KEY_BITS - 1 downto 0); - variable TagInput : std_logic_vector(TAG_BITS - 1 downto 0); - variable Generator_Input : T_DATA_VECTOR(INPUTS - 1 downto 0); + variable KeyInput : std_logic_vector(KEY_BITS - 1 downto 0); + variable DataInput : std_logic_vector(DATA_BITS - KEY_BITS - 1 downto 0); + variable TagInput : std_logic_vector(TAG_BITS - 1 downto 0); + variable Generator_Input : T_DATA_VECTOR(INPUTS - 1 downto 0); function GreaterThan(L : std_logic_vector; R : std_logic_vector) return boolean is alias LL is L(KEY_BITS - 1 downto 0); @@ -124,103 +124,103 @@ begin return unsigned(LL) > unsigned(RR); end function; - variable ScoreBoardData : T_SCOREBOARD_DATA; + variable ScoreBoardData : T_SCOREBOARD_DATA; begin - RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds + RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds - Generator_Valid <= '0'; - Generator_IsKey <= '0'; - Generator_Input := (others => (others => '0')); - Generator_Meta <= (others => '0'); + Generator_Valid <= '0'; + Generator_IsKey <= '0'; + Generator_Input := (others => (others => '0')); + Generator_Meta <= (others => '0'); wait until rising_edge(Clock); - Generator_Valid <= '1'; + Generator_Valid <= '1'; for i in 0 to LOOP_COUNT - 1 loop - TagInput := RandomVar.RandSlv(TAG_BITS); + TagInput := RandomVar.RandSlv(TAG_BITS); - ScoreBoardData.IsKey := to_sl(i mod DATA_COLUMNS = 0); - ScoreBoardData.Meta := resize(TagInput, META_BITS); - Generator_IsKey <= ScoreBoardData.IsKey; - Generator_Meta <= ScoreBoardData.Meta; + ScoreBoardData.IsKey := to_sl(i mod DATA_COLUMNS = 0); + ScoreBoardData.Meta := resize(TagInput, META_BITS); + Generator_IsKey <= ScoreBoardData.IsKey; + Generator_Meta <= ScoreBoardData.Meta; - KeyInput := RandomVar.RandSlv(KEY_BITS); - DataInput := RandomVar.RandSlv(DATA_BITS - KEY_BITS); - Generator_Input(0) := DataInput & KeyInput; + KeyInput := RandomVar.RandSlv(KEY_BITS); + DataInput := RandomVar.RandSlv(DATA_BITS - KEY_BITS); + Generator_Input(0) := DataInput & KeyInput; ScoreBoardData.Data(0):= Generator_Input(0); loop_j: for j in 1 to INPUTS - 1 loop - KeyInput := RandomVar.RandSlv(KEY_BITS); - DataInput := RandomVar.RandSlv(DATA_BITS - KEY_BITS); - Generator_Input(j) := DataInput & KeyInput; + KeyInput := RandomVar.RandSlv(KEY_BITS); + DataInput := RandomVar.RandSlv(DATA_BITS - KEY_BITS); + Generator_Input(j) := DataInput & KeyInput; for k in j downto 1 loop if GreaterThan(ScoreBoardData.Data(k - 1), Generator_Input(j)) then - ScoreBoardData.Data(k) := ScoreBoardData.Data(k - 1); + ScoreBoardData.Data(k) := ScoreBoardData.Data(k - 1); else - ScoreBoardData.Data(k) := Generator_Input(j); + ScoreBoardData.Data(k) := Generator_Input(j); next loop_j; end if; end loop; - ScoreBoardData.Data(0) := Generator_Input(j); + ScoreBoardData.Data(0) := Generator_Input(j); end loop; - Generator_Data <= Generator_Input; + Generator_Data <= Generator_Input; ScoreBoard.Push(ScoreBoardData); wait until rising_edge(Clock); end loop; - Generator_Valid <= '0'; + Generator_Valid <= '0'; wait until rising_edge(Clock); -- This process is finished simDeactivateProcess(simProcessID); - wait; -- forever + wait; -- forever end process; - DataInputMatrix <= to_slm(Generator_Data); + DataInputMatrix <= to_slm(Generator_Data); sort : entity PoC.sortnet_BitonicSort generic map ( - INPUTS => INPUTS, - KEY_BITS => KEY_BITS, - DATA_BITS => DATA_BITS, - META_BITS => META_BITS, - PIPELINE_STAGE_AFTER => PIPELINE_STAGE_AFTER + INPUTS => INPUTS, + KEY_BITS => KEY_BITS, + DATA_BITS => DATA_BITS, + META_BITS => META_BITS, + PIPELINE_STAGE_AFTER => PIPELINE_STAGE_AFTER ) port map ( - Clock => Clock, - Reset => '0', - - In_Valid => Generator_Valid, - In_IsKey => Generator_IsKey, - In_Data => DataInputMatrix, - In_Meta => Generator_Meta, - - Out_Valid => Sort_Valid, - Out_IsKey => Sort_IsKey, - Out_Data => DataOutputMatrix, - Out_Meta => Sort_Meta + Clock => Clock, + Reset => '0', + + In_Valid => Generator_Valid, + In_IsKey => Generator_IsKey, + In_Data => DataInputMatrix, + In_Meta => Generator_Meta, + + Out_Valid => Sort_Valid, + Out_IsKey => Sort_IsKey, + Out_Data => DataOutputMatrix, + Out_Meta => Sort_Meta ); - Sort_Data <= to_dv(DataOutputMatrix); + Sort_Data <= to_dv(DataOutputMatrix); procChecker : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); - variable Check : boolean; - variable CurValue : unsigned(KEY_BITS - 1 downto 0); - variable LastValue : unsigned(KEY_BITS - 1 downto 0); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); + variable Check : boolean; + variable CurValue : unsigned(KEY_BITS - 1 downto 0); + variable LastValue : unsigned(KEY_BITS - 1 downto 0); - variable ScoreBoardData : T_SCOREBOARD_DATA; + variable ScoreBoardData : T_SCOREBOARD_DATA; begin wait until rising_edge(Sort_Valid); for i in 0 to LOOP_COUNT - 1 loop wait until falling_edge(Clock); - Check := TRUE; - ScoreBoardData.IsKey := Sort_IsKey; - ScoreBoardData.Meta := Sort_Meta; - ScoreBoardData.Data := Sort_Data; + Check := TRUE; + ScoreBoardData.IsKey := Sort_IsKey; + ScoreBoardData.Meta := Sort_Meta; + ScoreBoardData.Data := Sort_Data; ScoreBoard.Check(ScoreBoardData); end loop; -- simAssertion(Check, "Result is not monotonic." & raw_format_slv_hex(std_logic_vector(LastValue))); diff --git a/tb/sort/sortnet/sortnet_OddEvenMergeSort_tb.vhdl b/tb/sort/sortnet/sortnet_OddEvenMergeSort_tb.vhdl index e3d805b42..cf00d06a2 100644 --- a/tb/sort/sortnet/sortnet_OddEvenMergeSort_tb.vhdl +++ b/tb/sort/sortnet/sortnet_OddEvenMergeSort_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Testbench: Sorting Network: Odd-Even-Merge-Sort +-- Testbench: Sorting Network: Odd-Even-Merge-Sort -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,24 +30,24 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library OSVVM; -use OSVVM.RandomPkg.all; +use OSVVM.RandomPkg.all; library PoC; -use PoC.math.all; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.strings.all; -use PoC.physical.all; +use PoC.math.all; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.strings.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; -library Test; +library Test; entity sortnet_OddEvenMergeSort_tb is @@ -56,46 +56,46 @@ end entity; architecture tb of sortnet_OddEvenMergeSort_tb is - constant TAG_BITS : positive := 4; + constant TAG_BITS : positive := 4; - constant INPUTS : positive := 64; - constant DATA_COLUMNS : positive := 2; + constant INPUTS : positive := 64; + constant DATA_COLUMNS : positive := 2; - constant KEY_BITS : positive := 8; - constant DATA_BITS : positive := 32; - constant META_BITS : positive := TAG_BITS; - constant PIPELINE_STAGE_AFTER : natural := 2; + constant KEY_BITS : positive := 8; + constant DATA_BITS : positive := 32; + constant META_BITS : positive := TAG_BITS; + constant PIPELINE_STAGE_AFTER : natural := 2; - constant LOOP_COUNT : positive := 1024; + constant LOOP_COUNT : positive := 1024; - constant STAGES : positive := triangularNumber(log2ceil(INPUTS)); - constant DELAY : natural := STAGES / PIPELINE_STAGE_AFTER; + constant STAGES : positive := triangularNumber(log2ceil(INPUTS)); + constant DELAY : natural := STAGES / PIPELINE_STAGE_AFTER; package P_SORTNET_TB is new Test.sortnet_tb generic map ( - META_BITS => META_BITS, - DATA_BITS => DATA_BITS, - INPUTS => INPUTS + META_BITS => META_BITS, + DATA_BITS => DATA_BITS, + INPUTS => INPUTS ); - use P_SORTNET_TB.all; + use P_SORTNET_TB.all; - constant CLOCK_FREQ : FREQ := 100 MHz; - signal Clock : std_logic := '1'; + constant CLOCK_FREQ : FREQ := 100 MHz; + signal Clock : std_logic := '1'; - signal Generator_Valid : std_logic; - signal Generator_IsKey : std_logic; - signal Generator_Data : T_DATA_VECTOR(INPUTS - 1 downto 0); - signal Generator_Meta : std_logic_vector(META_BITS - 1 downto 0); + signal Generator_Valid : std_logic; + signal Generator_IsKey : std_logic; + signal Generator_Data : T_DATA_VECTOR(INPUTS - 1 downto 0); + signal Generator_Meta : std_logic_vector(META_BITS - 1 downto 0); - signal Sort_Valid : std_logic; - signal Sort_IsKey : std_logic; - signal Sort_Data : T_DATA_VECTOR(INPUTS - 1 downto 0); - signal Sort_Meta : std_logic_vector(META_BITS - 1 downto 0); + signal Sort_Valid : std_logic; + signal Sort_IsKey : std_logic; + signal Sort_Data : T_DATA_VECTOR(INPUTS - 1 downto 0); + signal Sort_Meta : std_logic_vector(META_BITS - 1 downto 0); - signal DataInputMatrix : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); - signal DataOutputMatrix : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); + signal DataInputMatrix : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); + signal DataOutputMatrix : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); - shared variable ScoreBoard : PT_SCOREBOARD; + shared variable ScoreBoard : PT_SCOREBOARD; begin -- initialize global simulation status @@ -110,13 +110,13 @@ begin simGenerateClock(Clock, CLOCK_FREQ); procGenerator : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); - variable RandomVar : RandomPType; -- protected type from RandomPkg + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); + variable RandomVar : RandomPType; -- protected type from RandomPkg - variable KeyInput : std_logic_vector(KEY_BITS - 1 downto 0); - variable DataInput : std_logic_vector(DATA_BITS - KEY_BITS - 1 downto 0); - variable TagInput : std_logic_vector(TAG_BITS - 1 downto 0); - variable Generator_Input : T_DATA_VECTOR(INPUTS - 1 downto 0); + variable KeyInput : std_logic_vector(KEY_BITS - 1 downto 0); + variable DataInput : std_logic_vector(DATA_BITS - KEY_BITS - 1 downto 0); + variable TagInput : std_logic_vector(TAG_BITS - 1 downto 0); + variable Generator_Input : T_DATA_VECTOR(INPUTS - 1 downto 0); function GreaterThan(L : std_logic_vector; R : std_logic_vector) return boolean is alias LL is L(KEY_BITS - 1 downto 0); @@ -125,103 +125,103 @@ begin return unsigned(LL) > unsigned(RR); end function; - variable ScoreBoardData : T_SCOREBOARD_DATA; + variable ScoreBoardData : T_SCOREBOARD_DATA; begin - RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds + RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds - Generator_Valid <= '0'; - Generator_IsKey <= '0'; - Generator_Input := (others => (others => '0')); - Generator_Meta <= (others => '0'); + Generator_Valid <= '0'; + Generator_IsKey <= '0'; + Generator_Input := (others => (others => '0')); + Generator_Meta <= (others => '0'); wait until rising_edge(Clock); - Generator_Valid <= '1'; + Generator_Valid <= '1'; for i in 0 to LOOP_COUNT - 1 loop - TagInput := RandomVar.RandSlv(TAG_BITS); + TagInput := RandomVar.RandSlv(TAG_BITS); - ScoreBoardData.IsKey := to_sl(i mod DATA_COLUMNS = 0); - ScoreBoardData.Meta := resize(TagInput, META_BITS); - Generator_IsKey <= ScoreBoardData.IsKey; - Generator_Meta <= ScoreBoardData.Meta; + ScoreBoardData.IsKey := to_sl(i mod DATA_COLUMNS = 0); + ScoreBoardData.Meta := resize(TagInput, META_BITS); + Generator_IsKey <= ScoreBoardData.IsKey; + Generator_Meta <= ScoreBoardData.Meta; - KeyInput := RandomVar.RandSlv(KEY_BITS); - DataInput := RandomVar.RandSlv(DATA_BITS - KEY_BITS); - Generator_Input(0) := DataInput & KeyInput; + KeyInput := RandomVar.RandSlv(KEY_BITS); + DataInput := RandomVar.RandSlv(DATA_BITS - KEY_BITS); + Generator_Input(0) := DataInput & KeyInput; ScoreBoardData.Data(0):= Generator_Input(0); loop_j: for j in 1 to INPUTS - 1 loop - KeyInput := RandomVar.RandSlv(KEY_BITS); - DataInput := RandomVar.RandSlv(DATA_BITS - KEY_BITS); - Generator_Input(j) := DataInput & KeyInput; + KeyInput := RandomVar.RandSlv(KEY_BITS); + DataInput := RandomVar.RandSlv(DATA_BITS - KEY_BITS); + Generator_Input(j) := DataInput & KeyInput; for k in j downto 1 loop if GreaterThan(ScoreBoardData.Data(k - 1), Generator_Input(j)) then - ScoreBoardData.Data(k) := ScoreBoardData.Data(k - 1); + ScoreBoardData.Data(k) := ScoreBoardData.Data(k - 1); else - ScoreBoardData.Data(k) := Generator_Input(j); + ScoreBoardData.Data(k) := Generator_Input(j); next loop_j; end if; end loop; - ScoreBoardData.Data(0) := Generator_Input(j); + ScoreBoardData.Data(0) := Generator_Input(j); end loop; - Generator_Data <= Generator_Input; + Generator_Data <= Generator_Input; ScoreBoard.Push(ScoreBoardData); wait until rising_edge(Clock); end loop; - Generator_Valid <= '0'; + Generator_Valid <= '0'; wait until rising_edge(Clock); -- This process is finished simDeactivateProcess(simProcessID); - wait; -- forever + wait; -- forever end process; - DataInputMatrix <= to_slm(Generator_Data); + DataInputMatrix <= to_slm(Generator_Data); sort : entity PoC.sortnet_OddEvenMergeSort generic map ( - INPUTS => INPUTS, - KEY_BITS => KEY_BITS, - DATA_BITS => DATA_BITS, - META_BITS => META_BITS, - PIPELINE_STAGE_AFTER => PIPELINE_STAGE_AFTER + INPUTS => INPUTS, + KEY_BITS => KEY_BITS, + DATA_BITS => DATA_BITS, + META_BITS => META_BITS, + PIPELINE_STAGE_AFTER => PIPELINE_STAGE_AFTER ) port map ( - Clock => Clock, - Reset => '0', - - In_Valid => Generator_Valid, - In_IsKey => Generator_IsKey, - In_Data => DataInputMatrix, - In_Meta => Generator_Meta, - - Out_Valid => Sort_Valid, - Out_IsKey => Sort_IsKey, - Out_Data => DataOutputMatrix, - Out_Meta => Sort_Meta + Clock => Clock, + Reset => '0', + + In_Valid => Generator_Valid, + In_IsKey => Generator_IsKey, + In_Data => DataInputMatrix, + In_Meta => Generator_Meta, + + Out_Valid => Sort_Valid, + Out_IsKey => Sort_IsKey, + Out_Data => DataOutputMatrix, + Out_Meta => Sort_Meta ); - Sort_Data <= to_dv(DataOutputMatrix); + Sort_Data <= to_dv(DataOutputMatrix); procChecker : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); - variable Check : boolean; - variable CurValue : unsigned(KEY_BITS - 1 downto 0); - variable LastValue : unsigned(KEY_BITS - 1 downto 0); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); + variable Check : boolean; + variable CurValue : unsigned(KEY_BITS - 1 downto 0); + variable LastValue : unsigned(KEY_BITS - 1 downto 0); - variable ScoreBoardData : T_SCOREBOARD_DATA; + variable ScoreBoardData : T_SCOREBOARD_DATA; begin wait until rising_edge(Sort_Valid); for i in 0 to LOOP_COUNT - 1 loop wait until falling_edge(Clock); - Check := TRUE; - ScoreBoardData.IsKey := Sort_IsKey; - ScoreBoardData.Meta := Sort_Meta; - ScoreBoardData.Data := Sort_Data; + Check := TRUE; + ScoreBoardData.IsKey := Sort_IsKey; + ScoreBoardData.Meta := Sort_Meta; + ScoreBoardData.Data := Sort_Data; ScoreBoard.Check(ScoreBoardData); end loop; -- simAssertion(Check, "Result is not monotonic." & raw_format_slv_hex(std_logic_vector(LastValue))); diff --git a/tb/sort/sortnet/sortnet_OddEvenSort_tb.vhdl b/tb/sort/sortnet/sortnet_OddEvenSort_tb.vhdl index 42ba4c6e0..8af85e67a 100644 --- a/tb/sort/sortnet/sortnet_OddEvenSort_tb.vhdl +++ b/tb/sort/sortnet/sortnet_OddEvenSort_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Testbench: Sorting Network: Odd-Even-Sort (Transposition) +-- Testbench: Sorting Network: Odd-Even-Sort (Transposition) -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,23 +30,23 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library OSVVM; -use OSVVM.RandomPkg.all; +use OSVVM.RandomPkg.all; library PoC; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.strings.all; -use PoC.physical.all; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.strings.all; +use PoC.physical.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; -library Test; +library Test; entity sortnet_OddEvenSort_tb is @@ -54,46 +54,46 @@ end entity; architecture tb of sortnet_OddEvenSort_tb is - constant TAG_BITS : positive := 4; + constant TAG_BITS : positive := 4; - constant INPUTS : positive := 64; - constant DATA_COLUMNS : positive := 2; + constant INPUTS : positive := 64; + constant DATA_COLUMNS : positive := 2; - constant KEY_BITS : positive := 32; - constant DATA_BITS : positive := 64; - constant META_BITS : positive := TAG_BITS; - constant PIPELINE_STAGE_AFTER : natural := 2; + constant KEY_BITS : positive := 32; + constant DATA_BITS : positive := 64; + constant META_BITS : positive := TAG_BITS; + constant PIPELINE_STAGE_AFTER : natural := 2; - constant LOOP_COUNT : positive := 1024; + constant LOOP_COUNT : positive := 1024; - constant STAGES : positive := INPUTS; - constant DELAY : natural := STAGES / PIPELINE_STAGE_AFTER; + constant STAGES : positive := INPUTS; + constant DELAY : natural := STAGES / PIPELINE_STAGE_AFTER; package P_SORTNET_TB is new Test.sortnet_tb generic map ( - META_BITS => META_BITS, - DATA_BITS => DATA_BITS, - INPUTS => INPUTS + META_BITS => META_BITS, + DATA_BITS => DATA_BITS, + INPUTS => INPUTS ); - use P_SORTNET_TB.all; + use P_SORTNET_TB.all; - constant CLOCK_FREQ : FREQ := 100 MHz; - signal Clock : std_logic := '1'; + constant CLOCK_FREQ : FREQ := 100 MHz; + signal Clock : std_logic := '1'; - signal Generator_Valid : std_logic; - signal Generator_IsKey : std_logic; - signal Generator_Data : T_DATA_VECTOR(INPUTS - 1 downto 0); - signal Generator_Meta : std_logic_vector(META_BITS - 1 downto 0); + signal Generator_Valid : std_logic; + signal Generator_IsKey : std_logic; + signal Generator_Data : T_DATA_VECTOR(INPUTS - 1 downto 0); + signal Generator_Meta : std_logic_vector(META_BITS - 1 downto 0); - signal Sort_Valid : std_logic; - signal Sort_IsKey : std_logic; - signal Sort_Data : T_DATA_VECTOR(INPUTS - 1 downto 0); - signal Sort_Meta : std_logic_vector(META_BITS - 1 downto 0); + signal Sort_Valid : std_logic; + signal Sort_IsKey : std_logic; + signal Sort_Data : T_DATA_VECTOR(INPUTS - 1 downto 0); + signal Sort_Meta : std_logic_vector(META_BITS - 1 downto 0); - signal DataInputMatrix : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); - signal DataOutputMatrix : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); + signal DataInputMatrix : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); + signal DataOutputMatrix : T_SLM(INPUTS - 1 downto 0, DATA_BITS - 1 downto 0); - shared variable ScoreBoard : PT_SCOREBOARD; + shared variable ScoreBoard : PT_SCOREBOARD; begin -- initialize global simulation status @@ -109,13 +109,13 @@ begin simGenerateClock(Clock, CLOCK_FREQ); procGenerator : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); - variable RandomVar : RandomPType; -- protected type from RandomPkg + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); + variable RandomVar : RandomPType; -- protected type from RandomPkg - variable KeyInput : std_logic_vector(KEY_BITS - 1 downto 0); - variable DataInput : std_logic_vector(DATA_BITS - KEY_BITS - 1 downto 0); - variable TagInput : std_logic_vector(TAG_BITS - 1 downto 0); - variable Generator_Input : T_DATA_VECTOR(INPUTS - 1 downto 0); + variable KeyInput : std_logic_vector(KEY_BITS - 1 downto 0); + variable DataInput : std_logic_vector(DATA_BITS - KEY_BITS - 1 downto 0); + variable TagInput : std_logic_vector(TAG_BITS - 1 downto 0); + variable Generator_Input : T_DATA_VECTOR(INPUTS - 1 downto 0); function GreaterThan(L : std_logic_vector; R : std_logic_vector) return boolean is alias LL is L(KEY_BITS - 1 downto 0); @@ -124,103 +124,103 @@ begin return unsigned(LL) > unsigned(RR); end function; - variable ScoreBoardData : T_SCOREBOARD_DATA; + variable ScoreBoardData : T_SCOREBOARD_DATA; begin - RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds + RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds - Generator_Valid <= '0'; - Generator_IsKey <= '0'; - Generator_Input := (others => (others => '0')); - Generator_Meta <= (others => '0'); + Generator_Valid <= '0'; + Generator_IsKey <= '0'; + Generator_Input := (others => (others => '0')); + Generator_Meta <= (others => '0'); wait until rising_edge(Clock); - Generator_Valid <= '1'; + Generator_Valid <= '1'; for i in 0 to LOOP_COUNT - 1 loop - TagInput := RandomVar.RandSlv(TAG_BITS); + TagInput := RandomVar.RandSlv(TAG_BITS); - ScoreBoardData.IsKey := to_sl(i mod DATA_COLUMNS = 0); - ScoreBoardData.Meta := resize(TagInput, META_BITS); - Generator_IsKey <= ScoreBoardData.IsKey; - Generator_Meta <= ScoreBoardData.Meta; + ScoreBoardData.IsKey := to_sl(i mod DATA_COLUMNS = 0); + ScoreBoardData.Meta := resize(TagInput, META_BITS); + Generator_IsKey <= ScoreBoardData.IsKey; + Generator_Meta <= ScoreBoardData.Meta; - KeyInput := RandomVar.RandSlv(KEY_BITS); - DataInput := RandomVar.RandSlv(DATA_BITS - KEY_BITS); - Generator_Input(0) := DataInput & KeyInput; + KeyInput := RandomVar.RandSlv(KEY_BITS); + DataInput := RandomVar.RandSlv(DATA_BITS - KEY_BITS); + Generator_Input(0) := DataInput & KeyInput; ScoreBoardData.Data(0):= Generator_Input(0); loop_j: for j in 1 to INPUTS - 1 loop - KeyInput := RandomVar.RandSlv(KEY_BITS); - DataInput := RandomVar.RandSlv(DATA_BITS - KEY_BITS); - Generator_Input(j) := DataInput & KeyInput; + KeyInput := RandomVar.RandSlv(KEY_BITS); + DataInput := RandomVar.RandSlv(DATA_BITS - KEY_BITS); + Generator_Input(j) := DataInput & KeyInput; for k in j downto 1 loop if GreaterThan(ScoreBoardData.Data(k - 1), Generator_Input(j)) then - ScoreBoardData.Data(k) := ScoreBoardData.Data(k - 1); + ScoreBoardData.Data(k) := ScoreBoardData.Data(k - 1); else - ScoreBoardData.Data(k) := Generator_Input(j); + ScoreBoardData.Data(k) := Generator_Input(j); next loop_j; end if; end loop; - ScoreBoardData.Data(0) := Generator_Input(j); + ScoreBoardData.Data(0) := Generator_Input(j); end loop; - Generator_Data <= Generator_Input; + Generator_Data <= Generator_Input; ScoreBoard.Push(ScoreBoardData); wait until rising_edge(Clock); end loop; - Generator_Valid <= '0'; + Generator_Valid <= '0'; wait until rising_edge(Clock); -- This process is finished simDeactivateProcess(simProcessID); - wait; -- forever + wait; -- forever end process; - DataInputMatrix <= to_slm(Generator_Data); + DataInputMatrix <= to_slm(Generator_Data); sort : entity PoC.sortnet_OddEvenSort generic map ( - INPUTS => INPUTS, - KEY_BITS => KEY_BITS, - DATA_BITS => DATA_BITS, - META_BITS => META_BITS, - PIPELINE_STAGE_AFTER => PIPELINE_STAGE_AFTER + INPUTS => INPUTS, + KEY_BITS => KEY_BITS, + DATA_BITS => DATA_BITS, + META_BITS => META_BITS, + PIPELINE_STAGE_AFTER => PIPELINE_STAGE_AFTER ) port map ( - Clock => Clock, - Reset => '0', - - In_Valid => Generator_Valid, - In_IsKey => Generator_IsKey, - In_Data => DataInputMatrix, - In_Meta => Generator_Meta, - - Out_Valid => Sort_Valid, - Out_IsKey => Sort_IsKey, - Out_Data => DataOutputMatrix, - Out_Meta => Sort_Meta + Clock => Clock, + Reset => '0', + + In_Valid => Generator_Valid, + In_IsKey => Generator_IsKey, + In_Data => DataInputMatrix, + In_Meta => Generator_Meta, + + Out_Valid => Sort_Valid, + Out_IsKey => Sort_IsKey, + Out_Data => DataOutputMatrix, + Out_Meta => Sort_Meta ); - Sort_Data <= to_dv(DataOutputMatrix); + Sort_Data <= to_dv(DataOutputMatrix); procChecker : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); - variable Check : boolean; - variable CurValue : unsigned(KEY_BITS - 1 downto 0); - variable LastValue : unsigned(KEY_BITS - 1 downto 0); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); + variable Check : boolean; + variable CurValue : unsigned(KEY_BITS - 1 downto 0); + variable LastValue : unsigned(KEY_BITS - 1 downto 0); - variable ScoreBoardData : T_SCOREBOARD_DATA; + variable ScoreBoardData : T_SCOREBOARD_DATA; begin wait until rising_edge(Sort_Valid); for i in 0 to LOOP_COUNT - 1 loop wait until falling_edge(Clock); - Check := TRUE; - ScoreBoardData.IsKey := Sort_IsKey; - ScoreBoardData.Meta := Sort_Meta; - ScoreBoardData.Data := Sort_Data; + Check := TRUE; + ScoreBoardData.IsKey := Sort_IsKey; + ScoreBoardData.Meta := Sort_Meta; + ScoreBoardData.Data := Sort_Data; ScoreBoard.Check(ScoreBoardData); end loop; -- simAssertion(Check, "Result is not monotonic." & raw_format_slv_hex(std_logic_vector(LastValue))); diff --git a/tb/sort/sortnet/sortnet_Stream_Adapter2_tb.vhdl b/tb/sort/sortnet/sortnet_Stream_Adapter2_tb.vhdl index e228e4cf3..70e814a48 100644 --- a/tb/sort/sortnet/sortnet_Stream_Adapter2_tb.vhdl +++ b/tb/sort/sortnet/sortnet_Stream_Adapter2_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Testbench: TODO +-- Testbench: TODO -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,21 +30,21 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library PoC; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.physical.all; -use PoC.sortnet.all; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.physical.all; +use PoC.sortnet.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; library OSVVM; -use OSVVM.RandomPkg.all; +use OSVVM.RandomPkg.all; entity sortnet_Stream_Adapter2_tb is @@ -52,43 +52,43 @@ end entity; architecture tb of sortnet_Stream_Adapter2_tb is - constant DEBUG : boolean := TRUE; + constant DEBUG : boolean := TRUE; - constant TAG_BITS : positive := 4; + constant TAG_BITS : positive := 4; - constant STREAM_DATA_BITS : positive := ite(DEBUG, 16, 32); - constant STREAM_META_BITS : positive := TAG_BITS; + constant STREAM_DATA_BITS : positive := ite(DEBUG, 16, 32); + constant STREAM_META_BITS : positive := TAG_BITS; - constant DATA_COLUMNS : positive := 2; + constant DATA_COLUMNS : positive := 2; - constant SORTNET_SIZE : positive := ite(DEBUG, 8, 32); --128); - constant SORTNET_KEY_BITS : positive := ite(DEBUG, 8, 32); - constant SORTNET_DATA_BITS : positive := ite(DEBUG, 16, 64); - constant SORTNET_REG_AFTER : positive := 2; + constant SORTNET_SIZE : positive := ite(DEBUG, 8, 32); --128); + constant SORTNET_KEY_BITS : positive := ite(DEBUG, 8, 32); + constant SORTNET_DATA_BITS : positive := ite(DEBUG, 16, 64); + constant SORTNET_REG_AFTER : positive := 2; - constant MERGENET_STAGES : positive := ite(DEBUG, 2, 4); + constant MERGENET_STAGES : positive := ite(DEBUG, 2, 4); - constant LOOP_COUNT : positive := 2; - constant SORTNET_BLOCK_COUNT : positive := 2**MERGENET_STAGES * DATA_COLUMNS * LOOP_COUNT; --ite(DEBUG, 10, 32); --1024); + constant LOOP_COUNT : positive := 2; + constant SORTNET_BLOCK_COUNT : positive := 2**MERGENET_STAGES * DATA_COLUMNS * LOOP_COUNT; --ite(DEBUG, 10, 32); --1024); - -- constant STAGES : POSITIVE := SORTNET_SIZE; - constant DELAY : natural := 3 * 2**MERGENET_STAGES * SORTNET_SIZE + 50; --STAGES / PIPELINE_STAGE_AFTER; + -- constant STAGES : POSITIVE := SORTNET_SIZE; + constant DELAY : natural := 3 * 2**MERGENET_STAGES * SORTNET_SIZE + 50; --STAGES / PIPELINE_STAGE_AFTER; - constant CLOCK_FREQ : FREQ := 100 MHz; - signal Clock : std_logic := '1'; + constant CLOCK_FREQ : FREQ := 100 MHz; + signal Clock : std_logic := '1'; - signal Generator_Valid : std_logic; - signal Generator_Data : std_logic_vector(STREAM_DATA_BITS - 1 downto 0); - signal Generator_SOF : std_logic; - signal Generator_IsKey : std_logic; - signal Generator_EOF : std_logic; - signal Generator_Meta : std_logic_vector(TAG_BITS - 1 downto 0); + signal Generator_Valid : std_logic; + signal Generator_Data : std_logic_vector(STREAM_DATA_BITS - 1 downto 0); + signal Generator_SOF : std_logic; + signal Generator_IsKey : std_logic; + signal Generator_EOF : std_logic; + signal Generator_Meta : std_logic_vector(TAG_BITS - 1 downto 0); - signal Sort_Out_Valid : std_logic; - signal Sort_Out_Data : std_logic_vector(STREAM_DATA_BITS - 1 downto 0); - signal Sort_Out_IsKey : std_logic; + signal Sort_Out_Valid : std_logic; + signal Sort_Out_Data : std_logic_vector(STREAM_DATA_BITS - 1 downto 0); + signal Sort_Out_IsKey : std_logic; - signal Tester_Ack : std_logic; + signal Tester_Ack : std_logic; begin -- initialize global simulation status @@ -102,112 +102,112 @@ begin simGenerateClock(Clock, CLOCK_FREQ); procGenerator : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); - variable RandomVar : RandomPType; -- protected type from RandomPkg + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); + variable RandomVar : RandomPType; -- protected type from RandomPkg - variable KeyInput : std_logic_vector(SORTNET_KEY_BITS - 1 downto 0); - variable DataInput : std_logic_vector(SORTNET_DATA_BITS - SORTNET_KEY_BITS - 1 downto 0); - variable TagInput : std_logic_vector(TAG_BITS - 1 downto 0); + variable KeyInput : std_logic_vector(SORTNET_KEY_BITS - 1 downto 0); + variable DataInput : std_logic_vector(SORTNET_DATA_BITS - SORTNET_KEY_BITS - 1 downto 0); + variable TagInput : std_logic_vector(TAG_BITS - 1 downto 0); begin - RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds + RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds - Generator_Valid <= '0'; - Generator_Data <= (others => '0'); - Generator_SOF <= '0'; - Generator_IsKey <= '0'; - Generator_EOF <= '0'; - Generator_Meta <= (others => '0'); + Generator_Valid <= '0'; + Generator_Data <= (others => '0'); + Generator_SOF <= '0'; + Generator_IsKey <= '0'; + Generator_EOF <= '0'; + Generator_Meta <= (others => '0'); wait until rising_edge(Clock); - Generator_Valid <= '1'; + Generator_Valid <= '1'; for i in 0 to SORTNET_BLOCK_COUNT - 1 loop - TagInput := to_slv(i mod 2**TAG_BITS, TAG_BITS); + TagInput := to_slv(i mod 2**TAG_BITS, TAG_BITS); - Generator_IsKey <= to_sl(i mod DATA_COLUMNS = 0); - Generator_Meta <= resize(TagInput, STREAM_META_BITS); + Generator_IsKey <= to_sl(i mod DATA_COLUMNS = 0); + Generator_Meta <= resize(TagInput, STREAM_META_BITS); for j in 0 to SORTNET_SIZE - 1 loop - KeyInput := RandomVar.RandSlv(SORTNET_KEY_BITS); - DataInput := RandomVar.RandSlv(SORTNET_DATA_BITS - SORTNET_KEY_BITS); + KeyInput := RandomVar.RandSlv(SORTNET_KEY_BITS); + DataInput := RandomVar.RandSlv(SORTNET_DATA_BITS - SORTNET_KEY_BITS); -- assemble data vector and write to stream interface - Generator_SOF <= to_sl((j = 0) and (i mod DATA_COLUMNS = 0)); - Generator_Data <= resize(DataInput & KeyInput, STREAM_DATA_BITS); - Generator_EOF <= to_sl((j = SORTNET_SIZE - 1) and (i mod DATA_COLUMNS = DATA_COLUMNS - 1)); + Generator_SOF <= to_sl((j = 0) and (i mod DATA_COLUMNS = 0)); + Generator_Data <= resize(DataInput & KeyInput, STREAM_DATA_BITS); + Generator_EOF <= to_sl((j = SORTNET_SIZE - 1) and (i mod DATA_COLUMNS = DATA_COLUMNS - 1)); wait until rising_edge(Clock); end loop; end loop; - Generator_Valid <= '0'; + Generator_Valid <= '0'; -- This process is finished simDeactivateProcess(simProcessID); - wait; -- forever + wait; -- forever end process; sort : entity PoC.sortnet_Stream_Adapter2 generic map ( - STREAM_DATA_BITS => STREAM_DATA_BITS, - STREAM_META_BITS => STREAM_META_BITS, - DATA_COLUMNS => DATA_COLUMNS, - -- SORTNET_IMPL => SORT_SORTNET_IMPL_BITONIC_SORT, - -- SORTNET_IMPL => SORT_SORTNET_IMPL_ODDEVEN_SORT, - SORTNET_IMPL => SORT_SORTNET_IMPL_ODDEVEN_MERGESORT, - SORTNET_SIZE => SORTNET_SIZE, - SORTNET_KEY_BITS => SORTNET_KEY_BITS, - SORTNET_DATA_BITS => SORTNET_DATA_BITS, - MERGENET_STAGES => MERGENET_STAGES + STREAM_DATA_BITS => STREAM_DATA_BITS, + STREAM_META_BITS => STREAM_META_BITS, + DATA_COLUMNS => DATA_COLUMNS, + -- SORTNET_IMPL => SORT_SORTNET_IMPL_BITONIC_SORT, + -- SORTNET_IMPL => SORT_SORTNET_IMPL_ODDEVEN_SORT, + SORTNET_IMPL => SORT_SORTNET_IMPL_ODDEVEN_MERGESORT, + SORTNET_SIZE => SORTNET_SIZE, + SORTNET_KEY_BITS => SORTNET_KEY_BITS, + SORTNET_DATA_BITS => SORTNET_DATA_BITS, + MERGENET_STAGES => MERGENET_STAGES ) port map ( - Clock => Clock, - Reset => '0', - - Inverse => '0', - - In_Valid => Generator_Valid, - In_Data => Generator_Data, - In_Meta => Generator_Meta, - In_SOF => Generator_SOF, - In_IsKey => Generator_IsKey, - In_EOF => Generator_EOF, - In_Ack => open, - - Out_Valid => Sort_Out_Valid, - Out_Data => Sort_Out_Data, - Out_Meta => open, - Out_SOF => open, - Out_IsKey => Sort_Out_IsKey, - Out_EOF => open, - Out_Ack => Tester_Ack + Clock => Clock, + Reset => '0', + + Inverse => '0', + + In_Valid => Generator_Valid, + In_Data => Generator_Data, + In_Meta => Generator_Meta, + In_SOF => Generator_SOF, + In_IsKey => Generator_IsKey, + In_EOF => Generator_EOF, + In_Ack => open, + + Out_Valid => Sort_Out_Valid, + Out_Data => Sort_Out_Data, + Out_Meta => open, + Out_SOF => open, + Out_IsKey => Sort_Out_IsKey, + Out_EOF => open, + Out_Ack => Tester_Ack ); procChecker : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); - variable Check : boolean; - variable CurValue : unsigned(SORTNET_KEY_BITS - 1 downto 0); - variable LastValue : unsigned(SORTNET_KEY_BITS - 1 downto 0); + variable Check : boolean; + variable CurValue : unsigned(SORTNET_KEY_BITS - 1 downto 0); + variable LastValue : unsigned(SORTNET_KEY_BITS - 1 downto 0); begin - Tester_Ack <= '0'; + Tester_Ack <= '0'; simWaitUntilRisingEdge(Clock, 8); wait until (Sort_Out_Data /= (STREAM_DATA_BITS - 1 downto 0 => '0')); - Tester_Ack <= '1'; + Tester_Ack <= '1'; for i in 0 to SORTNET_BLOCK_COUNT - 1 loop - Check := TRUE; - LastValue := (others => '0'); + Check := TRUE; + LastValue := (others => '0'); for j in 0 to SORTNET_SIZE - 1 loop wait until rising_edge(Clock); if (Sort_Out_IsKey = '1') then - CurValue := unsigned(Sort_Out_Data(SORTNET_KEY_BITS - 1 downto 0)); - Check := Check and (LastValue <= CurValue); - LastValue := CurValue; + CurValue := unsigned(Sort_Out_Data(SORTNET_KEY_BITS - 1 downto 0)); + Check := Check and (LastValue <= CurValue); + LastValue := CurValue; end if; end loop; simAssertion(Check, "Result is not monotonic."); diff --git a/tb/sort/sortnet/sortnet_Stream_Adapter_tb.vhdl b/tb/sort/sortnet/sortnet_Stream_Adapter_tb.vhdl index d7118fe03..1864b5d57 100644 --- a/tb/sort/sortnet/sortnet_Stream_Adapter_tb.vhdl +++ b/tb/sort/sortnet/sortnet_Stream_Adapter_tb.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Testbench: Sorting Network: Stream_Adapter +-- Testbench: Sorting Network: Stream_Adapter -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,21 +30,21 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library PoC; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.physical.all; -use PoC.sortnet.all; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.physical.all; +use PoC.sortnet.all; -- simulation only packages -use PoC.sim_types.all; -use PoC.simulation.all; -use PoC.waveform.all; +use PoC.sim_types.all; +use PoC.simulation.all; +use PoC.waveform.all; library OSVVM; -use OSVVM.RandomPkg.all; +use OSVVM.RandomPkg.all; entity sortnet_Stream_Adapter_tb is @@ -52,35 +52,35 @@ end entity; architecture tb of sortnet_Stream_Adapter_tb is - constant DEBUG : boolean := TRUE; + constant DEBUG : boolean := TRUE; - constant STREAM_DATA_BITS : positive := ite(DEBUG, 16, 32); + constant STREAM_DATA_BITS : positive := ite(DEBUG, 16, 32); - constant SORTNET_SIZE : positive := ite(DEBUG, 8, 128); - constant SORTNET_KEY_BITS : positive := ite(DEBUG, 8, 32); - constant SORTNET_DATA_BITS : positive := ite(DEBUG, 16, 64); + constant SORTNET_SIZE : positive := ite(DEBUG, 8, 128); + constant SORTNET_KEY_BITS : positive := ite(DEBUG, 8, 32); + constant SORTNET_DATA_BITS : positive := ite(DEBUG, 16, 64); - constant LOOP_COUNT : positive := ite(DEBUG, 10, 32); --1024); + constant LOOP_COUNT : positive := ite(DEBUG, 10, 32); --1024); - constant STAGES : positive := SORTNET_SIZE; - constant DELAY : natural := 50; --STAGES / PIPELINE_STAGE_AFTER; + constant STAGES : positive := SORTNET_SIZE; + constant DELAY : natural := 50; --STAGES / PIPELINE_STAGE_AFTER; - constant CLOCK_FREQ : FREQ := 100 MHz; - signal Clock : std_logic := '1'; + constant CLOCK_FREQ : FREQ := 100 MHz; + signal Clock : std_logic := '1'; - constant TAG_BITS : positive := 2; - signal Generator_Valid : std_logic; - signal Generator_Data : std_logic_vector(STREAM_DATA_BITS - 1 downto 0); - signal Generator_IsKey : std_logic; - signal Generator_Tag : std_logic_vector(TAG_BITS - 1 downto 0); + constant TAG_BITS : positive := 2; + signal Generator_Valid : std_logic; + signal Generator_Data : std_logic_vector(STREAM_DATA_BITS - 1 downto 0); + signal Generator_IsKey : std_logic; + signal Generator_Tag : std_logic_vector(TAG_BITS - 1 downto 0); - signal Sort_Out_Valid : std_logic; - signal Sort_Out_Data : std_logic_vector(STREAM_DATA_BITS - 1 downto 0); - signal Sort_Out_IsKey : std_logic; + signal Sort_Out_Valid : std_logic; + signal Sort_Out_Data : std_logic_vector(STREAM_DATA_BITS - 1 downto 0); + signal Sort_Out_IsKey : std_logic; - signal Tester_Ack : std_logic; + signal Tester_Ack : std_logic; - signal StopSimulation : std_logic := '0'; + signal StopSimulation : std_logic := '0'; begin -- initialize global simulation status simInitialize; @@ -89,101 +89,101 @@ begin simGenerateClock(Clock, CLOCK_FREQ); procGenerator : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); - variable RandomVar : RandomPType; -- protected type from RandomPkg + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Generator"); + variable RandomVar : RandomPType; -- protected type from RandomPkg - variable KeyInput : std_logic_vector(SORTNET_KEY_BITS - 1 downto 0); - variable DataInput : std_logic_vector(SORTNET_DATA_BITS - SORTNET_KEY_BITS - 1 downto 0); + variable KeyInput : std_logic_vector(SORTNET_KEY_BITS - 1 downto 0); + variable DataInput : std_logic_vector(SORTNET_DATA_BITS - SORTNET_KEY_BITS - 1 downto 0); begin - RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds + RandomVar.InitSeed(RandomVar'instance_name); -- Generate initial seeds - Generator_Valid <= '0'; - Generator_Data <= (others => '0'); - Generator_IsKey <= '0'; - Generator_Tag <= (others => '0'); + Generator_Valid <= '0'; + Generator_Data <= (others => '0'); + Generator_IsKey <= '0'; + Generator_Tag <= (others => '0'); wait until rising_edge(Clock); - Generator_Valid <= '1'; + Generator_Valid <= '1'; for i in 0 to LOOP_COUNT - 1 loop - Generator_IsKey <= to_sl(i mod 2 = 0); - Generator_Tag <= to_slv(i mod 2, TAG_BITS); + Generator_IsKey <= to_sl(i mod 2 = 0); + Generator_Tag <= to_slv(i mod 2, TAG_BITS); for j in 0 to SORTNET_SIZE - 1 loop - KeyInput := RandomVar.RandSlv(SORTNET_KEY_BITS); - DataInput := RandomVar.RandSlv(SORTNET_DATA_BITS - SORTNET_KEY_BITS); + KeyInput := RandomVar.RandSlv(SORTNET_KEY_BITS); + DataInput := RandomVar.RandSlv(SORTNET_DATA_BITS - SORTNET_KEY_BITS); -- assemble data vector and write to stream interface - Generator_Data <= resize(DataInput & KeyInput, STREAM_DATA_BITS); + Generator_Data <= resize(DataInput & KeyInput, STREAM_DATA_BITS); wait until rising_edge(Clock); end loop; end loop; - Generator_Valid <= '0'; + Generator_Valid <= '0'; simWaitUntilRisingEdge(Clock, 8); -- This process is finished simDeactivateProcess(simProcessID); - wait; -- forever + wait; -- forever end process; sort : entity PoC.sortnet_Stream_Adapter generic map ( - STREAM_DATA_BITS => STREAM_DATA_BITS, - -- SORTNET_IMPL => SORT_SORTNET_IMPL_BITONIC_SORT, - SORTNET_IMPL => SORT_SORTNET_IMPL_ODDEVEN_SORT, - -- SORTNET_IMPL => SORT_SORTNET_IMPL_ODDEVEN_MERGESORT, - SORTNET_SIZE => SORTNET_SIZE, - SORTNET_KEY_BITS => SORTNET_KEY_BITS, - SORTNET_DATA_BITS => SORTNET_DATA_BITS, - INVERSE => FALSE + STREAM_DATA_BITS => STREAM_DATA_BITS, + -- SORTNET_IMPL => SORT_SORTNET_IMPL_BITONIC_SORT, + SORTNET_IMPL => SORT_SORTNET_IMPL_ODDEVEN_SORT, + -- SORTNET_IMPL => SORT_SORTNET_IMPL_ODDEVEN_MERGESORT, + SORTNET_SIZE => SORTNET_SIZE, + SORTNET_KEY_BITS => SORTNET_KEY_BITS, + SORTNET_DATA_BITS => SORTNET_DATA_BITS, + INVERSE => FALSE ) port map ( - Clock => Clock, - Reset => '0', - - In_Valid => Generator_Valid, - In_IsKey => Generator_IsKey, - In_Data => Generator_Data, - In_Meta => Generator_Tag, - In_Ack => open, - - Out_Valid => Sort_Out_Valid, - Out_IsKey => Sort_Out_IsKey, - Out_Data => Sort_Out_Data, - Out_Meta => open, - Out_Ack => Tester_Ack + Clock => Clock, + Reset => '0', + + In_Valid => Generator_Valid, + In_IsKey => Generator_IsKey, + In_Data => Generator_Data, + In_Meta => Generator_Tag, + In_Ack => open, + + Out_Valid => Sort_Out_Valid, + Out_IsKey => Sort_Out_IsKey, + Out_Data => Sort_Out_Data, + Out_Meta => open, + Out_Ack => Tester_Ack ); procChecker : process - constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); + constant simProcessID : T_SIM_PROCESS_ID := simRegisterProcess("Checker"); - variable Check : boolean; - variable CurValue : unsigned(SORTNET_KEY_BITS - 1 downto 0); - variable LastValue : unsigned(SORTNET_KEY_BITS - 1 downto 0); + variable Check : boolean; + variable CurValue : unsigned(SORTNET_KEY_BITS - 1 downto 0); + variable LastValue : unsigned(SORTNET_KEY_BITS - 1 downto 0); begin report "Delay=" & integer'image(DELAY) severity NOTE; - Tester_Ack <= '0'; + Tester_Ack <= '0'; simWaitUntilRisingEdge(Clock, 8); wait until (Sort_Out_Data /= (STREAM_DATA_BITS - 1 downto 0 => '0')); - Tester_Ack <= '1'; + Tester_Ack <= '1'; for i in 0 to LOOP_COUNT - 1 loop - Check := TRUE; - LastValue := (others => '0'); + Check := TRUE; + LastValue := (others => '0'); for j in 0 to SORTNET_SIZE - 1 loop wait until rising_edge(Clock); if (Sort_Out_IsKey = '1') then - CurValue := unsigned(Sort_Out_Data(SORTNET_KEY_BITS - 1 downto 0)); - Check := Check and (LastValue <= CurValue); - LastValue := CurValue; + CurValue := unsigned(Sort_Out_Data(SORTNET_KEY_BITS - 1 downto 0)); + Check := Check and (LastValue <= CurValue); + LastValue := CurValue; end if; end loop; simAssertion(Check, "Result is not monotonic."); diff --git a/tb/sort/sortnet/sortnet_tb.pkg.vhdl b/tb/sort/sortnet/sortnet_tb.pkg.vhdl index a70137a74..16cdfab25 100644 --- a/tb/sort/sortnet/sortnet_tb.pkg.vhdl +++ b/tb/sort/sortnet/sortnet_tb.pkg.vhdl @@ -3,24 +3,24 @@ -- kate: tab-width 2; replace-tabs off; indent-width 2; -- -- ============================================================================= --- Authors: Patrick Lehmann +-- Authors: Patrick Lehmann -- --- Module: TODO +-- Module: TODO -- -- Description: -- ------------------------------------ --- TODO +-- TODO -- -- License: -- ============================================================================= -- Copyright 2007-2016 Technische Universitaet Dresden - Germany --- Chair of VLSI-Design, Diagnostics and Architecture +-- Chair of VLSI-Design, Diagnostics and Architecture -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, @@ -30,26 +30,26 @@ -- ============================================================================= library IEEE; -use IEEE.STD_LOGIC_1164.all; -use IEEE.NUMERIC_STD.all; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; library OSVVM; library PoC; -use PoC.utils.all; -use PoC.vectors.all; -use PoC.strings.all; +use PoC.utils.all; +use PoC.vectors.all; +use PoC.strings.all; package sortnet_tb is generic ( - META_BITS : positive; - DATA_BITS : positive; - INPUTS : positive + META_BITS : positive; + DATA_BITS : positive; + INPUTS : positive ); - subtype T_DATA is std_logic_vector(DATA_BITS - 1 downto 0); - type T_DATA_VECTOR is array(natural range <>) of T_DATA; + subtype T_DATA is std_logic_vector(DATA_BITS - 1 downto 0); + type T_DATA_VECTOR is array(natural range <>) of T_DATA; function to_dv(slm : T_SLM) return T_DATA_VECTOR; function to_slm(dv : T_DATA_VECTOR) return T_SLM; @@ -80,11 +80,11 @@ package body sortnet_tb is function match(expected : T_SCOREBOARD_DATA; actual : T_SCOREBOARD_DATA) return boolean is variable good : boolean; begin - good := (expected.IsKey = actual.IsKey); - good := good and (expected.Meta = actual.Meta); + good := (expected.IsKey = actual.IsKey); + good := good and (expected.Meta = actual.Meta); if (expected.IsKey = '1') then for i in expected.Data'range loop - good := good and (expected.Data(i) = actual.Data(i)); + good := good and (expected.Data(i) = actual.Data(i)); exit when (good = FALSE); end loop; end if; @@ -96,28 +96,28 @@ package body sortnet_tb is begin KeyMarker := ite((dataset.IsKey = '1'), "* ", " "); -- for i in 0 to 0 loop --dataset.Key'range loop - return "Data: " & to_string(dataset.Data(0), 'h') & KeyMarker & + return "Data: " & to_string(dataset.Data(0), 'h') & KeyMarker & " Meta: " & to_string(dataset.Meta, 'h'); -- end loop; end function; function to_dv(slm : T_SLM) return T_DATA_VECTOR is - variable Result : T_DATA_VECTOR(slm'range(1)); + variable Result : T_DATA_VECTOR(slm'range(1)); begin for i in slm'high(1) downto slm'low(1) loop for j in T_DATA'range loop - Result(i)(j) := slm(i, j); + Result(i)(j) := slm(i, j); end loop; end loop; return Result; end function; function to_slm(dv : T_DATA_VECTOR) return T_SLM is - variable Result : T_SLM(dv'range, T_DATA'range); + variable Result : T_SLM(dv'range, T_DATA'range); begin for i in dv'range loop for j in T_DATA'range loop - Result(i, j) := dv(i)(j); + Result(i, j) := dv(i)(j); end loop; end loop; return Result; diff --git a/tb/sync/Bits/sync_Bits_Simple.vhdl b/tb/sync/Bits/sync_Bits_Simple.vhdl index ebab1e964..d4f0d8fcf 100644 --- a/tb/sync/Bits/sync_Bits_Simple.vhdl +++ b/tb/sync/Bits/sync_Bits_Simple.vhdl @@ -19,7 +19,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/sync/Bits/sync_Bits_TestController.vhdl b/tb/sync/Bits/sync_Bits_TestController.vhdl index 61e973cc2..dea3ca369 100644 --- a/tb/sync/Bits/sync_Bits_TestController.vhdl +++ b/tb/sync/Bits/sync_Bits_TestController.vhdl @@ -18,7 +18,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/sync/Bits/sync_Bits_TestHarness.vhdl b/tb/sync/Bits/sync_Bits_TestHarness.vhdl index f81d54072..b2247fee2 100644 --- a/tb/sync/Bits/sync_Bits_TestHarness.vhdl +++ b/tb/sync/Bits/sync_Bits_TestHarness.vhdl @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/sync/Command/sync_Command_Simple.vhdl b/tb/sync/Command/sync_Command_Simple.vhdl index ccec64b8f..6cd7afbfd 100644 --- a/tb/sync/Command/sync_Command_Simple.vhdl +++ b/tb/sync/Command/sync_Command_Simple.vhdl @@ -19,7 +19,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/sync/Command/sync_Command_TestController.vhdl b/tb/sync/Command/sync_Command_TestController.vhdl index 97065ec2d..3b2cd98e3 100644 --- a/tb/sync/Command/sync_Command_TestController.vhdl +++ b/tb/sync/Command/sync_Command_TestController.vhdl @@ -18,7 +18,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/sync/Command/sync_Command_TestHarness.vhdl b/tb/sync/Command/sync_Command_TestHarness.vhdl index 8609327f7..2d6bb2689 100644 --- a/tb/sync/Command/sync_Command_TestHarness.vhdl +++ b/tb/sync/Command/sync_Command_TestHarness.vhdl @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/sync/Reset/sync_Reset_Simple.vhdl b/tb/sync/Reset/sync_Reset_Simple.vhdl index 5602f31a6..083efc78b 100644 --- a/tb/sync/Reset/sync_Reset_Simple.vhdl +++ b/tb/sync/Reset/sync_Reset_Simple.vhdl @@ -19,7 +19,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/sync/Reset/sync_Reset_TestController.vhdl b/tb/sync/Reset/sync_Reset_TestController.vhdl index 4b08393ac..2769ca9b6 100644 --- a/tb/sync/Reset/sync_Reset_TestController.vhdl +++ b/tb/sync/Reset/sync_Reset_TestController.vhdl @@ -18,7 +18,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/sync/Reset/sync_Reset_TestHarness.vhdl b/tb/sync/Reset/sync_Reset_TestHarness.vhdl index 270b475d7..afd54b888 100644 --- a/tb/sync/Reset/sync_Reset_TestHarness.vhdl +++ b/tb/sync/Reset/sync_Reset_TestHarness.vhdl @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/sync/Strobe/sync_Strobe_Simple.vhdl b/tb/sync/Strobe/sync_Strobe_Simple.vhdl index daebb36ac..7e729a37d 100644 --- a/tb/sync/Strobe/sync_Strobe_Simple.vhdl +++ b/tb/sync/Strobe/sync_Strobe_Simple.vhdl @@ -19,7 +19,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/sync/Strobe/sync_Strobe_TestController.vhdl b/tb/sync/Strobe/sync_Strobe_TestController.vhdl index cd0583672..78da6dd41 100644 --- a/tb/sync/Strobe/sync_Strobe_TestController.vhdl +++ b/tb/sync/Strobe/sync_Strobe_TestController.vhdl @@ -18,7 +18,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/sync/Strobe/sync_Strobe_TestHarness.vhdl b/tb/sync/Strobe/sync_Strobe_TestHarness.vhdl index 6e60a693e..1c8901960 100644 --- a/tb/sync/Strobe/sync_Strobe_TestHarness.vhdl +++ b/tb/sync/Strobe/sync_Strobe_TestHarness.vhdl @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/sync/Vector/sync_Vector_Simple.vhdl b/tb/sync/Vector/sync_Vector_Simple.vhdl index e39aaf375..be78965fc 100644 --- a/tb/sync/Vector/sync_Vector_Simple.vhdl +++ b/tb/sync/Vector/sync_Vector_Simple.vhdl @@ -19,7 +19,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/sync/Vector/sync_Vector_TestController.vhdl b/tb/sync/Vector/sync_Vector_TestController.vhdl index aaa6723d5..be47198aa 100644 --- a/tb/sync/Vector/sync_Vector_TestController.vhdl +++ b/tb/sync/Vector/sync_Vector_TestController.vhdl @@ -18,7 +18,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tb/sync/Vector/sync_Vector_TestHarness.vhdl b/tb/sync/Vector/sync_Vector_TestHarness.vhdl index b4b7fa481..2b99d8c45 100644 --- a/tb/sync/Vector/sync_Vector_TestHarness.vhdl +++ b/tb/sync/Vector/sync_Vector_TestHarness.vhdl @@ -15,7 +15,7 @@ -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- --- http://www.apache.org/licenses/LICENSE-2.0 +-- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, diff --git a/tcl/README.md b/tcl/README.md deleted file mode 100644 index ca9e52e67..000000000 --- a/tcl/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Tcl Procedures and Scripts - -This directory provides a collection of code snippets to support the workflow -on Tcl-controlled tools. The tasks of Tcl scripts are quite versatile and -can be distinguished, at least, into: - - * tool control, and - * constraint specification. - -Both of these tasks typically demand inherently tool- or device-dependent -code. So, please, classify scripts into an appropriate subdirectory that -identifies: - - * the targeted tool, or - * the target hardware platform. diff --git a/tcl/common/utils.tcl b/tcl/common/utils.tcl deleted file mode 100644 index d49f0d12e..000000000 --- a/tcl/common/utils.tcl +++ /dev/null @@ -1,53 +0,0 @@ -# EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- -# vim: tabstop=2:shiftwidth=2:noexpandtab -# kate: tab-width 2; replace-tabs off; indent-width 2; -# ============================================================================ -# Tcl Include: Vivado Workflow Utility Procedures -# -# Authors: Thomas B. Preusser -# -# Description -# ----------- -# This is a collection of generic utility Tcl procedures. -# -# License: -# ============================================================================ -# Copyright 2007-2016 Technische Universitaet Dresden - Germany -# Chair of VLSI-Design, Diagnostics and Architecture -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================ - -# Extracts a the values of the named constants from a VHDL configuration -# packaged and associates them with a variable of the same name within the -# calling scope. -# -# Note: This implementation will fail on string values containing ';'. -proc read_vhdl_config {config_vhdl names} { - # Read config file into string - set fd [open $config_vhdl r] - set data [list [read $fd]] - close $fd - - # Build list of values assigned to passed configuration variable names - foreach name $names { - if { [regexp -nocase [string tolower "constant\\s*$name\\s*:\\s*\\w+\\s*:=\\s*(\[^;]+?)\\s*;"] $data all val] } { - uplevel set $name "{$val}" - } - } -} - -# Strips the specified unit string from the passed value. -proc strip_unit {val unit} { - return [lindex [regexp -inline "(.*)\\s+$unit" $val] 1] -} diff --git a/tcl/vivado/utils.tcl b/tcl/vivado/utils.tcl deleted file mode 100644 index 8e3117210..000000000 --- a/tcl/vivado/utils.tcl +++ /dev/null @@ -1,40 +0,0 @@ -# EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- -# vim: tabstop=2:shiftwidth=2:noexpandtab -# kate: tab-width 2; replace-tabs off; indent-width 2; -# ============================================================================ -# Authors: Thomas B. Preusser -# -# Tcl Include: Vivado Workflow Utility Procedures -# -# Description -# ----------- -# This is a collection of Tcl procedures that aim at easing the scripted -# Vivado workflow. -# -# License: -# ============================================================================ -# Copyright 2007-2016 Technische Universitaet Dresden - Germany -# Chair of VLSI-Design, Diagnostics and Architecture -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================ - -# Called with the name of a bus[0 to N-1] and a list of package pins, -# this procedure assigns the first N pins to the respective bus ports. -proc assign_bus_pins {bus pins} { - for {set i 0} {$i < [llength $pins]} {incr i} { - set PORT [get_ports -quiet "$bus[$i]"] - if { [llength $PORT] == 0 } { break } - set_property PACKAGE_PIN [lindex $pins $i] $PORT - } -} diff --git a/tools/GitLab-CI/config.private.ini b/tools/GitLab-CI/config.private.ini deleted file mode 100644 index 13ec516c5..000000000 --- a/tools/GitLab-CI/config.private.ini +++ /dev/null @@ -1,146 +0,0 @@ -[INSTALL.PoC] -Version = 1.1.1 -InstallationDirectory = /home/gitlab-runner/builds/b9de475c/0/GitHub/PLC2/PoC -RepositoryKind = Public -IsGitRepository = True -GitRemoteBranch = release -MultiVersionSupport = True -HasInstalledGitHooks = False -HasInstalledGitFilters = False - -[SOLUTION.Solutions] - - - -[INSTALL.ModelSim] -SectionName = INSTALL.Mentor.QuestaSim -Version = ${${SectionName}:Version} -Edition = ${${SectionName}:Edition} -InstallationDirectory = ${${SectionName}:InstallationDirectory} -BinaryDirectory = ${${SectionName}:BinaryDirectory} -AdditionalVComOptions = ${${SectionName}:AdditionalVComOptions} -AdditionalVSimOptions = ${${SectionName}:AdditionalVSimOptions} - -[INSTALL.ActiveHDL] -SectionName = INSTALL.Lattice.ActiveHDL -Version = ${${SectionName}:Version} -Edition = ${${SectionName}:Edition} -InstallationDirectory = ${${SectionName}:InstallationDirectory} -BinaryDirectory = ${${SectionName}:BinaryDirectory} - -[INSTALL.Quartus] -SectionName = INSTALL.Intel.Quartus -Version = ${${SectionName}:Version} -Edition = ${${SectionName}:Edition} -InstallationDirectory = ${${SectionName}:InstallationDirectory} -BinaryDirectory = ${${SectionName}:BinaryDirectory} - - - -[INSTALL.Aldec] - -[INSTALL.Aldec.ActiveHDL] - -[INSTALL.Aldec.RivieraPRO] - - - -[INSTALL.Altera] - -[INSTALL.Altera.Quartus] - -[INSTALL.Altera.ModelSim] - - - -[INSTALL.Intel] - -[INSTALL.Intel.Quartus] - -[INSTALL.Intel.ModelSim] - - - -[INSTALL.Lattice] - - -[INSTALL.Lattice.Diamond] - -[INSTALL.Lattice.ActiveHDL] - - - -[INSTALL.Mentor] - -[INSTALL.Mentor.ModelSimPE] - -[INSTALL.Mentor.ModelSimDE] - -[INSTALL.Mentor.ModelSimSE32] - -[INSTALL.Mentor.ModelSimSE64] - -[INSTALL.Mentor.QuestaSim] - - - -[INSTALL.Xilinx] -InstallationDirectory = /opt/Xilinx - -[INSTALL.Xilinx.ISE] -Version = 14.7 -SectionName = %{PathWithRoot}#${Version} -InstallationDirectory = ${${SectionName}:InstallationDirectory} -BinaryDirectory = ${${SectionName}:BinaryDirectory} - -[INSTALL.Xilinx.ISE#14.7] -Version = 14.7 -InstallationDirectory = ${INSTALL.Xilinx:InstallationDirectory}/${Version}/ISE_DS -BinaryDirectory = ${InstallationDirectory}/ISE/bin/nt64 - - -[INSTALL.Xilinx.Vivado] -Version = 2017.4 -SectionName = %{PathWithRoot}#${Version} -InstallationDirectory = ${${SectionName}:InstallationDirectory} -BinaryDirectory = ${${SectionName}:BinaryDirectory} - -[INSTALL.Xilinx.Vivado#2017.3] -Version = 2017.3 -InstallationDirectory = ${INSTALL.Xilinx:InstallationDirectory}/Vivado/${Version} -BinaryDirectory = ${InstallationDirectory}/bin - -[INSTALL.Xilinx.Vivado#2017.4] -Version = 2017.4 -InstallationDirectory = ${INSTALL.Xilinx:InstallationDirectory}/Vivado/${Version} -BinaryDirectory = ${InstallationDirectory}/bin - - - -[INSTALL.GHDL] -Version = 0.36-dev -Backend = llvm -Runtime = gcc -SectionName = %{PathWithRoot}#${Version}-${Runtime}-${Backend} -InstallationDirectory = ${${SectionName}:InstallationDirectory} -BinaryDirectory = ${${SectionName}:BinaryDirectory} -ScriptDirectory = ${${SectionName}:ScriptDirectory} - -[INSTALL.GHDL#0.36-dev-gcc-llvm] -Version = 0.36-dev -Backend = llvm -Runtime = gcc -InstallationDirectory = /opt/ghdl/0.36-dev-gcc73-llvm5 -BinaryDirectory = ${InstallationDirectory}/bin -ScriptDirectory = ${InstallationDirectory}/lib/ghdl/vendors - - - -[INSTALL.GTKWave] - - - -[INSTALL.Git] -InstallationDirectory = /usr -BinaryDirectory = ${InstallationDirectory}/bin -Version = 2.17.1 diff --git a/tools/GitLab-CI/ghdl.setup.sh b/tools/GitLab-CI/ghdl.setup.sh deleted file mode 100755 index e4aa9c9bb..000000000 --- a/tools/GitLab-CI/ghdl.setup.sh +++ /dev/null @@ -1,87 +0,0 @@ -#! /usr/bin/env bash - -# configure variables in the section below -GHDL_BACKEND="llvm-3.8" -#GHDL_VERSION="0.36-dev" -GHDL_VERSION="0.35" -RELEASE_DATE="2017-12-14" -PLATFORM="ubuntu14" - -GITHUB_SERVER="https://github.com" -GITHUB_SLUG="ghdl/ghdl" - -GITLAB_DIR="temp/GirLab-CI" - - -# assemble the GitHub URL -# -------------------------------------- -# example: 2016-05-03 -#GITHUB_TAGNAME="$RELEASE_DATE" -GITHUB_TAGNAME="v$GHDL_VERSION" - -# example: ghdl-0.36-dev-llvm-3.8-ubuntu14.tgz -GITHUB_RELEASE_FILE="ghdl-$GHDL_VERSION-$GHDL_BACKEND-$PLATFORM.tgz" - -# example: https://github.com/ghdl/ghdl/releases/download/v0.36-dev/ghdl-0.36dev-llvm-3.8-ubuntu14.tgz -GITHUB_URL="$GITHUB_SERVER/$GITHUB_SLUG/releases/download/$GITHUB_TAGNAME/$GITHUB_RELEASE_FILE" - - -# other variables -# -------------------------------------- -GITROOT=$(pwd) -GHDL_TARBALL="ghdl.tgz" - -# define color escape codes -RED='\e[0;31m' # Red -GREEN='\e[1;32m' # Green -YELLOW='\e[1;33m' # Yellow -MAGENTA='\e[1;35m' # Magenta -CYAN='\e[1;36m' # Cyan -NOCOLOR='\e[0m' # No Color - - -echo -e "${MAGENTA}========================================${NOCOLOR}" -echo -e "${MAGENTA} Downloading and installing GHDL ${NOCOLOR}" -echo -e "${MAGENTA}========================================${NOCOLOR}" -echo -e "${CYAN}mkdir -p $GITLAB_DIR${NOCOLOR}" -mkdir -p $GITLAB_DIR -cd $GITLAB_DIR - -# downloading GHDL -echo -e "${CYAN}Downloading $GHDL_TARBALL from $GITHUB_URL...${NOCOLOR}" -wget -q $GITHUB_URL -O $GHDL_TARBALL -if [ $? -eq 0 ]; then - echo -e "${GREEN}Download [SUCCESSFUL]${NOCOLOR}" -else - echo 1>&2 -e "${RED}Download of $GITHUB_RELEASE_FILE [FAILED]${NOCOLOR}" - exit 1 -fi - -# unpack GHDL -if [ -e $GHDL_TARBALL ]; then - echo -e "${CYAN}Unpacking $GHDL_TARBALL... ${NOCOLOR}" - tar -xzf $GHDL_TARBALL - if [ $? -eq 0 ]; then - echo -e "${GREEN}Unpack [SUCCESSFUL]${NOCOLOR}" - else - echo 1>&2 -e "${RED}Unpack [FAILED]${NOCOLOR}" - exit 1 - fi -fi - -# remove downloaded files -rm $GHDL_TARBALL - -# gcc debugging -echo -e "${CYAN}Testing GCC version and configuration...${NOCOLOR}" -gcc -v - -# test ghdl version -echo -e "${CYAN}Testing GHDL version...${NOCOLOR}" -./bin/ghdl -v -if [ $? -eq 0 ]; then - echo -e "${GREEN}GHDL test [SUCCESSFUL]${NOCOLOR}" -else - echo 1>&2 -e "${RED}GHDL test [FAILED]${NOCOLOR}" - exit 1 -fi diff --git a/tools/GitLab-CI/grc.setup.sh b/tools/GitLab-CI/grc.setup.sh deleted file mode 100644 index d625c64e2..000000000 --- a/tools/GitLab-CI/grc.setup.sh +++ /dev/null @@ -1,68 +0,0 @@ -#! /usr/bin/env bash - -# configure variables in the section below -GRC_FILE="grc_1.11.3-1_all.deb" -#GRC_FILE="grc_1.9-1_all.deb" -TEMP_DIR="temp" - - -# assemble the download URL -# -------------------------------------- -GRC_URL="https://korpus.sk/~garabik/software/grc/$GRC_FILE" -#GRC_URL="http://kassiopeia.juls.savba.sk/~garabik/software/grc/$GRC_FILE" -# other variables -# -------------------------------------- -GITROOT=$(pwd) -GRC_DEB="grc.deb" - -# define color escape codes -RED='\e[0;31m' # Red -GREEN='\e[1;32m' # Green -YELLOW='\e[1;33m' # Yellow -MAGENTA='\e[1;35m' # Magenta -CYAN='\e[1;36m' # Cyan -NOCOLOR='\e[0m' # No Color - - -echo -e "${MAGENTA}========================================${NOCOLOR}" -echo -e "${MAGENTA} Downloading and installing grcat ${NOCOLOR}" -echo -e "${MAGENTA}========================================${NOCOLOR}" -echo -e "${CYAN}mkdir -p $TEMP_DIR${NOCOLOR}" -mkdir -p $TEMP_DIR && cd $TEMP_DIR - -# downloading GHDL -echo -e "${CYAN}Downloading $GRC_DEB from $GRC_URL...${NOCOLOR}" -wget -q $GRC_URL -O $GRC_DEB -if [ $? -eq 0 ]; then - echo -e "${GREEN}Download [SUCCESSFUL]${NOCOLOR}" -else - echo 1>&2 -e "${RED}Download of $GRC_FILE [FAILED]${NOCOLOR}" - exit 1 -fi - -# install grcat -if [ -e $GRC_DEB ]; then - echo -e "${CYAN}Installing $GRC_DEB... ${NOCOLOR}" - sudo dpkg -i $GRC_DEB - if [ $? -eq 0 ]; then - echo -e "${GREEN}Installation [SUCCESSFUL]${NOCOLOR}" - else - echo 1>&2 -e "${RED}Installation [FAILED]${NOCOLOR}" - exit 0 - #exit 1 - fi -fi - -# remove downloaded files -rm $GRC_DEB - -# test grc version -echo -e "${CYAN}Testing grc version...${NOCOLOR}" -grc --version -if [ $? -eq 0 ]; then - echo -e "${GREEN}grc/grcat test [SUCCESSFUL]${NOCOLOR}" - exit 0 -else - echo 1>&2 -e "${RED}grc/grcat test [FAILED]${NOCOLOR}" - exit 1 -fi diff --git a/tools/GitLab-CI/modelsim.ini b/tools/GitLab-CI/modelsim.ini deleted file mode 100644 index 658d40ab2..000000000 --- a/tools/GitLab-CI/modelsim.ini +++ /dev/null @@ -1,2 +0,0 @@ -[Library] -others = $MODEL_TECH/../modelsim.ini diff --git a/tools/GitLab-CI/my_project.vhdl b/tools/GitLab-CI/my_project.vhdl deleted file mode 100644 index b9b02d8c5..000000000 --- a/tools/GitLab-CI/my_project.vhdl +++ /dev/null @@ -1,47 +0,0 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- --- ============================================================================= --- Authors: Patrick Lehmann --- --- Package: Project specific configuration. --- --- Description: --- ------------------------------------ --- This is a template file. --- --- TODO --- --- USAGE: --- 1) Copy this file into your project's source directory and rename it to --- "my_project.vhdl". --- 2) Add file to library "poc" in your synthesis tool. --- 3) Change setup appropriately. --- --- License: --- ============================================================================= --- Copyright 2007-2016 Technische Universitaet Dresden - Germany, --- Chair of VLSI-Design, Diagnostics and Architecture --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- ============================================================================= --- -library PoC; - - -package my_project is - -- Change these lines to setup configuration. - constant MY_PROJECT_DIR : string := "/home/travis/build/VLSI-EDA/PoC/"; - constant MY_OPERATING_SYSTEM : string := "LINUX"; -end package; diff --git a/tools/GitLab-CI/poc.run.sh b/tools/GitLab-CI/poc.run.sh deleted file mode 100755 index 6e090e19b..000000000 --- a/tools/GitLab-CI/poc.run.sh +++ /dev/null @@ -1,64 +0,0 @@ -#! /usr/bin/env bash - -POC_GHDL_DIR="temp/ghdl" - -# define color escape codes -RED='\e[0;31m' # Red -GREEN='\e[1;32m' # Green -YELLOW='\e[1;33m' # Yellow -MAGENTA='\e[1;35m' # Magenta -CYAN='\e[1;36m' # Cyan -NOCOLOR='\e[0m' # No Color - -POCROOT=$(pwd) - -GITLAB_DIR=$POCROOT/tools/GitLab-CI - -# -> LastExitCode -# -> Error message -ExitIfError() { - if [ $1 -ne 0 ]; then - echo 1>&2 -e $2 - exit 1 - fi -} - -echo -e "${MAGENTA}========================================${NOCOLOR}" -echo -e "${MAGENTA} Running PoC testbenches with GHDL ${NOCOLOR}" -echo -e "${MAGENTA}========================================${NOCOLOR}" - -echo -e "${CYAN}mkdir -p $POC_GHDL_DIR && cd $POC_GHDL_DIR${NOCOLOR}" -mkdir -p $POC_GHDL_DIR && cd $POC_GHDL_DIR - -# Check if output filter grcat is available and install it -if grcat $GITLAB_DIR/poc.run.grcrules/dev/null; then - echo -e "Pipe STDOUT through grcat ..." - { coproc grcat $GITLAB_DIR/poc.run.grcrules 1>&3; } 3>&1 - exec 1>&${COPROC[1]}- -fi - -echo -e "Testing PoC infrastructure (1/2)..." -$POCROOT/poc.sh list-testbench "PoC.*" -ExitIfError $? "${RED}Testing command 'list-testbench' [FAILED]${NOCOLOR}" - -echo -e "Testing PoC infrastructure (2/2)..." -$POCROOT/poc.sh list-netlist "PoC.*" -ExitIfError $? "${RED}Testing command 'list-netlist' [FAILED]${NOCOLOR}" - -echo -e "Running one testbenche in debug mode..." -$POCROOT/poc.sh -d ghdl "PoC.arith.prng" - - -echo -e "Running all testbenches..." -mode=-q -if [ "x$1" = 'x-d' -o "x$1" = 'x-v' ]; then - mode=$1 - shift -fi -$POCROOT/poc.sh $mode ghdl "$@" -ret=$? - -# Cleanup and exit -exec 1>&- -wait # for output filter -exit $ret diff --git a/tools/GitLab-CI/poc.setup.sh b/tools/GitLab-CI/poc.setup.sh deleted file mode 100755 index 7771f3159..000000000 --- a/tools/GitLab-CI/poc.setup.sh +++ /dev/null @@ -1,53 +0,0 @@ -#! /usr/bin/env bash - -# define color escape codes -RED='\e[0;31m' # Red -GREEN='\e[1;32m' # Green -MAGENTA='\e[1;35m' # Magenta -CYAN='\e[1;36m' # Cyan -NOCOLOR='\e[0m' # No Color - - -# -> LastExitCode -# -> Error message -ExitIfError() { - if [ $1 -ne 0 ]; then - echo 1>&2 -e $2 - exit 1 - fi -} - -echo -e "${MAGENTA}========================================${NOCOLOR}" -echo -e "${MAGENTA} Configuring PoC ${NOCOLOR}" -echo -e "${MAGENTA}========================================${NOCOLOR}" - -echo -e "${CYAN}Copy config.private.ini into ./pyIPCMI directory${NOCOLOR}" -cp ./tools/GitLab-CI/config.private.ini ./.pyIPCMI -ExitIfError $? "${RED}Copying of ./tools/GitLab-CI/config.private.ini [FAILED]${NOCOLOR}" - -echo -e "${CYAN}Copy my_project.vhdl into ./tb/common directory${NOCOLOR}" -cp ./tools/GitLab-CI/my_project.vhdl ./tb/common -ExitIfError $? "${RED}Copying of ./tools/GitLab-CI/my_project.vhdl [FAILED]${NOCOLOR}" - -echo -e "${CYAN}Copy modelsim.ini into ./temp/precompiled/vsim directory${NOCOLOR}" -mkdir -p ./temp/precompiled/vsim -ExitIfError $? "${RED}Creating directory ./temp/precompiled/vsim [FAILED]${NOCOLOR}" -cp ./tools/GitLab-CI/modelsim.ini ./temp/precompiled/vsim -ExitIfError $? "${RED}Copying of ./tools/GitLab-CI/modelsim.ini [FAILED]${NOCOLOR}" - -echo -e "${CYAN}Test PoC front-end script.${NOCOLOR}" -./poc.sh info -ExitIfError $? "${RED}Testing PoC front-end script [FAILED]${NOCOLOR}" - -echo -e "${CYAN}Pre-compiling OSVVM for GHDL into ./temp/precompiled/ghdl/osvvm directory${NOCOLOR}" -./tools/precompile/compile-osvvm.sh --ghdl -ExitIfError $? "${RED}Pre-compiling OSVVM for GHDL [FAILED]${NOCOLOR}" - -echo -e "${CYAN}Pre-compiling UVVM for GHDL into ./temp/precompiled/ghdl/uvvm directory${NOCOLOR}" -echo -e "UVVM pre-compile scripts are not yet shipped with GHDL. ${RED}[SKIPPING]${NOCOLOR}" -#./tools/precompile/compile-uvvm.sh --ghdl -#ExitIfError $? "${RED}Pre-compiling UVVM for GHDL [FAILED]${NOCOLOR}" - - -echo -e "Configuring PoC ${GREEN}[FINISHED]${NOCOLOR}" -exit 0 diff --git a/tools/GitLab-CI/requirements.txt b/tools/GitLab-CI/requirements.txt deleted file mode 100644 index 522360ea4..000000000 --- a/tools/GitLab-CI/requirements.txt +++ /dev/null @@ -1 +0,0 @@ --r ../../requirements.txt diff --git a/tools/README.md b/tools/README.md index 62e3f8c04..2b451ec37 100644 --- a/tools/README.md +++ b/tools/README.md @@ -15,9 +15,9 @@ PoC-Library and VHDL. git config --global alias.tree 'log --decorate --pretty=oneline --abbrev-commit --date-order --graph' - `git treea`: + `git treeall`: - git config --global alias.tree 'log --decorate --pretty=oneline --abbrev-commit --date-order --graph --all' + git config --global alias.treeall 'log --decorate --pretty=oneline --abbrev-commit --date-order --graph --all' ## Notepad++ diff --git a/tools/Vivado/postWriteBitstream_ExportXSA.tcl.template b/tools/Vivado/postWriteBitstream_ExportXSA.tcl.template new file mode 100644 index 000000000..f8b8dc963 --- /dev/null +++ b/tools/Vivado/postWriteBitstream_ExportXSA.tcl.template @@ -0,0 +1 @@ +write_hw_platform -fixed -include_bit -force -file ./.xsa diff --git a/tools/git/preSynth_GitVersionRegister_Vivado.tcl b/tools/Vivado/preSynth_GitVersionRegister_Vivado.tcl similarity index 94% rename from tools/git/preSynth_GitVersionRegister_Vivado.tcl rename to tools/Vivado/preSynth_GitVersionRegister_Vivado.tcl index a5ece410c..b4c2cf433 100644 --- a/tools/git/preSynth_GitVersionRegister_Vivado.tcl +++ b/tools/Vivado/preSynth_GitVersionRegister_Vivado.tcl @@ -1,6 +1,3 @@ -## EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- -## vim: tabstop=2:shiftwidth=2:noexpandtab -## kate: tab-width 2; replace-tabs off; indent-width 2; ## ============================================================================= ## Authors: Stefan Unrein ## Max Kraft-Kugler @@ -12,7 +9,7 @@ ## Description: ## ------------------------------------- ## Use as pre-synthesis tcl file to create the memory file for the -## AXI4Lite_GitVersionRegister. +## axi4lite_GitVersionRegister. ## ## The relative paths are used as for the default project-folder-structure of PoC ## @@ -36,7 +33,7 @@ puts "BuildVersion: Running script..." # Script configuration -# Go up by three folders from ./project/my_project.runs/synth_1 +# Go up by three folders from ./project/local_configuration.runs/synth_1 set version_file ../../../temp/GitVersion.mem; # Project Versioning diff --git a/tools/git/build_md.py b/tools/git/build_md.py deleted file mode 100644 index 00cb42239..000000000 --- a/tools/git/build_md.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/python3 -# EMACS settings: -*- tab-width: 2; indent-tabs-mode: t; python-indent-offset: 2 -*- -# vim: tabstop=2:shiftwidth=2:noexpandtab -# kate: tab-width 2; replace-tabs off; indent-width 2; -# -# ============================================================================== -# Authors: Thomas B. Preusser -# -# License: -# ============================================================================== -# Copyright 2007-2016 Technische Universitaet Dresden - Germany -# Chair of VLSI-Design, Diagnostics and Architecture -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# distributed under the License is distributed on an "AS IS" BASIS,default -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -""" -[http://stackoverflow.com/questions/18673694/referencing-current-branch-in-github-readme-md] - -Referencing current branch in github readme.md[1] - -This pre-commit hook[2] updates the README.md file's -Travis badge with the current branch. Gist at[4]. - -[1] http://stackoverflow.com/questions/18673694/referencing-current-branch-in-github-readme-md -[2] http://www.git-scm.com/book/en/v2/Customizing-Git-Git-Hooks -[3] https://docs.travis-ci.com/user/status-images/ -[4] https://gist.github.com/dandye/dfe0870a6a1151c89ed9 -""" -from subprocess import check_output, check_call -import os - -# Collecting values to substitute -substitutions = {} -substitutions["BRANCH"] = check_output(["git", "rev-parse", "--abbrev-ref", "HEAD"], universal_newlines=True).strip() -substitutions["GENERATED_HEADER"] = '' - -# Patch templates .tpl to generate specialized .md files -git_root = check_output(['git', 'rev-parse', '--show-toplevel'], universal_newlines=True).strip() -for root, dirs, files in os.walk(git_root): - for file in files: - if file.endswith('.tpl'): - trgt = file[:-3]+'md' - print(' generate ' + file + ' -> ' + trgt); - tpl = open(os.path.join(root, file), 'r', encoding='utf-8') - md = open(os.path.join(root, trgt), 'w', encoding='utf-8') - for line in tpl: - for key in substitutions: - line = line.replace('{@'+key+'@}', substitutions[key]) - md.write(line) - md .close() - tpl.close() - check_call(['git', 'add', trgt ]) diff --git a/tools/git/filters/normalize.pl b/tools/git/filters/normalize.pl deleted file mode 100755 index 17e918e47..000000000 --- a/tools/git/filters/normalize.pl +++ /dev/null @@ -1,142 +0,0 @@ -#!/usr/bin/perl -w -# EMACS settings: -*- tab-width: 2; indent-tabs-mode: t; python-indent-offset: 2 -*- -# vim: tabstop=2:shiftwidth=2:noexpandtab -# kate: tab-width 2; replace-tabs off; indent-width 2; -# -# ============================================================================== -# Authors: Thomas B. Preusser -# -# License: -# ============================================================================== -# Copyright 2007-2016 Technische Universitaet Dresden - Germany -# Chair of VLSI-Design, Diagnostics and Architecture -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# ============================================================================== -# -# Provides implementations for 'smudge' and 'clean' filters for the sources -# within the PoC repo. -# -# Synopsis: -# -# # normalize (smudge|clean) [language] < input > output -# -# -# The basic filter implementations do: -# -# clean - remove trailing whitespace, and -# smudge - replace empty lines with the most recent indentation. -# -# -# Currently, only the 'clean' pass expands extra processing steps for -# the following language specifiers: -# -# vhdl - VHDL reserved words and standard types are put into lower case, and -# rest - headline markers 7x'=' are expanded to 8x'=' so as to avoid -# the misinterpretation as a conflict marker by git. -# -# ============================================================================== -use strict; -use feature 'state'; - -############################################################################## -# Filter Routines -# -# Input: string representing a source line -# Output: filtered source line -# -# The filters may maintain internal state to effect filtering. - -# Trims trailing whitespace. -sub rtrim { - $_[0] =~ s/\s*$//r; -} - -# Adjusts empty lines (all whitespace) to comprise most recent indentation. -sub whiteindent { - state $indent = ''; - my($line) = @_; - return $indent unless $line =~ /^(\s*)\S/; - $indent = $1; - return $line; -} - -# Lower-cases VHDL reserved words and standard types. -sub vhdlcap { - state $reserved = join '|', qw/ - abs after alias all and architecture array assert attribute - begin block body buffer bus - case component configuration constant - disconnect downto - else elsif end entity exit - file for function - generate generic group guarded - if impure in inertial inout is - label library linkage literal loop - map mod - nand new next nor not null - of on open or others out - package port postponed procedure process pure - range record register reject rem report return rol ror - select severity signal shared sla sll sra srl subtype - then to transport type - unaffected units until use - variable - wait when while with - xnor xor - - bit bit_vector boolean character integer natural positive signed - std_logic std_logic_vector string time unsigned - /; - $_[0] =~ s/(--.*$|(['"\\]).*?\2|\b($reserved)\b)/$3? lc $3 : $1/gier; -} - -# Fix headline markers in reST, which would coincide with git conflict markers. -sub restfix { - $_[0] =~ s/(^={7}$)/=$1/r; -} - -############################################################################## -# Main: Select Filters and apply them from stdin to stdout. - -# Build Filter Chain -my $pass; -my @chain = (); - -# open(my $fh, '>>', 'D:\git\PoC\temp\normalize.log'); - -if($pass = shift) { - my $lang = @ARGV? lc(shift) : ''; - # print $fh "$lang"; - if($pass eq 'clean') { - # print $fh " clean xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"; - push @chain, \&rtrim; - push @chain, \&vhdlcap if $lang eq 'vhdl'; - push @chain, \&restfix if $lang eq 'rest'; - } - elsif($pass eq 'smudge') { - push @chain, \&whiteindent; - } -} - -# Apply Filter Chain -while(<>) { - chomp; - my $line = $_; - $line = $_->($line) for @chain; - print "$line\n"; - # print $fh "$line\n"; -} - -# close $fh; diff --git a/tools/git/hooks/pre-commit.d/whitespace.sh b/tools/git/hooks/pre-commit.d/whitespace.sh deleted file mode 100755 index 4f72c1f2a..000000000 --- a/tools/git/hooks/pre-commit.d/whitespace.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -# EMACS settings: -*- tab-width: 2; indent-tabs-mode: t; python-indent-offset: 2 -*- -# vim: tabstop=2:shiftwidth=2:noexpandtab -# kate: tab-width 2; replace-tabs off; indent-width 2; -# -# ============================================================================== -# Authors: Thomas B. Preusser -# -# License: -# ============================================================================== -# Copyright 2007-2016 Technische Universitaet Dresden - Germany -# Chair of VLSI-Design, Diagnostics and Architecture -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -if ! git diff --cached --check; then - echo 1>&2 'ERROR: Commit would introduce whitespace errors. Please fix and try again.' - exit 1 -fi diff --git a/tools/git/hooks/run-hook.sh b/tools/git/hooks/run-hook.sh deleted file mode 100755 index 3428cbe45..000000000 --- a/tools/git/hooks/run-hook.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -# EMACS settings: -*- tab-width: 2; indent-tabs-mode: t; python-indent-offset: 2 -*- -# vim: tabstop=2:shiftwidth=2:noexpandtab -# kate: tab-width 2; replace-tabs off; indent-width 2; -# -# ============================================================================== -# Authors: Thomas B. Preusser -# -# License: -# ============================================================================== -# Copyright 2007-2016 Technische Universitaet Dresden - Germany -# Chair of VLSI-Design, Diagnostics and Architecture -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -hook=$(basename $0) -echo "POC: Executing $hook hooks..." -for i in tools/git/hooks/$hook.d/*; do - file=$(basename $i) - echo "POC: Executing '$file'" - if ! "$i"; then - echo "ERROR: $file FAILED" - exit 1 - fi -done -echo "PASSED" diff --git a/tools/OSVVM/poc.tcl b/tools/poc.tcl similarity index 50% rename from tools/OSVVM/poc.tcl rename to tools/poc.tcl index cba31804e..dea0fca90 100644 --- a/tools/OSVVM/poc.tcl +++ b/tools/poc.tcl @@ -6,12 +6,16 @@ namespace eval ::poc { return $default } + variable projectRoot "." variable vendorName [getEnv VENDOR "GENERIC"] variable boardName [getEnv BOARD "GENERIC"] variable buildNamePrefix "" - variable myConfigFile "../tb/common/my_config_${::poc::vendorName}.vhdl" - variable myProjectFile "../tb/common/my_project.vhdl" + variable localConfigurationFolder "${projectRoot}/tb/common" + variable projectConfigurationFile "project_configuration_${::poc::boardName}.vhdl" + variable localConfigurationFile "local_configuration.vhdl" + variable projectConfigurationPath [file join $localConfigurationFolder "project_configuration_${::poc::boardName}.vhdl"] + variable localConfigurationPath [file join $localConfigurationFolder "local_configuration.vhdl"] variable disableExit 0 @@ -37,6 +41,7 @@ namespace eval ::poc { set toolsWithDashCode {ActiveHDL ModelSim NVC QuestaSim RivieraPRO} if {[lsearch -exact $toolsWithDashCode $::osvvm::ToolName] >= 0} { + # noqa: E003 exit -code $code } else { exit $code @@ -69,10 +74,6 @@ namespace eval ::poc { "-w" { SetSaveWaves } - "-gui" - - "-g" { - set ::poc::disableExit 1 - } default { puts "ERROR: Unknown option $arg" exitScript @@ -116,6 +117,70 @@ Other tools: } } + proc configurePoC {args} { + set i 0 + while {$i < [llength $args]} { + set arg [lindex $args $i] + + switch -glob -- $arg { + "-gui" - + "-g" { + set ::poc::disableExit 1 + } + + "-vendor" - + "-v" { + incr i + if {$i < [llength $args]} { + set ::poc::vendorName [lindex $args $i] + } + } + + "-board" - + "-b" { + incr i + if {$i < [llength $args]} { + set ::poc::boardName [lindex $args $i] + } + } + + "-projectRoot" - + "-P" { + incr i + if {$i < [llength $args]} { + set ::poc::projectRoot [lindex $args $i] + set ::poc::localConfigurationFolder "${::poc::projectRoot}/tb/common" + } + } + + "-projectFile" - + "-p" { + incr i + if {$i < [llength $args]} { + set ::poc::localConfigurationFile [lindex $args $i] + } + } + + "-configFile" - + "-c" { + incr i + if {$i < [llength $args]} { + set ::poc::projectConfigurationFile [lindex $args $i] + } + } + + default { + puts "ERROR: Unknown option $arg" + exitScript + } + } + incr i + } + + set ::poc::projectConfigurationPath [file join ${::poc::localConfigurationFolder} ${::poc::projectConfigurationFile}] + set ::poc::localConfigurationPath [file join ${::poc::localConfigurationFolder} ${::poc::localConfigurationFile}] + } + proc checkForBuildErrors {} { if {$::osvvm::AnalyzeErrorCount > 0} { puts "ERROR: While building $::osvvm::LastBuildName" @@ -124,7 +189,9 @@ Other tools: puts "=====================================" exitScript + return 1 } + return 0 } proc checkForRunErrors {} { @@ -135,13 +202,16 @@ Other tools: puts "=====================================" exitScript 2 + return 1 } elseif {$::osvvm::SimulateErrorCount > 0} { puts "ERROR: While simulating $::osvvm::TestCaseName" puts "=====================================" puts $::osvvm::BuildErrorInfo puts "=====================================" exitScript 3 + return 1 } + return 0 } # New procedures for OSVVM's *.pro files @@ -154,6 +224,7 @@ Other tools: namespace export exitScript namespace export configureOSVVM + namespace export configurePoC namespace export checkForBuildErrors namespace export checkForRunErrors namespace export disabled @@ -161,3 +232,72 @@ Other tools: } puts "Loaded PoC extensions for OSVVM." + +namespace eval ::regression { + proc createRegressionLevels {args} { + set map(all) 0 + + set i 0 + foreach level $args { + set map($level) $i + incr i + } + + return [array get map] + } + + proc mapRegressionLevel {step levelMap} { + if {[string is integer -strict $step]} { + return $step + } + + array set map $levelMap + + if {[info exists map($step)]} { + return $map($step) + } + + puts "\[WARNING\] Unknown build level '$step', using 'all'." + return 0 + } + + proc evaluateRegressionLevel {defaultStep regressionLevels} { + set ::regression::executeSingleStep 0 + if {[info exists ::env(REGRESSION_STEP)]} { + set ::regression::executeSingleStep 1 ; # return after selected step + } + + # 1. argv (when used interactively) + if {[info exists ::argv] && [llength $::argv] > 0} { + set buildConfigSource "interactive" + set selectedStep [lindex $::argv 0] + + # 2. Check for environment variables + } elseif {[info exists ::env(REGRESSION_STEP)]} { + set buildConfigSource "environment variable" + set selectedStep $::env(REGRESSION_STEP) + + } elseif {[info exists ::env(REGRESSION_FROM)]} { + set buildConfigSource "environment variable" + set selectedStep $::env(REGRESSION_FROM) + + } else { + set buildConfigSource "default" + set selectedStep $defaultStep + puts "\[REGRESSION INFO\] Undefined or unknown argument, using default settings." + } + set ::regression::level [mapRegressionLevel $selectedStep $regressionLevels] + + # 3. output result + puts "==================================" + puts "Build configuration" + puts " Level: $::regression::level (set by $buildConfigSource)" + puts " Executing [expr {$::regression::executeSingleStep ? "only" : "starting from"}] step '$selectedStep'" + puts "==================================" + } + + namespace export createRegressionLevels + namespace export evaluateRegressionLevel +} + +puts "Loaded regression extensions." diff --git a/ucf/arith/arith_trng.xdc b/ucf/arith/arith_TRNG.xdc similarity index 100% rename from ucf/arith/arith_trng.xdc rename to ucf/arith/arith_TRNG.xdc diff --git a/vhdl_coding.md b/vhdl_coding.md index c88dadca8..bbb385788 100644 --- a/vhdl_coding.md +++ b/vhdl_coding.md @@ -8,7 +8,7 @@ this license. ## Naming 1. VHDL sources have the file extension `.vhdl`. 2. Prepend the name of an entity with its containing package using snake case, - e.g.: `arith_addw` for the wide adder in package `arith`. Each module is + e.g.: `arith_Adder_Wide` for the wide adder in package `arith`. Each module is implemented in its own source file, the name of which is `.vhdl`. 3. Synthesizable module implementations are provided through an architecture named `rtl`. @@ -21,9 +21,9 @@ this license. 1. An OSVVM testbench generally consists of three parts: the Test Harness, Test Controller and one or more Test Cases. 2. All three parts shall be in one subdirectory which shall be named after the DUT. -For example, the testbench files for the `arith_addw` shall be in the directory `tb/arith/addw`. +For example, the testbench files for the `arith_Adder_Wide` shall be in the directory `tb/arith/Adder_Wide`. 3. The Test Controller's and Test Harness' names shall be prefixed with the DUT's name, e.g. -`addw_TestController.vhdl` and `addw_TestHarness.vhdl`. +`Adder_Wide_TestController.vhdl` and `Adder_Wide_TestHarness.vhdl`. 4. All testcases shall have the prefix `TC_` followed by a meaningfull name. ## Formatting From 41d05daac9fbb4dab4cdc723ce1ffdc7ebf92def Mon Sep 17 00:00:00 2001 From: stefanunrein Date: Sun, 21 Jun 2026 01:15:37 +0200 Subject: [PATCH 3/4] More enhancements by @PLC2 * write local configuration automatically on initial regression run * remove inner generate label * update fifo-ic-git constraint to new generates * fix variable direction for init mem file function * fix paths for local and project config file * beautify print * FILL_STATE vs. FULL_STATE vs. FSTATE. * Removed EMACS, vim/vi, Kate setting lines. * remove temporary script for cleanup * Cleaned up more findings found by Sigasi. * Fixed more warnings reported by Sigasi. * Fixes after removinbg unused code. * Simplified GitLab-CI script. * Fixed 'ram' signals to be VHDL-2008 compliant. * Fix GitLab-CI pipeline. * Disabled INFO and PASSED messages. Removed trailing whitespaces. * * print message if local-file generation is skipped * remove spaces for puts prefix for disabled and duplicate procedure * Improve GitLab and GitHub pipelines. --------- Co-authored-by: Patrick Lehmann Co-authored-by: Patrick Lehmann Co-authored-by: Adrian Weiland --- .editorconfig | 5 + .github/workflows/Pipeline.yml | 4 +- .github/workflows/Simulate.yml | 221 ++++++++--- .gitlab-ci.yml | 355 ++++++------------ .sigasi/project.sigasi | 2 +- docs/IPCores/fifo/fifo_cc_got.rst | 16 +- docs/IPCores/fifo/fifo_cc_got_tempgot.rst | 22 +- docs/IPCores/fifo/fifo_cc_got_tempput.rst | 22 +- docs/IPCores/fifo/fifo_ic_got.rst | 18 +- docs/IPCores/fifo/index.rst | 2 +- regression.tcl | 19 +- rename_strings.sh | 155 -------- src/arith/arith.pkg.vhdl | 18 +- src/arith/arith_Counter_Gray.vhdl | 2 +- src/arith/arith_SquareRoot.vhdl | 18 +- src/arith/xilinx/arith_Adder_Wide_Xilinx.vhdl | 1 - .../xilinx/arith_CarryChain_inc_Xilinx.vhdl | 1 - src/arith/xilinx/arith_cca_xilinx.vhdl | 10 +- src/build.pro | 4 +- src/bus/axi4/axi4_DeMux.vhdl | 24 +- src/bus/axi4/axi4_FIFO_CDC.vhdl | 50 ++- src/bus/axi4/axi4_Full.pkg.vhdl | 120 +++--- src/bus/axi4/axi4_Mux.vhdl | 2 +- src/bus/axi4/axi4_Sink.vhdl | 4 +- src/bus/axi4lite/axi4lite.pkg.vhdl | 30 +- src/bus/axi4lite/axi4lite_FIFO_CDC.vhdl | 24 +- src/bus/axi4lite/axi4lite_OCRAM_Adapter.vhdl | 2 +- src/bus/axi4lite/axi4lite_Register.vhdl | 22 +- src/bus/axi4lite/axi4lite_UART.vhdl | 18 +- src/bus/axi4stream/axi4stream_FIFO_CDC.vhdl | 48 +-- .../axi4stream/axi4stream_FIFO_TempGot.vhdl | 6 +- .../axi4stream/axi4stream_FIFO_TempPut.vhdl | 8 +- src/bus/bus_Arbiter.vhdl | 3 - src/bus/drp/drp.pkg.vhdl | 8 +- src/bus/stream/stream.pkg.vhdl | 8 +- src/bus/stream/stream_DeMux.vhdl | 3 - src/bus/stream/stream_FIFO.vhdl | 4 - src/bus/stream/stream_FrameGenerator.vhdl | 4 +- src/bus/stream/stream_Mirror.vhdl | 3 - src/cache/cache_CPU.vhdl | 2 +- src/cache/cache_Memory.vhdl | 3 - src/cache/cache_Parallel.vhdl | 2 - src/cache/cache_Parallel2.vhdl | 5 - src/cache/cache_ReplacementPolicy.vhdl | 21 +- src/cache/cache_TagUnit_Parallel.vhdl | 2 - src/cache/cache_TagUnit_Sequential.vhdl | 2 - src/comm/comm.pkg.vhdl | 34 +- src/common/math.vhdl | 2 +- src/common/physical.vhdl | 4 +- src/common/strings.vhdl | 1 - src/common/utils.vhdl | 1 - src/common/vectors.vhdl | 6 +- src/dstruct/dstruct_Stack.vhdl | 1 - src/fifo/README.md | 2 +- src/fifo/fifo.pkg.vhdl | 24 +- src/fifo/fifo_Stage.vhdl | 4 + src/fifo/fifo_cc_got.vhdl | 16 +- src/fifo/fifo_cc_got_tempgot.vhdl | 24 +- src/fifo/fifo_cc_got_tempput.vhdl | 22 +- src/fifo/fifo_ic_got.vhdl | 136 ++++--- src/io/build.pro | 5 +- src/io/ddrio/ddrio_In.vhdl | 2 +- src/io/ddrio/ddrio_InOut.vhdl | 2 +- src/io/ddrio/ddrio_Out.vhdl | 2 +- src/io/io.pkg.vhdl | 21 +- src/io/io_FrequencyCounter.vhdl | 1 - src/io/io_GlitchFilter.vhdl | 22 +- src/io/io_TimingCounter.vhdl | 6 +- src/io/pmod/build.pro | 24 ++ src/io/pmod/pmod_USBUART.vhdl | 12 +- src/io/uart/uart.pkg.vhdl | 12 +- src/io/uart/uart_FIFO.vhdl | 44 +-- src/io/uart/uart_FT245.vhdl | 54 +-- src/mem/mem.pkg.vhdl | 4 +- src/mem/ocram/ocram.pkg.vhdl | 20 +- .../ocram/ocram_EnhancedSimpleDualPort.vhdl | 6 +- src/mem/ocram/ocram_SimpleDualPort.vhdl | 8 +- src/mem/ocram/ocram_SinglePort.vhdl | 8 +- src/mem/ocram/ocram_TrueDualPort.vhdl | 10 +- src/mem/ocrom/ocrom.pkg.vhdl | 29 +- src/mem/ocrom/ocrom_DualPort.vhdl | 4 +- src/mem/ocrom/ocrom_SinglePort.vhdl | 4 +- src/net/arp/arp_BroadCast_Receiver.vhdl | 7 +- src/net/arp/arp_BroadCast_Requester.vhdl | 2 +- src/net/arp/arp_Cache.vhdl | 101 +++-- src/net/arp/arp_UniCast_Receiver.vhdl | 10 +- src/net/arp/arp_Wrapper.vhdl | 4 +- src/sync/sync.pkg.vhdl | 23 +- src/xil/reconfig/reconfig_ICAP_FSM.vhdl | 2 +- src/xil/reconfig/reconfig_ICAP_Wrapper.vhdl | 102 ++--- src/xil/xil_Reconfigurator.vhdl | 17 +- .../Adder_Wide/arith_Adder_Wide_Simple.vhdl | 3 +- .../arith_Adder_Wide_TestController.vhdl | 2 +- .../arith_CarryChain_inc_Simple.vhdl | 4 +- .../arith_Convert_Binary2BCD_Simple.vhdl | 6 +- ...ith_Convert_Binary2BCD_TestController.vhdl | 6 +- .../Counter_BCD/arith_Counter_BCD_Simple.vhdl | 4 +- .../arith_Counter_BCD_TestController.vhdl | 2 +- .../arith_Counter_Free_Simple.vhdl | 6 +- .../arith_Counter_Gray_Simple.vhdl | 8 +- .../arith_Counter_Ring_Simple.vhdl | 4 +- tb/arith/FirstOne/arith_FirstOne_Simple.vhdl | 16 +- .../arith_FirstOne_TestController.vhdl | 2 +- tb/arith/Same/arith_Same_Simple.vhdl | 4 +- .../arith_Shifter_Barrel_Simple.vhdl | 10 +- .../SquareRoot/arith_SquareRoot_Simple.vhdl | 20 +- .../arith_SquareRoot_TestHarness.vhdl | 2 +- tb/arith/TRNG/arith_TRNG_Simple.vhdl | 14 +- tb/arith/cca/arith_cca_Simple.vhdl | 4 +- tb/bus/axi4/Mux/TC_SimpleReadWrite.vhdl | 4 +- .../TC_SimpleReadWrite_multiID_randDelay.vhdl | 4 +- tb/bus/axi4lite/Demux/TC_SimpleReadWrite.vhdl | 2 +- .../axi4lite/Demux/TC_SimpleReadWrite_02.vhdl | 2 +- ...i4lite_HighResolutionClock_correction.vhdl | 14 +- .../axi4lite/OCRAM_Adapter/TC_InitMemory.vhdl | 6 +- ...axi4lite_OCRAM_Adapter_TestController.vhdl | 2 +- .../axi4lite/Register/TC_RandomReadWrite.vhdl | 3 - .../UART/axi4lite_UART_receive_burst.vhdl | 69 ++-- .../UART/axi4lite_UART_receive_parity.vhdl | 20 +- tb/cache/cache_CPU_tb.vhdl | 4 - tb/cache/cache_Memory_tb.vhdl | 8 +- tb/common/config_tb.vhdl | 4 - tb/common/physical_tb.vhdl | 4 - tb/common/project_configuration_AC701.vhdl | 4 - tb/common/project_configuration_Arty.vhdl | 4 - tb/common/project_configuration_ArtyS7.vhdl | 4 - .../project_configuration_ECP5Versa.vhdl | 4 - tb/common/project_configuration_GENERIC.vhdl | 10 +- tb/common/project_configuration_KC705.vhdl | 4 - tb/common/project_configuration_Nexys4.vhdl | 4 - .../project_configuration_Nexys4DDR.vhdl | 4 - tb/common/project_configuration_VC707.vhdl | 4 - tb/common/project_configuration_VC709.vhdl | 4 - tb/common/project_configuration_ZC706.vhdl | 4 - tb/common/project_configuration_ZedBoard.vhdl | 4 - tb/common/strings_tb.vhdl | 4 - .../TbOutOfOrderBuffer_WriteRead.vhdl | 3 - ...truct_OutOfOrderBuffer_TestController.vhdl | 3 - .../OutOfOrderBuffer/tb_OutOfOrderBuffer.vhdl | 3 - tb/dstruct/dstruct_DoubleEndedQueue_tb.vhdl | 3 - tb/dstruct/dstruct_Stack_tb.vhdl | 3 - tb/fifo/fifo_cc_got_tb.vhdl | 20 +- tb/fifo/fifo_cc_got_tempput_tb.vhdl | 16 +- tb/fifo/fifo_ic_assembly_tb.vhdl | 4 - tb/fifo/fifo_ic_got_tb.vhdl | 24 +- tb/io/ddrio/ddrio_InOut_tb.vhdl | 4 - tb/io/ddrio/ddrio_In_tb.vhdl | 4 - tb/io/ddrio/ddrio_Out_tb.vhdl | 4 - tb/io/io_Debounce_tb.vhdl | 4 - tb/io/uart/uart_RX_tb.vhdl | 4 - tb/mem/lut/lut_Sine_tb.vhdl | 4 - tb/mem/mem_model.vhdl | 4 - .../ocram_EnhancedSimpleDualPort_tb.vhdl | 4 - tb/mem/ocram/ocram_SimpleDualPort_tb.vhdl | 4 - tb/mem/ocram/ocram_SimpleDualPort_wf_tb.vhdl | 4 - tb/mem/ocram/ocram_TrueDualPort_tb.vhdl | 4 - tb/mem/ocram/ocram_TrueDualPort_wf_tb.vhdl | 4 - tb/misc/clock/clock_HighResolution_tc.vhdl | 6 +- tb/misc/gearbox/gearbox_Down_cc_tb.vhdl | 4 - tb/misc/gearbox/gearbox_Down_dc_tb.vhdl | 4 - tb/misc/gearbox/gearbox_Up_cc_tb.vhdl | 4 - tb/misc/gearbox/gearbox_Up_dc_tb.vhdl | 4 - tb/misc/misc_bit_lz_tb.vhdl | 4 - tb/misc/stat/stat_Average_tb.vhdl | 4 - tb/misc/stat/stat_Histogram_tb.vhdl | 4 - tb/misc/stat/stat_Maximum_tb.vhdl | 4 - tb/misc/stat/stat_Minimum_tb.vhdl | 4 - tb/sort/sort_LeastRecentlyUsed_Cache_tb.vhdl | 4 - tb/sort/sortnet/sortnet_BitonicSort_tb.vhdl | 4 - .../sortnet/sortnet_OddEvenMergeSort_tb.vhdl | 4 - tb/sort/sortnet/sortnet_OddEvenSort_tb.vhdl | 4 - .../sortnet/sortnet_Stream_Adapter2_tb.vhdl | 4 - .../sortnet/sortnet_Stream_Adapter_tb.vhdl | 4 - tb/sort/sortnet/sortnet_tb.pkg.vhdl | 4 - tb/sync/Bits/sync_Bits_Simple.vhdl | 22 +- tb/sync/Command/sync_Command_Simple.vhdl | 6 +- tb/sync/Reset/sync_Reset_Simple.vhdl | 4 +- tb/sync/Strobe/sync_Strobe_Simple.vhdl | 6 +- tb/sync/Vector/sync_Vector_Simple.vhdl | 6 +- tools/poc.tcl | 106 +++--- ucf/fifo/fifo_ic_got.xdc | 4 +- 181 files changed, 1222 insertions(+), 1618 deletions(-) delete mode 100644 rename_strings.sh create mode 100644 src/io/pmod/build.pro diff --git a/.editorconfig b/.editorconfig index 356992fe7..9f74e00eb 100644 --- a/.editorconfig +++ b/.editorconfig @@ -15,3 +15,8 @@ trim_trailing_whitespace = false [*.rst] indent_style = space indent_size = 3 + +[*.{yml,yaml}] +indent_style = space +indent_size = 2 + diff --git a/.github/workflows/Pipeline.yml b/.github/workflows/Pipeline.yml index 89ca653b3..cbc5f313b 100644 --- a/.github/workflows/Pipeline.yml +++ b/.github/workflows/Pipeline.yml @@ -24,7 +24,7 @@ jobs: fail-fast: false matrix: include: - - {ubuntu-version: 'ubuntu-24.04', simulator: 'nvc', backend: '', version: 'latest', can-fail: false} + - {ubuntu-version: 'ubuntu-26.04', simulator: 'nvc', backend: '', version: 'latest', can-fail: false} - {ubuntu-version: 'ubuntu-26.04', simulator: 'ghdl', backend: 'mcode', version: 'nightly', can-fail: false} - {ubuntu-version: 'ubuntu-26.04', simulator: 'ghdl', backend: 'llvm', version: 'nightly', can-fail: false} with: @@ -41,7 +41,7 @@ jobs: - Simulate # if: success() || failure() with: - unittest_artifacts_pattern: 'PoC-Report-XML-*' + unittest_artifacts_pattern: 'SimPoC-Report-XML-*' testsuite-summary-name: 'The PoC Library' merge-input-dialect: 'Any-JUnit' merged_junit_filename: 'unittest.xml' diff --git a/.github/workflows/Simulate.yml b/.github/workflows/Simulate.yml index e4ed538df..368c6146f 100644 --- a/.github/workflows/Simulate.yml +++ b/.github/workflows/Simulate.yml @@ -35,12 +35,17 @@ on: osvvm-artifact-prefix: description: 'Prefix of OSVVM artifacts.' required: false - default: 'OSVVM' + default: 'BuildOSVVM' type: string poc-artifact-prefix: description: 'Prefix of PoC artifacts.' required: false - default: 'PoC' + default: 'BuildPoC' + type: string + sim-artifact-prefix: + description: 'Prefix of PoC artifacts.' + required: false + default: 'SimPoC' type: string jobs: @@ -51,15 +56,19 @@ jobs: tempDirectory: ${{ steps.Variables.outputs.tempDirectory }} startScript: ${{ steps.Variables.outputs.startScript }} artifactSuffix: ${{ steps.Variables.outputs.artifactSuffix }} + osvvmGenerated: ${{ steps.ArtifactNames.outputs.osvvmGenerated }} osvvmLibraries: ${{ steps.ArtifactNames.outputs.osvvmLibraries }} osvvmReportHTML: ${{ steps.ArtifactNames.outputs.osvvmReportHTML }} osvvmReportYAML: ${{ steps.ArtifactNames.outputs.osvvmReportYAML }} osvvmReportXML: ${{ steps.ArtifactNames.outputs.osvvmReportXML }} - osvvmGenerated: ${{ steps.ArtifactNames.outputs.osvvmGenerated }} + pocGenerated: ${{ steps.ArtifactNames.outputs.pocGenerated }} pocLibraries: ${{ steps.ArtifactNames.outputs.pocLibraries }} pocReportHTML: ${{ steps.ArtifactNames.outputs.pocReportHTML }} pocReportYAML: ${{ steps.ArtifactNames.outputs.pocReportYAML }} pocReportXML: ${{ steps.ArtifactNames.outputs.pocReportXML }} + simReportHTML: ${{ steps.ArtifactNames.outputs.simReportHTML }} + simReportYAML: ${{ steps.ArtifactNames.outputs.simReportYAML }} + simReportXML: ${{ steps.ArtifactNames.outputs.simReportXML }} steps: - name: 🖉 Compute variables @@ -87,15 +96,19 @@ jobs: id: ArtifactNames run: | tee --append "${GITHUB_OUTPUT}" < + $SIMULATOR_PAGES == "$[[ matrix.IMAGE ]]" && + $CI_PIPELINE_SOURCE == "push" && + $CI_COMMIT_BRANCH =~ /^(main|master|dev)$/ variables: GIT_SUBMODULE_STRATEGY: normal pages: true @@ -316,7 +220,7 @@ MikTeX: - apk update - apk add tree script: - - CopyDir docs/_build/html public + - CopyDir docs/_build/html public #- CopyFile PoC.pdf public - tree public after_script: @@ -324,50 +228,3 @@ MikTeX: artifacts: paths: - public - - -pagesGHDL: - rules: - - if: > - $SIMULATOR_PAGES == "GHDL" && - $CI_PIPELINE_SOURCE == "push" && - $CI_COMMIT_BRANCH =~ /^(main|master|dev)$/ - needs: - - job: GHDL_OSVVM_sim # main only - artifacts: true - optional: true - - job: GHDL_PoC_sim - artifacts: true - optional: true - extends: - - .pages - -pagesRiviera: - rules: - - if: > - $SIMULATOR_PAGES == "Riviera-PRO" && - $CI_PIPELINE_SOURCE == "push" && - $CI_COMMIT_BRANCH =~ /^(main|master|dev)$/ - needs: - - job: RIVIERA_PoC_sim # inherits artifacts from previous jobs - artifacts: true - optional: true - extends: - - .pages - -pagesNVC: - extends: - - .pages - rules: - - if: > - $SIMULATOR_PAGES == "NVC" && - $CI_PIPELINE_SOURCE == "push" - needs: - - job: NVC_OSVVM_sim - artifacts: true - optional: true - - job: NVC_PoC_sim - artifacts: true - optional: true - - job: Sphinx - artifacts: true diff --git a/.sigasi/project.sigasi b/.sigasi/project.sigasi index ecbf27169..ec2691e97 100644 --- a/.sigasi/project.sigasi +++ b/.sigasi/project.sigasi @@ -27,7 +27,7 @@ "dependencies": [ { "Quartus": { - "version": "Quartus25.3", + "version": "Quartus26.1", "targets": [ "altera_mf" ] diff --git a/docs/IPCores/fifo/fifo_cc_got.rst b/docs/IPCores/fifo/fifo_cc_got.rst index ade671852..6af8c4258 100644 --- a/docs/IPCores/fifo/fifo_cc_got.rst +++ b/docs/IPCores/fifo/fifo_cc_got.rst @@ -29,34 +29,34 @@ be used as data storage. The actual memory type depends on the device architecture. See implementation for details. ``*STATE_*_BITS`` defines the granularity of the fill state indicator -``*state_*``. If a fill state is not of interest, set ``*STATE_*_BITS = 0``. -``fstate_rd`` is associated with the read clock domain and outputs the -guaranteed number of words available in the FIFO. ``estate_wr`` is associated +``*State``. If a fill state is not of interest, set ``*STATE_*_BITS = 0``. +``FillState`` is associated with the read clock domain and outputs the +guaranteed number of words available in the FIFO. ``EmptyState`` is associated with the write clock domain and outputs the number of words that is guaranteed to be accepted by the FIFO without a capacity overflow. Note that both these indicators cannot replace the ``full`` or ``valid`` outputs as they may be implemented as giving pessimistic bounds that are minimally off the true fill state. -``fstate_rd`` and ``estate_wr`` are combinatorial outputs and include an address +``FillState`` and ``EmptyState`` are combinatorial outputs and include an address comparator (subtractor) in their path. .. rubric:: Examples: -* FSTATE_RD_BITS = 1: +* FILL_STATE_BITS = 1: +-----------+----------------------+ - | fstate_rd | filled (at least) | + | FillState | filled (at least) | +===========+======================+ | 0 | 0/2 full | +-----------+----------------------+ | 1 | 1/2 full (half full) | +-----------+----------------------+ -* FSTATE_RD_BITS = 2: +* FILL_STATE_BITS = 2: +-----------+----------------------+ - | fstate_rd | filled (at least) | + | FillState | filled (at least) | +===========+======================+ | 0 | 0/4 full | +-----------+----------------------+ diff --git a/docs/IPCores/fifo/fifo_cc_got_tempgot.rst b/docs/IPCores/fifo/fifo_cc_got_tempgot.rst index ace1b02c8..3bb15daef 100644 --- a/docs/IPCores/fifo/fifo_cc_got_tempgot.rst +++ b/docs/IPCores/fifo/fifo_cc_got_tempgot.rst @@ -35,8 +35,8 @@ The FIFO state upon a simultaneous assertion of ``commit`` and ``rollback`` is *undefined*! ``*STATE_*_BITS`` defines the granularity of the fill state indicator -``*state_*``. ``fstate_rd`` is associated with the read clock domain and outputs -the guaranteed number of words available in the FIFO. ``estate_wr`` is +``*State``. ``FillState`` is associated with the read clock domain and outputs +the guaranteed number of words available in the FIFO. ``EmptyState`` is associated with the write clock domain and outputs the number of words that is guaranteed to be accepted by the FIFO without a capacity overflow. Note that both these indicators cannot replace the ``full`` or ``valid`` outputs as @@ -45,22 +45,22 @@ the true fill state. If a fill state is not of interest, set ``*STATE_*_BITS = 0``. -``fstate_rd`` and ``estate_wr`` are combinatorial outputs and include an address +``FillState`` and ``EmptyState`` are combinatorial outputs and include an address comparator (subtractor) in their path. **Examples:** -* FSTATE_RD_BITS = 1: +* FILL_STATE_BITS = 1: - * fstate_rd == 0 => 0/2 full - * fstate_rd == 1 => 1/2 full (half full) + * FillState == 0 => 0/2 full + * FillState == 1 => 1/2 full (half full) -* FSTATE_RD_BITS = 2: +* FILL_STATE_BITS = 2: - * fstate_rd == 0 => 0/4 full - * fstate_rd == 1 => 1/4 full - * fstate_rd == 2 => 2/4 full - * fstate_rd == 3 => 3/4 full + * FillState == 0 => 0/4 full + * FillState == 1 => 1/4 full + * FillState == 2 => 2/4 full + * FillState == 3 => 3/4 full diff --git a/docs/IPCores/fifo/fifo_cc_got_tempput.rst b/docs/IPCores/fifo/fifo_cc_got_tempput.rst index 500c1a268..6e6d6682d 100644 --- a/docs/IPCores/fifo/fifo_cc_got_tempput.rst +++ b/docs/IPCores/fifo/fifo_cc_got_tempput.rst @@ -35,8 +35,8 @@ The FIFO state upon a simultaneous assertion of ``commit`` and ``rollback`` is *undefined*. ``*STATE_*_BITS`` defines the granularity of the fill state indicator -``*state_*``. ``fstate_rd`` is associated with the read clock domain and outputs -the guaranteed number of words available in the FIFO. ``estate_wr`` is +``*State``. ``FillState`` is associated with the read clock domain and outputs +the guaranteed number of words available in the FIFO. ``EmptyState`` is associated with the write clock domain and outputs the number of words that is guaranteed to be accepted by the FIFO without a capacity overflow. Note that both these indicators cannot replace the ``full`` or ``valid`` outputs as @@ -45,22 +45,22 @@ the true fill state. If a fill state is not of interest, set ``*STATE_*_BITS = 0``. -``fstate_rd`` and ``estate_wr`` are combinatorial outputs and include an address +``FillState`` and ``EmptyState`` are combinatorial outputs and include an address comparator (subtractor) in their path. **Examples:** -* FSTATE_RD_BITS = 1: +* FILL_STATE_BITS = 1: - * fstate_rd == 0 => 0/2 full - * fstate_rd == 1 => 1/2 full (half full) + * FillState == 0 => 0/2 full + * FillState == 1 => 1/2 full (half full) -* FSTATE_RD_BITS = 2: +* FILL_STATE_BITS = 2: - * fstate_rd == 0 => 0/4 full - * fstate_rd == 1 => 1/4 full - * fstate_rd == 2 => 2/4 full - * fstate_rd == 3 => 3/4 full + * FillState == 0 => 0/4 full + * FillState == 1 => 1/4 full + * FillState == 2 => 2/4 full + * FillState == 3 => 3/4 full diff --git a/docs/IPCores/fifo/fifo_ic_got.rst b/docs/IPCores/fifo/fifo_ic_got.rst index 798d13d35..16d229e47 100644 --- a/docs/IPCores/fifo/fifo_ic_got.rst +++ b/docs/IPCores/fifo/fifo_ic_got.rst @@ -34,8 +34,8 @@ used as data storage. The actual memory type depends on the device architecture. See implementation for details. ``*STATE_*_BITS`` defines the granularity of the fill state indicator -``*state_*``. ``fstate_rd`` is associated with the read clock domain and outputs -the guaranteed number of words available in the FIFO. ``estate_wr`` is +``*State``. ``FillState`` is associated with the read clock domain and outputs +the guaranteed number of words available in the FIFO. ``EmptyState`` is associated with the write clock domain and outputs the number of words that is guaranteed to be accepted by the FIFO without a capacity overflow. Note that both these indicators cannot replace the ``full`` or ``valid`` outputs as @@ -44,17 +44,17 @@ the true fill state. If a fill state is not of interest, set *STATE_*_BITS = 0. -``fstate_rd`` and ``estate_wr`` are combinatorial outputs and include an address +``FillState`` and ``EmptyState`` are combinatorial outputs and include an address comparator (subtractor) in their path. Examples: -- FSTATE_RD_BITS = 1: fstate_rd == 0 => 0/2 full - fstate_rd == 1 => 1/2 full (half full) +- FILL_STATE_BITS = 1: FillState == 0 => 0/2 full + FillState == 1 => 1/2 full (half full) -- FSTATE_RD_BITS = 2: fstate_rd == 0 => 0/4 full - fstate_rd == 1 => 1/4 full - fstate_rd == 2 => 2/4 full - fstate_rd == 3 => 3/4 full +- FILL_STATE_BITS = 2: FillState == 0 => 0/4 full + FillState == 1 => 1/4 full + FillState == 2 => 2/4 full + FillState == 3 => 3/4 full diff --git a/docs/IPCores/fifo/index.rst b/docs/IPCores/fifo/index.rst index 2a41db7a2..7a8602486 100644 --- a/docs/IPCores/fifo/index.rst +++ b/docs/IPCores/fifo/index.rst @@ -16,7 +16,7 @@ is available on the output. Asserting the `got`-input, acknoledge the processing the current output signals and moves the read-pointer to the next value, if available. All FIFOs implement a bidirectional flow control (`put`/`full` and `valid`/`got`). -Each FIFO also offers a EmptyState (write-side) and FullState (read-side) to indicate +Each FIFO also offers a EmptyState (write-side) and FillState (read-side) to indicate the current fill-state. The prefixes `cc_` (common clock), `dc_` (dependent clock) and `ic_` (independent diff --git a/regression.tcl b/regression.tcl index c2239fb82..9f4629e71 100644 --- a/regression.tcl +++ b/regression.tcl @@ -63,7 +63,7 @@ namespace import ::regression::* # Configuration space # #---------------------# set defaultStep "all" -set regressionLevels [createRegressionLevels osvvm poc test] ; # all +set regressionLevels [createRegressionLevels osvvm poc test] ; # clean, all # -P -projectRoot set project folder root for poc scripting # -g -gui disables system exit (i.e. on errors) @@ -82,22 +82,33 @@ configureOSVVM -stop 1 ; evaluateRegressionLevel $defaultStep $regressionLevels +if {![file exists $::poc::localConfigurationPath] || $::regression::level == -1} { + WriteLocalConfiguration +} else { + puts "${::poc::putsPrefix}Skipping local configuration file generation." +} + +puts "========================================" +puts "End of PoC configuration, start of build" +puts "========================================" +puts "" + if {$::regression::level <= 0} { build ${root}/lib/OsvvmLibraries.pro [BuildName "${::poc::buildNamePrefix}OsvvmLibraries"] if {[checkForBuildErrors] || $::regression::executeSingleStep} { - return + return 1 } } if {$::regression::level <= 1} { build ${root}/PoC.pro [BuildName "${::poc::buildNamePrefix}PoC"] if {[checkForBuildErrors] || $::regression::executeSingleStep} { - return + return 1 } } if {$::regression::level <= 2} { build ${root}/tb/RunAllTests.pro [BuildName "${::poc::buildNamePrefix}RunAllTests"] if {[checkForRunErrors] || $::regression::executeSingleStep} { - return + return 1 } } diff --git a/rename_strings.sh b/rename_strings.sh deleted file mode 100644 index 35b4994c4..000000000 --- a/rename_strings.sh +++ /dev/null @@ -1,155 +0,0 @@ -#!/usr/bin/env bash -# -# rename_strings.sh (v4) — recursively replace OLD with NEW both INSIDE FILES -# and in FILE/FOLDER NAMES, for one or more OLD/NEW pairs. Matching of OLD is -# CASE-INSENSITIVE; the result is written in the exact casing of NEW. Case-only -# changes (e.g. addw -> ADDW) are supported. -# -# Usage: -# ./rename_strings.sh [options] OLD1 NEW1 [OLD2 NEW2 ...] -# -n, --dry-run show what would change, modify nothing -# --names-only only rename files/folders (skip file contents) -# --content-only only edit file contents (skip renaming) -# -# Example: -# ./rename_strings.sh cache_TagUnit_Par cache_TagUnit_Parallel addw Adder_Wide -# -# Safeguards (stop a partial match like cache_TagUnit_Par -> ..._Parallel from -# being applied twice): -# * Contents: an occurrence is replaced only when it is NOT already the start -# of NEW (negative lookahead on NEW's trailing part). A file can therefore -# contain both OLD and NEW; only the OLD ones change. -# * Names: an entry whose name already contains NEW is skipped. The name -# check is case-insensitive for a normal pair (an already-NEW name in any -# casing is protected) and case-sensitive for a case-only pair (so the -# files actually get re-cased). -# Binaries and .git are skipped. Files with no real change are not rewritten. -# -# Requires bash >= 4 and perl. - -set -uo pipefail -shopt -s nocasematch - -# Fail clearly on a bash too old for case-insensitive ${var//...} (e.g. macOS -# system bash 3.2) instead of silently skipping files. -_probe="ABC" -if [[ "${_probe//abc/X}" != "X" ]]; then - echo "error: this bash lacks case-insensitive \${var//...}; use bash >= 4." >&2 - exit 1 -fi -command -v perl >/dev/null || { echo "error: perl is required." >&2; exit 1; } - -dry_run=0 -do_names=1 -do_content=1 -while [[ "${1:-}" == -* ]]; do - case "$1" in - -n|--dry-run) dry_run=1 ;; - --names-only) do_content=0 ;; - --content-only) do_names=0 ;; - --) shift; break ;; - *) echo "unknown option: $1" >&2; exit 1 ;; - esac - shift -done - -if [[ $do_names -eq 0 && $do_content -eq 0 ]]; then - echo "error: --names-only and --content-only are mutually exclusive." >&2 - exit 1 -fi -if [[ $# -lt 2 || $(( $# % 2 )) -ne 0 ]]; then - echo "Usage: $0 [-n|--dry-run] [--names-only|--content-only] OLD1 NEW1 ..." >&2 - exit 1 -fi - -# perl program: build a case-insensitive regex for OLD. If LOOK=1, add a -# negative lookahead on SUF so an already-NEW occurrence is left alone. -read -r -d '' PERL_SUBST <<'PERL' || true -BEGIN { $o = $ENV{OLD}; $s = $ENV{SUF}; $n = $ENV{NEW}; - $re = ($ENV{LOOK} eq "1") ? qr/\Q$o\E(?!\Q$s\E)/i : qr/\Q$o\E/i; } -s/$re/$n/g; -PERL -read -r -d '' PERL_COUNT <<'PERL' || true -BEGIN { $o = $ENV{OLD}; $s = $ENV{SUF}; - $re = ($ENV{LOOK} eq "1") ? qr/\Q$o\E(?!\Q$s\E)/i : qr/\Q$o\E/i; } -my $c = () = /$re/g; print $c; -PERL - -while [[ $# -ge 2 ]]; do - old=$1 - new=$2 - shift 2 - - if [[ -z "$old" ]]; then - echo "skip: empty OLD string" >&2 - continue - fi - # True duplicate (byte-identical) -> nothing to do. [ = ] stays - # case-sensitive regardless of nocasematch, so a case-only pair is kept. - if [ "$old" = "$new" ]; then - echo "skip: OLD == NEW ('$old')" >&2 - continue - fi - - # Lookahead only when NEW is strictly longer than OLD and starts with OLD - # (case-insensitively) -- the prefix-collision case (Par -> Parallel). - suffix="" - look=0 - old_lc=${old,,} - new_lc=${new,,} - if [[ ${#new} -gt ${#old} && "${new_lc:0:${#old}}" == "$old_lc" ]]; then - suffix=${new:${#old}} - look=1 - fi - - echo "== pair: '$old' -> '$new' (case-insensitive match) ==" - - # ---- contents ---- - if [[ $do_content -eq 1 ]]; then - # -I skips binaries, -i case-insensitive, -F literal OLD, -Z null output. - grep -rlIiFZ --exclude-dir=.git -e "$old" . 2>/dev/null | - while IFS= read -r -d '' file; do - n=$(OLD="$old" SUF="$suffix" LOOK="$look" perl -0777 -ne "$PERL_COUNT" "$file" 2>/dev/null) - n=${n:-0} - [[ "$n" =~ ^[0-9]+$ ]] || n=0 - [[ "$n" -gt 0 ]] || continue # only already-NEW occurrences: skip rewrite - if [[ $dry_run -eq 1 ]]; then - printf 'edit (dry): %s replacement(s) in %s\n' "$n" "$file" - else - OLD="$old" NEW="$new" SUF="$suffix" LOOK="$look" \ - perl -0777 -i -pe "$PERL_SUBST" "$file" && - printf 'edited: %s replacement(s) in %s\n' "$n" "$file" - fi - done - fi - - # ---- names ---- - if [[ $do_names -eq 1 ]]; then - # Name-safeguard sensitivity: case-sensitive for a case-only pair (so files - # get re-cased), case-insensitive otherwise (protect already-NEW names). - if [[ "$old" == "$new" ]]; then - guard_flags=(-qF) - else - guard_flags=(-qiF) - fi - # -depth: rename children before parents. -iname: match basename, any case. - find . -depth -not -path './.git/*' -iname "*$old*" -print0 | - while IFS= read -r -d '' path; do - base=$(basename "$path") - if printf '%s' "$base" | grep "${guard_flags[@]}" -e "$new"; then - continue - fi - newbase=${base//"$old"/"$new"} - newpath="$(dirname "$path")/$newbase" - if [[ -e "$newpath" ]]; then - echo "skip: target already exists: $newpath" >&2 - continue - fi - if [[ $dry_run -eq 1 ]]; then - printf 'rename (dry): %s -> %s\n' "$path" "$newpath" - else - mv -- "$path" "$newpath" && printf 'renamed: %s -> %s\n' "$path" "$newpath" - fi - done - fi -done diff --git a/src/arith/arith.pkg.vhdl b/src/arith/arith.pkg.vhdl index 61681faa2..d930486fd 100644 --- a/src/arith/arith.pkg.vhdl +++ b/src/arith/arith.pkg.vhdl @@ -137,16 +137,16 @@ package arith is end component; component arith_SquareRoot - generic ( - BITS : positive + generic( + BITS : positive ); - port ( - Clock : in std_logic; - Reset : in std_logic; - Operand : in std_logic_vector(BITS-1 downto 0); - Start : in std_logic; - Result : out std_logic_vector((BITS-1)/2 downto 0); - Ready : out std_logic + port( + Clock : in std_logic; + Reset : in std_logic; + Radicand : in std_logic_vector(BITS-1 downto 0); + Start : in std_logic; + Result : out std_logic_vector((BITS-1)/2 downto 0); + Ready : out std_logic ); end component; diff --git a/src/arith/arith_Counter_Gray.vhdl b/src/arith/arith_Counter_Gray.vhdl index a8c31c780..af8accd04 100644 --- a/src/arith/arith_Counter_Gray.vhdl +++ b/src/arith/arith_Counter_Gray.vhdl @@ -52,7 +52,7 @@ architecture rtl of arith_Counter_Gray is -- purpose: gray constant encoder function gray_encode (val : natural; len : positive) return unsigned is - variable bin : unsigned(len-1 downto 0) := to_unsigned(val, len); + constant bin : unsigned(len-1 downto 0) := to_unsigned(val, len); begin if len = 1 then return bin; diff --git a/src/arith/arith_SquareRoot.vhdl b/src/arith/arith_SquareRoot.vhdl index 30a86c577..5bcb0c8e9 100644 --- a/src/arith/arith_SquareRoot.vhdl +++ b/src/arith/arith_SquareRoot.vhdl @@ -34,22 +34,22 @@ use IEEE.numeric_std.all; entity arith_SquareRoot is generic ( - BITS : positive -- := 8 -- Bit Width of Argument + BITS : positive -- Bit Width of Argument ); port ( -- Global Control - Reset : in std_logic; -- Reset (synchronous) - Clock : in std_logic; -- Clock + Clock : in std_logic; -- Clock + Reset : in std_logic; -- Reset (synchronous) -- Inputs - Operand : in std_logic_vector(BITS-1 downto 0); -- Radicand - Start : in std_logic; -- Start Strobe + Radicand : in std_logic_vector(BITS-1 downto 0); -- Radicand + Start : in std_logic; -- Start Strobe -- Outputs - Result : out std_logic_vector((BITS-1)/2 downto 0); -- Result - Ready : out std_logic -- Ready / Done + Result : out std_logic_vector((BITS-1)/2 downto 0); -- Result + Ready : out std_logic -- Ready / Done ); -end entity arith_SquareRoot; +end entity; architecture rtl of arith_SquareRoot is @@ -83,7 +83,7 @@ begin -- rtl if Start = '1' then -- Initilize Computation - Rmd <= (Rmd'left downto BITS => '0') & unsigned(Operand); + Rmd <= (Rmd'left downto BITS => '0') & unsigned(Radicand); Vld <= (others => '1'); elsif Vld(Vld'left) = '1' then diff --git a/src/arith/xilinx/arith_Adder_Wide_Xilinx.vhdl b/src/arith/xilinx/arith_Adder_Wide_Xilinx.vhdl index 99ea0ad7b..3d0dca2f0 100644 --- a/src/arith/xilinx/arith_Adder_Wide_Xilinx.vhdl +++ b/src/arith/xilinx/arith_Adder_Wide_Xilinx.vhdl @@ -461,7 +461,6 @@ begin genCCA: if ARCH = CCA generate constant M : positive := HI-LO+1; constant D : positive := M/2; - constant H : positive := (D+5)/6; signal pl : std_logic_vector(M-D-1 downto 0); signal pc : std_logic_vector(M-D downto 0); diff --git a/src/arith/xilinx/arith_CarryChain_inc_Xilinx.vhdl b/src/arith/xilinx/arith_CarryChain_inc_Xilinx.vhdl index 0fbdec3cf..f4b4364c0 100644 --- a/src/arith/xilinx/arith_CarryChain_inc_Xilinx.vhdl +++ b/src/arith/xilinx/arith_CarryChain_inc_Xilinx.vhdl @@ -50,7 +50,6 @@ end entity; architecture rtl of arith_CarryChain_inc_Xilinx is signal ci : std_logic_vector(BITS downto 0); - signal co : std_logic_vector(BITS downto 0); begin ci(0) <= CarryIn; diff --git a/src/arith/xilinx/arith_cca_xilinx.vhdl b/src/arith/xilinx/arith_cca_xilinx.vhdl index cc7da7cd8..560f99169 100644 --- a/src/arith/xilinx/arith_cca_xilinx.vhdl +++ b/src/arith/xilinx/arith_cca_xilinx.vhdl @@ -70,11 +70,10 @@ architecture rtl of arith_cca is function compact return tLevels is variable res : tLevels(0 to 31); - variable base, core, done : integer; + variable base : integer := 0; + variable core : integer := (BITS - L) / 2; + variable done : integer := BITS - 2*core; begin - base := 0; - core := (BITS-L)/2; - done := BITS-2*core; for i in res'range loop res(i) := (base, core, done); if core <= 0 then @@ -92,8 +91,9 @@ architecture rtl of arith_cca is end if; end loop; end function compact; + constant LEVELS : tLevels := compact; - constant CCA : boolean := LEVELS'length > 1; + constant CCA : boolean := LEVELS'length > 1; begin genRCA: if not CCA generate diff --git a/src/build.pro b/src/build.pro index db70e8bbe..0c5085136 100644 --- a/src/build.pro +++ b/src/build.pro @@ -21,8 +21,8 @@ library PoC -analyze $::poc::projectConfigurationPath -analyze $::poc::localConfigurationPath +analyze $::poc::projectConfigurationFile +analyze $::poc::localConfigurationFile include ./common disabled ./misc/misc_ClockBuffer.vhdl diff --git a/src/bus/axi4/axi4_DeMux.vhdl b/src/bus/axi4/axi4_DeMux.vhdl index 03b446c29..b44595c92 100644 --- a/src/bus/axi4/axi4_DeMux.vhdl +++ b/src/bus/axi4/axi4_DeMux.vhdl @@ -88,16 +88,16 @@ architecture rtl of axi4_DeMux is constant RESPONSE_FIFO_DEPTH : positive := 16; --Using SRL16E, depth is maximum 16 constant PORTS : positive := Out_M2S'length; - constant PORT_BITS : positive := log2ceilnz(PORTS); + -- constant PORT_BITS : positive := log2ceilnz(PORTS); constant IN_AW_ID_BITS : natural := In_M2S.AWID'length; constant Out_AW_ID_BITS : natural := Out_M2S(Out_M2S'low).AWID'length; - constant IN_AR_ID_BITS : natural := In_M2S.ARID'length; + -- constant IN_AR_ID_BITS : natural := In_M2S.ARID'length; constant Out_AR_ID_BITS : natural := Out_M2S(Out_M2S'low).ARID'length; constant ADDRESS_BITS : natural := imin(In_M2S.AWAddr'length, Out_M2S(0).AWAddr'length); constant DATA_BITS : natural := In_M2S.WData'length; - constant STRB_BITS : natural := In_M2S.WData'length / 8; + -- constant STRB_BITS : natural := In_M2S.WData'length / 8; constant CACHE_BITS : natural := In_M2S.AWCache'length; constant PROTECT_BITS : natural := In_M2S.AWProt'length; constant RESPONSE_BITS : natural := In_S2M.RResp'length; @@ -197,7 +197,7 @@ begin ); signal Address_hit : std_logic_vector(PORTS -1 downto 0); - constant MUX_DATA_BITS : natural := isum(BACKWARD_BIT_VEC); + -- constant MUX_DATA_BITS : natural := isum(BACKWARD_BIT_VEC); signal Mux_In_M2S : T_AXI4Stream_M2S_VECTOR(0 to PORTS)(Data(isum(BACKWARD_BIT_VEC) - 1 downto 0), Keep(0 downto 0), User(0 downto 0), ID(0 downto 0), Dest(0 downto 0)); signal Mux_In_S2M : T_AXI4Stream_S2M_VECTOR(0 to PORTS)(User(0 downto 0)); @@ -205,7 +205,7 @@ begin signal Mux_Out_S2M : T_AXI4Stream_S2M(User(0 downto 0)); signal Response_fifo_put : std_logic; - signal Response_fifo_ful : std_logic; + signal Response_fifo_ful : std_logic; -- FIXME: this signal is unused. signal Response_fifo_got : std_logic; signal Response_fifo_dout : std_logic_vector(ID_BITS-1 downto 0); signal Response_fifo_vld : std_logic; @@ -286,7 +286,7 @@ begin begin NextState <= State; - In_S2M_write <= Initialize_AXI4_Bus_S2M(In_M2S.AWAddr'length, In_S2M.RData'length, In_S2M.RUser'length, In_S2M.BID'length, '0'); + In_S2M_write <= Initialize_AXI4_Bus_S2M(In_S2M.RData'length, In_S2M.RUser'length, In_S2M.BID'length, '0'); Out_M2S_write <= (Out_M2S'range => In_M2S_write); for i in 0 to PORTS -1 loop @@ -397,7 +397,7 @@ begin Response_fifo : entity work.fifo_Shift generic map( - DATA_BITS => ID_BITS, + DATA_BITS => ID_BITS, MIN_DEPTH => RESPONSE_FIFO_DEPTH ) port map( @@ -406,14 +406,14 @@ begin Reset => Reset, -- Writing Interface - Put => Response_fifo_put, - DataIn => In_M2S_write.ARID, - Full => Response_fifo_ful, + Put => Response_fifo_put, + DataIn => In_M2S_write.ARID, + Full => Response_fifo_ful, -- FIXME: this signal is unused -- Reading Interface - Got => Response_fifo_got, + Got => Response_fifo_got, DataOut => Response_fifo_dout, - Valid => Response_fifo_vld + Valid => Response_fifo_vld ); Mux_In_M2S(PORTS).Valid <= Response_fifo_vld; diff --git a/src/bus/axi4/axi4_FIFO_CDC.vhdl b/src/bus/axi4/axi4_FIFO_CDC.vhdl index dac1c0d96..4bfd8f462 100644 --- a/src/bus/axi4/axi4_FIFO_CDC.vhdl +++ b/src/bus/axi4/axi4_FIFO_CDC.vhdl @@ -108,20 +108,20 @@ architecture rtl of axi4_FIFO_CDC is constant B_POS : natural := 4; constant BIT_VEC : positive_vector := ( - AW_POS => isum(W_Addr_BIT_VEC), - AR_POS => isum(R_Addr_BIT_VEC), - W_POS => isum(W_BIT_VEC), - R_POS => isum(R_BIT_VEC), - B_POS => isum(B_BIT_VEC) - ); + AW_POS => isum(W_Addr_BIT_VEC), + AR_POS => isum(R_Addr_BIT_VEC), + W_POS => isum(W_BIT_VEC), + R_POS => isum(R_BIT_VEC), + B_POS => isum(B_BIT_VEC) + ); constant MIN_DEPTH : positive_vector := ( - AW_POS => FRAMES, - AR_POS => FRAMES, - W_POS => FRAMES * FRAME_DEPTH, - R_POS => FRAMES * FRAME_DEPTH, - B_POS => FRAMES - ); + AW_POS => FRAMES, + AR_POS => FRAMES, + W_POS => FRAMES * FRAME_DEPTH, + R_POS => FRAMES * FRAME_DEPTH, + B_POS => FRAMES + ); signal In_Ready_vec : std_logic_vector(0 to 4); signal In_Valid_vec : std_logic_vector(0 to 4); @@ -130,8 +130,6 @@ architecture rtl of axi4_FIFO_CDC is signal DataFIFO_DataIn : std_logic_vector(isum(BIT_VEC) -1 downto 0); signal DataFIFO_DataOut : std_logic_vector(isum(BIT_VEC) -1 downto 0); - - begin -----INPUT In_S2M.AWReady <= In_Ready_vec(AW_POS); @@ -370,20 +368,20 @@ begin ) port map ( -- Writing Interface - clk_wr => ite(i<3,In_Clock,Out_Clock), - rst_wr => ite(i<3,In_Reset,Out_Reset), - put => DataFIFO_put, - din => DataFIFO_DataIn_i, - full => DataFIFO_Full, - estate_wr => open, + Write_Clock => ite(i<3,In_Clock,Out_Clock), + Write_Reset => ite(i<3,In_Reset,Out_Reset), + Write_Put => DataFIFO_put, + Write_DataIn => DataFIFO_DataIn_i, + Write_Full => DataFIFO_Full, + Write_EmptyState => open, -- Reading Interface - clk_rd => ite(i<3,Out_Clock,In_Clock), - rst_rd => ite(i<3,Out_Reset,In_Reset), - got => DataFIFO_got, - dout => DataFIFO_DataOut_i, - valid => DataFIFO_Valid, - fstate_rd => open + Read_Clock => ite(i<3,Out_Clock,In_Clock), + Read_Reset => ite(i<3,Out_Reset,In_Reset), + Read_Valid => DataFIFO_Valid, + Read_DataOut => DataFIFO_DataOut_i, + Read_Got => DataFIFO_got, + Read_FillState => open ); end generate; diff --git a/src/bus/axi4/axi4_Full.pkg.vhdl b/src/bus/axi4/axi4_Full.pkg.vhdl index db1a02bfb..5763c8ef2 100644 --- a/src/bus/axi4/axi4_Full.pkg.vhdl +++ b/src/bus/axi4/axi4_Full.pkg.vhdl @@ -170,8 +170,8 @@ package axi4_Full is function IDResize(InBus : T_AXI4_Bus_M2S; AWIDBits : natural; ARIDBits : natural) return T_AXI4_Bus_M2S; function IDResize(InBus : T_AXI4_Bus_S2M; RIDBits : natural; BIDBits : natural) return T_AXI4_Bus_S2M; - function Initialize_AXI4_Bus_S2M(AddressBits : natural; DataBits : natural; UserBits : natural := 0; IDBits : natural := 0; Value : std_logic := 'Z') return T_AXI4_Bus_S2M; function Initialize_AXI4_Bus_M2S(AddressBits : natural; DataBits : natural; UserBits : natural := 0; IDBits : natural := 0; Value : std_logic := 'Z') return T_AXI4_Bus_M2S; + function Initialize_AXI4_Bus_S2M(DataBits : natural; UserBits : natural := 0; IDBits : natural := 0; Value : std_logic := 'Z') return T_AXI4_Bus_S2M; procedure ConnectAndResize(signal In_M2S : in T_AXI4_Bus_M2S; signal In_S2M : out T_AXI4_Bus_S2M; signal Out_M2S : out T_AXI4_Bus_M2S; signal Out_S2M : in T_AXI4_Bus_S2M; constant Info_Prefix : string := ""); type T_AXI4_Bus is record @@ -634,78 +634,78 @@ package body axi4_Full is return temp; end function; - function Initialize_AXI4_Bus_S2M(AddressBits : natural; DataBits : natural; UserBits : natural := 0; IDBits : natural := 0; Value : std_logic := 'Z') return T_AXI4_Bus_S2M is - variable var : T_AXI4_Bus_S2M( - BID(ite(IDBits = 0, 1, IDBits) - 1 downto 0), RID(ite(IDBits = 0, 1, IDBits) - 1 downto 0), - BUser(ite(UserBits = 0, 1, UserBits) - 1 downto 0), RUser(ite(UserBits = 0, 1, UserBits) - 1 downto 0), - RData(DataBits - 1 downto 0) + function Initialize_AXI4_Bus_M2S(AddressBits : natural; DataBits : natural; UserBits : natural := 0; IDBits : natural := 0; Value : std_logic := 'Z') return T_AXI4_Bus_M2S is + constant init : T_AXI4_Bus_M2S( + AWID(ite(IDBits = 0, 1, IDBits) - 1 downto 0), ARID(ite(IDBits = 0, 1, IDBits) - 1 downto 0), + AWUser(ite(UserBits = 0, 1, UserBits) - 1 downto 0), ARUser(ite(UserBits = 0, 1, UserBits) - 1 downto 0), WUser(ite(UserBits = 0, 1, UserBits) - 1 downto 0), + WData(DataBits - 1 downto 0), WStrb((DataBits / 8) - 1 downto 0), + AWAddr(AddressBits - 1 downto 0), ARAddr(AddressBits - 1 downto 0) ) := ( - AWReady => Value, - WReady => Value, - BValid => Value, - BResp => (others => Value), - BID => (ite(IDBits = 0, 1, IDBits) - 1 downto 0 => Value), - BUser => (ite(UserBits = 0, 1, UserBits) - 1 downto 0 => Value), - ARReady => Value, - RValid => Value, - RData => (DataBits - 1 downto 0 => Value), - RResp => (others => Value), - RID => (ite(IDBits = 0, 1, IDBits) - 1 downto 0 => Value), - RLast => Value, - RUser => (ite(UserBits = 0, 1, UserBits) - 1 downto 0 => Value) + AWValid => Value, + AWCache => (others => Value), + AWAddr => (AddressBits - 1 downto 0 => Value), + AWProt => (others => Value), + AWID => (ite(IDBits = 0, 1, IDBits) - 1 downto 0 => Value), + AWLen => (others => Value), + AWSize => (others => Value), + AWBurst => (others => Value), + AWLock => (others => Value), + AWQOS => (others => Value), + AWRegion => (others => Value), + AWUser => (ite(UserBits = 0, 1, UserBits) - 1 downto 0 => Value), + WValid => Value, + WData => (DataBits - 1 downto 0 => Value), + WStrb => ((DataBits / 8) - 1 downto 0 => Value), + WLast => Value, + WUser => (ite(UserBits = 0, 1, UserBits) - 1 downto 0 => Value), + BReady => Value, + ARValid => Value, + ARCache => (others => Value), + ARAddr => (AddressBits - 1 downto 0 => Value), + ARProt => (others => Value), + ARID => (ite(IDBits = 0, 1, IDBits) - 1 downto 0 => Value), + ARLen => (others => Value), + ARSize => (others => Value), + ARBurst => (others => Value), + ARLock => (others => Value), + ARQOS => (others => Value), + ARRegion => (others => Value), + ARUser => (ite(UserBits = 0, 1, UserBits) - 1 downto 0 => Value), + RReady => Value ); begin - return var; + return init; end function; - function Initialize_AXI4_Bus_M2S(AddressBits : natural; DataBits : natural; UserBits : natural := 0; IDBits : natural := 0; Value : std_logic := 'Z') return T_AXI4_Bus_M2S is - variable var : T_AXI4_Bus_M2S( - AWID(ite(IDBits = 0, 1, IDBits) - 1 downto 0), ARID(ite(IDBits = 0, 1, IDBits) - 1 downto 0), - AWUser(ite(UserBits = 0, 1, UserBits) - 1 downto 0), ARUser(ite(UserBits = 0, 1, UserBits) - 1 downto 0), WUser(ite(UserBits = 0, 1, UserBits) - 1 downto 0), - WData(DataBits - 1 downto 0), WStrb((DataBits / 8) - 1 downto 0), - AWAddr(AddressBits - 1 downto 0), ARAddr(AddressBits - 1 downto 0) + function Initialize_AXI4_Bus_S2M(DataBits : natural; UserBits : natural := 0; IDBits : natural := 0; Value : std_logic := 'Z') return T_AXI4_Bus_S2M is + constant init : T_AXI4_Bus_S2M( + BID(ite(IDBits = 0, 1, IDBits) - 1 downto 0), RID(ite(IDBits = 0, 1, IDBits) - 1 downto 0), + BUser(ite(UserBits = 0, 1, UserBits) - 1 downto 0), RUser(ite(UserBits = 0, 1, UserBits) - 1 downto 0), + RData(DataBits - 1 downto 0) ) := ( - AWValid => Value, - AWCache => (others => Value), - AWAddr => (AddressBits - 1 downto 0 => Value), - AWProt => (others => Value), - AWID => (ite(IDBits = 0, 1, IDBits) - 1 downto 0 => Value), - AWLen => (others => Value), - AWSize => (others => Value), - AWBurst => (others => Value), - AWLock => (others => Value), - AWQOS => (others => Value), - AWRegion => (others => Value), - AWUser => (ite(UserBits = 0, 1, UserBits) - 1 downto 0 => Value), - WValid => Value, - WData => (DataBits - 1 downto 0 => Value), - WStrb => ((DataBits / 8) - 1 downto 0 => Value), - WLast => Value, - WUser => (ite(UserBits = 0, 1, UserBits) - 1 downto 0 => Value), - BReady => Value, - ARValid => Value, - ARCache => (others => Value), - ARAddr => (AddressBits - 1 downto 0 => Value), - ARProt => (others => Value), - ARID => (ite(IDBits = 0, 1, IDBits) - 1 downto 0 => Value), - ARLen => (others => Value), - ARSize => (others => Value), - ARBurst => (others => Value), - ARLock => (others => Value), - ARQOS => (others => Value), - ARRegion => (others => Value), - ARUser => (ite(UserBits = 0, 1, UserBits) - 1 downto 0 => Value), - RReady => Value + AWReady => Value, + WReady => Value, + BValid => Value, + BResp => (others => Value), + BID => (ite(IDBits = 0, 1, IDBits) - 1 downto 0 => Value), + BUser => (ite(UserBits = 0, 1, UserBits) - 1 downto 0 => Value), + ARReady => Value, + RValid => Value, + RData => (DataBits - 1 downto 0 => Value), + RResp => (others => Value), + RID => (ite(IDBits = 0, 1, IDBits) - 1 downto 0 => Value), + RLast => Value, + RUser => (ite(UserBits = 0, 1, UserBits) - 1 downto 0 => Value) ); begin - return var; + return init; end function; function Initialize_AXI4_Bus(AddressBits : natural; DataBits : natural; UserBits : natural := 0; IDBits : natural := 0) return T_AXI4_Bus is begin return ( - M2S => Initialize_AXI4_Bus_M2S(AddressBits, DataBits, UserBits, IDBits), - S2M => Initialize_AXI4_Bus_S2M(AddressBits, DataBits, UserBits, IDBits) + M2S => Initialize_AXI4_Bus_M2S(AddressBits, DataBits, UserBits, IDBits), + S2M => Initialize_AXI4_Bus_S2M(DataBits, UserBits, IDBits) ); end function; diff --git a/src/bus/axi4/axi4_Mux.vhdl b/src/bus/axi4/axi4_Mux.vhdl index 353270d95..1f7fd57ea 100644 --- a/src/bus/axi4/axi4_Mux.vhdl +++ b/src/bus/axi4/axi4_Mux.vhdl @@ -202,7 +202,7 @@ begin begin NextState <= State; - In_S2M_write <= (In_S2M'range => Initialize_AXI4_Bus_S2M(Out_M2S.AWAddr'length, Out_S2M.RData'length, Out_S2M.RUser'length, In_S2M(In_S2M'low).BID'length, '0')); + In_S2M_write <= (In_S2M'range => Initialize_AXI4_Bus_S2M(Out_S2M.RData'length, Out_S2M.RUser'length, In_S2M(In_S2M'low).BID'length, '0')); Out_M2S_write <= Initialize_AXI4_Bus_M2S(Out_M2S.AWAddr'length, Out_M2S.WData'length, Out_M2S.WUser'length, Out_M2S.AWID'length, '0'); Arbitrate <= '0'; diff --git a/src/bus/axi4/axi4_Sink.vhdl b/src/bus/axi4/axi4_Sink.vhdl index 547a9b7b0..4791614f8 100644 --- a/src/bus/axi4/axi4_Sink.vhdl +++ b/src/bus/axi4/axi4_Sink.vhdl @@ -181,9 +181,7 @@ begin nxt_wstate <= Idle; end if; - when others => nxt_wstate <= Idle; - - end case; + end case; end process; read_proc : process (all) diff --git a/src/bus/axi4lite/axi4lite.pkg.vhdl b/src/bus/axi4lite/axi4lite.pkg.vhdl index 59b4dbb90..813f6562d 100644 --- a/src/bus/axi4lite/axi4lite.pkg.vhdl +++ b/src/bus/axi4lite/axi4lite.pkg.vhdl @@ -125,7 +125,7 @@ package axi4lite is type T_axi4lite_Bus_VECTOR is array(natural range <>) of T_axi4lite_Bus; function Initialize_axi4lite_Bus_M2S(AddressBits : natural; DataBits : natural; Value : std_logic := 'Z') return T_AXI4LITE_BUS_M2S; - function Initialize_axi4lite_Bus_S2M(AddressBits : natural; DataBits : natural; Value : std_logic := 'Z') return T_AXI4LITE_BUS_S2M; + function Initialize_axi4lite_Bus_S2M(DataBits : natural; Value : std_logic := 'Z') return T_AXI4LITE_BUS_S2M; function Initialize_axi4lite_Bus(AddressBits : natural; DataBits : natural) return T_axi4lite_Bus; -------Define AXI Register structure------------- @@ -365,7 +365,7 @@ package body axi4lite is end function; function Initialize_axi4lite_Bus_M2S(AddressBits : natural; DataBits : natural; Value : std_logic := 'Z') return T_axi4lite_Bus_M2S is - variable var : T_axi4lite_Bus_M2S( + constant init : T_axi4lite_Bus_M2S( AWAddr(AddressBits - 1 downto 0), WData(DataBits - 1 downto 0), WStrb((DataBits /8) - 1 downto 0), ARAddr(AddressBits - 1 downto 0)) := ( -- AClk => Value, @@ -385,11 +385,11 @@ package body axi4lite is RReady => Value ); begin - return var; + return init; end function; - function Initialize_axi4lite_Bus_S2M(AddressBits : natural; DataBits : natural; Value : std_logic := 'Z') return T_axi4lite_Bus_S2M is - variable var : T_axi4lite_Bus_S2M(RData(DataBits - 1 downto 0)) := ( + function Initialize_axi4lite_Bus_S2M(DataBits : natural; Value : std_logic := 'Z') return T_axi4lite_Bus_S2M is + constant init : T_axi4lite_Bus_S2M(RData(DataBits - 1 downto 0)) := ( AWReady => Value, WReady => Value, BValid => Value, @@ -400,14 +400,14 @@ package body axi4lite is RResp => (others => Value) ); begin - return var; + return init; end function; function Initialize_axi4lite_Bus(AddressBits : natural; DataBits : natural) return T_axi4lite_Bus is begin return ( M2S => Initialize_axi4lite_Bus_M2S(AddressBits, DataBits), - S2M => Initialize_axi4lite_Bus_S2M(AddressBits, DataBits) + S2M => Initialize_axi4lite_Bus_S2M(DataBits) ); end function; @@ -421,8 +421,6 @@ package body axi4lite is end function; impure function write_csv_file(FileName : string; reg : T_AXI4_Register_Vector) return boolean is - constant QM : character := '"'; - constant size_header : natural := imax(FileName'length, 51); file FileHandle : TEXT open write_MODE is FileName; variable CurrentLine : LINE; @@ -547,7 +545,7 @@ package body axi4lite is AutoClear_Mask : std_logic_vector(DATA_BITS - 1 downto 0) := (others => '0'); IsInterruptRegister : boolean := false ) return T_AXI4_Register is - variable temp : T_AXI4_Register := ( + constant init : T_AXI4_Register := ( Name => resize(Name, NAME_LENGTH), Address => Address, RegisterMode => RegisterMode, @@ -556,7 +554,7 @@ package body axi4lite is IsInterruptRegister => IsInterruptRegister ); begin - return temp; + return init; end function; procedure assign( @@ -836,12 +834,10 @@ package body axi4lite is constant T_reg : in std_logic_vector(DATA_BITS - 1 downto 0); signal nextT_reg : out std_logic_vector(DATA_BITS - 1 downto 0) ) is - constant Value_idx : natural := 0; - constant BitSet_idx : natural := 1; - constant BitClr_idx : natural := 2; - constant BitTgl_idx : natural := 3; - - variable newValue : std_logic_vector(DATA_BITS - 1 downto 0); + -- constant Value_idx : natural := 0; + -- constant BitSet_idx : natural := 1; + -- constant BitClr_idx : natural := 2; + -- constant BitTgl_idx : natural := 3; begin --IO Register Output <= IO_reg; diff --git a/src/bus/axi4lite/axi4lite_FIFO_CDC.vhdl b/src/bus/axi4lite/axi4lite_FIFO_CDC.vhdl index 10db87dfa..d1c542b5c 100644 --- a/src/bus/axi4lite/axi4lite_FIFO_CDC.vhdl +++ b/src/bus/axi4lite/axi4lite_FIFO_CDC.vhdl @@ -227,20 +227,20 @@ begin ) port map ( -- Writing Interface - clk_wr => ite(i<3,In_Clock,Out_Clock), - rst_wr => ite(i<3,In_Reset,Out_Reset), - put => DataFIFO_put, - din => DataFIFO_DataIn_i, - full => DataFIFO_Full, - estate_wr => open, + Write_Clock => ite(i<3,In_Clock,Out_Clock), + Write_Reset => ite(i<3,In_Reset,Out_Reset), + Write_Put => DataFIFO_put, + Write_DataIn => DataFIFO_DataIn_i, + Write_Full => DataFIFO_Full, + Write_EmptyState => open, -- Reading Interface - clk_rd => ite(i<3,Out_Clock,In_Clock), - rst_rd => ite(i<3,Out_Reset,In_Reset), - got => DataFIFO_got, - dout => DataFIFO_DataOut_i, - valid => DataFIFO_Valid, - fstate_rd => open + Read_Clock => ite(i<3,Out_Clock,In_Clock), + Read_Reset => ite(i<3,Out_Reset,In_Reset), + Read_Got => DataFIFO_got, + Read_DataOut => DataFIFO_DataOut_i, + Read_Valid => DataFIFO_Valid, + Read_FillState => open ); diff --git a/src/bus/axi4lite/axi4lite_OCRAM_Adapter.vhdl b/src/bus/axi4lite/axi4lite_OCRAM_Adapter.vhdl index 2ba67e640..09ce6da2b 100644 --- a/src/bus/axi4lite/axi4lite_OCRAM_Adapter.vhdl +++ b/src/bus/axi4lite/axi4lite_OCRAM_Adapter.vhdl @@ -180,7 +180,7 @@ begin nextState <= st_await_write_data; when "011" | "101" | "111" => -- read and write address at the same time - if (PREFFERED_READ_ACCESS = TRUE) then + if PREFFERED_READ_ACCESS then nextAddress <= unsigned(AXI4L_m2s_int.ARAddr(OCRAM_ADDRESS_BITS + ADDR_LSB -1 downto ADDR_LSB)); nextState <= st_read_data_ack; diff --git a/src/bus/axi4lite/axi4lite_Register.vhdl b/src/bus/axi4lite/axi4lite_Register.vhdl index 1e303d1b6..98838b275 100644 --- a/src/bus/axi4lite/axi4lite_Register.vhdl +++ b/src/bus/axi4lite/axi4lite_Register.vhdl @@ -475,15 +475,16 @@ begin -- Output register or memory read data process(Clock) is - function first_out(slv : std_logic_vector; reg : T_SLVV) return std_logic_vector is - begin - for i in slv'low to slv'high loop - if (slv(i)) = '1' then - return reg(i); - end if; - end loop; - return reg(0); - end function; + -- function first_out(slv : std_logic_vector; reg : T_SLVV) return std_logic_vector is + -- begin + -- for i in slv'low to slv'high loop + -- if (slv(i)) = '1' then + -- return reg(i); + -- end if; + -- end loop; + -- return reg(0); + -- end function; + function lssb_idx_with_loop(slv : std_logic_vector) return integer is begin for i in slv'low to slv'high loop @@ -493,6 +494,7 @@ begin end loop; return 0; end function; + variable idx : integer; begin if (rising_edge (Clock)) then @@ -542,7 +544,7 @@ begin ------------ Address Hit's --------------------------- - high_addr_gen : if (REG_ADDRESS_BITS >= ADDRESS_BITS) or (IGNORE_HIGH_ADDRESS = TRUE) generate + high_addr_gen : if (REG_ADDRESS_BITS >= ADDRESS_BITS) or IGNORE_HIGH_ADDRESS generate is_high_r <= '1'; is_high_w <= '1'; else generate diff --git a/src/bus/axi4lite/axi4lite_UART.vhdl b/src/bus/axi4lite/axi4lite_UART.vhdl index ee4c00d27..021c6cbc0 100644 --- a/src/bus/axi4lite/axi4lite_UART.vhdl +++ b/src/bus/axi4lite/axi4lite_UART.vhdl @@ -76,7 +76,7 @@ end entity; architecture rtl of axi4lite_UART is constant TX_EMPTY_STATE_BITS : natural := 4; - constant RX_FULL_STATE_BITS : natural := 4; + constant RX_FILL_STATE_BITS : natural := 4; constant Reg_config : T_AXI4_Register_Vector := ( to_AXI4_Register(Name => "Rx", Address => 32x"00", RegisterMode => ReadOnly_NotRegistered, Init_Value => x"00000000"), @@ -95,8 +95,6 @@ architecture rtl of axi4lite_UART is --user required axi registers signal RX_Data : std_logic_vector(7 downto 0); signal TX_Data : std_logic_vector(7 downto 0); - signal Status : std_logic_vector(31 downto 0); - signal Control : std_logic_vector(31 downto 0); --Bit positions of the above registers signal Status_RX_Valid : std_logic; @@ -119,8 +117,6 @@ architecture rtl of axi4lite_UART is signal Control_TX_Reset : std_logic; signal Control_InterruptEnable : std_logic; - signal Status_TX_EmptyState : std_logic_vector(imax(0, TX_EMPTY_STATE_BITS - 1) downto 0); - signal Status_RX_FullState : std_logic_vector(imax(0, RX_FULL_STATE_BITS - 1) downto 0); begin Reg : entity work.axi4lite_Register generic map( @@ -187,10 +183,10 @@ begin ADD_INPUT_SYNCHRONIZERS => ADD_INPUT_SYNCHRONIZERS, -- Buffer Dimensioning - TX_MIN_DEPTH => TX_FIFO_DEPTH, - TX_ESTATE_BITS => TX_EMPTY_STATE_BITS, - RX_MIN_DEPTH => RX_FIFO_DEPTH, - RX_FSTATE_BITS => RX_FULL_STATE_BITS, + TX_MIN_DEPTH => TX_FIFO_DEPTH, + TX_EMPTY_STATE_BITS => TX_EMPTY_STATE_BITS, + RX_MIN_DEPTH => RX_FIFO_DEPTH, + RX_FILL_STATE_BITS => RX_FILL_STATE_BITS, -- Flow Control FLOWCONTROL => FLOWCONTROL, @@ -205,13 +201,13 @@ begin TX_Put => TX_Put, TX_Data => TX_Data, TX_Full => Status_TX_Full, - TX_EmptyState => Status_TX_EmptyState, + TX_EmptyState => open, TXFIFO_Reset => Control_TX_Reset, TXFIFO_Empty => TXFIFO_Empty, RX_Valid => Status_RX_Valid, RX_Data => RX_Data, RX_Got => RX_Got, - RX_FullState => Status_RX_FullState, + RX_FillState => open, RX_Overflow => RX_OverFlow, RXFIFO_Full => Status_RX_Full, RXFIFO_Reset => Control_RX_Reset, diff --git a/src/bus/axi4stream/axi4stream_FIFO_CDC.vhdl b/src/bus/axi4stream/axi4stream_FIFO_CDC.vhdl index 0803d2e15..a5c0012fa 100644 --- a/src/bus/axi4stream/axi4stream_FIFO_CDC.vhdl +++ b/src/bus/axi4stream/axi4stream_FIFO_CDC.vhdl @@ -175,20 +175,20 @@ begin ) port map ( -- Writing Interface - clk_wr => In_Clock, - rst_wr => In_Reset, - put => DataFIFO_put, - din => DataFIFO_DataIn(ite(USER_IS_DYNAMIC, isum(FIFO_BIT_VEC), isum(FIFO_BIT_VEC) - USER_BITS) -1 downto 0), - full => DataFIFO_Full, - estate_wr => open, + Write_Clock => In_Clock, + Write_Reset => In_Reset, + Write_Put => DataFIFO_put, + Write_DataIn => DataFIFO_DataIn(ite(USER_IS_DYNAMIC, isum(FIFO_BIT_VEC), isum(FIFO_BIT_VEC) - USER_BITS) -1 downto 0), + Write_Full => DataFIFO_Full, + Write_EmptyState => open, -- Reading Interface - clk_rd => Out_Clock, - rst_rd => Out_Reset, - got => DataFIFO_got, - dout => DataFIFO_DataOut(ite(USER_IS_DYNAMIC, isum(FIFO_BIT_VEC), isum(FIFO_BIT_VEC) - USER_BITS) -1 downto 0), - valid => DataFIFO_Valid, - fstate_rd => open + Read_Clock => Out_Clock, + Read_Reset => Out_Reset, + Read_Got => DataFIFO_got, + Read_DataOut => DataFIFO_DataOut(ite(USER_IS_DYNAMIC, isum(FIFO_BIT_VEC), isum(FIFO_BIT_VEC) - USER_BITS) -1 downto 0), + Read_Valid => DataFIFO_Valid, + Read_FillState => open ); Out_M2S <= Out_M2S_i; @@ -229,20 +229,20 @@ begin ) port map ( -- Writing Interface - clk_wr => In_Clock, - rst_wr => In_Reset, - put => MetaFIFO_put, - din => Meta_In, - full => MetaFIFO_Full, - estate_wr => open, + Write_Clock => In_Clock, + Write_Reset => In_Reset, + Write_Put => MetaFIFO_put, + Write_DataIn => Meta_In, + Write_Full => MetaFIFO_Full, + Write_EmptyState => open, -- Reading Interface - clk_rd => Out_Clock, - rst_rd => Out_Reset, - got => Out_M2S_i.Valid and Out_M2S_i.Last and Out_S2M.Ready, - dout => Meta_Out, - valid => open, - fstate_rd => open + Read_Clock => Out_Clock, + Read_Reset => Out_Reset, + Read_Got => Out_M2S_i.Valid and Out_M2S_i.Last and Out_S2M.Ready, + Read_DataOut => Meta_Out, + Read_Valid => open, + Read_FillState => open ); else generate MetaFIFO_Full <= '0'; diff --git a/src/bus/axi4stream/axi4stream_FIFO_TempGot.vhdl b/src/bus/axi4stream/axi4stream_FIFO_TempGot.vhdl index fc62688d5..419bde943 100644 --- a/src/bus/axi4stream/axi4stream_FIFO_TempGot.vhdl +++ b/src/bus/axi4stream/axi4stream_FIFO_TempGot.vhdl @@ -100,16 +100,12 @@ architecture rtl of axi4stream_FIFO_TempGot is signal DataFIFO_DataOut : std_logic_vector(DataFIFO_DataIn'range); signal DataFIFO_Valid : std_logic; - signal FrameCommit : std_logic; - - signal In_SOF : std_logic; signal started : std_logic := '0'; signal Out_M2S_i : In_m2s'subtype; begin - In_SOF <= In_m2s.Valid and not started; - started <= ffrs(q => started, rst => ((In_m2s.Valid and In_m2s.Last) or Reset), set => (In_m2s.Valid)) when rising_edge(Clock); + started <= ffrs(q => started, rst => ((In_m2s.Valid and In_m2s.Last) or Reset), set => (In_m2s.Valid)) when rising_edge(Clock); process(Clock) begin diff --git a/src/bus/axi4stream/axi4stream_FIFO_TempPut.vhdl b/src/bus/axi4stream/axi4stream_FIFO_TempPut.vhdl index 0be119977..fc58bcd75 100644 --- a/src/bus/axi4stream/axi4stream_FIFO_TempPut.vhdl +++ b/src/bus/axi4stream/axi4stream_FIFO_TempPut.vhdl @@ -117,17 +117,15 @@ architecture rtl of axi4stream_FIFO_TempPut is signal DataFIFO_DataOut : std_logic_vector(DataFIFO_DataIn'range); signal DataFIFO_Valid : std_logic; - signal In_SOF : std_logic; - signal started : std_logic := '0'; + signal started : std_logic := '0'; --We set the ranges of Out_S2M_i manually to the values from input to force the input and output record to be the same sizes. - signal Out_M2S_i : T_AXI4Stream_M2S(Data(DATA_BITS -1 downto 0), Keep(DATA_BITS /8 -1 downto 0), User(USER_BITS -1 downto 0), ID(ID_BITS-1 downto 0), DEST(DEST_BITS-1 downto 0)); + signal Out_M2S_i : T_AXI4Stream_M2S(Data(DATA_BITS -1 downto 0), Keep(DATA_BITS /8 -1 downto 0), User(USER_BITS -1 downto 0), ID(ID_BITS-1 downto 0), DEST(DEST_BITS-1 downto 0)); begin assert not NO_META_FIFO report "PoC.axi4stream_FIFO_TempPut:: NO_META_FIFO is set. Meta Fifo is removed! Dest, ID and, depending on USER_IS_DYNAMIC, User is removed" severity warning; - In_SOF <= In_M2S.Valid and not started; - started <= ffrs(q => started, rst => ((In_M2S.Valid and In_M2S.Last) or Reset), set => (In_M2S.Valid)) when rising_edge(Clock); + started <= ffrs(q => started, rst => ((In_M2S.Valid and In_M2S.Last) or Reset), set => (In_M2S.Valid)) when rising_edge(Clock); process(Clock) begin diff --git a/src/bus/bus_Arbiter.vhdl b/src/bus/bus_Arbiter.vhdl index b4b05ca63..f23985d35 100644 --- a/src/bus/bus_Arbiter.vhdl +++ b/src/bus/bus_Arbiter.vhdl @@ -56,9 +56,6 @@ entity bus_Arbiter is ); end entity; architecture rtl of bus_Arbiter is - attribute KEEP : boolean; - attribute FSM_ENCODING : string; - begin -- XXX: How does arith_FirstOne relate to an arbiter and to RR or Priority arbitration? gen_Strategy : if STRATEGY = "RR" generate -- Round Robin Arbiter diff --git a/src/bus/drp/drp.pkg.vhdl b/src/bus/drp/drp.pkg.vhdl index c493c8d48..62cd0014c 100644 --- a/src/bus/drp/drp.pkg.vhdl +++ b/src/bus/drp/drp.pkg.vhdl @@ -64,7 +64,7 @@ end package; package body drp is function Initialize_DRP_Bus_M2S(AddressBits : natural; DataBits : natural := 16; Value : std_logic := 'Z') return T_DRP_Bus_M2S is - variable var : T_DRP_Bus_M2S( + constant init : T_DRP_Bus_M2S( Address(AddressBits -1 downto 0), DataIn(DataBits -1 downto 0) ) :=( @@ -74,16 +74,16 @@ package body drp is DataIn => (DataBits - 1 downto 0 => Value) ); begin - return var; + return init; end function; function Initialize_DRP_Bus_S2M(DataBits : natural := 16; Value : std_logic := 'Z') return T_DRP_Bus_S2M is - variable var : T_DRP_Bus_S2M(DataOut(DataBits -1 downto 0)) :=( + constant init : T_DRP_Bus_S2M(DataOut(DataBits -1 downto 0)) :=( Ready => Value, DataOut => (DataBits - 1 downto 0 => Value) ); begin - return var; + return init; end function; function Initialize_DRP_Bus(AddressBits : natural; DataBits : natural := 16; Value : std_logic := 'Z') return T_DRP_Bus is diff --git a/src/bus/stream/stream.pkg.vhdl b/src/bus/stream/stream.pkg.vhdl index e15bac146..8efee057f 100644 --- a/src/bus/stream/stream.pkg.vhdl +++ b/src/bus/stream/stream.pkg.vhdl @@ -567,7 +567,7 @@ package body stream is end function; function to_flag1_string(stmw : T_SIM_STREAM_WORD_8) return string is - variable flag : std_logic_vector(2 downto 0) := to_sl(stmw.EOFG) & stmw.EOF & stmw.SOF; + constant flag : std_logic_vector(2 downto 0) := to_sl(stmw.EOFG) & stmw.EOF & stmw.SOF; begin case flag is when "000" => return ""; @@ -583,7 +583,7 @@ package body stream is end function; function to_flag1_string(stmw : T_SIM_STREAM_WORD_32) return string is - variable flag : std_logic_vector(2 downto 0) := to_sl(stmw.EOFG) & stmw.EOF & stmw.SOF; + constant flag : std_logic_vector(2 downto 0) := to_sl(stmw.EOFG) & stmw.EOF & stmw.SOF; begin case flag is when "000" => return ""; @@ -599,7 +599,7 @@ package body stream is end function; function to_flag2_string(stmw : T_SIM_STREAM_WORD_8) return string is - variable flag : std_logic_vector(1 downto 0) := stmw.Ready & stmw.Valid; + constant flag : std_logic_vector(1 downto 0) := stmw.Ready & stmw.Valid; begin case flag is when "00" => return " "; @@ -613,7 +613,7 @@ package body stream is end function; function to_flag2_string(stmw : T_SIM_STREAM_WORD_32) return string is - variable flag : std_logic_vector(1 downto 0) := stmw.Ready & stmw.Valid; + constant flag : std_logic_vector(1 downto 0) := stmw.Ready & stmw.Valid; begin case flag is when "00" => return " "; diff --git a/src/bus/stream/stream_DeMux.vhdl b/src/bus/stream/stream_DeMux.vhdl index 592aa104c..2aa031039 100644 --- a/src/bus/stream/stream_DeMux.vhdl +++ b/src/bus/stream/stream_DeMux.vhdl @@ -67,9 +67,6 @@ end entity; architecture rtl of stream_DeMux is - attribute KEEP : boolean; - attribute FSM_ENCODING : string; - subtype T_CHANNEL_INDEX is natural range 0 to PORTS - 1; type T_STATE is (ST_IDLE, ST_DATAFLOW, ST_DISCARD_FRAME); diff --git a/src/bus/stream/stream_FIFO.vhdl b/src/bus/stream/stream_FIFO.vhdl index 259e53801..75e0ce456 100644 --- a/src/bus/stream/stream_FIFO.vhdl +++ b/src/bus/stream/stream_FIFO.vhdl @@ -72,10 +72,6 @@ end entity; architecture rtl of stream_FIFO is - attribute FSM_ENCODING : string; - - constant META_STREAMS : positive := META_BITS'length; - type T_WRITER_STATE is (ST_IDLE, ST_FRAME); type T_READER_STATE is (ST_IDLE, ST_FRAME); diff --git a/src/bus/stream/stream_FrameGenerator.vhdl b/src/bus/stream/stream_FrameGenerator.vhdl index 435c0622d..ba43aaf86 100644 --- a/src/bus/stream/stream_FrameGenerator.vhdl +++ b/src/bus/stream/stream_FrameGenerator.vhdl @@ -82,7 +82,7 @@ architecture rtl of stream_FrameGenerator is signal ContentCounter_en : std_logic; signal ContentCounter_us : unsigned(WORD_BITS - 1 downto 0) := (others => '0'); - signal PRNG_rst : std_logic; + signal PRNG_rst : std_logic; -- FIXME: Why is reset not driven by FSM anymore? signal PRNG_got : std_logic; signal PRNG_Data : std_logic_vector(DATA_BITS - 1 downto 0); begin @@ -147,8 +147,6 @@ begin when FRAMEGEN_CMD_ALL_FRAMES => NextState <= ST_ERROR; - when others => - NextState <= ST_ERROR; end case; -- generate sequential numbers diff --git a/src/bus/stream/stream_Mirror.vhdl b/src/bus/stream/stream_Mirror.vhdl index 04d5e47b2..43b988b20 100644 --- a/src/bus/stream/stream_Mirror.vhdl +++ b/src/bus/stream/stream_Mirror.vhdl @@ -65,9 +65,6 @@ entity stream_Mirror is ); end entity; architecture rtl of stream_Mirror is - attribute KEEP : boolean; - attribute FSM_ENCODING : string; - signal FifoStage_put : std_logic; signal FifoStage_DataIn : std_logic_vector(DATA_BITS + 1 downto 0); signal FifoStage_Full : std_logic; diff --git a/src/cache/cache_CPU.vhdl b/src/cache/cache_CPU.vhdl index 9e3ae4a2a..c3ce8125a 100644 --- a/src/cache/cache_CPU.vhdl +++ b/src/cache/cache_CPU.vhdl @@ -395,7 +395,7 @@ begin -- architecture rtl fsm_ns <= UNKNOWN; cpu_Got <= 'X'; cache_Request <= 'X'; - cache_ReadWrite <= 'X'; + cache_ReadWrite <= 'X'; cache_Invalidate <= 'X'; cache_Replace <= 'X'; end case; diff --git a/src/cache/cache_Memory.vhdl b/src/cache/cache_Memory.vhdl index be522a169..a1efd0012 100644 --- a/src/cache/cache_Memory.vhdl +++ b/src/cache/cache_Memory.vhdl @@ -218,9 +218,6 @@ begin signal cpu_addr_r : unsigned(CPU_ADDR_BITS-1 downto 0); signal cpu_wdata_r : std_logic_vector(CPU_DATA_BITS-1 downto 0); signal cpu_wmask_r : std_logic_vector(CPU_DATA_BITS/8-1 downto 0); - signal cpu_rdy_r : std_logic; - signal cpu_rstb_r : std_logic; - signal cpu_rdata_r : std_logic_vector(CPU_DATA_BITS-1 downto 0); begin -- cpu_rdy should have a short clock-to-output delay, but int_got has a large -- propagation delay. Thus, do not depend cpu_rdy and int_got. diff --git a/src/cache/cache_Parallel.vhdl b/src/cache/cache_Parallel.vhdl index 33d3d9266..a0d60aa6f 100644 --- a/src/cache/cache_Parallel.vhdl +++ b/src/cache/cache_Parallel.vhdl @@ -112,8 +112,6 @@ end entity; architecture rtl of cache_Parallel is - attribute KEEP : boolean; - constant LINE_INDEX_BITS : positive := log2ceilnz(CACHE_LINES); subtype T_CACHE_LINE is std_logic_vector(DATA_BITS - 1 downto 0); diff --git a/src/cache/cache_Parallel2.vhdl b/src/cache/cache_Parallel2.vhdl index f5d7c8a0f..7dd466403 100644 --- a/src/cache/cache_Parallel2.vhdl +++ b/src/cache/cache_Parallel2.vhdl @@ -146,13 +146,8 @@ end entity; architecture rtl of cache_Parallel2 is - attribute KEEP : boolean; - constant LINE_INDEX_BITS : positive := log2ceilnz(CACHE_LINES); - subtype T_CACHE_LINE is std_logic_vector(DATA_BITS - 1 downto 0); - type T_CACHE_LINE_VECTOR is array (natural range <>) of T_CACHE_LINE; -- FIXME: T_SLVV - -- look-up (request) signal TU_LineIndex : std_logic_vector(LINE_INDEX_BITS - 1 downto 0); signal TU_TagHit : std_logic; diff --git a/src/cache/cache_ReplacementPolicy.vhdl b/src/cache/cache_ReplacementPolicy.vhdl index 8bb1e4be0..41abe6fc8 100644 --- a/src/cache/cache_ReplacementPolicy.vhdl +++ b/src/cache/cache_ReplacementPolicy.vhdl @@ -101,11 +101,6 @@ end entity; architecture rtl of cache_ReplacementPolicy is - attribute KEEP : boolean; - attribute FSM_ENCODING : string; - - constant KEY_BITS : positive := log2ceilnz(CACHE_WAYS); - begin assert (str_equal(REPLACEMENT_POLICY, "RR") or str_equal(REPLACEMENT_POLICY, "LRU")) @@ -117,17 +112,17 @@ begin -- policy: RR - round robin -- =========================================================================== genRR : if str_equal(REPLACEMENT_POLICY, "RR") generate - constant VALID_BIT : natural := 0; + -- constant VALID_BIT : natural := 0; - subtype T_OPTION_LINE is std_logic_vector(0 downto 0); - type T_OPTION_LINE_VECTOR is array (natural range <>) of T_OPTION_LINE; + -- subtype T_OPTION_LINE is std_logic_vector(0 downto 0); + -- type T_OPTION_LINE_VECTOR is array (natural range <>) of T_OPTION_LINE; - signal OptionMemory : T_OPTION_LINE_VECTOR(CACHE_WAYS - 1 downto 0) := (others => ( - VALID_BIT => '0') - ); + -- signal OptionMemory : T_OPTION_LINE_VECTOR(CACHE_WAYS - 1 downto 0) := (others => ( + -- VALID_BIT => '0') + -- ); - signal ValidHit : std_logic; - signal Pointer_us : unsigned(log2ceilnz(CACHE_WAYS) - 1 downto 0) := (others => '0'); + -- signal ValidHit : std_logic; + -- signal Pointer_us : unsigned(log2ceilnz(CACHE_WAYS) - 1 downto 0) := (others => '0'); begin -- ValidHit <= OptionMemory(to_integer(unsigned(HitWay)))(VALID_BIT); diff --git a/src/cache/cache_TagUnit_Parallel.vhdl b/src/cache/cache_TagUnit_Parallel.vhdl index 55db1ac9e..e88fc6de4 100644 --- a/src/cache/cache_TagUnit_Parallel.vhdl +++ b/src/cache/cache_TagUnit_Parallel.vhdl @@ -133,8 +133,6 @@ entity cache_TagUnit_Parallel is end entity; architecture rtl of cache_TagUnit_Parallel is - attribute KEEP : boolean; - constant SETS : positive := CACHE_LINES / ASSOCIATIVITY; -- Returns true if unsigned value contains metalogical values. diff --git a/src/cache/cache_TagUnit_Sequential.vhdl b/src/cache/cache_TagUnit_Sequential.vhdl index 33446a6df..8736284fa 100644 --- a/src/cache/cache_TagUnit_Sequential.vhdl +++ b/src/cache/cache_TagUnit_Sequential.vhdl @@ -71,8 +71,6 @@ end entity; architecture rtl of cache_TagUnit_Sequential is - attribute KEEP : boolean; - constant SETS : positive := CACHE_LINES / ASSOCIATIVITY; begin diff --git a/src/comm/comm.pkg.vhdl b/src/comm/comm.pkg.vhdl index f548d4147..205a0de70 100644 --- a/src/comm/comm.pkg.vhdl +++ b/src/comm/comm.pkg.vhdl @@ -30,26 +30,30 @@ library IEEE; use IEEE.std_logic_1164.all; +use work.utils.all; + package comm is -- Calculates the Remainder of the Division by the Generator Polynomial GEN. - component comm_CRC is - generic ( - POLYNOMIAL : bit_vector; -- Generator Polynom - BITS : positive -- Number of Bits to be processed in parallel + component comm_CRC + generic( + POLYNOMIAL : bit_vector; + BITS : positive; + CHUNK_BITS : positive := BITS; + INIT : std_logic_vector := "0"; + OUTPUT_REGS : boolean := true ); - port ( - Clock : in std_logic; -- Clock - - Load : in std_logic; -- Parallel Preload of Remainder - Seed : in std_logic_vector(POLYNOMIAL'length-2 downto 0); -- - Enable : in std_logic; -- Process Input Data (MSB first) - DataIn : in std_logic_vector(BITS-1 downto 0); -- - - Remainder : out std_logic_vector(POLYNOMIAL'length-2 downto 0); -- Remainder - IsZero : out std_logic -- Remainder is Zero + port( + Clock : in std_logic; + Load : in std_logic; + Seed : in std_logic_vector(abs(mssb_idx(POLYNOMIAL)-POLYNOMIAL'right)-1 downto 0); + Enable : in std_logic; + ChunkEnable : in std_logic_vector(CHUNK_BITS-1 downto 0) := (CHUNK_BITS-1 downto 0 => '1'); + DataIn : in std_logic_vector(BITS-1 downto 0); + Remainder : out std_logic_vector(abs(mssb_idx(POLYNOMIAL)-POLYNOMIAL'right)-1 downto 0); + IsZero : out std_logic ); - end component; + end component comm_CRC; -- Computes XOR masks for stream scrambling from an LFSR generator. component comm_Scramble is diff --git a/src/common/math.vhdl b/src/common/math.vhdl index 68089e814..898926393 100644 --- a/src/common/math.vhdl +++ b/src/common/math.vhdl @@ -167,7 +167,7 @@ package body math is constant zeroes : natural_vector(0 to 0) := (others => 0); variable actualNumerator : natural := 1; variable tab : natural := 0; - variable increment : real := fractionalInReal; + constant increment : real := fractionalInReal; variable remainder : real := fractionalInReal; variable result : natural_vector(0 to numerator -1) := (others => 0); begin diff --git a/src/common/physical.vhdl b/src/common/physical.vhdl index 1f136b52b..8efcc9c68 100644 --- a/src/common/physical.vhdl +++ b/src/common/physical.vhdl @@ -320,7 +320,7 @@ package body physical is end if; end if; res := 1.0 / real(f / 1 Hz); - if (POC_VERBOSE = TRUE) then + if POC_VERBOSE then report "to_time: f= " & to_string(f, 3) & " return " & to_string(res, 3) severity note; end if; return res; @@ -425,7 +425,7 @@ package body physical is end if; end if; res := (f / 1 Hz) * 1 Bd; - if (POC_VERBOSE = TRUE) then + if POC_VERBOSE then report "to_baud: f= " & to_string(f, 3) & " return " & to_string(res, 3) severity note; end if; return res; diff --git a/src/common/strings.vhdl b/src/common/strings.vhdl index 9952c2e0d..e89960e72 100644 --- a/src/common/strings.vhdl +++ b/src/common/strings.vhdl @@ -215,7 +215,6 @@ package body strings is when 'L' => return 'L'; when 'H' => return 'H'; when '-' => return '-'; - when others => return 'X'; end case; end function; diff --git a/src/common/utils.vhdl b/src/common/utils.vhdl index dd4322042..0b4601128 100644 --- a/src/common/utils.vhdl +++ b/src/common/utils.vhdl @@ -1573,7 +1573,6 @@ package body utils is when ROUND_TO_INF => report "scale: unsupported RoundingStyle." severity FAILURE; when ROUND_UP => return integer(ceil(result)); when ROUND_DOWN => return integer(floor(result)); - when others => report "scale: unsupported RoundingStyle." severity FAILURE; end case; return integer(result); end if; diff --git a/src/common/vectors.vhdl b/src/common/vectors.vhdl index aa7733574..4b032eafe 100644 --- a/src/common/vectors.vhdl +++ b/src/common/vectors.vhdl @@ -371,14 +371,14 @@ package body vectors is -- Make vector of constant function genVector(const : std_logic; length : natural) return std_logic_vector is - variable slv : std_logic_vector(length -1 downto 0) := (others => const); -- FIXME: use (length - 1 downto 0 => ...) directly in return statement + constant slv : std_logic_vector(length -1 downto 0) := (others => const); -- FIXME: use (length - 1 downto 0 => ...) directly in return statement begin return slv; end function; -- FIXME: input as std_logic, return an SLVV of that size function genVector(const : std_logic_vector; length : natural) return T_SLVV is - variable slv : T_SLVV(length -1 downto 0)(const'range) := (others => const); -- FIXME: use (length - 1 downto 0 => ...) directly in return statement + constant slv : T_SLVV(length -1 downto 0)(const'range) := (others => const); -- FIXME: use (length - 1 downto 0 => ...) directly in return statement begin return slv; end function; @@ -1477,7 +1477,7 @@ package body vectors is end function; function to_string_bin(slm : T_SLM; groups : positive := 4; format : character := 'h') return string is - variable PerLineOverheader : positive := div_ceil(slm'length(2), groups); + constant PerLineOverheader : positive := div_ceil(slm'length(2), groups); variable Result : string(1 to (slm'length(1) * (slm'length(2) + PerLineOverheader)) + 10); variable Writer : positive; variable GroupCounter : natural; diff --git a/src/dstruct/dstruct_Stack.vhdl b/src/dstruct/dstruct_Stack.vhdl index a34979270..13b0175e4 100644 --- a/src/dstruct/dstruct_Stack.vhdl +++ b/src/dstruct/dstruct_Stack.vhdl @@ -70,7 +70,6 @@ architecture rtl of dstruct_Stack is signal adr : unsigned(ADDRESS_BITS-1 downto 0) := (others => '0'); signal s_adr : unsigned(ADDRESS_BITS-1 downto 0) := (others => '0'); signal s_dout : std_logic_vector(DATA_BITS-1 downto 0) := (others => '0'); - signal s_valid : std_logic := '0'; signal s_din : std_logic_vector(DATA_BITS-1 downto 0) := (others => '0'); -- ctrl signal for stackpointer operations diff --git a/src/fifo/README.md b/src/fifo/README.md index dc6c67ad2..91f307b43 100644 --- a/src/fifo/README.md +++ b/src/fifo/README.md @@ -15,7 +15,7 @@ is available on the output. Asserting the `got`-input, acknoledge the processing the current output signals and moves the read-pointer to the next value, if available. All FIFOs implement a bidirectional flow control (`put`/`full` and `valid`/`got`). -Each FIFO also offers a EmptyState (write-side) and FullState (read-side) to indicate +Each FIFO also offers a EmptyState (write-side) and FillState (read-side) to indicate the current fill-state. The prefixes `cc_` (common clock), `dc_` (dependent clock) and `ic_` (independent diff --git a/src/fifo/fifo.pkg.vhdl b/src/fifo/fifo.pkg.vhdl index d6eaf9f96..12629ff61 100644 --- a/src/fifo/fifo.pkg.vhdl +++ b/src/fifo/fifo.pkg.vhdl @@ -125,20 +125,20 @@ package fifo is ); port ( -- Write Interface - clk_wr : in std_logic; - rst_wr : in std_logic; - put : in std_logic; - din : in std_logic_vector(DATA_BITS - 1 downto 0); - full : out std_logic; - estate_wr : out std_logic_vector(imax(EMPTY_STATE_BITS - 1, 0) downto 0); + Write_Clock : in std_logic; + Write_Reset : in std_logic; + Write_Put : in std_logic; + Write_DataIn : in std_logic_vector(DATA_BITS - 1 downto 0); + Write_Full : out std_logic; + Write_EmptyState : out std_logic_vector(imax(EMPTY_STATE_BITS - 1, 0) downto 0); -- Read Interface - clk_rd : in std_logic; - rst_rd : in std_logic; - got : in std_logic; - valid : out std_logic; - dout : out std_logic_vector(DATA_BITS - 1 downto 0); - fstate_rd : out std_logic_vector(imax(FILL_STATE_BITS - 1, 0) downto 0) + Read_Clock : in std_logic; + Read_Reset : in std_logic; + Read_Got : in std_logic; + Read_Valid : out std_logic; + Read_DataOut : out std_logic_vector(DATA_BITS - 1 downto 0); + Read_FillState : out std_logic_vector(imax(FILL_STATE_BITS - 1, 0) downto 0) ); end component; diff --git a/src/fifo/fifo_Stage.vhdl b/src/fifo/fifo_Stage.vhdl index 90a5bfb0f..5f236987c 100644 --- a/src/fifo/fifo_Stage.vhdl +++ b/src/fifo/fifo_Stage.vhdl @@ -104,6 +104,10 @@ begin Full <= Avail and not got_v(i) and (Full or put_v(i)); end if; end if; + end process; + + process (Clock) + begin if rising_edge(Clock) then if Full = '0' then A <= di_v(i); diff --git a/src/fifo/fifo_cc_got.vhdl b/src/fifo/fifo_cc_got.vhdl index 7c3ffaef9..1edddb87c 100644 --- a/src/fifo/fifo_cc_got.vhdl +++ b/src/fifo/fifo_cc_got.vhdl @@ -20,33 +20,33 @@ -- -- ``*STATE_*_BITS`` defines the granularity of the fill state indicator -- ``*state_*``. If a fill state is not of interest, set ``*STATE_*_BITS = 0``. --- ``fstate_rd`` is associated with the read clock domain and outputs the --- guaranteed number of words available in the FIFO. ``estate_wr`` is associated +-- ``FillState`` is associated with the read clock domain and outputs the +-- guaranteed number of words available in the FIFO. ``EmptyState`` is associated -- with the write clock domain and outputs the number of words that is -- guaranteed to be accepted by the FIFO without a capacity overflow. Note that -- both these indicators cannot replace the ``full`` or ``valid`` outputs as -- they may be implemented as giving pessimistic bounds that are minimally off -- the true fill state. -- --- ``fstate_rd`` and ``estate_wr`` are combinatorial outputs and include an address +-- ``FillState`` and ``EmptyState`` are combinatorial outputs and include an address -- comparator (subtractor) in their path. -- -- .. rubric:: Examples: -- --- * FSTATE_RD_BITS = 1: +-- * FILL_STATE_BITS = 1: -- -- +-----------+----------------------+ --- | fstate_rd | filled (at least) | +-- | FillState | filled (at least) | -- +===========+======================+ -- | 0 | 0/2 full | -- +-----------+----------------------+ -- | 1 | 1/2 full (half full) | -- +-----------+----------------------+ -- --- * FSTATE_RD_BITS = 2: +-- * FILL_STATE_BITS = 2: -- -- +-----------+----------------------+ --- | fstate_rd | filled (at least) | +-- | FillState | filled (at least) | -- +===========+======================+ -- | 0 | 0/4 full | -- +-----------+----------------------+ @@ -180,7 +180,7 @@ begin FillState <= (others => '0'); else generate - assert LUT_SHIFT_LOGIC = false report "PoC.fifo_cc_got.vhdl :: Implementing FIFO in LUT_SHIFT_LOGIC was not possible. Following conditions are not met: 'MIN_DEPTH <= 32 and D_BITS <= 128 and ESTATE_WR_BITS = 0 and FSTATE_RD_BITS = 0'" + assert LUT_SHIFT_LOGIC = false report "PoC.fifo_cc_got.vhdl :: Implementing FIFO in LUT_SHIFT_LOGIC was not possible. Following conditions are not met: 'MIN_DEPTH <= 32 and D_BITS <= 128 and EMPTY_STATE_BITS = 0 and FILL_STATE_BITS = 0'" severity warning; ----------------------------------------------------------------------------- -- Pointer Logic diff --git a/src/fifo/fifo_cc_got_tempgot.vhdl b/src/fifo/fifo_cc_got_tempgot.vhdl index 0275873a2..a27fb11cc 100644 --- a/src/fifo/fifo_cc_got_tempgot.vhdl +++ b/src/fifo/fifo_cc_got_tempgot.vhdl @@ -25,8 +25,8 @@ -- *undefined*! -- -- ``*STATE_*_BITS`` defines the granularity of the fill state indicator --- ``*state_*``. ``fstate_rd`` is associated with the read clock domain and outputs --- the guaranteed number of words available in the FIFO. ``estate_wr`` is +-- ``*State``. ``FillState`` is associated with the read clock domain and outputs +-- the guaranteed number of words available in the FIFO. ``EmptyState`` is -- associated with the write clock domain and outputs the number of words that -- is guaranteed to be accepted by the FIFO without a capacity overflow. Note -- that both these indicators cannot replace the ``full`` or ``valid`` outputs as @@ -35,22 +35,22 @@ -- -- If a fill state is not of interest, set ``*STATE_*_BITS = 0``. -- --- ``fstate_rd`` and ``estate_wr`` are combinatorial outputs and include an address +-- ``FillState`` and ``EmptyState`` are combinatorial outputs and include an address -- comparator (subtractor) in their path. -- -- **Examples:** -- --- * FSTATE_RD_BITS = 1: +-- * FILL_STATE_BITS = 1: -- --- * fstate_rd == 0 => 0/2 full --- * fstate_rd == 1 => 1/2 full (half full) +-- * FillState == 0 => 0/2 full +-- * FillState == 1 => 1/2 full (half full) -- --- * FSTATE_RD_BITS = 2: +-- * FILL_STATE_BITS = 2: -- --- * fstate_rd == 0 => 0/4 full --- * fstate_rd == 1 => 1/4 full --- * fstate_rd == 2 => 2/4 full --- * fstate_rd == 3 => 3/4 full +-- * FillState == 0 => 0/4 full +-- * FillState == 1 => 1/4 full +-- * FillState == 2 => 2/4 full +-- * FillState == 3 => 3/4 full -- -- License: -- ============================================================================= @@ -119,7 +119,7 @@ architecture rtl of fifo_cc_got_tempgot is constant ADDRESS_BITS : natural := log2ceil(MIN_DEPTH); -- Force Carry-Chain Use for Pointer Increments on Xilinx Architectures - constant FORCE_XILCY : boolean := (not SIMULATION) and (VENDOR = VENDOR_XILINX) and STATE_REG and (ADDRESS_BITS > 4); + -- constant FORCE_XILCY : boolean := (not SIMULATION) and (VENDOR = VENDOR_XILINX) and STATE_REG and (ADDRESS_BITS > 4); ----------------------------------------------------------------------------- -- Memory Pointers diff --git a/src/fifo/fifo_cc_got_tempput.vhdl b/src/fifo/fifo_cc_got_tempput.vhdl index 532c92a8e..0eb4cbaa0 100644 --- a/src/fifo/fifo_cc_got_tempput.vhdl +++ b/src/fifo/fifo_cc_got_tempput.vhdl @@ -25,8 +25,8 @@ -- *undefined*. -- -- ``*STATE_*_BITS`` defines the granularity of the fill state indicator --- ``*state_*``. ``fstate_rd`` is associated with the read clock domain and outputs --- the guaranteed number of words available in the FIFO. ``estate_wr`` is +-- ``*state_*``. ``FillState`` is associated with the read clock domain and outputs +-- the guaranteed number of words available in the FIFO. ``EmptyState`` is -- associated with the write clock domain and outputs the number of words that -- is guaranteed to be accepted by the FIFO without a capacity overflow. Note -- that both these indicators cannot replace the ``full`` or ``valid`` outputs as @@ -35,22 +35,22 @@ -- -- If a fill state is not of interest, set ``*STATE_*_BITS = 0``. -- --- ``fstate_rd`` and ``estate_wr`` are combinatorial outputs and include an address +-- ``FillState`` and ``EmptyState`` are combinatorial outputs and include an address -- comparator (subtractor) in their path. -- -- **Examples:** -- --- * FSTATE_RD_BITS = 1: +-- * FILL_STATE_BITS = 1: -- --- * fstate_rd == 0 => 0/2 full --- * fstate_rd == 1 => 1/2 full (half full) +-- * FillState == 0 => 0/2 full +-- * FillState == 1 => 1/2 full (half full) -- --- * FSTATE_RD_BITS = 2: +-- * FILL_STATE_BITS = 2: -- --- * fstate_rd == 0 => 0/4 full --- * fstate_rd == 1 => 1/4 full --- * fstate_rd == 2 => 2/4 full --- * fstate_rd == 3 => 3/4 full +-- * FillState == 0 => 0/4 full +-- * FillState == 1 => 1/4 full +-- * FillState == 2 => 2/4 full +-- * FillState == 3 => 3/4 full -- -- License: -- ============================================================================= diff --git a/src/fifo/fifo_ic_got.vhdl b/src/fifo/fifo_ic_got.vhdl index 16be0edb1..aa6eae6ec 100644 --- a/src/fifo/fifo_ic_got.vhdl +++ b/src/fifo/fifo_ic_got.vhdl @@ -23,8 +23,8 @@ -- architecture. See implementation for details. -- -- ``*STATE_*_BITS`` defines the granularity of the fill state indicator --- ``*state_*``. ``fstate_rd`` is associated with the read clock domain and outputs --- the guaranteed number of words available in the FIFO. ``estate_wr`` is +-- ``*state_*``. ``FillState`` is associated with the read clock domain and outputs +-- the guaranteed number of words available in the FIFO. ``EmptyState`` is -- associated with the write clock domain and outputs the number of words that -- is guaranteed to be accepted by the FIFO without a capacity overflow. Note -- that both these indicators cannot replace the ``full`` or ``valid`` outputs as @@ -33,17 +33,17 @@ -- -- If a fill state is not of interest, set *STATE_*_BITS = 0. -- --- ``fstate_rd`` and ``estate_wr`` are combinatorial outputs and include an address +-- ``FillState`` and ``EmptyState`` are combinatorial outputs and include an address -- comparator (subtractor) in their path. -- -- Examples: --- - FSTATE_RD_BITS = 1: fstate_rd == 0 => 0/2 full --- fstate_rd == 1 => 1/2 full (half full) +-- - FILL_STATE_BITS = 1: FillState == 0 => 0/2 full +-- FillState == 1 => 1/2 full (half full) -- --- - FSTATE_RD_BITS = 2: fstate_rd == 0 => 0/4 full --- fstate_rd == 1 => 1/4 full --- fstate_rd == 2 => 2/4 full --- fstate_rd == 3 => 3/4 full +-- - FILL_STATE_BITS = 2: FillState == 0 => 0/4 full +-- FillState == 1 => 1/4 full +-- FillState == 2 => 2/4 full +-- FillState == 3 => 3/4 full -- -- License: -- ============================================================================= @@ -83,20 +83,20 @@ entity fifo_ic_got is ); port ( -- Write Interface - clk_wr : in std_logic; - rst_wr : in std_logic; - put : in std_logic; - din : in std_logic_vector(DATA_BITS-1 downto 0); - full : out std_logic; - estate_wr : out std_logic_vector(imax(EMPTY_STATE_BITS-1, 0) downto 0); + Write_Clock : in std_logic; + Write_Reset : in std_logic; + Write_Put : in std_logic; + Write_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); + Write_Full : out std_logic; + Write_EmptyState : out std_logic_vector(imax(EMPTY_STATE_BITS-1, 0) downto 0); -- Read Interface - clk_rd : in std_logic; - rst_rd : in std_logic; - got : in std_logic; - valid : out std_logic; - dout : out std_logic_vector(DATA_BITS-1 downto 0); - fstate_rd : out std_logic_vector(imax(FILL_STATE_BITS-1, 0) downto 0) + Read_Clock : in std_logic; + Read_Reset : in std_logic; + Read_Valid : out std_logic; + Read_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); + Read_Got : in std_logic; + Read_FillState : out std_logic_vector(imax(FILL_STATE_BITS-1, 0) downto 0) ); end entity; @@ -141,10 +141,10 @@ begin blkIP: block signal Cnt : unsigned(AN-1 downto 0) := to_unsigned(1, AN); begin - process(clk_wr) + process(Write_Clock) begin - if rising_edge(clk_wr) then - if rst_wr = '1' then + if rising_edge(Write_Clock) then + if Write_Reset = '1' then Cnt <= to_unsigned(1, AN); elsif puti = '1' then Cnt <= Cnt + 1; @@ -155,10 +155,10 @@ begin end block blkIP; -- Update Write Pointer upon puti - process(clk_wr) + process(Write_Clock) begin - if rising_edge(clk_wr) then - if rst_wr = '1' then + if rising_edge(Write_Clock) then + if Write_Reset = '1' then IP0 <= (others => '0'); Ful <= '0'; else @@ -180,23 +180,23 @@ begin end if; end if; end process; - puti <= put and not Ful; - full <= Ful; + puti <= Write_Put and not Ful; + Write_Full <= Ful; - di <= din; + di <= Write_DataIn; wa <= unsigned(IP0(ADDRESS_BITS-1 downto 0)); -- write pointer needs to be delayed by one CC to asure that data -- is fully stored before giving it free to the other side. -- Problem when clk_rd > 2* clk_wr - IP0_d <= IP0 when rising_edge(clk_wr); + IP0_d <= IP0 when rising_edge(Write_Clock); Read_pointer_sync : entity work.sync_Bits generic map( BITS => AN, REGISTER_OUTPUT => false ) port map( - Clock => clk_rd, + Clock => Read_Clock, Input => IP0_d, Output => IPc ); @@ -207,10 +207,10 @@ begin blkOP: block signal Cnt : unsigned(AN-1 downto 0) := to_unsigned(1, AN); begin - process(clk_rd) + process(Read_Clock) begin - if rising_edge(clk_rd) then - if rst_rd = '1' then + if rising_edge(Read_Clock) then + if Read_Reset = '1' then Cnt <= to_unsigned(1, AN); elsif geti = '1' then Cnt <= Cnt + 1; @@ -220,10 +220,10 @@ begin OP1 <= std_logic_vector(Cnt(ADDRESS_BITS) & (Cnt(ADDRESS_BITS-1 downto 0) xor ('0' & Cnt(ADDRESS_BITS-1 downto 1)))); end block blkOP; - process(clk_rd) + process(Read_Clock) begin - if rising_edge(clk_rd) then - if rst_rd = '1' then + if rising_edge(Read_Clock) then + if Read_Reset = '1' then OP0 <= (others => '0'); Avl <= '0'; Vld <= '0'; @@ -257,14 +257,14 @@ begin -- read pointer needs to be delayed by one CC to asure that data -- is read out before giving it free to the other side -- Problem when clk_wr > 2* clk_rd - OP0_d <= OP0 when rising_edge(clk_rd); + OP0_d <= OP0 when rising_edge(Read_Clock); Write_pointer_sync : entity work.sync_Bits generic map( BITS => AN, REGISTER_OUTPUT => false ) port map( - Clock => clk_wr, + Clock => Write_Clock, Input => OP0_d, Output => OPc ); @@ -276,18 +276,18 @@ begin -- register in that case. ----------------------------------------------------------------------------- genRegN: if DATA_REG or not OUTPUT_REG generate - goti <= got; - dout <= do; - valid <= Vld; + goti <= Read_Got; + Read_DataOut <= do; + Read_Valid <= Vld; end generate genRegN; genRegY: if (not DATA_REG) and OUTPUT_REG generate signal Buf : std_logic_vector(DATA_BITS-1 downto 0) := (others => '-'); signal VldB : std_logic := '0'; begin - process(clk_rd) + process(Read_Clock) begin - if rising_edge(clk_rd) then - if rst_rd = '1' then + if rising_edge(Read_Clock) then + if Read_Reset = '1' then Buf <= (others => '-'); VldB <= '0'; elsif goti = '1' then @@ -296,37 +296,35 @@ begin end if; end if; end process; - goti <= not VldB or got; - dout <= Buf; - valid <= VldB; + goti <= not VldB or Read_Got; + Read_DataOut <= Buf; + Read_Valid <= VldB; end generate genRegY; ----------------------------------------------------------------------------- -- Fill State ----------------------------------------------------------------------------- -- Write Clock Domain - gEstateWr: if EMPTY_STATE_BITS >= 1 generate + gEmptyState: if EMPTY_STATE_BITS = 0 generate + Write_EmptyState <= "X"; + else generate signal d : unsigned(ADDRESS_BITS-1 downto 0); begin d <= gray2bin(OPc(ADDRESS_BITS-1 downto 0)) + not gray2bin(IP0(ADDRESS_BITS-1 downto 0)); - estate_wr <= (others => '0') when Ful = '1' else + Write_EmptyState <= (others => '0') when Ful = '1' else std_logic_vector(d(d'left downto d'left-EMPTY_STATE_BITS+1)); - end generate gEstateWr; - gNoEstateWr: if EMPTY_STATE_BITS = 0 generate - estate_wr <= "X"; - end generate gNoEstateWr; + end generate; -- Read Clock Domain - gFstateRd: if FILL_STATE_BITS >= 1 generate + gFillState: if FILL_STATE_BITS = 0 generate + Read_FillState <= "X"; + else generate signal d : unsigned(ADDRESS_BITS-1 downto 0); begin d <= gray2bin(IPc(ADDRESS_BITS-1 downto 0)) + not gray2bin(OP0(ADDRESS_BITS-1 downto 0)); - fstate_rd <= (others => '0') when Avl = '0' else + Read_FillState <= (others => '0') when Avl = '0' else std_logic_vector(d(d'left downto d'left-FILL_STATE_BITS+1)); - end generate gFstateRd; - gNoFstateRd: if FILL_STATE_BITS = 0 generate - fstate_rd <= "X"; - end generate gNoFstateRd; + end generate; ----------------------------------------------------------------------------- -- Memory Instantiation @@ -338,8 +336,8 @@ begin DATA_BITS => DATA_BITS ) port map ( - Write_Clock => clk_wr, - Read_Clock => clk_rd, + Write_Clock => Write_Clock, + Read_Clock => Read_Clock, Write_ClockEnable => '1', Read_ClockEnable => geti, Write_WriteEnable => puti, @@ -367,11 +365,11 @@ begin begin -- Memory State - process(clk_wr) + process(Write_Clock) begin - if rising_edge(clk_wr) then + if rising_edge(Write_Clock) then --synthesis translate_off - if SIMULATION and (rst_wr = '1') then + if SIMULATION and (Write_Reset = '1') then regfile <= (others => (others => '-')); else --synthesis translate_on @@ -385,10 +383,10 @@ begin end process; -- Memory Output - process (clk_rd) + process (Read_Clock) begin -- process - if rising_edge(clk_rd) then - if SIMULATION and (rst_rd = '1') then + if rising_edge(Read_Clock) then + if SIMULATION and (Read_Reset = '1') then do <= (others => 'U'); elsif geti = '1' then if Is_X(std_logic_vector(ra)) then diff --git a/src/io/build.pro b/src/io/build.pro index 9d4b8a62c..1da11304f 100644 --- a/src/io/build.pro +++ b/src/io/build.pro @@ -37,9 +37,6 @@ include ./uart disabled ./iic/iic.pro disabled ./fan/fan.pro -analyze ./pmod/pmod.pkg.vhdl -analyze ./pmod/pmod_KYPD.vhdl -analyze ./pmod/pmod_SSD.vhdl -disabled ./pmod/pmod_USBUART.vhdl +include ./pmod disabled ./jtag/jtag.pkg.vhdl disabled ./led/led.pkg.vhdl diff --git a/src/io/ddrio/ddrio_In.vhdl b/src/io/ddrio/ddrio_In.vhdl index 34881369c..ec7293639 100644 --- a/src/io/ddrio/ddrio_In.vhdl +++ b/src/io/ddrio/ddrio_In.vhdl @@ -85,7 +85,7 @@ end entity; architecture rtl of ddrio_In is begin - assert ((VENDOR = VENDOR_ALTERA) or ((SIMULATION = TRUE) and (VENDOR = VENDOR_GENERIC)) or (VENDOR = VENDOR_XILINX)) + assert ((VENDOR = VENDOR_ALTERA) or (SIMULATION and (VENDOR = VENDOR_GENERIC)) or (VENDOR = VENDOR_XILINX)) report "PoC.io.ddrio.in is not implemented for given DEVICE." severity FAILURE; diff --git a/src/io/ddrio/ddrio_InOut.vhdl b/src/io/ddrio/ddrio_InOut.vhdl index 8de4ab797..745dd690a 100644 --- a/src/io/ddrio/ddrio_InOut.vhdl +++ b/src/io/ddrio/ddrio_InOut.vhdl @@ -106,7 +106,7 @@ end entity; architecture rtl of ddrio_InOut is begin - assert ((VENDOR = VENDOR_ALTERA) or ((SIMULATION = TRUE) and (VENDOR = VENDOR_GENERIC)) or (VENDOR = VENDOR_XILINX)) + assert ((VENDOR = VENDOR_ALTERA) or (SIMULATION and (VENDOR = VENDOR_GENERIC)) or (VENDOR = VENDOR_XILINX)) report "PoC.io.ddrio.inout is not implemented for given DEVICE." severity FAILURE; diff --git a/src/io/ddrio/ddrio_Out.vhdl b/src/io/ddrio/ddrio_Out.vhdl index ce726e3fa..cc0a869e0 100644 --- a/src/io/ddrio/ddrio_Out.vhdl +++ b/src/io/ddrio/ddrio_Out.vhdl @@ -92,7 +92,7 @@ end entity; architecture rtl of ddrio_Out is begin - assert ((VENDOR = VENDOR_ALTERA) or ((SIMULATION = TRUE) and (VENDOR = VENDOR_GENERIC)) or (VENDOR = VENDOR_XILINX)) + assert ((VENDOR = VENDOR_ALTERA) or (SIMULATION and (VENDOR = VENDOR_GENERIC)) or (VENDOR = VENDOR_XILINX)) report "PoC.io.ddrio.out is not implemented for given DEVICE." severity FAILURE; diff --git a/src/io/io.pkg.vhdl b/src/io/io.pkg.vhdl index 548e131b0..a76510b84 100644 --- a/src/io/io.pkg.vhdl +++ b/src/io/io.pkg.vhdl @@ -209,24 +209,23 @@ package io is -- Component Declarations --------------------------------------------------------------------- component io_FanControl - generic ( - CLOCK_FREQ_MHZ : real + generic( + CLOCK_FREQ : FREQ; + ADD_INPUT_SYNCHRONIZERS : boolean := TRUE; + ENABLE_TACHO : boolean := FALSE ); - port ( - Clock : in std_logic; - Reset : in std_logic; - - Fan_PWM : out std_logic; - Fan_Tacho : in std_logic; - + port( + Clock : in std_logic; + Reset : in std_logic; + Fan_PWM : out std_logic; + Fan_Tacho : in std_logic := 'X'; TachoFrequency : out std_logic_vector(15 downto 0) ); - end component; + end component io_FanControl; end package; package body io is - function get_i_vector(vec : T_IO_TRISTATE_VECTOR) return std_logic_vector is variable temp : std_logic_vector(vec'range); begin diff --git a/src/io/io_FrequencyCounter.vhdl b/src/io/io_FrequencyCounter.vhdl index 3a44858dc..1ea70a6e2 100644 --- a/src/io/io_FrequencyCounter.vhdl +++ b/src/io/io_FrequencyCounter.vhdl @@ -53,7 +53,6 @@ end entity; architecture rtl of io_FrequencyCounter is constant TIMEBASECOUNTER_MAX : positive := TimingToCycles(TIMEBASE, CLOCK_FREQ); constant TIMEBASECOUNTER_BITS : positive := log2ceilnz(TIMEBASECOUNTER_MAX); - constant REQUENCYCOUNTER_MAX : positive := 2**RESOLUTION; constant FREQUENCYCOUNTER_BITS : positive := RESOLUTION; signal TimeBaseCounter_us : unsigned(TIMEBASECOUNTER_BITS - 1 downto 0) := (others => '0'); diff --git a/src/io/io_GlitchFilter.vhdl b/src/io/io_GlitchFilter.vhdl index 98d20a259..7479f08aa 100644 --- a/src/io/io_GlitchFilter.vhdl +++ b/src/io/io_GlitchFilter.vhdl @@ -49,22 +49,22 @@ end entity; architecture rtl of io_GlitchFilter is -- Timing table ID - constant TTID_HIGH_SPIKE : natural := 0; - constant TTID_LOW_SPIKE : natural := 1; + constant TTID_HIGH_SPIKE : natural := 0; + constant TTID_LOW_SPIKE : natural := 1; -- Timing table - constant TIMING_TABLE : natural_vector := ( - TTID_HIGH_SPIKE => HIGH_SPIKE_SUPPRESSION_CYCLES, - TTID_LOW_SPIKE => LOW_SPIKE_SUPPRESSION_CYCLES + constant TIMING_TABLE : natural_vector := ( + TTID_HIGH_SPIKE => HIGH_SPIKE_SUPPRESSION_CYCLES, + TTID_LOW_SPIKE => LOW_SPIKE_SUPPRESSION_CYCLES ); - signal State : std_logic := '0'; - signal NextState : std_logic; + signal State : std_logic := '0'; + signal NextState : std_logic; - signal TC_en : std_logic; - signal TC_Load : std_logic; - signal TC_Slot : natural; - signal TC_Timeout : std_logic; + signal TC_en : std_logic; + signal TC_Load : std_logic; + signal TC_Slot : natural; + signal TC_Timeout : std_logic; begin assert FALSE diff --git a/src/io/io_TimingCounter.vhdl b/src/io/io_TimingCounter.vhdl index 1bd0b6674..3ac36b7d1 100644 --- a/src/io/io_TimingCounter.vhdl +++ b/src/io/io_TimingCounter.vhdl @@ -32,7 +32,7 @@ library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; -use work.project_configuration.all; +use work.config.all; use work.utils.all; @@ -54,10 +54,10 @@ architecture rtl of io_TimingCounter is function transform(vec : natural_vector) return integer_vector is variable Result : integer_vector(vec'range); begin - assert (not MY_VERBOSE) report "TIMING_TABLE (transformed):" severity NOTE; + assert not POC_VERBOSE report "TIMING_TABLE (transformed):" severity NOTE; for i in vec'range loop Result(i) := vec(i) - 1; - assert (not MY_VERBOSE) report " " & integer'image(i) & " - " & INTEGER'image(Result(i)) severity NOTE; + assert not POC_VERBOSE report " " & integer'image(i) & " - " & INTEGER'image(Result(i)) severity NOTE; end loop; return Result; end function; diff --git a/src/io/pmod/build.pro b/src/io/pmod/build.pro new file mode 100644 index 000000000..070e5278d --- /dev/null +++ b/src/io/pmod/build.pro @@ -0,0 +1,24 @@ +# ============================================================================= +# Authors: Patrick Lehmann +# +# License: +# ============================================================================= +# Copyright 2025-2026 The PoC-Library Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +analyze ./pmod.pkg.vhdl +analyze ./pmod_KYPD.vhdl +analyze ./pmod_SSD.vhdl +analyze ./pmod_USBUART.vhdl diff --git a/src/io/pmod/pmod_USBUART.vhdl b/src/io/pmod/pmod_USBUART.vhdl index 5b3693393..f7543f2b2 100644 --- a/src/io/pmod/pmod_USBUART.vhdl +++ b/src/io/pmod/pmod_USBUART.vhdl @@ -45,13 +45,13 @@ entity pmod_USBUART is Clock : in std_logic; Reset : in std_logic; - TX_put : in std_logic; + TX_Put : in std_logic; TX_Data : in std_logic_vector(7 downto 0); TX_Full : out std_logic; RX_Valid : out std_logic; RX_Data : out std_logic_vector(7 downto 0); - RX_got : in std_logic; + RX_Got : in std_logic; UART_TX : out std_logic; UART_RX : in std_logic; @@ -71,9 +71,9 @@ begin ADD_INPUT_SYNCHRONIZERS => TRUE, TX_MIN_DEPTH => 32, - TX_ESTATE_BITS => 0, + TX_EMPTY_STATE_BITS => 0, RX_MIN_DEPTH => 32, - RX_FSTATE_BITS => 0, + RX_FILL_STATE_BITS => 0, FLOWCONTROL => UART_FLOWCONTROL_RTS_CTS ) @@ -82,14 +82,14 @@ begin Reset => Reset, TXFIFO_Reset => Reset, - TX_put => TX_put, + TX_put => TX_Put, TX_Data => TX_Data, TX_Full => TX_Full, RXFIFO_Reset => Reset, RX_Valid => RX_Valid, RX_Data => RX_Data, - RX_got => RX_got, + RX_got => RX_Got, UART_TX => UART_TX, UART_RX => UART_RX, diff --git a/src/io/uart/uart.pkg.vhdl b/src/io/uart/uart.pkg.vhdl index fbb95a4f9..4ec0df69c 100644 --- a/src/io/uart/uart.pkg.vhdl +++ b/src/io/uart/uart.pkg.vhdl @@ -128,9 +128,9 @@ package uart is PARITY_ERROR_IDENTIFIER : std_logic_vector(7 downto 0) := 8x"0"; ADD_INPUT_SYNCHRONIZERS : boolean := TRUE; TX_MIN_DEPTH : positive := 16; - TX_ESTATE_BITS : natural := 0; + TX_EMPTY_STATE_BITS : natural := 0; RX_MIN_DEPTH : positive := 16; - RX_FSTATE_BITS : natural := 0; + RX_FILL_STATE_BITS : natural := 0; FLOWCTRL_XON_THRESHOLD : real := 0.0625; FLOWCTRL_XOFF_THRESHOLD : real := 0.75; FLOWCONTROL : T_UART_FLOWCONTROL_KIND := UART_FLOWCONTROL_NONE; @@ -144,14 +144,14 @@ package uart is TX_Put : in std_logic; TX_Data : in std_logic_vector(7 downto 0); TX_Full : out std_logic; - TX_EmptyState : out std_logic_vector(imax(0, TX_ESTATE_BITS-1) downto 0); + TX_EmptyState : out std_logic_vector(imax(0, TX_EMPTY_STATE_BITS-1) downto 0); TXFIFO_Reset : in std_logic; TXFIFO_Empty : out std_logic; RX_Valid : out std_logic; RX_Data : out std_logic_vector(7 downto 0); RX_Got : in std_logic; - RX_FullState : out std_logic_vector(imax(0, RX_FSTATE_BITS-1) downto 0); + RX_FillState : out std_logic_vector(imax(0, RX_FILL_STATE_BITS-1) downto 0); RX_Overflow : out std_logic; RXFIFO_Full : out std_logic; RXFIFO_Reset : in std_logic; @@ -165,9 +165,9 @@ package uart is end component uart_FIFO; -- USB-UART - component ft245_uart is + component uart_FT245 is generic ( - CLK_FREQ : positive + CLOCK_FREQUENCY : positive ); port ( -- common signals diff --git a/src/io/uart/uart_FIFO.vhdl b/src/io/uart/uart_FIFO.vhdl index 4c42501ee..841af3c83 100644 --- a/src/io/uart/uart_FIFO.vhdl +++ b/src/io/uart/uart_FIFO.vhdl @@ -15,7 +15,7 @@ -- := For exmaple: -- FLOWCTRL_XOFF_THRESHOLD is set to 0.75, if fifo filled upto = FIFO_DEPTH*0.75 -- gives the backpressure based the flow control that being used. To know more about --- TX_ESTATE_BITS,RX_FSTATE_BITS please refer 'fifo_cc_got' module. User can change the +-- TX_EMPTY_STATE_BITS, RX_FILL_STATE_BITS please refer 'fifo_cc_got' module. User can change the -- SWFC_XON/XOFF_CHAR if needed. -- -- License: @@ -61,9 +61,9 @@ entity uart_FIFO is -- Buffer Dimensioning TX_MIN_DEPTH : positive := 16; - TX_ESTATE_BITS : natural := 0; -- XXX: adjust to FIFO naming + TX_EMPTY_STATE_BITS : natural := 0; -- XXX: adjust to FIFO naming RX_MIN_DEPTH : positive := 16; - RX_FSTATE_BITS : natural := 0; + RX_FILL_STATE_BITS : natural := 0; FLOWCTRL_XON_THRESHOLD : real := 0.0625; FLOWCTRL_XOFF_THRESHOLD : real := 0.75; @@ -82,14 +82,14 @@ entity uart_FIFO is TX_Put : in std_logic; TX_Data : in std_logic_vector(7 downto 0); TX_Full : out std_logic; - TX_EmptyState : out std_logic_vector(imax(0, TX_ESTATE_BITS-1) downto 0); + TX_EmptyState : out std_logic_vector(imax(0, TX_EMPTY_STATE_BITS-1) downto 0); TXFIFO_Reset : in std_logic; TXFIFO_Empty : out std_logic; RX_Valid : out std_logic; RX_Data : out std_logic_vector(7 downto 0); RX_Got : in std_logic; - RX_FullState : out std_logic_vector(imax(0, RX_FSTATE_BITS-1) downto 0); -- XXX: FullState or FillState ? + RX_FillState : out std_logic_vector(imax(0, RX_FILL_STATE_BITS-1) downto 0); RX_Overflow : out std_logic; RXFIFO_Full : out std_logic; RXFIFO_Reset : in std_logic; @@ -117,7 +117,7 @@ architecture rtl of uart_FIFO is signal TXFIFO_Data : T_SLV_8; signal RXFIFO_Full_int : std_logic; - signal RX_FullState_int : std_logic_vector(imax(0, RX_FSTATE_BITS-1) downto 0); + signal RX_FillState_int : std_logic_vector(imax(0, RX_FILL_STATE_BITS-1) downto 0); signal TXUART_Full : std_logic; signal RXUART_Strobe : std_logic; @@ -144,7 +144,7 @@ begin DATA_REG => TRUE, -- Store Data Content in Registers STATE_REG => FALSE, -- Registered Full/Empty Indicators OUTPUT_REG => FALSE, -- Registered FIFO Output - EMPTY_STATE_BITS => TX_ESTATE_BITS, -- Empty State Bits + EMPTY_STATE_BITS => TX_EMPTY_STATE_BITS, -- Empty State Bits FILL_STATE_BITS => 0 -- Full State Bits ) port map ( @@ -169,7 +169,7 @@ begin STATE_REG => FALSE, -- Registered Full/Empty Indicators OUTPUT_REG => FALSE, -- Registered FIFO Output EMPTY_STATE_BITS => 0, -- Empty State Bits - FILL_STATE_BITS => RX_FSTATE_BITS -- Full State Bits + FILL_STATE_BITS => RX_FILL_STATE_BITS -- Full State Bits ) port map ( Reset => Reset or RXFIFO_Reset, @@ -182,11 +182,11 @@ begin Valid => RX_Valid, DataOut => RX_Data, Got => RX_Got, - FillState => RX_FullState_int + FillState => RX_FillState_int ); RXFIFO_Full <= RXFIFO_Full_int; - RX_FullState <= RX_FullState_int; + RX_FillState <= RX_FillState_int; TXFIFO_Empty <= NOT TXFIFO_Valid; @@ -207,8 +207,8 @@ begin -- Software Flow Control -- =========================================================================== genSWFC : if FLOWCONTROL = UART_FLOWCONTROL_XON_XOFF generate - constant XON_TRIG : integer := integer(FLOWCTRL_XON_THRESHOLD * real(2**RX_FSTATE_BITS)); - constant XOFF_TRIG : integer := integer(FLOWCTRL_XOFF_THRESHOLD * real(2**RX_FSTATE_BITS)); + constant XON_TRIG : integer := integer(FLOWCTRL_XON_THRESHOLD * real(2**RX_FILL_STATE_BITS)); + constant XOFF_TRIG : integer := integer(FLOWCTRL_XOFF_THRESHOLD * real(2**RX_FILL_STATE_BITS)); signal send_xoff : std_logic; signal send_xon : std_logic; @@ -217,21 +217,21 @@ begin signal clr_xoff_transmitted : std_logic; signal discard_user_tx : std_logic; signal discard_user_rx : std_logic; - signal RxFifo_FullState : integer := 0; -- receive fifo full_state + signal RxFifo_FillState : integer := 0; -- receive fifo fill_state -- registers signal xoff_transmitted : std_logic := '0'; signal transmit_enable : std_logic := '1'; begin - RxFifo_FullState <= to_integer(unsigned(RX_FullState_int)); + RxFifo_FillState <= to_integer(unsigned(RX_FillState_int)); --assert false report"FLOWCONTROL=" & T_IO_UART_FLOWCONTROL_KIND'image(FLOWCONTROL) & " is currently not supported!" severity failure; -- send XOFF only once when fill state goes above trigger level - send_xoff <= not xoff_transmitted when (RxFifo_FullState >= XOFF_TRIG) else '0'; - set_xoff_transmitted <= (not TXUART_Full) when (RxFifo_FullState >= XOFF_TRIG) else '0'; + send_xoff <= not xoff_transmitted when (RxFifo_FillState >= XOFF_TRIG) else '0'; + set_xoff_transmitted <= (not TXUART_Full) when (RxFifo_FillState >= XOFF_TRIG) else '0'; -- send XON only once when receive FIFO is almost empty - send_xon <= xoff_transmitted when (RxFifo_FullState <= XON_TRIG) else '0'; - clr_xoff_transmitted <= (not TXUART_Full) when (RxFifo_FullState <= XON_TRIG) else '0'; + send_xon <= xoff_transmitted when (RxFifo_FillState <= XON_TRIG) else '0'; + clr_xoff_transmitted <= (not TXUART_Full) when (RxFifo_FillState <= XON_TRIG) else '0'; -- discard any user supplied XON/XOFF discard_user_tx <= '1' when (TXFIFO_Data = SWFC_XON_CHAR) or (TXFIFO_Data = SWFC_XOFF_CHAR) else '0'; @@ -274,8 +274,8 @@ begin -- Hardware Flow Control -- =========================================================================== genHWFC1 : if FLOWCONTROL = UART_FLOWCONTROL_RTS_CTS generate - constant RX_FSTATE_UPPER_LIMIT : integer := integer(FLOWCTRL_XOFF_THRESHOLD * real(2**RX_FSTATE_BITS)); - constant RX_FSTATE_LOWER_LIMIT : integer := integer(FLOWCTRL_XON_THRESHOLD * real(2**RX_FSTATE_BITS)); + constant RX_FILL_STATE_UPPER_LIMIT : integer := integer(FLOWCTRL_XOFF_THRESHOLD * real(2**RX_FILL_STATE_BITS)); + constant RX_FILL_STATE_LOWER_LIMIT : integer := integer(FLOWCTRL_XON_THRESHOLD * real(2**RX_FILL_STATE_BITS)); begin --assert false report"FLOWCONTROL=" & T_IO_UART_FLOWCONTROL_KIND'image(FLOWCONTROL) & " is currently not supported!" severity failure; @@ -293,9 +293,9 @@ begin if TXUART_Full = '0' then if Reset = '1' then UART_RTS<='1'; - elsif (to_integer(unsigned(RX_FullState_int)) >= RX_FSTATE_UPPER_LIMIT) then + elsif (to_integer(unsigned(RX_FillState_int)) >= RX_FILL_STATE_UPPER_LIMIT) then UART_RTS<='0'; - elsif (to_integer(unsigned(RX_FullState_int)) <= RX_FSTATE_LOWER_LIMIT) then + elsif (to_integer(unsigned(RX_FillState_int)) <= RX_FILL_STATE_LOWER_LIMIT) then UART_RTS<='1'; end if; end if; diff --git a/src/io/uart/uart_FT245.vhdl b/src/io/uart/uart_FT245.vhdl index 1b1052b35..a9c8d9f06 100644 --- a/src/io/uart/uart_FT245.vhdl +++ b/src/io/uart/uart_FT245.vhdl @@ -33,7 +33,7 @@ use IEEE.std_logic_1164.all; entity uart_FT245 is generic ( - CLOCK_FREQ : positive -- XXX: use FREQ + CLOCK_FREQUENCY : positive -- XXX: use FREQ ); port ( -- common signals @@ -41,21 +41,21 @@ entity uart_FT245 is Reset : in std_logic; -- send data - snd_ready : out std_logic; -- XXX: this should fit the FIFO interface - snd_strobe : in std_logic; - snd_data : in std_logic_vector(7 downto 0); + TX_Put : in std_logic; + TX_Data : in std_logic_vector(7 downto 0); + TX_Full : out std_logic; -- receive data - rec_strobe : out std_logic; - rec_data : out std_logic_vector(7 downto 0); + RX_Valid : out std_logic; + RX_Data : out std_logic_vector(7 downto 0); -- connection to ft245 - ft245_data : inout std_logic_vector(7 downto 0); - ft245_rdn : out std_logic; - ft245_wrn : out std_logic; - ft245_rxfn : in std_logic; - ft245_txen : in std_logic; - ft245_pwrenn : in std_logic + FT245_PowerEnable_n : in std_logic; + FT245_Read_n : out std_logic; + FT245_Write_n : out std_logic; + FT245_Data : inout std_logic_vector(7 downto 0); + FT245_RXF_n : in std_logic; + FT245_TXE_n : in std_logic ); end entity; @@ -68,7 +68,7 @@ use work.utils.all; architecture rtl of uart_FT245 is -- clock frequency (MHz) - constant CLK_FREQ_MHZ : integer := CLOCK_FREQ / 1000000; + constant CLK_FREQ_MHZ : integer := CLOCK_FREQUENCY / 1000000; -- FT245 communication delay cycles (minimum delay is 50 ns = 1/20 us) constant DELAY_CYCLES : integer := CLK_FREQ_MHZ / 20; @@ -122,16 +122,16 @@ begin ff_txe <= '1'; else -- Wait for Initilization to Complete - ff_susp <= ft245_pwrenn; + ff_susp <= FT245_PowerEnable_n; -- Now forward Fill Signals - ff_rxf <= ft245_rxfn; - ff_txe <= ft245_txen; + ff_rxf <= FT245_RXF_n; + ff_txe <= FT245_TXE_n; end if; end if; end process; - process(fsm_state, snd_strobe, reg_delay, ff_susp, ff_rxf, ff_txe) + process(fsm_state, TX_Put, reg_delay, ff_susp, ff_rxf, ff_txe) begin fsm_nextstate <= fsm_state; ctrl_ld_rec <= '0'; @@ -146,7 +146,7 @@ begin if ff_rxf = '0' then -- receive data fsm_nextstate <= RD1; - elsif ff_txe = '0' and snd_strobe = '1' then + elsif ff_txe = '0' and TX_Put = '1' then -- ok, send... fsm_nextstate <= WR1; end if; @@ -236,8 +236,8 @@ begin end if; -- data to send - if snd_strobe = '1' then - reg_data_snd <= snd_data; + if TX_Put = '1' then + reg_data_snd <= TX_Data; end if; end if; @@ -245,14 +245,14 @@ begin ---------------------------------------------- -- tristate driver and output assignments - ft245_data <= reg_data_snd when reg_dto_b = '0' else (others => 'Z'); - data_in <= ft245_data; + FT245_Data <= reg_data_snd when reg_dto_b = '0' else (others => 'Z'); + data_in <= FT245_Data; - ft245_rdn <= reg_rd_b; - ft245_wrn <= reg_wr_b; + FT245_Read_n <= reg_rd_b; + FT245_Write_n <= reg_wr_b; - rec_data <= reg_data_rec; - rec_strobe <= reg_ld_rec; - snd_ready <= ff_rxf and not ff_txe and not ff_susp when fsm_state = IDLE else '0'; + RX_Data <= reg_data_rec; + RX_Valid <= reg_ld_rec; + TX_Full <= not ff_rxf and not ff_txe and not ff_susp when fsm_state = IDLE else '0'; end architecture; diff --git a/src/mem/mem.pkg.vhdl b/src/mem/mem.pkg.vhdl index 05737b7b1..41b3f6bbd 100644 --- a/src/mem/mem.pkg.vhdl +++ b/src/mem/mem.pkg.vhdl @@ -118,7 +118,7 @@ package body mem is DATA_BITS : positive ) return T_SLVV is variable memory : T_SLM(WORDS - 1 downto 0, DATA_BITS - 1 downto 0); - variable empty : T_SLVV(0 to WORDS - 1)(DATA_BITS - 1 downto 0) := (others => (others => ite(SIMULATION, 'U', '0'))); + constant empty : T_SLVV(0 to WORDS - 1)(DATA_BITS - 1 downto 0) := (others => (others => ite(SIMULATION, 'U', '0'))); begin if str_length(FilePath) = 0 then -- shortcut required by Vivado @@ -171,7 +171,7 @@ package body mem is variable CurrentLine : LINE; variable Good : boolean; variable TempWord : std_logic_vector((div_ceil(BitsPerMemoryLine, 4) * 4) - 1 downto 0); - variable Result : T_SLM(MemoryLines - 1 downto 0, BitsPerMemoryLine - 1 downto 0); + variable Result : T_SLM(0 to MemoryLines - 1, BitsPerMemoryLine - 1 downto 0); begin Result := (others => (others => ite(SIMULATION, 'U', '0'))); diff --git a/src/mem/ocram/ocram.pkg.vhdl b/src/mem/ocram/ocram.pkg.vhdl index 97a9d314d..4236f13b4 100644 --- a/src/mem/ocram/ocram.pkg.vhdl +++ b/src/mem/ocram/ocram.pkg.vhdl @@ -78,9 +78,9 @@ package ocram is -- Simple-Dual-Port component ocram_SimpleDualPort generic( + RAM_TYPE : T_RAM_TYPE := RAM_TYPE_AUTO; ADDRESS_BITS : positive; DATA_BITS : positive; - RAM_TYPE : T_RAM_TYPE := RAM_TYPE_AUTO; FILENAME : string := "" ); port( @@ -99,23 +99,25 @@ package ocram is -- Enhanced-Simple-Dual-Port component ocram_EnhancedSimpleDualPort - generic ( + generic( ADDRESS_BITS : positive; DATA_BITS : positive; - FILENAME : string := "" + FILENAME : string := "" ); - port ( + port( PortA_Clock : in std_logic; - PortB_Clock : in std_logic; PortA_ClockEnable : in std_logic; - PortB_ClockEnable : in std_logic; PortA_WriteEnable : in std_logic; PortA_Address : in unsigned(ADDRESS_BITS-1 downto 0); - PortB_Address : in unsigned(ADDRESS_BITS-1 downto 0); PortA_DataIn : in std_logic_vector(DATA_BITS-1 downto 0); PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); - PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0)); - end component; + + PortB_Clock : in std_logic; + PortB_ClockEnable : in std_logic; + PortB_Address : in unsigned(ADDRESS_BITS-1 downto 0); + PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) + ); + end component ocram_EnhancedSimpleDualPort; -- True-Dual-Port component ocram_TrueDualPort diff --git a/src/mem/ocram/ocram_EnhancedSimpleDualPort.vhdl b/src/mem/ocram/ocram_EnhancedSimpleDualPort.vhdl index 3a174f2cb..fbbfe3f3f 100644 --- a/src/mem/ocram/ocram_EnhancedSimpleDualPort.vhdl +++ b/src/mem/ocram/ocram_EnhancedSimpleDualPort.vhdl @@ -116,7 +116,7 @@ architecture rtl of ocram_EnhancedSimpleDualPort is constant DEPTH : positive := 2**ADDRESS_BITS; begin - gen: if gInfer: not SIMULATION and ((VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) generate + gen: if not SIMULATION and ((VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) generate -- For Xilinx ISE, Xilinx Vivado and Lattice LSE we can reuse the ocram_TrueDualPort. -- -- **Attention**: This encapsulation is mandatory for Xilinx Vivado, @@ -142,7 +142,7 @@ begin PortB_DataIn => (others => '0'), PortB_DataOut => PortB_DataOut ); - elsif gAltera: not SIMULATION and (VENDOR = VENDOR_ALTERA) generate + elsif not SIMULATION and (VENDOR = VENDOR_ALTERA) generate -- Direct instantiation of altsyncram (including component -- declaration above) is not sufficient for ModelSim. -- That requires also usage of altera_mf library. @@ -167,7 +167,7 @@ begin PortB_DataIn => (others => '0'), PortB_DataOut => PortB_DataOut ); - elsif gSim: SIMULATION generate + elsif SIMULATION generate tdp: component ocram_TrueDualPort_Simulation -- XXX: why is this not a second architecture? generic map ( ADDRESS_BITS => ADDRESS_BITS, diff --git a/src/mem/ocram/ocram_SimpleDualPort.vhdl b/src/mem/ocram/ocram_SimpleDualPort.vhdl index fc8c33ae4..253c11d98 100644 --- a/src/mem/ocram/ocram_SimpleDualPort.vhdl +++ b/src/mem/ocram/ocram_SimpleDualPort.vhdl @@ -84,10 +84,10 @@ end entity; architecture rtl of ocram_SimpleDualPort is - constant DEPTH : positive := 2**ADDRESS_BITS; + constant WORDS : positive := 2**ADDRESS_BITS; begin - gen: if gInfer: not SIMULATION and ((VENDOR = VENDOR_ALTERA) or (VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) generate + gen: if not SIMULATION and ((VENDOR = VENDOR_ALTERA) or (VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) generate -- RAM can be inferred correctly -- Xilinx notes: -- WRITE_MODE is set to WRITE_FIRST, but this also means that read data @@ -99,7 +99,7 @@ begin -- With two different clocks, synthesis complains about an undefined -- read-write behavior, that can be ignored. - signal ram : T_SLVV := mem_InitMemory(FILENAME, DEPTH, DATA_BITS); + signal ram : T_SLVV(0 to WORDS - 1)(DATA_BITS - 1 downto 0) := mem_InitMemory(FILENAME, WORDS, DATA_BITS); attribute ramstyle of ram : signal is get_ramstyle_string(RAM_TYPE); attribute ram_style of ram : signal is get_ram_style_string(RAM_TYPE); @@ -121,7 +121,7 @@ begin end if; end if; end process; - elsif gSim: SIMULATION generate + elsif SIMULATION generate begin sim_tdp: ocram_TrueDualPort_Simulation generic map ( diff --git a/src/mem/ocram/ocram_SinglePort.vhdl b/src/mem/ocram/ocram_SinglePort.vhdl index 2754d8766..a99c0dc4b 100644 --- a/src/mem/ocram/ocram_SinglePort.vhdl +++ b/src/mem/ocram/ocram_SinglePort.vhdl @@ -80,11 +80,11 @@ end entity; architecture rtl of ocram_SinglePort is - constant DEPTH : positive := 2**ADDRESS_BITS; + constant WORDS : positive := 2**ADDRESS_BITS; begin - gen: if gInfer: (VENDOR = VENDOR_GENERIC) or (VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX) generate - signal ram : T_SLVV := mem_InitMemory(FILENAME, DEPTH, DATA_BITS); + gen: if (VENDOR = VENDOR_GENERIC) or (VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX) generate + signal ram : T_SLVV(0 to WORDS - 1)(DATA_BITS - 1 downto 0) := mem_InitMemory(FILENAME, WORDS, DATA_BITS); signal a_reg : unsigned(ADDRESS_BITS-1 downto 0); begin @@ -102,7 +102,7 @@ begin end process; DataOut <= (others => 'X') when SIMULATION and is_x(std_logic_vector(a_reg)) else ram(to_integer(a_reg)); -- gets new data - elsif gAltera: VENDOR = VENDOR_ALTERA generate + elsif VENDOR = VENDOR_ALTERA generate component ocram_SimplePort_Altera generic ( ADDRESS_BITS : positive; diff --git a/src/mem/ocram/ocram_TrueDualPort.vhdl b/src/mem/ocram/ocram_TrueDualPort.vhdl index e8444509d..89aea2261 100644 --- a/src/mem/ocram/ocram_TrueDualPort.vhdl +++ b/src/mem/ocram/ocram_TrueDualPort.vhdl @@ -102,11 +102,11 @@ end entity; architecture rtl of ocram_TrueDualPort is - constant DEPTH : positive := 2**ADDRESS_BITS; + constant WORDS : positive := 2**ADDRESS_BITS; begin - gen: if gInfer: not SIMULATION and ((VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) generate - signal ram : T_SLVV := mem_InitMemory(FILENAME, DEPTH, DATA_BITS); + gen: if not SIMULATION and ((VENDOR = VENDOR_LATTICE) or (VENDOR = VENDOR_XILINX)) generate + signal ram : T_SLVV(0 to WORDS - 1)(DATA_BITS - 1 downto 0) := mem_InitMemory(FILENAME, WORDS, DATA_BITS); signal a1_reg : unsigned(ADDRESS_BITS-1 downto 0) := (others => 'U'); signal a2_reg : unsigned(ADDRESS_BITS-1 downto 0) := (others => 'U'); @@ -136,7 +136,7 @@ begin PortA_DataOut <= (others => 'X') when SIMULATION and is_x(std_logic_vector(a1_reg)) else ram(to_integer(a1_reg)); -- returns new data PortB_DataOut <= (others => 'X') when SIMULATION and is_x(std_logic_vector(a2_reg)) else ram(to_integer(a2_reg)); -- returns new data - elsif gAltera: not SIMULATION and (VENDOR = VENDOR_ALTERA) generate + elsif not SIMULATION and (VENDOR = VENDOR_ALTERA) generate -- Direct instantiation of altsyncram (including component -- declaration above) is not sufficient for ModelSim. -- That requires also usage of altera_mf library. @@ -162,7 +162,7 @@ begin PortB_DataIn => PortB_DataIn, PortB_DataOut => PortB_DataOut ); - elsif gSim: SIMULATION generate + elsif SIMULATION generate sim_tdp: ocram_TrueDualPort_Simulation generic map ( ADDRESS_BITS => ADDRESS_BITS, diff --git a/src/mem/ocrom/ocrom.pkg.vhdl b/src/mem/ocrom/ocrom.pkg.vhdl index 7d7bdadb1..3b1841d19 100644 --- a/src/mem/ocrom/ocrom.pkg.vhdl +++ b/src/mem/ocrom/ocrom.pkg.vhdl @@ -51,21 +51,22 @@ package ocrom is end component; -- Dual-Port - component ocrom_DualPort is - generic ( - ADDRESS_BITS : positive; + component ocrom_DualPort + generic( + ADDRESS_BITS : positive; DATA_BITS : positive; - FILENAME : string := "" + FILENAME : string := "" ); - port ( - PortA_Clock : in std_logic; - PortB_Clock : in std_logic; - PortA_ClockEnable : in std_logic; - PortB_ClockEnable : in std_logic; - PortA_Address : in unsigned(ADDRESS_BITS-1 downto 0); - PortB_Address : in unsigned(ADDRESS_BITS-1 downto 0); - PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); - PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) + port( + PortA_Clock : in std_logic; + PortA_ClockEnable : in std_logic; + PortA_Address : in unsigned(ADDRESS_BITS-1 downto 0); + PortA_DataOut : out std_logic_vector(DATA_BITS-1 downto 0); + + PortB_Clock : in std_logic; + PortB_ClockEnable : in std_logic; + PortB_Address : in unsigned(ADDRESS_BITS-1 downto 0); + PortB_DataOut : out std_logic_vector(DATA_BITS-1 downto 0) ); - end component; + end component ocrom_DualPort; end package; diff --git a/src/mem/ocrom/ocrom_DualPort.vhdl b/src/mem/ocrom/ocrom_DualPort.vhdl index a9b3be5ef..060d302e5 100644 --- a/src/mem/ocrom/ocrom_DualPort.vhdl +++ b/src/mem/ocrom/ocrom_DualPort.vhdl @@ -73,13 +73,13 @@ end entity; architecture rtl of ocrom_DualPort is - constant DEPTH : positive := 2**ADDRESS_BITS; + constant WORDS : positive := 2**ADDRESS_BITS; begin assert (str_length(FILENAME) /= 0) report "Do you really want to generate a block of zeros?" severity FAILURE; gen: if gInfer: (VENDOR = VENDOR_GENERIC) or (VENDOR = VENDOR_XILINX) generate - constant rom : T_SLVV := mem_InitMemory(FILENAME, DEPTH, DATA_BITS); + constant rom : T_SLVV(0 to WORDS - 1)(DATA_BITS - 1 downto 0) := mem_InitMemory(FILENAME, WORDS, DATA_BITS); signal a1_reg : unsigned(ADDRESS_BITS-1 downto 0); signal a2_reg : unsigned(ADDRESS_BITS-1 downto 0); diff --git a/src/mem/ocrom/ocrom_SinglePort.vhdl b/src/mem/ocrom/ocrom_SinglePort.vhdl index 70d497279..cfdecfe96 100644 --- a/src/mem/ocrom/ocrom_SinglePort.vhdl +++ b/src/mem/ocrom/ocrom_SinglePort.vhdl @@ -61,13 +61,13 @@ end entity; architecture rtl of ocrom_SinglePort is - constant DEPTH : positive := 2**ADDRESS_BITS; + constant WORDS : positive := 2**ADDRESS_BITS; begin assert (str_length(FILENAME) /= 0) report "Do you really want to generate a block of zeros?" severity FAILURE; gen: if gInfer: (VENDOR = VENDOR_GENERIC) or (VENDOR = VENDOR_XILINX) generate - constant rom : T_SLVV := mem_InitMemory(FILENAME, DEPTH, DATA_BITS); + constant rom : T_SLVV(0 to WORDS - 1)(DATA_BITS - 1 downto 0) := mem_InitMemory(FILENAME, WORDS, DATA_BITS); signal a_reg : unsigned(ADDRESS_BITS-1 downto 0); begin process (Clock) diff --git a/src/net/arp/arp_BroadCast_Receiver.vhdl b/src/net/arp/arp_BroadCast_Receiver.vhdl index 9cf07679f..99fd77294 100644 --- a/src/net/arp/arp_BroadCast_Receiver.vhdl +++ b/src/net/arp/arp_BroadCast_Receiver.vhdl @@ -98,9 +98,6 @@ architecture rtl of arp_BroadCast_Receiver is constant PROTOCOL_IPV6_ADDRESS_LENGTH : positive := 16; -- IPv6 -> 16 bytes constant PROTOCOL_ADDRESS_LENGTH : positive := ite((ALLOWED_PROTOCOL_IPV6 = FALSE), PROTOCOL_IPV4_ADDRESS_LENGTH, PROTOCOL_IPV6_ADDRESS_LENGTH); -- IPv4 -> 4 bytes; IPv6 -> 16 bytes - subtype T_HARDWARE_ADDRESS_INDEX is natural range 0 to HARDWARE_ADDRESS_LENGTH - 1; - subtype T_PROTOCOL_ADDRESS_INDEX is natural range 0 to PROTOCOL_ADDRESS_LENGTH - 1; - signal IsIPv4_set : std_logic; signal IsIPv4_r : std_logic := '0'; signal IsIPv6_set : std_logic; @@ -231,10 +228,10 @@ begin RX_Ack <= '1'; if (Is_EOF = '0') then - if ((ALLOWED_PROTOCOL_IPV4 = TRUE) and (RX_Data = x"08")) then + if (ALLOWED_PROTOCOL_IPV4 and (RX_Data = x"08")) then IsIPv4_set <= '1'; NextState <= ST_RECEIVE_PROTOCOL_type_1; - elsif ((ALLOWED_PROTOCOL_IPV6 = TRUE) and (RX_Data = x"86")) then + elsif (ALLOWED_PROTOCOL_IPV6 and (RX_Data = x"86")) then IsIPv6_set <= '1'; NextState <= ST_RECEIVE_PROTOCOL_type_1; else diff --git a/src/net/arp/arp_BroadCast_Requester.vhdl b/src/net/arp/arp_BroadCast_Requester.vhdl index 25be37fe8..23fdb0fa7 100644 --- a/src/net/arp/arp_BroadCast_Requester.vhdl +++ b/src/net/arp/arp_BroadCast_Requester.vhdl @@ -118,7 +118,7 @@ begin process(State, SendRequest, IsIPv4_l, IsIPv6_l, - TX_Ack, TX_Meta_DestMACAddress_rst, TX_Meta_DestMACAddress_nxt, + TX_Ack, SenderMACAddress_Data, SenderIPv4Address_Data, TargetMACAddress_Data, TargetIPv4Address_Data, Reader_Counter_us) begin diff --git a/src/net/arp/arp_Cache.vhdl b/src/net/arp/arp_Cache.vhdl index e093b7046..4f56c603a 100644 --- a/src/net/arp/arp_Cache.vhdl +++ b/src/net/arp/arp_Cache.vhdl @@ -114,7 +114,7 @@ architecture rtl of arp_Cache is return result; end function; - constant INITIAL_TAGS : T_SLM := to_TagData(INITIAL_CACHE_CONTENT); + constant INITIAL_TAGS : T_SLM := to_TagData(INITIAL_CACHE_CONTENT); constant INITIAL_DATALINES : T_SLVV_8 := to_CacheMemory(INITIAL_CACHE_CONTENT); @@ -122,10 +122,10 @@ architecture rtl of arp_Cache is type T_FSMREPLACE_STATE is (ST_IDLE, ST_REPLACE); - signal FSMReplace_State : T_FSMREPLACE_STATE := ST_IDLE; - signal FSMReplace_NextState : T_FSMREPLACE_STATE; + signal FSMReplace_State : T_FSMREPLACE_STATE := ST_IDLE; + signal FSMReplace_NextState : T_FSMREPLACE_STATE; - signal Insert : std_logic; + signal Insert : std_logic; signal TU_NewTag_rst : std_logic; signal TU_NewTag_nxt : std_logic; @@ -133,40 +133,32 @@ architecture rtl of arp_Cache is signal NewCacheLine_Data : T_SLV_8; - signal TU_Tag_rst : std_logic; - signal TU_Tag_nxt : std_logic; + signal TU_Tag_rst : std_logic; + signal TU_Tag_nxt : std_logic; signal TU_Tag_Data : T_SLV_8; - signal CacheHit : std_logic; + signal CacheHit : std_logic; signal CacheMiss : std_logic; - signal TU_Index : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); - signal TU_Index_d : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); --- signal TU_Index_us : UNSIGNED(CACHEMEMORY_INDEX_BITS - 1 downto 0); - + signal TU_Index : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); signal TU_NewIndex : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); - signal TU_Replaced : std_logic; signal TU_TagHit : std_logic; - signal TU_TagMiss : std_logic; + signal TU_TagMiss : std_logic; constant TICKCOUNTER_RES : T_TIME := 10.0e-3; constant TICKCOUNTER_MAX : positive := TimingToCycles(TICKCOUNTER_RES, CLOCK_FREQ); - constant TICKCOUNTER_BITS : positive := log2ceilnz(TICKCOUNTER_MAX); + constant TICKCOUNTER_BITS : positive := log2ceilnz(TICKCOUNTER_MAX); signal TickCounter_s : signed(TICKCOUNTER_BITS downto 0) := to_signed(TICKCOUNTER_MAX, TICKCOUNTER_BITS + 1); - signal Tick : std_logic; - - signal Exp_Expired : std_logic; - signal Exp_KeyOut : std_logic_vector(CACHEMEMORY_INDEX_BITS - 1 downto 0); + signal Tick : std_logic; - signal DataChunkIndex_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); - signal DataChunkIndex_l_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); - signal NewDataChunkIndex_en : std_logic; - signal NewDataChunkIndex_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); - signal NewDataChunkIndex_max_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); - signal CacheMemory_we : std_logic; - signal CacheMemory : T_SLVV_8((CACHE_LINES * T_NET_MAC_ADDRESS'length) - 1 downto 0) := INITIAL_DATALINES; - signal Memory_ReadWrite : std_logic; + signal DataChunkIndex_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); + signal DataChunkIndex_l_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); + signal NewDataChunkIndex_en : std_logic; + signal NewDataChunkIndex_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); + signal NewDataChunkIndex_max_us : unsigned((CACHEMEMORY_INDEX_BITS + DATACHUNK_INDEX_BITS) - 1 downto 0) := (others => '0'); + signal CacheMemory_we : std_logic; + signal CacheMemory : T_SLVV_8((CACHE_LINES * T_NET_MAC_ADDRESS'length) - 1 downto 0) := INITIAL_DATALINES; begin process(Clock) @@ -180,7 +172,7 @@ begin end if; end process; - process(FSMReplace_State, Command, TU_Replaced, TU_NewTag_rst, TU_NewTag_nxt, NewDataChunkIndex_us, NewDataChunkIndex_max_us) + process(FSMReplace_State, Command, TU_NewTag_rst, TU_NewTag_nxt, NewDataChunkIndex_us, NewDataChunkIndex_max_us) begin FSMReplace_NextState <= FSMReplace_State; @@ -209,21 +201,19 @@ begin Insert <= '1'; CacheMemory_we <= '1'; - NewMACAddress_rst <= '0'; - NewMACAddress_nxt <= '1'; + NewMACAddress_rst <= '0'; + NewMACAddress_nxt <= '1'; NewDataChunkIndex_en <= '1'; FSMReplace_NextState <= ST_REPLACE; - when others => - null; end case; when ST_REPLACE => Status <= NET_ARP_ARPCACHE_STATUS_UPDATING; CacheMemory_we <= '1'; - NewMACAddress_nxt <= '1'; + NewMACAddress_nxt <= '1'; NewDataChunkIndex_en <= '1'; if (NewDataChunkIndex_us = NewDataChunkIndex_max_us) then @@ -248,36 +238,36 @@ begin TU: entity work.cache_TagUnit_Sequential generic map ( REPLACEMENT_POLICY => REPLACEMENT_POLICY, - CACHE_LINES => CACHE_LINES, - ASSOCIATIVITY => CACHE_LINES, + CACHE_LINES => CACHE_LINES, + ASSOCIATIVITY => CACHE_LINES, TAG_BITS => TAG_BITS, CHUNK_BITS => TAGCHUNK_BITS, TAG_BYTE_ORDER => TAG_BYTE_ORDER, - USE_INITIAL_TAGS => TRUE, + USE_INITIAL_TAGS => TRUE, INITIAL_TAGS => INITIAL_TAGS ) port map ( - Clock => Clock, - Reset => Reset, + Clock => Clock, + Reset => Reset, - Replace => Insert, - Replaced => TU_Replaced, + Replace => Insert, + Replaced => open, Replace_NewTag_rst => TU_NewTag_rst, Replace_NewTag_rev => open, Replace_NewTag_nxt => TU_NewTag_nxt, - Replace_NewTag_Data => NewTag_Data, + Replace_NewTag_Data => NewTag_Data, Replace_NewIndex => TU_NewIndex, - Request => Lookup, - Request_ReadWrite => '0', + Request => Lookup, + Request_ReadWrite => '0', Request_Invalidate => '0',--Invalidate, - Request_Tag_rst => TU_Tag_rst, - Request_Tag_rev => open, - Request_Tag_nxt => TU_Tag_nxt, + Request_Tag_rst => TU_Tag_rst, + Request_Tag_rev => open, + Request_Tag_nxt => TU_Tag_nxt, Request_Tag_Data => TU_Tag_Data, - Request_Index => TU_Index, + Request_Index => TU_Index, Request_TagHit => TU_TagHit, - Request_TagMiss => TU_TagMiss + Request_TagMiss => TU_TagMiss ); -- expiration time tick generator @@ -297,22 +287,22 @@ begin -- Exp: entity work.list_Expire Exp: entity work.list_Expire generic map ( - CLOCK_CYCLE_TICKS => 65536, - EXPIRATION_TIME_TICKS => 8192, + CLOCK_CYCLE_TICKS => 65536, + EXPIRATION_TIME_TICKS => 8192, ELEMENTS => CACHE_LINES, KEY_BITS => CACHEMEMORY_INDEX_BITS ) port map ( - Clock => Clock, - Reset => Reset, + Clock => Clock, + Reset => Reset, Tick => Tick, Insert => Insert, - KeyIn => TU_NewIndex, + KeyIn => TU_NewIndex, - Expired => Exp_Expired, - KeyOut => Exp_KeyOut + Expired => open, -- FIXME: why is it not used? + KeyOut => open ); @@ -368,9 +358,6 @@ begin end if; end process; - -- Cache Memory - port 1 - Memory_ReadWrite <= ReadWrite; - process(Clock) begin if rising_edge(Clock) then diff --git a/src/net/arp/arp_UniCast_Receiver.vhdl b/src/net/arp/arp_UniCast_Receiver.vhdl index 9fb67faf2..32f5dd36c 100644 --- a/src/net/arp/arp_UniCast_Receiver.vhdl +++ b/src/net/arp/arp_UniCast_Receiver.vhdl @@ -75,9 +75,6 @@ end entity; architecture rtl of arp_UniCast_Receiver is attribute FSM_ENCODING : string; - subtype T_MAC_BYTEINDEX is natural range 0 to 5; - subtype T_IP_BYTEINDEX is natural range 0 to 3; - type T_STATE is ( ST_IDLE, ST_RECEIVE_HARDWARE_TYPE_1, @@ -103,9 +100,6 @@ architecture rtl of arp_UniCast_Receiver is constant PROTOCOL_IPV6_ADDRESS_LENGTH : positive := 16; -- IPv6 -> 16 bytes constant PROTOCOL_ADDRESS_LENGTH : positive := ite((ALLOWED_PROTOCOL_IPV6 = FALSE), PROTOCOL_IPV4_ADDRESS_LENGTH, PROTOCOL_IPV6_ADDRESS_LENGTH); -- IPv4 -> 4 bytes; IPv6 -> 16 bytes - subtype T_HARDWARE_ADDRESS_INDEX is natural range 0 to HARDWARE_ADDRESS_LENGTH - 1; - subtype T_PROTOCOL_ADDRESS_INDEX is natural range 0 to PROTOCOL_ADDRESS_LENGTH - 1; - signal IsIPv4_set : std_logic; signal IsIPv4_r : std_logic := '0'; signal IsIPv6_set : std_logic; @@ -244,10 +238,10 @@ begin RX_Ack <= '1'; if (Is_EOF = '0') then - if ((ALLOWED_PROTOCOL_IPV4 = TRUE) and (RX_Data = x"08")) then + if (ALLOWED_PROTOCOL_IPV4 and (RX_Data = x"08")) then IsIPv4_set <= '1'; NextState <= ST_RECEIVE_PROTOCOL_TYPE_1; - elsif ((ALLOWED_PROTOCOL_IPV6 = TRUE) and (RX_Data = x"86")) then + elsif (ALLOWED_PROTOCOL_IPV6 and (RX_Data = x"86")) then IsIPv6_set <= '1'; NextState <= ST_RECEIVE_PROTOCOL_TYPE_1; else diff --git a/src/net/arp/arp_Wrapper.vhdl b/src/net/arp/arp_Wrapper.vhdl index 8faa24421..d064854a8 100644 --- a/src/net/arp/arp_Wrapper.vhdl +++ b/src/net/arp/arp_Wrapper.vhdl @@ -519,9 +519,9 @@ begin process(FSMCache_State, IPCache_Lookup, IPCache_IPv4Address_Data, IPCache_MACAddress_rst, IPCache_MACAddress_nxt, MACSeq2_SenderMACAddress_Data, IPSeq2_SenderIPv4Address_Data, ARPReq_Timeout, - UCRcv_Error, UCRcv_ResponseReceived, UCRcv_SenderIPv4Address_Data, UCRcv_SenderMACAddress_Data, UCRcv_TargetIPv4Address_Data, UCRcv_TargetMACAddress_Data, + UCRcv_Error, UCRcv_ResponseReceived, UCRcv_SenderIPv4Address_Data, UCRcv_SenderMACAddress_Data, ARPCache_Status, ARPCache_CacheResult, ARPCache_IPv4Address_rst, ARPCache_IPv4Address_nxt, ARPCache_MACAddress_Data, ARPCache_NewMACAddress_nxt, ARPCache_NewIPv4Address_nxt, - BCReq_Address_rst, BCReq_SenderMACAddress_nxt, BCReq_SenderIPv4Address_nxt, BCReq_TargetMACAddress_nxt, BCReq_TargetIPv4Address_nxt, BCReq_Complete) + BCReq_Address_rst, BCReq_SenderMACAddress_nxt, BCReq_SenderIPv4Address_nxt, BCReq_TargetIPv4Address_nxt, BCReq_Complete) begin FSMCache_NextState <= FSMCache_State; diff --git a/src/sync/sync.pkg.vhdl b/src/sync/sync.pkg.vhdl index 26f7bc978..e0637d9b9 100644 --- a/src/sync/sync.pkg.vhdl +++ b/src/sync/sync.pkg.vhdl @@ -106,17 +106,18 @@ package sync is ); end component; - component sync_Reset_Xilinx is - generic ( - SYNC_DEPTH : T_MISC_SYNC_DEPTH := T_MISC_SYNC_DEPTH'low -- generate SYNC_DEPTH many stages, at least 2 - ); - port ( - Clock : in std_logic; -- output clock domain - Input : in std_logic; -- @async: reset input - D : in std_logic := '0'; - Output : out std_logic -- @Clock: reset output - ); - end component; + component sync_Reset_Xilinx + generic( + REGISTER_OUTPUT : boolean := true; + SYNC_DEPTH : T_MISC_SYNC_DEPTH := T_MISC_SYNC_DEPTH'low + ); + port( + Clock : in std_logic; + Input : in std_logic; + D : in std_logic := '0'; + Output : out std_logic + ); + end component sync_Reset_Xilinx; component sync_Pulse is generic ( diff --git a/src/xil/reconfig/reconfig_ICAP_FSM.vhdl b/src/xil/reconfig/reconfig_ICAP_FSM.vhdl index 1865bb3fc..40a9536ba 100644 --- a/src/xil/reconfig/reconfig_ICAP_FSM.vhdl +++ b/src/xil/reconfig/reconfig_ICAP_FSM.vhdl @@ -135,7 +135,7 @@ begin -- combinatorial state machine cur_state <= nxt_state when rising_edge(Clock); - combi : process (Reset, nxt_state, cur_state, in_data, in_data_valid, in_data_valid_re, + combi : process (Reset, cur_state, in_data, in_data_valid, in_data_valid_re, sync_state, sync_state_flag, out_data_full, readback_cnt, pr_reset) begin -- default assignments nxt_state <= cur_state; diff --git a/src/xil/reconfig/reconfig_ICAP_Wrapper.vhdl b/src/xil/reconfig/reconfig_ICAP_Wrapper.vhdl index 1146e6986..6cef95f52 100644 --- a/src/xil/reconfig/reconfig_ICAP_Wrapper.vhdl +++ b/src/xil/reconfig/reconfig_ICAP_Wrapper.vhdl @@ -38,28 +38,28 @@ use work.utils.all; entity reconfig_ICAP_Wrapper is generic ( - MIN_DEPTH_OUT : positive := 256; - MIN_DEPTH_IN : positive := 256 + INPUT_FIFO_DEPTH : positive := 256; + OUTPUT_FIFO_DEPTH : positive := 256 ); port ( - Clock : in std_logic; - Reset : in std_logic; - ICAP_Clock : in std_logic; -- clock signal for ICAP, max 100 MHz (double check with manual) + Clock : in std_logic; + Reset : in std_logic; + ICAP_Clock : in std_logic; -- clock signal for ICAP, max 100 MHz (double check with manual) - icap_busy : out std_logic; -- the ICAP is processing the data - icap_readback : out std_logic; -- high during a readback - icap_partial_res: out std_logic; -- high during reconfiguration + ICAP_Busy : out std_logic; -- the ICAP is processing the data + ICAP_Readback : out std_logic; -- high during a readback + ICAP_Partial_res : out std_logic; -- high during reconfiguration -- data in - write_put : in std_logic; - write_full : out std_logic; - write_data : in std_logic_vector(31 downto 0); - write_done : in std_logic; -- high pulse/edge after all data was written + Write_Put : in std_logic; + Write_Data : in std_logic_vector(31 downto 0); + Write_Full : out std_logic; + Write_Done : in std_logic; -- high pulse/edge after all data was written -- data out - read_got : in std_logic; - read_valid : out std_logic; - read_data : out std_logic_vector(31 downto 0) + Read_Valid : out std_logic; + Read_Data : out std_logic_vector(31 downto 0); + Read_Got : in std_logic ); end entity; @@ -99,12 +99,12 @@ architecture Behavioral of reconfig_ICAP_Wrapper is signal fsm_ready : std_logic; signal fsm_ready_d : std_logic; begin - write_done_d <= write_done when rising_edge(Clock); - write_done_edge <= to_sl(write_done = '1' and write_done_d = '0'); + write_done_d <= Write_Done when rising_edge(Clock); + write_done_edge <= to_sl(Write_Done = '1' and write_done_d = '0'); - icap_busy <= not fsm_status_clk(3); - icap_readback <= fsm_status_clk(1); - icap_partial_res <= fsm_status_clk(0); + ICAP_Busy <= not fsm_status_clk(3); + ICAP_Readback <= fsm_status_clk(1); + ICAP_Partial_res <= fsm_status_clk(0); fsm_ready <= fsm_status(3); fsm_ready_d <= fsm_ready when rising_edge(ICAP_Clock); @@ -131,25 +131,25 @@ begin -- reader: core fifo_in: entity work.fifo_ic_got generic map( - DATA_BITS => 32, - MIN_DEPTH => MIN_DEPTH_IN, - OUTPUT_REG => false, + DATA_BITS => 32, + MIN_DEPTH => INPUT_FIFO_DEPTH, + OUTPUT_REG => false, FILL_STATE_BITS => STATE_BITS ) port map( - clk_wr => Clock, - rst_wr => Reset, - put => write_put, - din => write_data, - full => write_full, - estate_wr => open, - - clk_rd => ICAP_Clock, - rst_rd => reset_icap, - got => in_data_rden, - valid => in_data_valid, - dout => in_data, - fstate_rd => in_data_fill_state + Write_Clock => Clock, + Write_Reset => Reset, + Write_Put => Write_Put, + Write_DataIn => Write_Data, + Write_Full => Write_Full, + Write_EmptyState => open, + + Read_Clock => ICAP_Clock, + Read_Reset => reset_icap, + Read_Valid => in_data_valid, + Read_DataOut => in_data, + Read_Got => in_data_rden, + Read_FillState => in_data_fill_state ); -- sync data from this core to the pci bus @@ -157,22 +157,24 @@ begin -- reader: pci fifo_out: entity work.fifo_ic_got generic map( - DATA_BITS => 32, - MIN_DEPTH => MIN_DEPTH_OUT, - OUTPUT_REG => false + DATA_BITS => 32, + MIN_DEPTH => OUTPUT_FIFO_DEPTH, + OUTPUT_REG => false ) port map( - clk_wr => ICAP_Clock, - rst_wr => reset_icap, - put => out_data_put, - din => out_data, - full => out_data_full, - - clk_rd => Clock, - rst_rd => Reset, - got => read_got, - valid => read_valid, - dout => read_data + Write_Clock => ICAP_Clock, + Write_Reset => reset_icap, + Write_Put => out_data_put, + Write_DataIn => out_data, + Write_Full => out_data_full, + Write_EmptyState => open, + + Read_Clock => Clock, + Read_Reset => Reset, + Read_Valid => Read_Valid, + Read_DataOut => Read_Data, + Read_Got => Read_Got, + Read_FillState => open ); FSM: entity work.reconfig_ICAP_FSM diff --git a/src/xil/xil_Reconfigurator.vhdl b/src/xil/xil_Reconfigurator.vhdl index e6e158af8..f3c5e4510 100644 --- a/src/xil/xil_Reconfigurator.vhdl +++ b/src/xil/xil_Reconfigurator.vhdl @@ -46,24 +46,24 @@ use work.xil.all; entity xil_Reconfigurator is generic ( - DEBUG : boolean := FALSE; -- - CLOCK_FREQ : FREQ := 100 MHz; -- + DEBUG : boolean := FALSE; -- + CLOCK_FREQUENCY : FREQ := 100 MHz; -- CONFIG_ROM : in T_XIL_DRP_CONFIG_ROM := (0 downto 0 => C_XIL_DRP_CONFIG_SET_EMPTY) -- ); port ( - Clock : in std_logic; - Reset : in std_logic; + Clock : in std_logic; + Reset : in std_logic; Reconfig : in std_logic; -- ReconfigDone : out std_logic; -- ConfigSelect : in std_logic_vector(log2ceilnz(CONFIG_ROM'length) - 1 downto 0); -- DRP_Enable : out std_logic; -- - DRP_Address : out T_XIL_DRP_ADDRESS; -- - DRP_WriteEnable : out std_logic; -- + DRP_Address : out T_XIL_DRP_ADDRESS; -- + DRP_WriteEnable : out std_logic; -- DRP_DataIn : in T_XIL_DRP_DATA; -- - DRP_DataOut : out T_XIL_DRP_DATA; -- - DRP_Ack : in std_logic -- + DRP_DataOut : out T_XIL_DRP_DATA; -- + DRP_Ack : in std_logic -- ); end entity; @@ -71,7 +71,6 @@ end entity; architecture rtl of xil_Reconfigurator is attribute KEEP : boolean; attribute FSM_ENCODING : string; - attribute signal_ENCODING : string; type T_STATE is ( ST_IDLE, diff --git a/tb/arith/Adder_Wide/arith_Adder_Wide_Simple.vhdl b/tb/arith/Adder_Wide/arith_Adder_Wide_Simple.vhdl index 575539652..cb35df6f1 100644 --- a/tb/arith/Adder_Wide/arith_Adder_Wide_Simple.vhdl +++ b/tb/arith/Adder_Wide/arith_Adder_Wide_Simple.vhdl @@ -42,7 +42,6 @@ use work.arith_Adder_Wide_TestController_pkg.all; architecture Simple of arith_Adder_Wide_TestController is signal TestDone : integer_barrier := 1; constant TCID : AlertLogIDType := NewID("Adder_WideTest"); - constant TPERIOD_CLOCK : time := 10 ns; begin @@ -73,7 +72,7 @@ begin CheckerProc: process constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); - variable ai, bi : integer; + variable expected : natural; variable actual_sum : unsigned(9 downto 0); begin diff --git a/tb/arith/Adder_Wide/arith_Adder_Wide_TestController.vhdl b/tb/arith/Adder_Wide/arith_Adder_Wide_TestController.vhdl index d159b0e06..561d9a314 100644 --- a/tb/arith/Adder_Wide/arith_Adder_Wide_TestController.vhdl +++ b/tb/arith/Adder_Wide/arith_Adder_Wide_TestController.vhdl @@ -40,7 +40,7 @@ entity arith_Adder_Wide_TestController is port ( Clock : in std_logic; Reset : in std_logic; - + -- DUT ports (arrays for all variants) a : out word; b : out word; diff --git a/tb/arith/CarryChain_inc/arith_CarryChain_inc_Simple.vhdl b/tb/arith/CarryChain_inc/arith_CarryChain_inc_Simple.vhdl index 1015ee399..24c0089dd 100644 --- a/tb/arith/CarryChain_inc/arith_CarryChain_inc_Simple.vhdl +++ b/tb/arith/CarryChain_inc/arith_CarryChain_inc_Simple.vhdl @@ -74,7 +74,7 @@ begin -- Test with CIn = 1 (increment) CIn <= '1'; - + X <= x"00"; wait for 1 ns; expected := to_unsigned(1, Y'length); @@ -102,7 +102,7 @@ begin -- Test with CIn = 0 (no increment, just pass through) CIn <= '0'; - + X <= x"00"; wait for 1 ns; expected := to_unsigned(0, Y'length); diff --git a/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_Simple.vhdl b/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_Simple.vhdl index 00c5a4e04..ea37af588 100644 --- a/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_Simple.vhdl +++ b/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_Simple.vhdl @@ -43,7 +43,7 @@ use PoC.physical.all; architecture Simple of arith_Convert_Binary2BCD_TestController is constant TCID : AlertLogIDType := NewID("ConvBin2BCDTest"); signal TestDone : integer_barrier := 1; - + constant INPUT_1 : integer := 38442113; constant INPUT_2 : integer := 78734531; constant INPUT_3 : integer := 14902385; @@ -74,8 +74,8 @@ begin begin SetTestName("arith_Convert_Binary2BCD_Simple"); - SetLogEnable(PASSED, TRUE); - SetLogEnable(INFO, TRUE); + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, FALSE); SetLogEnable(DEBUG, FALSE); wait for 0 ns; wait for 0 ns; diff --git a/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_TestController.vhdl b/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_TestController.vhdl index b4541c8cc..6ec0bed59 100644 --- a/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_TestController.vhdl +++ b/tb/arith/Convert_Binary2BCD/arith_Convert_Binary2BCD_TestController.vhdl @@ -46,14 +46,14 @@ entity arith_Convert_Binary2BCD_TestController is port ( Clock : in std_logic; Reset : in std_logic; - + -- DUT signals Start : out std_logic; - + Conv1_Binary : out std_logic_vector(CONV1_BITS - 1 downto 0); Conv1_BCDDigits : in T_BCD_VECTOR(CONV1_DIGITS - 1 downto 0); Conv1_Sign : in std_logic; - + Conv2_Binary : out std_logic_vector(CONV2_BITS - 1 downto 0); Conv2_BCDDigits : in T_BCD_VECTOR(CONV2_DIGITS - 1 downto 0); Conv2_Sign : in std_logic diff --git a/tb/arith/Counter_BCD/arith_Counter_BCD_Simple.vhdl b/tb/arith/Counter_BCD/arith_Counter_BCD_Simple.vhdl index 090f84167..2a5349eb4 100644 --- a/tb/arith/Counter_BCD/arith_Counter_BCD_Simple.vhdl +++ b/tb/arith/Counter_BCD/arith_Counter_BCD_Simple.vhdl @@ -40,9 +40,9 @@ use PoC.physical.all; architecture Simple of arith_Counter_BCD_TestController is constant TCID : AlertLogIDType := NewID("CntBCDTest"); + signal TestDone : integer_barrier := 1; - - signal Expected : T_BCD_VECTOR(DIGITS - 1 downto 0); + begin ControlProc: process diff --git a/tb/arith/Counter_BCD/arith_Counter_BCD_TestController.vhdl b/tb/arith/Counter_BCD/arith_Counter_BCD_TestController.vhdl index 8a46b6e68..9dab19848 100644 --- a/tb/arith/Counter_BCD/arith_Counter_BCD_TestController.vhdl +++ b/tb/arith/Counter_BCD/arith_Counter_BCD_TestController.vhdl @@ -43,7 +43,7 @@ entity arith_Counter_BCD_TestController is Clock : in std_logic; Reset : in std_logic; Reset_aux : out std_logic; - + -- DUT signals arith_Counter_BCD inc : out std_logic; Value : in T_BCD_VECTOR(DIGITS - 1 downto 0) diff --git a/tb/arith/Counter_Free/arith_Counter_Free_Simple.vhdl b/tb/arith/Counter_Free/arith_Counter_Free_Simple.vhdl index 398471492..f577c0212 100644 --- a/tb/arith/Counter_Free/arith_Counter_Free_Simple.vhdl +++ b/tb/arith/Counter_Free/arith_Counter_Free_Simple.vhdl @@ -71,7 +71,7 @@ begin begin -- Initialize control signal inc <= '0'; - + wait until Reset = '0'; WaitForClock(Clock); @@ -79,7 +79,7 @@ begin WaitForClock(Clock); inc <= '1'; WaitForClock(Clock); - + -- Should not assert strobe for first DIVIDER-1 cycles for i in 1 to DIVIDER-1 loop AffirmIf(ProcID, stb = '0', "Strobe should be low before divider count reached (cycle " & integer'image(i) & ")"); @@ -92,7 +92,7 @@ begin -- Next cycle, strobe should be low again and start new count AffirmIf(ProcID, stb = '0', "Strobe should return to low after assertion"); - + -- Test another cycle for i in 1 to DIVIDER-2 loop WaitForClock(Clock); diff --git a/tb/arith/Counter_Gray/arith_Counter_Gray_Simple.vhdl b/tb/arith/Counter_Gray/arith_Counter_Gray_Simple.vhdl index ab03557e4..f0d82920e 100644 --- a/tb/arith/Counter_Gray/arith_Counter_Gray_Simple.vhdl +++ b/tb/arith/Counter_Gray/arith_Counter_Gray_Simple.vhdl @@ -67,19 +67,19 @@ begin CheckerProc: process constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); - + -- Gray code sequence for 4 bits: 0000, 0001, 0011, 0010, 0110, 0111, 0101, 0100, 1100, 1101, 1111, 1110, 1010, 1011, 1001, 1000 type gray_sequence_type is array (0 to 15) of std_logic_vector(3 downto 0); constant GRAY_SEQ : gray_sequence_type := ( "0000", "0001", "0011", "0010", "0110", "0111", "0101", "0100", "1100", "1101", "1111", "1110", "1010", "1011", "1001", "1000" ); - + begin -- Initialize control signals inc <= '0'; dec <= '0'; - + wait until Reset = '0'; WaitForClock(Clock); @@ -94,7 +94,7 @@ begin wait until falling_edge(Clock); inc <= '0'; WaitForClock(Clock); - AffirmIf(ProcID, val = GRAY_SEQ(i), + AffirmIf(ProcID, val = GRAY_SEQ(i), "Gray increment step " & integer'image(i) & ": expected " & to_string(GRAY_SEQ(i))); end loop; diff --git a/tb/arith/Counter_Ring/arith_Counter_Ring_Simple.vhdl b/tb/arith/Counter_Ring/arith_Counter_Ring_Simple.vhdl index 7bde92fea..8aa2b289e 100644 --- a/tb/arith/Counter_Ring/arith_Counter_Ring_Simple.vhdl +++ b/tb/arith/Counter_Ring/arith_Counter_Ring_Simple.vhdl @@ -72,7 +72,7 @@ begin -- Initialize control signals inc <= '0'; dec <= '0'; - + wait until Reset = '0'; WaitForClock(Clock); @@ -82,7 +82,7 @@ begin -- Test increment (ring counter shift left) -- Use same pattern as BCD counter test: pulse inc for each increment - + -- First increment wait until falling_edge(Clock); inc <= '1'; diff --git a/tb/arith/FirstOne/arith_FirstOne_Simple.vhdl b/tb/arith/FirstOne/arith_FirstOne_Simple.vhdl index c8f9ee86e..60614b4f0 100644 --- a/tb/arith/FirstOne/arith_FirstOne_Simple.vhdl +++ b/tb/arith/FirstOne/arith_FirstOne_Simple.vhdl @@ -81,14 +81,14 @@ begin -- Test with tin = '0': no token input, should have no grants tin <= '0'; WaitForClock(Clock); - AffirmIf(ProcID, + AffirmIf(ProcID, grnt = (grnt'range => '0') and tout = '0', "Unexpected token output with tin='0' in testcase #" & integer'image(i)); -- Test with tin = '1': token input, check grant pattern tin <= '1'; wait until falling_edge(Clock); - + -- Check each bit of grant output for j in 0 to N-1 loop -- Grant(j) should be '1' if and only if: @@ -98,17 +98,17 @@ begin -- For bit 0, only check if rqst(0) is '1' AffirmIf(ProcID, (grnt(j) = '1') = (rqst(j) = '1'), - "Wrong grant for bit " & integer'image(j) & + "Wrong grant for bit " & integer'image(j) & " in testcase #" & integer'image(i) & - " (rqst=" & to_hxstring(rqst) & + " (rqst=" & to_hxstring(rqst) & ", grnt=" & to_hxstring(grnt) & ")"); else -- For higher bits, check if this is the first '1' from the right AffirmIf(ProcID, (grnt(j) = '1') = ((rqst(j) = '1') and (rqst(j-1 downto 0) = (j-1 downto 0 => '0'))), - "Wrong grant for bit " & integer'image(j) & + "Wrong grant for bit " & integer'image(j) & " in testcase #" & integer'image(i) & - " (rqst=" & to_hxstring(rqst) & + " (rqst=" & to_hxstring(rqst) & ", grnt=" & to_hxstring(grnt) & ")"); end if; end loop; @@ -117,7 +117,7 @@ begin AffirmIf(ProcID, (tout = '1') = (rqst = (N-1 downto 0 => '0')), "Wrong tout in testcase #" & integer'image(i) & - " (rqst=" & to_hxstring(rqst) & + " (rqst=" & to_hxstring(rqst) & ", tout=" & std_logic'image(tout) & ")"); -- Verify binary output bin points to the granted bit @@ -132,7 +132,7 @@ begin end if; end loop; end if; - + end loop; Log(ProcID, "Exhaustively tested all " & integer'image(2**N) & " request patterns", INFO); diff --git a/tb/arith/FirstOne/arith_FirstOne_TestController.vhdl b/tb/arith/FirstOne/arith_FirstOne_TestController.vhdl index 054b7707d..05a241ae9 100644 --- a/tb/arith/FirstOne/arith_FirstOne_TestController.vhdl +++ b/tb/arith/FirstOne/arith_FirstOne_TestController.vhdl @@ -41,7 +41,7 @@ entity arith_FirstOne_TestController is port ( Clock : in std_logic; Reset : in std_logic; - + -- DUT signals arith_FirstOne tin : out std_logic; rqst : out std_logic_vector(N-1 downto 0); diff --git a/tb/arith/Same/arith_Same_Simple.vhdl b/tb/arith/Same/arith_Same_Simple.vhdl index 518b48769..576473f55 100644 --- a/tb/arith/Same/arith_Same_Simple.vhdl +++ b/tb/arith/Same/arith_Same_Simple.vhdl @@ -73,7 +73,7 @@ begin -- Test with guard = 1 (active) g <= '1'; - + -- Test all zeros x <= (x'range => '0'); WaitForClock(Clock); @@ -103,7 +103,7 @@ begin -- Test with guard = 0 (inactive, should always return 0) g <= '0'; - + x <= (x'range => '0'); WaitForClock(Clock); AffirmIf(ProcID, y = '0', "Guard=0 should return '0' even for all zeros"); diff --git a/tb/arith/Shifter_Barrel/arith_Shifter_Barrel_Simple.vhdl b/tb/arith/Shifter_Barrel/arith_Shifter_Barrel_Simple.vhdl index 311edd58b..aadcd81c0 100644 --- a/tb/arith/Shifter_Barrel/arith_Shifter_Barrel_Simple.vhdl +++ b/tb/arith/Shifter_Barrel/arith_Shifter_Barrel_Simple.vhdl @@ -76,7 +76,7 @@ begin ShiftRotate <= '0'; -- Shift mode LeftRight <= '0'; -- Left ArithmeticLogic <= '0'; -- Logic (doesn't matter for left shift) - + Input <= "10110011"; ShiftAmount <= "001"; -- Shift by 1 wait for 1 ns; @@ -93,7 +93,7 @@ begin ShiftRotate <= '0'; -- Shift mode LeftRight <= '1'; -- Right ArithmeticLogic <= '1'; -- Logic - + Input <= "10110011"; ShiftAmount <= "001"; -- Shift by 1 wait for 1 ns; @@ -110,7 +110,7 @@ begin ShiftRotate <= '0'; -- Shift mode LeftRight <= '1'; -- Right ArithmeticLogic <= '0'; -- Arithmetic - + Input <= "10110011"; -- Negative number ShiftAmount <= "001"; -- Shift by 1 wait for 1 ns; @@ -126,7 +126,7 @@ begin -- Test Rotate Left (RL) ShiftRotate <= '1'; -- Rotate mode LeftRight <= '0'; -- Left - + Input <= "10110011"; ShiftAmount <= "001"; -- Rotate by 1 wait for 1 ns; @@ -142,7 +142,7 @@ begin -- Test Rotate Right (RR) ShiftRotate <= '1'; -- Rotate mode LeftRight <= '1'; -- Right - + Input <= "10110011"; ShiftAmount <= "001"; -- Rotate by 1 wait for 1 ns; diff --git a/tb/arith/SquareRoot/arith_SquareRoot_Simple.vhdl b/tb/arith/SquareRoot/arith_SquareRoot_Simple.vhdl index b10e86d69..46de7ef10 100644 --- a/tb/arith/SquareRoot/arith_SquareRoot_Simple.vhdl +++ b/tb/arith/SquareRoot/arith_SquareRoot_Simple.vhdl @@ -67,12 +67,12 @@ begin CheckerProc: process constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); - + type test_vector is record input : natural; expected : natural; end record; - + type test_array is array (natural range <>) of test_vector; constant test_cases : test_array := ( (0, 0), -- sqrt(0) = 0 @@ -93,7 +93,7 @@ begin (225, 15), -- sqrt(225) = 15 (255, 15) -- sqrt(255) = 15 ); - + begin wait until Reset = '0'; WaitForClock(Clock); @@ -104,21 +104,21 @@ begin start <= '1'; WaitForClock(Clock); start <= '0'; - + -- Wait for computation to start (rdy goes low) wait until rdy = '0'; -- Wait for computation to complete (rdy goes high) wait until rdy = '1'; WaitForClock(Clock); - + -- Check result - AffirmIf(ProcID, - unsigned(sqrt) = test_cases(i).expected, - "sqrt(" & integer'image(test_cases(i).input) & ") = " & - integer'image(test_cases(i).expected) & + AffirmIf(ProcID, + unsigned(sqrt) = test_cases(i).expected, + "sqrt(" & integer'image(test_cases(i).input) & ") = " & + integer'image(test_cases(i).expected) & ", got " & integer'image(to_integer(unsigned(sqrt))) ); - + WaitForClock(Clock); end loop; diff --git a/tb/arith/SquareRoot/arith_SquareRoot_TestHarness.vhdl b/tb/arith/SquareRoot/arith_SquareRoot_TestHarness.vhdl index 159a024cb..0baa33412 100644 --- a/tb/arith/SquareRoot/arith_SquareRoot_TestHarness.vhdl +++ b/tb/arith/SquareRoot/arith_SquareRoot_TestHarness.vhdl @@ -84,7 +84,7 @@ begin port map ( Reset => Reset, Clock => Clock, - Operand => arg, + Radicand => arg, Start => start, Result => sqrt, Ready => rdy diff --git a/tb/arith/TRNG/arith_TRNG_Simple.vhdl b/tb/arith/TRNG/arith_TRNG_Simple.vhdl index ae741f3f3..93fed2f4c 100644 --- a/tb/arith/TRNG/arith_TRNG_Simple.vhdl +++ b/tb/arith/TRNG/arith_TRNG_Simple.vhdl @@ -68,7 +68,7 @@ begin CheckerProc: process constant ProcID : AlertLogIDType := NewID("CheckerProc", TCID); constant NUM_SAMPLES : natural := 100; - + variable prev_rnd : std_logic_vector(rnd'range); variable changes : natural := 0; variable has_zeros : boolean := false; @@ -81,11 +81,11 @@ begin -- are not accurately modeled in simulation. This test verifies basic functionality -- but cannot validate true randomness. True TRNG validation must be done on -- actual hardware using tools like dieharder. - + -- Verify the component produces output prev_rnd := rnd; WaitForClock(Clock); - + -- Sample multiple times to check if any variation occurs for i in 1 to NUM_SAMPLES loop if rnd /= prev_rnd then @@ -104,21 +104,21 @@ begin -- Basic sanity checks that are simulation-friendly -- Note: In simulation, TRNG may produce constant or deterministic output - Log(ProcID, "TRNG changes observed: " & integer'image(changes) & + Log(ProcID, "TRNG changes observed: " & integer'image(changes) & " out of " & integer'image(NUM_SAMPLES) & " samples", INFO); - + -- Note: TRNG output will be 'X' or 'U' in simulation because it relies on -- physical randomness sources (oscillator jitter, metastability) that cannot -- be accurately simulated. This is expected behavior. Log(ProcID, "WARNING: TRNG output is undefined ('X'/'U') in simulation."); Log(ProcID, "This is expected - TRNG relies on physical phenomena."); Log(ProcID, "Verify randomness on target hardware using dieharder or similar tools."); - + -- Just verify the component doesn't crash for i in 1 to 10 loop WaitForClock(Clock); end loop; - + -- Mark test as passed since simulation limitations are expected AffirmIf(ProcID, true, "TRNG component instantiated successfully"); diff --git a/tb/arith/cca/arith_cca_Simple.vhdl b/tb/arith/cca/arith_cca_Simple.vhdl index 3b12502ec..3c73a6202 100644 --- a/tb/arith/cca/arith_cca_Simple.vhdl +++ b/tb/arith/cca/arith_cca_Simple.vhdl @@ -75,7 +75,7 @@ begin -- Test basic addition without carry c <= '0'; - + a <= x"00"; b <= x"00"; wait for 1 ns; @@ -108,7 +108,7 @@ begin -- Test addition with carry = 1 c <= '1'; - + a <= x"00"; b <= x"00"; wait for 1 ns; diff --git a/tb/bus/axi4/Mux/TC_SimpleReadWrite.vhdl b/tb/bus/axi4/Mux/TC_SimpleReadWrite.vhdl index f5022557f..7b324f1b5 100644 --- a/tb/bus/axi4/Mux/TC_SimpleReadWrite.vhdl +++ b/tb/bus/axi4/Mux/TC_SimpleReadWrite.vhdl @@ -47,8 +47,8 @@ begin TranscriptOpen; SetTranscriptMirror(TRUE); - SetLogEnable(PASSED, TRUE); -- Enable PASSED logs - SetLogEnable(INFO, TRUE); -- Enable INFO logs + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs -- Wait for testbench initialization diff --git a/tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID_randDelay.vhdl b/tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID_randDelay.vhdl index dc5404b28..45c5f77bb 100644 --- a/tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID_randDelay.vhdl +++ b/tb/bus/axi4/Mux/TC_SimpleReadWrite_multiID_randDelay.vhdl @@ -45,8 +45,8 @@ begin TranscriptOpen; SetTranscriptMirror(TRUE); - SetLogEnable(PASSED, FALSE); -- Enable PASSED logs - SetLogEnable(INFO, TRUE); -- Enable INFO logs + SetLogEnable(PASSED, FALSE); -- Enable PASSED logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs -- Wait for testbench initialization diff --git a/tb/bus/axi4lite/Demux/TC_SimpleReadWrite.vhdl b/tb/bus/axi4lite/Demux/TC_SimpleReadWrite.vhdl index b4ba7e8ac..159684d46 100644 --- a/tb/bus/axi4lite/Demux/TC_SimpleReadWrite.vhdl +++ b/tb/bus/axi4lite/Demux/TC_SimpleReadWrite.vhdl @@ -38,7 +38,7 @@ begin SetTranscriptMirror(TRUE); SetLogEnable(PASSED, FALSE); -- Enable PASSED logs - SetLogEnable(INFO, TRUE); -- Enable INFO logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs -- Wait for testbench initialization diff --git a/tb/bus/axi4lite/Demux/TC_SimpleReadWrite_02.vhdl b/tb/bus/axi4lite/Demux/TC_SimpleReadWrite_02.vhdl index ef74d92d2..0afb0fb26 100644 --- a/tb/bus/axi4lite/Demux/TC_SimpleReadWrite_02.vhdl +++ b/tb/bus/axi4lite/Demux/TC_SimpleReadWrite_02.vhdl @@ -45,7 +45,7 @@ begin SetTranscriptMirror(TRUE); SetLogEnable(PASSED, FALSE); -- Enable PASSED logs - SetLogEnable(INFO, TRUE); -- Enable INFO logs + SetLogEnable(INFO, FALSE); -- Enable INFO logs -- Wait for testbench initialization diff --git a/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_correction.vhdl b/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_correction.vhdl index 3c8bd880b..9312d77e2 100644 --- a/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_correction.vhdl +++ b/tb/bus/axi4lite/HighResolutionClock/axi4lite_HighResolutionClock_correction.vhdl @@ -32,8 +32,8 @@ begin begin -- Initialization of test SetTestName("axi4lite_HighResolutionClock_correction"); - SetLogEnable(PASSED, TRUE); --Enable PASSED Logs - SetLogEnable(INFO, TRUE); --Enable INFO Logs + SetLogEnable(PASSED, FALSE); --Enable PASSED Logs + SetLogEnable(INFO, FALSE); --Enable INFO Logs -- Wait for testbench Initialization wait for 0 ns; @@ -56,7 +56,7 @@ begin procedure LoadNanoseconds ( signal manager : inout AddressBusRecType; constant Nanoseconds_to_load : natural - ) is + ) is variable ns_value_slv : std_logic_vector(63 downto 0) := to_slv(Nanoseconds_to_load, 64); begin log(""); @@ -90,14 +90,14 @@ begin Read(AXI_Manager, Reg_Nanoseconds_lower, ReadData); time_now_a := now; time_ns_a_l := to_integer(unsigned(ReadData)); - + wait for correction_time; - + Read(AXI_Manager, Reg_Nanoseconds_lower, ReadData); time_now_b := now; time_now_delta := time_now_b - time_now_a; time_now_delta_val := time_now_delta / 1000 ps; - + case config is when "11" => -- increment if correction_threshold = 0 then @@ -123,7 +123,7 @@ begin "Delta: /= " & to_string(delta_expected - 1) & " to " & to_string(delta_expected + 1) & " (expected)" ); end procedure; - + begin wait until Reset = '0'; WaitForClock(AXI_Manager, 2); diff --git a/tb/bus/axi4lite/OCRAM_Adapter/TC_InitMemory.vhdl b/tb/bus/axi4lite/OCRAM_Adapter/TC_InitMemory.vhdl index 1322a76cb..590582117 100644 --- a/tb/bus/axi4lite/OCRAM_Adapter/TC_InitMemory.vhdl +++ b/tb/bus/axi4lite/OCRAM_Adapter/TC_InitMemory.vhdl @@ -26,9 +26,9 @@ begin begin -- Initialization of test SetAlertLogName("TC_InitMemory") ; - SetLogEnable(PASSED, TRUE); - SetLogEnable(INFO, TRUE); - SetLogEnable(DEBUG, TRUE); + SetLogEnable(PASSED, FALSE); + SetLogEnable(INFO, FALSE); + SetLogEnable(DEBUG, FALSE); -- Wait for testbench initialization wait for 0 ns ; diff --git a/tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter_TestController.vhdl b/tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter_TestController.vhdl index 219341120..2f1e26040 100644 --- a/tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter_TestController.vhdl +++ b/tb/bus/axi4lite/OCRAM_Adapter/axi4lite_OCRAM_Adapter_TestController.vhdl @@ -61,7 +61,7 @@ entity axi4lite_OCRAM_Adapter_TestController is -- access RAM through external name --alias DATA_BITS is <>; -- WORKAROUND: NVC 1.20.1 - Size of unconstrained datatype not propagated through ext. name --alias DEPTH is <>; -- WORKAROUND: NVC 1.20.1 - Size of unconstrained datatype not propagated through ext. name - alias ram is <>; --(0 to DEPTH - 1)(DATA_BITS - 1 downto 0)>>; + alias ram is <>; --(0 to DEPTH - 1)(DATA_BITS - 1 downto 0)>>; -- Not currently used in the Axi4Lite model - future use for Axi4Lite Burst Emulation modes -- alias WriteBurstFifo is <> ; diff --git a/tb/bus/axi4lite/Register/TC_RandomReadWrite.vhdl b/tb/bus/axi4lite/Register/TC_RandomReadWrite.vhdl index c2e1f4710..a9c846312 100644 --- a/tb/bus/axi4lite/Register/TC_RandomReadWrite.vhdl +++ b/tb/bus/axi4lite/Register/TC_RandomReadWrite.vhdl @@ -1,6 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; -- ============================================================================= -- Authors: -- Iqbal Asif (PLC2 Design GmbH) diff --git a/tb/bus/axi4lite/UART/axi4lite_UART_receive_burst.vhdl b/tb/bus/axi4lite/UART/axi4lite_UART_receive_burst.vhdl index c32477bb6..3b54fb9c3 100644 --- a/tb/bus/axi4lite/UART/axi4lite_UART_receive_burst.vhdl +++ b/tb/bus/axi4lite/UART/axi4lite_UART_receive_burst.vhdl @@ -1,12 +1,12 @@ architecture receive_burst of axi4lite_UART_tc is - subtype UARTDataType is std_logic_vector(7 downto 0); + subtype UARTDataType is std_logic_vector(7 downto 0); alias UARTSequenceType is T_SLVV_8; - alias SB_IDType is OSVVM.ScoreBoardPkg_slv.ScoreboardIdType; + alias SB_IDType is OSVVM.ScoreBoardPkg_slv.ScoreboardIdType; signal UART_receive_SB : SB_IDType; - + constant TestCtrlID : AlertLogIDType := NewID("TestController"); - + constant TestData : UARTSequenceType := (x"5A", -- 1B x"CA",x"FE",x"AF",x"FE", -- 4B x"DE",x"AD",x"BE",x"EF",x"DE",x"AD",x"BE",x"EF", -- 8B @@ -21,7 +21,7 @@ architecture receive_burst of axi4lite_UART_tc is IsOverrun : boolean; end record; type SequencesType is array(natural range <>) of SequenceDescriptionType; - + constant Sequences : SequencesType := ( 0 => ( 1, 1, FALSE, FALSE), 1 => ( 4, 4, FALSE, FALSE), @@ -47,7 +47,7 @@ architecture receive_burst of axi4lite_UART_tc is end loop; return lengths; end function; - + constant TransmitLengths : T_POSVEC := toTransmitLengths(Sequences); constant ReadoutLengths : T_POSVEC := toReadoutLengths(Sequences); @@ -60,9 +60,10 @@ begin begin -- Initialization of test SetTestName("axi4lite_UART_receive_burst"); - SetLogEnable(PASSED, TRUE); --Enable PASSED Logs - SetLogEnable(INFO, TRUE); --Enable INFO Logs - UART_receive_SB <= OSVVM.ScoreBoardPkg_slv.NewID("UART_receive_SB"); + SetLogEnable(PASSED, FALSE); --Enable PASSED Logs + SetLogEnable(INFO, FALSE); --Enable INFO Logs + + UART_receive_SB <= OSVVM.ScoreBoardPkg_slv.NewID("UART_receive_SB"); -- Wait for testbench Initialization wait for 0 ns; @@ -81,19 +82,19 @@ begin end process ControlProc; -- Generate transaction for AXI manager - ManagerProc : process + ManagerProc : process constant ProcLogID : AlertLogIDType := NewID("ManagerProc", TestCtrlID); variable AxiManagerLogID : AlertLogIDType; - + constant RX_REG : AXIAddressType := 32x"00"; constant TX_REG : AXIAddressType := 32x"04"; constant STATUS_REG : AXIAddressType := 32x"08"; constant CONTROL_REG : AXIAddressType := 32x"0C"; - + variable ReceivedData : AXIDataType; variable isFull : boolean := true; variable isEmpty : boolean := true; - + -- status reg for rx, bit 5 checks for the Status_RX_Overrun procedure CheckIsEmpty_RX( signal manager : inout AddressBusRecType; @@ -106,7 +107,7 @@ begin isEmpty := Data(0) = '0'; AffirmIf(isEmpty = expected, "EmptyBit: Received: " & to_string(isEmpty), " /= Expected: " & to_string(expected)); end procedure; - + procedure CheckIsFull_RX( signal manager : inout AddressBusRecType; constant expected : in boolean @@ -118,7 +119,7 @@ begin isFull := Data(1) = '1'; AffirmIf(isFull = expected, "FullBit: Received: " & to_string(isFull), " /= Expected: " & to_string(expected)); end procedure; - + procedure CheckIsOverrun_RX( signal manager : inout AddressBusRecType; constant expected : in boolean @@ -130,7 +131,7 @@ begin isOverrun := Data(5) = '1'; AffirmIf(isOverrun = expected, "OverrunBit: Received: " & to_string(isOverrun), " /= Expected: " & to_string(expected)); end procedure; - + procedure CheckIsParity_flag( signal manager : inout AddressBusRecType; constant expected : in boolean @@ -142,21 +143,21 @@ begin parity_error := Data(7) = '1'; AffirmIf(parity_error = expected, "EmptyBit: Received: " & to_string(parity_error), " /= Expected: " & to_string(expected)); end procedure; - + begin - wait until Reset = '0'; - + wait until Reset = '0'; + GetAlertLogID(AXI_Manager, AxiManagerLogID); - SetLogEnable(AxiManagerLogID, INFO, False); - + SetLogEnable(AxiManagerLogID, INFO, False); + for i in ReadoutLengths'range loop WaitForToggle(ReadByteTrigger); - + CheckIsEmpty_RX(AXI_Manager, FALSE); CheckIsParity_flag(AXI_Manager, FALSE); CheckIsFull_RX(AXI_Manager, Sequences(i).IsFull); CheckIsOverrun_RX(AXI_Manager, Sequences(i).IsOverrun); - + log(ProcLogID, "Reading received data sequence " & to_string(i) & " of " & to_string(ReadoutLengths(i)) & " bytes from UART register"); for j in 0 to ReadoutLengths(i) - 1 loop Read(AXI_Manager, RX_REG, ReceivedData); @@ -167,7 +168,7 @@ begin CheckIsFull_RX(AXI_Manager, FALSE); CheckIsOverrun_RX(AXI_Manager, FALSE); end loop; - + wait for 500 us; WaitForBarrier(TestDone); wait; @@ -176,28 +177,28 @@ begin -- Generate transactions for UART transmitter UartTxProc : process constant ProcLogID : AlertLogIDType := NewID("UartTxProc", TestCtrlID); - + procedure UARTSendBurst( - signal uartRec : inout UartRecType; + signal uartRec : inout UartRecType; constant data_array : in UARTSequenceType ) is begin - for i in data_array'range loop - OSVVM.ScoreBoardPkg_slv.Push(UART_receive_SB, data_array(i)); + for i in data_array'range loop + OSVVM.ScoreBoardPkg_slv.Push(UART_receive_SB, data_array(i)); log(ProcLogID, "Sending data of " & to_string(i) & "th byte to AXI RX register"); Send(uartRec, data_array(i)); end loop; - end procedure; + end procedure; begin wait until Reset = '0'; - WaitForClock(UartTxRec, 1); - + WaitForClock(UartTxRec, 1); + for i in TransmitLengths'range loop log("Send test sequence " & to_string(i) & " of " & to_string(TransmitLengths(i)) & " bytes to AXI RX register ..."); UARTSendBurst(UartTxRec, TestData(low(TransmitLengths, i) to high(TransmitLengths, i))); Increment(ReadByteTrigger); end loop; - + WaitForBarrier(TestDone); wait; end process; @@ -207,9 +208,9 @@ begin constant ProcLogID : AlertLogIDType := NewID("UartRxProc", TestCtrlID); begin wait until Reset = '0'; - + log(ProcLogID, "Transmit verification model isn't used in this testcase"); - + WaitForBarrier(TestDone); wait; end process; diff --git a/tb/bus/axi4lite/UART/axi4lite_UART_receive_parity.vhdl b/tb/bus/axi4lite/UART/axi4lite_UART_receive_parity.vhdl index 82e056772..868d74942 100644 --- a/tb/bus/axi4lite/UART/axi4lite_UART_receive_parity.vhdl +++ b/tb/bus/axi4lite/UART/axi4lite_UART_receive_parity.vhdl @@ -16,8 +16,8 @@ begin begin -- Initialization of test SetTestName("axi4lite_UART_receive_parity"); - SetLogEnable(PASSED, TRUE); --Enable PASSED Logs - SetLogEnable(INFO, TRUE); --Enable INFO Logs + SetLogEnable(PASSED, FALSE); --Enable PASSED Logs + SetLogEnable(INFO, FALSE); --Enable INFO Logs -- Wait for testbench Initialization wait for 0 ns; @@ -45,9 +45,9 @@ begin begin return 24x"00" & data; end function; - + variable ReceivedData : AXIDataType; - + procedure CheckIsParity_flag( signal manager : inout AddressBusRecType; constant expected : in boolean @@ -59,13 +59,13 @@ begin parity_error := Data(7) = '1'; AffirmIf(parity_error = expected, "EmptyBit: Received: " & to_string(parity_error), " /= Expected: " & to_string(expected)); end procedure; - + begin wait until Reset = '0'; for j in parityerror'range loop WaitForToggle(ReadByteTrigger); CheckIsParity_flag(AXI_Manager, parityerror(j)); - + log("Reading received data byte from UART register ..."); Read(AXI_Manager, RX_REG, ReceivedData); AffirmIf( @@ -85,12 +85,12 @@ begin wait until Reset = '0'; WaitForClock(UartTxRec, 1); - for i in TestData'range loop + for i in TestData'range loop if parityerror(i) then - Send(UartTxRec, TestData(i),UARTTB_PARITY_ERROR); + Send(UartTxRec, TestData(i),UARTTB_PARITY_ERROR); else - Send(UartTxRec, TestData(i)); - end if; + Send(UartTxRec, TestData(i)); + end if; Toggle(ReadByteTrigger); end loop; WaitForBarrier(TestDone); diff --git a/tb/cache/cache_CPU_tb.vhdl b/tb/cache/cache_CPU_tb.vhdl index 099c5ea40..c5e467d03 100644 --- a/tb/cache/cache_CPU_tb.vhdl +++ b/tb/cache/cache_CPU_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================ -- Authors: Martin Zabel -- diff --git a/tb/cache/cache_Memory_tb.vhdl b/tb/cache/cache_Memory_tb.vhdl index 48db0f822..a13bb8612 100644 --- a/tb/cache/cache_Memory_tb.vhdl +++ b/tb/cache/cache_Memory_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================ -- Authors: Martin Zabel -- @@ -223,11 +219,11 @@ begin put => mem2_rstb, din => mem2_rdata, full => open, -- should not overflow - estate_wr => open, + EmptyState => open, got => cache_rstb, dout => rply2_rdata, valid => rply2_valid, - fstate_rd => open); + FillState => open); -- The Write-Data Generator of the CPU wdata_prng: entity poc.arith_PRNG diff --git a/tb/common/config_tb.vhdl b/tb/common/config_tb.vhdl index 9f222d1d5..6435ed2cd 100644 --- a/tb/common/config_tb.vhdl +++ b/tb/common/config_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Thomas B. Preusser -- Patrick Lehmann diff --git a/tb/common/physical_tb.vhdl b/tb/common/physical_tb.vhdl index 33dd8f92c..f4f6fc66d 100644 --- a/tb/common/physical_tb.vhdl +++ b/tb/common/physical_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Testbench: Testing the physical package. -- diff --git a/tb/common/project_configuration_AC701.vhdl b/tb/common/project_configuration_AC701.vhdl index 86b5e2c44..f5c502449 100644 --- a/tb/common/project_configuration_AC701.vhdl +++ b/tb/common/project_configuration_AC701.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Thomas B. Preusser -- Martin Zabel diff --git a/tb/common/project_configuration_Arty.vhdl b/tb/common/project_configuration_Arty.vhdl index 40ec32243..a8191cc82 100644 --- a/tb/common/project_configuration_Arty.vhdl +++ b/tb/common/project_configuration_Arty.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Thomas B. Preusser -- Martin Zabel diff --git a/tb/common/project_configuration_ArtyS7.vhdl b/tb/common/project_configuration_ArtyS7.vhdl index edee602e5..52e093f03 100644 --- a/tb/common/project_configuration_ArtyS7.vhdl +++ b/tb/common/project_configuration_ArtyS7.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Thomas B. Preusser -- Martin Zabel diff --git a/tb/common/project_configuration_ECP5Versa.vhdl b/tb/common/project_configuration_ECP5Versa.vhdl index cbf4a3f0d..2bfee0b06 100644 --- a/tb/common/project_configuration_ECP5Versa.vhdl +++ b/tb/common/project_configuration_ECP5Versa.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Thomas B. Preusser -- Martin Zabel diff --git a/tb/common/project_configuration_GENERIC.vhdl b/tb/common/project_configuration_GENERIC.vhdl index a3fc84150..1d23f9ca5 100644 --- a/tb/common/project_configuration_GENERIC.vhdl +++ b/tb/common/project_configuration_GENERIC.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- @@ -33,9 +29,9 @@ package project_configuration is -- Change these lines to setup configuration. - constant MY_BOARD : string := "GENERIC"; -- a generic board - constant MY_DEVICE : string := "None"; -- infer from MY_BOARD + constant MY_BOARD : string := "GENERIC"; -- a generic board + constant MY_DEVICE : string := "None"; -- infer from MY_BOARD -- For internal use only - constant MY_VERBOSE : boolean := FALSE; + constant MY_VERBOSE : boolean := FALSE; end package; diff --git a/tb/common/project_configuration_KC705.vhdl b/tb/common/project_configuration_KC705.vhdl index ae97bfe3e..a55d60f65 100644 --- a/tb/common/project_configuration_KC705.vhdl +++ b/tb/common/project_configuration_KC705.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Thomas B. Preusser -- Martin Zabel diff --git a/tb/common/project_configuration_Nexys4.vhdl b/tb/common/project_configuration_Nexys4.vhdl index 140ece777..7804f3a14 100644 --- a/tb/common/project_configuration_Nexys4.vhdl +++ b/tb/common/project_configuration_Nexys4.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/common/project_configuration_Nexys4DDR.vhdl b/tb/common/project_configuration_Nexys4DDR.vhdl index 7ca66a79b..ef5b95989 100644 --- a/tb/common/project_configuration_Nexys4DDR.vhdl +++ b/tb/common/project_configuration_Nexys4DDR.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/common/project_configuration_VC707.vhdl b/tb/common/project_configuration_VC707.vhdl index 0aa72b866..8f30ee1fa 100644 --- a/tb/common/project_configuration_VC707.vhdl +++ b/tb/common/project_configuration_VC707.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Thomas B. Preusser -- Martin Zabel diff --git a/tb/common/project_configuration_VC709.vhdl b/tb/common/project_configuration_VC709.vhdl index 450b337c5..ba1fded8f 100644 --- a/tb/common/project_configuration_VC709.vhdl +++ b/tb/common/project_configuration_VC709.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Thomas B. Preusser -- Martin Zabel diff --git a/tb/common/project_configuration_ZC706.vhdl b/tb/common/project_configuration_ZC706.vhdl index c285a3c25..f4ae27f75 100644 --- a/tb/common/project_configuration_ZC706.vhdl +++ b/tb/common/project_configuration_ZC706.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Thomas B. Preusser -- Martin Zabel diff --git a/tb/common/project_configuration_ZedBoard.vhdl b/tb/common/project_configuration_ZedBoard.vhdl index 3f6be2a54..146dc5268 100644 --- a/tb/common/project_configuration_ZedBoard.vhdl +++ b/tb/common/project_configuration_ZedBoard.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Thomas B. Preusser -- Martin Zabel diff --git a/tb/common/strings_tb.vhdl b/tb/common/strings_tb.vhdl index ba24453b2..8faa19141 100644 --- a/tb/common/strings_tb.vhdl +++ b/tb/common/strings_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/dstruct/OutOfOrderBuffer/TbOutOfOrderBuffer_WriteRead.vhdl b/tb/dstruct/OutOfOrderBuffer/TbOutOfOrderBuffer_WriteRead.vhdl index 40e4354cd..d498b6b0c 100644 --- a/tb/dstruct/OutOfOrderBuffer/TbOutOfOrderBuffer_WriteRead.vhdl +++ b/tb/dstruct/OutOfOrderBuffer/TbOutOfOrderBuffer_WriteRead.vhdl @@ -1,6 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; -- ============================================================================= -- Authors: Iqbal Asif -- diff --git a/tb/dstruct/OutOfOrderBuffer/dstruct_OutOfOrderBuffer_TestController.vhdl b/tb/dstruct/OutOfOrderBuffer/dstruct_OutOfOrderBuffer_TestController.vhdl index 79ec21988..a0a6c135d 100644 --- a/tb/dstruct/OutOfOrderBuffer/dstruct_OutOfOrderBuffer_TestController.vhdl +++ b/tb/dstruct/OutOfOrderBuffer/dstruct_OutOfOrderBuffer_TestController.vhdl @@ -1,6 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; -- ============================================================================= -- Authors: Iqbal Asif -- diff --git a/tb/dstruct/OutOfOrderBuffer/tb_OutOfOrderBuffer.vhdl b/tb/dstruct/OutOfOrderBuffer/tb_OutOfOrderBuffer.vhdl index e14087de0..c431306ad 100644 --- a/tb/dstruct/OutOfOrderBuffer/tb_OutOfOrderBuffer.vhdl +++ b/tb/dstruct/OutOfOrderBuffer/tb_OutOfOrderBuffer.vhdl @@ -1,6 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; -- ============================================================================= -- Authors: Iqbal Asif -- diff --git a/tb/dstruct/dstruct_DoubleEndedQueue_tb.vhdl b/tb/dstruct/dstruct_DoubleEndedQueue_tb.vhdl index df03c0ca1..882fc16e2 100644 --- a/tb/dstruct/dstruct_DoubleEndedQueue_tb.vhdl +++ b/tb/dstruct/dstruct_DoubleEndedQueue_tb.vhdl @@ -1,6 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; -- ============================================================================ -- Authors: Jens Voss -- diff --git a/tb/dstruct/dstruct_Stack_tb.vhdl b/tb/dstruct/dstruct_Stack_tb.vhdl index a8102ac46..1a69b7089 100644 --- a/tb/dstruct/dstruct_Stack_tb.vhdl +++ b/tb/dstruct/dstruct_Stack_tb.vhdl @@ -1,6 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; -- ============================================================================ -- Authors: Jens Voss -- diff --git a/tb/fifo/fifo_cc_got_tb.vhdl b/tb/fifo/fifo_cc_got_tb.vhdl index e99426b0a..20889397c 100644 --- a/tb/fifo/fifo_cc_got_tb.vhdl +++ b/tb/fifo/fifo_cc_got_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================ -- Authors: Thomas B. Preusser -- @@ -53,8 +49,8 @@ architecture tb of fifo_cc_got_tb is -- component generics constant D_BITS : positive := 8; constant MIN_DEPTH : positive := 30; - constant ESTATE_WR_BITS : natural := 2; - constant FSTATE_RD_BITS : natural := 2; + constant EMPTY_STATE_BITS : natural := 2; + constant FILL_STATE_BITS : natural := 2; -- Clock Control signal rst : std_logic; @@ -78,11 +74,11 @@ begin signal put : std_logic; signal din : std_logic_vector(D_BITS-1 downto 0); signal full : std_logic; - signal estate_wr : std_logic_vector(ESTATE_WR_BITS - 1 downto 0); + signal EmptyState : std_logic_vector(EMPTY_STATE_BITS - 1 downto 0); signal got : std_logic; signal dout : std_logic_vector(D_BITS-1 downto 0); signal valid : std_logic; - signal fstate_rd : std_logic_vector(FSTATE_RD_BITS - 1 downto 0); + signal FillState : std_logic_vector(FILL_STATE_BITS - 1 downto 0); begin @@ -93,8 +89,8 @@ begin STATE_REG => STATE_REG, DATA_REG => DATA_REG, OUTPUT_REG => OUTPUT_REG, - ESTATE_WR_BITS => ESTATE_WR_BITS, - FSTATE_RD_BITS => FSTATE_RD_BITS + EMPTY_STATE_BITS => EMPTY_STATE_BITS, + FILL_STATE_BITS => FILL_STATE_BITS ) port map ( rst => rst, @@ -102,11 +98,11 @@ begin put => put, din => din, full => full, - estate_wr => estate_wr, + EmptyState => EmptyState, got => got, dout => dout, valid => valid, - fstate_rd => fstate_rd + FillState => FillState ); -- Writer diff --git a/tb/fifo/fifo_cc_got_tempput_tb.vhdl b/tb/fifo/fifo_cc_got_tempput_tb.vhdl index 1417908db..242a86009 100644 --- a/tb/fifo/fifo_cc_got_tempput_tb.vhdl +++ b/tb/fifo/fifo_cc_got_tempput_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================ -- Authors: Thomas B. Preusser -- @@ -52,8 +48,8 @@ architecture tb of fifo_cc_got_tempput_tb is -- component generics constant D_BITS : positive := 8; constant MIN_DEPTH : positive := 8; - constant ESTATE_WR_BITS : natural := 2; - constant FSTATE_RD_BITS : natural := 2; + constant EMPTY_STATE_BITS : natural := 2; + constant FILL_STATE_BITS : natural := 2; constant ISPEC : string := "C C Cccccpppp pppp c ccc pp Cppppp ppp rp RpC"; constant OSPEC : string := "ggg gggggggg ggg G G"; @@ -165,8 +161,8 @@ begin DATA_REG => DATA_REG, STATE_REG => STATE_REG, OUTPUT_REG => OUTPUT_REG, - ESTATE_WR_BITS => ESTATE_WR_BITS, - FSTATE_RD_BITS => FSTATE_RD_BITS + EMPTY_STATE_BITS => EMPTY_STATE_BITS, + FILL_STATE_BITS => FILL_STATE_BITS ) port map ( rst => rst, @@ -175,14 +171,14 @@ begin put => put, din => di, full => ful, - estate_wr => open, + EmptyState => open, commit => commit, rollback => rollback, got => got, dout => do, valid => vld, - fstate_rd => open + FillState => open ); -- Reader diff --git a/tb/fifo/fifo_ic_assembly_tb.vhdl b/tb/fifo/fifo_ic_assembly_tb.vhdl index 4d1de5c75..5b5ff8b02 100644 --- a/tb/fifo/fifo_ic_assembly_tb.vhdl +++ b/tb/fifo/fifo_ic_assembly_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Thomas B. Preusser -- diff --git a/tb/fifo/fifo_ic_got_tb.vhdl b/tb/fifo/fifo_ic_got_tb.vhdl index e09f359d4..184389055 100644 --- a/tb/fifo/fifo_ic_got_tb.vhdl +++ b/tb/fifo/fifo_ic_got_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Thomas B. Preusser -- @@ -52,8 +48,8 @@ architecture tb of fifo_ic_got_tb is constant D_BITS : positive := 9; constant MIN_DEPTH : positive := 8; constant OUTPUT_REG : boolean := true; - constant ESTATE_WR_BITS : natural := 2; - constant FSTATE_RD_BITS : natural := 2; + constant EMPTY_STATE_BITS : natural := 2; + constant FILL_STATE_BITS : natural := 2; -- Sequence Generator constant GEN : bit_vector := "100110001"; @@ -155,8 +151,8 @@ begin D_BITS => D_BITS, MIN_DEPTH => MIN_DEPTH, OUTPUT_REG => OUTPUT_REG, - ESTATE_WR_BITS => ESTATE_WR_BITS, - FSTATE_RD_BITS => FSTATE_RD_BITS + EMPTY_STATE_BITS => EMPTY_STATE_BITS, + FILL_STATE_BITS => FILL_STATE_BITS ) port map ( clk_wr => clk0, @@ -164,14 +160,14 @@ begin put => put0, din => di0, full => ful0, - estate_wr => open, + EmptyState => open, clk_rd => clk1, rst_rd => rst, got => got1, valid => vld1, dout => do1, - fstate_rd => open + FillState => open ); ----------------------------------------------------------------------------- @@ -216,8 +212,8 @@ begin DATA_REG => true, D_BITS => D_BITS, MIN_DEPTH => MIN_DEPTH, - ESTATE_WR_BITS => ESTATE_WR_BITS, - FSTATE_RD_BITS => FSTATE_RD_BITS + EMPTY_STATE_BITS => EMPTY_STATE_BITS, + FILL_STATE_BITS => FILL_STATE_BITS ) port map ( clk_wr => clk1, @@ -225,14 +221,14 @@ begin put => put1, din => di1, full => ful1, - estate_wr => open, + EmptyState => open, clk_rd => clk2, rst_rd => rst, got => got2, valid => vld2, dout => do2, - fstate_rd => open + FillState => open ); ----------------------------------------------------------------------------- diff --git a/tb/io/ddrio/ddrio_InOut_tb.vhdl b/tb/io/ddrio/ddrio_InOut_tb.vhdl index 38aaf4d3a..b1b1e3176 100644 --- a/tb/io/ddrio/ddrio_InOut_tb.vhdl +++ b/tb/io/ddrio/ddrio_InOut_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================ -- Authors: Martin Zabel -- diff --git a/tb/io/ddrio/ddrio_In_tb.vhdl b/tb/io/ddrio/ddrio_In_tb.vhdl index f80862c25..819e7667c 100644 --- a/tb/io/ddrio/ddrio_In_tb.vhdl +++ b/tb/io/ddrio/ddrio_In_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================ -- Authors: Martin Zabel -- diff --git a/tb/io/ddrio/ddrio_Out_tb.vhdl b/tb/io/ddrio/ddrio_Out_tb.vhdl index 7ba99de8d..dbed97ff7 100644 --- a/tb/io/ddrio/ddrio_Out_tb.vhdl +++ b/tb/io/ddrio/ddrio_Out_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================ -- Authors: Martin Zabel -- diff --git a/tb/io/io_Debounce_tb.vhdl b/tb/io/io_Debounce_tb.vhdl index d37aaf18c..ce17ec5ab 100644 --- a/tb/io/io_Debounce_tb.vhdl +++ b/tb/io/io_Debounce_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/io/uart/uart_RX_tb.vhdl b/tb/io/uart/uart_RX_tb.vhdl index 944133881..3a32c340a 100644 --- a/tb/io/uart/uart_RX_tb.vhdl +++ b/tb/io/uart/uart_RX_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================ -- Authors: Patrick Lehmann -- diff --git a/tb/mem/lut/lut_Sine_tb.vhdl b/tb/mem/lut/lut_Sine_tb.vhdl index 4f3f6837b..12fd4cade 100644 --- a/tb/mem/lut/lut_Sine_tb.vhdl +++ b/tb/mem/lut/lut_Sine_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/mem/mem_model.vhdl b/tb/mem/mem_model.vhdl index e4588451f..3fa87e150 100644 --- a/tb/mem/mem_model.vhdl +++ b/tb/mem/mem_model.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================ -- Authors: Martin Zabel -- diff --git a/tb/mem/ocram/ocram_EnhancedSimpleDualPort_tb.vhdl b/tb/mem/ocram/ocram_EnhancedSimpleDualPort_tb.vhdl index 0fc79ce49..d29e1cac3 100644 --- a/tb/mem/ocram/ocram_EnhancedSimpleDualPort_tb.vhdl +++ b/tb/mem/ocram/ocram_EnhancedSimpleDualPort_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Martin Zabel -- diff --git a/tb/mem/ocram/ocram_SimpleDualPort_tb.vhdl b/tb/mem/ocram/ocram_SimpleDualPort_tb.vhdl index 6aa11c6fa..e3377a266 100644 --- a/tb/mem/ocram/ocram_SimpleDualPort_tb.vhdl +++ b/tb/mem/ocram/ocram_SimpleDualPort_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Martin Zabel -- diff --git a/tb/mem/ocram/ocram_SimpleDualPort_wf_tb.vhdl b/tb/mem/ocram/ocram_SimpleDualPort_wf_tb.vhdl index e7ca4535e..663cf4e89 100644 --- a/tb/mem/ocram/ocram_SimpleDualPort_wf_tb.vhdl +++ b/tb/mem/ocram/ocram_SimpleDualPort_wf_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Martin Zabel -- diff --git a/tb/mem/ocram/ocram_TrueDualPort_tb.vhdl b/tb/mem/ocram/ocram_TrueDualPort_tb.vhdl index af64cc23d..629124076 100644 --- a/tb/mem/ocram/ocram_TrueDualPort_tb.vhdl +++ b/tb/mem/ocram/ocram_TrueDualPort_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Martin Zabel -- diff --git a/tb/mem/ocram/ocram_TrueDualPort_wf_tb.vhdl b/tb/mem/ocram/ocram_TrueDualPort_wf_tb.vhdl index 8ab908f35..e388f8ccd 100644 --- a/tb/mem/ocram/ocram_TrueDualPort_wf_tb.vhdl +++ b/tb/mem/ocram/ocram_TrueDualPort_wf_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Martin Zabel -- diff --git a/tb/misc/clock/clock_HighResolution_tc.vhdl b/tb/misc/clock/clock_HighResolution_tc.vhdl index b559ee9b4..9e7161061 100644 --- a/tb/misc/clock/clock_HighResolution_tc.vhdl +++ b/tb/misc/clock/clock_HighResolution_tc.vhdl @@ -31,7 +31,7 @@ use PoC.physical.all; use PoC.math.all; use PoC.clock.all; -library OSVVM; +library OSVVM; context OSVVM.OsvvmContext; library osvvm_Axi4; @@ -46,12 +46,12 @@ entity clock_HighResolution_tc is Clock : in std_logic; Reset : in std_logic; AXI_Manager : inout AddressBusRecType; - + Load_nanoseconds : out std_logic; Load_datetime : out std_logic; Nanoseconds_to_load : out unsigned(63 downto 0); Datetime_to_load : out T_CLOCK_Datetime; - + Nanoseconds : in unsigned(63 downto 0); Datetime : in T_CLOCK_Datetime ); diff --git a/tb/misc/gearbox/gearbox_Down_cc_tb.vhdl b/tb/misc/gearbox/gearbox_Down_cc_tb.vhdl index 3bff0b72a..621b2dafd 100644 --- a/tb/misc/gearbox/gearbox_Down_cc_tb.vhdl +++ b/tb/misc/gearbox/gearbox_Down_cc_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/misc/gearbox/gearbox_Down_dc_tb.vhdl b/tb/misc/gearbox/gearbox_Down_dc_tb.vhdl index 7d80ba017..1f7eb5357 100644 --- a/tb/misc/gearbox/gearbox_Down_dc_tb.vhdl +++ b/tb/misc/gearbox/gearbox_Down_dc_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/misc/gearbox/gearbox_Up_cc_tb.vhdl b/tb/misc/gearbox/gearbox_Up_cc_tb.vhdl index 86ec727ec..2b48b7d50 100644 --- a/tb/misc/gearbox/gearbox_Up_cc_tb.vhdl +++ b/tb/misc/gearbox/gearbox_Up_cc_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/misc/gearbox/gearbox_Up_dc_tb.vhdl b/tb/misc/gearbox/gearbox_Up_dc_tb.vhdl index d717669d9..dcafac698 100644 --- a/tb/misc/gearbox/gearbox_Up_dc_tb.vhdl +++ b/tb/misc/gearbox/gearbox_Up_dc_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/misc/misc_bit_lz_tb.vhdl b/tb/misc/misc_bit_lz_tb.vhdl index 3cf281730..31f0d0152 100644 --- a/tb/misc/misc_bit_lz_tb.vhdl +++ b/tb/misc/misc_bit_lz_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- =========================================================================== -- Testbench: Basic testbench for LZ-based bitstream compressor misc_bit_lz. -- diff --git a/tb/misc/stat/stat_Average_tb.vhdl b/tb/misc/stat/stat_Average_tb.vhdl index d4a7d54fd..442cc1d62 100644 --- a/tb/misc/stat/stat_Average_tb.vhdl +++ b/tb/misc/stat/stat_Average_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/misc/stat/stat_Histogram_tb.vhdl b/tb/misc/stat/stat_Histogram_tb.vhdl index 9cd16adf8..97c4c77fa 100644 --- a/tb/misc/stat/stat_Histogram_tb.vhdl +++ b/tb/misc/stat/stat_Histogram_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/misc/stat/stat_Maximum_tb.vhdl b/tb/misc/stat/stat_Maximum_tb.vhdl index d41cac9d4..5f130a574 100644 --- a/tb/misc/stat/stat_Maximum_tb.vhdl +++ b/tb/misc/stat/stat_Maximum_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/misc/stat/stat_Minimum_tb.vhdl b/tb/misc/stat/stat_Minimum_tb.vhdl index 510783a6d..3ec933d35 100644 --- a/tb/misc/stat/stat_Minimum_tb.vhdl +++ b/tb/misc/stat/stat_Minimum_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/sort/sort_LeastRecentlyUsed_Cache_tb.vhdl b/tb/sort/sort_LeastRecentlyUsed_Cache_tb.vhdl index fe1a6da8b..14deeed8f 100644 --- a/tb/sort/sort_LeastRecentlyUsed_Cache_tb.vhdl +++ b/tb/sort/sort_LeastRecentlyUsed_Cache_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================ -- Authors: Patrick Lehmann -- Martin Zabel diff --git a/tb/sort/sortnet/sortnet_BitonicSort_tb.vhdl b/tb/sort/sortnet/sortnet_BitonicSort_tb.vhdl index 8182bae50..2cdc7a777 100644 --- a/tb/sort/sortnet/sortnet_BitonicSort_tb.vhdl +++ b/tb/sort/sortnet/sortnet_BitonicSort_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/sort/sortnet/sortnet_OddEvenMergeSort_tb.vhdl b/tb/sort/sortnet/sortnet_OddEvenMergeSort_tb.vhdl index cf00d06a2..ace8ac4f4 100644 --- a/tb/sort/sortnet/sortnet_OddEvenMergeSort_tb.vhdl +++ b/tb/sort/sortnet/sortnet_OddEvenMergeSort_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/sort/sortnet/sortnet_OddEvenSort_tb.vhdl b/tb/sort/sortnet/sortnet_OddEvenSort_tb.vhdl index 8af85e67a..875923e76 100644 --- a/tb/sort/sortnet/sortnet_OddEvenSort_tb.vhdl +++ b/tb/sort/sortnet/sortnet_OddEvenSort_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/sort/sortnet/sortnet_Stream_Adapter2_tb.vhdl b/tb/sort/sortnet/sortnet_Stream_Adapter2_tb.vhdl index 70e814a48..b8c3fb21f 100644 --- a/tb/sort/sortnet/sortnet_Stream_Adapter2_tb.vhdl +++ b/tb/sort/sortnet/sortnet_Stream_Adapter2_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/sort/sortnet/sortnet_Stream_Adapter_tb.vhdl b/tb/sort/sortnet/sortnet_Stream_Adapter_tb.vhdl index 1864b5d57..cbae59f0d 100644 --- a/tb/sort/sortnet/sortnet_Stream_Adapter_tb.vhdl +++ b/tb/sort/sortnet/sortnet_Stream_Adapter_tb.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/sort/sortnet/sortnet_tb.pkg.vhdl b/tb/sort/sortnet/sortnet_tb.pkg.vhdl index 16cdfab25..1f9d207fb 100644 --- a/tb/sort/sortnet/sortnet_tb.pkg.vhdl +++ b/tb/sort/sortnet/sortnet_tb.pkg.vhdl @@ -1,7 +1,3 @@ --- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- --- vim: tabstop=2:shiftwidth=2:noexpandtab --- kate: tab-width 2; replace-tabs off; indent-width 2; --- -- ============================================================================= -- Authors: Patrick Lehmann -- diff --git a/tb/sync/Bits/sync_Bits_Simple.vhdl b/tb/sync/Bits/sync_Bits_Simple.vhdl index d4f0d8fcf..7be186a9a 100644 --- a/tb/sync/Bits/sync_Bits_Simple.vhdl +++ b/tb/sync/Bits/sync_Bits_Simple.vhdl @@ -43,7 +43,7 @@ architecture Simple of sync_Bits_TestController is signal TestDone : integer_barrier := 1; constant TCID : AlertLogIDType := NewID("TestCtrl"); - + constant INIT : std_logic_vector(Sync_out'range) := (others => '0'); begin @@ -77,32 +77,32 @@ begin begin -- Initialize Sync_in <= INIT; - + wait until Reset = '0'; WaitForClock(Clock1, 4); -- Toggle input several times with different patterns Sync_in <= "1"; WaitForClock(Clock1, 2); - + Sync_in <= "0"; WaitForClock(Clock1, 2); - + Sync_in <= "1"; WaitForClock(Clock1, 2); - + Sync_in <= "0"; WaitForClock(Clock1, 6); - + Sync_in <= "1"; WaitForClock(Clock1, 16); - + Sync_in <= "0"; WaitForClock(Clock1, 2); - + Sync_in <= "1"; WaitForClock(Clock1, 2); - + Sync_in <= "0"; WaitForClock(Clock1, 6); @@ -116,7 +116,7 @@ begin begin wait until Reset = '0'; WaitForClock(Clock2); - + -- Check initial value AffirmIf(ProcID, Sync_out = INIT, "Initial value should be " & to_string(INIT)); Sync_out_old := Sync_out; @@ -131,7 +131,7 @@ begin end loop; -- Should see 8 toggle events based on stimuli - AffirmIf(ProcID, toggled = 8, + AffirmIf(ProcID, toggled = 8, "Expected 8 toggle events, got " & integer'image(toggled)); WaitForBarrier(TestDone); diff --git a/tb/sync/Command/sync_Command_Simple.vhdl b/tb/sync/Command/sync_Command_Simple.vhdl index 6cd7afbfd..678a08ea3 100644 --- a/tb/sync/Command/sync_Command_Simple.vhdl +++ b/tb/sync/Command/sync_Command_Simple.vhdl @@ -43,7 +43,7 @@ architecture Simple of sync_Command_TestController is signal TestDone : integer_barrier := 1; constant TCID : AlertLogIDType := NewID("TestCtrl"); - + constant INIT : std_logic_vector(Output'range) := (others => '0'); begin @@ -77,7 +77,7 @@ begin begin -- Initialize Input <= INIT; - + WaitForClock(Clock1, 4); -- Send "01" command @@ -138,7 +138,7 @@ begin end loop; -- Should see at least 3 Changed events based on stimuli - AffirmIf(ProcID, ChangedCnt >= 3, + AffirmIf(ProcID, ChangedCnt >= 3, "Expected at least 3 Changed events, got " & integer'image(ChangedCnt)); WaitForBarrier(TestDone); diff --git a/tb/sync/Reset/sync_Reset_Simple.vhdl b/tb/sync/Reset/sync_Reset_Simple.vhdl index 083efc78b..151fb7945 100644 --- a/tb/sync/Reset/sync_Reset_Simple.vhdl +++ b/tb/sync/Reset/sync_Reset_Simple.vhdl @@ -75,7 +75,7 @@ begin begin -- Initialize Input <= '0'; - + WaitForClock(Clock1, 4); -- Short reset pulse @@ -130,7 +130,7 @@ begin end loop; -- Should see at least 1 Output high transition based on stimuli - AffirmIf(ProcID, OutputHighCnt >= 1, + AffirmIf(ProcID, OutputHighCnt >= 1, "Expected at least 1 Output high transition, got " & integer'image(OutputHighCnt)); WaitForBarrier(TestDone); diff --git a/tb/sync/Strobe/sync_Strobe_Simple.vhdl b/tb/sync/Strobe/sync_Strobe_Simple.vhdl index 7e729a37d..a6ceb949f 100644 --- a/tb/sync/Strobe/sync_Strobe_Simple.vhdl +++ b/tb/sync/Strobe/sync_Strobe_Simple.vhdl @@ -43,7 +43,7 @@ architecture Simple of sync_Strobe_TestController is signal TestDone : integer_barrier := 1; constant TCID : AlertLogIDType := NewID("TestCtrl"); - + constant INIT : std_logic_vector(Output'range) := (others => '0'); begin @@ -77,7 +77,7 @@ begin begin -- Initialize Input <= INIT; - + WaitForClock(Clock1, 4); -- First strobe pulse @@ -136,7 +136,7 @@ begin end loop; -- Should see at least 1 output strobe based on stimuli - AffirmIf(ProcID, StrobeCnt >= 1, + AffirmIf(ProcID, StrobeCnt >= 1, "Expected at least 1 output strobe, got " & integer'image(StrobeCnt)); WaitForBarrier(TestDone); diff --git a/tb/sync/Vector/sync_Vector_Simple.vhdl b/tb/sync/Vector/sync_Vector_Simple.vhdl index be78965fc..ae3123c6d 100644 --- a/tb/sync/Vector/sync_Vector_Simple.vhdl +++ b/tb/sync/Vector/sync_Vector_Simple.vhdl @@ -43,7 +43,7 @@ architecture Simple of sync_Vector_TestController is signal TestDone : integer_barrier := 1; constant TCID : AlertLogIDType := NewID("TestCtrl"); - + constant INIT : std_logic_vector(Output'range) := (others => '0'); begin @@ -77,7 +77,7 @@ begin begin -- Initialize Input <= INIT; - + WaitForClock(Clock1, 4); -- Send "01" vector @@ -133,7 +133,7 @@ begin end loop; -- Should see at least 2 Changed events based on stimuli - AffirmIf(ProcID, ChangedCnt >= 2, + AffirmIf(ProcID, ChangedCnt >= 2, "Expected at least 2 Changed events, got " & integer'image(ChangedCnt)); WaitForBarrier(TestDone); diff --git a/tools/poc.tcl b/tools/poc.tcl index dea0fca90..7f22d640f 100644 --- a/tools/poc.tcl +++ b/tools/poc.tcl @@ -1,4 +1,6 @@ namespace eval ::poc { + variable putsPrefix "\[PoC\] " + variable putsPrefixNs "\[PoC\] " proc getEnv {var {default ""}} { if {[info exists ::env($var)]} { return $::env($var) @@ -11,11 +13,11 @@ namespace eval ::poc { variable boardName [getEnv BOARD "GENERIC"] variable buildNamePrefix "" - variable localConfigurationFolder "${projectRoot}/tb/common" - variable projectConfigurationFile "project_configuration_${::poc::boardName}.vhdl" - variable localConfigurationFile "local_configuration.vhdl" - variable projectConfigurationPath [file join $localConfigurationFolder "project_configuration_${::poc::boardName}.vhdl"] - variable localConfigurationPath [file join $localConfigurationFolder "local_configuration.vhdl"] + # Relative to the location of src/build.pro + variable localConfigurationFolder "../tb/common" + variable projectConfigurationFile "$localConfigurationFolder/project_configuration_${::poc::boardName}.vhdl" + variable localConfigurationFile "$localConfigurationFolder/local_configuration.vhdl" + variable localConfigurationPath "$projectRoot/src/$localConfigurationFolder/local_configuration.vhdl" variable disableExit 0 @@ -29,6 +31,8 @@ namespace eval ::poc { } else { set buildNamePrefix "${::osvvm::ToolName}-" } + } elseif {[info exists ::env(GITHUB_ACTIONS)]} { + set buildNamePrefix "" } else { set buildNamePrefix "${::osvvm::ToolNameVersion}-" } @@ -62,7 +66,7 @@ namespace eval ::poc { if {$i < [llength $args]} { set stopCount [lindex $args $i] } else { - puts "Option -stopCount requires an integer value." + puts "${::poc::putsPrefix}Option -stopCount requires an integer value." exitScript } } @@ -75,7 +79,7 @@ namespace eval ::poc { SetSaveWaves } default { - puts "ERROR: Unknown option $arg" + puts "${::poc::putsPrefix}ERROR: Unknown option $arg" exitScript } } @@ -102,16 +106,16 @@ namespace eval ::poc { } else { puts [format { -====================================== -Unknown simulator selected: %s - -Supported simulators: - - GHDL - - NVC - - Riviera-PRO -Other tools: - - Sigasi in VSCode -====================================== +${::poc::putsPrefix}====================================== +${::poc::putsPrefix}Unknown simulator selected: %s +${::poc::putsPrefix} +${::poc::putsPrefix}Supported simulators: +${::poc::putsPrefix} - GHDL +${::poc::putsPrefix} - NVC +${::poc::putsPrefix} - Riviera-PRO +${::poc::putsPrefix}Other tools: +${::poc::putsPrefix} - Sigasi in VSCode +${::poc::putsPrefix}====================================== } $::osvvm::ToolName] exitScript } @@ -149,7 +153,6 @@ Other tools: incr i if {$i < [llength $args]} { set ::poc::projectRoot [lindex $args $i] - set ::poc::localConfigurationFolder "${::poc::projectRoot}/tb/common" } } @@ -170,23 +173,37 @@ Other tools: } default { - puts "ERROR: Unknown option $arg" + puts "${::poc::putsPrefix}ERROR: Unknown option $arg" exitScript } } incr i } - set ::poc::projectConfigurationPath [file join ${::poc::localConfigurationFolder} ${::poc::projectConfigurationFile}] - set ::poc::localConfigurationPath [file join ${::poc::localConfigurationFolder} ${::poc::localConfigurationFile}] + puts "${::poc::putsPrefix}Relative to src/build.pro:" + puts "${::poc::putsPrefix} projectConfigurationFile is '$::poc::projectConfigurationFile'" + puts "${::poc::putsPrefix} localConfigurationFile is '$::poc::localConfigurationFile'" + + set ::poc::localConfigurationPath "$::poc::projectRoot/src/$::poc::localConfigurationFile" + } + + proc WriteLocalConfiguration {} { + puts "${::poc::putsPrefix}Generate local configuration in '$::poc::localConfigurationFile' with working dir to root '$::poc::projectRoot'" + set content "package local_configuration is\n" + append content "\tconstant LOCAL_PROJECT_DIR : string := \"$::poc::projectRoot\";\n" + append content "end package;\n" + + set fileHandle [open "$::poc::projectRoot/src/$::poc::localConfigurationFile" "w"] + puts -nonewline $fileHandle $content + close $fileHandle } proc checkForBuildErrors {} { if {$::osvvm::AnalyzeErrorCount > 0} { - puts "ERROR: While building $::osvvm::LastBuildName" - puts "=====================================" - puts $::osvvm::BuildErrorInfo - puts "=====================================" + puts "${::poc::putsPrefix}ERROR: While building $::osvvm::LastBuildName" + puts "${::poc::putsPrefix}=====================================" + puts "${::poc::putsPrefix}$::osvvm::BuildErrorInfo" + puts "${::poc::putsPrefix}=====================================" exitScript return 1 @@ -196,18 +213,18 @@ Other tools: proc checkForRunErrors {} { if {$::osvvm::AnalyzeErrorCount > 0} { - puts "ERROR: While building $::osvvm::LastBuildName" - puts "=====================================" - puts $::osvvm::BuildErrorInfo - puts "=====================================" + puts "${::poc::putsPrefix}ERROR: While building $::osvvm::LastBuildName" + puts "${::poc::putsPrefix}=====================================" + puts "${::poc::putsPrefix}$::osvvm::BuildErrorInfo" + puts "${::poc::putsPrefix}=====================================" exitScript 2 return 1 } elseif {$::osvvm::SimulateErrorCount > 0} { - puts "ERROR: While simulating $::osvvm::TestCaseName" - puts "=====================================" - puts $::osvvm::BuildErrorInfo - puts "=====================================" + puts "${::poc::putsPrefix}ERROR: While simulating $::osvvm::TestCaseName" + puts "${::poc::putsPrefix}=====================================" + puts "${::poc::putsPrefix}$::osvvm::BuildErrorInfo" + puts "${::poc::putsPrefix}=====================================" exitScript 3 return 1 } @@ -216,25 +233,28 @@ Other tools: # New procedures for OSVVM's *.pro files proc disabled {args} { - puts "Disabled from analysis: $args" + puts "${::poc::putsPrefixNs}Disabled from analysis: $args" } proc duplicate {args} { - puts "Duplicate file: $args" + puts "${::poc::putsPrefixNs}Duplicate file: $args" } namespace export exitScript namespace export configureOSVVM namespace export configurePoC + namespace export WriteLocalConfiguration namespace export checkForBuildErrors namespace export checkForRunErrors namespace export disabled namespace export duplicate } -puts "Loaded PoC extensions for OSVVM." +puts "${::poc::putsPrefix}Loaded tools/poc.tcl poc namespace." namespace eval ::regression { + variable putsPrefix "\[Regression\] " proc createRegressionLevels {args} { + set map(clean) -1 set map(all) 0 set i 0 @@ -257,7 +277,7 @@ namespace eval ::regression { return $map($step) } - puts "\[WARNING\] Unknown build level '$step', using 'all'." + puts "${::regression::putsPrefix}\[WARNING\] Unknown build level '$step', using 'all'." return 0 } @@ -284,20 +304,18 @@ namespace eval ::regression { } else { set buildConfigSource "default" set selectedStep $defaultStep - puts "\[REGRESSION INFO\] Undefined or unknown argument, using default settings." + puts "${::regression::putsPrefix}\[REGRESSION INFO\] Undefined or unknown argument, using default settings." } set ::regression::level [mapRegressionLevel $selectedStep $regressionLevels] # 3. output result - puts "==================================" - puts "Build configuration" - puts " Level: $::regression::level (set by $buildConfigSource)" - puts " Executing [expr {$::regression::executeSingleStep ? "only" : "starting from"}] step '$selectedStep'" - puts "==================================" + puts "${::regression::putsPrefix}Build configuration" + puts "${::regression::putsPrefix} Level: $::regression::level (set by $buildConfigSource)" + puts "${::regression::putsPrefix} Executing [expr {$::regression::executeSingleStep ? "only" : "starting from"}] step '$selectedStep'" } namespace export createRegressionLevels namespace export evaluateRegressionLevel } -puts "Loaded regression extensions." +puts "${::regression::putsPrefix}Loaded tools/poc.tcl regression namespace." diff --git a/ucf/fifo/fifo_ic_got.xdc b/ucf/fifo/fifo_ic_got.xdc index 395ff7769..667c06f03 100644 --- a/ucf/fifo/fifo_ic_got.xdc +++ b/ucf/fifo/fifo_ic_got.xdc @@ -3,6 +3,6 @@ # Load XDC file defining the clocks before this XDC file by using the property PROCESSING_ORDER. # set max delay between regfile write and read side lower clock period -set_max_delay -from [get_cells -regexp {gSmall\.regfile.*/.*|gLarge\.ram/gInfer.ram_reg.*/.*}] \ - -to [get_cells -regexp {gSmall\.do_reg\[\d+\]|gLarge\.ram/gInfer\.q_reg\[\d+\]}] \ +set_max_delay -from [get_cells -regexp {gSmall\.regfile.*/.*|gLarge\.ram/gen.ram_reg.*/.*}] \ + -to [get_cells -regexp {gSmall\.do_reg\[\d+\]|gLarge\.ram/gen\.q_reg\[\d+\]}] \ -datapath_only [expr "min([get_property period [get_clocks -of_objects [get_pins {Ful_reg/C}]]], [get_property period [get_clocks -of_objects [get_pins {Avl_reg/C}]]])"] From 48d65ecbb922dd177708647d3daf986144e623c7 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Wed, 24 Jun 2026 15:57:07 +0200 Subject: [PATCH 4/4] Fix LuaLaTeX documentation flow (#44) * Bumped GitHub Action dependencies. * Updated Unicode font and LuaLaTeX usage. * initialize axi4 sink signals --------- Co-authored-by: Adrian Weiland --- .github/workflows/Simulate.yml | 6 +++--- docs/conf.py | 15 ++------------- src/bus/axi4/axi4_Sink.vhdl | 8 ++++---- 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/.github/workflows/Simulate.yml b/.github/workflows/Simulate.yml index 368c6146f..a6398d927 100644 --- a/.github/workflows/Simulate.yml +++ b/.github/workflows/Simulate.yml @@ -119,7 +119,7 @@ jobs: continue-on-error: ${{ inputs.can-fail }} steps: - name: ⏬ Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: lfs: true submodules: true @@ -222,7 +222,7 @@ jobs: continue-on-error: ${{ inputs.can-fail }} steps: - name: ⏬ Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: lfs: true submodules: true @@ -342,7 +342,7 @@ jobs: continue-on-error: ${{ inputs.can-fail }} steps: - name: ⏬ Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: lfs: true submodules: true diff --git a/docs/conf.py b/docs/conf.py index 9765a19ec..fe344c3a3 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -163,24 +163,13 @@ def _LatestTagName(): latex_elements = { "papersize": "a4paper", # The paper size ('letterpaper' or 'a4paper'). "pointsize": "10pt", # The font size ('10pt', '11pt' or '12pt'). - "inputenc": "", # Let LuaLaTeX handle input encoding + "inputenc": "", # Let LuaLaTeX handle input encoding "utf8extra": "", "polyglossia": "", "babel": r"\usepackage[english]{babel}", "fontenc": r"\usepackage{fontspec}", # Disable the default T1 font encoding (Essential for LuaLaTeX) "fontpkg": dedent("""\ - \\usepackage{unicode-math} - - % Set the Text Fonts (Libertinus) - \\setmainfont{Libertinus Serif} - \\setsansfont{Libertinus Sans} - \\setmonofont{Libertinus Mono} - \\setmathfont{Libertinus Math} - - % Set Symbol font - \\usepackage{newunicodechar} - \\newfontfamily{\\emojifont}[Renderer=OpenType]{NotoColorEmoji.ttf} - \\usepackage{pytooling} + \\usepackage[fontfamily=libertinus]{pytooling} """), "passoptionstopackages": dedent("""\ \\PassOptionsToPackage{verbatimvisiblespace=\\ }{sphinx} diff --git a/src/bus/axi4/axi4_Sink.vhdl b/src/bus/axi4/axi4_Sink.vhdl index 4791614f8..cd5e0435e 100644 --- a/src/bus/axi4/axi4_Sink.vhdl +++ b/src/bus/axi4/axi4_Sink.vhdl @@ -95,13 +95,13 @@ architecture rtl of axi4_Sink is signal nxt_wstate : T_wstate; signal nxt_rstate : T_rstate; - signal AWLen_d : std_logic_vector(7 downto 0); + signal AWLen_d : std_logic_vector(7 downto 0) := (others => '0'); signal AWLen : std_logic_vector(7 downto 0); - signal ARLen_d : std_logic_vector(7 downto 0); + signal ARLen_d : std_logic_vector(7 downto 0) := (others => '0'); signal ARLen : std_logic_vector(7 downto 0); - signal AWID_d : std_logic_vector(IDBits - 1 downto 0); + signal AWID_d : std_logic_vector(IDBits - 1 downto 0) := (others => '0'); signal AWID : std_logic_vector(IDBits - 1 downto 0); - signal ARID_d : std_logic_vector(IDBits - 1 downto 0); + signal ARID_d : std_logic_vector(IDBits - 1 downto 0) := (others => '0'); signal ARID : std_logic_vector(IDBits - 1 downto 0); signal Is_WriteData : std_logic;