Verilog initial 块:用途、语法与不可综合特性
一组 Verilog 语句通常在仿真中顺序执行。这些语句放在 过程 块中。Verilog 中主要有两类 过程 块:initial 和 always。
语法
initial [single statement]
initial begin [multiple statements] end
initial 块用途
initial 块不可综合,无法转换为包含数字元件的硬件原理图。因此 initial 块除仿真外用途不大。主要用于初始化变量和驱动设计端口特定值。
initial 块何时开始和结束?
initial 块在仿真开始时刻 0 启动。整个仿真期间仅执行一次。执行完块内所有语句后结束。
上图模块 behave 有两个内部信号 a 和 b。initial 块仅一条语句,故无需放在 begin 和 end 内。该语句在时间 0 启动 initial 块时赋值 2'b10 给 a。
有延迟元素会怎样?
下面代码有额外语句赋值给信号 b,但仅在前一语句执行后 10 时间单位发生。意味着 a 先赋值,10 时间单位后 b 赋 0。
一个模块允许多少 initial 块?
模块内可定义的 initial 块数量无限制。
下面代码有 三个 initial 块,全部同时启动并并行运行。但因各块内语句和延迟不同,完成时间可能不同。
本例中,第一块延迟 20 单位,第二块总延迟 50 单位 (10+40),第三块延迟 60 单位。故仿真需 60 时间单位完成,因至少有一个 initial 块仍在运行直到 60 时间单位。
$finish 是 Verilog 系统任务,通知仿真器终止当前仿真。
若最后一块延迟 30 时间单位(如下),仿真将在 30 时间单位结束,从而终止此时仍活跃的其他 initial 块。
initial begin #30 $finish; end
查看下面闪存示例了解 initial 块在仿真中如何执行。
点击查看带仿真示例的幻灯片!
Verilog
- Verilog 入门:数字电路设计完整教程
- 掌握 Verilog 拼接操作:实用指南
- Verilog 核心要点速览
- 深入理解 Verilog 赋值语句:类型、语法与最佳实践
- Verilog阻塞与非阻塞赋值:关键区别详解
- 掌握Verilog函数:高效RTL设计的复用利器
- 理解Verilog任务:函数vs任务、语法与用法全解析
- Verilog 时钟发生器设计与实现指南
- 掌握 Verilog 数学函数:高效硬件设计的利器
- 掌握 Verilog $timeformat:精度控制与显示格式化
- 理解与打印 Verilog 任意作用域下的 Timescale
- 掌握 Verilog 文件 I/O:打开、读取、写入和关闭