Menu
Coddy logo textTech

Opérateur conditionnel

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 selon une condition. Il est également appelé opérateur ternaire. L'opérateur conditionnel évalue une condition et retourne l'une des deux valeurs :

condition ? value_if_true : value_if_false

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

Pourquoi utiliser l'opérateur conditionnel

C'est une façon compacte d'écrire une logique simple si-sinon en une seule ligne. Les utilisations courantes incluent :

  • La sélection entre deux signaux
  • La création de multiplexeurs
  • La définition de valeurs par défaut
  • Les affectations conditionnelles en ligne

Syntaxe et exemples

Exemple de base :

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

Select between values:

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

Inverser le signal de manière conditionnelle :

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

Output:

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 rendre les conditions imbriquées claires.

Remarques importantes

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

Défi

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

Ce qu'il faut faire :

  1. Définissez max comme le plus grand entre x et y
  2. Définissez abs comme la valeur absolue de val (si négative, rendez-la positive)
  3. Définissez output_data à data si enable vaut 1, sinon à 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