Menu
Coddy logo textTech

Conditional Operator

Fait partie de la section Fondamentaux du Journey Verilog de Coddy. Leçon 28 sur 90.

L’opérateur conditionnel ? : sélectionne entre deux valeurs en fonction d’une condition. Il est également appelé opérateur ternaire. L’opérateur conditionnel évalue une condition et renvoie l’une de deux valeurs :

condition ? value_if_true : value_if_false

Si la condition est vraie (1), la première valeur est renvoyée. Si elle est fausse (0), la deuxième valeur est renvoyée.

Pourquoi utiliser l’opérateur conditionnel

C’est une manière compacte d’écrire une logique simple avec if-else sur une seule ligne. Les utilisations courantes comprennent :

  • Sélectionner entre deux signaux
  • Créer des multiplexeurs
  • Définir des valeurs par défaut
  • Affectations conditionnelles en ligne

Syntaxe et exemples

Exemple de base :

result = (a > b) ? a : b;   // result obtient le plus grand de a et b

Sélectionner entre des valeurs :

data_out = (enable) ? data_in : 8'b00000000;   // Output data if enabled, else 0

Invert signal conditionally:

out = (invert) ? ~in : in;   // Si invert est 1, sortie inversée ; sinon inchangée

Exemple de code

module conditional_demo;
  reg [3:0] a, b, max;
  reg enable;
  reg [3:0] data_in, data_out;
  
  initial begin
    a = 4'd7;
    b = 4'd9;
    enable = 1;
    data_in = 4'b1010;
    
    max = (a > b) ? a : b;           // 9
    data_out = (enable) ? data_in : 4'b0000;   // 1010
    
    $display("max = %d", max);
    $display("data_out = %b", data_out);
    $finish;
  end
endmodule

Sortie :

max = 9
data_out = 1010

Opérateurs conditionnels imbriqués

Vous pouvez imbriquer des opérateurs conditionnels pour effectuer plusieurs sélections :

result = (a > b) ? a : (b > c) ? b : c;   // a si a > b, sinon le plus grand de b et c

Utilisez des parenthèses pour clarifier les conditions imbriquées.

Notes importantes

  • La condition doit être un seul bit (ou une expression qui s’évalue à 0 ou 1)
  • Conservez les deux options de valeur avec la même largeur de bit ; si elles diffèrent, Verilog étend silencieusement celle qui est la plus étroite
  • L’opérateur peut être utilisé dans des affectations continues (assign) et des blocs procéduraux (always, initial)
challenge icon

Défi

Écrivez les expressions conditionnelles correctes pour chaque tâche.

À faire :

  1. Définissez max sur la plus grande valeur de x et y
  2. Définissez abs sur la valeur absolue de val (si elle est négative, rendez-la positive)
  3. Définissez output_data sur data si enable vaut 1, sinon sur 8'b0

Essayez vous-même

module conditional_challenge;
  reg [3:0] x, y;
  reg [3:0] max;
  reg signed [3:0] val;
  reg [3:0] abs;
  reg enable;
  reg [7:0] data;
  reg [7:0] output_data;
  
  initial begin
    x = 4'd12;
    y = 4'd8;
    val = -4'sd5;
    enable = 1;
    data = 8'b10101010;
    
    max = ______;          // le plus grand de x et y
    abs = ______;          // valeur absolue de val
    output_data = ______;  // data si enable, sinon 0
    
    $display("max = %d", max);
    $display("abs = %d", abs);
    $display("output_data = %b", output_data);
    $finish;
  end
endmodule
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Fondamentaux

Entraînez-vous par vous-même : Compilateur Verilog en ligne