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

Параметры Verilog

Параметры — это конструкции Verilog, которые позволяют повторно использовать модуль с другой спецификацией. Например, 4-битный сумматор может быть параметризован для приема значения количества битов, а новые значения параметров могут быть переданы во время создания экземпляра модуля. Таким образом, N-битный сумматор может стать 4-битным, 8-битным или 16-битным сумматором. Они похожи на аргументы функции, которые передаются во время вызова функции.

  
  
	parameter MSB = 7;                  // MSB is a parameter with a constant value 7
	parameter REAL = 4.5;               // REAL holds a real number
	
	parameter FIFO_DEPTH = 256, 
	          MAX_WIDTH = 32;           // Declares two parameters
	          
	parameter [7:0] f_const = 2'b3;     // 2 bit value is converted to 8 bits; 8'b3

  

Параметры в основном являются константами, и, следовательно, изменение их значения во время выполнения является незаконным. Недопустимо переопределять имя, которое уже используется сетью, переменной или другим параметром.

Существует два основных типа параметров:модуль и указать и оба принимают спецификацию диапазона. Но обычно они делаются настолько широкими, насколько этого требует сохраняемое значение, и, следовательно, спецификация диапазона не требуется.

Параметры модуля

Параметры модуля можно использовать для переопределения определений параметров внутри модуля, что позволяет модулю иметь другой набор параметров во время компиляции. Параметр можно изменить с помощью defparam оператор или в операторе экземпляра модуля. Общепринятой практикой является использование заглавных букв в именах параметров, чтобы сделать их сразу заметными.

Модуль, показанный ниже, использует параметры для указания ширины шины, ширины данных и глубины FIFO в проекте и может быть переопределен новыми значениями при создании экземпляра модуля или с помощью defparam заявления.

  
  
	// Verilog 1995 style port declaration
	module design_ip  ( addr,  
	                    wdata,
	                    write,
	                    sel,
	                    rdata);
	                    
	     parameter  BUS_WIDTH    = 32, 
	                DATA_WIDTH   = 64,
	                FIFO_DEPTH   = 512;
	                
	     input addr;
	     input wdata;
	     input write;
	     input sel;
	     output rdata;
	     
	     wire [BUS_WIDTH-1:0] addr;
	     wire [DATA_WIDTH-1:0] wdata;
	     reg  [DATA_WIDTH-1:0] rdata;
	     
	     reg [7:0] fifo [FIFO_DEPTH];
	                
	     // Design code goes here ...
	endmodule

  

В новом объявлении порта Verilog в стиле ANSI вы можете объявлять параметры, как показано ниже.

  
  
module design_ip 
	#(parameter BUS_WIDTH=32, 
		parameter DATA_WIDTH=64) (	
		
		input [BUS_WIDTH-1:0] addr,
   	// Other port declarations
   );

  

Переопределение параметров

Параметры могут быть заменены новыми значениями во время создания модуля. Первая часть создает экземпляр модуля с именем design_ip по имени d0, где новые параметры передаются в пределах #( ). . Во второй части используется конструкция Verilog с именем defparam. для установки новых значений параметров. Первый метод является наиболее часто используемым способом передачи новых параметров в проектах RTL. Второй метод обычно используется при моделировании тестовых стендов для быстрого обновления параметров проекта без повторного создания модуля.

  
  
module tb;
	
	  // Module instantiation override
		design_ip  #(BUS_WIDTH = 64, DATA_WIDTH = 128) d0 ( [port list]);
		
		// Use of defparam to override
		defparam d0.FIFO_DEPTH = 128;
		
endmodule

  

Пример

Счетчик модуля имеет два параметра N и DOWN, объявленные со значениями по умолчанию 2 и 0 соответственно. N управляет количеством битов на выходе, эффективно управляя шириной счетчика. По умолчанию это 2-битный счетчик. Параметр DOWN определяет, должен ли счетчик увеличиваться или уменьшаться. По умолчанию счетчик будет уменьшаться, так как параметр установлен на 0.

2-битный обратный счетчик

  
  
module counter
  #( 	parameter N = 2,
   		parameter DOWN = 0)
   		
  ( input 							clk,
    input 							rstn,
    input 							en,
   	output 	reg [N-1:0] out);
  
  always @ (posedge clk) begin
    if (!rstn) begin
      out <= 0;
    end else begin
      if (en)
        if (DOWN)
          out <= out - 1;
        else
          	out <= out + 1;
      else
         out <= out;     
    end
  end
endmodule

  

Счетчик модуля создается с N равным 2, хотя это и не требуется, поскольку значение по умолчанию в любом случае равно 2. DOWN не передается во время создания экземпляра модуля и, следовательно, принимает значение по умолчанию, равное 0, что делает его счетчиком вверх.

  
  
module design_top (    input clk,
                input rstn,
                input en,
                output [1:0] out);

    counter #(.N(2)) u0 (	.clk(clk),
                          .rstn(rstn),
                          .en(en));
endmodule

  

Обратите внимание, что параметры по умолчанию используются для реализации счетчика, где N равно двум, что делает его 2-битным счетчиком, а значение DOWN равно нулю, что делает его счетчиком вверх. Выход из счетчика остается неподключенным на верхнем уровне.

4-битный обратный счетчик

В этом случае счетчик модуля создается с N равным 4, что делает его 4-битным счетчиком. DOWN передается значение 1 во время создания экземпляра модуля, и, следовательно, реализован обратный счетчик.

  
  
module design_top (    input clk,
                input rstn,
                input en,
                output [3:0] out);

    counter #(.N(4), .DOWN(1)) 
    		u1 (	.clk(clk),
              .rstn(rstn),
              .en(en));
endmodule

  

Указать параметры

Они в основном используются для предоставления значений времени и задержки и объявляются с помощью specparam ключевое слово. Его можно использовать как в пределах указать блок и тело основного модуля.

  
  
	// Use of specify block
	specify
		specparam  t_rise = 200, t_fall = 150;
		specparam  clk_to_q = 70, d_to_q = 100;
	endspecify
	
	// Within main module
	module  my_block ( ... );
	 	specparam  dhold = 2.0;
	 	specparam  ddly  = 1.5;
	 	
	 	parameter  WIDTH = 32;
	endmodule

  

Разница между параметрами спецификации и модуля

Указать параметр Параметр модуля
Объявлено specparam Объявлено parameter
Может быть объявлен внутри specify блок или внутри основного модуля Может быть объявлен только в основном модуле
Могут быть назначены спецификации и параметры Не могут быть назначены specparams
SDF можно использовать для переопределения значений Значения параметров объявления экземпляра или defparam можно использовать для переопределения

Verilog

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