User Tools


SystemVerilog Coding Standards

HDLs (Hardware Description Languages) like SystemVerilog can be difficult to understand. To make SystemVerilog code more readable and maintainable, you are required to follow coding standards. These standards are explained below. Each lab will be graded against this coding standard.

NEW video standard recently added… See below!!

Videos

If you are asked to attach a video to your project, please do it as follows.

There is a about a 150MB limit to the size of video you can upload. On a cellphone at default resolution that is not that long. You can try to reduce the recording resolution but, at least on an iPhone, you cannot reduce it much. If it is too large, you can try one of the following:

  • Process it using a program to convert it to a 640×480 size video. That should be big enough.
  • Upload it to one of Youtube, Dropbox, Google Drive, or Box and enter a link where the TA's can find it instead of actually uploading your video to LearningSuite.
  • Find a website that will let you upload and it it will downconvert it for you. CAUTION: these are notorious for installing junk on your computer so be careful if you go this route and use it as a method of last resort.

Of these, Youtube is pretty painless but any of the second group will work.

Files

  • A new .sv file will be created for every SystemVerilog module you create.
  • The name of any SystemVerilog file you create must match the name of the module it contains. For example, if you have a SystemVerilog file with a module named FourFunctions, the filename will be FourFunctions.sv.
  • Each .sv file will have a header as follows:
/***************************************************************************
* 
* Module: <module Name>
*
* Author: <Your Name>
* Class: <Class, Section, Semester> - ECEN 220, Section 1, Winter 2020
* Date: <Date file was created>
*
* Description: <Provide a brief description of what this SystemVerilog file does>
*
*
****************************************************************************/
  • Each file should include the `default_nettype none macro directive.

Signals

  • Signal types:
    • Declare module inputs as input wire logic
    • Declare module outputs as output logic
    • Declare internal signals as logic
    • The keywords reg, and var are not allowed to be used, and wire can only be used for inputs as described above.
  • Signal names:
    • Are descriptive (clrTimer instead of n7).
    • Will have a _n suffix for active low signals (eg. write_n).
  • When signals are declared, they will not use an initializer. For example, this is incorrect: logic nextState = 0;. Rather, signals will be declared as in logic nextState;.

Comments and Indenting

  • Indentation will be used in the code to show its structure.
  • Each always_ff block and every always_comb block will be preceded by a comment describing its function and how it should operate.
  • If the name of a signal is expressive enough (e.g. clrTimer) then a comment describing may not be needed. Otherwise, all signal declarations will have an associated descriptive comment.

Design Requirements

  • The only assignment operator allowed in an always_ff block is the <= operator. The only assignment operator allowed in assign statements and always_comb blocks is the = operator.
  • Every always_comb block must begin by assigning default values to all signals being driven in the block.
  • Every always_ff block will include functionality allowing the registers within the block to be set to known values via the assertion of a clr or load signal.
  • Outputs from counters, state machines, etc. will be combinational except in very rare cases.
  • Finite state machines will be coded using the style of the textbook including the use of an enumerated type for the state type, an always_comb for the combined IFL/OFL, and an always_ff for the state register.

Suggested Style

  • The code for the different sub-modules in a module will be grouped together. For example, the statements associated with the timer circuitry will appear together, followed by the statements associated with the bit counter circuitry, followed by the state machine. Each such section of circuitry will have comments delimiting it.
  • Local signal declarations will come just after the module definition and its port declarations.
  • In programming (as well as HDL-based design) there are two common ways of naming signals so that their meaning is obvious.
    • One way is called camel case and consists of starting the signal name with a lower case letter and then capitalizing subsequent words as in: clearTimer, resetConfigurationRegisters, or launchMissile.
    • The second way is to make everything lower case and use underscores to separate the pieces as in: clear_timer, reset_configuration_registers, and launch_missile.
    • Choose one of these two styles, be consistent, and use descriptive signal names.
  • Similarly, there are common ways of naming modules and constants. For modules, it is common practice to start their names with a capital letter as in: EventCounter or InitializationRegisters. For constants (sometimes called parameters in SystemVerilog), it is common to make them uppercase as in INITVAL, THRESHOLD, or DATAWIDTH.
  • Why would any of this be important? In a large design with literally 100,000's of signals and 1,000's of modules, this will add uniformity to the design to help make the code more readable and maintain-able.