Co-simulation is the coordinated simulation of two or more instances of a design (or related designs) so that their observable states can be compared against a shared specification. In hardware verification, it is used to check an RTL implementation against a golden reference model (often an Instruction Set Simulator), with mismatches indicating non-compliance with the specification. The cited evidence shows co-simulation applied in RISC-V processor verification (ZP Cosim with Dromajo against BlackParrot), in symbolic-execution RTL/ISS checking (MicroRV32 vs. RISC-V VP ISS via KLEE, with 10 RTL bugs and 2 ISS errors discovered), and in cyber-security co-simulation testbeds for the smart grid.
First seen5/25/2026
Last seen7/18/2026
Evidence70 chunks
Wikiv15
01
WIKI
Co-Simulation
Overview
Co-simulation is the coordinated use of multiple simulation components or models so that their behaviors can be combined or compared. In the cited ZP Cosim thesis it is defined as the process of simulating two (or more) instances of the same design with, generally, the same inputs: the expectation is that, if both instances are compliant with a formalized specification, the observable states at architecturally visible event boundaries (e.g., instruction retirements, CSR updates) will match within reason, and deviations will indicate one or both instances are not specification-compliant.
[1]Co-simulation is defined in the ZP Cosim thesis as the process of simulating two or more instances of the same design with the same inputs, comparing observable states at architecturally visible event boundaries such as instruction retirements and CSR updates.Co-Simulation (previous wiki, version 14)
[2]ZP Cosim treats Dromajo as the golden reference model and pairs it with BlackParrot instantiated under Verilator, Synopsys VCS, or FPGA emulation, with a control program feeding the executable program binary and parameters to both instances.Co-Simulation (previous wiki, version 14)
[3]Dromajo's trace comparison in ZP Cosim compares the retired instruction word, written registers/important CSRs, and the program counter; asynchronous events are manually overridden in Dromajo and comparison is done in 'almost' real time.Co-Simulation (previous wiki, version 14)
[4]ZP Cosim reduces cross-product coverage state-space to ⌈N/G⌉ · 2^G by grouping coverpoints and crossing only within groups.Co-Simulation (previous wiki, version 14)
[5]Dromajo is a formally proven RISC-V RV64GC functional reference model / multi-CPU simulator in C++ with memory/IO mapping, bootrom, custom-extension support, and checkpoint snapshot APIs used by ZP Cosim for co-simulation.Co-Simulation (previous wiki, version 14)
[6]The symbolic-execution RISC-V case study uses MicroRV32 as the DUT and the RISC-V VP ISS as the reference implementation, with instruction set RV32I+CSR, on a Linux server with an Intel Xeon Gold 6240 CPU.Processor Verification using Symbolic Execution - AGRA | Uni Bremen
[7]MicroRV32 had previously been extensively tested using constrained random techniques and also verified with the RISC-V formal tool using a Bounded Model Checking approach; the broader symbolic-execution co-simulation evaluation required more than 30 days of runtime.Processor Verification using Symbolic Execution - AGRA | Uni Bremen
[8]The symbolic-verification methodology revealed 10 bugs in the well-tested RTL core MicroRV32 and found 2 errors in the reference ISS, demonstrating the applicability of symbolic execution in full-scale processor co-simulation.Processor Verification using Symbolic Execution - AGRA | Uni Bremen
[9]An error-injection methodology defined 10 errors E0–E9 covering a broad range of RTL functionality; experiments used a 24-hour per-run limit, the co-simulation was configured for RV32I, and assumptions were added to block CSR instructions to filter known implementation mismatches.Processor Verification using Symbolic Execution - AGRA | Uni Bremen
[10]All injected errors E0–E9 were found very quickly regardless of instruction limit (1 or 2); with instruction limit 1, runs executed between 2,239,208 and 12,367,140 instructions and needed between 54 s and 3,237 s.Processor Verification using Symbolic Execution - AGRA | Uni Bremen
[11]Aggregated error-injection totals across all 10 injected errors were 53,283,172 / 88,712,782 instructions executed, 9,685 / 37,201 partial KLEE paths, 758 / 7,618 completed paths, and 166 / 57 seconds median-find times for instruction limits 1 / 2 respectively (medians 4,237,517 instructions and 543 partial paths vs. 4,560,215 instructions and 790 partial paths).Processor Verification using Symbolic Execution - AGRA | Uni Bremen
[13]RV32I misaligned load/store instructions (LW, LH, LHU, SW, SH, SHU) produce an implementation mismatch (M) because the MicroRV32 RTL core fully supports misaligned accesses while the ISS does not, despite both being valid per the RISC-V ISA.Processor Verification using Symbolic Execution - AGRA | Uni Bremen
[14]The ISS and RTL cycle/instruction counters (mcycle, minstret, mcycleh, minstreth) differ only as a mismatch (M) because the ISS is non-cycle-accurate; the ISS additionally implements cycle, cycleh, instret, instreth, time, timeh, mhpmcounter3-31, mhpmcounter3-31h, while the RTL does not implement mhpmevent3-31, mscratch, or mcounteren — all reported as implementation mismatches (M).Processor Verification using Symbolic Execution - AGRA | Uni Bremen
[15]A voter compares RTL and ISS execution results (PC, old PC, target-register value) and aborts on mismatch; if no mismatch is found, the simulation terminates when an instruction limit or clock-cycle limit is reached and the model is cleaned up.Processor Verification using Symbolic Execution - AGRA | Uni Bremen
[16]Future work plans hybrid symbolic-execution + fuzzing techniques for scalable, comprehensive verification, plus induction-based symbolic constraints to enable complete (non-BMC-bounded) processor verification.Processor Verification using Symbolic Execution - AGRA | Uni Bremen
[18]ExactStep is an instruction-accurate multi-target ISS (RISC-V RV32IMAC/RV64IMAC, MIPS mips-i, ARM-v6m) designed to be used as a library for co-simulation, peripherals, and System-C bus interfacing, executing one instruction per cpu::step() call.Co-Simulation (previous wiki, version 14)
[19]Distributed FMI-based co-simulation enables collaborative modeling by different stakeholders while implicitly protecting intellectual property; the cited UniFMU-based approach adds cybersecurity/IP-protection mechanisms (client-initiated connections, trusted platforms) and trades off IP-protected distribution against performance across four network settings.FMI-Based Distributed Co-Simulation with Enhanced Security and Intellectual Property Safeguards