ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SystemVerilog] 절차적 할당 2
    개발/SystemVerilog 2022. 1. 11. 23:35

    https://www.sutherland-hdl.com/papers/2005-SNUG-paper_SystemVerilog_unique_and_priority.pdf 참조

     

    priority case, unique case 구문이 추가되었다.

    그냥 case 구문을 사용하면 순차적으로 평가하여 제일 먼저 match되는 case item 문장이 실행된다.

    case (sel)
        0 :			a = 0;
        0, 1, 2 :		a = 1;
        3 :			a = 2;
        4 :			a = 3;
    endcase

    만약 sel = 0 이라면 처음 item 실행된다. 즉, 우선순위 인코더로 작동한다.

    case item이 서로 중복되는것이 없다면, parallel 인코더로 작동할 것이다.

     

     

     

    priority case는 full case와 같다.

    priority case (sel)
        0 : 	op = a;
        1, 2 : 	op = b;
        3 :		op = c;
    endcase

    이름 그대로 우선순위를 갖으며, case item은 중복 될 수 있다.

    다만 case 변수에 대하여 가능한 모든 경우가 기술되어야 한다. 그렇지 않으면 경고가 뜬다.

     

     

    unique case

    unique case (sel)
        0 :		op = a;
        1 :		op = b;
        2 :		op = c;
        3 :		op = d;
    endcase

    unique case도 마찬가지로 모든 경우가 기술되어야 한다.

    그리고 모든 case item이 서로 중복이 없어야 한다. 

    unique case 의 item들은 순차가 아니라 동시에 문장이 평가되고 실행 된다.

     

    priority, unique 는 casex, casez에도 적용 가능하다. 

     

     

    if 구문에도 unique, priority 키워드를 쓸 수 있다.

    case 구문과 기능은 같다.

     

     

     

    조건문 iif 는 if and only if 의 약자이다.

    조건이 참일 경우에만 실행이 된다.

    always @(posedge clk iff (en == 1), negedge resetn) begin
        if (~resetn)
        	out <= 0;
        else
    	out <= d;
    end
    
    // 동일한 코드
    always @(posedge clk, negedge resetn) begin
        if (~resetn)
        	out <= 0;
        else if (en)
        	out <= 0;
    end

     

     

     

    always 블록은 시스템베릴로그에서 3가지로 세분화 된다. (always_comb , always_latch, always_ff)

    기존의 베릴로그는 always 블록 하나로 combinational, latch, flipflop 회로를 기술하였다.

    코딩 스타일에 따라서 combinational 로직이 latch로 합성될 가능성이 있다.

     

    시스템베릴로그에서는 용도를 명확히 나눠서 잘못된 로직으로 합성되는 것을 방지할 수 있다.

     

    always_comb : 

    always_comb begin
        if (sel)
        	op = a;
        else
        	op = b
    end

    combinational 로직을 기술하기 위한 블럭이다.

    베릴로그에서는 always @(*) 으로 combinational 로직을 기술했다. always_comb와 차이점은 다음과 같다.

    always_comb 블럭에서는 이벤트, 타이밍 요소는 들어갈 수 없다.

    다른 블럭에서 assign된 변수를 always_comb 내부에서 assign 할 수 없다. (?)

    always_comb 문장들은 전부 계산 완료된 뒤에 이벤트를 기다린다. (시뮬레이터의 time region 관련)

     

     

    always_latch :

    always_latch begin
    	if (enable)
        	out <= a;
    end

    latch를 생성하기 위한 구문이다.

    always_comb 처럼 내부에 이벤트, 타이밍 요소를 갖을 수 없다.

    그리고 다른 곳에서 assign된 변수를 블럭 내부에서 assign 할 수 없다.

     

     

    always_ff :

    always_ff @(posedge clk, negedge rstn) begin
       if (~rstn)
       		op <= 1'b0;
       else
       		op <= a;
    end

    flipflop 레지스터를 기술하는 구문

     

    '개발 > SystemVerilog' 카테고리의 다른 글

    [SystemVerilog] 데이터 타입 3 enum  (0) 2022.01.15
    [SystemVerilog] 연산자  (0) 2022.01.13
    [SystemVerilog] 절차적 할당 1  (0) 2022.01.11
    [SystemVerilog] 데이터 타입 2  (0) 2022.01.10
    [SystemVerilog] 데이터 타입 1  (0) 2022.01.10
Designed by Tistory.