| --- | |
| title: "Markdown Usage and Style Guide" | |
| --- | |
| ## Basics | |
| ### Summary | |
| Markdown files are used to write most documentation. | |
| The main Markdown tool is [Hugo](https://gohugo.io). | |
| The Markdown processing is done using the `build_docs.py` tool in the `util` directory. | |
| As with all style guides the intention is to: | |
| * promote consistency across projects | |
| * promote best practices | |
| * increase code sharing and re-use | |
| ### Terminology Conventions | |
| Unless otherwise noted, the following terminology conventions apply to this style guide: | |
| * The word ***must*** indicates a mandatory requirement. | |
| Similarly, ***do not*** indicates a prohibition. | |
| Imperative and declarative statements correspond to ***must***. | |
| * The word ***recommended*** indicates that a certain course of action is preferred or is most suitable. | |
| Similarly, ***not recommended*** indicates that a course of action is unsuitable, but not prohibited. | |
| There may be reasons to use other options, but the implications and reasons for doing so must be fully understood. | |
| * The word ***may*** indicates a course of action is permitted and optional. | |
| * The word ***can*** indicates a course of action is possible given material, physical, or causal constraints. | |
| ### Style Guide Exceptions | |
| ***Justify exceptions with a comment.*** | |
| No style guide is perfect. | |
| There are times when the best path to a working design, or for working around a tool issue, is to simply cut the Gordian Knot and create code that is at variance with this style guide. | |
| It is always okay to deviate from the style guide by necessity, as long as that necessity is clearly justified by a brief comment. | |
| ## General Markdown Style | |
| ### Line length | |
| In OpenTitan, most--but not all--Markdown documents will be rendered to HTML before they are presented to the reader. | |
| However, README files are an important exception, and so the recommended line-wrapping style differs for these two types of files. | |
| 1. ***Rendered Files***: | |
| Files which are intended to be rendered before viewing should have exactly one sentence per line, with no line breaks in the middle of a sentence. | |
| This way change reviews will highlight only those sentences which are modified. | |
| Though the long line lengths make the files slightly less convenient to read from the command-line, this greatly simplifies the review process. | |
| When reviewing Markdown changes, every altered sentence will be included in its entirety in the file diff. | |
| 2. ***README Files***: | |
| README files should wrap lines at under 80 characters. | |
| This ensures that the source is readable without any Markdown processing. | |
| Please note, however, that re-wrapping a paragraph after an insertion or deletion tends to cause longer diffs when the change is reviewed. | |
| When making changes to a document using this style, please consider allowing short lines rather than a full re-wrap after minor edits. | |
| Then occasionally separate commits can be used that only do re-wrapping of the paragraphs. | |
| ### Headings and sections | |
| The title of the document should be provided using the `title` field in the frontmatter. | |
| Headings and sections are given ID tags to allow cross references. | |
| The ID is the text of the heading, converted to lower case and with spaces converted to `-`. | |
| Thus `### Headings and sections` gets the ID `headings-and-sections` and can be referenced using the Markdown hyperlink syntax `[link text](#headings-and-sections)`. | |
| Headings and sections are added to the table of contents. | |
| ### Images | |
| Pictures can be included using the standard Markdown syntax (``). | |
| The preferred format is Scalable Vector Graphics (`.svg`), alternatively Portable Network Graphics (`.png`). | |
| ### Waveforms | |
| Waveforms can be included by adding [wavejson](https://github.com/wavedrom/schema/blob/master/WaveJSON.md) code surrounded by `{{</* wavejson */>}}` shortcode tags. | |
| ### Text Format | |
| Where possible, please restrict Markdown text to the ASCII character set to avoid downstream tool issues. | |
| Unicode may be used when referring to proper names. | |
| ### Comments | |
| Comments are rare, but should be used where needed. | |
| Use the HTML `<!--` and `-->` as the comment delimiters. | |
| ### Markdown file extensions | |
| The Markdown files should use the `.md` file extension. | |
| ## Markdown file format for IP module descriptions | |
| Typically the Markdown file for an IP block follows the same outline. | |
| The header instantiates the standard document header and reads the Hjson description of the module. | |
| ``` | |
| --- | |
| title: "Example IP Block" | |
| --- | |
| ``` | |
| This is followed by some boiler-plate comments. | |
| ``` | |
| This document specifies Name hardware IP functionality. | |
| This module conforms to the [Comportable guideline for peripheral functionality.]({{</* relref "doc/rm/comportability_specification" */>}}) | |
| See that document for integration overview within the broader top level system. | |
| ``` | |
| The next section summarizes the feature set of the IP block. | |
| ``` | |
| ## Features | |
| * Bulleted list | |
| * Of main features | |
| ``` | |
| There then follows a general description of the IP | |
| ``` | |
| ## Description | |
| Description of the IP. | |
| ``` | |
| The Compatibility information will allow device driver writers to identify existing code that can be used directly or with minor changes. | |
| _This section is primarily of interest to software engineers._ | |
| ``` | |
| ## Compatability | |
| Notes on if the IP register interface is compatible with any existing register interface. | |
| Also note any differences. | |
| For example: Matches 16550 UART interface but registers are at 32-bit word offsets. | |
| ``` | |
| The next major section is a more detailed operational description of the module. | |
| ``` | |
| # Theory of Operations | |
| ``` | |
| Conventionally one of the first sections includes a block diagram and a description. | |
| _Should be useful to hardware designers, verification engineers and software engineers._ | |
| ``` | |
| ## Block Diagram | |
|  | |
| ``` | |
| There should be a section containing the automatically generated description of the IP including the signals, interrupts and alerts that it uses. | |
| _Primary user is the SoC integrator, but useful for everyone._ | |
| Note that the interrupt descriptions are also automatically placed in the interrupt status register bit descriptions, which is the most likely place for software engineers to reference them. | |
| ``` | |
| ## Hardware Interfaces | |
| ``` | |
| The organization of the design details section is done to suit the module. | |
| ``` | |
| ## Design Details | |
| Details of the design. | |
| ### Many third level headings | |
| ``` | |
| There are probably waveforms embedded here: | |
| ``` | |
| {{</* wavejson */>}} | |
| { | |
| signal: [ | |
| { name: 'Clock', wave: 'p............' }, | |
| ] | |
| } | |
| {{</* /wavejson */>}} | |
| ``` | |
| The final major section is the software user guide and describes using the IP and notes on writing device drivers. | |
| Code fragments are encouraged. | |
| _This section is primarily for software engineers, but it is expected that the code fragments are used by verification engineers._ | |
| ``` | |
| # Programmers Guide | |
| ``` | |
| One important thing here is to show the order of initialization that has been tested in the verification environment. | |
| In most cases other orders will work, and may be needed by the software environment, but it can be helpful in tracking down bugs for the validated sequence to be described! | |
| ``` | |
| ## Initialization | |
| ``` | |
| ```c | |
| if (...) { | |
| a = ... | |
| } | |
| ``` | |
| Other sections cover different use cases and example code fragments. | |
| ``` | |
| ## Use case A (eg Transmission) | |
| ## Use case B (eg Reception) | |
| ``` | |
| It is important to include a discussion of error conditions. | |
| ``` | |
| ## Error conditions | |
| ``` | |
| Also comment on anything special about interrupts, potentially including the priority order for servicing interrupts. | |
| ``` | |
| ## Interrupt Handling | |
| ``` | |
| The document should end with the automatically generated register tables. | |
| ``` | |
| ## Register Table | |
| {{</* registers "hw/ip/component/data/component.hjson" */>}} | |
| ``` | |
| To allow cut/paste of the default structure, here is an uncommented version: | |
| ``` | |
| --- | |
| title: Name HWIP Technical Specification | |
| --- | |
| # Overview | |
| This document specifies Name hardware IP functionality. | |
| This module conforms to the [Comportable guideline for peripheral functionality.]({{< relref "doc/rm/comportability_specification" >}}) | |
| See that document for integration overview within the broader top level system. | |
| ## Features | |
| * Bulleted list | |
| ## Description | |
| ## Compatibility | |
| # Theory of Operations | |
| ## Block Diagram | |
|  | |
| ## Hardware Interfaces | |
| {{</* incGenFromIpDesc "../data/component.hjson" "hwcfg" */>}} | |
| ## Design Details | |
| ### Many third level headings | |
| # Programmers Guide | |
| ## Initialization | |
| ## Use case A (eg Transmission) | |
| ## Use case B (eg Reception) | |
| ## Error conditions | |
| ## Interrupt Handling | |
| ## Register Table | |
| {{</* incGenFromIpDesc "../data/component.hjson" "registers" */>}} | |
| ``` |