Altifigence Academy

19 / 37 · Konzept

parameter, localparam, $clog2 und Grenzkonfigurationen

Trennen Sie Laufzeiteingänge von Konfigurationen und entwerfen Sie Breite und Abschluss für N=1 und andere Werte als Zweierpotenzen.

Parameter werden bei der Elaboration festgelegt

Ein Port ändert sich im Betrieb; parameter konfiguriert die Struktur vorher; localparam benennt eine abgeleitete Konstante, die die Instanz nicht überschreibt. Beides sind keine Variablen je Takt. Ein Modulo-N-Zähler nutzt 0..N−1. Für N≥2 reicht $clog2(N); bei N=1 ergibt dies Null, also reservieren Sie mindestens ein Bit. N=0 liegt außerhalb des Vertrags.

Abschluss an einer freigegebenen Flanke

Beim Übergang des alten count von N−1 auf Null wird pulse registriert. Eine gesperrte Flanke hält count und löscht pulse. Synchroner Reset löscht beide und gewinnt gegen enable. N ist eine positive Ganzzahl im unterstützten Bereich.

SystemVerilog
module modulo_tick #(
  parameter integer N = 5,
  parameter integer CW = (N <= 1) ? 1 : $clog2(N)
) (
  input  logic          clk, rst, enable,
  output logic [CW-1:0] count,
  output logic          pulse
);
  localparam logic [CW-1:0] LAST = CW'(N-1);
  always_ff @(posedge clk) begin
    if (rst) begin
      count <= '0;
      pulse <= 1'b0;
    end else begin
      pulse <= 1'b0;
      if (enable) begin
        if (count >= LAST) begin
          count <= '0;
          pulse <= 1'b1;
        end else count <= count + 1'b1;
      end
    end
  end
endmodule

CW steht in Ports und ist deshalb ein offener Parameter. Behalten Sie den Standard oder ≥max(1,$clog2(N)). Ein kleinerer Wert kürzt LAST; ein größerer erzeugt ungenutzte Codes, die >= an einer freigegebenen Flanke auf Null zurückführt. CW'(N-1) legt die Größe fest und repariert keine ungültigen Parameter. Validieren Sie vor der Elaboration; eine Laufzeitassertion repariert keine falsche Deklaration.

Konfigurationsmatrix

NStandard-CWcount nach freigegebenen Flanken seit Resetpulse danach
110,0,01,1,1
211,0,10,1,0
531,2,3,4,00,0,0,0,1
831,2,3,4,5,6,7,00,0,0,0,0,0,0,1

Ein Speicherbit erlaubt bei N=1 trotzdem nur den gültigen Zustand 0. N=5 besucht 5,6,7 normalerweise nicht. Nur Zweierpotenzen aufzunehmen würde den fehlenden ausdrücklichen Rücksetzvergleich verdecken.

Übung: Verhalten und Ablehnung

Instanziieren Sie N=1,2,5,8, prüfen Sie mindestens zwei Perioden, pausieren Sie am Endwert und aktivieren Sie Reset gleichzeitig mit enable. Vergleichen Sie jedes count/pulse. Die ganzzahlige Referenz löscht bei Reset, setzt pulse zunächst Null und erhöht bei enable modulo N mit Überlauferkennung; sie verwendet weder CW noch internen DUT-Zustand. Prüfen Sie die Ablehnung von N=0 und zu kleinem CW. Wiederverwendung gilt für den angegebenen und geprüften Bereich, nicht aufgrund eines bestandenen Standardfalls.

Deine Auswahl gilt für diesen Browser. Du kannst sie jederzeit in der Fußzeile ändern.