時(shí)鐘的基礎(chǔ)知識
數(shù)字設(shè)計(jì)中,“時(shí)鐘”表示在寄存器之間可靠地傳輸數(shù)據(jù)所需的參考時(shí)間;Vivado的時(shí)序引擎利用時(shí)鐘特征來計(jì)算時(shí)序路徑需求,通過計(jì)算時(shí)間裕量(Slack)的方法報(bào)告設(shè)計(jì)的時(shí)序空余;時(shí)鐘必須被正確定義以最佳精度獲得最大的時(shí)序路徑覆蓋范圍,包含如下特性:
定義在時(shí)鐘樹的驅(qū)動管腳或端口,通常稱作根或源點(diǎn);
通過周期和波形屬性來描述時(shí)鐘邊沿;
周期(period)以ns為單位進(jìn)行設(shè)定,與波形重復(fù)率相關(guān);
波形(waveform)以列表的形式給出,表中包含上升沿和下降沿在周期中的絕對時(shí)間,以ns為單位;第一個(gè)上升沿對應(yīng)于第一個(gè)值,第一個(gè)下降沿對應(yīng)第二個(gè)值;默認(rèn)情況下,相位偏移從0ns開始,占空比為50%;
如下圖給出了兩個(gè)時(shí)鐘Clk0: period=10, waveform={0 5}、Clk1: period=8, waveform = {2 8};
上述給出的只是時(shí)鐘的理想特征。當(dāng)時(shí)鐘進(jìn)入了FPGA器件,通過時(shí)鐘樹傳遞時(shí),時(shí)鐘邊沿會有延時(shí),通常稱作時(shí)鐘網(wǎng)絡(luò)延遲;噪聲或硬件表現(xiàn)會導(dǎo)致時(shí)鐘隨時(shí)可能發(fā)生變化,通常稱作時(shí)鐘不確定性,包括時(shí)鐘抖動(Clock jitter)、相位錯(cuò)位(Phase error)等等, Vivado在時(shí)序分析時(shí)會考慮這些非理想因素以得到精確的時(shí)序裕量;
通常板子上有一個(gè)外部組件(如有源晶振)產(chǎn)生時(shí)鐘信號,通過輸入端口進(jìn)入器件內(nèi)部;外部時(shí)鐘可以通過MMCM、PLL、BUFR等特殊原語生成其它時(shí)鐘,也可以由LUT、寄存器等常規(guī)單元進(jìn)行轉(zhuǎn)換(通常稱作門控時(shí)鐘);接下來的部分將講述如何由源時(shí)鐘定義成其他類型的時(shí)鐘;
主時(shí)鐘Primary Clock
主時(shí)鐘通常由兩個(gè)來源:(1)板級時(shí)鐘通過輸入端口進(jìn)入設(shè)計(jì);(2)GT收發(fā)器的輸出管腳(如恢復(fù)時(shí)鐘);
主時(shí)鐘必須與一個(gè)網(wǎng)表對象相連,該對象代表了所有時(shí)鐘邊沿的開始點(diǎn),并且在時(shí)鐘樹中向下傳遞;也可以說,主時(shí)鐘的源點(diǎn)定義了0時(shí)刻,Vivado靠此來計(jì)算時(shí)鐘延遲和不確定性 ;vivado會忽略所有時(shí)鐘樹上從主時(shí)鐘上游的單元到主時(shí)鐘之間的延時(shí)!
主時(shí)鐘只能通過create_clock命令來定義,且必須放在約束的開始,這是因?yàn)槠渌鼤r(shí)序約束幾乎都要參考主時(shí)鐘;下面給出幾個(gè)主時(shí)鐘的例子,第一個(gè)例子如下圖所示,采用單端時(shí)鐘輸入:
板級時(shí)鐘通過sysclk端口進(jìn)入FPGA,通過一個(gè)輸入緩沖器和一個(gè)時(shí)鐘緩沖器后到達(dá)寄存器,使用如下命令定義:
create_clock -period 10 [get_ports sysclk] #10ns周期,50%占空比,無相移
create_clock -name devclk -period 10 -wavefor {2.5 5} [get_ports sysclk] #板級時(shí)鐘名稱devclk,10ns周期,25%占空比,90°相移
第二個(gè)例子,時(shí)鐘源由高速收發(fā)器gt0提供,如下圖所示:
通過sysclk端口進(jìn)入FPGA,之后經(jīng)過混合時(shí)鐘管理單元MMCM生成其他時(shí)鐘,以gt0發(fā)出的時(shí)鐘為主時(shí)鐘,其他生成時(shí)鐘都有一個(gè)共同的時(shí)鐘源,使用如下命令定義:
create_clock -name rxclk -period 3.33 [get_pins gt0/RXOUTCLK]
第三個(gè)例子如下圖所示,采用差分時(shí)鐘輸入,這也是高速時(shí)鐘的輸入方式:
上圖中差分時(shí)鐘驅(qū)動一個(gè)PLL,定義主時(shí)鐘時(shí)必須只創(chuàng)建差分緩沖器的正極輸入;如果同時(shí)創(chuàng)建了正極、負(fù)極輸入,將會導(dǎo)致錯(cuò)誤的CDC路徑;使用如下命令定義:
create_clock -name sysclk -period 3.33 [get_ports SYS_CLK_clk_p]
虛擬時(shí)鐘Virtual Clock
虛擬時(shí)鐘通常用于設(shè)定對輸入和輸出的延遲約束,之所以稱為“虛擬”,是因?yàn)檫@種時(shí)鐘在物理上沒有與設(shè)計(jì)中的任何網(wǎng)表對象相連;定義時(shí)使用create_clock命令,但無需指定源對象 ,在下列情況需要用到虛擬時(shí)鐘:
所有的設(shè)計(jì)時(shí)鐘都不是外部器件I/O的參考時(shí)鐘;
FPGA的I/O路徑與一個(gè)內(nèi)部生成的時(shí)鐘相關(guān),但是該時(shí)鐘不能合適地通過對板級時(shí)鐘計(jì)時(shí)來生成(如兩個(gè)周期的比不是整數(shù));
希望為與I/O延遲約束相關(guān)的時(shí)鐘設(shè)定不同的抖動和延遲,但是不希望修改內(nèi)部時(shí)鐘的特征 ;
比如時(shí)鐘clk_virt的周期為10ns,且不與任何網(wǎng)表對象相連,可以這樣定義“create_clock -name clk_virt –period 10”,沒有指定objects參數(shù);注意,虛擬時(shí)鐘必須在使用之前便定義好 ;
生成時(shí)鐘Generated Clock
生成時(shí)鐘是指在設(shè)計(jì)內(nèi)部由特殊單元(如MMCM、PLL)或用戶邏輯驅(qū)動的時(shí)鐘;生成時(shí)鐘與一個(gè)上級時(shí)鐘(注:官方稱作master clock,為與primary clock作區(qū)分,這里稱作上級時(shí)鐘)相關(guān),其屬性也是直接由上級時(shí)鐘派生而來;上級時(shí)鐘可以是一個(gè)主時(shí)鐘,也可以是另一個(gè)生成時(shí)鐘;
生成時(shí)鐘使用create_generated_clock命令定義,該命令不是設(shè)定周期或波形,而是描述時(shí)鐘電路如何對上級時(shí)鐘進(jìn)行轉(zhuǎn)換。這種轉(zhuǎn)換可以是下面的關(guān)系:
Vivado計(jì)算生成時(shí)鐘的延遲時(shí),會追蹤生成時(shí)鐘的源管腳與上級時(shí)鐘的源管腳之間的所有組合和時(shí)序路徑。某些情況下可能只希望考慮組合邏輯路徑,在命令行后添加-combinational選項(xiàng)即可;
這里先解釋一下本文甚至本系列大量使用的兩個(gè)詞,端口(Port)和管腳(Pin)。端口通常用get_ports命令獲取,管腳使用get_pins命令獲取。二者的含義是不同的,但管腳的范圍更廣泛,比如設(shè)計(jì)中用到的一個(gè)寄存器都有3個(gè)管腳:clk、D和Q;下面給出幾個(gè)定義生成時(shí)鐘的例子:
簡單的頻率分頻
簡單的頻率倍頻
頻率倍頻與分頻的組合,獲得一個(gè)非整數(shù)的比例,通常由MMCM或PLL完成
相移或波形反相
占空比改變
上述所有關(guān)系的組合
1.簡單的2分頻
可以采用如下兩種方法對生成時(shí)鐘進(jìn)行約束:
#定義主時(shí)鐘,周期10ns,50%占空比
create_clock -name clkin -period 10 [get_ports clkin]
#約束方法1,主時(shí)鐘作為源點(diǎn)
create_generated_clock -name clkdiv2 -source [get_ports clkin] -divide_by 2 [get_pins REGA/Q]
#約束方法2,REGA的始終管腳作為源點(diǎn)
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -divide_by 2 [get_pins REGA/Q]
約束命令中使用**-source選項(xiàng)來設(shè)定上級時(shí)鐘,但如上所示,該選項(xiàng)只能設(shè)定為一個(gè)端口或管腳類型的網(wǎng)表對象,不能直接設(shè)置為時(shí)鐘類型對象。上面約束使用-divide_by選項(xiàng)設(shè)置分頻系數(shù),此外還可以使用-edges**選項(xiàng),如下所示:
#該約束與上面等效
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -eedges {1 3 5} [get_pins REGA/Q]
#1 3 5 分別為生成時(shí)鐘一個(gè)周期的三個(gè)沿對應(yīng)master clock的上升沿的位置
-edges的參數(shù)為一個(gè)列表,該列表通過主時(shí)鐘的邊沿來描述生成時(shí)鐘的波形;列表中的值為主時(shí)鐘邊沿的序號(注意觀察上圖),由時(shí)鐘上升沿開始,定義了生成時(shí)鐘邊沿的時(shí)間點(diǎn);
2.改變占空比與相移
如果僅需要改變時(shí)鐘的相移,使用**-edge_shift**選項(xiàng)可以正向或反向設(shè)定每一個(gè)生成時(shí)鐘波形的相移量;注意,-edge_shift選項(xiàng)不能與-devide_by、-multiply_by、-invert選項(xiàng)同時(shí)使用;下圖中上級時(shí)鐘為clkin,進(jìn)入mmcm0單元,產(chǎn)生一個(gè)25%占空比、相移90°的時(shí)鐘:
可以采用如下方法對生成時(shí)鐘進(jìn)行約束:使用上級時(shí)鐘的1、2、3標(biāo)號邊沿(即0ns、5ns、10ns)定義生成時(shí)鐘,為了得到預(yù)期波形,1和3標(biāo)號邊沿要分別移動2.5ns,得到2.5ns、5ns、12.5ns的波形:
#定義主時(shí)鐘,周期10ns,50%占空比
create_clock -name clkin -period 10 [get_ports clkin]
#定義生成時(shí)鐘,周期10ns,25%占空比,90°相移
create_generated_clock -name clkshift -source [get_pins mmcm0/CLKIN] -edges {1 2 3}
-edge_shift {2.5 0 2.5} [get_pins mmcm0/CLKOUT]
3.同時(shí)倍頻與分頻
這種情況通常用于定義MMCM或PLL的輸出,一般使用這些IP核時(shí)會自動創(chuàng)建相應(yīng)約束;考慮上例中的圖,假設(shè)MMCM將上級時(shí)鐘倍頻到4/3倍,無法直接倍頻,需要同時(shí)使用-divede_by和-multiply_by選項(xiàng)來實(shí)現(xiàn):
create_generated_clock -name clk43 -source [get_pins mmcm0/CLKIN] -multiply_by 4
-divide_by 3 [get_pins mmcm0/CLKOUT]
4.僅通過組合路徑追蹤上級時(shí)鐘
前面簡單介紹了-combinational選項(xiàng)的使用,為了更好理解,這里舉一個(gè)具體例子;下圖中,上級時(shí)鐘同時(shí)傳遞到寄存器和多路選擇器中,寄存器對時(shí)鐘進(jìn)行2分頻,多路選擇器從寄存器的2分頻時(shí)鐘和上級時(shí)鐘中選擇一個(gè)作為生成時(shí)鐘輸出 :
顯而易見,從上級時(shí)鐘到生成時(shí)鐘有兩條路徑,一條為時(shí)序路徑,一條為組合路徑;如果我們只希望考慮組合路徑上的延遲時(shí),定義生成時(shí)鐘時(shí)就需要使用-combinational選項(xiàng) :
create_generated_clock -name clkout -source [get_pins mmcm0/CLKIN] -combinational
[get_pins MUX/O]
自動生成時(shí)鐘 Automatically Derived Clocks
這種類型時(shí)鐘算是生成時(shí)鐘的一種特例,“自動”是指在已經(jīng)定義了上級時(shí)鐘的情況下,Vivado會自動為時(shí)鐘管理單元CMBs(Clock Modifying Blocks)的輸出管腳創(chuàng)建約束,官方稱作Automatically Derived Clocks或Auto-generated Clock;
如果約束中已經(jīng)存在用戶在某一網(wǎng)表對象上定義的時(shí)鐘,則不會創(chuàng)建相同對象上的自動生成時(shí)鐘;
下面給出一個(gè)具體例子,下圖中上級時(shí)鐘clkin驅(qū)動clkip/mmcm0單元的CLKIN輸入,該單元是一個(gè)MMCME2資源的實(shí)例,則自動生成時(shí)鐘的定義源點(diǎn)為clkip/mmcm0/CLKOUT,頂層與此源點(diǎn)連接的網(wǎng)絡(luò)名為clkip/cpuClk,自動生成時(shí)鐘的名字便是cpuClk:
如上所述,Vivado會自動創(chuàng)建自動生成時(shí)鐘的名稱(Name),如果兩個(gè)名稱發(fā)生沖突也會自動添加后綴,如usrclk、usrclk_1等等;
時(shí)鐘組Clock Group
默認(rèn)情況下,Vivado會測量設(shè)計(jì)中所有時(shí)鐘之間的路徑時(shí)序,添加如下兩種約束可以控制該功能:
劃分時(shí)鐘組通常有兩個(gè)依據(jù):
(1)原理圖或時(shí)鐘網(wǎng)絡(luò)報(bào)告中的時(shí)鐘樹拓?fù)鋱D,判斷哪些時(shí)鐘不應(yīng)該放在一起做時(shí)序分析;
(2)時(shí)鐘交互報(bào)告查看兩個(gè)時(shí)鐘間存在的約束,判斷它們是否有共享的主時(shí)鐘(代表是否有已知的相位關(guān)系)或者是否有公共周期 ;
但要明白,我們設(shè)定時(shí)鐘組的目的還是為了保證設(shè)計(jì)在硬件中能正常工作,因此我們必須確保這些忽略了時(shí)序分析的路徑有合適的再同步電路或異步數(shù)據(jù)傳輸協(xié)議;
set_clock_groups:建立時(shí)鐘組,Vivado不會對不同時(shí)鐘組的時(shí)鐘之間進(jìn)行時(shí)序分析;
set_false_path:將兩個(gè)時(shí)鐘之間的路徑設(shè)置為false path后,不會對該路徑進(jìn)行任何時(shí)序分析;
根據(jù)時(shí)鐘間的關(guān)系,可以做如下分類:
同步時(shí)鐘:即兩個(gè)時(shí)鐘間有可預(yù)知的相對相位,通常它們的時(shí)鐘樹源自網(wǎng)表中的同一個(gè)根,且有一個(gè)公共周期;
異步時(shí)鐘:兩個(gè)時(shí)鐘間有無法預(yù)知的相對相位。比如兩個(gè)獨(dú)立的晶振信號通過兩個(gè)輸入端口進(jìn)入FPGA中,生成兩個(gè)時(shí)鐘。由于兩個(gè)主時(shí)鐘沒有明確的相位關(guān)系,兩個(gè)生成時(shí)鐘間便是異步的;
不可擴(kuò)展時(shí)鐘:官方稱作Unexpandable Clocks,是指時(shí)序引擎在1000個(gè)周期內(nèi)無法判斷兩個(gè)時(shí)鐘是否有公共周期。這種情況通常發(fā)生在兩個(gè)時(shí)鐘周期比是一個(gè)特殊的分?jǐn)?shù),比如一個(gè)主時(shí)鐘通過MMCM生成一個(gè)周期為5.125ns的時(shí)鐘clk1和一個(gè)周期為6.666ns的時(shí)鐘clk2,盡管它們在時(shí)鐘樹的根上有一個(gè)確定的相位關(guān)系,但是在1000個(gè)周期內(nèi)時(shí)鐘上升沿?zé)o法再次對齊;
1.異步時(shí)鐘組
同步時(shí)鐘可以安全地進(jìn)行時(shí)序分析,異步時(shí)鐘和不可擴(kuò)展時(shí)鐘雖然通過時(shí)序分析也會得到一個(gè)裕量值,但這個(gè)值不可作為可靠結(jié)果;從這個(gè)角度出發(fā),不可擴(kuò)展時(shí)鐘也可以視作一種特殊的異步時(shí)鐘;這就需要通過設(shè)置時(shí)鐘組來忽略異步時(shí)鐘的時(shí)序路徑上的時(shí)序分析 ;
這里舉個(gè)例子,一個(gè)主時(shí)鐘clk0通過MMCM生成兩個(gè)時(shí)鐘usrclk和itfclk;另一個(gè)主時(shí)鐘clk1通過另一個(gè)MMCM生成兩個(gè)時(shí)鐘clkrx和clktx,用如下命令創(chuàng)建異步時(shí)鐘組:
set_clock_groups -name async_clk0_clk1 -asynchronous -group {clk0 usrclk itfclk}
-group {clk1 gtclkrx gtclktx}
#如果時(shí)鐘名稱事先不知道,可以用如下寫法
set_clock_groups -name async_clk0_clk1 -asynchronous -group [get_clocks -include_generated_clocks clk0] -group [get_clocks -include_generated_clocks clk1]
2.互斥時(shí)鐘組 Exclusive Clock Groups
下面再介紹另一種會用到時(shí)鐘組的情況:某些設(shè)計(jì)會有幾個(gè)操作模式,不同操作模式使用不同的時(shí)鐘,這些時(shí)鐘通常由專用的時(shí)鐘選擇器進(jìn)行選擇,如BUFGMUX和BUFGCTRL,最好不要用LUT作時(shí)鐘選擇器;
這些單元都是組合邏輯單元,Vivado會將所有輸入傳遞到輸出;在Vivado IDE中,幾個(gè)時(shí)序時(shí)鐘可以同時(shí)存在時(shí)鐘樹上,方便地同時(shí)報(bào)告所有操作模式,但是在硬件中這是不可能的,它們之間是互斥的,這些時(shí)鐘便稱作互斥時(shí)鐘;
舉個(gè)例子,一個(gè)MMCM實(shí)例生成的兩個(gè)時(shí)鐘clk0和clk1,與一BUFGMUX實(shí)例clkmux相連,clkmux的輸出驅(qū)動設(shè)計(jì)時(shí)鐘樹;默認(rèn)情況下,雖然clk0和clk1共享同一時(shí)鐘樹,且不能同時(shí)存在,Vivado還是會分析clk0和clk1之間的路徑,這個(gè)問題要通過設(shè)置互斥時(shí)鐘組來解決,達(dá)到禁止分析這兩個(gè)時(shí)鐘間路徑 的目的。約束如下:
set_clock_groups -name exclusive_clk0_clk1 -physically_exclusive
-group clk0 -group clk1
在ASIC工藝中使用-physically_exclusive和-logically_exclusive代表不同的信號完整性分析模式,但對于Xilinx FPGA而言,二者是等價(jià)的,都可以使用;
時(shí)鐘延遲、抖動與不確定性
本文的上述約束可以說都是對時(shí)鐘的理想特征進(jìn)行約束,為了更精確地進(jìn)行時(shí)序分析,設(shè)計(jì)者還必須設(shè)定一些與運(yùn)行環(huán)境相關(guān)的可預(yù)測變量和隨機(jī)變量,這部分也稱作時(shí)鐘的不確定性特征;
1.時(shí)鐘延遲latency
經(jīng)過板子上和FPGA器件內(nèi)部的傳輸,時(shí)鐘邊沿到達(dá)目的地后會有一個(gè)確定的延遲,這個(gè)延遲可以分為兩個(gè)部分看待:
網(wǎng)絡(luò)延遲:也稱作插入延遲,指在FPGA內(nèi)部傳輸帶來的延遲;Vivado會自動分析計(jì)算該延遲,布線過程前只是一個(gè)粗略的估計(jì),布線后便可以得到一個(gè)精確的值;對于生成時(shí)鐘,包含其本身的網(wǎng)絡(luò)延遲和上級時(shí)鐘的網(wǎng)絡(luò)延遲兩部分;
源端延遲:通常指FPGA器件外,時(shí)鐘進(jìn)入源點(diǎn)前的傳輸延遲,這部分延遲與PCB設(shè)計(jì)相關(guān),需要用set_clock_latency命令進(jìn)行約束;
下面給出一個(gè)約束源端時(shí)鐘延遲的例子:
# Minimum source latency value for clock sysClk (for both Slow and Fast corners)
set_clock_latency -source -early 0.2 [get_clocks sysClk]
# Maximum source latency value for clock sysClk (for both Slow and Fast corners)
set_clock_latency -source -late 0.5 [get_clocks sysClk]
2.時(shí)鐘抖動jitter
對于ASIC器件來說,時(shí)鐘抖動通常代表了時(shí)鐘不確定性特征;但對于Xilinx FPGA而言,抖動屬性被當(dāng)作可預(yù)測變量看待;抖動有的需要單獨(dú)設(shè)置,有的在時(shí)序分析過程中自動計(jì)算,抖動分為兩種:
輸入抖動:指實(shí)際時(shí)鐘邊沿與理想時(shí)鐘邊沿到達(dá)時(shí)刻之間的差值,使用set_iput_jitter命令為每個(gè)主時(shí)鐘單獨(dú)設(shè)置輸入抖動;但是不能直接為生成時(shí)鐘設(shè)置輸入抖動,這部分由工具自動計(jì)算,如果(1).生成時(shí)鐘由一個(gè)組合或時(shí)序單元創(chuàng)建,生成時(shí)鐘的抖動與上級時(shí)鐘相同;(2).生成時(shí)鐘由 MMCM或PLL驅(qū)動,生成時(shí)鐘的抖動為一個(gè)自動計(jì)算的值;
系統(tǒng)抖動:指電源噪聲、板級噪聲或其它原因引起的整體的抖動,對于整個(gè)設(shè)計(jì),使用set_system_jitter命令設(shè)置一個(gè)值即可,會應(yīng)用到所有時(shí)鐘;
下面給出一個(gè)約束輸入抖動的例子:
#主時(shí)鐘傳輸過程中有±100ps的抖動
set_input_jitter [get_clocks -of_objects [get_clocks sysclk]] 0.1
不過,時(shí)鐘抖動對整個(gè)時(shí)鐘不確定性計(jì)算的影響不是太大。計(jì)算時(shí)鐘不確定性時(shí)對每條路徑都是獨(dú)立的,且主要依賴于時(shí)鐘拓?fù)浣Y(jié)構(gòu)、路徑上的時(shí)鐘對、時(shí)鐘樹上是否存在MMCM/PLL單元等其它因素;
3.附加的時(shí)鐘不確定性 Additional Clock Uncertainty
使用set_clock_uncertainty命令可以根據(jù)需要為特定的時(shí)鐘關(guān)系定義附加的時(shí)鐘不確定性,這樣在時(shí)序分析時(shí),可以為設(shè)計(jì)中的某些部分增加額外裕量
看下面的例子:
set_clock_uncertainty 2.0 -from [get_clocks clk1] -to [get_clocks clk2]
set_clock_uncertainty 1.0 [get_clocks clk1]
這里首先約束從clk1到clk2有一個(gè)2ns的時(shí)鐘不確定性,接著又約束clk1有1ns的時(shí)鐘不確定性,但是后面這條約束不會改動從clk1到clk2之間的關(guān)系;同時(shí),要注意clk1到clk2有時(shí)鐘間的不確定性,clk2到clk1也有時(shí)鐘間的不確定性,所以要約束完整!
審核編輯 :李倩
原文標(biāo)題:Vivado使用技巧時(shí)鐘的約束方法
文章出處:【微信公眾號:FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
波形
+關(guān)注
關(guān)注
3文章
379瀏覽量
31592 -
Vivado
+關(guān)注
關(guān)注
19文章
812瀏覽量
66645
原文標(biāo)題:Vivado使用技巧時(shí)鐘的約束方法
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論