# 描述電路的三種層次
###### tags: `verilog` `digital design` `邏輯設計` `邏設`
[TOC]
## English Version
Check English tutorial [here](https://hackmd.io/@dppa1008/ryIHGbJv8)
## Structure Description ( Structural Modeling )
格式:
```
<gate> name ( output, intput1, input2,... );
```
- 又稱為 Gate Level ,
- 簡單來說,就是整個電路都用邏輯閘構成。
|閘名稱|圖示|範例|意義|
| --- | --- | --- | --- |
| NOT | ![](https://i.imgur.com/RvNNvA4.png =100x) | not not1( B, A ); | B = ~A |
| AND | ![](https://i.imgur.com/QJUx4hY.png =100x) | and and1( C, A, B ); | C = A & B |
| OR | ![](https://i.imgur.com/w3xrvzn.png =100x) | or or1( C, A, B ); | C = A \| B |
| XOR | ![](https://i.imgur.com/G4U22p6.png =100x) | xor xor1( C, A, B ); | C = A ^ B |
舉例:
<div style="text-align: center" >
<img src="https://i.imgur.com/Nkh9Ij7.png" height="400" width="500"/>
</div>
```verilog=
module comparator( A, B, gt, lt, eq );
input A, B;
output gt, lt, eq;
wire negA, negB;
not not1( negA, A );
not not2( negB, B );
and and1( gt, A, negB );
and and2( lt, negA, B );
xnor xnor1( eq, A, B );
endmodule
```
## Dataflow Description ( Dataflow Modeling )
格式:
```verilog=
wire A;
assign A = 1'b0;
//請注意!! assign statement 一定要搭配 wire 使用
```
* assign 也稱作 continuous assignment
* <font color=#bf2222>當右式有被改變的時候</font>,就會隨時更動左邊的值。
* `=` 左邊只能是 wire
* 輸出 <font color=#bf2222>“ 不 ” </font>可以包含輸入。例如: ```assign a = a + b;```
* <font color=#bf2222>一個參數只能被 assign 一次</font>。例如: ```assign a = b; assign a = c; //error```
* assign 的值也可以用大括弧來串聯 bit。
* ```assign a = { 1'b0, 1'b1 }; // a = 2'b01```
* ```assign a = { 2{2'b10} }; // a = 4'b1010```
```verilog=
module comparator( A, B, gt, lt, eq );
input A, B;
output gt, lt, eq;
assign gt = A & ~B;
assign lt = ~A & B;
assign eq = ~( A ^ B );
endmodule
```
其他更詳盡的語法說明,請參考 [Lexical Conventions](https://hackmd.io/s/r1v7PDeYl)。
## Behavior Description ( Behavior Modeling )
格式
```clike=
initial begin
...
end
```
```clike=
always @( sensitivity list ) begin
...
end
```
- Behavior 也稱作 procedural assignment,意思是會依照一些程序條件來觸發。
- 又稱作 block assignment
- 可分成兩種,initial block 和 always block。
1. <font color = #1644aa>initial block</font>:只會在程式一進來的時候執行一次,但是 initial block 是不能夠合成的,只能用在<font color=#bf2222>testbench</font>。
2. <font color = #1644aa>always block</font>:只要 sensitivity list 裡的 value 有改變,就會執行一次 always block 裡面的程式。
- 往往 sensitivity list 內的參數會過多,為避免少寫,通常會用 \* 代替。
* 等號左邊只能夠是 <font color = #bf2222>reg</font>。
```verilog=
module comparator( A, B, gt, lt, eq );
input A, B;
output gt, lt, eq;
always @(*) begin
gt = A & ~B;
lt = ~A & B;
eq = ~( A ^ B );
end
endmodule
```
在這個範例中,always block 裡面使用的是 blocking assignment,也就是在這個 block 內部會依序執行,之後在 sequential circuit 的時候會再詳細的介紹。
更多詳盡的說明,請同學 google 尋找,或上 「[Verilog HDL 教學講義](https://hom-wang.gitbooks.io/verilog-hdl/content/index.html)」。
# [:maple_leaf:Homepage:maple_leaf:](https://hackmd.io/s/ByZ-fyuHV)