오늘은 맑음

verilog 문법(2) ! 와 ~(산술 부정과 비트단위 부정) 본문

Digital logic

verilog 문법(2) ! 와 ~(산술 부정과 비트단위 부정)

자전거 타는 구구 2021. 4. 18. 17:03
반응형

rtl 설계시 !와 ~를 자주 사용합니다.

 

코드를 예시로 들면 아래와 같습니다.

 

wire [3:0] a;

reg [3:0] r_out;

 

always @(posedge CLK, negedge nRST) begin

    if(!nRST) begin

        r_out <= 'd0;

    end else begin

        r_out <= ~a;

    end

end

 

 nRST이 low일 때 r_out이 0으로 초기화 되고 nRST이 high로 변경되면서 r_out에는 비트 부정 연산자(~)가 쓰인 a가 r_out에 할당됩니다.

 이 때 nRST이 low(0)일 때 !를 붙여 high로 만들어 r_out을 초기화 했는데요, !와 ~의 차이는 무엇일까요

 

 !는 논리 부정을 의미하며 ~는 비트단위 부정을 의미합니다.

 즉 !는 뒤에 따라오는 식을 판단해서 True와 False만을 반환합니다.

 하지만 ~는 비트단위 부정이므로 뒤에 붙는 값의 모든 bit를 부정합니다. 즉 모든 비트를 low -> high로, high -> low로 변경시킵니다.

 

 간단한 시뮬레이션을 통해 값을 확인해보겠습니다.

 

 

 

 처음 4-bit의 a는 0으로 초기화 되어있습니다. 

 이 때 !a를 할당받은 exclamation은 True를 가집니다.

 하지만 ~a를 할당받은 tilda 0000의 비트 부정인 1111를 갖게 됩니다.

 이 후 a에 1을 할당 했을 때 exclamation은 False를 갖게 되고 tilda는 1의 비트단위 부정인 e를 갖게 됩니다.

 

 저는 누군가 차이점을 물어봤을 때 멈칫했던 적이 있습니다.

 항상 기계적으로 사용했지만, 한 번에 대답을 못 한 경험을 반성하며 마무리 하겠습니다.

 

반응형
Comments