How to explicitly declare and define a Clock and Reset in Bluespec BSV (Bluespec SystemVerilog)

2 min read 04-10-2024
How to explicitly declare and define a Clock and Reset in Bluespec BSV (Bluespec SystemVerilog)


Explicitly Declaring and Defining Clock and Reset in Bluespec BSV

Bluespec SystemVerilog (BSV) is a hardware description language known for its high-level abstraction and strong support for formal verification. When designing hardware in BSV, managing clock and reset signals is crucial for proper functionality. This article explains how to explicitly declare and define clock and reset signals in BSV, ensuring a clear and predictable hardware design.

The Problem and its Solution

Imagine you're designing a simple counter in BSV. You need to ensure it increments only on the rising edge of the clock signal and resets to a specific value on the active edge of the reset signal. However, BSV doesn't automatically infer clock and reset signals from the code. You need to explicitly declare and define them to create the desired hardware behavior.

Scenario and Original Code

Let's say you're designing a counter that increments by one on each clock cycle and resets to zero when the reset signal is active:

module counter (
  input clk,
  input reset,
  output logic [3:0] count
);

  always @(posedge clk) begin
    if (reset) begin
      count <= 0;
    end else begin
      count <= count + 1;
    end
  end

endmodule

This code might seem straightforward, but it lacks explicit declarations for the clock and reset signals. This can lead to ambiguity and potential problems when synthesizing the hardware.

Understanding Clock and Reset in BSV

In BSV, clock and reset signals are declared as standard input ports. However, they have special attributes that influence their behavior:

  • Clock: The clk port is declared as an input and marked with the clock attribute. This attribute tells the BSV compiler that the signal is a clock and must be used to synchronize all state changes in the module.

  • Reset: The reset port is also declared as an input. While it doesn't have a specific attribute like clock, it's crucial for proper reset behavior.

Explicit Declarations and Definitions

To explicitly declare and define the clock and reset signals in the previous code, we modify the module definition as follows:

module counter (
  input clock clk, // Explicit clock declaration
  input reset,     // Explicit reset declaration
  output logic [3:0] count
);

  always @(posedge clk) begin
    if (reset) begin
      count <= 0;
    end else begin
      count <= count + 1;
    end
  end

endmodule

By adding the clock attribute to the clk port, we explicitly declare it as the clock signal for the module. This allows the BSV compiler to correctly interpret the code and generate the corresponding hardware.

Best Practices for Clock and Reset

Here are some best practices for declaring and defining clock and reset signals in BSV:

  1. Always use clock attribute for clock signals. This ensures the BSV compiler recognizes the signal as the clock and generates appropriate hardware for synchronization.
  2. Declare and define reset signals explicitly. Even without a specific attribute, explicit declaration clarifies the signal's purpose.
  3. Use consistent naming conventions. Clearly name your clock and reset signals to avoid confusion (e.g., clk, rst, reset).
  4. Consider reset types. Different hardware designs might require active-high or active-low reset. Define your reset signal accordingly.

Additional Value for Readers

Understanding the importance of explicit clock and reset declarations is essential for building reliable and robust hardware designs in BSV. It avoids ambiguities and ensures the generated hardware behaves as intended. By following these best practices, you can create clear, maintainable, and formally verifiable designs.

References and Resources