Altifigence Academy

19 / 37 · 개념

parameter·localparam·$clog2와 경계 설정

실행 중 입력과 정적 설정을 분리하고 N=1 및 비2의 거듭제곱 카운터의 폭과 종료 동작을 설계합니다.

매개변수는 회로를 elaboration할 때 정합니다

포트는 회로 실행 중 바뀔 수 있는 입력입니다. parameter는 시뮬레이션이나 합성에서 구조를 만들기 전에 인스턴스를 설정합니다. localparam은 호출자가 바꾸지 않는 파생 상수에 이름을 붙입니다. 어느 것도 매 사이클 바꾸는 소프트웨어 변수가 아닙니다.

modulo-N 카운터의 유효 상태는 0~N−1입니다. 저장 폭은 이 상태들을 표현해야 합니다. N≥2이면 $clog2(N)이 필요한 unsigned 폭을 줍니다. N=1에서는 $clog2(1)=0이므로 최소 1비트를 사용해야 합니다. N=0은 이 모듈의 계약 밖입니다.

활성 에지에서 완료 조건을 정합니다

이 모듈은 enable이 켜진 에지에서 기존 count가 N−1에서 0으로 순환할 때 등록된 pulse를 냅니다. enable=0인 에지는 count를 유지하고 pulse를 끕니다. reset은 둘을 지우며 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를 절단하여 계약을 위반합니다. 더 큰 값은 사용하지 않는 코드를 추가합니다. 이 구현은 >=로 종료를 비교하므로 활성 에지에서 그 상태들을 0으로 복구합니다.

CW'(N-1)은 상수 크기 변환입니다. 경계에서 폭을 명시하지만 잘못된 N이나 CW를 유효하게 만들지는 않습니다. elaboration 전에 설정을 검증하세요. 실행 중 assertion으로 잘못된 선언을 고칠 수는 없습니다.

설정 행렬을 검사합니다

N기본 CWreset 이후 활성 에지의 count해당 에지 이후 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을 방문하면 안 됩니다. 2의 거듭제곱 설정만 검사하면 명시적 순환 비교가 빠진 오류를 발견할 수 없습니다.

실습 · 동작 검사와 잘못된 설정 거부

N=1,2,5,8의 인스턴스를 각각 만드세요. 최소 두 주기를 실행하고 종료 count에서 enable=0인 에지를 삽입한 뒤 reset과 enable도 동시에 켭니다. 최종 상태만 보지 말고 모든 중간 count와 pulse를 검사합니다.

정수 참조 모델을 작성하세요. reset에서 count=0,pulse=0이고, 나머지 에지에서는 pulse=0으로 시작한 뒤 enable에서 modulo N 증가와 순환 여부를 계산합니다. DUT의 CW나 인코딩된 상태에 의존하지 않아야 합니다. N=0과 너무 작은 CW를 설정 검증기가 거부하는지도 검사합니다.

매개변수 모듈은 명세하고 검증한 범위에서 재사용할 수 있습니다. 기본 인스턴스 하나의 통과로 가능한 모든 폭과 최대값을 검증했다고 할 수 없습니다.

선택은 이 브라우저에만 적용됩니다. 언제든 푸터에서 변경할 수 있습니다.