跳到主要内容
页面框架已切换为简体中文。尚未完成本地化的交互标签暂时使用英文;ASL/NDF 源、稳定标识和证据在所有语言中保持原文。

PTO-SCALAR-MODEL-AMO-SEMANTICS

PTO-SCALAR-MODEL-AMO-SEMANTICS

ASL 伪代码

下面直接显示完整的 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
    1. surfaceSCALAR
    2. ownerPTO-SCALAR-MODEL-AMO-SEMANTICS
    3. categorySTATIC-INVARIANT
    4. 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
    Open exact source ↗ for PTO-AVS-SCALAR-MODEL-AMO-SEMANTICS-STATIC-001
  • Covers Scalar Atomic Dispatch Effects.
    1. surfaceSCALAR
    2. ownerPTO-SCALAR-MODEL-AMO-SEMANTICS
    3. categoryATOMICITY
    4. 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
    Open exact source ↗ for PTO-AVS-SCALAR-TESTSCALARATOMICDISPATCHEFFECTS-ATOMICITY-001
  • Covers Scalar Atomics.
    1. surfaceSCALAR
    2. ownerPTO-SCALAR-MODEL-AMO-SEMANTICS
    3. categoryATOMICITY
    4. 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
    Open exact source ↗ for PTO-AVS-SCALAR-TESTSCALARATOMICS-ATOMICITY-001
Commit-scoped evidence5
  • spec/evidence/release-traceability-readiness.json · closedPTO-EVIDENCE-RELEASE-TRACEABILITY
    Sources 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
    Open exact source ↗ for PTO-EVIDENCE-RELEASE-TRACEABILITY
  • spec/evidence/instruction-contract-closure.json · closedPTO-EVIDENCE-INSTRUCTION-CONTRACT-CLOSURE
    Sources 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
    Open exact source ↗ for PTO-EVIDENCE-INSTRUCTION-CONTRACT-CLOSURE
  • spec/evidence/architecture-readiness.json · openPTO-EVIDENCE-ARCHITECTURE-READINESS
    Sources and references
    Complete stable ID
    PTO-EVIDENCE-ARCHITECTURE-READINESS
    Path
    spec/evidence/architecture-readiness.json
    Kind / role
    architecture maturity and blockers
    SHA-256
    4b0b85199101251bea744e0f3591cc31906909dc80d5ab651c417a936036a004
    Open exact source ↗ for PTO-EVIDENCE-ARCHITECTURE-READINESS
  • spec/evidence/release-gate-readiness.json · ready-for-exact-head-verificationPTO-EVIDENCE-RELEASE-GATE-READINESS
    Sources 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
    Open exact source ↗ for PTO-EVIDENCE-RELEASE-GATE-READINESS
  • spec/release-manifest.json · draftPTO-EVIDENCE-RELEASE-MANIFEST
    Sources and references
    Complete stable ID
    PTO-EVIDENCE-RELEASE-MANIFEST
    Path
    spec/release-manifest.json
    Kind / role
    release content and encoding fingerprints
    SHA-256
    1a64c109ed7a90351c41e2a418b3c0ebaf8ad975838986d2101385186b85c0d8
    Open exact source ↗ for PTO-EVIDENCE-RELEASE-MANIFEST

Unit metadata

Open 4 generated metadata fields
id
PTO-SCALAR-MODEL-AMO-SEMANTICS
surface
scalar
classification
[
  "model",
  "amo",
  "semantics"
]
depends_on
[
  "PTO-SCALAR-MODEL-AGU-ADDRESSING",
  "PTO-ARCH-MEMORY-MODEL-ATOMICITY"
]
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

精确所有者