Verilog 延遲反標(biāo)法

2022-05-20 14:46 更新

關(guān)鍵詞: 延遲反標(biāo)注, SDF

延遲反標(biāo)注是設(shè)計(jì)者根據(jù)單元庫(kù)工藝、門(mén)級(jí)網(wǎng)表、版圖中的電容電阻等信息,借助數(shù)字設(shè)計(jì)工具將延遲信息標(biāo)注到門(mén)級(jí)網(wǎng)表中的過(guò)程。利用延遲反標(biāo)注后的網(wǎng)表,就可以進(jìn)行精確的時(shí)序仿真,使仿真更接近實(shí)際工作的數(shù)字電路。

延遲反標(biāo)注過(guò)程

前面教程中的仿真基本都是功能性的仿真。無(wú)論是進(jìn)行 IC 設(shè)計(jì)還是 FPGA 開(kāi)發(fā),時(shí)序仿真都是必不可少的。《Verilog 教程》《Verilog 設(shè)計(jì)方法》章節(jié)中也描述了完整的數(shù)字設(shè)計(jì)開(kāi)發(fā)流程。

下面,說(shuō)明延遲反標(biāo)注在該流程中是怎么使用的,權(quán)當(dāng)復(fù)習(xí)與鞏固。

  • 利用硬件描述語(yǔ)言完成 RTL 層級(jí)的描述,進(jìn)行功能仿真。
  • 對(duì)時(shí)鐘、復(fù)位、輸出端口等信號(hào)進(jìn)行一定的時(shí)序約束,包括時(shí)鐘頻率、時(shí)序檢查、延遲等信息的設(shè)置,并用于邏輯綜合。
  • 綜合出的門(mén)級(jí)網(wǎng)表包含各種粗略估計(jì)的延遲信息。此時(shí)可以進(jìn)行去除掉 hold、recovery、 removal、interconnect(互聯(lián)線)等延遲信息,進(jìn)行初步的時(shí)序仿真和靜態(tài)時(shí)序分析 (STA),初步驗(yàn)證 setup 等時(shí)序是否滿足時(shí)序要求。很多公司或個(gè)人也會(huì)將此步的仿真略過(guò)。
  • 對(duì)門(mén)級(jí)網(wǎng)表進(jìn)行布局布線,轉(zhuǎn)換為版圖級(jí)網(wǎng)表。根據(jù)元器件幾何形狀和制造工藝等信息可以提取版圖電路中的電容和電阻信息,再根據(jù)此信息就可以計(jì)算出版圖中的延遲值。
  • 將布局布線后版圖中的延遲信息反標(biāo)到版圖級(jí)網(wǎng)表中,便可以精確的修改網(wǎng)表中的延遲值。此時(shí)再進(jìn)行時(shí)序仿真和 STA,以驗(yàn)證時(shí)序是否滿足。
  • 如果所有驗(yàn)證均通過(guò),則可以進(jìn)行下載或?qū)崿F(xiàn)、生產(chǎn)。如果時(shí)序有 violation,首先需要檢查時(shí)序約束設(shè)置,比如延遲參數(shù)、時(shí)鐘頻率、信號(hào)關(guān)系等設(shè)置是否有問(wèn)題,再重新布局布線驗(yàn)證是否能消除 violation。如果上述措施均不能消除 violation,則需要回到設(shè)計(jì)初始,優(yōu)化 RTL 的描述。

此過(guò)程示意圖如下,標(biāo)黃部分表示數(shù)字設(shè)計(jì)流程中可以增加的操作說(shuō)明。


SDF 文件

SDF (Standard Delay Format),標(biāo)準(zhǔn)延時(shí)格式文件,常用延遲反標(biāo)注。該文件包含了仿真用到的所有 IOPATH,INTERCONNECT、TIMING CHECK 等延遲時(shí)間和時(shí)序約束的參數(shù)。下面就簡(jiǎn)單的介紹下 SDF 文件。

文件格式

SDF 文件用關(guān)鍵字 ?DELAYFILE ?聲明,并包含 DESIGN、DATE 等關(guān)鍵字信息。

延遲時(shí)間和時(shí)序約束參數(shù)均在 CELL 內(nèi)說(shuō)明。

SDF 文件就是由文件聲明信息和很多個(gè)不同的 CELL 組成的,格式如下。

(DELAYFILE
(DESIGN "top")
(DATE "Love Sep 7 11:11:11 2017")
......
(TIMESCALE 1ns)
(CELL
  ......
)
(CELL
  ......
)
......
)

延遲類(lèi)型

SDF 文件中的延遲類(lèi)型包括 cell delay 和 wire delay。cell delay 指邏輯門(mén)單元器件內(nèi)部的延遲,wire delay 是指器件之間通過(guò) wire 互聯(lián)的延遲。

cell delay 描述如下,定義了 module "and_gate" 中輸入端口(A/B)與輸出端口(Z)的上升延遲和下降延遲,并指定了最小值和最大值。

(CELL
  (CELLTYPE "and_gate")  //module 名字
  (INSTANCE u_and)       //例化名字,如果多層次訪問(wèn)需要指定訪問(wèn)層次
  (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 級(jí)仿真或綜合出的門(mén)級(jí)網(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))
    //層次訪問(wèn)符號(hào),有的編譯器支持".",有的編譯器支持"/",這里需要注意
    )
  )
)

條件延遲及時(shí)序檢查

CELL 中還可以用關(guān)鍵字 ?COND ?指定條件延遲。

同時(shí),也可以在 CELL 內(nèi)做時(shí)序檢查。

一個(gè) D 觸發(fā)器的延遲說(shuō)明及時(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
    //此處只是為了說(shuō)明 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)注的過(guò)程。

使用格式如下:

$sdf_annotate ('sdf_file'[, module_instance] [,'sdf_configfile'][,'sdf_logfile'][,'mtm_spec'] [,'scale_factors'][,'scale_type']);

這里,?sdf_file ?必須指定,其余參數(shù)可選。

這里只對(duì)前幾個(gè)常用的參數(shù)進(jìn)行說(shuō)明。

  • ?sdf_file?: SDF 文件名字,包含路徑信息。
  • ?module_instance?: 例化的設(shè)計(jì)模塊名字,一般為 testbench 中所例化的數(shù)字設(shè)計(jì)模塊名稱(chēng),注意和 SDF 文件內(nèi)容中的聲明保持層次的一致。
  • ?log_file?: 編譯時(shí)關(guān)于 SDF 的日志,方便查閱。
  • ?mtm_spec?: 指定使用的延遲類(lèi)型,選項(xiàng)包括 MAXIMUM、MINIMUM、TYPICAL,分別表示使用 SDF 文件中標(biāo)注的最大值、最小值或典型值。當(dāng)然上述 SDF 文件例子中沒(méi)有給出典型值。

使用 specify 仿真

下面使用 specify 進(jìn)行簡(jiǎn)單的時(shí)序仿真,以便與使用 SDF 文件進(jìn)行時(shí)序仿真做對(duì)比。

一個(gè)用 specify 指定延遲的與門(mén)邏輯描述如下:

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í)序如下所示,由圖可知:

  1. 與門(mén)輸入端 A/B 到輸出端 Z 的上升延遲為 33.7-32=1.7ns;
  2. 與門(mén)輸出端 Z 到觸發(fā)器輸入端 D 的互聯(lián)延遲為 0;
  3. 觸發(fā)器 D 端到 CP 端時(shí)間差為 35-33.7=1.3ns,大于 setup check 時(shí)設(shè)置的 1ns,因此時(shí)序滿足要求,不存在 violation 。
  4. 觸發(fā)器 CP 端到輸出端 Q 的上升延遲為 36.7-35=1.7ns;

綜上所述,仿真結(jié)果符合設(shè)計(jì)參數(shù)。


使用 SDF 仿真

保持關(guān)于 SDF 文件的例子中涉及的參數(shù)不變,將多個(gè) CELL 說(shuō)明整合成完整的 SDF 文件,命名為"simple_test.sdf"。

在 testbench 中加入以下語(yǔ)句,將 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 打印信息如下,由圖可知:

  1. 與門(mén)輸入端 A/B 到輸出端 Z 的上升延遲為 33.8-32=1.8ns;
  2. 與門(mén)輸出端 Z 到觸發(fā)器輸入端 D 的互聯(lián)延遲為 34.551-33.8= 0.751ns,不再為 0;
  3. 觸發(fā)器 D 端到 CP 端時(shí)間差為 35-34.551=0.449ns,小于 setup check 時(shí)設(shè)置的 1ns,因此時(shí)序不滿足要求,會(huì)打印存在 violation 的信息。
  4. 觸發(fā)器 CP 端到輸出端 Q 的上升延遲為 37.3-35=2.3ns;

綜上所述,仿真結(jié)果符合設(shè)計(jì)參數(shù),但是時(shí)序存在 ?violation?。主要原因是因?yàn)榕c門(mén)輸入端的數(shù)據(jù)和觸發(fā)器時(shí)鐘是異步不相關(guān)的。為解決此類(lèi)異步問(wèn)題,請(qǐng)參考下一章節(jié)《Verilog 同步與異步》。



需要說(shuō)明的是:

與 specify 塊語(yǔ)句相比,SDF 文件還可以指定模塊間 wire delay。

一般來(lái)說(shuō),使用 SDF 文件指定版圖級(jí)的網(wǎng)表 timing 信息最接近實(shí)際數(shù)字電路,相比 rtl 或綜合出的門(mén)級(jí)網(wǎng)表,此版本的 timing 是最差的。

SDF 文件指定模塊內(nèi)路徑延遲時(shí),原模塊的 specify 塊必須保留,且 specify 塊與 SDF 文件中指定的延遲的條件、類(lèi)型等均需一致,延遲值可以不同。例如在 specify 塊中無(wú)條件指定延遲:

(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)))

則在編譯階段就會(huì)報(bào)告"IOPATH from A to Z is not found."的 SDF Warning。SDF 文件設(shè)置的延遲是無(wú)效的。此處 SDF 文件也應(yīng)該使用無(wú)條件的方法指定路徑延遲。

本次只是為了介紹 SDF 文件及其用法而手動(dòng)編寫(xiě)的 SDF 文件。實(shí)際上 SDF 文件都是由設(shè)計(jì)人員借助 IC 設(shè)計(jì)工具(例如 PrimeTime)生成的,上一條注意事項(xiàng)也無(wú)需太過(guò)擔(dān)心,調(diào)試時(shí)注意就好。一般數(shù)字設(shè)計(jì)的門(mén)級(jí)網(wǎng)表數(shù)量巨大,人為寫(xiě) SDF 文件也不切實(shí)際。

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


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)