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

Конкатенация 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

  1. Учебник Verilog
  2. Верилог Задания
  3. Блокировка и неблокировка Verilog
  4. Верилог-функции
  5. Верилог Задача
  6. Генератор часов Verilog
  7. Математические функции Verilog
  8. Формат времени Verilog
  9. Охват шкалы времени Verilog
  10. Операции ввода-вывода файлов Verilog