산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> verilog

Verilog 할당문 이해: 유형, 문법, 모범 사례

넷(net)과 변수에 값을 할당하는 것을 '할당(assignment)'이라고 합니다. 기본적으로 세 가지 형태가 있습니다:

허용되는 LHS(왼쪽 항) 값

할당문은 오른쪽 항(RHS)과 왼쪽 항(LHS)으로 구성되며, 그 사이에는 등호(=) 또는 비차단 할당 연산자(<=)가 위치합니다.

할당 유형 왼쪽 항 (LHS)
절차적
  • 변수 (벡터/스칼라)
  • 벡터 reg, integer, time 변수의 비트 선택 또는 부분 선택
  • 메모리 워드
  • 위 항목들의 연결(concatenation)
연속
  • 넷 (벡터/스칼라)
  • 벡터 넷의 비트 선택 또는 부분 선택
  • 비트 선택과 부분 선택의 연결
절차적 연속
  • 넷 또는 변수 (벡터/스칼라)
  • 벡터 넷의 비트 선택 또는 부분 선택

RHS는 최종 값으로 평가되는 모든 표현식을 포함할 수 있으며, LHS는 RHS의 값이 할당될 넷 또는 변수를 나타냅니다.

module tb;
  reg clk;
  wire a, b, c, d, e, f;
  reg z, y;
  // clk이 LHS, ~clk이 RHS
  always #10 clk = ~clk;
  // y가 LHS, 상수 1이 RHS
  assign y = 1;
  // f가 LHS, a,b,d,e의 표현식이 RHS
  assign f = (a | b) ^ (d & e);
  always @ (posedge clk) begin
    // z가 LHS, a,b,c,d의 표현식이 RHS
    z <= a + b + c + d;
  end
  initial begin
    // 변수명이 LHS, 0이 RHS
    a <= 0; b <= 0; c <= 0; d <= 0; e <= 0; clk <= 0;
  end
endmodule

절차적 할당 (Procedural Assignment)

절차적 할당은 always, initial, task, function 같은 프로시저 내부에서 발생하며 변수에 값을 할당하는 데 사용됩니다. 해당 변수는 다음번 같은 변수에 대한 할당이 있을 때까지 값을 유지합니다.

시뮬레이션이 해당 문을 실행하는 시점에 값이 변수에 놓이게 됩니다. 이는 if-else, case 문, 반복문 같은 제어 흐름 문을 사용하여 원하는 대로 제어하고 수정할 수 있습니다.

reg [7:0] data;
integer count;
real period;
initial begin
  data = 8'h3e;
  period = 4.23;
  count = 0;
end
always @ (posedge clk)
  count++;

변수 선언 시 할당

변수 선언 시 초기값을 할당할 수 있습니다. 이 할당은 지속 기간이 없으며, 같은 변수에 다음 할당이 발생할 때까지 값을 유지합니다. 배열에 대한 변수 선언 할당은 허용되지 않습니다.

module my_block;
  reg [31:0] data = 32'hdead_cafe;
  initial begin
    #20 data = 32'h1234_5678;
    // data는 시간 0부터 20까지 dead_cafe 값을 가짐
    // 시간 20에 data는 12345678을 얻음
  end
endmodule
reg [3:0] a = 4'b4; // 다음과 동일
reg [3:0] a;
initial a = 4'b4;

변수가 선언 시 초기화되고 initial 블록에서 시간 0에 다시 초기화되면, 평가 순서가 보장되지 않아 8'h05 또는 8'hee 중 하나가 될 수 있습니다.

module my_block;
  reg [7:0] addr = 8'h05;
  initial addr = 8'hee;
endmodule
reg [3:0] array [3:0] = 0; // 불법
integer i = 0, j; // i, j 두 정수 선언, i에 0 할당
real r2 = 4.5, r3 = 8; // 두 실수 선언, 각각 4.5, 8 할당
time startTime = 40; // time 변수 선언, 초기값 40

절차적 블록과 할당에 대한 자세한 내용은 나중에 다룹니다.

연속 할당 (Continuous Assignment)

단계별 시뮬레이션 예제 보려면 여기를 클릭하세요!

이 방식은 스칼라 및 벡터 넷에 값을 할당하는 데 사용되며, RHS에 변경이 있을 때마다 실행됩니다. 게이트 간 연결을 명시하지 않고 조합 논리를 모델링할 수 있게 해주며, 논리 표현식으로 넷을 구동하기 쉽게 만듭니다.

// AND 게이트 모델 예제
wire a, b, c;
assign a = b & c;

b나 c의 값이 변경될 때마다 RHS의 전체 표현식이 평가되고 a가 새로운 값으로 업데이트됩니다.

넷 선언 시 할당

넷을 선언하는 같은 문장에서 연속 할당을 할 수 있습니다. 넷은 한 번만 선언할 수 있으므로, 넷당 하나의 선언 할당만 가능합니다.

wire penable = 1;

절차적 연속 할당 (Procedural Continuous Assignment)

이들은 표현식을 넷이나 변수에 지속적으로 할당할 수 있게 하는 절차적 문장이며, 두 가지 유형이 있습니다.

assign deassign

이 문은 변수에 대한 모든 절차적 할당을 무시(override)하며, deassign으로 같은 신호를 사용하여 비활성화합니다. 변수 값은 절차적 또는 절차적 연속 할당을 통해 새로운 값을 얻을 때까지 동일하게 유지됩니다. assign 문의 LHS는 비트 선택, 부분 선택, 배열 참조가 될 수 없지만 변수 또는 변수들의 연결이 될 수 있습니다.

reg q;
initial begin
  assign q = 0;
  #10 deassign q;
end

force release

이들은 assign - deassign 문과 유사하지만 넷과 변수 모두에 적용할 수 있습니다. LHS는 넷의 비트 선택, 넷의 부분 선택, 변수 또는 넷이 될 수 있지만 배열 참조와 변수의 비트/부분 선택은 될 수 없습니다. force 문은 변수에 대한 다른 모든 할당을 무시하며 release 키워드로 해제될 때까지 유지됩니다.

reg o, a, b;
initial begin
  force o = a & b;
  ...
  release o;
end

verilog

  1. 버릴로그(Verilog) 입문: 디지털 회로 설계를 위한 하드웨어 기술 언어
  2. Verilog 결합(Concatenation) & 복제(Replication) 연산자 실전 가이드
  3. Verilog 함수 마스터하기: 효율적인 RTL 설계를 위한 활용법
  4. Verilog 태스크 이해: 함수와의 차이점, 문법, 활용법
  5. Verilog 클럭 생성기: 설계 및 구현 가이드
  6. Verilog 수학 함수 마스터하기: 효율적인 하드웨어 설계를 위한 활용
  7. Verilog $timeformat 마스터하기: 정밀도 및 표시 제어
  8. 모든 범위에서 Verilog Timescale 이해 및 출력하기
  9. Verilog 파일 I/O 마스터하기: 열기, 읽기, 쓰기, 닫기
  10. Verilog 입문: Hello World 예제