Verilog 延遲反標法

2022-05-20 14:46 更新

關鍵詞: 延遲反標注, SDF

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

延遲反標注過程

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

下面,說明延遲反標注在該流程中是怎么使用的,權當復習與鞏固。

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

此過程示意圖如下,標黃部分表示數(shù)字設計流程中可以增加的操作說明。


SDF 文件

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 仿真

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

仿真時序如下所示,由圖可知:

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

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


使用 SDF 仿真

保持關于 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 打印信息如下,由圖可知:

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

綜上所述,仿真結果符合設計參數(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 文件也不切實際。

點擊這里下載源碼


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號