verilog学习笔记(二)程序的基本结构
前面的学习笔记是在看程序时遇到什么问题就记下来然后去查资料整理的,后续的学习笔记会更加系统的整理verilog相关的内容。
Verilog作为硬件电路语言,将电路抽象为程序,用代码去控制电路的运行。我们可以使用verilog语言去实现各种各样的功能。当需要去完成一个复杂的工程时,我们需要将工程分解为多层次的任务,在将工程分解为任务后,我们要用硬件语言去实现这些任务,verilog在实现功能时将抽象为以下五个级别。
抽象级别:
系统级:用语言提供的高级结构实现模块外部性能
算法级:实现算法运行
RTL级:数据在寄存器之间流动和处理,控制这些数据流动的模型
上面3个都是行为描述,下面两个与逻辑电路有明确对应
门级:逻辑门的描述
开关级:三极管和储存节点
下面介绍构成verilog程序的几个主要部分
verilog程序主要由模块组成,由不同的模块可以建立一个结构复杂的大型工程。
首先是always语句
always @(s or a or b)
out=a;
s,a,b三者任意一个出现变化就执行后续的语句
没有always的模块会一直响应和电路一样
下面添加的延迟是在模块输入到输出的延迟
And #1 U1();
And #1 U2();
Assign 赋值语句,用reg类型的变量对wire类型的变量赋值,要用到assign
module add(a,b,c,d) input[2:0] a,b; output[2:0] c; output d;
assign{d,c}=a+b; endmodule
输入量一般是reg型,输出一般是wire型,上面的程序实现的是2位带进位的加法。
其中d是进位,c是a和b的和。通过这样的语法,我们就用verilog语言实现了电路的功能。
一个模块可以实现的功能是有限的,特别是像verilog这样的硬件语言,我们为了实现复杂的功能一般需要多个模块互相调用。
调用verilog内部模块bufif1,其中bufif1是模块,mybuf是实例名。verilog自带了很多的模块,这些模块是已经成熟的电路结构,平时直接调用即可。
bufif1 mybuf(out, in,enable);
当我们需要调用其他v文件时,和c语言类似,在v文件的开头进行引用即可。
`include”muxtwo.v”
verilog程序由模块构成。模块主要分为端口和逻辑功能实现,而模块之间是通过端口来交互数据的,当引用模块时要严格按声明顺序输入端口变量。
端口变量主要分为3种:
input输入变量
output输出变量
inout输入输出变量
逻辑功能主要分为3个部分:
1 Assign声明语句,最常用的组合逻辑声明。
2 实例引用,调用其他的模块
3 Always内部顺序执行,多个always间并行,称为过程块,只有上面两个可以独立于过程块存在,其他的语句要在过程块内。既可以描述组合逻辑,也可以描述时序逻辑。
三者是并发运行的,没有添加时延的话就是同时运行。
verilog中的数字表示:
z代表高阻态
?也代表高阻太态
x代表不定值
_下划线分隔数的表达,提高可读性,只能用在确定的数
当常量不说明位数,默认位宽为32位
Parameter常数定义
可以通过引用实例改变模块内部的parameter
module a(A,F): parameter w=1.p=1;
... endmodule module top: A #(4,0) D1(A,F); //将wp改为4,0 A #(3) D2(A,F); //将w改为3 endmodule