模块
Verilog设计组件由一个模块表示。必须声明模块,并且实例化。
模块声明
•行为Verilog模块声明包括:
○ 模块名称
○ 电路I/O端口列表
○ 用于定义预期功能的模块主体
•以endmodule语句结束。
电路I/O端口
•电路I/O端口列在模块声明中。
•每个电路I/O端口的特征在于:
○ 一个名字
○ A模式:输入、输出、输入
○ 如果端口为阵列类型,则范围信息。
模块实例化
行为Verilog模块实例化语句执行以下操作:
•定义实例名称。
•包含端口关联列表。端口关联列表指定实例的方式连接在父模块中。端口关联列表的每个元素都将的一个正式端口连接起来模块声明到父模块的实际网络。
•在另一个模块中实例化。请参见以下编码示例。
持续赋值语句
Vivado合成支持显式和隐式连续赋值。
•连续分配以简洁的方式对组合逻辑进行建模。
•Vivado综合忽略了连续任务的延迟和强度。
•仅允许在有线和三数据类型上进行连续分配。
显式连续赋值
显式连续赋值在网络被分开后以assign关键字开始宣布。
有线mysignal;
...
assign mysignal=选择?b:a;
隐式连续赋值
隐式连续赋值结合了声明和赋值。
导线错误信号=a|b;
程序分配
•行为Verilog程序分配:
○ 为声明为reg的变量赋值。
○ 总是由块、任务和函数引入。
○ 模型寄存器和有限状态机(FSM)组件。
•Vivado合成支持:
○ 组合函数
○ 组合任务和顺序任务
○ 组合和顺序总是块
组合总是块
组合逻辑通过Verilog时间控制语句有效地建模:
•延迟时间控制声明[#]
•事件控制时间控制语句[@]
延迟时间控制声明
延迟时间控制语句[#(磅)]为:
•仅与模拟相关。
•忽略合成。
有关Vivado模拟的Verilog格式的更多信息,请参阅Vivado Design Suite用户指南:
逻辑仿真(UG900)。
事件控制时间控制语句
以下语句描述了使用事件控制时间对组合逻辑进行建模
控制语句[@(at)]。
•组合总是块的灵敏度列表出现在后面的括号内
always@.
•如果事件(值更改或边缘)出现在其中一个
灵敏度列表信号。
•敏感度列表可以包含:
○ 在条件下出现的任何信号,如if或case。
○ 出现在任务右侧的任何信号。
•通过用括号中的*(星号)代替信号列表,始终块为针对如所述的任何总是块的信号中的事件而激活。
•在组合过程中,如果信号没有在if或case的所有分支中明确分配
语句,Vivado synthesis生成一个锁存器来保存最后一个值。
•流程中使用以下语句:
○ 变量和信号分配
○ if-else语句
○ 案例陈述
○ for while循环语句
○ 函数和任务调用
使用if-else语句
Vivado合成支持if-else语句。
•if-else语句使用true和false条件来执行语句。
○ 如果表达式的计算结果为true,则执行第一条语句。
○ 如果表达式的计算结果为false、x或z,则执行else语句。
•使用开始和结束关键字执行多个语句块。
•if-else语句可以嵌套。
if-else语句示例
此编码示例使用if-else语句来描述多路复用器。
案例说明
Vivado综合支持案例陈述。
•case语句与表达式进行比较,以评估几个并行语句中的一个分支机构。
○ case语句按照分支的编写顺序对其进行求值。
○ 执行计算结果为true的第一个分支。
○ 如果没有一个分支匹配,则执行默认分支。
•在case语句中不要使用无大小写整数。始终将整数大小调整为特定数量位。否则,结果可能是不可预测的。
•casez将分支备选方案的任何位位置中的所有z值视为“不在乎”。
•casex将分支备选方案的任何位位置中的所有x和z值视为“不在乎”。
•在casez或casex的情况下,问号(?)可以用作“不在乎”声明。
多路复用器案例说明示例(Verilog)
避免优先级处理
•上一个编码示例中的case语句评估输入sel的值优先顺序。
•为了避免优先处理:
○ 使用并行情况Verilog属性来确保对输入sel进行并行评估。
○ 将案例陈述替换为:
(*parallel_case*)大小写(sel)
For和Repeat语句
Vivado综合支持和重复语句。使用始终块时,重复
或位片结构也可以使用for语句或repeat语句来描述。
使用For语句
常量绑定支持for语句,并使用以下命令停止测试条件
运算符:<,<=,>,>=。
对于属于以下情况之一的下一步计算,也支持for语句
规格:
•var=var+步骤
•var=var-step其中:
○ var是循环变量
○ 步长是一个常数值
重复语句
只有常数值才支持repeat语句。
使用While循环
当使用总是块时,请使用while循环来执行重复的过程。
•while循环:
○ 如果测试表达式最初为false,则不执行。
○ 执行其他语句,直到其测试表达式变为false。
•测试表达式是任何有效的Verilog表达式。
•要防止无休止的循环,请使用-loop_iteration_limit选项。
•while循环可以有disable语句。disable语句用于标记为块,如以下代码片段所示:
使用顺序始终块
Vivado合成支持顺序始终块。
•描述一个具有始终块和灵敏度列表的顺序电路,其中包含
以下边缘触发(带有posedge或negedge)事件:
○ 强制性时钟事件
○ 可选设置/重置事件(建模异步设置/重置控制逻辑)
•如果没有描述可选的异步信号,则始终块的结构如下:
使用分配和取消分配语句
Vivado synthesis不支持assign和deassign语句。
超过32位的分配扩展
如果赋值左侧的表达式比右侧的表达式宽,则根据以下规则将左侧填充到左侧:
•如果右侧表达式带有符号,则左侧表达式将填充符号位。
•如果右侧表达式为无符号表达式,则左侧表达式将填充0(零)。
•仅适用于无尺寸的x或z常数,以下规则适用:
如果右边表达式的最左边比特的值是z(高阻抗)或x(未知),
无论右边的表达式是有符号的还是无符号的,左边的表达式都是
填充该值(分别为z或x)。