# Data type
###### tags: `Digital IC Design`
[回到主頁面](https://hackmd.io/@derek8955/BkK2Nb5Jo/https%3A%2F%2Fhackmd.io%2FdpcBlBL8TlShpQ-wSi9Quw)
verilog 中有四種的 logic value:
- 0: means low signal
- 1: means high signal
- X : unknown signal, means that we don’t know whether the signal is 0 or 1
- Z : high-impedance, the signal is neither 0 nor 1.
:::warning
:heavy_exclamation_mark: 要避免 X 跟 Z 的發生。
:::
在電路中主要是以下兩種 data type。
- Nets( wire ):
||
|:---:|
|Nets in circuit|
::: success
若在 design 中沒有給予數值,default 會是 Z(High impedance, 高阻抗)
:::
```verilog
module example( out, a, sel, b );
output out;
input a, b, sel;
wire out, a, b, sel; // net
wire a1, b1, sel_n; // net
not n1( sel_n, sel );
and and1( a1, a, sel_n );
and and2( b1, b, sel );
or or1( out, a1, b1 );
endmodule
```
- Registers( reg ):
在 verilog 中, reg 意思是在沒有更動的情況下,數值會一直hold住不變
> 不是我們所想的暫存器,別被搞混了,只是一個 data type 的定義
::: success
若在 design 中沒有給予數值,default 會是 X(Unknown)
:::
```verilog
// 四位元的移位暫存器
module example( clk, rst_n, data_in, Q1, Q2, Q3, Q4 );
input clk, data_in;
output reg Q1, Q2, Q3, Q4;
always@( posedge clk or negedge rst_n ) //code看不懂沒關係,後面再說
begin
if( !rst_n )
begin
Q1 <= 1'd0; // <位元長度> ’ <進制表示> <數值資料>
Q2 <= 1'd0;
Q3 <= 1'd0;
Q4 <= 1'd0;
end
else
begin
Q1 <= data_in;
Q2 <= Q1;
Q3 <= Q2;
Q4 <= Q3;
end
end
endmodule
```
### <font color = "blue">Appendix</font>
若想要宣告有號數的定義 :
```verilog
// 有號數
module SIGNED();
wire signed [2:0] a;
// 2:0 代表 2 到 0
// 訊號 a 的資料寬度是 3 bit
initial begin
// initial 是只電路啟動時就會馬上執行 begin end 中的內容,但因為這個語法不符
// 只用在 testbench 中
a = -1;
$display("%d",a);
// result: -1
end
endmodule
--------------------------------------------------------------------------
// 無號數
module UNSIGNED();
wire [2:0] a;
initial begin
a = -1;
$display("%d",a);
// result: 7
// 因為 a 這個 variable 看不懂負號,所以自動 apply 2補數的數值
// 3'b001 -> 2補數 -> 3'b111
end
endmodule
```