System Verilog隨筆(1)
測試文件該怎麼寫?
首先看一個簡單程式碼案例:
`timescale 1ns/10ps //1
module test; //2
intput wire[15:0] a;
output reg[15:0] b;
reg clock;
chip chip(.clock(.clock)); //3
always #5 clock=~clock; //4
initial begin //5
clock=0;
repeat(5) @(nagedge clock);
$display("chip.i = %0d",chip.i);
end
endmodule
1、`timescale 1ns/1ns行
編譯指令`timescale包括:時間單位(1ns)和時間精度(10ps),單位表示模擬時間的最小值,精度表示保留到小數點後幾位(10ps是後兩位)。`timescale的作用範圍並不限於指定得模組或文件,再遇到`timescale後,指定的時間單位和精度一直保持到遇到下一條`timescale語句。
System Verilog還可以給時間指定時間單位,可以用下方語句實現:
forever #5ns clock=~clock;
//其中時間值和時間單位之間不能有空格,# 5ns正確,# 5 ns則錯誤。
在System Verilog中,也允許使用關鍵字timeunit和timeprecision進一步增強時間單位說明,在使用時要注意必須在其他任何聲明或語句之前,緊隨模組、介面或程式的聲明之後,例子如下:
module adder_tb;
input wire[63:0] a,b;
output reg[63:0] sum;
output reg carry;
timeunit 1ns; //單位1ns
timeprecision 10ps; //精度10ps
...
endmodule
當然,timeunit和timeprecision也可以在編譯單元域中使用,使用時要先於其他任何聲明,這裡就不舉例了。
2、module行
module就是一個模組,由描述埠和描述邏輯功能兩部分組成。其中描述埠有輸出口output,輸入口input,輸入/輸出口inout三種。測試文件中的module作用是相當於頂層文件或對頂層文件添加激勵,在module的埠聲明中還要包括clock。寫法可以如上方2處所示。其中,test是模組的名稱,intput為輸入埠,output為輸出埠,clock為時鐘。這裡我再對數據的類型簡單做一個總結吧。
2.1值的類型
包括:0,1,x,z
2.2線網(net)
包括:wire,wor,wand,tri,triand,trior,trireg等。其中wire最常用,wire和tri在語法和功能上相同,但wire只有一個驅動源,tri可以有多個。trireg用來為能夠儲存值的電容線性網建立模型,tri0和tri1用來為電源建立模型。
2.3暫存器(var)
包括:reg,integer,time,real等。其中reg最常用,為通用型,默認值x,無符號。integer為整型,用來儲存整數,默認位寬為宿主機字的位數。real為實型,存儲實數。time為時間暫存器,用來存放模擬時間。
2.4參數
包括:parameter,localparam,defparam。parameter在模組內定義為常數,不能像變數那樣賦值,但可在編譯階段被重載。defparam可以改變parameter的參數值。localparam為局部參數,不能被重載也不能通過defparam改變參數值。
其他的如字元串、數組等這裡就不介紹了。
3、函數調用和連線
將需要測試的模組導入測試文件,然後進行連線。
4、always語句
always塊中,從0時刻開始順序執行其中的行為語句,當最後一條執行完畢後再次執行第一條語句。通常用來產生時間脈衝。
5、initial塊
initial語句內的語句構成了一個initial塊,initial塊從模擬0時刻開始執行,在整個模擬過程中只執行一次。若測試文件中包括多個initial塊,則這些initial塊從模擬0時刻開始並發執行,且每個快都各自獨立。
clock需要在initial塊中初始化。

