3 votes

Utilisation de "début/fin" dans les modules de conception

J'ai essayé de faire un compteur BCD sur EDA Playground en utilisant icarus verilog pour la simulation. Dans mon premier essai, j'ai codé le always sans utiliser le bloc begin y end mots-clés :

module bcdcounter(out, clock, reset);
  output [3:0] out;
  input clock, reset;

  reg [3:0] outstate= 4'd0;
  reg [1:0] state= 2'd0;

  always@(posedge reset)
    case(state)
      2'd0: state <=2'd1;
      2'd1: state <=2'd2;
      2'd2: state <=2'd0;
    endcase

  always@(posedge clock or state)
    if(!state) 
      outstate <= 4'd0;
  if(state == 2'd1) 
    if(outstate != 4'd9)
      outstate <= outstate +4'd1;
  else 
    outstate <= 4'd0;
  if(state == 2'd2) 
    outstate <= outstate;

  assign out = outstate;

endmodule

et la sortie suivante a été générée pendant que je vérifiais :

design.sv:21: syntax error
design.sv:21: error: Invalid module instantiation
design.sv:23: syntax error
design.sv:23: error: Invalid module instantiation
design.sv:25: syntax error
design.sv:25: error: Invalid module instantiation
Exit code expected: 0, received: 1

Mais, une fois que j'ai ajouté quelques begin y end mots-clés, il a fonctionné sans erreur :

module bcdcounter(out, clock, reset);
  output [3:0] out;
  input clock, reset;

  reg [3:0] outstate= 4'd0;
  reg [1:0] state= 2'd0;

  always@(posedge reset)
    case(state)
      2'd0: state <=2'd1;
      2'd1: state <=2'd2;
      2'd2: state <=2'd0;
    endcase

  always@(posedge clock or state)
    begin
      if(!state)
        outstate <=4'd0;
      if(state==2'd1)
        begin
          if(outstate!=4'd9)
            outstate<= outstate+4'd1;
          else outstate<= 4'd0;
        end
      if(state==2'd2)
        outstate<=outstate;
    end

  assign out = outstate;

endmodule

Quand devons-nous utiliser le begin y end des mots-clés dans les modules de conception ? Toute aide serait appréciée.

0voto

toolic Points 23449

begin/end Les mots-clés sont obligatoires lorsque vous avez multiple dans le cadre d'une always bloc.

Dans votre 1er always vous n'avez pas besoin de début/fin puisque le bloc case est considérée comme une déclaration unique.

Cependant, dans votre 2ème always vous avez 3 blocs de niveau supérieur if ce qui signifie que vous devez les regrouper dans les instructions begin/end. Voici le code avec des espaces différents pour montrer clairement les instructions séparées :

always@(posedge clock or state) begin

    // Statement 1
    if(!state) outstate <= 4'd0;

    // Statement 2
    if(state == 2'd1) 
        if(outstate != 4'd9)
            outstate <= outstate +4'd1;
        else 
            outstate <= 4'd0;

    // Statement 3
    if(state == 2'd2) outstate <= outstate;

end  

Comme ce code se compile sans erreur de syntaxe, il démontre plusieurs choses :

  1. Les mots-clés de début et de fin indiqués sont obligatoires
  2. Aucun autre mot clé de début/fin n'est nécessaire

Toutefois, les autres mots-clés de début/fin sont facultatifs. Vous pouvez décider de les utiliser dans chaque if déclaration. Voici une autre façon d'écrire le code :

always@(posedge clock or state) begin

    if (!state) begin 
        outstate <= 4'd0;
    end

    if (state == 2'd1) begin
        if (outstate != 4'd9) begin
            outstate <= outstate +4'd1;
        end else begin
            outstate <= 4'd0;
        end
    end

    if (state == 2'd2) begin
        outstate <= outstate;
    end

end  

Les mêmes règles s'appliquent pour initial y final blocs procéduraux, tout comme ils le font pour always blocs.

-1voto

Pradyuman Bissa Points 89

Vous devez begin end lorsque vous avez plusieurs déclarations dans un bloc particulier. Exemple

//Single line statement hence no begin end needed
always@(posedge clk)
  a <= b &c;

 //Multiple lines hence begin end is needed
always@(posedge clk)
begin
 if(reset)
  a <= 'd0;
 else 
  a <= b & c;
end

Il en va de même pour if else y case déclarations, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X