1.模塊的端口定義
module 模塊名(口1,口2,口3,口4, ………);
2.(數據類型及其常量、變量)
數字
整數: <位寬><進制><數字>這是一種全面的描述方式。
1) 二進制整數(b或B)
2) 十進制整數(d或D)
3) 十六進制整數(h或H)
4) 八進制整數(o或O)
x和z值 :在數字電路中,x代表不定值,z代表高阻值
負數: 一個數字可以被定義爲負數,只需在位寬表達式前加一個減號,
-8'd5 //這個表達式代表5的補數(用八位二進制數表示)
8'd-5 //非法格式
參數(Parameter)型: parameter 參數名1=表達式,參數名2=表達式, …,參數名n=表達式;在Verilog HDL中用parameter來定義常量,即用parameter來定義一個標識符代表一個常量,稱爲符號常量,即標識符形式的常量,採用標識符代表一個常量可提高程序的可讀性和可維護性。
3.變量:
wire型:
wire型數據常用來表示用於以assign關鍵字指定的組合邏輯信號。Verilog程序模塊中輸入輸出信號類型缺省時自動定義爲wire型。wire型信號可以用作任何方程式的輸入,也可以用作“assign”語句或實例元件的輸出。
wire [n-1:0] 數據名1,數據名2,…數據名i; //共有i條總線,每條總線內有n條線路.或wire [n:1] 數據名1,數據名2,…數據名i;
reg型:
寄存器是數據儲存單元的抽象。寄存器數據類型的關鍵字是reg.通過賦值語句可以改變寄存器儲存de值,其作用與改變觸發器儲存的值相當. 在“always”塊內被賦值的每一個信號都必須定義成reg型.
reg [n-1:0] 數據名1,數據名2,… 數據名i;或reg [n:1] 數據名1,數據名2,… 數據名i;
memory型:
在Verilog語言中沒有多維數組存在。 memory型數據是通過擴展reg型數據的地址範圍來生成的.
reg [7:0] mema[255:0];這個例子定義了一個名爲mema的存儲器,該存儲器有256個8位的存儲器。該存儲器的地址範圍是0到255.
4.運算符及表達式:
1) 算術運算符(+,-,×,/,%)
2) 賦值運算符(=,<=)
3) 關係運算符(>,<,>=,<=)
4) 邏輯運算符(&&,||,!)
5) 條件運算符(?:)
6) 位運算符(~,|,^,&,^~)
7) 移位運算符(<<,>>)
8) 拼接運算符({ })
9) 其它
說明:
1) ~ //取反
2) & //按位與
3) | //按位或
4) ^ //按位異或
5) ^~ //按位同或(異或非)
1) == (等於)
2) != (不等於)
3) === (等於)
4) !== (不等於)
"==="和"!=="運算符不同,它在對操作數進行比較時對某些位的不定值x和高阻值z也進行比較,兩個操作數必需完全一致,其結果纔是1,否則爲0
位拼接運算符(Concatation),用這個運算符可以把兩個或多個信號的某些位拼接起來進行運算操作.{信號1的某幾位,信號2的某幾位,..,..,信號n的某幾位}
{a,b[3:0],w,3’b101}={a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}
縮減運算 是對單個操作數進行或與非遞推運算,最後的運算結果是一位
的二進制數C = &B;相當於:C =( (B[0]&B[1]) & B[2] ) & B[3];
5.關鍵詞:
always, and, assign,begin,buf,bufif0,bufif1,case,casex,casez,cmos,deassign,
default,defparam,disable,edge,else,end,endcase,endmodule,endfunction,endprimitive,endspecify, endtable, endtask, event, for, force, forever, fork, function,highz0,highz1, if,initial, inout, input,integer,join,large,macromodule,medium,module,nand,negedge,nmos,nor,not,notif0,notifl, or, output, parameter, pmos, posedge,primitive, pull0, pull1, pullup, pulldown, rcmos, reg, releses, repeat, mmos, rpmos,rtran, rtranif0,rtranif1,scalared,small,specify,specparam,strength,strong0, strong1,supply0, supply1, table, task, time, tran, tranif0, tranif1, tri, tri0, tri1, triand,trior,trireg,vectored,wait,wand,weak0,weak1,while, wire,wor, xnor, xor
6.賦值語句和塊語句
非阻塞(Non_Blocking)賦值方式( 如 b <= a; ) 塊結束後才完成賦值操作。2) b的值並不是立刻就改變的。
阻塞(Blocking)賦值方式( 如 b = a; ) 賦值語句執行完後,塊才結束。2) b的值在賦值語句執行完後立刻就改變的
7.塊語句:
塊語句通常用來將兩條或多條語句組合在一起,使其在格式上看更象一條語句
順序塊 塊內的語句是按順序執行的
begin
語句1;
語句2;
......
語句n;
End
並行塊 塊內語句是同時執行的 塊內每條語句的延遲時間是相對於程序流程控制進入到塊內時的仿真時間的。
fork
語句1;
語句2;
.......
語句n;
join
8.條件語句
if_else
case
9.循環語句
forever : 連續的執行語句 …forever begin 多條語句 end
repeat : 連續執行一條語句 n 次…. repeat(表達式) begin 多條語句 end
while : while(表達式) begin 多條語句 end
for : for(表達式1;表達式2;表達式3) 語句
10,結構說明語句
Initial : initial語句在仿真開始時對各變量進行初始化, 另一用途,用initial語句來生成激勵波形作爲電路的測試仿真信號。
Always : 語句在仿真過程中是不斷重複執行的
Task : 任務的定義.
Function : 函數的目的是返回一個用於表達式的值。
11.系統調用函數:
$display和$write:任務這兩個函數和系統任務的作用是用來輸出信息,即將參數p2到pn按參數p1給定的格式輸出。
$monitor:當啓動一個帶有一個或多個參數的$monitor任務時,仿真器則建立一個處理機制,使得每當參數列表中變量或表達式的值發生變化時,整個參數列表中變量或表達式的值都將輸出顯示。
$time和$realtime:用這兩個時間系統函數可以得到當前的仿真時刻
$finish:作用是退出仿真器,返回主操作系統,也就是結束仿真過程
$stop: 任務的作用是把EDA工具(例如仿真器)置成暫停模式
$readmemb和$readmemh : 用來從文件中讀取數據到存貯器中
12.編譯預處理:
`define: 宏定義,用一個指定的標識符(即名字)來代表一個字符串
`include : 文件包含”處理,所謂“文件包含”處理是一個源文件可以將另外一個源文件的全部內容包含進來,即將另外的文件包含到本文件之中
`timescale : 時間尺度命令用來說明跟在該命令後的模塊的時間單位和時間精度
`ifdef、`else、`endif : 條件編譯命令,有時希望對其中的一部分內容只有在滿足條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是“條件編譯”。