Altifigence Academy

19 / 37 · Теория

parameter, localparam,$clog2 и граничные конфигурации

Разделите входы выполнения и настройку, проектируя ширину и завершение для N=1 и не степеней двойки.

Параметры фиксируются при elaboration

Порт меняется во время работы; parameter настраивает до построения; localparam именует производную константу, не переопределяемую экземпляром. Это не переменные каждого цикла. Счётчик по модулю N использует 0..N−1. Для N≥2 ширина $clog2(N); при N=1 получается ноль, поэтому выделите хотя бы бит. N=0 вне контракта.

Завершение на разрешённом фронте

Переход старого count с N−1 на ноль регистрирует pulse. Запрещённый фронт удерживает count и очищает pulse. Синхронный сброс очищает оба и важнее enable. N — положительное целое в поддерживаемом диапазоне.

SystemVerilog
module modulo_tick #(
  parameter integer N = 5,
  parameter integer CW = (N <= 1) ? 1 : $clog2(N)
) (
  input  logic          clk, rst, enable,
  output logic [CW-1:0] count,
  output logic          pulse
);
  localparam logic [CW-1:0] LAST = CW'(N-1);
  always_ff @(posedge clk) begin
    if (rst) begin
      count <= '0;
      pulse <= 1'b0;
    end else begin
      pulse <= 1'b0;
      if (enable) begin
        if (count >= LAST) begin
          count <= '0;
          pulse <= 1'b1;
        end else count <= count + 1'b1;
      end
    end
  end
endmodule

CW входит в порты и открыт для настройки. Оставьте стандарт либо ≥max(1,$clog2(N)). Меньший размер обрезает LAST; больший создаёт неиспользуемые коды, возвращаемые к нулю условием >= на разрешённом фронте. CW'(N-1) задаёт размер, но не исправляет неверные параметры. Проверяйте до elaboration: динамическое утверждение не исправляет ошибочную декларацию.

Матрица конфигураций

NСтандарт CWcount после разрешённых фронтов от сбросаpulse после
110,0,01,1,1
211,0,10,1,0
531,2,3,4,00,0,0,0,1
831,2,3,4,5,6,7,00,0,0,0,0,0,0,1

Бит хранения не делает два состояния допустимыми для N=1. N=5 обычно не посещает 5,6,7. Проверка только степеней двойки скрывает отсутствие явного сравнения для возврата.

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

Создайте N=1,2,5,8, проверьте хотя бы два периода, приостановите у последнего значения и сбросьте одновременно с enable. Сравните каждый count/pulse. Целочисленный эталон очищается по сбросу, обнуляет pulse и при enable повышает счёт по модулю N с обнаружением возврата, без CW или внутренних состояний. Проверьте отклонение N=0 и недостаточного CW. Повторное использование подтверждено для заявленного и проверенного диапазона, а не одного успешного стандарта.

Выбор действует в этом браузере. Его можно изменить внизу страницы.