Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Verilog

Освоение конкатенации в Verilog: практическое руководство

Многобитные провода и переменные Verilog можно объединять в более крупные многобитные сети или переменные с помощью операторов конкатенации { и }, разделённых запятыми. Конкатенация допускает выражения и размерные константы как операнды дополнительно к проводам и переменным.

Размер каждого операнда должен быть известен для расчёта полного размера конкатенации.

Пример конкатенации

wire a, b;           // 1-битные провода
wire [1:0] res;      // 2-битный провод для хранения a и b
// res[1] следует за a, res[0] — за b
assign res = {a, b};

wire [2:0] c;
wire [7:0] res1;
// res[0] следует за c[2]
// res[2:1] всегда 0
// res[4:3] следует за c[1:0]
// res[5] следует за a
// res[6] следует за 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.

Simulation Log показывает изменение выходов при изменении входов.

Оператор репликации (Replication Operator)

Когда одно выражение нужно повторить несколько раз, используется константа репликации — неотрицательное число, не X, Z или переменная. Эта константа также заключается в фигурные скобки вместе с оператором конкатенации и указывает общее число повторений выражения.

wire a; wire [6:0] res;
assign res = {7{a}};
{2'bz{2'b0}} // Недопустимо: Z как константа репликации
{2'bx{2'b0}} // Недопустимо: X как константа репликации

Выражения репликации не могут появляться слева от присваивания и не могут подключаться к 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 повторено 2 раза, b — 3 раза.

Simulation Log: a=10 b=100 res=1010100100100

Операнды вычисляются только один раз при выполнении выражения репликации, даже если константа ноль.

Вложенная репликация (Nested Replication)

Выражение репликации можно использовать внутри обычных конкатенаций. На базе предыдущего примера 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

Simulation Log: res=101000001010100100100

Недопустимое использование

module des; reg [1:0] a; reg [2:0] b; reg [3:0] _var;
initial begin a <= 2; b <= 4; _var <= 3;
    // Недопустимо: переменные нельзя использовать как константу репликации
    $display("a=%b b=%b res=%b", a, b, {_var{a}});
end endmodule

Результат — ошибка компиляции: Illegal operand for constant expression.

Verilog

  1. Освоение Verilog: полное руководство по проектированию цифровых схем
  2. Понимание назначений в Verilog: типы, синтаксис и лучшие практики
  3. Блокирующие и неблокирующие назначения в Verilog: ключевые различия
  4. Мастерство функций в Verilog для эффективного RTL дизайна
  5. Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
  6. Генератор тактового сигнала в Verilog: проектирование и реализация
  7. Мастерство математических функций Verilog для эффективного аппаратного дизайна
  8. Мастерство $timeformat в Verilog: точность и контроль отображения времени
  9. Понимание и печать timescale в Verilog в любой области видимости
  10. Работа с файлами в Verilog: открытие, чтение, запись и закрытие