SystemVerilog語言簡介(一)
1. 接口(Interface)
Verilog模塊之間的連接是通過模塊端口進行的。為了給組成設計的各個模塊定義端口,我們必須對期望的硬件設計有一個詳細的認識。不幸的是,在設計的早期,我們很難把握設計的細節。而且,一旦模塊的端口定義完成後,我們也很難改變端口的配置。另外,一個設計中的許多模塊往往具有相同的端口定義,在Verilog中,我們必須在每個模塊中進行相同的定義,這為我們增加了無謂的工作量。
SystemVerilog提供了一個新的、高層抽象的模塊連接,這個連接被稱為接口(Interface)。接口在關鍵字interface和endinterface之間定義,它獨立於模塊。接口在模塊中就像一個單一的端口一樣使用。在最簡單的形式下,一個接口可以認為是一組線網。例如,可以將PCI總線的所有信號綁定在一起組成一個接口。通過使用接口,我們在進行一個設計的時候可以不需要首先建立各個模塊間的互連。隨著設計的深入,各個設計細節也會變得越來越清晰,而接口內的信號也會很容易地表示出來。當接口發生變化時,這些變化也會在使用該接口的所有模塊中反映出來,而無需更改每一個模塊。下麵是一個接口的使用實例:
chip_bus; // 定義接口
wire read_request, read_grant;
wire [7:0] address, data;
endinterface: chip_bus
module RAM (chip_bus io, // 使用接口
input clk);
// 可以使用io.read_request引用接口中的一個信號
endmodule
module CPU(chip_bus io, input clk);
...
endmodule
module top;
reg clk = 0;
chip_bus a; // 實例接口
// 將接口連接到模塊實例
RAM mem(a, clk);
CPU cpu(a, clk);
endmodule
實際上,SystemVerilog的接口不僅僅可以表示信號的綁定和互連。由於SystemVerilog的接口中可以包含參數、常量、變量、結構、函數、任務、initial塊、always塊以及連續賦值語句,所以SystemVerilog的接口還可以包含內建的協議檢查以及被使用該接口的模塊所共用的功能。
2. 全局聲明和語句
在Verilog中,除了一個模塊可以作為模塊實例引用其他模塊外,並不存在一個全局空間。另外,Verilog允許任意數目的頂層模塊,因此會產生毫無關聯的層次樹。
SystemVeriog增加了一個被稱為$root的隱含的頂級層次。任何在模塊邊界之外的聲明和語句都存在於$root空間中。所有的模塊,無論它處於哪一個設計層次,都可以引用$root中聲明的名字。這樣,如果某些變量、函數或其它信息被設計中的所有模塊共享,那麼我們就可以將它們作為全局聲明和語句。全局聲明和語句的一個使用實例如下:
error _flag; // 全局變量
function compare (...); // 全局函數
always @(error_flag) // 全局語句
...
module test;
chip1 u1 (...)
endmodule
module chip1 (...);
FSM u2 (...);
always @(data)
error_flag = compare(data, expected);
endmodule
module FSM (...);
...
always @(state)
error_flag = compare(state, expected);
endmodule
時間單位和精度
在Verilog中,表示時間的值使用一個數來表示,而不帶有任何時間單位。例如:
forever #5clock = ~clock;
從這一句中我們無法判斷5代表的是5ns? 5ps? 還是其他。Verilog的時間單位和精度是作為每一個模塊的屬性,並使用編譯器指令`timescale來設置。使用這種方法具有固有的缺陷,因為編譯器指令的執行依賴於源代碼的編譯順序,編譯器總是將它遇到的最後一個`timescale設置的時間單位和精度作為之後的標準。那麼,假如有些模塊之前沒有使用`timescale設置時間單位和精度,這就有可能出現同一個源代碼的不同仿真會出現不同結果的情況。
SystemVerilog為了控製時間單位加入了兩個重要的增強。首先,時間值可以顯式地指定一個單位。時間單位可以是s、ms、ns、ps或fs。時間單位作為時間值的後綴出現。例如:
forever #5nsclock = ~clock;
其次,SystemVerilog允許使用新的關鍵字(timeunits和timeprecision)來指定時間單位和精度。這些聲明可以在任何模塊中指定,同時也可以在$root空間中全局指定。時間單位和精度必須是10的冪,範圍可以從s到fs。例如:
1ns;
最後更新:2017-04-03 14:53:40