Skip to content

Commit 138f0ed

Browse files
committed
Add ctrl_reg variant without L0 statistics
1 parent a3696a0 commit 138f0ed

File tree

7 files changed

+955
-1
lines changed

7 files changed

+955
-1
lines changed

.github/workflows/lint.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ jobs:
2626
exclude_paths: |
2727
./src/ctrl_unit/cluster_icache_ctrl_reg_top.sv
2828
./src/ctrl_unit/cluster_icache_ctrl_reg_pkg.sv
29+
./src/ctrl_unit/cluster_icache_ctrl_perfctr_reg_top.sv
30+
./src/ctrl_unit/cluster_icache_ctrl_perfctr_reg_pkg.sv
2931
github_token: ${{ secrets.GITHUB_TOKEN }}
3032
fail_on_error: true
3133
reviewdog_reporter: github-check

Bender.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ sources:
4343
- src/ctrl_unit/cluster_icache_ctrl_reg_pkg.sv
4444
- src/ctrl_unit/cluster_icache_ctrl_reg_top.sv
4545
- src/ctrl_unit/cluster_icache_ctrl_unit.sv
46+
- files: # ctrl_unit
47+
- src/ctrl_unit/cluster_icache_ctrl_perfctr_reg_pkg.sv
48+
- src/ctrl_unit/cluster_icache_ctrl_perfctr_reg_top.sv
49+
- src/ctrl_unit/cluster_icache_ctrl_perfctr_unit.sv
4650
- target: test
4751
files:
4852
- test/snitch_icache_l0_tb.sv

Makefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ VLOG_FLAGS += +cover=sbecft
1111

1212
CTRL_UNIT_DIR = src/ctrl_unit
1313
CTRL_UNIT = $(CTRL_UNIT_DIR)/cluster_icache_ctrl
14+
CTRL_UNIT_PERF = $(CTRL_UNIT_DIR)/cluster_icache_ctrl_perfctr
1415

1516
Bender.lock:
1617
$(BENDER) update
@@ -19,11 +20,14 @@ Bender.lock:
1920
$(BENDER) checkout
2021

2122
.PHONY: gen_hw
22-
gen_hw: .bender $(CTRL_UNIT)_reg_top.sv
23+
gen_hw: .bender $(CTRL_UNIT)_reg_top.sv $(CTRL_UNIT_PERF)_reg_top.sv
2324

2425
$(CTRL_UNIT)_reg_top.sv: .bender $(CTRL_UNIT).hjson
2526
python $(shell $(BENDER) path register_interface)/vendor/lowrisc_opentitan/util/regtool.py $(CTRL_UNIT).hjson -t $(CTRL_UNIT_DIR) -r
2627

28+
$(CTRL_UNIT_PERF)_reg_top.sv: .bender $(CTRL_UNIT_PERF).hjson
29+
python $(shell $(BENDER) path register_interface)/vendor/lowrisc_opentitan/util/regtool.py $(CTRL_UNIT_PERF).hjson -t $(CTRL_UNIT_DIR) -r
30+
2731
compile.tcl: .bender Bender.yml Bender.lock
2832
$(BENDER) script vsim -t test \
2933
--vlog-arg="$(VLOG_FLAGS)" \
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
// Copyright 2024 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+
{
6+
name: "cluster_icache_ctrl_perfctr",
7+
clock_primary: "clk_i",
8+
reset_primary: "rst_ni",
9+
bus_interfaces: [
10+
{ protocol: "reg_iface",
11+
direction: "device"
12+
}
13+
],
14+
15+
param_list: [
16+
{ name: "NumCores",
17+
desc: "Number of cores",
18+
default: "8"
19+
},
20+
{ name: "NumL0Events",
21+
desc: "Number of L0 events",
22+
default: "5" // Use performance counters for L0 events
23+
},
24+
{ name: "NumL1Events",
25+
desc: "Number of L1 events",
26+
default: "4"
27+
},
28+
{ name: "NumAvailableCounters",
29+
desc: "Number of available counters",
30+
default: "4" // NumL1Events
31+
},
32+
],
33+
34+
regwidth: "32",
35+
registers: [
36+
{ name: "enable",
37+
desc: "",
38+
swaccess: "rw",
39+
hwaccess: "hro",
40+
fields: [
41+
{ bits: "0",
42+
name: "enable",
43+
desc: "",
44+
resval: 0x1
45+
}
46+
]
47+
},
48+
{ name: "flush",
49+
desc: "Flush all levels of the cache",
50+
swaccess: "rw",
51+
hwaccess: "hrw",
52+
hwqe: "true",
53+
hwext: "true",
54+
fields: [
55+
{ bits: "0",
56+
name: "flush",
57+
desc: "",
58+
resval: 0x0
59+
}
60+
]
61+
},
62+
{ name: "flush_l1_only",
63+
desc: "not yet functional",
64+
swaccess: "rw",
65+
hwaccess: "hrw",
66+
hwext: "true",
67+
hwqe: "true",
68+
fields: [
69+
{ bits: "0",
70+
name: "flush",
71+
desc: "",
72+
resval: 0x0
73+
}
74+
]
75+
},
76+
{ name: "sel_flush_icache",
77+
desc: "flush specified L0 banks (and currently the complete L1)",
78+
swaccess: "rw",
79+
hwaccess: "hrw",
80+
hwext: "true",
81+
hwqe: "true",
82+
fields: [
83+
{ bits: "NumCores-1:0",
84+
name: "flush",
85+
desc: "",
86+
resval: 0x0000_0000
87+
}
88+
]
89+
},
90+
{ name: "clear_counters",
91+
desc: "Clear all performance counters",
92+
swaccess: "rw",
93+
hwaccess: "hrw",
94+
hwqe: "true",
95+
hwext: "true",
96+
fields: [
97+
{ bits: "0",
98+
name: "clear",
99+
desc: "",
100+
resval: 0x0
101+
}
102+
]
103+
},
104+
{ name: "enable_counters",
105+
desc: "Enable performance counters",
106+
swaccess: "rw",
107+
hwaccess: "hro",
108+
fields: [
109+
{ bits: "0",
110+
name: "enable",
111+
desc: "",
112+
resval: 0x1
113+
}
114+
]
115+
},
116+
{ skipto: "0x1C" },
117+
{ name: "enable_prefetch",
118+
desc: "Enable prefetching",
119+
swaccess: "rw",
120+
hwaccess: "hro",
121+
fields: [
122+
{ bits: "0",
123+
name: "enable",
124+
desc: "",
125+
resval: 0x1
126+
}
127+
]
128+
},
129+
{ multireg: {
130+
name: "counters",
131+
desc: "Performance counters",
132+
count: "NumAvailableCounters",
133+
cname: "id",
134+
swaccess: "rw0c",
135+
hwaccess: "hrw",
136+
fields: [
137+
{ bits: "31:0",
138+
name: "counter",
139+
desc: "",
140+
resval: 0x0000_0000
141+
}
142+
]
143+
}
144+
},
145+
],
146+
}
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
// Copyright lowRISC contributors.
2+
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3+
// SPDX-License-Identifier: Apache-2.0
4+
//
5+
// Register Package auto-generated by `reggen` containing data structure
6+
7+
package cluster_icache_ctrl_perfctr_reg_pkg;
8+
9+
// Param list
10+
parameter int NumCores = 8;
11+
parameter int NumL0Events = 5;
12+
parameter int NumL1Events = 4;
13+
parameter int NumAvailableCounters = 4;
14+
15+
// Address widths within the block
16+
parameter int BlockAw = 6;
17+
18+
////////////////////////////
19+
// Typedefs for registers //
20+
////////////////////////////
21+
22+
typedef struct packed {
23+
logic q;
24+
} cluster_icache_ctrl_perfctr_reg2hw_enable_reg_t;
25+
26+
typedef struct packed {
27+
logic q;
28+
logic qe;
29+
} cluster_icache_ctrl_perfctr_reg2hw_flush_reg_t;
30+
31+
typedef struct packed {
32+
logic q;
33+
logic qe;
34+
} cluster_icache_ctrl_perfctr_reg2hw_flush_l1_only_reg_t;
35+
36+
typedef struct packed {
37+
logic [7:0] q;
38+
logic qe;
39+
} cluster_icache_ctrl_perfctr_reg2hw_sel_flush_icache_reg_t;
40+
41+
typedef struct packed {
42+
logic q;
43+
logic qe;
44+
} cluster_icache_ctrl_perfctr_reg2hw_clear_counters_reg_t;
45+
46+
typedef struct packed {
47+
logic q;
48+
} cluster_icache_ctrl_perfctr_reg2hw_enable_counters_reg_t;
49+
50+
typedef struct packed {
51+
logic q;
52+
} cluster_icache_ctrl_perfctr_reg2hw_enable_prefetch_reg_t;
53+
54+
typedef struct packed {
55+
logic [31:0] q;
56+
} cluster_icache_ctrl_perfctr_reg2hw_counters_mreg_t;
57+
58+
typedef struct packed {
59+
logic d;
60+
} cluster_icache_ctrl_perfctr_hw2reg_flush_reg_t;
61+
62+
typedef struct packed {
63+
logic d;
64+
} cluster_icache_ctrl_perfctr_hw2reg_flush_l1_only_reg_t;
65+
66+
typedef struct packed {
67+
logic [7:0] d;
68+
} cluster_icache_ctrl_perfctr_hw2reg_sel_flush_icache_reg_t;
69+
70+
typedef struct packed {
71+
logic d;
72+
} cluster_icache_ctrl_perfctr_hw2reg_clear_counters_reg_t;
73+
74+
typedef struct packed {
75+
logic [31:0] d;
76+
logic de;
77+
} cluster_icache_ctrl_perfctr_hw2reg_counters_mreg_t;
78+
79+
// Register -> HW type
80+
typedef struct packed {
81+
cluster_icache_ctrl_perfctr_reg2hw_enable_reg_t enable; // [145:145]
82+
cluster_icache_ctrl_perfctr_reg2hw_flush_reg_t flush; // [144:143]
83+
cluster_icache_ctrl_perfctr_reg2hw_flush_l1_only_reg_t flush_l1_only; // [142:141]
84+
cluster_icache_ctrl_perfctr_reg2hw_sel_flush_icache_reg_t sel_flush_icache; // [140:132]
85+
cluster_icache_ctrl_perfctr_reg2hw_clear_counters_reg_t clear_counters; // [131:130]
86+
cluster_icache_ctrl_perfctr_reg2hw_enable_counters_reg_t enable_counters; // [129:129]
87+
cluster_icache_ctrl_perfctr_reg2hw_enable_prefetch_reg_t enable_prefetch; // [128:128]
88+
cluster_icache_ctrl_perfctr_reg2hw_counters_mreg_t [3:0] counters; // [127:0]
89+
} cluster_icache_ctrl_perfctr_reg2hw_t;
90+
91+
// HW -> register type
92+
typedef struct packed {
93+
cluster_icache_ctrl_perfctr_hw2reg_flush_reg_t flush; // [142:142]
94+
cluster_icache_ctrl_perfctr_hw2reg_flush_l1_only_reg_t flush_l1_only; // [141:141]
95+
cluster_icache_ctrl_perfctr_hw2reg_sel_flush_icache_reg_t sel_flush_icache; // [140:133]
96+
cluster_icache_ctrl_perfctr_hw2reg_clear_counters_reg_t clear_counters; // [132:132]
97+
cluster_icache_ctrl_perfctr_hw2reg_counters_mreg_t [3:0] counters; // [131:0]
98+
} cluster_icache_ctrl_perfctr_hw2reg_t;
99+
100+
// Register offsets
101+
parameter logic [BlockAw-1:0] CLUSTER_ICACHE_CTRL_PERFCTR_ENABLE_OFFSET = 6'h 0;
102+
parameter logic [BlockAw-1:0] CLUSTER_ICACHE_CTRL_PERFCTR_FLUSH_OFFSET = 6'h 4;
103+
parameter logic [BlockAw-1:0] CLUSTER_ICACHE_CTRL_PERFCTR_FLUSH_L1_ONLY_OFFSET = 6'h 8;
104+
parameter logic [BlockAw-1:0] CLUSTER_ICACHE_CTRL_PERFCTR_SEL_FLUSH_ICACHE_OFFSET = 6'h c;
105+
parameter logic [BlockAw-1:0] CLUSTER_ICACHE_CTRL_PERFCTR_CLEAR_COUNTERS_OFFSET = 6'h 10;
106+
parameter logic [BlockAw-1:0] CLUSTER_ICACHE_CTRL_PERFCTR_ENABLE_COUNTERS_OFFSET = 6'h 14;
107+
parameter logic [BlockAw-1:0] CLUSTER_ICACHE_CTRL_PERFCTR_ENABLE_PREFETCH_OFFSET = 6'h 1c;
108+
parameter logic [BlockAw-1:0] CLUSTER_ICACHE_CTRL_PERFCTR_COUNTERS_0_OFFSET = 6'h 20;
109+
parameter logic [BlockAw-1:0] CLUSTER_ICACHE_CTRL_PERFCTR_COUNTERS_1_OFFSET = 6'h 24;
110+
parameter logic [BlockAw-1:0] CLUSTER_ICACHE_CTRL_PERFCTR_COUNTERS_2_OFFSET = 6'h 28;
111+
parameter logic [BlockAw-1:0] CLUSTER_ICACHE_CTRL_PERFCTR_COUNTERS_3_OFFSET = 6'h 2c;
112+
113+
// Reset values for hwext registers and their fields
114+
parameter logic [0:0] CLUSTER_ICACHE_CTRL_PERFCTR_FLUSH_RESVAL = 1'h 0;
115+
parameter logic [0:0] CLUSTER_ICACHE_CTRL_PERFCTR_FLUSH_FLUSH_RESVAL = 1'h 0;
116+
parameter logic [0:0] CLUSTER_ICACHE_CTRL_PERFCTR_FLUSH_L1_ONLY_RESVAL = 1'h 0;
117+
parameter logic [0:0] CLUSTER_ICACHE_CTRL_PERFCTR_FLUSH_L1_ONLY_FLUSH_RESVAL = 1'h 0;
118+
parameter logic [7:0] CLUSTER_ICACHE_CTRL_PERFCTR_SEL_FLUSH_ICACHE_RESVAL = 8'h 0;
119+
parameter logic [7:0] CLUSTER_ICACHE_CTRL_PERFCTR_SEL_FLUSH_ICACHE_FLUSH_RESVAL = 8'h 0;
120+
parameter logic [0:0] CLUSTER_ICACHE_CTRL_PERFCTR_CLEAR_COUNTERS_RESVAL = 1'h 0;
121+
parameter logic [0:0] CLUSTER_ICACHE_CTRL_PERFCTR_CLEAR_COUNTERS_CLEAR_RESVAL = 1'h 0;
122+
123+
// Register index
124+
typedef enum int {
125+
CLUSTER_ICACHE_CTRL_PERFCTR_ENABLE,
126+
CLUSTER_ICACHE_CTRL_PERFCTR_FLUSH,
127+
CLUSTER_ICACHE_CTRL_PERFCTR_FLUSH_L1_ONLY,
128+
CLUSTER_ICACHE_CTRL_PERFCTR_SEL_FLUSH_ICACHE,
129+
CLUSTER_ICACHE_CTRL_PERFCTR_CLEAR_COUNTERS,
130+
CLUSTER_ICACHE_CTRL_PERFCTR_ENABLE_COUNTERS,
131+
CLUSTER_ICACHE_CTRL_PERFCTR_ENABLE_PREFETCH,
132+
CLUSTER_ICACHE_CTRL_PERFCTR_COUNTERS_0,
133+
CLUSTER_ICACHE_CTRL_PERFCTR_COUNTERS_1,
134+
CLUSTER_ICACHE_CTRL_PERFCTR_COUNTERS_2,
135+
CLUSTER_ICACHE_CTRL_PERFCTR_COUNTERS_3
136+
} cluster_icache_ctrl_perfctr_id_e;
137+
138+
// Register width information to check illegal writes
139+
parameter logic [3:0] CLUSTER_ICACHE_CTRL_PERFCTR_PERMIT [11] = '{
140+
4'b 0001, // index[ 0] CLUSTER_ICACHE_CTRL_PERFCTR_ENABLE
141+
4'b 0001, // index[ 1] CLUSTER_ICACHE_CTRL_PERFCTR_FLUSH
142+
4'b 0001, // index[ 2] CLUSTER_ICACHE_CTRL_PERFCTR_FLUSH_L1_ONLY
143+
4'b 0001, // index[ 3] CLUSTER_ICACHE_CTRL_PERFCTR_SEL_FLUSH_ICACHE
144+
4'b 0001, // index[ 4] CLUSTER_ICACHE_CTRL_PERFCTR_CLEAR_COUNTERS
145+
4'b 0001, // index[ 5] CLUSTER_ICACHE_CTRL_PERFCTR_ENABLE_COUNTERS
146+
4'b 0001, // index[ 6] CLUSTER_ICACHE_CTRL_PERFCTR_ENABLE_PREFETCH
147+
4'b 1111, // index[ 7] CLUSTER_ICACHE_CTRL_PERFCTR_COUNTERS_0
148+
4'b 1111, // index[ 8] CLUSTER_ICACHE_CTRL_PERFCTR_COUNTERS_1
149+
4'b 1111, // index[ 9] CLUSTER_ICACHE_CTRL_PERFCTR_COUNTERS_2
150+
4'b 1111 // index[10] CLUSTER_ICACHE_CTRL_PERFCTR_COUNTERS_3
151+
};
152+
153+
endpackage
154+

0 commit comments

Comments
 (0)