<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: mritunjay bihari singh</title>
    <description>The latest articles on DEV Community by mritunjay bihari singh (@mritunjay_biharisingh).</description>
    <link>https://dev.to/mritunjay_biharisingh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4044983%2Fb656dfee-c930-4f60-8f9b-e180b62f14fa.png</url>
      <title>DEV Community: mritunjay bihari singh</title>
      <link>https://dev.to/mritunjay_biharisingh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mritunjay_biharisingh"/>
    <language>en</language>
    <item>
      <title>Before your DV team writes a single testbench line, make sure you have these 7 things. (Most teams skip at least 3.)</title>
      <dc:creator>mritunjay bihari singh</dc:creator>
      <pubDate>Mon, 27 Jul 2026 22:38:28 +0000</pubDate>
      <link>https://dev.to/mritunjay_biharisingh/before-your-dv-team-writes-a-single-testbench-line-make-sure-you-have-these-7-things-most-teams-42g1</link>
      <guid>https://dev.to/mritunjay_biharisingh/before-your-dv-team-writes-a-single-testbench-line-make-sure-you-have-these-7-things-most-teams-42g1</guid>
      <description>&lt;p&gt;The Pre-Testbench Verification Checklist:&lt;/p&gt;

&lt;p&gt;✅ 1. Spec version locked — Which version of the spec is RTL implementing? If it's not locked, you're verifying a moving target.&lt;/p&gt;

&lt;p&gt;✅ 2. Interface list finalized — All clocks, resets, interfaces, and their reset polarity documented. Surprises here cost days.&lt;/p&gt;

&lt;p&gt;✅ 3. Functional coverage model drafted — Write your covergroups before writing your driver. Coverage-first design.&lt;/p&gt;

&lt;p&gt;✅ 4. Corner cases listed explicitly — Max burst, min burst, back-to-back, simultaneous read/write, error conditions. If it's not listed, it won't be tested.&lt;/p&gt;

&lt;p&gt;✅ 5. DUT reset sequence verified standalone — 40% of RTL bugs I've seen live in the reset sequence. Verify it first, verify it separately.&lt;/p&gt;

&lt;p&gt;✅ 6. Scoreboard expected behavior documented — What is the DUT supposed to do for every transaction type? Write it down before you see DUT output.&lt;/p&gt;

&lt;p&gt;✅ 7. Regression pass criteria agreed — What does "verification done" look like? Code coverage %, functional coverage %, number of passing tests? Agree upfront.&lt;/p&gt;

&lt;p&gt;Teams that nail this checklist finish 3–5 weeks faster.&lt;/p&gt;

&lt;p&gt;Hashtags: #HardwareVerification #UVM #SystemVerilog #ASIC #VerificationEngineering #RTL #EDA #ChipDesign&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I once found a silicon bug in a protocol spec — not in the RTL.</title>
      <dc:creator>mritunjay bihari singh</dc:creator>
      <pubDate>Mon, 27 Jul 2026 22:36:48 +0000</pubDate>
      <link>https://dev.to/mritunjay_biharisingh/i-once-found-a-silicon-bug-in-a-protocol-spec-not-in-the-rtl-1aid</link>
      <guid>https://dev.to/mritunjay_biharisingh/i-once-found-a-silicon-bug-in-a-protocol-spec-not-in-the-rtl-1aid</guid>
      <description>&lt;p&gt;True story from an AXI interconnect project.&lt;/p&gt;

&lt;p&gt;We had a well-verified slave. 500k+ simulation cycles. Code coverage &amp;gt; 98%. The DV team signed off. Tapeout was 2 weeks away.&lt;/p&gt;

&lt;p&gt;Then a senior architect asked a simple question: "What happens if AWLEN wraps around 256 when AWBURST is INCR?"&lt;/p&gt;

&lt;p&gt;The spec said it was "undefined behavior." Our testbench skipped undefined sequences. The RTL had a latent state machine hang hiding in that corner.&lt;/p&gt;

&lt;p&gt;We caught it. Others don't.&lt;/p&gt;

&lt;p&gt;What I learned: Verification is not about proving the RTL matches the spec. It's about proving the spec is correct before the RTL implements it. These are two completely different problems.&lt;/p&gt;

&lt;p&gt;The bugs that cause respins aren't usually in the code. They're in the assumptions nobody thought to question.&lt;/p&gt;

&lt;p&gt;If you're a verification engineer reading this — your most valuable skill isn't knowing UVM. It's knowing which questions to ask that your spec author forgot to answer.&lt;/p&gt;

&lt;p&gt;Hashtags: #HardwareVerification #ASIC #AXI #ChipDesign #Tapeout #SystemVerilog #SiliconEngineering &lt;/p&gt;

</description>
      <category>architecture</category>
      <category>hardware</category>
      <category>testing</category>
    </item>
    <item>
      <title>Most UVM testbenches fail coverage closure for one reason nobody talks about — and it's not your constraints.</title>
      <dc:creator>mritunjay bihari singh</dc:creator>
      <pubDate>Mon, 27 Jul 2026 22:31:27 +0000</pubDate>
      <link>https://dev.to/mritunjay_biharisingh/most-uvm-testbenches-fail-coverage-closure-for-one-reason-nobody-talks-about-and-its-not-your-png</link>
      <guid>https://dev.to/mritunjay_biharisingh/most-uvm-testbenches-fail-coverage-closure-for-one-reason-nobody-talks-about-and-its-not-your-png</guid>
      <description>&lt;p&gt;After reviewing 20+ verification projects, I see the same pattern:&lt;/p&gt;

&lt;p&gt;5 well-written sequences&lt;br&gt;
All of them exercising the "happy path"&lt;br&gt;
Corner cases added as an afterthought at week 8&lt;br&gt;
By then, coverage holes require surgical constrained-random surgery that takes 2x as long as getting it right in week 1.&lt;/p&gt;

&lt;p&gt;The fix is boring but it works:&lt;/p&gt;

&lt;p&gt;Before you write a single line of driver code, define your sequence taxonomy:&lt;/p&gt;

&lt;p&gt;baseline_seq — protocol-compliant, valid stimulus&lt;br&gt;
stress_seq — back-to-back transactions, max burst length&lt;br&gt;
error_inject_seq — bad addr, illegal burst, protocol violations&lt;br&gt;
mixed_seq — interleaved read/write with randomized gaps&lt;br&gt;
Map each to a functional coverage bin. If your sequence can't hit a bin, the sequence is incomplete — not your coverage model.&lt;/p&gt;

&lt;p&gt;This one habit saves 3–4 weeks of closure pain at tape-out.&lt;/p&gt;

&lt;p&gt;Hashtags: #SystemVerilog #UVM #HardwareVerification #ASIC #ChipDesign #EDA &lt;/p&gt;

</description>
    </item>
    <item>
      <title>5 UVM Patterns Every Verification Engineer Should Know</title>
      <dc:creator>mritunjay bihari singh</dc:creator>
      <pubDate>Fri, 24 Jul 2026 06:55:46 +0000</pubDate>
      <link>https://dev.to/mritunjay_biharisingh/5-uvm-patterns-every-verification-engineer-should-know-4i24</link>
      <guid>https://dev.to/mritunjay_biharisingh/5-uvm-patterns-every-verification-engineer-should-know-4i24</guid>
      <description>&lt;p&gt;Production-Tested Patterns That Scale from IP Blocks to SoCs&lt;br&gt;
Introduction&lt;br&gt;
Over the past 8 years verifying everything from cache coherency controllers to high-speed interconnects, I've noticed that most verification headaches come from not knowing these five UVM patterns. They're not flashy. They won't make your testbench run faster. But they'll make the difference between a clean coverage closure in 6 weeks versus a nightmare that drags 16 weeks past tape-out.&lt;/p&gt;

&lt;p&gt;This isn't a tutorial. This assumes you know UVM basics. This is about how professionals actually structure testbenches when the stakes are real.&lt;/p&gt;

&lt;p&gt;Pattern 1: The Layered Agent Architecture&lt;br&gt;
(Why Your Monitor Shouldn't Drive, and Your Driver Shouldn't Monitor)&lt;br&gt;
The Problem&lt;br&gt;
Ninety-nine percent of first-time UVM code I review has this sin:&lt;/p&gt;

&lt;p&gt;// ❌ WRONG: Driver trying to do everything&lt;br&gt;
class axi_driver extends uvm_driver #(axi_transaction);&lt;br&gt;
    virtual axi_if vif;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task run_phase(uvm_phase phase);
    forever begin
        seq_item_port.get_next_item(item);

        // Driving
        vif.awaddr &amp;lt;= item.addr;
        vif.awlen &amp;lt;= item.len;

        // ⚠️ Also monitoring back???
        // Checking slave response
        if (vif.bvalid) begin
            // This is a MONITOR's job, not driver's!
            `uvm_info("DRV", $sformatf("Write complete: %0h", item.addr), UVM_MEDIUM)
        end

        seq_item_port.item_done(item);
    end
endtask
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;endclass&lt;br&gt;
Why this is toxic:&lt;/p&gt;

&lt;p&gt;Tight coupling – Driver can't be tested independently from monitor&lt;br&gt;
Race conditions – Driver writes data, then immediately monitors its own write (timing issues)&lt;br&gt;
Scoreboard confusion – Monitor is supposed to collect gold truth; now it's mixed with driver implementation&lt;br&gt;
Reusability nightmare – Can't plug this driver into different testbenches&lt;br&gt;
The Pattern: Layered, Separate Concerns&lt;br&gt;
// ✅ CORRECT: Driver only drives&lt;br&gt;
class axi_driver extends uvm_driver #(axi_transaction);&lt;br&gt;
    virtual axi_if vif;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task run_phase(uvm_phase phase);
    forever begin
        seq_item_port.get_next_item(item);
        drive_write_transaction(item);
        seq_item_port.item_done(item);
    end
endtask

// ONLY driving logic here
task drive_write_transaction(axi_transaction item);
    @(posedge vif.clk);
    vif.awvalid &amp;lt;= 1'b1;
    vif.awaddr  &amp;lt;= item.addr;
    vif.awlen   &amp;lt;= item.len;
    vif.awsize  &amp;lt;= item.size;

    // Wait for slave to accept
    wait(vif.awready);
    @(posedge vif.clk);
    vif.awvalid &amp;lt;= 1'b0;
endtask
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;endclass&lt;/p&gt;

&lt;p&gt;// ✅ CORRECT: Monitor only monitors (passive)&lt;br&gt;
class axi_monitor extends uvm_monitor;&lt;br&gt;
    virtual axi_if vif;&lt;br&gt;
    uvm_analysis_port #(axi_transaction) ap;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task run_phase(uvm_phase phase);
    forever begin
        @(posedge vif.awvalid &amp;amp;&amp;amp; posedge vif.awready);

        // Purely passive observation
        axi_transaction item = axi_transaction::type_id::create("item");
        item.addr = vif.awaddr;
        item.len  = vif.awlen;
        item.size = vif.awsize;

        // Send to analysis port (for scoreboard)
        ap.write(item);
    end
endtask
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;endclass&lt;br&gt;
Why This Works at Scale&lt;br&gt;
When I was verifying the interconnect on a 32-core SoC:&lt;/p&gt;

&lt;p&gt;Isolation meant I could test the driver with a simple slave (5 hours to debug driver issues)&lt;br&gt;
Reuse meant I used the same driver on 4 different interconnect variants&lt;br&gt;
Scoreboard clarity – I knew EXACTLY which transactions came from the monitor (observation) vs. the driver (stimulus)&lt;br&gt;
Real win: Found a subtle slave-to-driver handshake bug only because the monitor was purely passive. If they were tangled, I'd never have caught it.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
