1. 程式人生 > 其它 >蔣麗苑,Verilog 時延

蔣麗苑,Verilog 時延

技術標籤:verilog

關鍵詞:時延, 慣性時延
連續賦值延時語句中的延時,用於控制任意運算元發生變化到語句左端賦予新值之間的時間延時。

時延一般是不可綜合的。

暫存器的時延也是可以控制的,這部分在時序控制里加以說明。

連續賦值時延一般可分為普通賦值時延、隱式時延、宣告時延。

下面 3 個例子實現的功能是等效的,分別對應 3 種不同連續賦值時延的寫法。

//普通時延,A&B計算結果延時10個時間單位賦值給Z
wire Z, A, B ;
assign #10 Z = A & B ;

//隱式時延,宣告一個wire型變數時對其進行包含一定時延的連續賦值。
wire A, B;
wire #10 Z = A & B;

//宣告時延,宣告一個wire型變數是指定一個時延。因此對該變數所有的連續賦值都會被推遲到指定的時間。除非門級建模中,一般不推薦使用此類方法建模。
wire A, B;
wire #10 Z ;
assign Z =A & B
慣性時延
在上述例子中,A 或 B 任意一個變數發生變化,那麼在 Z 得到新的值之前,會有 10 個時間單位的時延。如果在這 10 個時間單位內,即在 Z 獲取新的值之前,A 或 B 任意一個值又發生了變化,那麼計算 Z 的新值時會取 A 或 B 當前的新值。所以稱之為慣性時延,即訊號脈衝寬度小於時延時,對輸出沒有影響。

因此模擬時,時延一定要合理設定,防止某些訊號不能進行有效的延遲。

對一個有延遲的與門邏輯進行時延模擬。

例項
module time_delay_module(
input ai, bi,
output so_lose, so_get, so_normal);

assign #20      so_lose      = ai & bi ;
assign  #5      so_get       = ai & bi ;
assign          so_normal    = ai & bi ;

endmodule
testbench 參考如下:

例項
`timescale 1ns/1ns

module test ;
reg ai, bi ;

wire so_lose, so_get, so_normal ;

initial begin
    ai        = 0 ;
    #25 ;      ai        = 1 ;
    #35 ;      ai        = 0 ;        //60ns
    #40 ;      ai        = 1 ;        //100ns
    #10 ;      ai        = 0 ;        //110ns
end

initial begin
    bi        = 1 ;
    #70 ;      bi        = 0 ;
    #20 ;      bi        = 1 ;
end

time_delay_module  u_wire_delay(
    .ai              (ai),
    .bi              (bi),
    .so_lose         (so_lose),
    .so_get          (so_get),
    .so_normal       (so_normal));

initial begin
    forever begin
        #100;
        //$display("---gyc---%d", $time);
        if ($time >= 1000) begin
            $finish ;
        end
    end
end

endmodule
模擬結果如下:

訊號 so_normal 為正常的與邏輯。

由於所有的時延均大於 5ns,所以訊號 so_get 的結果為與操作後再延遲 5ns 的結果。

訊號 so_lose 前一段是與操作後再延遲 20ns 的結果。

由於訊號 ai 第二個高電平持續時間小於 20ns,so_lose 訊號會因慣性時延而漏掉對這個脈衝的延時檢測,所以後半段 so_lose 訊號仍然為 0。