# 型別介紹 [TOC] ## 更新進程 <font color=green>3/21 新增 reg 比較。</font> ## 前言 就像多數程式語言都需要宣告(定義)變數,Verilog 也是一樣的。其中包括最常使用到的`wire`跟`reg`,以及其他的像是`常數`、`陣列`等。 以下將帶大家了解這些型別如何宣告與使用,並介紹在 Verilog 當中`數字的表示`方式。 ## wire **<font color=#bf2222>語法:</font>** ```verilog= wire W; assign W = A & B; ``` * 沒有記憶性 * 預設值為`z`(高阻抗) * `wire`通常用 assign 的方式給值 * input port 跟 output port 預設的型別就是`wire` ## reg **<font color=#bf2222>語法:</font>** ```verilog= reg R; always@(*)begin R = A & B; end ``` * 具有記憶性 * 預設值為`x`(未知值) * `reg`型別的變數只能在 always block 當中給值 **<font color=#bf2222>比較:</font>** **【COMP1】** `reg`型別的變數,可以作為類似`wire`型別的功能使用。就以下面的語法範例作舉例,兩者輸出結果會是相同的(W = R,無論 A、B 如何變化)。 ```verilog= module COMP1(A, B, W, R); input A, B; output W; output reg R; assign W = A & B; always@(*)begin R = A & B; end endmodule ``` **【COMP2】** `reg`顧名思義是有記憶性的變數型別,可用於 sequential circuit,使用語法會像下方的範例所示(範例是實作一個簡單的counter)。 ```verilog= module COMP2(Clk, Reset, Out); input Clk, Reset; output Out; reg count, next_count; always@(posedge Clk)begin if(Reset == 1'b1)begin count <= 1'b0; end else begin count <= next_count; end end always@(*)begin next_count = count + 1'b1; end assign Out = count; endmodule ``` ## 常數 **<font color=#bf2222>語法:</font>** ```verilog= parameter P = 10'd1000; ``` * 顧名思義,相對於變數,`常數`是不能更改的數 ## 陣列 **<font color=#bf2222>語法:</font>** ```verilog= reg [9:0] R [9:0]; ``` * `陣列`通常用於合成記憶體(可以先忽略,暫時不會用到它) ## 數字的表示 在 Verilog 中,`數字的表示`有特定的模式,這點很好理解,原因在於如果我們打上`10`,電腦並不知道這是要表示二進位的`2`,或是我們日常所習慣十進位的`10`。因此,我們在表示數字時不只是要定義`值`,也要定義`表示法`跟`bit數`。 **<font color=#bf2222>語法:</font>** ```verilog= // 以下A都表示十進位的31 A = 5'b11111; A = 5'd31; A = 5'o37; A = 5'h1f; ``` * 開頭的`5`表示這個數值所需要的`bit數`(如果是十進位的`32`就無法以`5-bit`表示) * 後面加上`分號`以及該`表示法`的代表字元 * `表示法`:(b->binary)、(d->decimal)、(o->octal)、(h->hexadecimal) * 最後根據該`表示法`填入`值` **<font color=#bf2222>補充:</font>** ```verilog= //以下A表示前4 bit是x,後1 bit是1 A = 5'bxxxx1; //以下A表示前4 bit是z,後1 bit是1 A = 5'bzzzz1; ``` * 也能加入`x`(未知值)跟`z`(高抗阻)來表示 # [HOMEPAGE](https://hackmd.io/s/HJdaLPTQV)