Skip to content

Commit ac9f120

Browse files
committed
sw: Adapt software to new systemRDL c-header chimera_addrmap.h
1 parent 56e7ba4 commit ac9f120

18 files changed

+347
-258
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,5 @@ help:
6363
@echo -e ""
6464
@echo -e "Software:"
6565
@echo -e "${Green}chim-sw ${Black}Compile all software tests"
66+
@echo -e "${Green}chimera-addrmap ${Black}Regenerate c-header for SoC address map"
6667
@echo -e ""

chimera.mk

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,14 @@ $(CHIM_ROOT)/hw/bootrom/snitch/snitch_bootrom.bin: $(CHIM_ROOT)/hw/bootrom/snitc
5656
$(CHIM_ROOT)/hw/bootrom/snitch/snitch_bootrom.sv: $(CHIM_ROOT)/hw/bootrom/snitch/snitch_bootrom.bin $(CHS_ROOT)/util/gen_bootrom.py
5757
$(CHS_ROOT)/util/gen_bootrom.py --sv-module snitch_bootrom $< > $@
5858

59+
#############
60+
# SystemRDL #
61+
#############
62+
CHIM_RDL_ALL += $(CHIM_ROOT)/hw/rdl/chimera.rdl
63+
CHIM_RDL_ALL += $(CHIM_ROOT)/hw/rdl/snitch_cluster.rdl
64+
CHIM_RDL_ALL += $(CHIM_ROOT)/hw/rdl/cheshire_host.rdl
65+
CHIM_RDL_ALL += $(CHIM_ROOT)/hw/rdl/chimera_regs.rdl
66+
5967
.PHONY: regenerate_soc_regs
6068
regenerate_soc_regs: $(CHIM_ROOT)/hw/rdl/chimera_reg_top.sv $(CHIM_ROOT)/hw/rdl/chimera_reg_pkg.sv
6169
$(CHIM_ROOT)/hw/rdl/chimera_reg_top.sv $(CHIM_ROOT)/hw/rdl/chimera_reg_pkg.sv: $(CHIM_ROOT)/hw/rdl/chimera_regs.rdl

hw/rdl/cheshire_host.rdl

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright 2025 ETH Zurich and University of Bologna.
2+
// Solderpad Hardware License, Version 0.51, see LICENSE for details.
3+
// SPDX-License-Identifier: SHL-0.51
4+
5+
`ifndef __CHESHIRE_HOST_RDL__
6+
`define __CHESHIRE_HOST_RDL__
7+
8+
`include "chimera_regs.rdl"
9+
10+
addrmap cheshire_host #(
11+
longint unsigned NumClusters = 1 // Number of Clusters
12+
) {
13+
14+
chimera_regs #(.NumClusters (NumClusters)) chimera_regs @0x1000;
15+
16+
// TODO: Map the Hyperbus
17+
// TODO: Map external reg for chip levelk (FLL, etc...)
18+
19+
};
20+
21+
`endif // __CHESHIRE_HOST_RDL__

hw/rdl/chimera.rdl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright 2025 ETH Zurich and University of Bologna.
2+
// Solderpad Hardware License, Version 0.51, see LICENSE for details.
3+
// SPDX-License-Identifier: SHL-0.51
4+
5+
`include "cheshire_host.rdl"
6+
`include "snitch_cluster.rdl"
7+
8+
addrmap chimera_addrmap #(
9+
longint unsigned NumClusters = 1 // Number of Clusters
10+
){
11+
12+
cheshire_host #(.NumClusters (NumClusters)) host @0x30000000;
13+
snitch_cluster snitch_cluster[NumClusters] @0x40000000 += 0x200000;
14+
external mem { mementries = 0x40000; memwidth = 8; } l2_mem_island @0x48000000;
15+
16+
};

hw/rdl/chimera_regs.rdl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
`define CHIMERA_RDL
1010

1111
addrmap chimera_regs #(
12-
longint unsigned NumClusters = 1 // Number of cores
12+
longint unsigned NumClusters = 1 // Number of clusters
1313
) {
1414
name = "chimera_regs";
1515
desc = "Chimera SoC control registers";

hw/rdl/snitch_cluster.rdl

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright 2025 ETH Zurich and University of Bologna.
2+
// Solderpad Hardware License, Version 0.51, see LICENSE for details.
3+
// SPDX-License-Identifier: SHL-0.51
4+
5+
`ifndef __SNITCH_CLUSTER_RDL__
6+
`define __SNITCH_CLUSTER_RDL__
7+
8+
// `include "snitch_cluster_wrapper.rdl"
9+
10+
addrmap snitch_cluster {
11+
12+
external mem {
13+
mementries = 1;
14+
memwidth = 64;
15+
} dummy;
16+
17+
// snitch_cluster_wrapper #(.BASE_ADDR(0)) snitch_cluster_wrapper;
18+
19+
};
20+
21+
`endif // __SNITCH_CLUSTER_RDL__

sw/include/chimera_addrmap.h

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
// Copyright 2025 ETH Zurich and University of Bologna.
2+
// Licensed under the Apache License, Version 2 0, see LICENSE for details.
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
// Generated by PeakRDL-cheader - A free and open-source header generator
6+
// https://github.com/SystemRDL/PeakRDL-cheader
7+
8+
#ifndef CHIMERA_ADDRMAP_H
9+
#define CHIMERA_ADDRMAP_H
10+
11+
#ifdef __cplusplus
12+
extern "C" {
13+
#endif
14+
15+
#include <stdint.h>
16+
#include <assert.h>
17+
18+
// Reg - chimera_regs_NumClusters_5::snitch_boot_addr
19+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_BOOT_ADDR__SNITCH_BOOT_ADDR_bm 0xffffffff
20+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_BOOT_ADDR__SNITCH_BOOT_ADDR_bp 0
21+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_BOOT_ADDR__SNITCH_BOOT_ADDR_bw 32
22+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_BOOT_ADDR__SNITCH_BOOT_ADDR_reset 0xbadcab1e
23+
typedef union {
24+
struct __attribute__((__packed__)) {
25+
uint32_t SNITCH_BOOT_ADDR : 32;
26+
} f;
27+
uint32_t w;
28+
} chimera_regs_NumClusters_5__snitch_boot_addr_t;
29+
30+
// Reg - chimera_regs_NumClusters_5::snitch_configurable_boot_addr
31+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_CONFIGURABLE_BOOT_ADDR__SNITCH_CONFIGURABLE_BOOT_ADDR_bm \
32+
0xffffffff
33+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_CONFIGURABLE_BOOT_ADDR__SNITCH_CONFIGURABLE_BOOT_ADDR_bp \
34+
0
35+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_CONFIGURABLE_BOOT_ADDR__SNITCH_CONFIGURABLE_BOOT_ADDR_bw \
36+
32
37+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_CONFIGURABLE_BOOT_ADDR__SNITCH_CONFIGURABLE_BOOT_ADDR_reset \
38+
0x30000000
39+
typedef union {
40+
struct __attribute__((__packed__)) {
41+
uint32_t SNITCH_CONFIGURABLE_BOOT_ADDR : 32;
42+
} f;
43+
uint32_t w;
44+
} chimera_regs_NumClusters_5__snitch_configurable_boot_addr_t;
45+
46+
// Reg - chimera_regs_NumClusters_5::snitch_intr_handler_addr
47+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_INTR_HANDLER_ADDR__SNITCH_INTR_HANDLER_ADDR_bm 0xffffffff
48+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_INTR_HANDLER_ADDR__SNITCH_INTR_HANDLER_ADDR_bp 0
49+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_INTR_HANDLER_ADDR__SNITCH_INTR_HANDLER_ADDR_bw 32
50+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_INTR_HANDLER_ADDR__SNITCH_INTR_HANDLER_ADDR_reset \
51+
0xbadcab1e
52+
typedef union {
53+
struct __attribute__((__packed__)) {
54+
uint32_t SNITCH_INTR_HANDLER_ADDR : 32;
55+
} f;
56+
uint32_t w;
57+
} chimera_regs_NumClusters_5__snitch_intr_handler_addr_t;
58+
59+
// Reg - chimera_regs_NumClusters_5::snitch_cluster_return
60+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_CLUSTER_RETURN__SNITCH_CLUSTER_RETURN_bm 0xffffffff
61+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_CLUSTER_RETURN__SNITCH_CLUSTER_RETURN_bp 0
62+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_CLUSTER_RETURN__SNITCH_CLUSTER_RETURN_bw 32
63+
#define CHIMERA_REGS_NUMCLUSTERS_5__SNITCH_CLUSTER_RETURN__SNITCH_CLUSTER_RETURN_reset 0x0
64+
typedef union {
65+
struct __attribute__((__packed__)) {
66+
uint32_t SNITCH_CLUSTER_RETURN : 32;
67+
} f;
68+
uint32_t w;
69+
} chimera_regs_NumClusters_5__snitch_cluster_return_t;
70+
71+
// Reg - chimera_regs_NumClusters_5::reset_cluster
72+
#define CHIMERA_REGS_NUMCLUSTERS_5__RESET_CLUSTER__RESET_CLUSTER_bm 0x1
73+
#define CHIMERA_REGS_NUMCLUSTERS_5__RESET_CLUSTER__RESET_CLUSTER_bp 0
74+
#define CHIMERA_REGS_NUMCLUSTERS_5__RESET_CLUSTER__RESET_CLUSTER_bw 1
75+
#define CHIMERA_REGS_NUMCLUSTERS_5__RESET_CLUSTER__RESET_CLUSTER_reset 0x1
76+
typedef union {
77+
struct __attribute__((__packed__)) {
78+
uint32_t RESET_CLUSTER : 1;
79+
uint32_t : 31;
80+
} f;
81+
uint32_t w;
82+
} chimera_regs_NumClusters_5__reset_cluster_t;
83+
84+
// Reg - chimera_regs_NumClusters_5::cluster_clk_gate_en
85+
#define CHIMERA_REGS_NUMCLUSTERS_5__CLUSTER_CLK_GATE_EN__CLUSTER_CLK_GATE_EN_bm 0x1
86+
#define CHIMERA_REGS_NUMCLUSTERS_5__CLUSTER_CLK_GATE_EN__CLUSTER_CLK_GATE_EN_bp 0
87+
#define CHIMERA_REGS_NUMCLUSTERS_5__CLUSTER_CLK_GATE_EN__CLUSTER_CLK_GATE_EN_bw 1
88+
#define CHIMERA_REGS_NUMCLUSTERS_5__CLUSTER_CLK_GATE_EN__CLUSTER_CLK_GATE_EN_reset 0x1
89+
typedef union {
90+
struct __attribute__((__packed__)) {
91+
uint32_t CLUSTER_CLK_GATE_EN : 1;
92+
uint32_t : 31;
93+
} f;
94+
uint32_t w;
95+
} chimera_regs_NumClusters_5__cluster_clk_gate_en_t;
96+
97+
// Reg - chimera_regs_NumClusters_5::wide_mem_cluster_bypass
98+
#define CHIMERA_REGS_NUMCLUSTERS_5__WIDE_MEM_CLUSTER_BYPASS__WIDE_MEM_CLUSTER_BYPASS_bm 0x1
99+
#define CHIMERA_REGS_NUMCLUSTERS_5__WIDE_MEM_CLUSTER_BYPASS__WIDE_MEM_CLUSTER_BYPASS_bp 0
100+
#define CHIMERA_REGS_NUMCLUSTERS_5__WIDE_MEM_CLUSTER_BYPASS__WIDE_MEM_CLUSTER_BYPASS_bw 1
101+
#define CHIMERA_REGS_NUMCLUSTERS_5__WIDE_MEM_CLUSTER_BYPASS__WIDE_MEM_CLUSTER_BYPASS_reset 0x0
102+
typedef union {
103+
struct __attribute__((__packed__)) {
104+
uint32_t WIDE_MEM_CLUSTER_BYPASS : 1;
105+
uint32_t : 31;
106+
} f;
107+
uint32_t w;
108+
} chimera_regs_NumClusters_5__wide_mem_cluster_bypass_t;
109+
110+
// Reg - chimera_regs_NumClusters_5::cluster_busy
111+
#define CHIMERA_REGS_NUMCLUSTERS_5__CLUSTER_BUSY__CLUSTER_BUSY_bm 0x1
112+
#define CHIMERA_REGS_NUMCLUSTERS_5__CLUSTER_BUSY__CLUSTER_BUSY_bp 0
113+
#define CHIMERA_REGS_NUMCLUSTERS_5__CLUSTER_BUSY__CLUSTER_BUSY_bw 1
114+
#define CHIMERA_REGS_NUMCLUSTERS_5__CLUSTER_BUSY__CLUSTER_BUSY_reset 0x0
115+
typedef union {
116+
struct __attribute__((__packed__)) {
117+
uint32_t CLUSTER_BUSY : 1;
118+
uint32_t : 31;
119+
} f;
120+
uint32_t w;
121+
} chimera_regs_NumClusters_5__cluster_busy_t;
122+
123+
// Addrmap - chimera_regs_NumClusters_5
124+
typedef struct __attribute__((__packed__)) {
125+
chimera_regs_NumClusters_5__snitch_boot_addr_t snitch_boot_addr;
126+
chimera_regs_NumClusters_5__snitch_configurable_boot_addr_t snitch_configurable_boot_addr;
127+
chimera_regs_NumClusters_5__snitch_intr_handler_addr_t snitch_intr_handler_addr;
128+
chimera_regs_NumClusters_5__snitch_cluster_return_t snitch_cluster_return[5];
129+
chimera_regs_NumClusters_5__reset_cluster_t reset_cluster[5];
130+
chimera_regs_NumClusters_5__cluster_clk_gate_en_t cluster_clk_gate_en[5];
131+
chimera_regs_NumClusters_5__wide_mem_cluster_bypass_t wide_mem_cluster_bypass[5];
132+
chimera_regs_NumClusters_5__cluster_busy_t cluster_busy[5];
133+
} chimera_regs_NumClusters_5_t;
134+
135+
// Addrmap - cheshire_host_NumClusters_5
136+
typedef struct __attribute__((__packed__)) {
137+
uint8_t RESERVED_0_fff[0x1000];
138+
chimera_regs_NumClusters_5_t chimera_regs;
139+
} cheshire_host_NumClusters_5_t;
140+
141+
// Mem - snitch_cluster::dummy
142+
typedef struct __attribute__((__packed__)) {
143+
uint64_t mem[1];
144+
} snitch_cluster__dummy_t;
145+
146+
// Addrmap - snitch_cluster
147+
typedef struct __attribute__((__packed__)) {
148+
snitch_cluster__dummy_t dummy;
149+
uint8_t RESERVED_8_1fffff[0x1ffff8];
150+
} snitch_cluster__stride200000_t;
151+
152+
// Mem - chimera_addrmap_NumClusters_5::l2_mem_island
153+
typedef struct __attribute__((__packed__)) {
154+
uint8_t mem[262144];
155+
} chimera_addrmap_NumClusters_5__l2_mem_island_t;
156+
157+
// Addrmap - chimera_addrmap_NumClusters_5
158+
typedef struct __attribute__((__packed__)) {
159+
uint8_t RESERVED_0_2fffffff[0x30000000];
160+
cheshire_host_NumClusters_5_t host;
161+
uint8_t RESERVED_30001070_3fffffff[0xfffef90];
162+
snitch_cluster__stride200000_t snitch_cluster[5];
163+
uint8_t RESERVED_40a00000_47ffffff[0x7600000];
164+
chimera_addrmap_NumClusters_5__l2_mem_island_t l2_mem_island;
165+
} chimera_addrmap_NumClusters_5_t;
166+
167+
// Instances
168+
#define chimera_addrmap (*(volatile chimera_addrmap_NumClusters_5_t *)0x0UL)
169+
170+
static_assert(sizeof(chimera_addrmap_NumClusters_5_t) == 0x48040000, "Packing error");
171+
172+
#ifdef __cplusplus
173+
}
174+
#endif
175+
176+
#endif /* CHIMERA_ADDRMAP_H */

sw/include/offload.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@
1313
#include <stdint.h>
1414

1515
void setupInterruptHandler(void *handler);
16-
void setClusterClockGating(uint8_t *regPtr, uint8_t clusterId, bool enable);
17-
void setAllClusterClockGating(uint8_t *regPtr, bool enable);
18-
void setClusterReset(uint8_t *regPtr, uint8_t clusterId, bool enable);
19-
void setAllClusterReset(uint8_t *regPtr, bool enable);
16+
void setClusterClockGating(uint8_t clusterId, bool enable);
17+
void setAllClusterClockGating(volatile uint8_t numRegs, bool enable);
18+
void setClusterReset(uint8_t clusterId, bool enable);
19+
void setAllClusterReset(volatile uint8_t numRegs, bool enable);
20+
void setAllRegs(volatile uint32_t *regPtr, uint8_t numRegs, bool enable);
2021
void offloadToCluster(void *function, uint8_t hartId);
2122
void waitClusterBusy(uint8_t clusterId);
2223
uint32_t waitForCluster(uint8_t clusterId);

0 commit comments

Comments
 (0)