#[dpi]Expand description
Marlin allows you to import Rust functions into (System)Verilog over DPI. The function must have “C” linkage and be imported into SystemVerilog with “DPI-C” linkage.
For example:
// in Rust
#[verilog::dpi]
pub extern "C" fn three(out: &mut u32) {
*out = 3;
}// in SystemVerilog
import "DPI-C" function void three(output int out);The Rust function can only take in primitive integer types at or below 64-bit width and booleans. The order and count of parameters must correspond exactly with the SystemVerilog import declaration.
Any input parameter on the Verilog side should correspond to a plain
argument on the Rust side. Any output or inout parmaeter on the Verilog
side should corresponding to a mutable reference on the Rust side. Note that
the names of parmaeters on either side are irrelevant and need not
correspond.
Here are some examples:
| SystemVerilog parameter | Rust parameter |
|---|---|
output int foo | foo: &mut i32 |
input bit bar | bar: bool |
§More
Please reference the Verilator docs on VPI for further information. You can also see the corresponding page in the Marlin handbook.