Verilog语法的基本概念1
1、概述
Verilog描述的电路设计,就是该电路的Verilog模型,也称为模块。Verilog模型根据需要可以抽象成不同的级别,包括:系统级、算法级、RTL级、门级、开关级。前三者属于行为描述,只有RTL级与逻辑电路有明确的对应关系。可以理解为一个复杂电路系统的完整Verilog模型是由若干个Verilog模型构成的,每个模块又可由若干个子模块构成。
Verilog是一种硬件描述语言,不是计算机编程语言,虽然有很多c语言的影子,但是编写的思路完全不同。在设计Verilog电路时要考虑对应的电路是什么样的,而不是考虑CPU该怎样工作。
2、Verilog模块
先看Verilog程序,以及使用高云云源软件综合后的原理图(另外两个软件太卡),体会模块的概念。
module muxtwo(out,a,b,sl);
input a,b,sl;
output out;
reg out;
always @(sl or a or b) begin
if(!sl) begin
out = a;
end
else begin
out = b;
end
end
endmodule
module muxtwo(out,a,b,sl);
input a,b,sl;
output out;
wire nsl,sela,selb;
assign nsl =~ sl;
assign sela = a & nsl;
assign selb = b & sl;
assign out = sela | selb;
endmodule
module muxtwo(out,a,b,sl);
input a,b,sl;
output out;
wire nsl,sela,selb;
not u1(nsl,sl);
and u2(sela,a,nsl);
and u3(selb,b,sl);
or u4(out,sela,selb);
endmodule
以上Verilog程序均实现了二选一多路选择器的功能,显然他们的编写方式是不同的。第一个图中综合出来的反相器应该是高云FPGA硬件结构的原因,在此可以忽略。
- 第一个反相器使用了逻辑行为描述,在此设计者并不关心电路的结构,关注的是从逻辑功能上实现特定要求。
- 第二个电路使用“~”、“&”、“|”等布尔操作符实现,逻辑功能非常明显,本质上是一个逻辑表达式。
- 第三个电路使用了Verilog原语(通常由逻辑门和触发器构成)实现。反相器u1的输入是sl信号,输出nsl送给与门u2的一个输入端…依次描述下去。是一种逻辑单元互联结构的而描述方法。
利用Verilog编写模块时,符合语法要求的前提下再符合一些特定的规则,就可以利用计算机将上面第一种反相器通过二转换为第三种反相器,这个过程就是综合(个人理解类似于编译的过程)。再通过布局布线工具就可以将整个设计转换为某种具体工艺的电路布线结构。有一些语句符合语法但不能进行综合,这就是不可综合的语句。什么风格可综合的,什么是不可综合的后面再谈。
3、Verilog模块测试
无论行为描述、还是结构描述设计的Verilog模块,能否达到预计目的就需要经过测试平台(testbench)检验。给设计的模块特定输入信号,观察输出是否符合要求,以下是二选一选择器的测试程序。
`include "muxtwo.v"
module t;
reg ain,bin,select;
reg clk;
wire outw;
initial
begin
ain = 0;
bin = 0;
select = 0;
clk = 0;
end
always #50 clk = ~clk; //产生一个周期为100的时钟脉冲信号
always @(posedge clk)
begin
#1 ain = {$random} % 2; //{$random}产生随机数,延时1个时间单位后,产生ain流信号
#3 bin = {$random} % 2;
end
always #1000 select = !select;//产生周期为1000的选通信号
muxtwo m(.out(outw),//实例化选择器,其中muxtwo是已经定义好的模块,m为名为m功能为muxtwo模块,.a表示m的muxtwo中a端口。
.a(ain),
.b(bin),
.sl(selsct));
endmodule
首先,此Verilog代码不可以综合,因为上述功能不全能找到硬件实现,例如#1延时,{$random}产生随机数等。因此能综合的模块必然有一个实际的电路结构与之对应。其次,模块t可以对muxtwo模块进行测试,可以在功能(行为)级、布尔表达式(逻辑表达式)级和门级上进行。
夏宇闻,Verilog数字系统设计教程(第三版),2013.7,P19-25. ↩︎