1. 程式人生 > >verilog入門(六)-----用戶定義原語UDP

verilog入門(六)-----用戶定義原語UDP

reg verilog log ndt syn sync 出現 表示 tab

用戶定義原語UDP 1.UDP的定義 UDP說明定義如下: primitive UDP_name (OutputName,List_of_inputs) Output_declaration List_of_input_declarations [Reg_declaration] [Initial_statement] table list_of_tabel_entries endtable endprimitive UDP的定義不依賴於模塊定義,因此出現在模塊定義以外,也可以在單獨的文本文件中定義UDP。 UDP只能有一個輸出和一個或多個輸入。第一個端口必須是輸出端口。輸出可以取值0、1、x。輸入中出現值z以x處理。 UDP可以描述兩類行為:組合電路、時序電路(邊沿觸發和電平觸發) 2.組合電路UDP 在組合電路UDP中,表規定了不同的輸入組合和相對應的輸出值。沒有指定的任意組合輸出為x。 例如: primitive MUX2_1 (Z,Hab,Bay,Sel); output Z; input Hab,Bay,Sel; table 0 ? 1:0; 1 ? 1:1; ? 0 0:0; ? 1 0:1; 0 0 x:0; 1 1 x:1; endtable endprimitive 字符?代表不必關心相應變量的具體值,即它可以是0、1或x。輸入端口的次序必須與表中各項的次序匹配。 技術分享圖片

使用2-1多路選擇器原語組成的4-1多路選擇器: 技術分享圖片 module MUX4_1(Z,A,B,C,D,Sel); input A,B,C,D; input [2:1] Sel; output Z; parameter tRISE = 2, tFALL = 3; MUX2_1 #(tRISE,tFALL) (TL,A,B,Sel[1]), (TP,C,D,Sel[1]), (Z,TL,TP,Sel[2]); endmodule 在UDP實例中,總共可以指定2個時延,這是由於UDP的輸出可以取值0、1或x。 3.時序電路UDP 在時序電路UDP中,使用1位寄存器描述內部狀態。該寄存器的值是時序電路UDP的輸出值。 共有兩種不同類型的時序電路UDP:一種模擬電平觸發行為,另一種模擬邊沿觸發行為。 時序電路UDP使用寄存器當前值和輸入值界定寄存器的下一狀態。 初始化狀態寄存器::時序電路UDP的狀態初始化可以使用帶有一個過程賦值語句的初始化語句實現。 initial reg_name = 0,1,or x;初始化語句在UDP定義中出現。 電平觸發的時序電路UDP 例如D鎖存器建模的電平觸發的時序電路UDP示例。只有時鐘為低電平0,數據就從輸入傳遞到輸出,否則輸出值被鎖存。 primitive Latch(Q,Clk,D); output Q; reg Q; input Clk,D; table // Clk D Q(State) Q(next) 0 1 :? : 1; 0 0 :? : 0; 0 ? :? : -; endtable endprimitive "-"字符表示值“無變化” 邊沿觸發的時序電路UDP 例如用邊沿觸發時序電路UDP為D邊沿觸發觸發器建模。初始化語句用於初始化觸發器的狀態。 primitive D_Edge_FF(Q, Clk, Data); output Q; reg Q; input Data,Clk; initial Q = 0; table // Clk Data Q(State) Q(next) (01) 0 : ? : 0; (01) 1 : ? : 1; (0x) 1 : 1 : 1; (0x) 0 : 0 : 0; (?0) ? : ? : -; //時鐘負邊沿 ? (??) : ? : -; //穩定時鐘上數據不變 endtable endprimitive 例如對D_Edge_FF的使用 module Reg4(Clk,Din,Dout); input Clk; input [0:3] Din; output [0:3] Dout; D_Edge_FF DLAB0(Dout[0],Clk,Din[0]), DLAB1(Dout[1],Clk,Din[1]), DLAB2(Dout[2],Clk,Din[2]), DLAB3(Dout[3],Clk,Din[3]), endmodule 邊沿觸發和電平觸發的混合行為 在同一個表中能夠混合電平觸發和邊沿觸發項。在這種情況下,邊沿變化在電平觸發之前處理,即電平觸發項覆蓋邊沿觸發項。 帶異步清空的D觸發器的UDP描述: primitive D_Async_FF(Q,Clk,Clr,Data); output Q; reg Q; input Clr,Data,Clk; table // Clk Clr Data Q(state) Q(next) (01) 0 0 : ? : 0; (01) 0 1 : ? : 1; (0x) 0 1 : 1 : 1; (0x) 0 0 : 0 : 0; (?0) 0 ? : ? : -; (??) 1 ? : ? : 0; ? 1 ? : ? : 0; endtable endprimitive 所有能夠用於UDP原語中表項的可能值 技術分享圖片

verilog入門(六)-----用戶定義原語UDP