我們所寫得東西叫做Verilog,因為沒有實體的板子,所以我們都是用電腦來做出模擬 我們把基礎分成幾個部分來理解 * ==Verilog的架構== module 模組名稱(輸入輸出埠清單); 輸入輸出埠的宣告 -> input, output, inout 變數資料型態宣告 -> wire, reg, … 引用較低階的模組 邏輯閘階層之描述 資料流階層之描述 function 或 task 的宣告 行為階層之描述區塊 endmodule 基礎的Verilog語法語C語言相似 * ==Verilog語法== 常見關鍵字 ![](https://hackmd.io/_uploads/B1460InOh.png) (資料來源:網路) * ==命名規則== 第一個字元必須是英文字母 第二個之後的字元可以是英文字母、數字、底線、或是$ * ==基本資料型態== wire:代表一條接線 wand:Wired-AND wor:Wired-OR reg:暫存器 主要功能為用於維持電路中的某個值(always中) integer, real, …:用於計算的過程 <font color="#f00">**wire 的特性**</font> 連接硬體元件之連接線 變數必須被驅動,才能改變它的內容 除非被宣告為一向量,否則wire 型態的變數內定為一個位元的值,且其內定值為Z <font color="#f00">**reg 的特性**</font> 功能和一般程式語言中的變數類似,可以直接給定一個數值 除非被宣告為一向量,否則reg 型態的變數內定為 <font color="#f00">**使用 wire 或 reg 的時機**</font> 使用wire所宣告的變數必須配合assign敘述來改變其值,且不能在always區塊中作為敘述的左值(Lvalue) 使用reg所宣告的變數必須使用在always區塊中作為敘述的左值 * ==輸入輸出埠== 在Verilog 在Verilog Verilog 中,所有輸入輸出埠 所有輸入輸出埠(input、output、inout)的內定資料型態為wire 若需將訊號的值存起來,則必須將其資料型態宣告為reg 由於輸出入埠(inout)可用於與其他模組進行連接,因此可以將其視為在模組內外相互連接的兩個部分 * ==資料流模型的敘述== 在此模型中,常用的敘述:assign :assign 驅動某個值到wire、wand、wor 或tri 用於描述組合邏輯電路 必須避免使用迴路式的寫法:assign a = b + a; (我們用的是這個) 可用預算子與邏輯設計相同(需要時再查詢即可) * ==行為模型的敘述== 只需考慮電路模組的功能,而不需考慮其硬體的 ,而不需考慮其硬體的詳細內容 以事件為基礎的時序控制 事件: 接線或暫存器的值被改變 模組的輸入埠接收到新的值 可電路合成的控制方式:正緣、負緣、訊號值改變