Giter Site home page Giter Site logo

stnolting / neorv32 Goto Github PK

View Code? Open in Web Editor NEW
1.4K 48.0 196.0 198.47 MB

:rocket: A tiny, customizable and extensible MCU-class 32-bit RISC-V soft-core CPU and microcontroller-like SoC written in platform-independent VHDL.

Home Page: https://neorv32.org

License: BSD 3-Clause "New" or "Revised" License

VHDL 47.09% C 49.83% Makefile 1.68% Assembly 0.88% Shell 0.17% Python 0.14% C++ 0.22%
risc-v soft-core vhdl fpga soc microcontroller processor cpu riscv system-on-chip

neorv32's People

Contributors

agamez avatar ahmedcharles avatar akaeba avatar awenzel83 avatar davidgussler avatar emb4fun avatar gideonz avatar gitter-badger avatar gottschalkm avatar henrikbrixandersen avatar jeremyherbert avatar kraigher avatar lab-mathias-claussen avatar larsasplund avatar lianakoleva avatar matty0005 avatar mikaelsky avatar nikleberg avatar pcotret avatar prdwivedi avatar rafaelcorsi avatar robhancocksed avatar stnolting avatar tmeissner avatar torerams avatar umarcor avatar unike267 avatar vhdlnerd avatar vivi202 avatar zipotron avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

neorv32's Issues

UART RTS / CTS HW Flow Control

It would be great if the UART ports supported HW flow control. I would like to run the UARTs at much higher baud rates and transfer large amounts of data. This will require flow control.

BTW: Nice work on this project! I had it up and running on a Digilent Nexys A7 board quickly without issues.

Passing argument to ghdl_sim.sh - bug?

@umarcor

Currently, the riscv-arch-test worklfow does not work.

I think there might be a problem here:

# Simulation time define by user?
echo ""
[ -z ${1} ] && echo "Using default simulation config: $SIM_CONFIG" || (
SIM_CONFIG=$1;
echo "Using user simulation config: $SIM_CONFIG";
)

When passing the max. simulation time from a makefile, SIM_CONFIG does not seem to be updated globally.

sh $(NEORV32_LOCAL_COPY)/sim/ghdl/ghdl_sim.sh --stop-time=$(SIM_TIME) >> /dev/null; \

Hence the simulation runs for the default time (8ms) - which would take ages for the riscv-arch-test to complete. When I use the code below for ghdl_sim.sh it seems to work.

if [ -z $1 ]
then
  echo "Using default simulation config: $SIM_CONFIG"
else
  echo $1;
  SIM_CONFIG=$1;
  echo "Using user simulation config: $SIM_CONFIG";
fi

I am not a bash expert, though. Where is the difference? Does the updated code do anything that my workaround does not?! πŸ€”

Enidanness inconsistency

Some parts of the project use little-endian byte order while others use big-endian byte order.
However, the processor is intended to be little-endian.

Parts that need fixing:

  • neorv32_exe.bin executables are big-endian
  • bootloader uses big-endian memory layout
  • mstatush CSR states the CPU is big-endian (but it is not!)
  • external memory interface states it used big-endian access by defualt (but it it not!)

Usage of Logic Elements almost double when synthesizing for Max 10

Hi!

Great project, I really would like to implement it in my Signal Generator-Project, but I only have a 10M04SCE144C8G (Max 10 FPGA with 4k Logic Elements) on the board.
The smallest configuration I can synthesize (only the Processor), however, requires something between 5 and 6K LEs.
If I synthesize the Processor for a Cyclone V, or Cyclone 10 LP FPGA, I can get the LE count to somewhere around 2.5 to 3K.
Other VHDL Projects consume roughly (1% difference) the same amount of LEs on both Cyclone 10 and Max 10.

Do you have any idea why this might be happening. And maybe even a solution in the works already? :)

I use Quartus Lite 20.1.0 Build 711.
To repeat the issue, just start a fresh project in Quartus and specifiy any Max 10 FPGA as the target device, add all the vhdl-files and one of the Templates and then make the Template the Top Level Design Entity. After that, just hit Compile. Note the LE-Usage.
After that, change to any other FPGA and try again. You'll see the Max 10 is using almost twice the LEs.

PS: Upgrade to a larger FPGA was my first idea, but neither Mouser, nor Digikey or Farnell have pin compatible devices in stock and list them to be available sometime in 2022 ;)

ProASIC3 port

Hi Stephan,

I used your NEO some years back when developing a CAN Bus core. I loved it. I saw this under RISCV and decided to give it a try. I am porting it to the ProASIC3 starter board. I got it synthesized successfully in LiberoSOC v11.9. Just synplicity but it was bringing out all the wishbone signals. I tried to change the Booleans for the neorv32_top.vhd to the following (cut from file, not all of them) but I still see the signals on the RTL block diagram as I guess they are on the top level and need to be commented out of the entity definition and put in as signals in the body of the architecture. Otherwise lots of pins created and the compiler chokes on the signals not being driven.

-- External memory interface --
MEM_EXT_USE                  : boolean := false;  -- implement external memory bus interface?
IO_GPIO_USE                  : boolean := false;   -- implement general purpose input/output port unit (GPIO)?

Okay, I got it. I had to comment out all the wb and gpio signals from the entity, put them as signals in the architecture and then Simplicity optimized them away. Ran compile and now need to assign the 17 signals or so I have on the design out to pins and see if I can get it to run on the ProASIC3 board.

Make Check Fails (riscv32-unknown-elf-gcc is not found)

Hi,
Firstly thank you very much for this tremendous effort and I wish you all the best.
I am trying to install the prebuilt toolchain you made and when I test it in one of the provided examples (blink_led) it gives me the following error:
---------------- Check: NEORV32_HOME folder ----------------
NEORV32_HOME: ../../..
---------------- Check: riscv32-unknown-elf-gcc ----------------
make: riscv32-unknown-elf-gcc: No such file or directory
make: *** [../../common/common.mk:207: check] Error 127

Although the file is there at the binary folder.
I searched and found that maybe it is a 32bit file and my Ubuntu (on a Windows VM) is 64bit so I installed the packages required to solve this:
architecture i386
libc6:i386 libncurses5:i386 libstdc++6:i386

Also I installed the build-essential and gcc-multilib because maybe some tool is missing (Linker for example).

Of course I used this command first: $ export PATH=$PATH:/opt/riscv/bin

and still the problem is not solved yet. I would appreciate any help. Thanks again.

USB-UART bridge/peripheral for boards without a uC or an external bridge

We have discussed in several issues about adding a USB-UART peripheral to NEORV32 (either internal o external), which would allow to communicate the NEORV32 with a host laptop/workstation when using boards such as Fomu, TinyFPGA-BX or OrangeCrab. Those boards do have a USB port connected to the FPGA I/O without any intermediate uC, FTDI, CH340... or similar device. Let's use this issue for tracking the experiments in this regard.


im-tomu/fomu-workshop#421 (comment)

Have a look at greatscottgadgets/luna#80. Any other design would also be acceptable. However, dealing with USB in HDL is non-trivial, and meeting timing requirements on the Fomu (UP5K) makes it really challenging.


#52 (reply in thread)

Back to NEORV32 and Fomu. I would like to be able to communicate the host (laptop/workstation) and the soft CPU through UART over USB. There is no ready to use solution in the workshop yet. However, some days ago, @smunaut suggested using no2fpga/no2muacm (see im-tomu/fomu-workshop#421). I could not try that yet. I don't know if a minimal NEORV32 + no2muacm would fit. Moreover, it seems that no2muacm uses a RISC-V core already. Hence, it might make sense to add a similar peripheral to NEORV32, rather than using no2muacm as is.

#52 (reply in thread)

You should also look into the "bitsy" version of the icebreaker, a cheaper version without the FTDI that relies on USB bootloader and comms (like fomu) : https://github.com/icebreaker-fpga/icebreaker#icebreaker-bitsy

It you want to port NeoRV32 and add usb support to it using my no2usb core, I can send you a spare one. (They're not generally for sale yet, first batch is in progress).

#52 (comment)

(1) First don't hesistate to contact me ( like on 1bitsquared discord is probably the best ) for any help regarding no2muacm.
(2) Indeed in the case of NeoRV32 it's probably better to add the no2usb directly connected to it. However if I trust the first page readme ... the fpga is full to the brim (97%), no space whatsoever to add anything there ... The no2muacm core is ~ 1100 LCs. The no2usb core alone is ~ 650 LCs.


#56 (comment)

I have added a hardware USB to my UPduino board that is (electrically) identical to the FOMU. Now I am tinkering with https://github.com/davidthings/tinyfpga_bx_usbserial in loop-back mode: so I have a simple USB-UART echo on the board. Right now I am using Lattice Radiant but the timing still fails...

Anyway. I am curious, has anyone here ever worked with that bridge? Maybe even on a real FOMU?

#56 (comment)

I've got some tests in this branch:
https://github.com/juanmard/neorv32/tree/fomu-serial

Four tests in four differents commits.
https://github.com/juanmard/neorv32/commits/fomu-serial

I was trying redirect UART0 to this bridge but don't work for now.

Use ProcessorTop templates in non osflow examples

Currently, the non osflow examples (radiant, quartus) do not use a ProcessorTop or SystemTop template. Quartus is trying to use neorv32_test_setup.vhd (which was renamed and does not exist) and radiant is instantiating the NEORV32 top directly.

It would be nice to update these examples for using neorv32_ProcessorTop_Test and neorv32_ProcessorTop_UP5KDemo (or MinimalBoot).

Vivado examples use neorv32_ProcessorTop_Test already.

demo_gpio_irq uses firq channel 8. The following changes are needed in main.c to make it work:

demo_gpio_irq uses firq channel 8. The following changes are needed in main.c to make it work:

//install_err += neorv32_rte_exception_install(RTE_TRAP_FIRQ_1, gpio_pin_change_irq_handler);
install_err += neorv32_rte_exception_install(RTE_TRAP_FIRQ_8, gpio_pin_change_irq_handler);

//install_err += neorv32_cpu_irq_enable(CSR_MIE_FIRQ1E);
install_err += neorv32_cpu_irq_enable(CSR_MIE_FIRQ8E);

Originally posted by @razzy34 in #4 (comment)

Add halfway interrupts for SLINK interface

Describe the solution you'd like
The following text is in the documentation for the SLINK peripheral.

The stream interface provides two interrupts that are globally driven by the RX and TX link’s FIFO level status. If the FIFO of any TX link was full and becomes empty again, the TX interrupt fires. Accordingly, if the FIFO of any RX link was empty and a new data word appears in it, the RX interrupt fires.

Given that the TX and RX buffers can be quite long (up to 32k), it would be useful to have a halfway interrupt available so that more data can be computed.

An example scenario is when using a DAC at a fixed sample rate to generate some complex, non-periodic waveform where the samples are computed by the software; the TX empty interrupt is not enough, as this is too late. It means that the DAC will likely have to stall or have some conversions with no data.

Perhaps one other option would be to allow the user to specify the position of it, either by generics or at runtime.

Additional context
I wouldn’t necessarily expect this to be enabled by default.

Problems generating a Vivado-Block Design

Hello,

after quite some time I was finally using an up to date version of this core again, and the probems with the axi4lite-System template from issue #8 are back :

  • IO_CFS_CONFIG needs a default value (like x"00000000")
  • the default values of XIRQ_TRIGGER_TYPE and XIRQ_TRIGGER_POLARITY need to be changed from a generic initialization with "others" to a fixed one like above

and btw:
when did you remove the "upload"-target from the makefile? That was quite convenient (But not as important now, with a working debugger and the possibility to upload via JTAG)

ProASIC3 Starter Kit Port of NEORV32

I got the design programmed into a MicroSemi A3PE-Starter-Kit board but nothing was showing on the UART and then I realized when I ran synplify in LiberoSOC v11.9, it said it would only run at ~ 31MHz and now when I ran SmartTime its showing a clock of 26.076MHz. That explains why nothing is working. So, one choice is to put in a PLL and take 40MHz clock from oscillator on the board going to FPGA and drop to 25MHz and use that for the clock. But what can I do to the design to speed it up. I know the ProASIC3 1.5M gate is >> than a Lattice FPGA. Maybe not as fast as the Xilinx Arty running at 100MHz. Could it be the RAM modules or some other parts I should run through the IP Catalog to generate more optimized area/timing components for the ProASIC3?

proasic3

neorv32_boot_rom.vhd:69:12: index not within bounds

With the latest commits a bug was introduced in neorv32_boot_rom unit:

../../rtl/core/neorv32_boot_rom.vhd:69:12: index not within bounds
      mem_v(i) := init(i)
           ^

It seems that the range of mem_v is smaller than the range of init in the following code snippet. If type boot_img_trange is increased by one, it works.

  -- local types --
  type boot_img_t is array (0 to BOOTROM_SIZE/4-1) of std_ulogic_vector(31 downto 0);

  -- init function --
  -- impure function: returns NOT the same result every time it is evaluated with the same arguments since the source file might have changed
  impure function init_boot_rom(init : bootloader_init_image_t) return boot_img_t is
    variable mem_v : boot_img_t;
  begin
    mem_v := (others => (others => '0'));
    for i in 0 to init'length-1 loop -- init only in range of source data array
      mem_v(i) := init(i);
    end loop; -- i
    return mem_v;
  end function init_boot_rom;

I'm not a git expert, but I assume there is some magic git command to find out which commit introduced the bug.

Having trouble building the iCESugar example

I'm having some trouble trying to build the iCESugar example. From the setups/examples folder, I run the command:

BOARD=iCESugar DESIGN=MinimalBoot VERBOSE=1 make iCESugar

But GHDL complains:

make \
  BITSTREAM=neorv32_iCESugar_MinimalBoot.bit \
  run
make[1]: Entering directory '/home/jeremy/Desktop/neorv32/setups/examples'
make -C ../osflow/iCESugar/ \
  BOARD_SRC=../../examples/neorv32_iCESugar_BoardTop_MinimalBoot.vhd \
  TOP=neorv32_iCESugar_BoardTop_MinimalBoot \
  ID=MinimalBoot \
  clean neorv32_iCESugar_MinimalBoot.bit
make[2]: Entering directory '/home/jeremy/Desktop/neorv32/setups/osflow/iCESugar'
rm -f *.{asc,bit,cf,dfu,history,json,o} *-report.txt
ghdl -a --std=08 --work=iCE40 ../devices/ice40/sb_ice40_components.vhd
ghdl -a --std=08 --work=neorv32 ../../../rtl/core/neorv32_package.vhd ../../../rtl/core/neorv32_application_image.vhd  ../devices/ice40/neorv32_imem.ice40up_spram.vhd ../devices/ice40/neorv32_dmem.ice40up_spram.vhd ../../../rtl/core/neorv32_bootloader_image.vhd ../../../rtl/core/neorv32_boot_rom.vhd ../../../rtl/core/neorv32_bus_keeper.vhd ../../../rtl/core/neorv32_busswitch.vhd ../../../rtl/core/neorv32_cfs.vhd ../../../rtl/core/neorv32_cpu.vhd ../../../rtl/core/neorv32_cpu_alu.vhd ../../../rtl/core/neorv32_cpu_bus.vhd ../../../rtl/core/neorv32_cpu_control.vhd ../../../rtl/core/neorv32_cpu_cp_fpu.vhd ../../../rtl/core/neorv32_cpu_cp_muldiv.vhd ../../../rtl/core/neorv32_cpu_cp_shifter.vhd ../../../rtl/core/neorv32_cpu_decompressor.vhd ../../../rtl/core/neorv32_cpu_regfile.vhd ../../../rtl/core/neorv32_debug_dm.vhd ../../../rtl/core/neorv32_debug_dtm.vhd ../../../rtl/core/neorv32_fifo.vhd ../../../rtl/core/neorv32_gpio.vhd ../../../rtl/core/neorv32_icache.vhd ../../../rtl/core/neorv32_mtime.vhd ../../../rtl/core/neorv32_neoled.vhd ../../../rtl/core/neorv32_pwm.vhd ../../../rtl/core/neorv32_slink.vhd ../../../rtl/core/neorv32_spi.vhd ../../../rtl/core/neorv32_sysinfo.vhd ../../../rtl/core/neorv32_top.vhd ../../../rtl/core/neorv32_trng.vhd ../../../rtl/core/neorv32_twi.vhd ../../../rtl/core/neorv32_uart.vhd ../../../rtl/core/neorv32_wdt.vhd ../../../rtl/core/neorv32_wishbone.vhd
ghdl -a --std=08 --work=work  ../../examples/neorv32_iCESugar_BoardTop_MinimalBoot.vhd
../../examples/neorv32_iCESugar_BoardTop_MinimalBoot.vhd:134:29:error: unit "neorv32_processortop_minimalboot" not found in library "work"
  neorv32_inst: entity work.neorv32_ProcessorTop_MinimalBoot
                            ^
make[2]: *** [../synthesis.mk:8: work-obj08.cf] Error 1
make[2]: Leaving directory '/home/jeremy/Desktop/neorv32/setups/osflow/iCESugar'
make[1]: *** [Makefile:16: run] Error 2
make[1]: Leaving directory '/home/jeremy/Desktop/neorv32/setups/examples'
make: *** [Makefile:35: iCESugar] Error 2

If I run BOARD=iCESugar DESIGN=MinimalBoot VERBOSE=1 make, then all that happens is that my iCESugar folder is moved from the osflow folder to the examples folder:

make -C ../osflow/iCESugar/ \
  BOARD_SRC=../../examples/neorv32_iCESugar_BoardTop_MinimalBoot.vhd \
  TOP=neorv32_iCESugar_BoardTop_MinimalBoot \
  ID=MinimalBoot \
  clean 
make[1]: Entering directory '/home/jeremy/Desktop/neorv32/setups/osflow/iCESugar'
rm -f *.{asc,bit,cf,dfu,history,json,o} *-report.txt
make[1]: Leaving directory '/home/jeremy/Desktop/neorv32/setups/osflow/iCESugar'
mv ../osflow/iCESugar/ ./

Finally, if I run BOARD=iCESugar VERBOSE=1 make MinimalBoot (which I am thinking is the correct one), I get the following error:

make \
  DESIGN=MinimalBoot \
  DESIGN_SRC=../../../rtl/templates/processor/neorv32_ProcessorTop_MinimalBoot.vhd \
  iCESugar
make[1]: Entering directory '/home/jeremy/Desktop/neorv32/setups/examples'
make \
  BITSTREAM=neorv32_iCESugar_MinimalBoot.bit \
  run
make[2]: Entering directory '/home/jeremy/Desktop/neorv32/setups/examples'
make -C ../osflow/iCESugar/ \
  BOARD_SRC=../../examples/neorv32_iCESugar_BoardTop_MinimalBoot.vhd \
  TOP=neorv32_iCESugar_BoardTop_MinimalBoot \
  ID=MinimalBoot \
  clean neorv32_iCESugar_MinimalBoot.bit
make[3]: Entering directory '/home/jeremy/Desktop/neorv32/setups/osflow/iCESugar'
rm -f *.{asc,bit,cf,dfu,history,json,o} *-report.txt
yosys  \
  -p \
  "ghdl --std=08 --no-formal neorv32_iCESugar_BoardTop_MinimalBoot; \
  synth_ice40 \
  -top neorv32_iCESugar_BoardTop_MinimalBoot \
  -dsp \
  -json neorv32_iCESugar_MinimalBoot.json"  2>&1 | tee yosys-report.txt

 /----------------------------------------------------------------------------\
 |                                                                            |
 |  yosys -- Yosys Open SYnthesis Suite                                       |
 |                                                                            |
 |  Copyright (C) 2012 - 2020  Claire Xenia Wolf <[email protected]>         |
 |                                                                            |
 |  Permission to use, copy, modify, and/or distribute this software for any  |
 |  purpose with or without fee is hereby granted, provided that the above    |
 |  copyright notice and this permission notice appear in all copies.         |
 |                                                                            |
 |  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES  |
 |  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF          |
 |  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR   |
 |  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES    |
 |  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN     |
 |  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   |
 |  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.            |
 |                                                                            |
 \----------------------------------------------------------------------------/

 Yosys 0.9+4081 (open-tool-forge build) (git sha1 862e84eb, gcc 9.3.0-17ubuntu1~20.04 -Os)


-- Running command `ghdl --std=08 --no-formal neorv32_iCESugar_BoardTop_MinimalBoot;   synth_ice40   -top neorv32_iCESugar_BoardTop_MinimalBoot   -dsp   -json neorv32_iCESugar_MinimalBoot.json' --

1. Executing GHDL.
warning: ieee library directory '/__w/1/s/_packages/build_linux_x86_64/fpga-toolchain/lib/ghdl/ieee/v08/' not found
error: cannot find "std" library
ERROR: vhdl import failed.
nextpnr-ice40 \
  --up5k --package sg48 --ignore-loops --timing-allow-fail \
  --pcf iCESugar.pcf \
  --json neorv32_iCESugar_MinimalBoot.json \
  --asc neorv32_iCESugar_MinimalBoot.asc 2>&1 | tee nextpnr-report.txt
ERROR: Failed to open JSON file 'neorv32_iCESugar_MinimalBoot.json'.
0 warnings, 1 error
icepack neorv32_iCESugar_MinimalBoot.asc neorv32_iCESugar_MinimalBoot.bit
Error: Failed to open input file.
make[3]: *** [../PnR_Bit.mk:9: neorv32_iCESugar_MinimalBoot.bit] Error 1
make[3]: Leaving directory '/home/jeremy/Desktop/neorv32/setups/osflow/iCESugar'
make[2]: *** [Makefile:16: run] Error 2
make[2]: Leaving directory '/home/jeremy/Desktop/neorv32/setups/examples'
make[1]: *** [Makefile:35: iCESugar] Error 2
make[1]: Leaving directory '/home/jeremy/Desktop/neorv32/setups/examples'
make: *** [Makefile:51: MinimalBoot] Error 2

Though I believe this last one might be due to an issue with my toolchain install? I have just downloaded the toolchain from here: https://github.com/YosysHQ/fpga-toolchain (version nightly-20210703), extracted it to /opt/fpga-toolchain and added it to my path.

If someone could point me in the right direction, it would be much appreciated.

Possible enhancements to management of test bin/hex files

According to https://github.com/stnolting/neorv32/blob/master/riscv-arch-test/port-neorv32/framework_v2.0/riscv-target/neorv32/README.md, https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_application_image.vhd and https://github.com/stnolting/neorv32/blob/master/riscv-arch-test/port-neorv32/framework_v2.0/riscv-target/neorv32/device/rv32i_m/M/Makefile.include, currently each test program is compiled from assembler, an elf file is generated, then a bin file, which is then converted and replaced in a VHDL source. I feel there needs to be some more idiomatic and cleaner way of doing so. Let me drop some ideas:

  • Use a VHDL function for initialising a ROM from a bin or hex file. So, the simulation/synthesis can use the same input file that you would program through a debugging cable.
  • Avoid compiling all the example bin/hex files in each CI run. The core is expected to change more frequently than the RISC-V test suite. Therefore, it might be sensible to precompile all the tests and use them as an asset. All those bin/hex files do only need to be updated when the bootloader or any relevant part of the core is modified. There are three solutions for handling bin/hex files:
    • Check them into the repo.
    • Use a dummy pre-release. In fact, the same 'nightly' pre-release would fit.
    • Use the CI cache (see actions/cache).

Add commit SHA to the datasheet(s)

Since the datasheet is uploaded automatically from CI, multiple artifacts/assets might be difficult to tell apart. It would be desirable to have the commit SHA added to the frontpage/subtitle of the PDF and HTML datasheets, so that users can know which specific version of the repo they correspond to. It can also be useful for developers to understand bug reports or feature requests from users with probably outdated versions of the documentation.

However, I did not search how to do it with asciidoc(tor) yet. I'm creating this issue as a remainder.

neorv32/docs/userguide/content.adoc en dash / em dash

In "neorv32/docs/userguide/content.adoc"

The command ./configure --prefix=/opt/riscv --with-arch=rv32i –-with-abi=ilp32
it shoudl be ./configure --prefix=/opt/riscv --with-arch=rv32i --with-abi=ilp32

uses wrong dash it seems (en dash vs em dash ) in current adoc.

Regards

neorv32_cpu_get_cycle() always returns zero

I just created a new project using the script in the boards folder. The bitstream is generated as expected and the bootloader is working. But when testing the blink-example, nothing happens.

After some investigation I realized, that the function
neorv32_cpu_get_cycle();
always returns zero, and therefore the function
neorv32_cpu_delay_ms(200);
used in the blink-example never returns.

The behaviour is the same for the ARTY and the NEXYS examples.

common/common.mk : 144 main.elf Error 1

I have gotten as far as checking the Toolchain and Info by make check and make info in /sw/example/blink_led. But all other examples end up with the error message above. I am trying to set up neorv32 on my Basys3. I have tried the General Hardware Setup using neorv32_ProcessorTop_Test.vhd as well as neorv32_top.vhd files. In each case I can't figure out how to setup the ports for clk_i, rstn_i, gpio_0, uart0_txd0 and uart0_rxd0 for the Basys3. I think the ports are W5, W8, U16, B18 and A18 respective. I need some help.

How can I easily add IP for an SRAM, EEPROM and MRAM

I have a custom daughter board for a Microsemi A3P3-Starter Kit development board (ProASIC3E). I have a 32Kx8 EEPROM, 512Kx32 SRAM and a 2Mx8 MRAM. Are there any IP for connecting these easily (opencores.org or other) so I could use these with the ProASIC3 board.

Cannot fit on XC6SLX9

Hello!
First of all, thanks for sharing this great project.
I'm new to vhdl, tested the project with an altera ep4ce6 and it worked, then I decided to put it into real operation on a hardware with XC6SLX9 and to my surprise ISE Design couldn't fit. Some problem with async ram seems. Any idea what it might be?

I created a project on ISE, added the top level test from the template folder, set the pins and that's it.

ERROR:Pack:2413 - The number of logical LUTRAM blocks exceeds the capacity for the target device.
ERROR:Pack:2744 - This design requires at least 384 SLICEMs for LUTRAMs. The target device has only 360 SLICEM sites. Please modify the
   logical design source to reduce the number of LUTRAMs. 
   As an alternative, please select a device with more SLICEM sites.
ERROR:Map:237 - The design is too large to fit the device.  Please check the Design Summary section to see which resource requirement for
   your design exceeds the resources available in the device. Note that the number of slices reported may not be reflected accurately as
   their packing might not have been completed.`

`
WARNING:HDLCompiler:746 - "E:\VHDL\neorv32\rtl\core\neorv32_package.vhd" Line 1002: Range is empty (null range)
WARNING:HDLCompiler:746 - "E:\VHDL\neorv32\rtl\core\neorv32_package.vhd" Line 1012: Range is empty (null range)
WARNING:HDLCompiler:746 - "E:\VHDL\neorv32\rtl\core\neorv32_top.vhd" Line 196: Range is empty (null range)
WARNING:HDLCompiler:746 - "E:\VHDL\neorv32\rtl\core\neorv32_top.vhd" Line 210: Range is empty (null range)
WARNING:HDLCompiler:746 - "E:\VHDL\neorv32\rtl\core\neorv32_cpu_control.vhd" Line 261: Range is empty (null range)
WARNING:HDLCompiler:746 - "E:\VHDL\neorv32\rtl\core\neorv32_cpu_control.vhd" Line 262: Range is empty (null range)
WARNING:HDLCompiler:746 - "E:\VHDL\neorv32\rtl\core\neorv32_cpu_bus.vhd" Line 149: Range is empty (null range)
WARNING:HDLCompiler:746 - "E:\VHDL\neorv32\rtl\core\neorv32_cpu_bus.vhd" Line 155: Range is empty (null range)
WARNING:HDLCompiler:746 - "E:\VHDL\neorv32\rtl\core\neorv32_cpu_bus.vhd" Line 156: Range is empty (null range)
WARNING:HDLCompiler:746 - "E:\VHDL\neorv32\rtl\core\neorv32_cpu_bus.vhd" Line 157: Range is empty (null range)
WARNING:HDLCompiler:746 - "E:\VHDL\neorv32\rtl\core\neorv32_cpu_bus.vhd" Line 158: Range is empty (null range)
WARNING:HDLCompiler:746 - "E:\VHDL\neorv32\rtl\core\neorv32_cpu_bus.vhd" Line 159: Range is empty (null range)
WARNING:HDLCompiler:746 - "E:\VHDL\neorv32\rtl\core\neorv32_cpu_bus.vhd" Line 459: Range is empty (null range)
WARNING:HDLCompiler:746 - "E:\VHDL\neorv32\rtl\core\neorv32_cpu_bus.vhd" Line 471: Range is empty (null range)
WARNING:HDLCompiler:746 - "E:\VHDL\neorv32\rtl\core\neorv32_cpu_bus.vhd" Line 484: Range is empty (null range)
WARNING:HDLCompiler:220 - "E:\VHDL\neorv32\rtl\core\neorv32_top.vhd" Line 1186: Assignment ignored
WARNING:Xst:647 - Input <wb_dat_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <slink_tx_rdy_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <slink_rx_dat_i<0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <slink_rx_dat_i<1>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <slink_rx_dat_i<2>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <slink_rx_dat_i<3>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <slink_rx_dat_i<4>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <slink_rx_dat_i<5>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <slink_rx_dat_i<6>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <slink_rx_dat_i<7>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <slink_rx_val_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <cfs_in_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <mtime_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <jtag_trst_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <jtag_tck_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <jtag_tms_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <wb_ack_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <wb_err_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <uart1_rxd_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <uart1_cts_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <spi_sdi_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <mtime_irq_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:2563 - Inout <twi_sda_io> is never assigned. Tied to value Z.
WARNING:Xst:2563 - Inout <twi_scl_io> is never assigned. Tied to value Z.
    WARNING:Xst:2404 -  FFs/Latches <clk_gen_en<7:2>> (without init value) have a constant value of 0 in block <neorv32_top>.
WARNING:Xst:647 - Input <alu_add_i<0:0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <fpu_flags_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <db_halt_req_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
    WARNING:Xst:2404 -  FFs/Latches <csr_frm<1:3>> (without init value) have a constant value of 0 in block <neorv32_cpu_control>.
    WARNING:Xst:2404 -  FFs/Latches <trap_ctrl_irq_buf<21:20>> (without init value) have a constant value of 0 in block <neorv32_cpu_control>.
    WARNING:Xst:2404 -  FFs/Latches <trap_ctrl_exc_buf<10:10>> (without init value) have a constant value of 0 in block <neorv32_cpu_control>.
WARNING:Xst:647 - Input <ctrl_i<25:18>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <ctrl_i<75:27>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <cmp_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <ctrl_i<24:0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <ctrl_i<26:26>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <ctrl_i<75:29>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <rs2_i<31:5>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <imm_i<31:5>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <ctrl_i<48:0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <ctrl_i<75:52>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <ctrl_i<31:0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <ctrl_i<75:44>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <fetch_pc_i<1:0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<1>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<2>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<3>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<4>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<5>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<6>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<7>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<8>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<9>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<10>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<11>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<12>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<13>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<14>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<15>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<16>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<17>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<18>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<19>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<20>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<21>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<22>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<23>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<24>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<25>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<26>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<27>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<28>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<29>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<30>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<31>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<32>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<33>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<34>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<35>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<36>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<37>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<38>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<39>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<41>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<42>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<43>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<44>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<45>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<46>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<47>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<48>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<49>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<50>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<51>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<52>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<53>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<54>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<55>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<56>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<57>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<58>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<59>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<60>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<61>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<62>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<63>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_addr_i<40>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or iWARNING:Xst:647 - Input <pmp_ctrl_i<0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<1>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<2>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<3>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<4>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<5>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<6>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<7>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<8>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<9>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<10>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<11>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<12>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<13>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<14>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<15>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<16>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<17>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<18>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<19>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<20>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<21>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<22>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<23>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<24>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<25>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<26>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<27>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<28>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<29>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<30>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<31>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<32>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<33>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<34>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<35>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<36>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<37>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<38>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<39>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<40>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<41>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<42>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<43>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<44>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<45>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<46>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<47>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<48>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<50>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<51>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<52>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<53>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<54>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<55>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<56>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<57>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<58>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<59>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<60>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<61>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<62>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <pmp_ctrl_i<63>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
    WARNING:Xst:2404 -  FFs/Latches <exclusive_lock<0:0>> (without init value) have a constant value of 0 in block <neorv32_cpu_bus>.
WARNING:Xst:647 - Input <pmp_ctrl_i<49>> is never used. This port wi	inferred   1 RAM(s).
WARNING:Xst:647 - Input <cb_bus_wdata_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <cb_bus_ben_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <addr_i> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <addr_i<1:0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <addr_i<1:0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <addr_i<1:0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <addr_i<14:12>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <addr_i<1:0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <addr_i<31:9>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
    WARNING:Xst:2404 -  FFs/Latches <din_lo<63:32>> (without init value) have a constant value of 0 in block <neorv32_gpio>.
    WARNING:Xst:2404 -  FFs/Latches <din_hi<31:0>> (without init value) have a constant value of 0 in block <neorv32_gpio>.
WARNING:Xst:647 - Input <addr_i<1:0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <addr_i<31:9>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <data_i<5:5>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <data_i<31:9>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <addr_i<1:0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <addr_i<31:9>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <addr_i<1:0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <addr_i<31:9>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <data_i<19:13>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <data_i<27:27>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <data_i<31:29>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <addr_i<1:0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:647 - Input <addr_i<31:9>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.
WARNING:Xst:1710 - FF/Latch <uart_cts_ff_0> (without init value) has a constant value of 0 in block <neorv32_uart0_inst_true.neorv32_uart0_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <data_o_6> (without init value) has a constant value of 0 in block <neorv32_wdt_inst_true.neorv32_wdt_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <csr_mhpmevent_0_1> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <csr_mtvec_1> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <cnt_event_1> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_0> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_3> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_1> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_5> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_9> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_10> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_8> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_11> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_12> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_13> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_14> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_16> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_17> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_15> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_18> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <trap_ctrl_irq_buf_19> (without init value) has a constant value of 0 in block <neorv32_cpu_control_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <uart_cts_ff_1> (without init value) has a constant value of 0 in block <neorv32_uart0_inst_true.neorv32_uart0_inst>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:2677 - Node <execute_engine_last_pc_0> of sequential type is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:2677 - Node <csr_mtvec_0> of sequential type is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:2677 - Node <trap_ctrl_irq_ack_20> of sequential type is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:2677 - Node <trap_ctrl_irq_ack_21> of sequential type is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:2677 - Node <csr_mepc_0> of sequential type is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:2677 - Node <ctrl_13> of sequential type is unconnected in block <neorv32_uart0_inst_true.neorv32_uart0_inst>.
WARNING:Xst:2677 - Node <ctrl_14> of sequential type is unconnected in block <neorv32_uart0_inst_true.neorv32_uart0_inst>.
WARNING:Xst:2677 - Node <ctrl_15> of sequential type is unconnected in block <neorv32_uart0_inst_true.neorv32_uart0_inst>.
WARNING:Xst:2677 - Node <ctrl_16> of sequential type is unconnected in block <neorv32_uart0_inst_true.neorv32_uart0_inst>.
WARNING:Xst:2677 - Node <ctrl_17> of sequential type is unconnected in block <neorv32_uart0_inst_true.neorv32_uart0_inst>.
WARNING:Xst:2677 - Node <ctrl_18> of sequential type is unconnected in block <neorv32_uart0_inst_true.neorv32_uart0_inst>.
WARNING:Xst:2677 - Node <ctrl_19> of sequential type is unconnected in block <neorv32_uart0_inst_true.neorv32_uart0_inst>.
WARNING:Xst:2677 - Node <ctrl_27> of sequential type is unconnected in block <neorv32_uart0_inst_true.neorv32_uart0_inst>.
WARNING:Xst:2677 - Node <ctrl_29> of sequential type is unconnected in block <neorv32_uart0_inst_true.neorv32_uart0_inst>.
WARNING:Xst:2677 - Node <ctrl_30> of sequential type is unconnected in block <neorv32_uart0_inst_true.neorv32_uart0_inst>.
WARNING:Xst:2677 - Node <ctrl_31> of sequential type is unconnected in block <neorv32_uart0_inst_true.neorv32_uart0_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_19> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_18> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_15> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_17> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_16> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_14> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_13> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_12> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_11> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_8> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_10> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_9> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_5> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_1> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_3> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <trap_ctrl_irq_ack_0> is unconnected in block <neorv32_cpu_control_inst>.
WARNING:Xst:2404 -  FFs/Latches <data_o<31:9>> (without init value) have a constant value of 0 in block <neorv32_wdt>.
WARNING:Xst:2404 -  FFs/Latches <ctrl<31:29>> (without init value) have a constant value of 0 in block <neorv32_uart>.
WARNING:Xst:2677 - Node <neorv32_cpu_control_inst/execute_engine_last_pc_0> of sequential type is unconnected in block <neorv32_cpu>.
WARNING:Xst:2677 - Node <neorv32_cpu_control_inst/csr_mtvec_0> of sequential type is unconnected in block <neorv32_cpu>.
WARNING:Xst:2677 - Node <neorv32_cpu_control_inst/trap_ctrl_irq_ack_20> of sequential type is unconnected in block <neorv32_cpu>.
WARNING:Xst:2677 - Node <neorv32_cpu_control_inst/trap_ctrl_irq_ack_21> of sequential type is unconnected in block <neorv32_cpu>.
WARNING:Xst:2677 - Node <neorv32_cpu_control_inst/csr_mepc_0> of sequential type is unconnected in block <neorv32_cpu>.
WARNING:Xst:2677 - Node <ctrl_13> of sequential type is unconnected in block <neorv32_uart>.
WARNING:Xst:2677 - Node <ctrl_14> of sequential type is unconnected in block <neorv32_uart>.
WARNING:Xst:2677 - Node <ctrl_15> of sequential type is unconnected in block <neorv32_uart>.
WARNING:Xst:2677 - Node <ctrl_16> of sequential type is unconnected in block <neorv32_uart>.
WARNING:Xst:2677 - Node <ctrl_17> of sequential type is unconnected in block <neorv32_uart>.
WARNING:Xst:2677 - Node <ctrl_18> of sequential type is unconnected in block <neorv32_uart>.
WARNING:Xst:2677 - Node <ctrl_19> of sequential type is unconnected in block <neorv32_uart>.
WARNING:Xst:2677 - Node <ctrl_27> of sequential type is unconnected in block <neorv32_uart>.
WARNING:Xst:1710 - FF/Latch <neorv32_cpu_control_inst/csr_mhpmevent_3_1> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/csr_mhpmevent_2_1> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/csr_mhpmevent_1_1> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/csr_mhpmevent_0_1> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_0> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_3> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_1> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/csr_mtvec_1> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/cnt_event_1> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_0> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_3> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_1> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1710 - FF/Latch <data_o_6> (without init value) has a constant value of 0 in block <neorv32_wdt>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_7> (without init value) has a constant value of 0 in block <neorv32_wdt>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <uart_cts_ff_0> (without init value) has a constant value of 0 in block <neorv32_uart>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <uart_cts_ff_1> (without init value) has a constant value of 0 in block <neorv32_uart>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_5> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_10> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_8> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_9> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_11> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_12> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_13> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_14> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_17> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_15> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_16> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_18> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_buf_19> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_5> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_10> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_8> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_9> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_11> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_12> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_13> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_14> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_17> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_15> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_16> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_18> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_irq_ack_19> is unconnected in block <neorv32_cpu>.
WARNING:Xst:1710 - FF/Latch <data_o_1> (without init value) has a constant value of 0 in block <neorv32_sysinfo>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_4> (without init value) has a constant value of 0 in block <neorv32_sysinfo>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_5> (without init value) has a constant value of 0 in block <neorv32_sysinfo>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_6> (without init value) has a constant value of 0 in block <neorv32_sysinfo>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_7> (without init value) has a constant value of 0 in block <neorv32_sysinfo>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_9> (without init value) has a constant value of 0 in block <neorv32_sysinfo>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_10> (without init value) has a constant value of 0 in block <neorv32_sysinfo>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_11> (without init value) has a constant value of 0 in block <neorv32_sysinfo>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_12> (without init value) has a constant value of 0 in block <neorv32_sysinfo>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_19> (without init value) has a constant value of 0 in block <neorv32_sysinfo>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_25> (without init value) has a constant value of 0 in block <neorv32_sysinfo>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_27> (without init value) has a constant value of 0 in block <neorv32_sysinfo>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_28> (without init value) has a constant value of 0 in block <neorv32_sysinfo>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_29> (without init value) has a constant value of 0 in block <neorv32_sysinfo>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_30> (without init value) has a constant value of 0 in block <neorv32_sysinfo>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <neorv32_cpu_control_inst/ctrl_17> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/ctrl_18> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/ctrl_22> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/trap_ctrl_cause_5> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/execute_engine_next_pc_0> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_cpu_control_inst/execute_engine_pc_0> (without init value) has a constant value of 0 in block <neorv32_cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:2677 - Node <neorv32_cpu_control_inst/fetch_engine_pc_0> of sequential type is unconnected in block <neorv32_cpu>.
WARNING:Xst:1710 - FF/Latch <uart_tx_sreg_10> (without init value) has a constant value of 1 in block <neorv32_uart>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_13> (without init value) has a constant value of 0 in block <neorv32_uart>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_14> (without init value) has a constant value of 0 in block <neorv32_uart>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_15> (without init value) has a constant value of 0 in block <neorv32_uart>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_16> (without init value) has a constant value of 0 in block <neorv32_uart>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_17> (without init value) has a constant value of 0 in block <neorv32_uart>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_18> (without init value) has a constant value of 0 in block <neorv32_uart>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_19> (without init value) has a constant value of 0 in block <neorv32_uart>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <data_o_27> (without init value) has a constant value of 0 in block <neorv32_uart>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:2042 - Unit neorv32_top: 2 internal tristates are replaced by logic (pull-up yes): , twi_sda_io.
WARNING:Xst:1710 - FF/Latch <i_arbiter_err_align> (without init value) has a constant value of 0 in block <neorv32_cpu_bus>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <i_arbiter_err_align> (without init value) has a constant value of 0 in block <neorv32_cpu_bus>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/issue_engine_buf_16> (without init value) has a constant value of 0 in block <neorv32_ProcessorTop_Test>. This FF/Latch will be trimmed during the optimization process.
twi_scl_ioWARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/trap_ctrl_exc_buf_2> (without init value) has a constant value of 0 in block <neorv32_ProcessorTop_Test>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/instr_prefetch_buffer/fifo_data_1_32> (without init value) has a constant value of 0 in block <neorv32_ProcessorTop_Test>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/instr_prefetch_buffer/fifo_data_0_32> (without init value) has a constant value of 0 in block <neorv32_ProcessorTop_Test>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <neorv32_top_inst/neorv32_busswitch_inst/cb_wr_req_buf> (without init value) has a constant value of 0 in block <neorv32_ProcessorTop_Test>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_0> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_1> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_3> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_4> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_2> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_6> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_7> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_5> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_9> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_10> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_8> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_12> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_13> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_11> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_15> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_16> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_14> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_17> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_18> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_19> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_20> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_22> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_23> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_21> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_25> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_26> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_24> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_28> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_29> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_27> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_30> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/mtime_o_31> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/fetch_engine_pc_1> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/ctrl_16> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/neorv32_cpu_inst/neorv32_cpu_control_inst/ctrl_19> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:2677 - Node <neorv32_top_inst/neorv32_uart0_inst_true.neorv32_uart0_inst/uart_rts_o> of sequential type is unconnected in block <neorv32_ProcessorTop_Test>.
WARNING:Xst:1336 -  (*) More than 100% of Device resources are used`

**Environment:**
 - Windows 10
 - ISE 14.7

neorv32_wdt component not VHDL-08 compliant

During experiments to synthesize the project with GHDL & Yosys I found that the Watchdog timer unit cannot analyzed when VHDL-08 standard is used. The record type for the control register uses the now reserved keyword force:

  -- control register --
  type ctrl_reg_t is record
    enable  : std_ulogic; -- 1=WDT enabled
    clk_sel : std_ulogic_vector(2 downto 0);
    mode    : std_ulogic; -- 0=trigger IRQ on overflow; 1=trigger hard reset on overflow
    rcause  : std_ulogic; -- cause of last system reset: '0' = external, '1' = watchdog
    reset   : std_ulogic; -- reset WDT
    force   : std_ulogic; -- force action
    lock    : std_ulogic; -- lock control register
  end record;

Changing force to a non-reserved word resolves the problem and neorv32 can be synthesized with Yosys & GHDL.

If you're interested I could contribute to synthesize the project with Yosys & GHDL.

Nice project by the way πŸ™‚

SDRAM controller for the ULX3S

Hello again! I am studying how to enable the 32MB of SDRAM in the ULX3S, and I found in other projects interesting codes in VHDL that access to the ULX3S SDRAM (https://github.com/nullobject/sdram-fpga), but those are not Wishbone compatible (or at least in not mentioned). I found in the file "rtl/processor_templates/neorv32_ProcessorTop_MinimalBoot.vhd" that we have "MEM_EXT_EN" that suppose to be the connection with that SDRAM.
I would like to implement the controller to link the wishbone external memory with the VHDL ULX3S SDRAM. If its OK I start to do it and hopefully if my work allows me do a PR soon, but I will need a bit support. Do you like the idea?

OrangeCrab, bootloader and QSPI

Coming from #98.

#98 (comment)

And one problem for me to work on is that I have not tested anything to do with the flash (in this case, W25Q128JVP). Does this core/bootloader support QSPI? I ask because I think the default USB bootloader on the OrangeCrab switches the flash to QSPI mode, so if this original bootloader is kept, then the neorv32 core will not be able to communicate with the flash if it can't do QSPI. As far as I can tell there is no way to reset the flash back to normal SPI from the FPGA, it must be power cycled (which will then invoke the original bootloader to switch the flash into QSPI, etc).

Ideally I would like to keep the USB bootloader, and then store the neorv32 bit file at an offset in the flash past this bootloader, and then store the actual executable at a further offset in the flash (it's a 16MByte flash, so there should be plenty of room for all of this). I assume that the steps to do this are something like the following

  1. Adjust the bootloader code to read/write into an offset of the flash (which will be original bootloader size + FPGA bitfile size)
  2. and/or adjust the core to add this offset to all flash read/writes

Any ideas, suggestions or pointers here would be appreciated.

#98 (comment)

I see that I should have read the documentation closer around the flash offset: https://stnolting.github.io/neorv32/ug/#_customizing_the_internal_bootloader

#98 (comment)

I should have also read the flash datasheet further as well… it seems that SPI commands are always accepted. So I’m thinking that all I need to do to get application loading from flash is to rebuild the bootloader with the correct flash offset, then copy that newly built executable into the vhd file which contains the bootloader, and it should work from there?

/cc @jeremyherbert

Example(s) for using an external DDR memory

Coming from #98.

#98 (comment)

The OrangeCrab has an external DDR with 128 MB. Hence, the mid-term goal should be to append a controller to the external bus of the NEORV32 and have the IMEM and/or DMEM assigned there.

Note that we can have mixed-language designs. Therefore, we might use the same strategy as in antonblanchard/microwatt: they use litedram (see enjoy-digital/litedram).

#98 (comment)

That looks very good! I'm very happy that the memory controller supports Wishbone so there is no need for extra bridging logic.
I will check out the documentation. That would be also a nice add-on for the current Quartus and Vivado examples.

Distribution/installation of the GCC toolchain

Coming from #54

#54 (comment)
By the way, what do you think about having the pre-build GCC toolchain as submodule inside this repository? Maybe in sw/gcc?
Tha scripts (makefiles) could use that as default so new-user could do a simple recursive git clone and they would get everything as a bundle πŸ€”

#54 (comment)
That's something I wanted to bring in a different issue 🀣. So, why are you using your pre-built GCC toolchain? Do you need to customise it so that it understands NEORV32 as the target architecture? Or is it because of convenience? That is, could you use an "upstream" GCC? May NEORV32 be upstreamed?

This is a tool which your project depends on. It should not be a submodule inside the repository. Furthermore, most users should not install it through a custom script in this repo. Similarly to GHDL, Yosys, nextpnr, VUnit, etc. those should be installed independently. We want this project (and potentially any open source project) to be usable very regardless of the preferred environment of the user. Some will install system packages, others will use containers, MSYS2, Conda, Homebrew... They don't want to install those tools each time, but (very) infrequently. In that context, you are currently providing a single build for a very specific subset of environments.

Please, don't take me wrong. This is absolutely normal. Most open source EDA tooling projects are not properly packaged yet. Some (a few) are available on some (a few) popular distributions. There are efforts such as HDL's bazel and conda repos, or YosysHQ's oss-cad-toolchain. Yet, each of them is an ecosystem for the domain the maintainers/supporters are interested in.

Should you need to distribute a custom GCC because you need it customised, I would recommend that we add the generation of a container image and an MSYS2 package to you other repo. Then, consume those as any user will do. In fact, this is one of the main purposes of CI: to reproduce the experience you expect users to have on different platforms.

#54 (comment)
Then let's discuss that in a new issue. πŸ˜„

#54 (comment)

This is a tool which your project depends on. It should not be a submodule inside the repository.

Yeah right. You convinced me. πŸ˜‰

Feature Request: Expanded CFS I/O

Having only two 32-bit ports, one input and one output, for the CFS is a little limiting. I know I can just modify the design and add whatever I want, But, it would be nice if the core allowed more CFS I/O without core modification.

Some like:
Add this type to neorv32_package.vhd:
type cfs_io_t is array (integer range <>) of std_ulogic_vector(31 downto 0);

Add new generics to neorv32_top:

    IO_CFS_IN_VECS							 : positive := 1;
    IO_CFS_OUT_VECS							 : positive := 1;`

Change CFS I/O ports to:

    cfs_in_i    : in  cfs_io_t(0 to IO_CFS_IN_VECS-1) := (others => (others => '0')); -- custom CFS inputs conduit
    cfs_out_o   : out cfs_io_t(0 to IO_CFS_OUT_VECS-1); -- custom CFS outputs conduit

And, of course, update the port hierarchy, for the CFS to match.

This way end users could have as many CFS 32-bit I/O ports as they wished.

Do we really need wrappers for the top entity?

I have some doubts regarding the current concept of the processor wrapper, i.e. rtl/templates/processor and rtl/templates/system. Currently, the rtl/templates/processor folder mainly provides wrappers, which have a simplified interface (like only exposing the UART and some GPIOs) but always do some very specific CPU/processor configuration. It feels like these are "prebuilt processor configurations" - like the ATTINY 13A-PU is a prebuilt processor configuration of the AVR family.

I think it would be much cleaner to always instantiate the processor top entity neorv32_top in all example setups.

My proposal:

  1. Modify the processor's top entity so that all configuration options are disabled by default.
  2. Remove the rtl/templates/processor and rtl/templates/system folders and all wrappers inside.
  3. Provide a single folder (like rtl/wrappers) that only contains the following three wrappers:
  • The test setup (currently rtl/templates/processor/neorv32_ProcessorTop_Test.vhd) because this is used for the tutorial in the user guide.
  • The wrapper providing resolved interface signals (currently rtl/templates/processor/neorv32_ProcessorTop_stdlogic.vhd).
  • The AXI4-Lite wrapper (currently rtl/templates/system/neorv32_SystemTop_axi4lite.vhd). I know this is not a wrapper in the classical definitions, but this unit does not instantiate any further modules I think this is ok.

The processor top entity already provides default values for all incoming & outgoing signals. If we add 1.) then all instances of the processor only have to use the generics and signals that are actually required for the setup. For example, the instantiation of the processor in the "test setup" (rtl/templates/processor/neorv32_ProcessorTop_Test.vhd) could be simplified to look like this:

  neorv32_top_inst: neorv32_top
  generic map (
    -- General --
    CLOCK_FREQUENCY              => 100000000,   -- clock frequency of clk_i in Hz
    INT_BOOTLOADER_EN            => true,        -- boot configuration: true = boot explicit bootloader; false = boot from int/ext (I)MEM
    -- RISC-V CPU Extensions --
    CPU_EXTENSION_RISCV_C        => true,        -- implement compressed extension?
    CPU_EXTENSION_RISCV_M        => true,        -- implement muld/div extension?
    CPU_EXTENSION_RISCV_Zicsr    => true,        -- implement CSR system?
    -- Hardware Performance Monitors (HPM) --
    HPM_NUM_CNTS                 => 4,           -- number of implemented HPM counters (0..29)
    HPM_CNT_WIDTH                => 40,          -- total size of HPM counters (0..64)
    -- Internal Instruction memory --
    MEM_INT_IMEM_EN              => true,        -- implement processor-internal instruction memory
    MEM_INT_IMEM_SIZE            => 16*1024,     -- size of processor-internal instruction memory in bytes
    -- Internal Data memory --
    MEM_INT_DMEM_EN              => true,        -- implement processor-internal data memory
    MEM_INT_DMEM_SIZE            => 8*1024,      -- size of processor-internal data memory in bytes
    -- Processor peripherals --
    IO_GPIO_EN                   => true,        -- implement general purpose input/output port unit (GPIO)?
    IO_MTIME_EN                  => true,        -- implement machine system timer (MTIME)?
    IO_UART0_EN                  => true         -- implement primary universal asynchronous receiver/transmitter (UART0)?
  )
  port map (
    -- Global control --
    clk_i       => clk_i,                        -- global clock, rising edge
    rstn_i      => rstn_i,                       -- global reset, low-active, async
    -- GPIO (available if IO_GPIO_EN = true) --
    gpio_o      => gpio_out,                     -- parallel output
    -- primary UART0 (available if IO_UART0_EN = true) --
    uart0_txd_o => uart0_txd_o,                  -- UART0 send data
    uart0_rxd_i => uart0_rxd_i                   -- UART0 receive data
  );

I think this is much cleaner and easier to understand. I also see no real advantage for using the current templates/processor wrappers in the os-flow setups.

Of course we can add further wrappers. But only if these wrappers really provide a feature, that is not available when using "plain instantiation" of the processor (like different interface type or different interface protocols).

What do you think? πŸ€”

simulation cycle signal of instruction memory

The external Instruction memory (a) should check for the it valid cycle signal not for the b external memory signal:

if (ext_mem_a.ack(ext_mem_a_latency_c-1) = '1') and (wb_mem_b.cyc = '1') and (wb_mem_a.ack = '0') then

+(wb_mem_a.cyc = '1')
-(wb_mem_b.cyc = '1')

If its is correct I could generate a PR.

all the best,

ghdl simulation failure

I tried running the script ghdl_sim.sh on Ubuntu (WSL 18.04) and it gave and error about --max-sstacck-alloc=0' so I tried running it with that option and it output this message after running starting the simulation that at GHDL Bug occurred.

I was using GHDL 0.35. I got 4 output files 2 empty output files and one for the uart.out with a single statement. Is this the correct way this simulation should run?

-rw-rw-rw- 1 ssheikh ssheikh 8992 Jan 11 11:44 neorv32-obj93.cf
-rwxrwxrwx 1 ssheikh ssheikh 0 Jan 11 11:45 neorv32.uart.sim_mode.text.out
-rwxrwxrwx 1 ssheikh ssheikh 0 Jan 11 11:45 neorv32.uart.sim_mode.data.out
-rwxrwxrwx 1 ssheikh ssheikh 26 Jan 11 12:01 neorv32.testbench_uart.out
ssheikh@GSLWL2020070597:~/neorv32/sim/ghdl$ more neorv32.testbench_uart.out
Blinking LED demo program

ghdl -r --work=neorv32 neorv32_tb --ieee-asserts=disable --assert-level=error $SIM_CONFIG
/home/ssheikh/neorv32/sim/ghdl/../../rtl/core/neorv32_cpu.vhd:170:3:@0ms:(assertion warning): NEORV32 CPU CONFIG WARNING! Atomic operations extension (A) only supports >lr.w< and >sc.w< instructions yet.
/home/ssheikh/neorv32/sim/ghdl/../../rtl/core/neorv32_cpu.vhd:179:3:@0ms:(assertion note): NEORV32 CPU CONFIG NOTE: Implementing physical memory protection (PMP) with 2 regions and 65536 bytes minimal region size (granulartiy).
/home/ssheikh/neorv32/sim/ghdl/../../rtl/core/neorv32_wishbone.vhd:141:3:@0ms:(assertion note): NEORV32 PROCESSOR CONFIG NOTE: Implementing external memory interface using STANDARD Wishbone protocol.
/home/ssheikh/neorv32/sim/ghdl/../../rtl/core/neorv32_wishbone.vhd:145:3:@0ms:(assertion note): NEORV32 PROCESSOR CONFIG NOTE: Using BIG-ENDIAN byte order for external memory interface.
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@1342745ns:(report note): NEORV32_TB_UART.TX: B
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@1915955ns:(report note): NEORV32_TB_UART.TX: l
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@2489165ns:(report note): NEORV32_TB_UART.TX: i
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@3062375ns:(report note): NEORV32_TB_UART.TX: n
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@3635585ns:(report note): NEORV32_TB_UART.TX: k
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@4208795ns:(report note): NEORV32_TB_UART.TX: i
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@4782005ns:(report note): NEORV32_TB_UART.TX: n
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@5355215ns:(report note): NEORV32_TB_UART.TX: g
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@5928425ns:(report note): NEORV32_TB_UART.TX:
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@6501635ns:(report note): NEORV32_TB_UART.TX: L
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@7074845ns:(report note): NEORV32_TB_UART.TX: E
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@7648055ns:(report note): NEORV32_TB_UART.TX: D
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@8221265ns:(report note): NEORV32_TB_UART.TX:
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@8794475ns:(report note): NEORV32_TB_UART.TX: d
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@9367685ns:(report note): NEORV32_TB_UART.TX: e
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@9940895ns:(report note): NEORV32_TB_UART.TX: m
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@10514105ns:(report note): NEORV32_TB_UART.TX: o
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@11087315ns:(report note): NEORV32_TB_UART.TX:
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@11660525ns:(report note): NEORV32_TB_UART.TX: p
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@12233735ns:(report note): NEORV32_TB_UART.TX: r
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@12806945ns:(report note): NEORV32_TB_UART.TX: o
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@13380155ns:(report note): NEORV32_TB_UART.TX: g
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@13953365ns:(report note): NEORV32_TB_UART.TX: r
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@14526575ns:(report note): NEORV32_TB_UART.TX: a
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:297:15:@15099785ns:(report note): NEORV32_TB_UART.TX: m
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:295:15:@15672965ns:(report note): NEORV32_TB_UART.TX: (13)
/home/ssheikh/neorv32/sim/ghdl/../../sim/neorv32_tb.vhd:295:15:@16246165ns:(report note): NEORV32_TB_UART.TX: (10)

******************** GHDL Bug occured ****************************
Please report this bug on https://github.com/tgingold/ghdl/issues
GHDL release: 0.35 (Ubuntu 0.35+dfsg-1~build3) [Dunoon edition]
Compiled with GNAT Version: 7.3.0
Target: x86_64-linux-gnu
In directory: /home/ssheikh/neorv32/sim/ghdl/
Command line:
/usr/bin/ghdl-mcode -r --work=neorv32 neorv32_tb --ieee-asserts=disable --assert-level=error
Exception CONSTRAINT_ERROR raised
Exception information:
raised CONSTRAINT_ERROR : grt-processes.adb:770 overflow check failed
Call stack traceback locations:
0x7f51e547c42e 0x7f51e547cbd4 0x7f51e547ce4a 0x7f51e547d02c 0x7f51e5412a4a 0x7f51e54bc4bd 0x7f51e56f2fea 0x7f51e56df51f 0x7f51e56d0dcd 0x7f51e56fcb9e 0x7f51e541266f 0x7f51e3631b95 0x7f51e5411498 0xfffffffffffffffe


mtime_o could be instable

You have export the mtime_o to top instance and I thank you for that ! It helps me a lot anf avoid to add a timer in my project.

But I observed instabilities, probably because 'time_o' in the file "neorv32_mtime.vhd" is not in a synchronous process...
Although, I read it in a synchronous process. It is always when the msb words 'mtime_hi' updates that it reads a bad value.

To validate a good reading whithout changing something in the core, I added a process to check mtime_o change only by '1' between two clock ticks. But it is a little messy to add this process to validate the ntime output.

I don'k know why it is this instability... Maybe putting the line 167 (' time_o <= mtime_hi & mtime_lo(31 downto 00); ') in a synchronous process ?

Missing memory section for .rodata in neorv32.ld

Hello,

I've been trying to run some software examples on a Fomu.im board. After some experimenting i realized that the neorv32_uart_print() outputs were missing. After some debugging i realized that the static strings where looked for in the DMEM section although they are read only. As only the IMEM gets filled through the bootloader these data were missing.

After some research i found that unmapped sections get mapped to the first defined memory region which has the correct attributes. Link here:
https://users.informatik.haw-hamburg.de/~krabat/FH-Labor/gnupro/5_GNUPro_Utilities/c_Using_LD/ldLinker_scripts.html#MEMORY_command

If an unmapped section matches any of the listed attributes other than '!', it will be placed in the memory region.

Because the linker file defines the ram section first which also has the r attribute the .rodata section (which includes the static strings) is suitable. Here is a snippet from the linker script:

{
/* section base addresses and sizes have to be a multiple of 4-bytes */
/* ram section: first value of LENGTH => data memory used by bootloader (fixed!); second value of LENGTH => *physical* size of data memory */
/* adapt the right-most value to match the *total physical data memory size* of your setup */
  ram  (rwx) : ORIGIN = 0x80000000, LENGTH = DEFINED(make_bootloader) ? 512 : 4*1024
/* rom and iodev sections should NOT be modified by the user at all! */
/* rom section: first value of ORIGIN/LENGTH => bootloader ROM; second value of ORIGIN/LENGTH => maximum *logical* size of instruction memory */
  rom   (rx) : ORIGIN = DEFINED(make_bootloader) ? 0xFFFF0000 : 0x00000000, LENGTH = DEFINED(make_bootloader) ? 32K : 2048M
  iodev (rw) : ORIGIN = 0xFFFFFE00, LENGTH = 512
}

By changing the order and defining "rom" first, the linker would place the .rodata section in the rom, which is correct in my opinion for static read-only data. But this approach would not remove the root of the problem (the unspecified memory section), but only work for this case.

So my solution would be to remove these unmapped sections:

.rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
.rodata1        : { *(.rodata1) }

An add the wildcards to the mapped section below:

  /* read-only data, appended to text */
  .rodata :
  {
    *(.rodata .rodata.* .gnu.linkonce.r.*)
    *(.rodata1)

    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
    KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
    PROVIDE_HIDDEN (__init_array_end = .);

    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
    KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
    PROVIDE_HIDDEN (__fini_array_end = .);

    /* finish section on WORD boundary */
    . = ALIGN(4);
  } > rom

In my tests this approach led to correct placements and the neorv32_uart_print() functions were working. Am I missing something here or is this a real bug?

HDL documentation (teroshdl-documenter?)

Currently, there is no explicit documentation of the (V)HDL source files beyond a lot of in-code comments. I have tried using DOXYGEN also for the HDL files - but that is not really pretty: the actual source files would be stuffed with DOXYGEN macros and the resulting documentation is somehow special... Since DOXYGEN is targeting software, this is ok.

Recently, I stumbled across this: https://github.com/TerosTechnology/teroshdl-documenter-demo
They even used this project as an example: https://terostechnology.github.io/teroshdl-documenter-demo/NEORV32_doc/index.html ❀️ And I really have to say: this looks very good! Finally a nice (and pretty!) way of documenting HDL sources πŸ‘

Does anyone already have some experience with @TerosTechnology and especially with their documenter? Is there any option (yet) to include that into a Github workflow? πŸ€”

Missing documentation and Makefiles for iCE40 and ECP5 Lattice FPGAs

Hello everybody, first, thanks for this amazing work!
Well, I have at home the board AlhambraII (iCE40) and the ULX3S (ECP5), I am using Yosys with the GHDL plugin. I wanted to synthesize using Yosys and NextPNR for those boards, but couldn't find a start point to do it.
Please, if anyone support me I would like to do those Makefiles.
Thanks!

Semver compliance

Ref #33 #36

Currently, versions have four numbers/fields. I guess they represent relevance from left to right. So, changes in the first field imply breaking changes, the second implies enhancements or additions, the third one represents bugfixes and the last one is "hidden" work (added to the codebase but not enabled by default)?

Unfortunately, such format is not semver compliant. See https://semver.org/. Precisely, https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string, which is implemented in the following test:

import re

def testSemVer(version):
    print(f"{version} ", end='')
    rexp = r"^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$"
    semver = re.search(rexp, version)
    if semver == None and version[0] == 'v':
        semver = re.search(rexp, version[1:])
    tag = version
    if semver == None:
        print('! Could not get semver from %s' % version)
    else:
        if semver.group('prerelease') is None:
            print("! Release")
        else:
            print("! Prerelease")

testSemVer("v1.0.0")
testSemVer("v1.0.0.0")
testSemVer("v1.0.0rc1")
testSemVer("v1.0.0-rc1")
# python testsemver.py 
v1.0.0 ! Release
v1.0.0.0 ! Could not get semver from v1.0.0.0
v1.0.0rc1 ! Could not get semver from v1.0.0rc1
v1.0.0-rc1 ! Prerelease

Being semver compliant would make it easier to reuse existing libraries for bumping, comparing, managing... versions. However, there are known projects which are not exactly compliant, or which use a double format. For instance, MSYS2 uses pacman (the same as Arch Linux) and vercmp: https://archlinux.org/pacman/vercmp.8.html. There, it's common to find versions such as 1.0.0.r257.g82665d42-1. As you might expect, those are created from a semver compliant tag 1.0.0, plus the number of commits since that tag r257, plus the commit SHA prepended with g. The last item, -1 is the pkgrel field, for forcing rebuilds.

Since you are already tagging *.0 versions only, it would be easy to change into removing the last field from the tags. Then, the "long version" would be generated automatically, without hardcoding it in the sources. It's up to you to append r257 only, the SHA only, or both of them.

For reference:

# git describe --long --tags  | sed 's#\([^-]*-g\)#r\1#; s#-g#.g#g;'
v1.5.5.0-r89.ga18c153
# NOT semver compliant

So, changing from v1.5.5.0 to v1.5.5:

# git describe --long --tags
v1.5.5-89-ga18c153
# semver compliant

# git describe --long --tags  | sed 's#\([^-]*-g\)#r\1#;'
v1.5.5-r89-ga18c153
# semver compliant

# git describe --long --tags  | sed 's#\([^-]*-g\)#r\1#; s#-g#.g#g;'
v1.5.5-r89.ga18c153
# semver compliant

I know that changing the versioning format can be painful. Yet, if it needs to be discussed, better do it now than later. Once it is made explicit (#33) it will be worse to change.

The project with the core is not going to Vivado 2019.1

Describe the bug
I tried to reproduce the project from the description in Vivado 2019.1, but got parameter type conversion errors:
[IP_Flow 19-1837] Failed to convert long value '0' to HDL value. Missing bit length for conversion.
[IP_Flow 19-3814] Failed to get HDL value for model parameter 'IO_CFS_CONFIG'.
[IP_Flow 19-3814] Failed to get HDL value for model parameter 'HW_THREAD_ID'.
[IP_Flow 19-3814] Failed to get HDL value for model parameter 'IO_CFS_CONFIG'.
Perhaps this is due to the fact that my block project is converted to Verilog (and yours to VHDL).

To Reproduce
To reproduce it, it is enough to specify in the Vivado settings that convert the block project to Verilog.

Expected behavior
For compatibility with different languages, it would like to fix this problem.

Thank you for the project!

Version management, maybe JSON-for-VHDL and/or pyVersioning

While reviewing the latest changes, I found that the version is manually bumped in several places.

On the one hand, there is project JSON-for-VHDL, which allows writing (meta)data in a JSON file and then accessing it from VHDL. In fact, the JSON content can be passed as an string top-level generic, or as a file. It is synthesisable, so it can be used for setting parameters/generics in the design. However, it does not take any area. That is, it is not a JSON core. It's a library that is executed at compilation/synthesis time.

On the other hand, @Paebbels has pyVersioning for handling version management across multiple languages (VHDL, C, Python...). It is meant, precisely, for bumping the version in the HDL source, the C drivers, the docs, etc. all consistently.

In the mid term, it might be interesting to consider these or other similar alternatives.

Processor Boot Concept

This is a "design note" inspired by #56 (especially #56 (comment) and #56 (comment)).

Currently, the processor provides 3 boot options:

  1. Use the bootloader (BOOTLOADER_EN => true) to upload executables via UART or from external SPI flash. In this scenario the internal IMEM is implemented as UNinitialized RAM.
  2. No bootloader (BOOTLOADER_EN => true). IMEM is implemented as initialized RAM (initialized with actual executable). The content of the RAM can be modified by software as it is a RAM.
  3. No bootloader (BOOTLOADER_EN => true). IMEM is implemented as initialized ROM (MEM_INT_IMEM_ROM => true, initialized with actual executable).

I do not see any practical use case for option 2, so I think this could be removed?! πŸ€”

If option 2 is not needed anymore, the boot configuration could be simplified by replacing BOOTLOADER_EN and MEM_INT_IMEM_ROM generics by a single boot config generic (what name? what type?).

Handle riscv-arch-test as a git submodule

Rather than a feature request, this is a topic for discussion. It seems that riscv/riscv-arch-test might be handled as a submodule in subdir riscv-arch-test/riscv-arch-test or riscv-arch-test/work/riscv-arch-test. That would provide better control over the version of it that is retrieved. @stnolting any reason not to use submodules?

Windows workflow keeps failing

The FPGA implementation part of the Windows workflow keeps failing (cut-out from https://github.com/stnolting/neorv32/runs/3562298603?check_suite_focus=true#step:5:27).

yosys -m ghdl.so \
  -p \
  "ghdl --std=08 --no-formal neorv32_UPduino_BoardTop_MinimalBoot; \
  synth_ice40 \
  -top neorv32_UPduino_BoardTop_MinimalBoot -dsp \
  -json neorv32_UPduino_v3_MinimalBoot.json"  2>&1 | tee yosys-report.txt
ERROR: 
  This version of Yosys cannot load plugins at runtime.
  Some plugins may have been included at build time.
  Use option `-H' to see the available built-in and plugin commands.

Is this a package problem?!
@umarcor could you have a look? πŸ™ƒ

Third party build cannot be uploaded

Hello Stephan,
I hope you are well.

I managed to build the blink_led example on Segger's EmbeddeStudio, however when I upload it to NEORV32 via UART I receive error_0 which is related to the executable signature. Is there a way to resolve this? Is this approach actually valid? I used the settings you recommend like ilp32 ABI and rv32i in the IDE and used your linker and startup file also in the IDE.

Thanks a lot!

Large demo including multiple software apps and multiple bitstreams in the external SPI flash

This is an idea based on:

#53 (comment)
This was I am trying right now. Put an executable to external SPI flash via the FPGA programming interface and fetch that via the bootloader to execute it. I would love to have a setup where you only need to program "one file" to the flash (bitstream(s) + executable(s)) to tinker around with the board.

By combining that with instantiating the warm boot component, it would be possible to create a "bitstream" which includes multiple bitsreams as well as multiple software applications. Depending on the currently active design, it would be possible to swap the software, or to jump to a different design while preserving BRAM/SPRAM data. So, for example, one NEORV32 could prepare data for loading an smaller NEORV32 with some custom peripheral, and then handle the control to them. Moreover, some designs might be based on NEORV32, while others on Silice's demos.

Naturally, this is just a proof of concept for illustrating features/capabilities which are technically possible on UP5K FPGAs. It's neither urgent nor necessary.

SIMD/Vector extension

Could NEORV32 support SIMD or vector extension in the future, or is it not possible/not on the roadmap?

Need help in uploading the .elf file

Hi,
I have problems in compiling when using Quartus 20.1 prime lite, but it didn't show any error message when using 16.1 lite versionπŸ˜…. So currently I am using Quartus16.0 lite version, I can load the .sof file into Altera DE2-115 board, however I could not find a way to load the .elf file into FPGA board.
Must appreciate if can get anyone of you to help help.
Thanks a lot i say to you all.
Regards,
Lee.

Radiant setup fails to build with Radiant 2.2.1.239.2

Describe the bug

Building the project fails at the last step ("Export Files"), all prior steps work.

The build output:

************************************************************
**  Gate-Level Simulation File                            **
************************************************************

backanno "neorv32_upduino_v3_impl_1.udb"  -o "neorv32_upduino_v3_impl_1_vo.vo"      -sp "High-Performance_1.2V"  -w -neg
backanno: version Radiant Software (64-bit) 2.2.1.239.2

Loading neorv32_upduino_v3_impl_1.udb ...
Loading device for application GENERIC from file 'itpa08.nph' in environment: /home/plam/lscc/radiant/2.2/ispfpga.
Package Status:                     Preliminary    Version 1.5.
Performance Hardware Data Status:   Advanced       Version 1.0.

Design:  neorv32_upduino_v3_top
Family:  iCE40UP
Device:  iCE40UP5K
Package: SG48
Performance Grade:   High-Performance_1.2V
WARNING - Unable to find the instance/port 'flash_sdi_i' in the constraint 'ldc_set_location -site {17} [get_ports flash_sdi_i]'

WARNING - In the constraint 'ldc_set_location -site {17} [get_ports flash_sdi_i]', the locate object is not specified

Writing a verilog netlist based on the neorv32_upduino_v3_impl_1 design file.

Writing Verilog netlist to file neorv32_upduino_v3_impl_1_vo.vo
Writing SDF timing to file neorv32_upduino_v3_impl_1_vo.sdf
malloc_consolidate(): unaligned fastbin chunk detected
Done: error code -1

To Reproduce

Follow the build instructions described here: https://github.com/stnolting/neorv32/tree/master/setups/radiant/UPduino_v3
while using Radiant 2.2.1.239.2

Expected behavior

I expected the build to succeed and create output files

Screenshots

image

Environment:

  • Fedora 34
  • Radiant 2.2.1.239.2

Hardware:

  • UPduino 3.0

Additional context

Constraints file for OrangeCrab r0.2

Coming from #98.

The naming of the GPIO ports in the OrangeCrab constraints file does currently not match the naming in the silkscreen. That is confusing. For instance, *_GPIO_4 is used in the MinimalBoot example, which corresponds to pin labeled 9 on the board. This issue is for keeping track of the updates that might be required after orangecrab-fpga/orangecrab-examples#20 is resolved.

#98 (comment)

with respect to the constraints file, I would suggest adding a note to the readme or similar about this. The main issue is that, for example, the silkscreen pin numbers do not have a pin 4 anywhere; the only numbered GPIO pins on the silkscreen are 0, 1, 5, 6, 9, 10, 11, 12, 13; the rest have names like SCL, SDA or are muxed into an external ADC. I personally would suggest deleting the lines that were commented out in my previous comment, and just using the ones that were not commented as these match the silkscreen. But I am nonetheless happy whichever way makes the most sense to everyone.

#98 (comment)

Note: The constraints file for the OrangeCrab doesn't match the silkscreen for some pins (pin 9 is one of them). The correct constraints are in this pinout picture: https://gregdavill.github.io/OrangeCrab/r0.2/docs/pinout/

I filed a bug for that here: orangecrab-fpga/orangecrab-examples#20

#98 (comment)

It is particularly confusing to have GPIO as an array of 13 bits, if ~8 of them have other purposes. My proposal is:

  1. Have it clarified/fixed in PCF files do not match the actual pinout for GPIOs gregdavill/OrangeCrab-examples#20.
  2. Update https://github.com/gregdavill/OrangeCrab-examples/blob/main/verilog/orangecrab_r0.2.pcf and https://github.com/hdl/constraints/blob/main/board/OrangeCrab/constraints.lpf.
  3. Update here.

In fact, my expectation is to submodule hdl/constraints at some point. That's why I'm picking the constraints files from there, and maintaining the naming scheme. Overall, maintaining constraint files and board metadata should be out of scope of this repository. We do need those resources, but the effort devoted to it in the context of NEORV32 should be minimal.

/cc @jeremyherbert

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.