<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>bitwiz</title><link>https://bitwiz.io/</link><description>Recent content on bitwiz</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 03 Jan 2026 20:01:00 +0000</lastBuildDate><atom:link href="https://bitwiz.io/index.xml" rel="self" type="application/rss+xml"/><item><title>constraint-lint</title><link>https://bitwiz.io/projects/constraint-lint/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate><guid>https://bitwiz.io/projects/constraint-lint/</guid><description>&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Your XDC file is code. Vivado doesn&amp;rsquo;t lint it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-tcl" data-lang="tcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;create_clock&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;name clk156 &lt;span class="o"&gt;-&lt;/span&gt;period &lt;span class="mf"&gt;6.400&lt;/span&gt; &lt;span class="k"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;get_ports&lt;/span&gt; clk_156&lt;span class="k"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The port is &lt;code&gt;clk156&lt;/code&gt;. The clock attaches to nothing. Vivado warns once. It disappears into 200k lines of logs.&lt;/p&gt;
&lt;p&gt;Your constraint file says the clock exists. Your log has one warning: no valid objects matched. WNS is meaningless because the domain you thought you constrained doesn&amp;rsquo;t exist. You find out in the lab.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="what-constraint-lint-does"&gt;What constraint-lint Does&lt;/h2&gt;
&lt;p&gt;Lint for XDC/SDC. Runs in CI. Turns constraint warnings into hard failures.&lt;/p&gt;</description></item><item><title>Resets: The Timing Event You Forgot</title><link>https://bitwiz.io/articles/resets-the-timing-event-you-forgot/</link><pubDate>Sat, 03 Jan 2026 20:01:00 +0000</pubDate><guid>https://bitwiz.io/articles/resets-the-timing-event-you-forgot/</guid><description>&lt;p&gt;&lt;em&gt;Timing Series: Part 6 of 6&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Previous: &lt;a href="https://bitwiz.io/articles/cdc-two-flip-flops-are-not-magic/"&gt;CDC: Two Flip-Flops Are Not Magic&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-flop-that-didnt-reset"&gt;The Flop That Didn&amp;rsquo;t Reset&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;re debugging a sporadic startup failure. The system initializes correctly nine times out of ten. On the tenth, one module starts in a corrupted state while everything else works fine. The state machine begins in an illegal state. The counter starts at 7 instead of 0. The FIFO pointers are misaligned.&lt;/p&gt;
&lt;p&gt;You add more reset logic. You connect the reset to more flip-flops. The problem gets worse.&lt;/p&gt;</description></item><item><title>CDC: Two Flip-Flops Are Not Magic</title><link>https://bitwiz.io/articles/cdc-two-flip-flops-are-not-magic/</link><pubDate>Fri, 02 Jan 2026 05:19:00 +0000</pubDate><guid>https://bitwiz.io/articles/cdc-two-flip-flops-are-not-magic/</guid><description>&lt;p&gt;&lt;em&gt;Timing Series: Part 5 of 6&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Previous: &lt;a href="https://bitwiz.io/articles/silicon-real-estate-your-resource-budget/"&gt;Silicon Real Estate: Your Resource Budget&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-bug-you-cant-reproduce"&gt;The Bug You Can&amp;rsquo;t Reproduce&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;re debugging a data corruption bug. It happens once every few hours under heavy load. Sometimes once a day. The data path looks fine. The control logic looks fine. You add ILA triggers. You wait. You catch it.&lt;/p&gt;
&lt;p&gt;A control signal that pulses for one cycle is sometimes missed entirely. The path crosses clock domains. You have a 2-flop synchronizer.&lt;/p&gt;</description></item><item><title>Silicon Real Estate: Your Resource Budget</title><link>https://bitwiz.io/articles/silicon-real-estate-your-resource-budget/</link><pubDate>Wed, 31 Dec 2025 09:13:00 +0000</pubDate><guid>https://bitwiz.io/articles/silicon-real-estate-your-resource-budget/</guid><description>&lt;p&gt;&lt;em&gt;Timing Series: Part 4 of 6&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Previous: &lt;a href="https://bitwiz.io/articles/pipelining-without-breaking-your-protocol/"&gt;Pipelining Without Breaking Your Protocol&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="friday-afternoon"&gt;Friday Afternoon&lt;/h2&gt;
&lt;p&gt;Friday afternoon. Timing met with 200 ps margin. I merged a teammate&amp;rsquo;s &amp;ldquo;small&amp;rdquo; feature branch-an extra output mux, some debug registers, maybe 2000 LUTs.&lt;/p&gt;
&lt;p&gt;Monday morning: 847 failing paths. Six-hour build times. Demo on Thursday.&lt;/p&gt;
&lt;p&gt;I hadn&amp;rsquo;t added logic. I&amp;rsquo;d crossed the congestion cliff.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Before merge: After merge:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LUT utilization: 89% LUT utilization: 93%
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WNS: +0.200 ns WNS: -0.847 ns
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Build time: 1.5 hours Build time: 6.2 hours
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Failing paths: 0 Failing paths: 847
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The utilization report said I was fine. 93% fits. But the router disagreed. Every wire fought for routing tracks. Critical paths detoured through congested regions. Placement became a puzzle with no good solutions.&lt;/p&gt;</description></item><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><item><title>Understanding Timing Analysis</title><link>https://bitwiz.io/articles/understanding-timing-analysis/</link><pubDate>Sun, 28 Dec 2025 05:25:00 +0000</pubDate><guid>https://bitwiz.io/articles/understanding-timing-analysis/</guid><description>&lt;p&gt;&lt;em&gt;Timing Series: Part 2 of 6&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Previous: &lt;a href="https://bitwiz.io/articles/constraints-the-contract-you-forgot-to-sign/"&gt;Constraints: The Contract You Forgot to Sign&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-path-you-cant-explain"&gt;The Path You Can&amp;rsquo;t Explain&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;re staring at this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Slack (VIOLATED) : -0.247ns (required time - arrival time)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Source: tx_reg[7]/Q
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Destination: fifo_wr_reg/D
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Path Group: clk_156
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Path Type: Setup (Max at Slow Process Corner)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Requirement: 6.400ns
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Data Path Delay: 5.847ns (logic 1.423ns (24.3%) route 4.424ns (75.7%))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Logic Levels: 4 (LUT6=3 CARRY4=1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Clock Path Skew: -0.360ns (DCD - SCD)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Clock Uncertainty: 0.400ns
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Data path is 5.847 ns. Period is 6.4 ns. You subtract and get 0.553 ns. That number is meaningless as &amp;ldquo;margin&amp;rdquo; because it ignores clock-to-source, clock-to-dest, setup, and uncertainty.&lt;/p&gt;</description></item><item><title>Constraints: The Contract You Forgot to Sign</title><link>https://bitwiz.io/articles/constraints-the-contract-you-forgot-to-sign/</link><pubDate>Tue, 23 Dec 2025 15:04:00 +0000</pubDate><guid>https://bitwiz.io/articles/constraints-the-contract-you-forgot-to-sign/</guid><description>&lt;p&gt;&lt;em&gt;Timing Series: Part 1 of 6&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Previous: &lt;a href="https://bitwiz.io/articles/your-fpga-lives-a-lifetime-while-you-blink/"&gt;Your FPGA Lives a Lifetime While You Blink&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="signoff-gates-build-must-fail-if"&gt;Signoff Gates: Build Must Fail If&amp;hellip;&lt;/h2&gt;
&lt;p&gt;Before reading further, know this: your build should fail if any of these checks fail.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gate 1: Unconstrained endpoints must be zero&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-tcl" data-lang="tcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;check_timing&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;verbose
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;report_exceptions&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;verbose
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Fail if: Any constraint-related issue about clocks, unconstrained endpoints, or missing I/O delays. Also fail if any exception matches zero objects (silent no-op) or hits an unexpectedly large set.&lt;/p&gt;</description></item><item><title>Your FPGA Lives a Lifetime While You Blink</title><link>https://bitwiz.io/articles/your-fpga-lives-a-lifetime-while-you-blink/</link><pubDate>Mon, 22 Dec 2025 07:15:00 +0000</pubDate><guid>https://bitwiz.io/articles/your-fpga-lives-a-lifetime-while-you-blink/</guid><description>&lt;p&gt;&lt;em&gt;Timing Series: Part 0 of 6&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-moment-everything-breaks"&gt;The Moment Everything Breaks&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;re staring at a timing report. One line:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Slack: -0.5 ns (VIOLATED)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Half a nanosecond. The Place and Route tool just told you it&amp;rsquo;s not meeting timing as built. You asked it to get a signal from point A to point B in 6.4 nanoseconds. The shortest path it could find takes 6.9.&lt;/p&gt;
&lt;p&gt;What does -0.5 ns actually look like?&lt;/p&gt;</description></item><item><title>About</title><link>https://bitwiz.io/about/</link><pubDate>Wed, 01 Jan 2025 00:00:00 +0000</pubDate><guid>https://bitwiz.io/about/</guid><description>&lt;h2 id="about-bitwiz"&gt;About bitwiz&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m Alexis, an FPGA engineer with 5+ years building high-performance digital systems.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/in/alexisblopez/"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="background"&gt;Background&lt;/h3&gt;
&lt;p&gt;My work spans &lt;strong&gt;medical devices&lt;/strong&gt;, &lt;strong&gt;big tech infrastructure&lt;/strong&gt;, and &lt;strong&gt;custom silicon&lt;/strong&gt; projects. I specialize in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Streaming systems&lt;/strong&gt; - High-throughput data pipelines and DMA engines&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SerDes integration&lt;/strong&gt; - Multi-gigabit serial links (PCIe, Ethernet, custom)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verification automation&lt;/strong&gt; - Cocotb frameworks, SVA, constrained random&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timing closure&lt;/strong&gt; - Clock domain crossings, multicycle paths, physical optimization&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="current-focus"&gt;Current Focus&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DDR4/DDR5 memory subsystems&lt;/li&gt;
&lt;li&gt;100G+ Ethernet implementations&lt;/li&gt;
&lt;li&gt;Hardware/software co-verification&lt;/li&gt;
&lt;li&gt;Open-source FPGA tooling&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="philosophy"&gt;Philosophy&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Write RTL like someone else will have to debug it at 2am. Because that someone might be you.&lt;/p&gt;</description></item></channel></rss>