Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
232c0cf
Minor updates for new iDMA integration
May 6, 2025
7e79a8e
Updated drivers in idma_v2.h for 3D transfers support
May 8, 2025
d0e572f
Added ARCHI_HAS_DMA_DEMUX define for correct operation of iDMA in mul…
May 13, 2025
9301689
Updated idma drivers: removed software config of stream_idx (now fixe…
May 19, 2025
62ba9d9
Updated drivers for iDMA
May 29, 2025
7ec42df
Updated idma_v2 hal with plp_dma_wait functions depending on the dire…
May 30, 2025
da58e73
Updated drivers for iDMA
May 30, 2025
6abbb35
Fixed function name in idma_v2 drivers; Fix for ENTRY variable in def…
Jun 13, 2025
4fa7b42
Added QuestaOne option for pulp cluster
Sep 10, 2025
5ae59d8
Added QuestaOne options for pulp (SoC + Cluster)
Sep 16, 2025
e5f97cb
Added automatic linking of design.bin when simulating with QuestaOne
Nov 21, 2025
6bffcb9
Fix to avoid using numpy + fix for QuestaOne flow
RiccardoGandolfi Nov 21, 2025
7aaeac6
Added -c flag to qsim command when not defining gui
Nov 21, 2025
bd377c9
Fix on DMA demux offsets in pulp_cluster memory map
RiccardoGandolfi Jan 7, 2026
1aaaf27
Remapped iDMA registers for pulp_cluster instance
RiccardoGandolfi Dec 17, 2025
a9fd78f
Re-included mchan drivers for cluster + renaming of mchan hals to avo…
RiccardoGandolfi Dec 31, 2025
9d7c4f1
Renamed more functions in mchan drivers + aligned link.ld to standalo…
RiccardoGandolfi Jan 5, 2026
e0744fd
FIX PI_L2_MALLOC: now allocating from L2 shared instead of L2 priv0
RiccardoGandolfi Jan 5, 2026
8b03012
Added ARCHI_HAS_L2 define check + Added clearer indexes for L2 alloca…
RiccardoGandolfi Jan 21, 2026
422d221
Completed renaming of mchan drivers
RiccardoGandolfi Jan 21, 2026
e4eb5f4
Renamed macros for mchan
RiccardoGandolfi Jan 27, 2026
d293af5
[IDMA CLOCK GATING] Updated iDMA and Cluster Control unit drivers for…
RiccardoGandolfi Feb 25, 2026
483c17a
Add trace.h inclusion in alloc_pool.c
RiccardoGandolfi Apr 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions bin/slm_hyper.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#!/usr/bin/python3

#Written by ABA to update the format of the slm file to be compliant with hyperflash model used in testbench
import numpy as np
import os
import os.path
import argparse
Expand All @@ -24,7 +23,10 @@
with open(args.input_file, "rU") as fi:
data = list(map(lambda x:x.split(delimiter), fi.read().strip().split("\n")))
fo=open(args.output_file, "w")
A=np.array(data)

# Write the header
fo.write('@000000\n')
for i in range(0, A.shape[0],2):
fo.write('%s%s\n' %(A[i+1][1],A[i][1]))

# Iterate over rows in pairs
for i in range(0, len(data)-1, 2): # subtract 1 to avoid IndexError if odd number of rows
fo.write(f'{data[i+1][1]}{data[i][1]}\n')
4 changes: 4 additions & 0 deletions include/archi/chips/pulp_cluster/memory_map.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@
#define ARCHI_HMR_ADDR ( ARCHI_CLUSTER_PERIPHERALS_ADDR + ARCHI_HMR_OFFSET )
#define ARCHI_TCDM_SCRUBBER_ADDR ( ARCHI_CLUSTER_PERIPHERALS_ADDR + ARCHI_TCDM_SCRUBBER_OFFSET )
#define ARCHI_HWPE_HCI_ECC_ADDR ( ARCHI_CLUSTER_PERIPHERALS_ADDR + ARCHI_HWPE_HCI_ECC_OFFSET )
#define ARCHI_IDMA_EXT_ADDR ARCHI_MCHAN_EXT_ADDR

#define ARCHI_CLUSTER_CTRL_GLOBAL_ADDR(cid) ( ARCHI_CLUSTER_PERIPHERALS_GLOBAL_ADDR(cid) + ARCHI_CLUSTER_CTRL_OFFSET )
#define ARCHI_ICACHE_CTRL_GLOBAL_ADDR(cid) ( ARCHI_CLUSTER_PERIPHERALS_GLOBAL_ADDR(cid) + ARCHI_ICACHE_CTRL_OFFSET )
Expand All @@ -132,11 +133,14 @@

#define ARCHI_EU_DEMUX_OFFSET ( 0x00000 )
#define ARCHI_MCHAN_DEMUX_OFFSET ( 0x00400 )
#define ARCHI_IDMA_DEMUX_OFFSET ARCHI_MCHAN_DEMUX_OFFSET


#define ARCHI_DEMUX_PERIPHERALS_ADDR ( ARCHI_CLUSTER_ADDR + ARCHI_DEMUX_PERIPHERALS_OFFSET )

#define ARCHI_EU_DEMUX_ADDR ( ARCHI_DEMUX_PERIPHERALS_ADDR + ARCHI_EU_DEMUX_OFFSET )
#define ARCHI_MCHAN_DEMUX_ADDR ( ARCHI_DEMUX_PERIPHERALS_ADDR + ARCHI_MCHAN_DEMUX_OFFSET )

#define ARCHI_IDMA_DEMUX_ADDR ( ARCHI_DEMUX_PERIPHERALS_ADDR + ARCHI_IDMA_DEMUX_OFFSET )

#endif
2 changes: 2 additions & 0 deletions include/archi/chips/pulp_cluster/properties.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
#ifndef __ARCHI_CHIPS_PULP_PROPERTIES_H__
#define __ARCHI_CHIPS_PULP_PROPERTIES_H__

#define ARCHI_HAS_DMA_DEMUX 1

/*
* FPGA
*/
Expand Down
4 changes: 4 additions & 0 deletions include/archi/chips/pulp_cluster/pulp.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,12 @@
#include "archi/chips/pulp_cluster/memory_map.h"
#include "archi/chips/pulp_cluster/apb_soc.h"
#include "archi/stdout/stdout_v3.h"

#include "archi/dma/mchan_v7.h"

#include "archi/dma/idma_v2.h"


#include "archi/udma/cpi/udma_cpi_v1.h"
#include "archi/udma/i2c/udma_i2c_v2.h"
#include "archi/udma/i2s/udma_i2s_v2.h"
Expand Down
106 changes: 106 additions & 0 deletions include/archi/dma/idma_v2.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
// Generated register defines for idma_reg32_3d

// Copyright information found in source file:
// Copyright 2023 ETH Zurich and University of Bologna.

// Licensing information found in source file:
//
// SPDX-License-Identifier: SHL-0.51

#ifndef _IDMA_REG32_3D_REG_DEFS_
#define _IDMA_REG32_3D_REG_DEFS_

#ifdef __cplusplus
extern "C" {
#endif
// Number of dimensions available
#define IDMA_REG32_3D_PARAM_NUM_DIMS 3

// Register width
#define IDMA_REG32_3D_PARAM_REG_WIDTH 32

// Configuration Register for DMA settings
#define IDMA_REG32_3D_CONF_REG_OFFSET 0x0
#define IDMA_REG32_3D_CONF_DECOUPLE_AW_BIT 0
#define IDMA_REG32_3D_CONF_DECOUPLE_RW_BIT 1
#define IDMA_REG32_3D_CONF_SRC_REDUCE_LEN_BIT 2
#define IDMA_REG32_3D_CONF_DST_REDUCE_LEN_BIT 3
#define IDMA_REG32_3D_CONF_SRC_MAX_LLEN_MASK 0x7
#define IDMA_REG32_3D_CONF_SRC_MAX_LLEN_OFFSET 4
#define IDMA_REG32_3D_CONF_SRC_MAX_LLEN_FIELD \
((bitfield_field32_t) { .mask = IDMA_REG32_3D_CONF_SRC_MAX_LLEN_MASK, .index = IDMA_REG32_3D_CONF_SRC_MAX_LLEN_OFFSET })
#define IDMA_REG32_3D_CONF_DST_MAX_LLEN_MASK 0x7
#define IDMA_REG32_3D_CONF_DST_MAX_LLEN_OFFSET 7
#define IDMA_REG32_3D_CONF_DST_MAX_LLEN_FIELD \
((bitfield_field32_t) { .mask = IDMA_REG32_3D_CONF_DST_MAX_LLEN_MASK, .index = IDMA_REG32_3D_CONF_DST_MAX_LLEN_OFFSET })
#define IDMA_REG32_3D_CONF_ENABLE_ND_MASK 0x3
#define IDMA_REG32_3D_CONF_ENABLE_ND_OFFSET 10
#define IDMA_REG32_3D_CONF_ENABLE_ND_FIELD \
((bitfield_field32_t) { .mask = IDMA_REG32_3D_CONF_ENABLE_ND_MASK, .index = IDMA_REG32_3D_CONF_ENABLE_ND_OFFSET })
#define IDMA_REG32_3D_CONF_SRC_PROTOCOL_MASK 0x7
#define IDMA_REG32_3D_CONF_SRC_PROTOCOL_OFFSET 12
#define IDMA_REG32_3D_CONF_SRC_PROTOCOL_FIELD \
((bitfield_field32_t) { .mask = IDMA_REG32_3D_CONF_SRC_PROTOCOL_MASK, .index = IDMA_REG32_3D_CONF_SRC_PROTOCOL_OFFSET })
#define IDMA_REG32_3D_CONF_DST_PROTOCOL_MASK 0x7
#define IDMA_REG32_3D_CONF_DST_PROTOCOL_OFFSET 15
#define IDMA_REG32_3D_CONF_DST_PROTOCOL_FIELD \
((bitfield_field32_t) { .mask = IDMA_REG32_3D_CONF_DST_PROTOCOL_MASK, .index = IDMA_REG32_3D_CONF_DST_PROTOCOL_OFFSET })

// DMA Status
#define IDMA_REG32_3D_STATUS_0_REG_OFFSET 0x4
#define IDMA_REG32_3D_STATUS_0_BUSY_0_MASK 0x3ff
#define IDMA_REG32_3D_STATUS_0_BUSY_0_OFFSET 0
#define IDMA_REG32_3D_STATUS_0_BUSY_0_FIELD \
((bitfield_field32_t) { .mask = IDMA_REG32_3D_STATUS_0_BUSY_0_MASK, .index = IDMA_REG32_3D_STATUS_0_BUSY_0_OFFSET })

// DMA Status
#define IDMA_REG32_3D_STATUS_1_REG_OFFSET 0x8
#define IDMA_REG32_3D_STATUS_1_BUSY_1_MASK 0x3ff
#define IDMA_REG32_3D_STATUS_1_BUSY_1_OFFSET 0
#define IDMA_REG32_3D_STATUS_1_BUSY_1_FIELD \
((bitfield_field32_t) { .mask = IDMA_REG32_3D_STATUS_1_BUSY_1_MASK, .index = IDMA_REG32_3D_STATUS_1_BUSY_1_OFFSET })

// Next ID, launches transfer, returns 0 if transfer not set up properly.
#define IDMA_REG32_3D_NEXT_ID_0_REG_OFFSET 0xc

// Next ID, launches transfer, returns 0 if transfer not set up properly.
#define IDMA_REG32_3D_NEXT_ID_1_REG_OFFSET 0x10

// Get ID of finished transactions.
#define IDMA_REG32_3D_DONE_ID_0_REG_OFFSET 0x14

// Get ID of finished transactions.
#define IDMA_REG32_3D_DONE_ID_1_REG_OFFSET 0x18

// Low destination address
#define IDMA_REG32_3D_DST_ADDR_LOW_REG_OFFSET 0xd0

// Low source address
#define IDMA_REG32_3D_SRC_ADDR_LOW_REG_OFFSET 0xd8

// Low transfer length in byte
#define IDMA_REG32_3D_LENGTH_LOW_REG_OFFSET 0xe0

// Low destination stride dimension 2
#define IDMA_REG32_3D_DST_STRIDE_2_LOW_REG_OFFSET 0xe8

// Low source stride dimension 2
#define IDMA_REG32_3D_SRC_STRIDE_2_LOW_REG_OFFSET 0xf0

// Low number of repetitions dimension 2
#define IDMA_REG32_3D_REPS_2_LOW_REG_OFFSET 0xf8

// Low destination stride dimension 3
#define IDMA_REG32_3D_DST_STRIDE_3_LOW_REG_OFFSET 0x100

// Low source stride dimension 3
#define IDMA_REG32_3D_SRC_STRIDE_3_LOW_REG_OFFSET 0x108

// Low number of repetitions dimension 3
#define IDMA_REG32_3D_REPS_3_LOW_REG_OFFSET 0x110

#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IDMA_REG32_3D_REG_DEFS_
// End generated register defines for idma_reg32_3d
5 changes: 4 additions & 1 deletion include/hal/chips/pulp_cluster/pulp.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
#endif // __ibex__
#include "hal/eu/eu_v3.h"
#include "hal/itc/itc_v1.h"
#include "hal/dma/mchan_v7.h"
#include "hal/timer/timer_v2.h"
#include "hal/soc_eu/soc_eu_v2.h"
#include "hal/cluster_ctrl/cluster_ctrl_v2.h"
Expand All @@ -45,4 +44,8 @@
#include "hal/tcdm_scrubber/tcdm_scrubber.h"
#include "hal/hwpe_hci_ecc/hwpe_hci_ecc.h"

#include "hal/dma/mchan_v7.h"

#include "hal/dma/idma_v2.h"

#endif
8 changes: 8 additions & 0 deletions include/hal/cluster_ctrl/cluster_ctrl_v2.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,12 @@ static inline void hal_cluster_ctrl_return_set_remote(int cid, int value){
pulp_write32(ARCHI_CLUSTER_PERIPHERALS_GLOBAL_ADDR(cid)+ARCHI_CLUSTER_CTRL_OFFSET+ARCHI_CLUSTER_CTRL_RETURN, value | 1 << ARCHI_CLUSTER_CTRL_RETURN_SHIFT_BITS);
}

static inline void plp_ctrl_cluster_cfg_set(unsigned int mask) {
pulp_write32(ARCHI_CLUSTER_CTRL_ADDR + ARCHI_CLUSTER_CTRL_CLUSTER_CFG, mask);
}

static inline int plp_ctrl_cluster_cfg_get() {
return pulp_read32(ARCHI_CLUSTER_CTRL_ADDR + ARCHI_CLUSTER_CTRL_CLUSTER_CFG);
}

#endif
Loading