1. 程式人生 > >verilog語法學習心得(轉載)

verilog語法學習心得(轉載)

verilog語法學習心得

1.數位電路基礎知識: 布林代數、門級電路的內部電晶體結構、組合邏輯電路分析與設計、觸發器、時序邏輯電路分析與設計

2.數字系統的構成: 感測器  AD  數字處理器  DA  執行部件

3.程式通在硬體上的執行過程:
     C語言(經過編譯)-->該處理器的機器語言(放入儲存器)-->按時鐘的節拍,逐條取出指令、分析指令、執行指令

4.DSP處理是個廣泛概念,統指在數字系統中做的變換(DFT)、濾波、編碼解碼、加密解密、壓縮解壓等處理

5.數字處理器包括兩部分:高速資料通道介面邏輯、高速演算法電路邏輯

6.當前,IC產業包括IC製造和IC設計兩部分,IC設計技術發展速度高於IC設計

7.FPGA設計的前續課程:數值分析、DSP、C語言、演算法與資料結構、數位電路、HDL語言 計算機微體系結構

8.數字處理器處理效能的提高:軟體演算法的優化、微體系結構的優化

9.數字系統的實現方式:
     編寫C程式,然後用編譯工具得到通用微處理器的機器指令程式碼,在通用微處理器上執行(如8051/ARM/PENTUIM)
     專用DSP硬體處理器
     用FPGA硬體邏輯實現演算法,但效能不如ASIC
     用ASIC實現,經費充足、大批量的情況下使用,因為投片成本高、週期長

10.FPGA設計方法: IP核重用、並行設計、層次化模組化設計、top-down思想
   FPGA設計分工:前端邏輯設計、後端電路實現、模擬驗證

11.matlab的應用:
     matlab中有許多現成的數學函式可以利用,節省了複雜函式的編寫時間
     matlab可以與C程式介面
     做演算法模擬和驗證時能很快生成有用的資料檔案和表格
     DSP builder可以直接將simulink模型轉換成HDL程式碼,跳過了中間的C語言改寫步驟

12.常規從演算法到硬體電路的開發過程:
     演算法的開發
     C語言的功能描述
     並行結構的C語言改寫
     verilog的改寫
     模擬、驗證、修正
     綜合、佈局佈線、投入實用

13.C語言改寫成verilog程式碼的困難點:
     並行C語言的改寫,因為C本身是順序執行,而不是並行執行
     不使用C語言中的複雜資料結構,如指標
     目前有將C語言轉換成verilog的工具?

14.HDL
     HDL描述方法是從電路圖描述方法演化來的,相比來說更容易修改
     符合IEEE標準的有verilog HDL和VHDL
     VHDL由美國國防部開發,有1987和1993兩個版本
     verilog由cadence持有,有1995、2001、2005三個版本
     verilog較VHDL更有前景:具有類比電路描述能力、不僅可以開發電路還可以驗證電路、門級以下描述比VHDL強
     RTL級和門級的綜合已經成熟,主要是注意行為級的綜合結果,使用可綜合的程式設計風格
     SYSTEM VERILOG是VERILOG的一種延伸

15.IP核的應用:
     軟核soft core: 功能經過驗證的、可綜合的、實現後門數在5K以上的HDL程式碼
     固核firm core: 功能經過驗證的、可綜合的、實現後門數在5K以上的電路結構編碼檔案,如edif,不可更改
     硬核hard core:  功能經過驗證的、可綜合的、實現後門數在5K以上的電路結構版圖,已帶工藝引數,不可更改

16.HDL語言綜合後得到EDIF,這是一種標準電路網表
   EDIF經過具體工藝庫匹配、佈局佈線、延時計算後得到網表
   EDIF不可更改,作為固核存在

17.verilog特點:
     區分大小寫,所有關鍵字都要求小寫
     不是強型別語言,不同型別資料之間可以賦值和運算
     //是單行註釋  可以跨行註釋
     描述風格有系統級描述、行為級描述、RTL級描述、門級描述,其中RTL級和門級別與具體電路結構有關,行為級描述要遵守可綜合原則
     門級描述使用門級模型或者使用者自定義模型UDP來代替具體基本元件,在IDE中針對不同FPGA器件已經有對應的基本元件原語
   
18.verlog語法要點:
     module endmodule之間由兩部分構成:介面描述和邏輯功能描述
     IO埠種類: input  output  inout
     相同位寬的輸入輸出訊號可以一起宣告, input[3:0] a,b; 不同位寬的必須分開寫
     內部訊號為reg型別,內部訊號訊號的狀態: 0  1  x   z,  3'bx1=3'bxx1 x/z會往左擴充套件  3'b1=3'b001 數字不往左擴充套件
     邏輯功能描述中常用assign描述組合邏輯電路,always既可以描述組合邏輯電路又可以描述時序邏輯電路,還可以用元件呼叫方法描述邏輯功能
     always之間、assign之間、例項引用之間以及它們之間都是並行執行,always內部是順序執行
     常量格式: <+/-><二進位制位寬><'><進位制><該進位制的數值>:
          預設進製為10進位制
          預設位寬為32位
          位寬是從二進位制寬度角度而言的
          由位寬決定從低位擷取二進位制數2'hFF=2'b11,通常由被賦值的reg變數位寬決定
     parameter常用於定義延遲和變數位寬,可用常量或常量表達式定義
     變數種類: wire reg  memory
          IO訊號預設為wire型別,除非指定為reg型別
          wire可以用作任何輸入輸出埠
          wire包括input output inout
          wire不帶寄存功能
          assign賦值語句中,被賦值的訊號都是wire型別
          assign之所以稱為連續賦值,是因為不斷檢測表示式的變化
          reg型別可以被賦值後再使用,而不是向wire一樣只能輸出,類似VHDL中的buffer埠
          reg型別變數初始值為x (VHDL中初始值為本型別最小值,通常是0)
          always模組裡被賦值的訊號都必須定義為reg型別,因為always可以反覆執行,而reg表示訊號的寄存,可以保留上次執行的值
          reg型別變數與integer變數不同,即使賦負值,實質上也是按二進位制無符號數儲存的,integer是有符號數
          verilog中所有內部訊號都是靜態變數,因為它們的值都在reg中儲存起來了
          memory型只有一維陣列,由reg型變數組成
          memory初始化只能按地址賦值,不能一次性賦值
          1*256的memory寫法: reg mema[255:0]     mema[3]=0;
          不同位寬的變數之間賦值,處理之前都以被賦值的變數位寬為準擴充套件或擷取
          A[a:b] 無論a b誰大,a總是實際電路的訊號高位,b總是實際電路的訊號低位
          算術運算中如果有X值則結果為X
          for迴圈中的變數另外定義成integer,因為它不是實際訊號,有正負;reg則以無符號數存在
     == 和!=只比較0、1,遇到z或x時結果都為x (x在if中算做假條件),結果可能是1、0、x
     ===和!==比較更加苛刻,包括x和z的精確比較,結果可能是0、1
     &&的結果只有1'b1或1'b0兩種, A&A的結果位寬則是與A相同的
     {1,0}為 64'h100000000,所以拼接運算中各訊號一定要指定位寬
     移位運算左移將保留 4'b1000<<1等於5'b10000,右移則捨棄 4'b0011等於4'b0001
     數字電路里位運算應用普遍,包括按位邏輯運算、移位運算、拼接運算、縮減運算
   
     非阻塞式賦值<=與阻塞式賦值=
         阻塞:在同一個always過程中,後面的賦值語句要等待前一個賦值語句執行完,後面的語句被該賦值語句阻塞
         非阻塞:在同一個always過程中,非阻塞賦值語句是同時進行的,排在後面的語句不會被該賦值語句阻塞
         <=:
             塊結束後才能完成賦值
             塊內所有<=語句在always塊結束時刻同時賦值
             <=右邊各變數的值是上一次時鐘邊沿時,這些變數當時的值
             用於描述可綜合的時序電路
         =:
             =語句結束之後過程always才可能結束
             在always過程中,begin end塊內按先後順序立即賦值,在fork join內同時賦值(可能造成衝突)
             與assign連用描述組合電路
             begin end中阻塞的含義:begin  [email protected](A) B=C...;  end   如果A事件不發生則永遠不能執行下去,被阻塞了
         由於時鐘的延時(往往在ps級),多個always(posedge)之間究竟誰先執行是個未知數
         使用原則:同一個always過程塊內建立時序電路用<=
                    純組合邏輯電路用=,生成的電路結構最簡單,執行速度最快
                    同一個always塊內不要混用<=和=
                    不要在多個always塊內對同一個變數賦值(多源驅動)
      
     if else的三種形式,第三種形式適合描述優先編碼器
     if條件中0/x/z當成假,1當成真,非0的數值也當成真
     case語句的三種: case(四種狀態的比較)  casez(忽略z)  casex(忽略x和z,只看哪些位的訊號有用)
     case語句中所有表示式值的位寬必須相等,default中不能將n'bx用'bx代替
     避免生成鎖存器的方法: 電平觸發時if後加else   case中加default    ?
     使用casex會將不必要的狀態視為無關項,使得綜合出來的電路最簡單
     兩種特殊的括號: begin 順序語句... end     fork 並行語句... join,其差別在於塊內語句的起止時間、執行順序、相對延時
  
     塊被命名後,其內部變數可以被呼叫,因為變數都是靜態的(呼叫訊號:對應電路中的一個訊號線被引到另一處)
  
     initial塊只無條件執行一次  always塊在滿足條件時不斷執行
     initial常用來寫測試檔案, always塊常用來寫電路描述
     always既可以描述組合邏輯電路又可以描述時序邏輯電路
     always如果後面有敏感訊號列表則不能用wait語句
     always既可以描述電平觸發又可以描述邊沿觸發,wait只能描述電平觸發
     assign常用於描述組合邏輯電路
     測試檔案中一般都是現initial 後always
 
     生成語句:生成快的本質是使用迴圈內的一條語句代替多條重複的verilog語句,簡化了使用者的程式設計
               genvar用於宣告生成變數,生成變數只能用在生成快之間
               模擬時,模擬器會將生成塊中的程式碼展平,在確立後的方針程式碼中,生成變數是不存在的
               最好是先想象出來迴圈生成語句被展平後的電路樣子,再寫相關的描述語句

     task和function的區別:
               task可以定義自己的模擬時間單位,function與主模組共用同一個模擬時間單位
               函式不能啟動任務,任務能夠啟動函式
               函式至少要有一個輸入變數,任務沒有輸入變數
               函式返回一個值,任務不返回值
  
     一個模組的設計包括3個部分: 電路模組的設計  測試模組的設計  設計文件的編寫
     設計者通過佈局佈線工具生成具有佈線延遲的電路,再進行後模擬,得到時序分析報告
     從時序分析報告中可以知道電路的實際延遲t,同步電路內每個時鐘週期要大於t,從而可確定該運算邏輯的最高頻率
     綜合器之所以能夠實現加法器、乘法器是因為庫中已經存在可配置的引數化器件模型
     FPGA內匯流排寬度容易自定義,以便實現高速資料流,三態資料匯流排相當於資料流的控制閥門
     數字系統內資料流的控制: 開關(或三態資料匯流排)、資料暫存部件(暫存器)、 同步狀態機控制(整個系統在一個時鐘域內)
  
     流水線操作pipe line:
         K級流水線就是從組合邏輯的輸入到輸出恰好有K個暫存器組,上一級的輸出是下一級的輸入
         流水線操作獲得第一個結果的時間要比不用流水線操作的時間長,但以後結果獲得時間都只需要一個時鐘週期,提高了資料吞吐量
         流水線操作的保證:Tclk>K*(組合邏輯延遲+觸發器的建立保持時間/觸發時間),即時間片段要長於最大路徑延遲
         體現了面積換速度的思想,在綜合時考慮的是以面積小為主還是以速度為主
         本質上是一種同步邏輯
  
     同步時序邏輯和非同步時序邏輯:
         同步時序邏輯指所有暫存器組由唯一時鐘觸發   [email protected](posedge clk)  或[email protected](negedage clk)
         非同步時序邏輯指觸發條件不唯一,任意一個條件都會引起觸發  [email protected](posedge clk or posedage reset)
         目前的綜合器是以同步時序邏輯綜合的,因為同步時序邏輯較非同步時序邏輯可靠
         嚴格的同步要求時鐘訊號傳遞速度遠遠大於各部分的延遲,實際中clk要單獨用線,而不要經過反相器等部件
         always @(posedge.. )  begin ...<=... end  表示同步時序邏輯(同時刻賦值)
         不同速率資料介面的處理方法(非同步資料的處理方法):幀同步    FIFO  雙埠RAM
  
     同步狀態機:
         包括moore和mealy型兩種,及其反饋模型(是一種反饋控制系統,當前狀態就是其內部狀態變數)
         狀態機的開發步驟:
             根據實際問題列出輸入輸出變數和狀態數
             畫出狀態圖並化簡
             寫出狀態轉移真值表得到邏輯表示式
             用D觸發器或JK觸發器構建電路(目前用D觸發器多)
         verilog描述時只需要得到簡化的狀態圖就可以描述
         狀態編碼方式: 獨熱碼   格雷碼
         狀態機主體程式有單always描述方式和多always描述方式
         採用case/casez/casex建立模型最好,因為x是無關態,生成的電路最簡單
         default: state='bx與實際情況更一致,效果等同於 default: state<=idle
         只有同步狀態機才能被目前的綜合


for語句會將所有變數的情況展開,佔用巨量邏輯資源,替代辦法是用計數器和case語句說明所有情況
有優先順序的if else結構會消耗更多資源,建議用無優先順序的case替代
模組的複用往往比程式碼上修改節省的資源多
PLL的分頻、倍頻、移相操作會增加設計精度
同步時序電路的延時:#x通常用於模擬測試,實際硬體延時是:長延遲用計數器,小延遲用D觸發器,此方法用來取代延遲鏈
同步電路中,穩定的資料採用必須滿足取樣暫存器的建立和保持時間
reg型別在always中不一定綜合成時序電路,也可能是組合邏輯電路
乒乓操作與作用  非同步時鐘域同步問題
延遲包括門延遲和線延遲
組合邏輯產生的時鐘僅能應用在時鐘頻率較低、精度要求不高的情況下
增減敏感訊號得到的結果一樣

補充部分:

verilog HDL起初是作為寫testbench而產生的
verilog 有1995進入IEEE標準,為IEEE-1364, 於2001年進行了擴充套件,為IEEE 1364-2001;
verilog AMS可用於類比電路和數位電路的綜合,目前正在不斷髮展和完善中;

verilog的識別符號區分大小寫,關鍵字使用小寫;
用//來進行單行註釋,用/* */來進行跨行註釋;
識別符號由字母、數字、下劃線構成,並以字母開頭;
關鍵字又叫保留字,只有小寫的關鍵字才是保留字;

訊號的狀態有4種: 0 1 x z
x和z在描述電路時不區分大小寫,在模擬時大小寫有不同意義;

常量表達式中:
x z不區分大小寫;
進位制符號h o d b與H O D B不區分大小寫;
十六進位制中a~f不區分大小寫;
下劃線_用於提高可讀性;
?在數中可以代替z;
x和z的左端補位;

字元和字串都以ASICII碼形式存在,也可以當成電路內的訊號;
字串必須包含在同一行,不能分成多行書寫;
如果表示式或者賦值語句中將字串當成運算元,則字串中的每個字元都被看成8位的ASCII值序列;

可綜合的訊號型別:wire reg memory 它們用來描述數位電路
不可綜合的資料型別:integer real 它們只用模擬,位於testbench中

wire是連線的抽象模型,不能儲存資料,其值由驅動元的值決定;
wire不能用在always或initial塊中;
wire的預設值為高阻z;
wire的使用情形: 1.作為模組的輸出埠  2.用連續賦值語句assign賦值;
reg是1位暫存器(觸發器)的抽象模型,可以儲存資料;
reg必須用在always或initial塊中;
reg的預設值為x;
reg的使用情形:1.阻塞賦值<= 2.非阻塞賦值=
memory只能是一維的;
memory只能對每個單元分別初始化,方法:1.一個一個賦值  2. 通過系統任務$readmem賦值
reg[3:0] fc;//一個4位暫存器   reg fc[3:0]  //4個一位暫存器

parameter的作用:模擬開始以前對其進行賦值,整個模擬過程中保持其值不變;

關係運算符將以邏輯1或邏輯0返回比較的結果;
== !=的返回值有0 1 x三種情況,=== !==的返回值只有0 1兩種情況;

verilog由於是描述電路的,用於位的操作較多,有: 位邏輯操作,移位操作,並置操作,歸約操作;
位邏輯運算的結果中,位數與原運算元一樣多;
歸約符是在原運算元的所有位上進行操作,併產生1位結果;
並置運算可以發生在bit與bit之間 bit與向量之間 向量與向量之間

用於模擬的系統任務:
所有系統任務都必須在initial或always內;
所有系統任務都必須以$開頭;
常見系統任務:
  顯示任務($diplay系列和$write系列)
  監控任務($monitor系列)
  探測任務($strobe系列)
  檔案開啟、輸入、關閉任務(&fopen &fclose &fdisplay...)
  讀取檔案任務($readmemb $readmemh)
  模擬結束控制任務($finish  $stop)
  隨即訊號任務($random)

過程塊: initial塊和always塊
一個module內可以包含多個initial或always模組;
所有initial或always塊在0時刻開始並行執行,各initial或always塊內部順序執行;
initial過程塊主要是面向testbench的,通常不具有可綜合性;
always過程塊在描述電路時既可以描述組合邏輯電路(電平敏感)又可以描述時序邏輯電路(邊沿敏感);
寫testbench時initial通常用於初始化以及順序波形的描述,always通常用於重複波形的描述;

任務task與函式function: 為了描述模組中被多次執行的部分以及為了增強程式碼的易讀性
verilog中的高階程式語句如for迴圈語句只用在寫testbench中;
begin end和fork join是兩種特殊的括號
if語句的第三種形式適合描述優先編碼器,case語句適合描述資料選擇器和狀態機;

case的條件表示式如果與分支項表示式長度不同,則在比較前將所有表示式都統一為這些表示式的最長長度;
casez忽略z,casex忽略z和x;

assign語句只在右端表示式發生變化時才重新計算並重新賦值,其餘時間都是連續賦值;
assign語句可以指定bit、vector或是任意拼接操作的結果;
assign語句是連續賦值的,用於驅動網線wire, reg型別不需要連續賦值,reg型別一旦被賦值就會一直儲存;

過程賦值語句有兩種:阻塞式=和非阻塞式<=,只能在過程塊initial和always中使用;
@對事件觸發的控制與wait語句不能同時使用;

相關推薦

verilog語法學習心得轉載

verilog語法學習心得 1.數位電路基礎知識: 布林代數、門級電路的內部電晶體結構、組合邏輯電路分析與設計、觸發器、時序邏輯電路分析與設計 2.數字系統的構成: 感測器  AD  數字處理器  DA  執行部件 3.程式通在硬體上的執行過程:     C語言(經過編譯)

Lucene.Net學習心得轉載

http://kb.cnblogs.com/page/52642/ 一、Lucene點滴    (發音為['lusen]),我經常就讀鹿神,是頭活蹦亂跳的好鹿,研究它吧,保證感覺它很神!Lucene是一個非常優秀的開源的全文搜尋引擎,我們可以在它的上面開發出各種全文搜尋的應用來。Lucene在國外有很

Android學習心得13 --- Android代碼混淆1

簽名 ref nes 三分 pen key this tool prop 我在博客上發表一些我的Android學習心得,希望對大家能有幫助。 這一篇我們講述一下最新的ADT環境下怎樣進行Android混淆 在新版本號的ADT創建項目時。混碼的文

機器學習算法基礎概念學習總結轉載

原則 不清楚 tof 條件 cnblogs 偽代碼 相關關系 什麽 最近鄰   來源:lantian0802的專欄   blog.csdn.net/lantian0802/article/details/38333479      一、基礎概念        

JavaScript核心語法學習部分

arr 棧操作 push 自動 bsp () 聲明 scrip 傳遞 arr.sort():默認安字符串升序排列; 自定義排序:2步:首先定義比較器函數!其次將比較器函數傳遞給sort方法! 什麽是比較器?定義任意兩值比較策略的方法 js中方法也是一個比較器,方法名就是指向

Java學習計劃轉載

建立 轉載 java編程思想 背景 自己 告訴 清晰 入行 距離 第一部分 在搭建SSM的過程中,可能會經常接觸到一個叫maven的工具。這個工具也是你以後工作當中幾乎是必須要使用的工具,所以你在搭建SSM的過程中,也可以順便了解一下maven的知識。在你目前這個階段,你只

C++學習心得

eof gpo pre typeid 學習 div ctrl+z c++ str 2018-01-20 while (cin >> n)//終止可以使用輸入eof或Ctrl+Z for (auto &c : str) cout <

《安全運維工程師成長手冊》學習筆記轉載

tps 成長 要掌握 黑客 行業 安全行業 工作 屬於 接口 前言 (0)“識人面相” 明確自身位置、技術能力、以及希望達到的高度。物以類聚,人以群分;選對團隊,跟準人,才能在這”惡劣”的環境中生存下去。 這一部分的內容是從黃登老師的自身經歷出發,先介紹了他的職業生涯,

Android學習心得

1、活動類處理啟動與關閉活動的相關方法及說明 方法 說明 StartActivity(intent) 使用引數意圖啟動新活動,此方法是重寫Context類實現的原始版本 startA

vuex 2.0學習心得--- getter

vuex2.0基本使用(3) --- getter   1. Getter 就是把元件中共有的對state的操作進行了提取,它就相當於對state的computed.所以它會獲得state作為第一個引數。 2. 有的元件中獲取到 store中的state,&nb

vuex 2.0學習心得 mutation&action

Vuex (vue2.0) 基礎mutation&action(理解) Vuex採用和Redux類似的單向資料流的方式來管理資料。使用者介面負責觸發動作(Action)進而改變對應狀態(State),從而反映到檢視(View)上。如下圖所示:   完整的Vuex用

vuex 2.0學習心得

Vuex (vue2.0) 基礎(理解) 相關詞彙認識 1.      devtools 工具 2.      backbend API後臺資料介面文件 3.&nb

大資料學習路線轉載

學習路線文章 哎,都是淚!!! 一、大資料技術基礎 1、linux操作基礎 linux系統簡介與安裝 linux常用命令–檔案操作 linux常用命令–使用者管理與許可權 linux常用命令–系統管理 linux常用命令–免密登陸配置與網路管理 linux上常用軟體安裝 linux本地yum源配置及yum

Android學習心得

Android儲存方式 儲存偏好設定 持久化資料:使應用程式執行時需要長期儲存一些資料。 SharePreferences物件、檔案和 SQLite資料庫來儲存這些持久化資料 存取活動的偏好設定 SharePreferences類屬於Android.cntent

python學習2轉載

一、流程控制之while迴圈 語法:while 條件:  迴圈體else:  else語句(當條件不成立的時候執行這裡 和break沒關係) 判斷條件是否成立。 如果成立執行迴圈體。然後再次判斷條件,。。。。。直到條件不成立的時候跳出迴圈 break :終止當前本層迴圈(直接跳到迴圈的末尾)

Java開發學習心得:SSM環境搭建

Java開發學習心得(一):SSM環境搭建 有一點.NET的開發基礎,在學校學過基礎語法,對JAVA有點興趣,就簡單學習了一下,記錄一下從哪些方面入手的,暫時不打算深入到原理方面,先簡單搭下環境看看,所以有些地方可能講得不慎準確。 1 SSM框架 從網上的討論來看,SSM框架似乎正在慢慢被Spring

python學習3轉載

主要內容: 列表 和 元組和字典 列表 一、列表介紹 列表是一種能儲存大量資料的資料結構,是能裝物件的物件。由方括號 [] 括起來,能放任意型別的資料,資料之間用逗號隔開 列表儲存資料是有順序的 二、增刪改查 lis = [] 1、增加 (三種) lis.append()  &nb

Java開發學習心得:Mybatis和Url路由

rac 處理 2.4 報錯 localhost insert 實體 tips control Java開發學習心得(二):Mybatis和Url路由 序號接上一篇Java開發學習心得(一):SSM環境搭建 1.3 Mybatis MyBatis 本是apache的一個開源項

Object C語法學習筆記

1、@property與@synthesize配對使用。 @property預編譯指令的作用是自動宣告屬性的setter和getter方法。 @synthesize 建立了該屬性的訪問程式碼 功能:讓編譯好器自動編寫一個與資料成員同名的方法宣告來省去讀寫方法的宣告。 2、強引用(__st

項目管理學習心得

項目 隨著 集成 重要 前言 class 特定 實體 軟件項目管理 前言不序,往事不憶,直奔主題。 項目管理一般有十個主要管理內容:範圍管理、時間管理、成本管理、質量管理、集成管理、風險管理、溝通管理、組織管理、人力資源管理和采購管理。 在學習各個內容之前,需要先知道什麽是