在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Verilog HDL 編譯器指令說明

OpenFPGA ? 來源:OpenFPGA ? 作者:碎碎思 ? 2021-11-03 09:31 ? 次閱讀

Verilog HDL 編譯器指令

復雜一點的系統在進行設計或者驗證時,都會用到一些編譯器指令,那么什么是編譯器指令?

Verilog HDL編譯器指令由重音符(‘)開始。在Verilog 語言編譯時,特定的編譯器指令在整個編譯過程中有效(編譯過程可跨越多個文件),直到遇到其它的不同編譯程序指令。不完整的標準編譯器指令如下:

d7913de0-3825-11ec-82a8-dac502259ad0.png

下面分解一下,每個指令單獨說明一下:

’define和’undef

1.’define指令

’define指令用于文本替換,它很像C語言中#define指令。它生成一個文本宏。該指令既可以在模塊內部定義,也可以在模塊之外定義。一旦編譯了’define指令,它在整個編譯過程中都有效。

如果已經定義了一個文本宏,那么在它的宏名之前加上重音符號(’)就可以在源程序中’引用該文本宏。

在編譯器編譯時,將會自動用相應的文本塊代替字符串‘macro_name。將Verilog HDL中的所有編譯指令都看作預定義的宏名,將一個編譯指令重新定義為一個宏名是非法的。

一個文本宏定義可以帶有一個參數。這樣,就允許為每一個單獨的應用定制文本宏。

文本宏定義的語法格式如下:

’define 《text_macro_name》 《macro_text》

其中:(1)《text_macro_name》為文本的宏名字,其語法格式為

text_macro_identifier[《list_of_formal_arguments》]

①text_macro_identifier為宏標識符,要求簡單標識符。

②《list_of_formal_arguments》為形參列表。一旦定義一個宏名,就可以在源程序的任何地方使用它,而沒有范圍限制。

(2)《macro_text》為宏文本,可以是與宏名同行的任意指定文本。

①如果指定的文本超過一行,那么新的一行需要用反斜杠()作為起始。這樣,反斜杠后面的文本也將作為宏文本的一部分,參與宏替換。反斜杠本身并不參與宏替換,編譯時將忽略它。

②如果宏文本包含了一個單行注釋語句(以“//”開始的注釋語句),則該語句不屬于替換文本,編譯時不參與替換。

③宏文本可以空白。

[例] ’define指令Verilog HDL化述的例子1。

‘define wordsize 8

reg[1:’wordsize] data;

//define a nand with variable delay

‘define var_nand(dly) nand #dly

’var_nand(2) gl21 (q21, nl0, nil);

‘var_nand(5) gl22(q22, nl0, nil);

[例] ’define指令Verilog HDL非法描述的例子2

’define first_half “start of string

$ display( ’first_half end of string”);

[例] ‘define 指令 Verilog HDL 非法描述的例子 3。

’define max(a,b)((a)》(b)?(a):(b))

n = ‘max(p + q, r + s) ;

將要擴展為

n = ((p + q ) 》(r + s))?(p + q ) :(r + s);

2.’undef指令

‘undef指令用于取消前面定義的宏。如果先前并沒有使用指令’define進行宏定義,那么使用’undef指令將會導致一個警告。

’undef指令的語法格式如下:

’undef text_macro_identifier

一個取消的宏沒有值, 就如同沒有被定義一樣。

‘define SIZE 8

’define xor_b(x,y)(x &!y)|(!x & y)

//These text macros can be used as follow:

reg [‘SIZE - 1 : 0] data out;

c = xor_b(a, b);

’undef SIZE

’celldefine和’endcelldefine

這兩個指令用于將模塊標記為單元模塊,它們表示包含模塊定義。某些PLI使用單元模塊用于這些應用,如計算延遲。

該命令可以出現在源代碼描述中的任何地方。但是,推薦將其放在模塊定義的外部。

[例] ’celldefine指令Verilog HDL描述的例子。

‘celldefine

module my_and(y, a, b);

output y;

input a, b;

assign y = a & b;

endmodule

’endcelldefine

’default_nettype

該指令用于為隱含網絡指定網絡類型,也就是為那些沒有被說明的連線定義網絡類型。它只可以出現在模塊聲明的外部,允許多個’default_netype指令。

如果沒有出現’default_netype指令,或者如果指定了’resetall指令,則隱含的網絡類型是wire。當default_netype設置為none時,需要明確地聲明所有網絡;如果沒有明確地聲明網絡,則產生錯誤。

’default_netype指令格式為:

‘default_nettype default_nettype_value

其中default_nettype_value的值可以是wire、tri、tri0、tri1、wand、triand、wor、trior、trireg、uwire和none。

’ifdef、 ‘else、 ’elsif、 ’endif 和’ifndef

’ifdef編譯器命令

條件編譯:

顯而易見,即只有在條件滿足的時候才對這部分代碼進行編譯,也就是對一部分內容指定了編譯的條件:

當滿足條件時對一組語句進行編譯,

當條件不滿足時則對另外一組語句進行編譯。

用途:

1、選擇一個模板的不同代表部分。

2、選擇不同的時序或結構信息

3、對不同的EDA工具,選擇不同的激勵。(如:Verilog代碼中的一部分可能因編譯環境不同而不同,為避免在不同環境需要替換不同版本的Verilog 設計,條件編譯就是一個很好的解決方案)

用法

‘ifdef 宏名(標識符)

程序段1.。.

’else

程序段2.。.

‘endif

當宏名被定義過了,就編譯程序段1;反之,當宏名未被定義過,就編譯程序段2;

其中,else部分可以省略。即:當宏名被定義過了,就編譯程序段1;反之,不編譯程序段1;

[例] ’ifdef 指令 Verilog HDL 描述的例子。

module and_op (a, b, c);

output a;

input b, c;

’ifdef behavioral

wire a = b & c;

‘else

and a1 (a,b,c);

’endif

endmodule

‘ifndef編譯器命令

額外的,還有‘ifndef語句,與’ifdef功能相反:

即當宏名沒被定義過,就編譯程序段1;反之,當宏名未被定義過了,就編譯程序段2;

‘ifndef 宏名(標識符)

程序段1.。.

’else

程序段2.。.

‘endif

[例] ’ifndef 指令 Verilog HDL 描述的例子。

module test;

’ifdef first_block

‘ifndef second_nest

initial $ display(“first_block_is_defined”);

’else

initial $ display(“first_block and second_nest defined”);

‘endif

’elsif second_block

initial $ display( “second_block defined, first_block is not”);

‘else

’ifndef last_result

initial $ display(”first_block, second_block,“

”last_result not defined.”);

‘elsif real_last

initial $ display(“first_block, second_block not defined,”

“ last_result and real last defined.”);

’else

initial $ display(“Only last result defined!”);

‘endif

’endif

endmodule

這里還有一個‘elsif指令,簡單說明一下。

‘ifndef test_macro_identifier

ifndef_group_of_1ines

{ ’elsif text_macro_identifier elsif_group_of_lines }

[ ‘else else_group_of_lines ]

’endif

①當遇到’ifndef時,測試’ifdef文本宏標識符,查看在Verilog HDL源文件描述中是否使用‘define作為一個文本宏名字;②如果’ifndef沒有定義文本宏標識符,則對’ifndef所包含的行作為描述的一部分進行編譯,如果還有’else或者’dsif編譯器指令,則忽略這些編譯器指令和相關的行組;③如果定義’ifiidef文本宏標識符,則忽略’ifndef所包含的行;④如果有’elsif編譯器指令,測試’elsif文本宏標識符,查看在Verilog HDL源文件描述中,是否使用‘define作為一個文本宏名字;⑤如果’elsdef定義文本宏標識符,則對’elsdef所包含的行作為描述的一部分進行編譯,如果還有’else或者’elsif編譯器指令,則忽略這些編譯器指令和相關的行組;⑥如果沒有定義第一個’elsif文本宏標識符,則忽略第一個’elsif所包含的行;⑦如果有多個’elsif編譯器命令,將按照它們在Verilog HDL源文件中的描述順序和評估第一個’elsif編譯器指令的方法,對這些指令進行評估;⑧如果有一個’else編譯器命令,則將’else所包含的行作為描述的一部分進行編譯。

’include

在編譯期間,’include編譯器指令用于嵌入另一個文件的內容。既可以用相對路徑名定義文件,也可以用全路徑名定義文件。其語法格式為:

‘include “filename”

使用’inchide編譯器指令的優勢主要體現在以下幾方面:

(1)提供了一個配置管理不可分割的一部分;

(2)改善了VerilogHDL源文件描述的組織結構;

(3)便于維護Verilog HDL源文件描述。

[例 ]’include指令Verilog HDL描述的例子。

’include “parts/count. v”

‘include “fileB”’include “fileB” //包含 fileB

‘resetall

該編譯器遇到’resetall指令時,會將所有的編譯指令重新設置為默認值。推薦在源文件的開始放置’resetall.將’resetall命令放置在模塊內或者UDP聲明中是非法的。其語法格式為

‘resetall

’line

對于Verilog工具來說,跟蹤Verilog HDL源文件的名字和文件的行的行號是非常重要的,這些信息可以用于調試錯誤消息或者源代碼,Verilog PL1訪問可以它。

然而,在很多情況下,Verilog源文件由其他工具進行了預處理。由于預處理工具可能在Verilog HDL源文件中添加了額外的行,或者將多個源代碼行合并為一個行,或者并置多個源文件,等等,可能會丟失原始的源文件和行信息。

’line編譯器命令可以用于指定的原始源代碼的行號和文件名。如果其他過程修改了源文件,這允許定位原始的文件。當指定了新行的行號和文件名時,編譯器就可以正確地定位原始的源文件位置。然而,這要求相應的工具不產生’line命令。

其語法格式為

‘line number “filename” level

其中,number是一個正整數,用于指定跟隨文本行的新行行號,filename是一個字符串常數,將其看作文件的新名字,文件名可以是全路徑名字或者相對路徑名字;level為該參數的值,可以是0、1或者2:①當為1的時候,輸入一個include行后的下面一行是第一行;②當為2的時候,退出一個inlcude行后的下面一行是第一行;③當為0的時候,指示任何其他行。

[例] ’line 指令 Verilog HDL 描述的例子。

‘line3 “orig.v” 2

//該行是 orig.v 存在 include 文件后的第 3 行。

’timescale

在Verilog HDL模型中,所有的時延都用單位時間表述。可使用’timescale編譯器指令將時間單位與實際時間相關聯,該指令用于定義時延的單位和時延精度。

作用:

timescale用于定義延時的單位和延時的精度,如timescale 1ns/100ps那么時間單位就是1ns,精度就是100ps。

時間單位,表示了仿真時測量的單位,比如延時1,1ns;精度則表示仿真器只識別的范圍,比如精度是100ps,那么如果你1.3ns,編譯器是識別,但是如果寫1.32,那么由于精度達不到那么細,所以0.02被四舍五入掉。

`timescale影響著全部模塊,直到遇到另外的timescale。

’timescale編譯器指令格式為:

’timescale time_unit/time_precision

其中,time_unit指定用于時間和延遲測量的單位,可選的值為1、10或100;time_precision用于仿真前,確定四舍五入延遲值。時間分辨率子,可選的單位為s msus sps或fs。

[例] ‘timescale 指令 Verilog HDL 描述的例子。

’timescale 10 ns / 1 ns

module test;

reg set;

parameter d = 1.55;

initial begin

# d set = 0;

# d set = 1;

end

endmodule

根據時間精度, 參數 d 的值從 1.55 四舍五入到 1.6。模塊的時間單位是 10ns 精度是1 ns。因此, 參數 d 的延遲從 1.6 標定到 16。

’unconnected_drive和‘nounconnected_drive

當一個模塊所有未連接的端口出現在’unconnected_drive和’nounconnecteddrive指令之間時,將這些未連接的端口上拉或者下拉,而不是按通常的默認值處理。

指令’unconnected_drive使用pull1/pull0參數中的一個:當指定pull時,所有未連接的端口自動上拉;當指定pill0時,所有未連接的端口自動下拉。

建議成對使用’unconnected_drive和‘nounconnected_drive指令,但不是強制要求。這些指令在模塊外部成對指定。

’resetall指令包括‘nounconnected_drive指令的效果。

[例]nounconnected_drive/ ’unconnected drive 指令 Verilog HDL 描述的例子。

‘unconnected_drive pull1

module my_and(y, a, b);

output y;

input a, b;

assign y = a & b;

endmodule

module test;

reg b;

wire y;

my_and ul(y, ,b);

endmodule

’nounconnected_drive

‘pragma

’pragma指令是一個結構化的說明,它用于改變對Verilog HDL源文件的理解。由這個指令所引入的說明稱為編譯指示。編譯指示不同于Verilog HDL標準所指定的結果,它為指定實現的結果。其語法格式為

’pragma pragma_name [ pragma_expression { , pragma_expression } ]

其中 ,pragma_name 為編譯指示的名字, 可以是 $ 開頭的系統標識符或者一般標識符; pragma_expression 為編譯指示表達式。

注:reset和resetall編譯指示將恢復默認值和pragma_keywords所影響的狀態。

’begin_keywords和’end_keyword

‘begin_keywords和’end_keyword指令用于指定在一個源代碼塊中,基于不同版本的IEEE_Stdl364標準,確定用于關鍵字的保留字。該對指令只指定那些作為保留關鍵字的標識符。只能在設計元素(模塊、原語和配置)外指定該關鍵字,并且需要成對使用。其語法格式為:

‘begin_keywords “version_specifier”

。..

’end_keyword

其中,version_specifier為可選的參數,包括1364-1995、1364-2001、1364-2001-noconfig和1364-2005。

[例] ’begin_keywords 和 ‘end_keyword 指令 Verilog HDL 描述的例子。

’begin_keywords “1364- 2001” //使 用 IEEE Std 1364- 2001 Verilog 關 鍵 字

‘module m2(。..);

reg[63:0] logic; //logic 不 是 1364 - 2001 的 關 鍵 字

。..

endmodule

’end_keywords

(補充一)Verilog編譯器指示語句

設計者在寫設計代碼時,有時可能針對仿真寫一些語句,這些語句可能是不為DC所接受,也不希望DC接受;設計者如果不對這些語句進行特殊說明,DC讀入設計代碼時就會產生語法錯誤。另一種情況是,設計者在寫設計代碼,有些設計代碼是為專有的對象寫的(如公司內部),這些專有的設計代碼可能不希望被綜合。Synopsys提供了引導語句,設計者可以使用這些引導語句控制DC綜合的對象

可以利用HDL描述中的一些特定的注釋語句來控制綜合工具的工作,從而彌補仿真環境和綜合環境之間的差異,這些注釋語句稱為編譯器指示語句。

translate_off/ translate_on

這組語句用來指示DC停止翻譯 “//synopsys.。.translate_off”之后的Verilog描述,直至出現 “//synopsys translate_on”。當Verilog代碼鐘含有供仿真用的不可綜合語句時,這項功能能使代碼方便地在仿真工具與綜合工具之間移植。

例1(translate_off/ translate_on指示語句的使用):

//synopsys translate_off

//synopsys translate_on

parallel_case/ full_case

DC可能使用帶優先級的結構來綜合Verilog的case語句,為避免這種情況,可以使用“//synopsys.。.parallel_case”指示DC將case語句綜合為并行的多路選擇器結構。

(parallel_case指示語句的使用):

always @ (state)

case (state) //synopsys parallel_case

2’b00:new_state = 2’b01;

2’b01:new_state = 2’b10;

2’b10:new_state = 2’b00;

default:new_state = 2’b00;

endcase

另外,Verilog允許case語句不覆蓋所有可能情況,當這樣的代碼由DC綜合時將產生鎖存器。為避免這種情況,可以使用“//synopsys full_case”指示DC所有可能已完全覆蓋。

例2 (full_case指示語句的使用):

always @ (sel or a1 or a2)

case (sel) //synopsys full_case

2’b00:z = a1;

2’b01:z = a2;

2’b10:z = a1 & a2;

endcase

(補充二)Verilog PL1是什么?

上面有提到過PLI接口,這里簡單介紹下,因為用的比較少,所以就一筆帶過。

編程語言接口(Program Language Interface,PLI)提供了通過C語言函數對Verilog數據結構進行存儲和讀取操作的方法。

PLI接口主要提供以下三種功能。

(1)PLI接口允許用戶編寫自定義的系統任務和系統函數。用戶寫出相應的PLI程序并連接到仿真器后,就可以在自己寫的VerilogHDL程序中使用這些系統任務和系統函數。一旦在仿真過程中調用這些任務或者函數,仿真器就會找到對應的用戶所編寫的PLI程序并執行,從而實現仿真器的定制。

(2)這個接口還允許用戶在自己的PLI程序中與仿真器中例化的VerilogHDL硬件進行交互,如讀一個線網絡的值、向一排寄存器寫值以及設置一個單元的延遲,等等。

對于PLI程序而言,仿真器中的Verilog實例完全透明,用戶可以對這些硬件做任何操作(當然,不能修改硬件結構)。有了這個功能,用戶就可以在自定義的任務/函數中對硬件執行某些用VerilogHDL語言難以完成的操作。

(3)某些特定的操作需要對仿真過程中一些信號的變化做出響應,雖然可以用always過程語句來監控少量信號的變化,但如果需要監測大量信號,這種機制并不現實。

PLI接口提供了一種函數回調機制解決這個問題。用戶可以將某個線網絡/寄存器等信號掛上一個PLI程序中的C函數。每當該信號變化時,調用這個C函數,從而很方便地監測信號。

除了上面所說的這些機制外,PLI還能讓用戶控制仿真的過程,例如暫停、退出以及向日志文件里寫信息等,還可以獲取仿真過程的數據,如當前仿真時間等。在實際的PLI程序中,同樣不可缺少這些功能。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Verilog
    +關注

    關注

    28

    文章

    1351

    瀏覽量

    110396
  • HDL
    HDL
    +關注

    關注

    8

    文章

    328

    瀏覽量

    47468
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49286

原文標題:Verilog HDL 編譯器指令

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    什么樣的代碼會被編譯器優化

    現在的編譯器有多智能,可能你辛辛苦苦寫的代碼,在編譯器看來就是幾句廢話,直接被刪除掉。
    的頭像 發表于 01-16 16:38 ?185次閱讀

    Triton編譯器與GPU編程的結合應用

    Triton編譯器簡介 Triton編譯器是一種針對并行計算優化的編譯器,它能夠自動將高級語言代碼轉換為針對特定硬件優化的低級代碼。Triton編譯器的核心優勢在于其能夠識別并行模式,
    的頭像 發表于 12-25 09:13 ?324次閱讀

    Triton編譯器如何提升編程效率

    開發者能夠更快地開發出更高效的軟件。 1. 代碼優化 1.1 編譯時優化 Triton 編譯器編譯時進行了大量的代碼優化。這些優化包括但不限于: 指令選擇 :Triton
    的頭像 發表于 12-25 09:12 ?335次閱讀

    Triton編譯器在高性能計算中的應用

    高性能計算(High-Performance Computing,HPC)是現代科學研究和工程計算中不可或缺的一部分。隨著計算需求的不斷增長,對計算資源的要求也越來越高。Triton編譯器作為一種
    的頭像 發表于 12-25 09:11 ?358次閱讀

    Triton編譯器的優化技巧

    在現代計算環境中,編譯器的性能對于軟件的運行效率至關重要。Triton 編譯器作為一個先進的編譯器框架,提供了一系列的優化技術,以確保生成的代碼既高效又適應不同的硬件架構。 1. 指令
    的頭像 發表于 12-25 09:09 ?340次閱讀

    Triton編譯器的優勢與劣勢分析

    Triton編譯器作為一種新興的深度學習編譯器,具有一系列顯著的優勢,同時也存在一些潛在的劣勢。以下是對Triton編譯器優勢與劣勢的分析: 優勢 高效性能優化 : Triton編譯器
    的頭像 發表于 12-25 09:07 ?389次閱讀

    Triton編譯器在機器學習中的應用

    1. Triton編譯器概述 Triton編譯器是NVIDIA Triton推理服務平臺的一部分,它負責將深度學習模型轉換為優化的格式,以便在NVIDIA GPU上高效運行。Triton編譯器支持
    的頭像 發表于 12-24 18:13 ?518次閱讀

    Triton編譯器支持的編程語言

    Triton編譯器支持的編程語言主要包括以下幾種: 一、主要編程語言 Python :Triton編譯器通過Python接口提供了對Triton語言和編譯器的訪問,使得用戶可以在Python環境中
    的頭像 發表于 12-24 17:33 ?461次閱讀

    Triton編譯器與其他編譯器的比較

    Triton編譯器與其他編譯器的比較主要體現在以下幾個方面: 一、定位與目標 Triton編譯器 : 定位:專注于深度學習中最核心、最耗時的張量運算的優化。 目標:提供一個高度抽象、靈活、高效
    的頭像 發表于 12-24 17:25 ?484次閱讀

    Triton編譯器功能介紹 Triton編譯器使用教程

    Triton 是一個開源的編譯器前端,它支持多種編程語言,包括 C、C++、Fortran 和 Ada。Triton 旨在提供一個可擴展和可定制的編譯器框架,允許開發者添加新的編程語言特性和優化技術
    的頭像 發表于 12-24 17:23 ?642次閱讀

    Verilog HDL的基礎知識

    本文繼續介紹Verilog HDL基礎知識,重點介紹賦值語句、阻塞與非阻塞、循環語句、同步與異步、函數與任務語法知識。
    的頭像 發表于 10-24 15:00 ?593次閱讀
    <b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>的基礎知識

    AI編譯器技術剖析

    隨著人工智能技術的飛速發展,AI編譯器作為一種新興的編譯技術逐漸進入人們的視野。AI編譯器不僅具備傳統編譯器的功能,如將高級語言編寫的源代碼轉換為機器可執行的代碼,還融入了人工智能技術
    的頭像 發表于 07-17 18:28 ?1772次閱讀

    人工智能編譯器與傳統編譯器的區別

    人工智能編譯器(AI編譯器)與傳統編譯器在多個方面存在顯著的差異。這些差異主要體現在設計目標、功能特性、優化策略、適用范圍以及技術復雜性等方面。以下是對兩者區別的詳細探討,旨在全面解析其內在差異。
    的頭像 發表于 07-17 18:19 ?2119次閱讀

    Meta發布基于Code Llama的LLM編譯器

    近日,科技巨頭Meta在其X平臺上正式宣布推出了一款革命性的LLM編譯器,這一模型家族基于Meta Code Llama構建,并融合了先進的代碼優化和編譯器功能。LLM編譯器的推出,標志著Meta在人工智能領域的又一重大突破,將
    的頭像 發表于 06-29 17:54 ?1566次閱讀

    QT開發學習筆記1(安裝交叉編譯器

    QT安裝交叉編譯器
    的頭像 發表于 02-18 10:02 ?1127次閱讀
    QT開發學習筆記1(安裝交叉<b class='flag-5'>編譯器</b>)
    主站蜘蛛池模板: 国产三及 | 淫香色香| 国产日本在线观看 | 午夜国产福利 | 午夜激情啪啪 | 日日碰狠狠添天天爽五月婷 | 99草视频| 香蕉成人国产精品免费看网站 | 亚洲先锋资源 | 久久久黄色大片 | 夜夜夜夜爽 | 人人干97| 久久久久国产午夜 | 中国高清性色生活片 | 一级做a爱片特黄在线观看免费看 | 国产高清区 | 国产精品久久久久久久9999 | mitunav在线| 日韩精品免费一级视频 | 欧美日韩一区二区视频图片 | 美女露出扒开尿口让男人桶 | 亚洲丝袜一区二区 | 天天翘夜夜洗澡天天做 | 在线www 天堂网在线 | 88av免费| 日本a级三级三级三级久久 日本a级影院 | 欧美午夜视频在线观看 | 插插插叉叉叉 | 亚洲免费黄色网址 | 四虎现在的网址入口 | 91精品国产免费久久久久久青草 | 狠狠色噜噜狠狠狠狠97老肥女 | 一本到在线观看视频不卡 | 99久久久精品| 亚洲日本在线观看 | 狼色视频在线观免费观看 | 手机亚洲第一页 | 女同性大尺度床戏视频 | 亚洲精品一线二线三线 | 成人在线黄色 | 亚洲合集综合久久性色 |