Mots-clés : if, selector

Instructions conditionnelles

Les instructions conditionnelles (if) sont utilisées pour contrôler si des instructions d'exécution sont exécutées en fonction de l'évaluation de la condition.

Les instructions conditionnelles sont déclarées à l'aide des mots-clés if et else, et l'expression de condition doit être mise entre parenthèses.

La structure d'utilisation des instructions conditionnelles est décrite comme suit :

if (condition1)       true_statement1 ;
else if (condition2)        true_statement2 ;
else if (condition3)        true_statement3 ;
else                      default_statement ;
  • Lorsque l'instruction if est exécutée, si condition1 est vraie, true_statement1 est exécuté ; si condition1 est fausse et condition2 est vraie, true_statement2 est exécuté ; et ainsi de suite.
  • Les structures else if et else peuvent être omises ; c'est-à-dire qu'une seule vérification de condition if et un ensemble d'instructions d'exécution, true_statement1, peuvent former un processus d'exécution.
  • Plusieurs clauses else if peuvent être enchaînées, sans être limitées à seulement 1 ou 2.
  • Les instructions d'exécution telles que true_statement1 peuvent être une seule instruction ou plusieurs instructions. S'il y a plusieurs instructions d'exécution, elles doivent être encadrées par les mots-clés begin et end.

Le code suivant implémente un sélecteur 4 vers 1.

Exemple

module mux4to1(
    input [1:0]     sel ,
    input [1:0]     p0 ,
    input [1:0]     p1 ,
    input [1:0]     p2 ,
    input [1:0]     p3 ,
    output [1:0]    sout);

    reg [1:0]     sout_t ;

    always @(*) begin
        if (sel == 2'b00)
            sout_t = p0 ;
        else if (sel == 2'b01)
            sout_t = p1 ;
        else if (sel == 2'b10)
            sout_t = p2 ;
        else
            sout_t = p3 ;
    end
    assign sout = sout_t ;
 
endmodule

Le code du banc de test est le suivant :

Exemple

`timescale 1ns/1ns

module test ;
    reg [1:0]    sel ;
    wire [1:0]   sout ;

    initial begin
        sel       = 0 ;
        #10 sel   = 3 ;
        #10 sel   = 1 ;
        #10 sel   = 0 ;
        #10 sel   = 2 ;
    end

    mux4to1 u_mux4to1 (
        .sel    (sel),
        .p0     (2'b00),        //path0 est affecté à 0
        .p1     (2'b01),        //path1 est affecté à 1
        .p2     (2'b10),        //path2 est affecté à 2
        .p3     (2'b11),        //path3 est affecté à 3
        .sout   (sout));

   //terminer la simulation
    always begin
        #100;
        if ($time >= 1000) $finish ;
    end

 
endmodule

Les résultats de la simulation sont les suivants.

On peut voir sur la figure que le signal de sortie correspond aux états du signal de sélection et du signal d’entrée.

Dans l'exemple, chaque condition if n'exécute qu'une seule instruction, donc les mots-clés begin et end ne sont pas utilisés. Cependant, dans une forme if-if-else, même s'il n'y a qu'une seule instruction d'exécution, le fait de ne pas utiliser begin et end peut créer une ambiguïté.

Par exemple, dans le code suivant, bien que la mise en forme permette de le distinguer, on ne sait pas à quelle condition if le else correspond.

Exemple

if(en)
    if(sel == 2'b1)
        sout = p1s ;
    else
        sout = p0 ;

Bien sûr, les compilateurs suivent généralement le principe de la correspondance la plus proche, faisant correspondre else au if le plus proche (le deuxième if dans l'exemple).

Mais de toute évidence, ce style d'écriture n'est pas standard et n'est pas sûr.

Par conséquent, c'est une bonne habitude d'ajouter les mots-clés begin et end dans les instructions conditionnelles.

Par exemple, si le code ci-dessus est légèrement modifié, l'écriture ne présentera plus d'ambiguïté.

Exemple

if(en) begin
    if(sel == 2'b1) begin
        sout = p1s ;
    end
    else begin
        sout = p0 ;
    end
end

Téléchargement du code source

Téléchargement