@@ -10,8 +10,13 @@ module top_verilator (input logic clk_i, rst_ni);
10
10
localparam int unsigned SysClkFreq = 30_000_000 ;
11
11
// HyperRAM clock frequency.
12
12
localparam int unsigned HRClkFreq = 100_000_000 ;
13
- localparam BaudRate = 921_600 ;
14
- localparam EnableCHERI = 1'b1 ;
13
+ localparam int unsigned BaudRate = 921_600 ;
14
+ localparam bit EnableCHERI = 1'b1 ;
15
+ // Number of CHERI error LEDs.
16
+ localparam int unsigned CheriErrWidth = 9 ;
17
+ // The symbolic file descriptors are presently unknown to Verilator
18
+ // (described in IEEE 1800-2012).
19
+ localparam int unsigned STDERR = 32'h8000_0002 ;
15
20
16
21
logic uart_sys_rx, uart_sys_tx;
17
22
@@ -98,12 +103,50 @@ module top_verilator (input logic clk_i, rst_ni);
98
103
rph_g16_ce2, rph_g8_ce0, rph_g7_ce1, ethmac_rst, ethmac_cs,
99
104
usrLed} ;
100
105
106
+ // Reporting of CHERI enable/disable and any exceptions that occur.
107
+ wire [CheriErrWidth- 1 : 0 ] cheri_err;
108
+ logic [CheriErrWidth- 1 : 0 ] cheri_errored;
109
+ wire cheri_en;
110
+ initial begin
111
+ if (cheri_en) $display (" Running with CHERI enabled" );
112
+ else $display (" Running in legacy software mode" );
113
+ end
114
+ always @ (posedge clk_i or negedge rst_ni) begin
115
+ if (! rst_ni) cheri_errored <= '0 ;
116
+ else if (| (cheri_err & ~ cheri_errored)) begin : cheri_err_reporting
117
+ // Report the first occurrence of each exception by name.
118
+ for (int unsigned e = 0 ; e < CheriErrWidth; e++ ) begin
119
+ if (cheri_err[e] & ! cheri_errored[e]) begin
120
+ string name;
121
+ case (e)
122
+ 0 : name = " Bounds" ;
123
+ 1 : name = " Tag" ;
124
+ 2 : name = " Seal" ;
125
+ 3 : name = " Permit Execute" ;
126
+ 4 : name = " Permit Load" ;
127
+ 5 : name = " Permit Store" ;
128
+ 6 : name = " Permit Store Cap" ;
129
+ 7 : name = " Permit Store Local Cap" ;
130
+ 8 : name = " Permit Acc Sys Regs" ;
131
+ default : name = " Unknown" ;
132
+ endcase
133
+ // Ensure that the output is visible promptly.
134
+ $fdisplay (STDERR , " *** CHERI '%s ' violation occurred *** at time %t " , name, $time );
135
+ $fflush (STDERR );
136
+ // Remember that this error occurred; each error signal will be asserted many times
137
+ // because they are intended to drive LEDs on the FPGA board and are thus modulated.
138
+ cheri_errored <= cheri_errored | cheri_err;
139
+ end
140
+ end
141
+ end
142
+ end
143
+
101
144
// Instantiating the Sonata System.
102
145
sonata_system # (
103
146
.GpiWidth ( 14 ),
104
147
.GpoWidth ( 23 ),
105
148
.PwmWidth ( 1 ),
106
- .CheriErrWidth ( 9 ),
149
+ .CheriErrWidth ( CheriErrWidth ),
107
150
.SysClkFreq ( SysClkFreq ),
108
151
.HRClkFreq ( HRClkFreq ),
109
152
.DisableHyperram ( DisableHyperram )
@@ -200,10 +243,10 @@ module top_verilator (input logic clk_i, rst_ni);
200
243
.spi_mkr_tx_o ( ),
201
244
.spi_mkr_sck_o ( ),
202
245
203
- .cheri_en_i (EnableCHERI),
246
+ .cheri_en_i (EnableCHERI),
204
247
// CHERI output
205
- .cheri_err_o ( ),
206
- .cheri_en_o ( ),
248
+ .cheri_err_o (cheri_err ),
249
+ .cheri_en_o (cheri_en ),
207
250
208
251
// I2C bus 0
209
252
.i2c0_scl_i (scl0),
0 commit comments