# Логические типы данных (logic и bit)

Как и `reg`, `logic` хранит значения, находящиеся в одном из 4 состояний. Главным отличием его от регистра является то, что управлять значениями можно как в процедурных блоках, так и через непрерывное присваивание как у проводов. Для `logic` может быть только 1 исходный сигнал (для проводов их может быть несколько).

*Пример*

{% code overflow="wrap" lineNumbers="true" %}

```verilog
module logic_tb;
    logic[3:0] data;
    logic x;
    assign x = data[0]; 
    initial begin
        $display("data=0x%0h x=%0b", data, x);     
        data = 4'hB; $display("data=0x%0h x=%0b", data, x);
        #1; $display("data=0x%0h x=%0b", data, x);
    end                                
endmodule
```

{% endcode %}

*Результат исполнения*

{% code overflow="wrap" lineNumbers="true" %}

```log
data=0xx x=x
data=0xb x=x
data=0xb x=1
```

{% endcode %}

Значения типа `bit` могут находиться в одном из двух состояний: логический 0 или 1. При приведении `logic` (или `reg`) в `bit` значения z и x конвертируются в 0.

*Пример*

{% code overflow="wrap" lineNumbers="true" %}

```verilog
module bit_tb;
  bit var_a;       
  bit [3:0] var_b;    
  logic [3:0] x_val;     

  initial begin
    $display("var_a=%0b var_b=0x%0h", var_a, var_b);
    var_a = 1;  var_b = 4'hF;
    $display("var_a=%0b var_b=0x%0h", var_a, var_b);
    var_b = 16'h481a;
    $display("var_b=0x%0h", var_b);
    $display("var_b = %b", var_b);
  end
endmodule
```

{% endcode %}

*Результат исполнения*

{% code overflow="wrap" lineNumbers="true" %}

```log
var_a=0 var_b=0x0
var_a=1 var_b=0xf
var_b=0xa
var_b = 1010
```

{% endcode %}
