At minimum, you need to have the following tools installed in your environment.
-
Bazel == 9.1.0 (recommended to manage this using Bazelisk)
-
System Python interpreter >= 3.12
Additionally, several tools are needed to build and run all of the tests:
-
Open source
-
Linting
-
Verible
-
-
Simulation
-
Icarus Verilog
-
Verilator
-
-
RTL wrapper generation
-
TopStitch
-
-
Additional tools included in the Docker image
-
Yosys, EQY, and Yices
-
Slang
-
XLS support libraries
-
-
-
Proprietary (not provided - purchase your own installation and licenses)
-
Elaboration
-
Verific tclmain
-
-
Linting
-
RealIntent AscentLint
-
-
Simulation
-
Synopsys VCS
-
-
Formal
-
Cadence JasperGold
-
Synopsys VCF
-
-
|
Note
|
We no longer support Altair DSim in CI. Nevertheless, the build system should continue to support it if you wish to use it for your own tests. |
The provided Dockerfile can be used to build an image with the minimum dependencies and open source tools listed above. The Dockerfile uses RockyLinux 8 on x86-64 as the base image. If you want to run tests that leverage proprietary tools, you need to provide your own installations and licenses (which are typically compatible with RockyLinux 8 on x86-64).
If you bring your own EDA tools, you may need to provide a bit of your own Python code that implements the plugin API for verilog_runner.py.
If you want to use a tool that isn’t already supported, update //bazel:verilog.bzl, implement a new verilog runner plugin, and reference your new tool in the appropriate Bazel test targets.
Not all tests necessarily work with every tool.
Refer to the BUILD.bazel files for specifics.
Prebuilt linux/amd64 images are published to the
Bedrock-RTL package on GitHub Container Registry.
Each image has an immutable tag of the form YYYY-MM-DD-<full-git-sha>, where the date is the commit date in UTC.
We intentionally do not publish a moving latest tag.
To use the latest image, open the package page linked above, copy the tag from the most recently published version, and run:
docker pull ghcr.io/xlsynth/bedrock-rtl:<tag>
docker run --rm -it -v "$(pwd)":/src -w /src ghcr.io/xlsynth/bedrock-rtl:<tag> /bin/bashThe package is public, so pulling it does not require GitHub Container Registry authentication. Using an immutable tag makes local and CI environments reproducible; pull a newer tag from the package page when you want to update the toolchain.
To build the image from the checked-out Dockerfile instead:
docker build --platform=linux/amd64 --tag=bedrock-rtl:${USER} .
docker run --rm -it -v "$(pwd)":/src -w /src bedrock-rtl:${USER} /bin/bashThen once inside the container, try bazel build //… && bazel test //fifo/sim/… --test_tag_filters=iverilog.
The docker-image-build job in .github/workflows/ci.yml builds the image for every pull request, push to main, and manual CI run.
After that build succeeds, the docker-image-publish job deploys the image to ghcr.io/xlsynth/bedrock-rtl for pushes to main and manually dispatched CI runs.
Pull requests build the image but do not publish it.
The publish job generates the immutable YYYY-MM-DD-<full-git-sha> tag, pushes the linux/amd64 image, attaches BuildKit provenance, and publishes a signed GitHub artifact attestation for the image digest.
Repository maintainers can deploy an image manually by opening the
CI workflow, selecting Run workflow, and choosing the Git ref to publish.
We use pre-commit hooks to enforce basic coding style. To install the hooks, run:
pre-commit installThis installs both the pre-commit and pre-push hooks configured by .pre-commit-config.yaml.
They should automatically run on every commit and push.
You can also run them manually via:
pre-commit runWe’ve tested with pre-commit version 4.0.1.
We use the powerful Bazel build system to assemble filelists and to run all tests (elaboration, lint, simulation, and formal).
A one-step command builds and runs all tests:
bazel test //...|
Important
|
Action required for tests to pass!
The repository includes an Icarus Verilog plugin for open-source simulation tests, but most EDA tool plugins are intentionally not provided. Many Bazel tests will fail unless your local or CI environment provides plugins for the proprietary tools used by those tests. We keep those plugins outside the repository because:
For additional tools, implement the plugin API by subclassing |
The Bazel test rule implementations at //bazel:verilog.bzl shell out the //python/verilog_runner/verilog_runner.py tool that presents a generic tool-agnostic API that actually implements the test.
We run continuous integration tests with GitHub Actions.
The main CI workflow currently covers pre-commit, build, Python/ecc codegen tests, Stardoc, Verific, AscentLint, VCS, and Icarus.
Sampled JasperGold formal tests run in the nightly workflow.
See .github/workflows/ci.yml and .github/workflows/nightly.yml for details.
We follow the xlsynth Verilog Style Guide, which is a fork of the lowRISC style guide with some minor differences.
This repository defines several generally-helpful Bazel Verilog rules that you can use in your own projects.
The verilog_library rule is used to collect Verilog source and header files and track their dependencies.
The original definition of the verilog_library rule can be found here.
We pick up that rule dependency transitively (see the top-level MODULE.bazel).
Using verilog_library
load("@rules_hdl//verilog:providers.bzl", "verilog_library")
verilog_library(
name = "bar",
srcs = ["bar.sv"],
hdrs = ["baz.svh"]
)
verilog_library(
name = "foo",
srcs = ["foo.sv"],
deps = [":bar"],
)Please see bazel/verilog_rules.md for documentation on rules defined in this repository.
Usage is best illustrated with an example using the bzlmod dependency management system in Bazel.
|
Tip
|
You are not required to use Bazel to depend on Bedrock-RTL. You can also use the Verilog files directly in your own projects (e.g., with git submodule, git subtree, or some other method). |
In your project’s MODULE.bazel:
MODULE.bazel
module(name = "your-project")
bazel_dep(name = "bedrock-rtl", version = "0.0.1")
git_override(
module_name = "bedrock-rtl",
commit = <fill_in_git_commit_sha>,
remote = "https://github.com/xlsynth/bedrock-rtl",
)
rules_hdl_extension = use_extension("@bedrock-rtl//dependency_support/rules_hdl:extension.bzl", "rules_hdl_extension")
use_repo(rules_hdl_extension, "rules_hdl")If you need to redirect the rules_hdl wrapper module in a larger Bazel dependency graph,
load the extension through a root-module rules_hdl dependency instead:
bazel_dep(name = "rules_hdl", version = "0.0.0", repo_name = "rules_hdl_wrapper_module")
# Use an override only if your root module needs to provide the rules_hdl wrapper
# from a local checkout or another non-registry source.
local_path_override(
module_name = "rules_hdl",
path = "<path-to-rules-hdl-wrapper>",
)
rules_hdl_extension = use_extension("@rules_hdl_wrapper_module//:extension.bzl", "rules_hdl_extension")
use_repo(rules_hdl_extension, "rules_hdl")|
Note
|
Bazel only applies module overrides from the root module. If rules_hdl is available
from your configured Bazel registries, no override is needed. Otherwise, your root
MODULE.bazel must provide the rules_hdl module with an override such as
local_path_override, archive_override, or git_override. The direct
@bedrock-rtl//dependency_support/rules_hdl:extension.bzl load shown in the main example
keeps @rules_hdl//… labels available, but root-module overrides for rules_hdl will not
affect that direct extension load.
|
Then suppose you have the following SystemVerilog module called datapath_join.sv:
datapath_join.sv
// An example design using two Bedrock-RTL modules: br_flow_reg_fwd and br_flow_join.
//
// Joins two or more equal-width datapaths into a single output datapath.
// Uses ready/valid protocol on all flows.
// Push-side is registered.
`include "br_asserts.svh"
module datapath_join #(
parameter int NumFlows = 2, // must be at least 2
parameter int WidthPerFlow = 32 // must be at least 1
) (
input logic clk,
input logic rst,
output logic [NumFlows-1:0] push_ready,
input logic [NumFlows-1:0] push_valid,
input logic [NumFlows-1:0][WidthPerFlow-1:0] push_data,
input logic pop_ready,
output logic pop_valid,
output logic [(NumFlows*WidthPerFlow)-1:0] pop_data
);
`BR_ASSERT_STATIC(numflows_gte_2_a, NumFlows >= 2)
`BR_ASSERT_STATIC(widthperflow_gte_1_a, WidthPerFlow >= 1)
logic [NumFlows-1:0] inter_ready;
logic [NumFlows-1:0] inter_valid;
logic [NumFlows-1:0][WidthPerFlow-1:0] inter_data;
for (genvar i = 0; i < NumFlows; i++) begin : gen_regs
br_flow_reg_fwd #(
.Width(WidthPerFlow)
) br_flow_reg_fwd (
.clk,
.rst,
.push_ready(push_ready[i]),
.push_valid(push_valid[i]),
.push_data (push_data[i]),
.pop_ready (inter_ready[i]),
.pop_valid (inter_valid[i]),
.pop_data (inter_data[i])
);
end
br_flow_join #(
.NumFlows(NumFlows)
) br_flow_join (
.clk,
.rst,
.push_ready(inter_ready),
.push_valid(inter_valid),
.pop_ready (pop_ready),
.pop_valid (pop_valid)
);
assign pop_data = inter_data; // direct concat
endmodule : datapath_joinYour BUILD.bazel file could then do this:
BUILD.bazel
load("@bedrock-rtl//bazel:verilog.bzl", "verilog_elab_and_lint_test_suite", "verilog_elab_test", "verilog_lint_test")
load("@rules_hdl//verilog:providers.bzl", "verilog_library")
package(default_visibility = ["//visibility:private"])
verilog_library(
name = "datapath_join",
srcs = ["datapath_join.sv"],
deps = [
"@bedrock-rtl//flow/rtl:br_flow_join",
"@bedrock-rtl//flow/rtl:br_flow_reg_fwd",
"@bedrock-rtl//macros:br_asserts",
],
)
verilog_elab_test(
name = "datapath_join_elab_test",
deps = [":datapath_join"],
)
verilog_lint_test(
name = "datapath_join_lint_test",
deps = [":datapath_join"],
)
verilog_elab_and_lint_test_suite(
name = "datapath_join_test_suite",
params = {
"NumFlows": [
"2",
"3",
],
"WidthPerFlow": [
"1",
"64",
],
},
deps = [":datapath_join"],
)These macros conveniently wrap always_ff blocks, improving readability and helping to structure user code into sequential and combinational portions.
The macros are named according to the following suffix convention.
-
A: Asynchronous reset (if absent, then synchronous) -
I: Initial value given (if absent, then 0) -
L: Conditional load enable (if absent, then unconditional) -
N: No reset (if absent, then reset) -
X: Given explicit clock and reset names (if absent, thenclkand eitherrstif synchronous orarstif asynchronous)
|
Important
|
Clocks are always positive-edge triggered. Resets are always active-high. |
|
Note
|
The order of the suffices generally matches the order of the arguments to the macro.
The suffices are also listed in alphabetical order, with the exception of L before I.
The table below groups macros that share the same clock/reset behavior; the suffix convention above describes the load-enable and initial-value variants.
|
| Macro/define | Description |
|---|---|
|
Synchronous active-high reset named |
|
Synchronous active-high reset and positive-edge clock are explicit macro arguments; optional load enable and initial value. |
|
Asynchronous active-high reset named |
|
Asynchronous active-high reset and positive-edge clock are explicit macro arguments; optional load enable and initial value. |
|
No reset, positive-edge clock named |
|
No reset, positive-edge clock is an explicit macro argument; optional load enable. |
These assertion macros are intended for use by the user in their own designs. They are guarded (enabled) by the following defines:
-
BR_ASSERT_ON— if not defined, then all macros other thanBR_ASSERT_STATIC*are no-ops. -
BR_ENABLE_FPV— if not defined, then allBR_*_FPVmacros are no-ops. -
BR_DISABLE_ASSERT_IMM— if defined, then allBR_ASSERT_IMM*,BR_COVER_IMM*,BR_ASSERT_COMB*, andBR_COVER_COMB*macros are no-ops. -
BR_DISABLE_FINAL_CHECKS— if defined, then allBR_ASSERT_FINAL*macros are no-ops.
|
Tip
|
It is recommended that users simply define BR_ASSERT_ON when integrating Bedrock modules into their designs.
The other guards will typically not be necessary.
|
|
Important
|
Clocks are always positive-edge triggered. Resets are always active-high. |
| Macro/define | Description |
|---|---|
|
Static (elaboration-time) assertion for use within modules |
|
Static (elaboration-time) assertion for use within packages |
|
Immediate assertion evaluated at the end of simulation (e.g., when |
|
Concurrent assertion with implicit |
|
Concurrent assertion with explicit clock and reset names. |
|
Concurrent assertion that an expression is known, with implicit |
|
Concurrent assertion that an expression is known when a valid condition is true, with implicit |
|
Concurrent known-value assertion with explicit clock and reset names. |
|
Concurrent known-value assertion with explicit clock and reset names and an explicit valid condition. |
|
Immediate assertion.
Also passes if the expression is unknown.
Disable by defining |
|
Immediate assertion wrapped inside of an |
|
Concurrent cover with implicit |
|
Concurrent cover with explicit clock and reset names. |
|
Concurrent cover that is active both in reset and out of reset, with implicit |
|
Immediate cover.
Disable by defining |
|
Immediate cover wrapped inside of an |
|
Concurrent assumption with implicit |
|
Concurrent assumption with explicit clock and reset names. |
|
Concurrent assertion that is active in reset and out of reset
(but specifically intended for checking the former), with implicit |
|
Concurrent assertion that is active in reset and out of reset (but specifically intended for checking the former), with explicit clock name. |
These assertion macros are intended for use in formal verification monitors that might be integrated into a simulation environment, but where not all formal assertions should be used in simulation. They are guarded (enabled) by the following defines:
-
BR_ENABLE_FPV— if not defined, then all BR_*_FPV macros are no-ops.
| Macro/define | Description |
|---|---|
|
Wraps BR_ASSERT. |
|
Wraps BR_ASSERT_CR. |
|
Wraps BR_ASSERT_COMB. |
|
Wraps BR_COVER. |
|
Wraps BR_COVER_CR. |
|
Wraps BR_COVER_COMB. |
|
Wraps BR_ASSUME. |
|
Wraps BR_ASSUME_CR. |
These assertion macros wrap the public assertions. They are intended only for internal use inside Bedrock libraries, but the user needs to know about them. They are guarded (enabled) by the following defines:
The macros in this file are guarded with the following defines.
* BR_DISABLE_INTG_CHECKS — if defined, then all the BR_*INTG checks are no-ops.
* BR_ENABLE_IMPL_CHECKS — if not defined, then all the BR*_IMPL checks are no-ops.
The intent is that users should not need to do anything, so that by default they will get only the integration checks but not the implementation checks.
|
Tip
|
All of these macros wrap the public macros in br_asserts.svh, so they are also subject to the same global defines such as BR_ASSERT_ON.
|
These checks are meant for checking the integration of a library module into an end user’s design.
Disable them globally by defining BR_DISABLE_INTG_CHECKS.
| Macro/define | Description |
|---|---|
|
Wraps BR_ASSERT. |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
These checks are meant for checking the implementation of a library module.
Enable them globally by defining BR_ENABLE_IMPL_CHECKS.
| Macro/define | Description |
|---|---|
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
|
Wraps |
These macros conveniently wrap module instantiations from the gate category.
| Macro/define | Description |
|---|---|
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Instantiates the reset synchronizer with an explicit number of synchronizer stages. |
|
Instantiates |
|
Instantiates |
These macros provide size-aware assignment helpers for common bit slicing and extension operations.
| Macro/define | Description |
|---|---|
|
Zero-extend a smaller expression into a larger destination. |
|
Zero-extend when the destination is wider than the source, otherwise assign directly. |
|
Assign the least-significant or most-significant bits of a wider expression into a narrower destination. |
|
Insert a narrower expression into the least-significant or most-significant bits of a wider destination. |
These macros provide small helper patterns used by formal monitors.
| Macro/define | Description |
|---|---|
|
Constrains two symbolic indices to be stable, in range, and unique. |
|
Computes the selected index for a one-hot vector. |
These macros conveniently wrap br_misc_tieoff* module instantiations.
| Macro/define | Description |
|---|---|
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Instantiates |
|
Provided for convenience of the user grepping for |
|
Provided for convenience of the user grepping for |
These macros conveniently wrap br_misc_unused module instantiations.
| Macro/define | Description |
|---|---|
|
Instantiates |
|
Instantiates |
|
Provided for convenience of the user grepping for |
This section inventories public RTL modules under top-level /rtl directories.
Internal implementation modules under /rtl/internal are intentionally omitted.
The verification-artifact column reports repository evidence, not a promise that the tests pass in every local environment.
Elab/lint means the module has Bazel elaboration/lint targets; Sim means there is a simulation testbench or generated simulation test; FPV means there is formal monitor or formal test collateral.
| Module | Description | Verification artifacts |
|---|---|---|
|
Inserts timing isolation on an APB channel. |
Elab/lint, FPV. |
|
Funnels multiple AMBA Trace Bus streams into one downstream stream. |
Elab/lint, FPV. |
|
Converts an AXI subordinate interface into an AXI-Lite manager interface. |
Elab/lint, FPV. |
|
Terminates AXI requests with default target responses. |
Elab/lint, FPV. |
|
Routes AXI transactions from one upstream interface to selected downstream interfaces. |
Elab/lint, Sim, FPV. |
|
Isolates the manager side of an AXI interface during reset or shutdown sequencing. |
Elab/lint, Sim, FPV. |
|
Isolates the subordinate side of an AXI interface during reset or shutdown sequencing. |
Elab/lint, Sim, FPV. |
|
Shrinks AXI data width while preserving AXI transaction semantics. |
Elab/lint, Sim, FPV. |
|
Inserts timing isolation on AXI channels. |
Elab/lint, FPV. |
|
Bridges AXI-Lite transactions to APB. |
Elab/lint, FPV. |
|
Terminates AXI-Lite requests with default target responses. |
Elab/lint, FPV. |
|
Generates AXI-Lite write transactions for message-signaled interrupts. |
Elab/lint, FPV. |
|
Splits AXI-Lite traffic across multiple downstream interfaces. |
Elab/lint, FPV. |
|
Inserts timing isolation on AXI-Lite channels. |
Elab/lint, FPV. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Grants the first eligible requester according to fixed priority. |
Elab/lint, Sim, FPV. |
|
Holds an arbitration grant stable until the selected requester releases it. |
Elab/lint, Sim, FPV. |
|
Grants using least-recently-used priority state. |
Elab/lint, Sim, FPV. |
|
Produces multiple round-robin grants per arbitration cycle. |
Elab/lint, FPV. |
|
Combines fixed-priority and round-robin arbitration behavior. |
Elab/lint, FPV. |
|
Grants using round-robin priority state. |
Elab/lint, Sim, FPV. |
|
Grants using weighted least-recently-used priority state. |
Elab/lint, Sim, FPV. |
|
Grants using weighted round-robin priority state. |
Elab/lint, FPV. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Transfers a single-cycle pulse between clock domains. |
Elab/lint, Sim. |
|
Synchronizes a single-bit level signal between clock domains. |
Elab/lint. |
|
Controls a dual-clock 1R1W external RAM FIFO with ready/valid push and pop flow control. |
Elab/lint, FPV. |
|
Controls a dual-clock 1R1W external RAM FIFO with credit/valid push and ready/valid pop flow control. |
Elab/lint, FPV. |
|
Provides the pop-side controller for a split dual-clock 1R1W FIFO controller. |
FPV through combined FIFO controller collateral. |
|
Provides the ready/valid push-side controller for a split dual-clock 1R1W FIFO controller. |
FPV through combined FIFO controller collateral. |
|
Provides the credit/valid push-side controller for a split dual-clock 1R1W FIFO controller. |
FPV through combined FIFO controller collateral. |
|
Implements a dual-clock FIFO using internal flop storage and ready/valid flow control. |
Elab/lint, Sim, FPV. |
|
Implements a dual-clock FIFO using internal flop storage with credit/valid push flow control. |
Elab/lint, Sim, FPV. |
|
Transfers a register-like value between clock domains. |
Elab/lint, Sim. |
|
Synchronizes an asynchronous reset into a destination clock domain. |
Elab/lint. |
|
Transfers data that is stable while sampled across a clock-domain boundary. |
Elab/lint, Sim. |
|
Transfers stable CDC data with automatic update handling. |
Elab/lint, Sim. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Counts up and down with wrapping or saturation behavior. |
Elab/lint, Sim, FPV. |
|
Counts down with wrapping or saturation behavior. |
Elab/lint, Sim, FPV. |
|
Counts up with wrapping or saturation behavior. |
Elab/lint, Sim, FPV. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Tracks available credits for credit/valid flow control. |
Elab/lint, FPV. |
|
Manages the receiver side of credit/valid flow control without adding datapath buffering. |
Elab/lint, Sim, FPV. |
|
Converts ready/valid sender traffic into credit/valid receiver traffic. |
Elab/lint, FPV. |
|
Sends credit/valid traffic across multiple virtual channels. |
Elab/lint, Sim. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Presents a CSR memory interface through an AXI-Lite subordinate port. |
Elab/lint, Sim, FPV. |
|
Bridges CSR requests and responses across a clock-domain boundary. |
Elab/lint, FPV. |
|
Routes CSR requests to one of multiple downstream CSR interfaces. |
Elab/lint, Sim, FPV. |
|
Adapts CSR requests to a simple memory-like interface. |
Elab/lint, Sim. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Delays a signal by a fixed number of stages with reset. |
Elab/lint, FPV. |
|
Applies per-lane delay to deskew multiple related signals. |
Elab/lint. |
|
Delays a signal by a fixed number of stages without reset. |
Elab/lint, FPV. |
|
Implements a loadable shift register. |
Elab/lint. |
|
Applies per-lane delay to intentionally skew multiple related signals. |
Elab/lint. |
|
Delays data using valid-based self-gating. |
Elab/lint, FPV. |
|
Delays data using valid-next self-gating. |
Elab/lint, FPV. |
|
Delays data using valid-next self-gating without reset. |
Elab/lint, FPV. |
|
Delays data using valid-based self-gating without reset. |
Elab/lint. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Routes input data to one output selected by a binary index. |
Elab/lint. |
|
Routes input data to outputs selected by a one-hot mask. |
Elab/lint. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Decodes SECDED-protected data and reports/corrects errors. |
Elab/lint, Sim, FPV. |
|
Encodes data with single-error-correcting, double-error-detecting parity. |
Elab/lint, Sim, FPV. |
|
Decodes single-error-detecting protected data and reports errors. |
Elab/lint, Sim, FPV. |
|
Encodes data with single-error-detecting parity. |
Elab/lint, Sim, FPV. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Converts a binary value to Gray code. |
Elab/lint, Sim. |
|
Converts a binary index to a one-hot vector. |
Elab/lint, Sim. |
|
Counts the number of asserted bits in a vector. |
Elab/lint, Sim. |
|
Converts a Gray-code value to binary. |
Elab/lint, Sim. |
|
Converts a one-hot vector to a binary index. |
Elab/lint, Sim. |
|
Selects priority winners with a dynamic priority input. |
Elab/lint, Sim. |
|
Selects priority winners from a request vector. |
Elab/lint, Sim. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Controls a 1R1W external RAM FIFO with ready/valid push and pop flow control. |
Elab/lint, FPV. |
|
Controls a 1R1W external RAM FIFO with credit/valid push and ready/valid pop flow control. |
Elab/lint, FPV. |
|
Implements a FIFO using internal flop storage and ready/valid flow control. |
Elab/lint, Sim, FPV. |
|
Implements a FIFO using internal flop storage with credit/valid push flow control. |
Elab/lint, Sim, FPV. |
|
Dynamically shares FIFO storage across multiple logical FIFOs. |
Elab/lint, FPV. |
|
Dynamically shares FIFO storage using an externally supplied arbiter. |
Elab/lint, FPV. |
|
Dynamically shares FIFO storage with credit/valid push flow control. |
Elab/lint, FPV. |
|
Dynamically shares FIFO storage with credit/valid push flow control and an external arbiter. |
Elab/lint, FPV. |
|
Dynamically shares FIFO storage with credit/valid flow control on both push and pop sides. |
Elab/lint. |
|
Dynamically shares FIFO storage with push/pop credits and an external arbiter. |
Elab/lint. |
|
Implements dynamically shared FIFO storage using internal flops. |
Elab/lint, Sim, FPV. |
|
Implements dynamically shared flop FIFOs with credit/valid push flow control. |
Elab/lint, Sim, FPV. |
|
Implements dynamically shared flop FIFOs with credit/valid push and pop flow control. |
Elab/lint, Sim. |
|
Arbitrates pop access for shared FIFO storage. |
Elab/lint. |
|
Arbitrates pop access for shared FIFO storage with credit flow control. |
Elab/lint. |
|
Arbitrates credit-based pop access using an external arbiter. |
Elab/lint. |
|
Arbitrates pop access using an external arbiter. |
Elab/lint. |
|
Statically partitions shared FIFO storage across logical FIFOs. |
Elab/lint, FPV. |
|
Statically partitions shared FIFO storage with credit/valid push flow control. |
Elab/lint, FPV. |
|
Implements statically partitioned shared FIFO storage using internal flops. |
Elab/lint, Sim, FPV. |
|
Implements statically partitioned shared flop FIFOs with credit/valid push flow control. |
Elab/lint, Sim, FPV. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Arbitrates ready/valid flows with fixed priority. |
Elab/lint, FPV. |
|
Arbitrates ready/valid flows with least-recently-used priority. |
Elab/lint, FPV. |
|
Arbitrates ready/valid flows with round-robin priority. |
Elab/lint, FPV. |
|
Multiplexes bursty ready/valid flows with fixed-priority arbitration. |
Elab/lint, FPV. |
|
Multiplexes bursty stable-data ready/valid flows with fixed-priority arbitration. |
Elab/lint, FPV. |
|
Multiplexes bursty ready/valid flows with least-recently-used arbitration. |
Elab/lint, FPV. |
|
Multiplexes bursty stable-data ready/valid flows with least-recently-used arbitration. |
Elab/lint, FPV. |
|
Multiplexes bursty ready/valid flows with round-robin arbitration. |
Elab/lint, FPV. |
|
Multiplexes bursty stable-data ready/valid flows with round-robin arbitration. |
Elab/lint, FPV. |
|
Demultiplexes a ready/valid flow to a registered selected output. |
Elab/lint, FPV. |
|
Demultiplexes a ready/valid flow to a combinational selected output. |
Elab/lint, FPV. |
|
Converts multiple narrow ready/valid flits into fewer wider flits. |
Elab/lint, FPV. |
|
Forks one ready/valid flow to multiple downstream consumers. |
Elab/lint, FPV. |
|
Forks one ready/valid flow to a multihot-selected subset of consumers. |
Elab/lint, FPV. |
|
Joins multiple ready/valid control flows into one output flow. |
Elab/lint. |
|
Multiplexes ready/valid flows with fixed-priority arbitration. |
Elab/lint, FPV. |
|
Multiplexes stable-data ready/valid flows with fixed-priority arbitration. |
Elab/lint, FPV. |
|
Multiplexes ready/valid flows with least-recently-used arbitration. |
Elab/lint, FPV. |
|
Multiplexes stable-data ready/valid flows with least-recently-used arbitration. |
Elab/lint, FPV. |
|
Multiplexes ready/valid flows with round-robin arbitration. |
Elab/lint, FPV. |
|
Multiplexes stable-data ready/valid flows with round-robin arbitration. |
Elab/lint, FPV. |
|
Multiplexes ready/valid flows using an explicit external select and registered pop outputs. |
Elab/lint, FPV. |
|
Multiplexes ready/valid flows using a combinational external select. |
Elab/lint, FPV. |
|
Registers both forward and reverse sides of a ready/valid flow. |
Elab/lint, FPV. |
|
Registers the forward valid/data side of a ready/valid flow. |
Elab/lint, FPV. |
|
Passes a ready/valid flow through without registering it. |
Elab/lint, FPV. |
|
Registers the reverse ready side of a ready/valid flow. |
Elab/lint, FPV. |
|
Converts fewer wide ready/valid flits into multiple narrower flits. |
Elab/lint, FPV. |
|
Crossbars ready/valid flows with fixed-priority arbitration. |
Elab/lint, FPV. |
|
Crossbars ready/valid flows with least-recently-used arbitration. |
Elab/lint, FPV. |
|
Crossbars ready/valid flows with round-robin arbitration. |
Elab/lint, FPV. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Buffers a scalar signal. |
Elab/lint through gate macro tests. |
|
Buffers a clock signal. |
Elab/lint through gate macro tests. |
|
Inverts a scalar signal. |
Elab/lint through gate macro tests. |
|
Inverts a clock signal. |
Elab/lint through gate macro tests. |
|
Computes a two-input AND. |
Elab/lint through gate macro tests. |
|
Computes a two-input OR. |
Elab/lint through gate macro tests. |
|
Computes a two-input XOR. |
Elab/lint through gate macro tests. |
|
Selects between two data inputs. |
Elab/lint through gate macro tests. |
|
Selects between two clock inputs. |
Elab/lint through gate macro tests. |
|
Models an integrated clock gate. |
Elab/lint through gate macro tests. |
|
Models an integrated clock gate with synchronous reset behavior. |
Elab/lint through gate macro tests. |
|
Models a CDC synchronizer cell. |
Elab/lint through gate macro tests. |
|
Models a CDC synchronizer cell with asynchronous reset. |
Elab/lint through gate macro tests. |
|
Marks a pseudo-static CDC crossing. |
Elab/lint through gate macro tests. |
|
Marks a CDC crossing that should receive max-delay checking. |
Elab/lint through gate macro tests. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Implements a configurable linear feedback shift register. |
Elab/lint, Sim. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Drives an expression to constant ones and waives related lint warnings internally. |
Elab/lint. |
|
Drives an expression to constant zeros and waives related lint warnings internally. |
Elab/lint. |
|
Sinks an unused expression and waives related lint warnings internally. |
Elab/lint. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Distributes multi-transfer work using round-robin selection. |
Elab/lint, FPV. |
|
Registers the forward side of a multi-transfer interface. |
Elab/lint, Sim, FPV. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Selects one input using a binary index. |
Elab/lint, Sim. |
|
Selects one element from an unpacked input array using a binary index. |
Elab/lint. |
|
Builds a binary-select mux from structured gate primitives. |
Elab/lint, Sim. |
|
Selects inputs using a one-hot select vector. |
Elab/lint, Sim. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Decodes RAM addresses and optionally steers write data for tiled RAMs. |
Elab/lint, FPV. |
|
Pipelines read data returned from tiled RAMs. |
Elab/lint, FPV. |
|
Implements a tiled flop RAM with configurable read and write ports. |
Elab/lint, FPV. |
|
Provides a simplified one-read, one-write flop RAM mock that should not be synthesized. |
Elab/lint, Sim collateral. |
|
Implements one physical tile of a flop RAM with configurable read and write ports. |
Elab/lint, FPV. |
|
Initializes RAM contents through a write port after reset. |
Elab/lint, Sim collateral, FPV. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Shifts an input value left by a selected amount. |
Elab/lint, Sim. |
|
Shifts an input value right by a selected amount. |
Elab/lint, Sim. |
|
Rotates an input value by a selected amount. |
Elab/lint, Sim. |
| Module | Description | Verification artifacts |
|---|---|---|
|
Manages allocation and deallocation of free identifiers or tags. |
Elab/lint, Sim, FPV. |
|
Manages linked-list pointers for tracker-style data structures. |
Elab/lint, Sim, FPV. |
|
Reorders completed operations back into sequence order. |
Elab/lint, FPV. |
|
Controls a reorder buffer backed by a one-read, one-write memory. |
Elab/lint, FPV. |
|
Implements a flop-backed reorder buffer. |
Elab/lint, Sim, FPV. |
|
Tracks sequence numbers and wraparound ordering. |
Elab/lint, FPV. |
| Package | Public helpers | Verification artifacts |
|---|---|---|
|
AMBA protocol constants, typedefs, and helpers used by |
Elab/lint via AMBA module users. |
|
CDC helper declarations used by CDC FIFO and register modules. |
Elab/lint via CDC module users. |
|
|
Package elaboration test. |
|
LFSR tap helper package used by |
Package elaboration test; Sim through |
|
|
Package elaboration test. |
| Module | Description |
|---|---|
|
Formal monitor for four-phase handshake behavior. |
|
Formal monitor for delay-line behavior. |
|
Formal monitor for FIFO ordering and occupancy behavior. |
|
Formal monitor for RAM behavior. |
|
Formal monitor for valid/ready protocol behavior. |
|
Formal helper for Wolper-style coloring arguments. |
