Verilog 時(shí)延

2022-05-17 10:21 更新

關(guān)鍵詞:時(shí)延, 慣性時(shí)延

連續(xù)賦值延時(shí)語(yǔ)句中的延時(shí),用于控制任意操作數(shù)發(fā)生變化到語(yǔ)句左端賦予新值之間的時(shí)間延時(shí)。

時(shí)延一般是不可綜合的。

寄存器的時(shí)延也是可以控制的,這部分在時(shí)序控制里加以說(shuō)明。

連續(xù)賦值時(shí)延一般可分為普通賦值時(shí)延、隱式時(shí)延、聲明時(shí)延。

下面 3 個(gè)例子實(shí)現(xiàn)的功能是等效的,分別對(duì)應(yīng) 3 種不同連續(xù)賦值時(shí)延的寫(xiě)法。

//普通時(shí)延,A&B計(jì)算結(jié)果延時(shí)10個(gè)時(shí)間單位賦值給Z
wire Z, A, B ;
assign #10    Z = A & B ;
//隱式時(shí)延,聲明一個(gè)wire型變量時(shí)對(duì)其進(jìn)行包含一定時(shí)延的連續(xù)賦值。
wire A, B;
wire #10        Z = A & B;
//聲明時(shí)延,聲明一個(gè)wire型變量是指定一個(gè)時(shí)延。因此對(duì)該變量所有的連續(xù)賦值都會(huì)被推遲到指定的時(shí)間。除非門(mén)級(jí)建模中,一般不推薦使用此類方法建模。
wire A, B;
wire #10 Z ;
assign           Z =A & B

慣性時(shí)延

在上述例子中,A 或 B 任意一個(gè)變量發(fā)生變化,那么在 Z 得到新的值之前,會(huì)有 10 個(gè)時(shí)間單位的時(shí)延。如果在這 10 個(gè)時(shí)間單位內(nèi),即在 Z 獲取新的值之前,A 或 B 任意一個(gè)值又發(fā)生了變化,那么計(jì)算 Z 的新值時(shí)會(huì)取 A 或 B 當(dāng)前的新值。所以稱之為慣性時(shí)延,即信號(hào)脈沖寬度小于時(shí)延時(shí),對(duì)輸出沒(méi)有影響。

因此仿真時(shí),時(shí)延一定要合理設(shè)置,防止某些信號(hào)不能進(jìn)行有效的延遲。

對(duì)一個(gè)有延遲的與門(mén)邏輯進(jìn)行時(shí)延仿真。

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

仿真結(jié)果如下:

信號(hào) ?so_normal ?為正常的與邏輯。

由于所有的時(shí)延均大于 5ns,所以信號(hào) ?so_get ?的結(jié)果為與操作后再延遲 5ns 的結(jié)果。

信號(hào) ?so_lose ?前一段是與操作后再延遲 20ns 的結(jié)果。

由于信號(hào) ai 第二個(gè)高電平持續(xù)時(shí)間小于 20ns,?so_lose ?信號(hào)會(huì)因慣性時(shí)延而漏掉對(duì)這個(gè)脈沖的延時(shí)檢測(cè),所以后半段 ?so_lose ?信號(hào)仍然為 0。


點(diǎn)擊這里下載源碼


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)