Verilog语法-模块module[Day2学习笔记]
1概述
Verilog HDL是一种用于数字逻辑电路设计的硬件描述语言,可用来进行数字电路的仿真验证、时序分析、逻辑综合。
用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型。
Verilog HDL既是一种行为描述语言,也是一种结构描述语言。
既可以用电路的功能描述,也可以用元器件及其之间的连接来建模。
2模块 Module
模块(module)是Verilog的基本单位,除了编译指令,其他所有的设计代码都必须放在一个或多个模块中。对模块的描述可以是任意的,可以是行为描述、数据流描述或结构描述。
格式:
module <模块名-对应功能>(input <端口>,output <端口>);
...
<模块内容>
...
endmodule
一个模块内部可以使用其他模块,称为实例。上层模块可以引用底层人意层次模块的变量。
格式:
信号名关联法(多用)
<实例名rtl> <第二层实例名>.(变量名-tb) //.表示索引
b. 位置关联法
//信号名关联法
sort4 sort4_tb(.ra(ra),.rb(rb),.rc(rc),.rd(rd),.a(a),.b(b),.c(c),.d(d)
);
//位置关联法
sort4 sort4_tb_u(a,b,c,d,ra,rb,rc,rd);
拿二选一举例,子模块为mux2to1,基本单元为u_mux2to1:
信号名关联法
mux2to1 u_mux2to1(.out(u_out),.a (u_a),.b (u_b),.sel(u_select));
位置关联法
mux2to1 u_mux2to1(a,b,sel,out);
3模块总结
Verilog HDL中的标识符可以是任意一组字母、数字、$和下划线_组合,区分大小写。但标识符的第一个字符必须是字母或下划线。
Verilog HDL是由模块组成,每个模块嵌套在module与endmodule声明语句之间。模块之间是可以进行层次嵌套的。
每个Verilog HDL源文件中,只准有一个顶层模块,其他为子模块。
每个模块要进行端口定义,并说明输入输出端口,然后对模块的功能进行行为逻辑、数据流、结构描述。
除了endmodule、begin_end、fork_join语句外,每个语句和数据定义后必须有分号。
可用/*...*/和//...进行注释。
4二选一模块举例
以二选一来举例,其电路图如下图所示,
列举了3种方式,Type 1 是hdlbits中的原题,
//多路复用器
//---------------------------Type 1:---------------------------
/* Q:Create a one-bit wide, 2-to-1 multiplexer. When sel=0, choose a. When sel=1, choose b. */
module top_module( input a, b, sel,output out
); assign out = (sel) ? b : a ; //sel=1 ,out=b; sel=0, out=a;// ***** 信号 = 条件?表达式1:表达式2; *****
endmodule// ---------------------------Type 2: Mux2to1---------------------------
//Choose one of the two channels of data as the output
module mux2to1(input sel, //select signial 1:b, 0:a input op_a, //input op_b, //output out //);reg out_t; //out_t为寄存器,为reg
assign out = out_t;always @(*) begin //*——组合逻辑(无触发器)if (sel) beginout_t = op_b;endelse beginout_t = op_a;end
end
endmodule// ---------------------------Type 3---------------------------
module mux2to1(input a ,input b ,input s ,output out);
reg out; //组合逻辑的reg,不是触发器,仅为组合逻辑的信号always @(s or a or b)begin //* = 敏感信号列表,表内信号变化,会触发always,执行一次列表(所有电平信号)if (!s) out = a;else out = b;
end
endmodule
5Verilog用于模块的测试
仿真是什么?为什么进行仿真?
仿真是对电路模块进行动态的全面测试。通过观测被测试信号的输出信号是否符合要求,可用调试和验证逻辑系统的设计和结构准确与否,并发现问题及时修改。
仿真可以在几层面上进行?每个层面的仿真有什么意义?
仿真有:前(RTL)仿真、逻辑网表仿真、门级仿真和布线仿真;
前(RTL)仿真、逻辑网表仿真、门级仿真:可以调试和验证逻辑系统的设计和结构是否准确,并发现问题及时修改;
布线后仿真:分析设计的电路模块的运行是否正常。
如何检查程序的功能是否正确?
需要有测试激励信号输入到被测模块;
需要记录被测模块的输出信号;
需要把功能和行为描述的Verilog模块转换为门级电路互连的电路结构(综合);
需要对已经转化为门级电路结构的逻辑进行测试(门级电路仿真);
需要对布局布线后的电路结构进行测试(布局布线后仿真)。
在二选一中,
测试信号和测试激励的产生--ain\ bin\ select
被测试模块的测试信号的响应--out
对二选一进行测试:
//always, initial是并行的
// -------------------------1------------------------
module mux2to1_tb();
reg a ; //rtl input
reg b ; //rtl input
reg select ; //rtl input
wire outw ; //rtl outputmux2to1 mux2to1_inst(.op_a(a) ,.op_b(b) , .sel(select) ,.out(outw));initial begin //对输入赋0a = 0 ; b = 0 ;select = 0 ;clk = 0 ;
endinitial begin //产生时钟; 每延时5单位,给clk取反forever #5 clk = ~clk ;
end
/* 产生时钟
always #5 clk =~ clk;
*/always begin //always @(posedge clk)begin#10 a = {$random}%2 ;#5 b = {$random}%2 ;
endalways #20 select = ~select ;initial begin#200 $stop ;
end endmodule// -------------------------2------------------------
`timescale 1ns/1ps //仿真时间单位/精度module mux2to1_tb();reg ain, bin, select ;
reg clk ;
wire outw ; //不写默认wire型 initial begin //0时刻给初值0;initial--只执行一次 ain = 0 ;bin = 0 ;select = 0 ;clk = 0 ;
end always #10 clk = ~ clk; // 产生一个时钟波形
/*
forever begin#10 clk = ~ clk ;
end
*/always @(posedge clk) // 产生ain, bin随机值begin#1 ain = ($random)%2 ; //模2,0/1#3 bin = {$random}%2 ; end
endalways #2 select = !select ; //选通信号initial begin#200$finish();
end//例化
mux2to1 mux2to1_inst(.out(outw),.a(ain),.b(bin),.s(select));endmodule
Q. 若不用initial块,是否能产生测试时钟?
可以。产生测试时钟有两种:
//-----------第一种------------
initial begin //产生时钟; 每延时5单位,给clk取反forever #5 clk = ~clk ;
end
//-----------第二种------------
always #5 clk =~ clk; //每延时5单位,给clk取反
以上均为本人学习笔记,若有错误请及时纠正。
Verilog语法-模块module[Day2学习笔记]相关推荐
- DMU软件 语法高亮 vim设置--学习笔记6
用vim编程时, DMU的关键词没有语法高亮, 看着不舒服, 就进行一下设置, 并记录过程. 设置的效果如下 设置流程 本次设置的比较简单, 将关键词分为: 模型model, 比如DMU1, DMU2 ...
- Vue.js 基础语法 入门语句 Vue学习笔记 v-model 双向数据绑定
Vue.js 基础语法,入门语句,Vue学习笔记 学习网站:https://www.bilibili.com/video/BV15741177Eh vue 的体验 响应式:数据一旦改变,视图就会响应改 ...
- verilog 移位运算符 说明_Verilog学习笔记基本语法篇(二)·········运算符...
Verilog HDL的语言的运算符的范围很广,按照其功能大概可以分为以下几类: (1)算术运算符+,-,*,/,% 优先顺序 !~ * / % + - << >& ...
- python random模块导入_Python学习笔记(二十)—模块的导入
一.模块介绍 Python 提供了强大的模块支持,主要体现在Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块.通过这些强大的模块可以极大地提 ...
- 微信小程序Day2学习笔记
学习目标 此笔记参考b站 黑马程序员微信小程序开发视频 D盘有文件写入权限问题,,今天换成了C盘,希望要撑住.. 1.WXML 模板语法 1.数据绑定 的基本原则 在 data 中定义数据 在 WXM ...
- Angular Lazy load(延迟加载,惰性加载) 机制和 feature module 的学习笔记
官网链接 默认情况下,NgModules 是贪婪加载的,这意味着一旦应用程序加载,所有 NgModules 也会加载,无论它们是否立即需要. 对于有很多路由的大型应用程序,可以考虑延迟加载--一种根据 ...
- 基础语法和变量day2学习内容
基础语法和变量 内容: --------基础语法 --------print函数的使用 --------变量 --------数学运算符 --------比较运算符 一.基础语法 注释 单行注释 多行 ...
- 潘多拉 IOT 开发板学习(RT-Thread)—— 实验16 WiFi 模块实验(学习笔记)
本文代码参考 RT-Thread 官方 BSP 文章目录 实验功能 代码剖析 rt_hw_wlan_wait_init_done() LOG_D() rt_wlan_scan_sync() rt_wl ...
- 一:c#基本语法(2)(老田学习笔记)
数组: 代码 //二维数组 String[,] abcd = new string[2, 4];//建立一个2*4的数组 abcd[0, 0] = "田洪 ...
最新文章
- 个人--变成星星的孩子
- 求助大佬6——1种贪心
- 网络编程- 解决黏包现象方案一(六)
- 全球及中国甜菊糖苏打水行业营销模式与盈利前景调研报告2022版
- python List交集、并集、差集
- windows 2008创建群集“xxx”时出错。由于超时时间已过,该操作返回
- Java异常处理001:Maven clean package时Failed to clean project: Failed to delete
- Redis中的批量删除数据库中的Key
- (1)webpack介绍
- 关于tomcat5.5或6.0免安装版,点击startup.bat启动自动消失问题
- pygame小游戏(接球小游戏)
- 【鱼眼镜头3】[鱼眼畸变模型]:除法模型(核密度估计径向失真校正方法)
- 完稿—单片机原理与接口技术
- linux md5sum 文件夹,linux md5sum 的用法
- 仅需6步!虹科教你如何在第三方软件CODESYS中配置PCAN
- goldwave教程分享:用GoldWave进行音量调节
- css灯箱放大图片,wordpress插件wordpress文章图片放大灯箱效果插件auto-highslide优化版...
- 微积分——傅里叶级数
- MAC如何查看图片尺寸大小
- 设计模式-装饰器模式 C++
热门文章
- Jacob处理Word文档总结以及Java操作Office2007
- 云服务器修复,云服务器修复
- 线性回归算法(涉及最小二乘法、梯度下降法)
- 2的负x次幂图像_函数y=2的x次方与y=x的2次方的图象的 – 手机爱问
- linux常用-设置代理及IP
- 从键盘输入一个正整数,判断它是否为3和5的倍数,如果是,则输入yes,否则输出no。
- python从某一行开始读取文本文件
- html获取QQ头像接口,JS获得QQ号码的昵称,头像,生日的简单实例
- 有了这个开源工具后,明天争取5点钟下班了
- opencv 网络摄像头(webcamera)