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 Simulationsprotokollxcelium> 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.
Simulationsprotokollxcelium> 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.
SimulationsprotokollTop 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