Verilog参数定义与仿真模块中的参数修改

文章目录

  • 参数方式定义参数的优势
  • rtl模块中的参数定义
    • 模块名后定义参数
    • parameter定义参数
  • 仿真模块中的参数修改
    • 例化时修改
    • defparam修改
  • 总结与说明
  • 附录:测试代码

参数方式定义参数的优势

当一个模块被另一个模块引用例化时,高层模块可以对低层模块的参数值进行改写。这样就允许在编译时将不同的参数传递给多个相同名字的模块,而不用单独为只有参数不同的多个模块再新建文件。

参数覆盖有 2 种方式:1)使用关键字 defparam,2)例化时修改:带参数值模块例化。

使用参数的方式定义常量有很多好处,如:

  1. 我们在RTL代码中实例化该模块时,如果需要两个不同计数值的计数器我们不必设计两个模块,而是直接修改参数的值即可

  2. 另一个好处是在编写Testbench进行仿真时我们也需要实例化该模块,但是我们需要仿真至少0.5s的时间才能够看出到led_out效果,这会让仿真时间很长,也会导致产生的仿真文件很大,所以我们可以通过直接修改参数的方式来缩短仿真的时间而看到相同的效果,且不会影响到RTL代码模块中的实际值,因为parameter定义的是局部参数,所以只在本模块中有效。

为了更好的区分,参数名我们习惯上都是大写。

rtl模块中的参数定义

模块名后定义参数

格式:

#(
parameter CNT_MAX = 25’d100,
parameter CNT_MAX_5 = CNT_MAX - 5
)


#+()
()内用parameter 参数名 = XX
()内的参数间用逗号分隔,最后一个参数后没有逗号

举例:

module test
#(
parameter CNT_MAX = 25'd100,
parameter CNT_MAX_5 = CNT_MAX - 5)(input wire sys_clk , //系统时钟50MHzinput wire sys_rst_n , //全局复位output reg led_out //输出控制led灯);

parameter定义参数

格式:

parameter 参数名 = XX;

不同参数定义用分号结束语句

举例:

//=========================< Parameter >==============================parameter 				CNT_MAX		=	25'd100		    	;parameter 				CNT_MAX_5 	= 	CNT_MAX - 5			;

仿真模块中的参数修改

例化时修改

格式:

#(
.CNT_MAX (25’d24 ),
.CNT_MAX_5(25’d19)
)


#+()
()内用 .参数名(修改后的数值)
()内的参数间用逗号分隔,最后一个参数后没有逗号

举例:

test#(.CNT_MAX (25'd24 ),.CNT_MAX_5(25'd19))counter_inst(.sys_clk (sys_clk ), //input sys_clk.sys_rst_n (sys_rst_n ), //input sys_rst_n.led_out (led_out ) //output led_out);

也可以去掉参数名,按顺序进行参数例化(但是不建议哦,不方便阅读):

#(25'd24,25'd19)

defparam修改

格式:

defparam counter_inst.CNT_MAX = 25’d24 ;
defparam counter_inst.CNT_MAX_5 = 25’d19 ;


defparam 模块例化的参数名.模块中的参数 = 数值;
不同修改参数用分号结束语句

举例:

//=========================< Parameter >==============================
defparam 			counter_inst.CNT_MAX	=		25'd24	    	;
defparam 			counter_inst.CNT_MAX_5	=		25'd19			;test counter_inst(.sys_clk 	(sys_clk 	), //input sys_clk.sys_rst_n 	(sys_rst_n 	), //input sys_rst_n.led_out 	(led_out 	) //output led_out);

总结与说明

  1. 参数定义(两种方法)和仿真模块中的参数修改(两种方法)可以选择使用,共四种对应写法。
参数定义参数修改
模块名后定义参数例化时修改
模块名后定义参数defparam修改
parameter定义参数例化时修改
parameter定义参数defparam修改
  1. 如果rtl模块中既有模块名后定义参数又有parameter定义参数,用defparam修改会报错,用例化时修改不报错。具体看建议与区别部分(4)

  2. 使用建议用模块名后定义参数例化时修改这一对应方案。

rtl中:

module test
#(
parameter CNT_MAX = 25'd100,
parameter CNT_MAX_5 = CNT_MAX - 5)(input wire sys_clk , //系统时钟50MHzinput wire sys_rst_n , //全局复位output reg led_out //输出控制led灯);

仿真代码中:

test#(.CNT_MAX (25'd24 ),.CNT_MAX_5(25'd19))counter_inst(.sys_clk (sys_clk ), //input sys_clk.sys_rst_n (sys_rst_n ), //input sys_rst_n.led_out (led_out ) //output led_out);

附录:测试代码

rtl部分:

module test
#(
parameter CNT_MAX = 25'd100,
parameter CNT_MAX_5 = CNT_MAX - 5)(input wire sys_clk , //系统时钟50MHzinput wire sys_rst_n , //全局复位output reg led_out //输出控制led灯);/* 	//=========================< Parameter >==============================parameter 				CNT_MAX		=	25'd100		    	;parameter 				CNT_MAX_5 	= 	CNT_MAX - 5			;*/reg [24:0] cnt; //cnt:计数器计数,当计数到CNT_MAX的值时清零always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt <= 25'b0;else if(cnt == CNT_MAX)cnt <= 25'b0;elsecnt <= cnt + 1'b1;//led_out:输出控制一个LED灯,每当计数满标志信号有效时取反always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)led_out <= 1'b0;else if(cnt == CNT_MAX_5)led_out <= ~led_out;endmodule

仿真部分:

`timescale 1ns/1ns
module tb_test();//reg define
reg sys_clk;
reg sys_rst_n;//wire define
wire led_out;//初始化输入信号initial beginsys_clk = 1'b1;sys_rst_n <= 1'b0;#20sys_rst_n <= 1'b1;end//sys_clk:每10ns电平翻转一次,产生一个50MHz的时钟信号always #10 sys_clk = ~sys_clk;/* 	//=========================< Parameter >==============================defparam 			counter_inst.CNT_MAX	=		25'd25	    	;defparam 			counter_inst.CNT_MAX_5	=		25'd20			;*///---------------------flip_flop_inst----------------------test
/*  #(25'd24,25'd19)*/#(.CNT_MAX (25'd23 ),.CNT_MAX_5(25'd20)//实例化带参数的模块时要注意格式,当我们想要修改常数在//当前模块的值时,直接在实例化参数名后面的括号内修改即可)counter_inst(.sys_clk 	(sys_clk 	), //input sys_clk.sys_rst_n 	(sys_rst_n 	), //input sys_rst_n.led_out 	(led_out 	) //output led_out);endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/91851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MD5 绕过第三式:ffifdyop

文章目录 参考环境推荐阅读雾现两个 PHP 文件表结构分析 雾散ASCII 编码二进制数据到 ASCII 文本的转化绕过原理ffifdyop绕过 ffifdyop 的批量化生产批量化生产注意事项细节一字之差运算符优先级 实际需要遵守的规则 生产机器 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心…

幂级数和幂级数的和函数有什么关系?

幂级数和幂级数的和函数有什么关系&#xff1f; 本文例子引用自&#xff1a;80_1幂级数运算&#xff0c;逐项积分、求导【小元老师】高等数学&#xff0c;考研数学 求幂级数 ∑ n 1 ∞ 1 n x n \sum\limits_{n1}^{\infty}\frac{1}{n}x^n n1∑∞​n1​xn 的和函数 &#xff…

分析各种表达式求值过程

目录 算术运算与赋值 编译器常用的两种优化方案 常量传播 常量折叠 加法 Debug编译选项组下编译后的汇编代码分析 Release开启02执行效率优先 减法 Release版下优化和加法一致&#xff0c;不再赘述 乘法 除法 算术结果溢出 自增和自减 关系运算与逻辑运算 JCC指…

乐鑫 ESP-Mesh-Lite在windows下的开发环境搭建

ESP-Mesh-Lite的开发环境由于没有官方教程&#xff0c;折腾了好几天。环境搭建主要还是参考ESP-MDF环境搭建&#xff0c;特别注意的是必须要在CMD环境下操作&#xff0c;不能用POWER SHELL。 ESP-Mesh-Lite目前支持到5.1的SDK&#xff0c;当然4.4也是可以用的。首先上Gitee或G…

Android 查看路由表

Android 查看路由表_android 路由表_念雅的博客-CSDN博客

百度统计配置详细图文教程包含siteId、百度统计AccessToken、百度统计代码获取步骤教程

一、前言 很多网友开发者都不知道百度统计siteId、百度统计token怎么获取&#xff0c;在网上找的教程都是几年前老的教程&#xff0c;因此给大家出一期详细百度统计siteId、百度统计token、百度统计代码获取详细步骤教程。 二、登录到百度统计 1.1 登录到百度统计官网 使用个…

不同部署环境下事务特性

RDBMS: 集中环境&#xff1a;ACID&#xff0c;强事务要求。采用JDBC事务 Atomicity(原子性),一个事务中所有操作都必须全部完成&#xff0c;要么全部不完成。 Consistency(一致性),在事务开始或结束时&#xff0c;数据库应该在一致状态。 Isolation(隔离性),事务将假定只有…

SPSS探索性分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件可在个人主页—…

StarRocks数据导入

1、相关环境 Flink作为当前流行的流式计算框架&#xff0c;在对接StarRocks时&#xff0c;若直接使用JDBC的方式"流式"写入数据&#xff0c;对StarRocks是不友好的&#xff0c;StarRocks作为一款MVCC的数据库&#xff0c;其导入的核心思想还是"攒微批降频率&qu…

Java Package用法:组织与管理类的利器

在Java开发中&#xff0c;package&#xff08;包&#xff09;是一种用于组织和管理类的机制。它提供了一种将相关类组织在一起的方式&#xff0c;使得类的命名更加清晰和易于管理。通过定义package&#xff0c;可以将类的命名空间进行划分&#xff0c;避免命名冲突&#xff0c;…

thinkphp csv格式导入导出

封装成函数&#xff1a; class Csv{/*** 导出csv文件*/public function export_csv($list, $title){$file_name "export" . time() . ".csv"; // 文件名header(Content-Type: application/vnd.ms-excel); // 设置内容类型为Excelheader(Content-Disposit…

SPSS列联表分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件可在个人主页—…

BUUCTF reverse wp 71 - 75

[NPUCTF2020]你好sao啊 int __cdecl main(int argc, const char **argv, const char **envp) {__int64 v3; // rax__int64 v4; // rdx__int64 v5; // raxsize_t v6; // rax__int64 v7; // rax__int64 v8; // rdx__int64 v9; // rax__int64 v11; // rdx__int64 v12; // raxchar …

【STM32】IAP升级01 bootloader实现以及APP配置(主要)

APP程序以及中断向量表的偏移设置 前言 通过之前的了解 之前的了解&#xff0c;我们知道实现IAP升级需要两个条件&#xff1a; 1.APP程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始&#xff1b; 2.APP程序的中断向量表相应的移动&#xff0c;移动的偏移量为 x&#xff…

ROS2 中的轻量级、自动化、受控回放

一、说明 这篇文章描述了一种在 ROS2 中实现受控重播器的轻量级方法。用以测试中将现象重新播放一遍&#xff0c;以实现调参或故障定位的目的。所有源代码都可以在这里找到。该帖子也可在此处获得。 二、问题&#xff1a;不同步重播 任何曾经认真开发过 ROS2 的人都会知道这个问…

cloudCompare教程:一、可视化、点、线编辑

依据高度等准则(都在Scalar Fields中)渲染点云&#xff08;首先要打开Tools -> Projection -> Export coordinate to SF&#xff09; 在上述准则之外的&#xff0c;设置为不显示&#xff1a; 软件的显示设置&#xff08;首先打开右边的彩色柱状图&#xff0c;点击左边属性…

TensorFlow 介绍 及其简单应用 附实例

TensorFlow是一种基于数据流编程的开源软件库&#xff0c;是人工智能领域中的重要工具&#xff0c;广泛应用于深度学习、自然语言处理等领域。 TensorFlow的基本概念包括&#xff1a; 张量&#xff08;Tensor&#xff09;&#xff1a;存储和传递数据的多维数组&#xff0c;包括…

ECharts多个数据视图进行自适应大小的解决方案

项目场景&#xff1a; 在制作数据视图时经常会遇到多个数据视图的情况&#xff0c;在多个数据视图的情况下做自适应是比较麻烦的&#xff0c;这里就详细的分析一下该如何去制作&#xff0c;分享一下我的解决办法及思路。 定义 DOM 容器 这里需要注意一个地方&#xff0c;在定…

idea Springboot 校园助学贷款系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 校园助学贷款系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统 具有完整的源代码和数据库&…

2023.09.30使用golang1.18编译Hel10-Web/Databasetools的windows版

#Go 1.21新增的 log/slog 完美解决了以上问题&#xff0c;并且带来了很多其他很实用的特性。 本次编译不使用log/slog 包 su - echo $GOPATH ;echo $GOROOT; cd /tmp; busybox wget --no-check-certificate https://go.dev/dl/go1.18.linux-amd64.tar.gz;\ which tar&&am…