Конкатенация Verilog
Многобитовые проводники Verilog и переменные могут быть объединены вместе, чтобы сформировать более крупный мультисетевой проводник или переменную, используя конкатенацию. операторы {
и }
разделенных запятыми. Конкатенация также позволяет использовать выражения и размерные константы в качестве операндов в дополнение к проводникам и переменным.
Размер каждого операнда должен быть известен, чтобы вычислить полный размер конкатенации.
Пример объединения 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]};
Вот пример рабочего дизайна конкатенации входных данных для формирования различных выходных данных. Составные выражения можно просто отображать или назначать любой связи или переменной, не обязательно выходам.
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
Обратите внимание, что out2[2:1] всегда является константой 2'b01.
Журнал моделирования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
Оператор репликации
Когда одно и то же выражение должно повторяться несколько раз, константа репликации используется, которое должно быть неотрицательным числом и не может быть X, Z или любой другой переменной. Это постоянное число также заключено в фигурные скобки вместе с исходным оператором конкатенации и указывает общее количество повторений выражения.
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
Выражения репликации не могут появляться слева от любого назначения и не могут быть связаны с output
или inout
порты.
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
Обратите внимание, что a повторяется дважды, а b — трижды.
Журнал моделированияxcelium> run a=10 b=100 res=1010100100100 xmsim: *W,RNQUIE: Simulation is complete.
Операнды будут оцениваться только один раз при выполнении выражения репликации, даже если константа равна нулю.
Вложенная репликация
Выражение репликации разрешено использовать внутри регулярных выражений конкатенации. Взяв приведенный выше пример за основу, a и b были включены в общее составное выражение.
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
Журнал моделирования xcelium> run a=10 b=100 res=101000001010100100100 xmsim: *W,RNQUIE: Simulation is complete.
Незаконное использование
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
Это приводит к ошибке компиляции, как показано ниже.
Журнал моделирования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