An intuitive Python based HDL code generator for Verilog/SystemVerilog and VHDL.
Project description
RTLGen
A Python library for programmatically generating HDL (Hardware Description Language) code including Verilog, SystemVerilog, and VHDL.
Features
- Intuitive context manager-based API
- Support for multiple HDL languages
- Clean, readable HDL output generation
- Python-native approach to hardware description
Installation
pip install rtlgen
Quick Start
from rtlgen import CodeGen
# Create a Verilog generator
gen = CodeGen("output.v", "verilog")
# Create a module with ports and logic
with gen.Module("example_counter") as m:
# Define module parameters
with m.ParameterRegion() as params:
params.Parameter("WIDTH", 8)
# Define ports
with m.PortRegion() as ports:
ports.Input("clk")
ports.Input("rst_n")
ports.Output("count", "WIDTH")
# Define internal logic
with m.LogicRegion() as lr:
# Create signals
counter = lr.Signal("counter", "WIDTH")
# Create an always block for synchronous logic
with lr.BeginEnd("always @(posedge clk or negedge rst_n)"):
with lr.IfElse("!rst_n"):
lr.Assign(counter, 0, blocking=True)
with lr.Else():
lr.Assign(counter, counter + 1, blocking=True)
# Continuous assignment
lr.Assign("count", counter)
# file auto written when gen.Module out of context
Side-by-Side Examples
Here are examples showing RTLGen Python code and the resulting Verilog output:
Module and Signal Declaration
| Python Code | Generated Verilog |
|---|---|
from rtlgen import CodeGen
gen = CodeGen("module.v", "verilog")
with gen.Module("test_module") as m:
with m.LogicRegion() as lr:
signal = lr.Signal("test_signal", 8)
single_bit = lr.Signal("single_bit")
|
module test_module (
);
// Logic
reg [7:0] test_signal;
reg single_bit;
endmodule
|
Assignment Operations
| Python Code | Generated Verilog |
|---|---|
with gen.Module("assign_module") as m:
with m.LogicRegion() as lr:
signal_a = lr.Signal("a", 8)
signal_b = lr.Signal("b", 8)
# Signal to signal assignment
lr.Assign(signal_a, signal_b)
# Constant assignment
lr.Assign(signal_a, 42)
|
module assign_module (
);
// Logic
reg [7:0] a;
reg [7:0] b;
assign a = b;
assign a = 8'd42;
endmodule
|
If-Else Conditions
| Python Code | Generated Verilog |
|---|---|
with gen.Module("conditional_module") as m:
with m.LogicRegion() as lr:
clk = lr.Signal("clk")
reset = lr.Signal("reset")
counter = lr.Signal("counter", 8)
with lr.BeginEnd("always @(posedge clk)"):
with lr.IfElse("reset"):
lr.Assign(counter, 0, blocking=True)
with lr.Else():
lr.Assign(counter, counter + 1, blocking=True)
|
module conditional_module (
);
// Logic
reg clk;
reg reset;
reg [7:0] counter;
always @(posedge clk) begin
if (reset) begin
counter = 0;
end else begin
counter = counter + 1;
end
end
endmodule
|
Module Instantiation
| Python Code | Generated Verilog |
|---|---|
with gen.Module("top_module") as m:
with m.LogicRegion() as lr:
clk = lr.Signal("clk")
reset = lr.Signal("reset")
data_out = lr.Signal("data_out", 8)
# Create connections
clk_conn = lr.ConnectPair("clk", clk)
rst_conn = lr.ConnectPair("reset", reset)
out_conn = lr.ConnectPair("result", data_out)
# Instantiate a module
lr.InitModule("counter", "counter_inst",
[clk_conn, rst_conn, out_conn])
|
module top_module (
);
// Logic
reg clk;
reg reset;
reg [7:0] data_out;
counter #() counter_inst (
.clk(clk),
.reset(reset),
.result(data_out)
);
endmodule
|
Supported HDL Languages
- Verilog
- SystemVerilog
- VHDL
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hdlgen-0.0.1.tar.gz.
File metadata
- Download URL: hdlgen-0.0.1.tar.gz
- Upload date:
- Size: 22.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
23fab243ab9d82fd4b448eb9515177bc28998a3111fb4c5bfa0531849225ff81
|
|
| MD5 |
93f9ee44cf7e1041d6d1270974ab5e2f
|
|
| BLAKE2b-256 |
c429f1bcf36509f712f43c44513711fe765da9005f1f024d18084dee51dd46d5
|
File details
Details for the file hdlgen-0.0.1-py3-none-any.whl.
File metadata
- Download URL: hdlgen-0.0.1-py3-none-any.whl
- Upload date:
- Size: 14.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73e3d423bd94ed20cd0527af036a9735a7d71c3f0cc22c823b22e98118805c43
|
|
| MD5 |
a7d0296f2784e0af3f8002e683c861f0
|
|
| BLAKE2b-256 |
320e9fb856e2654e2c2497a0d8cfa21e79edae30fff17ba457e3243caf5aed2c
|