本文為 Verilog 學習總結,講解 Verilog 文法的基本概念。
Verilog 子產品的基本概念
首先來看一個二選一 MUX 程式,支援了邏輯行為的描述:
module muxtow(out, a, b, sl);
input a,b,sl;
output out;
reg out;
always@(sl or a or b) // 隻要sl或a或b一個變化,就執行下面的語句
if(!sl) out = a;
else out =b;
endmodule
帶有與非門的二選一 MUX 程式(邏輯表達式):
module muxtwo(out, a, b, sl);
input a,b,sl;
output out;
wire nsl,sela,selb; // 定義内部連接配接線
assign nsl=~sl;
assign sela=a&nsl; // 按位與運算
assign selb=b&sl;
assign out=sela|selb;
endmodule
另一種寫法(支援基于邏輯單元互聯結構的描述):
module muxtwo(out, a, b, sl);
input a,b,sl;
output out;
not ul(nsl,sl);
and #1 u2(sela,a,nsl); // #1表示延時一個機關時間
and #1 u3(selb,b,sl);
or #1 u4(out,sela,selb);
endmodule
如果程式符合一些基本規則,計算機可以将程式從第一種寫法通過第二種寫法的中間形式自動轉換為第三種寫法的子產品,稱為綜合。
通過連續指派語句描述 3 位加法器的程式:
module adder(count,sum,a,b,cin);
input[2:0]a,b;
input cin;
output count;
assign {count,sum}=a+b+cin; // 計算和及向上進位
endmodule
采用兩個子產品的三态門選擇器程式:
module trist1(sout,sin,ena); // 上層子產品
output sout;
input sin,ena;
// 引用由mytri子產品定義的執行個體元件tri_inst
// .表示被引用子產品的端口,()表示本子產品中與之連線的線路
mytri tri_inst(.out(sout),.in(sin),.enable(ena));
endmodule
module mytri(out,in,enable); // 子子產品
output out;
input in,enable;
assign out=enable?in:'bz;
endmodule
除了
endmodule
語句外,每個語句和資料定義的最後必須有分号。
Verilog 用于子產品的測試
verilog 可以用來描述變化的測試信号,測試平台可以對電路子產品進行動态的全面測試,進而對系統進行驗證。
對本文前 3 個二選一 MUX 測試程式為:
include"muxtwo.v"
module t;
reg ain,bin,select;
reg clock;
wire outw;
initial // 把寄存器變量初始化為确定量
begin
ain=0;
bin=0;
select=0;
clock=0;
end
alway #50 clock=~clock; // 産生周期為100個機關的時鐘信号
always @(posedge clock)
begin
// 産生随機的位信号流ain和bin
#1 ain={$random}%2; // {$ random}為系統任務,産生一個随機數
#3 bin={$random}%2;
end
always #10000 select=!select; // 産生周期為10000時間機關的選通信号變化
muxtwo m(.out(outw),.a(ain),.b(bin),.sl(select));
endmodule
測試在功能級上進行,稱為前(RTL)仿真,如果門級結構與具體工藝技術對應起來,稱為後仿真。可運作仿真器觀察輸入/輸出波形圖來驗證正确性。