Verilog描述方式
在Verilog中,有3种最基本的硬件描述方式:
(1)数据流描述,采用assign连续赋值语句。
(2)行为描述,使用always语句或initial语句块中的过程赋值语句。
(3)结构化描述,实例化已有模块。
1.数据流描述
信号从输入流向输出,不需存储。数据流描述最基本的语句是assign连续赋值语句。
连续赋值语句用于对 wire 型变量进行赋值,有以下特点:
(1)连续驱动,任何时刻输入的任何变化都将导致该语句重新计算。
(2)只有wire类型能在assign中赋值。
(3)建议使用assign对组合逻辑建模,因为assign语句的连续驱动特点与组合逻辑行为非常相似,且在assign语句中加延时可以精确模拟组合逻辑的惯性延时。
(4)并行性,assign语句和行为语句块(always和initial)、其他连续赋值语句、门级模型之间是并行的。
例:1位全加器
module full_adder1( input Ai, Bi, Ci, output So, Co); assign {Co, So} = Ai + Bi + Ci ; assign So = Ai ^ Bi ^ Ci ; assign Co = (Ai & Bi) | (Ci & (Ai | Bi)); endmodule
2.行为描述
行为描述是指用语言描述电路的行为,有initial和always两种语句。
initial语句块在0仿真时刻开始执行,且只执行一次;always语句块也在0时刻执行,但会一直循环执行。
时钟发生器举例:
`timescale 1ns/1ps //表示时延单位为1ns,时间精度1ps module clock_gen( output reg clk ); initial begin clk = 0; end always #5 clk<=~clk; endmodule
1.阻塞赋值和非阻塞赋值
过程赋值只能在always块或initial块中,分阻塞赋值和非阻塞赋值,格式如下:
阻塞赋值:变量名 = 表达式; 非阻塞赋值:变量名 <= 表达式。
在阻塞赋值中,执行下一条语句前,一个表达式只能赋给一个数据类型的值,会阻断其他语句执行。在非阻塞赋值中,表达式的值在always块结束时进行赋值,不阻断其他语句执行。
基本原则是(1)组合电路使用阻塞赋值(2)时序电路使用非阻塞赋值
2.always块基本语法格式
always@(敏感信号列表)
begin
顺序执行语句
end
敏感信号列表是always块响应的信号和事件列表,组合电路的敏感列表需包含所有输入信号,可用always @*表示包含所有输入信号
3.模块实例化
模块实例化指在一个模块中调用另一个模块,对端口进行连接。端口对应方式有名称对应及位置对应,名称对应格式如下:
模块 实例名称(
.模块端口名称1(实例外部信号)
.模块端口名称2(实例外部信号)
);

浙公网安备 33010602011771号