三防平板設(shè)計中更復(fù)雜的Verilog HDL語法知識,在使用專用的電子設(shè)計自動化(Electronic Design Automation,EDA)工具(比如西門子公司的Modelsim軟件)對高云FPGA進行仿真時會涉及這些語法規(guī)則。本章內(nèi)容主要包括Verilog HDL用戶自定義原語、Verilog HDL指定塊、Verilog HDL時序檢查、Verilog HDL SDF逆向注解和Verilog HDL的VCD文件。
通過學(xué)習(xí)本章所介紹的Verilog HDL語法,可以幫助讀者進一步理解和掌握FPGA時序仿真的原理,以及仿真參數(shù)的設(shè)置規(guī)則。
一、 三防平板設(shè)計中Verilog HDL用戶自定義原語
本節(jié)描述了一種建模計數(shù),通過設(shè)計和指定稱為用戶定義原語(User Defined Primitive,UDP)的新元素來擴充預(yù)定義的門原語集。這些新UDP的實例可以與門原語完全相同的方式使用,以表示正在建模的電路。
在UDP中可以表示以下兩種類型的行為。
(1)組合:由組合UDP建模。
(2)時序:由時序UDP建模。
組合UDP使用其輸入的值來確定其輸出的下一個值。時序UDP使用其輸入的值和輸出的當前值來確定其輸出的值。時序UDP提供了一種對諸如觸發(fā)器和鎖存器之類的時序電路進行建模的方法。時序UDP可以對電平敏感和邊沿敏感行為進行建模。
每個UDP只有一個輸出,可以處于三種狀態(tài)之一:0、1或x。不支持三態(tài)值z。在時序UDP中,輸出總是具有與內(nèi)部狀態(tài)相同的值。傳遞給UDP的z值應(yīng)該與x值相同。
二、 三防平板設(shè)計中UDP定義
UDP定義獨立于模塊,它們與語法層次結(jié)構(gòu)中的模塊定義處于相同級別。它們可以出現(xiàn)在源文件文本中的任何位置,但不可出現(xiàn)在關(guān)鍵字module和endmodule之間。
實現(xiàn)可能會限制模型中UDP定義的最大數(shù)量,但允許至少256個。
UDP的語法格式如下:
其中,OutputName為輸出端口名;UDP_name為UDP的標識符;List_of_inputs為用“,”分割的輸入端口的名字;output_delaration為輸出端口的類型聲明;input_declarations為輸入端口的類型聲明;reg_declaration為輸出寄存器類型數(shù)據(jù)的聲明(可選);initial_statement為元件的初始狀態(tài)聲明(可選);table和endtable為關(guān)鍵字;list_of_table_entries為表項1到n的聲明。
UDP的定義獨立于模塊定義。因此,UDP定義出現(xiàn)在模塊定義以外。此外,也可以在單獨的文本文件中定義UDP。注:(1)UDP包含輸入和輸出端口聲明。其中,輸出端口聲明以關(guān)鍵字ouput開頭,后面跟隨輸出端口的名字;輸入端口聲明以關(guān)鍵字input開頭,后面跟隨輸入端口的名字;時序UDP,包含用于輸出端口的reg聲明,可以在時序UDP的initial語句中指定輸出端口的初始值;實現(xiàn)過程限制了UDP的輸入端口個數(shù),允許時序UDP可以至少有9個輸入端口,組合UDP可以至少有10個輸入端口。
(2)UDP的行為以列表的形式給出。以table關(guān)鍵字開始,以endtable關(guān)鍵字結(jié)束。
1.三防平板設(shè)計中UDP頭部
UDP定義具有兩種形式。第一種形式,以關(guān)鍵字原語開頭,后跟一個標識符,該標識符為UDP的名字。然后是一個逗號分隔的端口名字列表,該列表用括號括起來,后面跟著一個分號。UDP定義頭部后面跟有端口聲明和狀態(tài)表。UDP定義以關(guān)鍵字endprimitive結(jié)束。
第二種形式,以關(guān)鍵字原語開頭,后跟一個標識符,該標識符為UDP的名字。然后是一個逗號分隔的端口聲明列表,該列表用括號括起來,后跟分號。UDP定義頭部后面跟有一個狀態(tài)表。UDP定義以關(guān)鍵字endprimitive結(jié)束。
UDP具有多個輸入端口和一個輸出端口。UDP上不允許雙向inout端口。UDP的所有端口應(yīng)為標量,不允許為矢量端口。注意,輸出端口應(yīng)為端口列表中的第一個端口。
2.三防平板設(shè)計中UDP端口聲明
UDP應(yīng)包含輸入和輸出端口聲明。輸出端口聲明以關(guān)鍵字output開頭,后跟一個輸出端口名字。輸入端口聲明以關(guān)鍵字input開頭,后跟一個或多個輸入端口名字。
當使用第一種形式的UDP頭部聲明UDP時,除輸出聲明外,時序UDP還應(yīng)包含輸出端口的reg聲明,三防平板設(shè)計中或者作為輸出聲明的一部分。組合UDP不能包含reg聲明。輸出端口的初值可以在時序UDP中的初始語句中指定。
實現(xiàn)可能會限制UDP的最大輸入數(shù)量,但它們應(yīng)允許時序UDP至少有9個輸入,組合UDP至少有10個輸入。
3.三防平板設(shè)計中時序UDP初始化語句
時序UDP初始語句指定仿真開始時輸出端口的值,該語句以關(guān)鍵字initial開頭。下面的語句應(yīng)該是一個賦值語句,它
為輸出端口分配一個單比特文字值。
4.三防平板設(shè)計中狀態(tài)表
狀態(tài)表定義UDP的行為,它以關(guān)鍵字table開始,以關(guān)鍵字endtable結(jié)束。表中的每一行都以分號結(jié)尾,表中的每一行都使用各種字符創(chuàng)建,如表1.1所示。這些字符表示輸入值和輸出狀態(tài)。支持三種狀態(tài),即0、1和x。在UDP中,明確排除z狀態(tài)。表中定義了許多特殊字符來表示狀態(tài)可能性的某些組合。
表1.1 UDP表中符號的含義
狀態(tài)表每行的輸入狀態(tài)字段的順序直接取決于UDP定義頭部的端口列表,它與輸入端口聲明無關(guān)。
組合UDP的每個輸入都有一個字段、輸出有一個字段。輸入字段與輸出字段之間用冒號(:)分割。每一行定義輸入值的特定組合的輸出。
時序UDP在輸入字段和輸出字段之間插入了一個額外的字段。該額外字段表示UDP的當前狀態(tài),并考慮為當前輸出值的等效。它由冒號分割。每一行都根據(jù)當前狀態(tài)、輸入值的特定組合以及最多一個輸入跳變來定義輸出。下面一行是非法的:
(01)(10)0:0:1;
如果所有輸入值都指定為x,則輸出狀態(tài)應(yīng)指定為x。
沒有必要明確指定每個可能輸入組合。未明確指定的輸入值的所有組合都會導(dǎo)致默認輸出狀態(tài)x。
三防平板設(shè)計中為不同的輸出指定相同的輸入組合(包括邊沿)是非法的。