模型功能
- module是verilog中层次划分的基本单元
- 通过module之间的调用,可以实现硬件描述层次的提高
- 端口列表则是module的输入输出,和数字电路的走线连接等效
- 基于module的不断地叠加,verilog可以完成从底层的与或门到复杂数字系统的逐步设计
模型框图
//module define
module A#(
input i_clk
)(
);
//module application
B #(
.MD_SIM(1'b1)
)u_B(
.i_clk(i_clk)
);
endmodule
实现步骤
- 确认模块的名称
- 模块名是调用该模块的句柄,一个工程中不允许存在同一个模块
- 但是如果是封装为IP,采用OOC的综合方式,则vivado是支持在不同IP中使用同样命名的模块
- 一般模块的命名突出功能特点
- 比如硬件模块BRAM、FIFO,总线转接模块AXISMART,测试激励模块tb_bram等
- 只要能一眼看出模块的作用即可
- 确认模块的参数列表
- 和C语言的函数的参数类似,verilog的模块也是可以传递参数的
- 参数作为整个模块的常数项,可以随意插入而不用考虑时序问题,是模块灵活通用的关键所在
- 一般位宽、硬件信息、延时大小等用户参数,均需要通过参数列表进行传递
- 确认模块的信号列表
- 与参数不同,信号的输入输出必须考虑到时序问题和方向问题
- 一般信号的输入用于该模块的控制和数据的输入
- 而信号的输出则是该模块的标志位和数据的输出
- 但是这个只是对于一般模块级别的设计
- 更加复杂的系统会引入各种操作总线,利用通用协议,实现各种握手交互
- 所以
- 一个信号列表应该对信号输入、信号输出、总线交互三个部分进行明确的区分
- 才能具备很好的区分度和可维护性
- 模块的调用方法
- 如前所示,模块的调用同样包括了参数部分和信号部分
- 其中参数部分可以缺省
- 信号部分输出可以缺省,输入缺省的话,则依赖编译器的处理逻辑
- 比如vivado一般将缺省的输入置零
- modelsim一般置为X
- generate在模块调用中的应用
- 在C语言中,函数可以在for、if等结构中进行重复调用
- 而verilog中,所有硬件并行执行,无法实现在for中按照步骤执行
- 为了实现顺序执行,常采用状态机或者流水线去构建级联的硬件
- 显然,这种方法将会造成很大调用问题
- 在verilog中,实现级联逻辑一般用generate for
- for的含义是将模块多次重复,依靠级联信号实现处理逻辑的步步执行
- 这个方法可以有效地解决模块重复调用地问题
- 当然,可以使用generate if对某些模块进行选择性执行
- 但是,这里必须由常数对if的条件进行控制
- 也就是说,信号是无法控制模块是否调用的
- 要实现类似C的两个函数中选择一个执行,verilog需要将判断条件施加在输出上
- 还有一个generate case,和if是类似的效果
generate genvar i;
for(i = 0; i < 3; i = i + 1)
begin:FOR_3
A u_A(
.i_clk(i_clk),
.i_dat1(3'h111),
.i_dat2(2'b11),
.i_dat3(1'b1)
);
end
endgenerate
- 如上所示
- 在for级联逻辑中,位宽的匹配是一个比较重要的点
- 为了保证信号的准确性,位宽连接只存在两种格式:
- 复制:输入信号不大于端口位宽,则复制该信号到所有模块
- 对齐:输入信号位宽大于端口位宽,则将输入信号对齐至N*端口位宽(高位补零),然后按名称顺序匹配
- 则示例中的三个数据结果为
- FOR_3[2].u_A.i_dat1 = 1'b1(对齐)
- FOR_3[1].u_A.i_dat2 = 1'b0(对齐)
- FOR_3[0].u_A.i_dat3 = 1'b1(复制)
- 所以,在使用generate for时,需要严格控制位宽,缺省位宽是不可取的,而直接写整型,则会被认为是32位宽的数据进行对齐
最终效果
调用接口
- 示例模型,无调用接口
======== ======\\ ======= -
|| || \\ // \\ /-\
|| || || // // \\
|| || // || // \\
====== ======= || === ========
|| || || \\ // \\
|| || \\ || // \\
|| || \\ // // \\
|| || ======= // \\
作者:绿叶落秋风,专注FPGA技术分析和分享,转载请注明原文链接:https://www.cnblogs.com/electricdream/p/18095384,文中资源链接如下:
1. GITHUB开源仓库