Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Verilog

Verilog-Verkettung

Multi-Bit-Verilog-Wires und -Variablen können mithilfe von Verkettung zusammengelegt werden, um ein größeres Multi-Net-Wire oder eine Variable zu bilden Operatoren { und } durch Kommata abgetrennt. Die Verkettung darf neben Verbindungen und Variablen auch Ausdrücke und Größenkonstanten als Operanden haben.

Die Größe jedes Operanden muss bekannt sein, um die vollständige Größe der Verkettung zu berechnen.

Verilog-Verkettungsbeispiel

  
  
	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]};

  

Hier ist ein funktionierendes Designbeispiel für die Verkettung von Eingaben, um verschiedene Ausgaben zu bilden. Verkettete Ausdrücke können einfach angezeigt oder beliebigen Verbindungen oder Variablen zugewiesen werden, nicht unbedingt Ausgängen.

  
  
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

  

Beachten Sie, dass out2[2:1] immer eine Konstante 2'b01.

ist Simulationsprotokoll
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

Replikationsoperator

Wenn derselbe Ausdruck mehrmals wiederholt werden muss, eine Replikationskonstante verwendet, die eine nicht negative Zahl sein muss und nicht X, Z oder irgendeine Variable sein kann. Diese konstante Zahl ist zusammen mit dem ursprünglichen Verkettungsoperator ebenfalls in geschweiften Klammern eingeschlossen und gibt an, wie oft der Ausdruck insgesamt wiederholt wird.

  
  
	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

  

Replikationsausdrücke können nicht auf der linken Seite einer Zuweisung erscheinen und können nicht mit output verbunden werden oder inout Häfen.

  
  
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

  

Beachten Sie, dass a zweimal und b dreimal wiederholt wurde.

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

Operanden werden nur einmal ausgewertet, wenn der Replikationsausdruck ausgeführt wird, selbst wenn die Konstante Null ist.

Verschachtelte Replikation

Ein Replikationsausdruck darf innerhalb regulärer Verkettungsausdrücke verwendet werden. Nimmt man das obige Beispiel als Basis, wurden a und b in den gesamten verketteten Ausdruck aufgenommen.

  
  
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

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

Illegale Nutzung

  
  
  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

  

Dies führt zu einem Kompilierungsfehler wie unten gezeigt.

Simulationsprotokoll
	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. Verilog-Tutorial
  2. Verilog-Aufgaben
  3. Verilog-Blockierung und Nicht-Blockierung
  4. Verilog-Funktionen
  5. Verilog-Aufgabe
  6. Verilog-Taktgenerator
  7. Verilog Math-Funktionen
  8. Verilog-Zeitformat
  9. Verilog-Zeitskalenumfang
  10. Verilog-Datei-IO-Operationen