蔣麗苑,Verilog 時延

2021-10-14 15:33:34 字數 2081 閱讀 4448

時延一般是不可綜合的。

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

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

下面 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

endinitial begin

bi = 1 ;

#70 ; bi = 0 ;

#20 ; bi = 1 ;

endtime_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 ;

endend

end

endmodule

**結果如下:

訊號 so_normal 為正常的與邏輯。

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

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

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

蔣麗苑,C 虛成員函式表vtable

通過前兩節的介紹,想必對多型有一定的了解了。這一節將介紹多型是如何實現的,關於如何實現多型,對於程式設計人員來說即使不知道也是完全沒有關係的,但是對於加深對多型的理解具有重要意義,故而在此節中稍微闡述一下多型的實現機制。在c 中通過虛成員函式表vtable實現多型,虛函式表中儲存的是類中虛函式的入口...

蔣麗苑,C語言位域(位段)詳解

在結構體定義時,我們可以指定某個成員變數所占用的二進位制位數 bit 這就是位域。請看下面的例子 struct bs 後面的數字用來限定成員變數占用的位數。成員 m 沒有限制,根據資料型別即可推算出它占用 4 個位元組 byte 的記憶體。成員 n ch 被 後面的數字限制,不能再根據資料型別計算長...