Virtual prototyping is routinely used for tasks ranging from mechanical design to embedded systems. So why are we not commonly using virtual prototypes when building components for larger computer systems, such as new hardware accelerators or I/O devices? After all, with computer software we all employ agile development processes focussing on rapid iteration, getting something minimal to run, test, and improve step by step. In this post why dive into the underlying challenges for virtual prototyping in our domain.

Computer System Components Do Not Exist in Isolation

First, computer system components, be it software or hardware, are always part of a larger system. A hardware accelerator or network card in isolation is not useful and helps with neither functional testing nor performance isolation. Instead, computer components become useful by integration into larger systems through combination and interactions with other system components in hardware and software. Consequently, full system behavior and performance is ultimately what we want to test and optimize when designing new components.

Existing Simulators Cannot Simulate Complete Systems

There exists a wide array of different simulators for many different components, ranging from processors, memory, storage devices, and networks, all the way to full hardware circuits. Unfortunately, none of these tools supports simulating complete computer systems with all relevant components. After all, even simple systems easily comprise a dozen different hardware and software components with intricate and frequent interactions.

Steep Learning Curves and Substantial Configuration Effort

Additionally, these simulators are notoriously difficult to setup, learn, and configure. Even experienced engineers will typically spend a few weeks to get up and running with a new simulator. Some of this effort is one-time, but much of it is recurring when making changes.

Validation is a particular challenge. Most simulators provide a wide array of configuration parameters and allow users to simulate almost anything. However, to ensure the simulation provides meaningful results, users need to validate simulation parameters against physical systems. And most of the effort typically goes towards validating parameters not directly of interest to the user, on other components, the environment, and workloads.

Often More Trouble Than It Is Worth

With the currently available tools virtual prototyping requires substantial effort for limited benefit. Since the available simulators do not support prototyping complete systems, users need to devote additional substantial time and resources to model the environment. For example, network simulators require users to implement detailed protocols and application workload generators for meaningful results. Circuit simulators for new hardware devices require users to develop test-benches that implement the environment of the device; for a network card or an accelerator, this involves replicating the device driver and application logic. All this effort is only useful for enabling the simulation and does not further benefit the actual product development. As a result, computer system component developers today, only resort to simulations for limited evaluation, such as unit-testing of individual hardware modules or validating some aspect of a new network protocol. Virtual prototypes of complete systems are almost unheard of.

Is There a Better Way?

With SimBricks, we tackle exactly these challenges to make virtual prototyping for even complex and large-scale computer systems not just possible but easy! We believe building computer hardware systems can become a lot more like building software, fast and iterative, with virtual prototyping. Learn how our other blog posts or get in touch with us directly: