<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Pipelining on bitwiz</title><link>https://bitwiz.io/tags/pipelining/</link><description>Recent content in Pipelining on bitwiz</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 30 Dec 2025 05:20:00 +0000</lastBuildDate><atom:link href="https://bitwiz.io/tags/pipelining/index.xml" rel="self" type="application/rss+xml"/><item><title>Pipelining Without Breaking Your Protocol</title><link>https://bitwiz.io/articles/pipelining-without-breaking-your-protocol/</link><pubDate>Tue, 30 Dec 2025 05:20:00 +0000</pubDate><guid>https://bitwiz.io/articles/pipelining-without-breaking-your-protocol/</guid><description>&lt;p&gt;&lt;em&gt;Timing Series: Part 3 of 6&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Previous: &lt;a href="https://bitwiz.io/articles/understanding-timing-analysis/"&gt;Understanding Timing Analysis&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-register-that-broke-everything"&gt;The Register That Broke Everything&lt;/h2&gt;
&lt;p&gt;You added a pipeline register to fix timing. The path closed. The simulation failed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-systemverilog" data-lang="systemverilog"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Before: timing violation, functionally correct
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;data_out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_in&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;valid_out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;valid_in&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// After: timing clean, protocol broken
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;always_ff&lt;/span&gt; &lt;span class="p"&gt;@(&lt;/span&gt;&lt;span class="k"&gt;posedge&lt;/span&gt; &lt;span class="n"&gt;clk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;data_out&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_in&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;valid_out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;valid_in&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Still combinational
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You pipelined &lt;code&gt;data_out&lt;/code&gt; but not &lt;code&gt;valid_out&lt;/code&gt;. For one cycle, &lt;code&gt;valid_out&lt;/code&gt; asserts while &lt;code&gt;data_out&lt;/code&gt; holds stale data. Downstream captures garbage.&lt;/p&gt;
&lt;p&gt;If you registered data, register valid in the same &lt;code&gt;always_ff&lt;/code&gt;:&lt;/p&gt;</description></item></channel></rss>