Configurations
A design in Odatix is parametrizable; a configuration is one concrete set of parameter values for that design. This section covers how to describe configurations — from writing individual parameter files by hand to generating hundreds of them automatically.
Table of Contents
The building blocks
Odatix builds configurations from three mechanisms that stack on top of each other:
| Mechanism | What it is | Use it when |
|---|---|---|
| Parameter files | One file per configuration, splicing values into the delimited section of your top level. | You have a handful of variants to compare. |
| Parameter domains | Independent groups of parameters combined with +. |
Parameters are independent (memory depth, ISA extensions, multiplier type…). |
| Configuration generation | Rules that create the parameter files for you. | The value set follows a pattern — ranges, powers of two, lists, functions. |
| Variables | The value sets behind those rules, shared with virtual parameter domains. | You need the exhaustive list of types and options. |
Defining a design
A design lives in odatix_userconfig/architectures/<name>/, with a _settings.yml that tells Odatix where your sources are and how to instantiate the design.
rtl_path: "examples/alu_sv"
top_level_file: "alu_top.sv" # relative to rtl_path
top_level_module: "alu_top"
clock_signal: "i_clk"
reset_signal: "i_rst"
# delimiters that mark the parameter section of the top level
use_parameters: Yes
start_delimiter: "#("
stop_delimiter: ")("
# target-specific bounds
xc7a100t-csg324-1:
fmax_synthesis:
lower_bound: 50
upper_bound: 800
design_path: "examples/alu_chisel"
# generate the RTL first (from Chisel, HLS, ...)
generate_rtl: Yes
generate_command: "sbt 'runMain ALUTop --o=rtl'"
generate_output: "rtl"
top_level_file: "ALUTop.sv" # relative to generate_output
top_level_module: "ALUTop"
clock_signal: "clock"
reset_signal: "reset"
# with generated RTL, replacement targets the *source*, not the top level
use_parameters: Yes
param_target_file: "src/main/scala/ALUTop.scala"
start_delimiter: "new ALUTop("
stop_delimiter: ")"
With generated RTL (Chisel, HLS), param_target_file is mandatory: the top level does not exist yet when parameters are replaced, so replacement must target the source file that produces it.
A full list of _settings.yml keys is on the Configuration reference page.
Writing parameter files by hand
Each parameter file contains the exact text that replaces the delimited section of your top level. Given this module:
module alu_top #(
parameter BITS = 8
)(
input wire i_clk,
input wire [4:0] i_sel_op,
output wire [BITS-1:0] o_res
);
a configuration file simply provides the replacement:
parameter BITS = 16
Create as many files as you want. The only constraint is a strict correspondence — in names and count — between the parameter files and the parameter section of your top level.
If you don’t want to write the files by hand, use parameter domains or configuration generation to produce them automatically. You can also use the Python API to generate them programmatically.