#7. 연속할당문(assign문)/절차형할당문

Verilog/Verilog HDL강의정리(KOCW) 2023. 7. 20. 00:19
반응형

1. 할당문
할당문에는 두가지 방법이 존재한다. 하나는 연속할당문, 나머지 한가지는 절차형 할당문이라고 한다.
하나씩 알아보도록 하자


1-1. 연속할당문(Concurrent assignment)
net형(wire) 객체에 값을 할당하는 방식으로, assign문을 활용한다. 할당 구문을 살펴보면

assign [delay] net_assignments;

[delay] : 앞서 봤듯이 #3 ,#5 이렇게 ns 단위로 delay를 설정할 수 있다.(생략가능)
연속할당문의 경우 우변의 값의 변화가 발생했을 때, 좌변의 객체에 값의 할당이 일어난다, 단순한 논리 표현으로 구성되는 조합회로 모델링에 사용하게 된다. 예시를 보면

wire mynet; //wire 선언

assign mynet = enable & data; //my net에 enable & data를 할당 
                              //즉, input이 enable, data 이고, output이 mynet인 and 게이트가 형성된다.

위 예시를 살펴보면 좀 더 이해가 갈 것이다.
앞서 배운 gate primitive로 생성도 가능하다.
연속할당문을 활용하여 한가지 예시를 더 살펴보도록 하겠다.

module adder (sum_out, carry_out, carry_in, ina, inb);
    input [3:0] ina, inb; //4bit input 과 1비트 carry 선언
    input       carry_in;
    output [3:0] sum_out; //4bit ouput 과 1비트 carry 선언
    output       carry_out; 

    assign {carry_out, sum_out} = ina + inb + carry_in;// assign 문을 활용하여, 5비트의 출력을 할당 
endmodule

위 코드는 4비트 가산기를 작성한 것이다. ina, inb 가 각각 4비트로 입력되며, carry in 을 통해 입력 총합이 sum out과 carry out의 합산으로 출력이 발생하게 된다.(assign 옆의 중괄호 결합 연산자에 유의하자)
추가적으로 delay 에 관해 이야기 하자면, 만약 assign #10 a= b&c 라는 구문이 있다고 하자.
그렇다면 b&c가 연산된 이후 10ns 이후에 a에 값이 할당된다는 것을 의미한다. 이 역시 시뮬레이션 상에서만 반영되고, 합성시에 회로에 반영되는 것은 아니다.
또한, assign 문의 경우 순서에 회로가 상관없이 동일하게 그려진다.(하드웨어적인특성)
 


1-2. 절차형할당문(Procedural Assignment)
variable 형 객체(reg, integer, real, realtime등)에 값을 할당하는 방식으로, always, initial, task, function 내부에서 사용하는 할당문이다.
assign문과 달리 순서가 바뀌면 회로가 바뀔 수 있으며, 문장이 실행이 되어야 좌변에 값이 할당되게 된다.(소프트웨어적인 특성) 예시를 하나 살펴보자.

module proc_assignment(clk, a, b, out);
    input clk, a, b;// input, output reg 선언
    output out;
    reg    out, c; //always 안에서 쓰이므로 reg 선언
    
    always@(posedge clk) begin
        c=a&b; //blocking assignment
        out<=c; //non-blocking assignment
                //순서가 중요하다, C에 먼저 a&b가 할당되고, 이후 다음문장인
                //out에 C가 할당된다.
        
    end
endmodule

여기서는 blocking과 non-blocking 할당문으로 나뉘게 되는데, blocking의 경우 = 을, non- blocking의 경우 =>를 활용하여 값을 할당하게 된다. 
always 구문에서는 현재 clk가 상승엣지 일때(0->1) 아래 문장들을 실행하게 되는데, 현재 상황에서는 상승엣지가 발생했을 경우, c=a&b가 할당되고, 할당된 c 값이 out에 바로 할당되게 된다.
만약 이 두 문자의 순서를 바꿔 out <=c 가 먼저 실행된다고 생각해보자, 그렇다면 상승엣지가 발생했을 때, out에 c가 넘어가지만, 이 c는 앞선 상승엣지에서 c=a&b에 의해 할당된 c값이 out에 할당되는 것이다.
앞의 상황과는 달리, 이전상황이 c값이 회로에 반영된다는 것이다. 이를 회로로 나타내면
================추후 클럭그림과 회로 그림삽입예정=====================


1-3. 절차형 연속 할당문(Procedural Continuous Assignment)
예외적인 케이스로 볼 수 있으며, assign-deassign문, force-relase문이 존재한다.
이번 글에서는 조합회로를 구성하는 연속할당문 위주로 설명한 것으로, 절차형 할당문에 대해서는 추후 행위수준모델링 글에서 좀 더 자세히 다루도록 하겠다.
 
 

반응형