Verilog中使用'include实现参数化设计
前段时间在FPGA上用Verilog写了一个多端口以太网的数据分发模块,因为每个网口需要独立的MAC地址和IP地址,为了便于后期修改,在设计中使用parameter来定义这些地址和数据总线的位宽等常量。
当时的做法是,顶层模块和子模块中都定义parameter型常数,在顶层模块引用子模块时,通过参数传递改变在被引用子模块中已定义的参数,实现在顶层模块统一管理参数的功能,代码如下
module top(); // 顶层模块
parameter eth1_ip_addr = {'d192, 8'd168, 'd100, 8'd1}; // 以太网1 IP地址 192.168.100.1
parameter eth2_ip_addr = {'d192, 8'd168, 'd100, 8'd2}; // 以太网2 IP地址 192.168.100.2 // 子模块1例化
sub1
#( .ip_addr(eth1_ip_addr) // 参数传递
)
sub1_inst( ); //端口映射 // 子模块2例化
sub2
#( .ip_addr(eth2_ip_addr) // 参数传递
)
sub2_inst( ); //端口映射
子模块1和2分别实现以太网1和2的收发功能,ip_addr为各自的本地IP地址,通过参数传递将eth1_ip_addr和eth2_ip_addr的值分别传递给两个子模块的ip_addr常数。
不过上述方法的缺点在于:
1. 当子模块的参数较多,并且要多次实例化时,代码会显得较为臃肿
2. 假如工程的层次有4层,某个参数只在第4层的模块使用到,为了实现将参数从顶层传递到第4层,第2层和第3层模块的参数列表中必须包含该参数。
解决上述问题有两种方法:
1. 使用defparam命令在顶层模块对子模块中的参数重定义,但是该方法同样存在一个问题:改变已经实例化后的模块中的参数,必须用英文小数点(.)表示层次逻辑关系,如下所示
module top;
reg clk;
reg [:] in1;
reg [:] in2;
wire [:] o1;
wire [:] o2;
// 子模块实例化
vdff m1 (o1, in1, clk);
vdff m2 (o2, in2, clk);
endmodule
// 子模块定义
module vdff (out, in, clk);
parameter size = , delay = ;
input [:size-] in;
input clk;
output [:size-] out;
reg [:size-] out; always @(posedge clk)
# delay out = in;
endmodule
// 参数重定义模块
module annotate;
defparam
top.m1.size = , // size参数的层次化表示
top.m1.delay = ,
top.m2.size = ,
top.m2.delay = ;
endmodule
具体使用方法见http://www.cnblogs.com/hechengfei/p/4116667.html
2. 使用`inculude预处理命令
最近在STM官网上找M95xxx系列的EEPROM资料时,看到该芯片的Verilog Testbench模块,如下图所示

M95XXX_Macro_Mux.v:定义M95xxx系列芯片的AC参数
M95XXX_Parameters.v:定义Memory大小、有效地址位数和Page大小等参数
M95xxx_Testbench.v:链接 M95xxx_Driver.v和M95xxx_Memory.v
M95xxx_Driver.v:模拟M95xxx_Memory.v文件基于SPI接口的读写行为
M95xxx_Memory.v:M95xxx EEPROM的行为级描述模型
在上述文件中,M95XXX_Macro_Mux.v和M95XXX_Parameters.v定义了全局参数,被其他文件通过’include命令包含到文件内。具体使用方法如下
M95XXX_Parameters.v 参数定义文件
`define MEM_ADDR_BITS //memory address bits
`define PAGE_ADDR_BITS //page address bits
M95xxx_Driver.v 驱动文件
`include "M95XXX_Parameters.v"
reg[`MEM_ADDR_BITS-:] memory_address;
reg[`PAGE_ADDR_BITS-:] page_address;
可以看到要调用参数文件中参数时,需要:
1. 使用'include命令包含参数文件
2. 使用反引号+参数名的方式来调用该参数
STM MP95xxx系列EEPROM Verilog Testbench模型的链接地址:
https://gitee.com/hombeen/codes/y9rb0g7ej385sipqozvla95
Verilog中使用'include实现参数化设计的更多相关文章
- Verilog语法基础讲解之参数化设计
Verilog语法基础讲解之参数化设计 在Verilog语法中,可以实现参数化设计.所谓参数化设计,就是在一个功能模块中,对于一个常量,其值在不同的应用场合需要设置为不同的置,则将此值在设计时使用 ...
- 【实战】verilog中`define的使用记录
背景: 在最近实战开发中发现:对外部芯片进行初始化时,往往需要定义大量参数. 若直接在module中通过localparam或者parameter进行参数定义的话,会带来两个问题: 1.代码长度增加, ...
- C/C++ 中的include
当需要使用已有的方法或库时, 可以将它们的头文件#include进来. #include会在preprocess过程中被替换成它包含的代码. 头文件中包含了需要使用的函数/变量的声明. 当然声明与定义 ...
- Android在layout xml中使用include
Android include与merge标签使用详解 - shuqiaoniu的博客 - 博客频道 - CSDN.NEThttp://blog.csdn.net/shuqiaoniu/article ...
- system verilog中的跳转操作
在verilog中,使用disable声明来从执行流程中的某一点跳转到另一点.特别地,disable声明使执行流程跳转到标注名字的声明组末尾,或者一个任务的末尾. verilog中的disable命令 ...
- system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)
类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...
- 一段比较有意思的代码——介绍system verilog中的新增幅值语句
system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用. 下面是一段有意思的代码,覆盖了一些用法. package definitions; typedef ...
- fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”? 解决方法
错误描述: fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加“#include "StdAfx.h"”? 错误分析: 此错误发 ...
- EF Core 1.0中使用Include的小技巧
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于EF Core暂时不支持Lazy Loading,所以利用Include来加载额外 ...
随机推荐
- 机器学习数学知识中令人费解的notation符号注解
$argmin_xf(x), min(f(x))$ $min(f(x))$的意思是函数$f(x)$的最小值 $argmin$的意思是返回使得表达式取得最小值时对应的输入变量值.例如$argmin_xf ...
- 第一章:了解SQL_数据库基础
什么是数据库(database): 数据库(database)是保存有组织的数据的容器(通常是一个文件或一组文件).数据库是一种以某种有组织的方式存储的数据集合. 表(table): 表(tabl ...
- IHttpActionResult不识别解决办法
使用ASP.NET Web API构造基于restful风格web services,IHttpActionResult是一个很好的http结果返回接口.然而发现在vs2012开发环境中,System ...
- openweathermap-免费的天气预报接口
openweathermap-免费的天气预报接口 其官方网址为:http://www.openweathermap.org/api 静态截图: 具备以下的一些特点: 1. Current weathe ...
- django 板块动态切换
需求:在同一页面的不同板块上可以实现动态切换,使用一个view实现,具体如下图所示,点击phy显示物理机列表,点击vm显示虚机列表,phy.vm对应的url均是动态生成: ...
- orcl数据库查询重复数据及删除重复数据方法
工作中,发现数据库表中有许多重复的数据,而这个时候老板需要统计表中有多少条数据时(不包含重复数据),只想说一句MMP,库中好几十万数据,肿么办,无奈只能自己在网上找语句,最终成功解救,下面是我一个实验 ...
- Python入门-模块4(序列化----json模块和pickle模块)
序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes.反之,把硬盘里面的数据读到内存里,叫反序列化.
- (1)线程的同步机制 (2)网络编程的常识 (3)基于tcp协议的编程模型
1.线程的同步机制(重点)1.1 基本概念 当多个线程同时访问同一种共享资源时可能会造成数据的覆盖和不一致等问题,此时就需要对线程之间进行协调和通信,该方式就叫线程的同步机制. 如: 2003年左右 ...
- [EffectiveC++]item27:尽量少做转型动作
- MySQL复制(二)Master-Slave复制实践
1. 准备工作 首先要准备2台机器,分别安装mysql 我这里的版本是5.1.73,mysql数据库安装请参考:http://www.cnblogs.com/tangyanbo/p/4289753.h ...