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"