Skip to content

Commit 20cfab6

Browse files
feat(river_hdl): get csrs working
1 parent 04c8a44 commit 20cfab6

16 files changed

Lines changed: 1151 additions & 137 deletions

flake.lock

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flake.nix

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
inherit (pkgs) buildDartApplication;
4242

4343
gitHashes = {
44-
rohd_hcl = "sha256-XwCLtdXO8oEs0OYizPfp9nYq5cnFp8g3pcTD4mhGhog=";
44+
rohd_hcl = "sha256-J2PKBubToojxYTH7rJkxKLknQzzEQGkxz8EqvM6cXOQ=";
4545
};
4646

4747
buildDartTest =
Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
11
import 'package:river_hdl/river_hdl.dart';
22

3-
void main() {
4-
var awesome = Awesome();
5-
print('awesome: ${awesome.isAwesome}');
6-
}
3+
void main() {}
Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
1-
/// Support for doing something awesome.
2-
///
3-
/// More dartdocs go here.
41
library;
52

3+
export 'src/core/csr.dart';
64
export 'src/core/decoder.dart';
75
export 'src/core/exec.dart';
86
export 'src/core/fetcher.dart';
97
export 'src/core/pipeline.dart';
108
export 'src/core.dart';
119
export 'src/memory/port.dart';
12-
export 'src/river_hdl_base.dart';
13-
14-
// TODO: Export any libraries intended for clients of this package.

packages/river_hdl/lib/src/core.dart

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:rohd_hcl/rohd_hcl.dart';
33
import 'package:riscv/riscv.dart';
44
import 'package:river/river.dart';
55

6+
import 'core/csr.dart';
67
import 'core/pipeline.dart';
78

89
class RiverCoreHDL extends Module {
@@ -54,17 +55,46 @@ class RiverCoreHDL extends Module {
5455
final pc = Logic(name: 'pc', width: config.mxlen.size);
5556
final sp = Logic(name: 'sp', width: config.mxlen.size);
5657
final mode = Logic(name: 'mode', width: 3);
58+
final interruptHold = Logic(name: 'interruptHold');
5759

5860
final rs1Read = DataPortInterface(config.mxlen.size, 5);
5961
final rs2Read = DataPortInterface(config.mxlen.size, 5);
6062
final rdWrite = DataPortInterface(config.mxlen.size, 5);
6163

64+
final csrRead = DataPortInterface(config.mxlen.size, 12);
65+
final csrWrite = DataPortInterface(config.mxlen.size, 12);
66+
67+
final csrs = config.type.hasCsrs
68+
? RiscVCsrFile(
69+
clk,
70+
reset,
71+
mode,
72+
mxlen: config.mxlen,
73+
misa:
74+
config.extensions
75+
.map((ext) => ext.mask)
76+
.fold(0, (t, i) => t | i) |
77+
config.mxlen.misa |
78+
((config.hasSupervisor ? 1 : 0) << 18) |
79+
((config.hasUser ? 1 : 0) << 20),
80+
mvendorid: config.vendorId,
81+
marchid: config.archId,
82+
mimpid: config.impId,
83+
mhartid: config.hartId,
84+
hasSupervisor: config.hasSupervisor,
85+
hasUser: config.hasUser,
86+
csrRead: csrRead,
87+
csrWrite: csrWrite,
88+
)
89+
: null;
90+
6291
regs = RegisterFile(
6392
clk,
6493
reset,
6594
[rdWrite],
6695
[rs1Read, rs2Read],
6796
numEntries: 32,
97+
name: 'riscv_regfile',
6898
);
6999

70100
pipeline = RiverPipeline(
@@ -74,9 +104,8 @@ class RiverCoreHDL extends Module {
74104
sp,
75105
pc,
76106
mode,
77-
// TODO: CSR's
78-
null,
79-
null,
107+
config.type.hasCsrs ? csrRead : null,
108+
config.type.hasCsrs ? csrWrite : null,
80109
// TODO: have a cache backed memory interface
81110
memFetchRead,
82111
memExecRead,
@@ -87,29 +116,44 @@ class RiverCoreHDL extends Module {
87116
microcode: config.microcode,
88117
mxlen: config.mxlen,
89118
hasSupervisor: config.hasSupervisor,
119+
hasUser: config.hasUser,
90120
hasCompressed: config.extensions.any((e) => e.name == 'RVC'),
121+
mideleg: csrs?.mideleg,
122+
medeleg: csrs?.medeleg,
123+
mtvec: csrs?.mtvec,
124+
stvec: csrs?.stvec,
91125
);
92126

93127
Sequential(clk, [
94128
If(
95129
reset,
96-
then: [pipelineEnable < 0, pc < config.resetVector, sp < 0, mode < 0],
130+
then: [
131+
pipelineEnable < 0,
132+
pc < config.resetVector,
133+
sp < 0,
134+
mode < 0,
135+
interruptHold < 0,
136+
],
97137
orElse: [
98138
If(
99-
enable,
139+
enable & ~interruptHold,
100140
then: [
101141
If(
102142
pipeline.done,
103143
then: [
104144
pc < pipeline.nextPc,
105145
sp < pipeline.nextSp,
106146
mode < pipeline.nextMode,
147+
interruptHold < pipeline.interruptHold,
107148
pipelineEnable < 0,
108149
],
109150
orElse: [pipelineEnable < 1],
110151
),
111152
],
112-
orElse: [pipelineEnable < 0],
153+
orElse: [
154+
pipelineEnable < 0,
155+
// TODO: if interrupt hold & interrupt is fired, re-enable pipeline.
156+
],
113157
),
114158
// TODO: trap handling circuitry
115159
],

0 commit comments

Comments
 (0)