Altifigence Academy

32 / 37 · Übung

Integrierte Übung: periodische Impulse und freigegebener Akkumulator

Beschreiben Sie Übertragungen mit alten Werten und prüfen Sie Pausen, aufeinanderfolgende Impulse und gleichzeitigen Reset.

Vor dem Verbinden die Schnittstelle definieren

Nehmen Sie an jeder steigenden Flanke mit enable=1 einen vorzeichenlosen Vier-Bit-Wert sample an. Jede N-te Annahme erzeugt den registrierten pulse. Der Akkumulator konsumiert pulse und den zugehörigen gespeicherten sample an der nächsten steigenden Flanke, auch wenn enable dann 0 ist. total hat acht Bits und läuft modulo 256 über. Synchroner Reset löscht beide Stufen und verwirft wartende Daten. Eine Flanke Latenz gehört zum Vertrag: der Akkumulator liest alte pulse/saved_sample, keine an derselben Flanke neu geplanten Werte. Speichern Sie modulo_tick.sv und dieses periodic_accumulator.sv; N ist positiv.

SystemVerilog
module periodic_accumulator #(parameter integer N = 3) (
  input  logic       clk, rst, enable,
  input  logic [3:0] sample,
  output logic       pulse,
  output logic [7:0] total
);
  localparam integer CW = (N <= 1) ? 1 : $clog2(N);
  wire [CW-1:0] count;
  logic [3:0] saved_sample;
  modulo_tick #(.N(N)) tick_u (
    .clk(clk), .rst(rst), .enable(enable),
    .count(count), .pulse(pulse)
  );
  always_ff @(posedge clk) begin
    if (rst) saved_sample <= 4'b0;
    else if (enable) saved_sample <= sample;
  end
  always_ff @(posedge clk) begin
    if (rst) total <= 8'b0;
    else if (pulse) total <= total + {4'b0, saved_sample};
  end
endmodule

Daten und Ereignis zusammen verfolgen

N=3, Eingänge vor und Ausgänge nach der Flanke.

Flankerstenablesamplepulse danachtotal danach
E011900
E101200
E201400
E301710
E400907
E501107
E601307
E701517
E8111500

E4 addiert 7, nicht den externen sample=9. enable steuert neue Annahmen und löscht keinen bereits wartenden Vorgang. E8 verwirft 5 und löscht total. enable && pulse beim Konsum verlöre E4.

Referenz an der Systemgrenze

Speichern Sie Zahl angenommener Werte, einen optionalen wartenden Wert und ganzzahliges total. Ohne Reset konsumieren Sie zuerst den alten wartenden Wert modulo 256. Danach erzeugen Sie aus aktuellem enable/sample bei der N-ten Annahme einen neuen wartenden Vorgang. Reset löscht alles. Lesen Sie weder tick_u.count noch saved_sample. Setzen Sie Stimuli an der fallenden Flanke und prüfen Sie später pulse, total, Halten ohne Ereignis und Entfernen konsumierter Daten.

Integrationsfehler abdecken

  • N=1 erzeugt aufeinanderfolgende Impulse: jedes sample muss an der nächsten Flanke genau einmal konsumiert werden.
  • N=3 mit Pausen vor/nach dem Endwert: zählen Sie Annahmen, nicht alle Takte.
  • Ändern Sie externe sample-Daten bei gesperrtem Konsum: gespeicherte Daten gelten.
  • Reset bei wartenden Daten verwirft Ereignis und total.
  • Addieren Sie über 255 und prüfen Sie modulo 256.

Ersetzen Sie saved_sample durch sample: E4 muss scheitern. Verknüpfen Sie Konsum fälschlich mit enable und prüfen Sie einen weiteren Fehler. Stellen Sie vor PASS die Quelle wieder her. Geprüft wird endliche, eintaktige Funktion. CDC, physikalischer Timingabschluss und kostenlose DDS-Produktausführung sind damit nicht bewiesen.

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