Latch-Up 2024 at MIT: Open Source Silicon and Hardware Development

Table of Contents

Latch-Up 2024 | MIT, Cambridge, Massachusetts

Latch-Up 2024 was held at MIT in Cambridge, Massachusetts from April 19-21, 2024. Organized by the FOSSi Foundation (Free and Open Source Silicon Foundation), this conference brought together the open source hardware and silicon community.

Key Themes

Open Source PDKs and Fabrication

Discussion of accessible chip fabrication through open source Process Design Kits and partnerships with foundries for community chip runs.

RISC-V Ecosystem Growth

Updates on the expanding RISC-V ecosystem, including new implementations, toolchains, and verification frameworks.

Hardware Description Languages

Modern HDL developments including Chisel, Amaranth, SpinalHDL, and improvements to traditional Verilog/SystemVerilog workflows.

Verification and Testing

Open source verification methodologies, including cocotb, formal verification tools, and testing infrastructure.

Sessions

OpenLane and the SkyWater PDK

// Example of a simple module for OpenLane flow
module counter (
    input  wire       clk,
    input  wire       rst_n,
    input  wire       enable,
    output reg [7:0]  count
);

always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        count <= 8'b0;
    else if (enable)
        count <= count + 1'b1;
end

endmodule

Chisel Hardware Design

// Chisel example: Parameterized counter
import chisel3._
import chisel3.util._

class Counter(width: Int) extends Module {
  val io = IO(new Bundle {
    val enable = Input(Bool())
    val count  = Output(UInt(width.W))
  })

  val counter = RegInit(0.U(width.W))

  when(io.enable) {
    counter := counter + 1.U
  }

  io.count := counter
}

Amaranth HDL (formerly nMigen)

# Amaranth example: Simple counter
from amaranth import *
from amaranth.sim import Simulator

class Counter(Elaboratable):
    def __init__(self, width):
        self.enable = Signal()
        self.count = Signal(width)

    def elaborate(self, platform):
        m = Module()

        with m.If(self.enable):
            m.d.sync += self.count.eq(self.count + 1)

        return m

Cocotb Verification

# Cocotb testbench example
import cocotb
from cocotb.clock import Clock
from cocotb.triggers import RisingEdge, FallingEdge

@cocotb.test()
async def test_counter(dut):
    """Test the counter module"""
    clock = Clock(dut.clk, 10, units="ns")
    cocotb.start_soon(clock.start())

    # Reset
    dut.rst_n.value = 0
    dut.enable.value = 0
    await RisingEdge(dut.clk)
    dut.rst_n.value = 1

    # Enable counting
    dut.enable.value = 1
    for i in range(10):
        await RisingEdge(dut.clk)
        assert dut.count.value == i + 1, f"Count mismatch at cycle {i}"

RISC-V Core Development

// Simplified RISC-V ALU example
module riscv_alu (
    input  wire [31:0] operand_a,
    input  wire [31:0] operand_b,
    input  wire [3:0]  alu_op,
    output reg  [31:0] result
);

localparam ALU_ADD  = 4'b0000;
localparam ALU_SUB  = 4'b0001;
localparam ALU_AND  = 4'b0010;
localparam ALU_OR   = 4'b0011;
localparam ALU_XOR  = 4'b0100;
localparam ALU_SLT  = 4'b0101;
localparam ALU_SLL  = 4'b0110;
localparam ALU_SRL  = 4'b0111;

always @(*) begin
    case (alu_op)
        ALU_ADD: result = operand_a + operand_b;
        ALU_SUB: result = operand_a - operand_b;
        ALU_AND: result = operand_a & operand_b;
        ALU_OR:  result = operand_a | operand_b;
        ALU_XOR: result = operand_a ^ operand_b;
        ALU_SLT: result = ($signed(operand_a) < $signed(operand_b)) ? 32'd1 : 32'd0;
        ALU_SLL: result = operand_a << operand_b[4:0];
        ALU_SRL: result = operand_a >> operand_b[4:0];
        default: result = 32'b0;
    endcase
end

endmodule

Formal Verification with SymbiYosys

// Formal verification properties example
module counter_formal (
    input  wire       clk,
    input  wire       rst_n,
    input  wire       enable,
    output reg [7:0]  count
);

// Counter logic
always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        count <= 8'b0;
    else if (enable)
        count <= count + 1'b1;
end

`ifdef FORMAL
    // Assume reset at start
    initial assume(!rst_n);

    // Count should never exceed max value
    always @(posedge clk)
        assert(count <= 8'hFF);

    // After reset, count should be zero
    always @(posedge clk)
        if (!rst_n)
            assert(count == 8'b0);
`endif

endmodule

Conference Highlights

Community Chip Runs

Updates on community-funded tapeouts and the democratization of chip fabrication through shared multi-project wafer runs.

Tool Ecosystem Growth

Presentations on the maturing open source EDA tool ecosystem, from synthesis to place-and-route to sign-off.

Education Initiatives

Discussions on using open source silicon tools in academic settings and lowering barriers to hardware education.

Industry Adoption

Case studies of companies adopting open source silicon tools and contributing back to the ecosystem.

Author: Jason Walsh

j@wal.sh

Last Updated: 2026-01-10 17:13:23

build: 2026-04-17 18:33 | sha: 792b203