UVM & RTL/Verilog HDL

[Verilog HDL] CH7 조건문, 다중분기

Return 2022. 6. 14. 14:52

조건문 

조건문은 특정 조건에 따라서 결정하기 위해 이 조건은 문장을 수행할지 말지를 결정하는데 사용된다. 

// 형식 1 
if(!lock) buffer = data;

// 형식 2 
if(number_queued < MAX_Q_DEPTH) begin 
    data_queue = data;
    number_queued = number_queued + 1;
end
else 
    $display("Queue Full. Try again");

// 형식 3 
// ALU 제어 신호에 따라 문장을 수행한다. 
if(alu_control == 0)
    y = x + z;
else if(alu_control == 1)
    y = x - z;
else
    $display("Invalid ALU control signal");

다중 분기 

위의 조건문의 형식 3에서 여러 문장들 중 하나를 선택하게 된다. 만약 너무 많은 선택조건이 있으면 if-else if-else구문을 다루기 불편하게 된다. case문을 사용해 간단하게 같은 결과를 얻을 수 있다.

case 문 

case, endcase, default키워드가 사용된다. 

reg [1:0] alu_control;
...
...
case(alu_control)
    2'd0 : y = x+z;
    2'd1 : y = x-z;
    2'd2 : y = x*z;
    default : $display("Inavlid ALU control signal");
endcase

case문장은 또한 n:1 MUX로 동작한다. 이것을 이해하기 위해 4:1 MUX 모델을 case문장을 써서 나타내어 보자. 

module mux4to1(
    output out;
    input i0, i1, i2, i3;
    input s1, s0;
    reg out;
)
always @(*) begin
    case({s1,s0})
        2'd0 : out = i0;
        2'd1 : out = i1;
        2'd2 : out = i2;
        2'd3 : out = i3;
        default : $display("Inavalid control singals");
    endcase
    end
endmodule

case문에서 x와 z 

case문장은 수식의 0,1,x,z값과 비교를 하고 비트가 일치하는 것을 선택한다. 만약 수식과 선택의 비트 폭이 일치하지 않으면, 수식과 선택된 것의 폭 중 더 큰 비트 폭에 맞춰 나머지를 0으로 채운다.

casex, casez 키워드 

case문에는 두가지 변형이있는데 그것들은 키워드 casex와 casez로 나뉜다. 이들을 사용하면 case수식과 선택에서 x와 z비트가 아닌 부분만을 비교할 수 있다. 

 

reg [3:0] encoding;
integer state;

casex(encoding)
    4'b1xxx : next_state = 3;
    4'b1xxx : next_state = 2;
    4'b1xxx : next_state = 1;
    4'b1xxx : next_state = 0;
    default : next_state = 0;
endcase