
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://jesse486.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://jesse486.github.io/" rel="alternate" type="text/html" /><updated>2026-03-29T02:39:08+00:00</updated><id>https://jesse486.github.io/feed.xml</id><title type="html">Jesse’s Personal Page</title><subtitle>personal description</subtitle><author><name>Jesse</name><email>xinyuanfu1998@gmail.com</email></author><entry><title type="html">Upcoming: Open-Source Co-Simulation Infrastructure for RISC-V SoCs</title><link href="https://jesse486.github.io/posts/2199/01/future-post/" rel="alternate" type="text/html" title="Upcoming: Open-Source Co-Simulation Infrastructure for RISC-V SoCs" /><published>2199-01-01T00:00:00+00:00</published><updated>2199-01-01T00:00:00+00:00</updated><id>https://jesse486.github.io/posts/2199/01/future-post</id><content type="html" xml:base="https://jesse486.github.io/posts/2199/01/future-post/"><![CDATA[<p>I am working on releasing an open-source co-simulation framework combining Verilator and QEMU for RISC-V SoC development. Stay tuned for the release and an accompanying technical write-up.</p>]]></content><author><name>Jesse</name><email>xinyuanfu1998@gmail.com</email></author><category term="open source" /><category term="RISC-V" /><category term="co-simulation" /><summary type="html"><![CDATA[I am working on releasing an open-source co-simulation framework combining Verilator and QEMU for RISC-V SoC development. Stay tuned for the release and an accompanying technical write-up.]]></summary></entry><entry><title type="html">AI Workloads Are Changing SoC Architecture — Here Is How</title><link href="https://jesse486.github.io/posts/2012/08/blog-post-4/" rel="alternate" type="text/html" title="AI Workloads Are Changing SoC Architecture — Here Is How" /><published>2015-08-14T00:00:00+00:00</published><updated>2015-08-14T00:00:00+00:00</updated><id>https://jesse486.github.io/posts/2012/08/blog-post-4</id><content type="html" xml:base="https://jesse486.github.io/posts/2012/08/blog-post-4/"><![CDATA[<p>Neural network inference workloads have a fundamentally different memory access pattern and compute structure compared to traditional CPU workloads. This is reshaping how SoC architects think about memory hierarchy, interconnect, and heterogeneous compute integration.</p>

<h2 id="memory-bandwidth-is-the-bottleneck">Memory Bandwidth Is the Bottleneck</h2>

<p>Most AI inference is not compute-bound — it is memory-bandwidth-bound. The implication for SoC design is that the memory subsystem (DRAM bandwidth, on-chip SRAM sizing, cache behavior) matters far more than raw compute throughput for realistic workloads. Architects who treat NPU TOPS as the primary metric are optimizing the wrong thing.</p>

<h2 id="dataflow-matters-more-than-isa">Dataflow Matters More Than ISA</h2>

<p>For AI accelerators integrated into an SoC, the dataflow architecture — how data moves between compute units, scratchpads, and DRAM — dominates both performance and energy. This is a hardware/software co-design problem: the optimal dataflow depends on the network topology being run, which means the accelerator’s programming model must expose enough flexibility for software to exploit the hardware efficiently.</p>

<h2 id="simulation-is-essential">Simulation Is Essential</h2>

<p>You cannot reason about these trade-offs in the abstract. A Verilator-simulated SoC running real inference workloads tells you far more than any analytical model. This is where simulation-driven co-design earns its keep.</p>]]></content><author><name>Jesse</name><email>xinyuanfu1998@gmail.com</email></author><category term="AI" /><category term="SoC" /><category term="architecture" /><summary type="html"><![CDATA[Neural network inference workloads have a fundamentally different memory access pattern and compute structure compared to traditional CPU workloads. This is reshaping how SoC architects think about memory hierarchy, interconnect, and heterogeneous compute integration.]]></summary></entry><entry><title type="html">Hardware/Software Co-Design: What It Actually Means in Practice</title><link href="https://jesse486.github.io/posts/2014/08/blog-post-3/" rel="alternate" type="text/html" title="Hardware/Software Co-Design: What It Actually Means in Practice" /><published>2014-08-14T00:00:00+00:00</published><updated>2014-08-14T00:00:00+00:00</updated><id>https://jesse486.github.io/posts/2014/08/blog-post-3</id><content type="html" xml:base="https://jesse486.github.io/posts/2014/08/blog-post-3/"><![CDATA[<p>“Hardware/software co-design” is a phrase that gets thrown around a lot in academic papers. Having spent time both in research and close to industry SoC development, here is what it actually looks like in practice.</p>

<h2 id="it-is-mostly-about-feedback-loops">It Is Mostly About Feedback Loops</h2>

<p>The core idea is simple: hardware and software teams should not work in isolation and reconcile at the end. They should share a simulation environment where architectural decisions are immediately visible to the software side, and software performance on real workloads feeds back into hardware architectural choices.</p>

<p>In practice, this means your RTL simulation must be fast enough and complete enough to run real software — not just synthetic benchmarks. That is why Verilator and QEMU are so central to my workflow: they make the feedback loop fast enough to actually use.</p>

<h2 id="the-hardest-part-is-the-interface">The Hardest Part Is the Interface</h2>

<p>Most of the contentious co-design decisions happen at the hardware-software interface: register maps, interrupt behavior, DMA programming models, power management protocols. Getting these wrong is expensive in silicon. Getting them right requires both sides at the table, with a shared simulation environment they both trust.</p>

<h2 id="what-academia-gets-wrong">What Academia Gets Wrong</h2>

<p>Academic co-design papers often propose elegant joint optimization frameworks that assume hardware and software can be changed simultaneously and freely. Real SoC development is messier: hardware has a longer iteration cycle, software teams have deadlines, and the interface contracts freeze early. Good co-design methodology accounts for this asymmetry.</p>]]></content><author><name>Jesse</name><email>xinyuanfu1998@gmail.com</email></author><category term="co-design" /><category term="SoC" /><category term="methodology" /><summary type="html"><![CDATA[“Hardware/software co-design” is a phrase that gets thrown around a lot in academic papers. Having spent time both in research and close to industry SoC development, here is what it actually looks like in practice.]]></summary></entry><entry><title type="html">Modeling Custom SoC Peripherals in QEMU</title><link href="https://jesse486.github.io/posts/2013/08/blog-post-2/" rel="alternate" type="text/html" title="Modeling Custom SoC Peripherals in QEMU" /><published>2013-08-14T00:00:00+00:00</published><updated>2013-08-14T00:00:00+00:00</updated><id>https://jesse486.github.io/posts/2013/08/blog-post-2</id><content type="html" xml:base="https://jesse486.github.io/posts/2013/08/blog-post-2/"><![CDATA[<p>One of the most practical skills in pre-silicon SoC development is the ability to model custom peripherals inside QEMU so that your software team can begin driver development months before tape-out. Here is a quick walkthrough of how I approach this.</p>

<h2 id="the-basic-pattern">The Basic Pattern</h2>

<p>Every QEMU device model implements a small set of C callbacks: <code class="language-plaintext highlighter-rouge">read</code>, <code class="language-plaintext highlighter-rouge">write</code>, and <code class="language-plaintext highlighter-rouge">reset</code>. These map to MMIO accesses from the emulated CPU. The key is to register your device’s memory region with the correct base address and size matching your SoC memory map.</p>

<h2 id="interrupt-modeling">Interrupt Modeling</h2>

<p>Most peripherals need to signal the CPU. QEMU exposes IRQ lines that you connect during machine init. In your device model, call <code class="language-plaintext highlighter-rouge">qemu_irq_raise</code> and <code class="language-plaintext highlighter-rouge">qemu_irq_lower</code> to simulate interrupt assertion and deassertion — your Linux driver’s interrupt handler will see exactly the same behavior it will see on real silicon (assuming your model is accurate).</p>

<h2 id="lessons-learned">Lessons Learned</h2>

<ul>
  <li>Keep your QEMU model and your RTL spec in sync. Divergence here is the most common source of “works in emulation, broken on silicon” bugs.</li>
  <li>Model error conditions explicitly — drivers need to handle them, and QEMU is the only place to test them pre-silicon.</li>
  <li>Use QEMU’s tracing infrastructure liberally during bring-up; it saves enormous debugging time.</li>
</ul>]]></content><author><name>Jesse</name><email>xinyuanfu1998@gmail.com</email></author><category term="QEMU" /><category term="SoC" /><category term="emulation" /><summary type="html"><![CDATA[One of the most practical skills in pre-silicon SoC development is the ability to model custom peripherals inside QEMU so that your software team can begin driver development months before tape-out. Here is a quick walkthrough of how I approach this.]]></summary></entry><entry><title type="html">Why I Use Verilator Instead of Commercial Simulators</title><link href="https://jesse486.github.io/posts/2012/08/blog-post-1/" rel="alternate" type="text/html" title="Why I Use Verilator Instead of Commercial Simulators" /><published>2012-08-14T00:00:00+00:00</published><updated>2012-08-14T00:00:00+00:00</updated><id>https://jesse486.github.io/posts/2012/08/blog-post-1</id><content type="html" xml:base="https://jesse486.github.io/posts/2012/08/blog-post-1/"><![CDATA[<p>When I started my PhD, I assumed the right tool for RTL simulation was one of the big commercial simulators — VCS, Questa, or similar. A year in, I switched entirely to Verilator. Here is why.</p>

<h2 id="speed">Speed</h2>

<p>Verilator compiles your SystemVerilog RTL into optimized C++ and runs it natively. For large SoC simulations running realistic software workloads, this is often 10–100x faster than event-driven commercial simulators. When you need to boot Linux on your simulated SoC to run a benchmark, that speedup is not optional — it is the difference between a usable flow and an unusable one.</p>

<h2 id="openness">Openness</h2>

<p>Verilator is open source. That means I can instrument the simulation model, inject custom C++ side-channels, integrate it with QEMU via a shared memory interface, and generally treat the compiled simulation as a library rather than a black box. Commercial simulators rarely allow this level of integration.</p>

<h2 id="trade-offs">Trade-offs</h2>

<p>Verilator is a two-state simulator (no X/Z propagation by default) and does not support all SystemVerilog constructs out of the box. For gate-level simulation or formal verification, you still need other tools. But for architecture exploration and hardware/software co-design, it is hard to beat.</p>]]></content><author><name>Jesse</name><email>xinyuanfu1998@gmail.com</email></author><category term="verilator" /><category term="RTL simulation" /><category term="SoC" /><summary type="html"><![CDATA[When I started my PhD, I assumed the right tool for RTL simulation was one of the big commercial simulators — VCS, Questa, or similar. A year in, I switched entirely to Verilator. Here is why.]]></summary></entry></feed>