Parameter Domains
A parameter domain is a set of parameters for a design, defined independently of the others. Domains let you combine parameters automatically instead of writing a configuration file for every combination by hand — invaluable when the design space is large.
Table of Contents
Define your architecture folder in odatix_userconfig/architectures/ before adding parameter domains.
File structure
Each parameter domain is a sub-folder of your architecture directory, containing a _settings.yml and its parameter files — exactly like the main design, but scoped to one group of parameters.
architectures/AsteRISC/
├── Baseline/ # 'Baseline' parameter domain
│ ├── _settings.yml
│ ├── E.txt
│ └── I.txt
├── DMEM/ # 'DMEM' parameter domain
│ ├── _settings.yml
│ ├── 256.txt
│ ├── 512.txt
│ └── 1024.txt
├── Mul/ # 'Mul' parameter domain
│ ├── _settings.yml
│ ├── Basic.txt
│ ├── Fast.txt
│ └── Off.txt
├── _settings.yml # main architecture settings
├── M0000.txt # main architecture configurations
└── M0001.txt
Marking domains in the top level
Each domain replaces a different delimited block of your top level. Give every block a distinct delimiter:
module top_level #(
// <dmem>
parameter p_dmem_depth_pw2 = 13,
// </dmem>
// <baseline>
parameter p_ext_rve = 0,
// </baseline>
// <mul>
parameter p_ext_rvm = 0,
parameter p_mul_fast = 0,
// </mul>
) ( /* ... */ );
A domain’s _settings.yml only needs its delimiters:
start_delimiter: " // <baseline>"
stop_delimiter: " // </baseline>"
If a domain replaces parameters in a file other than the top level, point to it with param_target_file. With generated RTL (Chisel, HLS), param_target_file is mandatory.
start_delimiter: "// start"
stop_delimiter: "// end"
param_target_file: "src/main/scala/counter.scala"
Domains can generate configurations too
A domain can use configuration generation to produce its values dynamically:
start_delimiter: " // <dmem>"
stop_delimiter: " // </dmem>"
param_target_file: "top.v"
generate_configurations: Yes
generate_configurations_settings:
template: "\n parameter p_dmem_depth_pw2 = $mem_depth,\n"
name: "${mem_depth_pw2}"
variables:
mem_depth:
type: range
settings: { from: 8, to: 12 }
mem_depth_pw2:
type: function
settings: { op: 2^$mem_depth }
Running jobs with parameter domains
In your run settings, combine domains with +. Each line is one design variant:
architectures:
- AsteRISC/M0000 + DMEM/1024 + IMEM/1024 + Baseline/I + Mul/Off
- AsteRISC/M0001 + DMEM/1024 + IMEM/1024 + Baseline/I + Mul/Fast
Use the * wildcard to expand every matching configuration automatically:
architectures:
# every combination of every domain
- AsteRISC/* + DMEM/* + IMEM/* + Baseline/* + Mul/*
Parameter domains work for any job type — Fmax synthesis, custom-frequency synthesis, simulation and workflows.
See also
- Configuration generation
- Virtual parameter domains (for workflows)
- Configuration reference