SkillAgentSearch skills...

Ravenoc

RaveNoC is a configurable HDL NoC (Network-On-Chip) suitable for MPSoCs and different MP applications

Install / Use

/learn @aignacio/Ravenoc
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

Regression Tests lint-sv lint-editorconfig codecov

Gitter chat

<img align="right" alt="ravenoc_logo" src="docs/img/ravenoc_readme.svg"/>

RaveNoC - configurable Network-on-Chip

Table of Contents

<a name="quick"></a> Quickstart regression

To run the regression tests for the NoC, please follow the sequence below:

$ cd ravenoc_project_folder
$ docker run --rm --name ravenoc_run -v $(pwd):/ravenoc -w /ravenoc aignacio/ravenoc tox

To run a specific test, use the Makefile, replacing the SPEC_TEST variable by the name/flavor of the test you want then:

make all
<!--- ```bash # You should have python 3 installed to continue # Install verilator 4.106 $ sudo apt install -y --no-install-recommends make g++ perl python3 autoconf flex bison libfl2 libfl-dev zlibc zlib1g zlib1g-dev $ git clone https://github.com/verilator/verilator.git $ cd verilator $ git checkout v4.106 $ autoconf $ ./configure $ make -j $(nproc) $ sudo make install # Install tox $ python -m pip install --upgrade pip $ pip install tox tox-gh-actions # Run the regression with tox $ cd ravenoc $ tox ``` --->

Once it is running, it will create the run_dir folder with all the logs and waveforms (in .fst format) for each of the runs. To get more details of the tests please read Tb readme.

<a name="intro"></a> Introduction

RaveNoC is a configurable HDL for mesh NoCs topology that allows the user to change parameters and setup new configurations. In summary, the features of the RaveNoC are:

  1. Mesh topology (2D-XY)
  2. Valid/ready flow control
  3. Switching: Pipelined wormhole
  4. Virtual channel flow control
  5. Slave I/F AMBA AXI4
  6. Different IRQs that can be muxed/masked individually
  7. Support multiple clock configurations (CDC)
  8. Configurable parameters:
    • Flit/AXI data width
    • Number of buffers in the input module
    • Number of virtual channels
    • Order of priority in the VCs
    • Dimensions of the NoC (Rows_X_Cols)
    • Routing algorithm
    • Maximum size of packets

<a name="usg"></a> Integration

The RTL top file exports arrays of inputs/outputs of an AXI4 slave interface that has length equal to the number of routers in the NoC i.e Rows X Cols. Also as an input parameter of ravenoc module, there is AXI_CDC_REQ array which is used to specify if each router need or not the CDC async gp fifo due to cross clock domain aspect.

There is a single clock/async. reset for the NoC and an array of clocks/async. resets for the AXIs due to the fact that every router can have a different clock domain. An additional input called bypass_cdc is used in the testbench but it is not recommended to be used during integration once if CDC is not required, the user should change the AXI_CDC_REQ parameter as mentioned in the specific array index.

For every router a set of CSRs (Control and Status registers) are available which can be individually programmable per unit. The list of CSRs available are: | CSR | Address | Description | Default | Permissions | |:---------------:|:----------------------------------------------------------:|:-----------------------------------:|:-------:|:-----------:| | RAVENOC_VERSION | AXI_CSR_BASE_ADDR](src/include/ravenoc_defines.svh)+'h0 | RaveNoC HW version | 1.0 | Read-Only | | ROUTER_ROW_X_ID | [AXI_CSR_BASE_ADDR+'h4 | Row / X - ID of the Router | 0 | Read-Only | | ROUTER_COL_Y_ID | AXI_CSR_BASE_ADDR](src/include/ravenoc_defines.svh)+'h8 | Column / Y - ID of the Router | 0 | Read-Only | | IRQ_RD_STATUS | [AXI_CSR_BASE_ADDR+'hC | Returns the IRQ value per VC | -- | Read-Only | | IRQ_RD_MUX | AXI_CSR_BASE_ADDR](src/include/ravenoc_defines.svh)+'h10 | Controls the input mux of IRQs | DEFAULT | R/W | | IRQ_RD_MASK | [AXI_CSR_BASE_ADDR+'h14 | Controls the input mask of the IRQs | 'hFFFF | R/W | | WR_BUFFER_FULL | AXI_CSR_BASE_ADDR](src/include/ravenoc_defines.svh)+'h18 | Indicates if the wr. buffer is full | 0 | Read-only | | IRQ_PULSE_ACK | [AXI_CSR_BASE_ADDR+'h1C | When IRQ=PULSE_HEAD, ack the inter. | 0 | Write-only |

See the SV structs to understand the possible values for the IRQ_RD_MUX.

<a name="pluscsrs"></a> Additional CSRs

There are some additional CSRs which are generated based on the number of virtual channels that the NoC is configured. Each CSR is connected to the read pointer FIFO element bits that indicate the size of the packet of each individual VC read FIFO. They are read-only CSRs and the start address is right after the default CSR table above. For instance, in a NoC with 4xVCs the CSRs are the ones listed below: | CSR | Address | Description | Default | Permissions | |:----------------:|:-------------------------:|:-------------------------:|:-------:|:-----------:| | RD_SIZE_VC_PKT_0 | AXI_CSR_BASE_ADDR](src/include/ravenoc_defines.svh)+'h20 | Size of the packet in VC0 | 0 | Read-Only | | RD_SIZE_VC_PKT_1 | [AXI_CSR_BASE_ADDR+'h24 | Size of the packet in VC1 | 0 | Read-Only | | RD_SIZE_VC_PKT_2 | AXI_CSR_BASE_ADDR](src/include/ravenoc_defines.svh)+'h28 | Size of the packet in VC2 | 0 | Read-Only | | RD_SIZE_VC_PKT_3 | [AXI_CSR_BASE_ADDR+'h2C | Size of the packet in VC3 | 0 | Read-Only |

Considering the example above, to get the size of the packet in the virtual channel 3, the user must read the address AXI_CSR_BASE_ADDR+'h24.

<a name="irqs"></a> IRQs

In the top level it is available an array of IRQs (Interrupt Request Signals) that is a struct which is connected to every router / AXI modules of the NoC. All the IRQs are related to the AXI read VC buffers of the router. Two CSRs mentioned previously are important to configure the IRQ behavior in each router. The IRQ_RD_MUX selects which is the input source for the IRQs, that can be either the empty or full flags of the read AXI buffers or a comparison with the number of flits available to be read at the read buffer. And the IRQ_RD_MASK is an input mask that does the AND logical operation with every bit of the output of IRQ_RD_MUX and in case this one is set to comparison, the mask will represent the reference value. When the MUX is selected to IRQ_PULSE_HEAD_FLIT, the IRQ needs to be acknowledged by writing any value into the IRQ_PULSE_ACK CSR. The image down below tries to explain in a more ilustrative way: IRQs RaveNoC

<a name="confparam"></a> Configurable parameters

The following parameters are configurable and can be passed by compilation time as system verilog macros. Please check that not all parameters are indicated to change unless you have some interest to look inside the design to understand how it is used and wants to build something custom for one specific application. To check which are the default values for all the parameters, see the main defines file. | SV Macro | Description | Default Value | Range | |:---------------:|:------------------------------------------------------------------:|:---------------:|:------------------------------------------:| | FLIT_DATA_WIDTH | Flit data width in bits, AXI data width will be equal | 32 | (32,64) - 128 not tested | | FLIT_BUFF | Number of flits buffered in each virtual channel input fifo | 2 | (1,2,4,8...) - Must be a power of 2 | | N_VIRT_CHN | Number of virtual channels | 3 | (1,2,3,4...) - Up to 32 | | H_PRIORITY | Priority order on the virtual channels | ZeroHighPrior | ZeroHighPrior or ZeroLowPrior | | NOC_CFG_SZ_ROWS | Number of rows in the NoC - X | 2 | 1 (if cols > 1),2,3,4... - Any int. value | | NOC_CFG_SZ_COLS | Number of cols in the NoC - Y | 2 | 1 (if rows > 1),2,3,4... - Any int. value | | ROUTING_ALG | Routing algorithm of the input module | "XYAlg" | "XYAlg" or "YXAlg" | | MAX_SZ_PKT | Max number of flits per packet | 256 |

View on GitHub
GitHub Stars190
CategoryDevelopment
Updated4d ago
Forks39

Languages

SystemVerilog

Security Score

100/100

Audited on Mar 29, 2026

No findings