Verilog HDL是一种用于数字系统设计的语言。Verilog HDL既是一种行为描述语言也是一种结构描述语言。
这就是说,无论描述电路功能行为的模块或描述元器件或较大部件互联的模块都可以用Verilog语言来建立电路模型。按照一定的规则和风格编写,功能行为模块可以通过综合工具自动地转换为门级互联的结构模块。
Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们所对应的模型可以分为以下5种:
以上三种都属于行为描述,只有RTL级才有与逻辑电路有明确的对应关系。
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很容易跟某种工艺基本元件对应起来。
后续需要理解的部分:
前面讲过,综合后产生门级电路网表
示例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)仿真、逻辑网表仿真和门级仿真。如果门级结构模块和具体的工艺技术结合起来,并加上布局布线引入的延迟模型,此时进行的仿真称为布线后仿真,这种仿真与实际电路情况非常接近。
小结