1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// ======================================================================================= // This Sail RISC-V architecture model, comprising all files and // directories except where otherwise noted is subject the BSD // two-clause license in the LICENSE file. // // SPDX-License-Identifier: BSD-2-Clause // ======================================================================================= // Callbacks for state-changing events val mem_write_callback = pure {c: "mem_write_callback"} : forall 'n, 0 < 'n <= max_mem_access . (/* access type */ string, /* addr */ physaddrbits, /* width */ int('n), /* value */ bits(8 * 'n)) -> unit function mem_write_callback(_) = () val mem_read_callback = pure {c: "mem_read_callback"} : forall 'n, 0 < 'n <= max_mem_access . (/* access type */ string, /* addr */ physaddrbits, /* width */ int('n), /* value */ bits(8 * 'n)) -> unit function mem_read_callback(_) = () val mem_exception_callback = pure {c: "mem_exception_callback"} : (/* addr */ physaddrbits, /* exception code */ exc_code) -> unit function mem_exception_callback(_) = () val pc_write_callback = pure {c: "pc_write_callback"} : xlenbits -> unit function pc_write_callback(_) = () val xreg_full_write_callback = pure {c: "xreg_full_write_callback"} : (string, regidx, xlenbits) -> unit function xreg_full_write_callback(_) = () val csr_full_write_callback = pure {c: "csr_full_write_callback"} : (string, csreg, xlenbits) -> unit function csr_full_write_callback(_) = () val csr_full_read_callback = pure {c: "csr_full_read_callback"} : (string, csreg, xlenbits) -> unit function csr_full_read_callback(_) = () val trap_callback = pure {c: "trap_callback"} : unit -> unit function trap_callback(_) = () // Overloads for easier use of callbacks function csr_name_write_callback(name : string, value : xlenbits) -> unit = { let csr = csr_name_map(name); csr_full_write_callback(name, csr, value); } function csr_id_write_callback(csr : csreg, value : xlenbits) -> unit = { let name = csr_name_map(csr); csr_full_write_callback(name, csr, value); } function csr_name_read_callback(name : string, value : xlenbits) -> unit = { let csr = csr_name_map(name); csr_full_read_callback(name, csr, value); } function csr_id_read_callback(csr : csreg, value : xlenbits) -> unit = { let name = csr_name_map(csr); csr_full_read_callback(name, csr, value); } overload csr_write_callback = {csr_name_write_callback, csr_id_write_callback, csr_full_write_callback} overload csr_read_callback = {csr_name_read_callback, csr_id_read_callback, csr_full_read_callback} function long_csr_write_callback(name : string, name_high : string, value : bits(64)) -> unit = { csr_write_callback(name, value[xlen - 1 .. 0]); if xlen == 32 then csr_write_callback(name_high, value[63 .. 32]); }