SystemVerilog: Equality and Inequality Operators - IKSciting
1524
post-template-default,single,single-post,postid-1524,single-format-standard,bridge-core-2.8.7,qodef-qi--no-touch,qi-addons-for-elementor-1.7.1,qode-page-transition-enabled,ajax_fade,page_not_loaded,,qode-title-hidden,qode_grid_1300,footer_responsive_adv,qode-content-sidebar-responsive,qode-theme-ver-27.1,qode-theme-bridge,qode_header_in_grid,wpb-js-composer js-comp-ver-6.6.0,vc_responsive,elementor-default,elementor-kit-838

Equality and Inequality Operators

Verilog의 reg, SystemVerilog의 logic과 같은 data type은 4-state variable이므로 0, 1, x(unknown) 또는 z(high-impedance)의 값을 가질 수 있다. 따라서 적절한 equality operator를 통해 이러한 data type 간의 값을 비교해야 한다. Verilog에서는 logical equality operator와 case equality operator가 정의되어 있으며, 이는 당연히 SystemVerilog에서도 사용 가능하다. SystemVerilog에서는 wildcard equality operator도 새롭게 추가되었다.

Logical Equality Operator (==) and Inequality Operator (!=)

Logical equality operator는 아래에서 보는 것과 같이 단순히 0 또는 1 사이의 값을 비교할 때는 일치할 경우 1, 일치하지 않을 경우 0의 결과값을 갖는다. 하지만 비교 대상에 x 또는 z가 포함되면 x의 결과값을 갖는다. 즉, 가능한 결과값은 0, 1, x 세 가지다.

 ==| 0 1 x z      !=| 0 1 x z 
---+---------    ---+---------
 0 | 1 0 x x      0 | 0 1 x x 
 1 | 0 1 x x      1 | 1 0 x x 
 x | x x x x      x | x x x x 
 z | x x x x      z | x x x x
$display("%01b", 4'b1010 == 4'b1010); // 1
$display("%01b", 4'b1010 == 4'b1011); // 0
$display("%01b", 4'b1010 == 4'b10x0); // x - unknown/high-z in operands
$display("%01b", 4'b1010 == 4'b1z10); // x - unknown/high-z in operands
$display("%01b", 4'b10x0 == 4'b1010); // x - unknown/high-z in operands
$display("%01b", 4'b1z10 == 4'b1010); // x - unknown/high-z in operands

Case Equality Operator (===) and Inequality Operator (!==)

Case equality operator는 logical equality operator와 달리 비교 대상이 완전하게 일치할 경우에만 1의 결과값을 갖고 그렇지 않을 경우 0의 결과값을 갖는다. 즉, 가능한 결과값은 0, 1 두 가지다.

===| 0 1 x z     !==| 0 1 x z 
---+---------    ---+---------
 0 | 1 0 0 0      0 | 0 1 1 1 
 1 | 0 1 0 0      1 | 1 0 1 1 
 x | 0 0 1 0      x | 1 1 0 1 
 z | 0 0 0 1      z | 1 1 1 0
$display("%01b", 4'b1010 === 4'b1010); // 1 - matches exactly
$display("%01b", 4'b1010 === 4'b1011); // 0
$display("%01b", 4'b1010 === 4'b10x0); // 0
$display("%01b", 4'b1010 === 4'b1z10); // 0
$display("%01b", 4'b10x0 === 4'b1010); // 0
$display("%01b", 4'b1z10 === 4'b1010); // 0

Wildcard Equality Operator (==?) and Inequality Operator (!=?)

SystemVerilog에서 새롭게 추가된 equality operator는 Verilog의 equality operator와 달리 left operand와 right operand가 바뀌면 결과값이 다르게 출력될 수 있으므로 주의가 필요하다. Wildcard equality operator의 right operand가 x, z, ?와 같은 wildcard일 경우 결과값이 1로 나타난다. 따라서 일반적으로 right operand에 wildcard를 포함할 수 있다고 생각하면 되며, 만약 left operand에 wildcard가 포함되면 결과값은 x로 나타난다.

==?| 0 1 x z ?     !=?| 0 1 x z ? 
---+-----------    ---+-----------
 0 | 1 0 1 1 1      0 | 0 1 0 0 0
 1 | 0 1 1 1 1      1 | 1 0 0 0 0
 x | x x 1 1 1      x | x x 0 0 0 
 z | x x 1 1 1      z | x x 0 0 0 
 ? | x x 1 1 1      ? | x x 0 0 0
$display("%01b", 4'b1010 ==? 4'b1010); // 1
$display("%01b", 4'b1010 ==? 4'b1011); // 0
$display("%01b", 4'b1010 ==? 4'b10x0); // 1 - matches with wildcard
$display("%01b", 4'b1010 ==? 4'b1z10); // 1 - matches with wildcard
$display("%01b", 4'b1010 ==? 4'b?010); // 1 - matches with wildcard
$display("%01b", 4'b10x0 ==? 4'b1010); // x - not recommended
$display("%01b", 4'b1z10 ==? 4'b1010); // x - not recommended
$display("%01b", 4'b?010 ==? 4'b1010); // x - not recommended

Summary

지금까지 Verilog와 SystemVerilog에서 사용되는 equality/inequality operator의 종류에 대하여 간략하게 알아보았다. Equality operator 위주로 설명하였지만 각 operator의 의미를 이해하고 위 truth table을 참고하면 inequality operator도 어렵지 않을 것으로 생각된다. 무엇보다 상황에 맞게 필요한 operator를 사용하는 것이 중요하다.

// command (4-state)
// - 2'b00: activate
// - 2'b01: precharge
// - 2'b10: write
// - 2'b11: read
reg [1:0] cmd;

// address (2-state)
bit [7:0] addr;

// data (4-state)
logic [31:0] data;
    
if (cmd ==? 2'b1?) $display("command is 'write' or 'read'");
if (addr == 8'hff) $display("address is 8'hff");
if (data !== 32'h0123_4567) $display("data does not match 32'h0123_4567 or contains unknown/high-z");

References

No Comments

Post A Comment