Verilog參數
Verilog參數執行以下操作:
?允許您創建易于重用和擴展的參數化代碼。
?使代碼更可讀、更緊湊、更易于維護。
?將此類功能描述為:
○ 總線尺寸
○ 建模設計單元中某些重復元素的數量
?是常數。對于參數化模塊的每個實例化,默認運算符值可以被覆蓋。
?相當于VHDL泛型。不支持空字符串參數。
使用Generics命令行選項重新定義在頂級中定義的Verilog參數設計塊。這允許您在不修改源代碼的情況下修改設計。這該功能對IP核心生成和流測試非常有用。
參數示例(Verilog)
從編碼示例下載編碼示例文件。
Filename: parameter_1.v
// A Verilog parameter allows to control the width of an instantitated
// block describing register logic
//
//
// File:parameter_1.v
//
module myreg (clk, clken, d, q);
parameter SIZE = 1;
input clk, clken;
input [SIZE-1:0] d;
output reg [SIZE-1:0] q;
always @(posedge clk)
begin
if (clken)
q <= d;
end
endmodule
module parameter_1 (clk, clken, di, do);
parameter SIZE = 8;
input clk, clken;
input [SIZE-1:0] di;
output [SIZE-1:0] do;
myreg #8 inst_reg (clk, clken, di, do);
endmodule
參數和生成示例(Verilog)
以下編碼示例說明了如何使用控制重復元素的創建參數并為構造生成。有關詳細信息,請參閱生成語句。
文件名:parameter_generate_for_1.v
//
// A shift register description that illustrates the use of parameters and
// generate-for constructs in Verilog
//
// File: parameter_generate_for_1.v
//
module parameter_generate_for_1 (clk, si, so);
parameter SIZE = 8;
input clk;
input si;
output so;
reg [0:SIZE-1] s;
assign so = s[SIZE-1];
always @ (posedge clk)
s[0] <= si;
genvar i;
generate
for (i = 1; i < SIZE; i = i+1)
begin : shreg
always @ (posedge clk)
begin
s[i] <= s[i-1];
end
end
endgenerate
endmodule
Verilog參數和屬性沖突
Verilog參數和屬性沖突可能是由于以下原因引起的:
?參數和屬性可以應用于Verilog代碼中的實例和模塊。
?屬性也可以在約束文件中指定。
Verilog使用限制
Vivado合成中的Verilog使用限制包括以下內容:
?區分大小寫
?阻塞和非阻塞分配
?整數處理
區分大小寫
Vivado synthesis支持Verilog區分大小寫,盡管存在名稱沖突的可能性。
?由于Verilog區分大小寫,因此模塊、實例和信號的名稱可以理論上通過改變資本化而變得獨特。
○ Vivado合成可以合成實例和信號名稱僅相差資本化。
○ 當模塊名稱僅因大寫而不同時,Vivado合成會出錯。
?不要僅依靠大寫來使對象名稱唯一。單獨的資本化可以導致混合語言項目出現問題。
阻塞和非阻塞分配
Vivado合成支持阻塞和非阻塞分配。
?請勿混合分配阻塞和非阻塞。
?盡管Vivado合成在沒有錯誤的情況下合成了設計,但混合阻塞和非阻塞分配可能會在模擬過程中導致錯誤。有關Vivado模擬的Verilog格式的更多信息,請參閱Vivado設計套件用戶指南:邏輯仿真(UG900)。
不可接受的示例一
不要對同一信號的不同比特混合塊和非塊分配。
always @(in1)
begin
if (in2)
out1 = in1;
end else
out1 <= in2;
Unacceptable Example Two
Do not mix blocking and non-blocking assignments for different bits of the same signal.
if (in2)
begin
out1[0] = 1'b0;
out1[1] <= in1;
end else begin
out1[0] = in2;
out1[1] <= 1'b1;
end
整數處理
Vivado合成在某些情況下處理整數的方式與其他合成工具不同。在里面在這些情況下,整數必須以特定的方式進行編碼。
Verilog案例語句中的整數處理
不帶大小寫的整數,以防項表達式可能導致不可預測的結果。Verilog案例語句中的整數處理示例在下面的編碼示例中,事例項表達式4是一個未大小的整數,它導致不可預測的結果。要解決此問題,請將事例項表達式的大小調整為4到3位,如中所示以下示例:
reg [2:0] condition1; always @(condition1) begin
case(condition1)
4 : data_out = 2; // Generates faulty logic
3'd4 : data_out = 2; // Does work
endcase
end
連接中的整數處理
Verilog串聯中的無符號整數可能會導致不可預測的結果。如果您使用表達式,它會執行以下操作:
?將表達式指定給臨時信號。
?在級聯中使用臨時信號。
reg [31:0] temp;
assign temp = 4'b1111 % 2;
assign dout = {12/3,temp,din};
Verilog-2001屬性和元評論
Verilog-2001屬性
?Verilog-2001屬性將特定信息傳遞給合成工具等程序。
?Verilog-2001屬性被普遍接受。
?在模塊聲明中,為運算符或信號的任何位置指定Verilog-2001屬性和實例化。
?盡管編譯器可能支持其他屬性聲明,但Vivado synthesis會忽略他們
?使用Verilog-2001屬性設置以下方面的約束:
○ 單個對象,例如:
單元
例子
網
○ 設置以下合成約束:
-完整案例
-平行案例
Verilog元注釋
?Verilog元注釋可由Verilog解析器理解。
?Verilog元注釋設置了對單個對象的約束,例如:
○ 單元
○ 例子
○ 網
?Verilog元注釋設置合成指令:
○ 并行(_C)和完全(_C
○ translate_on和translate_off
○ 所有特定于工具的指令(例如,syn_shareing)
Verilog元評論支持
Vivado合成支持:
?C風格和Verilog風格的元評論:
○ C樣式
/* ...*/
?C型注釋可以是多行:
○ Verilog風格
// ...
Verilog風格的注釋在行的末尾。
?關閉和打開翻譯
// synthesis translate_on
// synthesis translate_off
? Parallel Case
// synthesis parallel_case full_case
// synthesis parallel_case
// synthesis full_case
? Constraints on individual objects
Verilog Meta Comment Syntax
// synthesis attribute [of] ObjectName [is] AttributeValue
Verilog Meta Comment Syntax Examples
// synthesis attribute RLOC of u123 is R11C1.S0
// synthesis attribute HUSET u1 MY_SET
// synthesis attribute fsm_extract of State2 is "yes"
// synthesis attribute fsm_encoding of State2 is "gray"