【芝士】VLSI第三讲:Verilog HDL基础
一、Verilog简介Verilog语言是1983年由GDA(Gateway Design Automation)公司的Phil Moorby首创的,之后Moorby又设计了Verilog-XL仿真器,Verilog-XL仿真器大获成功,也使得Verilog语言得到推广使用。 1989年,Cadence收购了GDA
1990年,Cadence公开发表了Verilog HDL,并成立了OVI组织(Open Verilog International)专门负责Verilog HDL的发展。
Verilog于1995年成为IEEE标准,称为IEEE Standard 1364-1995(Verilog-1995) (IEEE美国电气和电子工程师协会)
IEEE“1364-2001”标准(Verilog-2001)也获得了通过,多数综合器、仿真器都已经支持Verilog-2001标准
二、Verilog语言特点
1、既能进行可综合的电路设计,也可用于电路的仿真。
2、能够在多个层次上对所设计的系统加以描述,从开关级、门级、寄存器传输级到行为级等,都可以胜任;设计的规模是任意的,语言不对设计规模施加任何限制
3、灵活多样的电路描述风格,可进行行为描述,也可进行结构描述;支持混合建模,在一个设计中各个模块可以在不同的设计层次上建模和描述。
4、Verilog的行为描述语句,如条件语句、赋值语句和循环语句等,类似于软件高级语言,便于学习和使用。
5、内置各种基本逻辑门;内置各种开关级元件。
6、用户定义原语(UDP)创建的灵活性。
三、Verilog设计举例
[*]//【例1-组合逻辑】4位全加器
[*]module adder4(cout,sum,ina,inb,cin);
[*]output sum;
[*]output cout;
[*]input ina,inb;
[*]input cin;
[*]assign {cout,sum}=ina+inb+cin;
[*]endmodule
[*]
[*]//【例2-时序逻辑】4位计数器
[*]module
[*]count4(out,reset,clk);
[*]output out;
[*]input reset,clk;
[*]reg out;
[*]always @(posedge clk)
[*]begin
[*]if(reset) out<=0;
[*] //同步复位
[*]elseout<=out+1;
[*] //计数
[*]end
[*]endmodule
四、Verilog程序的特点
(1)Verilog程序是由模块构成的。每个模块的内容都嵌在module和endmodule两个关键字之间;每个模块实现特定的功能;模块是可以进行层次嵌套的。
(2)每个模块首先要进行端口定义,并说明输入和输出口(input、output或inout),然后对模块的功能进行逻辑描述。
(3)Verilog程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写。
(4)除了endmodule等少数语句外,每个语句的最后必须有分号。
(5)可以用/*……*/ 和 //…… 对Verilog程序作注释。好的源程序都应当加上必要的注释,以增强程序的可读性和可维护性
五、Verilog模块的结构
[*]module AOI (A,B,C,D,F);//模块名为AOI
[*]input A,B,C,D;
[*]//模块的输入端口为A,B,C,D
[*]output F;
[*]wire A,B,C,D,F;
[*]//模块的输出端口为F
[*]//定义信号的数据类型
[*]assignF= ~((A&B)|(~(C&D))); //逻辑功能描述
[*]endmodule
该程序的第1行为模块的名字、模块的端口列表;
2、3行为输入输出端口声明,
第4行定义了端口的数据类型;
在第5行中对输入、输出信号间的逻辑关系进行了描述。
1、模块声明:
模块声明包括模块名字,模块输入、输出端口列表。
模块定义格式如下。module模块名(端口1,端口2,端口3,……)
模块结束的标志为关键字:endmodule
2、端口(Port)定义
对模块的输入/输出端口要明确说明,其格式为;
input端口名1,端口名2,……端口名N;
output端口名1,端口名2,……端口名N;
inout端口名1,端口名2,……端口名N;
对端口应注意下面几点:
i)每个端口除了要声明是输入、输出、还是双向端口,还要声明其数据类型,是连线型(wire),还是寄存器型(reg),如果没有声明,则综合器将其默认为是wire型。
ii)输入和双向端口不能声明为寄存器型。
iii)在测试模块中不需要定义端口
3、信号类型声明
对模块中所用到的所有信号(包括端口信号、节点信号等)都必须进行数据类型的定义。
[*]reg cout;//定义信号cout的数据类型为reg型
[*]reg out;//定义信号out的数据类型为4位reg型
[*]wire A,B,C,D,F; //定义信号A,B,C,D,F为wire型
如果信号的数据类型没有定义,则综合器将其默认为是wire
型。
4、逻辑功能描述
(1)用“assign”持续赋值语句定义如:assign F=~((A&B)|(~(C&D)));
“assign”语句一般用于组合逻辑的赋值,称为持续赋值方法。这种方法简单,只需将逻辑表达式放在关键字“assign”后即可。
(2)调用元件(元件比例)
调用元件的方法类似于在电路图输入方式下调入图形符号来完成设计,这种方法侧重于电路的结构描述。
在Verilog语言中可通过调用以下元件的方式来描述电路的结构;
调用Verilog内置门元件(门级结构描述)
调用开关级元件(开关级结构描述)。
(3)用“alway”过程块赋值
[*]always@(posedge clk)//每当clk上升沿到来时执行一遍begin-end块内的语句
[*] begin if(reset)out<=0;
[*] else out<=out+1;
[*] end
六、Testbench的特点
(1)testbench是一个内部实例化了MUT的顶层模块,无输入输出端口,没有上一级模块再对其进行模块调用
(2)Verilog使用testbench对被测模块(MUT)施加激励、显示或检查MUT的输出响应是否符合设计预期
七、小节
本篇博客主要介绍了Verilog HDL的部分语法以及结构特点,
下次有空来写一下语言要素、常量、参量、表达式的部分
主要是想不起来签到,因此有点缺币(笑
有什么其他想看的内容请在下面留言,我会的内容都会写一写的
这个格式真的很怪,编辑好的格式发出去又变成纯文本了。以及不知道网页有没有做MD格式的支持(?
噩梦般的回忆,软工专业的,以前数电模电,实验,fpga的课设,要么混过去,要么找代做
页:
[1]