From 780576c92cae7016b13f07f99b675a3ee5722d54 Mon Sep 17 00:00:00 2001 From: Alex Mykyta Date: Thu, 12 Oct 2023 21:55:56 -0700 Subject: [PATCH] Add SystemRDL & PeakRDL tools --- content/items/peakrdl.md | 51 ++++++++++++++++++++++++++++ content/items/systemrdl-compiler.md | 38 +++++++++++++++++++++ static/logos/peakrdl.png | Bin 0 -> 12798 bytes static/logos/systemrdl-compiler.png | Bin 0 -> 12798 bytes 4 files changed, 89 insertions(+) create mode 100644 content/items/peakrdl.md create mode 100644 content/items/systemrdl-compiler.md create mode 100644 static/logos/peakrdl.png create mode 100644 static/logos/systemrdl-compiler.png diff --git a/content/items/peakrdl.md b/content/items/peakrdl.md new file mode 100644 index 00000000..baad2758 --- /dev/null +++ b/content/items/peakrdl.md @@ -0,0 +1,51 @@ +--- +title: "PeakRDL" +description: "Control & Status register (CSR) automation toolchain" +authors: + - Alex Mykyta +links: + gh: "SystemRDL/PeakRDL" + docs: "https://peakrdl.readthedocs.io" +tags: + - SystemRDL + - code-generator + - Python + - configuration-register + - csr + - verilog + - systemverilog + - documentation + - UVM-reg + - RTL + - abstract +categories: + - "Tools:CSR Automation" +licenses: + - GPL-3.0 +active: + from: 2018 +talk: 241 +--- + +PeakRDL is a free and open-source control & status register (CSR) automation +toolchain. This project provides a command-line tool that unifies many aspects of register automation centered around the SystemRDL register description language. + +This tool can: + +* Process SystemRDL 2.0 register descriptions. +* Import & export IP-XACT XML. +* Generate synthesizable SystemVerilog RTL register blocks using APB, AXI4-Lite, Avalon, and other interfaces. +* Create rich and dynamic HTML documentation. +* Build a UVM register model abstraction layer. +* Generate C headers for software. +* ... or be extended with your own plugin to generate other outputs + +## References + +- [SystemRDL Compiler]({{< ref "/items/systemrdl-compiler" >}} "SystemRDL Compiler") +- [PeakRDL-cheader](https://github.com/SystemRDL/PeakRDL-cheader) +- [PeakRDL-html](https://github.com/SystemRDL/PeakRDL-html) +- [PeakRDL-ipxact](https://github.com/SystemRDL/PeakRDL-ipxact) +- [PeakRDL-regblock](https://github.com/SystemRDL/PeakRDL-regblock) +- [PeakRDL-systemrdl](https://github.com/SystemRDL/PeakRDL-systemrdl) +- [PeakRDL-uvm](https://github.com/SystemRDL/PeakRDL-uvm) diff --git a/content/items/systemrdl-compiler.md b/content/items/systemrdl-compiler.md new file mode 100644 index 00000000..4fd933a6 --- /dev/null +++ b/content/items/systemrdl-compiler.md @@ -0,0 +1,38 @@ +--- +title: "SystemRDL Compiler" +description: "SystemRDL language compiler front-end" +authors: + - Alex Mykyta +links: + gh: "SystemRDL/systemrdl-compiler" + docs: "https://systemrdl-compiler.readthedocs.io" +tags: + - SystemRDL + - language-model + - parser + - compiler + - code-generator + - Python + - configuration-register + - csr +categories: + - "Tools:CSR Automation" +licenses: + - MIT +active: + from: 2017 +talk: 241 +--- + +SystemRDL is a domain specific language used to describe control/status +registers (CSR) that define a hardware/software boundary for hardware +peripherals. By describing the structure of a CSR in SystemRDL, one can create a single source of truth specification for CSR automation and code generation. + +The `systemrdl-compiler` project implements a generic compiler front-end for +Accellera's [SystemRDL 2.0](http://accellera.org/downloads/standards/systemrdl) +register description language. The goal of this project is to provide a free and +open compiler that lowers the barrier to entry to using an industry standard +register description language. + +By providing an elaborated register model that is easy to traverse and query, +it should be far easier to write custom register space view generators. diff --git a/static/logos/peakrdl.png b/static/logos/peakrdl.png new file mode 100644 index 0000000000000000000000000000000000000000..05dc5037ad8bd357ba14e001ac614522c2cead3d GIT binary patch literal 12798 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
D-@7$Mr-s! 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 literal 0 HcmV?d00001 diff --git a/static/logos/systemrdl-compiler.png b/static/logos/systemrdl-compiler.png new file mode 100644 index 0000000000000000000000000000000000000000..05dc5037ad8bd357ba14e001ac614522c2cead3d GIT binary patch literal 12798 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
D-@7$Mr-s! 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 literal 0 HcmV?d00001