页面框架已切换为简体中文。尚未完成本地化的交互标签暂时使用英文;ASL/NDF 源、稳定标识和证据在所有语言中保持原文。
PTO-SCALAR-MODEL-AMO-SEMANTICS
PTO-SCALAR-MODEL-AMO-SEMANTICSASL 伪代码
下面直接显示完整的 ASL 所有者。
// PTO-UNIT: {"id":"PTO-SCALAR-MODEL-AMO-SEMANTICS","surface":"scalar","classification":["model","amo","semantics"],"depends_on":["PTO-SCALAR-MODEL-AGU-ADDRESSING","PTO-ARCH-MEMORY-MODEL-ATOMICITY"]}// PTO-REQ-SCALAR-AMO-001, PTO-REQ-MEMORY-TSO-001: LR/SC, CAS, and atomic// read-modify-write operations represented as indivisible TSO events.
readonly impdef func AtomicAddress(address: Word, far: boolean) => Wordbegin // The portable model has one flat address domain. FAR remains an explicit // address-class hint so profiles can refine it without changing decoding. if far then return address; else return address; end;end;
pure func NormalizeAtomicReturn(value: Word, size_bytes: integer {1,2,4,8}) => Wordbegin case size_bytes of when 1 => return ZeroExtend{PTO_XLEN}(value[7:0]); when 2 => return ZeroExtend{PTO_XLEN}(value[15:0]); when 4 => return SignExtend{PTO_XLEN}(value[31:0]); when 8 => return value; end;end;
// DMA copies one 64-byte command payload. Both ranges are translated and// permission-checked before any byte is read or written. Source bytes are// snapshotted before the destination commit, so overlapping ranges have// memmove semantics and any fault leaves memory unchanged.func ExecuteScalarDMACopy64(source_address: Word, destination_address: Word)begin let source_probe = ProbeDataAccess(source_address, 64, 1, FALSE); if RaiseDataAccessFault(source_probe, source_address) then return; end;
let destination_probe = ProbeDataAccess(destination_address, 64, 1, TRUE); if RaiseDataAccessFault(destination_probe, destination_address) then return; end;
let snapshot = LoadTranslatedBytes64(source_probe.translated_address); var event_values: array [[8]] of Word; for chunk = 0 to 7 do let offset = (chunk * 8) as integer {0..262144}; let translated_source = source_probe.translated_address + NaturalToWord(offset); let snapshot_value = Bytes64ChunkValue(snapshot, chunk); event_values[[chunk]] = snapshot_value; RecordLoadEvent( translated_source, 8, snapshot_value, MemoryOrder_Relaxed); end;
StoreTranslatedBytes64( destination_address, destination_probe.translated_address, snapshot);
for chunk = 0 to 7 do let offset = (chunk * 8) as integer {0..262144}; let translated_destination = destination_probe.translated_address + NaturalToWord(offset); RecordStoreEvent( translated_destination, 8, event_values[[chunk]], MemoryOrder_Relaxed); end;end;
func LoadReserved(address: Word, size_bytes: integer {1,2,4,8}, order: MemoryOrder) => Wordbegin let result = LoadWithOrder(address, size_bytes, order); // A fault has no LR reservation effect. In particular, it preserves an // older reservation rather than replacing or clearing it. if _LastFault == Fault_None then _ReservationValid = TRUE; _ReservationAddress = address; _ReservationSize = size_bytes; end; return result;end;
func StoreConditional(address: Word, size_bytes: integer {1,2,4,8}, value: Word, order: MemoryOrder) => Wordbegin let reservation_granule = ReservationGranuleAddress(); let requested_granule = address - NaturalToWord( (UInt(address) MOD PTO_RESERVATION_GRANULE_BYTES) as integer {0..262144}); // PTO's local exclusive monitor is cache-line based: SC width and exact // byte address do not narrow the reservation once the 64-byte line matches. let succeeds = _ReservationValid && reservation_granule == requested_granule; if succeeds then // Every SC attempt clears the local monitor, including a successful // reservation check followed by an access fault. _ReservationValid = FALSE; let probe = ProbeDataAccess(address, size_bytes, size_bytes, TRUE); if RaiseDataAccessFault(probe, address) then return Zeros{PTO_XLEN}; end; StoreTranslated(address, probe.translated_address, size_bytes, value); RecordStoreEvent(probe.translated_address, size_bytes, value, order); return Zeros{PTO_XLEN}; else // A reservation miss is deliberately probe-free, even when address is // misaligned or outside the active access domain. _ReservationValid = FALSE; return Zeros{PTO_XLEN} + 1; end;end;
pure func AtomicValue(op: AtomicOperation, old_value: Word, operand: Word) => Wordbegin case op of when Atomic_SWAP => return operand; when Atomic_ADD => return old_value + operand; when Atomic_AND => return old_value AND operand; when Atomic_OR => return old_value OR operand; when Atomic_XOR => return old_value XOR operand; when Atomic_SMIN => if SInt(old_value) < SInt(operand) then return old_value; else return operand; end; when Atomic_SMAX => if SInt(old_value) > SInt(operand) then return old_value; else return operand; end; when Atomic_UMIN => if UInt(old_value) < UInt(operand) then return old_value; else return operand; end; when Atomic_UMAX => if UInt(old_value) > UInt(operand) then return old_value; else return operand; end; end;end;
pure func NormalizeAtomicUnsigned(value: Word, size_bytes: integer {1,2,4,8}) => Wordbegin case size_bytes of when 1 => return ZeroExtend{PTO_XLEN}(value[7:0]); when 2 => return ZeroExtend{PTO_XLEN}(value[15:0]); when 4 => return ZeroExtend{PTO_XLEN}(value[31:0]); when 8 => return value; end;end;
pure func NormalizeAtomicSigned(value: Word, size_bytes: integer {1,2,4,8}) => Wordbegin case size_bytes of when 1 => return SignExtend{PTO_XLEN}(value[7:0]); when 2 => return SignExtend{PTO_XLEN}(value[15:0]); when 4 => return SignExtend{PTO_XLEN}(value[31:0]); when 8 => return value; end;end;
pure func AtomicValueSized(op: AtomicOperation, old_value: Word, operand: Word, size_bytes: integer {1,2,4,8}) => Wordbegin let old_unsigned = NormalizeAtomicUnsigned(old_value, size_bytes); let operand_unsigned = NormalizeAtomicUnsigned(operand, size_bytes); let old_signed = NormalizeAtomicSigned(old_value, size_bytes); let operand_signed = NormalizeAtomicSigned(operand, size_bytes); case op of when Atomic_SMIN => if SInt(old_signed) < SInt(operand_signed) then return old_unsigned; else return operand_unsigned; end; when Atomic_SMAX => if SInt(old_signed) > SInt(operand_signed) then return old_unsigned; else return operand_unsigned; end; otherwise => return NormalizeAtomicUnsigned(AtomicValue(op, old_unsigned, operand_unsigned), size_bytes); end;end;
func AtomicReadModifyWrite(address: Word, size_bytes: integer {1,2,4,8}, op: AtomicOperation, operand: Word, order: MemoryOrder) => Wordbegin let read_probe = ProbeDataAccess(address, size_bytes, size_bytes, FALSE); if RaiseDataAccessFault(read_probe, address) then return Zeros{PTO_XLEN}; end; let write_probe = ProbeDataAccess(address, size_bytes, size_bytes, TRUE); if RaiseDataAccessFault(write_probe, address) then return Zeros{PTO_XLEN}; end; if read_probe.translated_address != write_probe.translated_address then SetFault(Fault_DataPage, address); return Zeros{PTO_XLEN}; end; let old_value = LoadTranslatedUnsigned( read_probe.translated_address, size_bytes); let new_value = AtomicValueSized(op, old_value, operand, size_bytes); StoreTranslated(address, write_probe.translated_address, size_bytes, new_value); RecordAtomicEvent(write_probe.translated_address, size_bytes, old_value, new_value, order, TRUE); return old_value;end;
func CompareAndSwap(address: Word, size_bytes: integer {1,2,4,8}, expected: Word, desired: Word, order: MemoryOrder) => Wordbegin let read_probe = ProbeDataAccess(address, size_bytes, size_bytes, FALSE); if RaiseDataAccessFault(read_probe, address) then return Zeros{PTO_XLEN}; end; let write_probe = ProbeDataAccess(address, size_bytes, size_bytes, TRUE); if RaiseDataAccessFault(write_probe, address) then return Zeros{PTO_XLEN}; end; if read_probe.translated_address != write_probe.translated_address then SetFault(Fault_DataPage, address); return Zeros{PTO_XLEN}; end; let old_value = LoadTranslatedUnsigned( read_probe.translated_address, size_bytes); let succeeds = old_value == NormalizeAtomicUnsigned(expected, size_bytes); if succeeds then StoreTranslated(address, write_probe.translated_address, size_bytes, desired); end; RecordAtomicEvent(write_probe.translated_address, size_bytes, old_value, NormalizeAtomicUnsigned(desired, size_bytes), order, succeeds); return old_value;end;
架构行为
该内部模型单元不在双语读者指南迁移范围内;请直接阅读本页的 ASL/NDF 所有者与验证证据。
NDF 条款
正文来自 owning ASL。拖拽或按钮只临时改变当前页面显示顺序。
No NDF clause is attached to this unit.
Evidence index
8 matching entries
Executable evidence3
PTO-SCALAR-MODEL-AMO-SEMANTICS compiles as an independent normative unit
- surfaceSCALAR
- ownerPTO-SCALAR-MODEL-AMO-SEMANTICS
- categorySTATIC-INVARIANT
- case001
Show exact test source
Sources and references
- Complete stable ID
PTO-AVS-SCALAR-MODEL-AMO-SEMANTICS-STATIC-001- Path
tests/asl/scalar/model/amo/semantics/scalar-static-semantics-contract-001.asl- Kind / role
- static-invariant
- Pass condition
- the complete model and this unit's static invariant compile
- SHA-256
5927ba53e4683dc3e22507ffcd2620c6ea332a8082169f2485de50a88e450ad2
Covers Scalar Atomic Dispatch Effects.
- surfaceSCALAR
- ownerPTO-SCALAR-MODEL-AMO-SEMANTICS
- categoryATOMICITY
- case001
Show exact test source
Sources and references
- Complete stable ID
PTO-AVS-SCALAR-TESTSCALARATOMICDISPATCHEFFECTS-ATOMICITY-001- Path
tests/asl/scalar/model/amo/semantics/scalar-atomic-dispatch-effects-001.asl- Kind / role
- atomicity
- Pass condition
- TestScalarAtomicDispatchEffects completes without assertion failure
- SHA-256
75a0ca655ee4575728ed8de4ac07bd7f6e18cdb47696b4fb97d026f8935af8ae
Covers Scalar Atomics.
- surfaceSCALAR
- ownerPTO-SCALAR-MODEL-AMO-SEMANTICS
- categoryATOMICITY
- case001
Show exact test source
Sources and references
- Complete stable ID
PTO-AVS-SCALAR-TESTSCALARATOMICS-ATOMICITY-001- Path
tests/asl/scalar/model/amo/semantics/scalar-atomic-atomics-001.asl- Kind / role
- atomicity
- Pass condition
- TestScalarAtomics completes without assertion failure
- SHA-256
7af1332c23c78005470d710ff13079479f36a4943d899d7c07a199f98711a0d5
Commit-scoped evidence5
spec/evidence/release-traceability-readiness.json · closed
PTO-EVIDENCE-RELEASE-TRACEABILITYSources and references
- Complete stable ID
PTO-EVIDENCE-RELEASE-TRACEABILITY- Path
spec/evidence/release-traceability-readiness.json- Kind / role
- ASL/NDF/documentation/AVS traceability
- SHA-256
c7327021d39dc67ac5564bc55073b3870a397d79ac8d9648284d56e33bc14a3e
spec/evidence/instruction-contract-closure.json · closed
PTO-EVIDENCE-INSTRUCTION-CONTRACT-CLOSURESources and references
- Complete stable ID
PTO-EVIDENCE-INSTRUCTION-CONTRACT-CLOSURE- Path
spec/evidence/instruction-contract-closure.json- Kind / role
- mnemonic and encoding contract closure
- SHA-256
3ef2bb62421c79dff8fa77a1c7983923b523244b8090812883ef81286ca8106a
spec/evidence/architecture-readiness.json · open
PTO-EVIDENCE-ARCHITECTURE-READINESSSources and references
- Complete stable ID
PTO-EVIDENCE-ARCHITECTURE-READINESS- Path
spec/evidence/architecture-readiness.json- Kind / role
- architecture maturity and blockers
- SHA-256
4b0b85199101251bea744e0f3591cc31906909dc80d5ab651c417a936036a004
spec/evidence/release-gate-readiness.json · ready-for-exact-head-verification
PTO-EVIDENCE-RELEASE-GATE-READINESSSources and references
- Complete stable ID
PTO-EVIDENCE-RELEASE-GATE-READINESS- Path
spec/evidence/release-gate-readiness.json- Kind / role
- exact-head gate readiness
- SHA-256
a0f4d2b6920c08981ea55fd8ef820708a40d4feb5402c5150e8e9ab532d84ce0
spec/release-manifest.json · draft
PTO-EVIDENCE-RELEASE-MANIFESTSources and references
- Complete stable ID
PTO-EVIDENCE-RELEASE-MANIFEST- Path
spec/release-manifest.json- Kind / role
- release content and encoding fingerprints
- SHA-256
1a64c109ed7a90351c41e2a418b3c0ebaf8ad975838986d2101385186b85c0d8
Unit metadata
Open 4 generated metadata fields
Open generated traceability record
{
"classification": [
"model",
"amo",
"semantics"
],
"documentation": "docs/scalar/model/amo/semantics.md",
"id": "PTO-SCALAR-MODEL-AMO-SEMANTICS",
"mnemonic": null,
"readiness_subjects": [],
"semantic_tests": [
"PTO-AVS-SCALAR-TESTSCALARATOMICDISPATCHEFFECTS-ATOMICITY-001",
"PTO-AVS-SCALAR-TESTSCALARATOMICS-ATOMICITY-001"
],
"source": "asl/scalar/model/amo/semantics.asl",
"surface": "scalar",
"tests": [
"PTO-AVS-SCALAR-MODEL-AMO-SEMANTICS-STATIC-001",
"PTO-AVS-SCALAR-TESTSCALARATOMICDISPATCHEFFECTS-ATOMICITY-001",
"PTO-AVS-SCALAR-TESTSCALARATOMICS-ATOMICITY-001"
]
}来源与发布信息
展开 commit、路径、hash、版本和规范所有者
- 发布
0.58.5· 候选发布- Commit
7dc8b7e5b121d2b2499a2273bebff29e2cd86812- ASL SHA-256
feac3f10edbf29d34595f827eb66a39925be56eb3345e38574a5bab2424a871a- 生成文档
- docs/scalar/model/amo/semantics.md · 已融合到当前页面
- 文档 SHA-256
10b8d163b0ce595751b228841c17a1d799e02979408b6c8853576d54acd62d54
精确所有者
- ASL PTO-SCALAR-MODEL-AMO-SEMANTICS
asl/scalar/model/amo/semantics.asl