- A configuration declaration is needed for each architecture in the design
- Design-internal references must use library work
- Use selected names in binding indications and ’use’ clauses only
- Testbench and DUT should be compiled into the same library
- Avoid more package references than needed
- VHDL units should take into account later floorplanning
- Asynchronous parts should be placed into separate entities
- Keep all objects and subprograms in the nearest possible scope
- Keep local objects invisible outside a package
- Transfer stable component declarations into components packages
- Re-use functionality of standard packages as much as possible
- Size of VHDL Units should be reasonable for synthesis
- A VHDL unit should not exceed 500 lines of code
- A process or subprogram should not exceed 100 lines of code
- Component instantiations should not exceed 4 levels of hierarchy
- An architecture should not contain more than 10 processes
- Structural and behavioral code should not be mixed
- Define project packages early in the project
- Configuration must be in a separated file except the latest level of hierarchy
- Only verified VHDL code allowed for check-in
- Store each VHDL unit into a separate file except package header and body
- Hide old VHDL files
- All primary unit names must be unique in the project library
- Identifier casing should be uniform in all VHDL code
- Length of entity names should not exceed 32 characters
- An instance name must not contain the substring ’pfiller’
- An instance name must not start with bondpad
- Identifier naming must be based on English language
- Use meaningful identifier names
- Separate identifier components using underscores
- Signal assignments for renaming purposes should be avoided
- The names of clocks and resets should be unique in the whole design
- Naming conventions for VHDL units
- Naming conventions for VHDL files
- Naming conventions for VHDL objects
- Choose short instance names
- Keyword casing should be uniform in all VHDL code
- Use standard top-levels xmpl, xmpl_top, and xmpl_chip
- Use an intermediate signal for reading from an output port
- Example for unit and file naming conventions
- Abbreviations for naming conventions
- Use unresolved data types if possible
- Hard/firm macros: Data types at ports: std_(u)logic(_vector)
- Generics must have type integer for synthesis
- Soft macros: Data types at ports: std_(u)logic(_vector)
- Avoid custom data types (e.g., multidimensional arrays, records, enumeration types)
- Self-defined conversion functions must assert un-mappable input values
- Use complex data types inside architectures
- Use a small number of self-defined global data types
- Asynchronous reset is mandatory for sequential processes
- Do not use internal three-state busses
- Use the predefined templates for component instantiation
- Refer to one edge of clock, only
- Do not use combinational feedback loops
- Avoid feedthroughs
- Strength stripping should be performed on chip level
- Do not assign the value 'X'
- Balance clock to delta accuracy
- Pull-ups and pull-downs have to be modeled on chip level
- Gate instantiation must be encapsulated by separate unit
- A FSM must be described in a separate entity/architecture pair
- Instantiate the power pads for each power domain
- Spend extensive efforts for documentation of interfaces
- Spacer cells needed between pads
- Signals that cross clock domains must be synchronized by synchronization cells
- Avoid gated clocks unless absolutely necessary
- Avoid latches unless absolutely necessary
- All outputs of synchronous modules should be registered
- Process only one clock in RTL-units
- Do not use the value of type’left for initializing of a signal or variable during reset
- Avoid unused ports, busses must be split accordingly
- Use case-statements instead of if-statements when the conditions are mutually exclusive
- All signals and variables should be read at least once
- Static ports should not exist
- Avoid unnecessary computations within loops
- Insert test-enable for scan-test
- Use vector operations instead of loops
- Avoid unnecessary repetition of function calls
- Use efficient description for the wrap around of counters
- Build interface consistency checks into the model
- For soft-core development use generics, do not use constants
- Global signals may be used for testing purposes only
- Variables of access types should be modified only in procedures defined in packages
- A testbench has neither ports nor generics
- Use abstract, compact coding style in testbench and simulation models
- In case of accelerated simulation or emulation, the testbench must be synthesizable
- Stop the simulation from within the testbench
- Use assertion messages extensively
- Binary file-IO may not be used
- Use relative path names for files accessed through text-IO
- Communication between modules using text-IO is forbidden
- No characters with a lower rank than space may occur in text-IO
- Check the success of a read operation
- Use std.textio only, where really necessary
- Store file data to a VHDL variable, if read multiple times
- In association lists of generic maps and port maps use named association
- Language for comments and code documentation is English
- Comments should be related to the lines of code below
- Trailing comments are only allowed for declarative lists
- Comment each process, each subprogram and global aspects
- Processes should be labeled
- Aliases are not recommended
- Do not define a subprogram for a subtype only
- The names of clocks and resets should be unique in the whole design
- Use a separate library clause for each declared resource library
- Use a separate use clause for each declared package
- Maximum line-length is 100 characters
- Order of ports in entity, component and instance should be the same
- Do not have unused signals
- In association lists of subprogram calls use named association
- Indentation should be consistent in all VHDL code
- Align comments vertically
- Align declaration lists vertically
- Align association lists vertically
- Use closing labels for entity, architecture, process, loop, generate, etc.
- Indicate condition at remote ends of control structures (if ... then, case)
- Use one statement per line
- Group related constructs
- Group related port or signal declarations
- Switch constructs should not be nested to more than 4 levels
- Remove unnecessary code fragments
- Order of items should be the same in package header and body
- Use predefined attributes to make code generic and more re-usable
- Do not have code that have been commented out in checked-in versions
Your comments will be moderated before it can appear here. Win prizes for being an engaged reader.