rhdl_ed25519_fast_core/
core.rs1use rhdl::prelude::*;
8
9use crate::{
10 protocol::{Fast64CoreIn, Fast64CoreOut},
11 result_arbiter::{ResultArbiter, ResultArbiterIn, SignCompletion, VerifyCompletion},
12 sign::{CachedSignCore, CachedSignIn},
13 verify::{StrictVerifyCore, StrictVerifyIn},
14};
15
16#[derive(Clone, Debug, Synchronous, SynchronousDQ, Default)]
18pub struct Fast64Core {
19 signer: CachedSignCore,
20 verifier: StrictVerifyCore,
21 results: ResultArbiter,
22}
23
24impl SynchronousIO for Fast64Core {
25 type I = Fast64CoreIn;
26 type O = Fast64CoreOut;
27 type Kernel = fast64_core_kernel;
28}
29
30#[kernel]
32pub fn fast64_core_kernel(
33 _cr: ClockReset,
34 i: Fast64CoreIn,
35 q: Fast64CoreQ,
36) -> (Fast64CoreOut, Fast64CoreD) {
37 let output = Fast64CoreOut {
38 load_key_ready: q.signer.load_key_ready,
39 key_loaded: q.signer.key_loaded,
40 cached_public_key: q.signer.public_key,
41 sign_ready: q.signer.ready,
42 verify_ready: q.verifier.ready,
43 result: q.results.result,
44 internal_error: q.signer.internal_error || q.results.internal_error,
45 };
46 let mut d = Fast64CoreD::dont_care();
47 d.signer = CachedSignIn {
48 load_key_valid: i.load_key_valid,
49 key_seed: i.key_seed,
50 clear_key: i.clear_key,
51 valid: i.sign_valid,
52 request: i.sign,
53 };
54 d.verifier = StrictVerifyIn {
55 valid: i.verify_valid,
56 request: i.verify,
57 };
58 d.results = ResultArbiterIn {
59 sign: SignCompletion {
60 valid: q.signer.valid,
61 tag: q.signer.tag,
62 signature: q.signer.signature,
63 },
64 verify: VerifyCompletion {
65 valid: q.verifier.valid,
66 tag: q.verifier.tag,
67 ok: q.verifier.ok,
68 error: q.verifier.error,
69 },
70 sign_internal_error: q.signer.internal_error,
71 verify_internal_error: false,
72 };
73 (output, d)
74}
75
76#[cfg(test)]
77mod tests {
78 use super::*;
79
80 #[test]
81 #[ignore = "large whole-core elaboration; run explicitly before physical implementation"]
82 fn compiles_to_native_rhdl_netlist() -> miette::Result<()> {
83 unsafe { std::env::set_var("RHDL_SKIP_IVERILOG_CHECK", "1") };
84 Fast64Core::default().descriptor(ScopedName::top())?.hdl()?;
85 Ok(())
86 }
87}