@@ -568,6 +568,8 @@ template device {
568
568
// this carried semantics in DML 1.2; deprecated in 1.4
569
569
param _confidentiality = undefined;
570
570
571
+ session conf_object_t *_current_initiator;
572
+
571
573
method _init() { _rec_init(); }
572
574
method _post_init() { _rec_post_init(); }
573
575
method init() default {}
@@ -2007,52 +2009,74 @@ template bank is (object, shown_desc) {
2007
2009
return 0;
2008
2010
}
2009
2011
2010
- local register hits[8];
2011
- local int num_hits;
2012
- local uint64 unmapped_bytes;
2012
+ local uint64 readval = 0;
2013
+ local bool ok = true;
2013
2014
2014
2015
local uint64 size = _enabled_bytes_to_size(enabled_bytes);
2015
- (num_hits, unmapped_bytes) = this._dispatch(offset, size, hits, false);
2016
+ local bool inquiry_override = false;
2017
+ _callback_before_read(this._bank_obj(), dev._current_initiator,
2018
+ &inquiry_override, &offset,
2019
+ size, &_connections, &_before_read_callbacks);
2020
+ if (inquiry_override) {
2021
+ readval = this.get(offset, size);
2022
+ } else {
2023
+ try {
2024
+ local register hits[8];
2025
+ local int num_hits;
2026
+ local uint64 unmapped_bytes;
2016
2027
2017
- local uint64 readval = 0;
2018
- if ((unmapped_bytes & enabled_bytes) != 0) {
2019
- readval[size * 8 - 1 : 0] = this.unmapped_read(
2020
- offset, unmapped_bytes & enabled_bytes, aux);
2021
- }
2028
+ (num_hits, unmapped_bytes) = this._dispatch(
2029
+ offset, size, hits, false);
2022
2030
2023
- for (local int r = 0; r < num_hits; ++r) {
2024
- local int r_start;
2025
- local int r_end;
2026
- (r_start, r_end) = this._intersect(
2027
- hits[r].offset, hits[r]._size(), offset, size, true);
2031
+ if ((unmapped_bytes & enabled_bytes) != 0) {
2032
+ readval[size * 8 - 1 : 0] = this.unmapped_read(
2033
+ offset, unmapped_bytes & enabled_bytes, aux);
2034
+ }
2028
2035
2029
- local int start;
2030
- local int end;
2031
- (start, end) = this._intersect(
2032
- offset, size, hits[r].offset, hits[r]._size(), true);
2036
+ for (local int r = 0; r < num_hits; ++r) {
2037
+ local int r_start;
2038
+ local int r_end;
2039
+ (r_start, r_end) = this._intersect(
2040
+ hits[r].offset, hits[r]._size(), offset, size, true);
2041
+
2042
+ local int start;
2043
+ local int end;
2044
+ (start, end) = this._intersect(
2045
+ offset, size, hits[r].offset, hits[r]._size(), true);
2046
+
2047
+ local uint64 r_enabled_bytes = 0;
2048
+ r_enabled_bytes[r_end * 8 - 1 : r_start * 8] =
2049
+ enabled_bytes[end * 8 - 1 : start * 8];
2050
+ if (r_enabled_bytes == 0) {
2051
+ continue;
2052
+ }
2033
2053
2034
- local uint64 r_enabled_bytes = 0;
2035
- r_enabled_bytes[r_end * 8 - 1 : r_start * 8] =
2036
- enabled_bytes[end * 8 - 1 : start * 8];
2037
- if (r_enabled_bytes == 0) {
2038
- continue;
2039
- }
2054
+ local uint64 r_val = hits[r].read_register(r_enabled_bytes, aux);
2055
+ if (r_end - r_start == hits[r]._size()) {
2056
+ log info, 4, Register_Read:
2057
+ "Read from register %s -> 0x%0*x",
2058
+ hits[r]._qname(), cast(size*2, int), r_val;
2059
+ } else {
2060
+ log info, 4, Register_Read:
2061
+ "Partial read from register %s: bytes %d-%d -> 0x%0*x",
2062
+ hits[r]._qname(), r_start, r_end-1,
2063
+ cast(r_end - r_start, int),
2064
+ r_val[r_end * 8 - 1 : r_start * 8];
2065
+ }
2040
2066
2041
- local uint64 r_val = hits[r].read_register(r_enabled_bytes, aux);
2042
- if (r_end - r_start == hits[r]._size()) {
2043
- log info, 4, Register_Read:
2044
- "Read from register %s -> 0x%0*x",
2045
- hits[r]._qname(), cast(size*2, int), r_val;
2046
- } else {
2047
- log info, 4, Register_Read:
2048
- "Partial read from register %s: bytes %d-%d -> 0x%0*x",
2049
- hits[r]._qname(), r_start, r_end-1,
2050
- cast(r_end - r_start, int),
2051
- r_val[r_end * 8 - 1 : r_start * 8];
2067
+ readval[end * 8 - 1 : start * 8] =
2068
+ (r_val & r_enabled_bytes)[r_end * 8 - 1 : r_start * 8];
2069
+ }
2070
+ } catch {
2071
+ ok = false;
2052
2072
}
2053
-
2054
- readval[end * 8 - 1 : start * 8] =
2055
- (r_val & r_enabled_bytes)[r_end * 8 - 1 : r_start * 8];
2073
+ }
2074
+ _callback_after_read(this._bank_obj(), dev._current_initiator,
2075
+ &offset, size,
2076
+ &readval, &ok, &_connections,
2077
+ &_after_read_callbacks);
2078
+ if (!ok) {
2079
+ throw;
2056
2080
}
2057
2081
2058
2082
return readval;
@@ -2100,52 +2124,72 @@ template bank is (object, shown_desc) {
2100
2124
return;
2101
2125
}
2102
2126
2103
- local register hits[8];
2104
- local int num_hits;
2105
- local uint64 unmapped_bytes;
2106
-
2127
+ local bool suppress = false;
2107
2128
local uint64 size = _enabled_bytes_to_size(enabled_bytes);
2108
- (num_hits, unmapped_bytes) = this._dispatch(offset, size, hits, false);
2109
- if ((unmapped_bytes & enabled_bytes) != 0) {
2110
- this.unmapped_write(
2111
- offset, value, unmapped_bytes & enabled_bytes, aux);
2112
- }
2113
-
2114
- for (local int r = 0; r < num_hits; ++r) {
2115
- local int r_start;
2116
- local int r_end;
2117
- (r_start, r_end) = this._intersect(
2118
- hits[r].offset, hits[r]._size(), offset, size, true);
2129
+ _callback_before_write(
2130
+ this._bank_obj(), dev._current_initiator, &offset, size,
2131
+ &value,
2132
+ &suppress, &_connections, &_before_write_callbacks);
2133
+ local bool ok = true;
2134
+ if (!suppress) {
2135
+ try {
2136
+ local register hits[8];
2137
+ local int num_hits;
2138
+ local uint64 unmapped_bytes;
2139
+
2140
+ (num_hits, unmapped_bytes) = this._dispatch(
2141
+ offset, size, hits, false);
2142
+ if ((unmapped_bytes & enabled_bytes) != 0) {
2143
+ this.unmapped_write(
2144
+ offset, value, unmapped_bytes & enabled_bytes, aux);
2145
+ }
2119
2146
2120
- local int start;
2121
- local int end;
2122
- (start, end) = this._intersect(
2123
- offset, size, hits[r].offset, hits[r]._size(), true);
2147
+ for (local int r = 0; r < num_hits; ++r) {
2148
+ local int r_start;
2149
+ local int r_end;
2150
+ (r_start, r_end) = this._intersect(
2151
+ hits[r].offset, hits[r]._size(), offset, size, true);
2152
+
2153
+ local int start;
2154
+ local int end;
2155
+ (start, end) = this._intersect(
2156
+ offset, size, hits[r].offset, hits[r]._size(), true);
2157
+
2158
+ local uint64 r_enabled_bytes = 0;
2159
+ r_enabled_bytes[r_end * 8 - 1 : r_start * 8] =
2160
+ enabled_bytes[end * 8 - 1 : start * 8];
2161
+ if (r_enabled_bytes == 0) {
2162
+ continue;
2163
+ }
2124
2164
2125
- local uint64 r_enabled_bytes = 0;
2126
- r_enabled_bytes[r_end * 8 - 1 : r_start * 8] =
2127
- enabled_bytes[end * 8 - 1 : start * 8];
2128
- if (r_enabled_bytes == 0) {
2129
- continue;
2130
- }
2165
+ local uint64 r_value = 0;
2166
+ r_value[r_end * 8 - 1 : r_start * 8]
2167
+ = value[end * 8 - 1 : start * 8];
2168
+ if (r_end - r_start == hits[r]._size()) {
2169
+ log info, 4, Register_Write:
2170
+ "Write to register %s <- 0x%0*x",
2171
+ hits[r]._qname(), cast(size*2, int), r_value;
2172
+ } else {
2173
+ log info, 4, Register_Write:
2174
+ "Partial write to register %s: bytes %d-%d <- 0x%0*x",
2175
+ hits[r]._qname(), r_start, r_end-1,
2176
+ cast(r_end - r_start, int),
2177
+ r_value[r_end * 8 - 1 : r_start * 8];
2178
+ }
2131
2179
2132
- local uint64 r_value = 0;
2133
- r_value[r_end * 8 - 1 : r_start * 8]
2134
- = value[end * 8 - 1 : start * 8];
2135
- if (r_end - r_start == hits[r]._size()) {
2136
- log info, 4, Register_Write:
2137
- "Write to register %s <- 0x%0*x",
2138
- hits[r]._qname(), cast(size*2, int), r_value;
2139
- } else {
2140
- log info, 4, Register_Write:
2141
- "Partial write to register %s: bytes %d-%d <- 0x%0*x",
2142
- hits[r]._qname(), r_start, r_end-1,
2143
- cast(r_end - r_start, int),
2144
- r_value[r_end * 8 - 1 : r_start * 8];
2180
+ hits[r].write_register(
2181
+ r_value & r_enabled_bytes, r_enabled_bytes, aux);
2182
+ }
2183
+ } catch {
2184
+ ok = false;
2145
2185
}
2186
+ }
2187
+ _callback_after_write(
2188
+ this._bank_obj(), dev._current_initiator, &offset, size,
2189
+ &ok, &_connections, &_after_write_callbacks);
2146
2190
2147
- hits[r].write_register(r_value & r_enabled_bytes, r_enabled_bytes,
2148
- aux) ;
2191
+ if (!ok) {
2192
+ throw ;
2149
2193
}
2150
2194
}
2151
2195
@@ -2240,7 +2284,8 @@ template bank is (object, shown_desc) {
2240
2284
default {
2241
2285
local uint64 size = SIM_get_mem_op_size(memop);
2242
2286
local bool inquiry = SIM_get_mem_op_inquiry(memop);
2243
- local conf_object_t *ini = SIM_get_mem_op_initiator(memop);
2287
+ local conf_object_t *prev_initiator = dev._current_initiator;
2288
+ dev._current_initiator = SIM_get_mem_op_initiator(memop);
2244
2289
2245
2290
local bool success = true;
2246
2291
if (inquiry) {
@@ -2262,53 +2307,33 @@ template bank is (object, shown_desc) {
2262
2307
} else {
2263
2308
if (SIM_mem_op_is_read(memop)) {
2264
2309
local uint64 value = 0;
2265
- local bool inquiry_override = false;
2266
- _callback_before_read(
2267
- this._bank_obj(), ini, &inquiry_override,
2268
- &offset, size, &_connections, &_before_read_callbacks);
2269
2310
try {
2270
- if (inquiry_override) {
2271
- value = this.get(offset, size);
2272
- } else {
2273
- value = this.read(offset, _mask(size), aux);
2274
- }
2311
+ value = this.read(offset, _mask(size), aux);
2275
2312
} catch {
2276
2313
success = false;
2277
2314
}
2278
- _callback_after_read(this._bank_obj(), ini, &offset, size,
2279
- &value, &success, &_connections,
2280
- &_after_read_callbacks);
2281
2315
2282
2316
if (success) {
2283
2317
this._memop_set_read_value(memop, value);
2284
2318
}
2285
2319
} else {
2286
2320
local uint64 writevalue = this._memop_write_value(memop);
2287
-
2288
- local bool suppress = false;
2289
- _callback_before_write(
2290
- this._bank_obj(), ini, &offset, size, &writevalue,
2291
- &suppress, &_connections, &_before_write_callbacks);
2292
- if (!suppress) {
2293
- try {
2294
- this.write(offset, writevalue, _mask(size), aux);
2295
- } catch {
2296
- success = false;
2297
- }
2321
+ try {
2322
+ this.write(offset, writevalue, _mask(size), aux);
2323
+ } catch {
2324
+ success = false;
2298
2325
}
2299
- _callback_after_write(this._bank_obj(), ini, &offset, size,
2300
- &success, &_connections,
2301
- &_after_write_callbacks);
2302
2326
}
2303
2327
}
2304
2328
2329
+ dev._current_initiator = prev_initiator;
2305
2330
return success;
2306
2331
}
2307
2332
2308
2333
shared method transaction_access(transaction_t *t, uint64 offset,
2309
2334
void *aux) -> (exception_type_t) default {
2310
2335
local uint64 size = SIM_transaction_size(t);
2311
- local conf_object_t *ini = SIM_transaction_initiator(t) ;
2336
+ local conf_object_t *ini = dev._current_initiator ;
2312
2337
local uint8 buf[size];
2313
2338
if (SIM_transaction_is_write(t)) {
2314
2339
local buffer_t bytes;
@@ -2346,7 +2371,8 @@ template bank is (object, shown_desc) {
2346
2371
shared method _transaction_access(
2347
2372
conf_object_t *ini, bool is_read, bool inquiry,
2348
2373
uint64 offset, uint64 size, uint8 *buf, void *aux) -> (bool) {
2349
-
2374
+ local conf_object_t *prev_ini = dev._current_initiator;
2375
+ dev._current_initiator = ini;
2350
2376
local bool success = true;
2351
2377
if (inquiry) {
2352
2378
if (is_read) {
@@ -2366,47 +2392,23 @@ template bank is (object, shown_desc) {
2366
2392
}
2367
2393
} else {
2368
2394
if (is_read) {
2369
- local bool inquiry_override = false;
2370
- _callback_before_read(this._bank_obj(), ini,
2371
- &inquiry_override, &offset,
2372
- size, &_connections, &_before_read_callbacks);
2373
- local uint64 value = 0;
2374
2395
try {
2375
- if (inquiry_override) {
2376
- value = this.get(offset, size);
2377
- } else {
2378
- value = this.read(offset, _mask(size), aux);
2379
- }
2380
- } catch {
2381
- success = false;
2382
- }
2383
-
2384
- _callback_after_read(this._bank_obj(), ini, &offset, size,
2385
- &value, &success, &_connections,
2386
- &_after_read_callbacks);
2387
-
2388
- if (success) {
2396
+ local uint64 value = this.read(offset, _mask(size), aux);
2389
2397
this._set_read_value(size, buf, value);
2398
+ return true;
2399
+ } catch {
2400
+ return false;
2390
2401
}
2391
2402
} else {
2392
2403
local uint64 writevalue = this._write_value(size, buf);
2393
-
2394
- local bool suppress = false;
2395
- _callback_before_write(
2396
- this._bank_obj(), ini, &offset, size, &writevalue,
2397
- &suppress, &_connections, &_before_write_callbacks);
2398
- if (!suppress) {
2399
- try {
2400
- this.write(offset, writevalue, _mask(size), aux);
2401
- } catch {
2402
- success = false;
2403
- }
2404
+ try {
2405
+ this.write(offset, writevalue, _mask(size), aux);
2406
+ } catch {
2407
+ success = false;
2404
2408
}
2405
- _callback_after_write(this._bank_obj(), ini, &offset, size,
2406
- &success, &_connections,
2407
- &_after_write_callbacks);
2408
2409
}
2409
2410
}
2411
+ dev._current_initiator = prev_ini;
2410
2412
2411
2413
return success;
2412
2414
}
0 commit comments