FPGA 靜態時序分析與約束(3)

項目簡述

這裏提醒,在看這篇文章之前一定要先把前一篇時序約束的文章看完,前面一篇纔是重點,這篇就是一些簡單的工具使用。

前面我們已經介紹了時序約束原理、參數的計算、Quartus II中時序約束方法。接下來,我們進行Xlinx的EDA工具VIVADO的時序約束方法。該約束方法我們將按照下圖依次講解,具體參數的計算我們在這篇博客中也將與前面的理論相聯繫。這篇博客中,我們分別進行原語、GUI的操作,使大家更容易明白其時序約束原理與時序參數。
在這裏插入圖片描述

基於原語的時序操作

首先這裏需要注意的是,在進行時序約束之前一定要綁定引腳,否則進行的時序約束沒有意義。

原語在Xlinx的工具中經常性的使用到。所謂的原語,同學們可以理解成爲沒有定製界面的IP,就給我們了一個頂層文件進而實現相應的功能。

時鐘的約束

上面的時鐘分爲很多種情況,但是輸入管腳是CLK、差分時鐘、GT或恢復時鐘是一類,另外的都屬於生成時鐘的種類。

輸入時鐘的約束

輸入的時鐘,使用以下原語進行約束:

create_clock -name <clock_name> -period <period> [get_ports <clock port>] 

上面的 period 是時鐘週期,clock port是輸入時鐘的管腳,clock_name是自己給這個時鐘重新起的名字。

生成時鐘的約束

生成時鐘包括上面PLL等衍生時鐘、自己分頻的時鐘。注意這裏VIVADO對PLL的衍生時鐘已經默認自己加了約束,當然我們也可以重新添加約束,約束是我們後添加的爲準。
生成時鐘的約束語句如下:
分頻時鐘:

# Generate a clock with a divided frequency from the master clock
# Generated frequency = master_clock_frequency / div_factor

create_generated_clock -name <generated_clock_name> \
                       -source <master_clock source_pin_or_port> \
                       -divide_by <div_factor> \
                       <pin_or_port>

上面generated_clock_name是我們對生成的時鐘取得名字;master_clock source_pin_or_port這個是原時鐘信號,對應於PLL的輸入時鐘;div_factor是分頻的倍數;pin_or_port是生成的時鐘信號。

倍頻時鐘:

# Generate a clock with a multiplied frequency from its master clock
# Generated frequency = master_clock_frequency * mult_factor

create_generated_clock -name <generated_clock_name> \
                       -source <master_clock source_pin_or_port> \
                       -multiply_by <mult_factor> \
                       <pin_or_port>

上面generated_clock_name是我們對生成的時鐘取得名字;master_clock source_pin_or_port這個是原時鐘信號,對應於PLL的輸入時鐘;mult_factor是倍頻的倍數;pin_or_port是生成的時鐘信號。

分數頻時鐘:

# Generated a clock with a fractional frequency of the master clock frequency:
# Generated frequency = master_clock_frequency * (mult_factor/div_factor)

create_generated_clock -name <generated_clock_name> \
                       -source <master_clock_source_pin_or_port> \
                       -multiply_by <mult_factor> \
                       -divide_by <div_factor> \
                       <pin_or_port>

上面generated_clock_name是我們對生成的時鐘取得名字;master_clock source_pin_or_port這個是原時鐘信號,對應於PLL的輸入時鐘;mult_factor是分頻的倍數;div_factor是分頻倍數;div_factor,pin_or_port是生成的時鐘信號。

Input Delay約束

input delay的作用及計算方法在第一篇博客中我們已經進行了詳細的說明。

定義1:input delay:我們在EDA軟件中設置的input delay的值是以FPGA爲中心,數據到達FPGA與時鐘沿到達FPGA時間的差值。
由上面的定義,我們便可以得到input delay值得定義:
input delay(FPGA)=FPGAFPGAinput\ delay(FPGA爲中心) =數據到達時間(FPGA引腳)-時鐘到達時間(FPGA引腳)
input delay(FPGA)=Tco+TdbdTcdTcbdinput\ delay(FPGA爲中心) =Tco+Tdbd-Tcd-Tcbd
其實對於大多數PCB板做了等長處理,所以一般TdbdTdbdTcbdTcbd相等,而且TcoTcdTco-Tcd在上游器件得技術手冊中是給出得,一般命名爲TcoTco,那麼對於PCB板做了等長處理得器件,可以得下式:
input delay max=Tco(max)input\ delay\ max=Tco(max)
input delay min=Tco(min)input\ delay\ min=Tco(min)
以下所有的不同情況下約束都遵循上面的情況。

其實最簡單的方法就是拿着示波器來測量FPGA輸入引腳中時鐘與數據的時間差值。

系統同步的Input Delay約束

系統同步的Input Delay約束SDR接收數據原語約束如下:

# Rising Edge System Synchronous Inputs
#
# A Single Data Rate (SDR) System Synchronous interface is
# an interface where the external device and the FPGA use
# the same clock, and a new data is captured one clock cycle
# after being launched
#
# input      __________            __________
# clock   __|          |__________|          |__
#           |
#           |------> (tco_min+trce_dly_min)
#           |------------> (tco_max+trce_dly_max)
#         __________      ________________    
# data    __________XXXXXX_____ Data _____XXXXXXX
#

set input_clock     <clock_name>;   # Name of input clock
set tco_max         0.000;          # Maximum clock to out delay (external device)
set tco_min         0.000;          # Minimum clock to out delay (external device)
set trce_dly_max    0.000;          # Maximum board trace delay
set trce_dly_min    0.000;          # Minimum board trace delay
set input_ports     <input_ports>;  # List of input ports

# Input Delay Constraint
set_input_delay -clock $input_clock -max [expr $tco_max + $trce_dly_max] [get_ports $input_ports];
set_input_delay -clock $input_clock -min [expr $tco_min + $trce_dly_min] [get_ports $input_ports];

# Report Timing Template
# report_timing -from [get_ports $input_ports] -max_paths 20 -nworst 1 -delay_type min_max -name sys_sync_rise_in  -file sys_sync_rise_in.txt;		
 

這裏我們進行解釋,系統同步SDR輸入延遲約束:
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200510163340913.png
因爲是input delay的定義,所以可以知道:
inputdelay(FPGA)=FPGAFPGAinput delay(FPGA爲中心) =數據到達時間(FPGA引腳)-時鐘到達時間(FPGA引腳)
所以從上圖種可以看出:
input delay min=tco_min+trce_dly_mininput\ delay\ min = tco\_min+trce\_dly\_min
input delay max=tco_max+trce_dly_maxinput\ delay\ max = tco\_max+trce\_dly\_max
當PCB佈線等長時,上面的trce_dly_min與trce_dly_max等於0,所以結果也就是
input delay max=Tco(max)input\ delay\ max=Tco(max)
input delay min=Tco(min)input\ delay\ min=Tco(min)
這裏也印證了我們之前博客中推導的正確性。

系統同步的Input Delay約束DDR接收數據原語約束如下:

# DDR System Synchronous Inputs
#
# A Double Data Rate (DDR) System Synchronous interface is
# an interface where the external device and the FPGA use
# the same clock, and a new data is captured half a clock
# cycle after being launched
#
# input      _______________________________                                  ________
# clock    _|                               |________________________________|     
#           |                               |
#           |-> (trco_min+trce_dly_min)     |-> (tfco_min+trce_dly_min)
#           |-----> (trco_max+trce_dly_max) |-----> (tfco_max+trce_dly_max)
#          ____    ____________________________    ____________________________    ___
# data     ____XXXX__________Rise_Data_________XXXX__________Fall_Data_________XXXX___
#

set input_clock     <clock_name>;   # Name of input clock
set trco_max        0.000;          # Maximum clock to output delay from rising edge (external device)
set trco_min        0.000;          # Minimum clock to output delay from rising edge (external device)
set tfco_max        0.000;          # Maximum clock to output delay from falling edge (external device)
set tfco_min        0.000;          # Minimum clock to output delay from falling edge (external device)
set trce_dly_max    0.000;          # Maximum board trace delay
set trce_dly_min    0.000;          # Minimum board trace delay
set input_ports     <input_ports>;  # List of input ports

# Input Delay Constraint
set_input_delay -clock $input_clock -max [expr $trco_max + $trce_dly_max] [get_ports $input_ports];
set_input_delay -clock $input_clock -min [expr $trco_min + $trce_dly_min] [get_ports $input_ports];
set_input_delay -clock $input_clock -max [expr $tfco_max + $trce_dly_max] [get_ports $input_ports] -clock_fall -add_delay;
set_input_delay -clock $input_clock -min [expr $tfco_min + $trce_dly_min] [get_ports $input_ports] -clock_fall -add_delay;

# Report Timing Template
# report_timing -rise_from [get_ports $input_ports] -max_paths 20 -nworst 2 -delay_type min_max -name sys_sync_ddr_in_rise -file sys_sync_ddr_in_rise.txt;		
# report_timing -fall_from [get_ports $input_ports] -max_paths 20 -nworst 2 -delay_type min_max -name sys_sync_ddr_in_fall -file sys_sync_ddr_in_fall.txt;

經過上面SDR的推導以及描述,相信大家很容易明白DDR數據在系統同步情況下的時序約束。

這裏還沒有介紹中心對齊的情況,因爲包括上面的總共三種情況系統同步與源同步的約束語句完全相同這個直接參考源同步即可。

源同步的Input Delay約束

源同步SDR邊緣對齊的Input Delay約束

# Edge-Aligned Rising Edge Source Synchronous Inputs 
# (Using an MMCM/PLL)
#
# For an edge-aligned Source Synchronous interface, the clock
# transition occurs at the same time as the data transitions.
# In this template, the clock is aligned with the end of the
# data. The constraints below rely on the default timing
# analysis (setup = 1 cycle, hold = 0 cycle).
#
# input    __________                  ________________
# clock              |________________|                |__________
#                                     |
#                             skew_bre|skew_are 
#                             <------>|<------> 
#            _________________        |        _________________
# data     XX____Rise_Data____XXXXXXXXXXXXXXXXX_________________XX
#

set input_clock         <clock_name>;      # Name of input clock
set skew_bre            0.000;             # Data invalid before the rising clock edge
set skew_are            0.000;             # Data invalid after the rising clock edge
set input_ports         <input_ports>;     # List of input ports

# Input Delay Constraint
set_input_delay -clock $input_clock -max $skew_are  [get_ports $input_ports];
set_input_delay -clock $input_clock -min -$skew_bre [get_ports $input_ports];

# Report Timing Template
# report_timing -from [get_ports $input_ports] -max_paths 20 -nworst 1 -delay_type min_max -name src_sync_edge_rise_in  -file src_sync_edge_rise_in.txt;		  

查找上游器件的輸出時序找到skew_bre與skew_are的值即可,或者經過濾波器測量。下面的還是原始定義:數據到達FPGA與時鐘沿到達FPGA時間的差值。
在這裏插入圖片描述
源同步SDR中心對齊的Input Delay約束:

# Center-Aligned Rising Edge Source Synchronous Inputs 
#
# For a center-aligned Source Synchronous interface, the clock
# transition is aligned with the center of the data valid window.
# The same clock edge is used for launching and capturing the
# data. The constraints below rely on the default timing
# analysis (setup = 1 cycle, hold = 0 cycle).
#
# input    ____           __________    
# clock        |_________|          |_____
#                        |                 
#                 dv_bre | dv_are    
#                <------>|<------>  
#          __    ________|________    __
# data     __XXXX____Rise_Data____XXXX__
#

set input_clock         <clock_name>;      # Name of input clock
set input_clock_period  <period_value>;    # Period of input clock
set dv_bre              0.000;             # Data valid before the rising clock edge
set dv_are              0.000;             # Data valid after the rising clock edge
set input_ports         <input_ports>;     # List of input ports

# Input Delay Constraint
set_input_delay -clock $input_clock -max [expr $input_clock_period - $dv_bre] [get_ports $input_ports];
set_input_delay -clock $input_clock -min $dv_are                              [get_ports $input_ports];

# Report Timing Template
# report_timing -from [get_ports $input_ports] -max_paths 20 -nworst 1 -delay_type min_max -name src_sync_cntr_rise_in  -file src_sync_cntr_rise_in.txt;		  

相信很多同學對這個不太瞭解。因爲時中心對齊,上升沿是發射沿,那麼發射數據是下一次數據突變的時刻。如下圖:
在這裏插入圖片描述
那麼min與max的關係如下:
在這裏插入圖片描述
所以:
input delay min=dv_breinput\ delay\ min =dv\_bre
input delay max=input_clock_perioddv_breinput\ delay\ max =input\_clock\_period - dv\_bre
經過上面圖文並茂的講解,如果同學們還是不太瞭解,就查找一些其他的資料再和這個對比,相信同學們肯定可以弄懂這個,關鍵就是原始定義。

源同步DDR中心對齊的Input Delay約束:

# Edge-Aligned Double Data Rate Source Synchronous Inputs 
# (Using an MMCM/PLL)
#
# For an edge-aligned Source Synchronous interface, the clock
# transition occurs at the same time as the data transitions.
# In this template, the clock is aligned with the end of the
# data. The constraints below rely on the default timing
# analysis (setup = 1/2 cycle, hold = 0 cycle).
#
# input                        ___________________________
# clock  _____________________|                           |__________
#                             |                           |                 
#                     skew_bre|skew_are           skew_bfe|skew_afe
#                     <------>|<------>           <------>|<------>
#          ___________        |        ___________                 __
# data   XX_Rise_Data_XXXXXXXXXXXXXXXXX_Fall_Data_XXXXXXXXXXXXXXXXX__
#

set input_clock         <clock_name>;      # Name of input clock
set skew_bre            0.000;             # Data invalid before the rising clock edge
set skew_are            0.000;             # Data invalid after the rising clock edge
set skew_bfe            0.000;             # Data invalid before the falling clock edge
set skew_afe            0.000;             # Data invalid after the falling clock edge
set input_ports         <input_ports>;     # List of input ports

# Input Delay Constraint
set_input_delay -clock $input_clock -max $skew_are  [get_ports $input_ports];
set_input_delay -clock $input_clock -min -$skew_bre [get_ports $input_ports];
set_input_delay -clock $input_clock -max $skew_afe  [get_ports $input_ports] -clock_fall -add_delay;
set_input_delay -clock $input_clock -min -$skew_bfe [get_ports $input_ports] -clock_fall -add_delay;

# Report Timing Template
# report_timing -rise_from [get_ports $input_ports] -max_paths 20 -nworst 1 -delay_type min_max -name src_sync_edge_ddr_in_rise -file src_sync_edge_ddr_in_rise.txt;	  
# report_timing -fall_from [get_ports $input_ports] -max_paths 20 -nworst 1 -delay_type min_max -name src_sync_edge_ddr_in_fall -file src_sync_edge_ddr_in_fall.txt; 

從下面的DDR的圖,相信大家聯想input delay的定義可以得到input delay min與input delay max值得計算。
在這裏插入圖片描述

上面我們對input delay延遲分類做了詳細論述,雖然不全,但是相信大家嚴抓定義肯定可以明白input delay得設置。

Output Delay約束

output delay得作用就是使下游器件滿足時序要求,我們在講解這個得時候需要嚴抓這個定義。 這裏與input delay一樣,系統同步與源同步其實本質上output delay min與output delay max得值是一樣的,所以我們這裏只拿源同步進行講解。

源同步output delay約束

源同步SDR上升沿對齊的Onput Delay約束

#  Rising Edge Source Synchronous Outputs 
#
#  Source synchronous output interfaces can be constrained either by the max data skew
#  relative to the generated clock or by the destination device setup/hold requirements.
#
#  Setup/Hold Case:
#  Setup and hold requirements for the destination device and board trace delays are known.
#  
# forwarded         ____                      ___________________ 
# clock                 |____________________|                   |____________ 
#                                            |
#                                     tsu    |    thd
#                                <---------->|<--------->
#                                ____________|___________
# data @ destination    XXXXXXXXX________________________XXXXX
#
# Example of creating generated clock at clock output port
# create_generated_clock -name <gen_clock_name> -multiply_by 1 -source [get_pins <source_pin>] [get_ports <output_clock_port>]
# gen_clock_name is the name of forwarded clock here. It should be used below for defining "fwclk".	

set fwclk        <clock-name>;     # forwarded clock name (generated using create_generated_clock at output clock port)        
set tsu          0.000;            # destination device setup time requirement
set thd          0.000;            # destination device hold time requirement
set trce_dly_max 0.000;            # maximum board trace delay
set trce_dly_min 0.000;            # minimum board trace delay
set output_ports <output_ports>;   # list of output ports

# Output Delay Constraints
set_output_delay -clock $fwclk -max [expr $trce_dly_max + $tsu] [get_ports $output_ports];
set_output_delay -clock $fwclk -min [expr $trce_dly_min - $thd] [get_ports $output_ports];

# Report Timing Template
# report_timing -to [get_ports $output_ports] -max_paths 20 -nworst 1 -delay_type min_max -name src_sync_pos_out -file src_sync_pos_out.txt;

這是下游器件需要滿足的建立時間與保持時間的要求:
在這裏插入圖片描述
我們在第一篇時序分析的博客中推導output delay的約束爲:
在這裏插入圖片描述
仔細觀察兩個結果其實是一樣的。當PCB佈線等長時,output delay的約束可以化簡爲:
output delay max=Tsuoutput\ delay\ max=Tsu
output delay min=Thdoutput\ delay\ min=-Thd
這進而驗證了我們前面講解的正確性。

源同步SDR下降沿對齊的Onput Delay約束

#  Falling Edge Source Synchronous Outputs 
#
#  Source synchronous output interfaces can be constrained either by the max data skew
#  relative to the generated clock or by the destination device setup/hold requirements.
#
#  Setup/Hold Case:
#  Setup and hold requirements for the destination device and board trace delays are known.
#  
# forwarded                 _________________                    _______ 
# clock                ____|                 |__________________|
#                                            |
#                                     tsu    |    thd
#                                <---------->|<--------->
#                                ____________|___________
# data @ destination    XXXXXXXXX________________________XXXXX
#
# Example of creating generated clock at clock output port
# create_generated_clock -name <gen_clock_name> -multiply_by 1 -source [get_pins <source_pin>] [get_ports <output_clock_port>]
# gen_clock_name is the name of forwarded clock here. It should be used below for defining "fwclk".	

set fwclk        <clock-name>;     # forwarded clock name (generated using create_generated_clock at output clock port)        
set tsu          0.000;            # destination device setup time requirement
set thd          0.000;            # destination device hold time requirement
set trce_dly_max 0.000;            # maximum board trace delay
set trce_dly_min 0.000;            # minimum board trace delay
set output_ports <output_ports>;   # list of output ports

# Output Delay Constraints
set_output_delay -clock $fwclk -max [expr $trce_dly_max + $tsu] [get_ports $output_ports] -clock_fall;
set_output_delay -clock $fwclk -min [expr $trce_dly_min - $thd] [get_ports $output_ports] -clock_fall;

# Report Timing Template
# report_timing -to [get_ports $output_ports] -max_paths 20 -nworst 1 -delay_type min_max -name src_sync_neg_out -file src_sync_neg_out.txt;		

下游器件需要滿足的時序要求如下:
在這裏插入圖片描述
其實與上升沿相比只是約束的時候加了 -clock_fall來標誌時下降沿觸發。

源同步DDR下降沿對齊的Onput Delay約束:

#  Double Data Rate Source Synchronous Outputs 
#
#  Source synchronous output interfaces can be constrained either by the max data skew
#  relative to the generated clock or by the destination device setup/hold requirements.
#
#  Setup/Hold Case:
#  Setup and hold requirements for the destination device and board trace delays are known.
#
# forwarded                        _________________________________
# clock                 __________|                                 |______________
#                                 |                                 |
#                           tsu_r |  thd_r                    tsu_f | thd_f
#                         <------>|<------->                <------>|<----->
#                         ________|_________                ________|_______
# data @ destination   XXX__________________XXXXXXXXXXXXXXXX________________XXXXX
#
# Example of creating generated clock at clock output port
# create_generated_clock -name <gen_clock_name> -multiply_by 1 -source [get_pins <source_pin>] [get_ports <output_clock_port>]
# gen_clock_name is the name of forwarded clock here. It should be used below for defining "fwclk".	

set fwclk        <clock-name>;     # forwarded clock name (generated using create_generated_clock at output clock port)        
set tsu_r        0.000;            # destination device setup time requirement for rising edge
set thd_r        0.000;            # destination device hold time requirement for rising edge
set tsu_f        0.000;            # destination device setup time requirement for falling edge
set thd_f        0.000;            # destination device hold time requirement for falling edge
set trce_dly_max 0.000;            # maximum board trace delay
set trce_dly_min 0.000;            # minimum board trace delay
set output_ports <output_ports>;   # list of output ports

# Output Delay Constraints
set_output_delay -clock $fwclk -max [expr $trce_dly_max + $tsu_r] [get_ports $output_ports];
set_output_delay -clock $fwclk -min [expr $trce_dly_min - $thd_r] [get_ports $output_ports];
set_output_delay -clock $fwclk -max [expr $trce_dly_max + $tsu_f] [get_ports $output_ports] -clock_fall -add_delay;
set_output_delay -clock $fwclk -min [expr $trce_dly_min - $thd_f] [get_ports $output_ports] -clock_fall -add_delay;

# Report Timing Template
# report_timing -rise_to [get_ports $output_ports] -max_paths 20 -nworst 2 -delay_type min_max -name src_sync_ddr_out_rise -file src_sync_ddr_out_rise.txt;
# report_timing -fall_to [get_ports $output_ports] -max_paths 20 -nworst 2 -delay_type min_max -name src_sync_ddr_out_fall -file src_sync_ddr_out_fall.txt;

這是下游器件要滿足的時序信息:
在這裏插入圖片描述
從這個圖形來看,其實就是我們上面兩個SDR的結合。

時序例外

爲什麼要用時序例外,什麼條件下用時序例外,上一篇博客我們已經進行了講解,這篇博客我們主要集中在原語操作中。

多週期路徑的設置

建立時間:

set_multicycle_path <num cycles> -from <startpoints> -to <endpoints>

保持時間:

set_multicycle_path -hold <num cycles> -from <startpoints> -to <endpoints>

False路徑的設置

set_false_path -from <startpoints> -to <endpoints>

VIVADO時序約束的GUI操作

首先要打開VIVADO的時序約束GUI界面,該GUI界面在綜合和佈局佈線中都有選項,對於時序分析與約束我們一般在佈局佈線之後進行操作。在這裏插入圖片描述
雙擊Edit Timing Constraints如圖:
在這裏插入圖片描述
1、時序分析操作界面
2、時序約束界面
在這裏插入圖片描述
報到特定路徑的時序。
在這裏插入圖片描述
1、設置輸入時鐘約束
2、設置生成時鐘約束
3、設置輸入延遲
4、設置輸出延遲
5、設置False路徑
6、設置多週期路徑

時鐘的約束

時鐘約束的位置如下:
在這裏插入圖片描述

輸入時鐘的約束

在這裏插入圖片描述
1、時鐘引腳的名字
2、找到時鐘的信號

生成時鐘的約束

在這裏插入圖片描述
1、創建生成時鐘的名字
2、指定生成時鐘的源時鐘
3、指定生成時鐘與源時鐘的分倍頻關係
4、指定生成時鐘信號

Input Delay約束

在這裏插入圖片描述
1、輸入數據延遲時相對於哪一個時鐘來說,這也就說明了輸入延遲,首先應該約束數據的隨路時鐘
2、輸入延遲的信號,一般時多選
3、輸入延遲值
4、延遲值是針對上升沿還是下降沿來說的
5、該延遲設置的最大還是最小值
6、DDR的下降沿的時候勾選該選項,使得上升沿與下降沿的延遲同時存在
大家根據相應的類型勾選即可,也可以把生成的約束命令與原語相互比較。

output Delay約束

在這裏插入圖片描述
1、輸出數據延遲時相對於哪一個時鐘來說,這也就說明了輸出延遲,首先應該約束數據的隨路時鐘
2、輸出延遲的信號,一般時多選
3、輸出延遲值
4、延遲值是針對上升沿還是下降沿來說的
5、該延遲設置的最大還是最小值
6、DDR的下降沿的時候勾選該選項,使得上升沿與下降沿的延遲同時存在
大家根據相應的類型勾選即可,也可以把生成的約束命令與原語相互比較。

時序例外

設置多週期路徑

在這裏插入圖片描述
1、設置多週期的個數
2、設置源時鐘
3、設置目的時鐘

設置False路徑

在這裏插入圖片描述
1、源端口(包括時鐘或者信號)
2、目的段就(包括時鐘或信號)

VIVADO時序操作策略

VIVADO、ISE、Quartus都有不同的優化策略,這些優化策略在一定程度上可以改善代碼的時序性能,這也是時序約束中的重點。

總結

接觸了FPGA已經兩年時間,直到現在纔敢說自己掌握了靜態時序分析,學習過程可以說非常坎坷,因爲當時的學習資料太少。創作不易,認爲文章有幫助的同學們可以關注、點贊、轉發支持。爲行業貢獻及其微小的一部分。或者對文章有什麼看法或者需要更近一步交流的同學,可以加入下面的羣:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章