延遲反標注是設計者根據(jù)單元庫工藝、門級網(wǎng)表、版圖中的電容電阻等信息,借助數(shù)字設計工具將延遲信息標注到門級網(wǎng)表中的過程。利用延遲反標注后的網(wǎng)表,就可以進行精確的時序仿真,使仿真更接近實際工作的數(shù)字電路。
前面教程中的仿真基本都是功能性的仿真。無論是進行 IC 設計還是 FPGA 開發(fā),時序仿真都是必不可少的。《Verilog 教程》的《Verilog 設計方法》章節(jié)中也描述了完整的數(shù)字設計開發(fā)流程。
下面,說明延遲反標注在該流程中是怎么使用的,權當復習與鞏固。
此過程示意圖如下,標黃部分表示數(shù)字設計流程中可以增加的操作說明。
SDF (Standard Delay Format),標準延時格式文件,常用延遲反標注。該文件包含了仿真用到的所有 IOPATH,INTERCONNECT、TIMING CHECK 等延遲時間和時序約束的參數(shù)。下面就簡單的介紹下 SDF 文件。
SDF 文件用關鍵字 ?DELAYFILE
?聲明,并包含 DESIGN、DATE 等關鍵字信息。
延遲時間和時序約束參數(shù)均在 CELL 內(nèi)說明。
SDF 文件就是由文件聲明信息和很多個不同的 CELL 組成的,格式如下。
(DELAYFILE
(DESIGN "top")
(DATE "Love Sep 7 11:11:11 2017")
......
(TIMESCALE 1ns)
(CELL
......
)
(CELL
......
)
......
)
SDF 文件中的延遲類型包括 cell delay 和 wire delay。cell delay 指邏輯門單元器件內(nèi)部的延遲,wire delay 是指器件之間通過 wire 互聯(lián)的延遲。
cell delay 描述如下,定義了 module "and_gate" 中輸入端口(A/B)與輸出端口(Z)的上升延遲和下降延遲,并指定了最小值和最大值。
(CELL
(CELLTYPE "and_gate") //module 名字
(INSTANCE u_and) //例化名字,如果多層次訪問需要指定訪問層次
(DELAY
(ABSOLUTE
(IOPATH A Z (1.5::1.8) (1.3::1.7)) //上升延遲最小值1.5,最大值1.8
(IOPATH B Z (1.5::1.8) (1.3::1.7)) //下降延遲最小值1.3,最大值1.7
)
)
)
wire delay 描述如下,定義了在 module "top" 中,從 u_and 輸出端到 u_dt 輸入端的上升延遲和下降延遲,并指定了最小值和最大值。
一般 RTL 級仿真或綜合出的門級網(wǎng)表是可以忽略 wire delay的,因為后端還需要重新布局布線。布局布線后的網(wǎng)表就接近真實的電路,此時就需要考慮 wire delay。
(CELL
(CELLTYPE "top") //module 名字
(INSTANCE) //如果是頂層設計模塊,可忽略例化名字
(DELAY
(ABSOLUTE
(INTERCONNECT u_and.Z u_dt.D (0.500::0.751) (0.400::0.551))
//(INTERCONNECT u_and/Z u_dt/D (0.500::0.751) (0.400::0.551))
//層次訪問符號,有的編譯器支持".",有的編譯器支持"/",這里需要注意
)
)
)
CELL 中還可以用關鍵字 ?COND
?指定條件延遲。
同時,也可以在 CELL 內(nèi)做時序檢查。
一個 D 觸發(fā)器的延遲說明及時序檢查舉例如下。
(CELL
(CELLTYPE "d_gate")
(INSTANCE u_dt)
(DELAY
(ABSOLUTE
// D=1時 上升延遲為1.3-2.3, 下降延遲為1.5-2.2
(COND D==1'b1 (IOPATH CP Q (1.3::2.3) (1.5::2.2)))
// D=0時 上升延遲為1.2-2.1, 下降延遲為1.4-2.0
//此處只是為了說明 COND 的用法,D=1時下降延遲參數(shù)不可能用到
// D=0時上升延遲參數(shù)也不可能用到
(COND D==1'b0 (IOPATH CP Q (1.2::2.1) (1.4::2.0)))
)
)
(TIMINGCHECK
(SETUP D (posedge CP) (0.8::1))
//setup check, D-CP 時間小于0.8或1時,便打印 violation
)
)
Verilog 提供了系統(tǒng)函數(shù) ?$sdf_annotate
? 去調用 SDF 文件完成延遲反標注的過程。
使用格式如下:
$sdf_annotate ('sdf_file'[, module_instance] [,'sdf_configfile'][,'sdf_logfile'][,'mtm_spec'] [,'scale_factors'][,'scale_type']);
這里,?sdf_file
?必須指定,其余參數(shù)可選。
這里只對前幾個常用的參數(shù)進行說明。
sdf_file
?: SDF 文件名字,包含路徑信息。
module_instance
?: 例化的設計模塊名字,一般為 testbench 中所例化的數(shù)字設計模塊名稱,注意和 SDF 文件內(nèi)容中的聲明保持層次的一致。
log_file
?: 編譯時關于 SDF 的日志,方便查閱。
mtm_spec
?: 指定使用的延遲類型,選項包括 MAXIMUM、MINIMUM、TYPICAL,分別表示使用 SDF 文件中標注的最大值、最小值或典型值。當然上述 SDF 文件例子中沒有給出典型值。下面使用 specify 進行簡單的時序仿真,以便與使用 SDF 文件進行時序仿真做對比。
一個用 specify 指定延遲的與門邏輯描述如下:
module and_gate(
output Z,
input A, B);
assign Z = A & B ;
specify
specparam t_rise = 1.3:1.5:1.7 ;
specparam t_fall = 1.1:1.3:1.6 ;
(A, B *> Z) = (t_rise, t_fall) ;
endspecify
endmodule
一個用 specify 指定延遲的 D 觸發(fā)器描述如下:
module d_gate(
output Q ,
input D, CP);
reg Q_r ;
always @(posedge CP)
Q_r <= D ;
assign Q = Q_r ;
specify
if (D == 1'b1)
(posedge CP => (Q +: D)) = (1.3:1.5:1.7, 1.1:1.4:1.9) ;
if (D == 1'b0)
(posedge CP => (Q +: D)) = (1.2:1.4:1.6, 1.0:1.3:1.8) ;
$setup(D, posedge CP, 1);
endspecify
endmodule
頂層模塊描述如下,主要功能是將與邏輯的輸出結果輸入到 D 觸發(fā)器進行緩存。
module top(
output and_out,
input in1, in2, clk);
wire res_tmp ;
and_gate u_and(res_tmp, in1, in2);
d_gate u_dt(and_out, res_tmp, clk);
endmodule
testbench 描述如下,仿真時設置 "+maxdelays",使用最大延遲值。
`timescale 1ns/1ps
module test ;
wire and_out ;
reg in1, in2 ;
reg clk ;
initial begin
clk = 0 ;
forever begin
#(10/2) clk = ~clk ;
end
end
initial begin
in1 = 0 ; in2 = 0 ;
# 32 ;
in1 = 1 ; in2 = 1 ;
# 13 ;
in1 = 1 ; in2 = 0 ;
end
top u_top(
.and_out (and_out),
.in1 (in1),
.in2 (in2),
.clk (clk));
initial begin
forever begin
#100;
if ($time >= 1000) $finish ;
end
end
endmodule // test
仿真時序如下所示,由圖可知:
綜上所述,仿真結果符合設計參數(shù)。
保持關于 SDF 文件的例子中涉及的參數(shù)不變,將多個 CELL 說明整合成完整的 SDF 文件,命名為"simple_test.sdf"。
在 testbench 中加入以下語句,將 SDF 文件中的延遲信息反標注到設計的模塊 top 中,重新進行時序上的仿真。
initial begin
$sdf_annotate("../rtl/simple_test.sdf", u_top, , "sdf.log", "MAXIMUM", ,);
end
仿真時序及 log 打印信息如下,由圖可知:
綜上所述,仿真結果符合設計參數(shù),但是時序存在 ?violation
?。主要原因是因為與門輸入端的數(shù)據(jù)和觸發(fā)器時鐘是異步不相關的。為解決此類異步問題,請參考下一章節(jié)《Verilog 同步與異步》。
與 specify 塊語句相比,SDF 文件還可以指定模塊間 wire delay。
一般來說,使用 SDF 文件指定版圖級的網(wǎng)表 timing 信息最接近實際數(shù)字電路,相比 rtl 或綜合出的門級網(wǎng)表,此版本的 timing 是最差的。
SDF 文件指定模塊內(nèi)路徑延遲時,原模塊的 specify 塊必須保留,且 specify 塊與 SDF 文件中指定的延遲的條件、類型等均需一致,延遲值可以不同。例如在 specify 塊中無條件指定延遲:
(A => Z) = (1.3, 1.7) ;
在 SDF 文件中指定條件延遲:
(COND A==1'b1&&B==1'b1 (IOPATH A Z (1.5::1.8) (1.3::1.7)))
則在編譯階段就會報告"IOPATH from A to Z is not found."的 SDF Warning。SDF 文件設置的延遲是無效的。此處 SDF 文件也應該使用無條件的方法指定路徑延遲。
本次只是為了介紹 SDF 文件及其用法而手動編寫的 SDF 文件。實際上 SDF 文件都是由設計人員借助 IC 設計工具(例如 PrimeTime)生成的,上一條注意事項也無需太過擔心,調試時注意就好。一般數(shù)字設計的門級網(wǎng)表數(shù)量巨大,人為寫 SDF 文件也不切實際。
點擊這里下載源碼
更多建議: