# 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 ): |![](https://i.imgur.com/M5lqZWU.png)| |:---:| |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 ```