@@ -3,6 +3,7 @@ import 'package:rohd_hcl/rohd_hcl.dart';
33import 'package:riscv/riscv.dart' ;
44import 'package:river/river.dart' ;
55
6+ import 'core/csr.dart' ;
67import 'core/pipeline.dart' ;
78
89class 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