Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Verilog

Concaténation Verilog

Les fils et les variables Verilog multi-bits peuvent être regroupés pour former un fil ou une variable multi-réseau plus grand en utilisant la concaténation opérateurs { et } séparé par des virgules. La concaténation est également autorisée à avoir des expressions et des constantes dimensionnées comme opérandes en plus des fils de liaison et des variables.

La taille de chaque opérande doit être connue afin de calculer la taille complète de la concaténation.

Exemple de concaténation Verilog

  
  
	wire 		a, b; 		// 1-bit wire
	wire [1:0]  res; 		// 2-bit wire to store a and b
	
	// res[1] follows a, and res[0] follows b
	assign res = {a, b}; 	
	
	
	wire [2:0]  c;
	wire [7:0] 	res1;
	
	// res[0]   follows c[2]
	// res[2:1] is always 0
	// res[4:3] follows c[1:0]
	// res[5]   follows a
	// res[6]   follows b
	assign res1 = {b, a, c[1:0], 2'b00, c[2]};

  

Voici un exemple de conception fonctionnel de concaténation d'entrées pour former différentes sorties. Les expressions concaténées peuvent être simplement affichées ou affectées à n'importe quel fil ou variable, pas nécessairement des sorties.

  
  
module des (input [1:0] 	a,
            input [2:0] 	b,
            output [4:0]	out1,
            output [3:0] 	out2            
           );
  
  assign out1 = {a, b};
  assign out2 = {a[1], 2'b01, b[2]};
  
endmodule  

module tb;
  reg [1:0] a;
  reg [2:0] b;
  wire [4:0] out1;
  wire [3:0] out2;
  
  des u0 (a, b, out1, out2);
  
  initial begin
    a <= 0;
    b <= 0;
    
    $monitor("[%0t] a=%b b=%b, out1=%b out2=%b", $time, a, b, out1, out2);
    
    #10 a <= 3;
    #5  b <= 5;
    #10 a <= 2;
    #5  b <= 1;
    
    #10 $finish;
  end
endmodule

  

Notez que out2[2:1] est toujours une constante 2'b01.

Journal de simulation
xcelium> run
[0] a=00 b=000, out1=00000 out2=0010
[10] a=11 b=000, out1=11000 out2=1010
[15] a=11 b=101, out1=11101 out2=1011
[25] a=10 b=101, out1=10101 out2=1011
[30] a=10 b=001, out1=10001 out2=1010
Simulation complete via $finish(1) at time 40 NS + 0

Opérateur de réplication

Lorsque la même expression doit être répétée plusieurs fois, une constante de réplication est utilisé qui doit être un nombre non négatif et ne peut pas être X, Z ou toute autre variable. Ce nombre constant est également entouré d'accolades avec l'opérateur de concaténation d'origine et indique le nombre total de fois que l'expression sera répétée.

  
  
	wire a;
	wire [6:0] res;
	
	assign res = {7{a}};
	
	{2'bz{2'b0}}         // Illegal to have Z as replication constant
	{2'bx{2'b0}}         // Illegal to have X as replication constant

  

Les expressions de réplication ne peuvent pas apparaître sur le côté gauche d'une affectation et ne peuvent pas être connectées à output ou inout ports.

  
  
module des;
  reg [1:0] a;
  reg [2:0] b;
  
  initial begin
    a <= 2;
    b <= 4;
    
    #10;
    $display("a=%b b=%b res=%b", a, b, {{2{a}}, {3{b}}});
  end
  
endmodule

  

Notez que a a été répété deux fois et b a été répété trois fois.

Journal de simulation
xcelium> run
a=10 b=100 res=1010100100100
xmsim: *W,RNQUIE: Simulation is complete.

Les opérandes ne seront évalués qu'une seule fois lorsque l'expression de réplication est exécutée même si la constante est nulle.

Réplication imbriquée

Une expression de réplication peut être utilisée dans des expressions de concaténation régulières. En prenant l'exemple ci-dessus comme base, a et b ont été inclus dans l'expression concaténée totale.

  
  
module des;
  reg [1:0] a;
  reg [2:0] b;
  
  initial begin
    a <= 2;
    b <= 4;
    
    #10;
    $display("a=%b b=%b res=%b", a, b, {a, b, 3'b000, {{2{a}}, {3{b}}}});
  end
  
endmodule

  
Journal de simulation
xcelium> run
a=10 b=100 res=101000001010100100100
xmsim: *W,RNQUIE: Simulation is complete.

Utilisation illégale

  
  
  module des;
    reg [1:0] a;
    reg [2:0] b;
    reg [3:0] _var;

    initial begin
      a <= 2;
      b <= 4;
      _var <= 3;

      // This is illegal because variables cannot be used
      // as replication constant
      $display("a=%b b=%b res=%b", a, b, {_var{a}});
    end
  endmodule

  

Cela entraîne une erreur de compilation comme indiqué ci-dessous.

Journal de simulation
	Top level design units:
		des
      $display("a=%b b=%b res=%b", a, b, {_var{a}});
                                             |
xmelab: *E,NOTPAR (./testbench.sv,12|45): Illegal operand for constant expression [4(IEEE)].


Verilog

  1. Tutoriel Verilog
  2. Affectations Verilog
  3. Verilog bloquant et non bloquant
  4. Fonctions Verilog
  5. Tâche Verilog
  6. Générateur d'horloge Verilog
  7. Fonctions mathématiques Verilog
  8. Format d'heure Verilog
  9. Portée de l'échelle de temps Verilog