Verilog HDL是一种用于数字系统设计的语言。Verilog HDL既是一种行为描述语言也是一种结构描述语言。
- 行为描述——逻辑——reg型变量
- 结构描述——连线——wire型变量
这就是说,无论描述电路功能行为的模块或描述元器件或较大部件互联的模块都可以用Verilog语言来建立电路模型。按照一定的规则和风格编写,功能行为模块可以通过综合工具自动地转换为门级互联的结构模块。
Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们所对应的模型可以分为以下5种:
- 系统级(system-level):用语言提供的高级结构能够实现待设计模块的外部性能的模型。
- 算法级(algorithm-level):用语言提供的高级结构能够实现算法运行的模型。
- RTL级(register-level):描述数据在寄存器之间的流动和处理,控制这些数据流动的模型。
以上三种都属于行为描述,只有RTL级才有与逻辑电路有明确的对应关系。
- 门级(gate-level):描述逻辑门以及逻辑门之间连接的模型。
- 开关级(switch-level):描述器件中三极管和存储节点以及它们之间连接的模型。
Verilog模块的基本概念
从下面的一个二选一多路选择器了解Verilog模块的特性。
示例1:
module muxtwo(out,a,b,sl)
input a,b,sl;
output out;
reg out;
always@(sl or a or b)
if (! sl) out = a;
else out =b;
endmodule
示例2:
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
wire型变量赋值表示某个逻辑输出连接到这个线上面了
wire型变量,体现了Verilog结构描述的部分。
示例3:
module muxtwo(out,a,b,sl)
input a,b,sl;
output out;
not u1(nsl,sl);
and #1 u2(sela,a,nsl);
and #2 u3(selb,b,sl);
or #3 u4(out,sela,selb);
endmodule
把示例1或者示例2转换为示例3的过程称为综合,示例3很容易跟某种工艺基本元件对应起来。
后续需要理解的部分:
- 符合何种风格的Verilog模块是可以综合的
- 何种风格的模块是不可以综合的
- 不可以综合的Verilog模块有什么作用等
前面讲过,综合后产生门级电路网表
示例4:3bit加法器
module adder(cout,sum,a,b,cin);
input [2:0] a,b;//[MSB:LSB],所以是3bit
input cin;
output cout;
output [2:0] sum;
assign {cout,sum} = a+b+cin;
//{,}是什么运算符?起拼接的作用 如 a = {b[5],b[4:0]},意思为 b的最高位和b的低五位拼接起来,组成的a为6位
endmodule
示例5:2bit数比较器
module compare(equal,a,b);
output equal;
input [1:0] a,b;//[MSB:LSB],所以是2bit
assign equal = (a==b)?1:0;
/*如果a、b两个输入信号相等,输出为1,否则为0*/
endmodule
Verilog用于模块的测试
Verilog还可以用于描述变化的测试信号,描述测试信号的变化和测试过程的模块也称为测试平台(testbench或testfixture),它可以对上面介绍的电路模块(无论是行为的或者结构的)进行全面的测试。通过观测被测试模块的输出信号是否符合要求,可以调试和验证逻辑系统的设计和结构正确与否,并及时发现问题修改。
测试可以在功能(即行为)级上进行,也可以在逻辑网表(逻辑布尔表达式)和门级结构级上进行。它们分别称为前(RTL)仿真、逻辑网表仿真和门级仿真。如果门级结构模块和具体的工艺技术结合起来,并加上布局布线引入的延迟模型,此时进行的仿真称为布线后仿真,这种仿真与实际电路情况非常接近。
小结
- Verilog HDL程序是由模块构成的,每个模块的内容都是位于module和endmodule两个语句之间的。每个模块实现特定的功能。
- 模块是可以进行层次嵌套的,正因为如此,才可以将大型的数字电路设计分割成不同的小模块来实现特定的功能。
- 如果每个模块都是可以综合的,则通过综合工具可以把它们的功能描述全部转换为最基本的逻辑单元描述,最后可以用一个上层模块通过实例化引用把这些模块连接起来,整合成一个很大的逻辑系统。
- Verilog模块可以分为两种类型:一种是为了让模块生成电路的结构,一种是为了测试所设计电路的逻辑功能是否正确。
- 每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行描述。
- Verilog HDL程序的书写格式自由,一行可以写多个语句,一个语句也可以分写多行。
- 除了endmodule语句外,每个语句和数据定义的最后必须有分号。
- 可以用/**/和//进行程序的注释,增强程序的可读性。