Mise en pipeline des données et de valid
Fait partie de la section Conception et vérification RTL du Journey Verilog de Coddy. Leçon 18 sur 38.
Les pipelines répartissent le travail entre les registres. Un indicateur de validité accompagne chaque élément de données afin qu’une étape en aval puisse distinguer un échantillon d’une bulle. Avec les affectations non bloquantes, une étape ultérieure lit la valeur précédente d’une étape antérieure au même front. La réinitialisation doit invalider le travail en cours dans le pipeline.
Extrait pertinent : les déclarations et connexions environnantes sont fournies dans le défi.
always @(posedge clk) begin
stage <= data;
stage_valid <= in_valid;
result <= stage;
out_valid <= stage_valid;
endLes données et leur validité traversent le même nombre de registres.
Alignez les données et la validité à travers chaque étape du pipeline, et invalidez la validité lors de la réinitialisation.
Défi
MoyenImplémentez un pipeline à deux étapes de registres. À chaque front qui n’est pas une réinitialisation, la première étape capture a et in_valid. La deuxième étape utilise les valeurs précédentes de la première étape : out_valid devient son ancienne valeur de validité, et y devient son ancienne donnée plus un modulo 256 lorsqu’elle est valide, sinon zéro. La réinitialisation synchrone rst efface les deux étapes et les sorties. Colonnes de sortie : y, out_valid. Toutes les commandes et les données sont stables avant chaque front montant de l’horloge : les résultats sont observés ensuite.
Complétez design.v et préservez les noms de module et les ports. Le testbench.v verrouillé fournit les changements d’entrée et affiche les sorties une fois stabilisées. Il choisit un scénario à l’aide d’un argument du simulateur tel que +CASE=1 ; aucune entrée standard n’est requise. N’ajoutez pas d’affichage, de délais ni de terminaison de simulation au design. La sortie attendue est une ligne de valeurs décimales par observation, séparées par un espace et se terminant par un saut de ligne.
Essayez vous-même
module dut (input clk, input rst, input in_valid, input [7:0] a, output reg [7:0] y, output reg out_valid);
// Remplacez ce placeholder par votre design.
initial y = 0;
initial out_valid = 0;
endmoduleCette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Conception et vérification RTL
1RTL combinatoire fiable
Les valeurs par défaut évitent les latchsEncodeurs de prioritéValidation one-hotDécodage sûr avec caseRécapitulatif - Routeur de requêtes4RTL séquentiel contrôlé
Priorité du reset et de l'activationCompteurs saturantsMise en pipeline des données et de validDétection des fronts échantillonnésRécapitulatif - Compteur d'événements2Largeurs et arithmétique signée
Préserver les bits de retenueComparaisons signéesDécalages arithmétiques vers la droiteDépassement et saturationRécapitulatif – différence signéeEntraînez-vous par vous-même : Compilateur Verilog en ligne