Altifigence Academy

32 / 37 · Travaux pratiques

Travaux pratiques intégrés : impulsions périodiques et accumulateur autorisé

Spécifiez les transferts utilisant les valeurs précédentes et vérifiez pauses, impulsions consécutives et reset simultané.

Définir la connexion avant composition

Acceptez un sample non signé de quatre bits à chaque montée avec enable=1. Toutes les N acceptations, générez pulse enregistré. L'accumulateur consomme pulse et l'échantillon correspondant sauvegardé à la montée suivante, même si enable=0 à cet instant. total de huit bits reboucle modulo 256. Reset synchrone efface les étages et rejette l'échantillon en attente. Cette latence d'un front est contractuelle: l'accumulateur lit les anciens pulse et saved_sample, non les nouvelles affectations non bloquantes du même front. Enregistrez modulo_tick.sv et ce periodic_accumulator.sv; N est positif.

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

Suivre ensemble donnée et événement

N=3, entrées avant et sorties après le front.

Frontrstenablesamplepulse aprèstotal après
E011900
E101200
E201400
E301710
E400907
E501107
E601307
E701517
E8111500

E4 ajoute 7, pas sample externe=9. enable contrôle seulement les nouvelles acceptations et n'annule pas l'attente. E8 rejette 5 et efface total. enable && pulse au moment de consommer perdrait E4.

Référence à la frontière du système

Gardez compteur d'acceptations, valeur en attente facultative et total entier. Sur un front sans reset, consommez d'abord l'ancienne attente modulo 256; puis utilisez enable/sample actuels pour créer l'attente à la N-ième acceptation. Reset efface tout. Ne lisez ni tick_u.count ni saved_sample. Stimulez au descendant et comparez ensuite pulse, total, maintien sans événement et retrait des données consommées.

Couvrir les défauts d'intégration

  • N=1 produit des impulsions consécutives: chaque sample doit être consommé exactement une fois au front suivant.
  • N=3 avec pauses avant/après l'échantillon terminal: comptez acceptations, pas tous les clocks.
  • Changez sample externe pendant une consommation avec enable=0: la donnée sauvegardée doit être utilisée.
  • Reset avec attente rejette événement et total.
  • Additionnez au-delà de 255 et vérifiez modulo 256.

Remplacez saved_sample par sample: E4 doit échouer. Conditionnez la consommation à enable pour constater un autre échec. Restaurez avant PASS. Le contrat testé est fonctionnel, à une horloge et largeur finie; il ne prouve ni CDC, ni clôture physique du timing, ni pratique gratuite dans le produit DDS.

Votre choix s’applique à ce navigateur. Modifiez-le à tout moment en bas de page.