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

Мастерство параметров в Verilog: создание повторно используемых масштабируемых модулей

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

parameter MSB = 7;
parameter REAL = 4.5;
parameter FIFO_DEPTH = 256, MAX_WIDTH = 32;
parameter [7:0] f_const = 2'b3; // 2-битное значение расширяется до 8 бит: 8'b3

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

Два основных типа параметров: module и specify — оба принимают спецификацию диапазона, но обычно делают их настолько широкими, насколько требуется для хранимого значения, поэтому диапазон часто не нужен.

Параметры модуля (Module parameters)

Позволяют переопределять определения параметров внутри модуля, так что модуль получает другой набор параметров на этапе компиляции. Параметр можно изменить с помощью 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 ...
endmodule

В новом ANSI стиле объявления портов параметры объявляют так:

module design_ip #(parameter BUS_WIDTH=32, parameter DATA_WIDTH=64) (
  input [BUS_WIDTH-1:0] addr,
  // Другие объявления портов
);

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

Параметры можно переопределить новыми значениями при инстанцировании модуля. Первый способ — передача новых параметров в #( ) при инстанцировании. Второй — использование defparam. Первый способ — самый распространенный в RTL. Второй — часто в тестбенчах для быстрого изменения параметров без переинстанцирования.

module tb;
  // Переопределение при инстанцировании
  design_ip #(BUS_WIDTH = 64, DATA_WIDTH = 128) d0 ( [port list] );
  // defparam
  defparam d0.FIFO_DEPTH = 128;
endmodule

Пример: параметризованный счетчик

Модуль counter имеет параметры N (ширина) и DOWN (направление), по умолчанию 2 и 0. N управляет шириной выхода. DOWN — инкремент (0) или декремент (1).

2-битный up-счетчик

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) out <= 0;
  else begin
    if (en)
      if (DOWN) out <= out - 1;
      else out <= out + 1;
    else out <= out;
  end
end
endmodule

Инстанцирование с N=2 (по умолчанию) и без DOWN (по умолчанию 0) — up-счетчик.

module design_top (
  input clk, input rstn, input en,
  output [1:0] out
);
  counter #(.N(2)) u0 ( .clk(clk), .rstn(rstn), .en(en) );
endmodule

Схема показывает 2-битный up-счетчик. Выход счетчика не подключен на верхнем уровне.

4-битный down-счетчик

Здесь N=4 (4 бита), DOWN=1 — down-счетчик.

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

Параметры specify (Specify parameters)

Используются для задания временных задержек и декларируются ключевым словом specparam. Допускаются внутри блока specify и в теле модуля.

// specify блок
specify
  specparam t_rise = 200, t_fall = 150;
  specparam clk_to_q = 70, d_to_q = 100;
endspecify

// В теле модуля
module my_block ( ... );
  specparam dhold = 2.0;
  specparam ddly = 1.5;
  parameter WIDTH = 32;
endmodule

Различия между specify и module параметрами

Specify параметрModule параметр
Объявляется specparamОбъявляется parameter
Может быть внутри specify блока или в теле модуляТолько в теле модуля
Может назначаться specparams и parametersНе может назначаться specparams
SDF может переопределять значенияПереопределение через параметры инстанцирования или defparam

Verilog

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