延遲反標(biāo)注是設(shè)計(jì)者根據(jù)單元庫工藝、門級網(wǎng)表、版圖中的電容電阻等信息,借助數(shù)字設(shè)計(jì)工具將延遲信息標(biāo)注到門級網(wǎng)表中的過程。利用延遲反標(biāo)注后的網(wǎng)表,就可以進(jìn)行精確的時(shí)序仿真,使仿真更接近實(shí)際工作的數(shù)字電路。
前面教程中的仿真基本都是功能性的仿真。無論是進(jìn)行 IC 設(shè)計(jì)還是 FPGA 開發(fā),時(shí)序仿真都是必不可少的。《Verilog 教程》的《Verilog 設(shè)計(jì)方法》章節(jié)中也描述了完整的數(shù)字設(shè)計(jì)開發(fā)流程。
下面,說明延遲反標(biāo)注在該流程中是怎么使用的,權(quán)當(dāng)復(fù)習(xí)與鞏固。
此過程示意圖如下,標(biāo)黃部分表示數(shù)字設(shè)計(jì)流程中可以增加的操作說明。
SDF (Standard Delay Format),標(biāo)準(zhǔn)延時(shí)格式文件,常用延遲反標(biāo)注。該文件包含了仿真用到的所有 IOPATH,INTERCONNECT、TIMING CHECK 等延遲時(shí)間和時(shí)序約束的參數(shù)。下面就簡單的介紹下 SDF 文件。
SDF 文件用關(guān)鍵字 ?DELAYFILE
?聲明,并包含 DESIGN、DATE 等關(guān)鍵字信息。
延遲時(shí)間和時(shí)序約束參數(shù)均在 CELL 內(nèi)說明。
SDF 文件就是由文件聲明信息和很多個(gè)不同的 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的,因?yàn)楹蠖诉€需要重新布局布線。布局布線后的網(wǎng)表就接近真實(shí)的電路,此時(shí)就需要考慮 wire delay。
(CELL
(CELLTYPE "top") //module 名字
(INSTANCE) //如果是頂層設(shè)計(jì)模塊,可忽略例化名字
(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 中還可以用關(guān)鍵字 ?COND
?指定條件延遲。
同時(shí),也可以在 CELL 內(nèi)做時(shí)序檢查。
一個(gè) D 觸發(fā)器的延遲說明及時(shí)序檢查舉例如下。
(CELL
(CELLTYPE "d_gate")
(INSTANCE u_dt)
(DELAY
(ABSOLUTE
// D=1時(shí) 上升延遲為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時(shí) 上升延遲為1.2-2.1, 下降延遲為1.4-2.0
//此處只是為了說明 COND 的用法,D=1時(shí)下降延遲參數(shù)不可能用到
// D=0時(shí)上升延遲參數(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 時(shí)間小于0.8或1時(shí),便打印 violation
)
)
Verilog 提供了系統(tǒng)函數(shù) ?$sdf_annotate
? 去調(diào)用 SDF 文件完成延遲反標(biāo)注的過程。
使用格式如下:
$sdf_annotate ('sdf_file'[, module_instance] [,'sdf_configfile'][,'sdf_logfile'][,'mtm_spec'] [,'scale_factors'][,'scale_type']);
這里,?sdf_file
?必須指定,其余參數(shù)可選。
這里只對前幾個(gè)常用的參數(shù)進(jìn)行說明。
sdf_file
?: SDF 文件名字,包含路徑信息。
module_instance
?: 例化的設(shè)計(jì)模塊名字,一般為 testbench 中所例化的數(shù)字設(shè)計(jì)模塊名稱,注意和 SDF 文件內(nèi)容中的聲明保持層次的一致。
log_file
?: 編譯時(shí)關(guān)于 SDF 的日志,方便查閱。
mtm_spec
?: 指定使用的延遲類型,選項(xiàng)包括 MAXIMUM、MINIMUM、TYPICAL,分別表示使用 SDF 文件中標(biāo)注的最大值、最小值或典型值。當(dāng)然上述 SDF 文件例子中沒有給出典型值。下面使用 specify 進(jìn)行簡單的時(shí)序仿真,以便與使用 SDF 文件進(jìn)行時(shí)序仿真做對比。
一個(gè)用 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
一個(gè)用 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
頂層模塊描述如下,主要功能是將與邏輯的輸出結(jié)果輸入到 D 觸發(fā)器進(jìn)行緩存。
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 描述如下,仿真時(shí)設(shè)置 "+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í)序如下所示,由圖可知:
綜上所述,仿真結(jié)果符合設(shè)計(jì)參數(shù)。
保持關(guān)于 SDF 文件的例子中涉及的參數(shù)不變,將多個(gè) CELL 說明整合成完整的 SDF 文件,命名為"simple_test.sdf"。
在 testbench 中加入以下語句,將 SDF 文件中的延遲信息反標(biāo)注到設(shè)計(jì)的模塊 top 中,重新進(jìn)行時(shí)序上的仿真。
initial begin
$sdf_annotate("../rtl/simple_test.sdf", u_top, , "sdf.log", "MAXIMUM", ,);
end
仿真時(shí)序及 log 打印信息如下,由圖可知:
綜上所述,仿真結(jié)果符合設(shè)計(jì)參數(shù),但是時(shí)序存在 ?violation
?。主要原因是因?yàn)榕c門輸入端的數(shù)據(jù)和觸發(fā)器時(shí)鐘是異步不相關(guān)的。為解決此類異步問題,請參考下一章節(jié)《Verilog 同步與異步》。
與 specify 塊語句相比,SDF 文件還可以指定模塊間 wire delay。
一般來說,使用 SDF 文件指定版圖級的網(wǎng)表 timing 信息最接近實(shí)際數(shù)字電路,相比 rtl 或綜合出的門級網(wǎng)表,此版本的 timing 是最差的。
SDF 文件指定模塊內(nèi)路徑延遲時(shí),原模塊的 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)))
則在編譯階段就會報(bào)告"IOPATH from A to Z is not found."的 SDF Warning。SDF 文件設(shè)置的延遲是無效的。此處 SDF 文件也應(yīng)該使用無條件的方法指定路徑延遲。
本次只是為了介紹 SDF 文件及其用法而手動(dòng)編寫的 SDF 文件。實(shí)際上 SDF 文件都是由設(shè)計(jì)人員借助 IC 設(shè)計(jì)工具(例如 PrimeTime)生成的,上一條注意事項(xiàng)也無需太過擔(dān)心,調(diào)試時(shí)注意就好。一般數(shù)字設(shè)計(jì)的門級網(wǎng)表數(shù)量巨大,人為寫 SDF 文件也不切實(shí)際。
點(diǎn)擊這里下載源碼
更多建議: