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塊中初始化。

Tags: